@polymorphism-tech/morph-spec 8.44.0 → 8.45.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CLAUDE.md +10 -9
- package/README.md +10 -10
- package/bin/morph-spec.js +10 -13
- package/bin/validate.js +379 -379
- package/claude-plugin.json +1 -1
- package/docs/CHEATSHEET.md +2 -4
- package/docs/QUICKSTART.md +6 -6
- package/framework/CLAUDE.md +6 -8
- package/framework/MORPH.md +39 -45
- package/framework/agents.json +8 -9
- package/framework/commands/morph-apply.md +1 -3
- package/framework/commands/morph-hotfix.md +1 -1
- package/framework/commands/morph-proposal.md +2 -2
- package/framework/docs/CLI.md +10 -10
- package/framework/evals/review-checklist.md +90 -0
- package/framework/evals/trace-schema.md +2 -12
- package/framework/hooks/README.md +2 -3
- package/framework/hooks/claude-code/core/heavy-gate.js +1 -1
- package/framework/hooks/claude-code/core/protect-spec-files.js +2 -2
- package/framework/hooks/claude-code/core/telemetry-log.js +2 -2
- package/framework/hooks/claude-code/core/trace-autogen.js +1 -22
- package/framework/hooks/claude-code/core/validate-completion.js +3 -56
- package/framework/hooks/claude-code/statusline.sh +11 -11
- package/framework/hooks/git/commit-msg/conventional-commits.sh +33 -33
- package/framework/hooks/git/pre-commit/agents.sh +25 -25
- package/framework/hooks/git/pre-commit/orchestrator.sh +64 -64
- package/framework/hooks/git/pre-commit/specs.sh +50 -50
- package/framework/hooks/git/pre-push/run-tests.sh +44 -44
- package/framework/hooks/shared/build-check.js +1 -1
- package/framework/hooks/shared/comment-scanner.js +1 -1
- package/framework/hooks/shared/phase-utils.js +0 -5
- package/framework/hooks/shared/stdin-reader.js +26 -26
- package/framework/phases.json +4 -6
- package/framework/rubrics/backend.json +1 -1
- package/framework/rubrics/default.json +1 -1
- package/framework/rubrics/frontend.json +1 -1
- package/framework/rules/morph-workflow.md +6 -6
- package/framework/schemas/feature.schema.json +2 -28
- package/framework/schemas/tasks.schema.json +6 -2
- package/framework/skills/README.md +1 -2
- 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 +145 -246
- package/framework/skills/core/morph-brainstorming/SKILL.md +1 -1
- package/framework/skills/core/morph-hotfix/SKILL.md +5 -3
- package/framework/skills/core/morph-implement/SKILL.md +101 -201
- package/framework/skills/core/morph-machine/SKILL.md +3 -3
- package/framework/skills/core/morph-media/SKILL.md +1 -1
- package/framework/skills/core/morph-plan/SKILL.md +171 -287
- package/framework/skills/core/morph-proposal/SKILL.md +4 -5
- package/framework/skills/core/morph-review/SKILL.md +109 -430
- package/framework/skills/core/morph-stack-scan/SKILL.md +1 -1
- package/framework/skills/core/morph-standards/SKILL.md +2 -2
- package/framework/skills/core/morph-uiux/SKILL.md +2 -3
- package/framework/standards/STANDARDS.json +10 -10
- package/framework/standards/ai-agents/agent-archetypes.md +1 -1
- package/framework/standards/ai-agents/agent-session.md +1 -1
- package/framework/standards/ai-agents/agent-spec.md +1 -1
- package/framework/standards/ai-agents/batching.md +1 -1
- package/framework/standards/ai-agents/context-providers.md +1 -1
- package/framework/standards/ai-agents/conversational-agent-with-phases.md +1 -1
- package/framework/standards/ai-agents/cost-and-budget.md +1 -1
- package/framework/standards/ai-agents/durable-workflows-hitl.md +1 -1
- package/framework/standards/ai-agents/guardrails.md +1 -1
- package/framework/standards/ai-agents/llm-runtime-defaults.md +1 -1
- package/framework/standards/ai-agents/mcp-server.md +1 -1
- package/framework/standards/ai-agents/mcp-tools.md +1 -1
- package/framework/standards/ai-agents/media-pipeline.md +1 -1
- package/framework/standards/ai-agents/media-video.md +1 -1
- package/framework/standards/ai-agents/middleware-patterns.md +1 -1
- package/framework/standards/ai-agents/modalities-image-gen.md +1 -1
- package/framework/standards/ai-agents/modalities-speech-to-text.md +1 -1
- package/framework/standards/ai-agents/modalities-text-to-speech.md +1 -1
- package/framework/standards/ai-agents/modalities-vision.md +1 -1
- package/framework/standards/ai-agents/multi-agent-patterns.md +1 -1
- package/framework/standards/ai-agents/observability-patterns.md +3 -3
- package/framework/standards/ai-agents/production.md +2 -2
- package/framework/standards/ai-agents/prompt-sources.md +1 -1
- package/framework/standards/ai-agents/providers/model-registry.md +1 -1
- package/framework/standards/ai-agents/rag-custom-pgvector.md +1 -1
- package/framework/standards/ai-agents/service-tier-flex.md +1 -1
- package/framework/standards/ai-agents/setup.md +1 -1
- package/framework/standards/ai-agents/structured-output.md +1 -1
- package/framework/standards/ai-agents/sweet-spot.md +1 -1
- package/framework/standards/ai-agents/testing-ai.md +1 -1
- package/framework/standards/ai-agents/tool-adapters.md +1 -1
- package/framework/standards/ai-agents/vector-data-extensions.md +1 -1
- package/framework/standards/ai-agents/workflows.md +1 -1
- package/framework/templates/CLAUDE.md.core.template +1 -1
- package/framework/templates/IDE-SNIPPETS.md +262 -262
- package/framework/templates/README.md +1 -1
- package/framework/templates/REGISTRY.json +0 -81
- package/framework/templates/code/dotnet/abstractions/api-endpoint.cs +7 -7
- package/framework/templates/code/dotnet/feature/endpoint.cs.hbs +21 -21
- package/framework/templates/code/dotnet/feature/request.cs.hbs +4 -4
- package/framework/templates/code/dotnet/feature/response.cs.hbs +4 -4
- package/framework/templates/code/sql/ai-agents/pgvector-embeddings-migration.sql.template +91 -91
- package/framework/templates/docs/spec.md +19 -205
- package/framework/templates/docs/ui-components.md +52 -52
- package/framework/templates/docs/ui-design-system.md +76 -76
- package/framework/templates/docs/ui-flows.md +167 -167
- package/framework/templates/frontend/nextjs/client-component.tsx.hbs +26 -26
- package/framework/templates/frontend/nextjs/feature-form.tsx.hbs +56 -56
- package/framework/templates/frontend/nextjs/tsconfig.json.hbs +26 -26
- package/framework/templates/infrastructure/docker/Dockerfile.template +58 -58
- package/framework/templates/infrastructure/docker/dockerfile-api.dockerfile +38 -38
- package/framework/templates/infrastructure/docker/dockerfile-web.dockerfile +48 -48
- package/framework/templates/infrastructure/github/README.md +56 -56
- package/framework/templates/infrastructure/github/actions/docker-build-push/action.yml.hbs +45 -45
- package/framework/templates/infrastructure/github/actions/health-check/action.yml.hbs +27 -27
- package/framework/templates/infrastructure/github/workflows/docker-build-push.yml.hbs +59 -59
- package/framework/templates/infrastructure/github/workflows/dotnet-build.yml.hbs +39 -39
- package/framework/templates/meta-prompts/fusion/fusion-agent.md +76 -76
- package/framework/templates/meta-prompts/fusion/fusion-aggregator.md +100 -100
- package/framework/templates/meta-prompts/validators/pre-commit-validator.md +95 -95
- package/framework/templates/state.template.json +17 -17
- package/framework/templates/ui/design-system.css +226 -226
- package/package.json +2 -2
- package/src/commands/e2e/e2e.js +1 -1
- package/src/commands/project/heavy.js +1 -1
- package/src/commands/project/status.js +3 -3
- package/src/commands/state/approve.js +7 -49
- package/src/commands/state/gate-check.js +16 -106
- package/src/commands/state/gate-decision.js +1 -1
- package/src/commands/state/report-check.js +42 -17
- package/src/commands/validation/mutate.js +1 -1
- package/src/commands/validation/scout-check.js +28 -0
- package/src/commands/validation/validate-feature.js +5 -32
- package/src/commands/validation/verify.js +3 -4
- package/src/core/paths/output-schema.js +0 -2
- package/src/core/state/state-manager.js +1 -2
- package/src/core/templates/template-renderer.js +477 -477
- package/src/dashboard/app/lib/format.js +5 -0
- package/src/dashboard/app/main.jsx +13 -13
- package/src/dashboard/app/pages/FeatureDetail.jsx +16 -22
- package/src/dashboard/app/pages/Features.jsx +7 -7
- package/src/dashboard/app/pages/PhasePipeline.jsx +1 -1
- package/src/dashboard/app/pages/Rubrics.jsx +7 -11
- package/src/dashboard/scanner/docs-scanner.js +1 -2
- package/src/dashboard/scanner/features-scanner.js +3 -4
- package/src/dashboard/scanner/rubrics-scanner.js +12 -12
- package/src/dashboard/vite.config.js +24 -24
- package/src/lib/agents/output-collector.js +0 -1
- package/src/lib/detectors/design-system-detector.js +188 -188
- package/src/lib/evaluator-report.js +52 -334
- package/src/lib/generators/design-system-generator.js +508 -508
- package/src/lib/generators/handoff-generator.js +4 -5
- package/src/lib/installers/memory-installer.js +2 -2
- package/src/lib/mutation/manifest.js +8 -2
- package/src/lib/mutation/report.js +5 -3
- package/src/lib/mutation/runner.js +9 -7
- package/src/lib/risk-detector.js +60 -122
- package/src/lib/scout/scout-check.js +293 -0
- package/src/lib/tasks/task-classifier.js +30 -30
- package/src/lib/tasks/task-parser.js +209 -209
- package/src/lib/tasks/tasks-json-parser.js +7 -5
- package/src/lib/tasks/test-nodes.js +1 -1
- package/src/lib/tasks/test-runner.js +1 -1
- package/src/lib/validators/css/css-validator.js +340 -340
- package/src/lib/validators/reuse/reuse-validator.js +6 -8
- package/src/lib/validators/verify-runner.js +1 -1
- package/src/scripts/setup-infra.js +1 -1
- package/src/utils/agent-id-mapper.js +11 -11
- package/src/utils/agents-installer.js +5 -9
- package/src/utils/claude-settings-manager.js +300 -300
- package/src/utils/hooks-installer.js +3 -10
- package/src/utils/skills-installer.js +1 -1
- package/framework/evals/proof-rubrics/README.md +0 -76
- package/framework/evals/proof-rubrics/eval-de-modelo.md +0 -80
- package/framework/evals/proof-rubrics/fiacao.md +0 -54
- package/framework/evals/proof-rubrics/guard-cego.md +0 -52
- package/framework/evals/proof-rubrics/media-claims.md +0 -109
- package/framework/evals/proof-rubrics/mutation-proof.md +0 -107
- package/framework/evals/proof-rubrics/observabilidade-genai.md +0 -119
- package/framework/evals/proof-rubrics/verde-nao-e-coberto.md +0 -48
- package/framework/evals/rubrics/README.md +0 -45
- package/framework/evals/rubrics/architecture.md +0 -103
- package/framework/evals/rubrics/code-quality.md +0 -98
- package/framework/evals/rubrics/condensed.md +0 -57
- package/framework/evals/rubrics/contracts.md +0 -67
- package/framework/evals/rubrics/test-coverage.md +0 -99
- package/framework/evals/scenarios/dotnet-crud.yaml +0 -42
- package/framework/evals/scenarios/nextjs-auth.yaml +0 -38
- package/framework/evals/suites/standard.yaml +0 -5
- package/framework/hooks/claude-code/core/post-edit-typecheck.js +0 -127
- package/framework/skills/core/morph-eval/SKILL.md +0 -64
- package/framework/templates/.idea/morph-templates.xml +0 -92
- package/framework/templates/.vscode/morph-templates.code-snippets +0 -186
- package/framework/templates/docs/clarifications.md +0 -253
- package/framework/templates/docs/onboarding.md +0 -122
- package/framework/templates/docs/schema-analysis.md +0 -119
- package/framework/templates/docs/user-stories.md +0 -34
- package/src/commands/state/score.js +0 -147
|
@@ -4,180 +4,130 @@ description: Orquestra a execução autônoma de tasks de uma feature morph-spec
|
|
|
4
4
|
version: core
|
|
5
5
|
when-to-invoke: após Gate 2 aprovado, ao receber instrução "use /morph-apply" ou "implementar feature"
|
|
6
6
|
user-invokable: true
|
|
7
|
-
cliVersion: "8.
|
|
7
|
+
cliVersion: "8.45.0"
|
|
8
8
|
---
|
|
9
9
|
|
|
10
10
|
# morph-apply
|
|
11
11
|
|
|
12
12
|
## Objetivo
|
|
13
13
|
|
|
14
|
-
|
|
14
|
+
Levar toda task pendente a `done` — `verify` da task verde e `doneCriteria` atendido — e fechar
|
|
15
|
+
com `morph-review` + Gate 3.
|
|
15
16
|
|
|
16
17
|
## Quando invocar
|
|
17
18
|
|
|
18
|
-
|
|
19
|
-
|
|
19
|
+
Gate 2 aprovado (`feature.json → approvalGates.plan.approved`), ou o usuário pede "use /morph-apply
|
|
20
|
+
{feature}". Sem argumento: a feature `in_progress` mais recente.
|
|
20
21
|
|
|
21
|
-
##
|
|
22
|
+
## Ritmo
|
|
22
23
|
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
- `.morph/features/{feature}/2-plan/tasks.json` existe e é válido (schema check).
|
|
28
|
-
- `.morph/features/{feature}/2-plan/spec.md` e `mandate.md` existem.
|
|
29
|
-
- Gate 2 está marcado aprovado no `feature.json` da feature (ou trust:auto está ativo).
|
|
24
|
+
Comando em primeiro plano; o `verify {feature}` que passa do teto de 10 min do Bash vai com
|
|
25
|
+
`run_in_background` e espera a notificação de término. `verify` com exit 3 (`status: "busy"`) já esperou a fila pesada
|
|
26
|
+
pelo timeout dela: no máximo uma chamada nova; persistiu, pare e avise o usuário — a máquina está
|
|
27
|
+
saturada (skill `morph-machine`). Nunca `sleep`/`until` nem retentativa agendada.
|
|
30
28
|
|
|
31
29
|
## Fluxo
|
|
32
30
|
|
|
33
31
|
### 1. Carregar contexto
|
|
34
32
|
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
### 2. Análise de DAG — decisão sequencial vs paralelo
|
|
33
|
+
`.morph/config/config.json → trust` e Read em `2-plan/tasks.json` (ids, `dependencies`, `effort`,
|
|
34
|
+
`group`, `status`, `doneCriteria`).
|
|
39
35
|
|
|
40
|
-
|
|
36
|
+
### 2. Análise de DAG — sequencial vs paralelo
|
|
41
37
|
|
|
42
38
|
```
|
|
43
39
|
morph-spec dag {feature}
|
|
44
40
|
```
|
|
45
41
|
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
> O `dag` também imprime uma recomendação de **isolamento**: se dois fluxos paralelos planejam escrever no mesmo path (colisão de `outputs`), ele reporta `isolation.recommended: "worktree"` — nesse caso siga a §3b-w em vez da §3b.
|
|
54
|
-
|
|
55
|
-
> **Peso de esforço:** a decisão é ponderada por `effort` (S=1, M=2, L=4, XL=8). **Raízes e fluxos compostos só de tasks S não ganham dispatch próprio** — overhead > trabalho. O comando os lista como `inline` (você os executa no modo sequencial) ou os agrupa num **único** agente quando são muitos. O cap de **4 agentes simultâneos** (anti-padrão abaixo) vale para ambas as formas. Se um fluxo de domínio é uma cadeia longa, despache o **fluxo inteiro** a um sub-agent (que executa a cadeia em ordem internamente) — um agente por fluxo, não um agente por task.
|
|
42
|
+
Ele lê `dependencies`, `group` e `effort` (S=1, M=2, L=4, XL=8) e imprime a decisão:
|
|
43
|
+
- ≤ 3 tasks → **sequencial**.
|
|
44
|
+
- ≥ 2 fluxos de domínio independentes com peso (backend ‖ frontend) → **um sub-agent por fluxo, em
|
|
45
|
+
paralelo** (§3b); cadeia longa vai inteira ao agente do fluxo.
|
|
46
|
+
- ≥ 3 raízes independentes de effort ≥ M → raízes em **paralelo**, o resto sequencial.
|
|
47
|
+
- Senão, sequencial com auto-advance. Raiz S roda `inline`.
|
|
56
48
|
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
Registre a linha de decisão que o comando imprimiu
|
|
60
|
-
```
|
|
61
|
-
DAG: 14 tasks, fluxos {backend:9, frontend:2} independentes (peso 18‖4) → 2 fluxos paralelos + T14 (integração) sequencial no fim
|
|
62
|
-
DAG: 12 tasks, 4 raízes independentes (3 com peso ≥ M) → parallel batch (T1, T3, T7) + T9 (S) inline + restante sequencial
|
|
63
|
-
```
|
|
49
|
+
`isolation.recommended: "worktree"` (dois fluxos escrevem o mesmo path) → §3b-w. O DAG decide
|
|
50
|
+
quantas tasks ao mesmo tempo; o `morph-implement` §4 decide quem executa cada uma —
|
|
51
|
+
`DAG: sequencial` não significa "tudo inline". Registre a linha de decisão que o comando imprimiu.
|
|
64
52
|
|
|
65
53
|
### 3a. Modo Sequencial (auto-advance)
|
|
66
54
|
|
|
67
|
-
Loop:
|
|
68
55
|
```
|
|
69
56
|
while (true):
|
|
70
|
-
ready = tasks 'pending'
|
|
71
|
-
if ready
|
|
72
|
-
break
|
|
73
|
-
|
|
57
|
+
ready = tasks 'pending' com todas as dependencies 'done' (releia tasks.json)
|
|
58
|
+
if ready vazio: break
|
|
74
59
|
task = ready[0]
|
|
75
|
-
marcar task.status = 'in_progress'
|
|
60
|
+
marcar task.status = 'in_progress' (Edit, só campos mutáveis)
|
|
76
61
|
|
|
77
|
-
|
|
78
|
-
// Entre tasks NÃO há pausa humana: score < 9 dispara re-implementação, não AskUserQuestion.
|
|
79
|
-
attempt = 0
|
|
80
|
-
best = { score: 0, output: null }
|
|
81
|
-
skillLoaded = false // true assim que Skill(morph-implement) foi invocada nesta sessão
|
|
62
|
+
attempt = 0; feedback = null; pronto = false
|
|
82
63
|
while attempt < 3:
|
|
83
64
|
attempt += 1
|
|
65
|
+
// attempt 1: invoke Skill(morph-implement) with task. Nas seguintes, aplique o
|
|
66
|
+
// feedback direto ao código — reinvoque a skill só depois de /compact ou numa
|
|
67
|
+
// sessão nova, que descartam o conteúdo dela.
|
|
68
|
+
implementar (ou corrigir com feedback)
|
|
69
|
+
|
|
70
|
+
// OUTPUTS ANTES DO VERIFY: o recorte por task lê `outputs`.
|
|
71
|
+
atualizar task.outputs em tasks.json (divergiu do plano → `notes` na mesma edição)
|
|
84
72
|
|
|
85
|
-
if attempt == 1 or not skillLoaded:
|
|
86
|
-
// attempt 1 sempre invoca — é o que carrega mandate/spec/standard/persona
|
|
87
|
-
// pela primeira vez. Reinvoca também se skillLoaded caiu para false (ver nota).
|
|
88
|
-
invoke Skill(morph-implement) with task
|
|
89
|
-
(no attempt > 1: passar o feedback priorizado da tentativa anterior como input)
|
|
90
|
-
skillLoaded = true
|
|
91
|
-
else:
|
|
92
|
-
// attempt > 1, skill já em contexto desde attempt 1: NÃO reinvoque a Skill —
|
|
93
|
-
// aplique o feedback priorizado direto ao código já implementado (mesma
|
|
94
|
-
// lógica do passo 1 do morph-implement, "isto NÃO é implementação do zero",
|
|
95
|
-
// só que sem reler o documento inteiro da skill de novo).
|
|
96
|
-
aplicar feedback priorizado da tentativa anterior ao código já implementado
|
|
97
|
-
|
|
98
|
-
// OUTPUTS ANTES DO VERIFY — o recorte por task lê `outputs` de tasks.json.
|
|
99
|
-
// Grave neles (campo mutável, tool Edit) os arquivos REAIS desta tentativa: do
|
|
100
|
-
// relatório `3-implement/reports/{task.id}.md` quando despachada, do que você
|
|
101
|
-
// escreveu quando inline. Divergiu do plano → `notes` na mesma edição.
|
|
102
|
-
atualizar task.outputs em tasks.json
|
|
103
|
-
|
|
104
|
-
// CÓDIGO ANTES DO JUIZ — barreira determinística e barata (build+testes+validadores).
|
|
105
|
-
// Loop por task: o recorte é AUTOMÁTICO — o `group` da task escolhe os nós e os
|
|
106
|
-
// arquivos de teste de `outputs` estreitam o comando dentro de cada nó (o relógio
|
|
107
|
-
// de uma task não paga a suíte inteira). `--filter {ids}` só para FORÇAR a
|
|
108
|
-
// escolha de nós; `--full` desliga o recorte.
|
|
109
73
|
run: morph-spec verify {feature} {task.id} --json
|
|
110
|
-
// exit 3 / status == 'busy': fila de slot pesado cheia, NÃO vermelho — nada foi verificado nem gravado.
|
|
111
|
-
// Repita a mesma chamada; não conta como tentativa e não dispara o loop de correção.
|
|
112
74
|
if verify.status == 'fail':
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
//
|
|
118
|
-
|
|
119
|
-
if
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
// feature.json à mão para isso:
|
|
124
|
-
run: morph-spec score {feature} {task.id} {result.score} --dims {arch},{contracts},{quality},{tests}
|
|
125
|
-
|
|
126
|
-
if result.score >= 9:
|
|
127
|
-
break
|
|
128
|
-
|
|
129
|
-
if best.score >= 9:
|
|
75
|
+
feedback = verify.feedback; continue // conta como tentativa
|
|
76
|
+
// 'busy': ver "Ritmo"
|
|
77
|
+
|
|
78
|
+
// cada doneCriteria com a evidência que o prova (teste, arquivo:linha) — do
|
|
79
|
+
// relatório `reports/{task.id}.md` quando despachada, do seu código quando inline
|
|
80
|
+
faltando = critérios sem evidência
|
|
81
|
+
if faltando: feedback = faltando; continue
|
|
82
|
+
pronto = true; break
|
|
83
|
+
|
|
84
|
+
if pronto:
|
|
130
85
|
// task com `3-implement/evidencias/{id}.md` em `outputs`: confira o arquivo antes do `done`
|
|
131
86
|
// (morph-implement §5). Em batch paralelo sem isolamento o sub-agente não roda eval — o
|
|
132
87
|
// ORQUESTRADOR roda, após o batch, `morph-spec verify {feature} --filter {id-do-nó-evals} --skip-e2e --no-persist`
|
|
133
|
-
marcar task.status = 'done'
|
|
134
|
-
reais, já gravados antes do verify, e, se divergirem do planejado, o porquê em notes)
|
|
88
|
+
marcar task.status = 'done' (Edit; confirme os outputs reais)
|
|
135
89
|
else:
|
|
136
|
-
// 3 tentativas sem
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
options: [aceitar (marca done com ressalva no recap), continuar tentando (+3 tentativas), pular task (marca blocked)]
|
|
90
|
+
// 3 tentativas sem verify verde + critérios: a única pausa do loop
|
|
91
|
+
registrar no recap as tentativas e o que faltou
|
|
92
|
+
AskUserQuestion: "Task {id} sem verify verde e critérios atendidos após 3 tentativas — aceitar, continuar tentando, ou pular?"
|
|
93
|
+
options: [aceitar (done com ressalva no recap), continuar (+3 tentativas), pular (blocked)]
|
|
141
94
|
```
|
|
142
95
|
|
|
143
|
-
> **
|
|
144
|
-
>
|
|
145
|
-
>
|
|
146
|
-
|
|
147
|
-
>
|
|
148
|
-
>
|
|
149
|
-
> **Isto vale para a LEITURA da skill pelo orquestrador — não para o conteúdo de um dispatch.** Se o attempt 1 foi despachado a um sub-agent (§3b) e o attempt 2 também dispara os gatilhos de dispatch do `morph-implement` §4, o prompt de dispatch completo é reenviado normalmente: o sub-agent de um novo dispatch não tem o contexto do attempt anterior, então o corte de reinvoke não se aplica a ele. O que muda aqui é só a leitura da skill pelo ORQUESTRADOR no loop sequencial inline.
|
|
96
|
+
> **O recorte é do loop por task.** `verify {feature} {task.id}` deixa o `group` escolher os nós e
|
|
97
|
+
> os arquivos de teste de `outputs` estreitarem o comando; cada nó aparece em
|
|
98
|
+
> `nodes.tests.runs[]` com `selection` e o motivo. `--filter {ids}` só força a escolha de nós (um
|
|
99
|
+
> filtro que não casa nada é erro de uso, exit 2); `--full` desliga o recorte. A verificação
|
|
100
|
+
> pós-batch e a do Gate 3 rodam **sem filtro**, e `verify {feature}` **nunca recorta**. Detalhe:
|
|
101
|
+
> `.morph/framework/CLI.md`, seção "Suítes de teste".
|
|
150
102
|
|
|
151
|
-
> **
|
|
103
|
+
> **Não há juiz LLM por task.** O que o código determinístico prova (build, testes, validadores)
|
|
104
|
+
> está no verify; o que ele não prova — o critério do use case — se confere contra o `doneCriteria`,
|
|
105
|
+
> com evidência. Estilo e estrutura são assunto do avaliador do Gate 3, e mesmo lá só como nota.
|
|
152
106
|
|
|
153
107
|
### 3b. Modo Paralelo (para o subset independente)
|
|
154
108
|
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
**Cole o template literal**: só os campos entre `<>` mudam; não parafraseie cláusula nem omita os parágrafos de leitura, ferramentas e comentário.
|
|
109
|
+
Escope cada agente ao domínio: `subagent_type: "morph-{task.agent}"` e `task.standards` (carimbados
|
|
110
|
+
pelo `morph-plan`). Plano legado sem `agent`: escolha em `.morph/framework/agents.json` por
|
|
111
|
+
`domains`. Tipo não registrado: `general-purpose` com o campo `persona` colado, e
|
|
112
|
+
`dispatch-fallback: general-purpose ({id} não registrado)` nas `notes`. Cap de 4 agentes ao mesmo
|
|
113
|
+
tempo. **Cole o template literal** — só os campos entre `<>` mudam:
|
|
162
114
|
|
|
163
115
|
```
|
|
164
116
|
dispatch Agent (subagent_type: "morph-{id}") with prompt:
|
|
165
|
-
contexto: spec.md,
|
|
166
|
-
task.reuse (
|
|
167
|
-
|
|
168
|
-
+ o trecho)
|
|
117
|
+
contexto: spec.md, use cases da task, description completa, doneCriteria,
|
|
118
|
+
task.reuse (REUSAR/ESTENDER/CRIAR por conceito), os paths dos alvos
|
|
119
|
+
de reuso e o que você já leu (`arquivo:linhas` + o trecho)
|
|
169
120
|
standards: <por standard: id + digest do `standards --find` + as 3-8 regras do
|
|
170
121
|
.md que ESTA task aplica, coladas; o path só para consulta pontual>
|
|
171
122
|
instrução: |
|
|
172
|
-
Siga as regras dos standards acima; abra o .md só para uma dúvida pontual.
|
|
173
123
|
Implemente esta task (ou cadeia de tasks do fluxo) sem depender do trabalho
|
|
174
|
-
dos outros agentes deste batch: seu
|
|
175
|
-
|
|
124
|
+
dos outros agentes deste batch: seu isolamento é de estado e de árvore de
|
|
125
|
+
trabalho, nunca de conhecimento do codebase. Antes de criar tipo,
|
|
176
126
|
componente, hook ou serviço NOVO, verifique se já existe: `morph-spec graph
|
|
177
127
|
explain <nome>` e `graph affected <conceito> --uses-only`; sem grafo
|
|
178
128
|
(`no-graph`), caia para `grep -rn "<nome>"` e siga — a ausência de grafo
|
|
179
|
-
nunca bloqueia. Se
|
|
180
|
-
|
|
129
|
+
nunca bloqueia. Se criar mesmo assim, diga por que em uma linha no relatório.
|
|
130
|
+
|
|
181
131
|
Leitura e turnos: cada turno custa ~10 s antes de a tool rodar, e o teto de
|
|
182
132
|
turnos corta sem aviso. Chamadas que não dependem uma da outra vão no MESMO
|
|
183
133
|
turno: leia de uma vez todos os arquivos que este prompt lista, dispare os
|
|
@@ -189,173 +139,122 @@ dispatch Agent (subagent_type: "morph-{id}") with prompt:
|
|
|
189
139
|
Ferramentas: antes de supor a API de uma biblioteca (MAF, EF Core, Next,
|
|
190
140
|
shadcn, SDK de provedor), consulte o MCP `context7` (`resolve-library-id` →
|
|
191
141
|
`query-docs`). Impacto e vizinhança de símbolo vêm do grafo
|
|
192
|
-
(`morph-spec graph`)
|
|
193
|
-
|
|
194
|
-
|
|
142
|
+
(`morph-spec graph`). Tool `mcp__…` não carregada se carrega com `ToolSearch`
|
|
143
|
+
(`select:<nome>`); MCP ausente nunca bloqueia — siga com o fallback.
|
|
144
|
+
|
|
195
145
|
Comentário: o padrão é nenhum. Nome, tipo e teste explicam o código; sem
|
|
196
146
|
`///`/JSDoc em membro de aplicação, cabeçalho, banner de seção ou história
|
|
197
147
|
da task. Só o porquê que o código não mostra, em uma linha
|
|
198
148
|
(`architecture-code-comments`). O elo com a pós-condição vai no nome do
|
|
199
|
-
teste
|
|
200
|
-
|
|
201
|
-
Não modifique spec.md, mandate.md.
|
|
149
|
+
teste. O hook `comment-guard` bloqueia a edição que adiciona história,
|
|
150
|
+
banner ou bloco longo. Não modifique spec.md.
|
|
202
151
|
|
|
203
152
|
Contrato do relatório final:
|
|
204
|
-
1. GRAVE um relatório por task
|
|
153
|
+
1. GRAVE um relatório por task em
|
|
205
154
|
`.morph/features/{feature}/3-implement/reports/{taskId}.md` ANTES de
|
|
206
|
-
encerrar
|
|
207
|
-
numa sessão só) — é o retorno autoritativo, não a sua mensagem final
|
|
208
|
-
(que é cortesia best-effort e pode não chegar inteira). NÃO chame
|
|
209
|
-
SendMessage.
|
|
155
|
+
encerrar — é o retorno autoritativo. NÃO chame SendMessage.
|
|
210
156
|
2. NÃO toque em tasks.json, feature.json, state.json nem no board de
|
|
211
|
-
sessão — todo estado
|
|
212
|
-
exclusivamente pelo orquestrador.
|
|
157
|
+
sessão — todo estado é gravado exclusivamente pelo orquestrador.
|
|
213
158
|
3. TESTE — a prova é do orquestrador (`morph-spec verify`), não sua.
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
- Batch COM isolamento (você recebeu `isolation: "worktree"`): a regra
|
|
223
|
-
acima vale DENTRO do seu worktree; commite seu trabalho na branch do
|
|
224
|
-
worktree como último ato antes do relatório; reporte a branch — nunca
|
|
225
|
-
faça merge nem toque na árvore principal.
|
|
226
|
-
- Ao rodar: compile uma vez e rode sem recompilar (`dotnet test
|
|
227
|
-
--no-build`), com `--filter`. Grave a saída em arquivo uma vez
|
|
228
|
-
(`… > .morph/logs/test-last.log 2>&1`, sem nada depois) e leia o arquivo:
|
|
229
|
-
rodar de novo com outro `| tail`/`| grep` repete o teste para ver outras
|
|
230
|
-
linhas, e com pipe ou `; echo` o exit é o do último comando, não o do teste.
|
|
231
|
-
|
|
159
|
+
Testes pelo orçamento: um por pós-condição, um de regressão por bug,
|
|
160
|
+
variantes numa tabela. NÃO rode teste a cada marco nem faça ciclo
|
|
161
|
+
red→green: compile e rode SÓ o filtro dos seus testes UMA vez, em
|
|
162
|
+
primeiro plano, saída em arquivo
|
|
163
|
+
(`… > .morph/logs/test-last.log 2>&1`). Não rode `morph-spec verify`.
|
|
164
|
+
Batch SEM isolamento: só compile. Com `isolation: "worktree"`: o mesmo
|
|
165
|
+
dentro do seu worktree, e o último ato é o commit na branch dele —
|
|
166
|
+
nunca faça merge.
|
|
232
167
|
4. ESCOPO: no máximo 3 tasks e ~4 arquivos por dispatch. Escopo maior falha e
|
|
233
168
|
volta — fatie antes, não depois.
|
|
234
169
|
5. SOBREVIVÊNCIA: o limite de turnos (`maxTurns`, no seu system prompt)
|
|
235
170
|
corta sem aviso: commite `wip({taskId})` a cada marco (um arquivo ou
|
|
236
|
-
uma fatia coerente escrita
|
|
171
|
+
uma fatia coerente escrita), não só ao fim da task — e só os seus arquivos
|
|
237
172
|
(`git add <paths>`, nunca `-A`). Sem commit, a retomada recomeça do zero.
|
|
238
173
|
A ~70% do limite, grave o relatório parcial no arquivo canônico: `PARCIAL`
|
|
239
|
-
na 1ª linha, o feito e o que falta, sem
|
|
240
|
-
por decisão sua;
|
|
241
|
-
`PARCIAL`. Sem limite declarado, bastam os commits por marco.
|
|
174
|
+
na 1ª linha, o feito e o que falta, sem critério dado como atendido. Depois
|
|
175
|
+
siga ou pare, por decisão sua; o relatório final substitui o parcial.
|
|
242
176
|
6. PROCESSOS: NUNCA `taskkill /IM node.exe` (derruba os MCPs de todas as
|
|
243
177
|
sessões). Encerre dev server pelo PID que você mesmo subiu. Build e
|
|
244
|
-
suíte pesados
|
|
245
|
-
|
|
246
|
-
|
|
178
|
+
suíte pesados rodam por `morph-spec heavy run -- <comando>`, em primeiro
|
|
179
|
+
plano. Exit 3 é fila cheia depois da espera da própria fila: não repita
|
|
180
|
+
nem espere em laço — diga no relatório o que não rodou.
|
|
247
181
|
7. RETORNO: o relatório no arquivo canônico é o retorno. `SendMessage` não é
|
|
248
182
|
substituto do relatório e não deve ser chamado.
|
|
249
183
|
8. MUTAÇÃO: nunca altere, reverta, mova ou apague código de produção para ver
|
|
250
184
|
um teste falhar (`sed`, `mv`, `git show HEAD:… >`, `git stash`, `git
|
|
251
185
|
checkout --`). A prova de que o teste morde é do avaliador no Gate 3.
|
|
252
186
|
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
ausente, oco, ou sem os 4 itens, é falha de protocolo.
|
|
187
|
+
Formato do relatório: (1) o que foi feito, em 2-3 frases; **Arquivos:** um
|
|
188
|
+
item `- \`path\`` por arquivo; **Critérios:** cada doneCriteria — atendido (o
|
|
189
|
+
teste ou `arquivo:linha` que o prova) ou não (por quê); (4) problemas.
|
|
257
190
|
```
|
|
258
191
|
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
> retomar, não completar DEGRADADO: retome o MESMO agente por `SendMessage`, colando no recado
|
|
270
|
-
> `tree.dirty` e `tree.commits` do `report-check` e o que falta (ele guarda o contexto), ou
|
|
271
|
-
> re-despache só o que falta a partir do último `wip`. Nunca pontue nem marque `done` sobre um
|
|
272
|
-
> parcial.
|
|
273
|
-
|
|
274
|
-
> Este template é deliberadamente paritário com o template sequencial em `morph-implement` §4: ambos despacham o **subagent registrado do domínio (`morph-{id}`)** com standard escopado e as **mesmas 8 cláusulas** do contrato do relatório final (relatório, estado, teste, escopo, sobrevivência, processos, retorno e mutação), os mesmos parágrafos de leitura/turnos e ferramentas e os mesmos 4 itens de relatório — racional completo em `MORPH.md` §6. A única diferença é que aqui múltiplos agentes rodam ao mesmo tempo, um por fluxo independente.
|
|
275
|
-
|
|
276
|
-
> **Alternativa quando os fluxos tocam os mesmos projetos/arquivos** (ex.: o mesmo csproj de testes compartilhado): siga a §3b-w abaixo em vez desta seção — despache com `isolation: "worktree"`, cada agente trabalha numa working tree própria e o orquestrador integra ao final.
|
|
277
|
-
|
|
278
|
-
**Batch SEM isolamento:** aguardar todos os agentes terminarem, depois **auditar os relatórios contra o trabalho** com `morph-spec report-check {feature} {T1} {T2} … --json` (os ids do batch: sem eles o modo feature só audita tasks já `done`, e as do batch ainda não estão) — determinístico e independente da palavra dos agentes; é o passo que pega tanto o relatório ausente quanto o `report-stale` (completo, porém gravado antes do fim do trabalho: o agente relatou cedo e continuou escrevendo). Em `report-stale`, **não re-despache** — leia o campo `observed` (writes reais do `events.jsonl`) e atualize o relatório a partir dele. Vereditos e ações: `MORPH.md` §6. Em seguida **ler** `.morph/features/{feature}/3-implement/reports/{taskId}.md` de cada task — é o valor de retorno autoritativo; a mensagem de texto do dispatch, se chegou inteira, é só um atalho que economiza essa leitura. Depois, sequencialmente:
|
|
279
|
-
- **Rodar `morph-spec verify {feature} --json` uma única vez, pós-batch** (escopo feature, **sem `--filter`**) — os agentes não a rodaram (cláusula 3). Vermelho: use `verify.feedback` para corrigir/redespachar ANTES de qualquer morph-eval. (Com isolamento por worktree, cada agente já rodou o verify dentro do seu worktree; o orquestrador roda o verify compartilhado UMA vez após o merge — ver §3b-w.)
|
|
280
|
-
- Para cada relatório retornado:
|
|
281
|
-
- Aplicar `Skill(morph-eval)`.
|
|
282
|
-
- Gravar o score: `morph-spec score {feature} {taskId} {score} --dims {a},{c},{q},{t}`.
|
|
283
|
-
- Se score >= 9 (e `3-implement/evidencias/{taskId}.md` gravada, se a task a deve — checagem do §3a): marcar `done` em tasks.json (tool Edit — só campos mutáveis).
|
|
284
|
-
- Se score < 9: marcar `pending` novamente com nota — volta ao modo sequencial, onde o loop de correção (até 3 tentativas) busca o score 9.
|
|
285
|
-
|
|
286
|
-
Depois do batch paralelo, executar o restante em modo sequencial (passo 3a).
|
|
287
|
-
|
|
288
|
-
**Batch COM isolamento (§3b-w): dispatch rolling, não por onda.** Nenhum agente escreve na
|
|
289
|
-
árvore principal, então o orquestrador não espera o batch inteiro: a cada relatório que chega,
|
|
290
|
-
audita (`report-check {feature} {taskId}`), integra aquela branch (§3b-w passo 2), roda
|
|
291
|
-
`verify {feature} {taskId}` e `morph-eval` + `score` daquela task, e **despacha na hora** toda
|
|
292
|
-
task que ficou `ready` (`getReadyTasks`) cujos `outputs` não colidem com os das tasks em voo —
|
|
293
|
-
o worktree nasce da branch da feature, já com o merge que acabou de entrar. Cap de 4 em voo. O
|
|
294
|
-
`verify {feature}` de escopo feature roda uma vez, quando nada mais está em voo. Medido: uma task
|
|
295
|
-
esperou 43 min pela onda depois de a dependência dela já estar pronta.
|
|
192
|
+
**Passo pós-dispatch (batch SEM isolamento):** espere todos e rode `morph-spec report-check {feature} {T1} {T2} … --json`
|
|
193
|
+
com os ids do batch. O bloco `tree` (`dirty`, `diffstat`, `commits`, `markers`) mostra o disco que
|
|
194
|
+
os agentes deixaram; árvore suja sem explicação ou `markers` não vazio vai ao recap. Em
|
|
195
|
+
`report-stale`, **não re-despache** — leia `observed` e atualize o relatório. Leia cada
|
|
196
|
+
`3-implement/reports/{taskId}.md` (a mensagem do agente é atalho). Depois:
|
|
197
|
+
- **`morph-spec verify {feature} --json` uma vez, pós-batch, sem filtro** — os agentes não o rodaram.
|
|
198
|
+
Vermelho: corrija ou re-despache com `verify.feedback`.
|
|
199
|
+
- Para cada task do batch:
|
|
200
|
+
- Se verify verde e critérios atendidos (e `3-implement/evidencias/{taskId}.md` gravada, se a task a deve — checagem do §3a): marcar `done` (Edit, só campos mutáveis).
|
|
201
|
+
- Senão: de volta a `pending` com nota — o loop sequencial (§3a) a retoma.
|
|
296
202
|
|
|
297
|
-
|
|
203
|
+
**`PARCIAL` na 1ª linha = a task não está pronta** — o `report-check` o acusa como `report-incomplete`.
|
|
204
|
+
Retome o MESMO agente por `SendMessage`, com
|
|
205
|
+
`tree.dirty`, `tree.commits` e o que falta; ou re-despache só o que falta a partir do último `wip`.
|
|
298
206
|
|
|
299
|
-
|
|
207
|
+
O template é paritário com o do `morph-implement` §4: mesmas 8 cláusulas e o mesmo formato de
|
|
208
|
+
relatório (racional em `MORPH.md` §6).
|
|
300
209
|
|
|
301
|
-
|
|
302
|
-
2. **Integração (orquestrador, a cada relatório que chega):** faça o merge de cada branch reportada, uma por vez, na ordem de chegada — `git merge --no-ff <branch>`. Conflito → `git merge --abort`, marque a task de volta a `pending` com nota "merge conflict — reexecutar sequencial", siga para a próxima branch. Os paths em conflito são exatamente os de `isolation.collisions` do dag.
|
|
303
|
-
3. **Pós-merge:** `verify {feature} {taskId}` no merge de cada task (dispatch rolling, §3b), depois `morph-eval` + `morph-spec score`; `morph-spec verify {feature} --json` de escopo feature UMA vez, quando nada mais está em voo (o merge é o novo ponto de integração — verificação compartilhada obrigatória).
|
|
304
|
-
4. **Cleanup:** o hook `WorktreeRemove` remove o worktree **limpo** ao fim do subagent (branch sobrevive) — mas não conte com ele: rode `morph-spec worktree remove --target <path>` por worktree que sobrou (NUNCA `git worktree remove` cru — as junctions do passo 1 seriam atravessadas e o `node_modules`/`.claude` da raiz apagados) + `git branch -d morph-task/<n>` das branches integradas + `git worktree prune` (fail-open). Depois de cada retorno de agent com `isolation`, e ao fim do batch, rode `morph-spec worktree reap --json`: remove só o worktree de `agent-<hex>` que parou limpo e sem commit exclusivo, e lista o resto com a razão (`not-a-registered-worktree` no `remove --target` seguinte = o reaper já o levou). Worktree sujo (subagent não commitou) fica, vira `agent-worktree-leftover` no `doctor --worktrees`, e a task volta a `pending`. Branches não integradas ficam e são registradas no recap com o motivo.
|
|
305
|
-
5. **Agente morto no meio:** se commitou, a branch sobrevive (retomável); senão, a task volta a `pending` na lane sequencial. Registre a falha de protocolo no recap.
|
|
210
|
+
### 3b-w. Batch isolado por worktree (quando o dag recomenda)
|
|
306
211
|
|
|
307
|
-
|
|
212
|
+
1. **Dispatch:** o template de §3b com `isolation: "worktree"`. O hook `WorktreeCreate` cria
|
|
213
|
+
`worktrees/<n>` na branch `morph-task/<n>`, com junctions e `.morph/worktree.env` prontos, a partir
|
|
214
|
+
de `morph/<feature>` quando a sessão está nela (fora dela, o prompt abre com
|
|
215
|
+
`git merge --ff-only morph/<feature>`). Infra faltando: o agente roda `morph-spec worktree link --all`.
|
|
216
|
+
2. **Rolling, não por onda:** a cada relatório, `report-check {feature} {taskId}`, `git merge --no-ff
|
|
217
|
+
<branch>` (conflito → `git merge --abort`, task volta a `pending` com nota), `verify {feature}
|
|
218
|
+
{taskId}`, critérios, e despache na hora a task que ficou ready sem colidir com as em voo. Cap
|
|
219
|
+
de 4. O `verify {feature}` sem filtro roda uma vez, quando nada mais está em voo.
|
|
220
|
+
3. **Cleanup:** depois de cada retorno e ao fim, `morph-spec worktree reap --json` remove o worktree
|
|
221
|
+
`agent-<hex>` que parou limpo e sem commit exclusivo e lista o resto com a razão
|
|
222
|
+
(`not-a-registered-worktree` no `remove --target` seguinte = o reaper já o levou). O que sobrar:
|
|
223
|
+
`morph-spec worktree remove --target <path>` — NUNCA `git worktree remove` cru, que atravessa as
|
|
224
|
+
junctions. `git branch -d morph-task/<n>` das branches integradas.
|
|
225
|
+
4. **Agente morto no meio:** com commit, a branch é retomável; sem, a task volta a `pending`.
|
|
226
|
+
|
|
227
|
+
O subagent nunca faz merge, e unidades isoladas e não isoladas não se misturam no mesmo batch.
|
|
308
228
|
|
|
309
229
|
### 4. Conclusão de tasks
|
|
310
230
|
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
- Invocar `Skill(morph-review)` para gerar `.morph/features/{feature}/4-review/review-report.md`.
|
|
314
|
-
- A skill morph-review chama `morph-eval` em escopo de feature inteira.
|
|
231
|
+
Sem tasks pendentes: invoke `Skill(morph-review)`.
|
|
315
232
|
|
|
316
233
|
### 5. Gate 3
|
|
317
234
|
|
|
318
|
-
Apresentado e
|
|
319
|
-
|
|
320
|
-
re-apresente o gate**: siga direto para o encerramento (§6) conforme a decisão já persistida em
|
|
321
|
-
`gateDecisions.review`.
|
|
235
|
+
Apresentado, decidido e aprovado por `morph-review` §7. Ao retomar o controle, **não re-apresente
|
|
236
|
+
o gate** nem aprove de novo: siga para o encerramento conforme `gateDecisions.review`.
|
|
322
237
|
|
|
323
|
-
### 6.
|
|
238
|
+
### 6. Encerramento
|
|
324
239
|
|
|
325
|
-
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
-
|
|
240
|
+
- **Contexto antes do `finish`.** Todo `.morph/context/*.md` que descreve um fato que esta feature
|
|
241
|
+
mudou tem o **corpo** reescrito para o estado novo; o changelog do documento guarda só data e
|
|
242
|
+
motivo. Commite na branch da feature — o `finish` exige a árvore limpa.
|
|
243
|
+
- **Fechar:** `morph-spec finish {feature} --pr|--merge`, modo escolhido por `AskUserQuestion`
|
|
244
|
+
(header `"Integração"`). `--pr` arquiva e abre o PR, mas só o merge integra: a feature fica
|
|
245
|
+
`aguardando-merge` em `list`/`fleet`. Mecânica: `MORPH.md` §2.1/§2.2.
|
|
329
246
|
|
|
330
247
|
## Anti-padrões
|
|
331
248
|
|
|
332
|
-
-
|
|
333
|
-
-
|
|
334
|
-
-
|
|
335
|
-
-
|
|
336
|
-
-
|
|
337
|
-
- Não deixar sub-agent tocar `tasks.json`, `feature.json` ou o board de sessão — estado é do orquestrador (cláusula 2 do protocolo).
|
|
338
|
-
- Não editar `feature.json` à mão para gravar scores ou decisões de gate — use `morph-spec score` e `morph-spec gate-check`/`gate-decision` (timestamps server-side; o Edit manual colide com o hook state-sync — "file modified since read").
|
|
339
|
-
|
|
340
|
-
## Output esperado
|
|
341
|
-
|
|
342
|
-
- Todas as tasks em `tasks.json` com status `done` ou `skipped`.
|
|
343
|
-
- `.morph/features/{feature}/3-implement/recap.md` produzido por morph-implement.
|
|
344
|
-
- `.morph/features/{feature}/3-implement/evidencias/{taskId}.md` — só nas tasks que o listam em `outputs` (critério sobre saída de LLM, `morph-plan` §5): evidência de runtime gravada por morph-implement e lida pelo avaliador do Gate 3 — não é o `reports/{taskId}.md` do sub-agente.
|
|
345
|
-
- `.morph/features/{feature}/4-review/review-report.md` produzido por morph-review.
|
|
346
|
-
- Gate 3 registrado aprovado em `.morph/features/{feature}/feature.json` (autoritativo) — via `morph-spec approve` em auto, ou pelo hook state-sync no caminho manual.
|
|
347
|
-
- Feature com Gate 3 aprovado e **fechada** por `morph-spec finish --pr|--merge` (arquiva carimbando `status: "completed"` + `archivedAt` e desmonta num passo; `--merge` integra na hora, `--pr` só abre o PR — `aguardando-merge` até o merge) — ou, se legada, por `morph-spec archive`.
|
|
249
|
+
- Paralelo com dependência cruzada entre as tasks do batch.
|
|
250
|
+
- Mais de 4 agentes ao mesmo tempo; agente inteiro para raiz S.
|
|
251
|
+
- Sub-agent tocando `tasks.json`, `feature.json` ou o board de sessão.
|
|
252
|
+
- Editar `spec.md` depois do Gate 2, ou `feature.json` à mão.
|
|
253
|
+
- Rodar teste fora do `verify` no loop do orquestrador: a prova é o verify.
|
|
348
254
|
|
|
349
255
|
## Referências
|
|
350
256
|
|
|
351
|
-
- `.morph/framework/MORPH.md`
|
|
352
|
-
- `.
|
|
353
|
-
- `.claude/skills/morph-
|
|
354
|
-
- `.claude/skills/morph-review/SKILL.md`
|
|
355
|
-
- `.claude/skills/morph-plan/SKILL.md` §5a — resolve e carimba `task.agent`/`task.standards` no plano; fonte primária deste §3b
|
|
356
|
-
- `morph-spec dag {feature}` — análise de DAG e decisão sequencial vs paralelo (ponderada por effort), incluindo recomendação de isolamento (`isolation.recommended: "worktree"`)
|
|
357
|
-
- `morph-spec verify {feature} [task] --json` — cadeia determinística build+testes+validadores+e2e (código antes do juiz)
|
|
358
|
-
- `morph-spec score {feature} {task} {score} [--dims a,c,q,t]` — grava taskScores no feature.json com timestamp server-side
|
|
359
|
-
- `morph-spec gate-check {feature} {gate} [--json]` — default: coleta sinais do disco, decide via `shouldPauseGate`, persiste `gateDecisions`
|
|
360
|
-
- `morph-spec gate-decision {feature} {gate} --pause {bool} [--reason ...] [--signals ...]` — escape manual: risco que o `gate-check` não vê no disco (shape em `.morph/framework/schemas/feature.schema.json`)
|
|
361
|
-
- `.morph/framework/MORPH.md` §5 — regras de pausa de gate (trust mode)
|
|
257
|
+
- `.morph/framework/MORPH.md` §6 — contrato do relatório final
|
|
258
|
+
- `morph-spec dag|verify|report-check|worktree reap` — `.morph/framework/CLI.md`
|
|
259
|
+
- `.claude/skills/morph-implement/SKILL.md` §4 — template sequencial paritário
|
|
260
|
+
- `.claude/skills/morph-review/SKILL.md` — Gate 3
|
|
@@ -4,7 +4,7 @@ description: Entende o negócio, os usuários e a arquitetura antes de qualquer
|
|
|
4
4
|
version: core
|
|
5
5
|
when-to-invoke: ao receber um novo request de feature, antes de morph-plan
|
|
6
6
|
user-invokable: true
|
|
7
|
-
cliVersion: "8.
|
|
7
|
+
cliVersion: "8.45.0"
|
|
8
8
|
---
|
|
9
9
|
|
|
10
10
|
# morph-brainstorming
|
|
@@ -4,7 +4,7 @@ description: ADW cirúrgico de hotfix — resolve uma queda/bug crítico de prod
|
|
|
4
4
|
version: core
|
|
5
5
|
when-to-invoke: ao receber "/morph-hotfix {feature}", quando a morph-proposal classifica o pedido como workType hotfix (Passo 0), ou o usuário diz "produção caiu / hotfix / urgente"
|
|
6
6
|
user-invokable: true
|
|
7
|
-
cliVersion: "8.
|
|
7
|
+
cliVersion: "8.45.0"
|
|
8
8
|
---
|
|
9
9
|
|
|
10
10
|
# morph-hotfix
|
|
@@ -45,6 +45,8 @@ subagent_type: "morph-scout"
|
|
|
45
45
|
|
|
46
46
|
Peça ao scout: localizar o root cause provável, os arquivos afetados e o blast radius (o que mais pode quebrar). Ele é read-only (Read/Glob/Grep/Bash somente-leitura) — não escreve código. Inclua as 8 cláusulas do contrato do relatório final no prompt (template literal em `morph-implement` §4 / `morph-apply` §3b): relatório no arquivo canônico como retorno, sem `SendMessage`; não tocar `tasks.json`/`feature.json`/`state.json` nem o board de sessão; sem build/test da suíte compartilhada em batch paralelo; no máximo 3 tasks por dispatch; commit `wip({taskId})` ao fim de cada task; nunca `taskkill /IM node.exe`; nunca mutar código de produção para ver teste falhar.
|
|
47
47
|
|
|
48
|
+
**Audite o mapa antes do brief.** Grave a resposta do scout em `.morph/features/{feature}/2-plan/scout-map.md` e rode `morph-spec scout-check .morph/features/{feature}/2-plan/scout-map.md --json`. Exit ≠ 0 → descarte o mapa e re-despache o scout **uma** vez com as `failures` no prompt (o mapa novo abre com o motivo); na segunda reprovação, faça você o grep do root cause e siga. Root cause e blast radius que entram no brief se conferem com grep próprio mesmo com o mapa aprovado: sob pressão de hotfix, citação inventada vira um segundo incidente.
|
|
49
|
+
|
|
48
50
|
### 3. Hotfix brief (`0-proposal/proposal.md`)
|
|
49
51
|
|
|
50
52
|
Escreva o brief curto (~20 linhas) reutilizando o nome canônico `proposal.md`:
|
|
@@ -61,13 +63,13 @@ Escreva um `tasks.json` mínimo validado contra `.morph/framework/schemas/tasks.
|
|
|
61
63
|
- `T1` — o fix.
|
|
62
64
|
- `T2` — verify/regressão do blast radius.
|
|
63
65
|
|
|
64
|
-
Isso liga trace
|
|
66
|
+
Isso liga trace e dag de graça (o hook `trace-autogen` gera o trace a partir do primeiro write de `tasks.json`) — não pule esta escrita mesmo sob pressão de tempo.
|
|
65
67
|
|
|
66
68
|
### 5. Fix cirúrgico
|
|
67
69
|
|
|
68
70
|
Implemente a mudança mínima — inline se estiver no domínio já carregado, ou despachando a persona de domínio via `subagent_type: "morph-{id}"` conforme `MORPH.md` §6 se a task cruzar domínio ou tiver esforço L/XL. Prioridade: tirar a falha do ar, não refatorar — melhorias de forma (não de correção) vão para o roadmap-fora-hotfix, não para este diff.
|
|
69
71
|
|
|
70
|
-
|
|
72
|
+
A task fecha com o `verify` verde e o sintoma reproduzido antes e ausente depois — o objetivo do hotfix é parar a sangria com o menor blast radius, não elegância de arquitetura.
|
|
71
73
|
|
|
72
74
|
### 6. Test loop no blast radius
|
|
73
75
|
|