@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.
- package/CLAUDE.md +51 -43
- package/README.md +39 -38
- package/bin/morph-spec.js +41 -113
- package/bin/validate.js +1 -147
- package/claude-plugin.json +1 -1
- package/docs/CHEATSHEET.md +1 -1
- package/docs/QUICKSTART.md +1 -1
- package/framework/CLAUDE.md +41 -101
- package/framework/MORPH.md +95 -252
- package/framework/agents.json +86 -21
- package/framework/commands/morph-apply.md +5 -28
- package/framework/commands/morph-archive.md +1 -1
- package/framework/commands/morph-hotfix.md +8 -8
- package/framework/commands/morph-infra.md +1 -1
- package/framework/commands/morph-preflight.md +2 -3
- package/framework/commands/morph-status.md +4 -4
- package/framework/docs/CLI.md +574 -286
- package/framework/evals/review-checklist.md +82 -41
- package/framework/hooks/README.md +10 -11
- package/framework/hooks/claude-code/core/block-destructive-worktree-removal.js +6 -49
- package/framework/hooks/claude-code/core/block-raw-worktree-add.js +2 -35
- package/framework/hooks/claude-code/core/chain.js +4 -65
- package/framework/hooks/claude-code/core/comment-guard.js +3 -17
- package/framework/hooks/claude-code/core/denylist.json +33 -3
- package/framework/hooks/claude-code/core/enforce-phase-writes.js +15 -63
- package/framework/hooks/claude-code/core/gate-guard.js +9 -78
- package/framework/hooks/claude-code/core/graph-refresh-kick.js +3 -24
- package/framework/hooks/claude-code/core/heavy-gate.js +3 -21
- package/framework/hooks/claude-code/core/heavy-release.js +2 -13
- package/framework/hooks/claude-code/core/loop-detect.js +2 -31
- package/framework/hooks/claude-code/core/pre-bash-denylist.js +36 -2
- package/framework/hooks/claude-code/core/protect-spec-files.js +25 -297
- package/framework/hooks/claude-code/core/state-sync.js +15 -85
- package/framework/hooks/claude-code/core/telemetry-log.js +15 -96
- package/framework/hooks/claude-code/core/validate-completion.js +37 -147
- package/framework/hooks/claude-code/core/warn-bash-source-write.js +23 -0
- package/framework/hooks/claude-code/core/worktree-context.js +15 -114
- package/framework/hooks/claude-code/core/worktree-create.js +6 -70
- package/framework/hooks/claude-code/core/worktree-env-inject.js +5 -56
- package/framework/hooks/claude-code/core/worktree-remove.js +5 -31
- package/framework/hooks/claude-code/statusline.py +55 -41
- package/framework/hooks/package.json +3 -0
- package/framework/hooks/shared/activity-logger.js +9 -89
- package/framework/hooks/shared/agent-reap.js +2 -17
- package/framework/hooks/shared/build-check.js +11 -76
- package/framework/hooks/shared/claim-registry.js +9 -119
- package/framework/hooks/shared/command-tokens.js +168 -44
- package/framework/hooks/shared/comment-rules.js +5 -20
- package/framework/hooks/shared/comment-scanner.js +11 -43
- package/framework/hooks/shared/comment-stripper.js +11 -85
- package/framework/hooks/shared/e2e-check.js +0 -0
- package/framework/hooks/shared/errata.js +59 -0
- package/framework/hooks/shared/feature-locator.js +11 -95
- package/framework/hooks/shared/frontend-locations.js +4 -0
- package/framework/hooks/shared/gate-question.js +12 -0
- package/framework/hooks/shared/git-exclude.js +3 -20
- package/framework/hooks/shared/git-paths.js +8 -104
- package/framework/hooks/shared/graph-freshness.js +22 -166
- package/framework/hooks/shared/graph-refresh.js +21 -149
- package/framework/hooks/shared/heavy-command.js +4 -12
- package/framework/hooks/shared/hook-response.js +8 -83
- package/framework/hooks/shared/morph-cli.js +8 -52
- package/framework/hooks/shared/payload-utils.js +10 -132
- package/framework/hooks/shared/phase-utils.js +14 -72
- package/framework/hooks/shared/redact-secrets.js +4 -15
- package/framework/hooks/shared/reparse-scan.js +6 -66
- package/framework/hooks/shared/slice-progress.js +99 -0
- package/framework/hooks/shared/source-files.js +4 -17
- package/framework/hooks/shared/spawn-command.js +23 -0
- package/framework/hooks/shared/state-reader.js +51 -247
- package/framework/hooks/shared/state-writer.js +9 -54
- package/framework/hooks/shared/stdin-reader.js +1 -11
- package/framework/hooks/shared/telemetry-logger.js +7 -67
- package/framework/hooks/shared/transcript-usage.js +7 -29
- package/framework/hooks/shared/worktree-root.js +7 -29
- package/framework/mcp/registry.json +3 -4
- package/framework/phases.json +23 -39
- package/framework/rules/csharp-standards.md +1 -1
- package/framework/rules/frontend-standards.md +1 -0
- package/framework/rules/hangfire-standards.md +1 -1
- package/framework/rules/neon-standards.md +1 -1
- package/framework/schemas/config.schema.json +14 -9
- package/framework/schemas/feature.schema.json +15 -50
- package/framework/skills/README.md +3 -4
- package/framework/skills/core/create-umbraco-lp/SKILL.md +1 -1
- package/framework/skills/core/migrate-lp-to-umbraco/SKILL.md +1 -1
- package/framework/skills/core/morph-apply/SKILL.md +149 -222
- package/framework/skills/core/morph-hotfix/SKILL.md +33 -42
- package/framework/skills/core/morph-machine/SKILL.md +2 -2
- package/framework/skills/core/morph-media/SKILL.md +1 -1
- package/framework/skills/core/morph-plan/SKILL.md +137 -299
- package/framework/skills/core/morph-review/SKILL.md +111 -136
- package/framework/skills/core/morph-standards/SKILL.md +27 -39
- package/framework/skills/core/morph-uiux/SKILL.md +94 -152
- package/framework/standards/STANDARDS.json +109 -1219
- package/framework/standards/STANDARDS.meta.json +1319 -0
- package/framework/standards/ai-agents/agent-archetypes.md +2 -2
- package/framework/standards/ai-agents/agent-session.md +1 -1
- package/framework/standards/ai-agents/conversational-agent-with-phases.md +4 -4
- package/framework/standards/ai-agents/durable-workflows-hitl.md +3 -3
- package/framework/standards/ai-agents/evals-with-cache.md +1 -2
- package/framework/standards/ai-agents/guardrails.md +1 -1
- package/framework/standards/ai-agents/multi-agent-patterns.md +2 -2
- package/framework/standards/ai-agents/observability-patterns.md +1 -1
- package/framework/standards/ai-agents/production.md +1 -1
- package/framework/standards/ai-agents/prompt-sources.md +2 -2
- package/framework/standards/ai-agents/providers/model-registry.md +1 -1
- package/framework/standards/ai-agents/rag-custom-pgvector.md +2 -2
- package/framework/standards/ai-agents/setup.md +3 -3
- package/framework/standards/ai-agents/sweet-spot.md +2 -2
- package/framework/standards/ai-agents/tool-adapters.md +0 -2
- package/framework/standards/ai-agents/vector-data-extensions.md +4 -4
- package/framework/standards/ai-agents/workflows.md +1 -1
- package/framework/standards/architecture/code-comments.md +7 -7
- package/framework/standards/architecture/vertical-slice/vertical-slice.md +1 -1
- package/framework/standards/backend/api/validation.md +1 -1
- package/framework/standards/backend/dotnet/vsa-handler-patterns.md +5 -5
- package/framework/standards/backend/integrations/hangfire/hangfire-jobs.md +1 -1
- package/framework/standards/backend/integrations/neon-auth/neon-auth.md +2 -2
- package/framework/standards/data/nosql/cache/redis.md +1 -1
- package/framework/standards/data/nosql/cosmos-db.md +3 -3
- package/framework/standards/frontend/admin-app/forms.md +1 -1
- package/framework/standards/frontend/design-system/art-direction.md +88 -0
- package/framework/standards/frontend/design-system/premium-finish.md +77 -2
- package/framework/standards/infrastructure/neon/neon-pgvector.md +5 -5
- package/framework/standards/integration/mcp/mcp-tools.md +7 -7
- package/framework/templates/CLAUDE.md.core.template +3 -3
- package/framework/templates/README.md +2 -3
- package/framework/templates/REGISTRY.json +15 -179
- package/framework/templates/docs/plan.md +72 -0
- package/framework/templates/docs/ui-mockups.md +4 -0
- package/framework/templates/dotnet/ai-kit/README.md +1 -9
- package/framework/templates/dotnet/ai-kit/tests/Morph.AiKit.Tests/Morph.AiKit.Tests.csproj +0 -10
- package/framework/templates/meta-prompts/squad-leaders/backend-squad.md +1 -1
- package/framework/templates/meta-prompts/squad-leaders/frontend-squad.md +1 -1
- package/framework/templates/meta-prompts/squad-leaders/squad-leader.md +1 -1
- package/framework/templates/meta-prompts/validators/pre-commit-validator.md +3 -4
- package/package.json +1 -1
- package/src/commands/context/context-refresh.js +0 -16
- package/src/commands/dashboard/dashboard.js +2 -8
- package/src/commands/e2e/e2e.js +18 -105
- package/src/commands/graph/affected.js +0 -14
- package/src/commands/graph/build.js +11 -50
- package/src/commands/graph/explain.js +0 -16
- package/src/commands/graph/status.js +1 -12
- package/src/commands/mcp/mcp-setup.js +4 -62
- package/src/commands/observability/cost.js +17 -111
- package/src/commands/observability/telemetry.js +1 -14
- package/src/commands/project/branch.js +4 -45
- package/src/commands/project/claim.js +4 -48
- package/src/commands/project/doctor-procs.js +1 -1
- package/src/commands/project/doctor.js +53 -307
- package/src/commands/project/env.js +1 -27
- package/src/commands/project/fleet.js +6 -35
- package/src/commands/project/heavy.js +3 -3
- package/src/commands/project/init.js +8 -68
- package/src/commands/project/install-plugin-cmd.js +0 -1
- package/src/commands/project/setup-infra-cmd.js +2 -1
- package/src/commands/project/stack-scan.js +58 -0
- package/src/commands/project/standards.js +65 -72
- package/src/commands/project/status.js +28 -121
- package/src/commands/project/update.js +31 -223
- package/src/commands/project/worktree.js +109 -883
- package/src/commands/scaffold/scaffold.js +0 -25
- package/src/commands/state/advance.js +65 -120
- package/src/commands/state/approve.js +87 -229
- package/src/commands/state/archive.js +23 -139
- package/src/commands/state/auto-approval.js +65 -0
- package/src/commands/state/create.js +49 -109
- package/src/commands/state/delete.js +11 -63
- package/src/commands/state/finish.js +105 -494
- package/src/commands/state/gate-check.js +74 -183
- package/src/commands/state/gate-decision.js +8 -42
- package/src/commands/state/handoff.js +4 -31
- package/src/commands/state/list.js +21 -91
- package/src/commands/state/report-check.js +134 -338
- package/src/commands/state/retype.js +12 -28
- package/src/commands/validation/index.js +0 -3
- package/src/commands/validation/mutate.js +79 -19
- package/src/commands/validation/plan-check.js +81 -0
- package/src/commands/validation/validate-feature.js +52 -216
- package/src/commands/validation/verify.js +45 -160
- package/src/core/paths/output-schema.js +9 -155
- package/src/core/state/feature-identity.js +1 -25
- package/src/core/state/gate-order.js +2 -30
- package/src/core/state/lifecycle-audit.js +8 -100
- package/src/core/state/state-manager.js +32 -395
- package/src/core/templates/template-registry.js +2 -97
- package/src/core/templates/template-renderer.js +13 -93
- package/src/core/templates/template-seed.js +21 -0
- package/src/core/work-types.js +10 -45
- package/src/dashboard/app/App.jsx +1 -8
- package/src/dashboard/app/components/ActivityFeed.jsx +2 -8
- package/src/dashboard/app/components/CommandPalette.jsx +4 -11
- package/src/dashboard/app/components/DetailPanel.jsx +1 -5
- package/src/dashboard/app/components/EntityLink.jsx +0 -12
- package/src/dashboard/app/components/ErrorBoundary.jsx +1 -8
- package/src/dashboard/app/components/KnowledgeMarkdown.jsx +0 -11
- package/src/dashboard/app/components/Markdown.jsx +0 -9
- package/src/dashboard/app/components/PhaseRail.jsx +0 -11
- package/src/dashboard/app/components/SearchFilter.jsx +0 -4
- package/src/dashboard/app/components/Sidebar.jsx +0 -5
- package/src/dashboard/app/hooks/useMorphQuery.js +1 -11
- package/src/dashboard/app/hooks/usePref.js +1 -5
- package/src/dashboard/app/lib/format.js +0 -2
- package/src/dashboard/app/lib/phases.js +3 -9
- package/src/dashboard/app/lib/project.js +0 -12
- package/src/dashboard/app/pages/Activity.jsx +1 -1
- package/src/dashboard/app/pages/AgentMap.jsx +1 -8
- package/src/dashboard/app/pages/FeatureDetail.jsx +139 -133
- package/src/dashboard/app/pages/Features.jsx +9 -16
- package/src/dashboard/app/pages/Guide.jsx +2 -3
- package/src/dashboard/app/pages/HookInspector.jsx +2 -23
- package/src/dashboard/app/pages/PhasePipeline.jsx +3 -7
- package/src/dashboard/app/pages/Portfolio.jsx +0 -1
- package/src/dashboard/app/pages/RulesMap.jsx +1 -16
- package/src/dashboard/app/pages/SkillsLibrary.jsx +1 -16
- package/src/dashboard/app/pages/Standards.jsx +2 -17
- package/src/dashboard/scanner/activity-scanner.js +14 -83
- package/src/dashboard/scanner/agents-scanner.js +1 -23
- package/src/dashboard/scanner/docs-scanner.js +1 -7
- package/src/dashboard/scanner/feature-status.js +2 -5
- package/src/dashboard/scanner/features-scanner.js +92 -113
- package/src/dashboard/scanner/hooks-scanner.js +5 -28
- package/src/dashboard/scanner/index.js +0 -4
- package/src/dashboard/scanner/portfolio.js +5 -29
- package/src/dashboard/scanner/project-api.js +8 -54
- package/src/dashboard/scanner/rules-scanner.js +1 -2
- package/src/dashboard/scanner/skills-scanner.js +2 -12
- package/src/dashboard/scanner/standards-scanner.js +4 -7
- package/src/dashboard/vite-plugin-morph-data.js +5 -19
- package/src/lib/ai/ai-checks.js +7 -52
- package/src/lib/ai/ai-project-scan.js +14 -108
- package/src/lib/ai/code-audit.js +7 -63
- package/src/lib/ai/pin-drift.js +8 -51
- package/src/lib/ai/registry-audit.js +11 -90
- package/src/lib/ci/ci-verify.js +14 -13
- package/src/lib/ci/github-ci.js +9 -37
- package/src/lib/ci/workflow-scaffold.js +2 -10
- package/src/lib/detectors/claude-config-detector.js +13 -74
- package/src/lib/detectors/index.js +8 -59
- package/src/lib/e2e/compose-env.js +5 -66
- package/src/lib/e2e/stack-teardown.js +6 -40
- package/src/lib/generators/architecture-scanner.js +18 -156
- package/src/lib/generators/handoff-generator.js +37 -112
- package/src/lib/generators/scaffold-generator.js +5 -101
- package/src/lib/generators/settings-generator.js +11 -122
- package/src/lib/git/branch-classifier.js +11 -84
- package/src/lib/git/default-branch.js +14 -169
- package/src/lib/git/evidence-staleness.js +2 -1
- package/src/lib/git/gh.js +2 -17
- package/src/lib/git/pending-prs.js +6 -37
- package/src/lib/git/pr-files.js +3 -28
- package/src/lib/git/pr-index.js +3 -34
- package/src/lib/git/tree-fingerprint.js +17 -17
- package/src/lib/git/tree-state.js +6 -33
- package/src/lib/graph/god-nodes.js +2 -22
- package/src/lib/graph/graph-health.js +3 -24
- package/src/lib/graph/graph-loader.js +5 -56
- package/src/lib/graph/graphify-runtime.js +7 -37
- package/src/lib/graph/graphifyignore.js +8 -74
- package/src/lib/graph/sanitize.js +16 -136
- package/src/lib/heavy/cleanup.js +2 -6
- package/src/lib/installers/effects.js +8 -93
- package/src/lib/installers/mcp-installer.js +9 -169
- package/src/lib/installers/memory-installer.js +8 -33
- package/src/lib/installers/templates-reconcile.js +5 -60
- package/src/lib/mutation/commands.js +3 -2
- package/src/lib/mutation/dotnet-introspection.js +281 -0
- package/src/lib/mutation/plan.js +14 -6
- package/src/lib/mutation/runner.js +1 -1
- package/src/lib/mutation/subset.js +47 -13
- package/src/lib/plan/artifact-vocabulary.js +40 -0
- package/src/lib/plan/checks.js +208 -0
- package/src/lib/plan/plan-parser.js +204 -0
- package/src/lib/plan/plan-template.js +18 -0
- package/src/lib/projects/registry.js +7 -44
- package/src/lib/review-reports.js +204 -0
- package/src/lib/risk-detector.js +131 -274
- package/src/lib/specs/adr-index.js +38 -85
- package/src/lib/specs/design-seed.js +18 -0
- package/src/lib/specs/frontmatter.js +31 -0
- package/src/lib/specs/gfm-table.js +11 -0
- package/src/lib/specs/revocations.js +31 -102
- package/src/lib/specs/screen-checklist.js +56 -132
- package/src/lib/stack/dotnet-build-ignores.js +43 -0
- package/src/lib/stack/stack-profile.js +1 -28
- package/src/lib/stack/stack-scan.js +260 -0
- package/src/lib/stack-filter.js +4 -27
- package/src/lib/standards/registry.js +37 -0
- package/src/lib/standards/sections.js +47 -0
- package/src/lib/standards/verified-against.js +19 -191
- package/src/lib/tasks/eval-node.js +23 -179
- package/src/lib/tasks/linux-runner.js +18 -142
- package/src/lib/tasks/test-nodes.js +43 -313
- package/src/lib/tasks/test-runner.js +107 -447
- package/src/lib/telemetry/metrics.js +13 -103
- package/src/lib/telemetry/telemetry-reader.js +13 -238
- package/src/lib/telemetry/verify-event.js +4 -34
- package/src/lib/validators/code-budget/code-budget-validator.js +4 -44
- package/src/lib/validators/code-budget/index.js +0 -7
- package/src/lib/validators/contracts/contract-compliance-validator.js +4 -26
- package/src/lib/validators/contracts/index.js +0 -6
- package/src/lib/validators/nextjs/index.js +0 -5
- package/src/lib/validators/nextjs/next-component-validator.js +4 -81
- package/src/lib/validators/packages/index.js +0 -6
- package/src/lib/validators/packages/package-validator.js +6 -56
- package/src/lib/validators/reuse/index.js +0 -8
- package/src/lib/validators/reuse/reuse-validator.js +24 -137
- package/src/lib/validators/reuse/symbol-scanner.js +6 -62
- package/src/lib/validators/traceability-check.js +54 -156
- package/src/lib/validators/validation-runner.js +20 -125
- package/src/lib/validators/verify-runner.js +152 -575
- package/src/lib/work-type-detector.js +5 -67
- package/src/lib/worktree/docker-audit.js +17 -137
- package/src/lib/worktree/env-allocator.js +10 -98
- package/src/lib/worktree/feature-truth.js +12 -115
- package/src/lib/worktree/finish-backup.js +32 -242
- package/src/lib/worktree/fleet-scanner.js +31 -126
- package/src/lib/worktree/ignored-triage.js +15 -91
- package/src/lib/worktree/vscode-settings.js +2 -3
- package/src/lib/worktree/worktree-audit.js +21 -213
- package/src/lib/worktree/worktree-include.js +3 -5
- package/src/scripts/global-install.js +3 -9
- package/src/scripts/install-plugin.js +1 -13
- package/src/scripts/setup-infra.js +17 -138
- package/src/utils/agents-installer.js +92 -272
- package/src/utils/banner.js +4 -25
- package/src/utils/claude-md-injector.js +1 -37
- package/src/utils/claude-settings-manager.js +1 -87
- package/src/utils/file-copier.js +32 -90
- package/src/utils/hooks-installer.js +26 -296
- package/src/utils/skills-installer.js +4 -102
- package/src/utils/version-checker.js +4 -83
- package/framework/commands/morph-proposal.md +0 -57
- package/framework/evals/trace-schema.md +0 -67
- package/framework/hooks/claude-code/core/tasks-json-guard.js +0 -83
- package/framework/hooks/claude-code/core/trace-autogen.js +0 -277
- package/framework/hooks/git/pre-commit/specs.sh +0 -50
- package/framework/hooks/shared/tasks-validator.js +0 -111
- package/framework/rules/morph-task-tracking.md +0 -54
- package/framework/rules/morph-workflow.md +0 -244
- package/framework/schemas/tasks.schema.json +0 -79
- package/framework/skills/core/morph-brainstorming/SKILL.md +0 -161
- package/framework/skills/core/morph-implement/SKILL.md +0 -194
- package/framework/skills/core/morph-proposal/SKILL.md +0 -152
- package/framework/skills/core/morph-stack-scan/SKILL.md +0 -145
- package/framework/templates/docs/proposal.md +0 -192
- package/framework/templates/docs/spec.md +0 -57
- package/framework/templates/docs/ui-components.md +0 -52
- package/framework/templates/docs/ui-design-system.md +0 -76
- package/framework/templates/docs/ui-flows.md +0 -167
- package/framework/templates/examples/spec-examples.md +0 -91
- package/framework/templates/feature/decisions.md +0 -124
- package/framework/templates/feature/recap.md +0 -145
- package/framework/templates/tasks.template.json +0 -17
- package/src/commands/state/usecase.js +0 -143
- package/src/commands/tasks/dag.js +0 -181
- package/src/commands/utils/index.js +0 -3
- package/src/lib/agents/output-collector.js +0 -76
- package/src/lib/detectors/design-system-detector.js +0 -188
- package/src/lib/evaluator-report.js +0 -104
- package/src/lib/generators/design-system-generator.js +0 -508
- package/src/lib/specs/acervo-format.js +0 -70
- package/src/lib/specs/acervo-lifecycle.js +0 -264
- package/src/lib/specs/done-criteria-check.js +0 -200
- package/src/lib/specs/usecase-check.js +0 -301
- package/src/lib/specs/usecase-promoter.js +0 -301
- package/src/lib/specs/usecase-registry.js +0 -237
- package/src/lib/tasks/dispatch-planner.js +0 -319
- package/src/lib/tasks/dotnet-test-introspection.js +0 -632
- package/src/lib/tasks/mermaid-renderer.js +0 -132
- package/src/lib/tasks/task-classifier.js +0 -30
- package/src/lib/tasks/task-parser.js +0 -209
- package/src/lib/tasks/tasks-json-parser.js +0 -296
- package/src/lib/tasks/test-scope.js +0 -597
- package/src/utils/agent-id-mapper.js +0 -11
|
@@ -1,244 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
stacks:
|
|
3
|
-
- "*"
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# MORPH-SPEC Workflow Rules
|
|
7
|
-
|
|
8
|
-
> Always-active rules for all MORPH-SPEC managed projects.
|
|
9
|
-
|
|
10
|
-
---
|
|
11
|
-
|
|
12
|
-
## Spec-First Mandate
|
|
13
|
-
|
|
14
|
-
**NEVER skip to code without a specification.** Every feature must progress through phases:
|
|
15
|
-
|
|
16
|
-
1. **Proposal** — Problem statement + scope + risks (`0-proposal/proposal.md`). No acceptance criteria: verifiable behaviour lives in the use cases.
|
|
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 + 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
|
-
4. **Implement** — Code + recap (`3-implement/recap.md`)
|
|
20
|
-
5. **Review** — Review report + Gate 3 (`4-review/review-report.md`)
|
|
21
|
-
|
|
22
|
-
---
|
|
23
|
-
|
|
24
|
-
## Phase Sequence
|
|
25
|
-
|
|
26
|
-
```
|
|
27
|
-
proposal → [uiux] → plan → implement → review
|
|
28
|
-
```
|
|
29
|
-
|
|
30
|
-
Use `morph-spec status {feature}` to see current phase and pending approval gates.
|
|
31
|
-
|
|
32
|
-
---
|
|
33
|
-
|
|
34
|
-
## Phase Commands
|
|
35
|
-
|
|
36
|
-
| Command | Purpose |
|
|
37
|
-
|---------|---------|
|
|
38
|
-
| `/morph-proposal {feature}` | Business understanding + plan — pauses at Gate 1 and Gate 2 |
|
|
39
|
-
| `/morph-apply {feature}` | Autonomous execution + review — pauses at Gate 3 |
|
|
40
|
-
| `/morph-status` | Feature dashboard |
|
|
41
|
-
|
|
42
|
-
The full slash-command and CLI surface lives in the resident `.claude/CLAUDE.md` and in
|
|
43
|
-
`.morph/framework/CLI.md` — this table only carries the three phase entry points.
|
|
44
|
-
|
|
45
|
-
---
|
|
46
|
-
|
|
47
|
-
## State & Outputs
|
|
48
|
-
|
|
49
|
-
| Path | Notes |
|
|
50
|
-
|------|-------|
|
|
51
|
-
| `.morph/features/{feature}/feature.json` | **Authoritative + committed** feature state. Write it through the CLI (`create`, `gate-decision`, `gate-check`, `approve`) — a hand Edit collides with the `state-sync` hook |
|
|
52
|
-
| `.morph/state.json` | **READ-ONLY** — thin, gitignored index rebuilt from `feature.json` on load; kept in sync by the `state-sync` hook |
|
|
53
|
-
| `.morph/features/{feature}/{phase}/` | Feature outputs organized by phase |
|
|
54
|
-
| `.morph/framework/` | **READ-ONLY** — framework files managed by morph-spec |
|
|
55
|
-
| `.morph/config/config.json` | Project configuration (editable) |
|
|
56
|
-
|
|
57
|
-
### output types
|
|
58
|
-
|
|
59
|
-
The canonical filename and phase folder of every output type are fixed by
|
|
60
|
-
morph-spec itself — the concrete paths are in the table below. State sync is
|
|
61
|
-
handled automatically by the `state-sync.js` PostToolUse hook: write the file
|
|
62
|
-
at the right path and it is recorded; the agent does not call any CLI to
|
|
63
|
-
register an output.
|
|
64
|
-
|
|
65
|
-
---
|
|
66
|
-
|
|
67
|
-
## Output Paths
|
|
68
|
-
|
|
69
|
-
All outputs go in `.morph/features/{feature}/`:
|
|
70
|
-
|
|
71
|
-
| Phase | Path |
|
|
72
|
-
|-------|------|
|
|
73
|
-
| Proposal | `0-proposal/proposal.md`, `stack-scan.md` |
|
|
74
|
-
| Design (optional) | `1-design/design-system.md`, `mockups.md`, `components.md`, `flows.md` |
|
|
75
|
-
| Plan | `2-plan/usecases/`, `spec.md`, `tasks.json`, `decisions.md` |
|
|
76
|
-
| Implement | `3-implement/recap.md` + source code; `3-implement/evidencias/{taskId}.md` (condicional — task cujo `doneCriteria` julga saída de LLM) |
|
|
77
|
-
| Review | `4-review/review-report.md` |
|
|
78
|
-
|
|
79
|
-
---
|
|
80
|
-
|
|
81
|
-
## Formato obrigatório do `3-implement/recap.md`
|
|
82
|
-
|
|
83
|
-
> Esta exigência é **cobrada por hook** (`validate-completion`, no Stop). Ela está aqui, na regra
|
|
84
|
-
> sempre-ativa, e não só na skill `morph-implement`: descobrir o formato quando o hook dispara
|
|
85
|
-
> significa reescrever o recap depois de a fase já estar dada por encerrada.
|
|
86
|
-
|
|
87
|
-
**Para CADA task com `status: "done"` em `tasks.json`**, o recap precisa de um bloco próprio:
|
|
88
|
-
|
|
89
|
-
1. um heading `## T{N}` (o hook casa `^## T\d+` — uma linha de tabela `| T1 | … | done |` conta
|
|
90
|
-
como menção, **não** como bloco);
|
|
91
|
-
2. uma linha `**Standard:** {standard-id}` **dentro de 12 linhas** do heading. Sem standard que
|
|
92
|
-
cubra o caso, registre a decisão em `decisions.md` e cite
|
|
93
|
-
`**Standard:** ad-hoc (see decisions.md ADR-{N})`.
|
|
94
|
-
|
|
95
|
-
```markdown
|
|
96
|
-
## T{N} — {title}
|
|
97
|
-
|
|
98
|
-
**Standard:** {standard-id} (`.morph/framework/standards/{path}.md`)
|
|
99
|
-
**Persona:** {mecanismo real usado}
|
|
100
|
-
**Files:**
|
|
101
|
-
- `{path}`
|
|
102
|
-
|
|
103
|
-
{2-3 frases sobre o que foi feito}
|
|
104
|
-
|
|
105
|
-
**Issues encontrados:** {breve descrição ou "nenhum"}
|
|
106
|
-
```
|
|
107
|
-
|
|
108
|
-
O `validate-completion` também acusa **drift**: uma task que aparece como concluída no recap mas
|
|
109
|
-
ainda está `pending`/`in_progress` no `tasks.json`. Template completo e regras de exceção em
|
|
110
|
-
`morph-implement` §6.
|
|
111
|
-
|
|
112
|
-
---
|
|
113
|
-
|
|
114
|
-
## Checkpoints
|
|
115
|
-
|
|
116
|
-
Run a checkpoint every 3 completed tasks:
|
|
117
|
-
- Validate architecture compliance
|
|
118
|
-
- Check package versions
|
|
119
|
-
- Scan for security issues
|
|
120
|
-
- Verify design system adherence (UI features)
|
|
121
|
-
|
|
122
|
-
---
|
|
123
|
-
|
|
124
|
-
## Approval Gates
|
|
125
|
-
|
|
126
|
-
Before completing any phase, verify pending approval gates:
|
|
127
|
-
- `morph-spec approval-status <feature>` — check which gates are pending
|
|
128
|
-
- `morph-spec approve <feature> <gate>` — approve a gate (`proposal`, `plan`, `review`; `uiux` if applicable)
|
|
129
|
-
- `morph-spec advance <feature>` — approve the current gate AND scaffold the next phase folder in one step
|
|
130
|
-
- Gates must be approved before advancing to the next phase
|
|
131
|
-
|
|
132
|
-
---
|
|
133
|
-
|
|
134
|
-
## Protected Files
|
|
135
|
-
|
|
136
|
-
**NEVER directly edit:**
|
|
137
|
-
- `.morph/state.json` — Managed by CLI only
|
|
138
|
-
- `.morph/framework/**` — Read-only framework content
|
|
139
|
-
|
|
140
|
-
---
|
|
141
|
-
|
|
142
|
-
## Test File Policy
|
|
143
|
-
|
|
144
|
-
When a test fails, always follow this order:
|
|
145
|
-
|
|
146
|
-
1. **Analyze first** — determine if the IMPLEMENTATION is wrong or the TEST SPEC is wrong
|
|
147
|
-
2. **Fix implementation first** — the test is the spec; trust it by default
|
|
148
|
-
3. **Only modify a test file if the test expectation itself is incorrect** — wrong expected value, wrong behavior modeled
|
|
149
|
-
4. **Before modifying any test file, explain WHY the test spec is wrong** — what the correct behavior is and why the test doesn't model it
|
|
150
|
-
|
|
151
|
-
Do not modify test files to make a failing test pass when the implementation is the actual problem.
|
|
152
|
-
|
|
153
|
-
---
|
|
154
|
-
|
|
155
|
-
## Context Maintenance
|
|
156
|
-
|
|
157
|
-
After making structural changes (new packages, dependencies, project config changes), update the project context:
|
|
158
|
-
- Edit `.morph/context/README.md` — update Tech Stack, Architecture, Key Integrations sections
|
|
159
|
-
- Any `.morph/context/*.md`: **rewrite the body, never stack** — the section that described the old fact now describes the new one (a value that still holds somewhere says where); a changelog keeps only date and reason
|
|
160
|
-
- Update `.morph/config/config.json` — update stack, architecture, integrations, paths
|
|
161
|
-
- Structural changes include: package.json, .csproj, next.config.*, tsconfig.json, docker-compose.yml
|
|
162
|
-
|
|
163
|
-
---
|
|
164
|
-
|
|
165
|
-
## Spec-Driven Task Execution (implement phase)
|
|
166
|
-
|
|
167
|
-
BEFORE implementing ANY task during the implement phase:
|
|
168
|
-
|
|
169
|
-
1. **Read tasks.json** → identify the current task object (`id`, `description`, `doneCriteria`, `dependencies`)
|
|
170
|
-
2. **Read spec.md** → the FR sections that the task `description` references
|
|
171
|
-
3. **Read the contracts** → the DTOs/interfaces are defined inside `spec.md` (v5 keeps contracts in the spec, not separate files)
|
|
172
|
-
4. Only then begin implementation
|
|
173
|
-
|
|
174
|
-
This is **NON-NEGOTIABLE**. The spec is the source of truth. Code that doesn't match the spec is a bug.
|
|
175
|
-
|
|
176
|
-
Every task in `tasks.json` MUST reference its FR(s) in the `description` field so the link to the spec is explicit:
|
|
177
|
-
```json
|
|
178
|
-
{
|
|
179
|
-
"id": "T1",
|
|
180
|
-
"title": "Create user endpoint",
|
|
181
|
-
"description": "Implement user CRUD (FR001) and input validation (FR003). Contracts: CreateUserRequest, CreateUserResponse, UserErrors.",
|
|
182
|
-
"dependencies": [],
|
|
183
|
-
"effort": "M",
|
|
184
|
-
"doneCriteria": "POST /users creates a user and rejects invalid input",
|
|
185
|
-
"status": "pending",
|
|
186
|
-
"outputs": ["Features/UserFeature/Create/Handler.cs", "Validator.cs", "Endpoint.cs"],
|
|
187
|
-
"group": "backend"
|
|
188
|
-
}
|
|
189
|
-
```
|
|
190
|
-
|
|
191
|
-
---
|
|
192
|
-
|
|
193
|
-
## Debugging
|
|
194
|
-
|
|
195
|
-
When a bug or unexpected behavior shows up mid-task, find the **root cause before proposing a
|
|
196
|
-
fix** — never a patch on the symptom. This is MANDATORY:
|
|
197
|
-
|
|
198
|
-
1. Reproduce it and read the full error, not the first line.
|
|
199
|
-
2. For a known .NET/Next.js error, run `/morph-troubleshoot <keywords>` first.
|
|
200
|
-
3. One hypothesis at a time, each tested by the smallest check that could refute it.
|
|
201
|
-
4. After three failed fixes, never try a fourth on your own: escalate via `AskUserQuestion` (accept / keep trying / skip), bringing the design question the failures raise — a fourth attempt with no new information repeats the error (same rule as MORPH.md §0).
|
|
202
|
-
5. Confirm the fix with the same check that reproduced the bug; add a test only when no existing one covers that behavior.
|
|
203
|
-
|
|
204
|
-
Everything else that a rule like this might list is owned by the flow itself, and duplicating it
|
|
205
|
-
here would put a second, staler copy in permanent context:
|
|
206
|
-
|
|
207
|
-
| Concern | Where it actually lives |
|
|
208
|
-
|---------|-------------------------|
|
|
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
|
-
| Parallel dispatch | `morph-spec dag {feature}` decides sequential vs parallel; execution and isolation rules are in `morph-apply` §2/§3b |
|
|
212
|
-
| Closing the phase / opening the PR | `morph-review` for Gate 3, then `morph-spec finish {feature} --pr\|--merge` |
|
|
213
|
-
|
|
214
|
-
---
|
|
215
|
-
|
|
216
|
-
## Scope Escalation
|
|
217
|
-
|
|
218
|
-
The plan contract frozen at Gate 2 — `spec.md` and the immutable `tasks.json`
|
|
219
|
-
fields listed in `morph-task-tracking.md` — is enforced by the `protect-spec-files` hook. When a
|
|
220
|
-
task turns out to be bigger than estimated, three different situations resolve three different ways:
|
|
221
|
-
|
|
222
|
-
| Situation | Path |
|
|
223
|
-
|-----------|------|
|
|
224
|
-
| **Small addition**, still inside the task's scope | Record it in the task's `notes` (a mutable field) — no gate to revoke, no contract to amend |
|
|
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
|
-
| **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
|
-
|
|
228
|
-
Scope ambiguity the plan does not cover is **not** an escalation: record it in
|
|
229
|
-
`decisions.md`, resolve it the conservative way, and keep going — only pause if it is genuinely
|
|
230
|
-
blocking (`morph-implement` §5).
|
|
231
|
-
|
|
232
|
-
**Never** implement extra functionality within a task without registering it — `notes` for small
|
|
233
|
-
additions, gate revocation for anything that changes the plan contract.
|
|
234
|
-
|
|
235
|
-
---
|
|
236
|
-
|
|
237
|
-
## Context Window Tip
|
|
238
|
-
|
|
239
|
-
When using 3+ MCPs, add `"experimental": { "mcpCliMode": true }` to `.claude/settings.json`.
|
|
240
|
-
MCP tools load on-demand instead of all at startup — keeps context clean for actual work.
|
|
241
|
-
|
|
242
|
-
---
|
|
243
|
-
|
|
244
|
-
*MORPH-SPEC by Polymorphism Tech*
|
|
@@ -1,79 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
3
|
-
"title": "MORPH-SPEC tasks.json",
|
|
4
|
-
"description": "Structured task list for a morph-spec feature. Replaces tasks.md.",
|
|
5
|
-
"type": "object",
|
|
6
|
-
"required": ["version", "feature", "tasks"],
|
|
7
|
-
"properties": {
|
|
8
|
-
"version": { "type": "string", "const": "1.0" },
|
|
9
|
-
"feature": { "type": "string", "minLength": 1 },
|
|
10
|
-
"tasks": {
|
|
11
|
-
"type": "array",
|
|
12
|
-
"items": {
|
|
13
|
-
"type": "object",
|
|
14
|
-
"required": ["id", "title", "description", "dependencies", "effort", "doneCriteria", "status"],
|
|
15
|
-
"properties": {
|
|
16
|
-
"id": { "type": "string", "pattern": "^T\\d+$" },
|
|
17
|
-
"title": { "type": "string", "minLength": 1 },
|
|
18
|
-
"description": { "type": "string", "minLength": 1 },
|
|
19
|
-
"dependencies": {
|
|
20
|
-
"type": "array",
|
|
21
|
-
"items": { "type": "string", "pattern": "^T\\d+$" }
|
|
22
|
-
},
|
|
23
|
-
"effort": { "type": "string", "enum": ["S", "M", "L", "XL"] },
|
|
24
|
-
"doneCriteria": { "type": "string", "minLength": 1 },
|
|
25
|
-
"status": { "type": "string", "enum": ["pending", "in_progress", "done", "skipped", "blocked"] },
|
|
26
|
-
"outputs": { "type": "array", "items": { "type": "string" } },
|
|
27
|
-
"notes": { "type": "string" },
|
|
28
|
-
"group": { "type": "string", "enum": ["backend", "frontend", "tests", "infra", "docs"] },
|
|
29
|
-
"usecase": {
|
|
30
|
-
"type": "string",
|
|
31
|
-
"pattern": "^UC-\\d+$",
|
|
32
|
-
"description": "ID of the use case this task realizes (2-plan/usecases/UC-{nn}-{slug}.md). Optional: technical tasks with no observable behaviour have none."
|
|
33
|
-
},
|
|
34
|
-
"agent": {
|
|
35
|
-
"type": "string",
|
|
36
|
-
"minLength": 1,
|
|
37
|
-
"description": "Persona id assigned by morph-plan for this task — the bare framework/agents.json id, no 'morph-' prefix (e.g. \"dotnet-senior\"). Optional. Part of the plan contract: frozen after Gate 2."
|
|
38
|
-
},
|
|
39
|
-
"reuse": {
|
|
40
|
-
"type": "array",
|
|
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
|
-
"items": {
|
|
43
|
-
"type": "object",
|
|
44
|
-
"required": ["concept", "verdict"],
|
|
45
|
-
"properties": {
|
|
46
|
-
"concept": {
|
|
47
|
-
"type": "string",
|
|
48
|
-
"minLength": 1,
|
|
49
|
-
"description": "Nome do conceito/símbolo, como ele aparecerá no código (ex.: \"SimpleBuilding\")."
|
|
50
|
-
},
|
|
51
|
-
"verdict": {
|
|
52
|
-
"type": "string",
|
|
53
|
-
"enum": ["REUSAR", "ESTENDER", "CRIAR"],
|
|
54
|
-
"description": "REUSAR: usar o que existe. ESTENDER: partir do que existe. CRIAR: nada cobre o caso — exige `why`."
|
|
55
|
-
},
|
|
56
|
-
"target": {
|
|
57
|
-
"type": "string",
|
|
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."
|
|
63
|
-
}
|
|
64
|
-
},
|
|
65
|
-
"additionalProperties": false
|
|
66
|
-
}
|
|
67
|
-
},
|
|
68
|
-
"standards": {
|
|
69
|
-
"type": "array",
|
|
70
|
-
"items": { "type": "string", "minLength": 1 },
|
|
71
|
-
"description": "Standards pinned by morph-plan for this task, as PATHS relative to the framework root (e.g. \"standards/backend/dotnet/vsa-handler-patterns.md\"). Optional. Part of the plan contract: frozen after Gate 2. NOT the same vocabulary as agents.json's top-level `standards` field, which lists IDs (e.g. \"backend-dotnet-vsa-handler-patterns\", no slashes/extension) — same field name, different shape; do not treat one as the other."
|
|
72
|
-
}
|
|
73
|
-
},
|
|
74
|
-
"additionalProperties": false
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
},
|
|
78
|
-
"additionalProperties": false
|
|
79
|
-
}
|
|
@@ -1,161 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: morph-brainstorming
|
|
3
|
-
description: Entende o negócio, os usuários e a arquitetura antes de qualquer planejamento técnico. Varre o ambiente primeiro, monta a árvore de decisões abertas e abre com a escolha de modo de descoberta (entrevista uma-pergunta-por-vez ou automático). Para projetos existentes, detecta desvios de stack e propõe plano de compliance.
|
|
4
|
-
version: core
|
|
5
|
-
when_to_use: Use quando chegar um novo request de feature, antes de morph-plan
|
|
6
|
-
user-invocable: true
|
|
7
|
-
cliVersion: "8.47.0"
|
|
8
|
-
---
|
|
9
|
-
|
|
10
|
-
# morph-brainstorming
|
|
11
|
-
|
|
12
|
-
## Objetivo
|
|
13
|
-
Garantir que o planejamento técnico parta de entendimento real do negócio e do contexto técnico existente — não de suposições. Output é o `proposal.md` aprovado pelo Gate 1.
|
|
14
|
-
|
|
15
|
-
## Quando invocar
|
|
16
|
-
Ao iniciar uma nova feature — antes de qualquer especificação técnica ou planejamento.
|
|
17
|
-
|
|
18
|
-
## Stack padrão (baked in)
|
|
19
|
-
|
|
20
|
-
O harness conhece o stack por padrão (backend .NET 10 + VSA + EF Core/Neon, IA via MAF, frontend Next.js/Tailwind/Shadcn) e a lista de padrões proibidos (`Guid.NewGuid()`, classes não-sealed, Service/Manager layer, repository genérico, SQL cru). **Não pergunte sobre tecnologia a menos que haja ambiguidade real** — stack nunca entra na árvore de decisões. Regra canônica: `MORPH.md` § "Stack baked-in".
|
|
21
|
-
|
|
22
|
-
## Modo bug-lean (`workType: bug`)
|
|
23
|
-
|
|
24
|
-
Quando a feature tem `workType: bug` (roteada pela `morph-proposal` — ver MORPH.md §2.1 "Roteamento por tipo de trabalho"), o brainstorming é enxuto. A varredura (Parte 0) continua rodando normalmente — o diagnóstico precisa do contexto técnico —, mas a árvore da Parte 1 é de **repro, diagnóstico e comportamento do sistema**, não de negócio; em modo automático (Parte 3) isso significa no máximo 1 pergunta de repro, e só se o pedido original não deixar claro. O `proposal.md` (Parte 4) foca em **Repro / Diagnóstico / Root cause provável / Escopo do fix / Conflitos com o acervo**, sem as seções de negócio completas.
|
|
25
|
-
|
|
26
|
-
Para `workType: feature` (ou features sem `workType` — compat, ver MORPH.md §2.1), o fluxo completo abaixo permanece integral.
|
|
27
|
-
|
|
28
|
-
## O que fazer
|
|
29
|
-
|
|
30
|
-
### Parte 0 — Varredura (antes de qualquer pergunta)
|
|
31
|
-
|
|
32
|
-
Fato não se pergunta. Antes de levar a primeira pergunta ao usuário, levante o que o ambiente já responde:
|
|
33
|
-
|
|
34
|
-
1. Invoque `Skill(morph-stack-scan)`. A skill:
|
|
35
|
-
- Curto-circuita em projetos greenfield (sem source files) — retorna relatório vazio.
|
|
36
|
-
- Em brownfield, varre stack atual (.csproj, package.json, migrations), padrões (Guid.NewGuid vs Guid.CreateVersion7, sealed, result pattern), features existentes.
|
|
37
|
-
- Produz `.morph/features/{feature}/0-proposal/stack-scan.md`.
|
|
38
|
-
|
|
39
|
-
2. Leia o contexto que já existe no projeto: `.morph/context/` (se existir), `.morph/config/config.json` (stack, integrations, trust), as features ativas em `.morph/features/`, o **acervo de use cases** em `.morph/specs/usecases/` e o **índice de ADRs ativos** em `.morph/specs/adrs/` (um arquivo por ADR, se existir). O comportamento já implementado é o contexto mais barato que existe — e é ele que evita perguntar o que o sistema já responde.
|
|
40
|
-
|
|
41
|
-
O acervo tem ciclo de vida: UC com `status: superseded` **não é o comportamento vigente** — o vigente é o `superseded_by`, e `scope` (quando existe) diz onde o antigo ainda vale. Decisão vigente é a do índice; os `decisions.md` de `.morph/archive/` são **história, não instrução** — abra um só para entender por que algo é como é, nunca para decidir.
|
|
42
|
-
|
|
43
|
-
3. **Conflitos com o acervo — avise, não entreviste.** Para cada UC vigente, ADR do índice ou documento de `.morph/context/` que o pedido novo **contradiz**:
|
|
44
|
-
- **Avise o usuário** — uma linha por conflito no resumo que abre a Parte 2 (fonte, o que ela diz, o que o pedido muda). Aviso, não pergunta.
|
|
45
|
-
- **Pedido explícito sobre o ponto → vale o mais novo.** Registre a escolha na coluna **Decisão** da seção de conflitos (o que muda, o que o antigo ainda cobre) e siga. Só entra na árvore (Parte 1) o conflito que o pedido deixa **ambíguo** — "o admin passa a Geist" não diz nada sobre a vitrine, então a vitrine é decisão; o admin não é.
|
|
46
|
-
- Todo conflito vai para a seção **Conflitos com o acervo** do `proposal.md` (Parte 4). A `2-plan/` só abre depois do Gate 1, então é a `morph-plan` que transforma cada decisão pelo novo em ADR no `decisions.md` e em linha de revogação no `spec.md` (§3) — é essa linha que o `finish` aplica ao acervo.
|
|
47
|
-
|
|
48
|
-
4. Reconciliação de design-system (se aplicável): comparar `.morph/context/design-system.md` (se existir) com o que foi detectado no stack-scan e com bundles/mocks recentes do usuário. Se houver **divergência** (tokens diferentes, framework version mismatch, fonte aprovada distinta), marque `signals.designSystemDivergence = true` — a escolha da fonte vira uma **decisão da árvore** (Parte 1), não uma pergunta solta. Resolvida, **reescreva o corpo** de `.morph/context/design-system.md` com a fonte escolhida — a seção que descrevia a antiga passa a descrever a nova, e o valor que ainda vale num escopo diz o escopo. O changelog guarda **só data e motivo**, nunca o valor novo: quem lê só o corpo precisa receber a resposta de hoje.
|
|
49
|
-
|
|
50
|
-
5. Desvio de stack detectado (`stack-scan.md`, seção Desvios): "a migração entra nesta feature ou vira feature separada?" — pergunta feita pelo `morph-stack-scan` ao fim da varredura — também é decisão da árvore; a resposta vai para a seção "Compliance de stack" do `proposal.md` (Parte 4).
|
|
51
|
-
|
|
52
|
-
### Parte 1 — Árvore de decisões abertas
|
|
53
|
-
|
|
54
|
-
Enumere **só o que a varredura não respondeu**. Uma decisão entra na árvore quando (a) muda o escopo, o comportamento ou a arquitetura da feature, e (b) o ambiente não a resolve.
|
|
55
|
-
|
|
56
|
-
Ordene por dependência: decisão que **poda** outras vem primeiro. "O fluxo é síncrono ou assíncrono?" antecede "qual é a política de retry" — a primeira resposta pode eliminar a segunda inteira.
|
|
57
|
-
|
|
58
|
-
Publique a **árvore de decisões** ao usuário antes de perguntar qualquer coisa. Ela é o sinal de progresso da entrevista e a base da recomendação de modo na Parte 2.
|
|
59
|
-
|
|
60
|
-
### Parte 2 — Pergunta de abertura (modo de descoberta)
|
|
61
|
-
|
|
62
|
-
Aplica-se a `workType: feature` e `bug`. **`chore` e `hotfix` não passam por aqui** — nascem com os Gates 1 e 2 carimbados `policy:{tipo}` e começam direto em `implement`.
|
|
63
|
-
|
|
64
|
-
Faça **uma** `AskUserQuestion` apresentando a árvore e recomendando um modo. A recomendação sai do tamanho e do acoplamento da árvore: muitas decisões abertas, ou decisões que dependem umas das outras → recomende **entrevista**; árvore rasa ou já respondida pela varredura → recomende **automático**. A opção recomendada vai em primeiro lugar, com o sufixo `(Recomendado)` no label.
|
|
65
|
-
|
|
66
|
-
```
|
|
67
|
-
question: "Antes de começar {feature}: entrevista ou automático? Encontrei {n} decisões abertas: {resumo da árvore}"
|
|
68
|
-
header: "Descoberta"
|
|
69
|
-
options:
|
|
70
|
-
- { label: "{modo recomendado} (Recomendado)", description: "{por que a árvore recomenda este modo}" }
|
|
71
|
-
- { label: "{o outro modo}", description: "{o que muda na prática}" }
|
|
72
|
-
```
|
|
73
|
-
|
|
74
|
-
### Parte 3 — Entendimento
|
|
75
|
-
|
|
76
|
-
**Modo entrevista.** Percorra a árvore, **uma pergunta por chamada** de `AskUserQuestion` — perguntas em lote desorientam e impedem que uma resposta pode ramos. Regras:
|
|
77
|
-
|
|
78
|
-
- Toda pergunta traz **resposta recomendada**, como primeira opção, marcada `(Recomendado)`.
|
|
79
|
-
- Cada resposta risca, poda ou abre ramos; mostre a árvore atualizada quando ela mudar de forma.
|
|
80
|
-
- Fato descoberto no ambiente nunca vira pergunta. As **decisões** são do usuário; os **fatos** são seus.
|
|
81
|
-
- Termina quando a árvore zera. Então apresente o **entendimento compartilhado** (problema, escopo com exclusões, usuários e fluxos, riscos) — a confirmação dele é o Gate 1, que **pausa sempre** neste modo.
|
|
82
|
-
- O usuário pode encerrar a entrevista a qualquer momento; o que ficou aberto vira exclusão explícita de escopo no `proposal.md`.
|
|
83
|
-
|
|
84
|
-
**Modo automático.** Até 4 perguntas via `AskUserQuestion` cobrindo o que a árvore deixou aberto:
|
|
85
|
-
- Qual problema de negócio esta feature resolve?
|
|
86
|
-
- Quem são os usuários afetados e quais são os fluxos críticos deles?
|
|
87
|
-
- Qual é o critério de sucesso — como saberemos que a feature está pronta?
|
|
88
|
-
- Há integrações externas, dependências de outras features ou restrições de prazo?
|
|
89
|
-
|
|
90
|
-
Árvore vazia → nenhuma pergunta. O Gate 1 segue trust-aware (regras do MORPH.md §5).
|
|
91
|
-
|
|
92
|
-
**Em `workType: bug`**, a árvore é de **repro, diagnóstico e comportamento do sistema** — não de negócio. Em modo automático vale o bug-lean: no máximo 1 pergunta de repro, e só se o pedido original não deixar claro.
|
|
93
|
-
|
|
94
|
-
### Parte 4 — Produção do proposal.md
|
|
95
|
-
|
|
96
|
-
1. Produza `proposal.md` em `.morph/features/{feature}/0-proposal/` com:
|
|
97
|
-
- **Problema:** o que está sendo resolvido e para quem (máx. 2 parágrafos)
|
|
98
|
-
- **Escopo:** o que está incluído e o que está explicitamente excluído — registre se a mudança cria ou altera superfície de UI (componente, página, tela, estilo, fluxo de navegação): é o fato que decide o roteamento para o ramo uiux na `morph-proposal` (critério objetivo em `MORPH.md` §2.1)
|
|
99
|
-
- **Usuários e fluxos críticos:** quem usa e qual é o caminho principal
|
|
100
|
-
- **Stack:** confirme o stack padrão ou documente desvios aprovados
|
|
101
|
-
- **Riscos e dependências:** o que pode dar errado, o que esta feature depende
|
|
102
|
-
- **Compliance de stack:** "Em compliance" ou lista de desvios detectados e plano de resolução
|
|
103
|
-
- **Conflitos com o acervo:** os conflitos da Parte 0 (passo 3), numa tabela `Fonte | O que diz hoje | O que o pedido muda | Decisão` — ou `Nenhum conflito encontrado.`. A seção existe sempre, também no bug-lean: ausente, ela diz que a checagem não rodou (o `validate-feature` avisa)
|
|
104
|
-
|
|
105
|
-
**Não escreva critérios de aceite aqui.** O comportamento verificável mora nos **use cases**, destilados pela `morph-plan` na fase seguinte (`2-plan/usecases/UC-{nn}-{slug}.md`), onde cada pós-condição precisa ser observável em teste e chega literal ao `doneCriteria` das tasks. O `proposal.md` responde **o quê e por quê**; os use cases respondem **como o sistema se comporta**. Duplicar aqui produz duas fontes que divergem no primeiro ajuste.
|
|
106
|
-
|
|
107
|
-
**Se `workType: bug`** (modo bug-lean, ver nota no início da skill), substitua a lista acima pela estrutura enxuta: **Repro** (passos para reproduzir), **Diagnóstico** (o que foi observado/investigado), **Root cause provável**, **Escopo do fix** (o que muda, o que fica de fora) e **Conflitos com o acervo** — sem as seções de negócio completas do fluxo `feature`. A condição verificável de que o bug foi corrigido vira a **pós-condição** que faltava no use case do acervo (`.morph/specs/usecases/`), corrigida ou acrescentada na fase plan.
|
|
108
|
-
|
|
109
|
-
Um bom proposal.md tem no máximo 2 páginas. Se está crescendo além disso, o escopo precisa ser cortado.
|
|
110
|
-
|
|
111
|
-
2. Apresente o Gate 1 segundo o modo de descoberta e o trust mode.
|
|
112
|
-
|
|
113
|
-
**Modo entrevista** (Parte 2) é a única exceção genuína: pausa sempre, e `shouldPauseGate` não tem esse conceito — `discoveryMode` não está entre as chaves que `gate-check --signals` aceita sobrescrever. Registre direto, sem `gate-check`:
|
|
114
|
-
```
|
|
115
|
-
morph-spec gate-decision {feature} proposal --pause true --reason "modo entrevista — entendimento compartilhado confirmado pelo usuário" --signals '{"discoveryMode":"interview"}'
|
|
116
|
-
```
|
|
117
|
-
|
|
118
|
-
**Fora do modo entrevista** (o caminho comum), rode `morph-spec gate-check {feature} proposal [--json]` — lê `trust` de `.morph/config/config.json`, decide via `shouldPauseGate` e persiste `gateDecisions.proposal` com timestamp server-side, imprimindo `pause`/`reason`/`signals`. Se a Parte 0 detectou divergência de design-system (leitura semântica — o `gate-check` não a vê sozinho no disco), repasse-a: `designSystemDivergence` é uma das poucas chaves que `--signals` aceita sobrescrever aqui:
|
|
119
|
-
```
|
|
120
|
-
morph-spec gate-check {feature} proposal --signals '{"designSystemDivergence":true}'
|
|
121
|
-
```
|
|
122
|
-
|
|
123
|
-
**Nunca edite `feature.json` à mão** (o Edit manual colide com o hook state-sync — erro "file modified since read"). Os dois comandos gravam `gateDecisions.proposal = { pause, reason, signals, trust, decidedAt }` no mesmo lugar (shape canônico em `.morph/framework/schemas/feature.schema.json`); o hook `gate-guard.js` confere depois se a ação (pausar vs auto-aprovar) bateu com a decisão persistida.
|
|
124
|
-
|
|
125
|
-
**Se `pause === true`** (manual mode OU risco detectado em auto), use `AskUserQuestion`:
|
|
126
|
-
|
|
127
|
-
```
|
|
128
|
-
question: "Gate 1 — Proposta de {nome} aprovada?{ reason ? ' Sinal de risco: ' + reason : '' }"
|
|
129
|
-
header: "Gate 1"
|
|
130
|
-
options:
|
|
131
|
-
- { label: "aprovado, prosseguir", description: "Aceitar a proposta e avançar para o planejamento" }
|
|
132
|
-
- { label: "preciso ajustar", description: "Apontar mudanças necessárias antes de prosseguir" }
|
|
133
|
-
- { label: "cancelar feature", description: "Abortar — feature não vai avançar" }
|
|
134
|
-
```
|
|
135
|
-
|
|
136
|
-
Aguardar resposta. Se "preciso ajustar", aplique e reapresente.
|
|
137
|
-
|
|
138
|
-
**Se `pause === false`** (auto-aprovação), exibir summary curto e prosseguir sem aguardar:
|
|
139
|
-
|
|
140
|
-
```
|
|
141
|
-
## Gate 1 (auto-aprovado)
|
|
142
|
-
|
|
143
|
-
**Feature:** {nome}
|
|
144
|
-
**Problema:** {1 frase}
|
|
145
|
-
**Escopo:** {incluído} | Excluído: {exclusões}
|
|
146
|
-
**Stack:** {compliance}
|
|
147
|
-
**Riscos:** {principal} (sinais detectados: nenhum)
|
|
148
|
-
```
|
|
149
|
-
|
|
150
|
-
No caminho manual, o hook state-sync.js detecta a aprovação automaticamente (grava o gate no `feature.json` autoritativo, `approvedBy: "manual"`) — **atribuindo pela feature nomeada na pergunta**; sem o nome, e com mais de uma feature na árvore, ele recusa a gravar e avisa (aprove então por `morph-spec approve {feature} proposal`). Em modo auto sem AskUserQuestion, aprove via `morph-spec approve {feature} proposal --mode auto` (ou `morph-spec advance {feature}` para já criar a pasta 2-plan/) — nunca via Edit à mão de state.json.
|
|
151
|
-
|
|
152
|
-
## Output esperado
|
|
153
|
-
- `.morph/features/{feature}/0-proposal/proposal.md` — proposta aprovada, com desvios de stack (se houver) resolvidos na seção "Compliance de stack" e os conflitos com o acervo listados em "Conflitos com o acervo"
|
|
154
|
-
- Gate 1 apresentado e aprovado
|
|
155
|
-
|
|
156
|
-
## Referências
|
|
157
|
-
- `.morph/framework/MORPH.md` — seções 1 (Papéis), 2 (Fases), 5 (Gates), Trust Mode
|
|
158
|
-
- `morph-spec standards --find "<query>"` — para referência de standards relevantes à stack (ver `morph-standards`)
|
|
159
|
-
- `.claude/skills/morph-stack-scan/SKILL.md` — invocada na Parte 0 (varredura), antes de qualquer pergunta
|
|
160
|
-
- `.morph/framework/MORPH.md` §5 — regras de pausa do Gate 1 (trust mode)
|
|
161
|
-
- `.morph/specs/usecases/` e `.morph/specs/adrs/` — o acervo vigente (UC `superseded` e `decisions.md` arquivado não são instrução); lidos na Parte 0
|