@fontdata/ai-harness 3.2.0 → 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.2.0",
3
+ "version": "3.2.1",
4
4
  "mcpServers": {
5
- "banco_dados": { "command": "npx", "args": ["-y", "@fontdata/ai-harness@3.2.0", "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.2.0",
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": {
@@ -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.
@@ -47,6 +47,8 @@ sabendo para que a task serve, o sub-agent decide melhor o que a lista de campos
47
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:
48
48
  - `suite_verde` com `--resultado ok` e `{"comando", "total", "falhas": 0}`;
49
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`).
50
52
  3. **Voltas:** no máximo 2 retornos ao implementador por task. Na terceira reprovação, a task vira bloqueio.
51
53
 
52
54
  ## Fechamento