@polymorphism-tech/morph-spec 8.40.0 → 8.42.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.
- package/CLAUDE.md +7 -5
- package/README.md +3 -3
- package/claude-plugin.json +1 -1
- package/docs/CHEATSHEET.md +1 -1
- package/docs/QUICKSTART.md +1 -1
- package/framework/CLAUDE.md +2 -2
- package/framework/MORPH.md +9 -8
- package/framework/agents.json +14 -8
- package/framework/docs/CLI.md +5 -3
- package/framework/hooks/README.md +2 -1
- package/framework/hooks/claude-code/core/chain.js +2 -0
- package/framework/hooks/claude-code/core/comment-guard.js +107 -0
- package/framework/hooks/claude-code/core/telemetry-log.js +39 -8
- package/framework/hooks/claude-code/core/worktree-create.js +22 -6
- package/framework/hooks/shared/comment-rules.js +171 -0
- package/{src/lib/validators/code-budget → framework/hooks/shared}/comment-scanner.js +2 -2
- package/{src/lib/ai → framework/hooks/shared}/comment-stripper.js +2 -1
- package/framework/hooks/shared/git-paths.js +38 -5
- package/framework/hooks/shared/source-files.js +34 -0
- package/framework/mcp/registry.json +26 -65
- package/framework/skills/core/create-umbraco-lp/SKILL.md +1 -1
- package/framework/skills/core/migrate-lp-to-umbraco/SKILL.md +1 -1
- package/framework/skills/core/morph-apply/SKILL.md +58 -26
- package/framework/skills/core/morph-brainstorming/SKILL.md +1 -1
- package/framework/skills/core/morph-eval/SKILL.md +1 -1
- package/framework/skills/core/morph-hotfix/SKILL.md +2 -2
- package/framework/skills/core/morph-implement/SKILL.md +46 -25
- package/framework/skills/core/morph-media/SKILL.md +2 -2
- package/framework/skills/core/morph-plan/SKILL.md +7 -1
- package/framework/skills/core/morph-proposal/SKILL.md +1 -1
- package/framework/skills/core/morph-review/SKILL.md +1 -1
- package/framework/skills/core/morph-stack-scan/SKILL.md +1 -1
- package/framework/skills/core/morph-standards/SKILL.md +1 -1
- package/framework/skills/core/morph-uiux/SKILL.md +3 -3
- package/framework/standards/PROVENANCE.json +4 -4
- package/framework/standards/STANDARDS.json +7 -7
- package/framework/standards/architecture/code-comments.md +9 -2
- package/framework/standards/backend/dotnet/testing.md +4 -2
- package/framework/standards/frontend/design-system/ai-image-generation.md +42 -28
- package/framework/standards/frontend/design-system/ai-video-generation.md +24 -9
- package/framework/standards/frontend/nextjs/testing.md +4 -2
- package/framework/standards/integration/mcp/mcp-tools.md +19 -12
- package/package.json +1 -1
- package/src/commands/project/doctor.js +9 -1
- package/src/commands/project/worktree.js +60 -4
- package/src/commands/state/gate-check.js +5 -0
- package/src/commands/tasks/dag.js +27 -4
- package/src/commands/validation/verify.js +22 -38
- package/src/lib/ai/code-audit.js +1 -1
- package/src/lib/ai/registry-audit.js +1 -1
- package/src/lib/risk-detector.js +13 -0
- package/src/lib/tasks/dotnet-test-introspection.js +1 -1
- package/src/lib/tasks/tasks-json-parser.js +21 -0
- package/src/lib/validators/code-budget/code-budget-validator.js +4 -6
- package/src/lib/validators/code-budget/index.js +1 -1
- package/src/lib/validators/reuse/symbol-scanner.js +1 -28
- package/src/lib/worktree/env-allocator.js +9 -3
- package/src/utils/agents-installer.js +51 -1
- package/src/utils/hooks-installer.js +3 -2
|
@@ -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
|
-
"
|
|
170
|
+
"morph-assets": {
|
|
171
171
|
"phases": ["uiux", "implement"],
|
|
172
|
-
"tools": ["generate_image", "edit_image", "continue_editing", "
|
|
173
|
-
"serverNames": ["
|
|
174
|
-
"detection": "mcpServers includes
|
|
175
|
-
"fallback": "Manual image creation, stock photos, or
|
|
176
|
-
"usage": "AI image generation for
|
|
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": "
|
|
179
|
-
"testCall": "Call
|
|
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
|
-
"
|
|
181
|
+
"op": "balance"
|
|
223
182
|
},
|
|
224
|
-
"successIndicator": "Returns the
|
|
225
|
-
"failureHint": "
|
|
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/
|
|
192
|
+
"args": ["${MORPH_HUB}/mcps/morph-assets/dist/index.js"]
|
|
234
193
|
},
|
|
235
194
|
"credentials": [
|
|
236
195
|
{
|
|
237
|
-
"name": "
|
|
238
|
-
"envVar": "
|
|
196
|
+
"name": "OpenRouter API Key",
|
|
197
|
+
"envVar": "OPENROUTER_API_KEY",
|
|
239
198
|
"secret": true,
|
|
240
|
-
"helpUrl": "https://
|
|
199
|
+
"helpUrl": "https://openrouter.ai/settings/keys"
|
|
241
200
|
}
|
|
242
201
|
],
|
|
243
202
|
"prerequisites": [
|
|
244
|
-
"
|
|
245
|
-
"Local morph-HUB checkout with mcps/
|
|
246
|
-
"ffmpeg on PATH
|
|
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.
|
|
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
|
|
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", "
|
|
285
|
+
"uiux": ["playwright", "context7", "stitch", "morph-assets"],
|
|
325
286
|
"plan": ["context7", "graphify"],
|
|
326
|
-
"implement": ["context7", "playwright", "vercel", "
|
|
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.
|
|
7
|
+
cliVersion: "8.42.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.
|
|
7
|
+
cliVersion: "8.42.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.
|
|
7
|
+
cliVersion: "8.42.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
|
-
|
|
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
|
-
|
|
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,13 +176,26 @@ 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:
|
|
177
|
-
|
|
178
|
-
|
|
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
|
|
182
|
-
(`architecture-code-comments`).
|
|
196
|
+
(`architecture-code-comments`). O elo com a pós-condição vai no nome do
|
|
197
|
+
teste; a densidade do arquivo vizinho não é modelo. O hook `comment-guard`
|
|
198
|
+
bloqueia a edição que adiciona história, banner ou bloco longo.
|
|
183
199
|
Não modifique spec.md, mandate.md.
|
|
184
200
|
|
|
185
201
|
Contrato do relatório final:
|
|
@@ -192,17 +208,21 @@ dispatch Agent (subagent_type: "morph-{id}") with prompt:
|
|
|
192
208
|
2. NÃO toque em tasks.json, feature.json, state.json nem no board de
|
|
193
209
|
sessão — todo estado (status de task, scores, gates) é gravado
|
|
194
210
|
exclusivamente pelo orquestrador.
|
|
195
|
-
3.
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
211
|
+
3. TESTE — a prova é do orquestrador (`morph-spec verify`), não sua.
|
|
212
|
+
Escreva os testes pelo orçamento: um por pós-condição, um de regressão
|
|
213
|
+
por bug, variantes numa tabela (`[Theory]`/`it.each`). NÃO rode teste a
|
|
214
|
+
cada marco nem faça ciclo red→green: escreva código e testes, compile, e
|
|
215
|
+
rode SÓ o filtro dos seus testes UMA vez, antes do relatório; se falhar,
|
|
216
|
+
corrija e rode só os que falharam. Não rode `morph-spec verify`.
|
|
217
|
+
- Batch SEM isolamento (working tree compartilhada): só compile —
|
|
218
|
+
edições concorrentes quebram o build umas das outras; o teste roda no
|
|
219
|
+
verify do orquestrador, pós-batch.
|
|
220
|
+
- Batch COM isolamento (você recebeu `isolation: "worktree"`): a regra
|
|
221
|
+
acima vale DENTRO do seu worktree; commite seu trabalho na branch do
|
|
222
|
+
worktree como último ato antes do relatório; reporte a branch — nunca
|
|
223
|
+
faça merge nem toque na árvore principal.
|
|
224
|
+
- Ao rodar: compile uma vez e rode sem recompilar (`dotnet test
|
|
225
|
+
--no-build`), com `--filter`. Grave a saída em arquivo uma vez
|
|
206
226
|
(`… > .morph/logs/test-last.log 2>&1`, sem nada depois) e leia o arquivo:
|
|
207
227
|
rodar de novo com outro `| tail`/`| grep` repete o teste para ver outras
|
|
208
228
|
linhas, e com pipe ou `; echo` o exit é o do último comando, não o do teste.
|
|
@@ -210,8 +230,8 @@ dispatch Agent (subagent_type: "morph-{id}") with prompt:
|
|
|
210
230
|
4. ESCOPO: no máximo 3 tasks e ~4 arquivos por dispatch. Escopo maior falha e
|
|
211
231
|
volta — fatie antes, não depois.
|
|
212
232
|
5. SOBREVIVÊNCIA: o limite de turnos (`maxTurns`, no seu system prompt)
|
|
213
|
-
corta sem aviso: commite `wip({taskId})` a cada marco (arquivo
|
|
214
|
-
|
|
233
|
+
corta sem aviso: commite `wip({taskId})` a cada marco (um arquivo ou
|
|
234
|
+
uma fatia coerente escrita — sem rodar teste para isso), não só ao fim da task — e só os seus arquivos
|
|
215
235
|
(`git add <paths>`, nunca `-A`). Sem commit, a retomada recomeça do zero.
|
|
216
236
|
A ~70% do limite, grave o relatório parcial no arquivo canônico: `PARCIAL`
|
|
217
237
|
na 1ª linha, o feito e o que falta, sem auto-score. Depois siga ou pare,
|
|
@@ -221,6 +241,9 @@ dispatch Agent (subagent_type: "morph-{id}") with prompt:
|
|
|
221
241
|
sessões). Encerre dev server pelo PID que você mesmo subiu.
|
|
222
242
|
7. RETORNO: o relatório no arquivo canônico é o retorno. `SendMessage` não é
|
|
223
243
|
substituto do relatório e não deve ser chamado.
|
|
244
|
+
8. MUTAÇÃO: nunca altere, reverta, mova ou apague código de produção para ver
|
|
245
|
+
um teste falhar (`sed`, `mv`, `git show HEAD:… >`, `git stash`, `git
|
|
246
|
+
checkout --`). A prova de que o teste morde é do avaliador no Gate 3.
|
|
224
247
|
|
|
225
248
|
Seu relatório final deve conter APENAS: (1) o que foi feito em 2-3
|
|
226
249
|
frases, (2) arquivos modificados, (3) problemas encontrados e como foram
|
|
@@ -243,11 +266,11 @@ dispatch Agent (subagent_type: "morph-{id}") with prompt:
|
|
|
243
266
|
> re-despache só o que falta a partir do último `wip`. Nunca pontue nem marque `done` sobre um
|
|
244
267
|
> parcial.
|
|
245
268
|
|
|
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
|
|
269
|
+
> 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
270
|
|
|
248
271
|
> **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
272
|
|
|
250
|
-
|
|
273
|
+
**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
274
|
- **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
275
|
- Para cada relatório retornado:
|
|
253
276
|
- Aplicar `Skill(morph-eval)`.
|
|
@@ -257,13 +280,22 @@ Aguardar todos os agentes terminarem, depois **auditar os relatórios contra o t
|
|
|
257
280
|
|
|
258
281
|
Depois do batch paralelo, executar o restante em modo sequencial (passo 3a).
|
|
259
282
|
|
|
283
|
+
**Batch COM isolamento (§3b-w): dispatch rolling, não por onda.** Nenhum agente escreve na
|
|
284
|
+
árvore principal, então o orquestrador não espera o batch inteiro: a cada relatório que chega,
|
|
285
|
+
audita (`report-check {feature} {taskId}`), integra aquela branch (§3b-w passo 2), roda
|
|
286
|
+
`verify {feature} {taskId}` e `morph-eval` + `score` daquela task, e **despacha na hora** toda
|
|
287
|
+
task que ficou `ready` (`getReadyTasks`) cujos `outputs` não colidem com os das tasks em voo —
|
|
288
|
+
o worktree nasce da branch da feature, já com o merge que acabou de entrar. Cap de 4 em voo. O
|
|
289
|
+
`verify {feature}` de escopo feature roda uma vez, quando nada mais está em voo. Medido: uma task
|
|
290
|
+
esperou 43 min pela onda depois de a dependência dela já estar pronta.
|
|
291
|
+
|
|
260
292
|
### 3b-w. Batch isolado por worktree (quando o dag recomenda)
|
|
261
293
|
|
|
262
294
|
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
295
|
|
|
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
|
|
265
|
-
2. **Integração (orquestrador,
|
|
266
|
-
3. **Pós-merge:**
|
|
296
|
+
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.
|
|
297
|
+
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.
|
|
298
|
+
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
299
|
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
300
|
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
301
|
|
|
@@ -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.
|
|
7
|
+
cliVersion: "8.42.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.
|
|
7
|
+
cliVersion: "8.42.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.
|
|
7
|
+
cliVersion: "8.42.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
|
|
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.
|
|
7
|
+
cliVersion: "8.42.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
|
-
|
|
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,14 +76,27 @@ 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:
|
|
78
|
-
|
|
79
|
-
|
|
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
|
|
83
96
|
da task. Só o porquê que o código não mostra, em uma linha
|
|
84
|
-
(`architecture-code-comments`).
|
|
97
|
+
(`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.
|
|
85
100
|
|
|
86
101
|
Contrato do relatório final:
|
|
87
102
|
1. GRAVE `.morph/features/{feature}/3-implement/reports/[ID].md` ANTES de
|
|
@@ -89,25 +104,28 @@ Ao iniciar cada task de `tasks.json` — antes de escrever qualquer código. Nor
|
|
|
89
104
|
cortesia best-effort e pode não chegar inteira). NÃO chame SendMessage.
|
|
90
105
|
2. NÃO toque em tasks.json, feature.json, state.json nem no board de sessão
|
|
91
106
|
— todo estado é gravado exclusivamente pelo orquestrador.
|
|
92
|
-
3.
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
`
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
107
|
+
3. TESTE — a prova é do orquestrador (`morph-spec verify {feature} {task}`,
|
|
108
|
+
logo depois do seu retorno), não sua. Escreva os testes pelo orçamento:
|
|
109
|
+
um por pós-condição, um de regressão por bug, variantes numa tabela
|
|
110
|
+
(`[Theory]`/`it.each`). NÃO rode teste a cada marco nem faça ciclo
|
|
111
|
+
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.
|
|
105
123
|
|
|
106
124
|
4. ESCOPO: no máximo 3 tasks e ~4 arquivos por dispatch. Escopo maior falha e
|
|
107
125
|
volta — fatie antes, não depois.
|
|
108
126
|
5. SOBREVIVÊNCIA: o limite de turnos (`maxTurns`, no seu system prompt)
|
|
109
|
-
corta sem aviso: commite `wip({taskId})` a cada marco (arquivo
|
|
110
|
-
|
|
127
|
+
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
|
|
111
129
|
(`git add <paths>`, nunca `-A`). Sem commit, a retomada recomeça do zero.
|
|
112
130
|
A ~70% do limite, grave o relatório parcial no arquivo canônico: `PARCIAL`
|
|
113
131
|
na 1ª linha, o feito e o que falta, sem auto-score. Depois siga ou pare,
|
|
@@ -117,6 +135,9 @@ Ao iniciar cada task de `tasks.json` — antes de escrever qualquer código. Nor
|
|
|
117
135
|
sessões). Encerre dev server pelo PID que você mesmo subiu.
|
|
118
136
|
7. RETORNO: o relatório no arquivo canônico é o retorno. `SendMessage` não é
|
|
119
137
|
substituto do relatório e não deve ser chamado.
|
|
138
|
+
8. MUTAÇÃO: nunca altere, reverta, mova ou apague código de produção para ver
|
|
139
|
+
um teste falhar (`sed`, `mv`, `git show HEAD:… >`, `git stash`, `git
|
|
140
|
+
checkout --`). A prova de que o teste morde é do avaliador no Gate 3.
|
|
120
141
|
|
|
121
142
|
Seu relatório (no arquivo, e na mensagem final quando ela chega) deve conter
|
|
122
143
|
APENAS: (1) o que foi feito em 2-3 frases, (2) arquivos modificados,
|
|
@@ -156,8 +177,8 @@ Ao iniciar cada task de `tasks.json` — antes de escrever qualquer código. Nor
|
|
|
156
177
|
5. Implemente a tarefa seguindo o standard e a persona identificados.
|
|
157
178
|
Se encontrar ambiguidade de escopo não coberta pelo mandate, registre no decisions.md
|
|
158
179
|
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
|
|
160
|
-
|
|
180
|
+
Testes rodados durante a implementação inline seguem a cláusula 3 do template do passo 4
|
|
181
|
+
(sem red→green, uma rodada do filtro no fim, saída em arquivo) e a 8 (sem mutação).
|
|
161
182
|
|
|
162
183
|
**Task com `3-implement/evidencias/{ID}.md` em `outputs`** (critério sobre saída de LLM —
|
|
163
184
|
`morph-plan` §5): rode o eval ANTES de marcar `done` — e só o eval. Com nó `runner: "evals"`
|
|
@@ -246,7 +267,7 @@ Ao iniciar cada task de `tasks.json` — antes de escrever qualquer código. Nor
|
|
|
246
267
|
> tasks.json + recap.md + `taskScores` do feature.json. **NÃO escreva o trace
|
|
247
268
|
> manualmente** — a escrita manual foi removida da cerimônia por task.
|
|
248
269
|
|
|
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.
|
|
270
|
+
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
271
|
|
|
251
272
|
## Output esperado
|
|
252
273
|
- 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.
|
|
7
|
+
cliVersion: "8.42.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
|
-
(`
|
|
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.
|
|
7
|
+
cliVersion: "8.42.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.
|
|
7
|
+
cliVersion: "8.42.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.
|
|
7
|
+
cliVersion: "8.42.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.
|
|
7
|
+
cliVersion: "8.42.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.
|
|
7
|
+
cliVersion: "8.42.0"
|
|
8
8
|
---
|
|
9
9
|
|
|
10
10
|
# morph-standards
|