@opengsd/gsd-core 1.9.1 → 1.11.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-plugin/marketplace.json +1 -1
- package/.claude-plugin/plugin.json +2 -3
- package/.opencode/plugins/gsd-core.js +8 -1
- package/agents/gsd-code-fixer.md +27 -3
- package/agents/gsd-debug-session-manager.md +11 -0
- package/agents/gsd-debugger.md +12 -246
- package/agents/gsd-doc-synthesizer.md +2 -4
- package/agents/gsd-executor.md +12 -10
- package/agents/gsd-integration-checker.md +3 -0
- package/agents/gsd-mempalace-curator.md +5 -2
- package/agents/gsd-phase-researcher.md +20 -1
- package/agents/gsd-plan-checker.md +46 -0
- package/agents/gsd-planner.md +49 -54
- package/agents/gsd-roadmapper.md +21 -3
- package/agents/gsd-user-profiler.md +3 -0
- package/agents/gsd-verifier.md +26 -73
- package/bin/install.js +1272 -1238
- package/bin/lib/ui-safety-gate.cjs +2 -0
- package/commands/gsd/code-review.md +1 -1
- package/commands/gsd/execute-phase.md +1 -1
- package/commands/gsd/map-codebase.md +1 -1
- package/commands/gsd/mempalace-capture.md +2 -2
- package/commands/gsd/mempalace-recall.md +1 -1
- package/commands/gsd/new-milestone.md +2 -2
- package/commands/gsd/plan-phase.md +1 -1
- package/commands/gsd/quick.md +1 -1
- package/commands/gsd/review-backlog.md +2 -1
- package/commands/gsd/verify-work.md +1 -1
- package/gsd-core/bin/gsd-tools.cjs +1009 -115
- package/gsd-core/bin/lib/active-workstream-store.cjs +153 -12
- package/gsd-core/bin/lib/agent-install-check.cjs +268 -38
- package/gsd-core/bin/lib/api-coverage.cjs +123 -5
- package/gsd-core/bin/lib/artifacts.cjs +3 -0
- package/gsd-core/bin/lib/assumption-delta.cjs +2 -4
- package/gsd-core/bin/lib/audit-command-router.cjs +9 -2
- package/gsd-core/bin/lib/audit.cjs +926 -202
- package/gsd-core/bin/lib/broken-windows.cjs +36 -6
- package/gsd-core/bin/lib/capability-consent.cjs +149 -15
- package/gsd-core/bin/lib/capability-lifecycle.cjs +45 -0
- package/gsd-core/bin/lib/capability-registry.cjs +608 -148
- package/gsd-core/bin/lib/capability-source.cjs +92 -0
- package/gsd-core/bin/lib/capability-trust.cjs +444 -25
- package/gsd-core/bin/lib/capability-validator.cjs +507 -24
- package/gsd-core/bin/lib/capability-writer.cjs +3 -2
- package/gsd-core/bin/lib/check-command-router.cjs +114 -38
- package/gsd-core/bin/lib/claude-orchestration.cjs +56 -3
- package/gsd-core/bin/lib/codex-agent-toml.cjs +329 -0
- package/gsd-core/bin/lib/command-aliases.cjs +94 -0
- package/gsd-core/bin/lib/command-roster.cjs +44 -1
- package/gsd-core/bin/lib/commands.cjs +665 -99
- package/gsd-core/bin/lib/commonjs-marker.cjs +142 -0
- package/gsd-core/bin/lib/complexity-trigger.cjs +1172 -0
- package/gsd-core/bin/lib/config-loader.cjs +76 -0
- package/gsd-core/bin/lib/config.cjs +22 -2
- package/gsd-core/bin/lib/context-composer.cjs +278 -0
- package/gsd-core/bin/lib/context-predicates.cjs +506 -0
- package/gsd-core/bin/lib/core-utils.cjs +217 -40
- package/gsd-core/bin/lib/decisions.cjs +23 -0
- package/gsd-core/bin/lib/docs.cjs +3 -2
- package/gsd-core/bin/lib/external-job.cjs +19 -4
- package/gsd-core/bin/lib/fallow-runner.cjs +20 -44
- package/gsd-core/bin/lib/frontmatter.cjs +239 -32
- package/gsd-core/bin/lib/gap-checker.cjs +68 -7
- package/gsd-core/bin/lib/gate-predicate-evaluator.cjs +57 -6
- package/gsd-core/bin/lib/git-base-branch.cjs +160 -15
- package/gsd-core/bin/lib/graphify.cjs +142 -27
- package/gsd-core/bin/lib/gsd2-import.cjs +37 -5
- package/gsd-core/bin/lib/health-diagnostic-rules/agent-install.cjs +101 -0
- package/gsd-core/bin/lib/health-diagnostic-rules/config-validation.cjs +348 -0
- package/gsd-core/bin/lib/health-diagnostic-rules/consistency.cjs +145 -0
- package/gsd-core/bin/lib/health-diagnostic-rules/install-surface-shadowing.cjs +98 -0
- package/gsd-core/bin/lib/health-diagnostic-rules/milestone-archive-hygiene.cjs +100 -0
- package/gsd-core/bin/lib/health-diagnostic-rules/phase-structure.cjs +222 -0
- package/gsd-core/bin/lib/health-diagnostic-rules/roadmap-disk-consistency.cjs +265 -0
- package/gsd-core/bin/lib/health-diagnostic-rules/root-existence.cjs +161 -0
- package/gsd-core/bin/lib/health-diagnostic-rules/state-consistency.cjs +303 -0
- package/gsd-core/bin/lib/health-diagnostic-rules/worktree-health.cjs +173 -0
- package/gsd-core/bin/lib/health-diagnostic-types.cjs +68 -0
- package/gsd-core/bin/lib/health-diagnostic.cjs +431 -0
- package/gsd-core/bin/lib/host-integration.cjs +13 -1
- package/gsd-core/bin/lib/host-runtime-detection.cjs +134 -0
- package/gsd-core/bin/lib/init-command-router.cjs +83 -8
- package/gsd-core/bin/lib/init.cjs +1325 -169
- package/gsd-core/bin/lib/install-effort-resolver.cjs +73 -30
- package/gsd-core/bin/lib/install-engine.cjs +805 -264
- package/gsd-core/bin/lib/install-fs-adapter.cjs +262 -0
- package/gsd-core/bin/lib/install-model-override-resolver.cjs +203 -0
- package/gsd-core/bin/lib/install-profiles.cjs +160 -57
- package/gsd-core/bin/lib/install-scope.cjs +270 -0
- package/gsd-core/bin/lib/install-shadow-report.cjs +385 -0
- package/gsd-core/bin/lib/installed-surface-resolver.cjs +381 -0
- package/gsd-core/bin/lib/installer-migration-authoring.cjs +3 -1
- package/gsd-core/bin/lib/installer-migration-report.cjs +4 -0
- package/gsd-core/bin/lib/installer-migrations/007-retire-config-root-commonjs-marker.cjs +149 -0
- package/gsd-core/bin/lib/installer-migrations/008-cursor-retire-commands-surface.cjs +55 -0
- package/gsd-core/bin/lib/installer-migrations/009-pi-retire-reserved-hooks-dir.cjs +199 -0
- package/gsd-core/bin/lib/installer-migrations.cjs +206 -13
- package/gsd-core/bin/lib/io.cjs +38 -3
- package/gsd-core/bin/lib/markdown-sectionizer.cjs +8 -1
- package/gsd-core/bin/lib/markdown-table.cjs +133 -20
- package/gsd-core/bin/lib/mcp-catalog.cjs +518 -0
- package/gsd-core/bin/lib/mcp-server.cjs +135 -3
- package/gsd-core/bin/lib/milestone-lock.cjs +248 -0
- package/gsd-core/bin/lib/milestone.cjs +821 -109
- package/gsd-core/bin/lib/model-catalog.cjs +59 -1
- package/gsd-core/bin/lib/model-resolver.cjs +183 -40
- package/gsd-core/bin/lib/normalize-test-command.cjs +1 -1
- package/gsd-core/bin/lib/pattern.cjs +122 -0
- package/gsd-core/bin/lib/phase-estimation.cjs +1 -1
- package/gsd-core/bin/lib/phase-id.cjs +507 -36
- package/gsd-core/bin/lib/phase-lifecycle.cjs +28 -3
- package/gsd-core/bin/lib/phase-locator.cjs +258 -58
- package/gsd-core/bin/lib/phase.cjs +891 -156
- package/gsd-core/bin/lib/plan-dependency-graph.cjs +303 -0
- package/gsd-core/bin/lib/plan-drift-guard.cjs +120 -0
- package/gsd-core/bin/lib/plan-scan.cjs +86 -2
- package/gsd-core/bin/lib/planning-scope.cjs +31 -0
- package/gsd-core/bin/lib/planning-snapshot.cjs +890 -0
- package/gsd-core/bin/lib/planning-workspace.cjs +60 -6
- package/gsd-core/bin/lib/probe-core.cjs +1 -1
- package/gsd-core/bin/lib/profile-output.cjs +1 -1
- package/gsd-core/bin/lib/prompt-budget.cjs +128 -165
- package/gsd-core/bin/lib/refactor-trigger-command-router.cjs +740 -0
- package/gsd-core/bin/lib/retired-artifact-cleanup.cjs +85 -0
- package/gsd-core/bin/lib/review-lane-descriptor.cjs +108 -0
- package/gsd-core/bin/lib/review-lane-invocation.cjs +30 -0
- package/gsd-core/bin/lib/review-lane-runner.cjs +447 -68
- package/gsd-core/bin/lib/review-reviewer-selection.cjs +13 -18
- package/gsd-core/bin/lib/roadmap-command-router.cjs +76 -9
- package/gsd-core/bin/lib/roadmap-parser.cjs +1035 -194
- package/gsd-core/bin/lib/roadmap-upgrade.cjs +37 -10
- package/gsd-core/bin/lib/roadmap.cjs +405 -84
- package/gsd-core/bin/lib/runtime-artifact-conversion.cjs +795 -100
- package/gsd-core/bin/lib/runtime-artifact-install-plan.cjs +14 -2
- package/gsd-core/bin/lib/runtime-artifact-layout.cjs +440 -57
- package/gsd-core/bin/lib/runtime-config-adapter-registry.cjs +3 -2
- package/gsd-core/bin/lib/runtime-homes.cjs +220 -41
- package/gsd-core/bin/lib/runtime-hooks-surface.cjs +220 -44
- package/gsd-core/bin/lib/runtime-name-policy.cjs +3 -1
- package/gsd-core/bin/lib/runtime-slash.cjs +27 -9
- package/gsd-core/bin/lib/section-manifest.cjs +209 -0
- package/gsd-core/bin/lib/security.cjs +104 -5
- package/gsd-core/bin/lib/shell-command-projection.cjs +388 -30
- package/gsd-core/bin/lib/smart-entry.cjs +154 -22
- package/gsd-core/bin/lib/state-command-router.cjs +5 -1
- package/gsd-core/bin/lib/state-document.cjs +152 -8
- package/gsd-core/bin/lib/state-transition.cjs +424 -105
- package/gsd-core/bin/lib/state.cjs +1927 -401
- package/gsd-core/bin/lib/surface.cjs +35 -10
- package/gsd-core/bin/lib/text-lines.cjs +80 -0
- package/gsd-core/bin/lib/token-scanner.cjs +76 -0
- package/gsd-core/bin/lib/uat-predicate.cjs +20 -4
- package/gsd-core/bin/lib/uat.cjs +706 -64
- package/gsd-core/bin/lib/ui-frontend-evidence.cjs +157 -0
- package/gsd-core/bin/lib/ui-safety-gate.cjs +14 -5
- package/gsd-core/bin/lib/unusable-input.cjs +33 -0
- package/gsd-core/bin/lib/update-context.cjs +8 -2
- package/gsd-core/bin/lib/user-artifact-staging.cjs +705 -0
- package/gsd-core/bin/lib/validate.cjs +20 -6
- package/gsd-core/bin/lib/vendor/README.md +37 -0
- package/gsd-core/bin/lib/vendor/re2js.cjs +6480 -0
- package/gsd-core/bin/lib/vendor/re2js.d.cts +938 -0
- package/gsd-core/bin/lib/verification-command-router.cjs +2 -1
- package/gsd-core/bin/lib/verification.cjs +287 -20
- package/gsd-core/bin/lib/verify.cjs +368 -880
- package/gsd-core/bin/lib/workflow-fragments.cjs +557 -0
- package/gsd-core/bin/lib/workstream-inventory-builder.cjs +203 -19
- package/gsd-core/bin/lib/workstream-inventory.cjs +576 -31
- package/gsd-core/bin/lib/workstream.cjs +8 -2
- package/gsd-core/bin/lib/worktree-base-ref.cjs +50 -6
- package/gsd-core/bin/lib/worktree-safety.cjs +450 -125
- package/gsd-core/bin/shared/config-defaults.manifest.json +1 -0
- package/gsd-core/bin/shared/config-schema.manifest.json +9 -1
- package/gsd-core/references/agent-contracts.md +43 -26
- package/gsd-core/references/artifact-types.md +10 -3
- package/gsd-core/references/autonomous-ui-design-contract.md +42 -0
- package/gsd-core/references/checkpoints.md +2 -2
- package/gsd-core/references/context-budget.md +1 -1
- package/gsd-core/references/debugger-techniques.md +255 -0
- package/gsd-core/references/dispatch-isolation-gate.md +138 -0
- package/gsd-core/references/doc-conflict-engine.md +1 -1
- package/gsd-core/references/execute-mvp-tdd.md +3 -3
- package/gsd-core/references/execute-phase-between-wave-reset.md +6 -2
- package/gsd-core/references/execute-phase-context-guard.md +1 -1
- package/gsd-core/references/execute-phase-response-language.md +1 -1
- package/gsd-core/references/execute-phase-wave-guard.md +6 -2
- package/gsd-core/references/gate-prompts.md +1 -1
- package/gsd-core/references/git-planning-commit.md +2 -1
- package/gsd-core/references/loop-hook-dispatch.md +39 -2
- package/gsd-core/references/model-profiles.md +12 -4
- package/gsd-core/references/mvp-concepts.md +9 -9
- package/gsd-core/references/planner-guidance.md +3 -9
- package/gsd-core/references/planner-preconditions.md +1 -1
- package/gsd-core/references/planner-reviews.md +1 -1
- package/gsd-core/references/planning-config.md +8 -6
- package/gsd-core/references/research-documentation-lookup.md +5 -3
- package/gsd-core/references/revision-loop.md +1 -1
- package/gsd-core/references/specless-probe-fallback.md +8 -7
- package/gsd-core/references/universal-anti-patterns.md +3 -3
- package/gsd-core/references/verifier-phase-gates.md +192 -0
- package/gsd-core/references/verifier-wiring-patterns.md +100 -0
- package/gsd-core/references/verify-mvp-mode.md +1 -1
- package/gsd-core/references/workstream-flag.md +22 -6
- package/gsd-core/references/worktree-branch-check.md +2 -2
- package/gsd-core/templates/discussion-log.md +1 -1
- package/gsd-core/templates/phase-prompt.md +2 -4
- package/gsd-core/templates/state.md +4 -4
- package/gsd-core/templates/summary-complex.md +2 -0
- package/gsd-core/templates/summary-minimal.md +2 -0
- package/gsd-core/templates/summary-standard.md +2 -0
- package/gsd-core/templates/summary.md +2 -0
- package/gsd-core/templates/verification-report.md +9 -1
- package/gsd-core/workflows/ai-integration-phase.md +9 -11
- package/gsd-core/workflows/audit-milestone.md +3 -0
- package/gsd-core/workflows/autonomous/steps/converge-banner.md +1 -0
- package/gsd-core/workflows/autonomous/steps/converge-dispatch-bg.md +11 -0
- package/gsd-core/workflows/autonomous/steps/converge-dispatch-inline.md +7 -0
- package/gsd-core/workflows/autonomous/steps/converge-fail-fast.md +21 -0
- package/gsd-core/workflows/autonomous/steps/converge-loop.md +7 -0
- package/gsd-core/workflows/autonomous.md +33 -70
- package/gsd-core/workflows/cleanup.md +62 -3
- package/gsd-core/workflows/code-review/steps/dispatch-fix.md +39 -0
- package/gsd-core/workflows/code-review/steps/structural-pre-pass.md +93 -0
- package/gsd-core/workflows/code-review-fix.md +37 -10
- package/gsd-core/workflows/code-review.md +74 -166
- package/gsd-core/workflows/complete-milestone/steps/git-tag.md +29 -0
- package/gsd-core/workflows/complete-milestone.md +160 -95
- package/gsd-core/workflows/debug.md +16 -17
- package/gsd-core/workflows/diagnose-issues.md +56 -8
- package/gsd-core/workflows/discuss-phase/modes/chain.md +2 -1
- package/gsd-core/workflows/discuss-phase/modes/default.md +1 -1
- package/gsd-core/workflows/discuss-phase-assumptions/steps/auto-advance-dispatch.md +15 -0
- package/gsd-core/workflows/discuss-phase-assumptions.md +7 -17
- package/gsd-core/workflows/docs-update/steps/dispatch-monorepo-packages.md +51 -0
- package/gsd-core/workflows/docs-update.md +8 -51
- package/gsd-core/workflows/edit-phase.md +26 -1
- package/gsd-core/workflows/eval-review.md +3 -5
- package/gsd-core/workflows/execute-phase/steps/executor-isolation-dispatch.md +64 -7
- package/gsd-core/workflows/execute-phase/steps/gap-closure-artifacts.md +50 -0
- package/gsd-core/workflows/execute-phase/steps/partial-wave.md +31 -0
- package/gsd-core/workflows/execute-phase/steps/per-plan-executor-routing.md +77 -0
- package/gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md +21 -0
- package/gsd-core/workflows/execute-phase/steps/regression-gate-run.md +42 -0
- package/gsd-core/workflows/execute-phase/steps/regression-gate.md +43 -37
- package/gsd-core/workflows/execute-phase.md +103 -187
- package/gsd-core/workflows/execute-plan.md +36 -4
- package/gsd-core/workflows/explore.md +131 -4
- package/gsd-core/workflows/fast.md +10 -2
- package/gsd-core/workflows/health.md +73 -4
- package/gsd-core/workflows/help/modes/full.md +6 -1
- package/gsd-core/workflows/import.md +4 -4
- package/gsd-core/workflows/ingest-docs.md +7 -6
- package/gsd-core/workflows/mvp-phase.md +6 -3
- package/gsd-core/workflows/new-milestone/steps/project-md-milestone-write.md +16 -0
- package/gsd-core/workflows/new-milestone/steps/reset-phase-safety.md +19 -0
- package/gsd-core/workflows/new-milestone.md +35 -47
- package/gsd-core/workflows/new-project/steps/auto-mode-config.md +176 -0
- package/gsd-core/workflows/new-project/steps/auto-mode-detection.md +32 -0
- package/gsd-core/workflows/new-project/steps/codebase-map-offer.md +18 -0
- package/gsd-core/workflows/new-project.md +27 -240
- package/gsd-core/workflows/next.md +12 -0
- package/gsd-core/workflows/plan-phase/steps/adr-ingest-express-path.md +15 -0
- package/gsd-core/workflows/plan-phase/steps/chunked-planning-mode.md +110 -0
- package/gsd-core/workflows/plan-phase/steps/prd-express-gate.md +8 -0
- package/gsd-core/workflows/plan-phase/steps/research-only-early-exit.md +17 -0
- package/gsd-core/workflows/plan-phase/steps/research-only-modifiers.md +16 -0
- package/gsd-core/workflows/plan-phase/steps/reviews-prerequisite.md +17 -0
- package/gsd-core/workflows/plan-phase/steps/stall-detection-helpers.md +149 -0
- package/gsd-core/workflows/plan-phase.md +89 -209
- package/gsd-core/workflows/plan-review-convergence.md +50 -2
- package/gsd-core/workflows/progress/steps/forensic-audit.md +125 -0
- package/gsd-core/workflows/progress/steps/mvp-display.md +18 -0
- package/gsd-core/workflows/progress.md +45 -159
- package/gsd-core/workflows/quick/steps/discussion-phase.md +124 -0
- package/gsd-core/workflows/quick/steps/plan-checker-loop.md +111 -0
- package/gsd-core/workflows/quick/steps/quick-verification.md +67 -0
- package/gsd-core/workflows/quick/steps/research-phase.md +72 -0
- package/gsd-core/workflows/quick/steps/worktree-pre-dispatch-commit.md +37 -0
- package/gsd-core/workflows/quick.md +55 -405
- package/gsd-core/workflows/resume-project.md +3 -0
- package/gsd-core/workflows/review/steps/reviewer-instances-note-1.md +4 -0
- package/gsd-core/workflows/review/steps/reviewer-instances-note-2.md +3 -0
- package/gsd-core/workflows/review.md +41 -13
- package/gsd-core/workflows/section-manifest.json +219 -0
- package/gsd-core/workflows/secure-phase.md +1 -1
- package/gsd-core/workflows/session-report.md +2 -1
- package/gsd-core/workflows/settings.md +66 -2
- package/gsd-core/workflows/ship.md +104 -44
- package/gsd-core/workflows/sketch.md +1 -1
- package/gsd-core/workflows/spec-phase.md +41 -20
- package/gsd-core/workflows/spike-wrap-up.md +20 -5
- package/gsd-core/workflows/spike.md +50 -16
- package/gsd-core/workflows/sync-skills.md +106 -13
- package/gsd-core/workflows/transition/steps/workstream-collision-check.md +17 -0
- package/gsd-core/workflows/transition.md +53 -31
- package/gsd-core/workflows/ui-phase.md +13 -12
- package/gsd-core/workflows/ui-review.md +2 -2
- package/gsd-core/workflows/update/steps/channel-banner.md +7 -0
- package/gsd-core/workflows/update.md +19 -8
- package/gsd-core/workflows/validate-phase.md +1 -1
- package/gsd-core/workflows/verify-work/steps/automated-ui-verification.md +36 -0
- package/gsd-core/workflows/verify-work/steps/mvp-uat-framing.md +21 -0
- package/gsd-core/workflows/verify-work.md +17 -65
- package/hooks/dist/gsd-agent-isolation-guard.js +517 -0
- package/hooks/dist/gsd-check-update-worker.js +64 -12
- package/hooks/dist/gsd-check-update.js +19 -1
- package/hooks/dist/gsd-cursor-pre-tool.js +0 -3
- package/hooks/dist/gsd-cursor-subagent-start.js +607 -26
- package/hooks/dist/gsd-cursor-subagent-stop.js +3 -2
- package/hooks/dist/gsd-prompt-guard.js +21 -20
- package/hooks/dist/gsd-read-injection-scanner.js +45 -24
- package/hooks/dist/gsd-statusline.js +90 -6
- package/hooks/dist/gsd-update-banner.js +22 -1
- package/hooks/dist/gsd-workflow-guard.js +134 -36
- package/hooks/dist/gsd-worktree-path-guard.js +2 -1
- package/hooks/dist/gsd-write-guard.js +359 -0
- package/hooks/dist/lib/git-cmd.js +92 -59
- package/hooks/dist/lib/injection-patterns.js +45 -0
- package/hooks/dist/lib/isolation-deny-reason.js +39 -0
- package/hooks/dist/lib/isolation-sentinel.js +277 -0
- package/hooks/dist/managed-hooks-registry.cjs +2 -0
- package/hooks/gsd-agent-isolation-guard.js +517 -0
- package/hooks/gsd-check-update-worker.js +64 -12
- package/hooks/gsd-check-update.js +19 -1
- package/hooks/gsd-cursor-pre-tool.js +0 -3
- package/hooks/gsd-cursor-subagent-start.js +607 -26
- package/hooks/gsd-cursor-subagent-stop.js +3 -2
- package/hooks/gsd-prompt-guard.js +21 -20
- package/hooks/gsd-read-injection-scanner.js +45 -24
- package/hooks/gsd-statusline.js +90 -6
- package/hooks/gsd-update-banner.js +22 -1
- package/hooks/gsd-workflow-guard.js +134 -36
- package/hooks/gsd-worktree-path-guard.js +2 -1
- package/hooks/gsd-write-guard.js +359 -0
- package/hooks/hooks.json +12 -0
- package/hooks/lib/git-cmd.js +92 -59
- package/hooks/lib/injection-patterns.js +45 -0
- package/hooks/lib/isolation-deny-reason.js +39 -0
- package/hooks/lib/isolation-sentinel.js +277 -0
- package/hooks/managed-hooks-registry.cjs +2 -0
- package/package.json +31 -10
- package/pi/gsd.cjs +71 -12
- package/scripts/baselines/planning-prompt-drift-baseline.json +4 -0
- package/scripts/baselines/planning-snapshot-bypass-baseline.json +12 -0
- package/scripts/baselines/unreachable-guard-drift-baseline.json +4 -0
- package/scripts/build-hooks.js +9 -0
- package/scripts/changeset/lint.cjs +68 -6
- package/scripts/changeset/serialize.cjs +5 -1
- package/scripts/check-alias-drift.cjs +7 -43
- package/scripts/check-contract-drift.cjs +297 -0
- package/scripts/ci-test-scope.cjs +19 -2
- package/scripts/command-contract-helpers.cjs +903 -1
- package/scripts/gen-adr-index.cjs +728 -38
- package/scripts/gen-capability-matrix.cjs +1 -1
- package/scripts/gen-capability-registry.cjs +3 -15
- package/scripts/gen-context-index.cjs +439 -0
- package/scripts/gen-health-docs.cjs +390 -0
- package/scripts/gen-inventory-manifest.cjs +150 -4
- package/scripts/gen-loop-host-contract.cjs +4 -24
- package/scripts/gen-prompt-budget-parity-corpus.cjs +645 -0
- package/scripts/gen-registry.cjs +3 -14
- package/scripts/gen-section-manifest.cjs +638 -0
- package/scripts/generate-package-identity.cjs +4 -2
- package/scripts/lib/alias-drift-families.cjs +46 -0
- package/scripts/lib/drift-scan.cjs +278 -0
- package/scripts/lint-allow-test-rule-refs.allowlist.json +15 -54
- package/scripts/lint-allow-test-rule-refs.effective-ceiling.json +4 -0
- package/scripts/lint-allow-test-rule-refs.unverified-ceiling.json +3 -0
- package/scripts/lint-canary-version-leak.cjs +73 -0
- package/scripts/lint-command-contract.cjs +96 -13
- package/scripts/lint-compiled-artifact-sync.cjs +6 -1
- package/scripts/lint-completion-predicate-drift.cjs +933 -0
- package/scripts/lint-completion-ratio-drift.cjs +214 -0
- package/scripts/lint-default-flip-documentation.cjs +193 -0
- package/scripts/lint-docs-command-form.cjs +195 -0
- package/scripts/lint-docs-required.cjs +9 -1
- package/scripts/lint-emitted-drift-ack.cjs +215 -20
- package/scripts/lint-eslint-glob-coverage.allowlist.json +34 -0
- package/scripts/lint-eslint-glob-coverage.cjs +340 -0
- package/scripts/lint-example-parser-parity.cjs +395 -0
- package/scripts/lint-frontmatter-scalar-broad-grep.cjs +237 -0
- package/scripts/lint-health-diagnostic-rule-table.cjs +404 -0
- package/scripts/lint-hooks-runtime-build-seam.cjs +262 -0
- package/scripts/lint-milestone-window-drift.cjs +468 -0
- package/scripts/lint-phase-enumeration-drift.cjs +479 -0
- package/scripts/lint-plan-count-drift.cjs +318 -0
- package/scripts/lint-planning-artifact-writer-drift.cjs +398 -0
- package/scripts/lint-planning-prompt-drift.cjs +434 -0
- package/scripts/lint-planning-snapshot-bypass-drift.cjs +544 -0
- package/scripts/lint-regression-test-names.cjs +15 -13
- package/scripts/lint-removed-but-needed.cjs +320 -0
- package/scripts/lint-state-field-drift.cjs +805 -0
- package/scripts/lint-state-write-path-drift.cjs +1045 -0
- package/scripts/lint-test-file-count.allowlist.json +40 -3
- package/scripts/lint-unreachable-guard-drift.cjs +843 -0
- package/scripts/lint-vendored-deps.cjs +124 -0
- package/scripts/mutation-matrix.cjs +13 -0
- package/scripts/pr-changed-files.cjs +63 -0
- package/scripts/pr-template-policy.cjs +14 -4
- package/scripts/prompt-injection-scan.sh +52 -6
- package/scripts/require-issue-link-policy.cjs +192 -0
- package/scripts/state-write-path-drift-baseline.json +19 -0
- package/scripts/sync-runtime-launcher.cjs +2 -4
- package/skills/gsd-autonomous/SKILL.md +0 -1
- package/skills/gsd-code-review/SKILL.md +1 -1
- package/skills/gsd-execute-phase/SKILL.md +1 -2
- package/skills/gsd-map-codebase/SKILL.md +1 -1
- package/skills/gsd-mempalace-capture/SKILL.md +2 -2
- package/skills/gsd-mempalace-recall/SKILL.md +1 -1
- package/skills/gsd-new-milestone/SKILL.md +2 -2
- package/skills/gsd-next/SKILL.md +0 -1
- package/skills/gsd-plan-phase/SKILL.md +1 -2
- package/skills/gsd-progress/SKILL.md +0 -1
- package/skills/gsd-quick/SKILL.md +1 -1
- package/skills/gsd-review-backlog/SKILL.md +2 -1
- package/skills/gsd-stats/SKILL.md +0 -1
- package/skills/gsd-verify-work/SKILL.md +1 -1
- package/vscode/package.json +1 -1
- package/gsd-core/workflows/discovery-phase.md +0 -298
- package/gsd-core/workflows/plan-milestone-gaps.md +0 -281
- package/gsd-core/workflows/verify-phase.md +0 -577
- package/scripts/affected-tests-lib.cjs +0 -554
- package/scripts/gen-emitted-baseline.cjs +0 -145
- package/scripts/lint-allow-test-rule-refs.cjs +0 -162
- package/scripts/run-affected-tests.cjs +0 -7
- package/scripts/run-tests.cjs +0 -1050
|
@@ -210,6 +210,42 @@ issue:
|
|
|
210
210
|
fix_hint: "Plan 02 depends on 03, but 03 depends on 02"
|
|
211
211
|
```
|
|
212
212
|
|
|
213
|
+
## Dimension 3b: Undeclared / Temporal Coupling
|
|
214
|
+
|
|
215
|
+
**Question:** Do two same-wave plans depend on each other through shared mutable state or
|
|
216
|
+
execution order without declaring it? Dimension 3 checks *declared* edges and the wave guard
|
|
217
|
+
checks `files_modified` overlap; neither sees an undeclared edge, which under parallel
|
|
218
|
+
execution becomes an intermittent failure nobody can attribute.
|
|
219
|
+
|
|
220
|
+
**Scope: PLAN pairs, not tasks.** Tasks inside one plan run sequentially and cannot race.
|
|
221
|
+
Compare same-wave plan pairs over the union of their tasks' `<files>` and `<action>`.
|
|
222
|
+
|
|
223
|
+
**FLAG only when ALL THREE hold** (coupling that is strong *and* non-local — Connascence of
|
|
224
|
+
Execution; strong-but-local coupling inside one plan is fine):
|
|
225
|
+
1. both plans sit in the same wave, and
|
|
226
|
+
2. neither declares `depends_on` on the other, and
|
|
227
|
+
3. their actions name a *specific* shared mutable resource (config key, table/row, migration,
|
|
228
|
+
env var, singleton, cache) with at least one WRITER, or one names a prerequisite the other
|
|
229
|
+
produces.
|
|
230
|
+
|
|
231
|
+
**Do NOT flag:** both sides only READ it, or it is immutable; the pair already overlaps in
|
|
232
|
+
`files_modified` (report that once, on the file axis); the plans sit in a different wave, which
|
|
233
|
+
already orders them; two tasks inside one plan; a vague same-subsystem claim naming no
|
|
234
|
+
resource; incompatible *transformations* of one entity — that is Dimension 9.
|
|
235
|
+
|
|
236
|
+
**Severity: ALWAYS WARNING, never a blocker.** Coupling is sometimes intentional; the finding
|
|
237
|
+
lets the planner declare the edge, move a plan to a later wave, or justify the pair.
|
|
238
|
+
|
|
239
|
+
```yaml
|
|
240
|
+
issue:
|
|
241
|
+
dimension: dependency_correctness
|
|
242
|
+
severity: warning
|
|
243
|
+
description: "Plans 02 and 03 are both Wave 1 with no depends_on, but 02 writes config key
|
|
244
|
+
auth.session_ttl and 03 reads it"
|
|
245
|
+
plans: ["02", "03"]
|
|
246
|
+
fix_hint: "Declare depends_on, move 03 to a later wave, or justify either order"
|
|
247
|
+
```
|
|
248
|
+
|
|
213
249
|
## Dimension 4: Key Links Planned
|
|
214
250
|
|
|
215
251
|
**Question:** Are artifacts wired together, not just created in isolation?
|
|
@@ -714,6 +750,9 @@ Extract from init JSON: `phase_dir`, `phase_number`, `has_plans`, `plan_count`.
|
|
|
714
750
|
Orchestrator provides CONTEXT.md content in the verification prompt. If provided, parse for locked decisions, discretion areas, deferred ideas.
|
|
715
751
|
|
|
716
752
|
```bash
|
|
753
|
+
# #2962: zsh aborts the block on an unmatched for-list glob (nomatch); bash passes it through. nullglob both.
|
|
754
|
+
shopt -s nullglob 2>/dev/null; setopt NULL_GLOB 2>/dev/null
|
|
755
|
+
|
|
717
756
|
gsd_run query phase.list-plans "$phase_number"
|
|
718
757
|
# Research / brief artifacts (deterministic listing)
|
|
719
758
|
gsd_run query phase.list-artifacts "$phase_number" --type research
|
|
@@ -735,6 +774,9 @@ done
|
|
|
735
774
|
Use `gsd-tools query` to validate plan structure:
|
|
736
775
|
|
|
737
776
|
```bash
|
|
777
|
+
# #2962: zsh aborts the block on an unmatched for-list glob (nomatch); bash passes it through. nullglob both.
|
|
778
|
+
shopt -s nullglob 2>/dev/null; setopt NULL_GLOB 2>/dev/null
|
|
779
|
+
|
|
738
780
|
for plan in "$PHASE_DIR"/*-PLAN.md; do
|
|
739
781
|
echo "=== $plan ==="
|
|
740
782
|
PLAN_STRUCTURE=$(gsd_run query verify.plan-structure "$plan")
|
|
@@ -820,6 +862,9 @@ Inspect `tasks` in the JSON; open the PLAN in the editor for prose-level review.
|
|
|
820
862
|
## Step 6: Verify Dependency Graph
|
|
821
863
|
|
|
822
864
|
```bash
|
|
865
|
+
# #2962: zsh aborts the block on an unmatched for-list glob (nomatch); bash passes it through. nullglob both.
|
|
866
|
+
shopt -s nullglob 2>/dev/null; setopt NULL_GLOB 2>/dev/null
|
|
867
|
+
|
|
823
868
|
for plan in "$PHASE_DIR"/*-PLAN.md; do
|
|
824
869
|
grep "depends_on:" "$plan"
|
|
825
870
|
done
|
|
@@ -1027,6 +1072,7 @@ Plan verification complete when:
|
|
|
1027
1072
|
- [ ] Requirement coverage checked (all requirements have tasks)
|
|
1028
1073
|
- [ ] Task completeness validated (all required fields present)
|
|
1029
1074
|
- [ ] Dependency graph verified (no cycles, valid references)
|
|
1075
|
+
- [ ] Undeclared/temporal coupling checked (same-wave plan pairs, advisory)
|
|
1030
1076
|
- [ ] Key links checked (wiring planned, not just artifacts)
|
|
1031
1077
|
- [ ] Scope assessed (within context budget)
|
|
1032
1078
|
- [ ] must_haves derivation verified (user-observable truths)
|
package/agents/gsd-planner.md
CHANGED
|
@@ -374,7 +374,7 @@ Output: [Artifacts created]
|
|
|
374
374
|
|-----------|----------|-----------|----------|-------------|-----------------|
|
|
375
375
|
| T-{phase}-01 | {S/T/R/I/D/E} | {function/endpoint/file} | {critical\|high\|medium\|low} | mitigate | {specific mitigation action} |
|
|
376
376
|
| T-{phase}-02 | {category} | {component} | low | accept | {rationale for acceptance} |
|
|
377
|
-
| T-{phase}-SC | Tampering | npm/pip/cargo installs | high | mitigate |
|
|
377
|
+
| T-{phase}-SC | Tampering | npm/pip/cargo installs | high | mitigate | package-legitimacy gate + blocking human checkpoint for [ASSUMED]/[SUS] |
|
|
378
378
|
</threat_model>
|
|
379
379
|
|
|
380
380
|
<verification>
|
|
@@ -485,47 +485,7 @@ See @~/.claude/gsd-core/references/planner-guidance.md for a worked example and
|
|
|
485
485
|
|
|
486
486
|
## Checkpoint Types
|
|
487
487
|
|
|
488
|
-
**checkpoint:human-verify (90%
|
|
489
|
-
Human confirms Claude's automated work works correctly.
|
|
490
|
-
|
|
491
|
-
Use for: Visual UI checks, interactive flows, functional verification, animation/accessibility.
|
|
492
|
-
|
|
493
|
-
```xml
|
|
494
|
-
<task type="checkpoint:human-verify" gate="blocking">
|
|
495
|
-
<what-built>[What Claude automated]</what-built>
|
|
496
|
-
<how-to-verify>
|
|
497
|
-
[Exact steps to test - URLs, commands, expected behavior]
|
|
498
|
-
</how-to-verify>
|
|
499
|
-
<resume-signal>Type "approved" or describe issues</resume-signal>
|
|
500
|
-
</task>
|
|
501
|
-
```
|
|
502
|
-
|
|
503
|
-
**checkpoint:decision (9% of checkpoints)**
|
|
504
|
-
Human makes implementation choice affecting direction.
|
|
505
|
-
|
|
506
|
-
Use for: Technology selection, architecture decisions, design choices.
|
|
507
|
-
|
|
508
|
-
```xml
|
|
509
|
-
<task type="checkpoint:decision" gate="blocking">
|
|
510
|
-
<decision>[What's being decided]</decision>
|
|
511
|
-
<context>[Why this matters]</context>
|
|
512
|
-
<options>
|
|
513
|
-
<option id="option-a">
|
|
514
|
-
<name>[Name]</name>
|
|
515
|
-
<pros>[Benefits]</pros>
|
|
516
|
-
<cons>[Tradeoffs]</cons>
|
|
517
|
-
</option>
|
|
518
|
-
</options>
|
|
519
|
-
<resume-signal>Select: option-a, option-b, or ...</resume-signal>
|
|
520
|
-
</task>
|
|
521
|
-
```
|
|
522
|
-
|
|
523
|
-
**checkpoint:human-action (1% - rare)**
|
|
524
|
-
Action has NO CLI/API and requires human-only interaction.
|
|
525
|
-
|
|
526
|
-
Use ONLY for: Email verification links, SMS 2FA codes, manual account approvals, credit card 3D Secure flows.
|
|
527
|
-
|
|
528
|
-
Do NOT use for: Deploying (use CLI), creating webhooks (use API), creating databases (use provider CLI), running builds/tests (use Bash), creating files (use Write).
|
|
488
|
+
Three types: **checkpoint:human-verify (90%)**, **checkpoint:decision (9%)**, **checkpoint:human-action (1% - rare)**. Full "use for" criteria and XML templates for each: @~/.claude/gsd-core/references/checkpoints.md
|
|
529
489
|
|
|
530
490
|
## Authentication Gates
|
|
531
491
|
|
|
@@ -696,7 +656,8 @@ Select top 2-4 phases. Skip phases with no relevance signal.
|
|
|
696
656
|
|
|
697
657
|
**Step 3 — Read full SUMMARYs for selected phases:**
|
|
698
658
|
```bash
|
|
699
|
-
|
|
659
|
+
_SUMMARIES=( .planning/phases/{selected-phase}/*-SUMMARY.md )
|
|
660
|
+
if [ -e "${_SUMMARIES[0]}" ]; then cat "${_SUMMARIES[@]}"; fi
|
|
700
661
|
```
|
|
701
662
|
|
|
702
663
|
From full SUMMARYs extract:
|
|
@@ -733,9 +694,12 @@ If `features.global_learnings` is `true`: run `gsd_run query learnings.query --t
|
|
|
733
694
|
Use `phase_dir` from init context (already loaded in load_project_state).
|
|
734
695
|
|
|
735
696
|
```bash
|
|
736
|
-
|
|
737
|
-
cat "$
|
|
738
|
-
|
|
697
|
+
_CTX=( "$phase_dir"/*-CONTEXT.md )
|
|
698
|
+
if [ -e "${_CTX[0]}" ]; then cat "${_CTX[@]}"; fi # From /gsd:discuss-phase
|
|
699
|
+
_RESEARCH=( "$phase_dir"/*-RESEARCH.md )
|
|
700
|
+
if [ -e "${_RESEARCH[0]}" ]; then cat "${_RESEARCH[@]}"; fi # Research output
|
|
701
|
+
_DISCOVERY=( "$phase_dir"/*-DISCOVERY.md )
|
|
702
|
+
if [ -e "${_DISCOVERY[0]}" ]; then cat "${_DISCOVERY[@]}"; fi # From mandatory discovery
|
|
739
703
|
```
|
|
740
704
|
|
|
741
705
|
**If CONTEXT.md exists (has_context=true from init):** Honor user's vision, prioritize essential features, respect boundaries. Locked decisions — do not revisit.
|
|
@@ -869,18 +833,15 @@ Include all frontmatter fields.
|
|
|
869
833
|
</step>
|
|
870
834
|
|
|
871
835
|
<step name="validate_plan">
|
|
872
|
-
|
|
836
|
+
`$SCHEMA`: `plan-gap-closure` in gap_closure mode, else `plan`. `gap_closure` must be literal lowercase `true`.
|
|
873
837
|
|
|
874
838
|
```bash
|
|
875
|
-
VALID=$(gsd_run query frontmatter.validate "$PLAN_PATH" --schema
|
|
839
|
+
VALID=$(gsd_run query frontmatter.validate "$PLAN_PATH" --schema "$SCHEMA")
|
|
876
840
|
```
|
|
877
841
|
|
|
878
|
-
Returns JSON: `{ valid, missing, present, schema }`
|
|
842
|
+
Returns JSON: `{ valid, missing, present, invalidValue, schema }`
|
|
879
843
|
|
|
880
|
-
**If `valid=false`:**
|
|
881
|
-
|
|
882
|
-
Required plan frontmatter fields:
|
|
883
|
-
- `phase`, `plan`, `type`, `wave`, `depends_on`, `files_modified`, `autonomous`, `must_haves`
|
|
844
|
+
**If `valid=false`:** `missing` = absent fields, `invalidValue` = present but wrong-valued. Fix either before proceeding.
|
|
884
845
|
|
|
885
846
|
Also validate plan structure:
|
|
886
847
|
|
|
@@ -937,7 +898,7 @@ Return structured planning outcome to orchestrator.
|
|
|
937
898
|
|
|
938
899
|
<structured_returns>
|
|
939
900
|
|
|
940
|
-
See @~/.claude/gsd-core/references/planner-guidance.md for
|
|
901
|
+
See @~/.claude/gsd-core/references/planner-guidance.md for return formats; gap-closure returns are artifact-based (#3440).
|
|
941
902
|
|
|
942
903
|
See @~/.claude/gsd-core/references/planner-chunked.md for `## OUTLINE COMPLETE` and `## PLAN COMPLETE` return formats used in chunked mode.
|
|
943
904
|
|
|
@@ -954,6 +915,40 @@ See @~/.claude/gsd-core/references/planner-chunked.md for `## OUTLINE COMPLETE`
|
|
|
954
915
|
|
|
955
916
|
<success_criteria>
|
|
956
917
|
|
|
918
|
+
## Return Markers
|
|
919
|
+
|
|
920
|
+
Your orchestrator dispatches on exact marker strings in your final output. Emit exactly one of:
|
|
921
|
+
|
|
922
|
+
```markdown
|
|
923
|
+
## PLANNING COMPLETE
|
|
924
|
+
```
|
|
925
|
+
(final plans committed, ready for verification)
|
|
926
|
+
|
|
927
|
+
```markdown
|
|
928
|
+
## OUTLINE COMPLETE
|
|
929
|
+
```
|
|
930
|
+
(outline produced, awaiting confirmation — chunked planning mode)
|
|
931
|
+
|
|
932
|
+
```markdown
|
|
933
|
+
## PHASE SPLIT RECOMMENDED
|
|
934
|
+
```
|
|
935
|
+
(phase too large to plan as one unit, include the proposed split)
|
|
936
|
+
|
|
937
|
+
```markdown
|
|
938
|
+
## ⚠ Source Audit
|
|
939
|
+
```
|
|
940
|
+
(unplanned items found in the requirements, include the options)
|
|
941
|
+
|
|
942
|
+
```markdown
|
|
943
|
+
## CHECKPOINT REACHED
|
|
944
|
+
```
|
|
945
|
+
(paused at a user checkpoint, include resume instructions)
|
|
946
|
+
|
|
947
|
+
```markdown
|
|
948
|
+
## PLANNING INCONCLUSIVE
|
|
949
|
+
```
|
|
950
|
+
(cannot produce a plan, include exactly what is missing)
|
|
951
|
+
|
|
957
952
|
## Standard Mode
|
|
958
953
|
|
|
959
954
|
Phase planning complete when:
|
package/agents/gsd-roadmapper.md
CHANGED
|
@@ -560,9 +560,27 @@ If gaps found, include in draft for user decision.
|
|
|
560
560
|
|
|
561
561
|
Write files first, then return. This ensures artifacts persist even if context is lost.
|
|
562
562
|
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
563
|
+
**Arm the write-guard sentinel before each curated write, when the target already exists.** On a
|
|
564
|
+
`/gsd:new-milestone` run `.planning/ROADMAP.md` and `.planning/STATE.md` still hold the *outgoing*
|
|
565
|
+
milestone's content, and the replacement carries only the new milestone's phases — a legitimate,
|
|
566
|
+
intentional shrink that the `gsd-write-guard` PreToolUse hook (#2255) hard-blocks on curated
|
|
567
|
+
`.planning/` artifacts. A hook inherits the *runtime's* environment, so no per-step env var can reach
|
|
568
|
+
it; the hatch is a **single-use sentinel file the guard itself consumes**. It is path-bound and
|
|
569
|
+
single-use, so arm it immediately before each Write — one arming can never cover both files. On a
|
|
570
|
+
`/gsd:new-project` run neither target exists, the guard exempts the write (ENOENT), and the `[ -f ]`
|
|
571
|
+
test skips the arming so no unconsumed token is left on disk.
|
|
572
|
+
|
|
573
|
+
1. **Write ROADMAP.md** using output format — arm first, then Write:
|
|
574
|
+
|
|
575
|
+
```bash
|
|
576
|
+
[ -f .planning/ROADMAP.md ] && printf '.planning/ROADMAP.md\n' > .planning/.gsd-allow-shrink
|
|
577
|
+
```
|
|
578
|
+
|
|
579
|
+
2. **Write STATE.md** using output format — arm first, then Write:
|
|
580
|
+
|
|
581
|
+
```bash
|
|
582
|
+
[ -f .planning/STATE.md ] && printf '.planning/STATE.md\n' > .planning/.gsd-allow-shrink
|
|
583
|
+
```
|
|
566
584
|
|
|
567
585
|
3. **Update REQUIREMENTS.md traceability section**
|
|
568
586
|
|
|
@@ -13,6 +13,9 @@ You are spawned by the profile orchestration workflow (Phase 3) or by write-prof
|
|
|
13
13
|
Your job: Apply the heuristics defined in the user-profiling reference document to score each dimension with evidence and confidence. Return structured JSON analysis.
|
|
14
14
|
|
|
15
15
|
CRITICAL: You must apply the rubric defined in the reference document. Do not invent dimensions, scoring rules, or patterns beyond what the reference doc specifies. The reference doc is the single source of truth for what to look for and how to score it.
|
|
16
|
+
|
|
17
|
+
**CRITICAL: Mandatory Initial Read**
|
|
18
|
+
If the prompt contains a `<required_reading>` block, you MUST use the `Read` tool to load every file listed there before performing any other actions. This is your primary context.
|
|
16
19
|
</role>
|
|
17
20
|
|
|
18
21
|
<input>
|
package/agents/gsd-verifier.md
CHANGED
|
@@ -41,6 +41,7 @@ Every truth must resolve to VERIFIED, FAILED (BLOCKER), or UNCERTAIN (WARNING wi
|
|
|
41
41
|
<required_reading>
|
|
42
42
|
@~/.claude/gsd-core/references/verification-overrides.md
|
|
43
43
|
@~/.claude/gsd-core/references/gates.md
|
|
44
|
+
@~/.claude/gsd-core/references/verifier-phase-gates.md
|
|
44
45
|
</required_reading>
|
|
45
46
|
|
|
46
47
|
This agent implements the **Escalation Gate** pattern (surfaces unresolvable gaps to the developer for decision).
|
|
@@ -81,7 +82,8 @@ At verification decision points, reference calibration examples:
|
|
|
81
82
|
## Step 0: Check for Previous Verification
|
|
82
83
|
|
|
83
84
|
```bash
|
|
84
|
-
|
|
85
|
+
_VERIF=( "$PHASE_DIR"/*-VERIFICATION.md )
|
|
86
|
+
if [ -e "${_VERIF[0]}" ]; then cat "${_VERIF[@]}"; fi
|
|
85
87
|
```
|
|
86
88
|
|
|
87
89
|
**If previous verification exists with `gaps:` section → RE-VERIFICATION MODE:**
|
|
@@ -199,7 +201,8 @@ For each truth:
|
|
|
199
201
|
- A pre-existing test exercises the transition/invariant and passes (confirm via Step 7b's single-named-test path) → ✓ VERIFIED.
|
|
200
202
|
- No such test exists, or it can't run without a server/state mutation → ⚠️ PRESENT_BEHAVIOR_UNVERIFIED. Emit a human-verification item (Step 8) and do not count it toward the verified score (Step 9).
|
|
201
203
|
- An accepted override (Step 3b) carries the truth as PASSED (override), exactly as it does for a FAILED truth.
|
|
202
|
-
5b. **Non-inferable
|
|
204
|
+
5b. **Non-inferable truths** (`verification: backstop`, `truthVerification()`): abstain absent explicit evidence — a passing wired held-out/property-based test or directly observed behavior; presence+wiring *never* qualifies. Mark `insufficient_spec` -> human-verification item -> `human_needed`.
|
|
205
|
+
5c. **Reliance check (advisory, #1955).** Before finalizing a ✓ VERIFIED truth, ask *why* it holds. Classify the evidence already recorded, not your confidence in it. Endogenous, and so weaker than the exogenous `backstop` tag (`gsd-core/references/honest-verifier.md`) — advisory for exactly that reason. Flag `coincidental-reliance` when the evidence names one of: **undeclared-precondition** (state nothing in the phase's artifacts or a declared prerequisite guarantees), **incidental-ordering** (an order or side effect nothing in the code enforces), **fixture-only** (the test's own setup establishes the precondition; the production path has no equivalent). **Do NOT flag:** a precondition the code establishes or explicitly defaults; ordering the code enforces (await, explicit sequencing); a fixture merely supplying input the real caller also supplies; unease naming no specific state, ordering, or fixture. Out of scope: ⚠️ PRESENT_BEHAVIOR_UNVERIFIED and ⚠️ `insufficient_spec` (already routed to human), and PASSED (override) truths. Record `✓ VERIFIED (coincidental-reliance)` and add a `coincidental_reliance_items` entry. **Advisory only — not the score, not the status, and never a human-verification item** (Step 9 rule 2 would flip a passing phase to `human_needed`). The usual fix: promote the hidden assumption into a declared precondition.
|
|
203
206
|
6. Determine truth status
|
|
204
207
|
|
|
205
208
|
## Step 3b: Check Verification Overrides
|
|
@@ -285,46 +288,16 @@ grep -r "$artifact_name" "${search_path:-src/}" --include="*.ts" --include="*.ts
|
|
|
285
288
|
|
|
286
289
|
## Step 4b: Data-Flow Trace (Level 4)
|
|
287
290
|
|
|
288
|
-
|
|
291
|
+
Trace each rendered value back to a real data source. Full procedure and shell
|
|
292
|
+
recipes: @gsd-core/references/verifier-wiring-patterns.md
|
|
289
293
|
|
|
290
|
-
|
|
294
|
+
Flag any value whose chain terminates in a static return, a hardcoded literal, or
|
|
295
|
+
a mock rather than a real query.
|
|
291
296
|
|
|
292
|
-
**
|
|
293
|
-
|
|
294
|
-
1. **Identify the data variable** — what state/prop does the artifact render?
|
|
295
|
-
|
|
296
|
-
```bash
|
|
297
|
-
# Find state variables that are rendered in JSX/TSX
|
|
298
|
-
grep -n -E "useState|useQuery|useSWR|useStore|props\." "$artifact" 2>/dev/null
|
|
299
|
-
```
|
|
300
|
-
|
|
301
|
-
2. **Trace the data source** — where does that variable get populated?
|
|
302
|
-
|
|
303
|
-
```bash
|
|
304
|
-
# Find the fetch/query that populates the state
|
|
305
|
-
grep -n -A 5 "set${STATE_VAR}\|${STATE_VAR}\s*=" "$artifact" 2>/dev/null | grep -E "fetch|axios|query|store|dispatch|props\."
|
|
306
|
-
```
|
|
307
|
-
|
|
308
|
-
3. **Verify the source produces real data** — does the API/store return actual data or static/empty values?
|
|
309
|
-
|
|
310
|
-
```bash
|
|
311
|
-
# Check the API route or data source for real DB queries vs static returns
|
|
312
|
-
grep -n -E "prisma\.|db\.|query\(|findMany|findOne|select|FROM" "$source_file" 2>/dev/null
|
|
313
|
-
# Flag: static returns with no query
|
|
314
|
-
grep -n -E "return.*json\(\s*\[\]|return.*json\(\s*\{\}" "$source_file" 2>/dev/null
|
|
315
|
-
```
|
|
316
|
-
|
|
317
|
-
4. **Check for disconnected props** — props passed to child components that are hardcoded empty at the call site
|
|
318
|
-
|
|
319
|
-
```bash
|
|
320
|
-
# Find where the component is used and check prop values
|
|
321
|
-
grep -r -A 3 "<${COMPONENT_NAME}" "${search_path:-src/}" --include="*.tsx" 2>/dev/null | grep -E "=\{(\[\]|\{\}|null|''|\"\")\}"
|
|
322
|
-
```
|
|
323
|
-
|
|
324
|
-
**Data-flow status:**
|
|
297
|
+
**Data-flow status vocabulary:**
|
|
325
298
|
|
|
326
|
-
| Data
|
|
327
|
-
|
|
|
299
|
+
| Data source | Flows | Status |
|
|
300
|
+
| ----------- | ----- | ------ |
|
|
328
301
|
| DB query found | Yes | ✓ FLOWING |
|
|
329
302
|
| Fetch exists, static fallback only | No | ⚠️ STATIC |
|
|
330
303
|
| No data source found | N/A | ✗ DISCONNECTED |
|
|
@@ -359,41 +332,15 @@ For each link:
|
|
|
359
332
|
|
|
360
333
|
**Fallback patterns** (if must_haves.key_links not defined in PLAN):
|
|
361
334
|
|
|
362
|
-
###
|
|
335
|
+
### Wiring patterns
|
|
363
336
|
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
grep -A 5 "fetch\|axios" "$component" | grep -E "await|\.then|setData|setState" 2>/dev/null
|
|
367
|
-
```
|
|
368
|
-
|
|
369
|
-
Status: WIRED (call + response handling) | PARTIAL (call, no response use) | NOT_WIRED (no call)
|
|
370
|
-
|
|
371
|
-
### Pattern: API → Database
|
|
372
|
-
|
|
373
|
-
```bash
|
|
374
|
-
grep -E "prisma\.$model|db\.$model|$model\.(find|create|update|delete)" "$route" 2>/dev/null
|
|
375
|
-
grep -E "return.*json.*\w+|res\.json\(\w+" "$route" 2>/dev/null
|
|
376
|
-
```
|
|
377
|
-
|
|
378
|
-
Status: WIRED (query + result returned) | PARTIAL (query, static return) | NOT_WIRED (no query)
|
|
379
|
-
|
|
380
|
-
### Pattern: Form → Handler
|
|
381
|
-
|
|
382
|
-
```bash
|
|
383
|
-
grep -E "onSubmit=\{|handleSubmit" "$component" 2>/dev/null
|
|
384
|
-
grep -A 10 "onSubmit.*=" "$component" | grep -E "fetch|axios|mutate|dispatch" 2>/dev/null
|
|
385
|
-
```
|
|
386
|
-
|
|
387
|
-
Status: WIRED (handler + API call) | STUB (only logs/preventDefault) | NOT_WIRED (no handler)
|
|
388
|
-
|
|
389
|
-
### Pattern: State → Render
|
|
390
|
-
|
|
391
|
-
```bash
|
|
392
|
-
grep -E "useState.*$state_var|\[$state_var," "$component" 2>/dev/null
|
|
393
|
-
grep -E "\{.*$state_var.*\}|\{$state_var\." "$component" 2>/dev/null
|
|
394
|
-
```
|
|
337
|
+
Verify each link below; full per-pattern procedures and shell recipes:
|
|
338
|
+
@gsd-core/references/verifier-wiring-patterns.md
|
|
395
339
|
|
|
396
|
-
|
|
340
|
+
- **Component → API** — the component actually calls the endpoint it claims.
|
|
341
|
+
- **API → Database** — the endpoint issues a real query, not a static return.
|
|
342
|
+
- **Form → Handler** — submission reaches a handler that persists.
|
|
343
|
+
- **State → Render** — state changes actually reach the rendered output.
|
|
397
344
|
|
|
398
345
|
## Step 6: Check Requirements Coverage
|
|
399
346
|
|
|
@@ -610,6 +557,7 @@ Classify status using this decision tree IN ORDER (most restrictive first):
|
|
|
610
557
|
|
|
611
558
|
- `verified_truths` counts ✓ VERIFIED truths plus PASSED (override) truths (Step 3b). For a behavior-dependent truth, VERIFIED means a behavioral test passed, not just that symbols are present.
|
|
612
559
|
- ⚠️ PRESENT_BEHAVIOR_UNVERIFIED truths are the *only* ones excluded from `verified_truths`; they are reported separately as `behavior_unverified`.
|
|
560
|
+
- `✓ VERIFIED (coincidental-reliance)` counts as VERIFIED — the advisory changes no score and no status.
|
|
613
561
|
|
|
614
562
|
```text
|
|
615
563
|
score: verified_truths / total_truths # e.g. 6/7
|
|
@@ -694,7 +642,7 @@ Deferred items are informational only — they do not require closure plans.
|
|
|
694
642
|
|
|
695
643
|
**VERIFICATION.md output structure under MVP mode:**
|
|
696
644
|
|
|
697
|
-
1. Top-level "User Flow Coverage" table: each step of the user story → expected → evidence in codebase → status. (Format defined in `references/verify-mvp-mode.md`.)
|
|
645
|
+
1. Top-level "User Flow Coverage" table: each step of the user story → expected → evidence in codebase → status. (Format defined in `gsd-core/references/verify-mvp-mode.md`.)
|
|
698
646
|
2. Standard technical-check sections (API verification, error handling, etc.) follow below — only if the user flow coverage is complete.
|
|
699
647
|
|
|
700
648
|
**User Story format guard:** Apply via the centralized verb instead of inlining the regex:
|
|
@@ -757,6 +705,10 @@ behavior_unverified_items: # Only if behavior_unverified > 0 — emitted regardl
|
|
|
757
705
|
test: "What to trigger"
|
|
758
706
|
expected: "What state must hold afterward"
|
|
759
707
|
why_human: "Why presence checks can't see it"
|
|
708
|
+
coincidental_reliance_items: # Only if a ✓ VERIFIED truth holds incidentally — emitted regardless of overall status (survives gaps_found)
|
|
709
|
+
- truth: "Observable truth that holds incidentally"
|
|
710
|
+
reason: undeclared-precondition | incidental-ordering | fixture-only
|
|
711
|
+
harden: "Precondition/ordering to declare or enforce"
|
|
760
712
|
human_verification: # Only if status: human_needed
|
|
761
713
|
- test: "What to do"
|
|
762
714
|
expected: "What should happen"
|
|
@@ -779,6 +731,7 @@ human_verification: # Only if status: human_needed
|
|
|
779
731
|
| 1 | {truth} | ✓ VERIFIED | {evidence} |
|
|
780
732
|
| 2 | {truth} | ✗ FAILED | {what's wrong} |
|
|
781
733
|
| 3 | {truth} | ⚠️ PRESENT_BEHAVIOR_UNVERIFIED | {present + wired; no test exercises the transition/invariant — see Human Verification} |
|
|
734
|
+
| 4 | {truth} | ✓ VERIFIED (coincidental-reliance) | {holds, but incidentally — see coincidental_reliance_items} |
|
|
782
735
|
|
|
783
736
|
**Score:** {N}/{M} truths verified ({P} present, behavior-unverified)
|
|
784
737
|
|