@jaimevalasek/aioson 1.23.3 → 1.28.0

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.
Files changed (46) hide show
  1. package/CHANGELOG.md +56 -0
  2. package/docs/en/4-agents/README.md +11 -8
  3. package/docs/en/4-agents/forge-run.md +165 -0
  4. package/docs/en/5-reference/README.md +1 -0
  5. package/docs/en/5-reference/cli-reference.md +199 -85
  6. package/docs/en/5-reference/executable-verification.md +165 -0
  7. package/docs/pt/4-agentes/README.md +2 -1
  8. package/docs/pt/4-agentes/forge-run.md +150 -0
  9. package/docs/pt/4-agentes/pm.md +8 -0
  10. package/docs/pt/4-agentes/qa.md +2 -0
  11. package/docs/pt/4-agentes/scope-check.md +19 -1
  12. package/docs/pt/4-agentes/sheldon.md +2 -0
  13. package/docs/pt/4-agentes/validator.md +20 -0
  14. package/docs/pt/5-referencia/autopilot-handoff.md +33 -0
  15. package/docs/pt/5-referencia/comandos-cli.md +64 -9
  16. package/docs/pt/5-referencia/fluxo-artefatos.md +40 -15
  17. package/docs/pt/5-referencia/loop-guardrails.md +19 -0
  18. package/docs/pt/5-referencia/sdd-automation-scripts.md +130 -26
  19. package/package.json +1 -1
  20. package/src/cli.js +70 -54
  21. package/src/commands/forge-compile.js +330 -0
  22. package/src/commands/harness-check.js +159 -0
  23. package/src/commands/harness.js +37 -2
  24. package/src/commands/spec-analyze.js +324 -0
  25. package/src/constants.js +118 -108
  26. package/src/harness/contract-schema.js +8 -0
  27. package/src/harness/plan-waves.js +77 -0
  28. package/src/harness/review-payload.js +230 -0
  29. package/src/i18n/messages/en.js +21 -15
  30. package/src/i18n/messages/es.js +15 -13
  31. package/src/i18n/messages/fr.js +15 -13
  32. package/src/i18n/messages/pt-BR.js +21 -15
  33. package/src/parser.js +3 -1
  34. package/template/.aioson/agents/dev.md +67 -66
  35. package/template/.aioson/agents/forge-run.md +57 -0
  36. package/template/.aioson/agents/pm.md +51 -45
  37. package/template/.aioson/agents/qa.md +22 -22
  38. package/template/.aioson/agents/scope-check.md +49 -46
  39. package/template/.aioson/agents/sheldon.md +1 -1
  40. package/template/.aioson/agents/validator.md +16 -5
  41. package/template/.aioson/docs/autopilot-handoff.md +34 -32
  42. package/template/.aioson/docs/sheldon/harness-contract.md +19 -2
  43. package/template/.claude/commands/aioson/agent/forge-run.md +17 -0
  44. package/template/AGENTS.md +15 -13
  45. package/template/CLAUDE.md +10 -9
  46. package/template/OPENCODE.md +24 -23
@@ -0,0 +1,165 @@
1
+ # Executable verification — AIOSON (EN)
2
+
3
+ > **What this is:** the reference for AIOSON's "executable verification" theme (versions 1.24.0–1.28.0).
4
+ > **Reading time:** 8 min.
5
+ > **What you will learn:**
6
+ > - How AIOSON turns binary success criteria into deterministic, runnable checks
7
+ > - The five phases: `verification` + `harness:check`, the fresh-context validator, `spec:analyze`, Wave markers, and Lane B (`forge:compile` + `@forge-run`)
8
+
9
+ ---
10
+
11
+ ## The idea in one paragraph
12
+
13
+ AIOSON already has two strong foundations: the **`harness-contract.json`** (binary success criteria per feature) and the **SDD artifact chain** (PRD → spec → plan → conformance). The executable-verification theme builds on both to make verification **deterministic** (run a command, read an exit code) and to make specs **compilable** (turn a ready spec into an auditable workflow). Everything is **additive**: the default lane — `@scope-check` → `@dev` → `@qa` → `@validator` — is **unchanged**. The new pieces tighten the verification surface without rerouting existing flows.
14
+
15
+ The theme ships in five phases.
16
+
17
+ ---
18
+
19
+ ## Phase 1 (v1.24.0) — `harness:check` + the `verification` field
20
+
21
+ A `harness-contract.json` criterion can now carry an authored **`verification`** field: a shell command that proves the criterion mechanically. `@sheldon` authors it for every mechanically-checkable `binary: true` criterion — preferring the project's own test runner, deterministic, cross-platform, with **exit 0 = pass**. Legacy contracts without `verification` stay valid; `validateContract` only emits an advisory **warning** (never an error) for `binary: true` criteria that lack it.
22
+
23
+ The new command runs those commands deterministically:
24
+
25
+ ```bash
26
+ # Run every verifiable criterion of the active contract (auto-discovered)
27
+ aioson harness:check . --slug=checkout
28
+
29
+ # Run only a subset of criteria
30
+ aioson harness:check . --slug=checkout --criteria=C1,C3
31
+
32
+ # Custom timeout and JSON output (exit 0 = pass)
33
+ aioson harness:check . --slug=checkout --timeout=120000 --json
34
+ ```
35
+
36
+ `harness:check` runs **outside** the self:loop and is **read-only** over `progress.json` — it never mutates circuit-breaker state. It reuses the loop's `runCriteria`/`executeInSandbox` machinery, so it inherits timeouts, process-tree kill, credential redaction, and failure signatures. It persists `last-check-output.json` and emits `criteria_check_failed` telemetry on failure. With `--slug` omitted, it auto-discovers the active contract; `--criteria` runs a subset.
37
+
38
+ **Validator impact:** `@validator` now runs `harness:check` **first** and copies the exit-code verdicts **verbatim** into `results[].passed`. It only LLM-judges the criteria that have no `verification`. The output schema is unchanged.
39
+
40
+ See [`harness:check`](./cli-reference.md#harnesscheck) in the CLI reference.
41
+
42
+ ---
43
+
44
+ ## Phase 2 (v1.25.0) — Fresh-context validator (review payload)
45
+
46
+ `harness:validate` now appends a self-contained **review payload** to the generated `validator-prompt.txt`, so the validator can judge without access to the implementing session:
47
+
48
+ - (a) the `harness:check` results,
49
+ - (b) the changed-file list (untracked files included; `.aioson/**` framework state filtered out),
50
+ - (c) a unified diff against a resolved base.
51
+
52
+ ```bash
53
+ # Generate the validator prompt with review payload
54
+ aioson harness:validate . --slug=checkout
55
+
56
+ # Resolve the diff against an explicit base
57
+ aioson harness:validate . --slug=checkout --base=main
58
+
59
+ # Skip the diff (results + changed files still included)
60
+ aioson harness:validate . --slug=checkout --no-diff
61
+
62
+ # Cap the embedded diff size
63
+ aioson harness:validate . --slug=checkout --max-diff-bytes=200000
64
+ ```
65
+
66
+ The base is resolved in this order: `--base` > `baseline.json` head > merge-base with `main`/`master` > `HEAD`. `--max-diff-bytes` defaults to `200000` and truncates on a line boundary; `--no-diff` is a pure boolean flag that skips the diff. The payload degrades gracefully outside a git repo. The work lives in a new module, `src/harness/review-payload.js`.
67
+
68
+ **Protocol:** `@validator` runs in a **fresh, isolated context** — a subagent (Task tool) or a separate session — **never inline** in the implementing session, because implementation history biases the verdict. The flow is:
69
+
70
+ ```text
71
+ harness:check → harness:validate → isolated subagent run → harness:validate (consume verdict)
72
+ ```
73
+
74
+ The final `harness:validate` re-run consumes the verdict back through the circuit breaker.
75
+
76
+ See [`harness:validate`](./cli-reference.md#harnessvalidate) in the CLI reference.
77
+
78
+ ---
79
+
80
+ ## Phase 3 (v1.26.0) — `spec:analyze` cross-artifact consistency
81
+
82
+ `spec:analyze` is the **content** sibling of `artifact:validate`. Where `artifact:validate` checks chain **presence** (unchanged), `spec:analyze` checks **consistency of content** across the feature's artifacts before the execution gate:
83
+
84
+ ```bash
85
+ # Analyze cross-artifact consistency
86
+ aioson spec:analyze . --feature=checkout
87
+
88
+ # JSON output for gate scripting (errors → exit 1)
89
+ aioson spec:analyze . --feature=checkout --json
90
+ ```
91
+
92
+ It runs five deterministic checks:
93
+
94
+ 1. **REQ/AC ID traceability** — declared-but-unreferenced = coverage-gap warning; referenced-but-undeclared = orphan/drift warning (noise-guarded for prose plans).
95
+ 2. **Staleness** — an upstream artifact modified after a downstream one = warning (60s tolerance; the project-global `architecture.md` is excluded).
96
+ 3. **Readiness** — `blocked` = error; `ready_with_warnings` = info.
97
+ 4. **Harness-contract sanity** — schema errors = error; executable-coverage = info.
98
+ 5. **AC→contract linkage** = info.
99
+
100
+ An `error` flips `ok: false` (exit 1 in `--json`). Results persist to `spec-analyze-{slug}.json`. `@scope-check` runs `spec:analyze` in preflight: **errors are blockers, warnings are pre-computed drift evidence**.
101
+
102
+ See [`spec:analyze`](./cli-reference.md#specanalyze) in the CLI reference.
103
+
104
+ ---
105
+
106
+ ## Phase 4 (v1.27.0) — Wave parallelism markers
107
+
108
+ `@pm`'s Execution Sequence table gains a **`Wave`** column. Same-wave phases are **file-disjoint and dependency-free**, so they can run in parallel (via isolated subagents or worktrees). Waves run in ascending order, and marking is **conservative**: when in doubt, sequential.
109
+
110
+ `spec:analyze` gains the **`wave_file_overlap`** check: same-wave phases that share Primary files raise a warning. Plans without a `Wave` column skip the check entirely.
111
+
112
+ The Wave column is what Phase 5 compiles into `parallel()` blocks.
113
+
114
+ ---
115
+
116
+ ## Phase 5 (v1.28.0) — Lane B: `forge:compile` + `@forge-run`
117
+
118
+ Lane B is an **opt-in, additive** second lane: it compiles a MEDIUM feature's artifacts into a single auditable, versionable workflow and runs the whole verification cycle end to end. The default lane stays the recommended path.
119
+
120
+ ```bash
121
+ # Compile the feature into a forge-run.workflow.js
122
+ aioson forge:compile . --feature=checkout
123
+
124
+ # JSON output (hard preflights may refuse)
125
+ aioson forge:compile . --feature=checkout --json
126
+ ```
127
+
128
+ `forge:compile` produces `.aioson/plans/{slug}/forge-run.workflow.js` — a Claude Code dynamic-workflow script committed alongside the spec. Its structure mirrors the whole theme:
129
+
130
+ - one **`parallel()` per Wave** (file-disjoint dev agents; blocked-wave early stop),
131
+ - a deterministic **`harness:check` convergence loop** bounded by the governor's `error_streak_limit` (sequential fixes — only waves prove disjointness) plus a token-budget guard,
132
+ - a **3-lens adversarial review** (correctness / completeness / regression-risk; majority survives; refute-by-default) for binary criteria **without** `verification`,
133
+ - a **fresh-context validator** stage closing through `harness:validate` → `last-validator-output.json` → `apply-validation`.
134
+
135
+ **Hard preflights** refuse compilation and name the owning agent: invalid/missing contract, zero executable criteria, plan without a `Wave` column, `spec:analyze` errors, and `wave_file_overlap` (a warning in `spec:analyze`, an **error** here). The generated code is deterministic by construction: pure-literal metadata, plain JS, no `Date.now`/`Math.random`/`new Date`, artifact text via `JSON.stringify` (injection-safe). It **never** runs `feature:close`. New module: `src/harness/plan-waves.js`.
136
+
137
+ The opt-in entry point is the **`@forge-run`** agent: compile → review with the user (cost warning) → execute via the workflow runtime (never hand-emulated) → report. One feature per run. **PASS** recommends the human run `feature:close`; **FAIL** routes to `@dev` via the normal lane. It never auto-runs `feature:close`/publish.
138
+
139
+ See [`forge:compile`](./cli-reference.md#forgecompile) in the CLI reference and the [@forge-run agent card](../4-agents/forge-run.md).
140
+
141
+ ---
142
+
143
+ ## How the phases fit together
144
+
145
+ ```text
146
+ @sheldon authors verification ──► harness:check (deterministic, exit 0 = pass) [Phase 1]
147
+
148
+ @scope-check runs spec:analyze ◄────────┤ (errors block, warnings = drift) [Phase 3]
149
+ @pm fills the Wave column ──────────────┤ (parallelizable, file-disjoint) [Phase 4]
150
+
151
+ default lane: @dev ► @qa ► harness:validate (review payload) [Phase 2]
152
+ └► @validator in a FRESH, ISOLATED context
153
+
154
+ Lane B (opt-in): @forge-run ► forge:compile ► run the compiled workflow [Phase 5]
155
+ ```
156
+
157
+ The default lane and Lane B consume the **same** contract, plan, and `spec:analyze` results — Lane B just compiles them into one executable script.
158
+
159
+ ---
160
+
161
+ ## See also
162
+
163
+ - [CLI reference](./cli-reference.md) — `harness:check`, `harness:validate`, `spec:analyze`, `forge:compile`
164
+ - [@forge-run agent card](../4-agents/forge-run.md) — the opt-in Lane B entry point
165
+ - [Agents index](../4-agents/README.md) — `@sheldon`, `@pm`, `@scope-check`, `@validator`
@@ -1,6 +1,6 @@
1
1
  # Guia de Agentes AIOSON
2
2
 
3
- > Índice com 29 agentes e 1 alias, com situação de uso e saída esperada.
3
+ > Índice com 30 agentes e 1 alias, com situação de uso e saída esperada.
4
4
  > Cada agente tem sua ficha — clique no nome para detalhes.
5
5
  > `@pair` é alias de `@deyvin` e não possui ficha separada.
6
6
 
@@ -20,6 +20,7 @@
20
20
  | [@dev](./dev.md) | Implementa a feature | Após planning completo | código + `dev-state.md` |
21
21
  | [@qa](./qa.md) | Testa, valida ACs, ciclo autônomo com `@dev` | Após `@dev` | `test-plan.md`, `qa-report-*.md` |
22
22
  | [@validator](./validator.md) | Gate final: valida contrato binário de sucesso | Após `@qa`, antes de fechar feature | veredicto em `last-handoff.json` |
23
+ | [@forge-run](./forge-run.md) | Lane B opt-in: compila e roda o workflow de verificação executável de uma feature MEDIUM | MEDIUM com contrato `verification` + plano com Wave | `forge-run.workflow.js` |
23
24
  | [@tester](./tester.md) | Engenharia de testes para apps já existentes | Legacy/brownfield ou lacunas graves | `test-inventory.md` |
24
25
  | [@pentester](./pentester.md) | Revisão adversarial de segurança | Antes de publicar ou por demanda | `security-findings-*.json` |
25
26
 
@@ -0,0 +1,150 @@
1
+ # @forge-run — Compile e execute o workflow da Lane B (verificação executável)
2
+
3
+ > **Para quem é:** quem tem uma feature MEDIUM com contrato binário e plano por waves, e quer rodar todo o ciclo de execução verificável em um único workflow compilado.
4
+ > **Tempo de leitura:** 4 min.
5
+ > **O que você vai sair sabendo:**
6
+ > - O que é a Lane B e por que ela é **opt-in** e **aditiva**
7
+ > - O protocolo: `forge:compile` → revisão com você → execução → relatório
8
+ > - Por que `@forge-run` nunca enfraquece uma verificação nem fecha a feature
9
+
10
+ ---
11
+
12
+ ## Para que serve
13
+
14
+ A lane padrão de verificação executável (`@scope-check` → `@dev` → `@qa` → `@validator`) continua **inalterada** e é o caminho recomendado. O `@forge-run` é uma **segunda lane (Lane B), opcional e aditiva**: ele compila os artefatos de uma feature MEDIUM num único **workflow versionável** e roda o ciclo inteiro de verificação determinística de ponta a ponta.
15
+
16
+ Em vez de avançar etapa a etapa manualmente, `@forge-run` gera `.aioson/plans/{slug}/forge-run.workflow.js` — um script de dynamic workflow do Claude Code — e o executa via runtime de workflows. A estrutura compilada reflete o roadmap de verificação executável:
17
+
18
+ - **`parallel()` por Wave** — fases na mesma wave são disjuntas em arquivos e rodam em paralelo (ver coluna `Wave` do [@pm](./pm.md)).
19
+ - **Loop determinístico sobre `harness:check`** — limitado pelo `error_streak_limit` do governor; fixes são sequenciais.
20
+ - **Revisão adversarial de 3 lentes** — para os critérios que não têm `verification` (e portanto não podem ser checados mecanicamente).
21
+ - **Validador em contexto fresco** — fecha pelo ciclo `apply-validation` (ver [@validator](./validator.md)).
22
+
23
+ **Regra dura:** uma feature por run. `@forge-run` nunca roda `feature:close` nem publica.
24
+
25
+ ---
26
+
27
+ ## Quando invocar
28
+
29
+ - Feature **MEDIUM** com `harness-contract.json` contendo `verification` por critério (autorado pelo [@sheldon](./sheldon.md)).
30
+ - Plano de implementação com a coluna `Wave` preenchida (produzido pelo [@pm](./pm.md)).
31
+ - `aioson spec:analyze` limpo (sem `errors`) — pré-condição do gate de execução.
32
+ - Quando você quer rodar todo o ciclo de verificação executável como um único workflow reproduzível e versionável.
33
+
34
+ ---
35
+
36
+ ## Quando NÃO invocar
37
+
38
+ - Features MICRO ou SMALL → use a lane padrão (`@dev` → `@qa` → `@validator`).
39
+ - Contrato sem critérios executáveis, ou plano sem Wave → os preflights duros recusam compilar.
40
+ - `spec:analyze` com `errors` ou `wave_file_overlap` → resolva antes; a Lane B não compila por cima de drift.
41
+ - Você quer apenas validar, não executar → use `@validator` diretamente.
42
+
43
+ ---
44
+
45
+ ## Inputs obrigatórios
46
+
47
+ A Lane B só compila quando todos os pré-requisitos estão presentes — caso contrário os preflights duros recusam:
48
+
49
+ - `.aioson/plans/{slug}/harness-contract.json` — contrato **válido**, com pelo menos um critério executável (`verification` presente).
50
+ - `implementation-plan-{slug}.md` — plano com a coluna `Wave` preenchida.
51
+ - `spec-analyze-{slug}.json` sem `errors` e sem `wave_file_overlap`.
52
+
53
+ ---
54
+
55
+ ## Diálogo típico
56
+
57
+ ```
58
+ Você > @forge-run
59
+
60
+ @forge-run > Feature: checkout-stripe (MEDIUM)
61
+
62
+ Preflight da Lane B:
63
+ - harness-contract.json válido ✓
64
+ - 5 critérios, 4 com verification (executáveis) ✓
65
+ - implementation-plan com coluna Wave ✓
66
+ - spec:analyze → ok, sem errors, sem wave_file_overlap ✓
67
+
68
+ $ aioson forge:compile . --feature=checkout-stripe
69
+ Compilado: .aioson/plans/checkout-stripe/forge-run.workflow.js
70
+
71
+ Estrutura do workflow:
72
+ - Wave 1 (parallel): backend + migrations
73
+ - Wave 2: frontend
74
+ - Loop harness:check (limite error_streak: 3, fixes sequenciais)
75
+ - Revisão adversarial de 3 lentes para C5 (sem verification)
76
+ - Validador fresh-context → apply-validation
77
+
78
+ ⚠ Custo: este workflow roda múltiplas execuções de LLM.
79
+ Revise o script antes de executar. Aprovar execução? (s/n)
80
+
81
+ Você > s
82
+
83
+ @forge-run > Executando via runtime de workflows...
84
+ Wave 1 ✓ Wave 2 ✓
85
+ harness:check → 4/4 critérios executáveis PASS
86
+ Revisão adversarial C5 → PASS
87
+ Validador fresh-context → overall_score: 1
88
+
89
+ RESULTADO: PASS
90
+ Recomendação: rode `aioson feature:close` manualmente.
91
+ ```
92
+
93
+ ---
94
+
95
+ ## Saídas em disco
96
+
97
+ | Arquivo | Conteúdo |
98
+ |---|---|
99
+ | `.aioson/plans/{slug}/forge-run.workflow.js` | Workflow compilado e versionável (dynamic workflow do Claude Code) |
100
+ | `.aioson/plans/{slug}/last-check-output.json` | Último resultado do `harness:check` consumido pelo loop |
101
+ | `.aioson/plans/{slug}/last-validator-output.json` | Veredicto do validador fresh-context |
102
+ | `.aioson/plans/{slug}/progress.json` | Estado pós-execução (`circuit_state`, `ready_for_done_gate`) |
103
+
104
+ O código gerado é determinístico por construção: metadados literais, sem `Date.now`/`Math.random`, texto sempre via `JSON.stringify`, e **nunca** invoca `feature:close`.
105
+
106
+ ---
107
+
108
+ ## Como ele lê seu projeto
109
+
110
+ - `.aioson/plans/{slug}/harness-contract.json` — contrato e critérios com `verification`
111
+ - `.aioson/context/implementation-plan-{slug}.md` — plano com coluna `Wave`
112
+ - `.aioson/plans/{slug}/spec-analyze-{slug}.json` — consistência cross-artefato (gate de execução)
113
+ - `.aioson/plans/{slug}/progress.json` — estado e `error_streak_limit` do governor
114
+
115
+ ---
116
+
117
+ ## Comandos CLI relacionados
118
+
119
+ ```bash
120
+ # Compila os artefatos da feature no workflow da Lane B
121
+ aioson forge:compile . --feature={slug}
122
+
123
+ # (saída parseável)
124
+ aioson forge:compile . --feature={slug} --json
125
+ ```
126
+
127
+ ---
128
+
129
+ ## Regras duras
130
+
131
+ - **Nunca** passa por cima de um preflight que falhou (contrato inválido, zero critério executável, plano sem Wave, `errors` ou `wave_file_overlap` do `spec:analyze`).
132
+ - **Nunca** enfraquece ou remove uma checagem de `verification` para fazer um critério passar.
133
+ - **Nunca** roda `feature:close` nem publica — isso é sempre decisão humana.
134
+ - Uma feature por run.
135
+
136
+ ---
137
+
138
+ ## Handoff típico
139
+
140
+ - **Vem de:** entrada opt-in pelo usuário (Lane B); pressupõe `@sheldon`, `@pm` e `@scope-check`/`spec:analyze` já concluídos.
141
+ - **PASS:** recomenda que o **humano** rode `aioson feature:close` manualmente.
142
+ - **FAIL:** volta ao `@dev` pela **lane normal** para corrigir e re-verificar.
143
+
144
+ ---
145
+
146
+ ## Próximo passo
147
+
148
+ - [Ficha do @pm](./pm.md) — produz a coluna `Wave` que vira `parallel()` no workflow
149
+ - [Ficha do @sheldon](./sheldon.md) — autora o campo `verification` por critério
150
+ - [Ficha do @validator](./validator.md) — o validador fresh-context que fecha o ciclo
@@ -35,6 +35,14 @@ Para o projeto completo (configuração inicial), `@pm` entra após `@ux-ui` e a
35
35
 
36
36
  ---
37
37
 
38
+ ## Coluna `Wave` na Execution Sequence (v1.27.0+)
39
+
40
+ A tabela **Execution Sequence** do `implementation-plan-{slug}.md` ganhou a coluna `Wave`. Fases marcadas na **mesma wave** são **disjuntas em arquivos** (não tocam nos mesmos arquivos) e, portanto, **paralelizáveis** — é exatamente essa marcação que a Lane B do [@forge-run](./forge-run.md) compila em blocos `parallel()`.
41
+
42
+ A marcação é **conservadora**: na dúvida, o `@pm` deixa sequencial. Só agrupa na mesma wave quando tem certeza de que não há sobreposição de arquivos.
43
+
44
+ O `aioson spec:analyze` verifica a consistência das waves: mesma wave com arquivos sobrepostos dispara o warning `wave_file_overlap`, que o [@scope-check](./scope-check.md) trata como drift pré-computado.
45
+
38
46
  ## Quando invocar
39
47
 
40
48
  - Features MEDIUM (obrigatório no workflow — produz Gate C).
@@ -115,6 +115,8 @@ aioson dossier:show . --slug=checkout-stripe
115
115
  - **Vem de:** `@dev`
116
116
  - **Vai para:** `@validator` (quando há harness-contract) ou encerramento da feature
117
117
 
118
+ > Desde a v1.24.0, o `@validator` roda `aioson harness:check` **primeiro** (verificação determinística, exit 0 = pass) e julga por LLM só os critérios sem `verification`. Ele é ativado a partir do `validator-prompt.txt` autocontido (critérios + resultados do check + diff vs. base) em **contexto fresco e isolado** — não na sessão que implementou. Ver [Ficha do @validator](./validator.md).
119
+
118
120
  ---
119
121
 
120
122
  ## Próximo passo
@@ -11,9 +11,26 @@ Ele evita drift de escopo: antes de codar, confere se tudo que foi decidido est
11
11
  - Após `@dev` e/ou correções de `@qa`/`@tester`/`@pentester`, quando houve mudança material de código ou comportamento.
12
12
  - Em reaberturas de feature com risco de quebra de contrato entre o que foi planejado e o que está sendo entregue.
13
13
 
14
+ ## Preflight determinístico: `spec:analyze` (v1.26.0+)
15
+
16
+ No modo `pre-dev`, antes de julgar, o `@scope-check` roda `aioson spec:analyze . --feature={slug}` — uma checagem **determinística** de consistência entre artefatos, executada **antes do gate de execução**. Ela cobre:
17
+
18
+ - rastreabilidade REQ/AC (gaps e órfãos);
19
+ - staleness (upstream modificado depois do downstream);
20
+ - readiness `blocked` (vira `error`);
21
+ - sanidade do contrato e vínculo AC→contrato;
22
+ - `wave_file_overlap` (mesma wave + arquivos sobrepostos — ver coluna `Wave` do [@pm](./pm.md)).
23
+
24
+ Interpretação:
25
+
26
+ - **`errors` são blockers** — `spec:analyze` retorna `ok:false` e o `@scope-check` não libera para `@dev`.
27
+ - **`warnings` são evidência de drift pré-computada** — entram no relatório como divergências a confirmar, sem necessariamente bloquear.
28
+
29
+ O resultado é persistido em `spec-analyze-{slug}.json`.
30
+
14
31
  ## Modos
15
32
 
16
- - `pre-dev` (padrão): valida intenção e plano antes da primeira implementação.
33
+ - `pre-dev` (padrão): valida intenção e plano antes da primeira implementação (roda `spec:analyze`).
17
34
  - `post-dev` (opcional): valida se o diff entregue bate com o plano aprovado.
18
35
  - `post-fix` (opcional): valida se correções mantiveram o escopo e contrato.
19
36
  - `final` (opcional): reconcilia intenção, plano e resultado de fechamento.
@@ -34,6 +51,7 @@ Cria/atualiza:
34
51
 
35
52
  - `.aioson/context/scope-check.md` (modo projeto)
36
53
  - `.aioson/context/scope-check-{slug}.md` (modo feature)
54
+ - `.aioson/plans/{slug}/spec-analyze-{slug}.json` (resultado do `spec:analyze` no `pre-dev`)
37
55
 
38
56
  O relatório deve indicar:
39
57
 
@@ -69,6 +69,8 @@ O `@sheldon` decide entre **enriquecer in-place** ou **criar plano faseado** dep
69
69
 
70
70
  **Re-entrante:** se `sheldon-enrichment.md` já existir, o `@sheldon` detecta e oferece nova rodada sem refazer do zero. Você pode invocá-lo 2, 3, N vezes — cada rodada fecha mais gaps.
71
71
 
72
+ **Campo `verification` no contrato (v1.24.0+):** ao gerar o `harness-contract.json`, o `@sheldon` agora autora um comando de shell `verification` para **todo critério `binary:true` mecanicamente verificável** (exit 0 = pass). Ele prefere o test runner do próprio projeto, mira em comandos determinísticos e cross-platform. Com isso, `aioson harness:check` consegue verificar o critério de forma determinística, fora do `self:loop`, e o `@validator` copia o exit code verbatim no veredicto. Contratos legados sem o campo continuam válidos (o `@validator` cai no julgamento por LLM para esses critérios).
73
+
72
74
  ## Como ele lê seu projeto
73
75
 
74
76
  1. `.aioson/context/project.context.md` — stack e classificação.
@@ -86,6 +86,26 @@ Apenas e exclusivamente:
86
86
 
87
87
  ---
88
88
 
89
+ ## Ativação em contexto fresco (v1.24.0+)
90
+
91
+ A ativação preferida do `@validator` é o **`validator-prompt.txt` autocontido** gerado por `aioson harness:validate`. Esse prompt embute um REVIEW PAYLOAD com tudo que ele precisa para julgar sem depender de chat anterior:
92
+
93
+ - os critérios do `harness-contract.json`;
94
+ - os **resultados do `harness:check`** (verificação determinística, exit 0 = pass);
95
+ - a lista de arquivos alterados e o **diff unificado vs. base resolvida** (`--base` > `baseline.json` > merge-base `main`/`master` > `HEAD`; default `--max-diff-bytes` 200KB; `--no-diff` omite). Fora de git, degrada graciosamente.
96
+
97
+ Por isso o `@validator` roda em **contexto fresco e isolado** — subagente (Task tool) ou sessão separada, nunca inline na sessão que implementou. O histórico de implementação enviesa o veredicto.
98
+
99
+ **Ordem de operações:**
100
+
101
+ 1. Roda `harness:check` **primeiro** e copia o exit code **verbatim** em `results[].passed` — não re-julga o que a máquina já decidiu.
102
+ 2. Só usa julgamento por LLM nos critérios **sem** `verification` (não verificáveis mecanicamente).
103
+ 3. O schema de saída permanece inalterado (`overall_score: 1 | 0`).
104
+
105
+ Fluxo completo: `harness:check` → `harness:validate` → execução isolada → re-rodar `harness:validate` para o output ser consumido pelo circuit breaker (`apply-validation`).
106
+
107
+ ---
108
+
89
109
  ## Handoff típico
90
110
 
91
111
  - **Vem de:** `@qa` (recomenda `@validator` no relatório quando `harness-contract.json` existe).
@@ -57,6 +57,25 @@ Uma vez que o `@dev` inicial termina, o autopilot retoma automaticamente:
57
57
 
58
58
  `@tester` e `@pentester` só executam quando os seus triggers disparam (`@qa` identifica gaps de cobertura → `@tester`; superfície sensível auth/secrets/data → `@pentester`).
59
59
 
60
+ ### Protocolo de contexto fresco do @validator
61
+
62
+ O `@validator` roda em contexto **fresco e isolado** (subagente/Task tool ou sessão separada), nunca inline na sessão que implementou — o histórico de implementação enviesa o veredito. Quando o autopilot roteia para `@validator`, a sequência é:
63
+
64
+ ```
65
+ harness:check → roda os criteria[].verification deterministicamente (exit code = veredito)
66
+
67
+ harness:validate → gera validator-prompt.txt com REVIEW PAYLOAD autocontido:
68
+ (a) resultados do harness:check
69
+ (b) lista de arquivos alterados (untracked incluídos, .aioson/** filtrado)
70
+ (c) diff unificado vs base resolvida (--base > baseline.json > merge-base > HEAD)
71
+
72
+ execução isolada em subagente → @validator julga só os critérios sem verification, em contexto limpo
73
+
74
+ harness:validate (de novo) → consome o veredito pelo circuit breaker (waiting_validation/apply-validation)
75
+ ```
76
+
77
+ O review payload torna o prompt do validador **autocontido**: ele não precisa explorar o repositório. O diff tem teto de tamanho (`--max-diff-bytes`, default 200KB, truncamento em fronteira de linha); `--no-diff` omite o diff; fora de repo git, degrada graciosamente. A máquina de estados `waiting_validation`/`apply-validation` permanece inalterada.
78
+
60
79
  ---
61
80
 
62
81
  ## Condições de parada
@@ -124,6 +143,20 @@ Você > aioson feature:close . --feature=minha-feature
124
143
 
125
144
  ---
126
145
 
146
+ ## Lane B — execução compilada (alternativa opt-in)
147
+
148
+ Para features **MEDIUM**, existe uma lane de execução alternativa ao autopilot em tempo real: a **Lane B**, acionada pelo agente `@forge-run` (`/forge-run`). Em vez de encadear agentes vivos, o `@forge-run` **compila** os artefatos da feature num `.aioson/plans/{slug}/forge-run.workflow.js` (via `aioson forge:compile`) e o executa pelo runtime de workflows.
149
+
150
+ O workflow compilado embute o mesmo ciclo de revisão: um `parallel()` por Wave → convergência no `harness:check` → revisão adversarial de 3 lentes para critérios binários sem `verification` → validador fresh-context fechando por `harness:validate` → `apply-validation`. Como a lane normal, ele **nunca** roda `feature:close`/publish: PASS recomenda o humano rodar `feature:close`; FAIL volta ao `@dev` pela lane normal. Uma feature por run.
151
+
152
+ Quando preferir cada uma:
153
+ - **Autopilot (lane normal)** — handoffs determinísticos entre agentes vivos; padrão para SMALL e MEDIUM.
154
+ - **Lane B (`@forge-run`)** — execução compilada, reproduzível e versionável de uma feature MEDIUM; opt-in, com aviso de custo antes de rodar.
155
+
156
+ Veja [SDD Automation Scripts — forge:compile](./sdd-automation-scripts.md#forgecompile-lane-b).
157
+
158
+ ---
159
+
127
160
  ## Próximos passos
128
161
 
129
162
  - [SDD Framework](./sdd-framework.md) — sequência completa MICRO/SMALL/MEDIUM
@@ -225,6 +225,8 @@ Scripts determinísticos que movem verificações de estado, validação de arte
225
225
  | `feature:export` | **Copia** todos os artefatos de uma feature para um `--out` limpo, sem mexer na origem; gera `INDEX.md` | Exportar specs para analisar fora, entregar a cliente, ou usar o AIOSON só como gerador de specs. Veja [feature-export.md](./feature-export.md) |
226
226
  | `gate:check` | Valida pré-requisitos e artefatos de um phase gate (A/B/C/D); retorna PASS ou BLOCKED | Antes de avançar para o próximo agente |
227
227
  | `artifact:validate` | Verifica a cadeia completa de artefatos de uma feature (PRD → spec → plano → conformance) | A qualquer momento para checar completude |
228
+ | `spec:analyze` | Irmão de **conteúdo** do `artifact:validate`: consistência cruzada entre os artefatos (rastreabilidade REQ/AC, staleness, readiness, sanidade do contrato, vínculo AC→contrato, overlap de waves) antes do gate de execução | No preflight do `@scope-check` — errors viram blockers, warnings viram evidência de drift |
229
+ | `forge:compile` | **Lane B:** compila os artefatos de uma feature MEDIUM num `forge-run.workflow.js` auditável e versionável (parallel por Wave → convergência no `harness:check` → revisão adversarial → validador fresh-context) | Quando quer execução compilada e reproduzível via `@forge-run`; nunca roda `feature:close`/publish |
228
230
  | `workflow:execute` | Monta e executa o plano de agentes baseado na classificação; aceita `--dry-run` e `--start-from` | Para orquestrar features sem o dashboard |
229
231
  | `runner:run` | Executa uma tarefa ou worker diretamente pelo runner | Quando quer executar fora do loop principal de sessão |
230
232
  | `runner:queue` | Enfileira tarefas no runner com prioridade e agente designado | Para execução assíncrona ou batch de tarefas |
@@ -304,6 +306,8 @@ Controle do loop autônomo `self:loop` com scope guard, budget enforcement, huma
304
306
 
305
307
  | Comando | O que faz | Quando usar |
306
308
  |---|---|---|
309
+ | `harness:check` | Roda os comandos `criteria[].verification` do contrato deterministicamente, **fora do self:loop** (read-only sobre `progress.json`); exit 0 = pass | Verificação determinística avulsa dos critérios; o `@validator` roda primeiro e copia o veredito verbatim |
310
+ | `harness:validate` | Gera o `validator-prompt.txt` com **review payload autocontido** (resultados do `harness:check` + arquivos alterados + diff vs base resolvida) e consome o veredito pelo circuit breaker | Antes de executar o `@validator` em contexto fresco e isolado |
307
311
  | `harness:approve` | Aprova um gate humano pendente no loop (persiste decisão auditável) | Quando o loop pausou em `HUMAN_GATE` e você quer retomá-lo |
308
312
  | `harness:reject` | Rejeita um gate humano (encerra a tentativa com resumo; requer `--reason`) | Quando quer cancelar a tentativa atual após revisão humana |
309
313
  | `harness:status` | Visão do estado do loop: circuito, iteração N/M, budget, checks, gates pendentes, próxima ação | Sempre que quiser saber o que o loop está fazendo ou por que parou |
@@ -1668,7 +1672,7 @@ Valida pré-requisitos e artefatos. Retorna PASS ou BLOCKED com lista de evidên
1668
1672
  aioson artifact:validate . --feature=checkout --json
1669
1673
  ```
1670
1674
 
1671
- Verifica toda a cadeia PRD → spec → plano → conformance e indica o próximo artefato faltante.
1675
+ Verifica toda a cadeia PRD → spec → plano → conformance e indica o próximo artefato faltante. Para checar a **consistência de conteúdo** entre os artefatos (não só a presença), veja `spec:analyze` no exemplo 58.
1672
1676
 
1673
1677
  ### 48. Atualizar pulse ao final da sessão
1674
1678
 
@@ -1723,14 +1727,14 @@ aioson workflow:execute . \
1723
1727
  --classification=SMALL \
1724
1728
  --dry-run
1725
1729
 
1726
- # Executar de verdade
1727
- aioson workflow:execute . --feature=checkout --tool=claude
1728
-
1729
- # Executar com política agentica persistida para o gateway
1730
- aioson workflow:execute . --feature=checkout --tool=codex --agentic --max-dev-qa-cycles=3
1731
-
1732
- # Retomar do dev (pular product e analyst)
1733
- aioson workflow:execute . \
1730
+ # Executar de verdade
1731
+ aioson workflow:execute . --feature=checkout --tool=claude
1732
+
1733
+ # Executar com política agentica persistida para o gateway
1734
+ aioson workflow:execute . --feature=checkout --tool=codex --agentic --max-dev-qa-cycles=3
1735
+
1736
+ # Retomar do dev (pular product e analyst)
1737
+ aioson workflow:execute . \
1734
1738
  --feature=checkout \
1735
1739
  --tool=claude \
1736
1740
  --start-from=dev
@@ -1878,6 +1882,57 @@ aioson harness:preview .aioson/context/retro/checkout.md
1878
1882
 
1879
1883
  ---
1880
1884
 
1885
+ ### 58. Verificar critérios deterministicamente com harness:check
1886
+
1887
+ Roda os comandos `criteria[].verification` do `harness-contract.json` **fora do self:loop**, de forma determinística. Read-only sobre `progress.json` — o estado do circuit breaker continua exclusivo de `harness:validate`/`apply-validation`.
1888
+
1889
+ ```bash
1890
+ # Rodar todos os critérios verificáveis do contrato ativo (auto-descoberto)
1891
+ aioson harness:check . --slug=checkout
1892
+
1893
+ # Rodar um subconjunto de critérios
1894
+ aioson harness:check . --slug=checkout --criteria=C1,C3
1895
+
1896
+ # Com timeout customizado e saída JSON (exit 0 = pass)
1897
+ aioson harness:check . --slug=checkout --timeout=120000 --json
1898
+ ```
1899
+
1900
+ Reusa o mesmo motor do loop (timeouts, kill de process-tree, redaction de credenciais, failure signatures). Persiste `last-check-output.json` e emite telemetria `criteria_check_failed`. O `verification` é campo autorado por critério — o `@sheldon` o escreve para todo critério `binary:true` mecanicamente verificável; contratos legados sem o campo continuam válidos (gera apenas WARNING advisory). O `@validator` roda `harness:check` **primeiro** e copia o veredito do exit code verbatim. Veja [Loop Guardrails](./loop-guardrails.md#harnesscheck--verificação-determinística-avulsa).
1901
+
1902
+ ---
1903
+
1904
+ ### 59. Validar consistência cruzada com spec:analyze
1905
+
1906
+ Irmão de **conteúdo** do `artifact:validate` (que checa só presença). Roda checagens determinísticas entre os artefatos da feature antes do gate de execução.
1907
+
1908
+ ```bash
1909
+ # Analisar a consistência cruzada dos artefatos da feature
1910
+ aioson spec:analyze . --feature=checkout
1911
+
1912
+ # Saída JSON para scripting de gate (errors → exit 1)
1913
+ aioson spec:analyze . --feature=checkout --json
1914
+ ```
1915
+
1916
+ Checagens: rastreabilidade REQ/AC (ids declarados nunca usados downstream = gap; ids usados sem declaração = órfão/drift), staleness (upstream modificado após downstream gerado), readiness (`blocked` = error, `ready_with_warnings` = info), sanidade do contrato e vínculo AC→contrato, mais `wave_file_overlap` (fases da mesma Wave com Primary files sobrepostos). Severidades: **error** vira `ok:false`/exit 1; **warning** = drift provável; **info** = dívida. Persiste `spec-analyze-{slug}.json` em `.aioson/context/`. O `@scope-check` roda no preflight: errors são blockers, warnings viram evidência de drift pré-computada.
1917
+
1918
+ ---
1919
+
1920
+ ### 60. Compilar a Lane B com forge:compile
1921
+
1922
+ Compila os artefatos de uma feature MEDIUM num script de dynamic workflow auditável e versionável, commitado junto da spec. Entrada opt-in via `@forge-run`.
1923
+
1924
+ ```bash
1925
+ # Compilar a feature num forge-run.workflow.js
1926
+ aioson forge:compile . --feature=checkout
1927
+
1928
+ # Saída JSON (preflights duros podem recusar a compilação)
1929
+ aioson forge:compile . --feature=checkout --json
1930
+ ```
1931
+
1932
+ Gera `.aioson/plans/{slug}/forge-run.workflow.js`: um `parallel()` por Wave (devs em arquivos disjuntos) → loop de convergência no `harness:check` (fixes sequenciais, limitado pelo `error_streak_limit` do governor + guarda de orçamento) → revisão adversarial de 3 lentes para critérios binários **sem** `verification` → estágio de validador fresh-context fechando pelo ciclo normal `harness:validate` → `apply-validation`. Preflights duros recusam compilar (contrato inválido/ausente, zero critério executável, plano sem coluna Wave, errors do `spec:analyze`, `wave_file_overlap`) e nomeiam o agente dono (`@sheldon`, `@pm`, `@discovery-design-doc`). O script gerado **nunca** roda `feature:close`/publish.
1933
+
1934
+ ---
1935
+
1881
1936
  ## Atalhos úteis
1882
1937
 
1883
1938
  ```bash