@polymorphism-tech/morph-spec 8.43.0 → 8.45.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 (203) hide show
  1. package/CLAUDE.md +16 -13
  2. package/README.md +10 -10
  3. package/bin/morph-spec.js +10 -13
  4. package/bin/validate.js +379 -379
  5. package/claude-plugin.json +1 -1
  6. package/docs/CHEATSHEET.md +2 -4
  7. package/docs/QUICKSTART.md +6 -6
  8. package/framework/CLAUDE.md +6 -8
  9. package/framework/MORPH.md +39 -45
  10. package/framework/agents.json +8 -9
  11. package/framework/commands/morph-apply.md +1 -3
  12. package/framework/commands/morph-hotfix.md +1 -1
  13. package/framework/commands/morph-proposal.md +2 -2
  14. package/framework/docs/CLI.md +22 -17
  15. package/framework/evals/review-checklist.md +90 -0
  16. package/framework/evals/trace-schema.md +2 -12
  17. package/framework/hooks/README.md +2 -3
  18. package/framework/hooks/claude-code/core/heavy-gate.js +1 -1
  19. package/framework/hooks/claude-code/core/protect-spec-files.js +2 -2
  20. package/framework/hooks/claude-code/core/telemetry-log.js +2 -2
  21. package/framework/hooks/claude-code/core/trace-autogen.js +1 -22
  22. package/framework/hooks/claude-code/core/validate-completion.js +3 -56
  23. package/framework/hooks/claude-code/core/worktree-env-inject.js +1 -4
  24. package/framework/hooks/claude-code/statusline.sh +11 -11
  25. package/framework/hooks/git/commit-msg/conventional-commits.sh +33 -33
  26. package/framework/hooks/git/pre-commit/agents.sh +25 -25
  27. package/framework/hooks/git/pre-commit/orchestrator.sh +64 -64
  28. package/framework/hooks/git/pre-commit/specs.sh +50 -50
  29. package/framework/hooks/git/pre-push/run-tests.sh +44 -44
  30. package/framework/hooks/shared/build-check.js +1 -1
  31. package/framework/hooks/shared/comment-scanner.js +1 -1
  32. package/framework/hooks/shared/phase-utils.js +0 -5
  33. package/framework/hooks/shared/stdin-reader.js +26 -26
  34. package/framework/phases.json +4 -6
  35. package/framework/rubrics/backend.json +1 -1
  36. package/framework/rubrics/default.json +1 -1
  37. package/framework/rubrics/frontend.json +1 -1
  38. package/framework/rules/ai-agents-standards.md +1 -0
  39. package/framework/rules/morph-workflow.md +6 -6
  40. package/framework/schemas/feature.schema.json +2 -28
  41. package/framework/schemas/tasks.schema.json +6 -2
  42. package/framework/skills/README.md +1 -2
  43. package/framework/skills/core/create-umbraco-lp/SKILL.md +1 -1
  44. package/framework/skills/core/migrate-lp-to-umbraco/SKILL.md +1 -1
  45. package/framework/skills/core/morph-apply/SKILL.md +145 -246
  46. package/framework/skills/core/morph-brainstorming/SKILL.md +1 -1
  47. package/framework/skills/core/morph-hotfix/SKILL.md +5 -3
  48. package/framework/skills/core/morph-implement/SKILL.md +101 -201
  49. package/framework/skills/core/morph-machine/SKILL.md +3 -3
  50. package/framework/skills/core/morph-media/SKILL.md +1 -1
  51. package/framework/skills/core/morph-plan/SKILL.md +171 -287
  52. package/framework/skills/core/morph-proposal/SKILL.md +4 -5
  53. package/framework/skills/core/morph-review/SKILL.md +109 -430
  54. package/framework/skills/core/morph-stack-scan/SKILL.md +1 -1
  55. package/framework/skills/core/morph-standards/SKILL.md +2 -2
  56. package/framework/skills/core/morph-uiux/SKILL.md +2 -3
  57. package/framework/standards/STANDARDS.json +54 -10
  58. package/framework/standards/ai-agents/agent-archetypes.md +1 -1
  59. package/framework/standards/ai-agents/agent-session.md +1 -1
  60. package/framework/standards/ai-agents/agent-spec.md +1 -1
  61. package/framework/standards/ai-agents/batching.md +1 -1
  62. package/framework/standards/ai-agents/context-providers.md +1 -1
  63. package/framework/standards/ai-agents/conversational-agent-with-phases.md +1 -1
  64. package/framework/standards/ai-agents/cost-and-budget.md +1 -1
  65. package/framework/standards/ai-agents/durable-workflows-hitl.md +1 -1
  66. package/framework/standards/ai-agents/guardrails.md +1 -1
  67. package/framework/standards/ai-agents/llm-runtime-defaults.md +1 -1
  68. package/framework/standards/ai-agents/mcp-server.md +1 -1
  69. package/framework/standards/ai-agents/mcp-tools.md +1 -1
  70. package/framework/standards/ai-agents/media-pipeline.md +1 -1
  71. package/framework/standards/ai-agents/media-video.md +1 -1
  72. package/framework/standards/ai-agents/middleware-patterns.md +1 -1
  73. package/framework/standards/ai-agents/modalities-image-gen.md +1 -1
  74. package/framework/standards/ai-agents/modalities-speech-to-text.md +1 -1
  75. package/framework/standards/ai-agents/modalities-text-to-speech.md +1 -1
  76. package/framework/standards/ai-agents/modalities-vision.md +1 -1
  77. package/framework/standards/ai-agents/multi-agent-patterns.md +1 -1
  78. package/framework/standards/ai-agents/observability-patterns.md +3 -3
  79. package/framework/standards/ai-agents/production.md +2 -2
  80. package/framework/standards/ai-agents/prompt-sources.md +1 -1
  81. package/framework/standards/ai-agents/providers/model-registry.md +1 -1
  82. package/framework/standards/ai-agents/rag-custom-pgvector.md +1 -1
  83. package/framework/standards/ai-agents/service-tier-flex.md +1 -1
  84. package/framework/standards/ai-agents/setup.md +1 -1
  85. package/framework/standards/ai-agents/structured-output.md +1 -1
  86. package/framework/standards/ai-agents/sweet-spot.md +1 -1
  87. package/framework/standards/ai-agents/testing-ai.md +1 -1
  88. package/framework/standards/ai-agents/tool-adapters.md +226 -0
  89. package/framework/standards/ai-agents/vector-data-extensions.md +1 -1
  90. package/framework/standards/ai-agents/workflows.md +1 -1
  91. package/framework/standards/infrastructure/docker/local-compose-isolation.md +11 -1
  92. package/framework/templates/CLAUDE.md.core.template +1 -1
  93. package/framework/templates/IDE-SNIPPETS.md +262 -262
  94. package/framework/templates/README.md +1 -1
  95. package/framework/templates/REGISTRY.json +0 -81
  96. package/framework/templates/code/dotnet/abstractions/api-endpoint.cs +7 -7
  97. package/framework/templates/code/dotnet/feature/endpoint.cs.hbs +21 -21
  98. package/framework/templates/code/dotnet/feature/request.cs.hbs +4 -4
  99. package/framework/templates/code/dotnet/feature/response.cs.hbs +4 -4
  100. package/framework/templates/code/sql/ai-agents/pgvector-embeddings-migration.sql.template +91 -91
  101. package/framework/templates/docs/spec.md +19 -205
  102. package/framework/templates/docs/ui-components.md +52 -52
  103. package/framework/templates/docs/ui-design-system.md +76 -76
  104. package/framework/templates/docs/ui-flows.md +167 -167
  105. package/framework/templates/frontend/nextjs/client-component.tsx.hbs +26 -26
  106. package/framework/templates/frontend/nextjs/feature-form.tsx.hbs +56 -56
  107. package/framework/templates/frontend/nextjs/tsconfig.json.hbs +26 -26
  108. package/framework/templates/infrastructure/docker/Dockerfile.template +58 -58
  109. package/framework/templates/infrastructure/docker/dockerfile-api.dockerfile +38 -38
  110. package/framework/templates/infrastructure/docker/dockerfile-web.dockerfile +48 -48
  111. package/framework/templates/infrastructure/github/README.md +56 -56
  112. package/framework/templates/infrastructure/github/actions/docker-build-push/action.yml.hbs +45 -45
  113. package/framework/templates/infrastructure/github/actions/health-check/action.yml.hbs +27 -27
  114. package/framework/templates/infrastructure/github/workflows/docker-build-push.yml.hbs +59 -59
  115. package/framework/templates/infrastructure/github/workflows/dotnet-build.yml.hbs +39 -39
  116. package/framework/templates/meta-prompts/fusion/fusion-agent.md +76 -76
  117. package/framework/templates/meta-prompts/fusion/fusion-aggregator.md +100 -100
  118. package/framework/templates/meta-prompts/validators/pre-commit-validator.md +95 -95
  119. package/framework/templates/state.template.json +17 -17
  120. package/framework/templates/ui/design-system.css +226 -226
  121. package/package.json +2 -2
  122. package/src/commands/e2e/e2e.js +1 -1
  123. package/src/commands/project/heavy.js +1 -1
  124. package/src/commands/project/status.js +3 -3
  125. package/src/commands/project/worktree.js +34 -16
  126. package/src/commands/state/approve.js +9 -50
  127. package/src/commands/state/finish.js +4 -0
  128. package/src/commands/state/gate-check.js +18 -107
  129. package/src/commands/state/gate-decision.js +1 -1
  130. package/src/commands/state/report-check.js +42 -17
  131. package/src/commands/validation/mutate.js +1 -1
  132. package/src/commands/validation/scout-check.js +28 -0
  133. package/src/commands/validation/validate-feature.js +5 -32
  134. package/src/commands/validation/verify.js +16 -25
  135. package/src/core/paths/output-schema.js +0 -2
  136. package/src/core/state/state-manager.js +1 -2
  137. package/src/core/templates/template-renderer.js +477 -477
  138. package/src/dashboard/app/lib/format.js +5 -0
  139. package/src/dashboard/app/main.jsx +13 -13
  140. package/src/dashboard/app/pages/FeatureDetail.jsx +16 -22
  141. package/src/dashboard/app/pages/Features.jsx +7 -7
  142. package/src/dashboard/app/pages/PhasePipeline.jsx +1 -1
  143. package/src/dashboard/app/pages/Rubrics.jsx +7 -11
  144. package/src/dashboard/scanner/docs-scanner.js +1 -2
  145. package/src/dashboard/scanner/features-scanner.js +3 -4
  146. package/src/dashboard/scanner/rubrics-scanner.js +12 -12
  147. package/src/dashboard/vite.config.js +24 -24
  148. package/src/lib/agents/output-collector.js +0 -1
  149. package/src/lib/detectors/design-system-detector.js +188 -188
  150. package/src/lib/e2e/compose-env.js +5 -2
  151. package/src/lib/evaluator-report.js +52 -334
  152. package/src/lib/generators/design-system-generator.js +508 -508
  153. package/src/lib/generators/handoff-generator.js +4 -5
  154. package/src/lib/git/evidence-staleness.js +39 -0
  155. package/src/lib/installers/memory-installer.js +2 -2
  156. package/src/lib/mutation/manifest.js +8 -2
  157. package/src/lib/mutation/report.js +5 -3
  158. package/src/lib/mutation/runner.js +9 -7
  159. package/src/lib/risk-detector.js +63 -125
  160. package/src/lib/scout/scout-check.js +293 -0
  161. package/src/lib/tasks/eval-node.js +4 -34
  162. package/src/lib/tasks/task-classifier.js +30 -30
  163. package/src/lib/tasks/task-parser.js +209 -209
  164. package/src/lib/tasks/tasks-json-parser.js +7 -5
  165. package/src/lib/tasks/test-nodes.js +1 -1
  166. package/src/lib/tasks/test-runner.js +1 -1
  167. package/src/lib/validators/contracts/contract-compliance-validator.js +4 -42
  168. package/src/lib/validators/css/css-validator.js +340 -340
  169. package/src/lib/validators/reuse/reuse-validator.js +6 -8
  170. package/src/lib/validators/verify-runner.js +1 -1
  171. package/src/lib/worktree/env-allocator.js +35 -5
  172. package/src/scripts/setup-infra.js +1 -1
  173. package/src/utils/agent-id-mapper.js +11 -11
  174. package/src/utils/agents-installer.js +5 -9
  175. package/src/utils/claude-settings-manager.js +300 -300
  176. package/src/utils/hooks-installer.js +3 -10
  177. package/src/utils/skills-installer.js +1 -1
  178. package/framework/evals/proof-rubrics/README.md +0 -76
  179. package/framework/evals/proof-rubrics/eval-de-modelo.md +0 -80
  180. package/framework/evals/proof-rubrics/fiacao.md +0 -54
  181. package/framework/evals/proof-rubrics/guard-cego.md +0 -52
  182. package/framework/evals/proof-rubrics/media-claims.md +0 -109
  183. package/framework/evals/proof-rubrics/mutation-proof.md +0 -107
  184. package/framework/evals/proof-rubrics/observabilidade-genai.md +0 -119
  185. package/framework/evals/proof-rubrics/verde-nao-e-coberto.md +0 -48
  186. package/framework/evals/rubrics/README.md +0 -45
  187. package/framework/evals/rubrics/architecture.md +0 -103
  188. package/framework/evals/rubrics/code-quality.md +0 -98
  189. package/framework/evals/rubrics/condensed.md +0 -57
  190. package/framework/evals/rubrics/contracts.md +0 -67
  191. package/framework/evals/rubrics/test-coverage.md +0 -99
  192. package/framework/evals/scenarios/dotnet-crud.yaml +0 -42
  193. package/framework/evals/scenarios/nextjs-auth.yaml +0 -38
  194. package/framework/evals/suites/standard.yaml +0 -5
  195. package/framework/hooks/claude-code/core/post-edit-typecheck.js +0 -127
  196. package/framework/skills/core/morph-eval/SKILL.md +0 -64
  197. package/framework/templates/.idea/morph-templates.xml +0 -92
  198. package/framework/templates/.vscode/morph-templates.code-snippets +0 -186
  199. package/framework/templates/docs/clarifications.md +0 -253
  200. package/framework/templates/docs/onboarding.md +0 -122
  201. package/framework/templates/docs/schema-analysis.md +0 -119
  202. package/framework/templates/docs/user-stories.md +0 -34
  203. package/src/commands/state/score.js +0 -147
@@ -4,180 +4,130 @@ description: Orquestra a execução autônoma de tasks de uma feature morph-spec
4
4
  version: core
5
5
  when-to-invoke: após Gate 2 aprovado, ao receber instrução "use /morph-apply" ou "implementar feature"
6
6
  user-invokable: true
7
- cliVersion: "8.43.0"
7
+ cliVersion: "8.45.0"
8
8
  ---
9
9
 
10
10
  # morph-apply
11
11
 
12
12
  ## Objetivo
13
13
 
14
- Executar todas as tasks pendentes de uma feature até `done`, aplicando `morph-eval` após cada uma, e finalizar com `morph-review` + Gate 3.
14
+ Levar toda task pendente a `done` — `verify` da task verde e `doneCriteria` atendido — e fechar
15
+ com `morph-review` + Gate 3.
15
16
 
16
17
  ## Quando invocar
17
18
 
18
- - Após Gate 2 aprovado (verificar `.morph/features/{feature}/feature.json → approvalGates.plan.approved === true`).
19
- - Usuário pede "use /morph-apply {feature}" ou "implementar {feature}".
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.
20
21
 
21
- ## Argumentos
22
+ ## Ritmo
22
23
 
23
- - `{feature-name}` — nome da feature. Se ausente, usar a feature `in_progress` mais recente em `state.json`.
24
-
25
- ## Pré-condições
26
-
27
- - `.morph/features/{feature}/2-plan/tasks.json` existe e é válido (schema check).
28
- - `.morph/features/{feature}/2-plan/spec.md` e `mandate.md` existem.
29
- - Gate 2 está marcado aprovado no `feature.json` da feature (ou trust:auto está ativo).
24
+ 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
26
+ pelo timeout dela: no máximo uma chamada nova; persistiu, pare e avise o usuário — a máquina está
27
+ saturada (skill `morph-machine`). Nunca `sleep`/`until` nem retentativa agendada.
30
28
 
31
29
  ## Fluxo
32
30
 
33
31
  ### 1. Carregar contexto
34
32
 
35
- - Ler `.morph/config/config.json → trust`.
36
- - **Use a tool Read** em `.morph/features/{feature}/2-plan/tasks.json` para carregar as tasks (ids, `dependencies`, `effort`, `group`, `status`, `doneCriteria`). Não escreva scripts para isso — o parse e a validação de schema acontecem no comando CLI do passo 2.
37
-
38
- ### 2. Análise de DAG — decisão sequencial vs paralelo
33
+ `.morph/config/config.json → trust` e Read em `2-plan/tasks.json` (ids, `dependencies`, `effort`,
34
+ `group`, `status`, `doneCriteria`).
39
35
 
40
- Rode o comando CLI (ele parseia o tasks.json, valida o schema e pondera o esforço):
36
+ ### 2. Análise de DAG — sequencial vs paralelo
41
37
 
42
38
  ```
43
39
  morph-spec dag {feature}
44
40
  ```
45
41
 
46
- O comando analisa `dependencies`, `group` e `effort` das tasks pendentes e imprime a decisão pronta com justificativa. As regras que ele aplica (e que você segue):
47
-
48
- 1. Se `tasks.length <= 3`: **sequencial** (overhead de Agent dispatch não compensa).
49
- 2. **Fluxos de domínio independentes (o caso comum — backend ‖ frontend).** Grupos cujas tasks não dependem de tasks de outro grupo formam fluxos paralelos (as cadeias só convergem, se convergirem, numa task final de integração). **≥ 2 fluxos independentes com peso de esforço suficiente** → dispache **um sub-agent por fluxo, em paralelo**, cada um com a persona e o standard do seu domínio (ver passo 3b).
50
- 3. **Raízes independentes (fan-out na largura).** Tasks 100% independentes (`dependencies: []`). **≥ 3 raízes com effort M ou maior** → dispachar essas raízes em **paralelo**, depois cair em sequencial para o resto.
51
- 4. Caso contrário: **sequencial puro** com auto-advance.
52
-
53
- > O `dag` também imprime uma recomendação de **isolamento**: se dois fluxos paralelos planejam escrever no mesmo path (colisão de `outputs`), ele reporta `isolation.recommended: "worktree"` — nesse caso siga a §3b-w em vez da §3b.
54
-
55
- > **Peso de esforço:** a decisão é ponderada por `effort` (S=1, M=2, L=4, XL=8). **Raízes e fluxos compostos só de tasks S não ganham dispatch próprio** — overhead > trabalho. O comando os lista como `inline` (você os executa no modo sequencial) ou os agrupa num **único** agente quando são muitos. O cap de **4 agentes simultâneos** (anti-padrão abaixo) vale para ambas as formas. Se um fluxo de domínio é uma cadeia longa, despache o **fluxo inteiro** a um sub-agent (que executa a cadeia em ordem internamente) — um agente por fluxo, não um agente por task.
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`.
56
48
 
57
- > **DAG × gatilho de effort — decisões ortogonais que coexistem:** a decisão deste comando governa o **paralelismo ENTRE tasks** (quantos sub-agents ao mesmo tempo: fluxos/raízes independentes em batch). O gatilho de effort/domínio de `morph-implement` §4 governa o **dispatch INDIVIDUAL** de cada task quando ela chega ao topo do loop sequencial. `DAG: sequencial` significa "uma task por vez, na ordem" — **NÃO significa "tudo inline"**. Exemplo: cadeia única backend de 12 tasks → o DAG decide sequencial; T7 tem effort L → ao chegar em T7, o orquestrador a despacha **sozinha** para `morph-dotnet-senior` e aguarda o retorno (um agente por vez); T8 (S, mesmo domínio já carregado) roda inline. As duas regras nunca conflitam: o DAG decide *quantos ao mesmo tempo*, o gatilho de effort decide *quem executa cada task*.
58
-
59
- Registre a linha de decisão que o comando imprimiu, por exemplo:
60
- ```
61
- DAG: 14 tasks, fluxos {backend:9, frontend:2} independentes (peso 18‖4) → 2 fluxos paralelos + T14 (integração) sequencial no fim
62
- DAG: 12 tasks, 4 raízes independentes (3 com peso ≥ M) → parallel batch (T1, T3, T7) + T9 (S) inline + restante sequencial
63
- ```
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.
64
52
 
65
53
  ### 3a. Modo Sequencial (auto-advance)
66
54
 
67
- Loop:
68
55
  ```
69
56
  while (true):
70
- ready = tasks 'pending' cujas dependencies estão todas 'done' (releia tasks.json)
71
- if ready.length === 0:
72
- break
73
-
57
+ ready = tasks 'pending' com todas as dependencies 'done' (releia tasks.json)
58
+ if ready vazio: break
74
59
  task = ready[0]
75
- marcar task.status = 'in_progress' em tasks.json (tool Edit — só campos mutáveis)
60
+ marcar task.status = 'in_progress' (Edit, só campos mutáveis)
76
61
 
77
- // Loop de correção autônomo — a barra de qualidade é >= 9 (ver MORPH.md §0).
78
- // Entre tasks NÃO há pausa humana: score < 9 dispara re-implementação, não AskUserQuestion.
79
- attempt = 0
80
- best = { score: 0, output: null }
81
- skillLoaded = false // true assim que Skill(morph-implement) foi invocada nesta sessão
62
+ attempt = 0; feedback = null; pronto = false
82
63
  while attempt < 3:
83
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)
84
72
 
85
- if attempt == 1 or not skillLoaded:
86
- // attempt 1 sempre invoca — é o que carrega mandate/spec/standard/persona
87
- // pela primeira vez. Reinvoca também se skillLoaded caiu para false (ver nota).
88
- invoke Skill(morph-implement) with task
89
- (no attempt > 1: passar o feedback priorizado da tentativa anterior como input)
90
- skillLoaded = true
91
- else:
92
- // attempt > 1, skill já em contexto desde attempt 1: NÃO reinvoque a Skill —
93
- // aplique o feedback priorizado direto ao código já implementado (mesma
94
- // lógica do passo 1 do morph-implement, "isto NÃO é implementação do zero",
95
- // só que sem reler o documento inteiro da skill de novo).
96
- aplicar feedback priorizado da tentativa anterior ao código já implementado
97
-
98
- // OUTPUTS ANTES DO VERIFY — o recorte por task lê `outputs` de tasks.json.
99
- // Grave neles (campo mutável, tool Edit) os arquivos REAIS desta tentativa: do
100
- // relatório `3-implement/reports/{task.id}.md` quando despachada, do que você
101
- // escreveu quando inline. Divergiu do plano → `notes` na mesma edição.
102
- atualizar task.outputs em tasks.json
103
-
104
- // CÓDIGO ANTES DO JUIZ — barreira determinística e barata (build+testes+validadores).
105
- // Loop por task: o recorte é AUTOMÁTICO — o `group` da task escolhe os nós e os
106
- // arquivos de teste de `outputs` estreitam o comando dentro de cada nó (o relógio
107
- // de uma task não paga a suíte inteira). `--filter {ids}` só para FORÇAR a
108
- // escolha de nós; `--full` desliga o recorte.
109
73
  run: morph-spec verify {feature} {task.id} --json
110
- // exit 3 / status == 'busy': fila de slot pesado cheia, NÃO vermelho — nada foi verificado nem gravado.
111
- // Repita a mesma chamada; não conta como tentativa e não dispara o loop de correção.
112
74
  if verify.status == 'fail':
113
- // vermelho: feedback determinístico direto ao loop, SEM gastar o juiz LLM.
114
- feedback = verify.feedback // usado como input do próximo attempt
115
- continue // conta como tentativa; não invoca morph-eval sobre código que não builda/não passa
116
-
117
- // verde: o juiz avalia só o que o código não pega (arquitetura, contratos, qualidade).
118
- result = invoke Skill(morph-eval) with implementation output
119
- if result.score > best.score: best = result
120
- // Persista o score no feature.json autoritativo — torna o evalScore um signal
121
- // de disco no MOMENTO da implementação (não no fim). O hook gate-guard.js e o
122
- // Gate 3 leem dali. O timestamp é carimbado server-side pelo CLI — NUNCA edite
123
- // feature.json à mão para isso:
124
- run: morph-spec score {feature} {task.id} {result.score} --dims {arch},{contracts},{quality},{tests}
125
-
126
- if result.score >= 9:
127
- break
128
-
129
- if best.score >= 9:
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:
130
85
  // task com `3-implement/evidencias/{id}.md` em `outputs`: confira o arquivo antes do `done`
131
86
  // (morph-implement §5). Em batch paralelo sem isolamento o sub-agente não roda eval — o
132
87
  // ORQUESTRADOR roda, após o batch, `morph-spec verify {feature} --filter {id-do-nó-evals} --skip-e2e --no-persist`
133
- marcar task.status = 'done' em tasks.json (tool Edit — confirme os outputs
134
- reais, já gravados antes do verify, e, se divergirem do planejado, o porquê em notes)
88
+ marcar task.status = 'done' (Edit; confirme os outputs reais)
135
89
  else:
136
- // 3 tentativas sem atingir 9 — AQUI sim escala ao humano (escape definido).
137
- // Esta é a única pausa do loop de implement, e só após esgotar o loop de correção.
138
- registrar em recap.md: as 3 tentativas e o melhor score (best.score) com o feedback
139
- AskUserQuestion: "Task {id} não atingiu score 9 após 3 tentativas (melhor: {best.score}) — aceitar mesmo assim, continuar tentando, ou pular?"
140
- options: [aceitar (marca done com ressalva no recap), continuar tentando (+3 tentativas), pular task (marca blocked)]
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)]
141
94
  ```
142
95
 
143
- > **Loop por task filtra; Gate 3 e CI não.** O sub-agent despachado não roda `verify`: só o filtro dos próprios testes, uma vez (cláusula 3). No loop o filtro é **automático**: `verify {feature} {task.id}` deixa o `group` da task escolher os nós e os arquivos de teste de `outputs` estreitarem o comando — cada nó **aparece** em `nodes.tests.runs[]` com `selection` (`narrowed`/`whole`/`out-of-scope`/`full` e o motivo), nenhum some. `--filter {ids}` só força a escolha de nós (os não casados aparecem como `skip` nomeando o filtro, e um `--filter` que não casa nada é erro de uso, exit 2, nunca um verde); `--full` desliga o recorte. A verificação pós-batch e a do Gate 3 (`morph-spec verify {feature} --json`) rodam **sem filtro**, e `verify {feature}` **nunca recorta**: a prova que o avaliador lê tem de cobrir todos os nós, e o CI idem. Forma de `project.tests[]`, regras e limites do recorte, e a tabela da divisão: `.morph/framework/CLI.md`, seção "Suítes de teste".
144
- >
145
- > **Verify vermelho consome uma tentativa** do loop (≤3) e devolve `feedback[]` acionável (erros de build, falhas de teste — linhas prefixadas por `[tests/{id}]`, que nomeiam a suíte —, issues de validador). O `morph-eval` NUNCA é invocado sobre código que não passou no verify — o juiz julga arquitetura/contratos/qualidade, o que o código determinístico não pega sozinho. Código roda antes, grátis; o juiz gasta tokens só no que sobra.
146
-
147
- > **Retry sem re-invoke — e a exceção que evita rodar sem a skill.** `skillLoaded` cai de volta para `false` (forçando reinvocação no próximo attempt) se houver `/compact` OU troca de sessão (nova sessão retomando via `handoff.md`) entre a última invocação e o attempt corrente — os dois eventos podem descartar o conteúdo da skill do seu contexto sem avisar. Sem essa exceção, um retry pós-compact aplicaria feedback sem o mandate/standard/persona carregados. Fora desses dois casos, reinvocar a Skill só para aplicar um feedback pontual é exatamente o custo repetido (~13KB por tentativa) que este corte existe para eliminar.
148
- >
149
- > **Isto vale para a LEITURA da skill pelo orquestrador — não para o conteúdo de um dispatch.** Se o attempt 1 foi despachado a um sub-agent (§3b) e o attempt 2 também dispara os gatilhos de dispatch do `morph-implement` §4, o prompt de dispatch completo é reenviado normalmente: o sub-agent de um novo dispatch não tem o contexto do attempt anterior, então o corte de reinvoke não se aplica a ele. O que muda aqui é só a leitura da skill pelo ORQUESTRADOR no loop sequencial inline.
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".
150
102
 
151
- > **Por que loop e não pausa:** MORPH.md §0 manda auto-avançar entre tasks. Score baixo numa task individual é um problema de qualidade que o modelo deve **corrigir sozinho**, não delegar ao humano no meio da implementação. A pausa só existe quando o loop de correção se esgota (3 tentativas) — o "escape" do modelo autônomo. O trust mode não muda esse loop: ele governa os **gates** (proposal/plan/review), não o ciclo de correção intra-task.
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.
152
106
 
153
107
  ### 3b. Modo Paralelo (para o subset independente)
154
108
 
155
- **Antes de despachar, escope cada agente ao seu domínio.** Um agente genérico sem persona nem standard não "conhece" as convenções daquele domínio — produz código fora do padrão. Para cada fluxo/task a despachar, resolva:
156
-
157
- - **Subagent:** use `task.agent` (id da persona, sem prefixo `morph-`) já carimbado em `tasks.json` pelo `morph-plan` §5a — o `subagent_type` do dispatch é **`morph-{task.agent}`** (ex.: `morph-dotnet-senior`). **Fallback (plano legado, task sem `agent`):** em `.morph/framework/agents.json`, encontre o agente cujo `domains` cobre o `group`/domínio da task (ex: `backend` → `dotnet-senior`, `frontend` → `nextjs-expert`/`ui-designer`, `database` → `ef-modeler`).
158
- - **Standard(s):** use `task.standards` quando presente; senão, do array `standards` do agente resolvido acima em `agents.json` (e/ou do `mandate.md`), selecione o(s) path(s) `.md` relevante(s) à task.
159
- - **Fallback (tipo não registrado):** se `morph-{id}` não estiver na sua lista de subagent types (stack não instalado neste projeto), use `subagent_type: "general-purpose"` colando o campo `persona` no prompt — e **registre nas `notes` da task**: `dispatch-fallback: general-purpose ({id} não registrado)`. O recap deve refletir o mecanismo real.
160
-
161
- **Cole o template literal**: só os campos entre `<>` mudam; não parafraseie cláusula nem omita os parágrafos de leitura, ferramentas e comentário.
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:
162
114
 
163
115
  ```
164
116
  dispatch Agent (subagent_type: "morph-{id}") with prompt:
165
- contexto: spec.md, mandate.md, task description completa, doneCriteria,
166
- task.reuse (veredito REUSAR/ESTENDER/CRIAR por conceito), os paths
167
- dos alvos de reuso e o que você já leu para a task (`arquivo:linhas`
168
- + o trecho)
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)
169
120
  standards: <por standard: id + digest do `standards --find` + as 3-8 regras do
170
121
  .md que ESTA task aplica, coladas; o path só para consulta pontual>
171
122
  instrução: |
172
- Siga as regras dos standards acima; abra o .md só para uma dúvida pontual.
173
123
  Implemente esta task (ou cadeia de tasks do fluxo) sem depender do trabalho
174
- dos outros agentes deste batch: seu ISOLAMENTO é de ESTADO e de ÁRVORE DE
175
- TRABALHO — nunca de conhecimento do codebase. Antes de criar tipo,
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,
176
126
  componente, hook ou serviço NOVO, verifique se já existe: `morph-spec graph
177
127
  explain <nome>` e `graph affected <conceito> --uses-only`; sem grafo
178
128
  (`no-graph`), caia para `grep -rn "<nome>"` e siga — a ausência de grafo
179
- nunca bloqueia. Se algo cobre o caso, reuse ou estenda; se criar mesmo
180
- assim, diga por que em uma linha no relatório.
129
+ nunca bloqueia. Se criar mesmo assim, diga por que em uma linha no relatório.
130
+
181
131
  Leitura e turnos: cada turno custa ~10 s antes de a tool rodar, e o teto de
182
132
  turnos corta sem aviso. Chamadas que não dependem uma da outra vão no MESMO
183
133
  turno: leia de uma vez todos os arquivos que este prompt lista, dispare os
@@ -189,173 +139,122 @@ dispatch Agent (subagent_type: "morph-{id}") with prompt:
189
139
  Ferramentas: antes de supor a API de uma biblioteca (MAF, EF Core, Next,
190
140
  shadcn, SDK de provedor), consulte o MCP `context7` (`resolve-library-id` →
191
141
  `query-docs`). Impacto e vizinhança de símbolo vêm do grafo
192
- (`morph-spec graph`), não de varredura por grep. Tool `mcp__…` que não esteja
193
- carregada se carrega com `ToolSearch` (`select:<nome>`); MCP ausente nunca
194
- bloqueia — siga com o fallback.
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
+
195
145
  Comentário: o padrão é nenhum. Nome, tipo e teste explicam o código; sem
196
146
  `///`/JSDoc em membro de aplicação, cabeçalho, banner de seção ou história
197
147
  da task. Só o porquê que o código não mostra, em uma linha
198
148
  (`architecture-code-comments`). O elo com a pós-condição vai no nome do
199
- teste; a densidade do arquivo vizinho não é modelo. O hook `comment-guard`
200
- bloqueia a edição que adiciona história, banner ou bloco longo.
201
- Não modifique spec.md, mandate.md.
149
+ teste. O hook `comment-guard` bloqueia a edição que adiciona história,
150
+ banner ou bloco longo. Não modifique spec.md.
202
151
 
203
152
  Contrato do relatório final:
204
- 1. GRAVE um relatório por task concluída em
153
+ 1. GRAVE um relatório por task em
205
154
  `.morph/features/{feature}/3-implement/reports/{taskId}.md` ANTES de
206
- encerrar (um arquivo por task, mesmo cobrindo várias tasks do fluxo
207
- numa sessão só) — é o retorno autoritativo, não a sua mensagem final
208
- (que é cortesia best-effort e pode não chegar inteira). NÃO chame
209
- SendMessage.
155
+ encerrar — é o retorno autoritativo. NÃO chame SendMessage.
210
156
  2. NÃO toque em tasks.json, feature.json, state.json nem no board de
211
- sessão — todo estado (status de task, scores, gates) é gravado
212
- exclusivamente pelo orquestrador.
157
+ sessão — todo estado é gravado exclusivamente pelo orquestrador.
213
158
  3. TESTE — a prova é do orquestrador (`morph-spec verify`), não sua.
214
- Escreva os testes pelo orçamento: um por pós-condição, um de regressão
215
- por bug, variantes numa tabela (`[Theory]`/`it.each`). NÃO rode teste a
216
- cada marco nem faça ciclo red→green: escreva código e testes, compile, e
217
- rode SÓ o filtro dos seus testes UMA vez, antes do relatório; se falhar,
218
- corrija e rode só os que falharam. Não rode `morph-spec verify`.
219
- - Batch SEM isolamento (working tree compartilhada): só compile —
220
- edições concorrentes quebram o build umas das outras; o teste roda no
221
- verify do orquestrador, pós-batch.
222
- - Batch COM isolamento (você recebeu `isolation: "worktree"`): a regra
223
- acima vale DENTRO do seu worktree; commite seu trabalho na branch do
224
- worktree como último ato antes do relatório; reporte a branch — nunca
225
- faça merge nem toque na árvore principal.
226
- - Ao rodar: compile uma vez e rode sem recompilar (`dotnet test
227
- --no-build`), com `--filter`. Grave a saída em arquivo uma vez
228
- (`… > .morph/logs/test-last.log 2>&1`, sem nada depois) e leia o arquivo:
229
- rodar de novo com outro `| tail`/`| grep` repete o teste para ver outras
230
- linhas, e com pipe ou `; echo` o exit é o do último comando, não o do teste.
231
-
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.
232
167
  4. ESCOPO: no máximo 3 tasks e ~4 arquivos por dispatch. Escopo maior falha e
233
168
  volta — fatie antes, não depois.
234
169
  5. SOBREVIVÊNCIA: o limite de turnos (`maxTurns`, no seu system prompt)
235
170
  corta sem aviso: commite `wip({taskId})` a cada marco (um arquivo ou
236
- uma fatia coerente escrita — sem rodar teste para isso), não só ao fim da task — e só os seus arquivos
171
+ uma fatia coerente escrita), não só ao fim da task — e só os seus arquivos
237
172
  (`git add <paths>`, nunca `-A`). Sem commit, a retomada recomeça do zero.
238
173
  A ~70% do limite, grave o relatório parcial no arquivo canônico: `PARCIAL`
239
- na 1ª linha, o feito e o que falta, sem auto-score. Depois siga ou pare,
240
- por decisão sua; ao concluir, o relatório final substitui o parcial, sem o
241
- `PARCIAL`. Sem limite declarado, bastam os commits por marco.
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.
242
176
  6. PROCESSOS: NUNCA `taskkill /IM node.exe` (derruba os MCPs de todas as
243
177
  sessões). Encerre dev server pelo PID que você mesmo subiu. Build e
244
- suíte pesados (`dotnet build`, `dotnet test`, `docker compose up`) rodam
245
- por `morph-spec heavy run -- <comando>`: exit 3 é fila cheia, não erro do
246
- código — espere e repita.
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.
247
181
  7. RETORNO: o relatório no arquivo canônico é o retorno. `SendMessage` não é
248
182
  substituto do relatório e não deve ser chamado.
249
183
  8. MUTAÇÃO: nunca altere, reverta, mova ou apague código de produção para ver
250
184
  um teste falhar (`sed`, `mv`, `git show HEAD:… >`, `git stash`, `git
251
185
  checkout --`). A prova de que o teste morde é do avaliador no Gate 3.
252
186
 
253
- Seu relatório final deve conter APENAS: (1) o que foi feito em 2-3
254
- frases, (2) arquivos modificados, (3) problemas encontrados e como foram
255
- resolvidos, (4) auto-score 0-10 com justificativa em uma linha. Relatório
256
- ausente, oco, ou sem os 4 itens, é falha de protocolo.
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.
257
190
  ```
258
191
 
259
- > **Passo pós-dispatch (do orquestrador, antes de avaliar qualquer relatório):** ao retomar o
260
- > controle, a auditoria do batch abaixo (`report-check` com os ids do batch) traz, no bloco `tree`,
261
- > o que está não commitado fora de `.morph/` (`dirty`, `diffstat`), os commits sobre a default
262
- > (`commits`) e os marcadores `MUTACAO` esquecidos (`markers`) — sem `git status`, `git diff` e
263
- > `grep` à parte. Um sub-agent morto no meio deixa o disco a meio caminho — e um relatório lido
264
- > sobre uma árvore que ninguém conferiu avalia um estado que ninguém quis. Árvore inesperadamente
265
- > suja ou `markers` não vazio é falha de protocolo: registre no recap antes de pontuar.
266
-
267
- > **Relatório com `PARCIAL` na 1ª linha = a task não está pronta**: o sub-agent parou antes do fim
268
- > (limite de turnos, cláusula 5). O `report-check` o acusa como `report-incomplete`, e aqui a ação é
269
- > retomar, não completar DEGRADADO: retome o MESMO agente por `SendMessage`, colando no recado
270
- > `tree.dirty` e `tree.commits` do `report-check` e o que falta (ele guarda o contexto), ou
271
- > re-despache só o que falta a partir do último `wip`. Nunca pontue nem marque `done` sobre um
272
- > parcial.
273
-
274
- > Este template é deliberadamente paritário com o template sequencial em `morph-implement` §4: ambos despacham o **subagent registrado do domínio (`morph-{id}`)** com standard escopado e as **mesmas 8 cláusulas** do contrato do relatório final (relatório, estado, teste, escopo, sobrevivência, processos, retorno e mutação), os mesmos parágrafos de leitura/turnos e ferramentas e os mesmos 4 itens de relatório — racional completo em `MORPH.md` §6. A única diferença é que aqui múltiplos agentes rodam ao mesmo tempo, um por fluxo independente.
275
-
276
- > **Alternativa quando os fluxos tocam os mesmos projetos/arquivos** (ex.: o mesmo csproj de testes compartilhado): siga a §3b-w abaixo em vez desta seção — despache com `isolation: "worktree"`, cada agente trabalha numa working tree própria e o orquestrador integra ao final.
277
-
278
- **Batch SEM isolamento:** aguardar todos os agentes terminarem, depois **auditar os relatórios contra o trabalho** com `morph-spec report-check {feature} {T1} {T2} … --json` (os ids do batch: sem eles o modo feature só audita tasks já `done`, e as do batch ainda não estão) — determinístico e independente da palavra dos agentes; é o passo que pega tanto o relatório ausente quanto o `report-stale` (completo, porém gravado antes do fim do trabalho: o agente relatou cedo e continuou escrevendo). Em `report-stale`, **não re-despache** — leia o campo `observed` (writes reais do `events.jsonl`) e atualize o relatório a partir dele. Vereditos e ações: `MORPH.md` §6. Em seguida **ler** `.morph/features/{feature}/3-implement/reports/{taskId}.md` de cada task — é o valor de retorno autoritativo; a mensagem de texto do dispatch, se chegou inteira, é só um atalho que economiza essa leitura. Depois, sequencialmente:
279
- - **Rodar `morph-spec verify {feature} --json` uma única vez, pós-batch** (escopo feature, **sem `--filter`**) — os agentes não a rodaram (cláusula 3). Vermelho: use `verify.feedback` para corrigir/redespachar ANTES de qualquer morph-eval. (Com isolamento por worktree, cada agente já rodou o verify dentro do seu worktree; o orquestrador roda o verify compartilhado UMA vez após o merge — ver §3b-w.)
280
- - Para cada relatório retornado:
281
- - Aplicar `Skill(morph-eval)`.
282
- - Gravar o score: `morph-spec score {feature} {taskId} {score} --dims {a},{c},{q},{t}`.
283
- - Se score >= 9 (e `3-implement/evidencias/{taskId}.md` gravada, se a task a deve — checagem do §3a): marcar `done` em tasks.json (tool Edit — só campos mutáveis).
284
- - Se score < 9: marcar `pending` novamente com nota — volta ao modo sequencial, onde o loop de correção (até 3 tentativas) busca o score 9.
285
-
286
- Depois do batch paralelo, executar o restante em modo sequencial (passo 3a).
287
-
288
- **Batch COM isolamento (§3b-w): dispatch rolling, não por onda.** Nenhum agente escreve na
289
- árvore principal, então o orquestrador não espera o batch inteiro: a cada relatório que chega,
290
- audita (`report-check {feature} {taskId}`), integra aquela branch (§3b-w passo 2), roda
291
- `verify {feature} {taskId}` e `morph-eval` + `score` daquela task, e **despacha na hora** toda
292
- task que ficou `ready` (`getReadyTasks`) cujos `outputs` não colidem com os das tasks em voo —
293
- o worktree nasce da branch da feature, já com o merge que acabou de entrar. Cap de 4 em voo. O
294
- `verify {feature}` de escopo feature roda uma vez, quando nada mais está em voo. Medido: uma task
295
- esperou 43 min pela onda depois de a dependência dela já estar pronta.
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.
296
202
 
297
- ### 3b-w. Batch isolado por worktree (quando o dag recomenda)
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`.
298
206
 
299
- Quando o `morph-spec dag {feature}` reporta `isolation.recommended: "worktree"` (dois fluxos paralelos planejam escrever no mesmo path — colisão de `outputs`), despache cada fluxo com o parâmetro `isolation: "worktree"` do tool Agent. Cada agente trabalha numa working tree própria; build/test rodam lá dentro sem colidir.
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).
300
209
 
301
- 1. **Dispatch:** mesmo `subagent_type: "morph-{id}"` e standards de §3b, mais `isolation: "worktree"`. O worktree vem do hook `WorktreeCreate` do morph: nasce em `worktrees/<n>` na branch `morph-task/<n>`, com junctions (`node_modules`, `.claude`, `.morph/framework`) e `.morph/worktree.env` já prontos — se faltar infra mesmo assim, o agente roda `morph-spec worktree link --all` (fail-open); se ainda impossível, reporta "verificação: não executada" (o verify pós-merge cobre). Dev server/compose dentro do worktree já sai nas portas do bloco (o hook `worktree-env-inject` prefixa o comando; fora do Claude, `eval "$(morph-spec env)"`). O worktree nasce da branch `morph/<feature>` quando a sessão está nela (o trabalho já integrado da feature vem junto, sem `merge` manual) e com os `.env*` da raiz copiados — o prompt de dispatch não manda o agente preparar nada disso. Sessão fora de `morph/<feature>` (orquestrador na raiz) faz o worktree nascer da default: aí, e só aí, o prompt abre com `git merge --ff-only morph/<feature>`. O agente commita na branch do worktree como último ato e reporta a branch. Ele não roda `morph-spec verify` (cláusula 3): a prova é o verify do orquestrador depois do merge.
302
- 2. **Integração (orquestrador, a cada relatório que chega):** faça o merge de cada branch reportada, uma por vez, na ordem de chegada — `git merge --no-ff <branch>`. Conflito → `git merge --abort`, marque a task de volta a `pending` com nota "merge conflict — reexecutar sequencial", siga para a próxima branch. Os paths em conflito são exatamente os de `isolation.collisions` do dag.
303
- 3. **Pós-merge:** `verify {feature} {taskId}` no merge de cada task (dispatch rolling, §3b), depois `morph-eval` + `morph-spec score`; `morph-spec verify {feature} --json` de escopo feature UMA vez, quando nada mais está em voo (o merge é o novo ponto de integração — verificação compartilhada obrigatória).
304
- 4. **Cleanup:** o hook `WorktreeRemove` remove o worktree **limpo** ao fim do subagent (branch sobrevive) — mas não conte com ele: rode `morph-spec worktree remove --target <path>` por worktree que sobrou (NUNCA `git worktree remove` cru — as junctions do passo 1 seriam atravessadas e o `node_modules`/`.claude` da raiz apagados) + `git branch -d morph-task/<n>` das branches integradas + `git worktree prune` (fail-open). Depois de cada retorno de agent com `isolation`, e ao fim do batch, rode `morph-spec worktree reap --json`: remove só o worktree de `agent-<hex>` que parou limpo e sem commit exclusivo, e lista o resto com a razão (`not-a-registered-worktree` no `remove --target` seguinte = o reaper já o levou). Worktree sujo (subagent não commitou) fica, vira `agent-worktree-leftover` no `doctor --worktrees`, e a task volta a `pending`. Branches não integradas ficam e são registradas no recap com o motivo.
305
- 5. **Agente morto no meio:** se commitou, a branch sobrevive (retomável); senão, a task volta a `pending` na lane sequencial. Registre a falha de protocolo no recap.
210
+ ### 3b-w. Batch isolado por worktree (quando o dag recomenda)
306
211
 
307
- > Anti-padrões: não misture unidades isoladas e não-isoladas no mesmo batch; o subagent nunca faz merge (integração é exclusiva do orquestrador).
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.
308
228
 
309
229
  ### 4. Conclusão de tasks
310
230
 
311
- Quando `getPendingTasks(data).length === 0`:
312
-
313
- - Invocar `Skill(morph-review)` para gerar `.morph/features/{feature}/4-review/review-report.md`.
314
- - A skill morph-review chama `morph-eval` em escopo de feature inteira.
231
+ Sem tasks pendentes: invoke `Skill(morph-review)`.
315
232
 
316
233
  ### 5. Gate 3
317
234
 
318
- Apresentado e persistido por `morph-review` §8 (invocada no passo 4 acima) — gate-check, template
319
- fixo nomeando a feature, aprovação registrada pós-resposta. Ao retomar o controle dela, **NÃO
320
- re-apresente o gate**: siga direto para o encerramento (§6) conforme a decisão já persistida em
321
- `gateDecisions.review`.
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`.
322
237
 
323
- ### 6. Pós Gate 3 — encerramento
238
+ ### 6. Encerramento
324
239
 
325
- - Aprovar o Gate 3: em auto, `morph-spec approve {feature} review --mode auto`; em manual, o hook state-sync registra a resposta "aprovado" em `AskUserQuestion` — **desde que a pergunta nomeie a feature** (senão aprove via `morph-spec approve`).
326
- - **Antes do `finish`, reescreva o contexto que a feature mudou.** Todo `.morph/context/*.md` que descreve um fato que esta feature alterou (fonte, token, fluxo, integração) tem o **corpo** reescrito — a seção que descrevia o antigo passa a descrever o novo, e o que ainda vale num escopo diz o escopo. O changelog do documento guarda só data e motivo, nunca o valor novo: um agente que lê só o corpo precisa receber a resposta de hoje. Commite na branch da feature — o `finish` exige a árvore limpa. UCs e ADRs não entram aqui: o `finish` aplica ao acervo o que o `spec.md` declarou revogar (`morph-plan` §3) e reporta em `supersededUseCases`/`adrIndex`/`revocationProblems`.
327
- - **Fechar a feature** com `morph-spec finish {feature} --pr|--merge`, modo escolhido via `AskUserQuestion` (header `"Integração"`): `--pr` (push + PR, review antes do merge) vs `--merge` (integra local, single-user direto). Não integre automaticamente sem essa escolha. Mecânica completa (o que cada modo faz, feature legada sem `morph/{f}`): `MORPH.md` §2.1/§2.2.
328
- - **`--pr` não encerra a feature; quem encerra é o merge.** O comando arquiva e termina (`finished: true`) nos dois modos, mas só `--merge` integra na hora (`integrated: true`); `--pr` sai com `integrated: false`, `awaiting: "merge"` e `pr: {number, url}` — o archive viaja no diff do PR e só chega na branch default quando alguém mergeia. Até lá a feature aparece em `morph-spec list`/`fleet` como `aguardando-merge`, sem cópia local. Nunca registre a feature como entregue só porque `finish --pr` retornou `finished: true`.
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.
329
246
 
330
247
  ## Anti-padrões
331
248
 
332
- - Não dispachar paralelo se há deps cruzadas entre as tasks selecionadas (corrompe ordem).
333
- - Não pular `morph-eval` — uma task só avança com score >= 9; abaixo disso, o loop de correção roda (não pausa).
334
- - Não reescrever spec.md/mandate.md durante implement (são read-only após Gate 2 — `protect-spec-files.js` hook bloqueia).
335
- - Não dispachar mais que 4 agentes em paralelo (sobrecarga de contexto + custo).
336
- - Não dispachar um agente inteiro para uma raiz de effort S — overhead > trabalho; o `morph-spec dag` já as marca como `inline`.
337
- - Não deixar sub-agent tocar `tasks.json`, `feature.json` ou o board de sessão — estado é do orquestrador (cláusula 2 do protocolo).
338
- - Não editar `feature.json` à mão para gravar scores ou decisões de gate — use `morph-spec score` e `morph-spec gate-check`/`gate-decision` (timestamps server-side; o Edit manual colide com o hook state-sync — "file modified since read").
339
-
340
- ## Output esperado
341
-
342
- - Todas as tasks em `tasks.json` com status `done` ou `skipped`.
343
- - `.morph/features/{feature}/3-implement/recap.md` produzido por morph-implement.
344
- - `.morph/features/{feature}/3-implement/evidencias/{taskId}.md` — só nas tasks que o listam em `outputs` (critério sobre saída de LLM, `morph-plan` §5): evidência de runtime gravada por morph-implement e lida pelo avaliador do Gate 3 — não é o `reports/{taskId}.md` do sub-agente.
345
- - `.morph/features/{feature}/4-review/review-report.md` produzido por morph-review.
346
- - Gate 3 registrado aprovado em `.morph/features/{feature}/feature.json` (autoritativo) — via `morph-spec approve` em auto, ou pelo hook state-sync no caminho manual.
347
- - Feature com Gate 3 aprovado e **fechada** por `morph-spec finish --pr|--merge` (arquiva carimbando `status: "completed"` + `archivedAt` e desmonta num passo; `--merge` integra na hora, `--pr` só abre o PR — `aguardando-merge` até o merge) — ou, se legada, por `morph-spec archive`.
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.
253
+ - Rodar teste fora do `verify` no loop do orquestrador: a prova é o verify.
348
254
 
349
255
  ## Referências
350
256
 
351
- - `.morph/framework/MORPH.md` — charter NLH; §6 tem o racional completo do contrato do relatório final (aqui e no `morph-implement` §4 estão só as versões curtas coladas no dispatch)
352
- - `.claude/skills/morph-implement/SKILL.md` — §4 tem o template sequencial paritário a este §3b
353
- - `.claude/skills/morph-eval/SKILL.md`
354
- - `.claude/skills/morph-review/SKILL.md`
355
- - `.claude/skills/morph-plan/SKILL.md` §5a — resolve e carimba `task.agent`/`task.standards` no plano; fonte primária deste §3b
356
- - `morph-spec dag {feature}` — análise de DAG e decisão sequencial vs paralelo (ponderada por effort), incluindo recomendação de isolamento (`isolation.recommended: "worktree"`)
357
- - `morph-spec verify {feature} [task] --json` — cadeia determinística build+testes+validadores+e2e (código antes do juiz)
358
- - `morph-spec score {feature} {task} {score} [--dims a,c,q,t]` — grava taskScores no feature.json com timestamp server-side
359
- - `morph-spec gate-check {feature} {gate} [--json]` — default: coleta sinais do disco, decide via `shouldPauseGate`, persiste `gateDecisions`
360
- - `morph-spec gate-decision {feature} {gate} --pause {bool} [--reason ...] [--signals ...]` — escape manual: risco que o `gate-check` não vê no disco (shape em `.morph/framework/schemas/feature.schema.json`)
361
- - `.morph/framework/MORPH.md` §5 — regras de pausa de gate (trust mode)
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
@@ -4,7 +4,7 @@ description: Entende o negócio, os usuários e a arquitetura antes de qualquer
4
4
  version: core
5
5
  when-to-invoke: ao receber um novo request de feature, antes de morph-plan
6
6
  user-invokable: true
7
- cliVersion: "8.43.0"
7
+ cliVersion: "8.45.0"
8
8
  ---
9
9
 
10
10
  # morph-brainstorming
@@ -4,7 +4,7 @@ description: ADW cirúrgico de hotfix — resolve uma queda/bug crítico de prod
4
4
  version: core
5
5
  when-to-invoke: ao receber "/morph-hotfix {feature}", quando a morph-proposal classifica o pedido como workType hotfix (Passo 0), ou o usuário diz "produção caiu / hotfix / urgente"
6
6
  user-invokable: true
7
- cliVersion: "8.43.0"
7
+ cliVersion: "8.45.0"
8
8
  ---
9
9
 
10
10
  # morph-hotfix
@@ -45,6 +45,8 @@ subagent_type: "morph-scout"
45
45
 
46
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 escreve código. Inclua as 8 cláusulas do contrato do relatório final no prompt (template literal em `morph-implement` §4 / `morph-apply` §3b): relatório no arquivo canônico como retorno, sem `SendMessage`; não tocar `tasks.json`/`feature.json`/`state.json` nem o board de sessão; sem build/test da suíte compartilhada em batch paralelo; no máximo 3 tasks por dispatch; commit `wip({taskId})` ao fim de cada task; nunca `taskkill /IM node.exe`; nunca mutar código de produção para ver teste falhar.
47
47
 
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
+
48
50
  ### 3. Hotfix brief (`0-proposal/proposal.md`)
49
51
 
50
52
  Escreva o brief curto (~20 linhas) reutilizando o nome canônico `proposal.md`:
@@ -61,13 +63,13 @@ Escreva um `tasks.json` mínimo validado contra `.morph/framework/schemas/tasks.
61
63
  - `T1` — o fix.
62
64
  - `T2` — verify/regressão do blast radius.
63
65
 
64
- Isso liga trace/score/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.
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.
65
67
 
66
68
  ### 5. Fix cirúrgico
67
69
 
68
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.
69
71
 
70
- Aplique `morph-eval` com foco em correção: pese `contracts.md` e `test-coverage.md` mais que `architecture.md` — o objetivo do hotfix é parar a sangria com o menor blast radius, não elegância de arquitetura.
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.
71
73
 
72
74
  ### 6. Test loop no blast radius
73
75