@polymorphism-tech/morph-spec 8.40.0 → 8.41.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 (45) hide show
  1. package/CLAUDE.md +2 -2
  2. package/README.md +2 -2
  3. package/claude-plugin.json +1 -1
  4. package/docs/CHEATSHEET.md +1 -1
  5. package/docs/QUICKSTART.md +1 -1
  6. package/framework/CLAUDE.md +1 -1
  7. package/framework/MORPH.md +9 -8
  8. package/framework/agents.json +8 -2
  9. package/framework/docs/CLI.md +5 -3
  10. package/framework/hooks/README.md +1 -1
  11. package/framework/hooks/claude-code/core/telemetry-log.js +39 -8
  12. package/framework/hooks/claude-code/core/worktree-create.js +22 -6
  13. package/framework/hooks/shared/git-paths.js +38 -5
  14. package/framework/mcp/registry.json +26 -65
  15. package/framework/skills/core/create-umbraco-lp/SKILL.md +1 -1
  16. package/framework/skills/core/migrate-lp-to-umbraco/SKILL.md +1 -1
  17. package/framework/skills/core/morph-apply/SKILL.md +55 -25
  18. package/framework/skills/core/morph-brainstorming/SKILL.md +1 -1
  19. package/framework/skills/core/morph-eval/SKILL.md +1 -1
  20. package/framework/skills/core/morph-hotfix/SKILL.md +2 -2
  21. package/framework/skills/core/morph-implement/SKILL.md +43 -24
  22. package/framework/skills/core/morph-media/SKILL.md +2 -2
  23. package/framework/skills/core/morph-plan/SKILL.md +7 -1
  24. package/framework/skills/core/morph-proposal/SKILL.md +1 -1
  25. package/framework/skills/core/morph-review/SKILL.md +1 -1
  26. package/framework/skills/core/morph-stack-scan/SKILL.md +1 -1
  27. package/framework/skills/core/morph-standards/SKILL.md +1 -1
  28. package/framework/skills/core/morph-uiux/SKILL.md +3 -3
  29. package/framework/standards/PROVENANCE.json +4 -4
  30. package/framework/standards/STANDARDS.json +6 -6
  31. package/framework/standards/backend/dotnet/testing.md +4 -2
  32. package/framework/standards/frontend/design-system/ai-image-generation.md +42 -28
  33. package/framework/standards/frontend/design-system/ai-video-generation.md +24 -9
  34. package/framework/standards/frontend/nextjs/testing.md +4 -2
  35. package/framework/standards/integration/mcp/mcp-tools.md +19 -12
  36. package/package.json +1 -1
  37. package/src/commands/project/doctor.js +9 -1
  38. package/src/commands/project/worktree.js +60 -4
  39. package/src/commands/state/gate-check.js +5 -0
  40. package/src/commands/tasks/dag.js +27 -4
  41. package/src/commands/validation/verify.js +22 -38
  42. package/src/lib/risk-detector.js +13 -0
  43. package/src/lib/tasks/tasks-json-parser.js +21 -0
  44. package/src/lib/worktree/env-allocator.js +9 -3
  45. package/src/utils/agents-installer.js +51 -1
@@ -167,62 +167,21 @@
167
167
  "description": "Official Stitch agent skills for Claude Code — design generation, multi-page loops, design.md export"
168
168
  }
169
169
  },
170
- "gemini-image": {
170
+ "morph-assets": {
171
171
  "phases": ["uiux", "implement"],
172
- "tools": ["generate_image", "edit_image", "continue_editing", "list_images", "get_image_info", "get_configuration_status"],
173
- "serverNames": ["gemini-image", "gemini-image-mcp"],
174
- "detection": "mcpServers includes gemini-image-mcp",
175
- "fallback": "Manual image creation, stock photos, or placeholder divs",
176
- "usage": "AI image generation for project assets (heroes, illustrations, brand images) using Gemini models",
172
+ "tools": ["generate_image", "edit_image", "continue_editing", "generate_video", "generate_loop_video", "get_video", "media_tool", "list_models", "library", "usage"],
173
+ "serverNames": ["morph-assets"],
174
+ "detection": "mcpServers includes morph-assets",
175
+ "fallback": "Manual image creation, stock photos or client-provided footage; a static poster image instead of video. Canvas frame-scrub works from any frame sequence, AI-generated or not",
176
+ "usage": "Single MCP for AI image and video generation plus local post-production, all models via OpenRouter. Images: default openai/gpt-image-2.5-flare, drafts microsoft/mai-image-2.6-flash, google/gemini-3.1-flash-image for 2K/4K or 6-14 references; `models` compares the same request across 2-4 models. Video: default bytedance/seedance-1-5-pro (draft/loop), final bytedance/seedance-2.0 1080p via promoteFrom; generate_video with endImage produces the directional footage that frame-scrub needs (start frame differs from end frame), generate_loop_video is only for seamless ambient loops. media_tool (ffmpeg) extracts scrub frames, posters, concat, compress and builds the approval picker. library replaces the old list_images/get_image_info/list_videos",
177
177
  "healthCheck": {
178
- "toolPattern": "gemini-image",
179
- "testCall": "Call get_configuration_status to verify API key and server health",
180
- "testParams": {},
181
- "successIndicator": "Returns status with valid API key configured",
182
- "failureHint": "Gemini Image MCP not responding. Check that GEMINI_API_KEY is set in the MCP env config and that MORPH_HUB points at a built morph-HUB checkout."
183
- },
184
- "install": {
185
- "autoInstall": false,
186
- "transport": "stdio",
187
- "config": {
188
- "type": "stdio",
189
- "command": "node",
190
- "args": ["${MORPH_HUB}/mcps/gemini-image/dist/index.js"]
191
- },
192
- "credentials": [
193
- {
194
- "name": "Gemini API Key",
195
- "envVar": "GEMINI_API_KEY",
196
- "secret": true,
197
- "helpUrl": "https://aistudio.google.com/apikey"
198
- }
199
- ],
200
- "prerequisites": [
201
- "Google AI Studio API key",
202
- "Local morph-HUB checkout with mcps/gemini-image built, exposed via the MORPH_HUB env var"
203
- ],
204
- "stackRelevance": ["nextjs", "next"],
205
- "warnings": [
206
- "Internal Polymorphism MCP, not published to npm. The public gemini-image-mcp package was unpublished in 2025-04, so npx installs no longer work.",
207
- "Requires GEMINI_API_KEY environment variable. Image generation costs apply per Google AI pricing."
208
- ],
209
- "setupGuide": "1. Get an API key at https://aistudio.google.com/apikey\n2. Build the MCP: cd $MORPH_HUB/mcps/gemini-image && npm install && npm run build\n3. Run: claude mcp add gemini-image-mcp -e GEMINI_API_KEY=<key> -- node $MORPH_HUB/mcps/gemini-image/dist/index.js\n4. Verify with get_configuration_status"
210
- }
211
- },
212
- "seedance": {
213
- "phases": ["uiux", "implement"],
214
- "tools": ["generate_video", "generate_loop_video", "get_video", "list_videos"],
215
- "detection": "mcpServers includes seedance",
216
- "fallback": "Use client-provided footage or a static poster image; canvas frame-scrub works from any frame sequence, AI-generated or not",
217
- "usage": "AI video generation for scroll-driven heroes and ambient backgrounds. generate_video with endImage produces the directional footage that frame-scrub needs (start frame differs from end frame); generate_loop_video is only for seamless ambient loops",
218
- "healthCheck": {
219
- "toolPattern": "seedance",
220
- "testCall": "Call list_videos with limit 1 to verify the server responds (reads local history, spends no credits)",
178
+ "toolPattern": "morph-assets",
179
+ "testCall": "Call usage with op 'balance' to verify the OpenRouter key (reads the credit balance, spends no credits)",
221
180
  "testParams": {
222
- "limit": 1
181
+ "op": "balance"
223
182
  },
224
- "successIndicator": "Returns the local job history, or 'No videos in history yet'",
225
- "failureHint": "Seedance MCP not responding. Check that REPLICATE_API_TOKEN is set in the MCP env config and that MORPH_HUB points at a built morph-HUB checkout."
183
+ "successIndicator": "Returns the OpenRouter credit balance",
184
+ "failureHint": "morph-assets MCP not responding. Check that OPENROUTER_API_KEY is set (morph-HUB root .env or the MCP env config) and that MORPH_HUB points at a morph-HUB checkout with mcps/morph-assets built."
226
185
  },
227
186
  "install": {
228
187
  "autoInstall": false,
@@ -230,28 +189,30 @@
230
189
  "config": {
231
190
  "type": "stdio",
232
191
  "command": "node",
233
- "args": ["${MORPH_HUB}/mcps/seedance/dist/index.js"]
192
+ "args": ["${MORPH_HUB}/mcps/morph-assets/dist/index.js"]
234
193
  },
235
194
  "credentials": [
236
195
  {
237
- "name": "Replicate API Token",
238
- "envVar": "REPLICATE_API_TOKEN",
196
+ "name": "OpenRouter API Key",
197
+ "envVar": "OPENROUTER_API_KEY",
239
198
  "secret": true,
240
- "helpUrl": "https://replicate.com/account/api-tokens"
199
+ "helpUrl": "https://openrouter.ai/settings/keys"
241
200
  }
242
201
  ],
243
202
  "prerequisites": [
244
- "Replicate account with billing enabled",
245
- "Local morph-HUB checkout with mcps/seedance built, exposed via the MORPH_HUB env var",
246
- "ffmpeg on PATH to extract frames for scroll-scrubbing"
203
+ "OpenRouter account with credits",
204
+ "Local morph-HUB checkout with mcps/morph-assets built, exposed via the MORPH_HUB env var",
205
+ "ffmpeg on PATH for media_tool (scrub frames, poster, concat, compress)"
247
206
  ],
248
- "stackRelevance": ["next", "react", "vite", "astro"],
207
+ "stackRelevance": ["next", "nextjs", "react", "vite", "astro"],
249
208
  "warnings": [
250
- "Internal Polymorphism MCP, not published to npm. Requires a local morph-HUB checkout.",
251
- "Paid per generation. Draft at fast/480p/4s first, render 1080p only after the take is approved.",
209
+ "Internal Polymorphism MCP, not published to npm. Requires a local morph-HUB checkout. Replaces the former gemini-image and seedance MCPs.",
210
+ "Paid per generation. Every call estimates cost first; dryRun only estimates. Above US$2, over the project budget or with unknown price it returns CONFIRMATION_REQUIRED + confirmToken: get human approval, then repeat the same call with the token.",
211
+ "Video is async: if generate_video returns 'generating', poll get_video with the ids. Never resend generate_video (a different request is billed again). Draft at 480p first, promote to 1080p only after the take is approved.",
212
+ "Video has no ZDR on OpenRouter and human faces in img2vid frames trigger moderation: keep sensitive content and faces out of the frames.",
252
213
  "Generation is stochastic and needs a human approval gate. Do not wire it into an unattended phase."
253
214
  ],
254
- "setupGuide": "1. Get a token at https://replicate.com/account/api-tokens\n2. Build the MCP: cd $MORPH_HUB/mcps/seedance && npm install && npm run build\n3. Run: claude mcp add seedance -e REPLICATE_API_TOKEN=<token> -- node $MORPH_HUB/mcps/seedance/dist/index.js\n4. Verify with list_videos (reads local history, spends no credits)"
215
+ "setupGuide": "1. Get a key at https://openrouter.ai/settings/keys and set OPENROUTER_API_KEY in the morph-HUB root .env\n2. Build the MCP: cd $MORPH_HUB && npm install && npm run build -w mcps/morph-assets\n3. Run: claude mcp add morph-assets -e OPENROUTER_API_KEY=<key> -- node $MORPH_HUB/mcps/morph-assets/dist/index.js\n4. Verify with usage op 'balance' (spends no credits)"
255
216
  }
256
217
  },
257
218
  "graphify": {
@@ -321,9 +282,9 @@
321
282
  "_phaseMatrixNote": "Keys must be the v5 phases from framework/phases.json. The v4 keys 'design' and 'tasks' both collapsed into 'plan'; 'review' was absent entirely, so a project in review resolved to undefined. Stack-scoped MCPs (asaas, neon) stay out of this matrix on purpose — only universal ones are listed.",
322
283
  "phaseMatrix": {
323
284
  "proposal": ["context7", "graphify"],
324
- "uiux": ["playwright", "context7", "stitch", "gemini-image", "seedance"],
285
+ "uiux": ["playwright", "context7", "stitch", "morph-assets"],
325
286
  "plan": ["context7", "graphify"],
326
- "implement": ["context7", "playwright", "vercel", "gemini-image", "seedance", "graphify"],
287
+ "implement": ["context7", "playwright", "vercel", "morph-assets", "graphify"],
327
288
  "review": ["playwright", "context7", "graphify"]
328
289
  }
329
290
  }
@@ -4,7 +4,7 @@ description: Guia a criação de uma landing page nova ponta-a-ponta a partir do
4
4
  version: core
5
5
  when-to-invoke: ao iniciar um novo projeto de LP com o template Umbraco genérico
6
6
  user-invokable: true
7
- cliVersion: "8.40.0"
7
+ cliVersion: "8.41.0"
8
8
  stacks:
9
9
  - umbraco
10
10
  ---
@@ -4,7 +4,7 @@ description: Migra uma landing page existente (React/Vite, Next.js estático ou
4
4
  version: core
5
5
  when-to-invoke: ao receber instrução "use /migrate-lp-to-umbraco {projeto}" do usuário, ou quando o usuário descrever necessidade de migrar uma LP para Umbraco
6
6
  user-invokable: true
7
- cliVersion: "8.40.0"
7
+ cliVersion: "8.41.0"
8
8
  stacks:
9
9
  - umbraco
10
10
  ---
@@ -4,7 +4,7 @@ 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.40.0"
7
+ cliVersion: "8.41.0"
8
8
  ---
9
9
 
10
10
  # morph-apply
@@ -138,7 +138,7 @@ while (true):
138
138
  options: [aceitar (marca done com ressalva no recap), continuar tentando (+3 tentativas), pular task (marca blocked)]
139
139
  ```
140
140
 
141
- > **Loop por task filtra; Gate 3 e CI não.** 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".
141
+ > **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".
142
142
  >
143
143
  > **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.
144
144
 
@@ -156,15 +156,18 @@ while (true):
156
156
  - **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.
157
157
  - **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.
158
158
 
159
+ **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.
160
+
159
161
  ```
160
162
  dispatch Agent (subagent_type: "morph-{id}") with prompt:
161
163
  contexto: spec.md, mandate.md, task description completa, doneCriteria,
162
164
  task.reuse (veredito REUSAR/ESTENDER/CRIAR por conceito), os paths
163
165
  dos alvos de reuso e o que você já leu para a task (`arquivo:linhas`
164
166
  + o trecho)
165
- standard: <path(s) .md do(s) standard(s) do domínio — leia-o(s) antes de implementar>
167
+ standards: <por standard: id + digest do `standards --find` + as 3-8 regras do
168
+ .md que ESTA task aplica, coladas; o path só para consulta pontual>
166
169
  instrução: |
167
- Leia o(s) standard(s) indicado(s) antes de escrever código.
170
+ Siga as regras dos standards acima; abra o .md só para uma dúvida pontual.
168
171
  Implemente esta task (ou cadeia de tasks do fluxo) sem depender do trabalho
169
172
  dos outros agentes deste batch: seu ISOLAMENTO é de ESTADO e de ÁRVORE DE
170
173
  TRABALHO — nunca de conhecimento do codebase. Antes de criar tipo,
@@ -173,9 +176,20 @@ dispatch Agent (subagent_type: "morph-{id}") with prompt:
173
176
  (`no-graph`), caia para `grep -rn "<nome>"` e siga — a ausência de grafo
174
177
  nunca bloqueia. Se algo cobre o caso, reuse ou estenda; se criar mesmo
175
178
  assim, diga por que em uma linha no relatório.
176
- Leitura: não releia o que este prompt já traz. Em arquivo grande, `Grep`
177
- acha a linha e `Read` com `offset`/`limit` lê só o trecho; leituras que não
178
- dependem uma da outra vão no mesmo turno, em paralelo.
179
+ Leitura e turnos: cada turno custa ~10 s antes de a tool rodar, e o teto de
180
+ turnos corta sem aviso. Chamadas que não dependem uma da outra vão no MESMO
181
+ turno: leia de uma vez todos os arquivos que este prompt lista, dispare os
182
+ Grep juntos. Use Read/Grep/Glob — nunca `grep`, `sed -n`, `cat`, `find`,
183
+ `ls` via Bash. Não releia o que este prompt já traz. Em arquivo grande, `Grep`
184
+ acha a linha e `Read` com `offset`/`limit` lê só o trecho; log de build/teste
185
+ se lê pelo `Grep` do erro, não inteiro.
186
+
187
+ Ferramentas: antes de supor a API de uma biblioteca (MAF, EF Core, Next,
188
+ shadcn, SDK de provedor), consulte o MCP `context7` (`resolve-library-id` →
189
+ `query-docs`). Impacto e vizinhança de símbolo vêm do grafo
190
+ (`morph-spec graph`), não de varredura por grep. Tool `mcp__…` que não esteja
191
+ carregada se carrega com `ToolSearch` (`select:<nome>`); MCP ausente nunca
192
+ bloqueia — siga com o fallback.
179
193
  Comentário: o padrão é nenhum. Nome, tipo e teste explicam o código; sem
180
194
  `///`/JSDoc em membro de aplicação, cabeçalho, banner de seção ou história
181
195
  da task. Só o porquê que o código não mostra, em uma linha
@@ -192,17 +206,21 @@ dispatch Agent (subagent_type: "morph-{id}") with prompt:
192
206
  2. NÃO toque em tasks.json, feature.json, state.json nem no board de
193
207
  sessão — todo estado (status de task, scores, gates) é gravado
194
208
  exclusivamente pelo orquestrador.
195
- 3. Verificação condicional ao isolamento:
196
- - Batch SEM isolamento (working tree compartilhada): NÃO rode build/test da
197
- suíte compartilhada — edições concorrentes quebram o build umas das outras;
198
- a verificação é do orquestrador, pós-batch (`morph-spec verify`).
199
- - Batch COM isolamento (você recebeu `isolation: "worktree"`): rode build/test
200
- DENTRO do seu worktree; commite seu trabalho na branch do worktree como
201
- último ato antes do relatório; reporte a branch — nunca faça merge nem
202
- toque na árvore principal.
203
- - Ao rodar teste: compile uma vez e rode sem recompilar (`dotnet test
204
- --no-build`); só os testes que a mudança toca (`--filter`) e, depois de
205
- uma falha, só os que falharam. Grave a saída em arquivo uma vez
209
+ 3. TESTE — a prova é do orquestrador (`morph-spec verify`), não sua.
210
+ Escreva os testes pelo orçamento: um por pós-condição, um de regressão
211
+ por bug, variantes numa tabela (`[Theory]`/`it.each`). NÃO rode teste a
212
+ cada marco nem faça ciclo red→green: escreva código e testes, compile, e
213
+ rode SÓ o filtro dos seus testes UMA vez, antes do relatório; se falhar,
214
+ corrija e rode só os que falharam. Não rode `morph-spec verify`.
215
+ - Batch SEM isolamento (working tree compartilhada): só compile —
216
+ edições concorrentes quebram o build umas das outras; o teste roda no
217
+ verify do orquestrador, pós-batch.
218
+ - Batch COM isolamento (você recebeu `isolation: "worktree"`): a regra
219
+ acima vale DENTRO do seu worktree; commite seu trabalho na branch do
220
+ worktree como último ato antes do relatório; reporte a branch — nunca
221
+ faça merge nem toque na árvore principal.
222
+ - Ao rodar: compile uma vez e rode sem recompilar (`dotnet test
223
+ --no-build`), com `--filter`. Grave a saída em arquivo uma vez
206
224
  (`… > .morph/logs/test-last.log 2>&1`, sem nada depois) e leia o arquivo:
207
225
  rodar de novo com outro `| tail`/`| grep` repete o teste para ver outras
208
226
  linhas, e com pipe ou `; echo` o exit é o do último comando, não o do teste.
@@ -210,8 +228,8 @@ dispatch Agent (subagent_type: "morph-{id}") with prompt:
210
228
  4. ESCOPO: no máximo 3 tasks e ~4 arquivos por dispatch. Escopo maior falha e
211
229
  volta — fatie antes, não depois.
212
230
  5. SOBREVIVÊNCIA: o limite de turnos (`maxTurns`, no seu system prompt)
213
- corta sem aviso: commite `wip({taskId})` a cada marco (arquivo que
214
- compila, teste que passa), não só ao fim da task — e só os seus arquivos
231
+ corta sem aviso: commite `wip({taskId})` a cada marco (um arquivo ou
232
+ uma fatia coerente escrita — sem rodar teste para isso), não só ao fim da task — e só os seus arquivos
215
233
  (`git add <paths>`, nunca `-A`). Sem commit, a retomada recomeça do zero.
216
234
  A ~70% do limite, grave o relatório parcial no arquivo canônico: `PARCIAL`
217
235
  na 1ª linha, o feito e o que falta, sem auto-score. Depois siga ou pare,
@@ -221,6 +239,9 @@ dispatch Agent (subagent_type: "morph-{id}") with prompt:
221
239
  sessões). Encerre dev server pelo PID que você mesmo subiu.
222
240
  7. RETORNO: o relatório no arquivo canônico é o retorno. `SendMessage` não é
223
241
  substituto do relatório e não deve ser chamado.
242
+ 8. MUTAÇÃO: nunca altere, reverta, mova ou apague código de produção para ver
243
+ um teste falhar (`sed`, `mv`, `git show HEAD:… >`, `git stash`, `git
244
+ checkout --`). A prova de que o teste morde é do avaliador no Gate 3.
224
245
 
225
246
  Seu relatório final deve conter APENAS: (1) o que foi feito em 2-3
226
247
  frases, (2) arquivos modificados, (3) problemas encontrados e como foram
@@ -243,11 +264,11 @@ dispatch Agent (subagent_type: "morph-{id}") with prompt:
243
264
  > re-despache só o que falta a partir do último `wip`. Nunca pontue nem marque `done` sobre um
244
265
  > parcial.
245
266
 
246
- > 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 7 cláusulas** do contrato do relatório final (as 3 do relatório + escopo, sobrevivência, processos e retorno) 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.
267
+ > 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.
247
268
 
248
269
  > **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.
249
270
 
250
- 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:
271
+ **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:
251
272
  - **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.)
252
273
  - Para cada relatório retornado:
253
274
  - Aplicar `Skill(morph-eval)`.
@@ -257,13 +278,22 @@ Aguardar todos os agentes terminarem, depois **auditar os relatórios contra o t
257
278
 
258
279
  Depois do batch paralelo, executar o restante em modo sequencial (passo 3a).
259
280
 
281
+ **Batch COM isolamento (§3b-w): dispatch rolling, não por onda.** Nenhum agente escreve na
282
+ árvore principal, então o orquestrador não espera o batch inteiro: a cada relatório que chega,
283
+ audita (`report-check {feature} {taskId}`), integra aquela branch (§3b-w passo 2), roda
284
+ `verify {feature} {taskId}` e `morph-eval` + `score` daquela task, e **despacha na hora** toda
285
+ task que ficou `ready` (`getReadyTasks`) cujos `outputs` não colidem com os das tasks em voo —
286
+ o worktree nasce da branch da feature, já com o merge que acabou de entrar. Cap de 4 em voo. O
287
+ `verify {feature}` de escopo feature roda uma vez, quando nada mais está em voo. Medido: uma task
288
+ esperou 43 min pela onda depois de a dependência dela já estar pronta.
289
+
260
290
  ### 3b-w. Batch isolado por worktree (quando o dag recomenda)
261
291
 
262
292
  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.
263
293
 
264
- 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 agente commita na branch do worktree como último ato e reporta a branch. Um `morph-spec verify {feature} {task}` rodado ali pelo agente é **consultivo**: lê os `outputs` **planejados** (o sub-agent não edita `tasks.json` — cláusula 2), não é persistido (worktree não registrado: `unregistered-worktree`) e não prova nada — a prova é o verify de escopo feature do passo 3.
265
- 2. **Integração (orquestrador, após todos os relatórios):** 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.
266
- 3. **Pós-merge:** rode `morph-spec verify {feature} --json` UMA vez (o merge é o novo ponto de integração — verificação compartilhada obrigatória), depois `morph-eval` + `morph-spec score` por relatório, como em §3b.
294
+ 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.
295
+ 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.
296
+ 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).
267
297
  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). Worktree sujo (subagent não commitou) fica, vira `unintegrated-work` no `doctor --worktrees`, e a task volta a `pending`. Branches não integradas ficam e são registradas no recap com o motivo.
268
298
  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.
269
299
 
@@ -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.40.0"
7
+ cliVersion: "8.41.0"
8
8
  ---
9
9
 
10
10
  # morph-brainstorming
@@ -4,7 +4,7 @@ description: Avalia a qualidade de uma tarefa ou fase com rubricas graduadas 0-1
4
4
  version: core
5
5
  when-to-invoke: ao completar uma tarefa ou ao finalizar uma fase de implementação
6
6
  user-invokable: false
7
- cliVersion: "8.40.0"
7
+ cliVersion: "8.41.0"
8
8
  ---
9
9
 
10
10
  # morph-eval
@@ -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.40.0"
7
+ cliVersion: "8.41.0"
8
8
  ---
9
9
 
10
10
  # morph-hotfix
@@ -43,7 +43,7 @@ subagent_type: "morph-scout"
43
43
 
44
44
  **Fallback** (se `morph-scout` não estiver registrado nos subagent types deste projeto): `general-purpose` com o campo `persona` do agente `scout` colado no prompt, **registrando o fallback nas notes da task**.
45
45
 
46
- Peça ao scout: localizar o root cause provável, os arquivos afetados e o blast radius (o que mais pode quebrar). Ele é read-only (Read/Glob/Grep/Bash somente-leitura) — não escreve código. Inclua as 7 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`.
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
48
  ### 3. Hotfix brief (`0-proposal/proposal.md`)
49
49
 
@@ -4,7 +4,7 @@ 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.40.0"
7
+ cliVersion: "8.41.0"
8
8
  ---
9
9
 
10
10
  # morph-implement
@@ -54,12 +54,14 @@ Ao iniciar cada task de `tasks.json` — antes de escrever qualquer código. Nor
54
54
 
55
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
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):
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:
58
58
  ```
59
59
  Implementar [ID]: [title da task]
60
60
 
61
61
  Spec: [description completa do tasks.json]
62
- Standard: [path do .md do standard identificado no passo 2]
62
+ Standards: [por standard: `id` + o digest do `standards --find` + as 3-8 regras
63
+ do .md que ESTA task aplica, coladas. O path vai junto só para consulta
64
+ pontual — o sub-agente não relê standards inteiros]
63
65
  Arquivos relevantes: [os `target` de task.reuse + o que o scout/grafo apontou
64
66
  — este campo não é decorativo: é por ele que o código já existente chega
65
67
  ao sub-agente, que trabalha em contexto fresco e não conhece o projeto.
@@ -74,9 +76,20 @@ Ao iniciar cada task de `tasks.json` — antes de escrever qualquer código. Nor
74
76
  a ausência de grafo nunca bloqueia. Se algo cobre o caso, reuse ou estenda;
75
77
  se criar mesmo assim, diga por que em uma linha no relatório.
76
78
 
77
- Leitura: não releia o que este prompt já traz. Em arquivo grande, `Grep`
78
- acha a linha e `Read` com `offset`/`limit` lê só o trecho; leituras que não
79
- dependem uma da outra vão no mesmo turno, em paralelo.
79
+ Leitura e turnos: cada turno custa ~10 s antes de a tool rodar, e o teto de
80
+ turnos corta sem aviso. Chamadas que não dependem uma da outra vão no MESMO
81
+ turno: leia de uma vez todos os arquivos que este prompt lista, dispare os
82
+ Grep juntos. Use Read/Grep/Glob — nunca `grep`, `sed -n`, `cat`, `find`,
83
+ `ls` via Bash. Não releia o que este prompt já traz. Em arquivo grande, `Grep`
84
+ acha a linha e `Read` com `offset`/`limit` lê só o trecho; log de build/teste
85
+ se lê pelo `Grep` do erro, não inteiro.
86
+
87
+ Ferramentas: antes de supor a API de uma biblioteca (MAF, EF Core, Next,
88
+ shadcn, SDK de provedor), consulte o MCP `context7` (`resolve-library-id` →
89
+ `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.
80
93
 
81
94
  Comentário: o padrão é nenhum. Nome, tipo e teste explicam o código; sem
82
95
  `///`/JSDoc em membro de aplicação, cabeçalho, banner de seção ou história
@@ -89,25 +102,28 @@ Ao iniciar cada task de `tasks.json` — antes de escrever qualquer código. Nor
89
102
  cortesia best-effort e pode não chegar inteira). NÃO chame SendMessage.
90
103
  2. NÃO toque em tasks.json, feature.json, state.json nem no board de sessão
91
104
  — todo estado é gravado exclusivamente pelo orquestrador.
92
- 3. Verificação condicional ao isolamento: em batch paralelo SEM isolamento,
93
- NÃO rode build/test da suíte compartilhada — a verificação
94
- (`morph-spec verify`) é do orquestrador, pós-batch. Em batch COM
95
- `isolation: "worktree"`, rode build/test no seu worktree, commite na
96
- branch do worktree como último ato antes do relatório — nunca faça merge.
97
- Worktree não commitado NÃO é removido pelo hook e vira pendência do
98
- `doctor`; o commit é o que torna o seu trabalho integrável.
99
- Ao rodar teste: compile uma vez e rode sem recompilar (`dotnet test
100
- --no-build`); só os testes que a mudança toca (`--filter`) e, depois de
101
- uma falha, só os que falharam. Grave a saída em arquivo uma vez
102
- (`… > .morph/logs/test-last.log 2>&1`, sem nada depois) e leia o arquivo:
103
- rodar de novo com outro `| tail`/`| grep` repete o teste para ver outras
104
- linhas, e com pipe ou `; echo` o exit é o do último comando, não o do teste.
105
+ 3. TESTE — a prova é do orquestrador (`morph-spec verify {feature} {task}`,
106
+ logo depois do seu retorno), não sua. Escreva os testes pelo orçamento:
107
+ um por pós-condição, um de regressão por bug, variantes numa tabela
108
+ (`[Theory]`/`it.each`). NÃO rode teste a cada marco nem faça ciclo
109
+ red→green: escreva código e testes, compile, e rode SÓ o filtro dos seus
110
+ testes UMA vez, antes do relatório; se falhar, corrija e rode só os que
111
+ falharam. Em batch paralelo SEM isolamento, só compile — o teste roda no
112
+ verify pós-batch. Em batch COM `isolation: "worktree"`, o mesmo vale no
113
+ seu worktree, e o último ato antes do relatório é o commit na branch do
114
+ worktree — nunca faça merge; worktree não commitado NÃO é removido pelo
115
+ hook e vira pendência do `doctor`. Ao rodar: compile uma vez e rode sem
116
+ recompilar (`dotnet test --no-build`), com `--filter`. Grave a saída em
117
+ arquivo uma vez (`… > .morph/logs/test-last.log 2>&1`, sem nada depois)
118
+ e leia o arquivo: rodar de novo com outro `| tail`/`| grep` repete o teste
119
+ para ver outras linhas, e com pipe ou `; echo` o exit é o do último
120
+ comando, não o do teste.
105
121
 
106
122
  4. ESCOPO: no máximo 3 tasks e ~4 arquivos por dispatch. Escopo maior falha e
107
123
  volta — fatie antes, não depois.
108
124
  5. SOBREVIVÊNCIA: o limite de turnos (`maxTurns`, no seu system prompt)
109
- corta sem aviso: commite `wip({taskId})` a cada marco (arquivo que
110
- compila, teste que passa), não só ao fim da task — e só os seus arquivos
125
+ corta sem aviso: commite `wip({taskId})` a cada marco (um arquivo ou
126
+ uma fatia coerente escrita — sem rodar teste para isso), não só ao fim da task — e só os seus arquivos
111
127
  (`git add <paths>`, nunca `-A`). Sem commit, a retomada recomeça do zero.
112
128
  A ~70% do limite, grave o relatório parcial no arquivo canônico: `PARCIAL`
113
129
  na 1ª linha, o feito e o que falta, sem auto-score. Depois siga ou pare,
@@ -117,6 +133,9 @@ Ao iniciar cada task de `tasks.json` — antes de escrever qualquer código. Nor
117
133
  sessões). Encerre dev server pelo PID que você mesmo subiu.
118
134
  7. RETORNO: o relatório no arquivo canônico é o retorno. `SendMessage` não é
119
135
  substituto do relatório e não deve ser chamado.
136
+ 8. MUTAÇÃO: nunca altere, reverta, mova ou apague código de produção para ver
137
+ um teste falhar (`sed`, `mv`, `git show HEAD:… >`, `git stash`, `git
138
+ checkout --`). A prova de que o teste morde é do avaliador no Gate 3.
120
139
 
121
140
  Seu relatório (no arquivo, e na mensagem final quando ela chega) deve conter
122
141
  APENAS: (1) o que foi feito em 2-3 frases, (2) arquivos modificados,
@@ -156,8 +175,8 @@ Ao iniciar cada task de `tasks.json` — antes de escrever qualquer código. Nor
156
175
  5. Implemente a tarefa seguindo o standard e a persona identificados.
157
176
  Se encontrar ambiguidade de escopo não coberta pelo mandate, registre no decisions.md
158
177
  e resolva da forma mais conservadora — não pause para perguntar, a menos que seja bloqueante.
159
- Testes rodados durante a implementação inline seguem o mesmo loop da cláusula 3 do template
160
- do passo 4 (compilar uma vez, `--filter`, saída em arquivo).
178
+ Testes rodados durante a implementação inline seguem a cláusula 3 do template do passo 4
179
+ (sem red→green, uma rodada do filtro no fim, saída em arquivo) e a 8 (sem mutação).
161
180
 
162
181
  **Task com `3-implement/evidencias/{ID}.md` em `outputs`** (critério sobre saída de LLM —
163
182
  `morph-plan` §5): rode o eval ANTES de marcar `done` — e só o eval. Com nó `runner: "evals"`
@@ -246,7 +265,7 @@ Ao iniciar cada task de `tasks.json` — antes de escrever qualquer código. Nor
246
265
  > tasks.json + recap.md + `taskScores` do feature.json. **NÃO escreva o trace
247
266
  > manualmente** — a escrita manual foi removida da cerimônia por task.
248
267
 
249
- 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). **Ú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. 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.
268
+ 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). **Ú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.
250
269
 
251
270
  ## Output esperado
252
271
  - Código implementado conforme o standard consultado (direto ou via sub-agent)
@@ -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.40.0"
7
+ cliVersion: "8.41.0"
8
8
  stacks:
9
9
  - dotnet
10
10
  - nextjs
@@ -212,4 +212,4 @@ trabalho de design". Tratar a saída como entregável vetorial é o erro clássi
212
212
 
213
213
  - Os cinco standards da tabela do topo — a fonte de API, custo, prazo e conformidade.
214
214
  - Proveniência do conhecimento absorvido: `.morph/framework/standards/PROVENANCE.json`
215
- (`gemini-image`, `cinematic-lp`, `brand-design`).
215
+ (`morph-image`, `cinematic-lp`, `brand-design`).
@@ -4,7 +4,7 @@ description: Guia a produção dos artefatos de planejamento de uma feature (use
4
4
  version: core
5
5
  when-to-invoke: ao iniciar a fase plan de uma feature, após o Gate 1 (proposal aprovado)
6
6
  user-invokable: true
7
- cliVersion: "8.40.0"
7
+ cliVersion: "8.41.0"
8
8
  ---
9
9
 
10
10
  # morph-plan
@@ -308,6 +308,12 @@ Ao iniciar a fase plan — após o `proposal.md` ser aprovado e antes de qualque
308
308
 
309
309
  **Preencha `outputs` (paths planejados) em cada task** — o `morph-spec dag` usa os outputs para detectar colisão de arquivos entre fluxos paralelos e recomendar `isolation: "worktree"`. Task sem `outputs` entra como footprint desconhecido (não força isolamento, mas o dag não consegue protegê-la de colisão).
310
310
 
311
+ **Tamanho da task: no máximo 8 `outputs`** (testes incluídos). Uma task inteira cabe num
312
+ dispatch; acima disso o sub-agente bate no teto de turnos e a retomada recomeça fria. Fatie por
313
+ pós-condição (uma task por pós-condição ou par delas, com a dependência explícita). Antes do
314
+ Gate 2, o `morph-spec dag` recusa (exit 1) e o `gate-check plan` pausa com `oversizedTasks`;
315
+ depois do Gate 2 é só aviso.
316
+
311
317
  **Critério sobre saída de LLM vira eval de runtime — nunca "suíte estrutural".** Duas etapas,
312
318
  como na `morph-review`: (1) **filtro mecânico** — o `mandate.md` cita ao menos um standard
313
319
  `ai-agents`; senão, a regra não se aplica. (2) **determinação sua, por task** — o
@@ -4,7 +4,7 @@ description: Orquestra a fase de proposta+plano de uma feature morph-spec. Encad
4
4
  version: core
5
5
  when-to-invoke: ao receber instrução "use /morph-proposal" do usuário, ou ao iniciar uma nova feature
6
6
  user-invokable: true
7
- cliVersion: "8.40.0"
7
+ cliVersion: "8.41.0"
8
8
  ---
9
9
 
10
10
  # morph-proposal
@@ -4,7 +4,7 @@ description: Conduz a fase de revisão e produz o review-report.md para o Gate 3
4
4
  version: core
5
5
  when-to-invoke: ao iniciar a fase review, após todas as tasks de tasks.json estarem com status `done`
6
6
  user-invokable: true
7
- cliVersion: "8.40.0"
7
+ cliVersion: "8.41.0"
8
8
  ---
9
9
 
10
10
  # morph-review
@@ -4,7 +4,7 @@ description: Varre o codebase existente, detecta stack atual, compara com o stac
4
4
  version: core
5
5
  when-to-invoke: ao iniciar uma feature em projeto brownfield (codebase já existente)
6
6
  user-invokable: true
7
- cliVersion: "8.40.0"
7
+ cliVersion: "8.41.0"
8
8
  ---
9
9
 
10
10
  # morph-stack-scan
@@ -4,7 +4,7 @@ description: Localiza um standard específico via busca server-side (morph-spec
4
4
  version: core
5
5
  when-to-invoke: quando precisar consultar um standard específico durante a implementação
6
6
  user-invokable: true
7
- cliVersion: "8.40.0"
7
+ cliVersion: "8.41.0"
8
8
  ---
9
9
 
10
10
  # morph-standards