@polymorphism-tech/morph-spec 8.43.0 → 8.45.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (203) hide show
  1. package/CLAUDE.md +16 -13
  2. package/README.md +10 -10
  3. package/bin/morph-spec.js +10 -13
  4. package/bin/validate.js +379 -379
  5. package/claude-plugin.json +1 -1
  6. package/docs/CHEATSHEET.md +2 -4
  7. package/docs/QUICKSTART.md +6 -6
  8. package/framework/CLAUDE.md +6 -8
  9. package/framework/MORPH.md +39 -45
  10. package/framework/agents.json +8 -9
  11. package/framework/commands/morph-apply.md +1 -3
  12. package/framework/commands/morph-hotfix.md +1 -1
  13. package/framework/commands/morph-proposal.md +2 -2
  14. package/framework/docs/CLI.md +22 -17
  15. package/framework/evals/review-checklist.md +90 -0
  16. package/framework/evals/trace-schema.md +2 -12
  17. package/framework/hooks/README.md +2 -3
  18. package/framework/hooks/claude-code/core/heavy-gate.js +1 -1
  19. package/framework/hooks/claude-code/core/protect-spec-files.js +2 -2
  20. package/framework/hooks/claude-code/core/telemetry-log.js +2 -2
  21. package/framework/hooks/claude-code/core/trace-autogen.js +1 -22
  22. package/framework/hooks/claude-code/core/validate-completion.js +3 -56
  23. package/framework/hooks/claude-code/core/worktree-env-inject.js +1 -4
  24. package/framework/hooks/claude-code/statusline.sh +11 -11
  25. package/framework/hooks/git/commit-msg/conventional-commits.sh +33 -33
  26. package/framework/hooks/git/pre-commit/agents.sh +25 -25
  27. package/framework/hooks/git/pre-commit/orchestrator.sh +64 -64
  28. package/framework/hooks/git/pre-commit/specs.sh +50 -50
  29. package/framework/hooks/git/pre-push/run-tests.sh +44 -44
  30. package/framework/hooks/shared/build-check.js +1 -1
  31. package/framework/hooks/shared/comment-scanner.js +1 -1
  32. package/framework/hooks/shared/phase-utils.js +0 -5
  33. package/framework/hooks/shared/stdin-reader.js +26 -26
  34. package/framework/phases.json +4 -6
  35. package/framework/rubrics/backend.json +1 -1
  36. package/framework/rubrics/default.json +1 -1
  37. package/framework/rubrics/frontend.json +1 -1
  38. package/framework/rules/ai-agents-standards.md +1 -0
  39. package/framework/rules/morph-workflow.md +6 -6
  40. package/framework/schemas/feature.schema.json +2 -28
  41. package/framework/schemas/tasks.schema.json +6 -2
  42. package/framework/skills/README.md +1 -2
  43. package/framework/skills/core/create-umbraco-lp/SKILL.md +1 -1
  44. package/framework/skills/core/migrate-lp-to-umbraco/SKILL.md +1 -1
  45. package/framework/skills/core/morph-apply/SKILL.md +145 -246
  46. package/framework/skills/core/morph-brainstorming/SKILL.md +1 -1
  47. package/framework/skills/core/morph-hotfix/SKILL.md +5 -3
  48. package/framework/skills/core/morph-implement/SKILL.md +101 -201
  49. package/framework/skills/core/morph-machine/SKILL.md +3 -3
  50. package/framework/skills/core/morph-media/SKILL.md +1 -1
  51. package/framework/skills/core/morph-plan/SKILL.md +171 -287
  52. package/framework/skills/core/morph-proposal/SKILL.md +4 -5
  53. package/framework/skills/core/morph-review/SKILL.md +109 -430
  54. package/framework/skills/core/morph-stack-scan/SKILL.md +1 -1
  55. package/framework/skills/core/morph-standards/SKILL.md +2 -2
  56. package/framework/skills/core/morph-uiux/SKILL.md +2 -3
  57. package/framework/standards/STANDARDS.json +54 -10
  58. package/framework/standards/ai-agents/agent-archetypes.md +1 -1
  59. package/framework/standards/ai-agents/agent-session.md +1 -1
  60. package/framework/standards/ai-agents/agent-spec.md +1 -1
  61. package/framework/standards/ai-agents/batching.md +1 -1
  62. package/framework/standards/ai-agents/context-providers.md +1 -1
  63. package/framework/standards/ai-agents/conversational-agent-with-phases.md +1 -1
  64. package/framework/standards/ai-agents/cost-and-budget.md +1 -1
  65. package/framework/standards/ai-agents/durable-workflows-hitl.md +1 -1
  66. package/framework/standards/ai-agents/guardrails.md +1 -1
  67. package/framework/standards/ai-agents/llm-runtime-defaults.md +1 -1
  68. package/framework/standards/ai-agents/mcp-server.md +1 -1
  69. package/framework/standards/ai-agents/mcp-tools.md +1 -1
  70. package/framework/standards/ai-agents/media-pipeline.md +1 -1
  71. package/framework/standards/ai-agents/media-video.md +1 -1
  72. package/framework/standards/ai-agents/middleware-patterns.md +1 -1
  73. package/framework/standards/ai-agents/modalities-image-gen.md +1 -1
  74. package/framework/standards/ai-agents/modalities-speech-to-text.md +1 -1
  75. package/framework/standards/ai-agents/modalities-text-to-speech.md +1 -1
  76. package/framework/standards/ai-agents/modalities-vision.md +1 -1
  77. package/framework/standards/ai-agents/multi-agent-patterns.md +1 -1
  78. package/framework/standards/ai-agents/observability-patterns.md +3 -3
  79. package/framework/standards/ai-agents/production.md +2 -2
  80. package/framework/standards/ai-agents/prompt-sources.md +1 -1
  81. package/framework/standards/ai-agents/providers/model-registry.md +1 -1
  82. package/framework/standards/ai-agents/rag-custom-pgvector.md +1 -1
  83. package/framework/standards/ai-agents/service-tier-flex.md +1 -1
  84. package/framework/standards/ai-agents/setup.md +1 -1
  85. package/framework/standards/ai-agents/structured-output.md +1 -1
  86. package/framework/standards/ai-agents/sweet-spot.md +1 -1
  87. package/framework/standards/ai-agents/testing-ai.md +1 -1
  88. package/framework/standards/ai-agents/tool-adapters.md +226 -0
  89. package/framework/standards/ai-agents/vector-data-extensions.md +1 -1
  90. package/framework/standards/ai-agents/workflows.md +1 -1
  91. package/framework/standards/infrastructure/docker/local-compose-isolation.md +11 -1
  92. package/framework/templates/CLAUDE.md.core.template +1 -1
  93. package/framework/templates/IDE-SNIPPETS.md +262 -262
  94. package/framework/templates/README.md +1 -1
  95. package/framework/templates/REGISTRY.json +0 -81
  96. package/framework/templates/code/dotnet/abstractions/api-endpoint.cs +7 -7
  97. package/framework/templates/code/dotnet/feature/endpoint.cs.hbs +21 -21
  98. package/framework/templates/code/dotnet/feature/request.cs.hbs +4 -4
  99. package/framework/templates/code/dotnet/feature/response.cs.hbs +4 -4
  100. package/framework/templates/code/sql/ai-agents/pgvector-embeddings-migration.sql.template +91 -91
  101. package/framework/templates/docs/spec.md +19 -205
  102. package/framework/templates/docs/ui-components.md +52 -52
  103. package/framework/templates/docs/ui-design-system.md +76 -76
  104. package/framework/templates/docs/ui-flows.md +167 -167
  105. package/framework/templates/frontend/nextjs/client-component.tsx.hbs +26 -26
  106. package/framework/templates/frontend/nextjs/feature-form.tsx.hbs +56 -56
  107. package/framework/templates/frontend/nextjs/tsconfig.json.hbs +26 -26
  108. package/framework/templates/infrastructure/docker/Dockerfile.template +58 -58
  109. package/framework/templates/infrastructure/docker/dockerfile-api.dockerfile +38 -38
  110. package/framework/templates/infrastructure/docker/dockerfile-web.dockerfile +48 -48
  111. package/framework/templates/infrastructure/github/README.md +56 -56
  112. package/framework/templates/infrastructure/github/actions/docker-build-push/action.yml.hbs +45 -45
  113. package/framework/templates/infrastructure/github/actions/health-check/action.yml.hbs +27 -27
  114. package/framework/templates/infrastructure/github/workflows/docker-build-push.yml.hbs +59 -59
  115. package/framework/templates/infrastructure/github/workflows/dotnet-build.yml.hbs +39 -39
  116. package/framework/templates/meta-prompts/fusion/fusion-agent.md +76 -76
  117. package/framework/templates/meta-prompts/fusion/fusion-aggregator.md +100 -100
  118. package/framework/templates/meta-prompts/validators/pre-commit-validator.md +95 -95
  119. package/framework/templates/state.template.json +17 -17
  120. package/framework/templates/ui/design-system.css +226 -226
  121. package/package.json +2 -2
  122. package/src/commands/e2e/e2e.js +1 -1
  123. package/src/commands/project/heavy.js +1 -1
  124. package/src/commands/project/status.js +3 -3
  125. package/src/commands/project/worktree.js +34 -16
  126. package/src/commands/state/approve.js +9 -50
  127. package/src/commands/state/finish.js +4 -0
  128. package/src/commands/state/gate-check.js +18 -107
  129. package/src/commands/state/gate-decision.js +1 -1
  130. package/src/commands/state/report-check.js +42 -17
  131. package/src/commands/validation/mutate.js +1 -1
  132. package/src/commands/validation/scout-check.js +28 -0
  133. package/src/commands/validation/validate-feature.js +5 -32
  134. package/src/commands/validation/verify.js +16 -25
  135. package/src/core/paths/output-schema.js +0 -2
  136. package/src/core/state/state-manager.js +1 -2
  137. package/src/core/templates/template-renderer.js +477 -477
  138. package/src/dashboard/app/lib/format.js +5 -0
  139. package/src/dashboard/app/main.jsx +13 -13
  140. package/src/dashboard/app/pages/FeatureDetail.jsx +16 -22
  141. package/src/dashboard/app/pages/Features.jsx +7 -7
  142. package/src/dashboard/app/pages/PhasePipeline.jsx +1 -1
  143. package/src/dashboard/app/pages/Rubrics.jsx +7 -11
  144. package/src/dashboard/scanner/docs-scanner.js +1 -2
  145. package/src/dashboard/scanner/features-scanner.js +3 -4
  146. package/src/dashboard/scanner/rubrics-scanner.js +12 -12
  147. package/src/dashboard/vite.config.js +24 -24
  148. package/src/lib/agents/output-collector.js +0 -1
  149. package/src/lib/detectors/design-system-detector.js +188 -188
  150. package/src/lib/e2e/compose-env.js +5 -2
  151. package/src/lib/evaluator-report.js +52 -334
  152. package/src/lib/generators/design-system-generator.js +508 -508
  153. package/src/lib/generators/handoff-generator.js +4 -5
  154. package/src/lib/git/evidence-staleness.js +39 -0
  155. package/src/lib/installers/memory-installer.js +2 -2
  156. package/src/lib/mutation/manifest.js +8 -2
  157. package/src/lib/mutation/report.js +5 -3
  158. package/src/lib/mutation/runner.js +9 -7
  159. package/src/lib/risk-detector.js +63 -125
  160. package/src/lib/scout/scout-check.js +293 -0
  161. package/src/lib/tasks/eval-node.js +4 -34
  162. package/src/lib/tasks/task-classifier.js +30 -30
  163. package/src/lib/tasks/task-parser.js +209 -209
  164. package/src/lib/tasks/tasks-json-parser.js +7 -5
  165. package/src/lib/tasks/test-nodes.js +1 -1
  166. package/src/lib/tasks/test-runner.js +1 -1
  167. package/src/lib/validators/contracts/contract-compliance-validator.js +4 -42
  168. package/src/lib/validators/css/css-validator.js +340 -340
  169. package/src/lib/validators/reuse/reuse-validator.js +6 -8
  170. package/src/lib/validators/verify-runner.js +1 -1
  171. package/src/lib/worktree/env-allocator.js +35 -5
  172. package/src/scripts/setup-infra.js +1 -1
  173. package/src/utils/agent-id-mapper.js +11 -11
  174. package/src/utils/agents-installer.js +5 -9
  175. package/src/utils/claude-settings-manager.js +300 -300
  176. package/src/utils/hooks-installer.js +3 -10
  177. package/src/utils/skills-installer.js +1 -1
  178. package/framework/evals/proof-rubrics/README.md +0 -76
  179. package/framework/evals/proof-rubrics/eval-de-modelo.md +0 -80
  180. package/framework/evals/proof-rubrics/fiacao.md +0 -54
  181. package/framework/evals/proof-rubrics/guard-cego.md +0 -52
  182. package/framework/evals/proof-rubrics/media-claims.md +0 -109
  183. package/framework/evals/proof-rubrics/mutation-proof.md +0 -107
  184. package/framework/evals/proof-rubrics/observabilidade-genai.md +0 -119
  185. package/framework/evals/proof-rubrics/verde-nao-e-coberto.md +0 -48
  186. package/framework/evals/rubrics/README.md +0 -45
  187. package/framework/evals/rubrics/architecture.md +0 -103
  188. package/framework/evals/rubrics/code-quality.md +0 -98
  189. package/framework/evals/rubrics/condensed.md +0 -57
  190. package/framework/evals/rubrics/contracts.md +0 -67
  191. package/framework/evals/rubrics/test-coverage.md +0 -99
  192. package/framework/evals/scenarios/dotnet-crud.yaml +0 -42
  193. package/framework/evals/scenarios/nextjs-auth.yaml +0 -38
  194. package/framework/evals/suites/standard.yaml +0 -5
  195. package/framework/hooks/claude-code/core/post-edit-typecheck.js +0 -127
  196. package/framework/skills/core/morph-eval/SKILL.md +0 -64
  197. package/framework/templates/.idea/morph-templates.xml +0 -92
  198. package/framework/templates/.vscode/morph-templates.code-snippets +0 -186
  199. package/framework/templates/docs/clarifications.md +0 -253
  200. package/framework/templates/docs/onboarding.md +0 -122
  201. package/framework/templates/docs/schema-analysis.md +0 -119
  202. package/framework/templates/docs/user-stories.md +0 -34
  203. package/src/commands/state/score.js +0 -147
@@ -1,80 +1,67 @@
1
1
  ---
2
2
  name: morph-plan
3
- description: Guia a produção dos artefatos de planejamento de uma feature (use cases, spec.md, mandate.md, tasks.json) e apresenta o Gate 2 trust-aware.
3
+ description: Guia a produção dos artefatos de planejamento de uma feature (use cases, spec.md, tasks.json) e apresenta o Gate 2 trust-aware.
4
4
  version: core
5
5
  when-to-invoke: ao iniciar a fase plan de uma feature, após o Gate 1 (proposal aprovado)
6
6
  user-invokable: true
7
- cliVersion: "8.43.0"
7
+ cliVersion: "8.45.0"
8
8
  ---
9
9
 
10
10
  # morph-plan
11
11
 
12
12
  ## Objetivo
13
13
 
14
- Produzir os **use cases**, `spec.md`, `mandate.md` e `tasks.json` com qualidade suficiente para abrir o Gate 2.
15
- Os use cases definem o **comportamento**; os três artefatos seguintes definem o como e o quanto da feature.
16
-
17
- A ordem importa e não é negociável: **comportamento antes de solução técnica**. Um `spec.md` escrito antes dos use cases resolve um problema que ainda não foi enunciado.
14
+ Produzir os **use cases**, o `spec.md` e o `tasks.json` com qualidade para abrir o Gate 2. Os use
15
+ cases definem o **comportamento**; o spec diz **como**; as tasks dizem **em que ordem** e **quando
16
+ cada uma está pronta**. Comportamento antes de solução técnica — sempre nessa ordem.
18
17
 
19
18
  ## Quando invocar
20
19
 
21
- Ao iniciar a fase plan — após o `proposal.md` ser aprovado e antes de qualquer implementação. Normalmente invocada pela skill orquestradora `morph-proposal`.
20
+ Fase plan, depois do Gate 1. Normalmente chamada pela `morph-proposal`.
22
21
 
23
22
  ## O que fazer
24
23
 
25
- 1. **Garanta que `proposal.md` e `stack-scan.md` estão no seu contexto antes de planejar.** Se não tem o conteúdo atual em contexto (sessão fresca, ou conteúdo possivelmente desatualizado), **use a tool Read para carregá-los** — não confie em cache de turnos anteriores. Na dúvida, Read. `.morph/features/{feature}/0-proposal/proposal.md` (problema, escopo, riscos — o comportamento é destilado aqui no passo 2, não vem pronto do proposal) e `.morph/features/{feature}/0-proposal/stack-scan.md` (contexto técnico detectado: greenfield vs brownfield, stack atual, drift). Em brownfield, o stack-scan informa decisões de spec/mandate — não invente padrões que conflitam com o detectado.
26
-
27
- **E `.morph/features/{feature}/1-design/*.md`, quando o diretório existe** — os artefatos da fase
28
- uiux (wireframes, decisões de layout, componentes propostos). Leia TODOS os `.md` de lá: eles
29
- descrevem comportamento de interface que o `proposal.md` não carrega, e um plano que os ignora
30
- dimensiona a feature pela metade. **Diretório ausente NÃO é erro** — a fase uiux é opcional
31
- (MORPH.md §2.1) e a maioria das features não a toma; nesse caso não há passo nenhum a rodar e o
32
- plano segue idêntico ao de hoje.
24
+ 1. **Garanta que `proposal.md` e `stack-scan.md` estão no seu contexto antes de planejar** (Read se
25
+ a sessão é fresca). Em brownfield, o stack-scan manda: não invente padrão que conflita com o
26
+ detectado.
33
27
 
34
- 1b. **Scout — mapa do território antes de planejar (opcional, mas o default em feature grande ou brownfield).** É o call-site do "scout opcional antes do plan" que a MORPH.md promete. Dispare quando a feature toca área que você não tem em contexto, ou quando o `stack-scan.md` acusou brownfield com desvios.
28
+ **E `.morph/features/{feature}/1-design/*.md`, quando o diretório existe** — leia todos os `.md`:
29
+ descrevem comportamento de interface que o proposal não carrega. **Diretório ausente NÃO é erro**
30
+ — a fase uiux é opcional (MORPH.md §2.1) e o plano segue igual.
35
31
 
32
+ 1b. **Scout — mapa do território (default em feature grande ou brownfield).**
33
+ Despache `subagent_type: "morph-scout"`: os arquivos que a feature vai tocar, o blast radius dos símbolos centrais e o que
34
+ quebra junto. O scout começa por `morph-spec graph affected|explain` e **cai para grep sozinho
35
+ quando não há grafo**. Não registrado: `general-purpose` com o campo `persona` do `scout`.
36
+ Grave a resposta em `2-plan/scout-map.md` e audite:
36
37
  ```
37
- subagent_type: "morph-scout"
38
- ```
39
-
40
- Peça: os arquivos que a feature vai tocar, o blast radius dos símbolos centrais dessa área e o que quebra junto. O scout começa por `morph-spec graph affected|explain` e **cai para grep sozinho quando não há grafo** — nunca trate a ausência de grafo como impedimento para planejar.
41
-
42
- **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 (Read em `.morph/framework/agents.json`), registrando o fallback no `decisions.md`.
43
-
44
- Pular o scout é aceitável em feature pequena dentro de domínio já carregado — nesse caso **registre a decisão em uma linha no `decisions.md`**.
45
-
46
- 1c. **Mapa de reuso — o que desta feature JÁ EXISTE no codebase.** Antes de destilar os use cases, responda por conceito: *isto já está implementado?* É o passo que falta hoje e cujo efeito é medido — 17 duplicações intra-feature no ProspectPRO, `SimpleBuilding` redefinido em cinco arquivos da MESMA pasta, um deles já sem um campo. Sem este passo, quem implementa não tem como saber, e o framework nunca pergunta.
47
-
48
- **Insumos, nesta ordem:**
49
- 0. **O estado do grafo** — `morph-spec graph status --json`. Stale com `refresh.running: true`: espere o refresh terminar (ele roda em background, só na raiz) ou trate cada "não existe" como possivelmente velho; stale sem refresh em andamento — e sempre numa worktree (`refresh.auto: false`), cujo grafo é o semeado da raiz e não anda sozinho: `morph-spec graph refresh`. O resultado vai para a linha de método do mapa.
50
- 1. **O grafo** — para cada conceito central (entidade, DTO, componente, hook, serviço, helper — e o dublê ou a fixture de teste, que também estão no grafo, com `test: true`) que a feature vai introduzir: `morph-spec graph explain <nome-candidato> --json` (existe? onde?) e `morph-spec graph affected <conceito> --uses-only --json` (quem usa de verdade, sem contar quem só implementa). **O mapa nasce dessa saída**, não de memória nem de grep por conta própria.
51
- 2. **O inventário do projeto** — `.morph/context/README.md` (gerado por `morph-spec context refresh`): entidades, endpoints com método e rota, páginas e **componentes com path**. É a granularidade de *conceito* que o grafo, que casa por símbolo, não dá. **Este passo é o consumidor declarado desse arquivo** — se ele não existir, rode `morph-spec context refresh` ou siga sem ele.
52
- 3. **Sem grafo** (`no-graph`, projeto sem Python), ou o grafo não respondeu (`not-found` num grafo stale, `ambiguous` sem opção que sirva) — **caia para `grep -rn "<nome-candidato>"` no diretório de código e siga**; a ausência de grafo nunca bloqueia o plano (ADR-002). Registre a queda no `decisions.md`.
53
-
54
- **Produza `.morph/features/{feature}/2-plan/reuse-map.md`** — artefato, não prosa solta, com a saída do grafo **citada**:
55
-
56
- ```markdown
57
- Método: `morph-spec graph status --json` → fresh, built_at_commit 1a2b3c4d = HEAD
58
-
59
- | Conceito | Já existe? | Onde | Fonte | Decisão |
60
- |---|---|---|---|---|
61
- | SimpleBuilding | SIM (5×) | features/roulette/types/roulette.types.ts:L12 | `graph explain SimpleBuilding` → ambiguous, 5 opções | REUSAR |
62
- | FilterValues | SIM (ambíguo) | dashboard + leads + store | `graph affected FilterValues --uses-only` → 7 consumidores | ESTENDER o de dashboard |
63
- | RouletteScore | NÃO | — | `graph explain RouletteScore` → not-found; `grep -rn RouletteScore` → 0 | CRIAR — nenhum tipo cobre pontuação por sorteio |
38
+ morph-spec scout-check .morph/features/{feature}/2-plan/scout-map.md --json
64
39
  ```
65
-
66
- **A coluna Fonte cita o comando e o que ele devolveu** (`ok` com `arquivo:linha`, `not-found`, `ambiguous` com as opções) — ou o `grep` da queda, com a contagem. Sem grafo, a linha de método diz isso (`sem grafo — grep`). Uma linha sem Fonte não vale, pela mesma razão que um CRIAR sem justificativa: quem lê o mapa no Gate 2 precisa saber se o "não existe" veio de uma consulta ou de uma suposição.
67
-
68
- **`CRIAR` exige justificativa em uma linha, na própria célula** — a mesma forma que `morph-uiux` §"Consistência" já impõe para token de design (*"um token novo precisa de justificativa: o existente não cobre o caso"*). Sem a justificativa, o veredito não vale.
69
-
70
- **Distinga "extrair para shared" de "importar de outra feature".** Reuso não é desculpa para acoplar slices: se o conceito é de duas features, o alvo é um módulo comum, não um import cruzado — a rubrica `architecture` penaliza dependência cross-feature e continua valendo.
71
-
72
- O veredito viaja para o implementador pelo campo `reuse` de cada task (passo 5). Quem cobra o resultado é o `morph-spec verify`: o validador `reuse` acusa símbolo novo cujo nome já existe no grafo, na mesma linguagem — **intra-feature reprova**, cross-feature avisa, e um `CRIAR` declarado no plano rebaixa o achado a aviso.
73
-
74
- 1d. **O que esta feature supera no acervo.** Insumos: a seção `Conflitos com o acervo` do `proposal.md`, o acervo `.morph/specs/usecases/` e o índice de ADRs ativos `.morph/specs/adrs/` (um arquivo por ADR). UC com `status: superseded` não é o comportamento vigente — o `superseded_by` é, e `scope` diz onde o antigo ainda vale; decisão vigente é a do índice, e os `decisions.md` arquivados são história, não instrução.
75
-
76
- Cada conflito com UC ou ADR decidido pelo pedido novo vira duas coisas: uma linha na seção de revogação do `spec.md` (passo 3) e um ADR no `decisions.md` (conflito com `.morph/context/*.md` vira a reescrita do corpo daquele documento no encerramento — `morph-apply` §6). ADR cuja regra vale **além desta feature** leva `**Alcance:** projeto` — é por essa linha que o `finish` o copia para o índice (o resto fica só no `decisions.md` da feature):
77
-
40
+ Exit ≠ 0 → o mapa é descartado; re-despache **uma** vez com as `failures` coladas. Segunda
41
+ reprovação: faça você o grep dos fatos que o plano precisa. Mapa aprovado prova que as citações
42
+ existem, não que a conclusão está certa — confira com grep próprio o Inferido que muda o plano.
43
+ Pular o scout em feature pequena no domínio carregado: uma linha em `decisions.md`.
44
+
45
+ 1c. **Reuso — o que desta feature JÁ EXISTE.** Para cada conceito central que a feature introduz
46
+ (entidade, DTO, componente, hook, serviço, helper, dublê de teste): `morph-spec graph explain
47
+ <nome> --json` (existe? onde?) e `morph-spec graph affected <conceito> --uses-only --json` (quem
48
+ usa de verdade). Antes, `morph-spec graph status --json`: stale numa worktree, ou sem refresh em
49
+ andamento, `morph-spec graph refresh`. O inventário `.morph/context/README.md` (`morph-spec context
50
+ refresh`) dá componentes e endpoints por path. **Sem grafo** (`no-graph`, `not-found` num grafo
51
+ stale), caia para `grep -rn "<nome>"` e siga — a ausência de grafo nunca bloqueia.
52
+
53
+ O veredito vai direto para a task que realiza o conceito (passo 5b): `REUSAR`, `ESTENDER` ou
54
+ `CRIAR`. **`CRIAR` exige `why`** — uma linha com a consulta que respondeu "não existe" (`graph
55
+ explain X → not-found; grep -rn X → 0`). Conceito de duas features vai para um módulo comum, nunca
56
+ import cruzado entre slices. O validador `reuse` do `verify` cobra o resultado: símbolo novo
57
+ homônimo de um existente reprova na mesma feature e avisa entre features; `CRIAR` declarado no
58
+ plano rebaixa o achado a aviso.
59
+
60
+ 1d. **O que esta feature supera no acervo.** Insumos: `Conflitos com o acervo` do `proposal.md`,
61
+ `.morph/specs/usecases/` e o índice `.morph/specs/adrs/`. UC `status: superseded` não é o
62
+ comportamento vigente — o `superseded_by` é. Cada conflito decidido vira uma linha na seção de
63
+ revogação do `spec.md` (passo 3) e um ADR em `decisions.md`; ADR que vale além desta feature leva
64
+ `**Alcance:** projeto` (é por ela que o `finish` o copia para o índice):
78
65
  ```markdown
79
66
  ## ADR-{nnn}: {a regra que vale no projeto}
80
67
 
@@ -101,66 +88,53 @@ Ao iniciar a fase plan — após o `proposal.md` ser aprovado e antes de qualque
101
88
  ## Cenário principal
102
89
  1. Visitante acessa a listagem de veterinários
103
90
  2. Sistema retorna os veterinários ordenados por sobrenome
104
- 3. Sistema exibe, para cada um, nome e especialidades
105
91
 
106
92
  ## Pós-condições
107
93
  - **P1** — A resposta contém todos os veterinários não arquivados
108
94
  - **P2** — Cada veterinário traz suas especialidades em lista, nunca string concatenada
109
- - **P3** — A ordenação por sobrenome é estável para nomes repetidos
110
95
 
111
96
  ## Fluxos alternativos (opcional)
112
97
  - **A1** — Nenhum veterinário cadastrado → sistema exibe estado vazio
113
98
  ```
114
99
 
115
- **A regra que sustenta a camada inteira: pós-condição precisa ser observável em teste.** "O sistema fica consistente" não passa. "A resposta contém todos os veterinários não arquivados" passa. Antes de escrever cada pós-condição, pergunte: *que asserção eu escreveria para verificar isto?* Se não há resposta, a pós-condição está mal formulada — reescreva ou descarte. Sem esse filtro a camada vira prosa e não chega ao `doneCriteria`.
100
+ **A regra que sustenta a camada inteira: pós-condição precisa ser observável em teste.** Pergunte:
101
+ *que asserção eu escreveria para verificar isto?* Sem resposta, reescreva ou descarte.
116
102
 
117
103
  **Artefato não é comportamento.** Pós-condição que cita arquivo, pasta, `grep`, "contém a
118
- string" ou "o binário" descreve o TEXTO do repositório, não o que o sistema faz — e chega
119
- literal ao `doneCriteria`, onde vira um teste que lê arquivo. Duas saídas, nesta ordem:
120
- 1. **Reescreva como efeito observável em runtime** — o que o sistema faz de diferente quando
121
- o texto está errado ("publicar tenant com `criterion_overrides` é recusado, nomeando a
122
- chave", não "nenhum arquivo em `tenants/**` contém a chave").
123
- 2. **Se o artefato É o entregável** (standard, faxina sem efeito de runtime), justifique
124
- **na linha logo abaixo** da pós-condição:
104
+ string" ou "o binário" descreve o texto do repositório, não o que o sistema faz. Primeiro tente
105
+ o efeito observável em runtime ("publicar tenant com `criterion_overrides` é recusado, nomeando a
106
+ chave"). Se o artefato É o entregável, justifique **na linha logo abaixo**:
125
107
 
126
108
  ```markdown
127
109
  - **P4** — Nenhum arquivo em `tenants/**` contém a chave `criterion_overrides`
128
110
  > [!note] Por que artefato: a chave saiu do contrato; nenhum leitor de runtime a consulta.
129
111
  ```
130
112
 
131
- Nunca na mesma linha: o texto da pós-condição viaja literal ao `doneCriteria` e a
132
- justificativa iria junto. Task sem `usecase` justifica no próprio `doneCriteria`
133
- (`… — Por que artefato: …`). O `morph-spec dag` aponta o vocabulário sem justificativa.
134
-
135
- Pós-condição sobre o que um **modelo** responde ("o texto pode nomear a pior campanha") é
136
- observável — em runtime, nunca no texto do prompt. O passo 5 diz que forma a task toma.
137
-
138
- **Identificador sequencial, reservado — nunca leia o disco à mão.** Rode `morph-spec usecase reserve --count {n} --feature {feature}` (`n` = quantos UCs esta feature vai criar; pode reservar de novo se descobrir mais no meio do plano). Um scan manual do maior `UC-{nn}` só enxerga a ÁRVORE CORRENTE — cada worktree tem a própria cópia de `.morph/features/`, então dois worktrees planejando ao mesmo tempo calculam o mesmo maior número e mintam o MESMO `UC-{nn}` sem saber um do outro; na promoção do `finish`, o segundo a fechar sobrescreve por ID e **apaga o use case do primeiro** — já causou perda de dados em produção. `usecase reserve` aloca atomicamente a partir de um contador compartilhado em `<git-common-dir>/morph-spec/uc-registry.json` (visível a todo worktree do repo, mesmo mecanismo do `claim`/fleet), semeado do maior número já visto no acervo + nas features da árvore corrente + no próprio contador — nunca regride. Fora de um repositório git, cai para o scan local antigo e avisa que o paralelismo entre worktrees não está protegido.
113
+ Nunca na mesma linha: a pós-condição viaja literal ao `doneCriteria`. Task sem `usecase`
114
+ justifica no próprio `doneCriteria` (`… — Por que artefato: …`). Pós-condição sobre o que um
115
+ **modelo** responde é observável em runtime, nunca no texto do prompt (passo 5).
139
116
 
140
- **Seções obrigatórias:** `Pré-condições` (o que já é verdade antes), `Cenário principal` (o caminho feliz, numerado, **curto** — não é o lugar para exaustão de casos) e `Pós-condições` (**P1**, **P2**… — o que passa a ser verdade, cada uma testável; é a seção que viaja **literal** ao `doneCriteria`, ver abaixo).
117
+ **Numeração:** `morph-spec usecase reserve --count {n} --feature {feature}` — nunca o maior
118
+ `UC-{nn}` do disco: cada worktree vê só a sua cópia, e dois planos paralelos mintariam o mesmo id.
141
119
 
142
- **Seções opcionais** — inclua só quando o comportamento não-trivial exigir, não por padrão: `Fluxos alternativos` (**A1**, **A2**… — um desvio do caminho feliz que precisa de pós-condição própria; edge case de *comportamento* mora aqui, edge case *técnico* fica no `spec.md`) e `Delta de domínio` (**só quando a feature muda o modelo**: campo novo, relação nova, invariante nova — sem delta, omita a seção em vez de escrever "nenhum"). Nenhuma das duas é consumida por `dag`/`finish` — existem para o leitor humano quando o caso pede, não para preencher o template.
143
-
144
- **Quando é obrigatório** (ver MORPH.md §2.1 para o roteamento por tipo):
120
+ **Seções:** obrigatórias `Pré-condições`, `Cenário principal` (curto) e `Pós-condições` (**P1**,
121
+ **P2**…). Opcionais, só quando pedem: `Fluxos alternativos` (**A1**…) e `Delta de domínio`.
145
122
 
146
123
  | Tipo | Use case |
147
124
  |---|---|
148
- | `feature` | Obrigatório quando há comportamento observável. Feature puramente técnica (refactor, infra, migração) dispensa — **registre a dispensa em `decisions.md`**. |
149
- | `bug` | Não cria novo, não reserva número novo: **copie** o `UC-{nn}-*.md` do acervo para `2-plan/usecases/` **mantendo o nome do arquivo publicado** (mesmo slug) e **corrija ou adicione a pós-condição** lá — o bug é a pós-condição que faltava, não a identidade do UC. É esse mesmo nome, inalterado, que faz o `finish` reconhecer a correção como o MESMO UC (abaixo) em vez de uma colisão. UC `superseded` com `scope`: a correção vale só para a parte que ainda vale, e a cópia leva `status`/`superseded_by`/`scope` como estão — a promoção os preserva. |
150
- | `chore` | Nenhum (já pula a fase plan por política). |
151
- | `hotfix` | Não bloqueia. Referencia se existir; o pós-mortem pode virar pós-condição numa feature posterior. |
152
-
153
- **Nunca edite `.morph/specs/usecases/` à mão.** A única via de escrita no acervo é a promoção do `finish`, que lê **só** de `2-plan/usecases/`: é ela que carimba `status: implemented`, sobrescreve por ID (mesmo com slug novo) e leva o arquivo no commit de arquivamento. Editar o acervo direto pula os três e cria uma segunda verdade fora do mecanismo. Mudar um UC existente = copiar para o `2-plan/usecases/` da feature, corrigir lá, e deixar o `finish` sobrescrever. Aposentar um UC (todo ou em parte) também não é edição à mão: é a seção de revogação do `spec.md` (passo 3), que o `finish` aplica.
154
-
155
- **Backstop de colisão na promoção.** Se, apesar da reserva, duas features chegarem à promoção com o MESMO `UC-{nn}` e slugs diferentes — registro de reserva aponta para uma feature diferente da que já está no acervo —, o `finish`/`archive` **recusa promover esse UC específico** (nunca recusa fechar a feature: fail-open, só aquele use case fica de fora) e imprime onde o arquivo ficou e como recuperar. Se acontecer: renumere com `usecase reserve` e promova manualmente, ou — se for mesmo o caso `bug` — confira se o slug bate com o publicado.
125
+ | `feature` | Obrigatório com comportamento observável; feature puramente técnica dispensa (registre em `decisions.md`). |
126
+ | `bug` | Copie o `UC-{nn}-*.md` do acervo para `2-plan/usecases/` **com o mesmo nome de arquivo** e corrija ou adicione a pós-condição — não reserve número novo. |
127
+ | `chore` | Nenhum. |
128
+ | `hotfix` | Referencia se existir. |
156
129
 
157
- O use case fica **editável depois do Gate 2**, por design — é o que permite mudar o comportamento e re-rodar `implement`. A trilha de auditoria fica no git.
130
+ **Nunca edite `.morph/specs/usecases/` à mão** — a única escrita no acervo é a promoção do
131
+ `finish`, que lê de `2-plan/usecases/`. O use case segue editável depois do Gate 2.
158
132
 
159
- 3. Produza `spec.md` em `.morph/features/{feature}/2-plan/`:
160
- - Arquitetura da solução: quais componentes, como se conectam, fluxos de dados principais.
161
- - Edge cases **técnicos** e como serão tratados (os de comportamento estão nos fluxos alternativos dos use cases).
162
- - Integrações externas e contratos esperados.
163
- - **UCs e ADRs que esta feature altera ou revoga** — seção obrigatória, com este título: `Nenhum.` quando nada muda; senão, a tabela (colunas posicionais — o cabeçalho é livre):
133
+ 3. Produza `spec.md` em `2-plan/`:
134
+ - Arquitetura: componentes, como se conectam, fluxos de dados. Edge cases **técnicos** (os de
135
+ comportamento estão nos use cases) e integrações externas. Não repita o comportamento.
136
+ - **UCs e ADRs que esta feature altera ou revoga** — seção obrigatória com este título; `Nenhum.`
137
+ quando nada muda, senão:
164
138
 
165
139
  ```markdown
166
140
  ## UCs e ADRs que esta feature altera ou revoga
@@ -171,75 +145,41 @@ Ao iniciar a fase plan — após o `proposal.md` ser aprovado e antes de qualque
171
145
  | {feature}/ADR-{nnn} | total | — | — |
172
146
  ```
173
147
 
174
- Troque os placeholders pelos ids reais (ex.: `UC-133` superado em parte por `UC-589`, ainda valendo na vitrine) — um placeholder esquecido não é id, e o `usecase check` o aponta. `Id` é `UC-{nn}` ou `{feature}/ADR-{nnn}` — o número de ADR recomeça em cada feature. UC revogado exige `Substituto` (`UC-{nn}`, que vira o `superseded_by`) que exista no acervo depois da promoção; `parcial` exige `Escopo`, e `total` não tem; id repetido em duas linhas não aplica nenhuma delas. No `finish`, dentro do commit de arquivamento, o UC ganha `status: superseded` + `superseded_by` (+ `scope`) e o ADR sai do índice (total) ou fica com o escopo (parcial); linha malformada, alvo fora do acervo ou substituto inexistente não é aplicada e volta em `revocationProblems`. **Rode `morph-spec usecase check {feature}` logo depois de escrever a seção**: o `spec.md` congela no Gate 2, e uma linha errada descoberta no `finish` já não tem conserto no plano.
175
-
176
- O `spec.md` responde **como** os use cases do passo 2 serão realizados. Não repita o comportamento aqui.
177
-
178
- 4. Produza `mandate.md` em `.morph/features/{feature}/2-plan/`:
179
- - Stack exata do projeto (leia de `.morph/config/config.json` → `project.stack` ou do CLAUDE.md).
180
- - Standards obrigatórios: descubra-os com `morph-spec standards --find "<domínio/tecnologia>"` (top 3 `id · path · digest` — o digest decide) por domínio tocado; liste os IDs escolhidos.
181
- - Patterns proibidos — **copie por extenso no mandate.md** a lista canônica de `MORPH.md` § "Stack baked-in" (`Guid.NewGuid()`→`Guid.CreateVersion7()`, 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`, SQL cru sem justificativa, redeclarar tipo/componente que já existe na mesma feature) mais qualquer proibição específica da feature. Copie o texto completo — o mandate.md é lido por implementadores em contexto fresco, sem `MORPH.md` carregado, então um ponteiro sozinho não basta aqui.
182
- - Política de acesso a dados (registre no mandate): `ApplicationDbContext` injetado direto no slice — para CRUD e para queries específicas (joins, projeção, paginação). Para concorrência ou SQL específico, store dedicado hand-written com justificativa em `decisions.md`.
183
- - **Features com agentes de IA (MAF):** se a feature envolve um agente (Microsoft Agent Framework), **use a tool Read** nos standards relevantes de `.morph/framework/standards/ai-agents/*.md` (ex.: `setup`, `agent-session`, `middleware-patterns`, `mcp-server`, `mcp-tools`, `multi-agent-patterns`, `production`) — filtre pelo que a feature exige via `morph-spec standards --find "<tema>" --category ai-agents`. Esses standards carregam as **convenções de projeto** (single-agent por padrão — Workflows só para fan-in/out real; provider, caching, observability, A2A) que uma fonte externa de docs (ex.: context7) não conhece. Padrão de divisão: **superfície da API** pode vir de docs ao vivo/context7 (mais frescas para um SDK em evolução), mas **as convenções vêm dos standards** — registre ambas no mandate. Não pule os `ai-agents/*.md` só porque o STANDARDS.json index lista que eles existem.
184
- - **Verificação de runtime** — como se PROVA que a feature funciona rodando, não só compilando.
185
- Compilar não é subir: um serviço injetado sem registro em `Program.cs` passa no build e derruba
186
- a aplicação no startup. Registre no mandate:
187
- - **Como o stack sobe:** o `docker compose` do projeto (`morph-spec e2e up {feature}`). Se o
188
- projeto containeriza mas não tem compose, **isso é uma task** — sem ele o nó `e2e` do verify
189
- reprova (não dispensa).
190
- - **O que precisa ser exercitado:** os fluxos desta feature que o avaliador vai navegar, em
191
- linguagem de comportamento — os mesmos verbos das pós-condições dos use cases.
192
- - **Quais viram spec Playwright versionada:** caminho crítico e bug corrigido merecem regressão;
193
- exploração pontual não. O critério vai aqui; escrever a spec é tarefa da implementação.
194
- - **Base URL vinda do ambiente:** o harness dá a cada feature um bloco de portas próprio (para
195
- duas worktrees não brigarem pela porta 3000), então o `playwright.config.ts` **não pode**
196
- cravar a URL — leia `process.env.PLAYWRIGHT_BASE_URL ?? \`http://localhost:${process.env.PORT ?? 3000}\``
197
- e faça o compose publicar `"${PORT:-3000}:3000"` e `"${POSTGRES_PORT:-5432}:5432"`, sem
198
- `container_name` (o projeto compose já namespaceia; nome explícito colide entre worktrees —
199
- standard `infrastructure/docker/local-compose-isolation`). Config cravada = suíte batendo em
200
- porta vazia e `ECONNREFUSED` com cara de app quebrada; compose cravado **reprova o nó e2e**
201
- dentro de um worktree. Se estiver cravado, **isso é uma task**.
202
- - **Setup de autenticação**, se a aplicação tem login: `e2e.auth` em `config.json`
203
- (`mode: seed|storageState|bypass|none`, `seedCommand`, `storageStatePath`, `envFile`), com as
204
- credenciais num `.env.e2e` **gitignored** — nunca no config commitado. **`mode` é obrigatório
205
- sempre que houver `seedCommand`**: com `mode` ausente (ou `"none"`) o seed fica **inerte** — o
206
- comando está configurado e nunca roda, e o autor acredita que a base é semeada. O `verify`
207
- avisa (`[e2e] warning: …` nomeando `e2e.auth.seedCommand` e `e2e.auth.mode`), mas um aviso não
208
- repara um plano: escreva o `mode` no config que a task de setup entrega. **Se a app tem login e
209
- isso não existe, crie a task de setup**: sem ela a navegação para na tela de login e a
210
- verificação de runtime vira teatro. É gap de Gate 2, não dispensa de Gate 3.
211
- - **Baseline de contagem de testes é um COMANDO aqui também:** se o projeto declara
212
- `project.tests[]`, o `expectedCount` de cada suíte é gravado por `morph-spec verify {feature}
213
- --record-baseline` a partir de uma execução verde — **nunca digitado no config**. Um número
214
- inventado **alto demais** deixa o verify vermelho por `count-drop` e trava o próprio comando que
215
- o consertaria (só sai rebaixando/apagando o número à mão). Forma de `project.tests[]`:
216
- `.morph/framework/CLI.md`, seção "Suítes de teste".
217
- - **Quando não se aplica** (biblioteca pura, chore sem runtime), registre a dispensa e o porquê.
218
- - Checklist de done com critérios verificáveis por tarefa.
219
- - **Orçamento de teste e comentário — copie no mandate**, pelo mesmo motivo dos patterns
220
- proibidos: o orçamento por task do passo 5 (um teste por pós-condição + um de regressão por
221
- bug, justificativa acima disso, tabela antes de cópia, nenhum teste que só fixa texto);
222
- fixture compartilhada antes de helper novo; TDD onde paga (bug: regressão primeiro; lógica
223
- pura), teste depois aceito em UI e integração; comentário: o padrão é nenhum (nome, tipo e teste
224
- explicam), só o porquê que o código não mostra, nunca `///`/JSDoc que repete a assinatura
225
- nem história de task/UC/ADR. Nos standards obrigatórios, liste
226
- `architecture-code-comments` e o standard de teste do stack (seção *Test budget*).
227
- - **Baseline é um COMANDO, nunca um número.** O mandate congela no Gate 2 e é lido por
228
- implementadores durante dias — todo número cravado nele (`Suíte: 2366 passando`, cobertura,
229
- contagem de arquivos) está errado a partir da primeira task, e um agente que confia nele
230
- "conserta" um baseline que nunca esteve quebrado. Registre **como medir** (`npm test`,
231
- `dotnet test`) e mande comparar com o resultado do momento, não com um valor histórico.
232
- Aconteceu de verdade: mandate afirmando 2366 quando já eram 2375, e um ADR escrito só para
233
- desmentir o próprio mandate.
234
- - **Pré-requisito é um PREDICADO, nunca um SHA literal.** "`git merge-base --is-ancestor
235
- origin/main HEAD` sai 0" ou "a branch da feature X está integrada" — não "confirme que
236
- origin/master contém `49dfba2`". SHA cravado envelhece na primeira rebase/squash: o merge sai
237
- com outro hash e o sub-agent mandado verificá-lo ou queima turnos procurando o que não existe,
238
- ou declara que verificou sem ter verificado.
239
-
240
- 5. Produza `tasks.json` em `.morph/features/{feature}/2-plan/` seguindo o schema em `.morph/framework/schemas/tasks.schema.json`.
241
-
242
- **Formato obrigatório** (schema em `.morph/framework/schemas/tasks.schema.json` — o hook `tasks-json-guard` valida cada write):
148
+ `Id` é `UC-{nn}` ou `{feature}/ADR-{nnn}`. UC revogado exige `Substituto`; `parcial` exige
149
+ `Escopo`. O `finish` aplica as linhas válidas e devolve as malformadas em `revocationProblems`.
150
+ **Rode `morph-spec usecase check {feature}` logo depois de escrever a seção** — o spec congela no
151
+ Gate 2.
152
+
153
+ 4. **Seção `## Contrato de implementação` do `spec.md`** — o que quem implementa precisa saber e o
154
+ código não diz. Curta; o resto já está nos standards que cada task carrega.
155
+ - **Standards:** `morph-spec standards --find "<domínio>"` por domínio tocado (o digest decide);
156
+ liste os ids. Inclua `architecture-code-comments` e o standard de teste do stack. Feature com
157
+ agente MAF: os `standards/ai-agents/*.md` que ela exige (`--category ai-agents`) — convenção de
158
+ projeto vem deles; superfície da API pode vir do context7.
159
+ - **Proibições desta feature** além das de `MORPH.md` § "Stack baked-in", quando houver.
160
+ - **Verificação de runtime** — como se prova que a feature funciona rodando:
161
+ - O stack sobe pelo `docker compose` do projeto (`morph-spec e2e up {feature}`). Projeto que
162
+ containeriza sem compose: **isso é uma task**.
163
+ - Os fluxos que o avaliador vai navegar, nos verbos das pós-condições; quais viram spec
164
+ Playwright (caminho crítico e bug corrigido).
165
+ - Base URL do ambiente: `process.env.PLAYWRIGHT_BASE_URL ?? \`http://localhost:${process.env.PORT ?? 3000}\``,
166
+ compose publicando `"${PORT:-3000}:3000"` e sem `container_name` (standard
167
+ `infrastructure/docker/local-compose-isolation`). Cravado: **isso é uma task**.
168
+ - App com login: `e2e.auth` em `config.json` (`mode: seed|storageState|bypass|none`,
169
+ `seedCommand`, `storageStatePath`, `envFile`), credenciais num `.env.e2e` gitignored.
170
+ **`mode` é obrigatório sempre que houver `seedCommand`** — sem ele o seed fica inerte. Sem setup de
171
+ login, crie a task.
172
+ - Não se aplica (biblioteca pura): registre a dispensa e o porquê.
173
+ - **Baseline é um COMANDO, nunca um número.** O spec congela no Gate 2 e é lido por dias: número
174
+ cravado (`2366 passando`) está errado na primeira task, e quem confia nele "conserta" o que não
175
+ quebrou. Registre como medir (`npm test`, `dotnet test`); o `expectedCount` de `project.tests[]`
176
+ é gravado por `morph-spec verify {feature} --record-baseline`, nunca digitado.
177
+ - **Pré-requisito é um PREDICADO, nunca um SHA literal**: "`git merge-base --is-ancestor
178
+ origin/main HEAD` sai 0", não "confirme que main contém `49dfba2`" — o SHA muda no primeiro
179
+ squash.
180
+
181
+ 5. Produza `tasks.json` em `.morph/features/{feature}/2-plan/` seguindo o schema
182
+ `.morph/framework/schemas/tasks.schema.json` (o hook `tasks-json-guard` valida cada write):
243
183
 
244
184
  ```json
245
185
  {
@@ -249,175 +189,119 @@ Ao iniciar a fase plan — após o `proposal.md` ser aprovado e antes de qualque
249
189
  {
250
190
  "id": "T1",
251
191
  "title": "Título curto",
252
- "description": "Detalhes — o que esta task realiza e por quê",
192
+ "description": "O que esta task realiza e por quê",
253
193
  "dependencies": [],
254
194
  "effort": "S",
255
195
  "doneCriteria": "P2 — Cada veterinário traz suas especialidades em lista, nunca string concatenada",
256
196
  "status": "pending",
257
- "outputs": [],
197
+ "outputs": ["src/Vets/ListVets.cs", "tests/Vets/ListVetsTests.cs"],
258
198
  "group": "backend",
259
199
  "usecase": "UC-07",
260
200
  "agent": "dotnet-senior",
261
201
  "standards": ["standards/backend/dotnet/vsa-handler-patterns.md"],
262
- "reuse": [{ "concept": "SimpleBuilding", "verdict": "REUSAR", "target": "features/roulette/types/roulette.types.ts" }]
202
+ "reuse": [{ "concept": "VetDto", "verdict": "CRIAR", "why": "graph explain VetDto → not-found; grep -rn VetDto → 0" }]
263
203
  }
264
204
  ]
265
205
  }
266
206
  ```
267
207
 
268
- Regras:
269
- - `id` segue padrão `T\d+` (T1, T2, T10...).
270
- - `dependencies` lista outros IDs Tn. Tasks sem deps tem `[]`.
271
- - `effort`: S (≤30min), M (≤1h), L (≤2h), XL (>2h).
272
- - `status` inicia sempre como `pending`.
273
- - `group` (opcional): backend, frontend, tests, infra, docs. Default backend.
274
- - `outputs` (opcional): array de paths que serão criados/modificados.
275
- - `usecase` (opcional): o **ID** do use case que a task realiza — `UC-07`, nunca o nome do arquivo. Task puramente técnica (build, config, migração) não tem.
276
- - `agent` (opcional): o `id` da persona de `agents.json` responsável pelo domínio da task — **sem** o prefixo `morph-` (ex.: `"dotnet-senior"`, não `"morph-dotnet-senior"`). Carimbado no passo 5a abaixo; ausente numa task sem domínio de agente claro (config/docs) ou num plano legado.
277
- - `reuse` (opcional): os vereditos do `reuse-map.md` (passo 1c) que ESTA task realiza — `[{concept, verdict: REUSAR|ESTENDER|CRIAR, target}]`. Só nas tasks que tocam o conceito; task que não introduz conceito nenhum não tem. **A justificativa do CRIAR fica no `reuse-map.md`, não aqui** — o mesmo fato escrito em dois lugares diverge. É este campo que o `morph-spec verify` lê para saber se a criação de um símbolo homônimo foi decidida no Gate 2 ou aconteceu por descuido.
278
- - `standards` (opcional): array de paths relativos de `.morph/framework/standards/` (ex.: `["standards/backend/dotnet/vsa-handler-patterns.md"]`) — os standards da persona resolvida em `agent`, mais qualquer standard específico que a task exija.
279
-
280
- **5a. Carimbe `agent` e `standards` — uma leitura de `agents.json`, N tasks.** Antes de fechar o array `tasks`, **use a tool Read UMA VEZ** em `.morph/framework/agents.json` (não releia por task — é essa releitura repetida por task, hoje feita em `morph-implement`/`morph-apply` a cada dispatch, que este passo existe para eliminar). Para cada task do plano, resolva:
281
- - `agent`: o `id` da persona (chave do objeto `agents`, sem prefixo `morph-`) cujo `domains` cobre o `group`/domínio da task — o mesmo casamento que `morph-implement` §3 e `morph-apply` §3b fariam manualmente a cada dispatch; aqui você faz uma vez, no plano.
282
- - `standards`: o array `standards` dessa persona, mais qualquer standard adicional que a task especificamente exija (some, não substitua). **Persona com `surfaces`** (a `ui-designer`): some também a lista da superfície da tela que a task entrega — a que o checklist de tela do `1-design/mockups.md` declara em `Superfície` —, nunca a de outra superfície; sem mockup, escolha pela tela e registre a escolha em `decisions.md`.
283
-
284
- **5b. Carimbe `reuse` — do `reuse-map.md` para a task que realiza o conceito.** Para cada linha do mapa produzido no passo 1c, encontre a task que vai escrever aquele conceito e copie o veredito para `reuse` (`concept` + `verdict` + `target`). Um conceito sem task é sinal de plano incompleto — ou o mapa listou o que a feature não vai tocar, ou falta task. Resolva antes do Gate 2.
285
-
286
- **Task que cria ou altera superfície de UI** (componente, página, estilo, fluxo de navegação) carimba `agent: "ui-designer"` — inclusive numa feature que não tomou o ramo uiux (MORPH.md §2.1): o critério de agente é por domínio da task, não por fase percorrida.
287
-
288
- Uma task cujo domínio não bate com nenhuma persona registrada (ex.: task pura de config/docs) fica sem `agent` — `morph-implement` cai no fallback de Read de `agents.json` nesse caso.
289
-
290
- **O `doneCriteria` carrega a pós-condição LITERAL.** Este é o elo que amarra a cadeia inteira: a pós-condição escrita em linguagem de negócio chega **sem tradução** ao critério que o `morph-spec verify` e o `morph-eval` cobram. Copie o texto da pós-condição, prefixado pelo seu rótulo (`"P2 — Cada veterinário traz..."`). Reescrever com outras palavras aqui é exatamente o ponto em que o requisito se perde hoje.
291
-
292
- **`morph-spec dag {feature}` cobra o encanamento.** Ele lê os use cases junto com o `tasks.json` e reporta: referência a um `UC-{nn}` inexistente (**erro** — trava), pós-condição que nenhuma task cita (aviso) e task que referencia um UC mas parafraseou em vez de copiar (aviso). A comparação normaliza caixa e espaço, então prefixar o rótulo não quebra o casamento — mas a redação e os acentos precisam bater. E um quarto achado, léxico e também só aviso: `doneCriteria` com vocabulário de artefato (`grep`, "contém a string", "o binário", "nenhum arquivo", "arquivo/pasta/diretório em", glob `**/`) sem `Por que artefato:` (passo 2). O `dag` aponta o vocabulário; se a pós-condição é observável em teste continua sendo seu no Gate 2 e do evaluator.
293
-
294
- **Ciclo de vida do acervo — também só aviso.** O `dag` (e o `morph-spec usecase check {feature}`, que roda sem `tasks.json`) aponta task cujo `usecase` está `superseded` — no acervo, na cópia da feature ou revogado pelo próprio `spec.md` —, frontmatter de supersessão malformado e linha de revogação que o `finish` não conseguiria aplicar. Task sobre UC superado em parte é legítima quando realiza a parte que ainda vale; senão, cite o substituto.
295
-
296
- Cada pós-condição de cada use case deve estar coberta por **pelo menos uma** task. Antes de fechar o `tasks.json`, percorra os `UC-*.md` e confira: sobrou pós-condição sem task? Ou o plano está incompleto, ou a pós-condição não era necessária — resolva antes do Gate 2, não depois.
297
-
298
- **Orçamento de teste por task.** Cada pós-condição que a task realiza compra **um** teste, e
299
- cada bug corrigido compra **um** de regressão. Acima disso, a task justifica em uma linha da
300
- `description` (é ela que chega ao sub-agente). O orçamento conta comportamentos, não cenários:
301
- os cenários do mesmo comportamento são linhas de uma tabela (`[Theory]`/`it.each`), não N
302
- testes. **Nenhum teste que só fixa texto** (copy de UI, config de tenant, prosa): a checagem
303
- vira analyzer, lint ou validação no publish e fica fora da contagem da suíte. A regra de
304
- critério sobre saída de LLM, abaixo, é o caso de prompt desta. A prova de mutação do Gate 3
305
- continua no caminho crítico: mutante sobrevivente se mata apertando uma asserção ou somando uma
306
- linha de tabela, nunca com um teste novo por mutante. O `morph-spec verify` avisa quando as
307
- linhas de teste adicionadas passam de 1,5× as de produção (validador `code-budget`).
308
-
309
- **Preencha `outputs` (paths planejados) em cada task** — o `morph-spec dag` usa os outputs para detectar colisão de arquivos entre fluxos paralelos e recomendar `isolation: "worktree"`. Task sem `outputs` entra como footprint desconhecido (não força isolamento, mas o dag não consegue protegê-la de colisão).
310
-
311
- **Tamanho da task: no máximo 8 `outputs`** (testes incluídos). Uma task inteira cabe num
312
- dispatch; acima disso o sub-agente bate no teto de turnos e a retomada recomeça fria. Fatie por
313
- pós-condição (uma task por pós-condição ou par delas, com a dependência explícita). Antes do
314
- Gate 2, o `morph-spec dag` recusa (exit 1) e o `gate-check plan` pausa com `oversizedTasks`;
315
- depois do Gate 2 é só aviso.
316
-
317
- **Critério sobre saída de LLM vira eval de runtime — nunca "suíte estrutural".** Duas etapas,
318
- como na `morph-review`: (1) **filtro mecânico** — o `mandate.md` cita ao menos um standard
319
- `ai-agents`; senão, a regra não se aplica. (2) **determinação sua, por task** — o
320
- `doneCriteria` julga o que o modelo *responde* (conteúdo, tom, escolha)? Se sim:
321
- - a prova é um **eval de runtime**; a evidência (entrada, modelo, saída, veredito) vai em
208
+ - `id` `T\d+`; `dependencies` com ids Tn; `effort` S (≤30min) | M (≤1h) | L (≤2h) | XL (>2h);
209
+ `status` nasce `pending`; `group` backend | frontend | tests | infra | docs.
210
+ - `usecase`: o **id** (`UC-07`), nunca o nome do arquivo.
211
+ - `outputs`: paths planejados — o `dag` detecta colisão entre fluxos paralelos por eles.
212
+ **No máximo 8 `outputs` por task** (testes incluídos): acima disso o sub-agente bate no teto de
213
+ turnos; o `dag` recusa antes do Gate 2.
214
+
215
+ **5a. Carimbe `agent` e `standards`** com UMA leitura de `.morph/framework/agents.json`: `agent` é
216
+ o id da persona (sem `morph-`) cujo `domains` cobre o domínio da task; `standards`, o array dela
217
+ mais o que a task exige. **Persona com `surfaces`** (a `ui-designer`): some a lista da superfície
218
+ que o checklist de tela do `1-design/mockups.md` declara em `Superfície`, nunca de outra; sem
219
+ mockup, escolha pela tela e registre em `decisions.md`. Task que cria ou altera UI carimba
220
+ `agent: "ui-designer"` mesmo sem o ramo uiux. Task sem persona clara (config, docs) fica sem `agent`.
221
+
222
+ **5b. Carimbe `reuse`** na task que escreve cada conceito do passo 1c: `concept`, `verdict`,
223
+ `target` (o que reusar ou estender) e, em `CRIAR`, `why`. Conceito sem task: falta task ou o
224
+ conceito não é desta feature — resolva antes do Gate 2.
225
+
226
+ **O `doneCriteria` carrega a pós-condição LITERAL**, prefixada pelo rótulo (`"P2 — Cada
227
+ veterinário traz..."`). Reescrever com outras palavras é onde o requisito se perde. Toda
228
+ pós-condição de todo UC tem ao menos uma task.
229
+
230
+ **`morph-spec dag {feature}` cobra o encanamento.** Ele reporta UC inexistente (erro), pós-condição sem task e `doneCriteria` parafraseado (avisos), e `doneCriteria` com vocabulário de artefato (`grep`, "contém a string", "o binário", "nenhum arquivo", "arquivo/pasta/diretório em", glob `**/`) sem `Por que artefato:` (aviso). Também aponta task sobre UC `superseded` e linha de revogação que o `finish` não aplicaria.
231
+
232
+ **Orçamento de teste por task.** Cada pós-condição compra **um** teste, cada bug corrigido **um** de
233
+ regressão; acima disso, uma linha de justificativa na `description`. Cenários do mesmo
234
+ comportamento são linhas de tabela (`[Theory]`/`it.each`). **Nenhum teste que só fixa texto**
235
+ (copy, config, prosa). O `verify` avisa quando o teste adicionado passa de 1,5× a produção.
236
+
237
+ **Critério sobre saída de LLM vira eval de runtime — nunca "suíte estrutural".** Vale quando a seção
238
+ de contrato cita um standard `ai-agents` e o `doneCriteria` julga o que o modelo *responde*:
239
+ - a prova é um **eval de runtime**; a evidência vai em
322
240
  `.morph/features/{feature}/3-implement/evidencias/{taskId}.md`, e esse path entra em
323
241
  `outputs` — é por ele que implementador e avaliador sabem que ela é devida. Com nó
324
- `runner: "evals"` (standard `ai-agents-evals-with-cache`), o cenário mora no dataset do nó
325
- e a evidência aponta para ele;
326
- - **no máximo 1 teste de estrutura** da fonte do prompt (chaves que o consumidor lê, ausência
327
- da instrução revogada) — nunca vocabulário do que o modelo deveria dizer;
328
- - escreva as duas coisas na `description` da task: é ela que chega ao sub-agente.
242
+ `runner: "evals"` (standard `ai-agents-evals-with-cache`), o cenário mora no dataset do nó;
243
+ - **no máximo 1 teste de estrutura** da fonte do prompt — nunca vocabulário do que o modelo
244
+ deveria dizer;
245
+ - as duas coisas vão na `description` da task.
329
246
 
330
- Medido no acervo: 12 suítes, 106 testes de `Contains` sobre migrations de prompt — todos sobre
331
- versões já superadas, verdes com qualquer resposta do modelo.
332
-
333
- **5c. Cross-check do `1-design/` — todo aviso de capacidade tem destino.** Se o diretório existe,
334
- rode antes de fechar o array `tasks`:
247
+ **5c. Cross-check do `1-design/` — todo aviso de capacidade tem destino.** Com o diretório
248
+ presente, antes de fechar o array `tasks`:
335
249
 
336
250
  ```bash
337
251
  grep -riE "capacidade nova|precisa de backend|dimensionar junto" .morph/features/{feature}/1-design/
338
252
  ```
339
253
 
340
- Cada ocorrência é o designer dizendo que a tela pede algo que ainda não existe. Ela vira **task
341
- irmã** no `tasks.json` **ou** exclusão registrada em `decisions.md` com o motivo — **nunca fica
342
- sem destino**. Medido em campo: duas ocorrências dessas passaram batidas em features reais e
343
- viraram trabalho descoberto na fase implement, quando o escopo já estava aprovado no Gate 2.
344
- Sem hits, ou sem `1-design/`, o passo é um no-op silencioso.
254
+ Cada ocorrência vira **task irmã** ou exclusão registrada em `decisions.md` com o motivo —
255
+ **nunca fica sem destino**. Sem hits, ou sem `1-design/`, o passo é um no-op.
345
256
 
346
- **5d. O checklist de tela vira critério.** Cada `## Tela:` do `1-design/mockups.md` traz o
347
- `### Checklist de tela` (volume, paginação, ordenação, filtro, os três estados, mobile, abas).
348
- A task que entrega a tela carrega essas decisões no `doneCriteria`, citando a seção do mockup
349
- por path (`1-design/mockups.md#tela-…`) — "lista pagina no servidor, 25 por página" é critério;
350
- "conforme o mockup" sozinho não é. É o que o implementador entrega e o que o avaliador confere
351
- no Gate 3 (`morph-review` §4). Item marcado "não se aplica" não vira critério.
257
+ **5d. O checklist de tela vira critério.** A task que entrega uma `## Tela:` do
258
+ `1-design/mockups.md` carrega no `doneCriteria` as decisões do `### Checklist de tela` (volume,
259
+ paginação, ordenação, filtro, os três estados, mobile, abas), citando a seção por path
260
+ (`1-design/mockups.md#tela-…`) — "lista pagina no servidor, 25 por página" é critério; "conforme
261
+ o mockup" não é. Item "não se aplica" não vira critério.
352
262
 
353
- 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.
263
+ Antes de retornar, valide rodando `morph-spec dag {feature}` — schema do tasks.json (ids, enums,
264
+ dependências) e a análise de DAG que a `/morph-apply` vai usar.
354
265
 
355
266
  6. Apresente o Gate 2 segundo trust mode.
356
267
 
357
- Você pode embutir o diagrama do DAG do plano via `morph-spec dag {feature} --mermaid` (flowchart Mermaid) para visualização no gate.
358
-
359
- Rode `morph-spec gate-check {feature} plan [--json]` — lê `trust` de `.morph/config/config.json`, conta `taskCount` do `tasks.json` (disco), decide via `shouldPauseGate` e persiste `gateDecisions.plan` com timestamp server-side (shape canônico em `.morph/framework/schemas/feature.schema.json`), imprimindo `pause`/`reason`/`signals`. É o default — não recompute a tabela do MORPH.md §5 em linguagem natural.
360
-
361
- `gate-check` **não herda** `designSystemDivergence` do Gate 1 automaticamente — é recomputado a cada chamada. Se a divergência do Gate 1 segue sem resolução, ou o mandate introduziu uma violação de standard, repasse via `--signals` (as únicas chaves que este comando aceita sobrescrever):
268
+ Rode `morph-spec gate-check {feature} plan [--json]` — decide pelos sinais do disco e persiste
269
+ `gateDecisions.plan`. Divergência de design system do Gate 1 sem resolução, ou violação de
270
+ standard, entram por `--signals` (as únicas chaves aceitas):
362
271
  ```
363
272
  morph-spec gate-check {feature} plan --signals '{"designSystemDivergence":true,"standardsViolations":["<id>"]}'
364
273
  ```
274
+ Risco que nenhuma chave representa: `gate-decision` direto. Nunca edite `feature.json` à mão.
275
+ `morph-spec dag {feature} --mermaid` dá o diagrama do plano para o gate.
365
276
 
366
- Risco que nenhuma dessas chaves representa (julgamento desta sessão, não fato de disco): use `gate-decision` direto em vez de `gate-check`.
367
-
368
- **Nunca edite `feature.json` à mão** (colide com o hook state-sync — erro "file modified since read"). Os caminhos acima gravam no mesmo lugar; o hook `gate-guard.js` confere depois se a ação tomada (pausar vs auto-aprovar) bateu com a decisão persistida.
369
-
370
- **Se `pause === true`**, use `AskUserQuestion`:
277
+ **Se `pause === true`**, `AskUserQuestion`:
371
278
 
372
279
  ```
373
280
  question: "Gate 2 — Plano de {feature} aprovado?{ reason ? ' Sinal: ' + reason : '' }"
374
281
  header: "Gate 2"
375
282
  options:
376
- - { label: "aprovado, prosseguir", description: "Aceitar spec/mandate/tasks e habilitar /morph-apply" }
283
+ - { label: "aprovado, prosseguir", description: "Aceitar use cases, spec e tasks e habilitar /morph-apply" }
377
284
  - { label: "preciso ajustar", description: "Apontar mudanças no plano antes de prosseguir" }
378
285
  - { label: "cancelar feature", description: "Abortar" }
379
286
  ```
380
287
 
381
- Aguardar resposta. Se "preciso ajustar", aplicar e reapresentar.
288
+ **Se `pause === false`**: resumo de 3 linhas (problema → solução; tasks e esforço; caminho
289
+ crítico) e `morph-spec approve {feature} plan --mode auto` (ou `advance {feature}`). A pergunta
290
+ nomeia a feature — é por ela que o hook `state-sync` grava a aprovação.
382
291
 
383
- **Se `pause === false`** (auto-aprovação), exibir summary curto:
384
-
385
- ```
386
- ## Gate 2 (auto-aprovado)
387
-
388
- **Spec:** {1 frase} → {1 frase da solução}
389
- **Mandate:** Stack: {stack} | Standards: {N obrigatórios} | Proibido: {N padrões}
390
- **Tasks:** {N} | Esforço total: {soma} | Caminho crítico: {IDs sem deps paralelas}
391
- ```
392
-
393
- No caminho manual, o hook state-sync registra a aprovação automaticamente em answers de AskUserQuestion (grava o gate no `feature.json` autoritativo, `approvedBy: "manual"`) — **atribuindo pela feature nomeada na pergunta**; sem o nome, e com mais de uma feature na árvore, ele recusa a gravar e avisa (aprove então por `morph-spec approve {feature} plan`). Em auto sem AskUserQuestion, aprove via `morph-spec approve {feature} plan --mode auto` (ou `morph-spec advance {feature}` para já criar a pasta da próxima fase) — nunca via Edit à mão de state.json.
292
+ Aprovado o Gate 2, o frontmatter de cada use case passa de `status: draft` a `status: approved`.
293
+ O `finish` os promove ao acervo com `status: implemented`.
394
294
 
395
295
  ## Output esperado
396
296
 
397
- - `.morph/features/{feature}/2-plan/usecases/UC-{nn}-{slug}.md` — um arquivo por use case, com pós-condições testáveis
398
- - `.morph/features/{feature}/2-plan/spec.md` — especificação técnica completa, com a seção `UCs e ADRs que esta feature altera ou revoga` (passo 3)
399
- - `.morph/features/{feature}/2-plan/mandate.md` — contrato de implementação
400
- - `.morph/features/{feature}/2-plan/reuse-map.md` — veredito REUSAR/ESTENDER/CRIAR por conceito, com justificativa de uma linha em cada CRIAR (passo 1c)
401
- - `.morph/features/{feature}/2-plan/tasks.json` — task list estruturada válida contra schema, com o `doneCriteria` carregando a pós-condição literal e, por task, `agent`/`standards` carimbados a partir de `agents.json` (passo 5a) e, nas tasks de critério sobre saída de LLM, o path de `3-implement/evidencias/{taskId}.md` em `outputs` (passo 5)
402
- - Gate 2 registrado aprovado em `.morph/features/{feature}/feature.json` (autoritativo)
403
-
404
- Ao registrar a aprovação do Gate 2, atualize o frontmatter de cada use case de `status: draft` para `status: approved`. O ciclo fecha na integração: `morph-spec finish` promove os use cases para o acervo permanente `.morph/specs/usecases/` já com `status: implemented` — até que uma feature posterior o revogue (passo 3) e ele passe a `status: superseded`, com `superseded_by` e, se parcial, `scope`. O status é **descritivo** — quem trava fase é o gate, não este campo.
297
+ - `2-plan/usecases/UC-{nn}-{slug}.md` — pós-condições testáveis
298
+ - `2-plan/spec.md` — arquitetura, seção de revogação e `## Contrato de implementação`
299
+ - `2-plan/tasks.json` — válido contra o schema, `doneCriteria` literal, `agent`/`standards`/`reuse`
300
+ carimbados, `3-implement/evidencias/{taskId}.md` em `outputs` nas tasks de critério sobre LLM
301
+ - Gate 2 registrado em `feature.json`
405
302
 
406
303
  ## Referências
407
304
 
408
- - `.morph/framework/MORPH.md` — seções 2 (Fases), 3 (Contratos de Output), 5 (Gates), Trust Mode
409
- - `morph-spec standards --find "<query>"` — para identificar standards relevantes ao mandate (o índice inteiro só como navegação exploratória; ver `morph-standards`)
410
- - `.morph/framework/agents.json` — personas por domínio; lido UMA VEZ no passo 5a para carimbar `agent`/`standards` por task
411
- - `.morph/framework/schemas/tasks.schema.json` — schema obrigatório de tasks.json
412
- - `morph-spec graph explain|affected --uses-only` — "isto já existe?" e "quem usa de verdade" (passo 1c); **sem grafo, o fallback é `grep -rn`**
413
- - `.morph/context/README.md` — inventário do projeto (entidades, endpoints, componentes com path); insumo declarado do passo 1c, atualizado por `morph-spec context refresh`
414
- - `.morph/specs/usecases/` — acervo permanente de use cases do projeto (`usecase reserve` já lê antes de numerar; em `bug`, é onde mora o UC a corrigir; `status: superseded` não é comportamento vigente)
415
- - `.morph/specs/adrs/` — índice dos ADRs que valem no projeto, um arquivo por ADR, mantido pelo `finish` (passo 1d); os `decisions.md` arquivados são história
416
- - `morph-spec usecase check {feature}` — o ciclo de vida do acervo contra esta feature (revogações do `spec.md`, task sobre UC `superseded`), antes do Gate 2
417
- - `.morph/features/{feature}/1-design/` — artefatos da fase uiux, insumo do passo 1 e do cross-check do passo 5c (ausente não é erro)
418
- - `.morph/features/{feature}/0-proposal/proposal.md` — escopo da feature
419
- - `.morph/features/{feature}/0-proposal/stack-scan.md` — contexto técnico detectado
420
- - `.morph/framework/schemas/tasks.schema.json` — schema e enums de tasks.json
421
- - `.morph/framework/standards/ai-agents/evals-with-cache.md` e `.morph/framework/standards/ai-agents/testing-ai.md` — o nó `runner: "evals"` e a fronteira eval × unit; insumos da regra de critério sobre saída de LLM (passo 5)
422
- - `morph-spec dag {feature}` — valida o tasks.json e imprime a análise de DAG
423
- - `.morph/framework/MORPH.md` §5 — regras de pausa de gate (trust mode)
305
+ - `.morph/framework/MORPH.md` — §2 (fases), §3 (contratos de output), §5 (gates)
306
+ - `morph-spec standards --find|graph explain|graph affected --uses-only|usecase reserve|usecase check|dag` — `.morph/framework/CLI.md`
307
+ - `.morph/framework/schemas/tasks.schema.json`