@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.
- package/README.md +6 -1
- package/package.json +1 -1
- package/src/cli/commands/compare-command.ts +112 -0
- package/src/cli/commands/context-command.ts +1 -0
- package/src/cli/commands/findings-command.ts +11 -1
- package/src/cli/commands/hunt-command.ts +20 -3
- package/src/cli/commands/review-command.ts +38 -0
- package/src/cli/commands/status-command.ts +3 -2
- package/src/cli/help.ts +3 -1
- package/src/cli/index.ts +3 -1
- package/src/cli/progress.ts +7 -2
- package/src/core/ai/ai-client.ts +38 -2
- package/src/core/ai/features/brief-enricher.ts +1 -1
- package/src/core/ai/features/business-analyzer.ts +61 -0
- package/src/core/ai/features/business-summarizer.ts +44 -0
- package/src/core/ai/index.ts +8 -0
- package/src/core/ai/prompts/brief.ts +33 -7
- package/src/core/ai/prompts/business.ts +76 -0
- package/src/core/ai/provider-capabilities.ts +12 -0
- package/src/core/ai/schemas.ts +70 -2
- package/src/core/ai/usage-recorder.ts +53 -1
- package/src/core/brief.ts +246 -12
- package/src/core/builtins.ts +108 -0
- package/src/core/business-summary.ts +583 -0
- package/src/core/commands/compare.ts +233 -0
- package/src/core/commands/context.ts +6 -2
- package/src/core/commands/findings.ts +38 -30
- package/src/core/commands/review.ts +6 -0
- package/src/core/commands/scaffold.ts +27 -0
- package/src/core/commands/status.ts +9 -4
- package/src/core/compare.ts +243 -0
- package/src/core/concurrency.ts +30 -0
- package/src/core/config.ts +31 -3
- package/src/core/defaults.ts +50 -4
- package/src/core/domain/budget.ts +62 -4
- package/src/core/domain/classification.ts +12 -2
- package/src/core/engine/carryover.ts +4 -0
- package/src/core/engine/finalize-pipeline.ts +347 -0
- package/src/core/engine/prepare-pipeline.ts +1294 -0
- package/src/core/engine/review-context.ts +51 -0
- package/src/core/engine/review-options.ts +47 -0
- package/src/core/engine/review-scope.ts +14 -1
- package/src/core/engine/review-session.ts +11 -13
- package/src/core/engine/run-artifacts.ts +196 -0
- package/src/core/engine/run-format.ts +4 -0
- package/src/core/findings-state.ts +13 -1
- package/src/core/github-review.ts +5 -2
- package/src/core/hunt/hunt-runner.ts +90 -0
- package/src/core/hunt/index.ts +2 -0
- package/src/core/hunt/maki-intent-prompt.ts +50 -0
- package/src/core/hunt/maki-prompt.ts +13 -1
- package/src/core/hunt/pool.ts +4 -26
- package/src/core/logging/index.ts +6 -1
- package/src/core/logging/progress.ts +85 -1
- package/src/core/orchestrator.ts +33 -1289
- package/src/core/paths.ts +6 -3
- package/src/core/pr-context.ts +2 -4
- package/src/core/prepare-report.ts +61 -0
- package/src/core/project-config.ts +8 -1
- package/src/core/propagation.ts +127 -0
- package/src/core/registry-check.ts +60 -21
- package/src/core/renderers/manifest-writer.ts +13 -0
- package/src/core/renderers/resume-renderer.ts +151 -11
- package/src/core/report-builder.ts +108 -278
- package/src/core/storage/file/file-storage.ts +7 -3
- package/src/core/storage/sqlite/mappers.ts +10 -0
- package/src/core/storage/sqlite/schema.ts +104 -23
- package/src/core/storage/sqlite/sqlite-storage.ts +22 -9
- package/src/core/storage/types.ts +16 -4
- package/src/core/storage/work-area.ts +59 -1
- package/src/core/types.ts +31 -0
- package/src/core/watchdog-registry.ts +21 -3
- package/src/index.ts +29 -4
- package/src/server/client/ArtifactsPanel.tsx +4 -2
- package/src/server/client/FindingCard.tsx +21 -1
- package/src/server/client/RunsSection.tsx +5 -0
- package/src/server/client/utils/constants.ts +21 -11
- package/src/server/client/utils/markdown.ts +1 -1
- package/src/server/client/utils/types.ts +14 -2
- package/src/server/run-repository.ts +35 -14
- package/src/server/styles.css +2 -0
- package/src/skill/OUTPUT-FORMAT.md +36 -10
- package/src/skill/README.md +18 -14
- package/src/skill/SETUP.md +1 -0
- package/src/skill/SKILL.md +13 -4
- package/src/skill/example-resume.md +43 -0
- package/src/skill/hunt.md +145 -58
- package/src/tests/__snapshots__/baseline.test.ts.snap +187 -178
- package/src/tests/ai-core.test.ts +46 -0
- package/src/tests/ai-features.test.ts +95 -4
- package/src/tests/baseline.test.ts +29 -121
- package/src/tests/brief-scope.test.ts +250 -0
- package/src/tests/business-summary.test.ts +258 -0
- package/src/tests/compare.test.ts +233 -0
- package/src/tests/fixtures/fake-model-provider.ts +2 -1
- package/src/tests/hunt-maki.test.ts +58 -0
- package/src/tests/markdown.test.ts +3 -3
- package/src/tests/progress.test.ts +29 -1
- package/src/tests/propagation.test.ts +119 -0
- package/src/tests/review-resume.test.ts +60 -1
- package/src/tests/review-scope.test.ts +38 -29
- package/src/tests/review-scripts.test.ts +106 -218
- package/src/tests/server.test.ts +7 -4
- package/src/tests/storage.test.ts +194 -9
- package/src/core/renderers/report-renderer.ts +0 -66
- 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
|
|
51
|
-
| 1. Preparar | `houndsman` | skill | `classification.json` + `candidates.json` + `briefs/` + `manifest.json` |
|
|
52
|
-
|
|
|
53
|
-
|
|
|
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
|
|
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
|
-
|
|
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
|
-
-
|
|
146
|
-
|
|
147
|
-
|
|
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
|
|
185
|
-
|
|
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
|
|
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
|
-
`
|
|
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.
|
|
217
|
-
|
|
218
|
-
4.
|
|
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
|
|
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
|
|
330
|
+
## Estrutura do Resumo Final
|
|
234
331
|
|
|
235
332
|
```markdown
|
|
236
|
-
#
|
|
333
|
+
# Resumo da revisão — [branch]
|
|
334
|
+
|
|
335
|
+
**Data:** YYYY-MM-DD · **Status:** ✅ Aprovado / ⚠️ Aprovado com Ressalvas / ❌ Mudanças Necessárias
|
|
237
336
|
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
**Achados:** N bloqueantes · N atenção · N sugestões · N nits
|
|
337
|
+
## Resumo de negócio
|
|
338
|
+
...
|
|
241
339
|
|
|
242
|
-
##
|
|
243
|
-
**
|
|
244
|
-
**Branch:** `feature/x` → `main`
|
|
245
|
-
**Objetivo:** ...
|
|
246
|
-
**Resumo das alterações:**
|
|
247
|
-
- ...
|
|
340
|
+
## Pontos técnicos
|
|
341
|
+
- **Contratos** — ...
|
|
248
342
|
|
|
249
|
-
##
|
|
250
|
-
|
|
|
343
|
+
## Cobertura por domínio
|
|
344
|
+
| Domínio | Achados | Revisados | Faltam |
|
|
251
345
|
|---|---|---|---|
|
|
252
346
|
|
|
253
|
-
##
|
|
254
|
-
|
|
255
|
-
|---|---|---|
|
|
347
|
+
## Candidatos não verificados (N) ← se houver
|
|
348
|
+
- `arquivo` · severity · regra
|
|
256
349
|
|
|
257
350
|
## Conclusão
|
|
258
|
-
**
|
|
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
|
-
>
|
|
270
|
-
>
|
|
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
|
|
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
|
|
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
|
↓
|