@polymorphism-tech/morph-spec 8.44.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 (193) hide show
  1. package/CLAUDE.md +10 -9
  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 +10 -10
  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/statusline.sh +11 -11
  24. package/framework/hooks/git/commit-msg/conventional-commits.sh +33 -33
  25. package/framework/hooks/git/pre-commit/agents.sh +25 -25
  26. package/framework/hooks/git/pre-commit/orchestrator.sh +64 -64
  27. package/framework/hooks/git/pre-commit/specs.sh +50 -50
  28. package/framework/hooks/git/pre-push/run-tests.sh +44 -44
  29. package/framework/hooks/shared/build-check.js +1 -1
  30. package/framework/hooks/shared/comment-scanner.js +1 -1
  31. package/framework/hooks/shared/phase-utils.js +0 -5
  32. package/framework/hooks/shared/stdin-reader.js +26 -26
  33. package/framework/phases.json +4 -6
  34. package/framework/rubrics/backend.json +1 -1
  35. package/framework/rubrics/default.json +1 -1
  36. package/framework/rubrics/frontend.json +1 -1
  37. package/framework/rules/morph-workflow.md +6 -6
  38. package/framework/schemas/feature.schema.json +2 -28
  39. package/framework/schemas/tasks.schema.json +6 -2
  40. package/framework/skills/README.md +1 -2
  41. package/framework/skills/core/create-umbraco-lp/SKILL.md +1 -1
  42. package/framework/skills/core/migrate-lp-to-umbraco/SKILL.md +1 -1
  43. package/framework/skills/core/morph-apply/SKILL.md +145 -246
  44. package/framework/skills/core/morph-brainstorming/SKILL.md +1 -1
  45. package/framework/skills/core/morph-hotfix/SKILL.md +5 -3
  46. package/framework/skills/core/morph-implement/SKILL.md +101 -201
  47. package/framework/skills/core/morph-machine/SKILL.md +3 -3
  48. package/framework/skills/core/morph-media/SKILL.md +1 -1
  49. package/framework/skills/core/morph-plan/SKILL.md +171 -287
  50. package/framework/skills/core/morph-proposal/SKILL.md +4 -5
  51. package/framework/skills/core/morph-review/SKILL.md +109 -430
  52. package/framework/skills/core/morph-stack-scan/SKILL.md +1 -1
  53. package/framework/skills/core/morph-standards/SKILL.md +2 -2
  54. package/framework/skills/core/morph-uiux/SKILL.md +2 -3
  55. package/framework/standards/STANDARDS.json +10 -10
  56. package/framework/standards/ai-agents/agent-archetypes.md +1 -1
  57. package/framework/standards/ai-agents/agent-session.md +1 -1
  58. package/framework/standards/ai-agents/agent-spec.md +1 -1
  59. package/framework/standards/ai-agents/batching.md +1 -1
  60. package/framework/standards/ai-agents/context-providers.md +1 -1
  61. package/framework/standards/ai-agents/conversational-agent-with-phases.md +1 -1
  62. package/framework/standards/ai-agents/cost-and-budget.md +1 -1
  63. package/framework/standards/ai-agents/durable-workflows-hitl.md +1 -1
  64. package/framework/standards/ai-agents/guardrails.md +1 -1
  65. package/framework/standards/ai-agents/llm-runtime-defaults.md +1 -1
  66. package/framework/standards/ai-agents/mcp-server.md +1 -1
  67. package/framework/standards/ai-agents/mcp-tools.md +1 -1
  68. package/framework/standards/ai-agents/media-pipeline.md +1 -1
  69. package/framework/standards/ai-agents/media-video.md +1 -1
  70. package/framework/standards/ai-agents/middleware-patterns.md +1 -1
  71. package/framework/standards/ai-agents/modalities-image-gen.md +1 -1
  72. package/framework/standards/ai-agents/modalities-speech-to-text.md +1 -1
  73. package/framework/standards/ai-agents/modalities-text-to-speech.md +1 -1
  74. package/framework/standards/ai-agents/modalities-vision.md +1 -1
  75. package/framework/standards/ai-agents/multi-agent-patterns.md +1 -1
  76. package/framework/standards/ai-agents/observability-patterns.md +3 -3
  77. package/framework/standards/ai-agents/production.md +2 -2
  78. package/framework/standards/ai-agents/prompt-sources.md +1 -1
  79. package/framework/standards/ai-agents/providers/model-registry.md +1 -1
  80. package/framework/standards/ai-agents/rag-custom-pgvector.md +1 -1
  81. package/framework/standards/ai-agents/service-tier-flex.md +1 -1
  82. package/framework/standards/ai-agents/setup.md +1 -1
  83. package/framework/standards/ai-agents/structured-output.md +1 -1
  84. package/framework/standards/ai-agents/sweet-spot.md +1 -1
  85. package/framework/standards/ai-agents/testing-ai.md +1 -1
  86. package/framework/standards/ai-agents/tool-adapters.md +1 -1
  87. package/framework/standards/ai-agents/vector-data-extensions.md +1 -1
  88. package/framework/standards/ai-agents/workflows.md +1 -1
  89. package/framework/templates/CLAUDE.md.core.template +1 -1
  90. package/framework/templates/IDE-SNIPPETS.md +262 -262
  91. package/framework/templates/README.md +1 -1
  92. package/framework/templates/REGISTRY.json +0 -81
  93. package/framework/templates/code/dotnet/abstractions/api-endpoint.cs +7 -7
  94. package/framework/templates/code/dotnet/feature/endpoint.cs.hbs +21 -21
  95. package/framework/templates/code/dotnet/feature/request.cs.hbs +4 -4
  96. package/framework/templates/code/dotnet/feature/response.cs.hbs +4 -4
  97. package/framework/templates/code/sql/ai-agents/pgvector-embeddings-migration.sql.template +91 -91
  98. package/framework/templates/docs/spec.md +19 -205
  99. package/framework/templates/docs/ui-components.md +52 -52
  100. package/framework/templates/docs/ui-design-system.md +76 -76
  101. package/framework/templates/docs/ui-flows.md +167 -167
  102. package/framework/templates/frontend/nextjs/client-component.tsx.hbs +26 -26
  103. package/framework/templates/frontend/nextjs/feature-form.tsx.hbs +56 -56
  104. package/framework/templates/frontend/nextjs/tsconfig.json.hbs +26 -26
  105. package/framework/templates/infrastructure/docker/Dockerfile.template +58 -58
  106. package/framework/templates/infrastructure/docker/dockerfile-api.dockerfile +38 -38
  107. package/framework/templates/infrastructure/docker/dockerfile-web.dockerfile +48 -48
  108. package/framework/templates/infrastructure/github/README.md +56 -56
  109. package/framework/templates/infrastructure/github/actions/docker-build-push/action.yml.hbs +45 -45
  110. package/framework/templates/infrastructure/github/actions/health-check/action.yml.hbs +27 -27
  111. package/framework/templates/infrastructure/github/workflows/docker-build-push.yml.hbs +59 -59
  112. package/framework/templates/infrastructure/github/workflows/dotnet-build.yml.hbs +39 -39
  113. package/framework/templates/meta-prompts/fusion/fusion-agent.md +76 -76
  114. package/framework/templates/meta-prompts/fusion/fusion-aggregator.md +100 -100
  115. package/framework/templates/meta-prompts/validators/pre-commit-validator.md +95 -95
  116. package/framework/templates/state.template.json +17 -17
  117. package/framework/templates/ui/design-system.css +226 -226
  118. package/package.json +2 -2
  119. package/src/commands/e2e/e2e.js +1 -1
  120. package/src/commands/project/heavy.js +1 -1
  121. package/src/commands/project/status.js +3 -3
  122. package/src/commands/state/approve.js +7 -49
  123. package/src/commands/state/gate-check.js +16 -106
  124. package/src/commands/state/gate-decision.js +1 -1
  125. package/src/commands/state/report-check.js +42 -17
  126. package/src/commands/validation/mutate.js +1 -1
  127. package/src/commands/validation/scout-check.js +28 -0
  128. package/src/commands/validation/validate-feature.js +5 -32
  129. package/src/commands/validation/verify.js +3 -4
  130. package/src/core/paths/output-schema.js +0 -2
  131. package/src/core/state/state-manager.js +1 -2
  132. package/src/core/templates/template-renderer.js +477 -477
  133. package/src/dashboard/app/lib/format.js +5 -0
  134. package/src/dashboard/app/main.jsx +13 -13
  135. package/src/dashboard/app/pages/FeatureDetail.jsx +16 -22
  136. package/src/dashboard/app/pages/Features.jsx +7 -7
  137. package/src/dashboard/app/pages/PhasePipeline.jsx +1 -1
  138. package/src/dashboard/app/pages/Rubrics.jsx +7 -11
  139. package/src/dashboard/scanner/docs-scanner.js +1 -2
  140. package/src/dashboard/scanner/features-scanner.js +3 -4
  141. package/src/dashboard/scanner/rubrics-scanner.js +12 -12
  142. package/src/dashboard/vite.config.js +24 -24
  143. package/src/lib/agents/output-collector.js +0 -1
  144. package/src/lib/detectors/design-system-detector.js +188 -188
  145. package/src/lib/evaluator-report.js +52 -334
  146. package/src/lib/generators/design-system-generator.js +508 -508
  147. package/src/lib/generators/handoff-generator.js +4 -5
  148. package/src/lib/installers/memory-installer.js +2 -2
  149. package/src/lib/mutation/manifest.js +8 -2
  150. package/src/lib/mutation/report.js +5 -3
  151. package/src/lib/mutation/runner.js +9 -7
  152. package/src/lib/risk-detector.js +60 -122
  153. package/src/lib/scout/scout-check.js +293 -0
  154. package/src/lib/tasks/task-classifier.js +30 -30
  155. package/src/lib/tasks/task-parser.js +209 -209
  156. package/src/lib/tasks/tasks-json-parser.js +7 -5
  157. package/src/lib/tasks/test-nodes.js +1 -1
  158. package/src/lib/tasks/test-runner.js +1 -1
  159. package/src/lib/validators/css/css-validator.js +340 -340
  160. package/src/lib/validators/reuse/reuse-validator.js +6 -8
  161. package/src/lib/validators/verify-runner.js +1 -1
  162. package/src/scripts/setup-infra.js +1 -1
  163. package/src/utils/agent-id-mapper.js +11 -11
  164. package/src/utils/agents-installer.js +5 -9
  165. package/src/utils/claude-settings-manager.js +300 -300
  166. package/src/utils/hooks-installer.js +3 -10
  167. package/src/utils/skills-installer.js +1 -1
  168. package/framework/evals/proof-rubrics/README.md +0 -76
  169. package/framework/evals/proof-rubrics/eval-de-modelo.md +0 -80
  170. package/framework/evals/proof-rubrics/fiacao.md +0 -54
  171. package/framework/evals/proof-rubrics/guard-cego.md +0 -52
  172. package/framework/evals/proof-rubrics/media-claims.md +0 -109
  173. package/framework/evals/proof-rubrics/mutation-proof.md +0 -107
  174. package/framework/evals/proof-rubrics/observabilidade-genai.md +0 -119
  175. package/framework/evals/proof-rubrics/verde-nao-e-coberto.md +0 -48
  176. package/framework/evals/rubrics/README.md +0 -45
  177. package/framework/evals/rubrics/architecture.md +0 -103
  178. package/framework/evals/rubrics/code-quality.md +0 -98
  179. package/framework/evals/rubrics/condensed.md +0 -57
  180. package/framework/evals/rubrics/contracts.md +0 -67
  181. package/framework/evals/rubrics/test-coverage.md +0 -99
  182. package/framework/evals/scenarios/dotnet-crud.yaml +0 -42
  183. package/framework/evals/scenarios/nextjs-auth.yaml +0 -38
  184. package/framework/evals/suites/standard.yaml +0 -5
  185. package/framework/hooks/claude-code/core/post-edit-typecheck.js +0 -127
  186. package/framework/skills/core/morph-eval/SKILL.md +0 -64
  187. package/framework/templates/.idea/morph-templates.xml +0 -92
  188. package/framework/templates/.vscode/morph-templates.code-snippets +0 -186
  189. package/framework/templates/docs/clarifications.md +0 -253
  190. package/framework/templates/docs/onboarding.md +0 -122
  191. package/framework/templates/docs/schema-analysis.md +0 -119
  192. package/framework/templates/docs/user-stories.md +0 -34
  193. package/src/commands/state/score.js +0 -147
@@ -4,57 +4,46 @@ description: Guia a execução de cada tarefa de implementação com standard e
4
4
  version: core
5
5
  when-to-invoke: ao iniciar cada task de implementação listada em tasks.json
6
6
  user-invokable: false
7
- cliVersion: "8.44.0"
7
+ cliVersion: "8.45.0"
8
8
  ---
9
9
 
10
10
  # morph-implement
11
11
 
12
12
  ## Objetivo
13
- Garantir que cada tarefa seja executada com o standard correto, a persona de agente adequada,
14
- e que o resultado seja registrado no recap.md ao final.
13
+ Executar uma task com o standard e a persona certos, até o `doneCriteria` valer e o
14
+ `verify` da task ficar verde, e registrar o resultado no recap.
15
15
 
16
16
  ## Quando invocar
17
- Ao iniciar cada task de `tasks.json` — antes de escrever qualquer código. Normalmente invocada pela skill orquestradora `morph-apply`, que passa o objeto da task atual.
17
+ Ao iniciar cada task de `tasks.json`, antes de escrever código. Normalmente chamada pela
18
+ `morph-apply`, que passa a task atual.
18
19
 
19
20
  ## O que fazer
20
21
 
21
- 1. **Leia o plano integral na primeira task da sessão.** No cold start (primeira task que você implementa nesta sessão — início de `/morph-apply`, ou a primeira depois de um `/compact`), **use a tool Read** em `mandate.md`, `spec.md` e `decisions.md` de `.morph/features/{feature}/2-plan/`, nessa ordem, e mantenha-os em contexto pelo resto da sessão. Nunca implemente a primeira task da sessão sem o mandate em contexto.
22
+ 1. **Contexto, uma vez por sessão.** Na primeira task da sessão (ou depois de um `/compact`), Read
23
+ em `2-plan/spec.md`, nos use cases que a task referencia (`2-plan/usecases/UC-*.md`) e em
24
+ `2-plan/decisions.md`. Nas tasks seguintes, **não releia por padrão**: o contrato do plano está
25
+ congelado desde o Gate 2. Releia só o trecho que falta para a task corrente.
22
26
 
23
- **Nas tasks seguintes da MESMA sessão, não releia por padrão.** O conteúdo carregado na task anterior continua válido — o contrato do plano está congelado pós-Gate 2 (`protect-spec-files` bloqueia mudança nos campos de contrato), então reler os três arquivos a cada task é custo sem sinal novo. Releia (o arquivo relevante, não necessariamente os três) só quando:
24
- - houve `/compact` desde a última leitura — o compact pode ter descartado o conteúdo do contexto; ou
25
- - a task corrente referencia um FR ou uma decisão que você não tem em contexto — dúvida legítima, não default cego.
27
+ **Correção** (a `morph-apply` devolveu a task com o `feedback` do verify vermelho ou com critério
28
+ não atendido): corrija esses pontos no código existente — não reimplemente.
26
29
 
27
- > "Na dúvida, Read" continua valendo — mas como **gatilho** de releitura pontual (compact, ou lacuna de conteúdo específico), nunca como default de reler tudo a cada task. Isso é o que muda: o contrato deixou de ser "por task" e passou a ser "por sessão".
30
+ 2. **Standard.** `morph-spec standards --find "<domínio da task>"` devolve `id · path · digest`.
31
+ O digest decide; Read só no `.md` escolhido. Task MAF: os `standards/ai-agents/*.md` relevantes
32
+ valem mesmo com docs externas consultadas. Nenhum standard cobre: registre em `decisions.md` e
33
+ siga o critério mais conservador.
28
34
 
29
- Do `mandate.md`, identifique os standards obrigatórios e patterns proibidos. Do `spec.md`, a arquitetura e as seções de FRs referenciadas pela `description` da task corrente. Do `decisions.md`, as ADRs já registradas — para não contradizê-las nem re-decidir o que já foi decidido.
35
+ 3. **Persona.** `task.agent` e `task.standards` (carimbados pelo `morph-plan`). Plano legado sem
36
+ `agent`: Read em `.morph/framework/agents.json` e escolha por `domains`. O `**Persona:**` do recap
37
+ registra o mecanismo real: `morph-{id}`, `general-purpose (fallback: {id})` ou `inline ({id})`.
30
38
 
31
- **Se a `morph-apply` passou `feedback` de uma tentativa anterior** (loop de correção — a task foi implementada mas o `morph-eval` deu score < 9): isto NÃO é uma implementação do zero. Leia o feedback priorizado, identifique os pontos bloqueantes listados, e **corrija especificamente esses pontos** no código já existente. Não reescreva o que já passou; foque no que o eval apontou. Registre no recap qual feedback foi endereçado em qual tentativa.
39
+ 4. **Despachar ou não.** Despache (`subagent_type: "morph-{id}"`) quando a task muda de domínio,
40
+ tem effort L/XL, já falhou 3 correções no mesmo ponto, exige ler arquivo > 500 linhas, ou repete
41
+ um padrão > 3 vezes. Inline só para S/M no domínio já carregado. O DAG da `morph-apply` decide
42
+ quantas tasks rodam ao mesmo tempo; este passo decide quem executa cada uma.
32
43
 
33
- 2. Identifique o standard mais relevante para a tarefa atual:
34
- - Rode `morph-spec standards --find "<domínio/tecnologia da task>"` (filtros opcionais `--category`, `--tags`, `--json`) — o comando busca em `.morph/framework/standards/STANDARDS.json` e devolve o top 3 candidatos como `id · path · digest`, sem você abrir o index inteiro.
35
- - **O digest decide a escolha.** Escolha 1-3 standards pelo `digest` retornado. Depois, **use a tool Read APENAS no(s) arquivo(s) `.md` escolhido(s)** (campo `path` do resultado) — o digest te diz qual candidato é o certo; o arquivo escolhido se lê inteiro, porque é onde vivem as convenções aplicáveis.
36
- - **Tarefas de agente de IA (MAF):** Read os `.morph/framework/standards/ai-agents/*.md` relevantes para a task. Mesmo que você consulte docs externas (context7) para a superfície da API do `Microsoft.Agents.AI`, as **convenções de projeto** (single-agent por padrão, provider/caching/observability, A2A, middleware) vêm desses standards. Uma fonte externa não as conhece.
37
- - Se nenhum standard cobrir o caso, registre no decisions.md e adote o critério mais conservador.
38
-
39
- 3. Identifique a persona de agente adequada para a tarefa:
40
- - **Fonte primária: `task.agent` do tasks.json.** O `morph-plan` já resolveu `agents.json` uma vez no momento do plano e carimbou `agent` (id da persona, sem prefixo `morph-`) e `standards` por task (ver `morph-plan` §5a) — use esses campos diretamente, sem reabrir `agents.json`.
41
- - **Fallback — plano legado (task sem `agent`):** **use a tool Read em `.morph/framework/agents.json`** — não recupere a persona de memória. Encontre o agente cujo `domains` cobre o domínio da tarefa e leia o campo `persona` para adotar o ponto de vista durante a implementação.
42
- - O array de standards — `task.standards` quando presente, ou o `standards` do agente lido no fallback — é o ponto de partida do passo 2.
43
- - O `**Persona:**` que você grava no recap (passo 6) **deve** refletir o mecanismo REAL usado: `morph-{id}` (dispatch pelo subagent registrado), `general-purpose (fallback: {id})` (tipo não registrado — registre também nas `notes` da task), ou `inline ({id})` (você executou inline adotando a persona). É assim que o reviewer audita contra o que o runtime realmente registrou — uma auto-declaração que não casa com o dispatch é drift.
44
-
45
- 4. Decida se a task deve ser despachada para um sub-agent. Dispatch é o **default** para o caso pesado/multi-domínio (ver `.morph/framework/MORPH.md` seção 6) — despache quando a task dispara qualquer gatilho:
46
- - **Domínio diferente do que você tem carregado agora** (a persona do passo 3 difere da que você vinha usando) — gatilho mais importante: o especialista carrega seus próprios standards sem inchar seu contexto.
47
- - Esforço L ou XL (duração estimada > 5 minutos).
48
- - Mais de 3 tentativas de correção falharam no mesmo problema.
49
- - Análise de arquivo com > 500 linhas.
50
- - Task repetitiva com > 3 instâncias do mesmo padrão.
51
- - Risco de contaminar o contexto principal com detalhes de baixo nível irrelevantes para o fluxo.
52
-
53
- Inline é aceitável só para tasks S/M **dentro do domínio já carregado**. Se for inline numa task que dispara um gatilho, registre a justificativa em uma linha no `decisions.md` — inline silencioso numa task pesada/multi-domínio é o anti-padrão da seção 6.
54
-
55
- > **Relação com `morph-spec dag`:** a decisão do DAG (na `morph-apply` §2) governa o **paralelismo ENTRE tasks** — quantos sub-agents rodam ao mesmo tempo. Os gatilhos acima governam o **dispatch INDIVIDUAL desta task**. São ortogonais e coexistem: `DAG: sequencial` NÃO significa "tudo inline" — significa "uma task por vez, na ordem". Exemplo: cadeia única backend de 12 tasks (DAG: sequencial); T7 tem effort L → despache T7 sozinha para `morph-dotnet-senior` e aguarde o retorno antes de seguir; T8 (S, mesmo domínio) roda inline.
56
-
57
- **Se for despachar — use `subagent_type: "morph-{id}"` do agente identificado no passo 3.** Os subagents são gerados de `agents.json` na instalação (`.claude/agents/morph-{id}.md`) e a persona é o **system prompt** deles — não a cole no prompt. **Fallback:** se `morph-{id}` não estiver na sua lista de subagent types (stack não instalado), use `general-purpose` colando o campo `persona` no prompt e registre nas `notes` da task: `dispatch-fallback: general-purpose ({id} não registrado)`. Template do prompt (cláusulas do relatório em forma curta — racional completo em `MORPH.md` §6). **Cole-o literal**: só os campos entre colchetes mudam; não parafraseie cláusula nem omita os parágrafos de leitura, ferramentas e comentário — foi assim que regras chegaram tortas ao sub-agent em campo:
44
+ Tipo `morph-{id}` não registrado: `general-purpose` com o campo `persona` colado no prompt, e
45
+ `dispatch-fallback: general-purpose ({id} não registrado)` nas `notes` da task.
46
+ Template do prompt para `subagent_type: "morph-{id}"` — cole literal, só os campos entre colchetes mudam:
58
47
  ```
59
48
  Implementar [ID]: [title da task]
60
49
 
@@ -63,11 +52,9 @@ Ao iniciar cada task de `tasks.json` — antes de escrever qualquer código. Nor
63
52
  do .md que ESTA task aplica, coladas. O path vai junto só para consulta
64
53
  pontual — o sub-agente não relê standards inteiros]
65
54
  Arquivos relevantes: [os `target` de task.reuse + o que o scout/grafo apontou
66
- — este campo não é decorativo: é por ele que o código já existente chega
67
- ao sub-agente, que trabalha em contexto fresco e não conhece o projeto.
68
- O que você já leu para esta task entra como `arquivo:linhas` + o trecho]
69
- Reuso: [task.reuse do tasks.json — `CONCEITO: VEREDITO → alvo`, uma linha por
70
- conceito; ausente numa task que não introduz conceito]
55
+ — é por aqui que o código existente chega ao sub-agente, que trabalha em
56
+ contexto fresco. O que você já leu entra como `arquivo:linhas` + o trecho]
57
+ Reuso: [task.reuse — `CONCEITO: VEREDITO → alvo`, uma linha por conceito]
71
58
  Done quando: [doneCriteria do tasks.json]
72
59
 
73
60
  Antes de criar tipo, componente, hook ou serviço NOVO, verifique se já
@@ -87,21 +74,20 @@ Ao iniciar cada task de `tasks.json` — antes de escrever qualquer código. Nor
87
74
  Ferramentas: antes de supor a API de uma biblioteca (MAF, EF Core, Next,
88
75
  shadcn, SDK de provedor), consulte o MCP `context7` (`resolve-library-id` →
89
76
  `query-docs`). Impacto e vizinhança de símbolo vêm do grafo
90
- (`morph-spec graph`), não de varredura por grep. Tool `mcp__…` que não esteja
91
- carregada se carrega com `ToolSearch` (`select:<nome>`); MCP ausente nunca
92
- bloqueia — siga com o fallback.
77
+ (`morph-spec graph`). Tool `mcp__…` não carregada se carrega com `ToolSearch`
78
+ (`select:<nome>`); MCP ausente nunca bloqueia — siga com o fallback.
93
79
 
94
80
  Comentário: o padrão é nenhum. Nome, tipo e teste explicam o código; sem
95
81
  `///`/JSDoc em membro de aplicação, cabeçalho, banner de seção ou história
96
82
  da task. Só o porquê que o código não mostra, em uma linha
97
83
  (`architecture-code-comments`). O elo com a pós-condição vai no nome do
98
- teste; a densidade do arquivo vizinho não é modelo. O hook `comment-guard`
99
- bloqueia a edição que adiciona história, banner ou bloco longo.
84
+ teste. O hook `comment-guard` bloqueia a edição que adiciona história,
85
+ banner ou bloco longo.
100
86
 
101
87
  Contrato do relatório final:
102
88
  1. GRAVE `.morph/features/{feature}/3-implement/reports/[ID].md` ANTES de
103
- encerrar — é o retorno autoritativo, não a sua mensagem final (que é
104
- cortesia best-effort e pode não chegar inteira). NÃO chame SendMessage.
89
+ encerrar — é o retorno autoritativo, não a sua mensagem final. NÃO chame
90
+ SendMessage.
105
91
  2. NÃO toque em tasks.json, feature.json, state.json nem no board de sessão
106
92
  — todo estado é gravado exclusivamente pelo orquestrador.
107
93
  3. TESTE — a prova é do orquestrador (`morph-spec verify {feature} {task}`,
@@ -109,186 +95,100 @@ Ao iniciar cada task de `tasks.json` — antes de escrever qualquer código. Nor
109
95
  um por pós-condição, um de regressão por bug, variantes numa tabela
110
96
  (`[Theory]`/`it.each`). NÃO rode teste a cada marco nem faça ciclo
111
97
  red→green: escreva código e testes, compile, e rode SÓ o filtro dos seus
112
- testes UMA vez, antes do relatório; se falhar, corrija e rode só os que
113
- falharam. Em batch paralelo SEM isolamento, só compile — o teste roda no
114
- verify pós-batch. Em batch COM `isolation: "worktree"`, o mesmo vale no
115
- seu worktree, e o último ato antes do relatório é o commit na branch do
116
- worktree — nunca faça merge; worktree não commitado NÃO é removido pelo
117
- hook e vira pendência do `doctor`. Ao rodar: compile uma vez e rode sem
118
- recompilar (`dotnet test --no-build`), com `--filter`. Grave a saída em
119
- arquivo uma vez (`… > .morph/logs/test-last.log 2>&1`, sem nada depois)
120
- e leia o arquivo: rodar de novo com outro `| tail`/`| grep` repete o teste
121
- para ver outras linhas, e com pipe ou `; echo` o exit é o do último
122
- comando, não o do teste.
123
-
98
+ testes UMA vez, em primeiro plano, antes do relatório; se falhar, corrija e rode só os que falharam. Grave a
99
+ saída em arquivo (`… > .morph/logs/test-last.log 2>&1`, sem nada depois)
100
+ e leia o arquivo — um pipe troca o exit do teste pelo do último comando.
101
+ Em batch paralelo SEM isolamento, só compile. Com `isolation: "worktree"`,
102
+ o mesmo vale no seu worktree, e o último ato é o commit na branch dele.
124
103
  4. ESCOPO: no máximo 3 tasks e ~4 arquivos por dispatch. Escopo maior falha e
125
104
  volta — fatie antes, não depois.
126
105
  5. SOBREVIVÊNCIA: o limite de turnos (`maxTurns`, no seu system prompt)
127
106
  corta sem aviso: commite `wip({taskId})` a cada marco (um arquivo ou
128
- uma fatia coerente escrita — sem rodar teste para isso), não só ao fim da task — e só os seus arquivos
107
+ uma fatia coerente escrita), não só ao fim da task — e só os seus arquivos
129
108
  (`git add <paths>`, nunca `-A`). Sem commit, a retomada recomeça do zero.
130
109
  A ~70% do limite, grave o relatório parcial no arquivo canônico: `PARCIAL`
131
- na 1ª linha, o feito e o que falta, sem auto-score. Depois siga ou pare,
132
- por decisão sua; ao concluir, o relatório final substitui o parcial, sem o
133
- `PARCIAL`. Sem limite declarado, bastam os commits por marco.
110
+ na 1ª linha, o feito e o que falta, sem critério dado como atendido. Depois
111
+ siga ou pare, por decisão sua; o relatório final substitui o parcial.
134
112
  6. PROCESSOS: NUNCA `taskkill /IM node.exe` (derruba os MCPs de todas as
135
113
  sessões). Encerre dev server pelo PID que você mesmo subiu. Build e
136
- suíte pesados (`dotnet build`, `dotnet test`, `docker compose up`) rodam
137
- por `morph-spec heavy run -- <comando>`: exit 3 é fila cheia, não erro do
138
- código — espere e repita.
114
+ suíte pesados rodam por `morph-spec heavy run -- <comando>`, em primeiro
115
+ plano. Exit 3 é fila cheia depois da espera da própria fila: não repita
116
+ nem espere em laço — diga no relatório o que não rodou.
139
117
  7. RETORNO: o relatório no arquivo canônico é o retorno. `SendMessage` não é
140
118
  substituto do relatório e não deve ser chamado.
141
119
  8. MUTAÇÃO: nunca altere, reverta, mova ou apague código de produção para ver
142
120
  um teste falhar (`sed`, `mv`, `git show HEAD:… >`, `git stash`, `git
143
121
  checkout --`). A prova de que o teste morde é do avaliador no Gate 3.
144
122
 
145
- Seu relatório (no arquivo, e na mensagem final quando ela chega) deve conter
146
- APENAS: (1) o que foi feito em 2-3 frases, (2) arquivos modificados,
147
- (3) problemas encontrados e como foram resolvidos, (4) auto-score 0-10 com
148
- justificativa em uma linha. Relatório ausente, oco, ou sem os 4 itens, é
149
- falha de protocolo.
123
+ Formato do relatório:
124
+ (1) o que foi feito, em 2-3 frases;
125
+ **Arquivos:** um item `- \`path\`` por arquivo criado ou modificado;
126
+ **Critérios:** cada doneCriteria — atendido (o teste ou `arquivo:linha` que o
127
+ prova) ou não atendido (por quê);
128
+ (4) problemas encontrados e como foram resolvidos.
150
129
  ```
151
- **Passo pós-dispatch (seu, antes de avaliar o relatório):** rode
152
- `morph-spec report-check {feature} {taskId} --json` ao retomar o controle. Além do veredito do
153
- relatório, o bloco `tree` traz o que está não commitado fora de `.morph/` (`dirty`, `diffstat`),
154
- os commits sobre a default (`commits`) e os marcadores `MUTACAO` esquecidos (`markers`) — a
155
- conferência de `git status`, `git diff` e `grep`, numa chamada só. Um sub-agent morto no meio
156
- deixa o disco a meio caminho — e um relatório lido sobre uma árvore que ninguém conferiu avalia
157
- um estado que ninguém quis. Árvore inesperadamente suja ou `markers` não vazio é falha de
158
- protocolo: registre no recap antes de pontuar. Essa saída serve ao passo 7 enquanto a árvore
159
- não mudar; depois de uma correção sua, rode de novo. Dispatch com `isolation: "worktree"`:
160
- depois de ler o relatório, `morph-spec worktree reap --json` remove o worktree do agent que parou
161
- limpo e sem commit exclusivo; o que fica vem listado com a razão.
162
-
163
- Após o retorno do dispatch: **leia primeiro** `.morph/features/{feature}/3-implement/reports/[ID].md`
164
- — é o valor de retorno autoritativo. Trate a mensagem de texto do sub-agent, se chegou inteira,
165
- como um atalho que economiza essa leitura — nunca como a única fonte. Arquivo ausente é falha de
166
- protocolo (registre no recap e re-despache/complete a partir do que o sub-agent já fez, se
167
- recuperável). O auto-score é **triagem, não aprovação** — se < 7, re-despache com o feedback
168
- específico (ou corrija inline) antes de prosseguir. Em qualquer caso, a task só avança quando
169
- `morph-eval` der score ≥ 9 (barra única do MORPH.md §0). Integre o relatório ao recap.md e vá
170
- para o passo 7 — se a task deve evidência de runtime (`evidencias/` em `outputs`), confira o
171
- arquivo como manda o passo 5 antes do `done`.
172
-
173
- **Relatório com `PARCIAL` na 1ª linha = a task não está pronta**: o sub-agent parou antes do fim
174
- (limite de turnos, cláusula 5). O `report-check` o acusa como `report-incomplete`, e aqui a ação é
175
- retomar, não completar DEGRADADO: retome o MESMO agente por `SendMessage`, colando no recado
176
- `tree.dirty` e `tree.commits` do `report-check` e o que falta (ele guarda o contexto), ou
177
- re-despache só o que falta a partir do último `wip`. Nunca pontue nem marque `done` sobre um
178
- parcial.
179
-
180
- **Se não — siga para o passo 5.**
181
-
182
- 5. Implemente a tarefa seguindo o standard e a persona identificados.
183
- Se encontrar ambiguidade de escopo não coberta pelo mandate, registre no decisions.md
184
- e resolva da forma mais conservadora — não pause para perguntar, a menos que seja bloqueante.
185
- Testes rodados durante a implementação inline seguem a cláusula 3 do template do passo 4
186
- (sem red→green, uma rodada do filtro no fim, saída em arquivo) e a 8 (sem mutação).
187
-
188
- **Task com `3-implement/evidencias/{ID}.md` em `outputs`** (critério sobre saída de LLM —
189
- `morph-plan` §5): rode o eval ANTES de marcar `done` — e só o eval. Com nó `runner: "evals"`
190
- declarado, `morph-spec verify {feature} --filter {id-do-nó-evals} --skip-e2e --no-persist`:
191
- escopo de feature porque no de task o nó `evals` é pulado; `--filter` só estreita o nó de testes
192
- (build e validadores rodam; o e2e subiria o stack, daí `--skip-e2e`); `--no-persist` garante que
193
- esta execução nunca escreve no `feature.json` — é sonda, não prova para gate nenhum.
194
- É a única exceção ao passo 9. Sem nó `evals`, execute o eval direto e registre
195
- "nenhum nó — execução manual". Grave o arquivo com: o critério (literal); o id do nó e o
196
- cenário (ou aquele rótulo); o modelo efetivo; a versão ou o hash do prompt, nunca o prompt cru;
197
- entrada e saída sem dado pessoal (`ai-agents-testing-ai`, "Captura do que foi ao provedor"); o
198
- veredito com a razão. Não é o `reports/{ID}.md`: aquele diz o que o sub-agente fez; este prova,
199
- rodando, que a saída do modelo atende ao critério. Vale também para task despachada — sem o
200
- arquivo, ela não vai para `done` (passo 8).
201
-
202
- 6. Ao concluir a tarefa, **append** um bloco a `recap.md` em `.morph/features/{feature}/3-implement/`
203
- usando este template **obrigatório** (campos não-opcionais — sem standard, a entrada não conta):
204
-
130
+ **Passo pós-dispatch (seu, ao retomar o controle):** `morph-spec report-check {feature} {taskId} --json`. O veredito do
131
+ relatório e o bloco `tree` (`dirty`, `diffstat`, `commits`, `markers`) mostram o disco que o agente
132
+ deixou. Árvore suja sem explicação ou `markers` não vazio: registre no recap. Com
133
+ `isolation: "worktree"`, depois de ler o relatório rode `morph-spec worktree reap --json`.
134
+
135
+ **Leia `3-implement/reports/[ID].md`** — a mensagem de texto do agente é atalho, nunca a fonte.
136
+ Arquivo ausente é falha de protocolo: registre e complete a partir do que ficou no disco.
137
+
138
+ **`PARCIAL` na 1ª linha = a task não está pronta** — o `report-check` o acusa como `report-incomplete`.
139
+ Retome o MESMO agente por `SendMessage`,
140
+ colando `tree.dirty`, `tree.commits` e o que falta; ou re-despache só o que falta a partir do
141
+ último `wip`. Nunca marque `done` sobre um parcial.
142
+
143
+ 5. **Implementação inline.** Siga o standard e a persona. Ambiguidade não coberta pelo plano:
144
+ registre em `decisions.md` e resolva pelo lado conservador, sem pausar. Testes: as cláusulas 3 e 8
145
+ do template valem para você também.
146
+
147
+ **Task com `3-implement/evidencias/{ID}.md` em `outputs`** (critério sobre saída de LLM): rode o
148
+ eval antes do `done`, e só ele. Com nó `runner: "evals"`:
149
+ `morph-spec verify {feature} --filter {id-do-nó-evals} --skip-e2e --no-persist` — escopo de
150
+ feature porque no de task o nó `evals` é pulado; `--skip-e2e` porque o stack subiria;
151
+ `--no-persist` porque esta execução é sonda, não prova de gate. Sem nó `evals`, rode o eval direto
152
+ e registre "nenhum nó — execução manual". O arquivo traz: o critério (literal), o nó e o cenário,
153
+ o modelo efetivo, a versão ou o hash do prompt (nunca o prompt cru), entrada e saída sem dado
154
+ pessoal, e o veredito com a razão. Não é o `reports/{ID}.md`: aquele diz o que o agente fez; este
155
+ prova, rodando, que a saída atende ao critério.
156
+
157
+ 6. **Recap.** Append em `3-implement/recap.md`:
205
158
  ```markdown
206
159
  ## T{N} — {title}
207
160
 
208
161
  **Standard:** {standard-id} (`.morph/framework/standards/{path}.md`)
209
- **Persona:** {mecanismo real — `morph-{id}` | `general-purpose (fallback: {id})` | `inline ({id})`}
162
+ **Persona:** {`morph-{id}` | `general-purpose (fallback: {id})` | `inline ({id})`}
210
163
  **Files:**
211
164
  - `{path}`
212
- - `{path}`
213
165
 
214
- {2-3 frases sobre o que foi feito}
215
-
216
- **Issues encontrados:** {breve descrição ou "nenhum"}
166
+ {2-3 frases}
217
167
  ```
168
+ Sem standard que cubra: `Standard: ad-hoc (see decisions.md ADR-{N})`. O `validate-completion`
169
+ cobra o bloco.
218
170
 
219
- Regras:
220
- - **Standard é obrigatório** — sempre referenciar pelo menos um standard de
221
- `.morph/framework/standards/STANDARDS.json` que justificou as escolhas de implementação.
222
- Se nenhum standard existente cobre, registre a decisão em `decisions.md` E cite
223
- `Standard: ad-hoc (see decisions.md ADR-{N})` no recap.
224
- - Sem standard ⇒ a task falha no validador de Gate 3 (`validate-completion`)
225
- e o reviewer não consegue auditar de onde veio a decisão técnica.
226
-
227
- 7. **Antes de marcar a task como `done`, audite o relatório contra o trabalho:**
228
-
229
- ```
230
- morph-spec report-check {feature} {taskId} --json
231
- ```
232
-
233
- Não é burocracia — é a única checagem que não depende da palavra do agente. Veredito
234
- `report-stale` significa **relatório completo e VELHO**: a task seguiu escrevendo arquivos depois
235
- que ele foi gravado, então o texto descreve um estado já ultrapassado. Aconteceu de verdade: o
236
- sub-agent gravou o esqueleto dizendo "teste ainda não escrito — em andamento", escreveu os 9
237
- testes, e foi cortado antes de atualizar. Quem leu o relatório quase marcou a task como
238
- incompleta e re-despachou trabalho pronto. **Nesse caso não re-despache**: leia `observed`
239
- (arquivos realmente escritos, do `events.jsonl`, não auto-declarados) e atualize o relatório a
240
- partir dessa evidência. Demais vereditos: tabela em `MORPH.md` §6.
241
-
242
- 8. Atualizar `tasks.json` marcando a task como `done` — **direto com a tool `Edit` (ou `Write`)**, sem scripts:
243
-
244
- - Mude apenas os campos mutáveis da task: `status` (enum válido: `pending`,
245
- `in_progress`, `done`, `skipped`, `blocked` — nunca invente valores como
246
- `"completed"`), `outputs` (paths realmente produzidos) e `notes`.
247
- - **`outputs` contém apenas paths realmente produzidos.** Deleções, remoções
248
- e anotações (ex.: `"pasta/ (removido: a, b)"`) se registram em `notes`,
249
- nunca em `outputs`. E `notes` é **uma string única** — não um array.
250
- - **`outputs` DEVE listar TODO arquivo criado ou modificado pela task — sem exceção.**
251
- Isso inclui artefato auxiliar que não estava no plano original (ex.: uma
252
- factory de design-time, um seed, um arquivo de config gerado a reboque de
253
- outro output) — se a task o produziu, ele entra em `outputs` junto com o
254
- resto. Arquivo shipped sem dono em `outputs` de task alguma é falha de
255
- protocolo: o Gate 3 (avaliador independente da `morph-review`) aponta como
256
- achado de rastreabilidade, mesmo que o arquivo em si esteja correto — quem
257
- lê `tasks.json`/`recap.md` depois precisa achar todo arquivo em produção
258
- citado em algum lugar, e é essa a lacuna que este parágrafo fecha.
259
- - **Se os `outputs` reais divergirem dos planejados**, registre o porquê em
260
- `notes` na mesma edição — o hook exige a note quando há divergência (e a
261
- mensagem de violação aponta o campo/valor exato do problema). Isto é o
262
- caso mais comum em que a regra acima se aplica: todo arquivo extra na lista
263
- de "realmente produzidos" acima do planejado é, por definição, uma
264
- divergência real vs. planejado — a note explica o porquê.
265
- - `tasks.json` é protegido após o Gate 2: o hook `protect-spec-files` faz diff
266
- semântico e libera Write ou Edit desde que nenhum campo de contrato do plano
267
- (`title`, `description`, `dependencies`, `effort`, `doneCriteria`, `group`)
268
- mude e o schema continue válido.
171
+ 7. **Audite antes do `done`:** `morph-spec report-check {feature} {taskId} --json`. `report-stale` =
172
+ relatório completo e velho (a task seguiu escrevendo depois dele): **não re-despache** — leia
173
+ `observed` (escritas reais, do `events.jsonl`) e atualize o relatório. Demais vereditos:
174
+ `MORPH.md` §6.
269
175
 
270
- > **Trace automático:** este write de `tasks.json` dispara o hook `trace-autogen`,
271
- > que gera/atualiza `.morph/traces/YYYY-MM-DD-{feature}-implement.json` a partir de
272
- > tasks.json + recap.md + `taskScores` do feature.json. **NÃO escreva o trace
273
- > manualmente** — a escrita manual foi removida da cerimônia por task.
176
+ 8. Atualizar `tasks.json` marcando a task como `done` (Edit, só campos mutáveis):
177
+ - `status`: `pending` | `in_progress` | `done` | `skipped` | `blocked`.
178
+ - `outputs` DEVE listar TODO arquivo criado ou modificado pela task, inclusive artefato auxiliar
179
+ fora do plano (factory, seed, config gerada). Arquivo em produção sem dono em `outputs` é falha de
180
+ protocolo que o Gate 3 aponta. Deleções vão em `notes` (string única), nunca em `outputs`.
181
+ - Divergiu do planejado: o porquê em `notes` na mesma edição — o hook exige.
274
182
 
275
- 9. Quando invocada por `morph-apply`, retornar o controle à skill orquestradora — ela decide qual task vem em seguida via `getReadyTasks(data)`. Não rode a suíte de testes inteira do projeto por conta própria ao fim da task quando invocada pela `morph-apply` — a verificação determinística (`morph-spec verify {feature} {task}`) é do orquestrador, logo após seu retorno (ver morph-apply §3a). **`verify` com exit 3** (`status: "busy"`) é fila de slot pesado cheia, não vermelho: nada foi verificado e nada foi gravado — repita a mesma chamada em vez de abrir uma tentativa de correção. **Única exceção:** a execução de evidência do passo 5 — só o nó `evals`, filtrado, com `--skip-e2e`, nunca persistida (`--no-persist`); ela não é a verificação da task e não substitui a do orquestrador. **A divisão:** no loop por task o recorte é **automático** — o `group` da task escolhe as suítes e os arquivos de teste dos `outputs` (passo 8) estreitam o comando dentro de cada uma (o relógio de uma task não paga a suíte inteira); `--filter {ids}` só força a escolha de suítes (um nó não casado aparece como `skip` nomeando o filtro, e um filtro que não casa nada é erro de uso, exit 2) e `--full` desliga o recorte. O sub-agent despachado roda só o filtro dos próprios testes, uma vez (cláusula 3), e nunca o `verify`. A suíte **inteira** roda no Gate 3 e no CI, sem filtro — `verify {feature}` nunca recorta. A suíte completa de um projeto grande não cabe numa invocação de Bash do harness — rode em background ou por partes, nunca "suba o limite" (não há constante de timeout global no CLI). Detalhe e forma de `project.tests[]`: `.morph/framework/CLI.md`, seção "Suítes de teste". Quando invocada manualmente, verificar se há próxima task ready e iniciá-la imediatamente aplicando esta skill desde o passo 1 (auto-advance). Pause apenas se encontrar ambiguidade bloqueante não coberta pelo mandate.
183
+ 9. Quando invocada por `morph-apply`, devolva o controle a ela e não rode a suíte do projeto: o `verify {feature} {task}` é do orquestrador. **Única exceção:** a execução de evidência do passo 5, filtrada ao nó `evals`, com `--skip-e2e` e `--no-persist`. No loop por task o recorte é automático (o `group` escolhe as suítes, os testes de `outputs` estreitam o comando; `--filter` só força a escolha de suítes, `--full` desliga o recorte); a suíte inteira roda no Gate 3 e no CI, sem filtro. Invocada manualmente: siga para a próxima task ready.
276
184
 
277
185
  ## Output esperado
278
- - Código implementado conforme o standard consultado (direto ou via sub-agent)
279
- - Quando despachada: `.morph/features/{feature}/3-implement/reports/{taskId}.md` — o relatório
280
- autoritativo do sub-agent, canal durável (passo 4)
281
- - Na task com `3-implement/evidencias/{taskId}.md` em `outputs`: esse arquivo — a evidência de
282
- runtime do eval (passo 5), distinta do relatório do sub-agent em `reports/`
283
- - `.morph/features/{feature}/3-implement/recap.md` atualizado com entrada da task concluída
284
- - `.morph/features/{feature}/2-plan/tasks.json` com status da task atualizado para `done`
285
- - `.morph/features/{feature}/2-plan/decisions.md` atualizado se houver decisão não trivial
286
- - Trace em `.morph/traces/` gerado automaticamente pelo hook `trace-autogen` (a skill não o escreve)
186
+ - Código conforme o standard; `3-implement/reports/{taskId}.md` quando despachada
187
+ - `3-implement/evidencias/{taskId}.md` na task que o lista em `outputs`
188
+ - `recap.md` com o bloco da task; `tasks.json` com a task `done`
189
+ - `decisions.md` quando houve decisão não trivial
287
190
 
288
191
  ## Referências
289
- - `morph-spec standards --find "<query>" [--category] [--tags] [--json]` — busca de standard por digest (passo 2); não abre `STANDARDS.json` inteiro
290
- - `.morph/framework/agents.json` — personas dos agentes por domínio; lido apenas no fallback do passo 3 (task sem `agent` — plano legado)
291
- - `.morph/framework/MORPH.md` seção 6 — critérios de dispatch e contrato de retorno do sub-agent
292
- - `.morph/features/{feature}/2-plan/mandate.md` — contrato da feature
293
- - `.morph/features/{feature}/2-plan/tasks.json` — `task.agent`/`task.standards` carimbados pelo `morph-plan` §5a (fonte primária dos passos 2 e 3)
294
- - `.morph/framework/schemas/tasks.schema.json` — schema de tasks.json (enum de status e campos)
192
+ - `morph-spec standards --find` — passo 2
193
+ - `.morph/framework/MORPH.md` §6 — dispatch e contrato do relatório
194
+ - `.morph/framework/CLI.md`, seção "Suítes de teste" — recorte por task
@@ -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-invoke: quando a máquina está 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-invokable: false
7
- cliVersion: "8.44.0"
7
+ cliVersion: "8.45.0"
8
8
  ---
9
9
 
10
10
  # morph-machine
@@ -16,7 +16,7 @@ Manter a máquina do dev utilizável enquanto o trabalho paralelo do morph-spec
16
16
  ## Regras que não se negociam
17
17
 
18
18
  - **Nunca** `taskkill /IM`, `pkill`, `killall` nem `Stop-Process -Name`: derrubam os MCPs de todas as sessões abertas. O único que encerra processo é `doctor --procs --prune`, e por PID.
19
- - **Fila cheia não é erro de código.** `⏳ … não rodou`, `slots pesados ocupados` e exit 3 querem dizer "espere e repita o MESMO comando". Não entra no loop de correção, não conta como tentativa e não é vermelho no `verify`.
19
+ - **Fila cheia não é erro de código.** `⏳ … não rodou`, `slots pesados ocupados` e exit 3 querem dizer que a fila já esperou o prazo dela (`heavy.waitTimeoutSec`). Não entra no loop de correção, não conta como tentativa e não é vermelho no `verify`. No máximo uma chamada nova; persistiu, siga sem aquela rodada e avise o usuário — nunca `sleep`/`until` nem retentativa agendada.
20
20
  - **Nunca remova worktree** por `git worktree remove`, `rm -rf` ou `Remove-Item -Recurse`: atravessa a junction e apaga o conteúdo real da raiz. Só `finish`, `worktree remove` ou `worktree reap`.
21
21
  - **Destrutivo pergunta antes.** `doctor --procs --prune` e `worktree reap` (sem `--dry-run`): mostre a lista e use `AskUserQuestion`.
22
22
 
@@ -25,7 +25,7 @@ Manter a máquina do dev utilizável enquanto o trabalho paralelo do morph-spec
25
25
  | Sintoma | Comando | Como ler e o que fazer |
26
26
  |---|---|---|
27
27
  | Máquina ou editor lento, pouca RAM | `morph-spec doctor --procs` (só lê) | Cada linha diz órfão ou protegido, com a razão. Sem órfão, a pressão vem de fora (vmmem do WSL, IDE): diga isso e passe a sugestão de `.wslconfig` que o relatório traz. Com órfão, mostre a lista e ofereça `--prune`. |
28
- | Comando voltou `⏳ … não rodou` ou exit 3 | `morph-spec heavy status` | Mostra quem segura cada vaga, há quanto tempo, e a RAM livre. A vaga solta sozinha (processo morto ou timeout). Espere e repita. Se a causa for RAM e nenhuma vaga estiver presa, rode `doctor --procs`. |
28
+ | Comando voltou `⏳ … não rodou` ou exit 3 | `morph-spec heavy status` | Mostra quem segura cada vaga, há quanto tempo, e a RAM livre. A vaga solta sozinha (processo morto ou timeout). Vaga presa por sessão viva: diga ao usuário quem a segura. Se a causa for RAM e nenhuma vaga estiver presa, rode `doctor --procs`. |
29
29
  | Vão rodar vários sub-agents pesados em paralelo | `morph-spec heavy status` antes | São 2 vagas por padrão. O que não couber espera na fila sem falhar, mas cada espera custa turnos: despache só o que cabe. |
30
30
  | Build ou teste pesado avulso, fora do `verify` | `morph-spec heavy run -- <comando>` | Ou ligue o `heavy.gateBash` (abaixo) e o hook cuida disso. |
31
31
  | Sobrou `agent-*` em `worktrees/` ou branch `morph-task/agent-*` | `morph-spec worktree reap --dry-run`, depois `worktree reap` | Só remove o que parou, está limpo e não tem commit exclusivo; o resto volta com a razão (`dirty`, `locked`…). `doctor --worktrees` lista tudo, inclusive árvore fora do contêiner. |
@@ -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-invoke: quando a tarefa é PRODUZIR imagem ou vídeo por IA (catálogo, marketing, asset de LP) e alguém precisa decidir modelo, prompt e aprovação
6
6
  user-invokable: true
7
- cliVersion: "8.44.0"
7
+ cliVersion: "8.45.0"
8
8
  stacks:
9
9
  - dotnet
10
10
  - nextjs