feat: backlog tecnico (reports/traceability, IDs estaveis, Automation Discovery) #36

Merged
jhony75 merged 6 commits from feature/backlog-tecnico-fase1 into develop 2026-09-08 01:53:10 -03:00
Owner

Resumo

  • main.py vira composition root puro (494 -> 76 linhas): extrai modules/reports/ (CRUD de Report, relacoes, cenarios/steps, anexos, picklists), seguindo o mesmo padrao eeg_extension de modules/reporting/. API HTTP fica byte-identica (validado comparando o OpenAPI antes/depois).
  • Primeiro split de models.py/schemas.py por modulo: Requirement + schemas de rastreabilidade migram para modules/traceability/. db_base.py isola Base = declarative_base() para evitar um import circular real que essa quebra introduziria (travado em teste de arquitetura novo).
  • IDs estaveis: TestScenarioTemplate ganha public_id (SCN-000481, imutavel) e external_key (opcional, unico, editavel).
  • Duplicar cenario da biblioteca (POST /api/scenario-templates/{id}/duplicate).
  • Failure classification: TestRunStep.failure_classification, vocabulario fechado, separado do outcome.
  • Vocabulario unico de outcome em ingles: TestRunStep.status migra de 4 strings em portugues para PENDING/RUNNING/PASS/FAIL/ERROR/BLOCKED/SKIPPED (migration de dados explicita, nao so troca de string). TestRun.status (lifecycle) fica de fora de proposito.
  • Automation Discovery (novo modules/automation/): POST /api/automation/runs recebe um contrato ja normalizado e resolve identidade por (source, external_key). Identidade desconhecida vira AutomationDiscovery (UNMAPPED) em vez de rejeitar o resultado ou criar um cenario automatico na Library; mapeamento e sempre uma decisao humana (map/create-scenario/ignore), com backfill de historico preservando discovery_id.
  • Frontend: expoe public_id, duplicar cenario, failure_classification (agora com UI real no RunDetail) e o vocabulario de status atualizado.
  • Docs: ARCHITECTURE.md/MODULAR_ARCHITECTURE.md/KNOWN_LIMITATIONS.md/README.md sincronizados com o estado atual (varias limitacoes ja resolvidas removidas, Authelia -> Authentik).

Migrations

5 novas: 61543bb8aca9, 22ab5fe1dd97, 448ab764c678, 783f6acaca2d (ver backend/alembic/versions/).

Testes

142 testes de backend passando (17 novos), 49 de frontend, typecheck/lint/build limpos em ambos. Migrations testadas com round-trip e contra o banco de dev real (backfill de public_id e migracao de vocabulario confirmados nos dados existentes).

🤖 Gerado com Claude Code

## Resumo - **main.py vira composition root puro** (494 -> 76 linhas): extrai `modules/reports/` (CRUD de Report, relacoes, cenarios/steps, anexos, picklists), seguindo o mesmo padrao `eeg_extension` de `modules/reporting/`. API HTTP fica byte-identica (validado comparando o OpenAPI antes/depois). - **Primeiro split de models.py/schemas.py por modulo**: `Requirement` + schemas de rastreabilidade migram para `modules/traceability/`. `db_base.py` isola `Base = declarative_base()` para evitar um import circular real que essa quebra introduziria (travado em teste de arquitetura novo). - **IDs estaveis**: `TestScenarioTemplate` ganha `public_id` (`SCN-000481`, imutavel) e `external_key` (opcional, unico, editavel). - **Duplicar cenario da biblioteca** (`POST /api/scenario-templates/{id}/duplicate`). - **Failure classification**: `TestRunStep.failure_classification`, vocabulario fechado, separado do outcome. - **Vocabulario unico de outcome em ingles**: `TestRunStep.status` migra de 4 strings em portugues para `PENDING/RUNNING/PASS/FAIL/ERROR/BLOCKED/SKIPPED` (migration de dados explicita, nao so troca de string). `TestRun.status` (lifecycle) fica de fora de proposito. - **Automation Discovery** (novo `modules/automation/`): `POST /api/automation/runs` recebe um contrato ja normalizado e resolve identidade por `(source, external_key)`. Identidade desconhecida vira `AutomationDiscovery` (UNMAPPED) em vez de rejeitar o resultado ou criar um cenario automatico na Library; mapeamento e sempre uma decisao humana (`map`/`create-scenario`/`ignore`), com backfill de historico preservando `discovery_id`. - **Frontend**: expoe `public_id`, duplicar cenario, `failure_classification` (agora com UI real no RunDetail) e o vocabulario de status atualizado. - **Docs**: `ARCHITECTURE.md`/`MODULAR_ARCHITECTURE.md`/`KNOWN_LIMITATIONS.md`/`README.md` sincronizados com o estado atual (varias limitacoes ja resolvidas removidas, Authelia -> Authentik). ## Migrations 5 novas: `61543bb8aca9`, `22ab5fe1dd97`, `448ab764c678`, `783f6acaca2d` (ver `backend/alembic/versions/`). ## Testes 142 testes de backend passando (17 novos), 49 de frontend, typecheck/lint/build limpos em ambos. Migrations testadas com round-trip e contra o banco de dev real (backfill de `public_id` e migracao de vocabulario confirmados nos dados existentes). 🤖 Gerado com [Claude Code](https://claude.com/claude-code)
- main.py cai de ~494 para 76 linhas: vira composition root puro. CRUD de
  Report, relacoes, cenarios/steps, anexos e picklists vao para
  modules/reports/, seguindo o mesmo padrao de eeg_extension de
  modules/reporting/. API HTTP fica byte-identica (validado comparando o
  OpenAPI gerado antes/depois).
- Requirement (+ tabelas de associacao) e os schemas de rastreabilidade saem
  de models.py/schemas.py para modules/traceability/, primeiro domínio a
  quebrar por modulo; models.py/schemas.py reexportam por compatibilidade.
  db_base.py isola Base = declarative_base() pra evitar o import circular que
  isso introduziria (travado em teste de arquitetura novo).
- TestScenarioTemplate ganha public_id (SCN-000481, imutavel) e external_key
  (opcional, editavel, unico) — Requirement -> Cenario, ainda faltava
  identidade estavel pra automacao/API referenciar um cenario sem depender
  do id nem do nome.
- Endpoint de duplicar cenario da biblioteca (copia independente, sem
  historico nem external_key herdada).
- TestRunStep ganha failure_classification (vocabulario fechado, separado do
  outcome), limpo automaticamente quando o step deixa de estar "Falhou".

125 testes de backend passando; migrations testadas com round-trip e contra
o banco de dev real (backfill de public_id confirmado nos dados existentes).
Biblioteca mostra o public_id (SCN-000481) ao lado do nome de cada cenario e
ganha o botao "Duplicar"; api.ts ganha duplicateScenarioTemplate e as
constantes FAILURE_CLASSIFICATIONS/FAILURE_CLASSIFICATION_LABELS (tela em
portugues, valor enviado a API em ingles). Tipos regenerados a partir do
OpenAPI atualizado.
KNOWN_LIMITATIONS.md tinha 3 itens ja resolvidos (paginacao, concorrencia
otimista, testes/lint do frontend) e citava Authelia em vez de Authentik.
ARCHITECTURE.md/MODULAR_ARCHITECTURE.md nao mencionavam modules/traceability/
nem modules/reports/, e documentam agora a convencao de um modules/*/models.py
opcional (db_base.py evitando import circular). README.md tinha referencias
stale a App.jsx/api.js (frontend e TS ha tempo).
Vocabulario de outcome (TestRunStep.status): migra de 4 strings livres em
portugues (Nao testado/Passou/Falhou/Bloqueado) para um vocabulario fechado
em ingles (schemas.StepOutcome: PENDING/RUNNING/PASS/FAIL/ERROR/BLOCKED/
SKIPPED), compartilhado entre execucao manual e a nova ingestao de automacao.
Migration de dados explicita (nao so troca de string em codigo) + rotulo em
portugues centralizado (STATUS_LABELS_PT) usado em PDF/HTML export.
failure_classification (implementado na rodada anterior) passa a checar o
novo vocabulario; a regra de limpar a classificacao ao sair de FAIL foi
extraida para services/scenario_status.py e compartilhada entre as duas rotas
que editam TestRunStep (modules/reports e modules/test_execution), que antes
podiam divergir. TestRun.status (lifecycle Nao iniciado/Em andamento/
Concluido) fica de fora de proposito - eh o container, nao o outcome de um
resultado.

Automation Discovery (novo modules/automation/): POST /api/automation/runs
recebe um contrato ja normalizado (nunca JUnit/pytest/Playwright direto) e
resolve identidade por (source, external_key) - menor identidade estavel
possivel. Identidade desconhecida vira AutomationDiscovery (UNMAPPED) em vez
de rejeitar o resultado ou criar um TestScenarioTemplate automatico; o
usuario decide depois via map/create-scenario/ignore. Reaproveita
TestRun/TestRunScenario/TestRunStep como definicao/execucao/resultado (um
resultado = um TestRunScenario com um TestRunStep) em vez de estrutura
paralela. Mapear uma discovery faz backfill em lote de template_id nas
execucoes que ja chegaram enquanto UNMAPPED, sem apagar discovery_id (
historico original preservado). TestScenarioTemplate.external_key (unico
globalmente) e AutomationDiscovery.mapped_template_id (escopado por source)
ficam deliberadamente independentes - a ingestao nunca le/escreve
external_key, so o oferece como sugestao ao criar cenario a partir de uma
discovery.

142 testes de backend passando (11 novos de automation, 6 de scenario_status).
STEP_STATUSES/STEP_STATUS_LABELS seguem o novo vocabulario (PENDING/RUNNING/
PASS/FAIL/ERROR/BLOCKED/SKIPPED em ingles, rotulo em portugues na tela).
RunDetail ganha o select de failure_classification (ficava exposto so via API
desde a rodada anterior, sem nenhum jeito de usar pela UI) ao lado do status,
visivel so quando o step esta FAIL.
docs: documenta Automation Discovery e o vocabulario unico de outcome
All checks were successful
EEG QA CI / validate-and-build (pull_request) Successful in 8m24s
EEG QA CI / Deploy production (pull_request) Has been skipped
EEG QA CI / Deploy development (pull_request) Has been skipped
d5c40c998e
ARCHITECTURE.md ganha uma secao dedicada explicando a identidade (source +
external_key), por que TestScenarioTemplate.external_key e
AutomationDiscovery.mapped_template_id ficam deliberadamente independentes, e
como UNMAPPED -> MAPPED preserva historico. MODULAR_ARCHITECTURE.md lista
modules/automation/ na estrutura desejada, mesmo padrao de models.py/
schemas.py proprios ja usado em traceability/.
jhony75 merged commit ede25f9fd4 into develop 2026-09-08 01:53:10 -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!36
No description provided.