@polymorphism-tech/morph-spec 8.47.0 → 9.0.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 (222) hide show
  1. package/CLAUDE.md +48 -39
  2. package/README.md +3 -4
  3. package/bin/morph-spec.js +37 -51
  4. package/bin/validate.js +3 -111
  5. package/claude-plugin.json +1 -1
  6. package/docs/CHEATSHEET.md +1 -1
  7. package/docs/QUICKSTART.md +1 -1
  8. package/framework/CLAUDE.md +41 -101
  9. package/framework/MORPH.md +95 -252
  10. package/framework/agents.json +75 -18
  11. package/framework/commands/morph-apply.md +5 -28
  12. package/framework/commands/morph-archive.md +1 -1
  13. package/framework/commands/morph-hotfix.md +8 -8
  14. package/framework/commands/morph-infra.md +1 -1
  15. package/framework/commands/morph-preflight.md +2 -3
  16. package/framework/commands/morph-proposal.md +2 -50
  17. package/framework/commands/morph-status.md +3 -3
  18. package/framework/docs/CLI.md +585 -286
  19. package/framework/evals/review-checklist.md +82 -41
  20. package/framework/hooks/README.md +10 -11
  21. package/framework/hooks/claude-code/core/comment-guard.js +1 -1
  22. package/framework/hooks/claude-code/core/denylist.json +33 -3
  23. package/framework/hooks/claude-code/core/enforce-phase-writes.js +16 -20
  24. package/framework/hooks/claude-code/core/gate-guard.js +2 -11
  25. package/framework/hooks/claude-code/core/pre-bash-denylist.js +38 -0
  26. package/framework/hooks/claude-code/core/protect-spec-files.js +30 -242
  27. package/framework/hooks/claude-code/core/state-sync.js +7 -21
  28. package/framework/hooks/claude-code/core/telemetry-log.js +3 -3
  29. package/framework/hooks/claude-code/core/validate-completion.js +33 -97
  30. package/framework/hooks/claude-code/core/warn-bash-source-write.js +31 -0
  31. package/framework/hooks/claude-code/core/worktree-context.js +5 -4
  32. package/framework/hooks/claude-code/statusline.py +55 -41
  33. package/framework/hooks/package.json +3 -0
  34. package/framework/hooks/shared/activity-logger.js +1 -1
  35. package/framework/hooks/shared/build-check.js +10 -6
  36. package/framework/hooks/shared/command-tokens.js +169 -0
  37. package/framework/hooks/shared/comment-rules.js +1 -1
  38. package/framework/hooks/shared/comment-scanner.js +10 -23
  39. package/framework/hooks/shared/comment-stripper.js +1 -1
  40. package/framework/hooks/shared/e2e-check.js +64 -27
  41. package/framework/hooks/shared/errata.js +72 -0
  42. package/framework/hooks/shared/feature-locator.js +1 -1
  43. package/framework/hooks/shared/frontend-locations.js +6 -0
  44. package/framework/hooks/shared/gate-question.js +18 -0
  45. package/framework/hooks/shared/phase-utils.js +15 -32
  46. package/framework/hooks/shared/slice-progress.js +118 -0
  47. package/framework/hooks/shared/spawn-command.js +23 -0
  48. package/framework/hooks/shared/state-reader.js +61 -87
  49. package/framework/hooks/shared/state-writer.js +2 -3
  50. package/framework/mcp/registry.json +3 -4
  51. package/framework/phases.json +23 -39
  52. package/framework/schemas/config.schema.json +14 -9
  53. package/framework/schemas/feature.schema.json +15 -50
  54. package/framework/skills/README.md +3 -4
  55. package/framework/skills/core/create-umbraco-lp/SKILL.md +1 -1
  56. package/framework/skills/core/migrate-lp-to-umbraco/SKILL.md +1 -1
  57. package/framework/skills/core/morph-apply/SKILL.md +149 -222
  58. package/framework/skills/core/morph-hotfix/SKILL.md +33 -42
  59. package/framework/skills/core/morph-machine/SKILL.md +2 -2
  60. package/framework/skills/core/morph-media/SKILL.md +1 -1
  61. package/framework/skills/core/morph-plan/SKILL.md +137 -299
  62. package/framework/skills/core/morph-review/SKILL.md +111 -136
  63. package/framework/skills/core/morph-standards/SKILL.md +27 -39
  64. package/framework/skills/core/morph-uiux/SKILL.md +77 -152
  65. package/framework/standards/STANDARDS.json +86 -1218
  66. package/framework/standards/STANDARDS.meta.json +1305 -0
  67. package/framework/standards/ai-agents/evals-with-cache.md +1 -2
  68. package/framework/standards/ai-agents/setup.md +1 -1
  69. package/framework/standards/architecture/code-comments.md +6 -6
  70. package/framework/standards/integration/mcp/mcp-tools.md +7 -7
  71. package/framework/templates/README.md +2 -3
  72. package/framework/templates/REGISTRY.json +6 -170
  73. package/framework/templates/docs/plan.md +72 -0
  74. package/framework/templates/dotnet/ai-kit/README.md +1 -9
  75. package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/Morph.AiKit.Tests.csproj +0 -10
  76. package/framework/templates/meta-prompts/squad-leaders/backend-squad.md +1 -1
  77. package/framework/templates/meta-prompts/squad-leaders/frontend-squad.md +1 -1
  78. package/framework/templates/meta-prompts/squad-leaders/squad-leader.md +1 -1
  79. package/framework/templates/meta-prompts/validators/pre-commit-validator.md +3 -4
  80. package/package.json +1 -1
  81. package/src/commands/e2e/e2e.js +2 -2
  82. package/src/commands/observability/cost.js +18 -60
  83. package/src/commands/project/doctor-procs.js +1 -1
  84. package/src/commands/project/doctor.js +9 -9
  85. package/src/commands/project/fleet.js +4 -4
  86. package/src/commands/project/heavy.js +3 -3
  87. package/src/commands/project/init.js +4 -0
  88. package/src/commands/project/setup-infra-cmd.js +2 -1
  89. package/src/commands/project/stack-scan.js +58 -0
  90. package/src/commands/project/standards.js +79 -25
  91. package/src/commands/project/status.js +29 -69
  92. package/src/commands/project/update.js +17 -1
  93. package/src/commands/project/worktree.js +1 -1
  94. package/src/commands/state/advance.js +62 -46
  95. package/src/commands/state/approve.js +81 -141
  96. package/src/commands/state/archive.js +20 -84
  97. package/src/commands/state/auto-approval.js +68 -0
  98. package/src/commands/state/create.js +28 -1
  99. package/src/commands/state/delete.js +1 -1
  100. package/src/commands/state/finish.js +11 -23
  101. package/src/commands/state/gate-check.js +85 -84
  102. package/src/commands/state/gate-decision.js +6 -4
  103. package/src/commands/state/handoff.js +1 -1
  104. package/src/commands/state/list.js +9 -9
  105. package/src/commands/state/report-check.js +157 -311
  106. package/src/commands/state/retype.js +9 -3
  107. package/src/commands/validation/mutate.js +77 -14
  108. package/src/commands/validation/plan-check.js +81 -0
  109. package/src/commands/validation/validate-feature.js +60 -135
  110. package/src/commands/validation/verify.js +40 -72
  111. package/src/core/paths/output-schema.js +19 -66
  112. package/src/core/state/gate-order.js +5 -6
  113. package/src/core/state/lifecycle-audit.js +2 -2
  114. package/src/core/state/state-manager.js +17 -98
  115. package/src/core/templates/template-registry.js +2 -2
  116. package/src/core/templates/template-seed.js +22 -0
  117. package/src/core/work-types.js +10 -10
  118. package/src/dashboard/app/components/ActivityFeed.jsx +2 -3
  119. package/src/dashboard/app/components/CommandPalette.jsx +5 -5
  120. package/src/dashboard/app/components/EntityLink.jsx +1 -1
  121. package/src/dashboard/app/hooks/useMorphQuery.js +1 -1
  122. package/src/dashboard/app/lib/phases.js +2 -4
  123. package/src/dashboard/app/pages/Activity.jsx +1 -1
  124. package/src/dashboard/app/pages/FeatureDetail.jsx +139 -129
  125. package/src/dashboard/app/pages/Features.jsx +9 -9
  126. package/src/dashboard/app/pages/Guide.jsx +2 -2
  127. package/src/dashboard/app/pages/PhasePipeline.jsx +3 -4
  128. package/src/dashboard/app/pages/Standards.jsx +1 -1
  129. package/src/dashboard/scanner/activity-scanner.js +5 -15
  130. package/src/dashboard/scanner/agents-scanner.js +1 -1
  131. package/src/dashboard/scanner/docs-scanner.js +2 -2
  132. package/src/dashboard/scanner/features-scanner.js +95 -60
  133. package/src/dashboard/scanner/project-api.js +1 -1
  134. package/src/dashboard/scanner/standards-scanner.js +2 -1
  135. package/src/lib/ci/ci-verify.js +17 -1
  136. package/src/lib/ci/github-ci.js +1 -1
  137. package/src/lib/detectors/index.js +3 -8
  138. package/src/lib/generators/handoff-generator.js +34 -65
  139. package/src/lib/generators/settings-generator.js +11 -89
  140. package/src/lib/git/evidence-staleness.js +1 -1
  141. package/src/lib/git/tree-fingerprint.js +19 -7
  142. package/src/lib/git/tree-state.js +2 -2
  143. package/src/lib/heavy/cleanup.js +1 -5
  144. package/src/lib/installers/memory-installer.js +6 -8
  145. package/src/lib/mutation/commands.js +3 -2
  146. package/src/lib/{tasks/dotnet-test-introspection.js → mutation/dotnet-introspection.js} +17 -282
  147. package/src/lib/mutation/plan.js +14 -6
  148. package/src/lib/mutation/runner.js +1 -1
  149. package/src/lib/mutation/subset.js +46 -9
  150. package/src/lib/plan/artifact-vocabulary.js +60 -0
  151. package/src/lib/plan/checks.js +234 -0
  152. package/src/lib/plan/plan-parser.js +209 -0
  153. package/src/lib/plan/plan-template.js +18 -0
  154. package/src/lib/review-reports.js +222 -0
  155. package/src/lib/risk-detector.js +131 -140
  156. package/src/lib/specs/adr-index.js +50 -69
  157. package/src/lib/specs/design-seed.js +18 -0
  158. package/src/lib/specs/frontmatter.js +44 -0
  159. package/src/lib/specs/gfm-table.js +17 -0
  160. package/src/lib/specs/old-format.js +68 -0
  161. package/src/lib/specs/revocations.js +37 -95
  162. package/src/lib/specs/screen-checklist.js +18 -17
  163. package/src/lib/stack/dotnet-build-ignores.js +47 -0
  164. package/src/lib/stack/stack-scan.js +267 -0
  165. package/src/lib/standards/registry.js +43 -0
  166. package/src/lib/standards/sections.js +58 -0
  167. package/src/lib/tasks/eval-node.js +4 -12
  168. package/src/lib/tasks/test-nodes.js +1 -74
  169. package/src/lib/tasks/test-runner.js +75 -117
  170. package/src/lib/telemetry/metrics.js +8 -69
  171. package/src/lib/telemetry/telemetry-reader.js +5 -118
  172. package/src/lib/telemetry/verify-event.js +5 -7
  173. package/src/lib/validators/code-budget/code-budget-validator.js +1 -1
  174. package/src/lib/validators/contracts/contract-compliance-validator.js +2 -2
  175. package/src/lib/validators/reuse/reuse-validator.js +22 -45
  176. package/src/lib/validators/traceability-check.js +85 -129
  177. package/src/lib/validators/verify-runner.js +118 -235
  178. package/src/lib/worktree/docker-audit.js +1 -2
  179. package/src/lib/worktree/fleet-scanner.js +25 -38
  180. package/src/scripts/setup-infra.js +9 -0
  181. package/src/utils/agents-installer.js +76 -9
  182. package/src/utils/claude-settings-manager.js +0 -35
  183. package/src/utils/file-copier.js +27 -1
  184. package/src/utils/hooks-installer.js +16 -9
  185. package/src/utils/skills-installer.js +1 -2
  186. package/framework/evals/trace-schema.md +0 -67
  187. package/framework/hooks/claude-code/core/tasks-json-guard.js +0 -83
  188. package/framework/hooks/claude-code/core/trace-autogen.js +0 -277
  189. package/framework/hooks/git/pre-commit/specs.sh +0 -50
  190. package/framework/hooks/shared/tasks-validator.js +0 -111
  191. package/framework/rules/morph-task-tracking.md +0 -54
  192. package/framework/rules/morph-workflow.md +0 -244
  193. package/framework/schemas/tasks.schema.json +0 -79
  194. package/framework/skills/core/morph-brainstorming/SKILL.md +0 -161
  195. package/framework/skills/core/morph-implement/SKILL.md +0 -194
  196. package/framework/skills/core/morph-proposal/SKILL.md +0 -152
  197. package/framework/skills/core/morph-stack-scan/SKILL.md +0 -145
  198. package/framework/templates/docs/proposal.md +0 -192
  199. package/framework/templates/docs/spec.md +0 -57
  200. package/framework/templates/docs/ui-components.md +0 -52
  201. package/framework/templates/docs/ui-design-system.md +0 -76
  202. package/framework/templates/docs/ui-flows.md +0 -167
  203. package/framework/templates/examples/spec-examples.md +0 -91
  204. package/framework/templates/feature/decisions.md +0 -124
  205. package/framework/templates/feature/recap.md +0 -145
  206. package/framework/templates/tasks.template.json +0 -17
  207. package/src/commands/state/usecase.js +0 -143
  208. package/src/commands/tasks/dag.js +0 -181
  209. package/src/lib/agents/output-collector.js +0 -76
  210. package/src/lib/evaluator-report.js +0 -104
  211. package/src/lib/specs/acervo-format.js +0 -70
  212. package/src/lib/specs/acervo-lifecycle.js +0 -264
  213. package/src/lib/specs/done-criteria-check.js +0 -200
  214. package/src/lib/specs/usecase-check.js +0 -301
  215. package/src/lib/specs/usecase-promoter.js +0 -301
  216. package/src/lib/specs/usecase-registry.js +0 -237
  217. package/src/lib/tasks/dispatch-planner.js +0 -319
  218. package/src/lib/tasks/mermaid-renderer.js +0 -132
  219. package/src/lib/tasks/task-classifier.js +0 -30
  220. package/src/lib/tasks/task-parser.js +0 -209
  221. package/src/lib/tasks/tasks-json-parser.js +0 -296
  222. package/src/lib/tasks/test-scope.js +0 -597
@@ -1,150 +1,125 @@
1
1
  ---
2
2
  name: morph-review
3
- description: Conduz a fase de revisão e produz o review-report.md para o Gate 3
3
+ description: Conduz o Gate 3 — despacha verificador ∥ revisor (∥ segurança, quando exigida) em contexto fresco sobre um SHA fixo e decide pelo gate-check
4
4
  version: core
5
- when_to_use: Use quando a fase review começar, depois que todas as tasks de tasks.json estiverem com status `done`
5
+ when_to_use: Use quando a fase review começar, com todas as fatias com relatório final e o verify da feature verde
6
6
  user-invocable: true
7
- cliVersion: "8.47.0"
7
+ cliVersion: "9.0.0"
8
8
  ---
9
9
 
10
10
  # morph-review
11
11
 
12
12
  ## Objetivo
13
- Responder, com evidência, uma pergunta: **a entrega faz o que os use cases dizem, sem quebrar o que
14
- já funcionava?** O Gate 3 decide por veredito (`SHIP`/`FIX`) e bloqueadores tipados — não por nota.
15
-
16
- ## Quando invocar
17
- Fase review, com todas as tasks `done` e o `recap.md` em dia. Normalmente chamada pela `morph-apply`.
13
+ Responder, com evidência: **cada cenário do plano está provado, sem quebrar o que já funcionava?**
14
+ Três agentes independentes, cada um com o seu relatório em `4-review/`: `verifier.md` (prova cada
15
+ `Cn`), `reviewer.md` (escopo, arquitetura, regressão) e `security.md` (só com caminho sensível). O
16
+ Gate 3 decide por `**Verdict:** SHIP|FIX`, bloqueadores tipados e a cobertura dos `Cn` — não por
17
+ nota. Você não escreve relatório de review: os três arquivos são o retorno.
18
18
 
19
19
  ## Ritmo
20
- - Comando em **primeiro plano**, com timeout. O único que pode passar do teto de 10 min do Bash é o
21
- `verify {feature}` de um projeto grande: aí rode-o com `run_in_background` e espere a notificação
22
- de término. Nunca `sleep`/`until` consultando um processo: a espera custa a máquina e não produz prova.
23
- - **Bloqueio de ambiente não é laço.** Memória baixa, slot pesado ocupado (`verify` exit 3 /
24
- `status: "busy"`), Docker fora: tente **uma** vez mais. Persistiu, siga com o que tem — o
25
- `gate-check` pausa com a razão e o humano decide. Nunca agende retentativas.
26
-
27
- ## O que fazer
28
-
29
- 1. **Contexto.** Tenha em contexto `2-plan/spec.md`, os use cases (`2-plan/usecases/UC-*.md`),
30
- `2-plan/decisions.md` (se existir) e `3-implement/recap.md`. Numa sessão quente eles já estão
31
- lá; numa fria, Read.
32
-
33
- 2. **Relatório já íntegro?** Rode `morph-spec report-check {feature} --json` (sem task) e leia o
34
- campo `evaluator` — também em sessão retomada: retomar não reseta este passo.
35
- - `evaluator.complete` (tem `**Verdict:**` válido e não é parcial): **não re-despache** — vá ao
36
- passo 5.
37
- - `evaluator.partial: true` (`PARCIAL` na 1ª linha): ver "PARCIAL" no passo 4.
38
- - Ausente ou sem veredito: siga para o passo 3.
39
-
40
- 3. **Prova da suíte — uma rodada, no CI.** Depois da última task, commite o trabalho da feature na
41
- branch (`git add <paths>` + `git commit`: o CI só vê commits) e rode
42
- `morph-spec verify {feature} --ci --json` com `run_in_background`. Ele empurra `morph/{feature}`,
43
- cria o workflow `morph-verify.yml` se o projeto não tem um, espera o run e grava o stamp do JSON que
44
- o run publicou. Sem CI (sem GitHub, sem `gh`, `project.ci: false`) ele mesmo roda o verify local e
45
- diz por quê. **Quando a saída mostrar `CI rodando`, despache o avaliador (passo 4) sem esperar o
46
- fim**: o workflow e o push já estão commitados, então a foto `--before-eval` não os acusa como
47
- mutação, e a suíte corre no CI em paralelo. Saiu `verify local`: espere o fim antes do passo 4 —
48
- suíte local e `mutate` disputam a máquina. Exit 2 = trabalho fora de commit; exit 3 (`pending`/`busy`)
49
- não é vermelho (ver Ritmo). Rode-a só depois da última task: o `gate-check` pausa o ship se o
50
- último stamp é de escopo `task:{id}`. **Sem `--filter`, sempre**: `verify {feature}` **nunca recorta**, e um verify filtrado não persiste o
51
- stamp. Se o JSON vier com `repeatOf`, nada mudou desde a rodada anterior — use aquela. Esta é a
52
- única execução de testes do Gate 3: o avaliador não roda a suíte de novo.
53
- - Nó `e2e`: `pass` local → passe a URL ao avaliador (`morph-spec e2e status {feature} --json` →
54
- `baseUrl`); `pass` no CI → a app foi exercida lá, não há stack local para navegar. `fail` →
55
- correção (vermelho no CI: `gh run view <id> --log-failed`, impresso pelo verify). Vermelho por
56
- config que só existe na máquina (`.env`, appsettings, connection string, secret) não é defeito do
57
- código: pergunte ao usuário entre declarar o secret + `env:` no `morph-verify.yml` ou `project.ci: false`. `skip` → quem
58
- classifica é o `gate-check` (`classifyE2eSkip`, em `risk-detector.js`): dispensa de projeto/escopo
59
- passa; ambiente, `--skip-e2e` ou razão desconhecida pausam sozinhos.
60
- - Vermelho com o avaliador ainda rodando: não mexa na árvore até ele voltar (passo 4); corrija junto
61
- com os bloqueadores dele. `traceability.warnings` entram no review-report como sinal, não bloqueio.
62
-
63
- 4. **Despache o avaliador independente** (`morph-evaluator`, contexto fresco, sem Write/Edit).
64
- - Tire a foto da árvore e escolha o modelo: `morph-spec report-check {feature} --before-eval --json`.
65
- O campo `evaluatorModel.model` é `sonnet` por padrão e `opus` quando o diff toca auth, segredo,
66
- pagamento, migração, prompt/modelo ou mídia gerada (`evaluatorModel.reasons` diz por quê).
67
- - Blast radius: para cada símbolo público do diff, `morph-spec graph affected <símbolo> --prod --json`.
68
- Sem grafo (`no-graph`/`not-found`/`ambiguous`), siga sem o blast radius e registre a ausência no
69
- review-report. Numa worktree com grafo stale, `morph-spec graph refresh` antes.
70
- ```
71
- dispatch Agent (subagent_type: "morph-evaluator", model: {evaluatorModel.model}) with prompt:
72
- contexto: use cases + spec.md + diff da feature + JSON do verify se já terminou (nós, e2e, URL)
73
- + blast radius + 1-design/mockups.md (se existir) + 3-implement/evidencias/*.md (se existir)
74
- instrução: |
75
- Siga .morph/framework/evals/review-checklist.md e grave
76
- .morph/features/{feature}/4-review/evaluator-report.md ANTES de encerrar — o arquivo é o
77
- retorno; não chame SendMessage. Se o arquivo já existir quando você começar, é resíduo de
78
- outra tentativa: não o leia antes de escrever o seu (ancoragem no veredito alheio).
79
- A suíte roda fora de você (JSON acima, ou o CI em curso): você NÃO roda verify, build nem testes. Bash é para ler
80
- (git diff/log/show, grep, morph-spec graph) e para no máximo UMA rodada de
81
- `morph-spec mutate {feature}` (até 3 mutantes com `expect`), só quando o checklist pede.
82
- Nada em segundo plano, nada de laço de espera. NUNCA `git checkout --`: descarta trabalho
83
- não commitado.
84
- Com stack no ar, navegue os fluxos da feature e confira console/network.
85
- Limite de turnos: a ~70% sem terminar, grave o relatório com `PARCIAL` na 1ª linha e SEM
86
- `**Verdict:**`; o relatório final substitui o parcial.
87
- ```
88
- Tipo `morph-evaluator` não registrado: `general-purpose` com o campo `persona` do `evaluator`
89
- (`.morph/framework/agents.json`) no topo do prompt, e registre o fallback no review-report.
90
-
91
- **Ao retomar o controle — higiene antes de ler o veredito.** Rode `morph-spec report-check {feature} --json`:
92
- - `tree.sinceBeforeEval.changed` vazio e `tree.markers` vazio = árvore como antes do dispatch.
93
- Arquivo listado = mutação que ficou no disco: `morph-spec mutate --restore` devolve os bytes do
94
- snapshot conferindo md5; fora de uma rodada de mutação, desfaça linha a linha pelo diff.
95
- **NUNCA `git checkout -- src/` aqui**: o checkout apaga junto tudo o que não foi commitado depois
96
- da prova (correção de bloqueador, trabalho de outra sessão), e no verify local a feature pode nem
97
- ter commit.
98
- - `tree.sinceBeforeEval` `null` = sem foto; `tree` `null` = git não respondeu, nada foi conferido.
99
- - Não rode build/teste enquanto o agente está `running`.
100
-
101
- Depois leia `4-review/evaluator-report.md` e rode `morph-spec worktree reap --json`.
102
-
103
- **PARCIAL** (`evaluator.partial: true`): não leia veredito dele e não re-despache frio — retome o
104
- MESMO avaliador por `SendMessage`, colando `tree.dirty` e `tree.commits` no recado. Só se o id não
105
- retomar, despache um novo.
106
-
107
- 5. **Bloqueadores.** `**Verdict:** FIX` ou bloqueador aberto: corrija (loop da `morph-apply`), commite, rode o
108
- `verify {feature} --ci` de novo e **confirme só os bloqueadores** retomando o MESMO avaliador por `SendMessage`
109
- (com `tree.dirty`/`tree.commits` e uma foto `--before-eval` nova). Ele não reavalia a feature
110
- inteira, e **nota nunca motiva nova rodada**. Avaliador encerrado: despache um novo dizendo que
111
- é uma confirmação dos bloqueadores Bn — o relatório é append-only e vale o último `**Verdict:**`.
112
-
113
- 6. **`4-review/review-report.md`**, curto:
114
- - **`**Reviewed-SHA:** {git rev-parse HEAD}`** — obrigatório. O `approve` recusa se o HEAD andou
115
- depois do review.
116
- - `**Veredito:** SHIP|FIX` e a tabela de bloqueadores do evaluator-report (vazia = `Nenhum.`).
117
- - Runtime: nó `e2e` (`pass`/`fail`/`skip` + razão por extenso) e o que foi navegado.
118
- - Notas não bloqueantes, numa lista.
119
-
120
- 7. **Gate 3.** Rode `morph-spec gate-check {feature} review [--json]` — ele lê o veredito do
121
- evaluator-report e os demais sinais do disco e decide. Violação das verificações mecânicas entra
122
- por `--signals '{"standardsViolations":[...]}'`. Forçar a passagem apesar de uma pausa:
123
- `morph-spec gate-decision {feature} review --pause false --reason "..."` (explícito e registrado).
124
- Nunca edite `feature.json` à mão.
125
-
126
- **`pause === true`** → `AskUserQuestion`:
127
- ```
128
- question: "Gate 3 — Review de {feature} aprovado?{ reason ? ' Sinal: ' + reason : '' }"
129
- header: "Gate 3"
130
- options:
131
- - { label: "aprovado, fechar feature", description: "Próximo passo: morph-spec finish --pr|--merge (morph-apply §6)" }
132
- - { label: "preciso ajustar", description: "Apontar correções antes de fechar" }
133
- - { label: "rollback", description: "Voltar para implement" }
134
- ```
135
- **`pause === false`** → resumo de 3 linhas (veredito, runtime, bloqueadores: 0) e
136
- `morph-spec approve {feature} review --mode auto`. A pergunta nomeia a feature: é por ela que o
137
- hook `state-sync` grava a aprovação.
138
-
139
- Fechar não é desta skill: `finish {feature} --pr|--merge` (`morph-apply` §6). `--pr` deixa a
140
- feature `aguardando-merge` até o merge.
141
-
142
- ## Output esperado
143
- - `4-review/evaluator-report.md` — veredito e bloqueadores do avaliador independente (retorno autoritativo)
144
- - `4-review/review-report.md` — síntese com `Reviewed-SHA`
145
- - Gate 3 registrado em `feature.json` via `approve` ou pelo hook `state-sync`
20
+ - Comando em **primeiro plano**, com timeout. Só o `verify {feature}` de projeto grande passa do teto
21
+ de 10 min do Bash: aí `run_in_background` e espere a notificação. Nunca `sleep`/`until`.
22
+ - **Bloqueio de ambiente não é laço.** Slot pesado ocupado (exit 3 / `busy`), Docker fora: tente
23
+ **uma** vez mais; persistiu, siga — o `gate-check` pausa com a razão. Nunca agende retentativas.
24
+
25
+ ## 1. Relatórios já íntegros?
26
+ `morph-spec report-check {feature} --json` (sem fatia) — também em sessão retomada: retomar não
27
+ reseta este passo. Leia `reviews.verifier|reviewer|security`: `complete` → **não re-despache** esse
28
+ papel; `partial: true` → passo 4 (PARCIAL); ausente → despache no passo 3.
29
+
30
+ ## 2. Prova da suíte — uma rodada
31
+ Commite o trabalho da feature (`git add <paths>` + `git commit`) e rode
32
+ `morph-spec verify {feature} --ci --json` com `run_in_background`. Ele empurra a branch, espera o run
33
+ e grava o stamp do artefato que o run publicou; sem CI, roda local e diz por quê.
34
+ **Sem `--filter`, sempre**: o Gate 3 roda a suíte inteira. Esta é a única execução de testes do Gate 3 — nenhum agente
35
+ roda a suíte de novo. `repeatOf` no JSON = nada mudou, use aquela rodada; `reason: "stamp-reused"` = sem CI e
36
+ nada fora de `.morph/` andou desde o último verify verde: ele vale, não rode de novo.
37
+ - **Quando a saída mostrar `CI rodando`, despache (passo 3) sem esperar o fim**: o push e o
38
+ workflow já estão commitados e a foto da árvore não os acusa. Saiu `verify local`: espere o fim
39
+ antes do passo 3 — suíte local e `mutate` disputam a máquina. Exit 2 = trabalho fora de commit.
40
+ - Nó `e2e`: `pass` local → `morph-spec e2e status {feature} --json` → `baseUrl` vai ao verificador.
41
+ `fail` → correção (CI: `gh run view <id> --log-failed`). `skip` → quem classifica é o `gate-check`
42
+ (`classifyE2eSkip`): dispensa de projeto passa; ambiente, `--skip-e2e` ou razão desconhecida pausam.
43
+ - `traceability.warnings` do verify vão ao revisor como sinal.
44
+
45
+ ## 3. Dispatch — verificador ∥ revisor (∥ segurança)
46
+ `morph-spec report-check {feature} --before-eval --json` tira a foto da árvore e diz quem despachar:
47
+ `reviewModels.verifier.model` (opus com prompt/modelo ou mídia), `reviewModels.security.required`.
48
+ Anote `base` (merge-base com a default) e `sha` (`git rev-parse HEAD`). Blast radius: para cada
49
+ símbolo público do diff, `morph-spec graph affected <símbolo> --prod --json`; sem grafo
50
+ (`no-graph`/`not-found`/`ambiguous`), siga sem o blast radius — o revisor cai para `git grep` — e
51
+ registre a ausência no recado a ele. Cada agente nasce com contexto fresco e **nunca recebe relatório anterior** (ancoragem).
52
+ Despache todos na mesma resposta:
53
+ ```
54
+ dispatch Agent (subagent_type: "morph-verifier", model: {reviewModels.verifier.model}) with prompt:
55
+ feature, base, sha, JSON do verify (nós, e2e, URL) se já terminou, 1-design/mockups.md e
56
+ 3-implement/evidencias/*.md se existirem. Grave .morph/features/{feature}/4-review/verifier.md.
57
+ Não rode `morph-spec mutate` até eu avisar que revisor e segurança terminaram.
58
+ NUNCA `git checkout --`: descarta trabalho não commitado.
59
+ dispatch Agent (subagent_type: "morph-reviewer") with prompt:
60
+ feature, base, sha, blast radius (ou a ausência dele), traceability.warnings.
61
+ Grave .morph/features/{feature}/4-review/reviewer.md.
62
+ dispatch Agent (subagent_type: "morph-security") with prompt: ← só com security.required
63
+ feature, base, sha, reviewModels.security.reasons. Grave .morph/features/{feature}/4-review/security.md.
64
+ ```
65
+ O prompt leva só os campos acima. O que você notou no loop chega ao revisor como
66
+ `traceability.warnings` ou como item da `## Errata` do plano, nunca como lista solta de "fatos do
67
+ loop": é histórico da conversa (MORPH §6) e ancora quem nasceu para olhar sem ele.
68
+ O contrato fixo (o que provar, `**Reviewed-SHA:**` obrigatório, formato, PARCIAL, read-only) mora no
69
+ corpo de cada persona e em `.morph/framework/evals/review-checklist.md`. Tipo não registrado:
70
+ `general-purpose` com o campo `persona` de `.morph/framework/agents.json` no topo do prompt.
71
+
72
+ Revisor e segurança voltaram: diga ao verificador, por `SendMessage`, que a mutação está liberada —
73
+ opcional, no máximo 3 mutantes com `expect`, só para guarda sem teste que a morda (review-checklist).
74
+ Achou o teste por leitura: não rode.
75
+
76
+ ## 4. Ao retomar — higiene antes de ler o veredito
77
+ Não rode build nem teste enquanto um agente está `running`. Com todos de volta,
78
+ `morph-spec report-check {feature} --json`:
79
+ - `tree.sinceBeforeEval.changed` vazio e `tree.markers` vazio = árvore como antes do dispatch.
80
+ Arquivo listado = mutação que ficou no disco: `morph-spec mutate --restore` devolve os bytes do
81
+ snapshot; fora de uma rodada de mutação, desfaça linha a linha pelo diff.
82
+ **NUNCA `git checkout -- src/` aqui**: o checkout apaga junto tudo o que não foi commitado depois
83
+ da prova (correção de bloqueador, trabalho de outra sessão).
84
+ - `tree.sinceBeforeEval` `null` = sem foto; `tree` `null` = git não respondeu.
85
+
86
+ Depois leia os relatórios e rode `morph-spec worktree reap --json`.
87
+
88
+ **PARCIAL** (`reviews.<papel>.partial: true`): não leia veredito dele e não re-despache frio —
89
+ retome o MESMO agente por `SendMessage`, colando `tree.dirty` e `tree.commits`. Só se o id não
90
+ retomar, despache um novo.
91
+
92
+ ## 5. Bloqueadores
93
+ O avaliador também erra: **antes de editar, reverifique cada bloqueador no código** — evidência que
94
+ não se reproduz vira pergunta ao mesmo agente, não correção. Confirmado: corrija (loop da
95
+ `morph-apply`), commite, rode o `verify {feature} --ci` de novo e uma foto `--before-eval` nova.
96
+ Retome por `SendMessage` TODO agente exigido, com o `sha` novo e `tree.dirty`/`tree.commits`: quem
97
+ abriu bloqueadores **confirme só os bloqueadores** (retomando o MESMO agente que os abriu); os outros
98
+ julgam só o delta `{sha anterior}..{sha novo}` — o que a correção abriu. `reviewModels.security.required`
99
+ virou `true` agora: despache a segurança. Ninguém reavalia a feature inteira, e **nota nunca motiva
100
+ nova rodada**. Agente encerrado: despache um novo dizendo que é uma confirmação — o relatório é
101
+ append-only e vale o último `**Verdict:**`. Cada relatório carrega o `**Reviewed-SHA:**` —
102
+ obrigatório: o `approve` recusa quando o código andou depois de QUALQUER um deles.
103
+
104
+ ## 6. Gate 3
105
+ `morph-spec gate-check {feature} review [--json]` lê os relatórios exigidos, a cobertura dos `Cn` e
106
+ os demais sinais do disco. Violação das verificações mecânicas entra por
107
+ `--signals '{"standardsViolations":[...]}'`. Forçar a passagem apesar de uma pausa:
108
+ `morph-spec gate-decision {feature} review --pause false --reason "..."`. Nunca edite `feature.json`.
109
+
110
+ **`pause === true`** → `AskUserQuestion`:
111
+ ```
112
+ question: "Gate 3 — Review de {feature} aprovado?{ reason ? ' Sinal: ' + reason : '' }"
113
+ header: "Gate 3"
114
+ options:
115
+ - { label: "aprovado, fechar feature", description: "Próximo passo: morph-spec finish --pr|--merge (morph-apply §8)" }
116
+ - { label: "preciso ajustar", description: "Apontar correções antes de fechar" }
117
+ - { label: "rollback", description: "Voltar para implement" }
118
+ ```
119
+ **`pause === false`** → resumo de 3 linhas (vereditos, cenários provados, bloqueadores: 0) e
120
+ `morph-spec approve {feature} review --mode auto`. A pergunta nomeia a feature: é por ela que o hook
121
+ `state-sync` grava a aprovação. Fechar é da `morph-apply` §8.
146
122
 
147
123
  ## Referências
148
- - `.morph/framework/evals/review-checklist.md` — o que o avaliador procura e o formato do relatório
124
+ - `.morph/framework/evals/review-checklist.md` — o que cada papel procura e o formato dos relatórios
149
125
  - `morph-spec verify|mutate|report-check|gate-check` — `.morph/framework/CLI.md`
150
- - `.morph/framework/MORPH.md` §5 — sinais do Gate 3
@@ -1,64 +1,52 @@
1
1
  ---
2
2
  name: morph-standards
3
- description: Localiza um standard específico via busca server-side (morph-spec standards --find) e carrega só o necessário
3
+ description: Localiza um standard específico via busca server-side (morph-spec standards --find) e carrega só a seção necessária (--show id#âncora)
4
4
  version: core
5
5
  when_to_use: Use quando precisar consultar um standard específico durante a implementação
6
6
  user-invocable: true
7
- cliVersion: "8.47.0"
7
+ cliVersion: "9.0.0"
8
8
  ---
9
9
 
10
10
  # morph-standards
11
11
 
12
12
  ## Objetivo
13
- Encontrar o standard certo para a situação atual e carregar apenas o necessário no contexto.
14
- Nunca abra o `STANDARDS.json` inteiro (mais de 150 KB) — a busca server-side já devolve o suficiente
15
- para aplicar o standard na maioria dos casos.
13
+ Achar o standard certo para a fatia e pôr no contexto só o trecho que ela precisa. Nunca abra o
14
+ `STANDARDS.json` inteiro.
16
15
 
17
16
  ## Quando invocar
18
- Quando durante a implementação surgir uma dúvida de padrão arquitetural, de contrato, de qualidade
19
- ou de teste — e o `spec.md` e os standards da task não bastarem para resolver.
17
+ Durante a implementação, quando surgir dúvida de padrão (arquitetura, contrato, qualidade, teste)
18
+ que o `plan.md` e os standards da fatia não resolvem.
20
19
 
21
20
  ## O que fazer
22
21
 
23
- 1. Rode a busca server-side — é O caminho, não uma opção entre várias:
22
+ 1. **Digest.** Busque no servidor:
24
23
  ```
25
- morph-spec standards --find "<domínio/tecnologia da task>" [--category <cat>] [--tags <a,b>] [--json]
24
+ morph-spec standards --find "<domínio/tecnologia da fatia>" [--category <cat>] [--tags <a,b>] [--json]
26
25
  ```
27
- Devolve o **top 3** como `id · path · digest` — o `digest` é um resumo do standard (~700 chars),
28
- não o texto completo; na maioria dos casos ele já basta para aplicar o padrão, sem abrir o `.md`.
26
+ Devolve o top 3 com `id`, `path`, `digest` e as chaves de âncora. O digest é um resumo, não o
27
+ texto do standard: serve para decidir se o standard se aplica e muitas vezes basta para aplicá-lo.
29
28
 
30
- 2. Se dois resultados parecerem relevantes e houver conflito, adote o mais específico ao stack
31
- do projeto. Registre o conflito no `decisions.md` da feature.
32
-
33
- 3. Abra o arquivo `.md` do standard (campo `path`) só quando o `digest` não bastar para resolver
34
- a dúvida — ex.: precisa de um exemplo de código completo ou de uma seção que o resumo não cobre.
35
-
36
- 4. Aplique o standard na tarefa atual.
37
-
38
- 5. Registre no `recap.md`: qual standard foi consultado (via `--find`, ou navegação — item abaixo)
39
- e como foi aplicado.
29
+ 2. **Seção.** O digest não bastou → leia só a seção que importa:
30
+ ```
31
+ morph-spec standards --show <id>#<âncora>
32
+ ```
33
+ A âncora é uma das chaves que o `--find` listou, ou o slug de qualquer heading do `.md`.
34
+ `morph-spec standards --show <id>` mostra o digest e a tabela de âncoras.
40
35
 
41
- ## Fallback — navegação exploratória
36
+ 3. **Arquivo inteiro** (campo `path`, sob `.morph/framework/standards/`) só quando a fatia toca o
37
+ standard todo ou precisa de um exemplo que nenhuma seção isolada traz.
42
38
 
43
- `--find` exige uma query. Quando a necessidade é genuinamente exploratória (ex.: "o que existe
44
- pra categoria X?", sem um termo de busca claro), nesta ordem:
39
+ 4. Dois standards em conflito → adote o mais específico ao stack do projeto.
45
40
 
46
- 1. `morph-spec standards` sem `--find` — lista categorias + contagem, custo mínimo, o suficiente
47
- pra decidir qual `--category` usar num `--find` em seguida.
48
- 2. Só se isso não bastar, abra `.morph/framework/standards/STANDARDS.json` inteiro — último recurso,
49
- nunca o primeiro passo.
41
+ 5. Registre no `**Standards:**` do relatório da fatia (`3-implement/reports/F{n}.md`) qual standard (e qual âncora) aplicou e, havendo, o conflito.
50
42
 
51
- ## Quando não há standard adequado
52
- Registre no `decisions.md` que nenhum standard cobre o caso.
53
- Descreva o critério adotado e sinalize para revisão futura.
54
- Não invente um standard — padrões não documentados são dívida técnica.
43
+ ## Sem query clara
44
+ `morph-spec standards` sem flag lista categorias e contagens; use para escolher o `--category` de
45
+ um `--find` em seguida.
55
46
 
56
- ## Output esperado
57
- - Standard identificado (via `--find`/digest, ou `.md` completo quando necessário) no contexto
58
- - Critério de implementação claro para a tarefa atual
59
- - Entrada no recap.md registrando o standard consultado
47
+ ## Quando nenhum standard cobre o caso
48
+ Registre no relatório da fatia o critério adotado. Não invente standard: padrão não documentado é dívida.
60
49
 
61
50
  ## Referências
62
- - `morph-spec standards --find "<query>" [--category] [--tags] [--json]` — busca server-side, top 3 `id · path · digest`
63
- - `.morph/framework/standards/STANDARDS.json` — índice completo; abrir só como fallback exploratório (ver acima)
64
- - `.morph/framework/MORPH.md` — seção 4 (Como consultar Standards)
51
+ - `.morph/framework/CLI.md` — seção `standards` (flags, `--json`, falhas)
52
+ - `.morph/framework/MORPH.md` — §4 (Como consultar Standards)