Skip to content

fix: guards do /qa — preflight self-healing, audit só com e2e verde e recusa de re-run sem mudanças - #43

Merged
elberrd merged 1 commit into
mainfrom
feat/qa-guards
Aug 21, 2026
Merged

fix: guards do /qa — preflight self-healing, audit só com e2e verde e recusa de re-run sem mudanças#43
elberrd merged 1 commit into
mainfrom
feat/qa-guards

Conversation

@elberrd

@elberrd elberrd commented Aug 21, 2026

Copy link
Copy Markdown
Owner

O problema (caso real, projeto de teste)

  1. /qa morreu no preflight com "Playwright is not ready for browser QA", mandando o aluno rodar npm install -D @playwright/test na mão — sendo que o ensurePlaywrightSetup, chamado duas linhas depois no mesmo arquivo, instala exatamente isso.
  2. Depois de instalado, o mesmo run acumulou 8+ resumes idênticos (scope → preflight → e2e ✗ → audit → report → gate ✗) sem nenhuma correção entre as rodadas: 1h02m, 10.56M tokens, US$13.14. O audit (reviewer LLM, ~1M tokens/rodada, replay: false) rodava mesmo com e2e vermelho — um veredito que o gate ia recusar de qualquer forma. A proibição de re-rodar existia só no prompt; o runtime aceitava resume infinito.

As correções (determinísticas, em código)

  • Preflight self-healing: @playwright/test/Chromium/test:e2e/config faltando são instalados ali mesmo, no projeto. Só falha sem package.json (não-npm) ou quando o install em si falha — aí com os comandos manuais.
  • Audit só com e2e verde: e2e vermelho registra a fase gratuita audit_skip (nome distinto de audit para o resume pós-fix rodar o audit real) e vai direto ao gate — corta ~90% da queima observada.
  • Guard unchanged-retry: a cada e2e vermelho, um fingerprint git da árvore (HEAD + status + diff, filtrando o lixo que o próprio run gera: playwright-report/, imp/data/, *.tsbuildinfo…) é gravado em imp/data/qa/<id>/e2e-attempts.json. Resume com árvore idêntica é recusado no início da fase e2e com a instrução de consertar primeiro. --retry-unchanged é o override humano para suíte flaky; sem git o guard falha aberto; e2e verde limpa o marcador.
  • Prompt /qa, cookbook e DOCS atualizados; a mensagem do gate agora aponta /bug//task.

Testes

6 novos em test/fia-qa.test.js: stamp estável sob side effects do run e móvel sob edição real; marcador acumula/reseta/limpa; unchangedRetryError recusa SÓ o re-run comprovadamente fútil; asserts de código no fda_qa (audit atrás de e2e.passed, setup roda mesmo com check falho). Suíte completa 1420/1420 verde, lint limpo.

🤖 Generated with Claude Code

https://claude.ai/code/session_019VtpBiDVL3bbcPgjBFtPeT

…recusa de re-run sem mudanças

Caso real: um /qa morreu no preflight mandando instalar Playwright na mão (o
próprio ensurePlaywrightSetup instala tudo) e, depois de instalado, acumulou
8+ resumes idênticos — scope → e2e ✗ → audit → gate ✗ — queimando 1h02m,
10.56M tokens e US$13.14 sem nenhuma correção entre as rodadas (o audit do
reviewer, ~1M tok e replay: false, rodava mesmo com e2e vermelho).

- Preflight self-healing: dependência/Chromium/config/test:e2e faltando são
  instalados ali mesmo; só falha sem package.json ou com o install falhando.
- Audit condicionado a e2e.passed: e2e vermelho registra a fase gratuita
  audit_skip (nome distinto — resume pós-fix roda o audit real) e vai direto
  ao gate, que agora aponta /bug e /task como próximo passo.
- Guard unchanged-retry determinístico: fingerprint git da árvore (HEAD +
  status + diff, filtrando o lixo do próprio run: playwright-report/,
  imp/data/, *.tsbuildinfo…) gravado em imp/data/qa/<id>/e2e-attempts.json a
  cada e2e vermelho; re-run com stamp idêntico é recusado no início da fase
  (--retry-unchanged é o override humano p/ suíte flaky; sem git, fail open;
  e2e verde limpa o marcador).
- Prompt /qa, cookbook qa.md e DOCS atualizados para os novos guards.
- Testes: 6 novos em fia-qa.test.js (stamp estável sob side effects e móvel
  sob edição real; marcador acumula/reseta/limpa; recusa só o re-run fútil;
  asserts do fda_qa). Suíte completa verde e lint limpo.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019VtpBiDVL3bbcPgjBFtPeT
@elberrd
elberrd merged commit d15ced4 into main Aug 21, 2026
1 check passed
@elberrd
elberrd deleted the feat/qa-guards branch August 21, 2026 16:40
elberrd added a commit that referenced this pull request Aug 21, 2026
Fecha a release com o que entrou desde a alpha.18:
- #42 — comando /llm + imp llm (troca de LLM por agente via número/nome; roster.mjs como writer único do fia.config.yaml)
- #43 — guards do /qa (preflight self-healing, audit só com e2e verde, recusa determinística de re-run sem mudanças)

Suíte completa verde (1420/1420) e lint limpo com o bump aplicado.


Claude-Session: https://claude.ai/code/session_019VtpBiDVL3bbcPgjBFtPeT

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
elberrd added a commit that referenced this pull request Aug 22, 2026
Fecha a release com /llm + imp llm (#42), guards do /qa (#43) e o novo
/defer + imp defer (#45) — pronta para npm publish.


Claude-Session: https://claude.ai/code/session_01B9gdPsvMDQNkqKpz9HPx4X

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant