@polymorphism-tech/morph-spec 8.44.0 → 8.46.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 +11 -9
- package/README.md +10 -10
- package/bin/morph-spec.js +11 -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 +15 -14
- 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/config.schema.json +4 -0
- package/framework/schemas/feature.schema.json +5 -29
- 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 +122 -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 +98 -48
- 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/ci/ci-verify.js +118 -0
- package/src/lib/ci/github-ci.js +192 -0
- package/src/lib/ci/workflow-scaffold.js +122 -0
- 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/telemetry/verify-event.js +3 -2
- 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/__pycache__/statusline.cpython-313.pyc +0 -0
- 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
package/claude-plugin.json
CHANGED
package/docs/CHEATSHEET.md
CHANGED
|
@@ -84,12 +84,10 @@ morph-spec retype {feature} {newType} # change type mid-flig
|
|
|
84
84
|
## CLI — state (server-side, timestamped)
|
|
85
85
|
|
|
86
86
|
```bash
|
|
87
|
-
morph-spec score {feature} {task} [score] [--dims "9.5,9,9,9"] # writes taskScores — {task} must match T<n> and {score} must be a number 0-10
|
|
88
|
-
# a blank/missing score or a dotted taskId is REFUSED (exit 1), never recorded as a fabricated 0
|
|
89
87
|
morph-spec gate-decision {feature} {gate} --pause <bool> [--reason] [--signals json] # writes gateDecisions
|
|
90
88
|
```
|
|
91
89
|
|
|
92
|
-
Never hand-edit `
|
|
90
|
+
Never hand-edit `gateDecisions`/`approvalGates` in `feature.json` — always go through these commands (they collide with the `state-sync` hook otherwise).
|
|
93
91
|
|
|
94
92
|
---
|
|
95
93
|
|
|
@@ -187,4 +185,4 @@ Never edited directly — go through CLI commands or `morph-spec update` instead
|
|
|
187
185
|
|
|
188
186
|
---
|
|
189
187
|
|
|
190
|
-
*morph-spec v8.
|
|
188
|
+
*morph-spec v8.46.0 by Polymorphism Tech*
|
package/docs/QUICKSTART.md
CHANGED
|
@@ -63,12 +63,12 @@ You approve the UI design before moving on.
|
|
|
63
63
|
### Plan (Gate 2)
|
|
64
64
|
|
|
65
65
|
Claude produces, under `2-plan/`:
|
|
66
|
-
- `
|
|
67
|
-
- `
|
|
66
|
+
- `usecases/UC-*.md` — the behavior, with postconditions observable in a test
|
|
67
|
+
- `spec.md` — architecture, contracts and the `## Contrato de implementação` section (standards, runtime verification)
|
|
68
68
|
- `tasks.json` — ordered task breakdown (`T001`, `T002`, …)
|
|
69
69
|
- `decisions.md` — architectural decision records (optional)
|
|
70
70
|
|
|
71
|
-
Claude identifies ambiguities in the spec and resolves them with you before finalizing. You review and approve the
|
|
71
|
+
Claude identifies ambiguities in the spec and resolves them with you before finalizing. You review and approve the use cases, spec and task list together.
|
|
72
72
|
|
|
73
73
|
At this point, planning is complete:
|
|
74
74
|
|
|
@@ -84,10 +84,10 @@ At this point, planning is complete:
|
|
|
84
84
|
/morph-apply my-feature
|
|
85
85
|
```
|
|
86
86
|
|
|
87
|
-
Claude reads `spec.md
|
|
87
|
+
Claude reads the use cases, `spec.md` and `tasks.json`, then implements task by task with auto-advance (no pause between tasks unless there's a blocking ambiguity):
|
|
88
88
|
- Records task progress in `tasks.json`, writing the mutable `status`/`outputs`/`notes` fields
|
|
89
89
|
- Runs the validators relevant to your stack after each task (e.g. `architecture`/`packages`/`contract-compliance` for .NET, `nextjs-component`/`css`/`design-system` for Next.js) via `morph-spec verify`
|
|
90
|
-
-
|
|
90
|
+
- Closes each task when `verify` is green and every `doneCriteria` has the evidence that proves it — red triggers an autonomous correction loop, not a pause
|
|
91
91
|
- Generates `3-implement/recap.md` on completion, then Gate 3 review (`4-review/`)
|
|
92
92
|
|
|
93
93
|
---
|
|
@@ -249,4 +249,4 @@ morph-spec doctor
|
|
|
249
249
|
|
|
250
250
|
---
|
|
251
251
|
|
|
252
|
-
*morph-spec v8.
|
|
252
|
+
*morph-spec v8.46.0 by Polymorphism Tech*
|
package/framework/CLAUDE.md
CHANGED
|
@@ -15,13 +15,13 @@ Se não houver feature ativa, pergunte ao usuário qual feature trabalhar.
|
|
|
15
15
|
|
|
16
16
|
**NUNCA:**
|
|
17
17
|
- Pular para código sem proposal aprovado (Gate 1) e plano aprovado (Gate 2).
|
|
18
|
-
- Modificar o contrato do plano depois do Gate 2 — `spec.md
|
|
18
|
+
- Modificar o contrato do plano depois do Gate 2 — `spec.md` e os campos `title`/`description`/`dependencies`/`effort`/`doneCriteria`/`group`/`agent`/`standards` de `tasks.json` ficam congelados (`protect-spec-files` bloqueia `Write`/`Edit`); mutáveis: `status`/`outputs`/`notes` (ver SEMPRE). **Fato errado sobre o código não exige revogar gate**: bloco `## Errata` append-only no fim, corpo intacto (MORPH.md §3). **Use cases (`2-plan/usecases/UC-*.md`) NÃO congelam** — editáveis por design.
|
|
19
19
|
- Escrever critérios de aceite no `proposal.md` — pertencem aos use cases (pós-condição **observável em teste**, chega **literal** ao `doneCriteria`).
|
|
20
20
|
- Editar `.morph/specs/usecases/` à mão — só o `finish` escreve lá. Mudar um UC existente (`bug`): copie para `2-plan/usecases/` da feature e corrija lá.
|
|
21
21
|
- Listar perguntas em texto simples — sempre `AskUserQuestion` (1-4 perguntas por chamada).
|
|
22
22
|
- Usar `Guid.NewGuid()`, classes não-sealed sem justificativa, exceptions como fluxo de controle, camada de Service/Manager entre handler e dados, repository genérico (`IRepository<T>`/`IUnitOfWork`), ou SQL cru sem justificativa.
|
|
23
23
|
- Comentar o que nome, tipo ou teste já dizem: o padrão é nenhum comentário, mesmo ao lado de código comentado; o elo com a pós-condição vai no nome do teste (`architecture-code-comments`, hook `comment-guard`).
|
|
24
|
-
- Editar `
|
|
24
|
+
- Editar `gateDecisions` ou gates de `feature.json` à mão — sempre via `morph-spec gate-check`/`approve` (timestamps server-side; Edit manual colide com o hook `state-sync`).
|
|
25
25
|
|
|
26
26
|
**SEMPRE:**
|
|
27
27
|
- Auto-advance entre tarefas durante a fase implement — não pause sem ambiguidade bloqueante.
|
|
@@ -29,10 +29,10 @@ Se não houver feature ativa, pergunte ao usuário qual feature trabalhar.
|
|
|
29
29
|
- Atualizar `tasks.json` ao concluir cada task gravando só os campos mutáveis `status`/`outputs`/`notes` — via `Write` OU `Edit`.
|
|
30
30
|
- Apresentar gates com o template fixo (MORPH.md/morph-plan). **A pergunta PRECISA nomear a feature** ("Gate 2 — Plano de {feature} aprovado?") — é por esse nome que `state-sync` atribui a aprovação ao `feature.json` certo. Sem nome, com mais de uma feature na árvore, ele **recusa gravar** — aprove com `morph-spec approve <feature> <gate>`.
|
|
31
31
|
- Registrar decisões não triviais em `decisions.md`.
|
|
32
|
-
-
|
|
32
|
+
- Fechar cada task só com `verify {f} {T}` verde e cada `doneCriteria` com a evidência que o prova; vermelho ou critério sem prova dispara o loop de correção autônomo, sem escalar ao humano entre tarefas. No Gate 3, o veredito (`SHIP`/`FIX`) vem do **avaliador independente** despachado pela `morph-review` — nunca de quem implementou.
|
|
33
33
|
- Em `hotfix`, o Gate 3 pausa **sempre** para um humano, mesmo em `trust: auto` — `approve ... review --mode auto` é recusado; aprove com `--approver`.
|
|
34
34
|
- Confirmar antes de `finish`/`archive`/`delete` se o SessionStart avisar que outra sessão tem claim vivo na mesma feature.
|
|
35
|
-
- **Contrato do relatório final** em todo dispatch de sub-agent: (1) grava o relatório em arquivo canônico ANTES de encerrar — `.morph/features/{f}/3-implement/reports/{taskId}.md` (avaliador: `4-review/evaluator-report.md`) — com
|
|
35
|
+
- **Contrato do relatório final** em todo dispatch de sub-agent: (1) grava o relatório em arquivo canônico ANTES de encerrar — `.morph/features/{f}/3-implement/reports/{taskId}.md` (avaliador: `4-review/evaluator-report.md`) — com o quê / **Arquivos:** / **Critérios:** (cada doneCriteria com evidência) / problemas; é o retorno autoritativo, nunca chamar `SendMessage`; (2) não tocar `tasks.json`/`feature.json`/`state.json` nem o board de sessão; (3) testes pelo orçamento, só o próprio filtro uma vez, sem red→green (a prova é o `verify` do orquestrador); (8) nunca mutar produção. Racional completo: `MORPH.md` §6. Templates: `morph-implement` §4, `morph-apply` §3b. **O orquestrador lê o arquivo ao retomar controle** — nunca confia só na mensagem de retorno da tool.
|
|
36
36
|
|
|
37
37
|
## Slash commands
|
|
38
38
|
|
|
@@ -52,7 +52,6 @@ Se não houver feature ativa, pergunte ao usuário qual feature trabalhar.
|
|
|
52
52
|
|---------|-----------|
|
|
53
53
|
| `approve <f> <gate> --mode auto` | Aprova gate em `trust:auto`. Gate 3 exige `evaluator-report.md` (ou `--self-assessed`); `hotfix` nunca aceita `--mode auto` — use `--approver` |
|
|
54
54
|
| `advance <f>` | Aprova o gate corrente + já cria a pasta da próxima fase |
|
|
55
|
-
| `score <f> <task> <n> [--dims a,c,q,t]` | Grava `taskScores` server-side (nunca à mão) |
|
|
56
55
|
| `gate-check <f> <gate> [--json]` | Default: decide via sinais do disco (`shouldPauseGate`) |
|
|
57
56
|
| `gate-decision <f> <gate> --pause <bool>` | Escape manual: risco que o disco não vê |
|
|
58
57
|
| `create <f> --description "..." --type <t>` | Nasce a feature + `feature.json`; `--worktree` já isola |
|
|
@@ -69,7 +68,7 @@ Se não houver feature ativa, pergunte ao usuário qual feature trabalhar.
|
|
|
69
68
|
| `dag <f>` | DAG de `tasks.json`: sequencial/paralelo, recomenda isolamento |
|
|
70
69
|
| `graph status\|build\|refresh` | Grafo de codebase. `status` reporta frescor e se há refresh em background |
|
|
71
70
|
| `graph affected\|explain <sym>` | Blast radius e vizinhança saneados. Sem grafo, caia para grep — nunca é erro |
|
|
72
|
-
| `verify <f> [task] [--
|
|
71
|
+
| `verify <f> [task] [--ci]` | Build+testes+validadores+e2e — prova da task; a do Gate 3 com `--ci` (no CI) |
|
|
73
72
|
| `e2e up\|status\|down <f>` | Stack de verificação (docker compose) |
|
|
74
73
|
| `doctor --worktrees [--prune]` | Reconcilia git × disco × features; só `--prune` remove algo |
|
|
75
74
|
| `report-check <f> [task...] [--json]` | Audita relatório de sub-agent vs. trabalho entregue |
|
|
@@ -85,9 +84,8 @@ Prefixo de todo comando: `morph-spec`. Flags/exemplos: `.morph/framework/CLI.md`
|
|
|
85
84
|
| `morph-brainstorming` | Entender negócio, escanear stack, produzir proposal.md |
|
|
86
85
|
| `morph-stack-scan` | Desvios de stack em projeto brownfield |
|
|
87
86
|
| `morph-uiux` | Ramo opcional de UI/UX — design system e mockups |
|
|
88
|
-
| `morph-plan` | Destilar use cases e produzir spec.md +
|
|
87
|
+
| `morph-plan` | Destilar use cases e produzir spec.md + tasks.json |
|
|
89
88
|
| `morph-implement` | Executar uma tarefa com auto-advance entre tasks |
|
|
90
|
-
| `morph-eval` | Aplicar rubricas e produzir score 0-10 |
|
|
91
89
|
| `morph-review` | Produzir review-report.md (Gate 3) |
|
|
92
90
|
| `morph-hotfix` | Hotfix cirúrgico (`/morph-hotfix`) |
|
|
93
91
|
| `morph-standards` | Localizar standard sob demanda |
|
package/framework/MORPH.md
CHANGED
|
@@ -16,19 +16,17 @@ Entre gates, você opera com autonomia total. O dev valida. Você executa.
|
|
|
16
16
|
| ----------------------------------------------------------------------- | ------------------------------------------------------------------------------- |
|
|
17
17
|
| Gate 1 / 2 / 3 aprovado | Avançar para próxima fase imediatamente |
|
|
18
18
|
| Tarefa completada na fase implement | Iniciar a próxima task do tasks.json sem aguardar instrução |
|
|
19
|
-
| Ambiguidade de escopo coberta pelo
|
|
19
|
+
| Ambiguidade de escopo coberta pelo plano | Resolver conservadoramente e registrar em decisions.md |
|
|
20
20
|
| Ambiguidade bloqueante (requisito ausente ou contraditório) | UMA pergunta via AskUserQuestion |
|
|
21
|
-
|
|
|
22
|
-
|
|
|
23
|
-
|
|
|
24
|
-
|
|
|
25
|
-
|
|
|
26
|
-
| Score morph-eval < 9 numa task | Loop de correção autônomo: re-implementar com feedback priorizado, até 3 tentativas, sem pausa humana |
|
|
27
|
-
| Score morph-eval < 9 após 3 tentativas | Escalar ao usuário (aceitar/continuar/pular) — único ponto de pausa do loop |
|
|
21
|
+
| Task implementada (código escrito) | `morph-spec verify <feature> <task>` e cada `doneCriteria` com a evidência que o prova |
|
|
22
|
+
| Verify verde e critérios atendidos | Task `done`, próxima tarefa, sem anúncio |
|
|
23
|
+
| Verify vermelho ou critério sem evidência | Loop de correção autônomo com o feedback, até 3 tentativas, sem pausa humana |
|
|
24
|
+
| 3 tentativas sem fechar | Escalar ao usuário (aceitar/continuar/pular) — único ponto de pausa do loop |
|
|
25
|
+
| `verify` exit 3 (fila pesada cheia) | A fila já esperou: no máximo uma chamada nova, depois avise — nunca laço de espera |
|
|
28
26
|
|
|
29
27
|
**Regra de ouro:** dúvida que não bloqueia → resolver e registrar; dúvida que bloqueia → uma pergunta, máximo. Vale **entre gates** (plan/implement/review) — **não** vale na abertura da feature: a fase proposal pode rodar em **modo entrevista** (escolhido na pergunta de abertura, `morph-brainstorming` Parte 2), onde perguntar até fechar o entendimento é o comportamento desejado.
|
|
30
28
|
|
|
31
|
-
**
|
|
29
|
+
**A prova é o código:** `morph-spec verify` (build+testes+validadores) prova o que é determinístico; o `doneCriteria` prova o comportamento. A suíte do Gate 3 roda no CI do projeto (`verify {f} --ci`: mesmo stamp, a máquina fica livre; sem CI, local). Não há nota por task — estilo e estrutura são nota do avaliador do Gate 3, nunca bloqueio.
|
|
32
30
|
|
|
33
31
|
---
|
|
34
32
|
|
|
@@ -47,14 +45,14 @@ O harness conhece o stack por padrão. Não pergunte sobre tecnologia a menos qu
|
|
|
47
45
|
| Frontend | Next.js App Router + Tailwind + Framer Motion + Shadcn |
|
|
48
46
|
| Jobs async | Hangfire — apenas quando há razão real |
|
|
49
47
|
|
|
50
|
-
Padrões proibidos
|
|
48
|
+
Padrões proibidos (valem em todo código; os standards detalham):
|
|
51
49
|
- `Guid.NewGuid()` → `Guid.CreateVersion7()`
|
|
52
50
|
- Classes não-sealed sem justificativa
|
|
53
51
|
- Exceptions como fluxo de controle
|
|
54
52
|
- Camada de Service/Manager entre handler e dados — o handler fala com o `ApplicationDbContext` direto, nunca com um service
|
|
55
53
|
- Repository genérico (`IRepository<T>`/`IUnitOfWork`) — redundante sobre EF Core: `DbSet<T>` já é repository, `DbContext` já é unit of work
|
|
56
54
|
- SQL cru (`FromSqlRaw`, `ExecuteQuery(string)`) sem justificativa em `decisions.md` — use LINQ
|
|
57
|
-
- Redeclarar tipo/componente que já existe na mesma feature — `morph-spec graph explain <nome>` antes de criar (sem grafo: `grep -rn`); criar exige veredito `CRIAR`
|
|
55
|
+
- Redeclarar tipo/componente que já existe na mesma feature — `morph-spec graph explain <nome>` antes de criar (sem grafo: `grep -rn`); criar exige veredito `CRIAR` com `why` em `tasks[].reuse`
|
|
58
56
|
|
|
59
57
|
Acesso a dados em VSA: `ApplicationDbContext` direto no slice (`DbSet<T>` já é repository, `DbContext` já é unit of work). Concorrência ou SQL específico → store dedicado hand-written com justificativa em `decisions.md`.
|
|
60
58
|
|
|
@@ -68,7 +66,7 @@ O morph-spec opera com três papéis que você assume conforme o contexto:
|
|
|
68
66
|
|
|
69
67
|
**Specialist** — ativo durante a implementação. Executa tarefas do tasks.json em ordem, consulta standards antes de cada uma, registra decisões/desvios no decisions.md, mantém o recap.md atualizado ao final de cada tarefa. Anti-padrão: não cria novas tarefas — descoberta de escopo vai para decisions.md com flag "escopo expandido", o Orchestrator avalia se o tasks.json precisa mudar.
|
|
70
68
|
|
|
71
|
-
**Evaluator** — ativo
|
|
69
|
+
**Evaluator** — ativo no Gate 3, sempre um sub-agent independente com contexto fresco (`morph-evaluator`), nunca quem implementou (enforcement: relatório obrigatório, `--self-assessed`, exceção `hotfix` — **§5**). Segue `.morph/framework/evals/review-checklist.md`: veredito `SHIP`/`FIX` e bloqueador só com evidência (uc, teste, regressão, segurança); o resto é nota. Não roda a suíte (a prova é o verify do orquestrador) e não reescreve código.
|
|
72
70
|
|
|
73
71
|
Os papéis não são exclusivos — numa sessão longa você transita entre eles. A transição deve ser explícita: conclua o que estava fazendo ou registre o estado no recap.md antes de mudar.
|
|
74
72
|
|
|
@@ -76,12 +74,12 @@ Os papéis não são exclusivos — numa sessão longa você transita entre eles
|
|
|
76
74
|
|
|
77
75
|
## 2. Fases
|
|
78
76
|
|
|
79
|
-
O fluxo padrão de uma feature tem quatro fases, cada uma com pasta dedicada em `.morph/features/{feature}/`. Estado autoritativo e commitado: `.morph/features/{feature}/feature.json` (status, approvalGates, outputs, tasks, gateDecisions,
|
|
77
|
+
O fluxo padrão de uma feature tem quatro fases, cada uma com pasta dedicada em `.morph/features/{feature}/`. Estado autoritativo e commitado: `.morph/features/{feature}/feature.json` (status, approvalGates, outputs, tasks, gateDecisions, archivedAt); `.morph/state.json` na raiz é só índice fino gitignored derivado dele; identidade do projeto em `.morph/config/config.json` (commitado).
|
|
80
78
|
|
|
81
79
|
| Fase | Pasta | Gate | O que termina a fase |
|
|
82
80
|
| ------------- | ---------------- | ----------------------- | ------------------------------------------------- |
|
|
83
81
|
| proposal | `0-proposal/` | Gate 1 (trust-aware) | `proposal.md` aprovado e commitado |
|
|
84
|
-
| plan | `2-plan/` | Gate 2 (trust-aware) | `spec.md`, `
|
|
82
|
+
| plan | `2-plan/` | Gate 2 (trust-aware) | use cases, `spec.md`, `tasks.json` aprovados |
|
|
85
83
|
| implement | `3-implement/` | Nenhum | Todas as tasks do tasks.json com status `done` |
|
|
86
84
|
| review | `4-review/` | Gate 3 (trust-aware) | `review-report.md` aprovado e commitado |
|
|
87
85
|
|
|
@@ -106,7 +104,7 @@ Nem todo trabalho merece o pipeline completo. Cada feature nasce com **identidad
|
|
|
106
104
|
|
|
107
105
|
**Como classificar (router):** sinais determinísticos primeiro — `morph-spec create --request "<texto>"` roda o detector por keywords (hotfix: "produção caiu/urgente/incident/p0"; bug: "bug/corrigir/exception/regressão"; chore: "typo/rename/bump/config/docs/cleanup"). As keywords casam como **palavra inteira** ("group0" não é `p0`, "prefix" não é `fix`, "debug" não é `bug`) — casar demais pularia gates num pedido inócuo; por isso plural e flexão são listados explicitamente ("bugs", "incidentes", "configs"). Confiança `high` → usa o tipo. Empate (`tie`) ou nenhum sinal (`none`) → o comando sai com código 2 e os candidatos; **você decide como roteador** e re-roda com `--type`. Só vale uma `AskUserQuestion` quando o pedido é genuinamente indeterminado.
|
|
108
106
|
|
|
109
|
-
**Como o skip funciona:** `chore`/`hotfix` têm os gates `proposal`/`plan` carimbados no nascimento com `approvedBy: "policy:{tipo}"`. Como `derivePhase` é gate-aware, o trabalho já nasce em `implement` — sem tocar `phases.json`. Artefatos reutilizam os nomes canônicos (hotfix escreve brief curto em `proposal.md`; ambos escrevem `2-plan/tasks.json` mínimo de 1-3 tasks para ligar trace
|
|
107
|
+
**Como o skip funciona:** `chore`/`hotfix` têm os gates `proposal`/`plan` carimbados no nascimento com `approvedBy: "policy:{tipo}"`. Como `derivePhase` é gate-aware, o trabalho já nasce em `implement` — sem tocar `phases.json`. Artefatos reutilizam os nomes canônicos (hotfix escreve brief curto em `proposal.md`; ambos escrevem `2-plan/tasks.json` mínimo de 1-3 tasks para ligar trace e dag).
|
|
110
108
|
|
|
111
109
|
**Compat:** feature sem `workType` (pré-v8) é tratada como `feature`. Mudança mid-flight: `morph-spec retype <f> <tipo>` (desfaz só carimbos de política, preserva aprovações humanas; bloqueado após o Gate 3).
|
|
112
110
|
|
|
@@ -120,7 +118,7 @@ Features independentes podem ser desenvolvidas **em paralelo, cada uma no seu gi
|
|
|
120
118
|
- `feature.json` viaja **commitado na branch** `morph/{f}`; a cópia da raiz é esqueleto do nascimento, nunca mais atualizado — leitores (`list`/`handoff`/`fleet`) seguem a branch, mutadores recusam gravar fora da árvore dona (detalhes: CLI.md). `state.json` do worktree é índice derivável — self-heal, nunca sincronizado à mão.
|
|
121
119
|
- **Só o morph cria worktree:** `worktree setup <f>` (feature) ou `worktree provision <n>` (isolamento de task, branch `morph-task/<n>`). `git worktree add` cru é bloqueado; `EnterWorktree`/`-w`/`isolation:"worktree"` passam pelo hook `WorktreeCreate` e caem no contêiner (`worktrees/` ou `worktree.root`); fora dele = criado sem o morph (`doctor --worktrees`). Já existe: abra o `claude` DENTRO dela; `EnterWorktree(path)` sempre pede aprovação. Infra (`node_modules`, `.claude`, `.morph/framework`) por junction; faltou → `worktree link --all`.
|
|
122
120
|
- **Só o morph remove worktree.** Remoção genérica — `git worktree remove` (com OU sem `--force`), `rm -rf`, `Remove-Item -Recurse`, explorador/IDE — **atravessa a junction** e apaga o conteúdo real da raiz (`.claude`/`node_modules`/`.morph/framework`), saindo com sucesso. Só `morph-spec` desmonta a junction ANTES de remover (PROVE-or-DECLINE): **fechar a feature** = `morph-spec finish <f> --pr|--merge`; **só desmontar o worktree** = `morph-spec worktree remove <f>` — ou `--target <path>` para worktree sem feature. Sobra de sub-agent (`agent-<hex>`): `worktree reap` remove só a que parou limpa e sem commit exclusivo.
|
|
123
|
-
- **Ambiente dedicado:** setup escreve `.morph/worktree.env` (`PORT`, `API_PORT`/`ASPNETCORE_URLS`, `POSTGRES_PORT`, `COMPOSE_PROJECT_NAME=morph-{f}`); cada worktree sobe o **seu** compose. O hook `PreToolUse:Bash` injeta as variáveis em dev server/compose; fora do Claude, `eval "$(morph-spec env)"`. Porta fixa ou `container_name` no compose **reprova o nó e2e** em worktree. `finish` derruba o stack **com volumes** (`--keep-volumes` preserva). Migration destrutiva → integre antes de abrir irmãos. Build/testes/e2e disputam 2 slots por usuário (`heavy status`): **exit 3 = fila cheia, não vermelho** —
|
|
121
|
+
- **Ambiente dedicado:** setup escreve `.morph/worktree.env` (`PORT`, `API_PORT`/`ASPNETCORE_URLS`, `POSTGRES_PORT`, `COMPOSE_PROJECT_NAME=morph-{f}`); cada worktree sobe o **seu** compose. O hook `PreToolUse:Bash` injeta as variáveis em dev server/compose; fora do Claude, `eval "$(morph-spec env)"`. Porta fixa ou `container_name` no compose **reprova o nó e2e** em worktree. `finish` derruba o stack **com volumes** (`--keep-volumes` preserva). Migration destrutiva → integre antes de abrir irmãos. Build/testes/e2e disputam 2 slots por usuário (`heavy status`): **exit 3 = fila cheia, não vermelho** — a fila já esperou, então uma chamada nova no máximo, depois avise; fora do `verify`, `heavy run -- <cmd>`.
|
|
124
122
|
- **Limitação:** `node_modules` é junction compartilhada — dependência mudada afeta os irmãos; integre antes de seguir em paralelo.
|
|
125
123
|
- **Handoff entre sessões:** `.morph/features/{f}/handoff.md` — retomada comprimida, regenerável (`morph-spec handoff <f>`, resolve a árvore dona sozinho), **aponta** para os artefatos em vez de copiá-los. Regenerado em `setup`/`create --worktree`/`advance`/`approve`. **Leia-o antes de re-derivar contexto à mão** — nunca edite manualmente.
|
|
126
124
|
- **Visão da frota:** `fleet` agrega raiz + worktrees (fase, gates, tasks, portas, handoff, commit, sujeira).
|
|
@@ -145,15 +143,13 @@ Cada fase salva seus artefatos nos caminhos exatos abaixo — não invente alter
|
|
|
145
143
|
|
|
146
144
|
`id` sequencial **no projeto**, não na feature — alocado por `morph-spec usecase reserve`, nunca por scan manual. Status: `draft` → `approved` (Gate 2) → `implemented` (promoção no `finish`) — descritivo, quem trava fase é o gate. **Editável depois do Gate 2**, por design (muda comportamento, re-roda `implement`, auditoria no git). Obrigatoriedade por tipo de trabalho: ver `morph-plan`.
|
|
147
145
|
|
|
148
|
-
- `spec.md` — especificação técnica: arquitetura, componentes, integrações, fluxos de dados, edge cases **técnicos**. Responde **como** os use cases serão realizados — não repete o comportamento. Deve bastar para implementar sem perguntas básicas
|
|
149
|
-
|
|
150
|
-
- `mandate.md` — contrato de implementação: stack exata, standards obrigatórios (com links), patterns proibidos, **verificação de runtime** (como o stack sobe, que fluxos são exercitados, quais viram spec Playwright, setup de auth) e checklist de done verificável. Lido na 1ª task da sessão (relido após `/compact`) — específico o bastante para dispensar o Orchestrator em ambiguidades.
|
|
146
|
+
- `spec.md` — especificação técnica, lida uma vez por sessão (relida após `/compact`): arquitetura, componentes, integrações, fluxos de dados, edge cases **técnicos**. Responde **como** os use cases serão realizados — não repete o comportamento. Deve bastar para implementar sem perguntas básicas. Inclui `## Contrato de implementação`: standards, proibições da feature, **verificação de runtime** (como o stack sobe, que fluxos são exercitados, setup de auth) — baseline como comando, pré-requisito como predicado. Lido uma vez por sessão (relido após `/compact`).
|
|
151
147
|
|
|
152
148
|
- `tasks.json` — validada contra `.morph/framework/schemas/tasks.schema.json`. Cada task: `id` (T1, T2...), `title`, `description`, `dependencies` (IDs), `effort`, `doneCriteria`, `status`, `outputs` (paths esperados), `usecase` (opcional — **ID** do use case, `UC-07`, nunca o nome do arquivo). `doneCriteria` de task com `usecase` carrega a **pós-condição literal**, com rótulo (`"P2 — cada veterinário traz..."`). Toda entrada do recap.md referencia um ID do tasks.json.
|
|
153
149
|
|
|
154
150
|
- `decisions.md` — log de decisões técnicas (alternativa descartada, motivo, quem decidiu). Só existe com decisão não trivial a rastrear.
|
|
155
151
|
|
|
156
|
-
**Errata
|
|
152
|
+
**Errata no spec congelado:** congelar o CONTRATO não é congelar um ERRO DE FATO. Se a spec afirma sobre o código algo que o código desmente, acrescente um bloco `## Errata` no FIM do arquivo — corpo intacto, append-only, aceito pelo `protect-spec-files` sem revogar gate. Mudança de ESCOPO continua exigindo revogar o gate e re-aprovar.
|
|
157
153
|
|
|
158
154
|
### Implement (`3-implement/`)
|
|
159
155
|
|
|
@@ -162,14 +158,15 @@ Cada fase salva seus artefatos nos caminhos exatos abaixo — não invente alter
|
|
|
162
158
|
|
|
163
159
|
### Review (`4-review/`)
|
|
164
160
|
|
|
165
|
-
- `
|
|
161
|
+
- `evaluator-report.md` — do avaliador independente: `**Verdict:** SHIP|FIX`, tabela `## Bloqueadores` (tipo + evidência), notas.
|
|
162
|
+
- `review-report.md` — síntese do orquestrador: `**Reviewed-SHA:**`, veredito, bloqueadores e o resultado do e2e.
|
|
166
163
|
|
|
167
164
|
### Acervo de use cases (`.morph/specs/usecases/`)
|
|
168
165
|
|
|
169
166
|
Acervo permanente do projeto: `UC-{nn}-{slug}.md`, **commitado**. Descrição viva do comportamento do sistema, sobrevive ao arquivamento — diferente dos traces, **faz parte da entrega**.
|
|
170
167
|
|
|
171
168
|
- **Quem escreve:** `morph-spec finish` promove os use cases da feature para cá **dentro do commit de arquivamento**, na branch `morph/{f}`, com `status: implemented` — com o estado arquivado (§2.2), nunca pós-merge.
|
|
172
|
-
- **O que é cobrado mecanicamente:** `morph-spec dag {feature}` cruza `tasks.json` com os use cases — `UC-{nn}` inexistente é **erro** (não despacha); pós-condição órfã, `doneCriteria` parafraseado e vocabulário de artefato sem `Por que artefato:` são avisos. Cobre o *encanamento*; se a pós-condição é observável em teste continua sendo critério do Gate 2 e
|
|
169
|
+
- **O que é cobrado mecanicamente:** `morph-spec dag {feature}` cruza `tasks.json` com os use cases — `UC-{nn}` inexistente é **erro** (não despacha); pós-condição órfã, `doneCriteria` parafraseado e vocabulário de artefato sem `Por que artefato:` são avisos. Cobre o *encanamento*; se a pós-condição é observável em teste continua sendo critério do Gate 2 e do avaliador.
|
|
173
170
|
- **Via única de escrita:** a promoção lê **só** de `{feature}/2-plan/usecases/`. Nunca edite `.morph/specs/usecases/` à mão — pula `status: implemented`, a sobrescrita por ID e o commit escopado, criando duas verdades. Mudar um UC existente (caso `bug`): copie para `2-plan/usecases/` da feature, corrija lá, deixe o `finish` sobrescrever.
|
|
174
171
|
- **Quando chega na default:** em `--merge`, no merge `--no-ff`; em `--pr`, só quando mergeado — o acervo descreve o que foi **integrado**, não proposto.
|
|
175
172
|
- **Sobrescrita por ID:** `UC-07` existente é substituído pela versão integrada, mesmo com slug novo — exatamente um arquivo por ID.
|
|
@@ -218,14 +215,12 @@ Gates são pontos de **pausa potencial**. Em `trust: "auto"` (default), auto-pas
|
|
|
218
215
|
| Sinal | Threshold | Quando aplica |
|
|
219
216
|
|---|---|---|
|
|
220
217
|
| `designSystemDivergence` | true | Fontes de design conflitantes |
|
|
221
|
-
| `standardsViolations` | array.length > 0 |
|
|
222
|
-
| `
|
|
218
|
+
| `standardsViolations` | array.length > 0 | Plano ou código viola padrões proibidos |
|
|
219
|
+
| `evaluatorVerdict` | ≠ SHIP, bloqueador, ou ausente | Veredito do `evaluator-report`: `FIX`, bloqueador aberto, bloqueador sem tipo, ou relatório sem `**Verdict:**`. Só no **ship** |
|
|
223
220
|
| `verificationStatus` | === 'fail' | `verify` vermelho — build, testes, validadores **ou e2e**. Vale em **qualquer** gate |
|
|
224
221
|
| `verificationStale` | true | Stamp do `verify` com sha != HEAD: o verde é de outro código. Só no **ship** |
|
|
225
222
|
| `e2eSkipClass` (derivada) | environment/requested/unknown | e2e pulou sem dispensa legítima (só `project`/`scope`). Só no **ship** |
|
|
226
223
|
| `verificationScope` | !== `feature` (presente) | Stamp do `verify` é de escopo parcial (`task:{id}`) — não cobre a feature inteira. Só no **ship** |
|
|
227
|
-
| `mutationProof` | seção ausente | Relatório do avaliador sem `## Mutações` numa feature com código de produção. Só no **ship** |
|
|
228
|
-
| `evalScoreSource` | ≠ avaliador | Score que não veio do `evaluator-report`. Só no **ship** |
|
|
229
224
|
| `promptModel` | prompt/modelo tocado | Sem nó `evals` declarado, ou eval pulado neste verify. Só no **ship** |
|
|
230
225
|
| `mediaClaims` | seção ausente | Feature que gera mídia, relatório sem `## Mídia gerada`. Só no **ship** |
|
|
231
226
|
| `screenChecklist` | item em aberto | **uiux**: tela sem checklist completo, ou nenhuma `## Tela:`. **ship**: item decidido sem linha em `## Checklist de tela` |
|
|
@@ -236,27 +231,27 @@ Gates são pontos de **pausa potencial**. Em `trust: "auto"` (default), auto-pas
|
|
|
236
231
|
| Gate | Sinais | Skill responsável |
|
|
237
232
|
|---|---|---|
|
|
238
233
|
| 1 — Proposta | `designSystemDivergence`, `standardsViolations` | `morph-brainstorming` |
|
|
239
|
-
| 2 — Plano | Gate 1 + `taskCount`, `oversizedTasks`, `standardsViolations`
|
|
234
|
+
| 2 — Plano | Gate 1 + `taskCount`, `oversizedTasks`, `standardsViolations` no plano | `morph-plan` |
|
|
240
235
|
| uiux — Design | `screenChecklist` | `morph-uiux` |
|
|
241
|
-
| 3 — Review | `
|
|
236
|
+
| 3 — Review | `evaluatorVerdict`, `standardsViolations` em implementation, `verificationStale`, `verificationScope`, `e2eSkipClass`, `promptModel`, `mediaClaims`, `screenChecklist` | `morph-review` |
|
|
242
237
|
|
|
243
|
-
**Gates por tipo de trabalho:** `chore`/`hotfix` pulam Gates 1 e 2 — carimbados por política no nascimento (`approvedBy: "policy:{tipo}"`, nunca `"auto"`);
|
|
238
|
+
**Gates por tipo de trabalho:** `chore`/`hotfix` pulam Gates 1 e 2 — carimbados por política no nascimento (`approvedBy: "policy:{tipo}"`, nunca `"auto"`); o Gate 3 vale para todos os tipos. `hotfix`: Gate 3 **sempre humano** (mesmo em `trust: auto`; `approve ... review --mode auto` recusa) e exige `4-review/review-report.md` em vez de `evaluator-report.md`. Demais tipos exigem `evaluator-report.md`, **enforced server-side** (`approve {feature} review` recusa sem ele; `--force` não dispensa) — ou `--self-assessed` registrado (`approvalGates.review.selfAssessed`, marcado no `morph-spec list`).
|
|
244
239
|
|
|
245
240
|
Modo: `.morph/config/config.json → trust` (`"auto"`, o default, ou `"manual"`).
|
|
246
241
|
|
|
247
|
-
**Comportamento padrão fora de gate:** autonomia total — só pausa nestes três pontos. Ambiguidade de escopo fora do
|
|
242
|
+
**Comportamento padrão fora de gate:** autonomia total — só pausa nestes três pontos. Ambiguidade de escopo fora do plano: registre em decisions.md, resolva conservadoramente, sinalize na entrega da task.
|
|
248
243
|
|
|
249
|
-
**A aprovação de gate é unificada nos comandos da CLI — nunca edite o estado à mão.** Em `trust: "auto"` (sem `AskUserQuestion`): `morph-spec approve <feature> <gate> --mode auto`; `morph-spec advance <feature>` aprova o gate corrente **e** cria a pasta da próxima fase (`--design` = ramo opcional de uiux).
|
|
244
|
+
**A aprovação de gate é unificada nos comandos da CLI — nunca edite o estado à mão.** Em `trust: "auto"` (sem `AskUserQuestion`): `morph-spec approve <feature> <gate> --mode auto`; `morph-spec advance <feature>` aprova o gate corrente **e** cria a pasta da próxima fase (`--design` = ramo opcional de uiux). **O hook state-sync.js** cobre o caminho manual: `AskUserQuestion` respondida com label "aprovado" → registra o gate no `feature.json` autoritativo com `approvedBy: "manual"`. **A feature é identificada pelo nome que a pergunta cita** — grava na árvore dona dela, nunca na "feature ativa" da sessão. Pergunta sem nome numa árvore com mais de uma feature: o hook **recusa gravar** e avisa — aprove por `morph-spec approve`.
|
|
250
245
|
|
|
251
246
|
**Registre quem aprovou (`approvedBy`):** objeto `{ approved, timestamp, approvedBy }`. `"auto"` — política `trust: auto` sem decisão humana. `"manual"` — humano aprovou (via `AskUserQuestion` ou, em headless, texto iniciado em "aprovado"); em `trust: manual` todo gate é `"manual"` — nunca `"auto"` num gate humano.
|
|
252
247
|
|
|
253
|
-
**O hook gate-guard.js** confere, sem bloquear, se a ação num gate (pausar vs auto-aprovar) bateu com a decisão persistida. **Default:** `gate-check <feature> <gate> [--signals <json>] [--json]` decide via `shouldPauseGate`; `--signals` sobrescreve só o que o disco não expõe (`designSystemDivergence`, `standardsViolations
|
|
248
|
+
**O hook gate-guard.js** confere, sem bloquear, se a ação num gate (pausar vs auto-aprovar) bateu com a decisão persistida. **Default:** `gate-check <feature> <gate> [--signals <json>] [--json]` decide via `shouldPauseGate`; `--signals` sobrescreve só o que o disco não expõe (`designSystemDivergence`, `standardsViolations`). **Escape manual** (sinal que `shouldPauseGate` não representa): `gate-decision <feature> <gate> --pause <bool> [--reason <txt>] [--signals <json>]`. Ambos gravam `gateDecisions[gate] = { pause, reason, signals, trust, decidedAt }` server-side (`.morph/framework/schemas/feature.schema.json`). **Nunca edite `gateDecisions` à mão** — colide com state-sync. Divergência → o guard avisa no contexto.
|
|
254
249
|
|
|
255
250
|
---
|
|
256
251
|
|
|
257
252
|
## 6. Sub-agents
|
|
258
253
|
|
|
259
|
-
A thread principal é o **Orchestrator**. Trabalho pesado ou fora do domínio corrente **deve** ser delegado a um sub-agent com persona e standard escopados — é o modo padrão de operação, não uma exceção. Implementar tudo inline porque "eu já sei o padrão" contamina o contexto principal e desperdiça o sistema de personas.
|
|
254
|
+
A thread principal é o **Orchestrator**. Trabalho pesado ou fora do domínio corrente **deve** ser delegado a um sub-agent com persona e standard escopados — é o modo padrão de operação, não uma exceção. Implementar tudo inline porque "eu já sei o padrão" contamina o contexto principal e desperdiça o sistema de personas; feature cruzando ≥2 domínios → o default é despachar especialistas.
|
|
260
255
|
|
|
261
256
|
**Despache um sub-agent por padrão quando a tarefa atende a pelo menos um destes gatilhos:**
|
|
262
257
|
|
|
@@ -271,7 +266,7 @@ Inline (sem dispatch) é aceitável para tasks curtas (S/M) **dentro do domínio
|
|
|
271
266
|
|
|
272
267
|
**Mecanismo de dispatch:** agents de domínio são subagents **registrados** (`.claude/agents/morph-{id}.md`, gerados de `agents.json` na instalação). Despache com `subagent_type: "morph-{id}"` (ex.: `morph-dotnet-senior`) — persona é o **system prompt**, tools/model/MCPs por domínio em `agents.json` (ex.: `context7` nos implementadores; Stitch/Gemini/Playwright no `morph-ui-designer`; `morph-evaluator` é read-only). **Fallback** (tipo não registrado): `general-purpose` com `persona` colado no prompt, **registrado nas `notes` da task**. O `**Persona:**` do recap registra sempre o mecanismo real — nunca auto-declaração.
|
|
273
268
|
|
|
274
|
-
**Persona de estágio — scout:** `morph-scout` (read-only
|
|
269
|
+
**Persona de estágio — scout:** `morph-scout` (read-only). Localiza com `morph-spec graph affected|explain` e cai para grep sem grafo. Obrigatório no início de um hotfix (root cause + blast radius), opcional antes do plan de feature grande (`morph-plan` §1b). Devolve um mapa (Observado/Inferido); não escreve código.
|
|
275
270
|
|
|
276
271
|
**Passe ao sub-agent:** especificação da tarefa (tasks.json), path do standard relevante (só um), arquivos a ler/modificar, critério de done claro e verificável.
|
|
277
272
|
|
|
@@ -301,7 +296,7 @@ morph-spec report-check <feature> [task...] --json
|
|
|
301
296
|
|
|
302
297
|
| veredito | o que significa | ação |
|
|
303
298
|
| --- | --- | --- |
|
|
304
|
-
| `ok` | relatório presente, com
|
|
299
|
+
| `ok` | relatório presente, com arquivos e critérios, e mais novo que o trabalho | siga o fluxo |
|
|
305
300
|
| `report-stale` | relatório completo mas **VELHO**: a task escreveu arquivos DEPOIS de ele ser gravado (o agente relatou cedo e continuou; ex.: "teste ainda não escrito" com os testes já no disco) | **não re-despache** — leia `observed` (writes reais do `events.jsonl`, não `outputs` auto-declarado) e atualize o relatório a partir dessa evidência |
|
|
306
301
|
| `report-incomplete` | relatório existe, faltam itens (ele lista quais) | complete a partir da mensagem de retorno, carimbe **DEGRADADO** |
|
|
307
302
|
| `work-landed-report-missing` | sem relatório, mas os `outputs` da task estão no disco | **não re-despache** — grave você mesmo o relatório canônico a partir da mensagem de retorno, carimbado **DEGRADADO** |
|
|
@@ -311,23 +306,23 @@ morph-spec report-check <feature> [task...] --json
|
|
|
311
306
|
Sai 0 só em `ok`. Todo caminho degradado é **registrado** no recap e nas `notes` da task, nunca
|
|
312
307
|
aceito em silêncio. Segunda ausência sem trabalho entregue é falha real: escale ao humano.
|
|
313
308
|
|
|
314
|
-
**
|
|
309
|
+
**Mapa do scout:** grave-o em `2-plan/scout-map.md` e rode `morph-spec scout-check <mapa> --json` antes de usá-lo. Reprovado → descarte e re-despache **uma** vez com as falhas no prompt; o mapa novo abre com o motivo. Segunda reprovação: grep você mesmo e escale. Fato que muda o plano se confere com grep próprio, mesmo aprovado.
|
|
310
|
+
|
|
311
|
+
**O que receber de volta** (no arquivo, e na mensagem final quando ela chega):
|
|
315
312
|
- O que foi feito (2-3 frases)
|
|
316
|
-
- Arquivos
|
|
313
|
+
- **Arquivos:** lista
|
|
314
|
+
- **Critérios:** cada `doneCriteria`, atendido (com o teste ou `arquivo:linha`) ou não (por quê)
|
|
317
315
|
- Problemas encontrados e como foram resolvidos
|
|
318
|
-
- Auto-score 0-10 com justificativa em uma linha
|
|
319
316
|
|
|
320
317
|
**Contrato do relatório final:** as oito cláusulas que todo prompt de dispatch inclui vivem nos DOIS templates — `morph-implement` §4 e `morph-apply` §3b — e não são repetidas aqui: duas cópias da mesma regra divergem, e quem manda é a que o sub-agent recebe. **4-8** (escopo, sobrevivência, processos, retorno, mutação) são idênticas **palavra por palavra**, e um canário as compara; **1-3** (relatório, estado, teste) dizem o mesmo na redação de cada template.
|
|
321
318
|
|
|
322
|
-
**Teto de turnos:** `maxTurns` por persona no `agents.json` (sem o campo, 20; implementadores 120), anunciado ao sub-agent no corpo da persona. O corte é cego: a cláusula 5 manda `wip` por marco e, a ~70% do teto, relatório `PARCIAL` sem
|
|
319
|
+
**Teto de turnos:** `maxTurns` por persona no `agents.json` (sem o campo, 20; implementadores 120), anunciado ao sub-agent no corpo da persona. O corte é cego: a cláusula 5 manda `wip` por marco e, a ~70% do teto, relatório `PARCIAL` sem critério dado como atendido (`report-incomplete`): retome o agente, não carimbe DEGRADADO.
|
|
323
320
|
|
|
324
|
-
Sub-agent deve ser autossuficiente
|
|
321
|
+
Sub-agent deve ser autossuficiente: se precisaria de mais contexto, refine a tarefa antes de despachar.
|
|
325
322
|
|
|
326
323
|
**Quando NÃO despachar:** tarefas curtas onde o overhead do dispatch custa mais que a economia de contexto principal; quando o feedback precisaria ser discutido em tempo real (dispatch é assíncrono); quando a task envolve mudança de arquitetura que o Orchestrator precisa validar antes de executar.
|
|
327
324
|
|
|
328
|
-
**Após o retorno:**
|
|
329
|
-
|
|
330
|
-
> **Anti-padrão:** implementar múltiplas tasks de domínios diferentes inline em sequência ("eu já sei o padrão de cada uma") é o sinal de que a delegação foi ignorada. Feature cruzando ≥2 domínios → o default é despachar especialistas, não o Orchestrator virar faz-tudo.
|
|
325
|
+
**Após o retorno:** a task só avança com `verify` verde e cada critério com evidência (§0).
|
|
331
326
|
|
|
332
327
|
**Dispatch em paralelo (multi-agent):** fluxos **genuinamente independentes** (ex: backend ‖ frontend, convergindo só no fim) → despache múltiplos sub-agents **ao mesmo tempo**, um por fluxo, em vez de série. `morph-spec dag {feature}` analisa o DAG (`dependencies`/`group`), **pondera o esforço** (raízes/fluxos só de tasks S não ganham dispatch próprio) e imprime a decisão; regras e cap de agentes simultâneos em `morph-apply` ("Análise de DAG"). Colisão de `outputs` entre fluxos → `dag` recomenda `isolation: "worktree"`, cada agente num worktree próprio, orquestrador integra por merge (`morph-apply` §3b-w). Sem colisão: working tree compartilhada, verificação única pós-batch.
|
|
333
328
|
|
|
@@ -347,9 +342,8 @@ Path de cada skill: `.claude/skills/{nome}/SKILL.md`.
|
|
|
347
342
|
| morph-brainstorming | Invocada pela morph-proposal — entendimento de negócio + stack-scan |
|
|
348
343
|
| morph-stack-scan | Detecta stack atual; curto-circuita em greenfield |
|
|
349
344
|
| morph-uiux | Ramo opcional uiux (§2.1) — design system, mockups, componentes, fluxos |
|
|
350
|
-
| morph-plan | Invocada pela morph-proposal — produz spec
|
|
345
|
+
| morph-plan | Invocada pela morph-proposal — produz use cases, spec.md e tasks.json |
|
|
351
346
|
| morph-implement | Invocada pela morph-apply — executa cada task |
|
|
352
|
-
| morph-eval | Após concluir uma task ou fase |
|
|
353
347
|
| morph-review | Invocada pela morph-apply — produz review-report + Gate 3 |
|
|
354
348
|
| morph-hotfix | **Orquestrador**: ADW cirúrgico de hotfix (scout → fix → gate humano → ship) |
|
|
355
349
|
| morph-standards | Quando precisar localizar ou aplicar um standard específico |
|
package/framework/agents.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"version": "5.4.0",
|
|
3
3
|
"schema": "domain-personas",
|
|
4
4
|
"total_agents": 8,
|
|
5
|
-
"description": "Domain personas dispatched per task via subagent_type morph-{id} (.claude/agents/ generated from this file — single source of truth, ADR-001). Two independent axes: domain (dotnet-senior, ef-modeler, maf-expert, nextjs-expert, ui-designer, infra-engineer, evaluator) and stage (scout — read-only diagnosis before implementation). Optional per-agent fields: `tools` (comma-separated tool scope; default Read, Write, Edit, Bash, Glob, Grep; the installer always appends Skill and ToolSearch — a `tools:` line is a strict allowlist), `model` (dimensioned per stage
|
|
5
|
+
"description": "Domain personas dispatched per task via subagent_type morph-{id} (.claude/agents/ generated from this file — single source of truth, ADR-001). Two independent axes: domain (dotnet-senior, ef-modeler, maf-expert, nextjs-expert, ui-designer, infra-engineer, evaluator) and stage (scout — read-only diagnosis before implementation). Optional per-agent fields: `tools` (comma-separated tool scope; default Read, Write, Edit, Bash, Glob, Grep; the installer always appends Skill and ToolSearch — a `tools:` line is a strict allowlist), `model` (dimensioned per stage — evaluator: sonnet, routed to opus at dispatch when the risk-detector flags the diff; domain implementers: sonnet; scout: sonnet), `mcp` (registry ids from framework/mcp/registry.json, granted as one mcp__{name} per registry `serverNames` spelling — `.mcp.json` and plugin names differ), `maxTurns` (turn ceiling of the generated subagent, integer >= 1; default 20 when absent — ADR-004: implementers 120, evaluator 90, scout 60; the generated body announces it to the sub-agent with the ~70% checkpoint turn), `surfaces` (standards split by kind of screen — `{ \"<surface>\": { when, standards: [ids] } }`; the persona reads `standards` on every surface plus only the list of the screen's surface, which the mockup checklist names; a standard is universal OR of a surface, never both). The 3 roles (Orchestrator/Specialist/Evaluator) are assumed by Claude itself per MORPH.md.",
|
|
6
6
|
"agents": {
|
|
7
7
|
"dotnet-senior": {
|
|
8
8
|
"title": ".NET Senior Engineer",
|
|
@@ -340,9 +340,8 @@
|
|
|
340
340
|
],
|
|
341
341
|
"keywords": [
|
|
342
342
|
"review",
|
|
343
|
-
"
|
|
344
|
-
"
|
|
345
|
-
"rubric",
|
|
343
|
+
"verdict",
|
|
344
|
+
"blocker",
|
|
346
345
|
"audit",
|
|
347
346
|
"quality"
|
|
348
347
|
],
|
|
@@ -355,9 +354,9 @@
|
|
|
355
354
|
"playwright",
|
|
356
355
|
"graphify"
|
|
357
356
|
],
|
|
358
|
-
"model": "
|
|
357
|
+
"model": "sonnet",
|
|
359
358
|
"maxTurns": 90,
|
|
360
|
-
"persona": "Você
|
|
359
|
+
"persona": "Você é o avaliador independente do Gate 3. Não participou da implementação. Responde uma pergunta: esta entrega faz o que os use cases dizem, sem quebrar o que já funcionava? Siga `.morph/framework/evals/review-checklist.md`: veredito `**Verdict:** SHIP|FIX`, bloqueadores só com evidência tipada (uc | teste | regressao | seguranca), o resto é nota. Você não dá nota numérica. Você NÃO roda teste nem build: nada de `morph-spec verify`, `dotnet test`, `vitest`, `npm test`. A saída do verify vem no prompt e é a prova de que a suíte passou; rodar de novo só gasta a máquina. Bash serve para ler: `git diff/log/show`, `grep`, `morph-spec graph`, e no máximo UMA rodada de `morph-spec mutate` (até 3 mutantes, cada um com `expect`), só quando o checklist pede. Nunca rode comando em segundo plano nem espere em laço (`sleep`, `until`): o que não terminar no tempo da chamada vira nota com o motivo. NUNCA modifique código, tasks.json, feature.json ou o board de sessão, e nunca reverta por `git checkout --`. Com o stack no ar (URL no prompt), navegue os fluxos da feature com Playwright e confira console e network. Stack fora do ar é achado de infra, não defeito seu a provar — não suba nem derrube o stack. Avaliando uma CORREÇÃO, pergunte o que ela abriu. O MCP `graphify` dá o grafo cru; a conclusão sai do `morph-spec graph`."
|
|
361
360
|
},
|
|
362
361
|
"scout": {
|
|
363
362
|
"title": "Codebase Scout",
|
|
@@ -387,10 +386,10 @@
|
|
|
387
386
|
"mcp": [
|
|
388
387
|
"graphify"
|
|
389
388
|
],
|
|
390
|
-
"model": "
|
|
389
|
+
"model": "sonnet",
|
|
391
390
|
"maxTurns": 60,
|
|
392
|
-
"effort": "
|
|
393
|
-
"persona": "Você é um scout read-only: mapeia o território sem escrever código. Dado um sintoma ou uma feature,
|
|
391
|
+
"effort": "medium",
|
|
392
|
+
"persona": "Você é um scout read-only: mapeia o território sem escrever código. Dado um sintoma ou uma feature, LOCALIZA os arquivos relevantes, o root cause provável e o blast radius (o que mais é afetado). Você lista e localiza, não julga: o orquestrador confere o mapa linha por linha com `morph-spec scout-check` antes de planejar com ele, e mapa reprovado é descartado inteiro.\n\nCONTRATO DE EVIDÊNCIA (o checker reprova o que fugir dele):\n1. Toda afirmação que o plano usaria traz `caminho:linha` (ou `caminho:l1-l2`) em crase e, NA MESMA LINHA, a linha literal em crase, copiada do Read ou do grep, nunca de memória nem parafraseada. Formato: - `src/X/Foo.cs:42` — `await store.SaveAsync(item, ct);` Encurte só com `...` entre trechos literais. Crase logo depois de uma citação é SEMPRE a linha literal: para descrever ou parafrasear, escreva sem crase. Linha que você não abriu não se cita; uma afirmação sobre uma linha já citada com trecho pode repetir só o `caminho:linha`. Resultado de busca se lista colando a saída do `rg -n` num bloco cercado (cada `caminho:N:linha` é conferido) ou com o comando em crase logo acima da lista.\n2. Duas seções: `## Observado` (só o que você leu, cada item com citação) e `## Inferido (hipóteses)` (o que você conclui a partir disso).\n3. Veredito de ausência ou de vida (\"sem consumidor\", \"nenhum teste\", \"ninguém escreve\", VIVO, MORTO) só em Inferido, como hipótese, com o comando de busca em crase e a contagem bruta. Formato: - Sem escritor: `rg -n \"Foo =\" src` → 0 linhas. Nunca tire um veredito desses do grafo.\n4. Afirmar comportamento (X escreve em Y, Z está vivo) exige citar o ponto de escrita E o de leitura. Declaração e leitor sem escrita encontrada é a hipótese \"sem escritor\", nunca VIVO.\n5. O auto-score não é evidência e não compensa citação faltando.\n\nPara LOCALIZAR, COMECE PELO GRAFO, não pelo grep. `morph-spec graph affected <símbolo> --json` dá o blast radius; `morph-spec graph explain <símbolo> --json` dá a vizinhança com arquivo:linha. Contra o grep isso é 58% menos ruído e, principalmente, classifica a relação: 20 tipos podem IMPLEMENTAR uma interface enquanto só 2 a USAM, e é essa diferença que decide se dá para mexer. Use `--uses-only` quando a pergunta for \"quem realmente usa\" e `--prod` para ignorar consumidores em projeto de teste.\n\nFALLBACK OBRIGATÓRIO: se o comando devolver `no-graph`, `not-found` ou `ambiguous`, caia para Read/Glob/Grep e siga normalmente — o grafo é um subconjunto do grep, então nunca perde arquivo que o grep acharia. Diga no seu mapa qual caminho você usou. Nunca trate ausência de grafo como impedimento.\n\nDUAS RESSALVAS que mudam a leitura do resultado: (1) o grafo pode estar STALE: na raiz o refresh roda em background depois dos comandos git e no início da sessão, e enquanto ele corre o grafo ainda é o do commit anterior (`graph status --json` traz `refresh.running`); numa worktree (`refresh.auto: false`) o grafo é o semeado da raiz e não anda sozinho, então o que a feature criou ali pode não estar nele; ausência nunca sai do grafo: \"o grafo não mostra consumidor\" não é evidência, a contagem do grep é, e essa é justamente a conclusão perigosa antes de um hotfix. Dublês, fixtures e helpers de teste estão no grafo com `test: true` — é por eles que se acha o fake a reusar num teste novo. (2) Em frontend o grafo é estrutura de módulos, não call graph: ali o blast radius responde QUEM IMPORTA, não quem chama. Em backend responde quem chama.\n\nUsa Read/Glob/Grep e Bash SOMENTE-LEITURA (morph-spec graph, git log/diff/show, ls, cat) — nunca Write/Edit, nunca comandos que mudam estado. Devolve o mapa (Observado e Inferido, no contrato acima) como relatório final e encerra. Não implementa, não corrige — ilumina o caminho para quem vai. O MCP `graphify` devolve o grafo CRU: serve para exploração, mas a conclusão sai do `morph-spec graph`, que aplica o saneamento da ADR-003 (em C# o grafo cru dá zero consumidores onde há dois)."
|
|
394
393
|
}
|
|
395
394
|
}
|
|
396
395
|
}
|
|
@@ -18,7 +18,6 @@ Executa as tasks de uma feature até o Gate 3.
|
|
|
18
18
|
|
|
19
19
|
Antes de começar, verifique:
|
|
20
20
|
- `.morph/features/{feature-name}/2-plan/spec.md` existe
|
|
21
|
-
- `.morph/features/{feature-name}/2-plan/mandate.md` existe
|
|
22
21
|
- `.morph/features/{feature-name}/2-plan/tasks.json` existe e é válido contra o schema
|
|
23
22
|
|
|
24
23
|
Se algum estiver faltando, abortar e pedir ao usuário para rodar `/morph-proposal {feature-name}` primeiro.
|
|
@@ -27,13 +26,12 @@ Se algum estiver faltando, abortar e pedir ao usuário para rodar `/morph-propos
|
|
|
27
26
|
|
|
28
27
|
- Não pausar entre tarefas para confirmação — o tasks.json já foi aprovado no Gate 2.
|
|
29
28
|
- Não escrever código fora de `3-implement/` ou da source tree do projeto.
|
|
30
|
-
- Não modificar `spec.md`
|
|
29
|
+
- Não modificar `spec.md` durante a implementação — ele foi congelado pelo Gate 2.
|
|
31
30
|
|
|
32
31
|
## Referências
|
|
33
32
|
|
|
34
33
|
- `.morph/framework/MORPH.md` — charter completo
|
|
35
34
|
- `.claude/skills/morph-implement/SKILL.md`
|
|
36
|
-
- `.claude/skills/morph-eval/SKILL.md`
|
|
37
35
|
- `.claude/skills/morph-review/SKILL.md`
|
|
38
36
|
|
|
39
37
|
**Feature:** $ARGUMENTS
|
|
@@ -17,7 +17,7 @@ Resolve uma queda ou bug crítico de produção com prioridade máxima em veloci
|
|
|
17
17
|
## Fluxo
|
|
18
18
|
|
|
19
19
|
1. **Nascimento:** `morph-spec create {feature-name} --type hotfix --description "<incidente>"` — carimba `name`+`description` (obrigatória) e os gates `proposal`/`plan` por política e cria `0-proposal/`, `2-plan/`, `3-implement/` num passo só.
|
|
20
|
-
2. **Scout obrigatório:** despacha `subagent_type: "morph-scout"` (fallback `general-purpose` + persona colada) para localizar root cause e blast radius antes de qualquer fix.
|
|
20
|
+
2. **Scout obrigatório:** despacha `subagent_type: "morph-scout"` (fallback `general-purpose` + persona colada) para localizar root cause e blast radius antes de qualquer fix; o mapa vai para `2-plan/scout-map.md` e passa por `morph-spec scout-check` antes do brief (reprovado → re-despacha uma vez).
|
|
21
21
|
3. **Hotfix brief:** escreve `0-proposal/proposal.md` curto (sintoma/root cause/blast radius/plano do fix) e `2-plan/tasks.json` mínimo (T1 fix, T2 verify/regressão).
|
|
22
22
|
4. **Fix cirúrgico:** implementa a mudança mínima que resolve o sintoma — sem refatoração, sem hardening fora de escopo.
|
|
23
23
|
5. **Test loop:** `morph-spec verify {feature-name} {task} --json` focado no blast radius até verde; evidência real capturada no `recap.md`.
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
---
|
|
2
|
-
description: Inicia uma nova feature MORPH-SPEC. Roda morph-brainstorming para entender negócio + escanear stack, depois morph-plan para produzir spec
|
|
2
|
+
description: Inicia uma nova feature MORPH-SPEC. Roda morph-brainstorming para entender negócio + escanear stack, depois morph-plan para produzir use cases, spec e tasks. Pausa nos Gates 1 e 2.
|
|
3
3
|
argument-hint: <feature-name>
|
|
4
4
|
allowed-tools: Read, Write, Edit, Bash, Glob, Grep, Agent, AskUserQuestion, Skill
|
|
5
5
|
---
|
|
@@ -33,7 +33,7 @@ Conduz a feature do request inicial até o Gate 2 (plano aprovado), sem interven
|
|
|
33
33
|
|
|
34
34
|
4. **Após Gate 1, invocar `morph-plan`** (skill em `.claude/skills/morph-plan/`):
|
|
35
35
|
- Lê `proposal.md`.
|
|
36
|
-
- Produz `spec.md
|
|
36
|
+
- Produz use cases, `spec.md` e `tasks.json` em `.morph/features/{feature-name}/2-plan/`.
|
|
37
37
|
- Apresenta o **Gate 2** com template fixo (ver SKILL.md passo 5).
|
|
38
38
|
|
|
39
39
|
5. **Aguardar aprovação do Gate 2.**
|