@polymorphism-tech/morph-spec 8.47.0 → 9.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (377) hide show
  1. package/CLAUDE.md +51 -43
  2. package/README.md +39 -38
  3. package/bin/morph-spec.js +41 -113
  4. package/bin/validate.js +1 -147
  5. package/claude-plugin.json +1 -1
  6. package/docs/CHEATSHEET.md +1 -1
  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 +86 -21
  11. package/framework/commands/morph-apply.md +5 -28
  12. package/framework/commands/morph-archive.md +1 -1
  13. package/framework/commands/morph-hotfix.md +8 -8
  14. package/framework/commands/morph-infra.md +1 -1
  15. package/framework/commands/morph-preflight.md +2 -3
  16. package/framework/commands/morph-status.md +4 -4
  17. package/framework/docs/CLI.md +574 -286
  18. package/framework/evals/review-checklist.md +82 -41
  19. package/framework/hooks/README.md +10 -11
  20. package/framework/hooks/claude-code/core/block-destructive-worktree-removal.js +6 -49
  21. package/framework/hooks/claude-code/core/block-raw-worktree-add.js +2 -35
  22. package/framework/hooks/claude-code/core/chain.js +4 -65
  23. package/framework/hooks/claude-code/core/comment-guard.js +3 -17
  24. package/framework/hooks/claude-code/core/denylist.json +33 -3
  25. package/framework/hooks/claude-code/core/enforce-phase-writes.js +15 -63
  26. package/framework/hooks/claude-code/core/gate-guard.js +9 -78
  27. package/framework/hooks/claude-code/core/graph-refresh-kick.js +3 -24
  28. package/framework/hooks/claude-code/core/heavy-gate.js +3 -21
  29. package/framework/hooks/claude-code/core/heavy-release.js +2 -13
  30. package/framework/hooks/claude-code/core/loop-detect.js +2 -31
  31. package/framework/hooks/claude-code/core/pre-bash-denylist.js +36 -2
  32. package/framework/hooks/claude-code/core/protect-spec-files.js +25 -297
  33. package/framework/hooks/claude-code/core/state-sync.js +15 -85
  34. package/framework/hooks/claude-code/core/telemetry-log.js +15 -96
  35. package/framework/hooks/claude-code/core/validate-completion.js +37 -147
  36. package/framework/hooks/claude-code/core/warn-bash-source-write.js +23 -0
  37. package/framework/hooks/claude-code/core/worktree-context.js +15 -114
  38. package/framework/hooks/claude-code/core/worktree-create.js +6 -70
  39. package/framework/hooks/claude-code/core/worktree-env-inject.js +5 -56
  40. package/framework/hooks/claude-code/core/worktree-remove.js +5 -31
  41. package/framework/hooks/claude-code/statusline.py +55 -41
  42. package/framework/hooks/package.json +3 -0
  43. package/framework/hooks/shared/activity-logger.js +9 -89
  44. package/framework/hooks/shared/agent-reap.js +2 -17
  45. package/framework/hooks/shared/build-check.js +11 -76
  46. package/framework/hooks/shared/claim-registry.js +9 -119
  47. package/framework/hooks/shared/command-tokens.js +168 -44
  48. package/framework/hooks/shared/comment-rules.js +5 -20
  49. package/framework/hooks/shared/comment-scanner.js +11 -43
  50. package/framework/hooks/shared/comment-stripper.js +11 -85
  51. package/framework/hooks/shared/e2e-check.js +0 -0
  52. package/framework/hooks/shared/errata.js +59 -0
  53. package/framework/hooks/shared/feature-locator.js +11 -95
  54. package/framework/hooks/shared/frontend-locations.js +4 -0
  55. package/framework/hooks/shared/gate-question.js +12 -0
  56. package/framework/hooks/shared/git-exclude.js +3 -20
  57. package/framework/hooks/shared/git-paths.js +8 -104
  58. package/framework/hooks/shared/graph-freshness.js +22 -166
  59. package/framework/hooks/shared/graph-refresh.js +21 -149
  60. package/framework/hooks/shared/heavy-command.js +4 -12
  61. package/framework/hooks/shared/hook-response.js +8 -83
  62. package/framework/hooks/shared/morph-cli.js +8 -52
  63. package/framework/hooks/shared/payload-utils.js +10 -132
  64. package/framework/hooks/shared/phase-utils.js +14 -72
  65. package/framework/hooks/shared/redact-secrets.js +4 -15
  66. package/framework/hooks/shared/reparse-scan.js +6 -66
  67. package/framework/hooks/shared/slice-progress.js +99 -0
  68. package/framework/hooks/shared/source-files.js +4 -17
  69. package/framework/hooks/shared/spawn-command.js +23 -0
  70. package/framework/hooks/shared/state-reader.js +51 -247
  71. package/framework/hooks/shared/state-writer.js +9 -54
  72. package/framework/hooks/shared/stdin-reader.js +1 -11
  73. package/framework/hooks/shared/telemetry-logger.js +7 -67
  74. package/framework/hooks/shared/transcript-usage.js +7 -29
  75. package/framework/hooks/shared/worktree-root.js +7 -29
  76. package/framework/mcp/registry.json +3 -4
  77. package/framework/phases.json +23 -39
  78. package/framework/rules/csharp-standards.md +1 -1
  79. package/framework/rules/frontend-standards.md +1 -0
  80. package/framework/rules/hangfire-standards.md +1 -1
  81. package/framework/rules/neon-standards.md +1 -1
  82. package/framework/schemas/config.schema.json +14 -9
  83. package/framework/schemas/feature.schema.json +15 -50
  84. package/framework/skills/README.md +3 -4
  85. package/framework/skills/core/create-umbraco-lp/SKILL.md +1 -1
  86. package/framework/skills/core/migrate-lp-to-umbraco/SKILL.md +1 -1
  87. package/framework/skills/core/morph-apply/SKILL.md +149 -222
  88. package/framework/skills/core/morph-hotfix/SKILL.md +33 -42
  89. package/framework/skills/core/morph-machine/SKILL.md +2 -2
  90. package/framework/skills/core/morph-media/SKILL.md +1 -1
  91. package/framework/skills/core/morph-plan/SKILL.md +137 -299
  92. package/framework/skills/core/morph-review/SKILL.md +111 -136
  93. package/framework/skills/core/morph-standards/SKILL.md +27 -39
  94. package/framework/skills/core/morph-uiux/SKILL.md +94 -152
  95. package/framework/standards/STANDARDS.json +109 -1219
  96. package/framework/standards/STANDARDS.meta.json +1319 -0
  97. package/framework/standards/ai-agents/agent-archetypes.md +2 -2
  98. package/framework/standards/ai-agents/agent-session.md +1 -1
  99. package/framework/standards/ai-agents/conversational-agent-with-phases.md +4 -4
  100. package/framework/standards/ai-agents/durable-workflows-hitl.md +3 -3
  101. package/framework/standards/ai-agents/evals-with-cache.md +1 -2
  102. package/framework/standards/ai-agents/guardrails.md +1 -1
  103. package/framework/standards/ai-agents/multi-agent-patterns.md +2 -2
  104. package/framework/standards/ai-agents/observability-patterns.md +1 -1
  105. package/framework/standards/ai-agents/production.md +1 -1
  106. package/framework/standards/ai-agents/prompt-sources.md +2 -2
  107. package/framework/standards/ai-agents/providers/model-registry.md +1 -1
  108. package/framework/standards/ai-agents/rag-custom-pgvector.md +2 -2
  109. package/framework/standards/ai-agents/setup.md +3 -3
  110. package/framework/standards/ai-agents/sweet-spot.md +2 -2
  111. package/framework/standards/ai-agents/tool-adapters.md +0 -2
  112. package/framework/standards/ai-agents/vector-data-extensions.md +4 -4
  113. package/framework/standards/ai-agents/workflows.md +1 -1
  114. package/framework/standards/architecture/code-comments.md +7 -7
  115. package/framework/standards/architecture/vertical-slice/vertical-slice.md +1 -1
  116. package/framework/standards/backend/api/validation.md +1 -1
  117. package/framework/standards/backend/dotnet/vsa-handler-patterns.md +5 -5
  118. package/framework/standards/backend/integrations/hangfire/hangfire-jobs.md +1 -1
  119. package/framework/standards/backend/integrations/neon-auth/neon-auth.md +2 -2
  120. package/framework/standards/data/nosql/cache/redis.md +1 -1
  121. package/framework/standards/data/nosql/cosmos-db.md +3 -3
  122. package/framework/standards/frontend/admin-app/forms.md +1 -1
  123. package/framework/standards/frontend/design-system/art-direction.md +88 -0
  124. package/framework/standards/frontend/design-system/premium-finish.md +77 -2
  125. package/framework/standards/infrastructure/neon/neon-pgvector.md +5 -5
  126. package/framework/standards/integration/mcp/mcp-tools.md +7 -7
  127. package/framework/templates/CLAUDE.md.core.template +3 -3
  128. package/framework/templates/README.md +2 -3
  129. package/framework/templates/REGISTRY.json +15 -179
  130. package/framework/templates/docs/plan.md +72 -0
  131. package/framework/templates/docs/ui-mockups.md +4 -0
  132. package/framework/templates/dotnet/ai-kit/README.md +1 -9
  133. package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/Morph.AiKit.Tests.csproj +0 -10
  134. package/framework/templates/meta-prompts/squad-leaders/backend-squad.md +1 -1
  135. package/framework/templates/meta-prompts/squad-leaders/frontend-squad.md +1 -1
  136. package/framework/templates/meta-prompts/squad-leaders/squad-leader.md +1 -1
  137. package/framework/templates/meta-prompts/validators/pre-commit-validator.md +3 -4
  138. package/package.json +1 -1
  139. package/src/commands/context/context-refresh.js +0 -16
  140. package/src/commands/dashboard/dashboard.js +2 -8
  141. package/src/commands/e2e/e2e.js +18 -105
  142. package/src/commands/graph/affected.js +0 -14
  143. package/src/commands/graph/build.js +11 -50
  144. package/src/commands/graph/explain.js +0 -16
  145. package/src/commands/graph/status.js +1 -12
  146. package/src/commands/mcp/mcp-setup.js +4 -62
  147. package/src/commands/observability/cost.js +17 -111
  148. package/src/commands/observability/telemetry.js +1 -14
  149. package/src/commands/project/branch.js +4 -45
  150. package/src/commands/project/claim.js +4 -48
  151. package/src/commands/project/doctor-procs.js +1 -1
  152. package/src/commands/project/doctor.js +53 -307
  153. package/src/commands/project/env.js +1 -27
  154. package/src/commands/project/fleet.js +6 -35
  155. package/src/commands/project/heavy.js +3 -3
  156. package/src/commands/project/init.js +8 -68
  157. package/src/commands/project/install-plugin-cmd.js +0 -1
  158. package/src/commands/project/setup-infra-cmd.js +2 -1
  159. package/src/commands/project/stack-scan.js +58 -0
  160. package/src/commands/project/standards.js +65 -72
  161. package/src/commands/project/status.js +28 -121
  162. package/src/commands/project/update.js +31 -223
  163. package/src/commands/project/worktree.js +109 -883
  164. package/src/commands/scaffold/scaffold.js +0 -25
  165. package/src/commands/state/advance.js +65 -120
  166. package/src/commands/state/approve.js +87 -229
  167. package/src/commands/state/archive.js +23 -139
  168. package/src/commands/state/auto-approval.js +65 -0
  169. package/src/commands/state/create.js +49 -109
  170. package/src/commands/state/delete.js +11 -63
  171. package/src/commands/state/finish.js +105 -494
  172. package/src/commands/state/gate-check.js +74 -183
  173. package/src/commands/state/gate-decision.js +8 -42
  174. package/src/commands/state/handoff.js +4 -31
  175. package/src/commands/state/list.js +21 -91
  176. package/src/commands/state/report-check.js +134 -338
  177. package/src/commands/state/retype.js +12 -28
  178. package/src/commands/validation/index.js +0 -3
  179. package/src/commands/validation/mutate.js +79 -19
  180. package/src/commands/validation/plan-check.js +81 -0
  181. package/src/commands/validation/validate-feature.js +52 -216
  182. package/src/commands/validation/verify.js +45 -160
  183. package/src/core/paths/output-schema.js +9 -155
  184. package/src/core/state/feature-identity.js +1 -25
  185. package/src/core/state/gate-order.js +2 -30
  186. package/src/core/state/lifecycle-audit.js +8 -100
  187. package/src/core/state/state-manager.js +32 -395
  188. package/src/core/templates/template-registry.js +2 -97
  189. package/src/core/templates/template-renderer.js +13 -93
  190. package/src/core/templates/template-seed.js +21 -0
  191. package/src/core/work-types.js +10 -45
  192. package/src/dashboard/app/App.jsx +1 -8
  193. package/src/dashboard/app/components/ActivityFeed.jsx +2 -8
  194. package/src/dashboard/app/components/CommandPalette.jsx +4 -11
  195. package/src/dashboard/app/components/DetailPanel.jsx +1 -5
  196. package/src/dashboard/app/components/EntityLink.jsx +0 -12
  197. package/src/dashboard/app/components/ErrorBoundary.jsx +1 -8
  198. package/src/dashboard/app/components/KnowledgeMarkdown.jsx +0 -11
  199. package/src/dashboard/app/components/Markdown.jsx +0 -9
  200. package/src/dashboard/app/components/PhaseRail.jsx +0 -11
  201. package/src/dashboard/app/components/SearchFilter.jsx +0 -4
  202. package/src/dashboard/app/components/Sidebar.jsx +0 -5
  203. package/src/dashboard/app/hooks/useMorphQuery.js +1 -11
  204. package/src/dashboard/app/hooks/usePref.js +1 -5
  205. package/src/dashboard/app/lib/format.js +0 -2
  206. package/src/dashboard/app/lib/phases.js +3 -9
  207. package/src/dashboard/app/lib/project.js +0 -12
  208. package/src/dashboard/app/pages/Activity.jsx +1 -1
  209. package/src/dashboard/app/pages/AgentMap.jsx +1 -8
  210. package/src/dashboard/app/pages/FeatureDetail.jsx +139 -133
  211. package/src/dashboard/app/pages/Features.jsx +9 -16
  212. package/src/dashboard/app/pages/Guide.jsx +2 -3
  213. package/src/dashboard/app/pages/HookInspector.jsx +2 -23
  214. package/src/dashboard/app/pages/PhasePipeline.jsx +3 -7
  215. package/src/dashboard/app/pages/Portfolio.jsx +0 -1
  216. package/src/dashboard/app/pages/RulesMap.jsx +1 -16
  217. package/src/dashboard/app/pages/SkillsLibrary.jsx +1 -16
  218. package/src/dashboard/app/pages/Standards.jsx +2 -17
  219. package/src/dashboard/scanner/activity-scanner.js +14 -83
  220. package/src/dashboard/scanner/agents-scanner.js +1 -23
  221. package/src/dashboard/scanner/docs-scanner.js +1 -7
  222. package/src/dashboard/scanner/feature-status.js +2 -5
  223. package/src/dashboard/scanner/features-scanner.js +92 -113
  224. package/src/dashboard/scanner/hooks-scanner.js +5 -28
  225. package/src/dashboard/scanner/index.js +0 -4
  226. package/src/dashboard/scanner/portfolio.js +5 -29
  227. package/src/dashboard/scanner/project-api.js +8 -54
  228. package/src/dashboard/scanner/rules-scanner.js +1 -2
  229. package/src/dashboard/scanner/skills-scanner.js +2 -12
  230. package/src/dashboard/scanner/standards-scanner.js +4 -7
  231. package/src/dashboard/vite-plugin-morph-data.js +5 -19
  232. package/src/lib/ai/ai-checks.js +7 -52
  233. package/src/lib/ai/ai-project-scan.js +14 -108
  234. package/src/lib/ai/code-audit.js +7 -63
  235. package/src/lib/ai/pin-drift.js +8 -51
  236. package/src/lib/ai/registry-audit.js +11 -90
  237. package/src/lib/ci/ci-verify.js +14 -13
  238. package/src/lib/ci/github-ci.js +9 -37
  239. package/src/lib/ci/workflow-scaffold.js +2 -10
  240. package/src/lib/detectors/claude-config-detector.js +13 -74
  241. package/src/lib/detectors/index.js +8 -59
  242. package/src/lib/e2e/compose-env.js +5 -66
  243. package/src/lib/e2e/stack-teardown.js +6 -40
  244. package/src/lib/generators/architecture-scanner.js +18 -156
  245. package/src/lib/generators/handoff-generator.js +37 -112
  246. package/src/lib/generators/scaffold-generator.js +5 -101
  247. package/src/lib/generators/settings-generator.js +11 -122
  248. package/src/lib/git/branch-classifier.js +11 -84
  249. package/src/lib/git/default-branch.js +14 -169
  250. package/src/lib/git/evidence-staleness.js +2 -1
  251. package/src/lib/git/gh.js +2 -17
  252. package/src/lib/git/pending-prs.js +6 -37
  253. package/src/lib/git/pr-files.js +3 -28
  254. package/src/lib/git/pr-index.js +3 -34
  255. package/src/lib/git/tree-fingerprint.js +17 -17
  256. package/src/lib/git/tree-state.js +6 -33
  257. package/src/lib/graph/god-nodes.js +2 -22
  258. package/src/lib/graph/graph-health.js +3 -24
  259. package/src/lib/graph/graph-loader.js +5 -56
  260. package/src/lib/graph/graphify-runtime.js +7 -37
  261. package/src/lib/graph/graphifyignore.js +8 -74
  262. package/src/lib/graph/sanitize.js +16 -136
  263. package/src/lib/heavy/cleanup.js +2 -6
  264. package/src/lib/installers/effects.js +8 -93
  265. package/src/lib/installers/mcp-installer.js +9 -169
  266. package/src/lib/installers/memory-installer.js +8 -33
  267. package/src/lib/installers/templates-reconcile.js +5 -60
  268. package/src/lib/mutation/commands.js +3 -2
  269. package/src/lib/mutation/dotnet-introspection.js +281 -0
  270. package/src/lib/mutation/plan.js +14 -6
  271. package/src/lib/mutation/runner.js +1 -1
  272. package/src/lib/mutation/subset.js +47 -13
  273. package/src/lib/plan/artifact-vocabulary.js +40 -0
  274. package/src/lib/plan/checks.js +208 -0
  275. package/src/lib/plan/plan-parser.js +204 -0
  276. package/src/lib/plan/plan-template.js +18 -0
  277. package/src/lib/projects/registry.js +7 -44
  278. package/src/lib/review-reports.js +204 -0
  279. package/src/lib/risk-detector.js +131 -274
  280. package/src/lib/specs/adr-index.js +38 -85
  281. package/src/lib/specs/design-seed.js +18 -0
  282. package/src/lib/specs/frontmatter.js +31 -0
  283. package/src/lib/specs/gfm-table.js +11 -0
  284. package/src/lib/specs/revocations.js +31 -102
  285. package/src/lib/specs/screen-checklist.js +56 -132
  286. package/src/lib/stack/dotnet-build-ignores.js +43 -0
  287. package/src/lib/stack/stack-profile.js +1 -28
  288. package/src/lib/stack/stack-scan.js +260 -0
  289. package/src/lib/stack-filter.js +4 -27
  290. package/src/lib/standards/registry.js +37 -0
  291. package/src/lib/standards/sections.js +47 -0
  292. package/src/lib/standards/verified-against.js +19 -191
  293. package/src/lib/tasks/eval-node.js +23 -179
  294. package/src/lib/tasks/linux-runner.js +18 -142
  295. package/src/lib/tasks/test-nodes.js +43 -313
  296. package/src/lib/tasks/test-runner.js +107 -447
  297. package/src/lib/telemetry/metrics.js +13 -103
  298. package/src/lib/telemetry/telemetry-reader.js +13 -238
  299. package/src/lib/telemetry/verify-event.js +4 -34
  300. package/src/lib/validators/code-budget/code-budget-validator.js +4 -44
  301. package/src/lib/validators/code-budget/index.js +0 -7
  302. package/src/lib/validators/contracts/contract-compliance-validator.js +4 -26
  303. package/src/lib/validators/contracts/index.js +0 -6
  304. package/src/lib/validators/nextjs/index.js +0 -5
  305. package/src/lib/validators/nextjs/next-component-validator.js +4 -81
  306. package/src/lib/validators/packages/index.js +0 -6
  307. package/src/lib/validators/packages/package-validator.js +6 -56
  308. package/src/lib/validators/reuse/index.js +0 -8
  309. package/src/lib/validators/reuse/reuse-validator.js +24 -137
  310. package/src/lib/validators/reuse/symbol-scanner.js +6 -62
  311. package/src/lib/validators/traceability-check.js +54 -156
  312. package/src/lib/validators/validation-runner.js +20 -125
  313. package/src/lib/validators/verify-runner.js +152 -575
  314. package/src/lib/work-type-detector.js +5 -67
  315. package/src/lib/worktree/docker-audit.js +17 -137
  316. package/src/lib/worktree/env-allocator.js +10 -98
  317. package/src/lib/worktree/feature-truth.js +12 -115
  318. package/src/lib/worktree/finish-backup.js +32 -242
  319. package/src/lib/worktree/fleet-scanner.js +31 -126
  320. package/src/lib/worktree/ignored-triage.js +15 -91
  321. package/src/lib/worktree/vscode-settings.js +2 -3
  322. package/src/lib/worktree/worktree-audit.js +21 -213
  323. package/src/lib/worktree/worktree-include.js +3 -5
  324. package/src/scripts/global-install.js +3 -9
  325. package/src/scripts/install-plugin.js +1 -13
  326. package/src/scripts/setup-infra.js +17 -138
  327. package/src/utils/agents-installer.js +92 -272
  328. package/src/utils/banner.js +4 -25
  329. package/src/utils/claude-md-injector.js +1 -37
  330. package/src/utils/claude-settings-manager.js +1 -87
  331. package/src/utils/file-copier.js +32 -90
  332. package/src/utils/hooks-installer.js +26 -296
  333. package/src/utils/skills-installer.js +4 -102
  334. package/src/utils/version-checker.js +4 -83
  335. package/framework/commands/morph-proposal.md +0 -57
  336. package/framework/evals/trace-schema.md +0 -67
  337. package/framework/hooks/claude-code/core/tasks-json-guard.js +0 -83
  338. package/framework/hooks/claude-code/core/trace-autogen.js +0 -277
  339. package/framework/hooks/git/pre-commit/specs.sh +0 -50
  340. package/framework/hooks/shared/tasks-validator.js +0 -111
  341. package/framework/rules/morph-task-tracking.md +0 -54
  342. package/framework/rules/morph-workflow.md +0 -244
  343. package/framework/schemas/tasks.schema.json +0 -79
  344. package/framework/skills/core/morph-brainstorming/SKILL.md +0 -161
  345. package/framework/skills/core/morph-implement/SKILL.md +0 -194
  346. package/framework/skills/core/morph-proposal/SKILL.md +0 -152
  347. package/framework/skills/core/morph-stack-scan/SKILL.md +0 -145
  348. package/framework/templates/docs/proposal.md +0 -192
  349. package/framework/templates/docs/spec.md +0 -57
  350. package/framework/templates/docs/ui-components.md +0 -52
  351. package/framework/templates/docs/ui-design-system.md +0 -76
  352. package/framework/templates/docs/ui-flows.md +0 -167
  353. package/framework/templates/examples/spec-examples.md +0 -91
  354. package/framework/templates/feature/decisions.md +0 -124
  355. package/framework/templates/feature/recap.md +0 -145
  356. package/framework/templates/tasks.template.json +0 -17
  357. package/src/commands/state/usecase.js +0 -143
  358. package/src/commands/tasks/dag.js +0 -181
  359. package/src/commands/utils/index.js +0 -3
  360. package/src/lib/agents/output-collector.js +0 -76
  361. package/src/lib/detectors/design-system-detector.js +0 -188
  362. package/src/lib/evaluator-report.js +0 -104
  363. package/src/lib/generators/design-system-generator.js +0 -508
  364. package/src/lib/specs/acervo-format.js +0 -70
  365. package/src/lib/specs/acervo-lifecycle.js +0 -264
  366. package/src/lib/specs/done-criteria-check.js +0 -200
  367. package/src/lib/specs/usecase-check.js +0 -301
  368. package/src/lib/specs/usecase-promoter.js +0 -301
  369. package/src/lib/specs/usecase-registry.js +0 -237
  370. package/src/lib/tasks/dispatch-planner.js +0 -319
  371. package/src/lib/tasks/dotnet-test-introspection.js +0 -632
  372. package/src/lib/tasks/mermaid-renderer.js +0 -132
  373. package/src/lib/tasks/task-classifier.js +0 -30
  374. package/src/lib/tasks/task-parser.js +0 -209
  375. package/src/lib/tasks/tasks-json-parser.js +0 -296
  376. package/src/lib/tasks/test-scope.js +0 -597
  377. package/src/utils/agent-id-mapper.js +0 -11
@@ -38,17 +38,16 @@
38
38
  "type": "object",
39
39
  "description": "One entry per gate. Written ONLY by `morph-spec approve`/`advance` (approvedBy: \"auto\") or the state-sync hook on a human \"aprovado\" answer (approvedBy: \"manual\").",
40
40
  "properties": {
41
- "proposal": { "$ref": "#/definitions/gate" },
42
- "uiux": { "$ref": "#/definitions/gate" },
43
41
  "plan": { "$ref": "#/definitions/gate" },
42
+ "uiux": { "$ref": "#/definitions/gate" },
44
43
  "review": { "$ref": "#/definitions/gate" }
45
44
  },
46
45
  "additionalProperties": false
47
46
  },
48
47
  "gateDecisions": {
49
48
  "type": "object",
50
- "description": "Trust decision persisted BEFORE acting on a gate, written ONLY by `morph-spec gate-decision` (decidedAt is server-side). Read by the gate-guard hook to verify the observed action matched the recorded decision.",
51
- "propertyNames": { "enum": ["proposal", "uiux", "plan", "review"] },
49
+ "description": "Trust decision persisted BEFORE acting on a gate, written ONLY by `morph-spec gate-decision` and `morph-spec gate-check` (decidedAt is server-side). Read by the gate-guard hook to verify the observed action matched the recorded decision.",
50
+ "propertyNames": { "enum": ["plan", "uiux", "review"] },
52
51
  "additionalProperties": {
53
52
  "type": "object",
54
53
  "required": ["pause", "reason", "signals", "trust", "decidedAt"],
@@ -57,48 +56,26 @@
57
56
  "reason": { "type": "string", "description": "The signal that drove the decision (or 'nenhum sinal de risco')." },
58
57
  "signals": {
59
58
  "type": "object",
60
- "description": "Risk signals evaluated (free-form): taskCount, evaluatorVerdict, standardsViolations, designSystemDivergence..."
59
+ "description": "Risk signals evaluated (free-form): sliceCount, planChecks, reviewReports, standardsViolations, designSystemDivergence..."
61
60
  },
62
61
  "trust": { "type": "string", "enum": ["auto", "manual"] },
63
62
  "decidedAt": { "type": "string", "format": "date-time" },
64
63
  "mockupsHash": {
65
64
  "type": ["string", "null"],
66
65
  "description": "uiux only: hash of the 1-design/mockups.md the decision saw (null = no mockup). A pause:false unlocks the auto signature only while the mockup is still this one."
67
- }
68
- },
69
- "additionalProperties": false
70
- }
71
- },
72
- "taskVerifications": {
73
- "type": "object",
74
- "description": "Deterministic verify results per task, written ONLY by `morph-spec verify` (task scope). updatedAt is server-side; attempts auto-increment. Persisted only from the primary root or the feature's own registered worktree — see verify.js decidePersistence().",
75
- "propertyNames": { "pattern": "^T\\d+$" },
76
- "additionalProperties": {
77
- "type": "object",
78
- "required": ["status", "nodes", "attempts", "updatedAt"],
79
- "properties": {
80
- "status": { "type": "string", "enum": ["pass", "fail"] },
81
- "nodes": {
82
- "type": "object",
83
- "required": ["build", "tests", "validators"],
84
- "properties": {
85
- "build": { "type": "string", "enum": ["pass", "fail", "skip"] },
86
- "tests": { "type": "string", "enum": ["pass", "fail", "skip"] },
87
- "validators": { "type": "string", "enum": ["pass", "fail", "skip"] },
88
- "e2e": { "type": "string", "enum": ["pass", "fail", "skip"], "description": "Docker bring-up + Playwright specs against the running stack. Absent on entries written before the node existed — which is why it is NOT in `required`." },
89
- "evals": { "type": ["string", "null"], "enum": ["pass", "fail", "skip", null], "description": "Eval suites, pulled out of the tests rollup. Written by the SAME function that writes the singular stamp (nodeStatuses in verify.js): the two shapes must stay identical, or a stamp would omit what the history records. null means the project declares no eval node at all — distinct from skip, which means it declares one and this run did not execute it. Absent on entries written before the field existed, which is why it is NOT in required." }
90
- },
91
- "additionalProperties": false
92
66
  },
93
- "attempts": { "type": "integer", "minimum": 1 },
94
- "updatedAt": { "type": "string", "format": "date-time" }
67
+ "source": {
68
+ "type": "string",
69
+ "enum": ["manual", "gate-check"],
70
+ "description": "Which command decided: `gate-decision` writes manual, `gate-check` writes gate-check. A manual pause:true is sticky: `gate-check` keeps it paused (manual reason, fresh signals); only a new `gate-decision --pause false` clears it."
71
+ }
95
72
  },
96
73
  "additionalProperties": false
97
74
  }
98
75
  },
99
76
  "verifications": {
100
77
  "type": "object",
101
- "description": "Deterministic verify results at feature scope, written ONLY by `morph-spec verify` (feature scope, no task id).",
78
+ "description": "Deterministic verify results at feature scope, written ONLY by `morph-spec verify`.",
102
79
  "properties": {
103
80
  "feature": {
104
81
  "type": "object",
@@ -127,8 +104,8 @@
127
104
  },
128
105
  "verification": {
129
106
  "type": "object",
130
- "description": "The single latest deterministic verify stamp (any scope), written ONLY by `morph-spec verify`. Distinct from `verifications`/`taskVerifications` above (per-scope history with attempts/nodes): this is overwritten by every verify call regardless of scope, carrying just enough to correlate a pass/fail with the exact commit it covers. Primary consumer: `morph-spec gate-check`, which feeds `status` to shouldPauseGate as `verificationStatus` — a red verify pauses the gate (risk-detector.js) — and `nodes.e2e`/`e2eReason` as `e2eStatus`/`e2eReason`, the pair that decides whether an e2e SKIP is a recorded dispensation or an absence of proof (a skip never reddens `status`, so the rollup alone is blind to it). `scope` is the third pause input: a dispensation only counts from a feature-scoped stamp (see the field below). The rest (sha/ts, and the derived `verificationStale`) is audit context.",
131
- "required": ["status", "sha", "ts", "scope"],
107
+ "description": "The single latest deterministic verify stamp, written ONLY by `morph-spec verify`. Distinct from `verifications` above (history with attempts/nodes): this is overwritten by every persisted verify, carrying just enough to correlate a pass/fail with the exact commit it covers. Primary consumer: `morph-spec gate-check`, which feeds `status` to shouldPauseGate as `verificationStatus` — a red verify pauses the gate (risk-detector.js) — and `nodes.e2e`/`e2eReason` as `e2eStatus`/`e2eReason`, the pair that decides whether an e2e SKIP is a recorded dispensation or an absence of proof (a skip never reddens `status`, so the rollup alone is blind to it). The rest (sha/ts, and the derived `verificationStale`) is audit context.",
108
+ "required": ["status", "sha", "ts"],
132
109
  "properties": {
133
110
  "status": { "type": "string", "enum": ["pass", "fail"] },
134
111
  "nodes": {
@@ -142,31 +119,19 @@
142
119
  "evals": {
143
120
  "type": ["string", "null"],
144
121
  "enum": ["pass", "fail", "skip", null],
145
- "description": "Status of the `runner: \"evals\"` entries of nodes.tests.runs[], pulled out of the rollup. The rollup cannot answer what Gate 3 asks: a red eval and a red unit test both read as tests:fail, and an eval SKIPPED at task scope leaves the rollup green. null means this project declares NO eval node - distinct from 'skip', which means it declares one and this run did not execute it; risk-detector.js pauses on the two for different reasons because they call for different actions. Absent on stamps written before this field existed."
122
+ "description": "Status of the `runner: \"evals\"` entries of nodes.tests.runs[], pulled out of the rollup. The rollup cannot answer what Gate 3 asks: a red eval and a red unit test both read as tests:fail. null means this project declares NO eval node - distinct from 'skip', which means it declares one and this run did not execute it; risk-detector.js pauses on the two for different reasons because they call for different actions. Absent on stamps written before this field existed."
146
123
  }
147
124
  },
148
125
  "additionalProperties": false
149
126
  },
150
127
  "e2eReason": { "type": ["string", "null"], "description": "The LITERAL reason the e2e node skipped (e2e-check.js's own wording), or null when it did not skip. risk-detector.js's classifyE2eSkip() reads it: 'project does not containerize' / 'does not touch runtime' are legitimate dispensations and pass; 'docker is not available' / 'requested' (--skip-e2e) / anything unclassifiable — null included — are an absence of proof and pause Gate 3. A skip recorded WITHOUT a reason is refused on purpose: a nameless dispensation is a silent no-op." },
151
128
  "sha": { "type": ["string", "null"], "description": "HEAD commit SHA at verify time (git rev-parse HEAD); null when not in a git repo or no commits yet." },
152
- "ts": { "type": "string", "format": "date-time", "description": "Server-side timestamp, same instant as the corresponding verifications/taskVerifications entry's updatedAt." },
153
- "scope": { "type": "string", "description": "'feature', or 'task:<id>' for a task-scoped verify. READ BY THE GATE, not just audit: this stamp is singular and any verify overwrites it, so a 'task:<id>' value at ship time means the last verify was NOT the feature's. risk-detector.js therefore accepts an e2e dispensation ('project'/'scope' in e2eReason) only from scope === 'feature' — a `morph-spec verify {f} {task}` of a task whose group does not touch runtime stamps exactly the legitimate-sounding reason that would otherwise buy Gate 3 for the whole feature (the last task of a feature is typically group: docs). Absent/unknown falls on the safe side, like an unclassifiable reason." },
129
+ "ts": { "type": "string", "format": "date-time", "description": "Server-side timestamp, same instant as the corresponding verifications entry's updatedAt." },
154
130
  "source": { "type": "string", "enum": ["ci"], "description": "Present only when the stamp came from `verify --ci`: the verify --json the project CI uploaded for the pushed commit, judged by the same rules as a local run. Absent = local run." },
155
131
  "ciRun": { "type": "string", "description": "URL of the CI run whose artifact wrote this stamp (with source: ci). `sha` is that run's headSha, so verificationStale compares the code CI saw with HEAD." }
156
132
  },
157
133
  "additionalProperties": false
158
134
  },
159
- "tasks": {
160
- "type": "object",
161
- "description": "Aggregate task counters (informational — the source of truth is 2-plan/tasks.json).",
162
- "properties": {
163
- "total": { "type": "integer", "minimum": 0 },
164
- "completed": { "type": "integer", "minimum": 0 },
165
- "inProgress": { "type": "integer", "minimum": 0 },
166
- "pending": { "type": "integer", "minimum": 0 }
167
- },
168
- "additionalProperties": true
169
- },
170
135
  "outputs": {
171
136
  "type": "object",
172
137
  "description": "Outputs tracked by the state-sync hook: filename → { created, path }.",
@@ -234,7 +199,7 @@
234
199
  "approved": { "type": "boolean" },
235
200
  "timestamp": { "type": ["string", "null"], "description": "ISO timestamp of the approval/revocation, null while never evaluated." },
236
201
  "approvedBy": { "type": ["string", "null"], "description": "\"auto\" (approve/advance --mode auto), \"manual\" (human in the loop), \"policy:{workType}\" (gate stamped at birth by `morph-spec create` per the work type's skippedGates — see src/core/work-types.js; the gate-guard hook only special-cases \"auto\", so policy-stamped gates stay silent to it), a --approver name, or null while never evaluated." },
237
- "selfAssessed": { "type": "boolean", "description": "Gate `review` SOMENTE. `true` quando o Gate 3 foi aprovado sem `4-review/evaluator-report.md`, via `morph-spec approve <f> review --self-assessed`. O veredito deveria vir do avaliador independente; esta flag registra a degradação em vez de deixá-la silenciosa, e aparece no `morph-spec list`." }
202
+ "selfAssessed": { "type": "boolean", "description": "Gate `review` SOMENTE. `true` quando o Gate 3 foi aprovado sem os relatórios de review exigidos (`4-review/verifier.md`, `reviewer.md`, `security.md`), via `morph-spec approve <f> review --self-assessed` ou um \"aprovado\" humano sem eles. O veredito deveria vir dos agentes independentes; esta flag registra a degradação em vez de deixá-la silenciosa, e aparece no `morph-spec list`." }
238
203
  },
239
204
  "additionalProperties": true
240
205
  }
@@ -12,10 +12,9 @@ These are the only skills the harness needs. MORPH.md references them by path.
12
12
 
13
13
  | Skill | Purpose | User-invocable |
14
14
  |----------------------|----------------------------------------------------------------------|----------------|
15
- | `morph-brainstorming` | Business understanding + brownfield scan → proposal.md (Gate 1) | yes |
16
- | `morph-stack-scan` | Detect stack drift in existing projects, report in stack-scan.md | yes |
17
- | `morph-plan` | Produce use cases + spec.md + tasks.json (Gate 2) | yes |
18
- | `morph-implement` | Execute each task with standard + persona, auto-advance between tasks| no |
15
+ | `morph-plan` | Route, scan, interview, write plan.md, plan-check and the plan gate | yes |
16
+ | `morph-uiux` | Optional design branch after the plan gate (mockups + screen checklist) | yes |
17
+ | `morph-apply` | Run the plan slices (dispatch, report-check, verify) into the review | yes |
19
18
  | `morph-review` | Final review report with SHIP/FIX verdict (Gate 3) | yes |
20
19
  | `morph-standards` | Locate and load a specific standard on demand | no |
21
20
 
@@ -4,7 +4,7 @@ description: Guia a criação de uma landing page nova ponta-a-ponta a partir do
4
4
  version: core
5
5
  when_to_use: Use quando for iniciar um novo projeto de LP com o template Umbraco genérico
6
6
  user-invocable: true
7
- cliVersion: "8.47.0"
7
+ cliVersion: "9.1.0"
8
8
  stacks:
9
9
  - umbraco
10
10
  ---
@@ -4,7 +4,7 @@ description: Migra uma landing page existente (React/Vite, Next.js estático ou
4
4
  version: core
5
5
  when_to_use: Use quando o usuário pedir "use /migrate-lp-to-umbraco {projeto}" ou descrever a necessidade de migrar uma LP para Umbraco
6
6
  user-invocable: true
7
- cliVersion: "8.47.0"
7
+ cliVersion: "9.1.0"
8
8
  stacks:
9
9
  - umbraco
10
10
  ---
@@ -1,260 +1,187 @@
1
1
  ---
2
2
  name: morph-apply
3
- description: Orquestra a execução autônoma de tasks de uma feature morph-spec. Analisa DAG de dependências em tasks.json e decide adaptativamente entre execução sequencial (auto-advance) ou paralela (Agent dispatch). Termina com morph-review e Gate 3.
3
+ description: Executa as fatias do plano de uma feature morph-spec — dispatch por persona, em ondas paralelas do plan-check, com relatório por fatia — prova a feature com um verify sem filtro e entrega à morph-review (Gate 3).
4
4
  version: core
5
- when_to_use: Use quando chegar a instrução "use /morph-apply" ou "implementar feature" com o Gate 2 aprovado
5
+ when_to_use: Use com o gate do plano aprovado, em "use /morph-apply {feature}" ou "implementar feature"
6
6
  user-invocable: true
7
- cliVersion: "8.47.0"
7
+ cliVersion: "9.1.0"
8
8
  ---
9
9
 
10
10
  # morph-apply
11
11
 
12
12
  ## Objetivo
13
13
 
14
- Levar toda task pendente a `done` — `verify` da task verde e `doneCriteria` atendido — e fechar
15
- com `morph-review` + Gate 3.
16
-
17
- ## Quando invocar
18
-
19
- Gate 2 aprovado (`feature.json → approvalGates.plan.approved`), ou o usuário pede "use /morph-apply
20
- {feature}". Sem argumento: a feature `in_progress` mais recente.
14
+ Toda fatia de `2-plan/checks.json` com relatório final em `3-implement/reports/F{n}.md`, o
15
+ `verify` da feature verde, e a entrega à `morph-review`. O progresso **é** o conjunto de
16
+ relatórios (ausente = pendente, `PARCIAL` na 1ª linha = parcial, senão feito): não há arquivo de
17
+ status para editar.
21
18
 
22
19
  ## Ritmo
23
20
 
24
21
  Comando em primeiro plano; o `verify {feature}` que passa do teto de 10 min do Bash vai com
25
- `run_in_background` e espera a notificação de término. `verify` com exit 3 (`status: "busy"`) já esperou a fila pesada
22
+ `run_in_background` e espera a notificação de término **no mesmo turno**: nunca encerre o turno
23
+ com o verify da feature rodando — o stamp que o Gate 3 lê é o dele. `verify` com exit 3 (`status: "busy"`) já esperou a fila pesada
26
24
  pelo timeout dela: no máximo uma chamada nova; persistiu, pare e avise o usuário — a máquina está
27
25
  saturada (skill `morph-machine`). Nunca `sleep`/`until` nem retentativa agendada.
28
26
 
29
- ## Fluxo
27
+ ## 1. Contexto, uma vez
30
28
 
31
- ### 1. Carregar contexto
29
+ Read em `2-plan/plan.md` e `2-plan/checks.json` uma vez por sessão (ou depois de um `/compact`):
30
+ o plano está congelado desde o gate, então não releia por padrão — só o trecho que falta.
31
+ Antes do primeiro dispatch: `.morph/config/config.json` sem `project.stack` ou `project.tests` →
32
+ declare-os a partir dos comandos de baseline do `## Contrato de implementação` e commite junto com o
33
+ `.gitignore` que o `plan-check` semeou (`bin/`/`obj/` num projeto .NET) — antes de qualquer código. Não há comando de
34
+ CLI para isso: uma edição no `config.json` na forma de `.morph/framework/schemas/config.schema.json`
35
+ (`project.tests[]` com `id` e `command`; `project.stack` com as tags unidas por `+`, ex. `dotnet+nextjs`;
36
+ mais de uma solução .NET no repositório → `project.backendPath` com a pasta da que o build compila), conferida
37
+ por `morph-spec doctor --full`.
38
+ `morph-spec plan-check {feature}` imprime as **ondas**: fatias de uma onda não dependem uma da
39
+ outra nem tocam o mesmo arquivo, até 4 por onda.
32
40
 
33
- `.morph/config/config.json → trust` e Read em `2-plan/tasks.json` (ids, `dependencies`, `effort`,
34
- `group`, `status`, `doneCriteria`).
41
+ ## 2. Fatiar
35
42
 
36
- ### 2. Análise de DAG — sequencial vs paralelo
43
+ - Uma onda por vez, até **4 agentes ao mesmo tempo**, um por fatia, `subagent_type: "morph-{id}"` (o `persona:` da fatia).
44
+ - Duas fatias em voo que escrevem o mesmo arquivo: a segunda vai em worktree (§4), rolling.
45
+ - Fatias em paralelo na mesma árvore commitam pela lista explícita de arquivos (`git add <paths>`), nunca um diretório: `git add api` leva o arquivo que a fatia vizinha acabou de escrever.
46
+ - **Inline** só para fatia pequena no domínio já carregado, com **uma linha de porquê** no relatório.
47
+ Antes de codar, leia os standards que a fatia fixa. Inline também grava `3-implement/reports/F{n}.md`,
48
+ no formato abaixo — é ele que conta o progresso.
37
49
 
38
- ```
39
- morph-spec dag {feature}
40
- ```
50
+ O hook `validate-completion` (no Stop) e o `report-check` cobram o relatório pela mesma régua
51
+ (`inspectReport`); conhecer o formato antes evita reescrever o relatório depois de dar a fatia por feita:
41
52
 
42
- Ele lê `dependencies`, `group` e `effort` (S=1, M=2, L=4, XL=8) e imprime a decisão:
43
- - ≤ 3 tasks → **sequencial**.
44
- - ≥ 2 fluxos de domínio independentes com peso (backend ‖ frontend) → **um sub-agent por fluxo, em
45
- paralelo** (§3b); cadeia longa vai inteira ao agente do fluxo.
46
- - ≥ 3 raízes independentes de effort ≥ M → raízes em **paralelo**, o resto sequencial.
47
- - Senão, sequencial com auto-advance. Raiz S roda `inline`.
53
+ ```markdown
54
+ # F{n} — {título}
48
55
 
49
- `isolation.recommended: "worktree"` (dois fluxos escrevem o mesmo path) → §3b-w. O DAG decide
50
- quantas tasks ao mesmo tempo; o `morph-implement` §4 decide quem executa cada uma —
51
- `DAG: sequencial` não significa "tudo inline". Registre a linha de decisão que o comando imprimiu.
56
+ {2-3 frases: o comportamento entregue, onde mora e como foi provado}
52
57
 
53
- ### 3a. Modo Sequencial (auto-advance)
58
+ **Arquivos:** `{path}`, `{path}`
54
59
 
55
- ```
56
- while (true):
57
- ready = tasks 'pending' com todas as dependencies 'done' (releia tasks.json)
58
- if ready vazio: break
59
- task = ready[0]
60
- marcar task.status = 'in_progress' (Edit, só campos mutáveis)
61
-
62
- attempt = 0; feedback = null; pronto = false
63
- while attempt < 3:
64
- attempt += 1
65
- // attempt 1: invoke Skill(morph-implement) with task. Nas seguintes, aplique o
66
- // feedback direto ao código — reinvoque a skill só depois de /compact ou numa
67
- // sessão nova, que descartam o conteúdo dela.
68
- implementar (ou corrigir com feedback)
69
-
70
- // OUTPUTS ANTES DO VERIFY: o recorte por task lê `outputs`.
71
- atualizar task.outputs em tasks.json (divergiu do plano → `notes` na mesma edição)
72
-
73
- run: morph-spec verify {feature} {task.id} --json
74
- if verify.status == 'fail':
75
- feedback = verify.feedback; continue // conta como tentativa
76
- // 'busy': ver "Ritmo"
77
-
78
- // cada doneCriteria com a evidência que o prova (teste, arquivo:linha) — do
79
- // relatório `reports/{task.id}.md` quando despachada, do seu código quando inline
80
- faltando = critérios sem evidência
81
- if faltando: feedback = faltando; continue
82
- pronto = true; break
83
-
84
- if pronto:
85
- // task com `3-implement/evidencias/{id}.md` em `outputs`: confira o arquivo antes do `done`
86
- // (morph-implement §5). Em batch paralelo sem isolamento o sub-agente não roda eval — o
87
- // ORQUESTRADOR roda, após o batch, `morph-spec verify {feature} --filter {id-do-nó-evals} --skip-e2e --no-persist`
88
- marcar task.status = 'done' (Edit; confirme os outputs reais)
89
- else:
90
- // 3 tentativas sem verify verde + critérios: a única pausa do loop
91
- registrar no recap as tentativas e o que faltou
92
- AskUserQuestion: "Task {id} sem verify verde e critérios atendidos após 3 tentativas — aceitar, continuar tentando, ou pular?"
93
- options: [aceitar (done com ressalva no recap), continuar (+3 tentativas), pular (blocked)]
94
- ```
60
+ **Checks:** C{n} — {teste que prova, ou `arquivo:linha`}
95
61
 
96
- > **O recorte é do loop por task.** `verify {feature} {task.id}` deixa o `group` escolher os nós e
97
- > os arquivos de teste de `outputs` estreitarem o comando; cada nó aparece em
98
- > `nodes.tests.runs[]` com `selection` e o motivo. `--filter {ids}` só força a escolha de nós (um
99
- > filtro que não casa nada é erro de uso, exit 2); `--full` desliga o recorte. A verificação
100
- > pós-batch e a do Gate 3 rodam **sem filtro**, e `verify {feature}` **nunca recorta**. Detalhe:
101
- > `.morph/framework/CLI.md`, seção "Suítes de teste".
62
+ **Standards:** `{id}`, `{id}`
63
+ ```
102
64
 
103
- > **Não há juiz LLM por task.** O que o código determinístico prova (build, testes, validadores)
104
- > está no verify; o que ele não prova — o critério do use case — se confere contra o `doneCriteria`,
105
- > com evidência. Estilo e estrutura são assunto do avaliador do Gate 3, e mesmo lá só como nota.
65
+ `**Arquivos:**` lista todo arquivo criado ou modificado; cada `C{n}` que a fatia `cobre` aparece pelo
66
+ id; relatório que abre com `PARCIAL` não conta como feito. Os relatórios **são** o registro da
67
+ implementação: o `verify` confere a união dos `**Arquivos:**` contra os
68
+ `arquivos:` das fatias (aviso, nunca reprova). `**Standards:**` nomeia os ids que o agente de fato
69
+ consultou (o `report-check` não o exige).
70
+ - Persona não registrada: `general-purpose` com o campo `persona` de `agents.json` colado, e
71
+ `dispatch-fallback: general-purpose ({id} não registrado)` no relatório.
106
72
 
107
- ### 3b. Modo Paralelo (para o subset independente)
73
+ ## 3. Dispatch — só o que muda
108
74
 
109
- Escope cada agente ao domínio: `subagent_type: "morph-{task.agent}"` e `task.standards` (carimbados
110
- pelo `morph-plan`). Plano legado sem `agent`: escolha em `.morph/framework/agents.json` por
111
- `domains`. Tipo não registrado: `general-purpose` com o campo `persona` colado, e
112
- `dispatch-fallback: general-purpose ({id} não registrado)` nas `notes`. Cap de 4 agentes ao mesmo
113
- tempo. **Cole o template literal** — só os campos entre `<>` mudam:
75
+ O contrato fixo (relatório, estado, teste, escopo, `wip`, processos, reuso, mutação e o formato do
76
+ relatório) está no corpo da persona gerada e chega a todo dispatch sem ser colado. O prompt leva:
114
77
 
115
78
  ```
116
79
  dispatch Agent (subagent_type: "morph-{id}") with prompt:
117
- contexto: spec.md, use cases da task, description completa, doneCriteria,
118
- task.reuse (REUSAR/ESTENDER/CRIAR por conceito), os paths dos alvos
119
- de reuso e o que você já leu (`arquivo:linhas` + o trecho)
120
- standards: <por standard: id + digest do `standards --find` + as 3-8 regras do
121
- .md que ESTA task aplica, coladas; o path só para consulta pontual>
122
- instrução: |
123
- Implemente esta task (ou cadeia de tasks do fluxo) sem depender do trabalho
124
- dos outros agentes deste batch: seu isolamento é de estado e de árvore de
125
- trabalho, nunca de conhecimento do codebase. Antes de criar tipo,
126
- componente, hook ou serviço NOVO, verifique se já existe: `morph-spec graph
127
- explain <nome>` e `graph affected <conceito> --uses-only`; sem grafo
128
- (`no-graph`), caia para `grep -rn "<nome>"` e siga — a ausência de grafo
129
- nunca bloqueia. Se criar mesmo assim, diga por que em uma linha no relatório.
130
-
131
- Leitura e turnos: cada turno custa ~10 s antes de a tool rodar, e o teto de
132
- turnos corta sem aviso. Chamadas que não dependem uma da outra vão no MESMO
133
- turno: leia de uma vez todos os arquivos que este prompt lista, dispare os
134
- Grep juntos. Use Read/Grep/Glob — nunca `grep`, `sed -n`, `cat`, `find`,
135
- `ls` via Bash. Não releia o que este prompt já traz. Em arquivo grande, `Grep`
136
- acha a linha e `Read` com `offset`/`limit` lê só o trecho; log de build/teste
137
- se lê pelo `Grep` do erro, não inteiro.
138
-
139
- Ferramentas: antes de supor a API de uma biblioteca (MAF, EF Core, Next,
140
- shadcn, SDK de provedor), consulte o MCP `context7` (`resolve-library-id` →
141
- `query-docs`). Impacto e vizinhança de símbolo vêm do grafo
142
- (`morph-spec graph`). Tool `mcp__…` não carregada se carrega com `ToolSearch`
143
- (`select:<nome>`); MCP ausente nunca bloqueia — siga com o fallback.
144
-
145
- Comentário: o padrão é nenhum. Nome, tipo e teste explicam o código; sem
146
- `///`/JSDoc em membro de aplicação, cabeçalho, banner de seção ou história
147
- da task. Só o porquê que o código não mostra, em uma linha
148
- (`architecture-code-comments`). O elo com a pós-condição vai no nome do
149
- teste. O hook `comment-guard` bloqueia a edição que adiciona história,
150
- banner ou bloco longo. Não modifique spec.md.
151
-
152
- Contrato do relatório final:
153
- 1. GRAVE um relatório por task em
154
- `.morph/features/{feature}/3-implement/reports/{taskId}.md` ANTES de
155
- encerrar — é o retorno autoritativo. NÃO chame SendMessage.
156
- 2. NÃO toque em tasks.json, feature.json, state.json nem no board de
157
- sessão — todo estado é gravado exclusivamente pelo orquestrador.
158
- 3. TESTE — a prova é do orquestrador (`morph-spec verify`), não sua.
159
- Testes pelo orçamento: um por pós-condição, um de regressão por bug,
160
- variantes numa tabela. NÃO rode teste a cada marco nem faça ciclo
161
- red→green: compile e rode SÓ o filtro dos seus testes UMA vez, em
162
- primeiro plano, saída em arquivo
163
- (`… > .morph/logs/test-last.log 2>&1`). Não rode `morph-spec verify`.
164
- Batch SEM isolamento: só compile. Com `isolation: "worktree"`: o mesmo
165
- dentro do seu worktree, e o último ato é o commit na branch dele —
166
- nunca faça merge.
167
- 4. ESCOPO: no máximo 3 tasks e ~4 arquivos por dispatch. Escopo maior falha e
168
- volta — fatie antes, não depois.
169
- 5. SOBREVIVÊNCIA: o limite de turnos (`maxTurns`, no seu system prompt)
170
- corta sem aviso: commite `wip({taskId})` a cada marco (um arquivo ou
171
- uma fatia coerente escrita), não só ao fim da task — e só os seus arquivos
172
- (`git add <paths>`, nunca `-A`). Sem commit, a retomada recomeça do zero.
173
- A ~70% do limite, grave o relatório parcial no arquivo canônico: `PARCIAL`
174
- na 1ª linha, o feito e o que falta, sem critério dado como atendido. Depois
175
- siga ou pare, por decisão sua; o relatório final substitui o parcial.
176
- 6. PROCESSOS: NUNCA `taskkill /IM node.exe` (derruba os MCPs de todas as
177
- sessões). Encerre dev server pelo PID que você mesmo subiu. Build e
178
- suíte pesados rodam por `morph-spec heavy run -- <comando>`, em primeiro
179
- plano. Exit 3 é fila cheia depois da espera da própria fila: não repita
180
- nem espere em laço — diga no relatório o que não rodou.
181
- 7. RETORNO: o relatório no arquivo canônico é o retorno. `SendMessage` não é
182
- substituto do relatório e não deve ser chamado.
183
- 8. MUTAÇÃO: nunca altere, reverta, mova ou apague código de produção para ver
184
- um teste falhar (`sed`, `mv`, `git show HEAD:… >`, `git stash`, `git
185
- checkout --`). A prova de que o teste morde é do avaliador no Gate 3.
186
-
187
- Formato do relatório: (1) o que foi feito, em 2-3 frases; **Arquivos:** um
188
- item `- \`path\`` por arquivo; **Critérios:** cada doneCriteria — atendido (o
189
- teste ou `arquivo:linha` que o prova) ou não (por quê); (4) problemas.
80
+ Fatia F{n} — <título>
81
+ cobre: <cada Cn com o texto literal do cenário e a `prova:`>
82
+ arquivos: <os `arquivos:` da fatia>
83
+ standards: <por id: o digest de `morph-spec standards --find` + as 3-8 regras que ESTA fatia aplica>
84
+ reuso: <as linhas de `## Reuso` que tocam a fatia — conceito, veredito, alvo>
85
+ contexto: <o que você já leu: `arquivo:linhas` + o trecho; nada que o agente tenha de reler>
86
+ relatório: .morph/features/{feature}/3-implement/reports/F{n}.md (com `**Standards:**`: os ids consultados)
87
+ worktree: <só com isolamento>
190
88
  ```
191
89
 
192
- **Passo pós-dispatch (batch SEM isolamento):** espere todos e rode `morph-spec report-check {feature} {T1} {T2} … --json`
193
- com os ids do batch. O bloco `tree` (`dirty`, `diffstat`, `commits`, `markers`) mostra o disco que
194
- os agentes deixaram; árvore suja sem explicação ou `markers` não vazio vai ao recap. Em
195
- `report-stale`, **não re-despache** — leia `observed` e atualize o relatório. Leia cada
196
- `3-implement/reports/{taskId}.md` (a mensagem do agente é atalho). Depois:
197
- - **`morph-spec verify {feature} --json` uma vez, pós-batch, sem filtro** — os agentes não o rodaram.
198
- Vermelho: corrija ou re-despache com `verify.feedback`.
199
- - Para cada task do batch:
200
- - Se verify verde e critérios atendidos (e `3-implement/evidencias/{taskId}.md` gravada, se a task a deve — checagem do §3a): marcar `done` (Edit, só campos mutáveis).
201
- - Senão: de volta a `pending` com nota — o loop sequencial (§3a) a retoma.
202
-
203
- **`PARCIAL` na 1ª linha = a task não está pronta** — o `report-check` o acusa como `report-incomplete`.
204
- Retome o MESMO agente por `SendMessage`, com
205
- `tree.dirty`, `tree.commits` e o que falta; ou re-despache só o que falta a partir do último `wip`.
206
-
207
- O template é paritário com o do `morph-implement` §4: mesmas 8 cláusulas e o mesmo formato de
208
- relatório (racional em `MORPH.md` §6).
209
-
210
- ### 3b-w. Batch isolado por worktree (quando o dag recomenda)
211
-
212
- 1. **Dispatch:** o template de §3b com `isolation: "worktree"`. O hook `WorktreeCreate` cria
213
- `worktrees/<n>` na branch `morph-task/<n>`, com junctions e `.morph/worktree.env` prontos, a partir
214
- de `morph/<feature>` quando a sessão está nela (fora dela, o prompt abre com
215
- `git merge --ff-only morph/<feature>`). Infra faltando: o agente roda `morph-spec worktree link --all`.
216
- 2. **Rolling, não por onda:** a cada relatório, `report-check {feature} {taskId}`, `git merge --no-ff
217
- <branch>` (conflito → `git merge --abort`, task volta a `pending` com nota), `verify {feature}
218
- {taskId}`, critérios, e despache na hora a task que ficou ready sem colidir com as em voo. Cap
219
- de 4. O `verify {feature}` sem filtro roda uma vez, quando nada mais está em voo.
220
- 3. **Cleanup:** depois de cada retorno e ao fim, `morph-spec worktree reap --json` remove o worktree
221
- `agent-<hex>` que parou limpo e sem commit exclusivo e lista o resto com a razão
222
- (`not-a-registered-worktree` no `remove --target` seguinte = o reaper já o levou). O que sobrar:
223
- `morph-spec worktree remove --target <path>` — NUNCA `git worktree remove` cru, que atravessa as
224
- junctions. `git branch -d morph-task/<n>` das branches integradas.
225
- 4. **Agente morto no meio:** com commit, a branch é retomável; sem, a task volta a `pending`.
226
-
227
- O subagent nunca faz merge, e unidades isoladas e não isoladas não se misturam no mesmo batch.
228
-
229
- ### 4. Conclusão de tasks
230
-
231
- Sem tasks pendentes: invoke `Skill(morph-review)`.
232
-
233
- ### 5. Gate 3
234
-
235
- Apresentado, decidido e aprovado por `morph-review` §7. Ao retomar o controle, **não re-apresente
236
- o gate** nem aprove de novo: siga para o encerramento conforme `gateDecisions.review`.
237
-
238
- ### 6. Encerramento
239
-
240
- - **Contexto antes do `finish`.** Todo `.morph/context/*.md` que descreve um fato que esta feature
241
- mudou tem o **corpo** reescrito para o estado novo; o changelog do documento guarda só data e
242
- motivo. Commite na branch da feature — o `finish` exige a árvore limpa.
243
- - **Fechar:** `morph-spec finish {feature} --pr|--merge`, modo escolhido por `AskUserQuestion`
244
- (header `"Integração"`). `--pr` arquiva e abre o PR, mas só o merge integra: a feature fica
245
- `aguardando-merge` em `list`/`fleet`. Mecânica: `MORPH.md` §2.1/§2.2.
90
+ ## 4. Worktree rolling
91
+
92
+ Com `isolation: "worktree"` o hook `WorktreeCreate` cria `worktrees/<n>` na branch `morph-task/<n>`,
93
+ com junctions e `.morph/worktree.env` prontos (infra faltando: `morph-spec worktree link --all`).
94
+ **Rolling, não por onda:** a cada relatório, `report-check`, `git merge --no-ff <branch>` (conflito →
95
+ `git merge --abort` e a fatia volta a pendente com nota no relatório) e despache na hora a próxima fatia
96
+ que ficou pronta sem colidir com as em voo. Depois de cada retorno, `morph-spec worktree reap --json`
97
+ (`not-a-registered-worktree` no `remove --target` seguinte = o reaper já o levou); o que sobrar sai por `morph-spec worktree remove --target <path> --delete-branch` (já mergeada; o
98
+ `git branch -d` dele recusa trabalho não integrado) — NUNCA `git worktree remove` cru,
99
+ que atravessa as junctions.
100
+
101
+ ## 5. Retomar o controle
102
+
103
+ `morph-spec report-check {feature} F1 F2 … --json` com as fatias que voltaram. **Leia o arquivo de
104
+ relatório, não a mensagem** — a mensagem final pode não chegar ou vir resumida.
105
+
106
+ | Veredito | Ação |
107
+ |---|---|
108
+ | `ok` | siga |
109
+ | `report-stale` | **não re-despache**: o agente escreveu depois de relatar; leia `observed` e atualize o relatório |
110
+ | `report-incomplete` + `resume` | `PARCIAL` na 1ª linha = a fatia não está pronta — o `report-check` o acusa como `report-incomplete`. Retome o MESMO agente por `SendMessage`, colando `tree.dirty`, `tree.commits` e o que falta |
111
+ | `report-incomplete` + `complete-degraded` | complete a partir da mensagem, carimbe DEGRADADO e registre a falha no relatório |
112
+ | `work-landed-report-missing` | não re-despache; grave você o relatório, DEGRADADO |
113
+ | `no-work-no-report` / `report-missing-evidence-unknown` | re-despache uma vez; segunda ausência sem trabalho = escale |
114
+
115
+ Árvore suja sem explicação ou `tree.markers` não vazio vão ao relatório da fatia.
116
+
117
+ ## 6. Verify da feature, uma vez
118
+
119
+ Sem fatia pendente nem em voo, **primeiro o contexto** — antes do verify, para que a prova e o Gate 3
120
+ cubram a árvore que vai ao merge. Todo `.morph/context/*.md` que descreve um fato que esta feature
121
+ mudou tem o **corpo** reescrito para o estado novo, nunca empilhado (valor que ainda vale em algum
122
+ lugar diz onde); o changelog do documento guarda só data e motivo. Mudança estrutural
123
+ (`package.json`, `.csproj`, `next.config.*`, `tsconfig.json`, `docker-compose.yml`) atualiza também
124
+ `.morph/context/README.md` (stack, arquitetura, integrações) e `.morph/config/config.json` (stack,
125
+ arquitetura, integrações, paths). **Commite** o trabalho das fatias e essa atualização de contexto e
126
+ config **antes** do verify: o stamp grava o HEAD, e código ou `config.json` commitado depois dele é
127
+ árvore nova — um terceiro verify.
128
+
129
+ Depois `morph-spec verify {feature} --json`, **sem filtro** — nunca recorte o
130
+ verify da feature. `--filter` é do loop do próprio sub-agente; o Gate 3 e o CI rodam a suíte
131
+ inteira. Nó de teste sem `expectedCount`: acrescente `--record-baseline` a ESTA rodada — ela mede e
132
+ prova de uma vez; nunca um segundo verify só para gravar a baseline. Vermelho: corrija com `verify.feedback` (direto no código, ou re-despachando a fatia dona)
133
+ e rode de novo; **3 tentativas** sem verde → `AskUserQuestion` ("Verify de {feature} vermelho após 3
134
+ tentativas — aceitar com ressalva, continuar tentando, ou parar?").
135
+
136
+ **Cenário que julga saída de LLM** (`prova: eval`): a evidência é rodar, não ler código. Com nó
137
+ `runner: "evals"`: `morph-spec verify {feature} --filter {id-do-nó-evals} --skip-e2e --no-persist`
138
+ (sonda, não prova de gate). Grave `3-implement/evidencias/{Cn}.md`: o cenário literal, o nó, o modelo
139
+ efetivo, a versão ou o hash do prompt (nunca o prompt cru), entrada e saída sem dado pessoal, e o
140
+ veredito com a razão. Não é o `reports/F{n}.md`: aquele diz o que o agente fez; este prova, rodando,
141
+ que a saída atende ao cenário.
142
+
143
+ ## 7. Review
144
+
145
+ Verify verde: `Skill(morph-review)`. O Gate 3 é apresentado, decidido e aprovado por ela; ao retomar o
146
+ controle, **não re-apresente o gate** — siga para o encerramento conforme `gateDecisions.review`.
147
+
148
+ ## 8. Encerramento
149
+
150
+ - **Contexto já foi no §6**, antes da prova. Depois do Gate 3 nada muda `config.json` nem código: a
151
+ árvore integrada é a revisada. Commite na branch da feature o que faltar (relatórios do review) —
152
+ o `finish` exige a árvore limpa.
153
+ - **Fechar:** `morph-spec finish {feature} --pr|--merge`, modo por `AskUserQuestion` (header
154
+ `"Integração"`). `--pr` arquiva e abre o PR, mas só o merge integra: a feature fica
155
+ `aguardando-merge` em `list`/`fleet`.
156
+
157
+ ## Escalada de escopo
158
+
159
+ | Situação | Caminho |
160
+ |---|---|
161
+ | Acréscimo pequeno dentro da fatia | registre no relatório da fatia — sem gate a revogar |
162
+ | **Fato errado**: o plano afirma algo que o código desmente, sem mudar escopo | bloco `## Errata` no FIM do `plan.md`, corpo intacto, append-only |
163
+ | **O escopo mudou** | `morph-spec unapprove {feature} plan --reason "..."`, emende, `plan-check`, re-aprove |
164
+
165
+ Ambiguidade que o plano não cobre não é escalada: resolva pelo lado conservador, registre a decisão sob `## Errata` do `plan.md`
166
+ e siga.
167
+
168
+ ## Arquivo de teste
169
+
170
+ 1. **Analise primeiro** — a IMPLEMENTAÇÃO está errada ou a ESPECIFICAÇÃO do teste está?
171
+ 2. **Corrija a implementação primeiro** — o teste é a especificação; confie nele por padrão.
172
+ 3. **Só mude um arquivo de teste se a própria expectativa estiver errada.**
173
+ 4. **Antes de mudar, explique POR QUE o teste está errado** — qual é o comportamento certo.
174
+
175
+ ## Debugging
176
+
177
+ Causa raiz antes do conserto: reproduza e leia o erro inteiro; erro conhecido de .NET/Next.js →
178
+ `/morph-troubleshoot <palavras>`; **uma hipótese por vez**, cada uma testada pela menor checagem que
179
+ a refutaria; depois de três consertos falhos, nunca tente um quarto sozinho — `AskUserQuestion`
180
+ com a pergunta de desenho que as falhas levantam; confirme com a mesma checagem que reproduziu.
246
181
 
247
182
  ## Anti-padrões
248
183
 
249
- - Paralelo com dependência cruzada entre as tasks do batch.
250
- - Mais de 4 agentes ao mesmo tempo; agente inteiro para raiz S.
251
- - Sub-agent tocando `tasks.json`, `feature.json` ou o board de sessão.
252
- - Editar `spec.md` depois do Gate 2, ou `feature.json` à mão.
184
+ - Mais de 4 agentes ao mesmo tempo, ou duas fatias em voo no mesmo arquivo sem worktree.
185
+ - Sub-agente tocando `plan.md`, `checks.json` ou `feature.json`.
186
+ - Re-despachar sobre `report-stale` ou sobre um `PARCIAL` (retome o MESMO agente).
253
187
  - Rodar teste fora do `verify` no loop do orquestrador: a prova é o verify.
254
-
255
- ## Referências
256
-
257
- - `.morph/framework/MORPH.md` §6 — contrato do relatório final
258
- - `morph-spec dag|verify|report-check|worktree reap` — `.morph/framework/CLI.md`
259
- - `.claude/skills/morph-implement/SKILL.md` §4 — template sequencial paritário
260
- - `.claude/skills/morph-review/SKILL.md` — Gate 3