feat: Automation Contract v1.2 -- múltiplos passos por resultado e outcome CONDITIONAL_PASS #75

Merged
jhony75 merged 1 commit from feature/automation-contract-v1.2-multistep into develop 2026-09-22 08:06:02 -03:00
Owner

Implementa o P1 "múltiplos TestRunStep por resultado" do backlog, com escopo confirmado com o usuário antes de implementar (existe necessidade real e concreta: validação de manufatura, em desenho agora).

Granularidade explícita (steps): AutomationResultIn ganha um campo opcional steps -- uma ação por item, cada uma com seu próprio outcome/duration_ms/failure_classification/message/evidence/metrics, na ordem enviada. Sem steps, comportamento idêntico ao que já existia (1 passo sintético a partir do result) -- 100% aditivo, nenhum payload v1/v1.1 muda de comportamento.

Novo outcome CONDITIONAL_PASS ("aprovado com ressalvas") -- decisão explícita do usuário de deixar como vocabulário compartilhado entre automação e execução manual (schemas.StepOutcome), não restrito só à ingestão. Precedência definida em services/scenario_status.aggregate_scenario_status (entre PENDING e o PASS default). UI atualizada: dropdown de status de passo, StatusBadge (variant warning), card de contagem em RunDetail.tsx, stories do Storybook.

Decisão de produto explícita (confirmada com o usuário): o outcome de um result nunca é recalculado a partir do "pior status vence" dos steps -- quem chama a API decide o veredito final do caso de teste, mesmo que um passo individual tenha falhado (é assim que fica viável reportar CONDITIONAL_PASS com um passo FAIL dentro, ex.: desvio de manufatura formalmente aceito).

Achado real ao implementar: essa decisão quebraria _dedup_response (contava outcome_counts por passo, não por result -- divergia do que a ingestão original reportava assim que um result passa a ter mais de 1 passo). Corrigido com TestRunScenario.automation_outcome (novo campo, só preenchido por ingestão de automação), migration 1e03ec5658f9 -- e travado em teste (test_deduplicated_reingestion_of_multistep_result_reports_consistent_outcome_counts).

Verificação: backend 266/266 testes (10 novos: multi-step em ordem, outcome não-recalculado, dedup consistente, CONDITIONAL_PASS aceito, precedência de agregação); migration testada upgrade→downgrade→upgrade + alembic check sem drift; frontend tsc/lint/154 testes/build limpos; verificado manualmente ponta a ponta no dev server local (ingestão via curl + edição manual na UI + persistência após reload, com screenshot).

🤖 Generated with Claude Code

Implementa o P1 "múltiplos TestRunStep por resultado" do backlog, com escopo confirmado com o usuário antes de implementar (existe necessidade real e concreta: validação de manufatura, em desenho agora). **Granularidade explícita (`steps`)**: `AutomationResultIn` ganha um campo opcional `steps` -- uma ação por item, cada uma com seu próprio `outcome`/`duration_ms`/`failure_classification`/`message`/`evidence`/`metrics`, na ordem enviada. Sem `steps`, comportamento idêntico ao que já existia (1 passo sintético a partir do result) -- **100% aditivo, nenhum payload v1/v1.1 muda de comportamento**. **Novo outcome `CONDITIONAL_PASS`** ("aprovado com ressalvas") -- decisão explícita do usuário de deixar como vocabulário **compartilhado** entre automação e execução manual (`schemas.StepOutcome`), não restrito só à ingestão. Precedência definida em `services/scenario_status.aggregate_scenario_status` (entre `PENDING` e o `PASS` default). UI atualizada: dropdown de status de passo, `StatusBadge` (variant `warning`), card de contagem em `RunDetail.tsx`, stories do Storybook. **Decisão de produto explícita (confirmada com o usuário)**: o `outcome` de um result nunca é recalculado a partir do "pior status vence" dos `steps` -- quem chama a API decide o veredito final do caso de teste, mesmo que um passo individual tenha falhado (é assim que fica viável reportar `CONDITIONAL_PASS` com um passo `FAIL` dentro, ex.: desvio de manufatura formalmente aceito). **Achado real ao implementar**: essa decisão quebraria `_dedup_response` (contava `outcome_counts` por passo, não por result -- divergia do que a ingestão original reportava assim que um result passa a ter mais de 1 passo). Corrigido com `TestRunScenario.automation_outcome` (novo campo, só preenchido por ingestão de automação), migration `1e03ec5658f9` -- e travado em teste (`test_deduplicated_reingestion_of_multistep_result_reports_consistent_outcome_counts`). **Verificação**: backend 266/266 testes (10 novos: multi-step em ordem, outcome não-recalculado, dedup consistente, CONDITIONAL_PASS aceito, precedência de agregação); migration testada upgrade→downgrade→upgrade + `alembic check` sem drift; frontend `tsc`/lint/154 testes/build limpos; verificado manualmente ponta a ponta no dev server local (ingestão via curl + edição manual na UI + persistência após reload, com screenshot). 🤖 Generated with [Claude Code](https://claude.com/claude-code)
feat: Automation Contract v1.2 -- multiplos passos por resultado e outcome CONDITIONAL_PASS
All checks were successful
EEG QA CI / Detectar o que mudou (pull_request) Successful in 11s
EEG QA CI / Backend (pull_request) Successful in 1m36s
EEG QA CI / Frontend (pull_request) Successful in 2m47s
EEG QA CI / Build e publicação de imagens (pull_request) Successful in 3m3s
EEG QA CI / Deploy production (pull_request) Has been skipped
EEG QA CI / Deploy development (pull_request) Has been skipped
dda74c67ca
Motivado por uma necessidade real (validacao de manufatura, em desenho
agora): AutomationResultIn ganha um campo opcional `steps`, permitindo
reportar varias acoes por caso de teste (cada uma com seu proprio
outcome/duration_ms/failure_classification/message/evidence/metrics) em vez
do unico passo sintetico do v1/v1.1. Sem `steps`, comportamento identico ao
que ja existia.

Novo outcome CONDITIONAL_PASS ("aprovado com ressalvas") -- vocabulario
compartilhado entre automacao e execucao manual (schemas.StepOutcome),
decisao explicita do usuario. O outcome de um result nunca e recalculado a
partir do "pior status vence" dos steps -- quem chama a API decide o
veredito final. Isso exigiu TestRunScenario.automation_outcome (migration
1e03ec5658f9) pra _dedup_response nao divergir do outcome_counts da
ingestao original quando um result tem varios passos.

Verificado manualmente na UI (dev server local): ingestao multi-step +
CONDITIONAL_PASS, edicao manual de um passo pra CONDITIONAL_PASS, e
persistencia apos reload -- tudo funcionando ponta a ponta.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
jhony75 merged commit a4b90c7fc9 into develop 2026-09-22 08:06:02 -03:00
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
jhony75/eeg-qa!75
No description provided.