@fontdata/ai-harness 3.1.2 → 3.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "name": "fontdata",
3
- "version": "3.1.2",
3
+ "version": "3.2.1",
4
4
  "mcpServers": {
5
- "banco_dados": { "command": "npx", "args": ["-y", "@fontdata/ai-harness@3.1.2", "banco-dados-mcp"] }
5
+ "banco_dados": { "command": "npx", "args": ["-y", "@fontdata/ai-harness@3.2.1", "banco-dados-mcp"] }
6
6
  },
7
7
  "description": "Harness de engenharia com IA da Fontdata para Claude Code",
8
8
  "author": { "name": "Fontdata" },
@@ -81,6 +81,10 @@ function validateLine(event, line) {
81
81
  }
82
82
  return problems;
83
83
  }
84
+ /** Valida um evento já montado (o mesmo contrato do doctor), para recusá-lo antes de gravar. */
85
+ export function validateEvent(event) {
86
+ return validateLine(event, 1);
87
+ }
84
88
  /** Valida o conteúdo de um arquivo de rastro; a última linha sem `\n` é ignorada (escrita em andamento). */
85
89
  export function validateEventLog(content) {
86
90
  const complete = content.split('\n').slice(0, -1);
@@ -1,6 +1,7 @@
1
1
  import { join } from 'node:path';
2
2
  import { pathToFileURL } from 'node:url';
3
3
  import { templatesDir } from '../catalog.js';
4
+ import { validateEvent } from '../contratos/eventos.js';
4
5
  import { suggestFlag } from '../install/flags.js';
5
6
  import { acharRaiz } from '../raiz.js';
6
7
  /** O CLI grava pela mesma biblioteca dos hooks, para as duas formas produzirem o mesmo formato. */
@@ -42,6 +43,12 @@ export async function runEventCommand(argv) {
42
43
  }
43
44
  }
44
45
  }
45
- (await loadRastroLib()).recordEvent(acharRaiz(), fields);
46
+ // Recusa antes de gravar o que o doctor apontaria como rastro-formato-invalido: o rastro é append-only.
47
+ const lib = await loadRastroLib();
48
+ const problems = validateEvent(lib.buildEvent(fields));
49
+ if (problems.length) {
50
+ throw new Error(`Evento fora do contrato (docs/contratos/EVENTOS.md); nada foi gravado.\n${problems.map((p) => `- ${p.mensagem}`).join('\n')}`);
51
+ }
52
+ lib.recordEvent(acharRaiz(), fields);
46
53
  return 0;
47
54
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fontdata/ai-harness",
3
- "version": "3.1.2",
3
+ "version": "3.2.1",
4
4
  "description": "Harness de engenharia com IA da Fontdata para Claude Code: roda os slash commands direto na pasta do projeto via npx, sem instalar nada — ou instala-os em .claude/commands.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -14,7 +14,7 @@ Comece por `/harness`, que conduz o setup em etapas.
14
14
  task; uma task só fecha com suíte verde registrada no rastro.
15
15
  - **Quem implementa não aprova.** Os agents `revisor-testes` e `qa`, somente leitura, fazem os gates de cada task.
16
16
  - **Orquestração com sub-agents.** Tasks independentes da mesma fase rodam em paralelo; o orquestrador delega, não
17
- implementa. **Sempre relatar qual agent está ativo** no chat.
17
+ implementa. Relatar no chat qual agent está ativo, para o usuário acompanhar a execução.
18
18
 
19
19
  ## Modelo de arquivos
20
20
 
@@ -66,13 +66,16 @@ de tratamento de erro —, mesmo que difira das convenções novas. As convenç
66
66
  No dia a dia: `/nova-tarefa`, `/executar-plan`, `/resolver-bug`, `/git-commit-push` e `/versao`. De vez em quando:
67
67
  `/sincronizar-claude-md` e `/evoluir-harness`.
68
68
 
69
- ## Nunca fazer
69
+ ## Limites
70
70
 
71
- - Nunca implementar sem teste escrito antes.
72
- - Nunca avançar de fase com gate (testes) falhando nem fechar task sem suíte verde.
73
- - Nunca reescrever `SPEC.md`, `CLAUDE.md` ou planos sem pedido explícito.
74
- - Nunca usar `git push --force` ou comandos destrutivos sem confirmação.
75
- - Nunca comentar o passo a passo do código, decorar arquivo com banner de seção, nem escrever
76
- task/fase/plano/data/hash de commit dentro de comentário — isso vai na mensagem de commit e em `docs/trabalhos/`.
77
- O padrão completo está em `.claude/rules/comentarios.md`, instalada pelo `init`, e o hook de comentários bloqueia
78
- a violação.
71
+ Cada limite vem com o motivo, para valer também nos casos que a regra não cita.
72
+
73
+ - Escrever o teste antes da implementação: só um teste que falhou antes prova que ele pega a implementação errada.
74
+ - Avançar de fase só com o gate verde e fechar task só com suíte verde: uma fase construída sobre outra quebrada
75
+ esconde a origem do erro.
76
+ - Alterar `SPEC.md`, `CLAUDE.md` e planos só a pedido: são o contrato que o usuário aprovou, e mudança de escopo vira
77
+ decisão registrada.
78
+ - Pedir confirmação antes de `git push --force` e de comandos destrutivos: eles apagam trabalho que não se recupera.
79
+ - Deixar o código sem comentário de passo a passo, sem banner de seção e sem task/fase/plano/data/hash de commit:
80
+ isso envelhece no código e já está na mensagem de commit e em `docs/trabalhos/`. O padrão completo está em
81
+ `.claude/rules/comentarios.md`, instalada pelo `init`, e o hook de comentários bloqueia a violação.
@@ -27,7 +27,7 @@ ninguém pergunte nada no meio. Você não edita o plano: aponta o que precisa m
27
27
  7. **Tamanho:** cada task cabe numa sessão de trabalho; task grande demais é dividida.
28
28
  8. **Legado e riscos:** áreas de código legado tocadas estão identificadas, com o padrão local a preservar.
29
29
 
30
- Use `Bash` só para rodar o `doctor` e ler o histórico: **nunca** altere arquivos, faça commit ou push.
30
+ Use `Bash` só para rodar o `doctor` e ler o histórico: você é somente leitura, então não altere arquivos, faça commit ou push.
31
31
 
32
32
  ## Saída
33
33
 
@@ -18,7 +18,7 @@ ou quando ficou claro que ela ainda é hipótese. Você não corrige o bug.
18
18
  frontmatter).
19
19
  3. **Comprove.** A causa raiz só é `comprovada` quando você mostra a linha ou a condição que produz o sintoma e
20
20
  por que a reprodução falha por causa dela. Caso contrário, ela é `hipotese`.
21
- 4. Use `Bash` só para ler, buscar no histórico e reproduzir: **nunca** altere arquivos, instale dependências,
21
+ 4. Use `Bash` só para ler, buscar no histórico e reproduzir: você é somente leitura, então não altere arquivos, instale dependências,
22
22
  faça commit ou push.
23
23
 
24
24
  ## Saída
@@ -22,7 +22,7 @@ Você não corrige nada: se algo falha, você reporta.
22
22
  2. Rode a **suíte completa** do projeto, não só os testes da task, com o comando declarado na rule de projeto quando
23
23
  houver. Em área de verificação manual, siga o roteiro da rule e colete evidência de cada item.
24
24
  3. Confira que nada fora do escopo da task foi alterado (`git diff --stat`).
25
- 4. Use `Bash` só para ler e rodar testes: **nunca** altere arquivos, instale dependências, faça commit ou push.
25
+ 4. Use `Bash` só para ler e rodar testes: você é somente leitura, então não altere arquivos, instale dependências, faça commit ou push.
26
26
 
27
27
  ## Saída
28
28
 
@@ -42,3 +42,6 @@ npx @fontdata/ai-harness evento agent_veredito --trabalho <id> --task <T-SS.NN>
42
42
  Com falhas, use `suite_vermelha` e `--resultado falha`. Na verificação manual, registre `suite_verde` com
43
43
  `"comando":"manual"`, `total` igual ao número de itens do roteiro e `falhas` igual a 0; com item reprovado,
44
44
  `suite_vermelha`.
45
+
46
+ O CLI recusa valor fora do contrato: `--resultado` aceita só `ok`, `aviso`, `bloqueio` ou `falha` (o veredito
47
+ `aprovado`/`reprovado` vai em `--dados`), e `--task` leva só o id `T-SS.NN`, sem sufixo.
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: revisor-testes
3
- description: Revisa os testes de uma task antes de ela fechar, perguntando se cada teste crítico passaria com a implementação errada. Use quando o implementador disser que a task está pronta. Somente leitura; roda a suíte, não edita.
3
+ description: Revisa os testes de uma task antes de ela fechar, perguntando se cada teste crítico passaria com a implementação errada. Use quando o implementador disser que a task está pronta. Somente leitura; roda os testes da task, não edita.
4
4
  tools: Read, Grep, Glob, Bash
5
5
  model: sonnet
6
6
  ---
@@ -22,10 +22,25 @@ comportamento que a task promete.
22
22
  - mock que substitui justamente o que deveria ser testado;
23
23
  - só o caminho feliz, sem o caso de erro ou de borda que a task menciona;
24
24
  - dado de entrada que coincide com o resultado esperado por acaso.
25
- 3. Rode a suíte com o comando declarado em `.claude/rules/harness-projeto.md` ou, sem ele, com o comando de teste
26
- do projeto (`npm test`, `dotnet test`, `pytest`...), e anote o resultado. Em área de verificação manual declarada
27
- na rule, revise se o roteiro cobre os critérios da task.
28
- 4. Use `Bash` só para ler e rodar testes: **nunca** altere arquivos, instale dependências, faça commit ou push.
25
+ 3. Compare cada teste crítico com o texto do plano e com o `git diff`. O implementador é cobrado por suíte verde, e o
26
+ atalho mais barato é mexer no teste:
27
+ - teste crítico removido, pulado (`skip`, `only`, `xit`) ou com o valor esperado diferente do plano é
28
+ **BLOQUEANTE**;
29
+ - asserção trocada por uma mais fraca do que a que existia antes da task é **BLOQUEANTE**;
30
+ - código que devolve um valor fixo ou trata como caso especial justamente a entrada do teste, em vez de aplicar a
31
+ regra, é **BLOQUEANTE**.
32
+ 4. Rode só os testes da task (o arquivo ou o filtro que os seleciona), com o comando declarado em
33
+ `.claude/rules/harness-projeto.md` ou, sem ele, com o comando de teste do projeto (`npm test`, `dotnet test`,
34
+ `pytest`...), e anote o resultado. A suíte completa é rodada pelo `qa` logo depois. Em área de verificação manual
35
+ declarada na rule, revise se o roteiro cobre os critérios da task.
36
+ 5. Use `Bash` só para ler e rodar testes. Você é somente leitura porque um gate que altera o código deixa de provar
37
+ alguma coisa: não altere arquivos, não instale dependências, não faça commit nem push.
38
+
39
+ <example>
40
+ **BLOQUEANTE** — `tests/desconto.test.ts:22`: o plano declara "cupom de 10% sobre R$ 80,00 dá R$ 72,00", mas o
41
+ teste foi trocado para `expect(total).toBeGreaterThan(0)`, que passa com qualquer cálculo. Restaure a asserção do
42
+ valor exato.
43
+ </example>
29
44
 
30
45
  ## Saída
31
46
 
@@ -116,8 +116,8 @@ Não invente o que não surgiu na entrevista; ponto ambíguo fica como "a defini
116
116
  - Regra de cobertura: [...]
117
117
  - Testes críticos deste projeto: [lista extraída do SPEC]
118
118
 
119
- ## Nunca fazer
120
- - Nunca [proibição específica deste projeto]
119
+ ## Limites
120
+ - [O que fazer ou evitar neste projeto]: [o motivo, para valer também nos casos que a regra não cita]
121
121
 
122
122
  ## Decisões em aberto
123
123
  - [ ] [decisão não resolvida no SPEC]
@@ -52,7 +52,8 @@ fique para trás. Determine também:
52
52
  - arquivos de "Novidades" consumidos pela UI (ex.: `src/data/novidades.ts`);
53
53
  - arquivos texto de histórico (ex.: `Versoes.txt` na raiz, com padrão de espaçamento/formatação próprio).
54
54
  - Se há **automação de tag** (ex.: `.github/workflows/auto-tag.yml` que cria a tag na `main`). Se houver,
55
- **NÃO crie a tag** — apenas commite; a Action cria a tag quando o commit chega na branch alvo.
55
+ não crie a tag, só commite: a Action cria a tag quando o commit chega na branch alvo, e uma tag criada à mão
56
+ duplica a dela.
56
57
  - O **gerenciador de pacotes / runner de testes** do projeto (npm/pnpm/yarn, `dotnet`, etc.), lendo
57
58
  `package.json` scripts ou os manifestos.
58
59
 
@@ -70,8 +71,8 @@ fique para trás. Determine também:
70
71
  1. Algum `feat:` → **minor**: `Y = Y + 1`, demais à direita = `0`.
71
72
  2. Senão, algum `fix:`/`chore:`/`refactor:`/`docs:`/`style:`/`perf:`/`test:` → **patch**.
72
73
  3. Senão → sem bump elegível: avise e **peça confirmação** (abortar ou versão explícita).
73
- - **`major` é SEMPRE manual** — só sobe quando o usuário passa `X.Y.Z` explícito ou `major`. A inferência
74
- jamais sobe major.
74
+ - **`major` é manual** — só sobe quando o usuário passa `X.Y.Z` explícito ou `major`, porque sinaliza quebra de
75
+ compatibilidade e isso é decisão de quem mantém o projeto. A inferência não sobe major.
75
76
 
76
77
  ## Passo 3 — Gerar o changelog (no padrão do projeto)
77
78
 
@@ -144,14 +145,15 @@ Apresente ao usuário, **antes de escrever qualquer coisa**:
144
145
  2. Commit semântico (1ª letra maiúscula após `: `): `chore: Release vX.Y.Z` (ou, em projetos Delphi que já
145
146
  usem o padrão, `build: Modificada versão do sistema no projeto`). Finalize com a linha
146
147
  `Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>`.
147
- 3. **Tag:** se existir automação de tag (Action na `main`), **NÃO crie a tag** — informe que ela será criada
148
+ 3. **Tag:** se existir automação de tag (Action na `main`), não crie a tag — informe que ela será criada
148
149
  automaticamente quando o commit chegar na branch alvo. Caso contrário, e somente se o usuário pedir,
149
150
  ofereça criar a tag `v<X.Y.Z>` localmente.
150
- 4. **PARE. Nunca `git push`.** Informe o fluxo manual de push ao usuário.
151
+ 4. **Pare aqui, sem `git push`.** Informe o fluxo manual de push ao usuário.
151
152
 
152
153
  ## Guardrails
153
154
 
154
- - **NUNCA** `git push`. Não criar tag se houver automação que já faça isso.
155
+ - Sem `git push`: o push publica a versão para todos, e quem decide quando é o usuário. Não criar tag se houver
156
+ automação que já faça isso.
155
157
  - **Sempre** confirmar versão + changelog no GATE antes de gravar.
156
158
  - **Abortar** se a working tree estiver suja ou se os testes/build falharem.
157
159
  - **Replicar o padrão do projeto** (formato de versão, changelog, commit) — nunca impor um novo.
@@ -86,6 +86,10 @@ cada tipo na sua pasta dentro de `docs/`). Hoje cada trabalho mora em `docs/trab
86
86
  - **Comentários:** `.claude/rules/comentarios.md` ausente (o `init` e o `update` a instalam); outra rule que repete
87
87
  regra de comentário; bloco antigo de comentários no `CLAUDE.md`.
88
88
  - Rule com mais de 30 linhas, que repete o `CLAUDE.md`, descreve o que o código já mostra ou contradiz outra rule.
89
+ - **Frontmatter:** rule sem frontmatter, sem `descricao` ou sem `origem` (ver `rule.md`), ou com YAML inválido, que
90
+ faz o Claude Code ignorar o `paths`. Exceções: `comentarios.md` e `harness-projeto.md`, instaladas pelo `init`.
91
+ - **Rule que já não se paga:** sem `paths` embora trate de uma área só do código, ou nascida de um bug cujo padrão o
92
+ teste de regressão, um tipo, um lint ou um hook já impede. Proponha escopar, fundir com outra ou apagar.
89
93
  - Projeto com código legado sem a rule de precedência do padrão local (ver `rule.md`).
90
94
 
91
95
  ## 7. Skills e hooks do projeto
@@ -27,6 +27,8 @@ Os agents em `.claude/agents/`, o `CLAUDE.md`, o `SPEC.md` e as rules que já ex
27
27
 
28
28
  ```markdown
29
29
  ---
30
+ descricao: "Convenções do backend: validação de entrada e formato de erro"
31
+ origem: "evoluir-harness"
30
32
  paths:
31
33
  - "apps/api/**/*.ts"
32
34
  ---
@@ -45,11 +47,20 @@ Os agents em `.claude/agents/`, o `CLAUDE.md`, o `SPEC.md` e as rules que já ex
45
47
 
46
48
  Identifique as áreas legadas (pastas, extensões como `.pas` e `.dfm`, módulos antigos) e cite-as na rule.
47
49
 
48
- 4. **Rule que teria evitado um bug**, quando o `/resolver-bug` sugerir: padrão proibido, validação obrigatória ou
49
- teste exigido.
50
+ 4. **Rule que teria evitado um bug**, só quando a avaliação do Passo 5 do `/resolver-bug` concluir que ela é
51
+ necessária: padrão proibido, validação obrigatória ou teste exigido.
50
52
 
51
53
  ## Cada rule deve
52
54
 
55
+ - **Começar com frontmatter**, inclusive a incondicional:
56
+ - `descricao`: o que a rule evita ou padroniza, em uma linha;
57
+ - `origem`: o id do trabalho que a motivou (uma lista, se forem vários), ou `evoluir-harness`;
58
+ - `paths`: os globs, entre aspas, quando a rule vale só para uma área do código.
59
+
60
+ O Claude Code só lê `paths` e retira o frontmatter antes de carregar a rule, então `descricao` e `origem` não
61
+ custam contexto: é por eles que a auditoria sabe por que a rule existe e se ela ainda vale. YAML inválido faz o
62
+ Claude Code ignorar o frontmatter, e a rule escopada passa a carregar em toda sessão.
63
+ - Ser escopada por `paths` sempre que o assunto se limita a uma área, para não ocupar o contexto das outras.
53
64
  - Ser concisa — máximo de 30 linhas.
54
65
  - Conter apenas o que o agent não descobriria sozinho lendo o código.
55
66
  - Complementar o system prompt do agent, não repetir o que já está lá nem no `CLAUDE.md`.
@@ -9,7 +9,12 @@ argument-hint: "[id do trabalho]"
9
9
  Trabalho: $ARGUMENTS
10
10
 
11
11
  Você é o **ORQUESTRADOR**. Você não implementa nada: lê o plano, delega cada task a sub-agents, aplica os gates e
12
- mantém o estado em disco. **Sempre relate no chat qual agent está ativo**, principalmente nos gates.
12
+ mantém o estado em disco. Relate no chat qual agent está ativo, principalmente nos gates: é por esse relato que o
13
+ usuário acompanha uma execução que roda sem perguntas.
14
+
15
+ A execução é longa e o contexto pode ser compactado no meio dela. Como o estado está em disco (frontmatter do
16
+ `PLAN.md`, `BLOQUEIOS.md` e o rastro), siga até o fim da fase em vez de encerrar por causa do limite de contexto;
17
+ depois de uma compactação, retome pelo `references/retomada.md`.
13
18
 
14
19
  ## Passo 0 — Identificar o trabalho (somente leitura)
15
20
 
@@ -56,7 +61,9 @@ abertos e eventos do rastro. Apresente ao usuário:
56
61
 
57
62
  1. Nunca inicie uma fase antes de todas as tasks da anterior estarem `concluida` (ou `bloqueada`/`pulada` com
58
63
  registro).
59
- 2. Dentro da fase, dispare em paralelo as tasks `paralelizavel: true` cujas dependências estão concluídas.
64
+ 2. Dentro da fase, dispare em paralelo as tasks `paralelizavel: true` cujas dependências estão concluídas: uma
65
+ chamada de sub-agent por task, todas na **mesma mensagem**. Chamadas em mensagens separadas rodam uma depois da
66
+ outra.
60
67
  3. Ao delegar uma task, registre o início, troque o status da task para `em-andamento` e passe ao sub-agent o
61
68
  contexto de `references/delegacao.md`:
62
69
 
@@ -2,24 +2,41 @@
2
2
 
3
3
  ## Contexto passado ao sub-agent
4
4
 
5
+ Os dados da task vão dentro de `<task>`, separados das instruções fixas. O objetivo vem da `SPEC.md` do trabalho:
6
+ sabendo para que a task serve, o sub-agent decide melhor o que a lista de campos não cobre.
7
+
5
8
  > Você é responsável pela task **T-SS.NN — [título]** do trabalho `docs/trabalhos/<id>/`.
6
9
  >
10
+ > <task>
11
+ > - **Objetivo do trabalho:** [uma ou duas frases da SPEC: o problema e quem ganha com a solução]
7
12
  > - **Input:** [o que já está pronto]
8
13
  > - **Output esperado:** [arquivo, função ou estrutura exata]
9
14
  > - **Testes críticos:**
10
15
  > - [teste 1]
11
16
  > - [teste 2]
12
17
  > - **Critério de aceite:** [verificável com sim ou não]
18
+ > </task>
13
19
  >
14
20
  > Siga as convenções do `CLAUDE.md` e as rules do projeto. Escreva os testes primeiro (RED), confirme que falham,
15
- > implemente o mínimo para passar (GREEN) e rode a suíte do módulo.
21
+ > implemente o necessário para passar (GREEN) e rode os testes do módulo.
22
+ >
23
+ > Implemente a regra de verdade, que funcione para qualquer entrada válida, e não só para os casos dos testes: os
24
+ > testes verificam a solução, não a definem. Os testes críticos são o contrato da task e o `revisor-testes` compara
25
+ > cada um com o plano, então não os altere, não os enfraqueça nem os remova para fazê-los passar. Se um teste parecer
26
+ > errado ou contradizer a `SPEC.md`, implemente a regra da `SPEC.md` mesmo assim e relate o teste que continuou
27
+ > falhando como dúvida, com a conta que mostra a contradição: assim a task fica a uma decisão de fechar.
28
+ >
29
+ > Faça só o que a task pede: sem refatorar o entorno, sem abstração para um uso só, sem opção de configuração e sem
30
+ > tratamento de erro para cenário que não pode acontecer. O que ficar fora do escopo entra no seu relato como
31
+ > sugestão.
16
32
  >
17
- > **Não** altere `SPEC.md`, `CLAUDE.md` nem o `PLAN.md`: quem atualiza o status é o orquestrador.
18
- > **Não** pergunte nada ao usuário: se precisar de uma decisão, pare e descreva a dúvida, as opções e o que
19
- > destrava — o orquestrador registra como bloqueio.
33
+ > `SPEC.md`, `CLAUDE.md` e `PLAN.md` ficam como estão: quem atualiza o status é o orquestrador. Também não pergunte
34
+ > nada ao usuário, porque ninguém acompanha a execução: se precisar de uma decisão, pare e descreva a dúvida, as
35
+ > opções e o que destrava — o orquestrador registra como bloqueio.
20
36
  >
21
37
  > Comentários: o padrão é não comentar (bloco interno até 3 linhas, docstring pública até 5, sem cabeçalho de
22
- > arquivo). **Não** escreva no código o número da task, a fase, o plano, a data nem o que você investigou.
38
+ > arquivo). O número da task, a fase, o plano, a data e o que você investigou vão para o commit e para
39
+ > `docs/trabalhos/`, não para o código.
23
40
  >
24
41
  > Na área de código legado tocada, preserve o padrão local do arquivo; convenções novas valem para arquivo novo.
25
42
 
@@ -30,6 +47,8 @@
30
47
  2. **qa** recebe a task, os critérios de aceite e o comando da suíte completa. Ele registra a suíte no rastro:
31
48
  - `suite_verde` com `--resultado ok` e `{"comando", "total", "falhas": 0}`;
32
49
  - `suite_vermelha` com `--resultado falha` e o número de falhas.
50
+ - `--resultado` aceita só `ok`, `aviso`, `bloqueio` ou `falha`, e `--task` só o id `T-SS.NN`; o CLI recusa
51
+ outro valor (o veredito `aprovado`/`reprovado` vai em `--dados`).
33
52
  3. **Voltas:** no máximo 2 retornos ao implementador por task. Na terceira reprovação, a task vira bloqueio.
34
53
 
35
54
  ## Fechamento
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: lgpd-checker
3
3
  description: >
4
- Analisa um projeto de software em busca de falhas de conformidade com a LGPD (Lei Geral de Proteção de Dados — Lei nº 13.709/2018) e gera um relatório detalhado classificando os problemas encontrados por categoria e severidade. Use este skill SEMPRE que o usuário mencionar LGPD, proteção de dados, privacidade, compliance de dados pessoais, adequação à lei de privacidade brasileira, verificação de privacidade em código, auditoria de dados pessoais, ou quando perguntar se o sistema está em conformidade com a lei brasileira de dados. Também acione este skill quando o usuário quiser revisar código em busca de problemas relacionados a: coleta de consentimento, criptografia de dados pessoais, direitos dos titulares, logs de acesso, retenção de dados, ou política de privacidade.
4
+ Analisa um projeto de software em busca de falhas de conformidade com a LGPD (Lei Geral de Proteção de Dados — Lei nº 13.709/2018) e gera um relatório detalhado classificando os problemas encontrados por categoria e severidade. Use quando o usuário pedir uma análise ou auditoria de conformidade com a LGPD, perguntar se o sistema está adequado à lei brasileira de dados pessoais, ou quiser revisar o código em busca de problemas de consentimento, criptografia de dados pessoais, direitos dos titulares, logs de acesso, retenção de dados ou política de privacidade. Não é para mudanças pontuais que só tocam um dado pessoal, como mascarar um campo ou adicionar um cadastro.
5
5
  ---
6
6
 
7
7
  # LGPD Checker — Skill de Análise de Conformidade
@@ -56,7 +56,7 @@ Busque por nomes de campos, variáveis e comentários que indiquem:
56
56
  ### CAT-4: Segurança Técnica (Art. 46, 47, 48)
57
57
  Busque por:
58
58
  - Configurações de HTTPS/TLS (arquivos de configuração de servidor, `.env`, nginx/apache configs)
59
- - Criptografia de senhas: uso de bcrypt, argon2, scrypt (NÃO MD5, SHA1 puro, ou texto claro)
59
+ - Criptografia de senhas: uso de bcrypt, argon2, scrypt (MD5, SHA1 puro ou texto claro são falha)
60
60
  - Criptografia em repouso para campos sensíveis
61
61
  - Variáveis de ambiente para credenciais (não hardcoded no código)
62
62
  - Tokens JWT: verificação de assinatura, expiração
@@ -73,12 +73,58 @@ explícito que a primeira task confirma ou derruba a hipótese. **Não altere na
73
73
  5. No frontmatter do `PLAN.md`, cada task vai de `pendente` para `em-andamento` e, com `suite_verde` registrado, para
74
74
  `concluida`, no feminino. Os outros valores aceitos são `bloqueada` e `pulada`.
75
75
 
76
- ## Passo 5 — Relatório duplo
76
+ ## Passo 5 — Evitar que volte: a rule é mesmo necessária?
77
+
78
+ O teste de regressão já protege o ponto corrigido. Uma rule só se justifica quando o mesmo erro pode ser cometido de
79
+ novo **em outro código** e nada além dela o impediria. Toda rule entra no contexto das sessões (todas, ou as que tocam
80
+ o `paths:` dela): rule desnecessária gasta contexto e dilui as que importam. Por isso o resultado esperado na maioria
81
+ dos bugs é **nenhuma rule**.
82
+
83
+ Responda com a evidência da investigação:
84
+
85
+ 1. **Padrão repetível:** o erro vem de um padrão que outro código pode repetir (ex.: usar `process.cwd()` onde o
86
+ projeto exige `acharRaiz()`), e não de um engano pontual (conta errada, condição invertida, caso esquecido)?
87
+ 2. **Fora do alcance do teste:** um código novo que repita o padrão passaria pelo teste de regressão sem falhar?
88
+ 3. **Não descobrível:** um agent lendo o código ao redor não chegaria sozinho à forma certa?
89
+ 4. **Sem cobertura:** nenhuma rule, `CLAUDE.md`, lint, tipo ou hook do projeto já trata do caso?
90
+ 5. **Rule é o mecanismo certo:** o erro não se evita melhor com algo que bloqueia em vez de orientar (tipo, lint,
91
+ hook, teste de contrato)? A rule é contexto e pode não ser seguida.
92
+
93
+ | Respostas | Decisão |
94
+ |---|---|
95
+ | "Não" em 1, 2 ou 3 | **Nenhuma rule** |
96
+ | "Não" em 4 | **Ajustar a rule existente**, sem criar outra sobre o mesmo assunto |
97
+ | "Não" em 5 | **Outro mecanismo**: sugira o hook (`/evoluir-harness hook`), a regra de lint ou o tipo |
98
+ | "Sim" em todas | **Nova rule** |
99
+
100
+ Com nova rule ou ajuste, apresente o rascunho e **não grave sem aprovação**. A rule segue
101
+ `evoluir-harness/references/rule.md` (até 30 linhas, a regra e o motivo dela) e **sempre começa com frontmatter**:
102
+
103
+ ```markdown
104
+ ---
105
+ descricao: "Comandos do CLI resolvem a raiz do projeto com acharRaiz(), não com process.cwd()"
106
+ origem: "2026-10-06-cli-grava-relativo-ao-cwd"
107
+ paths:
108
+ - "src/**/*.ts"
109
+ ---
110
+
111
+ # Raiz do projeto nos comandos do CLI
112
+ ```
113
+
114
+ - `descricao` (o que a rule evita, em uma linha) e `origem` (o id deste trabalho) são obrigatórios. O Claude Code
115
+ só lê `paths` e retira o frontmatter antes de carregar a rule, então esses campos não custam contexto: servem
116
+ para a auditoria do `/evoluir-harness` e para quem decide se a rule ainda vale.
117
+ - `paths` entra sempre que o padrão se limita a uma área do código, para a rule só carregar quando o trabalho toca
118
+ esses arquivos. Sem `paths`, ela vale em toda sessão: diga por quê.
119
+ - Globs entre aspas. YAML inválido faz o Claude Code ignorar o frontmatter e carregar a rule em toda sessão.
120
+
121
+ ## Passo 6 — Relatório duplo
77
122
 
78
123
  Com a correção aprovada, escreva os dois relatórios a partir dos templates:
79
124
 
80
125
  - **`relatorios/TECNICO.md`** (`templates/relatorios/TECNICO.md`): sintoma, reprodução, causa raiz, correção,
81
- testes que protegem e riscos remanescentes.
126
+ testes que protegem, riscos remanescentes e a decisão de prevenção do Passo 5 com o motivo — inclusive quando é
127
+ "nenhuma rule".
82
128
  - **`relatorios/CLIENTE.md`** (`templates/relatorios/CLIENTE.md`): o que acontecia, quem foi afetado, o que muda
83
129
  e se alguém precisa fazer algo — **sem jargão técnico**, seguindo `references/relatorio-para-cliente.md`.
84
130
 
@@ -92,11 +138,6 @@ npx @fontdata/ai-harness evento trabalho_concluido --trabalho <id> --nome resolv
92
138
  Troque o `status` do documento `PLAN.md` (o do topo do frontmatter, não o das tasks) para `concluido` e o dos
93
139
  relatórios para `final`.
94
140
 
95
- ## Passo 6 — Evitar que volte
96
-
97
- Sugira uma rule em `.claude/rules/` que teria evitado o bug (padrão proibido, validação obrigatória, teste
98
- exigido). **Não grave sem aprovação.**
99
-
100
141
  ## Guardrails
101
142
 
102
143
  - **Nunca** corrigir antes do teste de regressão falhar pelo motivo do bug.
@@ -30,3 +30,8 @@ O que mudou e por que é a correção mínima.
30
30
  ## Riscos remanescentes
31
31
 
32
32
  Pontos relacionados que não foram alterados e merecem atenção.
33
+
34
+ ## Prevenção
35
+
36
+ Decisão: nenhuma rule, ajuste de `.claude/rules/<arquivo>.md`, nova rule `.claude/rules/<arquivo>.md` ou outro
37
+ mecanismo (hook, lint, tipo). O motivo, citando a pergunta do Passo 5 que decidiu.