Skip to content

Testes em shell do harness entram na cobertura do aceite (LUI-183) - #17

Merged
argentinaluiz merged 2 commits into
mainfrom
feature/lui-183-testes-shell-no-aceite
Oct 19, 2026
Merged

argentinaluiz merged 2 commits into
mainfrom
feature/lui-183-testes-shell-no-aceite

Conversation

@argentinaluiz

Copy link
Copy Markdown
Contributor

Aceite

docs/tickets/LUI-182/LUI-183/aceite.md

O que muda

Os testes em shell do harness passam a gravar um relatório no formato do Vitest (apps/api/reports/harness/shell-tests.json), com o token @<ticket>-CA<n> do nome do caso como tag, e o conferidor do aceite o lê como mais um vitest:. O relatório é apagado e regravado a cada execução, então um caso que não rodou agora nunca cobre um critério.

  • scripts/test/shell-tests.sh (novo): o executor das suítes em shell e do relatório.
  • scripts/test/sh-helpers.sh: o record_case e, por cima dele, o pass_case e o fail_case. O cabeçalho diz como nomear um caso de aceite e onde fica o relatório (CA4).
  • scripts/test/shell-tests.test.sh (novo): os testes do CA1 a CA3, em shell, com o conferidor de verdade.
  • scripts/verify.sh: o harness_tests roda as suítes pelo executor e confere o relatório, e o "Aceite" lê o relatório novo.

Desvio do plano: o commit de plano cita só o record_case nos auxiliares. O par pass_case e fail_case veio da /simplify, para o trio imprimir, registrar e contar não ficar copiado em seis pontos. O comportamento é o planejado. Está no achado 1 da revisão de conformidade.

Harness

O PR altera scripts/ e o AGENTS.md, então a Guarda do harness vai reprová-lo e ele só entra por bypass do humano.

🤖 Generated with Claude Code

https://claude.ai/code/session_01ANcDtWf5vRMzv1r42Ax9ce

argentinaluiz and others added 2 commits October 19, 2026 10:50
…183)

Acceptance file docs/tickets/LUI-182/LUI-183/aceite.md (CA1-CA4). No route, contract or schema changes: the ticket only changes harness scripts.

Decision: the shell tests write their own report, apps/api/reports/harness/shell-tests.json, in the Vitest format the checker and check-report.cjs already read, and the checker receives it as one more vitest:<file> spec. It is not merged into node-tests.json because the Node reporter writes that one inside the api container, while the shell suites run on the machine (git and jq); two files keep each writer alone and need no change in the checker.

Decision: the helpers record the cases, and a new runner assembles the report. check, expect_hook and the new record_case append "suite, status, name" to the file in SH_TEST_LOG when it is set, and the runner turns that log into the report with jq at the end of the run. Suites that print their own ok/FALHOU lines (stop-verify and record-touched) call record_case, so every shell case of the harness is in the report, not only the ones that use check. Without SH_TEST_LOG the helpers behave as today.

Decision: the tag comes from the case name with the same pattern as the Node reporter (@<ticket>-CA<n>), and the title stays as written, so the checker's rule against an ID only in the title is satisfied the same way. The pattern lives in two places (JS and jq), which is accepted: it is one line, and the test of CA1 would catch a drift.

Decision: the runner removes the report before anything runs and always writes a new one at the end, even when a suite fails, so a report from a previous run never covers a criterion whose case did not run now (CA3). It keeps going after a failing suite, which the old && chain did not, so the report lists every suite and the Aceite step does not add a missing-report error to a failure already shown. A suite that exits non-zero without a failed case, or that does not exist, becomes one failed case with the exit code, so a crash cannot pass as a report without failures.

Decision: harness_tests runs the shell suites even when the Node tests fail, and then runs check_report on the shell report, so zero cases, a failed case or a skipped one fail the "Testes do harness" step as they do for the Node report.

Decision: the tests of this ticket are shell tests too and carry the @LUI-183-CA<n> token, so they are in the new report and the ticket proves itself with the mechanism it builds. They run the checker for real, through scripts/node-in-api.sh, on a fake acceptance file and a report written under apps/api/reports/ (git-ignored), the only writable folder the api container shares with the machine, so the checker reads them under /repo.

Files and interfaces the implementation will touch:
- scripts/test/sh-helpers.sh: record_case <status> <name> (new) and its use in check and expect_hook; the header documents how to name an acceptance test and where the report is (CA4).
- scripts/test/shell-tests.sh (new): shell-tests.sh <report> <suite>... removes the report, runs each suite with SH_TEST_LOG set, writes the report with jq, exits 1 if any suite failed.
- scripts/test/stop-verify.test.sh and scripts/test/record-touched.test.sh: their own assertions call record_case.
- scripts/test/shell-tests.test.sh (new): the tests of CA1 to CA3, with the new suite added to the list the runner receives.
- scripts/verify.sh: HARNESS_SHELL_REPORT; harness_tests runs the shell suites through the runner and checks the shell report; acceptance adds it to the checker specs; the header comment of harness_tests says so.
- AGENTS.md: the "Cobertura" bullet points to the helpers header for naming a shell acceptance test.

Existing tests whose behavior changes: none (the shell suites print the same lines; the two with their own assertions also record them).

Data changes: none.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013ChFCP7iJd9oEJ81Mc5L2p
Shell suites now write a report in the Vitest format
(apps/api/reports/harness/shell-tests.json) through a new runner, with the
@<ticket>-CA<n> token of a case name as its tag, and the acceptance checker
reads it as one more vitest report. The report is rebuilt on every run, so a
case that did not run now never covers a criterion.

The helpers record each case through pass_case and fail_case, with record_case
behind them; the plan named only record_case.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01ANcDtWf5vRMzv1r42Ax9ce
Copilot AI lite review requested due to automatic review settings October 19, 2026 14:44
@argentinaluiz

Copy link
Copy Markdown
Contributor Author

Revisão de conformidade: LUI-183

# Severidade Achado Situação Motivo
1 baixa O plano cita só o record_case nos auxiliares, e o diff acrescenta o par pass_case e fail_case, que as suítes passam a chamar. O comportamento é o planejado. Não corrigido A mensagem do commit de plano não se reescreve. O record_case ficou por trás do par, que veio do /simplify para não repetir o trio imprimir, registrar e contar em seis pontos. A troca vai na descrição do PR.
Relatório do revisor, na íntegra

Achados

# Severidade Onde Achado Direção da correção
1 baixa scripts/test/sh-helpers.sh:29-42 e :46-64; scripts/test/stop-verify.test.sh e scripts/test/record-touched.test.sh A mensagem do commit de plano decide que check, expect_hook e as asserções próprias de stop-verify e record-touched chamam o record_case, e a lista de interfaces cita só record_case. O diff acrescenta pass_case e fail_case, que não estão no plano, e as suítes passam a chamá-los, não o record_case. O comportamento é o planejado: o caso sai no relatório, e sem SH_TEST_LOG o auxiliar só imprime. A divergência é só de interface, e o plano não menciona o par novo. O plano fica como está, porque a mensagem do commit de plano não se reescreve. Registre a troca (o record_case por trás de pass_case e fail_case) na descrição do PR, para o humano que vai fazer o merge.

Conferências que não geraram achado:

  • Critérios do ticket contra o aceite. O Linear traz CA1 a CA4, com as mesmas marcas (CA1 a CA3 de unidade, CA4 de documento). O docs/tickets/LUI-182/LUI-183/aceite.md tem os quatro títulos ## LUI-183-CA1 a ## LUI-183-CA4. Nenhum critério ficou fora do arquivo.
  • Desvio do contrato. A visão diz que o contrato e o schema estão iguais ao commit de plano 7fe56b9. O ticket só mexe em scripts do harness e não tem rota nem tabela.
  • CA1 a CA3 entregues e provados. O teste de CA1 confere a tag, o estado passed, o título intacto, a saída 0 do conferidor e a mensagem "coberto por 1 teste(s)". O de CA2 confere o executor saindo com 1, o estado failed e a mensagem do conferidor, e há um segundo caso para a suíte que termina com erro sem caso que falhou. O de CA3 prova antes que o relatório anterior trazia a tag, roda de novo sem o caso e confere a saída 1 com "não tem nenhum teste". As mensagens citadas batem com as de scripts/check-acceptance.cjs.
  • CA4. O cabeçalho de scripts/test/sh-helpers.sh diz como nomear o caso (@<ticket>-CA<n>) e onde fica o relatório (apps/api/reports/harness/shell-tests.json, apagado e regravado a cada execução).
  • Documento dono. O AGENTS.md só aponta para o cabeçalho do auxiliar, sem repetir o conteúdo. Não achei outro documento que descreva a cobertura do aceite como limitada ao relatório do Node.
  • Fora de critério. O executor, o harness_tests e o acceptance do verify.sh fazem o que o plano decide: relatório à parte, apagado e regravado, execução que segue depois de falha, suíte que quebra ou não existe vira caso que falhou, e o relatório novo entra como mais um vitest:. A expressão do token no jq é igual à do TOKEN de node-test-report.cjs. A glob scripts/test/*.test.sh cobre as nove suítes que a lista antiga trazia, mais a nova.
  • Aceite congelado. Nenhum aceite.md que já existia foi alterado. O do LUI-183 é novo.

O que não consegui conferir

  • Não rodei nada: nem o executor, nem os testes em shell, nem o conferidor, nem o scripts/verify.sh full. Que o jq aceita a combinação -R -n --args com inputs e <"$log", e que o aninhamento (o teste do executor rodando dentro do executor, com SH_TEST_LOG sobrescrito) se comporta, é só leitura do código.
  • Não conferi que o conferidor, rodando no contêiner api, enxerga a pasta de trabalho gravada pela máquina em apps/api/reports/ (o /repo montado só para leitura). Isso depende do ambiente Docker. O apps/api/.gitignore ignora /reports, o que confirma o "ignorada pelo Git".
  • Não conferi que cada suíte em shell registra todos os casos dela. Só vi que as nove carregam o sh-helpers.sh e que nenhuma imprime FALHOU ou ok: por fora dos auxiliares.
  • A guarda do harness vai reprovar o PR por alterar scripts/ e AGENTS.md. O ticket já avisa que só entra por bypass do humano. Não conferi esse check.

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔵 Needs a closer look

The reviewed report-generation issue can yield zero recorded tests, and harness changes require human verification.

No open issues 🎉

What changed in this PR

This PR integrates shell harness tests into acceptance coverage through Vitest-compatible reports.

Changes:

  • Adds shell test execution and reporting.
  • Integrates reports into verify.sh and acceptance checks.
  • Updates helpers, tests, acceptance criteria, and documentation.

Review note (nit): the report generation currently combines jq -n with inputs, which can produce zero recorded tests.

File Description
scripts/​verify.sh Runs and validates shell reports.
scripts/​test/​stop-verify.test.sh Uses updated case helpers.
scripts/​test/​shell-tests.test.sh Tests shell execution and reporting.
scripts/​test/​shell-tests.sh Executes suites and generates reports.
scripts/​test/​sh-helpers.sh Records passed and failed cases.
scripts/​test/​record-touched.test.sh Uses updated case helpers.
docs/​tickets/​LUI-182/​LUI-183/​aceite.md Defines acceptance criteria.
AGENTS.md Documents shell-test coverage.

Review effort: Lite

@argentinaluiz
argentinaluiz merged commit e70e2fc into main Oct 19, 2026
1 of 3 checks passed
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.

2 participants