@polymorphism-tech/morph-spec 7.9.4 → 8.1.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 +2 -2
- package/README.md +31 -2
- package/bin/morph-spec.js +50 -2
- package/bin/validate.js +379 -379
- package/claude-plugin.json +1 -1
- package/docs/CHEATSHEET.md +38 -1
- package/docs/QUICKSTART.md +60 -1
- package/framework/CLAUDE.md +14 -3
- package/framework/MORPH.md +41 -5
- package/framework/agents.json +22 -3
- package/framework/commands/commit.md +166 -166
- package/framework/commands/morph-hotfix.md +39 -0
- package/framework/commands/morph-infra.md +215 -215
- package/framework/commands/morph-preflight.md +205 -205
- package/framework/commands/morph-troubleshoot.md +124 -124
- package/framework/hooks/README.md +25 -11
- package/framework/hooks/claude-code/core/gate-guard.js +4 -2
- package/framework/hooks/claude-code/core/loop-detect.js +2 -1
- package/framework/hooks/claude-code/core/post-edit-typecheck.js +14 -5
- package/framework/hooks/claude-code/core/tasks-json-guard.js +4 -2
- package/framework/hooks/claude-code/core/validate-completion.js +1 -1
- package/framework/hooks/claude-code/core/worktree-context.js +160 -0
- package/framework/hooks/claude-code/statusline.py +679 -679
- 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/activity-logger.js +160 -160
- package/framework/hooks/shared/build-check.js +2 -2
- package/framework/hooks/shared/hook-response.js +17 -5
- package/framework/hooks/shared/payload-utils.js +42 -0
- package/framework/hooks/shared/state-reader.js +22 -2
- package/framework/hooks/shared/stdin-reader.js +26 -26
- package/framework/rubrics/backend.json +41 -41
- package/framework/rules/ai-agents-standards.md +45 -45
- package/framework/rules/dotnet-templates.md +86 -86
- package/framework/rules/frontend-standards.md +13 -13
- package/framework/rules/infrastructure-standards.md +27 -27
- package/framework/rules/neon-standards.md +25 -25
- package/framework/rules/nextjs-standards.md +20 -20
- package/framework/rules/nextjs-templates.md +40 -40
- package/framework/schemas/feature.schema.json +95 -1
- 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 +49 -27
- package/framework/skills/core/morph-brainstorming/SKILL.md +9 -1
- package/framework/skills/core/morph-eval/SKILL.md +6 -1
- package/framework/skills/core/morph-hotfix/SKILL.md +134 -0
- package/framework/skills/core/morph-implement/SKILL.md +17 -22
- package/framework/skills/core/morph-plan/SKILL.md +5 -1
- package/framework/skills/core/morph-proposal/SKILL.md +24 -1
- package/framework/skills/core/morph-review/SKILL.md +13 -16
- package/framework/skills/core/morph-stack-scan/SKILL.md +1 -1
- package/framework/skills/core/morph-standards/SKILL.md +1 -1
- package/framework/standards/ai-agents/agent-session.md +160 -160
- package/framework/standards/ai-agents/batching.md +193 -193
- package/framework/standards/ai-agents/context-providers.md +188 -188
- package/framework/standards/ai-agents/mcp-server.md +250 -250
- package/framework/standards/ai-agents/mcp-tools.md +197 -197
- package/framework/standards/ai-agents/middleware-patterns.md +207 -207
- package/framework/standards/ai-agents/modalities-image-gen.md +173 -173
- package/framework/standards/ai-agents/modalities-speech-to-text.md +171 -171
- package/framework/standards/ai-agents/modalities-text-to-speech.md +181 -181
- package/framework/standards/ai-agents/modalities-vision.md +201 -201
- package/framework/standards/ai-agents/multi-agent-patterns.md +155 -155
- package/framework/standards/ai-agents/production.md +275 -275
- package/framework/standards/ai-agents/prompts-in-db.md +214 -214
- package/framework/standards/ai-agents/providers/model-registry.md +158 -158
- package/framework/standards/ai-agents/service-tier-flex.md +135 -135
- package/framework/standards/ai-agents/structured-output.md +249 -249
- package/framework/standards/ai-agents/sweet-spot.md +109 -109
- package/framework/templates/.idea/morph-templates.xml +92 -0
- package/framework/templates/.vscode/morph-templates.code-snippets +186 -0
- package/framework/templates/IDE-SNIPPETS.md +262 -262
- package/framework/templates/REGISTRY.json +0 -62
- package/framework/templates/code/dotnet/abstractions/api-endpoint.cs +7 -7
- package/framework/templates/code/dotnet/ai-agents/AgentBootstrap.cs.template +39 -39
- package/framework/templates/code/dotnet/ai-agents/EmbeddingService.cs.template +68 -68
- package/framework/templates/code/dotnet/ai-agents/ModelRegistry.cs.template +117 -117
- package/framework/templates/code/dotnet/ai-agents/PromptRepository.cs.template +95 -95
- package/framework/templates/code/dotnet/ai-agents/ResilientToolMiddleware.cs.template +61 -61
- package/framework/templates/code/dotnet/ai-agents/VectorSearchTool.cs.template +107 -107
- package/framework/templates/code/dotnet/ai-agents/model-registry.json.template +58 -58
- package/framework/templates/code/dotnet/contracts/contracts-vsa.cs +281 -281
- package/framework/templates/code/dotnet/database/migration.cs +83 -83
- 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/dotnet/feature/validator.cs.hbs +15 -15
- package/framework/templates/code/sql/ai-agents/agent-prompts-migration.sql.template +58 -58
- package/framework/templates/code/sql/ai-agents/pgvector-embeddings-migration.sql.template +91 -91
- package/framework/templates/code/typescript/contracts.ts +167 -167
- package/framework/templates/docs/clarifications.md +253 -253
- package/framework/templates/docs/schema-analysis.md +119 -119
- 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/docs/ui-mockups.md +98 -98
- package/framework/templates/feature/decisions.md +122 -122
- package/framework/templates/frontend/nextjs/Dockerfile.nextjs.hbs +43 -43
- package/framework/templates/frontend/nextjs/client-component.tsx.hbs +26 -26
- package/framework/templates/frontend/nextjs/env.mjs.hbs +32 -32
- package/framework/templates/frontend/nextjs/feature-form.tsx.hbs +56 -56
- package/framework/templates/frontend/nextjs/page.tsx.hbs +22 -22
- package/framework/templates/frontend/nextjs/tsconfig.json.hbs +26 -26
- package/framework/templates/frontend/nextjs/use-feature.ts.hbs +54 -54
- package/framework/templates/infrastructure/docker/Dockerfile.template +58 -58
- package/framework/templates/infrastructure/docker/docker-compose.template.yml +50 -50
- 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/integrations/asaas-client.cs +387 -387
- package/framework/templates/integrations/asaas-webhook.cs +351 -351
- 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/project/validate.js +120 -120
- package/framework/templates/state.template.json +17 -17
- package/framework/templates/ui/design-system.css +226 -226
- package/package.json +1 -1
- package/src/commands/dashboard/dashboard.js +53 -53
- package/src/commands/index.js +13 -13
- package/src/commands/mcp/mcp-setup.js +519 -519
- package/src/commands/project/checkpoint.js +209 -209
- package/src/commands/project/doctor.js +4 -2
- package/src/commands/project/init.js +46 -2
- package/src/commands/project/update.js +5 -3
- package/src/commands/project/worktree.js +1005 -46
- package/src/commands/state/advance.js +17 -2
- package/src/commands/state/approve.js +18 -1
- package/src/commands/state/create.js +158 -14
- package/src/commands/state/retype.js +126 -0
- package/src/commands/state/score.js +4 -0
- package/src/commands/tasks/dag.js +32 -0
- package/src/commands/validation/index.js +1 -0
- package/src/commands/validation/validate-feature.js +33 -5
- package/src/commands/validation/verify.js +190 -0
- package/src/core/state/phase-state-machine.js +197 -197
- package/src/core/state/state-manager.js +35 -10
- package/src/core/templates/template-renderer.js +477 -477
- package/src/core/work-types.js +79 -0
- package/src/dashboard/app/components/DetailPanel.jsx +11 -11
- package/src/dashboard/app/components/FlowGraph.jsx +17 -17
- package/src/dashboard/app/components/SearchFilter.jsx +22 -22
- package/src/dashboard/app/hooks/useDetailPanel.js +15 -15
- package/src/dashboard/app/main.jsx +13 -13
- package/src/dashboard/app/pages/AgentMap.jsx +370 -370
- package/src/dashboard/app/pages/HookInspector.jsx +418 -418
- package/src/dashboard/app/pages/LiveState.jsx +11 -1
- package/src/dashboard/app/pages/PhasePipeline.jsx +408 -408
- package/src/dashboard/app/pages/RulesMap.jsx +273 -273
- package/src/dashboard/app/pages/SkillsLibrary.jsx +366 -366
- package/src/dashboard/app/pages/Standards.jsx +332 -332
- package/src/dashboard/app/styles/index.css +47 -47
- package/src/dashboard/index.html +12 -12
- package/src/dashboard/package.json +24 -24
- package/src/dashboard/scanner/hooks-scanner.js +41 -41
- package/src/dashboard/scanner/phases-scanner.js +15 -15
- package/src/dashboard/scanner/rubrics-scanner.js +12 -12
- package/src/dashboard/scanner/rules-scanner.js +37 -37
- package/src/dashboard/scanner/skills-scanner.js +43 -43
- package/src/dashboard/scanner/squads-scanner.js +13 -13
- package/src/dashboard/scanner/standards-scanner.js +26 -26
- package/src/dashboard/scanner/state-scanner.js +42 -0
- package/src/dashboard/vite-plugin-morph-data.js +17 -17
- package/src/dashboard/vite.config.js +24 -24
- package/src/lib/agents/metrics-aggregator.js +56 -56
- package/src/lib/agents/metrics-calculator.js +125 -125
- package/src/lib/agents/output-collector.js +73 -73
- package/src/lib/detectors/claude-config-detector.js +152 -152
- package/src/lib/detectors/design-system-detector.js +231 -231
- package/src/lib/detectors/index.js +217 -217
- package/src/lib/generators/architecture-scanner.js +639 -639
- package/src/lib/generators/design-system-generator.js +508 -508
- package/src/lib/generators/index.js +13 -13
- package/src/lib/generators/settings-generator.js +209 -209
- package/src/lib/hooks/hook-executor.js +167 -167
- package/src/lib/installers/mcp-installer.js +719 -719
- package/src/lib/installers/memory-installer.js +1 -1
- package/src/lib/risk-detector.js +16 -0
- package/src/lib/tasks/dispatch-planner.js +122 -4
- package/src/lib/tasks/mermaid-renderer.js +132 -0
- package/src/lib/tasks/task-classifier.js +30 -30
- package/src/lib/tasks/task-parser.js +209 -209
- package/src/lib/tasks/test-runner.js +27 -6
- package/src/lib/validators/architecture/architecture-validator.js +259 -259
- package/src/lib/validators/checkpoint-persistence.js +39 -39
- package/src/lib/validators/contracts/contract-compliance-validator.js +274 -274
- package/src/lib/validators/css/css-validator.js +340 -340
- package/src/lib/validators/packages/package-validator.js +347 -347
- package/src/lib/validators/shared/emit-validator-dispatch.js +14 -14
- package/src/lib/validators/shared/issue-counter.js +14 -14
- package/src/lib/validators/validation-runner.js +349 -349
- package/src/lib/validators/verify-runner.js +322 -0
- package/src/lib/work-type-detector.js +143 -0
- package/src/scripts/setup-infra.js +32 -5
- package/src/utils/agent-id-mapper.js +11 -11
- package/src/utils/agents-installer.js +10 -6
- package/src/utils/claude-settings-manager.js +300 -300
- package/src/utils/file-copier.js +43 -0
- package/src/utils/hooks-installer.js +43 -34
- package/src/utils/skills-installer.js +174 -174
- package/framework/hooks/claude-code/core/subagent-report-guard.js +0 -95
- package/framework/templates/meta-prompts/parallel-workers/parallel-coordinator.md +0 -113
- package/framework/templates/meta-prompts/parallel-workers/parallel-worker.md +0 -80
- package/src/lib/tasks/wave-resolver.js +0 -353
|
@@ -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: "
|
|
7
|
+
cliVersion: "8.1.0"
|
|
8
8
|
---
|
|
9
9
|
|
|
10
10
|
# create-umbraco-lp
|
|
@@ -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: "
|
|
7
|
+
cliVersion: "8.1.0"
|
|
8
8
|
---
|
|
9
9
|
|
|
10
10
|
# migrate-lp-to-umbraco
|
|
@@ -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: "
|
|
7
|
+
cliVersion: "8.1.0"
|
|
8
8
|
---
|
|
9
9
|
|
|
10
10
|
# morph-apply
|
|
@@ -50,6 +50,8 @@ O comando analisa `dependencies`, `group` e `effort` das tasks pendentes e impri
|
|
|
50
50
|
3. **Raízes independentes (fan-out na largura).** Tasks 100% independentes (`dependencies: []`). **≥ 3 raízes com effort M ou maior** → dispachar essas raízes em **paralelo**, depois cair em sequencial para o resto.
|
|
51
51
|
4. Caso contrário: **sequencial puro** com auto-advance.
|
|
52
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
|
+
|
|
53
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.
|
|
54
56
|
|
|
55
57
|
> **DAG × gatilho de effort — decisões ortogonais que coexistem:** a decisão deste comando governa o **paralelismo ENTRE tasks** (quantos sub-agents ao mesmo tempo: fluxos/raízes independentes em batch). O gatilho de effort/domínio de `morph-implement` §4 governa o **dispatch INDIVIDUAL** de cada task quando ela chega ao topo do loop sequencial. `DAG: sequencial` significa "uma task por vez, na ordem" — **NÃO significa "tudo inline"**. Exemplo: cadeia única backend de 12 tasks → o DAG decide sequencial; T7 tem effort L → ao chegar em T7, o orquestrador a despacha **sozinha** para `morph-dotnet-senior` e aguarda o retorno (um agente por vez); T8 (S, mesmo domínio já carregado) roda inline. As duas regras nunca conflitam: o DAG decide *quantos ao mesmo tempo*, o gatilho de effort decide *quem executa cada task*.
|
|
@@ -79,7 +81,16 @@ while (true):
|
|
|
79
81
|
while attempt < 3:
|
|
80
82
|
attempt += 1
|
|
81
83
|
invoke Skill(morph-implement) with task
|
|
82
|
-
(no attempt > 1: passar o feedback priorizado
|
|
84
|
+
(no attempt > 1: passar o feedback priorizado da tentativa anterior como input)
|
|
85
|
+
|
|
86
|
+
// CÓDIGO ANTES DO JUIZ — barreira determinística e barata (build+testes+validadores).
|
|
87
|
+
run: morph-spec verify {feature} {task.id} --json
|
|
88
|
+
if verify.status == 'fail':
|
|
89
|
+
// vermelho: feedback determinístico direto ao loop, SEM gastar o juiz LLM.
|
|
90
|
+
feedback = verify.feedback // usado como input do próximo attempt
|
|
91
|
+
continue // conta como tentativa; não invoca morph-eval sobre código que não builda/não passa
|
|
92
|
+
|
|
93
|
+
// verde: o juiz avalia só o que o código não pega (arquitetura, contratos, qualidade).
|
|
83
94
|
result = invoke Skill(morph-eval) with implementation output
|
|
84
95
|
if result.score > best.score: best = result
|
|
85
96
|
// Persista o score no feature.json autoritativo — torna o evalScore um signal
|
|
@@ -102,6 +113,8 @@ while (true):
|
|
|
102
113
|
options: [aceitar (marca done com ressalva no recap), continuar tentando (+3 tentativas), pular task (marca blocked)]
|
|
103
114
|
```
|
|
104
115
|
|
|
116
|
+
> **Verify vermelho consome uma tentativa** do loop (≤3) e devolve `feedback[]` acionável (erros de build, falhas de teste, 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.
|
|
117
|
+
|
|
105
118
|
> **Por que loop e não pausa:** MORPH.md §0 manda auto-avançar entre tasks. Score baixo numa task individual é um problema de qualidade que o modelo deve **corrigir sozinho**, não delegar ao humano no meio da implementação. A pausa só existe quando o loop de correção se esgota (3 tentativas) — o "escape" do modelo autônomo. O trust mode não muda esse loop: ele governa os **gates** (proposal/plan/review), não o ciclo de correção intra-task.
|
|
106
119
|
|
|
107
120
|
### 3b. Modo Paralelo (para o subset independente)
|
|
@@ -121,41 +134,37 @@ dispatch Agent (subagent_type: "morph-{id}") with prompt:
|
|
|
121
134
|
Implemente esta task (ou cadeia de tasks do fluxo) isoladamente.
|
|
122
135
|
Não modifique spec.md, mandate.md.
|
|
123
136
|
|
|
124
|
-
|
|
125
|
-
1. ATO FINAL
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
confirmação" — o SendMessage É o encerramento, não um passo
|
|
131
|
-
intermediário.
|
|
132
|
-
Exemplo literal (última chamada de tool da sua sessão, sem nada depois):
|
|
133
|
-
SendMessage({ to: "main", content: "Fluxo backend concluído (T2→T7).
|
|
134
|
-
Sumário: ... Arquivos: src/... Standards: vsa-handler-patterns.
|
|
135
|
-
Auto-score: 9/10" })
|
|
136
|
-
Terminar idle sem SendMessage, ou continuar agindo depois dele, é
|
|
137
|
-
falha de protocolo — cada segundo entre o SendMessage e o fim real do
|
|
138
|
-
turno é cauda que o orquestrador espera sem necessidade.
|
|
137
|
+
Contrato do relatório final:
|
|
138
|
+
1. ATO FINAL — o seu relatório é a sua ÚLTIMA MENSAGEM DE TEXTO: ela é o
|
|
139
|
+
valor de retorno desta sessão e chega inteira ao orquestrador. NÃO chame
|
|
140
|
+
SendMessage: ele gera um evento a mais além da notificação de término,
|
|
141
|
+
custando um turno inútil ao orquestrador. Escreva o relatório e encerre.
|
|
142
|
+
Relatório oco, ou sem os itens abaixo, é falha de protocolo.
|
|
139
143
|
2. NÃO toque em tasks.json, feature.json, state.json nem no board de sessão
|
|
140
144
|
(TaskCreate/TaskUpdate) — todo estado (status de task, scores, gates) é
|
|
141
145
|
gravado exclusivamente pelo orquestrador.
|
|
142
|
-
3.
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
146
|
+
3. Verificação condicional ao isolamento:
|
|
147
|
+
- Batch SEM isolamento (working tree compartilhada): NÃO rode build/test da
|
|
148
|
+
suíte compartilhada — edições concorrentes quebram o build umas das outras;
|
|
149
|
+
a verificação é do orquestrador, uma vez, pós-batch (`morph-spec verify`).
|
|
150
|
+
- Batch COM isolamento (você recebeu `isolation: "worktree"`): rode build/test
|
|
151
|
+
DENTRO do seu worktree; commite seu trabalho na branch do worktree como
|
|
152
|
+
último ato antes do relatório; reporte a branch + status de build no
|
|
153
|
+
relatório; NUNCA faça merge nem toque na árvore principal.
|
|
154
|
+
|
|
155
|
+
Seu relatório final deve conter:
|
|
147
156
|
- sumário das mudanças
|
|
148
157
|
- arquivos modificados (paths)
|
|
149
158
|
- standard(s) consultado(s)
|
|
150
159
|
- auto-score 0-10 (rubric: completeness, correctness, mandate compliance)
|
|
151
160
|
```
|
|
152
161
|
|
|
153
|
-
> 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 cláusulas
|
|
162
|
+
> 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 cláusulas do contrato do relatório final. A única diferença é que aqui múltiplos agentes rodam ao mesmo tempo, um por fluxo independente.
|
|
154
163
|
|
|
155
|
-
> **Alternativa quando os fluxos tocam os mesmos projetos/arquivos** (ex.: o mesmo csproj de testes compartilhado): despache com `isolation: "worktree"
|
|
164
|
+
> **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.
|
|
156
165
|
|
|
157
|
-
Aguardar todos os agentes terminarem
|
|
158
|
-
- **Rodar
|
|
166
|
+
Aguardar todos os agentes terminarem — o relatório de cada um chega como o resultado do seu dispatch. Se um relatório vier oco ou sem os itens da cláusula 1, registre a falha de protocolo no recap. Depois, sequencialmente:
|
|
167
|
+
- **Rodar `morph-spec verify {feature} --json` uma única vez, pós-batch** (escopo feature) — 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.)
|
|
159
168
|
- Para cada relatório retornado:
|
|
160
169
|
- Aplicar `Skill(morph-eval)`.
|
|
161
170
|
- Gravar o score: `morph-spec score {feature} {taskId} {score} --dims {a},{c},{q},{t}`.
|
|
@@ -164,6 +173,18 @@ Aguardar todos os agentes terminarem. O hook `subagent-report-guard` (Stop/Subag
|
|
|
164
173
|
|
|
165
174
|
Depois do batch paralelo, executar o restante em modo sequencial (passo 3a).
|
|
166
175
|
|
|
176
|
+
### 3b-w. Batch isolado por worktree (quando o dag recomenda)
|
|
177
|
+
|
|
178
|
+
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.
|
|
179
|
+
|
|
180
|
+
1. **Dispatch:** mesmo `subagent_type: "morph-{id}"` e standards de §3b, mais `isolation: "worktree"`. Se a stack for Node e faltar `node_modules` no worktree, o agente roda `morph-spec worktree link` (fail-open) antes de testar; se ainda impossível, reporta "verificação: não executada" (o verify pós-merge cobre). O agente commita na branch do worktree e reporta a branch.
|
|
181
|
+
2. **Integração (orquestrador, após todos os relatórios):** faça o merge de cada branch reportada, uma por vez, na ordem de chegada — `git merge --no-ff <branch>`. Conflito → `git merge --abort`, marque a task de volta a `pending` com nota "merge conflict — reexecutar sequencial", siga para a próxima branch. Os paths em conflito são exatamente os de `isolation.collisions` do dag.
|
|
182
|
+
3. **Pós-merge:** rode `morph-spec verify {feature} --json` UMA vez (o merge é o novo ponto de integração — verificação compartilhada obrigatória), depois `morph-eval` + `morph-spec score` por relatório, como em §3b.
|
|
183
|
+
4. **Cleanup:** `git worktree remove` + `git branch -d` das branches integradas + `git worktree prune` (fail-open). Branches não integradas ficam e são registradas no recap com o motivo.
|
|
184
|
+
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.
|
|
185
|
+
|
|
186
|
+
> Anti-padrões: não misture unidades isoladas e não-isoladas no mesmo batch; o subagent nunca faz merge (integração é exclusiva do orquestrador).
|
|
187
|
+
|
|
167
188
|
### 4. Conclusão de tasks
|
|
168
189
|
|
|
169
190
|
Quando `getPendingTasks(data).length === 0`:
|
|
@@ -222,7 +243,8 @@ O comando grava `gateDecisions.review = { pause, reason, signals, trust, decided
|
|
|
222
243
|
- `framework/skills/core/morph-implement/SKILL.md`
|
|
223
244
|
- `framework/skills/core/morph-eval/SKILL.md`
|
|
224
245
|
- `framework/skills/core/morph-review/SKILL.md`
|
|
225
|
-
- `morph-spec dag {feature}` — análise de DAG e decisão sequencial vs paralelo (ponderada por effort)
|
|
246
|
+
- `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"`)
|
|
247
|
+
- `morph-spec verify {feature} [task] --json` — cadeia determinística build+testes+validadores (código antes do juiz)
|
|
226
248
|
- `morph-spec score {feature} {task} {score} [--dims a,c,q,t]` — grava taskScores no feature.json com timestamp server-side
|
|
227
249
|
- `morph-spec gate-decision {feature} {gate} --pause {bool} [--reason ...] [--signals ...]` — grava gateDecisions no feature.json com timestamp server-side (shape em `.morph/framework/schemas/feature.schema.json`)
|
|
228
250
|
- `.morph/framework/MORPH.md` §5 — regras de pausa de gate (trust mode)
|
|
@@ -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: "
|
|
7
|
+
cliVersion: "8.1.0"
|
|
8
8
|
---
|
|
9
9
|
|
|
10
10
|
# morph-brainstorming
|
|
@@ -29,6 +29,12 @@ O harness conhece o stack por padrão. Não pergunte sobre tecnologia a menos qu
|
|
|
29
29
|
|
|
30
30
|
**Padrões proibidos:** `Guid.NewGuid()`, classes não-sealed sem justificativa, exceptions sem result pattern, camada de Service/Manager entre handler e dados, repository genérico (`IRepository<T>`/`IUnitOfWork`), SQL cru sem justificativa. Acesso a dados em VSA: `ApplicationDbContext` direto no slice (`DbSet<T>` já é repository, `DbContext` já é unit of work); para concorrência ou SQL específico, store dedicado hand-written com justificativa em `decisions.md`.
|
|
31
31
|
|
|
32
|
+
## Modo bug-lean (`workType: bug`)
|
|
33
|
+
|
|
34
|
+
Quando a feature tem `workType: bug` (roteada pela `morph-proposal` — ver MORPH.md §2.1 "Roteamento por tipo de trabalho"), o brainstorming é enxuto: pule as 4 perguntas de negócio da Parte 1 e faça **no máximo 1 pergunta de repro** via `AskUserQuestion` (como reproduzir, em qual ambiente) — só se isso não estiver claro no pedido original. O `stack-scan` (Parte 2) continua rodando normalmente, o diagnóstico precisa do contexto técnico. O `proposal.md` (Parte 3) foca em **Repro / Diagnóstico / Root cause provável / Escopo do fix / Critérios de aceite**, sem as perguntas de negócio completas.
|
|
35
|
+
|
|
36
|
+
Para `workType: feature` (ou features sem `workType` — compat, ver MORPH.md §2.1), o fluxo completo abaixo permanece integral.
|
|
37
|
+
|
|
32
38
|
## O que fazer
|
|
33
39
|
|
|
34
40
|
### Parte 1 — Entendimento de negócio
|
|
@@ -71,6 +77,8 @@ O harness conhece o stack por padrão. Não pergunte sobre tecnologia a menos qu
|
|
|
71
77
|
- **Riscos e dependências:** o que pode dar errado, o que esta feature depende
|
|
72
78
|
- **Compliance de stack:** "Em compliance" ou lista de desvios detectados e plano de resolução
|
|
73
79
|
|
|
80
|
+
**Se `workType: bug`** (modo bug-lean, ver nota no início da skill), substitua a lista acima pela estrutura enxuta: **Repro** (passos para reproduzir), **Diagnóstico** (o que foi observado/investigado), **Root cause provável**, **Escopo do fix** (o que muda, o que fica de fora) e **Critérios de aceite** (condição verificável de que o bug foi corrigido) — sem as seções de negócio completas do fluxo `feature`.
|
|
81
|
+
|
|
74
82
|
Um bom proposal.md tem no máximo 2 páginas. Se está crescendo além disso, o escopo precisa ser cortado.
|
|
75
83
|
|
|
76
84
|
5. Apresente o Gate 1 segundo trust mode.
|
|
@@ -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: "
|
|
7
|
+
cliVersion: "8.1.0"
|
|
8
8
|
---
|
|
9
9
|
|
|
10
10
|
# morph-eval
|
|
@@ -17,10 +17,14 @@ O objetivo não é punir — é identificar o que melhorar antes de seguir adian
|
|
|
17
17
|
Após concluir uma tarefa ou ao finalizar a fase de implementação.
|
|
18
18
|
Também invocado ao receber o retorno de um sub-agent com auto-score < 7.
|
|
19
19
|
|
|
20
|
+
**Somente após `morph-spec verify {feature} {task}` verde** (a `morph-apply` garante isso no loop §3a). O verify é a barreira determinística (build+testes+validadores); esta skill julga o que o código não pega: arquitetura, contratos, qualidade, cobertura qualitativa.
|
|
21
|
+
|
|
20
22
|
> **Escopo de fase (Gate 3):** a avaliação da feature inteira NÃO é feita por quem implementou — a `morph-review` despacha a persona `evaluator` de `agents.json` (contexto fresco, sem autoria; recebe mandate + diff + saída real dos testes) usando esta skill como guia. O eval por task pode ser inline; o score composto do Gate 3 vem sempre do avaliador independente.
|
|
21
23
|
|
|
22
24
|
## O que fazer
|
|
23
25
|
|
|
26
|
+
0. Confirme que o `morph-spec verify` da task está verde (a morph-apply passa o resultado; numa invocação manual, rode `morph-spec verify {feature} {task} --json`). Se estiver vermelho, NÃO avalie — devolva o `feedback[]` do verify ao loop de correção.
|
|
27
|
+
|
|
24
28
|
1. Identifique o escopo da avaliação: tarefa única ou fase completa.
|
|
25
29
|
|
|
26
30
|
2. Para cada dimensão, leia a rubrica correspondente em `.morph/framework/evals/rubrics/`:
|
|
@@ -48,6 +52,7 @@ Também invocado ao receber o retorno de um sub-agent com auto-score < 7.
|
|
|
48
52
|
- Score persistido em `taskScores` via `morph-spec score` (o trace é gerado automaticamente pelo hook `trace-autogen`)
|
|
49
53
|
|
|
50
54
|
## Referências
|
|
55
|
+
- `morph-spec verify {feature} [task] --json` — barreira determinística (build+testes+validadores) que precede esta skill
|
|
51
56
|
- `.morph/framework/evals/rubrics/architecture.md` — rubrica de arquitetura (30%)
|
|
52
57
|
- `.morph/framework/evals/rubrics/contracts.md` — rubrica de contratos (25%)
|
|
53
58
|
- `.morph/framework/evals/rubrics/code-quality.md` — rubrica de qualidade (25%)
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: morph-hotfix
|
|
3
|
+
description: ADW cirúrgico de hotfix — resolve uma queda/bug crítico de produção com prioridade máxima em velocidade, com aprovação humana obrigatória antes do ship.
|
|
4
|
+
version: core
|
|
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
|
+
user-invokable: true
|
|
7
|
+
cliVersion: "8.1.0"
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# morph-hotfix
|
|
11
|
+
|
|
12
|
+
## Objetivo
|
|
13
|
+
|
|
14
|
+
Resolver uma queda ou bug crítico de produção o mais rápido possível — prioridade é velocidade, não elegância — mantendo aprovação humana obrigatória antes do ship. É o pipeline dimensionado por `workType: hotfix` (MORPH.md §2.1): scout → fix cirúrgico → aprovação humana → test loop → ship.
|
|
15
|
+
|
|
16
|
+
## Quando invocar
|
|
17
|
+
|
|
18
|
+
- Usuário roda `/morph-hotfix {feature}` diretamente.
|
|
19
|
+
- `Skill(morph-proposal)` classifica o pedido como `hotfix` no Passo 0 de roteamento e invoca esta skill.
|
|
20
|
+
- Usuário diz "produção caiu", "hotfix", "urgente", "incident", "P0" — sinais que o detector determinístico de `morph-spec create --request` já reconhece.
|
|
21
|
+
|
|
22
|
+
## Argumentos
|
|
23
|
+
|
|
24
|
+
- `{feature-name}` — nome em kebab-case da feature. Se ausente, perguntar via `AskUserQuestion`.
|
|
25
|
+
|
|
26
|
+
## Fluxo
|
|
27
|
+
|
|
28
|
+
### 1. Nascimento da feature
|
|
29
|
+
|
|
30
|
+
```
|
|
31
|
+
morph-spec create {feature} --type hotfix
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
Carimba os gates `proposal` e `plan` como `approvedBy: "policy:hotfix"` e cria as pastas `0-proposal/`, `2-plan/`, `3-implement/` num passo só — a feature já nasce em `implement` (fase derivada é gate-aware). Se a feature já existe, siga adiante sem recriar.
|
|
35
|
+
|
|
36
|
+
### 2. Scout — mapa do território (obrigatório)
|
|
37
|
+
|
|
38
|
+
Despache o scout com o sintoma reportado, antes de qualquer fix:
|
|
39
|
+
|
|
40
|
+
```
|
|
41
|
+
subagent_type: "morph-scout"
|
|
42
|
+
```
|
|
43
|
+
|
|
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
|
+
|
|
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 3 cláusulas do contrato do relatório final no prompt (template literal em `morph-implement` §4 / `morph-apply` §3b): ato final = o relatório é a última mensagem de texto, 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.
|
|
47
|
+
|
|
48
|
+
### 3. Hotfix brief (`0-proposal/proposal.md`)
|
|
49
|
+
|
|
50
|
+
Escreva o brief curto (~20 linhas) reutilizando o nome canônico `proposal.md`:
|
|
51
|
+
|
|
52
|
+
- **Sintoma** — o que está quebrado, em produção, agora.
|
|
53
|
+
- **Root cause** — o que o scout localizou.
|
|
54
|
+
- **Blast radius** — o que mais pode quebrar com o fix.
|
|
55
|
+
- **Plano do fix** — a mudança mínima que resolve o sintoma.
|
|
56
|
+
|
|
57
|
+
### 4. Plano mínimo (`2-plan/tasks.json`)
|
|
58
|
+
|
|
59
|
+
Escreva um `tasks.json` mínimo validado contra `framework/schemas/tasks.schema.json`:
|
|
60
|
+
|
|
61
|
+
- `T1` — o fix.
|
|
62
|
+
- `T2` — verify/regressão do blast radius.
|
|
63
|
+
|
|
64
|
+
Isso liga trace/score/dag de graça (o hook `trace-autogen` gera o trace a partir do primeiro write de `tasks.json`) — não pule esta escrita mesmo sob pressão de tempo.
|
|
65
|
+
|
|
66
|
+
### 5. Fix cirúrgico
|
|
67
|
+
|
|
68
|
+
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
|
+
|
|
70
|
+
Aplique `morph-eval` com foco em correção: pese `contracts.md` e `test-coverage.md` mais que `architecture.md` — o objetivo do hotfix é parar a sangria com o menor blast radius, não elegância de arquitetura.
|
|
71
|
+
|
|
72
|
+
### 6. Test loop no blast radius
|
|
73
|
+
|
|
74
|
+
Rode a cadeia determinística focada na(s) task(s) do fix, não uma suíte ad-hoc:
|
|
75
|
+
|
|
76
|
+
```
|
|
77
|
+
morph-spec verify {feature} {task} --json
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
Use `--skip-tests`/`--skip-build` quando fizer sentido para velocidade (ex.: iterar rápido no build antes de rodar a suíte completa), mas o `T2` de verify/regressão do passo 4 precisa fechar verde antes do Gate 3. Capture a saída real dos testes no `recap.md` — não descreva "testes passaram" sem colar a evidência.
|
|
81
|
+
|
|
82
|
+
### 7. Gate 3 — SEMPRE humano
|
|
83
|
+
|
|
84
|
+
O hotfix tem `forcedPauseGates: ['review']` (`src/core/work-types.js`) — o Gate 3 pausa **sempre**, mesmo em `trust: auto`. Persista a decisão antes de apresentar:
|
|
85
|
+
|
|
86
|
+
```
|
|
87
|
+
morph-spec gate-decision {feature} review --pause true --reason "hotfix: aprovação humana obrigatória" --signals '{"workType":"hotfix","evalScore":X}'
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
Escreva `4-review/review-report.md` curto: diff do fix + evidência real de teste (saída do `verify` do passo 6). Depois, **`AskUserQuestion` SEMPRE**:
|
|
91
|
+
|
|
92
|
+
```
|
|
93
|
+
question: "Gate 3 — Hotfix de {feature} pronto para ship?"
|
|
94
|
+
header: "Gate 3"
|
|
95
|
+
options:
|
|
96
|
+
- { label: "aprovado, ship", description: "Aceitar o fix e liberar para produção" }
|
|
97
|
+
- { label: "preciso ajustar", description: "Apontar correções antes de fechar" }
|
|
98
|
+
- { label: "rollback", description: "Desfazer o fix — voltar ao estado anterior" }
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
**NUNCA `morph-spec approve {feature} review --mode auto`** — o CLI recusa explicitamente essa combinação (`src/commands/state/approve.js`: `gateName === 'review' && feature.workType === 'hotfix' && approvedBy === 'auto'` é bloqueado) porque `forcedPauseGates` sobrepõe qualquer trust mode. Em contexto headless (sem `AskUserQuestion` disponível), a resposta textual "aprovado" do usuário é registrada pelo hook `state-sync` como `approvedBy: "manual"` — nunca `"auto"`.
|
|
102
|
+
|
|
103
|
+
### 8. Pós-gate (o "test loop → ship" de `MORPH.md` §2.1)
|
|
104
|
+
|
|
105
|
+
- Rode a suíte completa uma vez: `morph-spec verify {feature}` (sem escopo de task — cobertura da feature inteira, agora que o Gate 3 está aprovado).
|
|
106
|
+
- Sinalize ao usuário: commit do fix e `morph-spec archive {feature}` (ou `morph-spec worktree finish {feature}` se a feature nasceu em worktree — ver `MORPH.md` §2.2) estão prontos.
|
|
107
|
+
- Não arquive automaticamente — usuário decide quando.
|
|
108
|
+
|
|
109
|
+
## Anti-padrões
|
|
110
|
+
|
|
111
|
+
- Não pular o scout — mesmo sob pressão, o mapa de blast radius evita um segundo incidente causado pelo próprio fix.
|
|
112
|
+
- Não auto-aprovar o Gate 3 — nunca tente `morph-spec approve {feature} review --mode auto` num hotfix; o backstop server-side existe exatamente para isso.
|
|
113
|
+
- Não "fazer do jeito certo" às custas da velocidade — refatoração, cobertura extra, ou hardening que não bloqueia o sintoma atual vira item no roadmap-fora-hotfix, não neste diff.
|
|
114
|
+
- Não rodar suíte ad-hoc fora do `morph-spec verify` — a cadeia determinística é a única fonte de evidência aceita no review-report.
|
|
115
|
+
|
|
116
|
+
## Output esperado
|
|
117
|
+
|
|
118
|
+
- `.morph/features/{feature}/0-proposal/proposal.md` — hotfix brief (sintoma/root cause/blast radius/plano)
|
|
119
|
+
- `.morph/features/{feature}/2-plan/tasks.json` — T1 (fix) + T2 (verify/regressão)
|
|
120
|
+
- `.morph/features/{feature}/3-implement/recap.md` — evidência real de teste
|
|
121
|
+
- `.morph/features/{feature}/4-review/review-report.md` — diff + evidência, Gate 3 sempre humano
|
|
122
|
+
- Gates `proposal`/`plan` carimbados `approvedBy: "policy:hotfix"`; Gate 3 registrado `approvedBy: "manual"` em `feature.json` (autoritativo) — nunca `"auto"`
|
|
123
|
+
|
|
124
|
+
## Referências
|
|
125
|
+
|
|
126
|
+
- `.morph/framework/MORPH.md` §2.1 — roteamento por tipo de trabalho
|
|
127
|
+
- `.morph/framework/MORPH.md` §5 — Gates de aprovação, gate humano forçado no hotfix
|
|
128
|
+
- `.morph/framework/MORPH.md` §6 — Sub-agents, persona de estágio scout, protocolo obrigatório
|
|
129
|
+
- `framework/skills/core/morph-proposal/SKILL.md` — Passo 0, roteamento que invoca esta skill
|
|
130
|
+
- `framework/skills/core/morph-implement/SKILL.md` §4 — template de dispatch e protocolo
|
|
131
|
+
- `src/core/work-types.js` — `scaffold`/`skippedGates`/`forcedPauseGates` do tipo `hotfix`
|
|
132
|
+
- `morph-spec create {feature} --type hotfix` — nascimento com política de gates
|
|
133
|
+
- `morph-spec verify {feature} [task] --json` — cadeia determinística build+testes+validadores
|
|
134
|
+
- `morph-spec gate-decision {feature} review --pause true [--reason ...] [--signals ...]` — persiste a decisão de pausa antes do Gate 3
|
|
@@ -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: "
|
|
7
|
+
cliVersion: "8.1.0"
|
|
8
8
|
---
|
|
9
9
|
|
|
10
10
|
# morph-implement
|
|
@@ -58,32 +58,27 @@ Ao iniciar cada task de `tasks.json` — antes de escrever qualquer código. Nor
|
|
|
58
58
|
Arquivos relevantes: [lista de paths]
|
|
59
59
|
Done quando: [doneCriteria do tasks.json]
|
|
60
60
|
|
|
61
|
-
|
|
62
|
-
1. ATO FINAL
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
confirmação" — o SendMessage É o encerramento, não um passo
|
|
68
|
-
intermediário antes de um encerramento "de verdade".
|
|
69
|
-
Exemplo literal (última chamada de tool da sua sessão, sem nada depois):
|
|
70
|
-
SendMessage({ to: "main", content: "T{N} concluída. (1) O que foi feito:
|
|
71
|
-
handler + validator do slice X. (2) Arquivos: src/Features/X/Handler.cs,
|
|
72
|
-
tests/X/HandlerTests.cs. (3) Problemas: nenhum. (4) Auto-score: 9/10" })
|
|
73
|
-
Terminar idle sem SendMessage, ou continuar agindo depois dele, é
|
|
74
|
-
falha de protocolo — cada segundo entre o SendMessage e o fim real do
|
|
75
|
-
turno é cauda que o orquestrador espera sem necessidade.
|
|
61
|
+
Contrato do relatório final:
|
|
62
|
+
1. ATO FINAL — o seu relatório é a sua ÚLTIMA MENSAGEM DE TEXTO: ela é o
|
|
63
|
+
valor de retorno desta sessão e chega inteira ao orquestrador. NÃO chame
|
|
64
|
+
SendMessage: ele gera um evento a mais além da notificação de término,
|
|
65
|
+
custando um turno inútil ao orquestrador. Escreva o relatório e encerre.
|
|
66
|
+
Relatório oco, ou sem os 4 itens abaixo, é falha de protocolo.
|
|
76
67
|
2. NÃO toque em tasks.json, feature.json, state.json nem no board de sessão
|
|
77
68
|
(TaskCreate/TaskUpdate) — todo estado é gravado exclusivamente pelo
|
|
78
69
|
orquestrador.
|
|
79
|
-
3.
|
|
80
|
-
compartilhada — a verificação
|
|
81
|
-
|
|
82
|
-
|
|
70
|
+
3. Verificação condicional ao isolamento: em batch paralelo SEM isolamento,
|
|
71
|
+
NÃO rode build/test da suíte compartilhada — a verificação
|
|
72
|
+
(`morph-spec verify`) é do orquestrador, uma vez, pós-batch. Em batch
|
|
73
|
+
COM `isolation: "worktree"`, rode build/test dentro do seu worktree,
|
|
74
|
+
commite na branch do worktree como último ato antes do relatório
|
|
75
|
+
e reporte a branch — nunca faça merge.
|
|
76
|
+
|
|
77
|
+
Seu relatório final deve conter APENAS: (1) o que foi feito em 2-3 frases,
|
|
83
78
|
(2) arquivos modificados, (3) problemas encontrados e como foram resolvidos,
|
|
84
79
|
(4) auto-score 0-10.
|
|
85
80
|
```
|
|
86
|
-
Após receber o retorno: o auto-score é **triagem, não aprovação** — se < 7, re-despache com o feedback específico (ou corrija inline) antes de prosseguir. Em qualquer caso, a task só avança quando `morph-eval` der score ≥ 9 (barra única do MORPH.md §0).
|
|
81
|
+
Após receber o retorno: o auto-score é **triagem, não aprovação** — se < 7, re-despache com o feedback específico (ou corrija inline) antes de prosseguir. Em qualquer caso, a task só avança quando `morph-eval` der score ≥ 9 (barra única do MORPH.md §0). Integre o relatório ao recap.md e vá para o passo 7.
|
|
87
82
|
|
|
88
83
|
**Se não — siga para o passo 5.**
|
|
89
84
|
|
|
@@ -137,7 +132,7 @@ Ao iniciar cada task de `tasks.json` — antes de escrever qualquer código. Nor
|
|
|
137
132
|
> tasks.json + recap.md + `taskScores` do feature.json. **NÃO escreva o trace
|
|
138
133
|
> manualmente** — a escrita manual foi removida da cerimônia por task.
|
|
139
134
|
|
|
140
|
-
8. Quando invocada por `morph-apply`, retornar o controle à skill orquestradora — ela decide qual task vem em seguida via `getReadyTasks(data)`. 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.
|
|
135
|
+
8. 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). 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.
|
|
141
136
|
|
|
142
137
|
## Output esperado
|
|
143
138
|
- Código implementado conforme o standard consultado (direto ou via sub-agent)
|
|
@@ -4,7 +4,7 @@ description: Guia a produção dos três artefatos de planejamento de uma featur
|
|
|
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: "
|
|
7
|
+
cliVersion: "8.1.0"
|
|
8
8
|
---
|
|
9
9
|
|
|
10
10
|
# morph-plan
|
|
@@ -73,10 +73,14 @@ Ao iniciar a fase plan — após o `proposal.md` ser aprovado e antes de qualque
|
|
|
73
73
|
- `group` (opcional): backend, frontend, tests, infra, docs. Default backend.
|
|
74
74
|
- `outputs` (opcional): array de paths que serão criados/modificados.
|
|
75
75
|
|
|
76
|
+
**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).
|
|
77
|
+
|
|
76
78
|
Antes de retornar, valide rodando `morph-spec dag {feature}` — o comando parseia e valida o schema do tasks.json (ids únicos `T\d+`, enums de `status`/`effort`, `dependencies` válidas) e já imprime a análise de DAG que a `/morph-apply` vai usar. Erros de schema abortam com a lista do que corrigir.
|
|
77
79
|
|
|
78
80
|
5. Apresente o Gate 2 segundo trust mode.
|
|
79
81
|
|
|
82
|
+
Você pode embutir o diagrama do DAG do plano via `morph-spec dag {feature} --mermaid` (flowchart Mermaid) para visualização no gate.
|
|
83
|
+
|
|
80
84
|
Ler `.morph/config/config.json → trust` (default `"auto"`). Calcular os sinais de risco em linguagem natural — sem scripts:
|
|
81
85
|
|
|
82
86
|
- `taskCount` = número de tasks do tasks.json.
|
|
@@ -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: "
|
|
7
|
+
cliVersion: "8.1.0"
|
|
8
8
|
---
|
|
9
9
|
|
|
10
10
|
# morph-proposal
|
|
@@ -30,6 +30,26 @@ Conduzir uma feature do request inicial até o plano aprovado (Gate 2), sem inte
|
|
|
30
30
|
|
|
31
31
|
## Fluxo
|
|
32
32
|
|
|
33
|
+
### 0. Roteamento por tipo de trabalho
|
|
34
|
+
|
|
35
|
+
Antes de qualquer trabalho de negócio, classifique o pedido. Se `{feature-name}` ainda não foi determinado, pergunte via `AskUserQuestion` antes desta chamada (ver Argumentos):
|
|
36
|
+
|
|
37
|
+
```
|
|
38
|
+
morph-spec create {feature-name} --request "<pedido do usuário>"
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
(ou `--type <tipo>` diretamente quando o tipo é óbvio pelo pedido — ex.: o usuário já diz "isso é um hotfix").
|
|
42
|
+
|
|
43
|
+
- **Classificação `high` confidence** — a feature nasce com o `workType` decidido pelo detector determinístico (keywords: `hotfix` — "produção caiu/urgente/incident/p0"; `bug` — "bug/corrigir/exception/regressão"; `chore` — "typo/rename/bump/config/docs/cleanup"). Prossiga para o branch correspondente abaixo.
|
|
44
|
+
- **Exit 2** (empate `tie` ou nenhum sinal `none`) — o comando sai sem criar a feature e imprime `{ needsDecision, candidates, matched }`. **Você é o roteador**: decida o tipo entre os candidatos e re-rode com `morph-spec create {feature-name} --type <tipo>`. Só use `AskUserQuestion` para o usuário quando o pedido for genuinamente indeterminado — a maioria dos empates o roteador resolve sozinho pelo contexto da conversa.
|
|
45
|
+
|
|
46
|
+
**Branches por tipo** (dimensionamento completo em `MORPH.md` §2.1):
|
|
47
|
+
|
|
48
|
+
- **`hotfix`** → invoque `Skill(morph-hotfix)` passando `{feature-name}` e **ENCERRE** — não siga o restante deste fluxo. A skill cuida de scout, brief, fix cirúrgico, test loop e Gate 3 (sempre humano).
|
|
49
|
+
- **`chore`** → fast-track: os Gates 1 e 2 já nasceram carimbados `policy:chore` no `create`. Escreva um `2-plan/tasks.json` mínimo (1-3 tasks) e invoque `Skill(morph-apply)` diretamente — **exceção documentada** à regra do passo 7 ("não despachar `morph-apply` automaticamente"): não pausar numa mudança óbvia é exatamente o valor do fast-track.
|
|
50
|
+
- **`bug`** → siga para `Skill(morph-brainstorming)` em modo **bug-lean**: produz um `proposal.md` enxuto (repro / diagnóstico / root cause / escopo / critério de aceite — não a proposta completa de uma feature nova) e depois um plano enxuto via `Skill(morph-plan)`. Gates 1 e 2 continuam trust-aware (passos 3 e 6) — só o conteúdo dos artefatos é mais curto.
|
|
51
|
+
- **`feature`** (default — inclui features criadas antes do v8 sem `workType`) → siga o fluxo completo abaixo (passos 1-7): brainstorming → Gate 1 → plan → Gate 2.
|
|
52
|
+
|
|
33
53
|
### 1. Determinar feature name e estado
|
|
34
54
|
|
|
35
55
|
- Se argumento ausente: perguntar via `AskUserQuestion` (1 pergunta, header "Feature").
|
|
@@ -117,6 +137,7 @@ Lógica idêntica ao passo 3 (`shouldPauseGate` + AskUserQuestion ou auto-aprova
|
|
|
117
137
|
- Não pular o Gate 1 mesmo em trust:auto se houver divergência detectada.
|
|
118
138
|
- Não escrever código nesta fase — apenas artefatos de planejamento.
|
|
119
139
|
- Não perguntar sobre stack — o stack padrão está em MORPH.md / mandate.
|
|
140
|
+
- Não rodar o pipeline completo de 5 fases num `chore` ou `bug` óbvio — o Passo 0 existe para dimensionar o trabalho pelo `workType`, não para ser pulado "para simplificar".
|
|
120
141
|
|
|
121
142
|
## Output esperado
|
|
122
143
|
|
|
@@ -129,6 +150,8 @@ Lógica idêntica ao passo 3 (`shouldPauseGate` + AskUserQuestion ou auto-aprova
|
|
|
129
150
|
## Referências
|
|
130
151
|
|
|
131
152
|
- `.morph/framework/MORPH.md` — charter NLH completo
|
|
153
|
+
- `.morph/framework/MORPH.md` §2.1 — roteamento por tipo de trabalho (Passo 0)
|
|
132
154
|
- `framework/skills/core/morph-brainstorming/SKILL.md`
|
|
133
155
|
- `framework/skills/core/morph-plan/SKILL.md`
|
|
156
|
+
- `framework/skills/core/morph-hotfix/SKILL.md` — pipeline invocado pelo branch `hotfix` do Passo 0
|
|
134
157
|
- `.morph/framework/MORPH.md` §5 — regras de pausa de gate (trust mode)
|
|
@@ -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: "
|
|
7
|
+
cliVersion: "8.1.0"
|
|
8
8
|
---
|
|
9
9
|
|
|
10
10
|
# morph-review
|
|
@@ -43,7 +43,7 @@ e o `recap.md` estar atualizado. Normalmente invocada pela skill orquestradora `
|
|
|
43
43
|
outro propósito. Falha aqui é bloqueante — quebra silenciosa em runtime, não em build.
|
|
44
44
|
|
|
45
45
|
4. **Despache o avaliador independente** — o score do Gate 3 nunca é auto-atribuído por quem implementou:
|
|
46
|
-
- Rode
|
|
46
|
+
- Rode `morph-spec verify {feature} --json` (escopo feature) e capture o JSON — é a saída real de build+testes+validadores que você anexa ao prompt do avaliador independente (`morph-evaluator`).
|
|
47
47
|
- Gere o **diff da implementação** (`git diff` do range da feature, ou a lista de arquivos do recap.md com seus conteúdos atuais).
|
|
48
48
|
- Despache o subagent registrado `morph-evaluator` (gerado de `agents.json` — a persona do avaliador é o system prompt dele, com tools read-only), com contexto fresco:
|
|
49
49
|
```
|
|
@@ -56,22 +56,18 @@ e o `recap.md` estar atualizado. Normalmente invocada pela skill orquestradora `
|
|
|
56
56
|
seguindo as bandas 0-10 de cada uma.
|
|
57
57
|
NÃO reescreva código. NÃO toque em tasks.json, feature.json nem no board
|
|
58
58
|
de sessão.
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
falha de protocolo.
|
|
69
|
-
Retorne no content: score 0-10 por dimensão, score composto (arch×0.30 +
|
|
70
|
-
contracts×0.25 + quality×0.25 + tests×0.20), e feedback priorizado
|
|
71
|
-
(bloqueantes primeiro) para qualquer dimensão < 9.
|
|
59
|
+
Contrato do relatório final — ATO FINAL: o seu relatório é a sua
|
|
60
|
+
ÚLTIMA MENSAGEM DE TEXTO; ela é o valor de retorno desta sessão e
|
|
61
|
+
chega inteira ao orquestrador. NÃO chame SendMessage: ele gera um
|
|
62
|
+
evento a mais além da notificação de término, custando um turno
|
|
63
|
+
inútil ao orquestrador. Escreva o relatório e encerre.
|
|
64
|
+
Seu relatório final deve conter: score 0-10 por dimensão, score
|
|
65
|
+
composto (arch×0.30 + contracts×0.25 + quality×0.25 + tests×0.20), e
|
|
66
|
+
feedback priorizado (bloqueantes primeiro) para qualquer dimensão < 9.
|
|
67
|
+
Relatório oco, ou sem esses itens, é falha de protocolo.
|
|
72
68
|
```
|
|
73
69
|
- **Fallback (tipo não registrado):** se `morph-evaluator` não estiver na sua lista de subagent types, despache `general-purpose` colando o campo `persona` do agente `evaluator` (Read em `.morph/framework/agents.json`) no topo do prompt — e **registre o fallback no review-report** (seção de método).
|
|
74
|
-
- Os scores por dimensão e o composto do review-report vêm **desse retorno**, não da sua auto-avaliação.
|
|
70
|
+
- Os scores por dimensão e o composto do review-report vêm **desse retorno**, não da sua auto-avaliação. Se o relatório vier oco ou sem os scores por dimensão, registre a falha de protocolo na seção de método do review-report e re-despache.
|
|
75
71
|
|
|
76
72
|
5. Produza `review-report.md` em `.morph/features/{feature}/4-review/` com:
|
|
77
73
|
- Scores por dimensão (arquitetura, contratos, qualidade, cobertura)
|
|
@@ -126,6 +122,7 @@ e o `recap.md` estar atualizado. Normalmente invocada pela skill orquestradora `
|
|
|
126
122
|
- Gate 3 registrado aprovado em `.morph/features/{feature}/feature.json` (autoritativo), na forma canônica `{ approved, timestamp, approvedBy }` — via `morph-spec approve` em auto, ou pelo hook state-sync no caminho manual
|
|
127
123
|
|
|
128
124
|
## Referências
|
|
125
|
+
- `morph-spec verify {feature} [task] --json` — cadeia determinística build+testes+validadores anexada ao prompt do avaliador (passo 4)
|
|
129
126
|
- `.morph/framework/MORPH.md` — seção 5 (Gate 3 + regras de pausa), seção 1 (papel Evaluator), Trust Mode
|
|
130
127
|
- `.claude/agents/morph-evaluator.md` — subagent do avaliador (gerado de `.morph/framework/agents.json`), despachado no passo 4
|
|
131
128
|
- `framework/skills/core/morph-eval/SKILL.md` — rubricas e bandas que o avaliador aplica
|
|
@@ -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: "
|
|
7
|
+
cliVersion: "8.1.0"
|
|
8
8
|
---
|
|
9
9
|
|
|
10
10
|
# morph-stack-scan
|
|
@@ -4,7 +4,7 @@ description: Localiza e carrega um standard específico do STANDARDS.json sob de
|
|
|
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: "
|
|
7
|
+
cliVersion: "8.1.0"
|
|
8
8
|
---
|
|
9
9
|
|
|
10
10
|
# morph-standards
|