@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
|
@@ -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": ["
|
|
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):
|
|
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
|
-
"
|
|
94
|
-
|
|
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
|
|
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
|
|
131
|
-
"required": ["status", "sha", "ts"
|
|
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
|
|
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
|
|
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/
|
|
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-
|
|
16
|
-
| `morph-
|
|
17
|
-
| `morph-
|
|
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: "
|
|
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: "
|
|
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:
|
|
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
|
|
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: "
|
|
7
|
+
cliVersion: "9.1.0"
|
|
8
8
|
---
|
|
9
9
|
|
|
10
10
|
# morph-apply
|
|
11
11
|
|
|
12
12
|
## Objetivo
|
|
13
13
|
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
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
|
|
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
|
-
##
|
|
27
|
+
## 1. Contexto, uma vez
|
|
30
28
|
|
|
31
|
-
|
|
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
|
-
|
|
34
|
-
`group`, `status`, `doneCriteria`).
|
|
41
|
+
## 2. Fatiar
|
|
35
42
|
|
|
36
|
-
|
|
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
|
-
|
|
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
|
-
|
|
43
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
97
|
-
|
|
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
|
-
|
|
104
|
-
|
|
105
|
-
|
|
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
|
-
|
|
73
|
+
## 3. Dispatch — só o que muda
|
|
108
74
|
|
|
109
|
-
|
|
110
|
-
|
|
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
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
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
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
`
|
|
196
|
-
`
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
`
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
1
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
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
|
-
-
|
|
250
|
-
-
|
|
251
|
-
-
|
|
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
|