@polymorphism-tech/morph-spec 8.46.0 → 9.0.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 (304) hide show
  1. package/CLAUDE.md +53 -44
  2. package/README.md +3 -4
  3. package/bin/morph-spec.js +38 -55
  4. package/bin/validate.js +5 -134
  5. package/claude-plugin.json +1 -1
  6. package/docs/CHEATSHEET.md +2 -2
  7. package/docs/QUICKSTART.md +1 -1
  8. package/framework/CLAUDE.md +41 -101
  9. package/framework/MORPH.md +95 -252
  10. package/framework/agents.json +75 -18
  11. package/framework/commands/create-umbraco-lp.md +2 -0
  12. package/framework/commands/migrate-lp-to-umbraco.md +2 -0
  13. package/framework/commands/morph-apply.md +5 -28
  14. package/framework/commands/morph-archive.md +2 -2
  15. package/framework/commands/morph-hotfix.md +8 -8
  16. package/framework/commands/morph-infra.md +17 -203
  17. package/framework/commands/morph-media.md +3 -0
  18. package/framework/commands/morph-preflight.md +7 -31
  19. package/framework/commands/morph-proposal.md +2 -50
  20. package/framework/commands/morph-status.md +3 -3
  21. package/framework/commands/morph-troubleshoot.md +2 -14
  22. package/framework/docs/CLI.md +585 -286
  23. package/framework/evals/review-checklist.md +82 -41
  24. package/framework/hooks/README.md +10 -11
  25. package/framework/hooks/claude-code/core/comment-guard.js +1 -1
  26. package/framework/hooks/claude-code/core/denylist.json +33 -3
  27. package/framework/hooks/claude-code/core/enforce-phase-writes.js +16 -20
  28. package/framework/hooks/claude-code/core/gate-guard.js +2 -11
  29. package/framework/hooks/claude-code/core/pre-bash-denylist.js +38 -0
  30. package/framework/hooks/claude-code/core/protect-spec-files.js +30 -242
  31. package/framework/hooks/claude-code/core/state-sync.js +17 -19
  32. package/framework/hooks/claude-code/core/telemetry-log.js +3 -3
  33. package/framework/hooks/claude-code/core/validate-completion.js +33 -97
  34. package/framework/hooks/claude-code/core/warn-bash-source-write.js +31 -0
  35. package/framework/hooks/claude-code/core/worktree-context.js +5 -4
  36. package/framework/hooks/claude-code/statusline.py +55 -41
  37. package/framework/hooks/package.json +3 -0
  38. package/framework/hooks/shared/activity-logger.js +1 -1
  39. package/framework/hooks/shared/build-check.js +10 -6
  40. package/framework/hooks/shared/command-tokens.js +169 -0
  41. package/framework/hooks/shared/comment-rules.js +1 -1
  42. package/framework/hooks/shared/comment-scanner.js +10 -23
  43. package/framework/hooks/shared/comment-stripper.js +1 -1
  44. package/framework/hooks/shared/e2e-check.js +67 -31
  45. package/framework/hooks/shared/errata.js +72 -0
  46. package/framework/hooks/shared/feature-locator.js +1 -1
  47. package/framework/hooks/shared/frontend-locations.js +6 -0
  48. package/framework/hooks/shared/gate-question.js +18 -0
  49. package/framework/hooks/shared/phase-utils.js +15 -32
  50. package/framework/hooks/shared/slice-progress.js +118 -0
  51. package/framework/hooks/shared/spawn-command.js +23 -0
  52. package/framework/hooks/shared/state-reader.js +61 -87
  53. package/framework/hooks/shared/state-writer.js +3 -3
  54. package/framework/mcp/registry.json +3 -4
  55. package/framework/phases.json +23 -39
  56. package/framework/rules/ai-agents-standards.md +18 -16
  57. package/framework/rules/asaas-standards.md +3 -1
  58. package/framework/rules/csharp-standards.md +10 -8
  59. package/framework/rules/data-standards.md +5 -5
  60. package/framework/rules/dotnet-templates.md +1 -1
  61. package/framework/rules/frontend-standards.md +4 -2
  62. package/framework/rules/gsap-standards.md +10 -5
  63. package/framework/rules/hangfire-standards.md +3 -1
  64. package/framework/rules/infrastructure-standards.md +4 -2
  65. package/framework/rules/neon-auth-standards.md +3 -1
  66. package/framework/rules/neon-standards.md +6 -4
  67. package/framework/rules/nextjs-standards.md +13 -11
  68. package/framework/rules/nextjs-templates.md +1 -1
  69. package/framework/rules/resend-standards.md +3 -1
  70. package/framework/schemas/config.schema.json +14 -9
  71. package/framework/schemas/feature.schema.json +15 -52
  72. package/framework/skills/README.md +4 -5
  73. package/framework/skills/core/create-umbraco-lp/SKILL.md +3 -3
  74. package/framework/skills/core/migrate-lp-to-umbraco/SKILL.md +3 -3
  75. package/framework/skills/core/morph-apply/SKILL.md +150 -223
  76. package/framework/skills/core/morph-hotfix/SKILL.md +34 -43
  77. package/framework/skills/core/morph-machine/SKILL.md +4 -4
  78. package/framework/skills/core/morph-media/SKILL.md +3 -3
  79. package/framework/skills/core/morph-plan/SKILL.md +138 -300
  80. package/framework/skills/core/morph-review/SKILL.md +112 -137
  81. package/framework/skills/core/morph-standards/SKILL.md +29 -41
  82. package/framework/skills/core/morph-uiux/SKILL.md +78 -153
  83. package/framework/standards/STANDARDS.json +90 -1219
  84. package/framework/standards/STANDARDS.meta.json +1305 -0
  85. package/framework/standards/ai-agents/evals-with-cache.md +2 -3
  86. package/framework/standards/ai-agents/llm-runtime-defaults.md +1 -1
  87. package/framework/standards/ai-agents/modalities-speech-to-text.md +36 -26
  88. package/framework/standards/ai-agents/prompt-sources.md +6 -4
  89. package/framework/standards/ai-agents/providers/model-registry.md +1 -1
  90. package/framework/standards/ai-agents/rag-custom-pgvector.md +67 -39
  91. package/framework/standards/ai-agents/setup.md +2 -2
  92. package/framework/standards/ai-agents/structured-output.md +1 -1
  93. package/framework/standards/ai-agents/sweet-spot.md +1 -1
  94. package/framework/standards/architecture/code-comments.md +8 -8
  95. package/framework/standards/architecture/vertical-slice/vertical-slice.md +18 -9
  96. package/framework/standards/backend/api/validation.md +135 -47
  97. package/framework/standards/backend/database/postgresql/database.md +11 -7
  98. package/framework/standards/backend/database/vector-search-rag.md +207 -324
  99. package/framework/standards/backend/dotnet/fluent-validation-vsa.md +14 -8
  100. package/framework/standards/backend/dotnet/result-pattern.md +40 -6
  101. package/framework/standards/backend/dotnet/scalar-ui.md +13 -7
  102. package/framework/standards/backend/dotnet/scrutor.md +1 -1
  103. package/framework/standards/backend/dotnet/testing.md +1 -1
  104. package/framework/standards/backend/dotnet/vsa-handler-patterns.md +7 -7
  105. package/framework/standards/backend/integrations/asaas/asaas-api.md +309 -165
  106. package/framework/standards/backend/integrations/hangfire/hangfire-jobs.md +134 -154
  107. package/framework/standards/data/nosql/cache/redis.md +120 -44
  108. package/framework/standards/data/nosql/cosmos-db.md +114 -71
  109. package/framework/standards/frontend/design-system/animations.md +1 -1
  110. package/framework/standards/frontend/design-system/naming.md +1 -1
  111. package/framework/standards/frontend/nextjs/motion-patterns.md +45 -29
  112. package/framework/standards/frontend/nextjs/naming-conventions.md +1 -1
  113. package/framework/standards/infrastructure/docker/coolify-deploy.md +8 -6
  114. package/framework/standards/infrastructure/neon/neon-pgvector.md +120 -75
  115. package/framework/standards/infrastructure/neon/neon-setup.md +53 -31
  116. package/framework/standards/integration/mcp/mcp-tools.md +7 -7
  117. package/framework/templates/README.md +2 -3
  118. package/framework/templates/REGISTRY.json +6 -170
  119. package/framework/templates/code/dotnet/contracts/contracts-vsa.cs +2 -2
  120. package/framework/templates/code/dotnet/extensions/database-extensions.cs +1 -1
  121. package/framework/templates/code/dotnet/extensions/result-extensions.cs +27 -0
  122. package/framework/templates/code/dotnet/feature/endpoint.cs.hbs +2 -2
  123. package/framework/templates/docs/plan.md +72 -0
  124. package/framework/templates/dotnet/ai-kit/README.md +1 -9
  125. package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/MediaDisclosureTests.cs +1 -1
  126. package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/Morph.AiKit.Tests.csproj +0 -10
  127. package/framework/templates/infrastructure/docker/coolify.template.json +3 -3
  128. package/framework/templates/infrastructure/github/README.md +2 -1
  129. package/framework/templates/infrastructure/github/workflows/deploy-coolify.yml.hbs +2 -1
  130. package/framework/templates/meta-prompts/squad-leaders/backend-squad.md +1 -1
  131. package/framework/templates/meta-prompts/squad-leaders/frontend-squad.md +1 -1
  132. package/framework/templates/meta-prompts/squad-leaders/squad-leader.md +1 -1
  133. package/framework/templates/meta-prompts/validators/pre-commit-validator.md +3 -4
  134. package/package.json +1 -1
  135. package/src/commands/e2e/e2e.js +2 -2
  136. package/src/commands/observability/cost.js +18 -60
  137. package/src/commands/observability/telemetry.js +3 -5
  138. package/src/commands/project/doctor-procs.js +1 -1
  139. package/src/commands/project/doctor.js +9 -9
  140. package/src/commands/project/fleet.js +4 -4
  141. package/src/commands/project/heavy.js +3 -3
  142. package/src/commands/project/init.js +6 -1
  143. package/src/commands/project/setup-infra-cmd.js +2 -1
  144. package/src/commands/project/stack-scan.js +58 -0
  145. package/src/commands/project/standards.js +79 -25
  146. package/src/commands/project/status.js +29 -69
  147. package/src/commands/project/update.js +33 -19
  148. package/src/commands/project/worktree.js +1 -1
  149. package/src/commands/state/advance.js +62 -46
  150. package/src/commands/state/approve.js +95 -138
  151. package/src/commands/state/archive.js +20 -84
  152. package/src/commands/state/auto-approval.js +68 -0
  153. package/src/commands/state/create.js +28 -1
  154. package/src/commands/state/delete.js +1 -1
  155. package/src/commands/state/finish.js +11 -23
  156. package/src/commands/state/gate-check.js +86 -95
  157. package/src/commands/state/gate-decision.js +6 -4
  158. package/src/commands/state/handoff.js +1 -1
  159. package/src/commands/state/list.js +9 -9
  160. package/src/commands/state/report-check.js +157 -311
  161. package/src/commands/state/retype.js +9 -3
  162. package/src/commands/validation/mutate.js +77 -14
  163. package/src/commands/validation/plan-check.js +81 -0
  164. package/src/commands/validation/validate-feature.js +60 -135
  165. package/src/commands/validation/verify.js +41 -82
  166. package/src/core/paths/output-schema.js +20 -67
  167. package/src/core/state/gate-order.js +5 -6
  168. package/src/core/state/lifecycle-audit.js +2 -2
  169. package/src/core/state/state-manager.js +17 -98
  170. package/src/core/templates/template-registry.js +2 -2
  171. package/src/core/templates/template-seed.js +22 -0
  172. package/src/core/work-types.js +10 -10
  173. package/src/dashboard/app/App.jsx +0 -2
  174. package/src/dashboard/app/components/ActivityFeed.jsx +2 -3
  175. package/src/dashboard/app/components/CommandPalette.jsx +7 -8
  176. package/src/dashboard/app/components/EntityLink.jsx +1 -2
  177. package/src/dashboard/app/components/Markdown.jsx +1 -1
  178. package/src/dashboard/app/components/Sidebar.jsx +1 -2
  179. package/src/dashboard/app/hooks/useMorphQuery.js +1 -1
  180. package/src/dashboard/app/lib/phases.js +2 -4
  181. package/src/dashboard/app/pages/Activity.jsx +1 -1
  182. package/src/dashboard/app/pages/FeatureDetail.jsx +139 -129
  183. package/src/dashboard/app/pages/Features.jsx +9 -9
  184. package/src/dashboard/app/pages/Guide.jsx +2 -2
  185. package/src/dashboard/app/pages/PhasePipeline.jsx +3 -4
  186. package/src/dashboard/app/pages/RulesMap.jsx +3 -3
  187. package/src/dashboard/app/pages/SkillsLibrary.jsx +3 -3
  188. package/src/dashboard/app/pages/Standards.jsx +1 -1
  189. package/src/dashboard/scanner/activity-scanner.js +6 -16
  190. package/src/dashboard/scanner/agents-scanner.js +1 -1
  191. package/src/dashboard/scanner/docs-scanner.js +5 -23
  192. package/src/dashboard/scanner/features-scanner.js +95 -60
  193. package/src/dashboard/scanner/index.js +0 -2
  194. package/src/dashboard/scanner/project-api.js +1 -1
  195. package/src/dashboard/scanner/rules-scanner.js +15 -10
  196. package/src/dashboard/scanner/skills-scanner.js +2 -3
  197. package/src/dashboard/scanner/standards-scanner.js +2 -1
  198. package/src/lib/ci/ci-verify.js +17 -1
  199. package/src/lib/ci/github-ci.js +1 -1
  200. package/src/lib/detectors/index.js +3 -8
  201. package/src/lib/generators/handoff-generator.js +34 -65
  202. package/src/lib/generators/settings-generator.js +11 -89
  203. package/src/lib/git/evidence-staleness.js +1 -1
  204. package/src/lib/git/tree-fingerprint.js +19 -7
  205. package/src/lib/git/tree-state.js +2 -2
  206. package/src/lib/heavy/cleanup.js +1 -5
  207. package/src/lib/installers/memory-installer.js +6 -8
  208. package/src/lib/mutation/commands.js +3 -2
  209. package/src/lib/{tasks/dotnet-test-introspection.js → mutation/dotnet-introspection.js} +17 -282
  210. package/src/lib/mutation/plan.js +14 -6
  211. package/src/lib/mutation/runner.js +1 -1
  212. package/src/lib/mutation/subset.js +46 -9
  213. package/src/lib/plan/artifact-vocabulary.js +60 -0
  214. package/src/lib/plan/checks.js +234 -0
  215. package/src/lib/plan/plan-parser.js +209 -0
  216. package/src/lib/plan/plan-template.js +18 -0
  217. package/src/lib/review-reports.js +222 -0
  218. package/src/lib/risk-detector.js +134 -135
  219. package/src/lib/specs/adr-index.js +50 -69
  220. package/src/lib/specs/design-seed.js +18 -0
  221. package/src/lib/specs/frontmatter.js +44 -0
  222. package/src/lib/specs/gfm-table.js +17 -0
  223. package/src/lib/specs/old-format.js +68 -0
  224. package/src/lib/specs/revocations.js +37 -95
  225. package/src/lib/specs/screen-checklist.js +18 -17
  226. package/src/lib/stack/dotnet-build-ignores.js +47 -0
  227. package/src/lib/stack/stack-profile.js +1 -1
  228. package/src/lib/stack/stack-scan.js +267 -0
  229. package/src/lib/standards/registry.js +43 -0
  230. package/src/lib/standards/sections.js +58 -0
  231. package/src/lib/tasks/eval-node.js +4 -12
  232. package/src/lib/tasks/test-nodes.js +1 -74
  233. package/src/lib/tasks/test-runner.js +75 -117
  234. package/src/lib/telemetry/metrics.js +8 -69
  235. package/src/lib/telemetry/telemetry-reader.js +5 -118
  236. package/src/lib/telemetry/verify-event.js +5 -7
  237. package/src/lib/validators/code-budget/code-budget-validator.js +1 -1
  238. package/src/lib/validators/contracts/contract-compliance-validator.js +2 -2
  239. package/src/lib/validators/reuse/reuse-validator.js +24 -48
  240. package/src/lib/validators/reuse/symbol-scanner.js +2 -4
  241. package/src/lib/validators/traceability-check.js +85 -129
  242. package/src/lib/validators/validation-runner.js +8 -88
  243. package/src/lib/validators/verify-runner.js +134 -301
  244. package/src/lib/worktree/docker-audit.js +1 -2
  245. package/src/lib/worktree/fleet-scanner.js +25 -38
  246. package/src/scripts/setup-infra.js +42 -22
  247. package/src/utils/agents-installer.js +92 -13
  248. package/src/utils/claude-settings-manager.js +0 -35
  249. package/src/utils/file-copier.js +34 -6
  250. package/src/utils/hooks-installer.js +16 -9
  251. package/src/utils/skills-installer.js +1 -2
  252. package/framework/commands/commit.md +0 -166
  253. package/framework/evals/trace-schema.md +0 -67
  254. package/framework/hooks/claude-code/core/tasks-json-guard.js +0 -83
  255. package/framework/hooks/claude-code/core/trace-autogen.js +0 -277
  256. package/framework/hooks/git/pre-commit/specs.sh +0 -50
  257. package/framework/hooks/shared/tasks-validator.js +0 -111
  258. package/framework/rubrics/backend.json +0 -41
  259. package/framework/rubrics/default.json +0 -36
  260. package/framework/rubrics/frontend.json +0 -36
  261. package/framework/rules/morph-task-tracking.md +0 -54
  262. package/framework/rules/morph-workflow.md +0 -244
  263. package/framework/schemas/tasks.schema.json +0 -79
  264. package/framework/skills/core/morph-brainstorming/SKILL.md +0 -161
  265. package/framework/skills/core/morph-implement/SKILL.md +0 -194
  266. package/framework/skills/core/morph-proposal/SKILL.md +0 -152
  267. package/framework/skills/core/morph-stack-scan/SKILL.md +0 -145
  268. package/framework/templates/docs/proposal.md +0 -192
  269. package/framework/templates/docs/spec.md +0 -57
  270. package/framework/templates/docs/ui-components.md +0 -52
  271. package/framework/templates/docs/ui-design-system.md +0 -76
  272. package/framework/templates/docs/ui-flows.md +0 -167
  273. package/framework/templates/examples/spec-examples.md +0 -91
  274. package/framework/templates/feature/decisions.md +0 -124
  275. package/framework/templates/feature/recap.md +0 -145
  276. package/framework/templates/project/validate.js +0 -97
  277. package/framework/templates/tasks.template.json +0 -17
  278. package/src/commands/state/usecase.js +0 -143
  279. package/src/commands/tasks/dag.js +0 -181
  280. package/src/dashboard/app/pages/Rubrics.jsx +0 -97
  281. package/src/dashboard/scanner/rubrics-scanner.js +0 -12
  282. package/src/lib/agents/output-collector.js +0 -76
  283. package/src/lib/evaluator-report.js +0 -91
  284. package/src/lib/specs/acervo-format.js +0 -70
  285. package/src/lib/specs/acervo-lifecycle.js +0 -264
  286. package/src/lib/specs/done-criteria-check.js +0 -200
  287. package/src/lib/specs/usecase-check.js +0 -301
  288. package/src/lib/specs/usecase-promoter.js +0 -301
  289. package/src/lib/specs/usecase-registry.js +0 -237
  290. package/src/lib/tasks/dispatch-planner.js +0 -319
  291. package/src/lib/tasks/mermaid-renderer.js +0 -132
  292. package/src/lib/tasks/task-classifier.js +0 -30
  293. package/src/lib/tasks/task-parser.js +0 -209
  294. package/src/lib/tasks/tasks-json-parser.js +0 -296
  295. package/src/lib/tasks/test-scope.js +0 -597
  296. package/src/lib/validators/architecture/architecture-validator.js +0 -270
  297. package/src/lib/validators/architecture/index.js +0 -7
  298. package/src/lib/validators/css/css-validator.js +0 -340
  299. package/src/lib/validators/css/index.js +0 -7
  300. package/src/lib/validators/design-system/design-system-validator.js +0 -237
  301. package/src/lib/validators/design-system/index.js +0 -7
  302. package/src/lib/validators/score-aggregator.js +0 -244
  303. package/src/lib/validators/ui/index.js +0 -7
  304. package/src/lib/validators/ui/ui-contrast-validator.js +0 -422
@@ -1,161 +0,0 @@
1
- ---
2
- name: morph-brainstorming
3
- description: Entende o negócio, os usuários e a arquitetura antes de qualquer planejamento técnico. Varre o ambiente primeiro, monta a árvore de decisões abertas e abre com a escolha de modo de descoberta (entrevista uma-pergunta-por-vez ou automático). Para projetos existentes, detecta desvios de stack e propõe plano de compliance.
4
- version: core
5
- when-to-invoke: ao receber um novo request de feature, antes de morph-plan
6
- user-invokable: true
7
- cliVersion: "8.46.0"
8
- ---
9
-
10
- # morph-brainstorming
11
-
12
- ## Objetivo
13
- Garantir que o planejamento técnico parta de entendimento real do negócio e do contexto técnico existente — não de suposições. Output é o `proposal.md` aprovado pelo Gate 1.
14
-
15
- ## Quando invocar
16
- Ao iniciar uma nova feature — antes de qualquer especificação técnica ou planejamento.
17
-
18
- ## Stack padrão (baked in)
19
-
20
- O harness conhece o stack por padrão (backend .NET 10 + VSA + EF Core/Neon, IA via MAF, frontend Next.js/Tailwind/Shadcn) e a lista de padrões proibidos (`Guid.NewGuid()`, classes não-sealed, Service/Manager layer, repository genérico, SQL cru). **Não pergunte sobre tecnologia a menos que haja ambiguidade real** — stack nunca entra na árvore de decisões. Regra canônica: `MORPH.md` § "Stack baked-in".
21
-
22
- ## Modo bug-lean (`workType: bug`)
23
-
24
- Quando a feature tem `workType: bug` (roteada pela `morph-proposal` — ver MORPH.md §2.1 "Roteamento por tipo de trabalho"), o brainstorming é enxuto. A varredura (Parte 0) continua rodando normalmente — o diagnóstico precisa do contexto técnico —, mas a árvore da Parte 1 é de **repro, diagnóstico e comportamento do sistema**, não de negócio; em modo automático (Parte 3) isso significa no máximo 1 pergunta de repro, e só se o pedido original não deixar claro. O `proposal.md` (Parte 4) foca em **Repro / Diagnóstico / Root cause provável / Escopo do fix / Conflitos com o acervo**, sem as seções de negócio completas.
25
-
26
- Para `workType: feature` (ou features sem `workType` — compat, ver MORPH.md §2.1), o fluxo completo abaixo permanece integral.
27
-
28
- ## O que fazer
29
-
30
- ### Parte 0 — Varredura (antes de qualquer pergunta)
31
-
32
- Fato não se pergunta. Antes de levar a primeira pergunta ao usuário, levante o que o ambiente já responde:
33
-
34
- 1. Invoque `Skill(morph-stack-scan)`. A skill:
35
- - Curto-circuita em projetos greenfield (sem source files) — retorna relatório vazio.
36
- - Em brownfield, varre stack atual (.csproj, package.json, migrations), padrões (Guid.NewGuid vs Guid.CreateVersion7, sealed, result pattern), features existentes.
37
- - Produz `.morph/features/{feature}/0-proposal/stack-scan.md`.
38
-
39
- 2. Leia o contexto que já existe no projeto: `.morph/context/` (se existir), `.morph/config/config.json` (stack, integrations, trust), as features ativas em `.morph/features/`, o **acervo de use cases** em `.morph/specs/usecases/` e o **índice de ADRs ativos** em `.morph/specs/adrs/` (um arquivo por ADR, se existir). O comportamento já implementado é o contexto mais barato que existe — e é ele que evita perguntar o que o sistema já responde.
40
-
41
- O acervo tem ciclo de vida: UC com `status: superseded` **não é o comportamento vigente** — o vigente é o `superseded_by`, e `scope` (quando existe) diz onde o antigo ainda vale. Decisão vigente é a do índice; os `decisions.md` de `.morph/archive/` são **história, não instrução** — abra um só para entender por que algo é como é, nunca para decidir.
42
-
43
- 3. **Conflitos com o acervo — avise, não entreviste.** Para cada UC vigente, ADR do índice ou documento de `.morph/context/` que o pedido novo **contradiz**:
44
- - **Avise o usuário** — uma linha por conflito no resumo que abre a Parte 2 (fonte, o que ela diz, o que o pedido muda). Aviso, não pergunta.
45
- - **Pedido explícito sobre o ponto → vale o mais novo.** Registre a escolha na coluna **Decisão** da seção de conflitos (o que muda, o que o antigo ainda cobre) e siga. Só entra na árvore (Parte 1) o conflito que o pedido deixa **ambíguo** — "o admin passa a Geist" não diz nada sobre a vitrine, então a vitrine é decisão; o admin não é.
46
- - Todo conflito vai para a seção **Conflitos com o acervo** do `proposal.md` (Parte 4). A `2-plan/` só abre depois do Gate 1, então é a `morph-plan` que transforma cada decisão pelo novo em ADR no `decisions.md` e em linha de revogação no `spec.md` (§3) — é essa linha que o `finish` aplica ao acervo.
47
-
48
- 4. Reconciliação de design-system (se aplicável): comparar `.morph/context/design-system.md` (se existir) com o que foi detectado no stack-scan e com bundles/mocks recentes do usuário. Se houver **divergência** (tokens diferentes, framework version mismatch, fonte aprovada distinta), marque `signals.designSystemDivergence = true` — a escolha da fonte vira uma **decisão da árvore** (Parte 1), não uma pergunta solta. Resolvida, **reescreva o corpo** de `.morph/context/design-system.md` com a fonte escolhida — a seção que descrevia a antiga passa a descrever a nova, e o valor que ainda vale num escopo diz o escopo. O changelog guarda **só data e motivo**, nunca o valor novo: quem lê só o corpo precisa receber a resposta de hoje.
49
-
50
- 5. Desvio de stack detectado (`stack-scan.md`, seção Desvios): "a migração entra nesta feature ou vira feature separada?" — pergunta feita pelo `morph-stack-scan` ao fim da varredura — também é decisão da árvore; a resposta vai para a seção "Compliance de stack" do `proposal.md` (Parte 4).
51
-
52
- ### Parte 1 — Árvore de decisões abertas
53
-
54
- Enumere **só o que a varredura não respondeu**. Uma decisão entra na árvore quando (a) muda o escopo, o comportamento ou a arquitetura da feature, e (b) o ambiente não a resolve.
55
-
56
- Ordene por dependência: decisão que **poda** outras vem primeiro. "O fluxo é síncrono ou assíncrono?" antecede "qual é a política de retry" — a primeira resposta pode eliminar a segunda inteira.
57
-
58
- Publique a **árvore de decisões** ao usuário antes de perguntar qualquer coisa. Ela é o sinal de progresso da entrevista e a base da recomendação de modo na Parte 2.
59
-
60
- ### Parte 2 — Pergunta de abertura (modo de descoberta)
61
-
62
- Aplica-se a `workType: feature` e `bug`. **`chore` e `hotfix` não passam por aqui** — nascem com os Gates 1 e 2 carimbados `policy:{tipo}` e começam direto em `implement`.
63
-
64
- Faça **uma** `AskUserQuestion` apresentando a árvore e recomendando um modo. A recomendação sai do tamanho e do acoplamento da árvore: muitas decisões abertas, ou decisões que dependem umas das outras → recomende **entrevista**; árvore rasa ou já respondida pela varredura → recomende **automático**. A opção recomendada vai em primeiro lugar, com o sufixo `(Recomendado)` no label.
65
-
66
- ```
67
- question: "Antes de começar {feature}: entrevista ou automático? Encontrei {n} decisões abertas: {resumo da árvore}"
68
- header: "Descoberta"
69
- options:
70
- - { label: "{modo recomendado} (Recomendado)", description: "{por que a árvore recomenda este modo}" }
71
- - { label: "{o outro modo}", description: "{o que muda na prática}" }
72
- ```
73
-
74
- ### Parte 3 — Entendimento
75
-
76
- **Modo entrevista.** Percorra a árvore, **uma pergunta por chamada** de `AskUserQuestion` — perguntas em lote desorientam e impedem que uma resposta pode ramos. Regras:
77
-
78
- - Toda pergunta traz **resposta recomendada**, como primeira opção, marcada `(Recomendado)`.
79
- - Cada resposta risca, poda ou abre ramos; mostre a árvore atualizada quando ela mudar de forma.
80
- - Fato descoberto no ambiente nunca vira pergunta. As **decisões** são do usuário; os **fatos** são seus.
81
- - Termina quando a árvore zera. Então apresente o **entendimento compartilhado** (problema, escopo com exclusões, usuários e fluxos, riscos) — a confirmação dele é o Gate 1, que **pausa sempre** neste modo.
82
- - O usuário pode encerrar a entrevista a qualquer momento; o que ficou aberto vira exclusão explícita de escopo no `proposal.md`.
83
-
84
- **Modo automático.** Até 4 perguntas via `AskUserQuestion` cobrindo o que a árvore deixou aberto:
85
- - Qual problema de negócio esta feature resolve?
86
- - Quem são os usuários afetados e quais são os fluxos críticos deles?
87
- - Qual é o critério de sucesso — como saberemos que a feature está pronta?
88
- - Há integrações externas, dependências de outras features ou restrições de prazo?
89
-
90
- Árvore vazia → nenhuma pergunta. O Gate 1 segue trust-aware (regras do MORPH.md §5).
91
-
92
- **Em `workType: bug`**, a árvore é de **repro, diagnóstico e comportamento do sistema** — não de negócio. Em modo automático vale o bug-lean: no máximo 1 pergunta de repro, e só se o pedido original não deixar claro.
93
-
94
- ### Parte 4 — Produção do proposal.md
95
-
96
- 1. Produza `proposal.md` em `.morph/features/{feature}/0-proposal/` com:
97
- - **Problema:** o que está sendo resolvido e para quem (máx. 2 parágrafos)
98
- - **Escopo:** o que está incluído e o que está explicitamente excluído — registre se a mudança cria ou altera superfície de UI (componente, página, tela, estilo, fluxo de navegação): é o fato que decide o roteamento para o ramo uiux na `morph-proposal` (critério objetivo em `MORPH.md` §2.1)
99
- - **Usuários e fluxos críticos:** quem usa e qual é o caminho principal
100
- - **Stack:** confirme o stack padrão ou documente desvios aprovados
101
- - **Riscos e dependências:** o que pode dar errado, o que esta feature depende
102
- - **Compliance de stack:** "Em compliance" ou lista de desvios detectados e plano de resolução
103
- - **Conflitos com o acervo:** os conflitos da Parte 0 (passo 3), numa tabela `Fonte | O que diz hoje | O que o pedido muda | Decisão` — ou `Nenhum conflito encontrado.`. A seção existe sempre, também no bug-lean: ausente, ela diz que a checagem não rodou (o `validate-feature` avisa)
104
-
105
- **Não escreva critérios de aceite aqui.** O comportamento verificável mora nos **use cases**, destilados pela `morph-plan` na fase seguinte (`2-plan/usecases/UC-{nn}-{slug}.md`), onde cada pós-condição precisa ser observável em teste e chega literal ao `doneCriteria` das tasks. O `proposal.md` responde **o quê e por quê**; os use cases respondem **como o sistema se comporta**. Duplicar aqui produz duas fontes que divergem no primeiro ajuste.
106
-
107
- **Se `workType: bug`** (modo bug-lean, ver nota no início da skill), substitua a lista acima pela estrutura enxuta: **Repro** (passos para reproduzir), **Diagnóstico** (o que foi observado/investigado), **Root cause provável**, **Escopo do fix** (o que muda, o que fica de fora) e **Conflitos com o acervo** — sem as seções de negócio completas do fluxo `feature`. A condição verificável de que o bug foi corrigido vira a **pós-condição** que faltava no use case do acervo (`.morph/specs/usecases/`), corrigida ou acrescentada na fase plan.
108
-
109
- Um bom proposal.md tem no máximo 2 páginas. Se está crescendo além disso, o escopo precisa ser cortado.
110
-
111
- 2. Apresente o Gate 1 segundo o modo de descoberta e o trust mode.
112
-
113
- **Modo entrevista** (Parte 2) é a única exceção genuína: pausa sempre, e `shouldPauseGate` não tem esse conceito — `discoveryMode` não está entre as chaves que `gate-check --signals` aceita sobrescrever. Registre direto, sem `gate-check`:
114
- ```
115
- morph-spec gate-decision {feature} proposal --pause true --reason "modo entrevista — entendimento compartilhado confirmado pelo usuário" --signals '{"discoveryMode":"interview"}'
116
- ```
117
-
118
- **Fora do modo entrevista** (o caminho comum), rode `morph-spec gate-check {feature} proposal [--json]` — lê `trust` de `.morph/config/config.json`, decide via `shouldPauseGate` e persiste `gateDecisions.proposal` com timestamp server-side, imprimindo `pause`/`reason`/`signals`. Se a Parte 0 detectou divergência de design-system (leitura semântica — o `gate-check` não a vê sozinho no disco), repasse-a: `designSystemDivergence` é uma das poucas chaves que `--signals` aceita sobrescrever aqui:
119
- ```
120
- morph-spec gate-check {feature} proposal --signals '{"designSystemDivergence":true}'
121
- ```
122
-
123
- **Nunca edite `feature.json` à mão** (o Edit manual colide com o hook state-sync — erro "file modified since read"). Os dois comandos gravam `gateDecisions.proposal = { pause, reason, signals, trust, decidedAt }` no mesmo lugar (shape canônico em `.morph/framework/schemas/feature.schema.json`); o hook `gate-guard.js` confere depois se a ação (pausar vs auto-aprovar) bateu com a decisão persistida.
124
-
125
- **Se `pause === true`** (manual mode OU risco detectado em auto), use `AskUserQuestion`:
126
-
127
- ```
128
- question: "Gate 1 — Proposta de {nome} aprovada?{ reason ? ' Sinal de risco: ' + reason : '' }"
129
- header: "Gate 1"
130
- options:
131
- - { label: "aprovado, prosseguir", description: "Aceitar a proposta e avançar para o planejamento" }
132
- - { label: "preciso ajustar", description: "Apontar mudanças necessárias antes de prosseguir" }
133
- - { label: "cancelar feature", description: "Abortar — feature não vai avançar" }
134
- ```
135
-
136
- Aguardar resposta. Se "preciso ajustar", aplique e reapresente.
137
-
138
- **Se `pause === false`** (auto-aprovação), exibir summary curto e prosseguir sem aguardar:
139
-
140
- ```
141
- ## Gate 1 (auto-aprovado)
142
-
143
- **Feature:** {nome}
144
- **Problema:** {1 frase}
145
- **Escopo:** {incluído} | Excluído: {exclusões}
146
- **Stack:** {compliance}
147
- **Riscos:** {principal} (sinais detectados: nenhum)
148
- ```
149
-
150
- No caminho manual, o hook state-sync.js detecta a aprovação automaticamente (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} proposal`). Em modo auto sem AskUserQuestion, aprove via `morph-spec approve {feature} proposal --mode auto` (ou `morph-spec advance {feature}` para já criar a pasta 2-plan/) — nunca via Edit à mão de state.json.
151
-
152
- ## Output esperado
153
- - `.morph/features/{feature}/0-proposal/proposal.md` — proposta aprovada, com desvios de stack (se houver) resolvidos na seção "Compliance de stack" e os conflitos com o acervo listados em "Conflitos com o acervo"
154
- - Gate 1 apresentado e aprovado
155
-
156
- ## Referências
157
- - `.morph/framework/MORPH.md` — seções 1 (Papéis), 2 (Fases), 5 (Gates), Trust Mode
158
- - `morph-spec standards --find "<query>"` — para referência de standards relevantes à stack (ver `morph-standards`)
159
- - `.claude/skills/morph-stack-scan/SKILL.md` — invocada na Parte 0 (varredura), antes de qualquer pergunta
160
- - `.morph/framework/MORPH.md` §5 — regras de pausa do Gate 1 (trust mode)
161
- - `.morph/specs/usecases/` e `.morph/specs/adrs/` — o acervo vigente (UC `superseded` e `decisions.md` arquivado não são instrução); lidos na Parte 0
@@ -1,194 +0,0 @@
1
- ---
2
- name: morph-implement
3
- description: Guia a execução de cada tarefa de implementação com standard e persona adequados
4
- version: core
5
- when-to-invoke: ao iniciar cada task de implementação listada em tasks.json
6
- user-invokable: false
7
- cliVersion: "8.46.0"
8
- ---
9
-
10
- # morph-implement
11
-
12
- ## Objetivo
13
- Executar uma task com o standard e a persona certos, até o `doneCriteria` valer e o
14
- `verify` da task ficar verde, e registrar o resultado no recap.
15
-
16
- ## Quando invocar
17
- Ao iniciar cada task de `tasks.json`, antes de escrever código. Normalmente chamada pela
18
- `morph-apply`, que passa a task atual.
19
-
20
- ## O que fazer
21
-
22
- 1. **Contexto, uma vez por sessão.** Na primeira task da sessão (ou depois de um `/compact`), Read
23
- em `2-plan/spec.md`, nos use cases que a task referencia (`2-plan/usecases/UC-*.md`) e em
24
- `2-plan/decisions.md`. Nas tasks seguintes, **não releia por padrão**: o contrato do plano está
25
- congelado desde o Gate 2. Releia só o trecho que falta para a task corrente.
26
-
27
- **Correção** (a `morph-apply` devolveu a task com o `feedback` do verify vermelho ou com critério
28
- não atendido): corrija esses pontos no código existente — não reimplemente.
29
-
30
- 2. **Standard.** `morph-spec standards --find "<domínio da task>"` devolve `id · path · digest`.
31
- O digest decide; Read só no `.md` escolhido. Task MAF: os `standards/ai-agents/*.md` relevantes
32
- valem mesmo com docs externas consultadas. Nenhum standard cobre: registre em `decisions.md` e
33
- siga o critério mais conservador.
34
-
35
- 3. **Persona.** `task.agent` e `task.standards` (carimbados pelo `morph-plan`). Plano legado sem
36
- `agent`: Read em `.morph/framework/agents.json` e escolha por `domains`. O `**Persona:**` do recap
37
- registra o mecanismo real: `morph-{id}`, `general-purpose (fallback: {id})` ou `inline ({id})`.
38
-
39
- 4. **Despachar ou não.** Despache (`subagent_type: "morph-{id}"`) quando a task muda de domínio,
40
- tem effort L/XL, já falhou 3 correções no mesmo ponto, exige ler arquivo > 500 linhas, ou repete
41
- um padrão > 3 vezes. Inline só para S/M no domínio já carregado. O DAG da `morph-apply` decide
42
- quantas tasks rodam ao mesmo tempo; este passo decide quem executa cada uma.
43
-
44
- Tipo `morph-{id}` não registrado: `general-purpose` com o campo `persona` colado no prompt, e
45
- `dispatch-fallback: general-purpose ({id} não registrado)` nas `notes` da task.
46
- Template do prompt para `subagent_type: "morph-{id}"` — cole literal, só os campos entre colchetes mudam:
47
- ```
48
- Implementar [ID]: [title da task]
49
-
50
- Spec: [description completa do tasks.json]
51
- Standards: [por standard: `id` + o digest do `standards --find` + as 3-8 regras
52
- do .md que ESTA task aplica, coladas. O path vai junto só para consulta
53
- pontual — o sub-agente não relê standards inteiros]
54
- Arquivos relevantes: [os `target` de task.reuse + o que o scout/grafo apontou
55
- — é por aqui que o código existente chega ao sub-agente, que trabalha em
56
- contexto fresco. O que você já leu entra como `arquivo:linhas` + o trecho]
57
- Reuso: [task.reuse — `CONCEITO: VEREDITO → alvo`, uma linha por conceito]
58
- Done quando: [doneCriteria do tasks.json]
59
-
60
- Antes de criar tipo, componente, hook ou serviço NOVO, verifique se já
61
- existe: `morph-spec graph explain <nome>` e `graph affected <conceito>
62
- --uses-only`. Sem grafo (`no-graph`), caia para `grep -rn "<nome>"` e siga —
63
- a ausência de grafo nunca bloqueia. Se algo cobre o caso, reuse ou estenda;
64
- se criar mesmo assim, diga por que em uma linha no relatório.
65
-
66
- Leitura e turnos: cada turno custa ~10 s antes de a tool rodar, e o teto de
67
- turnos corta sem aviso. Chamadas que não dependem uma da outra vão no MESMO
68
- turno: leia de uma vez todos os arquivos que este prompt lista, dispare os
69
- Grep juntos. Use Read/Grep/Glob — nunca `grep`, `sed -n`, `cat`, `find`,
70
- `ls` via Bash. Não releia o que este prompt já traz. Em arquivo grande, `Grep`
71
- acha a linha e `Read` com `offset`/`limit` lê só o trecho; log de build/teste
72
- se lê pelo `Grep` do erro, não inteiro.
73
-
74
- Ferramentas: antes de supor a API de uma biblioteca (MAF, EF Core, Next,
75
- shadcn, SDK de provedor), consulte o MCP `context7` (`resolve-library-id` →
76
- `query-docs`). Impacto e vizinhança de símbolo vêm do grafo
77
- (`morph-spec graph`). Tool `mcp__…` não carregada se carrega com `ToolSearch`
78
- (`select:<nome>`); MCP ausente nunca bloqueia — siga com o fallback.
79
-
80
- Comentário: o padrão é nenhum. Nome, tipo e teste explicam o código; sem
81
- `///`/JSDoc em membro de aplicação, cabeçalho, banner de seção ou história
82
- da task. Só o porquê que o código não mostra, em uma linha
83
- (`architecture-code-comments`). O elo com a pós-condição vai no nome do
84
- teste. O hook `comment-guard` bloqueia a edição que adiciona história,
85
- banner ou bloco longo.
86
-
87
- Contrato do relatório final:
88
- 1. GRAVE `.morph/features/{feature}/3-implement/reports/[ID].md` ANTES de
89
- encerrar — é o retorno autoritativo, não a sua mensagem final. NÃO chame
90
- SendMessage.
91
- 2. NÃO toque em tasks.json, feature.json, state.json nem no board de sessão
92
- — todo estado é gravado exclusivamente pelo orquestrador.
93
- 3. TESTE — a prova é do orquestrador (`morph-spec verify {feature} {task}`,
94
- logo depois do seu retorno), não sua. Escreva os testes pelo orçamento:
95
- um por pós-condição, um de regressão por bug, variantes numa tabela
96
- (`[Theory]`/`it.each`). NÃO rode teste a cada marco nem faça ciclo
97
- red→green: escreva código e testes, compile, e rode SÓ o filtro dos seus
98
- testes UMA vez, em primeiro plano, antes do relatório; se falhar, corrija e rode só os que falharam. Grave a
99
- saída em arquivo (`… > .morph/logs/test-last.log 2>&1`, sem nada depois)
100
- e leia o arquivo — um pipe troca o exit do teste pelo do último comando.
101
- Em batch paralelo SEM isolamento, só compile. Com `isolation: "worktree"`,
102
- o mesmo vale no seu worktree, e o último ato é o commit na branch dele.
103
- 4. ESCOPO: no máximo 3 tasks e ~4 arquivos por dispatch. Escopo maior falha e
104
- volta — fatie antes, não depois.
105
- 5. SOBREVIVÊNCIA: o limite de turnos (`maxTurns`, no seu system prompt)
106
- corta sem aviso: commite `wip({taskId})` a cada marco (um arquivo ou
107
- uma fatia coerente escrita), não só ao fim da task — e só os seus arquivos
108
- (`git add <paths>`, nunca `-A`). Sem commit, a retomada recomeça do zero.
109
- A ~70% do limite, grave o relatório parcial no arquivo canônico: `PARCIAL`
110
- na 1ª linha, o feito e o que falta, sem critério dado como atendido. Depois
111
- siga ou pare, por decisão sua; o relatório final substitui o parcial.
112
- 6. PROCESSOS: NUNCA `taskkill /IM node.exe` (derruba os MCPs de todas as
113
- sessões). Encerre dev server pelo PID que você mesmo subiu. Build e
114
- suíte pesados rodam por `morph-spec heavy run -- <comando>`, em primeiro
115
- plano. Exit 3 é fila cheia depois da espera da própria fila: não repita
116
- nem espere em laço — diga no relatório o que não rodou.
117
- 7. RETORNO: o relatório no arquivo canônico é o retorno. `SendMessage` não é
118
- substituto do relatório e não deve ser chamado.
119
- 8. MUTAÇÃO: nunca altere, reverta, mova ou apague código de produção para ver
120
- um teste falhar (`sed`, `mv`, `git show HEAD:… >`, `git stash`, `git
121
- checkout --`). A prova de que o teste morde é do avaliador no Gate 3.
122
-
123
- Formato do relatório:
124
- (1) o que foi feito, em 2-3 frases;
125
- **Arquivos:** um item `- \`path\`` por arquivo criado ou modificado;
126
- **Critérios:** cada doneCriteria — atendido (o teste ou `arquivo:linha` que o
127
- prova) ou não atendido (por quê);
128
- (4) problemas encontrados e como foram resolvidos.
129
- ```
130
- **Passo pós-dispatch (seu, ao retomar o controle):** `morph-spec report-check {feature} {taskId} --json`. O veredito do
131
- relatório e o bloco `tree` (`dirty`, `diffstat`, `commits`, `markers`) mostram o disco que o agente
132
- deixou. Árvore suja sem explicação ou `markers` não vazio: registre no recap. Com
133
- `isolation: "worktree"`, depois de ler o relatório rode `morph-spec worktree reap --json`.
134
-
135
- **Leia `3-implement/reports/[ID].md`** — a mensagem de texto do agente é atalho, nunca a fonte.
136
- Arquivo ausente é falha de protocolo: registre e complete a partir do que ficou no disco.
137
-
138
- **`PARCIAL` na 1ª linha = a task não está pronta** — o `report-check` o acusa como `report-incomplete`.
139
- Retome o MESMO agente por `SendMessage`,
140
- colando `tree.dirty`, `tree.commits` e o que falta; ou re-despache só o que falta a partir do
141
- último `wip`. Nunca marque `done` sobre um parcial.
142
-
143
- 5. **Implementação inline.** Siga o standard e a persona. Ambiguidade não coberta pelo plano:
144
- registre em `decisions.md` e resolva pelo lado conservador, sem pausar. Testes: as cláusulas 3 e 8
145
- do template valem para você também.
146
-
147
- **Task com `3-implement/evidencias/{ID}.md` em `outputs`** (critério sobre saída de LLM): rode o
148
- eval antes do `done`, e só ele. Com nó `runner: "evals"`:
149
- `morph-spec verify {feature} --filter {id-do-nó-evals} --skip-e2e --no-persist` — escopo de
150
- feature porque no de task o nó `evals` é pulado; `--skip-e2e` porque o stack subiria;
151
- `--no-persist` porque esta execução é sonda, não prova de gate. Sem nó `evals`, rode o eval direto
152
- e registre "nenhum nó — execução manual". O arquivo traz: o critério (literal), o nó e o cenário,
153
- o modelo efetivo, a versão ou o hash do prompt (nunca o prompt cru), entrada e saída sem dado
154
- pessoal, e o veredito com a razão. Não é o `reports/{ID}.md`: aquele diz o que o agente fez; este
155
- prova, rodando, que a saída atende ao critério.
156
-
157
- 6. **Recap.** Append em `3-implement/recap.md`:
158
- ```markdown
159
- ## T{N} — {title}
160
-
161
- **Standard:** {standard-id} (`.morph/framework/standards/{path}.md`)
162
- **Persona:** {`morph-{id}` | `general-purpose (fallback: {id})` | `inline ({id})`}
163
- **Files:**
164
- - `{path}`
165
-
166
- {2-3 frases}
167
- ```
168
- Sem standard que cubra: `Standard: ad-hoc (see decisions.md ADR-{N})`. O `validate-completion`
169
- cobra o bloco.
170
-
171
- 7. **Audite antes do `done`:** `morph-spec report-check {feature} {taskId} --json`. `report-stale` =
172
- relatório completo e velho (a task seguiu escrevendo depois dele): **não re-despache** — leia
173
- `observed` (escritas reais, do `events.jsonl`) e atualize o relatório. Demais vereditos:
174
- `MORPH.md` §6.
175
-
176
- 8. Atualizar `tasks.json` marcando a task como `done` (Edit, só campos mutáveis):
177
- - `status`: `pending` | `in_progress` | `done` | `skipped` | `blocked`.
178
- - `outputs` DEVE listar TODO arquivo criado ou modificado pela task, inclusive artefato auxiliar
179
- fora do plano (factory, seed, config gerada). Arquivo em produção sem dono em `outputs` é falha de
180
- protocolo que o Gate 3 aponta. Deleções vão em `notes` (string única), nunca em `outputs`.
181
- - Divergiu do planejado: o porquê em `notes` na mesma edição — o hook exige.
182
-
183
- 9. Quando invocada por `morph-apply`, devolva o controle a ela e não rode a suíte do projeto: o `verify {feature} {task}` é do orquestrador. **Única exceção:** a execução de evidência do passo 5, filtrada ao nó `evals`, com `--skip-e2e` e `--no-persist`. No loop por task o recorte é automático (o `group` escolhe as suítes, os testes de `outputs` estreitam o comando; `--filter` só força a escolha de suítes, `--full` desliga o recorte); a suíte inteira roda no Gate 3 e no CI, sem filtro. Invocada manualmente: siga para a próxima task ready.
184
-
185
- ## Output esperado
186
- - Código conforme o standard; `3-implement/reports/{taskId}.md` quando despachada
187
- - `3-implement/evidencias/{taskId}.md` na task que o lista em `outputs`
188
- - `recap.md` com o bloco da task; `tasks.json` com a task `done`
189
- - `decisions.md` quando houve decisão não trivial
190
-
191
- ## Referências
192
- - `morph-spec standards --find` — passo 2
193
- - `.morph/framework/MORPH.md` §6 — dispatch e contrato do relatório
194
- - `.morph/framework/CLI.md`, seção "Suítes de teste" — recorte por task
@@ -1,152 +0,0 @@
1
- ---
2
- name: morph-proposal
3
- description: Orquestra a fase de proposta+plano de uma feature morph-spec. Encadeia morph-brainstorming (Gate 1) e morph-plan (Gate 2). Em trust:auto pula gates sem sinais de risco.
4
- version: core
5
- when-to-invoke: ao receber instrução "use /morph-proposal" do usuário, ou ao iniciar uma nova feature
6
- user-invokable: true
7
- cliVersion: "8.46.0"
8
- ---
9
-
10
- # morph-proposal
11
-
12
- ## Objetivo
13
-
14
- Conduzir uma feature do request inicial até o plano aprovado (Gate 2), sem intervenção do usuário entre os gates quando `trust: "auto"` e sem sinais de risco.
15
-
16
- ## Quando invocar
17
-
18
- - Usuário pede "use /morph-proposal {feature}" ou "vamos planejar {feature}".
19
- - Início de qualquer feature nova num projeto morph-spec.
20
- - Em sessões retomadas, antes de continuar uma feature em progresso, verificar via `.morph/features/{feature-name}/feature.json` (estado autoritativo da feature) se ela já passou pelos Gates.
21
-
22
- ## Argumentos
23
-
24
- - `{feature-name}` — nome em kebab-case da feature. Se ausente, perguntar via `AskUserQuestion`.
25
-
26
- ## Pré-condições
27
-
28
- - `.morph/config/config.json` existe (rode `morph-spec init` antes).
29
- - Stack está definido (padrão: VSA + .NET 10 + MAF + Next.js + Neon).
30
-
31
- ## Fluxo
32
-
33
- ### 0. Roteamento por tipo de trabalho
34
-
35
- Antes de qualquer trabalho de negócio, classifique o pedido. Se `{feature-name}` ainda não foi determinado, pergunte via `AskUserQuestion` antes desta chamada (ver Argumentos):
36
-
37
- ```
38
- morph-spec create {feature-name} --request "<pedido do usuário>"
39
- ```
40
-
41
- (ou `--type <tipo> --description "<o quê/porquê>"` diretamente quando o tipo é óbvio pelo pedido — ex.: o usuário já diz "isso é um hotfix"). O `--request` **serve de semente da descrição**: toda feature nasce com `name` (o slug) e `description` (obrigatória) carimbados. Sem `--request` nem `--description`, o `create` recusa — nada de scaffolds anônimos.
42
-
43
- - **Classificação `high` confidence** — a feature nasce com o `workType` decidido pelo detector determinístico (keywords: `hotfix` — "produção caiu/urgente/incident/p0"; `bug` — "bug/corrigir/exception/regressão"; `chore` — "typo/rename/bump/config/docs/cleanup"). Prossiga para o branch correspondente abaixo.
44
- - **Exit 2** (empate `tie` ou nenhum sinal `none`) — o comando sai sem criar a feature e imprime `{ needsDecision, candidates, matched }`. **Você é o roteador**: decida o tipo entre os candidatos e re-rode com `morph-spec create {feature-name} --type <tipo> --request "<pedido do usuário>"` (o `--request` re-passado carimba a descrição). Só use `AskUserQuestion` para o usuário quando o pedido for genuinamente indeterminado — a maioria dos empates o roteador resolve sozinho pelo contexto da conversa.
45
-
46
- **Branches por tipo** (dimensionamento completo em `MORPH.md` §2.1):
47
-
48
- - **`hotfix`** → invoque `Skill(morph-hotfix)` passando `{feature-name}` e **ENCERRE** — não siga o restante deste fluxo. A skill cuida de scout, brief, fix cirúrgico, test loop e Gate 3 (sempre humano).
49
- - **`chore`** → fast-track: os Gates 1 e 2 já nasceram carimbados `policy:chore` no `create`. Escreva um `2-plan/tasks.json` mínimo (1-3 tasks) e invoque `Skill(morph-apply)` diretamente — **exceção documentada** à regra do passo 7 ("não despachar `morph-apply` automaticamente"): não pausar numa mudança óbvia é exatamente o valor do fast-track.
50
- - **`bug`** → siga para `Skill(morph-brainstorming)` em modo **bug-lean**: produz um `proposal.md` enxuto (repro / diagnóstico / root cause / escopo do fix — não a proposta completa de uma feature nova; **sem critérios de aceite**, que moram na pós-condição do use case) e depois um plano enxuto via `Skill(morph-plan)`. Gates 1 e 2 continuam trust-aware (passos 3 e 6) — só o conteúdo dos artefatos é mais curto.
51
- - **`feature`** (default — inclui features criadas antes do v8 sem `workType`) → siga o fluxo completo abaixo (passos 1-7): brainstorming → Gate 1 → plan → Gate 2.
52
-
53
- ### 1. Determinar feature name e estado
54
-
55
- - Se argumento ausente: perguntar via `AskUserQuestion` (1 pergunta, header "Feature").
56
- - Verificar `.morph/features/{feature-name}/`:
57
- - Se `0-proposal/proposal.md` existe e tem conteúdo: pular para passo 3.
58
- - Caso contrário: rode `morph-spec create {feature-name} --description "<resumo do pedido do usuário>"` — cria `.morph/features/{feature-name}/0-proposal/` e o `feature.json` canônico (shape em `.morph/framework/schemas/feature.schema.json`) num passo só, server-side, com `name`+`description` carimbados. A `--description` é **obrigatória** no nascimento (ou `--request`, que a semeia). Não crie a estrutura à mão nem dependa do nascimento implícito via hook no primeiro Write. Depois siga o passo 2.
59
-
60
- ### 2. Invocar `Skill(morph-brainstorming)`
61
-
62
- Passa o nome da feature. A skill é a **dona da fase de entendimento** — não re-descreva o comportamento dela aqui. Em resumo: varre o ambiente antes de perguntar qualquer coisa (`Skill(morph-stack-scan)` + contexto do projeto + acervo de use cases), monta a **árvore de decisões abertas**, abre com a escolha de **modo de descoberta** (entrevista ou automático — só `feature` e `bug`), detecta divergência entre fontes de design-system (`signals.designSystemDivergence`) e produz `proposal.md` em `.morph/features/{feature}/0-proposal/`. Detalhes em `.claude/skills/morph-brainstorming/SKILL.md`.
63
-
64
- No **modo entrevista** o Gate 1 pausa sempre — a confirmação do entendimento compartilhado é o gate. O modo escolhido chega ao passo 3 em `gateDecisions.proposal.signals.discoveryMode`.
65
-
66
- ### 3. Gate 1 (trust-aware)
67
-
68
- A decisão de pausa já foi tomada e persistida pela `morph-brainstorming` (Parte 4): `morph-spec gate-check {feature} proposal` no caminho comum (`shouldPauseGate`; divergência de design-system detectada entra via `--signals`), ou `gate-decision` manual quando `discoveryMode: "interview"` — o único sinal que `shouldPauseGate` não representa. Leia `gateDecisions.proposal` em `feature.json` (ou o output do comando) para `pause`/`reason`.
69
-
70
- **Se `pause === true`**, apresentar via `AskUserQuestion`:
71
-
72
- ```
73
- question: "Gate 1 — Proposta de {feature} aprovada? Sinal de risco: {reason}"
74
- options:
75
- - { label: "aprovado, prosseguir", description: "Aceitar a proposta e avançar para o planejamento" }
76
- - { label: "preciso ajustar", description: "Apontar mudanças necessárias na proposta" }
77
- - { label: "cancelar feature", description: "Abortar — feature não vai avançar" }
78
- header: "Gate 1"
79
- ```
80
-
81
- Aguardar resposta. Se "preciso ajustar", aplicar ajustes e reapresentar o gate.
82
-
83
- **Se `pause === false`**, exibir summary curto e prosseguir:
84
-
85
- ```
86
- ## Gate 1 (auto-aprovado)
87
- Feature: {nome}
88
- Problema: {1 frase}
89
- Escopo: {incluído} | Excluído: {exclusões}
90
- Stack: {compliance}
91
- ```
92
-
93
- No caminho manual, o hook `state-sync.js` registra a aprovação automaticamente via PostToolUse quando a `AskUserQuestion` é respondida com "aprovado" (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} <gate>`). Em `trust: auto` (sem AskUserQuestion), **aprove via CLI — nunca via Edit à mão de state.json**:
94
-
95
- ```
96
- morph-spec approve {feature} proposal --mode auto
97
- # ou, para já aprovar o Gate 1 e criar a pasta 2-plan/ num passo só:
98
- morph-spec advance {feature}
99
- ```
100
-
101
- ### 3a. Roteamento uiux (após o Gate 1)
102
-
103
- Critério objetivo em `MORPH.md` §2.1: a mudança cria ou altera superfície de UI (componente, página, tela, estilo, fluxo de navegação)?
104
-
105
- - **Sim** → em vez do `advance {feature}` do passo 3, rode `morph-spec advance {feature} --design` (cria `1-design/`) e invoque `Skill(morph-uiux)`. Ela conduz a fase de design e, com o Gate uiux aprovado, devolve o controle aqui — siga para o passo 4.
106
- - **Não** → nenhuma ação extra; o `advance {feature}` do passo 3 já criou `2-plan/` direto.
107
-
108
- ### 4. Verificar retomada antes de morph-plan
109
-
110
- - Se `.morph/features/{feature}/2-plan/spec.md` já existe: pular para passo 6 (Gate 2).
111
-
112
- ### 5. Invocar `Skill(morph-plan)`
113
-
114
- A skill lê `proposal.md` e produz:
115
- - `usecases/UC-*.md` — o comportamento, com pós-condições testáveis
116
- - `spec.md` — especificação técnica, com a seção `## Contrato de implementação`
117
- - `tasks.json` — task breakdown estruturado validado contra `.morph/framework/schemas/tasks.schema.json`
118
- - `decisions.md` — apenas se houver decisões não triviais
119
-
120
- ### 6. Gate 2 (trust-aware)
121
-
122
- Mesma mecânica do passo 3: a decisão já foi tomada e persistida pela `morph-plan` (passo 6) — `morph-spec gate-check {feature} plan` no caminho comum (`shouldPauseGate` sobre `taskCount` do disco; `designSystemDivergence`/`standardsViolations` via `--signals` quando aplicável — não são herdados automaticamente entre gates), ou `gate-decision` manual para risco que nenhuma dessas chaves representa. Leia `gateDecisions.plan` para `pause`/`reason` e apresente com o mesmo template (AskUserQuestion ou auto-aprovação) do passo 3.
123
-
124
- ### 7. Conclusão
125
-
126
- - Sinalizar ao usuário: "Plano aprovado. Rode `/morph-apply {feature}` (ou peça 'implementar {feature}') para iniciar a execução."
127
- - Não dispachar `morph-apply` automaticamente — usuário decide quando começar.
128
-
129
- ## Anti-padrões
130
-
131
- - Não pular o Gate 1 mesmo em trust:auto se houver divergência detectada.
132
- - Não escrever código nesta fase — apenas artefatos de planejamento.
133
- - Não perguntar sobre stack — o stack padrão está em MORPH.md.
134
- - Não rodar o pipeline completo de 5 fases num `chore` ou `bug` óbvio — o Passo 0 existe para dimensionar o trabalho pelo `workType`, não para ser pulado "para simplificar".
135
-
136
- ## Output esperado
137
-
138
- - `.morph/features/{feature}/0-proposal/proposal.md`
139
- - `.morph/features/{feature}/1-design/` (se o ramo uiux — passo 3a — foi tomado)
140
- - `.morph/features/{feature}/2-plan/spec.md`
141
- - `.morph/features/{feature}/2-plan/tasks.json`
142
- - Gates 1 e 2 registrados aprovados em `.morph/features/{feature}/feature.json` (autoritativo) — via `morph-spec approve`/`morph-spec advance` em auto, ou via hook state-sync no caminho manual.
143
-
144
- ## Referências
145
-
146
- - `.morph/framework/MORPH.md` — charter NLH completo
147
- - `.morph/framework/MORPH.md` §2.1 — roteamento por tipo de trabalho (Passo 0)
148
- - `.claude/skills/morph-brainstorming/SKILL.md`
149
- - `.claude/skills/morph-uiux/SKILL.md` — invocada no passo 3a quando a feature toma o ramo uiux
150
- - `.claude/skills/morph-plan/SKILL.md`
151
- - `.claude/skills/morph-hotfix/SKILL.md` — pipeline invocado pelo branch `hotfix` do Passo 0
152
- - `.morph/framework/MORPH.md` §5 — regras de pausa de gate (trust mode)