@payconductor/houndsman 0.13.0 → 0.14.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 (106) hide show
  1. package/README.md +6 -1
  2. package/package.json +1 -1
  3. package/src/cli/commands/compare-command.ts +112 -0
  4. package/src/cli/commands/context-command.ts +1 -0
  5. package/src/cli/commands/findings-command.ts +11 -1
  6. package/src/cli/commands/hunt-command.ts +20 -3
  7. package/src/cli/commands/review-command.ts +38 -0
  8. package/src/cli/commands/status-command.ts +3 -2
  9. package/src/cli/help.ts +3 -1
  10. package/src/cli/index.ts +3 -1
  11. package/src/cli/progress.ts +7 -2
  12. package/src/core/ai/ai-client.ts +38 -2
  13. package/src/core/ai/features/brief-enricher.ts +1 -1
  14. package/src/core/ai/features/business-analyzer.ts +61 -0
  15. package/src/core/ai/features/business-summarizer.ts +44 -0
  16. package/src/core/ai/index.ts +8 -0
  17. package/src/core/ai/prompts/brief.ts +33 -7
  18. package/src/core/ai/prompts/business.ts +76 -0
  19. package/src/core/ai/provider-capabilities.ts +12 -0
  20. package/src/core/ai/schemas.ts +70 -2
  21. package/src/core/ai/usage-recorder.ts +53 -1
  22. package/src/core/brief.ts +246 -12
  23. package/src/core/builtins.ts +108 -0
  24. package/src/core/business-summary.ts +583 -0
  25. package/src/core/commands/compare.ts +233 -0
  26. package/src/core/commands/context.ts +6 -2
  27. package/src/core/commands/findings.ts +38 -30
  28. package/src/core/commands/review.ts +6 -0
  29. package/src/core/commands/scaffold.ts +27 -0
  30. package/src/core/commands/status.ts +9 -4
  31. package/src/core/compare.ts +243 -0
  32. package/src/core/concurrency.ts +30 -0
  33. package/src/core/config.ts +31 -3
  34. package/src/core/defaults.ts +50 -4
  35. package/src/core/domain/budget.ts +62 -4
  36. package/src/core/domain/classification.ts +12 -2
  37. package/src/core/engine/carryover.ts +4 -0
  38. package/src/core/engine/finalize-pipeline.ts +347 -0
  39. package/src/core/engine/prepare-pipeline.ts +1294 -0
  40. package/src/core/engine/review-context.ts +51 -0
  41. package/src/core/engine/review-options.ts +47 -0
  42. package/src/core/engine/review-scope.ts +14 -1
  43. package/src/core/engine/review-session.ts +11 -13
  44. package/src/core/engine/run-artifacts.ts +196 -0
  45. package/src/core/engine/run-format.ts +4 -0
  46. package/src/core/findings-state.ts +13 -1
  47. package/src/core/github-review.ts +5 -2
  48. package/src/core/hunt/hunt-runner.ts +90 -0
  49. package/src/core/hunt/index.ts +2 -0
  50. package/src/core/hunt/maki-intent-prompt.ts +50 -0
  51. package/src/core/hunt/maki-prompt.ts +13 -1
  52. package/src/core/hunt/pool.ts +4 -26
  53. package/src/core/logging/index.ts +6 -1
  54. package/src/core/logging/progress.ts +85 -1
  55. package/src/core/orchestrator.ts +33 -1289
  56. package/src/core/paths.ts +6 -3
  57. package/src/core/pr-context.ts +2 -4
  58. package/src/core/prepare-report.ts +61 -0
  59. package/src/core/project-config.ts +8 -1
  60. package/src/core/propagation.ts +127 -0
  61. package/src/core/registry-check.ts +60 -21
  62. package/src/core/renderers/manifest-writer.ts +13 -0
  63. package/src/core/renderers/resume-renderer.ts +151 -11
  64. package/src/core/report-builder.ts +108 -278
  65. package/src/core/storage/file/file-storage.ts +7 -3
  66. package/src/core/storage/sqlite/mappers.ts +10 -0
  67. package/src/core/storage/sqlite/schema.ts +104 -23
  68. package/src/core/storage/sqlite/sqlite-storage.ts +22 -9
  69. package/src/core/storage/types.ts +16 -4
  70. package/src/core/storage/work-area.ts +59 -1
  71. package/src/core/types.ts +31 -0
  72. package/src/core/watchdog-registry.ts +21 -3
  73. package/src/index.ts +29 -4
  74. package/src/server/client/ArtifactsPanel.tsx +4 -2
  75. package/src/server/client/FindingCard.tsx +21 -1
  76. package/src/server/client/RunsSection.tsx +5 -0
  77. package/src/server/client/utils/constants.ts +21 -11
  78. package/src/server/client/utils/markdown.ts +1 -1
  79. package/src/server/client/utils/types.ts +14 -2
  80. package/src/server/run-repository.ts +35 -14
  81. package/src/server/styles.css +2 -0
  82. package/src/skill/OUTPUT-FORMAT.md +36 -10
  83. package/src/skill/README.md +18 -14
  84. package/src/skill/SETUP.md +1 -0
  85. package/src/skill/SKILL.md +13 -4
  86. package/src/skill/example-resume.md +43 -0
  87. package/src/skill/hunt.md +145 -58
  88. package/src/tests/__snapshots__/baseline.test.ts.snap +187 -178
  89. package/src/tests/ai-core.test.ts +46 -0
  90. package/src/tests/ai-features.test.ts +95 -4
  91. package/src/tests/baseline.test.ts +29 -121
  92. package/src/tests/brief-scope.test.ts +250 -0
  93. package/src/tests/business-summary.test.ts +258 -0
  94. package/src/tests/compare.test.ts +233 -0
  95. package/src/tests/fixtures/fake-model-provider.ts +2 -1
  96. package/src/tests/hunt-maki.test.ts +58 -0
  97. package/src/tests/markdown.test.ts +3 -3
  98. package/src/tests/progress.test.ts +29 -1
  99. package/src/tests/propagation.test.ts +119 -0
  100. package/src/tests/review-resume.test.ts +60 -1
  101. package/src/tests/review-scope.test.ts +38 -29
  102. package/src/tests/review-scripts.test.ts +106 -218
  103. package/src/tests/server.test.ts +7 -4
  104. package/src/tests/storage.test.ts +194 -9
  105. package/src/core/renderers/report-renderer.ts +0 -66
  106. package/src/skill/example-review.md +0 -66
package/src/skill/hunt.md CHANGED
@@ -47,10 +47,11 @@ mudanças antes de push.
47
47
 
48
48
  | Passo | Comando | Quem roda | Resultado |
49
49
  |---|---|---|---|
50
- | 0. Contexto | `houndsman context` | subagente | `context.json` + `context-brief.md` → `context-summary.json` |
51
- | 1. Preparar | `houndsman` | skill | `classification.json` + `candidates.json` + `briefs/` + `manifest.json` |
52
- | 2. Revisar | *(subagentes)* | skill (via `runSubagent`) | `findings/<watchdog>.json` (um por watchdog) |
53
- | 3. Finalizar | `houndsman --finalize` | skill | `review.md` + triagem/status no storage |
50
+ | 0. Contexto | `houndsman --pr` (via `gh`) | prepare | `context.json` + `context-brief.md` → `context-summary.json` (IA; sem IA, subagente) |
51
+ | 1. Preparar | `houndsman` | skill | `classification.json` + `candidates.json` + `business-summary.json` + `briefs/` + `manifest.json` |
52
+ | 1.5. Intenção | *(subagente)* | skill, só sem IA | `business-summary.json` enriquecido (`source: "reviewer"`) |
53
+ | 2. Revisar | *(subagentes)* | skill (via `runSubagent`) | `findings/<watchdog>.json` (um por watchdog, incluindo `general`) |
54
+ | 3. Finalizar | `houndsman --finalize` | skill | `review-resume.md` + triagem/status no storage |
54
55
 
55
56
  > Por que comandos separados? Entre o passo 1 e o 3 acontece trabalho de LLM (os subagentes).
56
57
  > Depois do passo 3, a correção dos achados é a capability **`fix`** — ver `fix.md`.
@@ -76,10 +77,14 @@ mudanças antes de push.
76
77
 
77
78
  ---
78
79
 
79
- ## Passo 0 — Contexto da PR (subagente)
80
+ ## Passo 0 — Contexto da PR
80
81
 
81
82
  O contexto vem da **descrição da PR** via GitHub CLI (`gh`), quando disponível e logado.
82
- Um subagente executa o CLI e resume:
83
+
84
+ **Com IA ligada** (`HOUNDSMAN_DEEP_SEEK_API_KEY`), o próprio `houndsman --pr 456` coleta o
85
+ contexto e o resume (`AiContextSummarizer`) — **não despache subagente** para este passo.
86
+
87
+ Sem IA, um subagente executa o CLI e resume:
83
88
 
84
89
  ```
85
90
  Você é o subagente de contexto do houndsman. Execute `houndsman context --pr 456`
@@ -118,6 +123,8 @@ staging dos subagentes em `<HOUNDSMAN_HOME>/work/<reviewId>/`:
118
123
  | `ast-summary.json` | Fatos estruturais + delta por arquivo (AST TS/JS) (storage) |
119
124
  | `ast-impact.json` | Importadores reversos e exports públicos alterados (storage) |
120
125
  | `candidates.json` | Indícios da pré-análise Jev (regra + arquivo + confiança) (storage) |
126
+ | `business-summary.json` | Modelo de intenção (fluxos, invariantes, contratos, estados) (staging + storage) |
127
+ | `business-brief.md` | Brief do passo de intenção (staging + storage) |
121
128
  | `briefs/<watchdog>.md` | Instruções prontas para cada subagente (staging + storage, para auditoria) |
122
129
  | `manifest.json` | Resumo: watchdogs, arquivos, deletados, status, contexto, Jev, orçamento (storage) |
123
130
 
@@ -129,6 +136,11 @@ staging dos subagentes em `<HOUNDSMAN_HOME>/work/<reviewId>/`:
129
136
  > símbolos adicionados/removidos/alterados, assinaturas e imports; o impacto reverso
130
137
  > (quem importa os arquivos alterados) aparece como mapa de leitura. É fail-open:
131
138
  > sem grammar/ABI, a revisão segue só com regex. Desative com `--no-ast`.
139
+ >
140
+ > **Trechos do diff:** cada brief recebe o patch `-U0` do seu domínio, com o teto
141
+ > distribuído entre **todos** os arquivos (rateio igual + excedente por churn) — não há
142
+ > arquivo "sem diff" só porque outro era maior. Trecho cortado vem com o marcador
143
+ > `… [trecho truncado — abra o arquivo para o restante]`.
132
144
 
133
145
  **Excluídos automaticamente:** lock files, `dist/`, `build/`, `.env*`, imagens, source
134
146
  maps (padrões do projeto em `.houndsman/exclusions.ts`).
@@ -142,13 +154,22 @@ com **churn** (linhas adicionadas/removidas) por arquivo — o custo não cresce
142
154
  arquivos da PR. Cada brief recebe no máximo `budgets.maxFilesPerBrief` arquivos (default 40),
143
155
  **priorizados pelo maior churn**:
144
156
 
145
- - O excedente vai para a seção **Fora do orçamento (NÃO revisar)** do brief e o watchdog deve
146
- registrá-lo em `skipped` — a tabela de **Cobertura** mostra o que ficou de fora (nunca some
147
- silenciosamente).
157
+ - No **`general`**, acima de **40 arquivos** ou **2.000 linhas alteradas** o prepare aplica o
158
+ **recorte por fluxo**: até 15 arquivos (os citados pelos fluxos do modelo de intenção + os de
159
+ maior churn), com diff de até 2k por arquivo. O restante vai para **Fora do recorte** e deve
160
+ ser registrado em `skipped` (`fora do fluxo`). A tabela de cobertura do resumo mostra
161
+ `Revisados`, `Fora do recorte` e `Faltam` (sem declaração).
162
+ - O excedente do orçamento vai para a seção **Fora do recorte (NÃO revisar)** do brief e o
163
+ watchdog deve registrá-lo em `skipped` — a tabela de **Cobertura** mostra o que ficou de fora
164
+ (nunca some silenciosamente).
148
165
  - Isso mantém o contexto do subagente limitado mesmo num PR de 10k linhas com centenas de
149
166
  arquivos num único domínio.
150
167
  - Ajuste em `houndsman.config.ts`: `budgets: { maxFilesPerBrief: 60 }` e
151
168
  `concurrency: { jev: 8 }`. Valores não-positivos caem no default (o `doctor` avisa).
169
+ - **Prioridade por caminho (opcional):** `priorities: [{ pattern, bonus?, maxRiskFromChurn? }]`.
170
+ O risco é `min(churn, maxRiskFromChurn) + bonus`: `bonus` promove caminho crítico (`db` +300,
171
+ `services` +200) e o teto satura o superchurn de caminho de baixa criticidade (`client` com
172
+ 2.000 linhas reformatadas não passa de 120). A primeira regra que casar vence.
152
173
 
153
174
  ### Pré-análise Jev (Passo 1.5, opcional)
154
175
 
@@ -166,10 +187,10 @@ Cada `--finalize` grava o **commit revisado** (`reviewedSha` da review no storag
166
187
  seguinte, se o `HEAD` descende desse commit (sem rebase), o motor revisa **só o delta** — os
167
188
  arquivos alterados desde a última revisão — e **carrega** os findings dos arquivos inalterados
168
189
  (carry-over), sem re-revisá-los. O `manifest.json` traz o bloco `incremental` (`from`,
169
- `changedFiles`, `carried`) e o `review.md` abre com um aviso.
190
+ `changedFiles`, `carried`) e o `review-resume.md` abre com um aviso.
170
191
 
171
192
  - Sem mudanças desde a última revisão → **no-op**: o prepare não gera briefs nem reescreve
172
- artefatos (classification, manifest, review.md), e o `--finalize` também vira no-op — pare o
193
+ artefatos (classification, manifest, review-resume.md), e o `--finalize` também vira no-op — pare o
173
194
  fluxo aí (nenhum subagente é despachado).
174
195
  - Rebase/force-push (histórico reescrito) → cai automaticamente no **review completo**.
175
196
  - Forçar completo: `houndsman --full` (ou `--clean`, que também descarta a triagem anterior).
@@ -179,27 +200,101 @@ arquivos alterados desde a última revisão — e **carrega** os findings dos ar
179
200
 
180
201
  ---
181
202
 
203
+ ## Passo 1.5 — Intenção da PR (subagente, condicional)
204
+
205
+ O motor **sempre** grava `business-summary.json` (determinístico) e `business-brief.md`.
206
+ Quando a IA está configurada (`HOUNDSMAN_DEEP_SEEK_API_KEY`), o prepare já gravou o modelo
207
+ com `source: "ai"` e este passo é **pulado**.
208
+
209
+ > **Quando pular (operacional):** se o prepare imprimir "Intenção da PR reconstruída pela IA"
210
+ > ou `business-summary.json` tiver `source: "ai"`, não despache este subagente. Se a mensagem
211
+ > for "Intenção da PR determinística", despache.
212
+
213
+ Sem IA, despache **um** subagente antes dos watchdogs:
214
+
215
+ ```
216
+ Leia e execute o brief de intenção: <staging>/business-brief.md
217
+ Você é o passo de intenção do houndsman no {{projectName}}.
218
+ Use como raiz de leitura o **Worktree:** indicado. Grave o JSON em
219
+ `<staging>/business-summary.json` com `source: "reviewer"`.
220
+ Não produza achados.
221
+ ```
222
+
223
+ - O modelo descreve **o que a PR deve entregar** (fluxos, invariantes, contratos,
224
+ estados) — não a estrutura do código.
225
+ - Ele é lido por todos os briefs; o revisor `general` o reconstrói no primeiro passo da
226
+ revisão e pode refiná-lo.
227
+ - Falha do subagente mantém a versão determinística (fail-open).
228
+
229
+ > **Obrigatório:** a revisão de lógica (`general`) nunca é opcional. Se o Passo 1.5 não
230
+ > rodar, o `general` ainda reconstrói o modelo no próprio brief — a revisão degrada, mas
231
+ > não perde o eixo de lógica/domínio.
232
+
233
+ ---
234
+
182
235
  ## Passo 2 — Revisar (skill despacha os subagentes)
183
236
 
184
- Um subagente por brief. Despache em **ondas** (ex.: até 8 subagentes por bloco de tool
185
- calls) — evita estourar limites de taxa quando há muitos watchdogs. O prompt é o próprio brief:
237
+ Um subagente por brief. Despache **todos os briefs da onda no MESMO bloco de tool calls**
238
+ (paralelo real) — não espere um terminar para despachar o próximo. Só divida em ondas
239
+ menores se a plataforma recusar a concorrência.
240
+
241
+ > **Custo:** cada subagente é um agente completo. Despacho serial transforma 8 briefs em
242
+ > 8 × o tempo de um watchdog; o paralelo custa o do mais lento.
243
+
244
+ > **`general` é obrigatório.** O motor injeta esse watchdog reservado em todos os ciclos
245
+ > (com todos os arquivos alterados). Ele audita o fluxo inteiro e emite `Lógica:`/`Domínio:`.
246
+ > Nunca remova o brief dele da onda. Despache-o primeiro (é o mais longo).
247
+
186
248
 
187
249
  > **Heartbeat:** antes de despachar cada onda, rode `houndsman status ping`. A UI usa esse
188
250
  > sinal (e não `updatedAt`) para saber que a execução está viva; sem ping por 10 min ela
189
251
  > mostra "Timeout na revisão".
190
252
 
253
+ ### Teste A/B (variantes)
254
+
255
+ Para comparar duas formas de rodar a mesma PR (prompt, modelo, configuração, versão do
256
+ houndsman), dê um **rótulo** a cada tentativa — cada variante é uma run própria
257
+ (`(repo, branch, variante)`) e nada é apagado:
258
+
259
+ ```bash
260
+ houndsman --pr 456 --variant baseline # prepare da variante A
261
+ # despache os briefs e grave findings/baseline
262
+ houndsman --pr 456 --variant baseline --finalize
263
+
264
+ houndsman --pr 456 --variant otimizado # prepare da variante B
265
+ # ...
266
+ houndsman --pr 456 --variant otimizado --finalize
267
+
268
+ houndsman compare --branch <head> --a baseline --b otimizado
269
+ houndsman compare --list --branch <head> # ver as runs e contagens
270
+ ```
271
+
272
+ - `--variant <label>` vale para o comando default, `hunt`, `context`, `status`,
273
+ `findings` e `verify`; use o mesmo rótulo em todas as etapas.
274
+ - Repetir a **mesma** variante: `--full` re-revisa o commit; para um teste realmente
275
+ limpo, use um rótulo novo.
276
+ - `compare` grava `compare-<a>--<b>.md|.json` na run B (aparece nos artefatos da UI) e
277
+ mostra achados novos/sumidos, mudança de severidade, cobertura, tempo e tokens.
278
+ - Sem rótulo, a run principal continua sendo a da branch (o `compare` assume A = principal
279
+ quando só `--b` é informado).
280
+
191
281
  ```
192
282
  Leia e execute o brief: <caminho absoluto impresso pelo prepare>/briefs/<watchdog-id>.md
193
283
  Você é o watchdog <watchdog-id> do {{projectName}}.
194
284
  Use como raiz de leitura o **Worktree:** indicado no brief (nunca o clone principal).
285
+ O brief já traz os trechos alterados (`## Trechos alterados (diff)`): comece por eles.
286
+ Respeite o **Orçamento de exploração** do brief (6 leituras/6 buscas; `general`: 10/10):
287
+ se a prova não estiver no brief nem nesse orçamento, **não é achado**.
288
+ Em `reviewedFiles`, liste apenas arquivos do seu domínio (subconjunto do brief).
195
289
  ```
196
290
 
197
291
  Cada subagente grava o `outputPath` indicado no brief (schema `.houndsman/core/skill/OUTPUT-FORMAT.md`).
198
- Sem achados → `"findings": []` (arquivo obrigatório). Arquivos na seção **Fora do orçamento**
199
- não são lidos: registre-os em `skipped`.
292
+ Sem achados → `"findings": []` (arquivo obrigatório). Arquivos na seção **Fora do recorte**
293
+ não são lidos: registre-os em `skipped` com o motivo (`budget` ou `fora do fluxo`).
200
294
 
201
295
  **NUNCA enviar:** `git diff` completo · histórico de commits · arquivos de outros domínios ·
202
- `AGENTS.md` completo (já está no contexto global).
296
+ o `business-summary.json` inteiro (o brief já traz o recorte do domínio) · `AGENTS.md` completo
297
+ (já está no contexto global).
203
298
 
204
299
  ---
205
300
 
@@ -213,76 +308,68 @@ houndsman --finalize # alvo = branch atual
213
308
  Falha com mensagem clara se faltar algum `findings/<watchdog>.json` no staging. Quando todos existem:
214
309
  1. Valida o schema de cada JSON
215
310
  2. Deduplica achados por `(file, line, rule)` mesclando watchdogs sobrepostos
216
- 3. Grava um `review.<watchdog>.md` por watchdog com achados e indexa no `review.md`
217
- (**Relatórios por domínio**) — mantém o relatório consolidado enxuto
218
- 4. Grava o `review.md` abrindo pelo **sumário**: contexto, relatórios por domínio, cobertura e
219
- conclusão — antes dos achados
220
- 5. Agrupa os achados por severidade (❌ blocking > ⚠️ attention > 💡 suggestion > 🔎 nit) e
221
- **por arquivo** dentro de cada severidade (navegabilidade em PRs grandes)
222
- 6. Anexa os candidatos Jev não confirmados em `🔎 Candidatos não verificados` ao final
223
- (não bloqueiam)
224
- 7. Persiste a **triagem** no storage — um `id` curto e um `fingerprint` de conteúdo por
225
- finding, preservados entre execuções9. Marca como **`done`** os findings que sumiram do relatório (corrigidos manualmente entre
311
+ 3. Persiste a **triagem** no storage — um `id` curto e um `fingerprint` de conteúdo por
312
+ finding, preservados entre execuções
313
+ 4. Marca como **`done`** os findings que sumiram do relatório (corrigidos manualmente entre
226
314
  revisões) e **resolve as conversas correspondentes no GitHub** — só as ainda abertas, e
227
- falha-aberto (sem `gh`/PR o relatório segue igual)
315
+ falha-aberto (sem `gh`/PR o resumo segue igual)
316
+ 5. Grava o **resumo final** (`review-resume.md`): negócio, pontos técnicos, **tabela de
317
+ cobertura por domínio** (achados · revisados/esperados · faltam), candidatos não
318
+ confirmados e **conclusão**. É o único relatório em markdown — os achados ficam na triagem
319
+ (`findings`, UI), sem serem duplicados em arquivo
320
+
321
+ > **Resultado da revisão:** leia o `review-resume.md` (a saída do `--finalize` imprime o
322
+ > caminho no storage). Ele é o contexto final para responder ao usuário sobre o resultado;
323
+ > os achados individuais vêm de `findings list --json`.
324
+
228
325
  Após finalizar, corrija os achados com a capability **`fix`** (`fix.md`): a UI ou os
229
326
  comandos `findings` levam do achado à correção.
230
327
 
231
328
  ---
232
329
 
233
- ## Estrutura do Relatório
330
+ ## Estrutura do Resumo Final
234
331
 
235
332
  ```markdown
236
- # Review — [branch]
333
+ # Resumo da revisão — [branch]
334
+
335
+ **Data:** YYYY-MM-DD · **Status:** ✅ Aprovado / ⚠️ Aprovado com Ressalvas / ❌ Mudanças Necessárias
237
336
 
238
- **Data:** YYYY-MM-DD
239
- **Watchdogs ativos:** [lista]
240
- **Achados:** N bloqueantes · N atenção · N sugestões · N nits
337
+ ## Resumo de negócio
338
+ ...
241
339
 
242
- ## Contexto da PR
243
- **PR:** #123 Título — url
244
- **Branch:** `feature/x` → `main`
245
- **Objetivo:** ...
246
- **Resumo das alterações:**
247
- - ...
340
+ ## Pontos técnicos
341
+ - **Contratos** — ...
248
342
 
249
- ## Relatórios por domínio
250
- | Watchdog | Achados | Revisados | Relatório |
343
+ ## Cobertura por domínio
344
+ | Domínio | Achados | Revisados | Faltam |
251
345
  |---|---|---|---|
252
346
 
253
- ## Cobertura
254
- | Watchdog | Arquivos revisados | Findings |
255
- |---|---|---|
347
+ ## Candidatos não verificados (N) ← se houver
348
+ - `arquivo` · severity · regra
256
349
 
257
350
  ## Conclusão
258
- **Status:** ✅ Aprovado / ⚠️ Aprovado com Ressalvas / ❌ Mudanças Necessárias
259
-
260
- ## ❌ blocking
261
- ### `src/routes/order-route.ts`
262
- - **<regra>** — `src/routes/order-route.ts:5` · _<watchdogs>_
263
- <mensagem>
264
- **Ação:** <ação>
265
-
266
- ## 🔎 Candidatos não verificados (Jev) ← se houver, sempre ao final
351
+ **Resumo:** N bloqueantes · N atenção · N sugestões · N nits.
267
352
  ```
268
353
 
269
- > O **sumário** (relatórios por domínio, cobertura e conclusão) vem **antes** dos achados;
270
- > os pontos específicos ficam no fim.
354
+ > Tabelas e conclusão têm orçamento reservado: crescer o texto de negócio nunca as corta.
355
+ > Achados individuais (com `id` de triagem) vivem na UI (`Findings`) e em `findings list --json`.
271
356
 
272
357
  ---
273
358
 
274
359
  ## Fluxo Completo
275
360
 
276
361
  ```
277
- houndsman context (gh) ──► context.json ──► subagente ──► context-summary.json
362
+ houndsman --pr (gh) ──► context.json ──► prepare resume (IA) ──► context-summary.json
278
363
  ↓
279
364
  git diff --name-status (base...head)
280
365
  ↓
281
- [1] houndsman ──► storage (classification/candidates/manifest) + briefs/ no staging
366
+ [1] houndsman ──► storage (classification/candidates/business/manifest) + briefs/ no staging
367
+ ↓
368
+ [1.5] subagente de intenção ──► business-summary.json (só quando não veio da IA)
282
369
  ↓
283
- [2] N subagentes em paralelo ──► findings/<watchdog>.json no staging
370
+ [2] N+1 subagentes em paralelo ──► findings/<watchdog>.json (+ findings/general.json)
284
371
  ↓
285
- [3] houndsman --finalize ──► review.md + triagem no storage (review_done)
372
+ [3] houndsman --finalize ──► review-resume.md + triagem no storage (review_done)
286
373
  ↓
287
374
  [4] server (UI) ──► validar a revisão + marcar decision: execute
288
375
  ↓