@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,260 +1,187 @@
1
1
  ---
2
2
  name: morph-apply
3
- description: Orquestra a execução autônoma de tasks de uma feature morph-spec. Analisa DAG de dependências em tasks.json e decide adaptativamente entre execução sequencial (auto-advance) ou paralela (Agent dispatch). Termina com morph-review e Gate 3.
3
+ description: Executa as fatias do plano de uma feature morph-spec — dispatch por persona, em ondas paralelas do plan-check, com relatório por fatia — prova a feature com um verify sem filtro e entrega à morph-review (Gate 3).
4
4
  version: core
5
- when_to_use: Use quando chegar a instrução "use /morph-apply" ou "implementar feature" com o Gate 2 aprovado
5
+ when_to_use: Use com o gate do plano aprovado, em "use /morph-apply {feature}" ou "implementar feature"
6
6
  user-invocable: true
7
- cliVersion: "8.47.0"
7
+ cliVersion: "9.0.0"
8
8
  ---
9
9
 
10
10
  # morph-apply
11
11
 
12
12
  ## Objetivo
13
13
 
14
- Levar toda task pendente a `done` — `verify` da task verde e `doneCriteria` atendido — e fechar
15
- com `morph-review` + Gate 3.
16
-
17
- ## Quando invocar
18
-
19
- Gate 2 aprovado (`feature.json → approvalGates.plan.approved`), ou o usuário pede "use /morph-apply
20
- {feature}". Sem argumento: a feature `in_progress` mais recente.
14
+ Toda fatia de `2-plan/checks.json` com relatório final em `3-implement/reports/F{n}.md`, o
15
+ `verify` da feature verde, e a entrega à `morph-review`. O progresso **é** o conjunto de
16
+ relatórios (ausente = pendente, `PARCIAL` na 1ª linha = parcial, senão feito): não há arquivo de
17
+ status para editar.
21
18
 
22
19
  ## Ritmo
23
20
 
24
21
  Comando em primeiro plano; o `verify {feature}` que passa do teto de 10 min do Bash vai com
25
- `run_in_background` e espera a notificação de término. `verify` com exit 3 (`status: "busy"`) já esperou a fila pesada
22
+ `run_in_background` e espera a notificação de término **no mesmo turno**: nunca encerre o turno
23
+ com o verify da feature rodando — o stamp que o Gate 3 lê é o dele. `verify` com exit 3 (`status: "busy"`) já esperou a fila pesada
26
24
  pelo timeout dela: no máximo uma chamada nova; persistiu, pare e avise o usuário — a máquina está
27
25
  saturada (skill `morph-machine`). Nunca `sleep`/`until` nem retentativa agendada.
28
26
 
29
- ## Fluxo
27
+ ## 1. Contexto, uma vez
30
28
 
31
- ### 1. Carregar contexto
29
+ Read em `2-plan/plan.md` e `2-plan/checks.json` uma vez por sessão (ou depois de um `/compact`):
30
+ o plano está congelado desde o gate, então não releia por padrão — só o trecho que falta.
31
+ Antes do primeiro dispatch: `.morph/config/config.json` sem `project.stack` ou `project.tests` →
32
+ declare-os a partir dos comandos de baseline do `## Contrato de implementação` e commite junto com o
33
+ `.gitignore` que o `plan-check` semeou (`bin/`/`obj/` num projeto .NET) — antes de qualquer código. Não há comando de
34
+ CLI para isso: uma edição no `config.json` na forma de `.morph/framework/schemas/config.schema.json`
35
+ (`project.tests[]` com `id` e `command`; `project.stack` com as tags unidas por `+`, ex. `dotnet+nextjs`;
36
+ mais de uma solução .NET no repositório → `project.backendPath` com a pasta da que o build compila), conferida
37
+ por `morph-spec doctor --full`.
38
+ `morph-spec plan-check {feature}` imprime as **ondas**: fatias de uma onda não dependem uma da
39
+ outra nem tocam o mesmo arquivo, até 4 por onda.
32
40
 
33
- `.morph/config/config.json → trust` e Read em `2-plan/tasks.json` (ids, `dependencies`, `effort`,
34
- `group`, `status`, `doneCriteria`).
41
+ ## 2. Fatiar
35
42
 
36
- ### 2. Análise de DAG — sequencial vs paralelo
43
+ - Uma onda por vez, até **4 agentes ao mesmo tempo**, um por fatia, `subagent_type: "morph-{id}"` (o `persona:` da fatia).
44
+ - Duas fatias em voo que escrevem o mesmo arquivo: a segunda vai em worktree (§4), rolling.
45
+ - Fatias em paralelo na mesma árvore commitam pela lista explícita de arquivos (`git add <paths>`), nunca um diretório: `git add api` leva o arquivo que a fatia vizinha acabou de escrever.
46
+ - **Inline** só para fatia pequena no domínio já carregado, com **uma linha de porquê** no relatório.
47
+ Antes de codar, leia os standards que a fatia fixa. Inline também grava `3-implement/reports/F{n}.md`,
48
+ no formato abaixo — é ele que conta o progresso.
37
49
 
38
- ```
39
- morph-spec dag {feature}
40
- ```
50
+ O hook `validate-completion` (no Stop) e o `report-check` cobram o relatório pela mesma régua
51
+ (`inspectReport`); conhecer o formato antes evita reescrever o relatório depois de dar a fatia por feita:
41
52
 
42
- Ele lê `dependencies`, `group` e `effort` (S=1, M=2, L=4, XL=8) e imprime a decisão:
43
- - ≤ 3 tasks → **sequencial**.
44
- - ≥ 2 fluxos de domínio independentes com peso (backend ‖ frontend) → **um sub-agent por fluxo, em
45
- paralelo** (§3b); cadeia longa vai inteira ao agente do fluxo.
46
- - ≥ 3 raízes independentes de effort ≥ M → raízes em **paralelo**, o resto sequencial.
47
- - Senão, sequencial com auto-advance. Raiz S roda `inline`.
53
+ ```markdown
54
+ # F{n} — {título}
48
55
 
49
- `isolation.recommended: "worktree"` (dois fluxos escrevem o mesmo path) → §3b-w. O DAG decide
50
- quantas tasks ao mesmo tempo; o `morph-implement` §4 decide quem executa cada uma —
51
- `DAG: sequencial` não significa "tudo inline". Registre a linha de decisão que o comando imprimiu.
56
+ {2-3 frases: o comportamento entregue, onde mora e como foi provado}
52
57
 
53
- ### 3a. Modo Sequencial (auto-advance)
58
+ **Arquivos:** `{path}`, `{path}`
54
59
 
55
- ```
56
- while (true):
57
- ready = tasks 'pending' com todas as dependencies 'done' (releia tasks.json)
58
- if ready vazio: break
59
- task = ready[0]
60
- marcar task.status = 'in_progress' (Edit, só campos mutáveis)
61
-
62
- attempt = 0; feedback = null; pronto = false
63
- while attempt < 3:
64
- attempt += 1
65
- // attempt 1: invoke Skill(morph-implement) with task. Nas seguintes, aplique o
66
- // feedback direto ao código — reinvoque a skill só depois de /compact ou numa
67
- // sessão nova, que descartam o conteúdo dela.
68
- implementar (ou corrigir com feedback)
69
-
70
- // OUTPUTS ANTES DO VERIFY: o recorte por task lê `outputs`.
71
- atualizar task.outputs em tasks.json (divergiu do plano → `notes` na mesma edição)
72
-
73
- run: morph-spec verify {feature} {task.id} --json
74
- if verify.status == 'fail':
75
- feedback = verify.feedback; continue // conta como tentativa
76
- // 'busy': ver "Ritmo"
77
-
78
- // cada doneCriteria com a evidência que o prova (teste, arquivo:linha) — do
79
- // relatório `reports/{task.id}.md` quando despachada, do seu código quando inline
80
- faltando = critérios sem evidência
81
- if faltando: feedback = faltando; continue
82
- pronto = true; break
83
-
84
- if pronto:
85
- // task com `3-implement/evidencias/{id}.md` em `outputs`: confira o arquivo antes do `done`
86
- // (morph-implement §5). Em batch paralelo sem isolamento o sub-agente não roda eval — o
87
- // ORQUESTRADOR roda, após o batch, `morph-spec verify {feature} --filter {id-do-nó-evals} --skip-e2e --no-persist`
88
- marcar task.status = 'done' (Edit; confirme os outputs reais)
89
- else:
90
- // 3 tentativas sem verify verde + critérios: a única pausa do loop
91
- registrar no recap as tentativas e o que faltou
92
- AskUserQuestion: "Task {id} sem verify verde e critérios atendidos após 3 tentativas — aceitar, continuar tentando, ou pular?"
93
- options: [aceitar (done com ressalva no recap), continuar (+3 tentativas), pular (blocked)]
94
- ```
60
+ **Checks:** C{n} — {teste que prova, ou `arquivo:linha`}
95
61
 
96
- > **O recorte é do loop por task.** `verify {feature} {task.id}` deixa o `group` escolher os nós e
97
- > os arquivos de teste de `outputs` estreitarem o comando; cada nó aparece em
98
- > `nodes.tests.runs[]` com `selection` e o motivo. `--filter {ids}` só força a escolha de nós (um
99
- > filtro que não casa nada é erro de uso, exit 2); `--full` desliga o recorte. A verificação
100
- > pós-batch e a do Gate 3 rodam **sem filtro**, e `verify {feature}` **nunca recorta**. Detalhe:
101
- > `.morph/framework/CLI.md`, seção "Suítes de teste".
62
+ **Standards:** `{id}`, `{id}`
63
+ ```
102
64
 
103
- > **Não há juiz LLM por task.** O que o código determinístico prova (build, testes, validadores)
104
- > está no verify; o que ele não prova — o critério do use case — se confere contra o `doneCriteria`,
105
- > com evidência. Estilo e estrutura são assunto do avaliador do Gate 3, e mesmo lá só como nota.
65
+ `**Arquivos:**` lista todo arquivo criado ou modificado; cada `C{n}` que a fatia `cobre` aparece pelo
66
+ id; relatório que abre com `PARCIAL` não conta como feito. Os relatórios **são** o registro da
67
+ implementação (não há `recap.md`): o `verify` confere a união dos `**Arquivos:**` contra os
68
+ `arquivos:` das fatias (aviso, nunca reprova). `**Standards:**` nomeia os ids que o agente de fato
69
+ consultou (o `report-check` não o exige).
70
+ - Persona não registrada: `general-purpose` com o campo `persona` de `agents.json` colado, e
71
+ `dispatch-fallback: general-purpose ({id} não registrado)` no relatório.
106
72
 
107
- ### 3b. Modo Paralelo (para o subset independente)
73
+ ## 3. Dispatch — só o que muda
108
74
 
109
- Escope cada agente ao domínio: `subagent_type: "morph-{task.agent}"` e `task.standards` (carimbados
110
- pelo `morph-plan`). Plano legado sem `agent`: escolha em `.morph/framework/agents.json` por
111
- `domains`. Tipo não registrado: `general-purpose` com o campo `persona` colado, e
112
- `dispatch-fallback: general-purpose ({id} não registrado)` nas `notes`. Cap de 4 agentes ao mesmo
113
- tempo. **Cole o template literal** — só os campos entre `<>` mudam:
75
+ O contrato fixo (relatório, estado, teste, escopo, `wip`, processos, reuso, mutação e o formato do
76
+ relatório) está no corpo da persona gerada e chega a todo dispatch sem ser colado. O prompt leva:
114
77
 
115
78
  ```
116
79
  dispatch Agent (subagent_type: "morph-{id}") with prompt:
117
- contexto: spec.md, use cases da task, description completa, doneCriteria,
118
- task.reuse (REUSAR/ESTENDER/CRIAR por conceito), os paths dos alvos
119
- de reuso e o que você já leu (`arquivo:linhas` + o trecho)
120
- standards: <por standard: id + digest do `standards --find` + as 3-8 regras do
121
- .md que ESTA task aplica, coladas; o path só para consulta pontual>
122
- instrução: |
123
- Implemente esta task (ou cadeia de tasks do fluxo) sem depender do trabalho
124
- dos outros agentes deste batch: seu isolamento é de estado e de árvore de
125
- trabalho, nunca de conhecimento do codebase. Antes de criar tipo,
126
- componente, hook ou serviço NOVO, verifique se já existe: `morph-spec graph
127
- explain <nome>` e `graph affected <conceito> --uses-only`; sem grafo
128
- (`no-graph`), caia para `grep -rn "<nome>"` e siga — a ausência de grafo
129
- nunca bloqueia. Se criar mesmo assim, diga por que em uma linha no relatório.
130
-
131
- Leitura e turnos: cada turno custa ~10 s antes de a tool rodar, e o teto de
132
- turnos corta sem aviso. Chamadas que não dependem uma da outra vão no MESMO
133
- turno: leia de uma vez todos os arquivos que este prompt lista, dispare os
134
- Grep juntos. Use Read/Grep/Glob — nunca `grep`, `sed -n`, `cat`, `find`,
135
- `ls` via Bash. Não releia o que este prompt já traz. Em arquivo grande, `Grep`
136
- acha a linha e `Read` com `offset`/`limit` lê só o trecho; log de build/teste
137
- se lê pelo `Grep` do erro, não inteiro.
138
-
139
- Ferramentas: antes de supor a API de uma biblioteca (MAF, EF Core, Next,
140
- shadcn, SDK de provedor), consulte o MCP `context7` (`resolve-library-id` →
141
- `query-docs`). Impacto e vizinhança de símbolo vêm do grafo
142
- (`morph-spec graph`). Tool `mcp__…` não carregada se carrega com `ToolSearch`
143
- (`select:<nome>`); MCP ausente nunca bloqueia — siga com o fallback.
144
-
145
- Comentário: o padrão é nenhum. Nome, tipo e teste explicam o código; sem
146
- `///`/JSDoc em membro de aplicação, cabeçalho, banner de seção ou história
147
- da task. Só o porquê que o código não mostra, em uma linha
148
- (`architecture-code-comments`). O elo com a pós-condição vai no nome do
149
- teste. O hook `comment-guard` bloqueia a edição que adiciona história,
150
- banner ou bloco longo. Não modifique spec.md.
151
-
152
- Contrato do relatório final:
153
- 1. GRAVE um relatório por task em
154
- `.morph/features/{feature}/3-implement/reports/{taskId}.md` ANTES de
155
- encerrar — é o retorno autoritativo. NÃO chame SendMessage.
156
- 2. NÃO toque em tasks.json, feature.json, state.json nem no board de
157
- sessão — todo estado é gravado exclusivamente pelo orquestrador.
158
- 3. TESTE — a prova é do orquestrador (`morph-spec verify`), não sua.
159
- Testes pelo orçamento: um por pós-condição, um de regressão por bug,
160
- variantes numa tabela. NÃO rode teste a cada marco nem faça ciclo
161
- red→green: compile e rode SÓ o filtro dos seus testes UMA vez, em
162
- primeiro plano, saída em arquivo
163
- (`… > .morph/logs/test-last.log 2>&1`). Não rode `morph-spec verify`.
164
- Batch SEM isolamento: só compile. Com `isolation: "worktree"`: o mesmo
165
- dentro do seu worktree, e o último ato é o commit na branch dele —
166
- nunca faça merge.
167
- 4. ESCOPO: no máximo 3 tasks e ~4 arquivos por dispatch. Escopo maior falha e
168
- volta — fatie antes, não depois.
169
- 5. SOBREVIVÊNCIA: o limite de turnos (`maxTurns`, no seu system prompt)
170
- corta sem aviso: commite `wip({taskId})` a cada marco (um arquivo ou
171
- uma fatia coerente escrita), não só ao fim da task — e só os seus arquivos
172
- (`git add <paths>`, nunca `-A`). Sem commit, a retomada recomeça do zero.
173
- A ~70% do limite, grave o relatório parcial no arquivo canônico: `PARCIAL`
174
- na 1ª linha, o feito e o que falta, sem critério dado como atendido. Depois
175
- siga ou pare, por decisão sua; o relatório final substitui o parcial.
176
- 6. PROCESSOS: NUNCA `taskkill /IM node.exe` (derruba os MCPs de todas as
177
- sessões). Encerre dev server pelo PID que você mesmo subiu. Build e
178
- suíte pesados rodam por `morph-spec heavy run -- <comando>`, em primeiro
179
- plano. Exit 3 é fila cheia depois da espera da própria fila: não repita
180
- nem espere em laço — diga no relatório o que não rodou.
181
- 7. RETORNO: o relatório no arquivo canônico é o retorno. `SendMessage` não é
182
- substituto do relatório e não deve ser chamado.
183
- 8. MUTAÇÃO: nunca altere, reverta, mova ou apague código de produção para ver
184
- um teste falhar (`sed`, `mv`, `git show HEAD:… >`, `git stash`, `git
185
- checkout --`). A prova de que o teste morde é do avaliador no Gate 3.
186
-
187
- Formato do relatório: (1) o que foi feito, em 2-3 frases; **Arquivos:** um
188
- item `- \`path\`` por arquivo; **Critérios:** cada doneCriteria — atendido (o
189
- teste ou `arquivo:linha` que o prova) ou não (por quê); (4) problemas.
80
+ Fatia F{n} — <título>
81
+ cobre: <cada Cn com o texto literal do cenário e a `prova:`>
82
+ arquivos: <os `arquivos:` da fatia>
83
+ standards: <por id: o digest de `morph-spec standards --find` + as 3-8 regras que ESTA fatia aplica>
84
+ reuso: <as linhas de `## Reuso` que tocam a fatia — conceito, veredito, alvo>
85
+ contexto: <o que você já leu: `arquivo:linhas` + o trecho; nada que o agente tenha de reler>
86
+ relatório: .morph/features/{feature}/3-implement/reports/F{n}.md (com `**Standards:**`: os ids consultados)
87
+ worktree: <só com isolamento>
190
88
  ```
191
89
 
192
- **Passo pós-dispatch (batch SEM isolamento):** espere todos e rode `morph-spec report-check {feature} {T1} {T2} … --json`
193
- com os ids do batch. O bloco `tree` (`dirty`, `diffstat`, `commits`, `markers`) mostra o disco que
194
- os agentes deixaram; árvore suja sem explicação ou `markers` não vazio vai ao recap. Em
195
- `report-stale`, **não re-despache** — leia `observed` e atualize o relatório. Leia cada
196
- `3-implement/reports/{taskId}.md` (a mensagem do agente é atalho). Depois:
197
- - **`morph-spec verify {feature} --json` uma vez, pós-batch, sem filtro** — os agentes não o rodaram.
198
- Vermelho: corrija ou re-despache com `verify.feedback`.
199
- - Para cada task do batch:
200
- - Se verify verde e critérios atendidos (e `3-implement/evidencias/{taskId}.md` gravada, se a task a deve — checagem do §3a): marcar `done` (Edit, só campos mutáveis).
201
- - Senão: de volta a `pending` com nota — o loop sequencial (§3a) a retoma.
202
-
203
- **`PARCIAL` na 1ª linha = a task não está pronta** — o `report-check` o acusa como `report-incomplete`.
204
- Retome o MESMO agente por `SendMessage`, com
205
- `tree.dirty`, `tree.commits` e o que falta; ou re-despache só o que falta a partir do último `wip`.
206
-
207
- O template é paritário com o do `morph-implement` §4: mesmas 8 cláusulas e o mesmo formato de
208
- relatório (racional em `MORPH.md` §6).
209
-
210
- ### 3b-w. Batch isolado por worktree (quando o dag recomenda)
211
-
212
- 1. **Dispatch:** o template de §3b com `isolation: "worktree"`. O hook `WorktreeCreate` cria
213
- `worktrees/<n>` na branch `morph-task/<n>`, com junctions e `.morph/worktree.env` prontos, a partir
214
- de `morph/<feature>` quando a sessão está nela (fora dela, o prompt abre com
215
- `git merge --ff-only morph/<feature>`). Infra faltando: o agente roda `morph-spec worktree link --all`.
216
- 2. **Rolling, não por onda:** a cada relatório, `report-check {feature} {taskId}`, `git merge --no-ff
217
- <branch>` (conflito → `git merge --abort`, task volta a `pending` com nota), `verify {feature}
218
- {taskId}`, critérios, e despache na hora a task que ficou ready sem colidir com as em voo. Cap
219
- de 4. O `verify {feature}` sem filtro roda uma vez, quando nada mais está em voo.
220
- 3. **Cleanup:** depois de cada retorno e ao fim, `morph-spec worktree reap --json` remove o worktree
221
- `agent-<hex>` que parou limpo e sem commit exclusivo e lista o resto com a razão
222
- (`not-a-registered-worktree` no `remove --target` seguinte = o reaper já o levou). O que sobrar:
223
- `morph-spec worktree remove --target <path>` — NUNCA `git worktree remove` cru, que atravessa as
224
- junctions. `git branch -d morph-task/<n>` das branches integradas.
225
- 4. **Agente morto no meio:** com commit, a branch é retomável; sem, a task volta a `pending`.
226
-
227
- O subagent nunca faz merge, e unidades isoladas e não isoladas não se misturam no mesmo batch.
228
-
229
- ### 4. Conclusão de tasks
230
-
231
- Sem tasks pendentes: invoke `Skill(morph-review)`.
232
-
233
- ### 5. Gate 3
234
-
235
- Apresentado, decidido e aprovado por `morph-review` §7. Ao retomar o controle, **não re-apresente
236
- o gate** nem aprove de novo: siga para o encerramento conforme `gateDecisions.review`.
237
-
238
- ### 6. Encerramento
239
-
240
- - **Contexto antes do `finish`.** Todo `.morph/context/*.md` que descreve um fato que esta feature
241
- mudou tem o **corpo** reescrito para o estado novo; o changelog do documento guarda só data e
242
- motivo. Commite na branch da feature — o `finish` exige a árvore limpa.
243
- - **Fechar:** `morph-spec finish {feature} --pr|--merge`, modo escolhido por `AskUserQuestion`
244
- (header `"Integração"`). `--pr` arquiva e abre o PR, mas só o merge integra: a feature fica
245
- `aguardando-merge` em `list`/`fleet`. Mecânica: `MORPH.md` §2.1/§2.2.
90
+ ## 4. Worktree rolling
91
+
92
+ Com `isolation: "worktree"` o hook `WorktreeCreate` cria `worktrees/<n>` na branch `morph-task/<n>`,
93
+ com junctions e `.morph/worktree.env` prontos (infra faltando: `morph-spec worktree link --all`).
94
+ **Rolling, não por onda:** a cada relatório, `report-check`, `git merge --no-ff <branch>` (conflito →
95
+ `git merge --abort` e a fatia volta a pendente com nota no relatório) e despache na hora a próxima fatia
96
+ que ficou pronta sem colidir com as em voo. Depois de cada retorno, `morph-spec worktree reap --json`
97
+ (`not-a-registered-worktree` no `remove --target` seguinte = o reaper já o levou); o que sobrar sai por `morph-spec worktree remove --target <path> --delete-branch` (já mergeada; o
98
+ `git branch -d` dele recusa trabalho não integrado) — NUNCA `git worktree remove` cru,
99
+ que atravessa as junctions.
100
+
101
+ ## 5. Retomar o controle
102
+
103
+ `morph-spec report-check {feature} F1 F2 … --json` com as fatias que voltaram. **Leia o arquivo de
104
+ relatório, não a mensagem** — a mensagem final pode não chegar ou vir resumida.
105
+
106
+ | Veredito | Ação |
107
+ |---|---|
108
+ | `ok` | siga |
109
+ | `report-stale` | **não re-despache**: o agente escreveu depois de relatar; leia `observed` e atualize o relatório |
110
+ | `report-incomplete` + `resume` | `PARCIAL` na 1ª linha = a fatia não está pronta — o `report-check` o acusa como `report-incomplete`. Retome o MESMO agente por `SendMessage`, colando `tree.dirty`, `tree.commits` e o que falta |
111
+ | `report-incomplete` + `complete-degraded` | complete a partir da mensagem, carimbe DEGRADADO e registre a falha no relatório |
112
+ | `work-landed-report-missing` | não re-despache; grave você o relatório, DEGRADADO |
113
+ | `no-work-no-report` / `report-missing-evidence-unknown` | re-despache uma vez; segunda ausência sem trabalho = escale |
114
+
115
+ Árvore suja sem explicação ou `tree.markers` não vazio vão ao relatório da fatia.
116
+
117
+ ## 6. Verify da feature, uma vez
118
+
119
+ Sem fatia pendente nem em voo, **primeiro o contexto** — antes do verify, para que a prova e o Gate 3
120
+ cubram a árvore que vai ao merge. Todo `.morph/context/*.md` que descreve um fato que esta feature
121
+ mudou tem o **corpo** reescrito para o estado novo, nunca empilhado (valor que ainda vale em algum
122
+ lugar diz onde); o changelog do documento guarda só data e motivo. Mudança estrutural
123
+ (`package.json`, `.csproj`, `next.config.*`, `tsconfig.json`, `docker-compose.yml`) atualiza também
124
+ `.morph/context/README.md` (stack, arquitetura, integrações) e `.morph/config/config.json` (stack,
125
+ arquitetura, integrações, paths). **Commite** o trabalho das fatias e essa atualização de contexto e
126
+ config **antes** do verify: o stamp grava o HEAD, e código ou `config.json` commitado depois dele é
127
+ árvore nova — um terceiro verify.
128
+
129
+ Depois `morph-spec verify {feature} --json`, **sem filtro** — nunca recorte o
130
+ verify da feature. `--filter` é do loop do próprio sub-agente; o Gate 3 e o CI rodam a suíte
131
+ inteira. Nó de teste sem `expectedCount`: acrescente `--record-baseline` a ESTA rodada — ela mede e
132
+ prova de uma vez; nunca um segundo verify só para gravar a baseline. Vermelho: corrija com `verify.feedback` (direto no código, ou re-despachando a fatia dona)
133
+ e rode de novo; **3 tentativas** sem verde → `AskUserQuestion` ("Verify de {feature} vermelho após 3
134
+ tentativas — aceitar com ressalva, continuar tentando, ou parar?").
135
+
136
+ **Cenário que julga saída de LLM** (`prova: eval`): a evidência é rodar, não ler código. Com nó
137
+ `runner: "evals"`: `morph-spec verify {feature} --filter {id-do-nó-evals} --skip-e2e --no-persist`
138
+ (sonda, não prova de gate). Grave `3-implement/evidencias/{Cn}.md`: o cenário literal, o nó, o modelo
139
+ efetivo, a versão ou o hash do prompt (nunca o prompt cru), entrada e saída sem dado pessoal, e o
140
+ veredito com a razão. Não é o `reports/F{n}.md`: aquele diz o que o agente fez; este prova, rodando,
141
+ que a saída atende ao cenário.
142
+
143
+ ## 7. Review
144
+
145
+ Verify verde: `Skill(morph-review)`. O Gate 3 é apresentado, decidido e aprovado por ela; ao retomar o
146
+ controle, **não re-apresente o gate** — siga para o encerramento conforme `gateDecisions.review`.
147
+
148
+ ## 8. Encerramento
149
+
150
+ - **Contexto já foi no §6**, antes da prova. Depois do Gate 3 nada muda `config.json` nem código: a
151
+ árvore integrada é a revisada. Commite na branch da feature o que faltar (relatórios do review) —
152
+ o `finish` exige a árvore limpa.
153
+ - **Fechar:** `morph-spec finish {feature} --pr|--merge`, modo por `AskUserQuestion` (header
154
+ `"Integração"`). `--pr` arquiva e abre o PR, mas só o merge integra: a feature fica
155
+ `aguardando-merge` em `list`/`fleet`.
156
+
157
+ ## Escalada de escopo
158
+
159
+ | Situação | Caminho |
160
+ |---|---|
161
+ | Acréscimo pequeno dentro da fatia | registre no relatório da fatia — sem gate a revogar |
162
+ | **Fato errado**: o plano afirma algo que o código desmente, sem mudar escopo | bloco `## Errata` no FIM do `plan.md`, corpo intacto, append-only |
163
+ | **O escopo mudou** | `morph-spec unapprove {feature} plan --reason "..."`, emende, `plan-check`, re-aprove |
164
+
165
+ Ambiguidade que o plano não cobre não é escalada: resolva pelo lado conservador, registre a decisão sob `## Errata` do `plan.md`
166
+ e siga.
167
+
168
+ ## Arquivo de teste
169
+
170
+ 1. **Analise primeiro** — a IMPLEMENTAÇÃO está errada ou a ESPECIFICAÇÃO do teste está?
171
+ 2. **Corrija a implementação primeiro** — o teste é a especificação; confie nele por padrão.
172
+ 3. **Só mude um arquivo de teste se a própria expectativa estiver errada.**
173
+ 4. **Antes de mudar, explique POR QUE o teste está errado** — qual é o comportamento certo.
174
+
175
+ ## Debugging
176
+
177
+ Causa raiz antes do conserto: reproduza e leia o erro inteiro; erro conhecido de .NET/Next.js →
178
+ `/morph-troubleshoot <palavras>`; **uma hipótese por vez**, cada uma testada pela menor checagem que
179
+ a refutaria; depois de três consertos falhos, nunca tente um quarto sozinho — `AskUserQuestion`
180
+ com a pergunta de desenho que as falhas levantam; confirme com a mesma checagem que reproduziu.
246
181
 
247
182
  ## Anti-padrões
248
183
 
249
- - Paralelo com dependência cruzada entre as tasks do batch.
250
- - Mais de 4 agentes ao mesmo tempo; agente inteiro para raiz S.
251
- - Sub-agent tocando `tasks.json`, `feature.json` ou o board de sessão.
252
- - Editar `spec.md` depois do Gate 2, ou `feature.json` à mão.
184
+ - Mais de 4 agentes ao mesmo tempo, ou duas fatias em voo no mesmo arquivo sem worktree.
185
+ - Sub-agente tocando `plan.md`, `checks.json` ou `feature.json`.
186
+ - Re-despachar sobre `report-stale` ou sobre um `PARCIAL` (retome o MESMO agente).
253
187
  - Rodar teste fora do `verify` no loop do orquestrador: a prova é o verify.
254
-
255
- ## Referências
256
-
257
- - `.morph/framework/MORPH.md` §6 — contrato do relatório final
258
- - `morph-spec dag|verify|report-check|worktree reap` — `.morph/framework/CLI.md`
259
- - `.claude/skills/morph-implement/SKILL.md` §4 — template sequencial paritário
260
- - `.claude/skills/morph-review/SKILL.md` — Gate 3
@@ -2,9 +2,9 @@
2
2
  name: morph-hotfix
3
3
  description: ADW cirúrgico de hotfix — resolve uma queda/bug crítico de produção com prioridade máxima em velocidade, com aprovação humana obrigatória antes do ship.
4
4
  version: core
5
- when_to_use: Use quando chegar "/morph-hotfix {feature}", quando a morph-proposal classificar o pedido como workType hotfix (Passo 0), ou quando o usuário disser "produção caiu / hotfix / urgente" a respeito de um incidente
5
+ when_to_use: Use quando chegar "/morph-hotfix {feature}", quando a morph-plan rotear o pedido como workType hotfix, ou quando o usuário disser "produção caiu / hotfix / urgente" a respeito de um incidente
6
6
  user-invocable: true
7
- cliVersion: "8.47.0"
7
+ cliVersion: "9.0.0"
8
8
  ---
9
9
 
10
10
  # morph-hotfix
@@ -16,7 +16,7 @@ Resolver uma queda ou bug crítico de produção o mais rápido possível — pr
16
16
  ## Quando invocar
17
17
 
18
18
  - Usuário roda `/morph-hotfix {feature}` diretamente.
19
- - `Skill(morph-proposal)` classifica o pedido como `hotfix` no Passo 0 de roteamento e invoca esta skill.
19
+ - `Skill(morph-plan)` roteia o pedido como `hotfix` e invoca esta skill.
20
20
  - Usuário diz "produção caiu", "hotfix", "urgente", "incident", "P0" — sinais que o detector determinístico de `morph-spec create --request` já reconhece.
21
21
 
22
22
  ## Argumentos
@@ -31,7 +31,7 @@ Resolver uma queda ou bug crítico de produção o mais rápido possível — pr
31
31
  morph-spec create {feature} --type hotfix --description "<o incidente: o que quebrou / sintoma>"
32
32
  ```
33
33
 
34
- Carimba `name` (o slug) + `description` (obrigatória no nascimento — descreva o incidente) e os gates `proposal`/`plan` como `approvedBy: "policy:hotfix"`, e cria as pastas `0-proposal/`, `2-plan/`, `3-implement/` num passo só — a feature já nasce em `implement` (fase derivada é gate-aware). Se a feature já existe, siga adiante sem recriar.
34
+ Carimba `name` (o slug) + `description` (obrigatória no nascimento — descreva o incidente) e o gate `plan` como `approvedBy: "policy:hotfix"`, e cria as pastas `2-plan/` e `3-implement/` num passo só — a feature já nasce em `implement` (fase derivada é gate-aware). Se a feature já existe, siga adiante sem recriar.
35
35
 
36
36
  ### 2. Scout — mapa do território (obrigatório)
37
37
 
@@ -41,47 +41,39 @@ Despache o scout com o sintoma reportado, antes de qualquer fix:
41
41
  subagent_type: "morph-scout"
42
42
  ```
43
43
 
44
- **Fallback** (se `morph-scout` não estiver registrado nos subagent types deste projeto): `general-purpose` com o campo `persona` do agente `scout` colado no prompt, **registrando o fallback nas notes da task**.
44
+ **Fallback** (se `morph-scout` não estiver registrado nos subagent types deste projeto): `general-purpose` com o campo `persona` do agente `scout` colado no prompt, **registrando o fallback no `reports/F1.md`**.
45
45
 
46
- Peça ao scout: localizar o root cause provável, os arquivos afetados e o blast radius (o que mais pode quebrar). Ele é read-only (Read/Glob/Grep/Bash somente-leitura): não cole as 8 cláusulas do contrato de implementador (`morph-implement` §4 / `morph-apply` §3b) — commit `wip`, orçamento de teste e limite de tasks não se aplicam a quem não escreve. O prompt dele diz só: não escreve nem reverte nada, e o mapa é a mensagem final (Observado/Inferido, no contrato de citação que a persona já carrega). Você grava o mapa.
46
+ Peça ao scout: localizar o root cause provável, os arquivos afetados e o blast radius (o que mais pode quebrar). Ele é read-only (Read/Glob/Grep/Bash somente-leitura) e o corpo da persona dele já carrega o contrato read-only: o contrato de dispatch dos implementadores — commit `wip`, orçamento de teste, escopo da fatia — não se aplica a quem não escreve. O prompt dele diz só o sintoma: ele não escreve nem reverte nada, e o mapa é a mensagem final (Observado/Inferido, no contrato de citação que a persona já carrega). Você grava o mapa.
47
47
 
48
48
  **Audite o mapa antes do brief.** Grave a resposta do scout em `.morph/features/{feature}/2-plan/scout-map.md` e rode `morph-spec scout-check .morph/features/{feature}/2-plan/scout-map.md --json`. Exit ≠ 0 → descarte o mapa e re-despache o scout **uma** vez com as `failures` no prompt (o mapa novo abre com o motivo); na segunda reprovação, faça você o grep do root cause e siga. Root cause e blast radius que entram no brief se conferem com grep próprio mesmo com o mapa aprovado: sob pressão de hotfix, citação inventada vira um segundo incidente.
49
49
 
50
- ### 3. Hotfix brief (`0-proposal/proposal.md`)
50
+ ### 3. Plano curto (`2-plan/plan.md` → `checks.json`)
51
51
 
52
- Escreva o brief curto (~20 linhas) reutilizando o nome canônico `proposal.md`:
52
+ Escreva o `plan.md` mínimo (~25 linhas) numa única escrita: o hotfix nasce com o gate `plan` carimbado, o `create` não escreve esqueleto e o arquivo congela assim que existe. Gramática completa: `morph-spec plan-check --help`.
53
53
 
54
- - **Sintoma** — o que está quebrado, em produção, agora.
55
- - **Root cause** — o que o scout localizou.
56
- - **Blast radius** — o que mais pode quebrar com o fix.
57
- - **Plano do fix** — a mudança mínima que resolve o sintoma.
54
+ - `## Problema` — o sintoma em produção, o root cause que o scout localizou e o blast radius.
55
+ - `## Cenários` — dois, sempre:
56
+ - **C1** — o sintoma ausente: dado o estado que quebrava, quando a ação que falhava, então o resultado certo. `prova: teste` (ou `e2e`).
57
+ - **C2** — a regressão do blast radius: o que o fix poderia quebrar continua funcionando. `prova: teste`.
58
+ - `## Decisões` com `### Conflitos com o acervo` (`nenhum` vale).
59
+ - `## Fatias` — uma, `### F1 — fix`, com `persona:`, `arquivos:` e `cobre: C1, C2`.
58
60
 
59
- ### 4. Plano mínimo (`2-plan/tasks.json`)
61
+ Rode `morph-spec plan-check {feature}` até zero erro: ele grava `2-plan/checks.json`, que o
62
+ `report-check` e o Gate 3 leem. Não pule esta escrita mesmo sob pressão de tempo.
60
63
 
61
- Escreva um `tasks.json` mínimo validado contra `.morph/framework/schemas/tasks.schema.json`:
64
+ ### 4. Fix cirúrgico
62
65
 
63
- - `T1` — o fix.
64
- - `T2` — verify/regressão do blast radius.
66
+ Implemente a mudança mínima — inline se estiver no domínio já carregado, ou despachando a persona de domínio via `subagent_type: "morph-{id}"` (a `morph-apply` §3 mostra o prompt: só os campos da fatia). Inline ou despachada, a fatia termina em `3-implement/reports/F1.md` com `**Arquivos:**` e `**Checks:**` (C1 e C2 com a evidência). Prioridade: tirar a falha do ar, não refatorar — melhorias de forma (não de correção) vão para o roadmap-fora-hotfix, não para este diff.
65
67
 
66
- Isso liga trace e dag de graça (o hook `trace-autogen` gera o trace a partir do primeiro write de `tasks.json`) — não pule esta escrita mesmo sob pressão de tempo.
67
-
68
- ### 5. Fix cirúrgico
69
-
70
- Implemente a mudança mínima — inline se estiver no domínio já carregado, ou despachando a persona de domínio via `subagent_type: "morph-{id}"` conforme `MORPH.md` §6 se a task cruzar domínio ou tiver esforço L/XL. Prioridade: tirar a falha do ar, não refatorar — melhorias de forma (não de correção) vão para o roadmap-fora-hotfix, não para este diff.
71
-
72
- A task fecha com o `verify` verde e o sintoma reproduzido antes e ausente depois — o objetivo do hotfix é parar a sangria com o menor blast radius, não elegância de arquitetura.
73
-
74
- ### 6. Test loop no blast radius
75
-
76
- Rode a cadeia determinística focada na(s) task(s) do fix, não uma suíte ad-hoc:
68
+ ### 5. Prova
77
69
 
78
70
  ```
79
- morph-spec verify {feature} {task} --json
71
+ morph-spec verify {feature} --json
80
72
  ```
81
73
 
82
- Use `--skip-tests`/`--skip-build` quando fizer sentido para velocidade (ex.: iterar rápido no build antes de rodar a suíte completa), mas o `T2` de verify/regressão do passo 4 precisa fechar verde antes do Gate 3. No escopo de **feature**, `--skip-tests`/`--skip-build` não gravam o stamp `verification` (`reason: 'skip-tests'`/`'skip-build'`): o Gate 3 só lê uma execução completa. Capture a saída real dos testes no `recap.md` — não descreva "testes passaram" sem colar a evidência.
74
+ Sem filtro: é a prova que o Gate 3 lê. Para iterar rápido antes, `--skip-tests`/`--skip-build` servem, mas não gravam o stamp `verification` (`reason: 'skip-tests'`/`'skip-build'`): o Gate 3 só lê uma execução completa. C1 se prova com o sintoma reproduzido antes e ausente depois; capture a saída real no `3-implement/reports/F1.md` — não descreva "testes passaram" sem colar a evidência.
83
75
 
84
- ### 7. Gate 3 — SEMPRE humano
76
+ ### 6. Gate 3 — SEMPRE humano
85
77
 
86
78
  O hotfix nasce com o Gate 3 em `forcedPauseGates` — o Gate 3 pausa **sempre**, mesmo em `trust: auto`. `gate-check` já sabe disso: lê `workType` do disco e `shouldPauseGate` força a pausa antes de checar qualquer outro sinal — rode direto, sem `--signals`:
87
79
 
@@ -89,7 +81,7 @@ O hotfix nasce com o Gate 3 em `forcedPauseGates` — o Gate 3 pausa **sempre**,
89
81
  morph-spec gate-check {feature} review [--json]
90
82
  ```
91
83
 
92
- Escreva `4-review/review-report.md` curto: diff do fix + evidência real de teste (saída do `verify` do passo 6). Depois, **`AskUserQuestion` SEMPRE**:
84
+ Escreva você mesmo `4-review/verifier.md` — o hotfix não despacha verificador nem revisor: `**Verdict:** SHIP|FIX`, `**Reviewed-SHA:** {git rev-parse HEAD}`, `## Checks` com C1 e C2 (`| Cn | PROVADO|NÃO PROVADO|FALHA | evidência |`, a evidência é a saída real do `verify` do passo 5), o diff do fix e `## Bloqueadores` (`Nenhum.` quando não há). Depois, **`AskUserQuestion` SEMPRE**:
93
85
 
94
86
  ```
95
87
  question: "Gate 3 — Hotfix de {feature} pronto para ship?"
@@ -108,9 +100,9 @@ morph-spec approve {feature} review --approver "<nome de quem aprovou>"
108
100
 
109
101
  `--approver` é a única assinatura que passa pelo backstop em headless — as outras rotas de `resolveApprovedBy` (`--mode auto`, e "sem TTY") resolvem para `"auto"` e são recusadas. Ela é **auto-declarada**: o CLI não consegue verificar que houve um humano, só recusa as assinaturas definitivamente não-humanas. Por isso: **nunca invente o nome** — use `--approver` só quando o humano de fato aprovou, senão o backstop do hotfix vira teatro.
110
102
 
111
- ### 8. Pós-gate (o "test loop → ship" de `MORPH.md` §2.1)
103
+ ### 7. Pós-gate (o "test loop → ship" de `MORPH.md` §2.1)
112
104
 
113
- - Rode a suíte completa uma vez: `morph-spec verify {feature}` (sem escopo de task — cobertura da feature inteira, agora que o Gate 3 está aprovado).
105
+ - Se o código mudou depois do verify do passo 5 (ajuste pedido no Gate 3), rode `morph-spec verify {feature}` de novo.
114
106
  - Feche com `morph-spec finish {feature} --pr|--merge` — o mesmo encerramento único das demais features (arquiva commitando dentro de `morph/{f}`, desmonta). Num hotfix urgente o `--merge` (local, direto na default, integra na hora) costuma ser o caminho; use `--pr` quando o fix precisa passar por CI/review antes do merge — mas `--pr` **não integra**: sai com `finished: true` e `integrated: false`, `awaiting: "merge"`. Um hotfix "fechado" por `--pr` ainda não chegou na produção — não relate o incidente como resolvido até o merge. Ver `MORPH.md` §2.2.
115
107
  - Não integre automaticamente — o usuário decide quando e por qual modo (`finish` toca a default ou o remoto). Feature legada sem `morph/{f}`: `finish` roteia para `morph-spec archive {feature}`.
116
108
 
@@ -119,24 +111,23 @@ morph-spec approve {feature} review --approver "<nome de quem aprovou>"
119
111
  - Não pular o scout — mesmo sob pressão, o mapa de blast radius evita um segundo incidente causado pelo próprio fix.
120
112
  - Não auto-aprovar o Gate 3 — nunca tente `morph-spec approve {feature} review --mode auto` num hotfix; o backstop server-side existe exatamente para isso.
121
113
  - Não "fazer do jeito certo" às custas da velocidade — refatoração, cobertura extra, ou hardening que não bloqueia o sintoma atual vira item no roadmap-fora-hotfix, não neste diff.
122
- - Não rodar suíte ad-hoc fora do `morph-spec verify` — a cadeia determinística é a única fonte de evidência aceita no review-report.
114
+ - Não rodar suíte ad-hoc fora do `morph-spec verify` — a cadeia determinística é a única fonte de evidência aceita no `verifier.md`.
123
115
 
124
116
  ## Output esperado
125
117
 
126
- - `.morph/features/{feature}/0-proposal/proposal.md` — hotfix brief (sintoma/root cause/blast radius/plano)
127
- - `.morph/features/{feature}/2-plan/tasks.json` — T1 (fix) + T2 (verify/regressão)
128
- - `.morph/features/{feature}/3-implement/recap.md` — evidência real de teste
129
- - `.morph/features/{feature}/4-review/review-report.md` — diff + evidência, Gate 3 sempre humano
130
- - Gates `proposal`/`plan` carimbados `approvedBy: "policy:hotfix"`; Gate 3 registrado em `feature.json` (autoritativo) com uma **assinatura humana** — `"manual"` pelo `state-sync` (resposta ao `AskUserQuestion`), o nome passado em `--approver`, ou `$USER` num terminal interativo. **Nunca `"auto"`** — é o que o backstop recusa.
118
+ - `.morph/features/{feature}/2-plan/plan.md` + `checks.json` — C1 sintoma ausente, C2 regressão, F1 fix
119
+ - `.morph/features/{feature}/3-implement/reports/F1.md` — o relatório da fatia, com a evidência real de teste
120
+ - `.morph/features/{feature}/4-review/verifier.md` — escrito pelo orquestrador: C1/C2 com evidência + diff, Gate 3 sempre humano
121
+ - Gate `plan` carimbado `approvedBy: "policy:hotfix"`; Gate 3 registrado em `feature.json` (autoritativo) com uma **assinatura humana** — `"manual"` pelo `state-sync` (resposta ao `AskUserQuestion`), o nome passado em `--approver`, ou `$USER` num terminal interativo. **Nunca `"auto"`** — é o que o backstop recusa.
131
122
 
132
123
  ## Referências
133
124
 
134
125
  - `.morph/framework/MORPH.md` §2.1 — roteamento por tipo de trabalho
135
126
  - `.morph/framework/MORPH.md` §5 — Gates de aprovação, gate humano forçado no hotfix
136
127
  - `.morph/framework/MORPH.md` §6 — Sub-agents, persona de estágio scout, protocolo obrigatório
137
- - `.claude/skills/morph-proposal/SKILL.md` — Passo 0, roteamento que invoca esta skill
138
- - `.claude/skills/morph-implement/SKILL.md` §4 — template de dispatch e protocolo
128
+ - `.claude/skills/morph-plan/SKILL.md` — roteamento que invoca esta skill
129
+ - `.claude/skills/morph-apply/SKILL.md` §3/§5 — prompt de dispatch e retomada por `report-check`
139
130
  - `morph-spec create {feature} --type hotfix --json` — mostra a política do tipo (`scaffold`, `skippedGates`, `forcedPauseGates`) como o CLI a aplicou
140
131
  - `morph-spec create {feature} --type hotfix` — nascimento com política de gates
141
- - `morph-spec verify {feature} [task] --json` — cadeia determinística build+testes+validadores
132
+ - `morph-spec verify {feature} --json` — cadeia determinística build+testes+validadores
142
133
  - `morph-spec gate-check {feature} review [--json]` — persiste a decisão de pausa (forçada por `workType: hotfix`) antes do Gate 3
@@ -4,7 +4,7 @@ description: Cuida da RAM e da CPU da máquina enquanto o morph-spec trabalha
4
4
  version: core
5
5
  when_to_use: Use quando a máquina estiver lenta ou sem RAM, um comando pesado esperou ou foi recusado pela fila, sobrou worktree de sub-agent, ou vários sub-agents pesados vão rodar em paralelo
6
6
  user-invocable: false
7
- cliVersion: "8.47.0"
7
+ cliVersion: "9.0.0"
8
8
  ---
9
9
 
10
10
  # morph-machine
@@ -42,5 +42,5 @@ Limites: não cobre `run_in_background`, PowerShell nem comando fora da lista; u
42
42
 
43
43
  ## Referências
44
44
 
45
- - `.morph/framework/CLI.md` — seções `heavy`, `worktree reap`, `doctor --procs` e `worktree.root`.
45
+ - `.morph/framework/CLI.md` — `### heavy`, `### worktree reap`, `### doctor --procs` e `### worktree.root`.
46
46
  - `MORPH.md` §2.2 (worktrees) e a cláusula 6 dos templates de dispatch (PROCESSOS).
@@ -4,7 +4,7 @@ description: Conduz a AUTORIA de mídia gerada por IA — escolher o modelo pelo
4
4
  version: core
5
5
  when_to_use: Use quando a tarefa for PRODUZIR imagem ou vídeo por IA (catálogo, marketing, asset de LP) e alguém precisar decidir modelo, prompt e aprovação
6
6
  user-invocable: true
7
- cliVersion: "8.47.0"
7
+ cliVersion: "9.0.0"
8
8
  stacks:
9
9
  - dotnet
10
10
  - nextjs