feat: fecha as lacunas do item 6 -- UI de Automation Discovery, dedup e janela de execução #55
Loading…
Reference in a new issue
No description provided.
Delete branch "feature/automation-discovery-ui"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Auditoria (pedida antes de implementar, seguindo a regra do roadmap de nunca assumir) confirmou que o item 6 (ingestão de automação) já estava arquiteturalmente pronto desde o item 1 — contrato formal, Core agnóstico de formato, separação definição/execução/resultado, ciclo UNMAPPED/MAPPED/IGNORED. Faltavam 3 lacunas reais, todas fechadas aqui (escopo confirmado com o usuário via AskUserQuestion):
1. UI de Automation Discovery
O Sidebar tinha um item "Discovery" desabilitado com badge "Em breve" — o backend sempre teve mapear/criar cenário/ignorar/reabrir prontos, mas só dava pra usar via API/curl. Tela nova (
AutomationDiscoveries.tsx, master-detail, mesmo padrão de Library/SharedSteps): filtro por status, vincular a cenário existente, criar cenário novo a partir da discovery (com tags), ignorar/reabrir. CSS morto do placeholder removido.2. Dedup por (source, external_run_id)
Reenviar a mesma execução (retry de webhook, at-least-once delivery) duplicava Run/cenários/passos e inflava
execution_countde novo. Agora, quandoexternal_run_idvem preenchido e já existe umTestRuncom o mesmo(source, external_run_id), a chamada é um no-op idempotente — devolve o run já existente (AutomationRunOut.deduplicated=true), sem criar nada nem tocar contadores. Semexternal_run_id, comportamento anterior preservado (sem chave estável pra deduplicar) — decisão confirmada com o usuário entre 3 opções (idempotente / rejeitar 409 / não mexer).3. started_at/finished_at deixam de ser descartados em silêncio
Esses dois campos eram aceitos no payload e nunca gravados em lugar nenhum — bug real encontrado na auditoria.
TestRunganhaautomation_started_at/automation_finished_at(migração23f82fbe105b), persistidos e expostos emTestRunOut.Verificação
pytest -n auto— 176 passed (4 testes novos emtest_automation.py: dedup mesmo source/run_id, dedup não aplica com source diferente, sem external_run_id sempre cria novo, started_at/finished_at persistidos).tsc --noEmit,eslint,vitest— 125 passed (6 testes novos),build,build-storybook— todos ok.run_id,deduplicated: truena segunda chamada,execution_countnão incrementou de novo) → discovery aparece na tela → vincular a cenário existente → ignorar → reabrir, tudo funcionando e refletindo no backend real.Fora de escopo (decisão explícita)
Item 7 (orquestração com runner externo) fica pra uma rodada futura — existe inclusive um design diferente e conflitante já documentado (ADR-0012,
TestCheck) que precisa ser reconciliado antes de desenhar o item 7.Co-Authored-By: Claude Sonnet 5 noreply@anthropic.com