@polymorphism-tech/morph-spec 8.43.0 → 8.45.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (203) hide show
  1. package/CLAUDE.md +16 -13
  2. package/README.md +10 -10
  3. package/bin/morph-spec.js +10 -13
  4. package/bin/validate.js +379 -379
  5. package/claude-plugin.json +1 -1
  6. package/docs/CHEATSHEET.md +2 -4
  7. package/docs/QUICKSTART.md +6 -6
  8. package/framework/CLAUDE.md +6 -8
  9. package/framework/MORPH.md +39 -45
  10. package/framework/agents.json +8 -9
  11. package/framework/commands/morph-apply.md +1 -3
  12. package/framework/commands/morph-hotfix.md +1 -1
  13. package/framework/commands/morph-proposal.md +2 -2
  14. package/framework/docs/CLI.md +22 -17
  15. package/framework/evals/review-checklist.md +90 -0
  16. package/framework/evals/trace-schema.md +2 -12
  17. package/framework/hooks/README.md +2 -3
  18. package/framework/hooks/claude-code/core/heavy-gate.js +1 -1
  19. package/framework/hooks/claude-code/core/protect-spec-files.js +2 -2
  20. package/framework/hooks/claude-code/core/telemetry-log.js +2 -2
  21. package/framework/hooks/claude-code/core/trace-autogen.js +1 -22
  22. package/framework/hooks/claude-code/core/validate-completion.js +3 -56
  23. package/framework/hooks/claude-code/core/worktree-env-inject.js +1 -4
  24. package/framework/hooks/claude-code/statusline.sh +11 -11
  25. package/framework/hooks/git/commit-msg/conventional-commits.sh +33 -33
  26. package/framework/hooks/git/pre-commit/agents.sh +25 -25
  27. package/framework/hooks/git/pre-commit/orchestrator.sh +64 -64
  28. package/framework/hooks/git/pre-commit/specs.sh +50 -50
  29. package/framework/hooks/git/pre-push/run-tests.sh +44 -44
  30. package/framework/hooks/shared/build-check.js +1 -1
  31. package/framework/hooks/shared/comment-scanner.js +1 -1
  32. package/framework/hooks/shared/phase-utils.js +0 -5
  33. package/framework/hooks/shared/stdin-reader.js +26 -26
  34. package/framework/phases.json +4 -6
  35. package/framework/rubrics/backend.json +1 -1
  36. package/framework/rubrics/default.json +1 -1
  37. package/framework/rubrics/frontend.json +1 -1
  38. package/framework/rules/ai-agents-standards.md +1 -0
  39. package/framework/rules/morph-workflow.md +6 -6
  40. package/framework/schemas/feature.schema.json +2 -28
  41. package/framework/schemas/tasks.schema.json +6 -2
  42. package/framework/skills/README.md +1 -2
  43. package/framework/skills/core/create-umbraco-lp/SKILL.md +1 -1
  44. package/framework/skills/core/migrate-lp-to-umbraco/SKILL.md +1 -1
  45. package/framework/skills/core/morph-apply/SKILL.md +145 -246
  46. package/framework/skills/core/morph-brainstorming/SKILL.md +1 -1
  47. package/framework/skills/core/morph-hotfix/SKILL.md +5 -3
  48. package/framework/skills/core/morph-implement/SKILL.md +101 -201
  49. package/framework/skills/core/morph-machine/SKILL.md +3 -3
  50. package/framework/skills/core/morph-media/SKILL.md +1 -1
  51. package/framework/skills/core/morph-plan/SKILL.md +171 -287
  52. package/framework/skills/core/morph-proposal/SKILL.md +4 -5
  53. package/framework/skills/core/morph-review/SKILL.md +109 -430
  54. package/framework/skills/core/morph-stack-scan/SKILL.md +1 -1
  55. package/framework/skills/core/morph-standards/SKILL.md +2 -2
  56. package/framework/skills/core/morph-uiux/SKILL.md +2 -3
  57. package/framework/standards/STANDARDS.json +54 -10
  58. package/framework/standards/ai-agents/agent-archetypes.md +1 -1
  59. package/framework/standards/ai-agents/agent-session.md +1 -1
  60. package/framework/standards/ai-agents/agent-spec.md +1 -1
  61. package/framework/standards/ai-agents/batching.md +1 -1
  62. package/framework/standards/ai-agents/context-providers.md +1 -1
  63. package/framework/standards/ai-agents/conversational-agent-with-phases.md +1 -1
  64. package/framework/standards/ai-agents/cost-and-budget.md +1 -1
  65. package/framework/standards/ai-agents/durable-workflows-hitl.md +1 -1
  66. package/framework/standards/ai-agents/guardrails.md +1 -1
  67. package/framework/standards/ai-agents/llm-runtime-defaults.md +1 -1
  68. package/framework/standards/ai-agents/mcp-server.md +1 -1
  69. package/framework/standards/ai-agents/mcp-tools.md +1 -1
  70. package/framework/standards/ai-agents/media-pipeline.md +1 -1
  71. package/framework/standards/ai-agents/media-video.md +1 -1
  72. package/framework/standards/ai-agents/middleware-patterns.md +1 -1
  73. package/framework/standards/ai-agents/modalities-image-gen.md +1 -1
  74. package/framework/standards/ai-agents/modalities-speech-to-text.md +1 -1
  75. package/framework/standards/ai-agents/modalities-text-to-speech.md +1 -1
  76. package/framework/standards/ai-agents/modalities-vision.md +1 -1
  77. package/framework/standards/ai-agents/multi-agent-patterns.md +1 -1
  78. package/framework/standards/ai-agents/observability-patterns.md +3 -3
  79. package/framework/standards/ai-agents/production.md +2 -2
  80. package/framework/standards/ai-agents/prompt-sources.md +1 -1
  81. package/framework/standards/ai-agents/providers/model-registry.md +1 -1
  82. package/framework/standards/ai-agents/rag-custom-pgvector.md +1 -1
  83. package/framework/standards/ai-agents/service-tier-flex.md +1 -1
  84. package/framework/standards/ai-agents/setup.md +1 -1
  85. package/framework/standards/ai-agents/structured-output.md +1 -1
  86. package/framework/standards/ai-agents/sweet-spot.md +1 -1
  87. package/framework/standards/ai-agents/testing-ai.md +1 -1
  88. package/framework/standards/ai-agents/tool-adapters.md +226 -0
  89. package/framework/standards/ai-agents/vector-data-extensions.md +1 -1
  90. package/framework/standards/ai-agents/workflows.md +1 -1
  91. package/framework/standards/infrastructure/docker/local-compose-isolation.md +11 -1
  92. package/framework/templates/CLAUDE.md.core.template +1 -1
  93. package/framework/templates/IDE-SNIPPETS.md +262 -262
  94. package/framework/templates/README.md +1 -1
  95. package/framework/templates/REGISTRY.json +0 -81
  96. package/framework/templates/code/dotnet/abstractions/api-endpoint.cs +7 -7
  97. package/framework/templates/code/dotnet/feature/endpoint.cs.hbs +21 -21
  98. package/framework/templates/code/dotnet/feature/request.cs.hbs +4 -4
  99. package/framework/templates/code/dotnet/feature/response.cs.hbs +4 -4
  100. package/framework/templates/code/sql/ai-agents/pgvector-embeddings-migration.sql.template +91 -91
  101. package/framework/templates/docs/spec.md +19 -205
  102. package/framework/templates/docs/ui-components.md +52 -52
  103. package/framework/templates/docs/ui-design-system.md +76 -76
  104. package/framework/templates/docs/ui-flows.md +167 -167
  105. package/framework/templates/frontend/nextjs/client-component.tsx.hbs +26 -26
  106. package/framework/templates/frontend/nextjs/feature-form.tsx.hbs +56 -56
  107. package/framework/templates/frontend/nextjs/tsconfig.json.hbs +26 -26
  108. package/framework/templates/infrastructure/docker/Dockerfile.template +58 -58
  109. package/framework/templates/infrastructure/docker/dockerfile-api.dockerfile +38 -38
  110. package/framework/templates/infrastructure/docker/dockerfile-web.dockerfile +48 -48
  111. package/framework/templates/infrastructure/github/README.md +56 -56
  112. package/framework/templates/infrastructure/github/actions/docker-build-push/action.yml.hbs +45 -45
  113. package/framework/templates/infrastructure/github/actions/health-check/action.yml.hbs +27 -27
  114. package/framework/templates/infrastructure/github/workflows/docker-build-push.yml.hbs +59 -59
  115. package/framework/templates/infrastructure/github/workflows/dotnet-build.yml.hbs +39 -39
  116. package/framework/templates/meta-prompts/fusion/fusion-agent.md +76 -76
  117. package/framework/templates/meta-prompts/fusion/fusion-aggregator.md +100 -100
  118. package/framework/templates/meta-prompts/validators/pre-commit-validator.md +95 -95
  119. package/framework/templates/state.template.json +17 -17
  120. package/framework/templates/ui/design-system.css +226 -226
  121. package/package.json +2 -2
  122. package/src/commands/e2e/e2e.js +1 -1
  123. package/src/commands/project/heavy.js +1 -1
  124. package/src/commands/project/status.js +3 -3
  125. package/src/commands/project/worktree.js +34 -16
  126. package/src/commands/state/approve.js +9 -50
  127. package/src/commands/state/finish.js +4 -0
  128. package/src/commands/state/gate-check.js +18 -107
  129. package/src/commands/state/gate-decision.js +1 -1
  130. package/src/commands/state/report-check.js +42 -17
  131. package/src/commands/validation/mutate.js +1 -1
  132. package/src/commands/validation/scout-check.js +28 -0
  133. package/src/commands/validation/validate-feature.js +5 -32
  134. package/src/commands/validation/verify.js +16 -25
  135. package/src/core/paths/output-schema.js +0 -2
  136. package/src/core/state/state-manager.js +1 -2
  137. package/src/core/templates/template-renderer.js +477 -477
  138. package/src/dashboard/app/lib/format.js +5 -0
  139. package/src/dashboard/app/main.jsx +13 -13
  140. package/src/dashboard/app/pages/FeatureDetail.jsx +16 -22
  141. package/src/dashboard/app/pages/Features.jsx +7 -7
  142. package/src/dashboard/app/pages/PhasePipeline.jsx +1 -1
  143. package/src/dashboard/app/pages/Rubrics.jsx +7 -11
  144. package/src/dashboard/scanner/docs-scanner.js +1 -2
  145. package/src/dashboard/scanner/features-scanner.js +3 -4
  146. package/src/dashboard/scanner/rubrics-scanner.js +12 -12
  147. package/src/dashboard/vite.config.js +24 -24
  148. package/src/lib/agents/output-collector.js +0 -1
  149. package/src/lib/detectors/design-system-detector.js +188 -188
  150. package/src/lib/e2e/compose-env.js +5 -2
  151. package/src/lib/evaluator-report.js +52 -334
  152. package/src/lib/generators/design-system-generator.js +508 -508
  153. package/src/lib/generators/handoff-generator.js +4 -5
  154. package/src/lib/git/evidence-staleness.js +39 -0
  155. package/src/lib/installers/memory-installer.js +2 -2
  156. package/src/lib/mutation/manifest.js +8 -2
  157. package/src/lib/mutation/report.js +5 -3
  158. package/src/lib/mutation/runner.js +9 -7
  159. package/src/lib/risk-detector.js +63 -125
  160. package/src/lib/scout/scout-check.js +293 -0
  161. package/src/lib/tasks/eval-node.js +4 -34
  162. package/src/lib/tasks/task-classifier.js +30 -30
  163. package/src/lib/tasks/task-parser.js +209 -209
  164. package/src/lib/tasks/tasks-json-parser.js +7 -5
  165. package/src/lib/tasks/test-nodes.js +1 -1
  166. package/src/lib/tasks/test-runner.js +1 -1
  167. package/src/lib/validators/contracts/contract-compliance-validator.js +4 -42
  168. package/src/lib/validators/css/css-validator.js +340 -340
  169. package/src/lib/validators/reuse/reuse-validator.js +6 -8
  170. package/src/lib/validators/verify-runner.js +1 -1
  171. package/src/lib/worktree/env-allocator.js +35 -5
  172. package/src/scripts/setup-infra.js +1 -1
  173. package/src/utils/agent-id-mapper.js +11 -11
  174. package/src/utils/agents-installer.js +5 -9
  175. package/src/utils/claude-settings-manager.js +300 -300
  176. package/src/utils/hooks-installer.js +3 -10
  177. package/src/utils/skills-installer.js +1 -1
  178. package/framework/evals/proof-rubrics/README.md +0 -76
  179. package/framework/evals/proof-rubrics/eval-de-modelo.md +0 -80
  180. package/framework/evals/proof-rubrics/fiacao.md +0 -54
  181. package/framework/evals/proof-rubrics/guard-cego.md +0 -52
  182. package/framework/evals/proof-rubrics/media-claims.md +0 -109
  183. package/framework/evals/proof-rubrics/mutation-proof.md +0 -107
  184. package/framework/evals/proof-rubrics/observabilidade-genai.md +0 -119
  185. package/framework/evals/proof-rubrics/verde-nao-e-coberto.md +0 -48
  186. package/framework/evals/rubrics/README.md +0 -45
  187. package/framework/evals/rubrics/architecture.md +0 -103
  188. package/framework/evals/rubrics/code-quality.md +0 -98
  189. package/framework/evals/rubrics/condensed.md +0 -57
  190. package/framework/evals/rubrics/contracts.md +0 -67
  191. package/framework/evals/rubrics/test-coverage.md +0 -99
  192. package/framework/evals/scenarios/dotnet-crud.yaml +0 -42
  193. package/framework/evals/scenarios/nextjs-auth.yaml +0 -38
  194. package/framework/evals/suites/standard.yaml +0 -5
  195. package/framework/hooks/claude-code/core/post-edit-typecheck.js +0 -127
  196. package/framework/skills/core/morph-eval/SKILL.md +0 -64
  197. package/framework/templates/.idea/morph-templates.xml +0 -92
  198. package/framework/templates/.vscode/morph-templates.code-snippets +0 -186
  199. package/framework/templates/docs/clarifications.md +0 -253
  200. package/framework/templates/docs/onboarding.md +0 -122
  201. package/framework/templates/docs/schema-analysis.md +0 -119
  202. package/framework/templates/docs/user-stories.md +0 -34
  203. package/src/commands/state/score.js +0 -147
@@ -16,7 +16,7 @@ const PROCESS_CITATION = [
16
16
  /\bADR[-\s]?\d+/,
17
17
  /\bFR[-\s]?\d+/,
18
18
  /\bgate\s?[1-3]\b/i,
19
- /\b(?:spec|mandate)\.md\b/i,
19
+ /\bspec\.md\b/i,
20
20
  /\bmockups?\b/i,
21
21
  ];
22
22
 
@@ -29,10 +29,8 @@ export const OUTPUT_PHASE_MAP = {
29
29
  uiComponents: 'uiux',
30
30
  uiFlows: 'uiux',
31
31
  spec: 'plan',
32
- mandate: 'plan',
33
32
  tasks: 'plan',
34
33
  decisions: 'plan',
35
- reuseMap: 'plan',
36
34
  usecases: 'plan',
37
35
  recap: 'implement',
38
36
  evidencias: 'implement',
@@ -49,10 +47,8 @@ export const FILENAME_TO_OUTPUT = {
49
47
  'components.md': 'uiComponents',
50
48
  'flows.md': 'uiFlows',
51
49
  'spec.md': 'spec',
52
- 'mandate.md': 'mandate',
53
50
  'tasks.json': 'tasks',
54
51
  'decisions.md': 'decisions',
55
- 'reuse-map.md': 'reuseMap',
56
52
  'recap.md': 'recap',
57
53
  'review-report.md': 'reviewReport',
58
54
  'evaluator-report.md': 'evaluatorReport',
@@ -65,7 +61,6 @@ export const PROTECTED_SPEC_FILES = {
65
61
  'components.md': 'uiux',
66
62
  'flows.md': 'uiux',
67
63
  'spec.md': 'plan',
68
- 'mandate.md': 'plan',
69
64
  'tasks.json': 'plan',
70
65
  };
71
66
 
@@ -1,26 +1,26 @@
1
- /**
2
- * Shared stdin reader for Claude Code hooks.
3
- *
4
- * Reads JSON payload from stdin (provided by Claude Code to hooks).
5
- * Returns parsed object or null on failure.
6
- */
7
-
8
- /**
9
- * Read and parse JSON from stdin
10
- * @returns {Promise<Object|null>} Parsed JSON or null
11
- */
12
- export function readStdin() {
13
- return new Promise((resolve) => {
14
- let input = '';
15
- process.stdin.setEncoding('utf-8');
16
- process.stdin.on('data', (chunk) => { input += chunk; });
17
- process.stdin.on('end', () => {
18
- try {
19
- resolve(JSON.parse(input || '{}'));
20
- } catch {
21
- resolve(null);
22
- }
23
- });
24
- process.stdin.on('error', () => resolve(null));
25
- });
26
- }
1
+ /**
2
+ * Shared stdin reader for Claude Code hooks.
3
+ *
4
+ * Reads JSON payload from stdin (provided by Claude Code to hooks).
5
+ * Returns parsed object or null on failure.
6
+ */
7
+
8
+ /**
9
+ * Read and parse JSON from stdin
10
+ * @returns {Promise<Object|null>} Parsed JSON or null
11
+ */
12
+ export function readStdin() {
13
+ return new Promise((resolve) => {
14
+ let input = '';
15
+ process.stdin.setEncoding('utf-8');
16
+ process.stdin.on('data', (chunk) => { input += chunk; });
17
+ process.stdin.on('end', () => {
18
+ try {
19
+ resolve(JSON.parse(input || '{}'));
20
+ } catch {
21
+ resolve(null);
22
+ }
23
+ });
24
+ process.stdin.on('error', () => resolve(null));
25
+ });
26
+ }
@@ -42,13 +42,12 @@
42
42
  "displayName": "Plan",
43
43
  "goals": [
44
44
  "Write spec.md (technical spec)",
45
- "Write mandate.md (implementation contract with stack defaults + forbidden patterns)",
46
45
  "Write tasks.json (ordered task breakdown)"
47
46
  ],
48
- "requiredOutputs": ["spec", "mandate", "tasks"],
47
+ "requiredOutputs": ["spec", "tasks"],
49
48
  "optionalOutputs": ["decisions"],
50
49
  "pausePoints": [
51
- { "id": "plan", "label": "Gate 2 — Approve spec + mandate + tasks" }
50
+ { "id": "plan", "label": "Gate 2 — Approve spec + tasks" }
52
51
  ],
53
52
  "skill": "morph-plan"
54
53
  },
@@ -59,7 +58,7 @@
59
58
  "displayName": "Implementation",
60
59
  "goals": [
61
60
  "Execute tasks in order with auto-advance between tasks",
62
- "Apply morph-eval after each task",
61
+ "Advance a task only on verify green and its doneCriteria met",
63
62
  "Maintain recap.md and execution trace"
64
63
  ],
65
64
  "requiredOutputs": ["recap"],
@@ -73,8 +72,7 @@
73
72
  "folder": "4-review",
74
73
  "displayName": "Review",
75
74
  "goals": [
76
- "Verify implementation against mandate",
77
- "Apply morph-eval at phase scope to produce dimension scores",
75
+ "Independent evaluator verdict (SHIP/FIX) with evidence-typed blockers",
78
76
  "Produce review-report.md and present Gate 3"
79
77
  ],
80
78
  "requiredOutputs": ["reviewReport"],
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "id": "backend",
3
3
  "version": "1.1.0",
4
- "description": "Backend-focused rubric. Higher weight on architecture, security, and package health. Deterministic-validator rubric — approve threshold aligned to the single bar 9 from MORPH.md §0.",
4
+ "description": "Backend-focused rubric. Higher weight on architecture, security, and package health. Deterministic-validator weights for the verify validators node; the score is informational — the node fails on validator errors.",
5
5
  "categories": {
6
6
  "functionality": {
7
7
  "weight": 0.25,
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "id": "default",
3
3
  "version": "1.1.0",
4
- "description": "Default rubric for general-purpose projects. Balanced weights across all categories. Deterministic-validator rubric — approve threshold aligned to the single bar 9 from MORPH.md §0 (the LLM eval rubrics live in framework/evals/rubrics/*.md).",
4
+ "description": "Default rubric for general-purpose projects. Balanced weights across all categories. Deterministic-validator weights for the verify validators node; the score is informational — the node fails on validator errors.",
5
5
  "categories": {
6
6
  "functionality": {
7
7
  "weight": 0.30,
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "id": "frontend",
3
3
  "version": "1.1.0",
4
- "description": "Frontend-focused rubric. Higher weight on design system compliance and UI quality. Deterministic-validator rubric — approve threshold aligned to the single bar 9 from MORPH.md §0.",
4
+ "description": "Frontend-focused rubric. Higher weight on design system compliance and UI quality. Deterministic-validator weights for the verify validators node; the score is informational — the node fails on validator errors.",
5
5
  "categories": {
6
6
  "functionality": {
7
7
  "weight": 0.25,
@@ -50,6 +50,7 @@ stacks:
50
50
  | `ai-agents/conversational-agent-with-phases.md` | conversa com fases no turno — allow-list de tools, `ChatToolMode`, teto de tool calls |
51
51
  | `ai-agents/guardrails.md` | regra proibida vira código — guard de tool, pertinência, argumento não confiável, fail-open |
52
52
  | `ai-agents/testing-ai.md` | testar agente sem rede — `IChatClient` fake, harness de turno, golden de prompt |
53
+ | `ai-agents/tool-adapters.md` | tool de agente que carrega regra de negócio — a regra em `*Ops` com desfecho tipado, o texto do modelo no adaptador, teste em duas camadas e migração neutra |
53
54
  | `ai-agents/evals-with-cache.md` | eval de modelo/prompt no CI **sem credencial e sem rede**: cache de respostas commitada, dataset versionado, o que entra na chave de cache, troca de modelo e regressão de prompt |
54
55
  | `ai-agents/cost-and-budget.md` | custo em dinheiro — `UsageCostMiddleware`, tarifa por token, teto de orçamento |
55
56
  | `ai-agents/llm-runtime-defaults.md` | knobs de runtime da chamada — timeout, retry, `strict` JSON schema, temperatura/reasoning |
@@ -15,7 +15,7 @@ stacks:
15
15
 
16
16
  1. **Proposal** — Problem statement + scope + risks (`0-proposal/proposal.md`). No acceptance criteria: verifiable behaviour lives in the use cases.
17
17
  2. **UI/UX Design** (optional, UI-heavy) — Design system + mockups + flows. The phase id is `uiux` (that is the gate name); the folder is `1-design/`
18
- 3. **Plan** — Use cases first, then technical spec + mandate + tasks (`2-plan/usecases/UC-{nn}-{slug}.md`, `spec.md`, `mandate.md`, `tasks.json`). Each use case post-condition must be observable in a test and reaches the task's `doneCriteria` verbatim.
18
+ 3. **Plan** — Use cases first, then technical spec + tasks (`2-plan/usecases/UC-{nn}-{slug}.md`, `spec.md`, `tasks.json`). Each use case post-condition must be observable in a test and reaches the task's `doneCriteria` verbatim.
19
19
  4. **Implement** — Code + recap (`3-implement/recap.md`)
20
20
  5. **Review** — Review report + Gate 3 (`4-review/review-report.md`)
21
21
 
@@ -72,7 +72,7 @@ All outputs go in `.morph/features/{feature}/`:
72
72
  |-------|------|
73
73
  | Proposal | `0-proposal/proposal.md`, `stack-scan.md` |
74
74
  | Design (optional) | `1-design/design-system.md`, `mockups.md`, `components.md`, `flows.md` |
75
- | Plan | `2-plan/spec.md`, `mandate.md`, `tasks.json`, `decisions.md` |
75
+ | Plan | `2-plan/usecases/`, `spec.md`, `tasks.json`, `decisions.md` |
76
76
  | Implement | `3-implement/recap.md` + source code; `3-implement/evidencias/{taskId}.md` (condicional — task cujo `doneCriteria` julga saída de LLM) |
77
77
  | Review | `4-review/review-report.md` |
78
78
 
@@ -206,8 +206,8 @@ here would put a second, staler copy in permanent context:
206
206
 
207
207
  | Concern | Where it actually lives |
208
208
  |---------|-------------------------|
209
- | How many tests to write | The test budget copied into the feature's `mandate.md`: one test per postcondition, same-behavior cases in one table, no test that only pins text |
210
- | Verifying a task before `status: "done"` | `morph-spec verify {feature} [task]` (build + tests + validators + e2e), then the `morph-eval` skill for the 0-10 score |
209
+ | How many tests to write | The test budget in `morph-plan` §5: one test per postcondition, same-behavior cases in one table, no test that only pins text |
210
+ | Verifying a task before `status: "done"` | `morph-spec verify {feature} [task]` (build + tests + validators + e2e) green, and each `doneCriteria` with the test or `file:line` that proves it |
211
211
  | Parallel dispatch | `morph-spec dag {feature}` decides sequential vs parallel; execution and isolation rules are in `morph-apply` §2/§3b |
212
212
  | Closing the phase / opening the PR | `morph-review` for Gate 3, then `morph-spec finish {feature} --pr\|--merge` |
213
213
 
@@ -215,7 +215,7 @@ here would put a second, staler copy in permanent context:
215
215
 
216
216
  ## Scope Escalation
217
217
 
218
- The plan contract frozen at Gate 2 — `spec.md`, `mandate.md`, and the immutable `tasks.json`
218
+ The plan contract frozen at Gate 2 — `spec.md` and the immutable `tasks.json`
219
219
  fields listed in `morph-task-tracking.md` — is enforced by the `protect-spec-files` hook. When a
220
220
  task turns out to be bigger than estimated, three different situations resolve three different ways:
221
221
 
@@ -225,7 +225,7 @@ task turns out to be bigger than estimated, three different situations resolve t
225
225
  | **Error of fact**: the spec asserts something about the code that the code contradicts, with no scope change | Append an `## Errata` block at the END of the file. Body untouched, append-only, accepted by `protect-spec-files` **without revoking the gate** — freezing the CONTRACT is not freezing an ERROR OF FACT (MORPH.md §3) |
226
226
  | **The scope itself changed**: the contract no longer describes the work | `morph-spec unapprove {feature} plan --reason "..."`, amend the plan, then re-approve. There is no shortcut around the gate for this one |
227
227
 
228
- Scope ambiguity the `mandate.md` does not cover is **not** an escalation: record it in
228
+ Scope ambiguity the plan does not cover is **not** an escalation: record it in
229
229
  `decisions.md`, resolve it the conservative way, and keep going — only pause if it is genuinely
230
230
  blocking (`morph-implement` §5).
231
231
 
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "http://json-schema.org/draft-07/schema#",
3
3
  "title": "MORPH-SPEC feature.json",
4
- "description": "Canonical shape of the authoritative, committed per-feature state at .morph/features/{feature}/feature.json (v5 per-feature state model). Born via `morph-spec create` (explicit) or the state-sync hook (implicit fallback). Server-side writers: `morph-spec approve/advance` (approvalGates), `morph-spec score` (taskScores), `morph-spec gate-decision` (gateDecisions), `morph-spec archive`/`finish` (status/archivedAt — `finish` archives internally before integrating). Never hand-edit the CLI-owned fields — manual Edits collide with the state-sync hook. This schema is documentational: additionalProperties stays true so older/newer CLIs interoperate.",
4
+ "description": "Canonical shape of the authoritative, committed per-feature state at .morph/features/{feature}/feature.json (v5 per-feature state model). Born via `morph-spec create` (explicit) or the state-sync hook (implicit fallback). Server-side writers: `morph-spec approve/advance` (approvalGates), `morph-spec gate-decision` (gateDecisions), `morph-spec archive`/`finish` (status/archivedAt — `finish` archives internally before integrating). Never hand-edit the CLI-owned fields — manual Edits collide with the state-sync hook. This schema is documentational: additionalProperties stays true so older/newer CLIs interoperate.",
5
5
  "type": "object",
6
6
  "required": ["status", "approvalGates"],
7
7
  "properties": {
@@ -57,7 +57,7 @@
57
57
  "reason": { "type": "string", "description": "The signal that drove the decision (or 'nenhum sinal de risco')." },
58
58
  "signals": {
59
59
  "type": "object",
60
- "description": "Risk signals evaluated (free-form): taskCount, evalScore, standardsViolations, designSystemDivergence..."
60
+ "description": "Risk signals evaluated (free-form): taskCount, evaluatorVerdict, standardsViolations, designSystemDivergence..."
61
61
  },
62
62
  "trust": { "type": "string", "enum": ["auto", "manual"] },
63
63
  "decidedAt": { "type": "string", "format": "date-time" },
@@ -69,32 +69,6 @@
69
69
  "additionalProperties": false
70
70
  }
71
71
  },
72
- "taskScores": {
73
- "type": "object",
74
- "description": "Per-task eval scores, written ONLY by `morph-spec score` (updatedAt is server-side; attempts auto-increment; bestScore is kept).",
75
- "propertyNames": { "pattern": "^T\\d+$" },
76
- "additionalProperties": {
77
- "type": "object",
78
- "required": ["lastScore", "bestScore", "attempts", "updatedAt"],
79
- "properties": {
80
- "lastScore": { "type": "number", "minimum": 0, "maximum": 10 },
81
- "bestScore": { "type": "number", "minimum": 0, "maximum": 10 },
82
- "attempts": { "type": "integer", "minimum": 1 },
83
- "dimensions": {
84
- "type": "object",
85
- "properties": {
86
- "architecture": { "type": "number", "minimum": 0, "maximum": 10 },
87
- "contracts": { "type": "number", "minimum": 0, "maximum": 10 },
88
- "codeQuality": { "type": "number", "minimum": 0, "maximum": 10 },
89
- "testCoverage": { "type": "number", "minimum": 0, "maximum": 10 }
90
- },
91
- "additionalProperties": false
92
- },
93
- "updatedAt": { "type": "string", "format": "date-time" }
94
- },
95
- "additionalProperties": false
96
- }
97
- },
98
72
  "taskVerifications": {
99
73
  "type": "object",
100
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().",
@@ -38,7 +38,7 @@
38
38
  },
39
39
  "reuse": {
40
40
  "type": "array",
41
- "description": "Veredito de reuso por conceito que ESTA task introduz, carimbado por morph-plan a partir do 2-plan/reuse-map.md. Optional. Part of the plan contract: frozen after Gate 2. A justificativa de um CRIAR mora no reuse-map.md, nunca aqui — duas verdades do mesmo fato divergem.",
41
+ "description": "Veredito de reuso por conceito que ESTA task introduz, carimbado por morph-plan. Optional. Part of the plan contract: frozen after Gate 2.",
42
42
  "items": {
43
43
  "type": "object",
44
44
  "required": ["concept", "verdict"],
@@ -51,11 +51,15 @@
51
51
  "verdict": {
52
52
  "type": "string",
53
53
  "enum": ["REUSAR", "ESTENDER", "CRIAR"],
54
- "description": "REUSAR: usar o que existe. ESTENDER: partir do que existe. CRIAR: nada cobre o caso — exige justificativa de uma linha no reuse-map.md."
54
+ "description": "REUSAR: usar o que existe. ESTENDER: partir do que existe. CRIAR: nada cobre o caso — exige `why`."
55
55
  },
56
56
  "target": {
57
57
  "type": "string",
58
58
  "description": "Path (ou path:símbolo) do que será reusado/estendido. Vazio ou ausente em CRIAR."
59
+ },
60
+ "why": {
61
+ "type": "string",
62
+ "description": "Uma linha: por que nada existente cobre o caso. Exigido em CRIAR."
59
63
  }
60
64
  },
61
65
  "additionalProperties": false
@@ -14,9 +14,8 @@ These are the only skills the harness needs. MORPH.md references them by path.
14
14
  |----------------------|----------------------------------------------------------------------|----------------|
15
15
  | `morph-brainstorming` | Business understanding + brownfield scan → proposal.md (Gate 1) | yes |
16
16
  | `morph-stack-scan` | Detect stack drift in existing projects, report in stack-scan.md | yes |
17
- | `morph-plan` | Produce spec.md + mandate.md + tasks.json (Gate 2) | yes |
17
+ | `morph-plan` | Produce use cases + spec.md + tasks.json (Gate 2) | yes |
18
18
  | `morph-implement` | Execute each task with standard + persona, auto-advance between tasks| no |
19
- | `morph-eval` | Score work 0-10 across 4 dimensions, silence on score >= 9 | no |
20
19
  | `morph-review` | Final review report with scores + recommendation (Gate 3) | yes |
21
20
  | `morph-standards` | Locate and load a specific standard on demand | no |
22
21
 
@@ -4,7 +4,7 @@ description: Guia a criação de uma landing page nova ponta-a-ponta a partir do
4
4
  version: core
5
5
  when-to-invoke: ao iniciar um novo projeto de LP com o template Umbraco genérico
6
6
  user-invokable: true
7
- cliVersion: "8.43.0"
7
+ cliVersion: "8.45.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-invoke: ao receber instrução "use /migrate-lp-to-umbraco {projeto}" do usuário, ou quando o usuário descrever necessidade de migrar uma LP para Umbraco
6
6
  user-invokable: true
7
- cliVersion: "8.43.0"
7
+ cliVersion: "8.45.0"
8
8
  stacks:
9
9
  - umbraco
10
10
  ---