@opengsd/gsd-core 1.10.0 → 1.12.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 +1 -1
- package/agents/gsd-code-fixer.md +1 -1
- package/agents/gsd-debug-session-manager.md +12 -1
- package/agents/gsd-debugger.md +1 -1
- package/agents/gsd-doc-synthesizer.md +2 -4
- package/agents/gsd-dom-verifier.md +169 -0
- package/agents/gsd-eval-auditor.md +1 -1
- package/agents/gsd-executor.md +22 -14
- package/agents/gsd-framework-selector.md +1 -3
- package/agents/gsd-intel-updater.md +1 -1
- package/agents/gsd-mempalace-curator.md +5 -3
- package/agents/gsd-pattern-mapper.md +11 -0
- package/agents/gsd-phase-researcher.md +23 -2
- package/agents/gsd-plan-checker.md +50 -53
- package/agents/gsd-planner.md +50 -50
- package/agents/gsd-project-researcher.md +1 -1
- package/agents/gsd-research-synthesizer.md +2 -2
- package/agents/gsd-roadmapper.md +15 -11
- package/agents/gsd-ui-checker.md +63 -4
- package/agents/gsd-ui-researcher.md +41 -3
- package/agents/gsd-user-profiler.md +3 -0
- package/agents/gsd-verifier.md +13 -4
- package/bin/install.js +1448 -1103
- package/commands/gsd/code-review.md +1 -1
- package/commands/gsd/discuss-phase.md +1 -1
- package/commands/gsd/execute-phase.md +1 -1
- package/commands/gsd/import.md +1 -1
- package/commands/gsd/map-codebase.md +1 -1
- package/commands/gsd/mempalace-capture.md +1 -1
- package/commands/gsd/mempalace-recall.md +1 -1
- package/commands/gsd/new-milestone.md +1 -1
- package/commands/gsd/quick.md +9 -5
- package/commands/gsd/review-backlog.md +2 -1
- package/commands/gsd/verify-work.md +1 -1
- package/gsd-core/bin/gsd-tools.cjs +1035 -138
- package/gsd-core/bin/lib/active-workstream-store.cjs +146 -22
- package/gsd-core/bin/lib/adr-parser.cjs +13 -7
- package/gsd-core/bin/lib/agent-install-check.cjs +392 -32
- package/gsd-core/bin/lib/api-coverage.cjs +33 -14
- package/gsd-core/bin/lib/artifacts.cjs +5 -0
- package/gsd-core/bin/lib/assumption-delta.cjs +32 -15
- package/gsd-core/bin/lib/audit-command-router.cjs +9 -2
- package/gsd-core/bin/lib/audit.cjs +1026 -268
- package/gsd-core/bin/lib/broken-windows.cjs +306 -28
- 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-lock.cjs +10 -4
- package/gsd-core/bin/lib/capability-registry.cjs +845 -130
- package/gsd-core/bin/lib/capability-source.cjs +92 -0
- package/gsd-core/bin/lib/capability-state.cjs +18 -3
- package/gsd-core/bin/lib/capability-trust.cjs +444 -25
- package/gsd-core/bin/lib/capability-validator.cjs +700 -40
- package/gsd-core/bin/lib/capability-writer.cjs +3 -2
- package/gsd-core/bin/lib/check-command-router.cjs +216 -42
- package/gsd-core/bin/lib/claude-orchestration.cjs +56 -3
- package/gsd-core/bin/lib/cli-exit.cjs +496 -10
- package/gsd-core/bin/lib/code-review-depth.cjs +288 -0
- package/gsd-core/bin/lib/codex-agent-toml.cjs +735 -0
- package/gsd-core/bin/lib/command-aliases.cjs +22 -0
- package/gsd-core/bin/lib/command-arg-projection.cjs +144 -14
- package/gsd-core/bin/lib/command-roster.cjs +44 -1
- package/gsd-core/bin/lib/command-routing-hub.cjs +31 -2
- package/gsd-core/bin/lib/commands.cjs +1172 -108
- package/gsd-core/bin/lib/commonjs-marker.cjs +12 -6
- package/gsd-core/bin/lib/complexity-trigger.cjs +1192 -0
- package/gsd-core/bin/lib/config-loader.cjs +187 -23
- package/gsd-core/bin/lib/config.cjs +102 -3
- package/gsd-core/bin/lib/configuration.cjs +129 -37
- package/gsd-core/bin/lib/core-utils.cjs +208 -33
- package/gsd-core/bin/lib/decisions.cjs +23 -0
- package/gsd-core/bin/lib/edge-probe.cjs +9 -1
- package/gsd-core/bin/lib/estimate-cli.cjs +55 -11
- package/gsd-core/bin/lib/exit-code-registry.cjs +98 -0
- package/gsd-core/bin/lib/fallow-runner.cjs +20 -44
- package/gsd-core/bin/lib/frontmatter.cjs +899 -229
- package/gsd-core/bin/lib/gap-checker.cjs +95 -10
- package/gsd-core/bin/lib/git-base-branch.cjs +276 -39
- package/gsd-core/bin/lib/gsd2-import.cjs +10 -1
- 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 +149 -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 +268 -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 +187 -0
- package/gsd-core/bin/lib/health-diagnostic-types.cjs +68 -0
- package/gsd-core/bin/lib/health-diagnostic.cjs +451 -0
- package/gsd-core/bin/lib/host-integration.cjs +39 -6
- package/gsd-core/bin/lib/host-runtime-detection.cjs +134 -0
- package/gsd-core/bin/lib/init-command-router.cjs +118 -21
- package/gsd-core/bin/lib/init.cjs +439 -168
- package/gsd-core/bin/lib/install-effort-resolver.cjs +73 -30
- package/gsd-core/bin/lib/install-engine.cjs +811 -259
- package/gsd-core/bin/lib/install-fs-adapter.cjs +262 -0
- package/gsd-core/bin/lib/install-model-override-resolver.cjs +235 -0
- package/gsd-core/bin/lib/install-profiles.cjs +212 -61
- 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-report.cjs +3 -0
- package/gsd-core/bin/lib/installer-migrations/010-antigravity-retire-confighome-artifacts.cjs +169 -0
- package/gsd-core/bin/lib/installer-migrations.cjs +148 -38
- package/gsd-core/bin/lib/intel.cjs +101 -26
- package/gsd-core/bin/lib/io.cjs +170 -15
- package/gsd-core/bin/lib/learnings.cjs +85 -14
- package/gsd-core/bin/lib/legacy-cleanup.cjs +8 -2
- package/gsd-core/bin/lib/markdown-sectionizer.cjs +2 -1
- package/gsd-core/bin/lib/markdown-table.cjs +183 -22
- package/gsd-core/bin/lib/milestone-lock.cjs +248 -0
- package/gsd-core/bin/lib/milestone.cjs +842 -73
- package/gsd-core/bin/lib/model-catalog.cjs +232 -16
- package/gsd-core/bin/lib/model-resolver.cjs +193 -68
- package/gsd-core/bin/lib/normalize-test-command.cjs +1 -1
- package/gsd-core/bin/lib/onboard-projection.cjs +5 -1
- package/gsd-core/bin/lib/pattern.cjs +122 -0
- package/gsd-core/bin/lib/phase-estimation.cjs +18 -9
- package/gsd-core/bin/lib/phase-id.cjs +514 -40
- package/gsd-core/bin/lib/phase-lifecycle.cjs +52 -19
- package/gsd-core/bin/lib/phase-locator.cjs +262 -34
- package/gsd-core/bin/lib/phase.cjs +1038 -214
- package/gsd-core/bin/lib/plan-dependency-graph.cjs +72 -1
- package/gsd-core/bin/lib/plan-document.cjs +263 -0
- package/gsd-core/bin/lib/plan-drift-guard.cjs +120 -0
- package/gsd-core/bin/lib/plan-scan.cjs +98 -3
- package/gsd-core/bin/lib/planning-command-router.cjs +61 -0
- package/gsd-core/bin/lib/planning-inspect.cjs +1168 -0
- package/gsd-core/bin/lib/planning-scope.cjs +31 -0
- package/gsd-core/bin/lib/planning-snapshot.cjs +894 -0
- package/gsd-core/bin/lib/planning-workspace.cjs +112 -6
- package/gsd-core/bin/lib/probe-core.cjs +5 -2
- package/gsd-core/bin/lib/profile-output.cjs +1 -1
- package/gsd-core/bin/lib/profile-pipeline-command-router.cjs +50 -7
- package/gsd-core/bin/lib/profile-pipeline.cjs +6 -3
- package/gsd-core/bin/lib/real-home-guard.cjs +419 -0
- package/gsd-core/bin/lib/refactor-trigger-command-router.cjs +766 -0
- package/gsd-core/bin/lib/retired-artifact-cleanup.cjs +11 -6
- package/gsd-core/bin/lib/review-lane-descriptor.cjs +22 -13
- package/gsd-core/bin/lib/review-lane-invocation.cjs +30 -0
- package/gsd-core/bin/lib/review-lane-runner.cjs +421 -66
- package/gsd-core/bin/lib/review-reviewer-selection.cjs +13 -18
- package/gsd-core/bin/lib/roadmap-command-router.cjs +59 -11
- package/gsd-core/bin/lib/roadmap-parser.cjs +1006 -184
- package/gsd-core/bin/lib/roadmap-upgrade.cjs +37 -10
- package/gsd-core/bin/lib/roadmap.cjs +442 -96
- package/gsd-core/bin/lib/runtime-artifact-conversion.cjs +702 -52
- package/gsd-core/bin/lib/runtime-artifact-install-plan.cjs +14 -2
- package/gsd-core/bin/lib/runtime-artifact-layout.cjs +459 -55
- package/gsd-core/bin/lib/runtime-config-adapter-registry.cjs +3 -2
- package/gsd-core/bin/lib/runtime-homes.cjs +69 -3
- package/gsd-core/bin/lib/runtime-hooks-surface.cjs +402 -58
- package/gsd-core/bin/lib/runtime-identity.cjs +234 -0
- package/gsd-core/bin/lib/runtime-name-policy.cjs +3 -1
- package/gsd-core/bin/lib/runtime-slash.cjs +96 -8
- package/gsd-core/bin/lib/security.cjs +104 -5
- package/gsd-core/bin/lib/shell-command-projection.cjs +342 -7
- package/gsd-core/bin/lib/smart-entry.cjs +133 -23
- package/gsd-core/bin/lib/spec-section.cjs +12 -7
- package/gsd-core/bin/lib/state-command-router.cjs +52 -19
- package/gsd-core/bin/lib/state-contract.cjs +359 -0
- package/gsd-core/bin/lib/state-document.cjs +338 -8
- package/gsd-core/bin/lib/state-md-schema.cjs +221 -0
- package/gsd-core/bin/lib/state-transition.cjs +846 -176
- package/gsd-core/bin/lib/state.cjs +2589 -369
- package/gsd-core/bin/lib/surface.cjs +33 -11
- package/gsd-core/bin/lib/task-command-router.cjs +111 -1
- package/gsd-core/bin/lib/task-content-resolution.cjs +368 -0
- package/gsd-core/bin/lib/teams-status.cjs +4 -1
- 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 +67 -23
- package/gsd-core/bin/lib/uat.cjs +1761 -167
- package/gsd-core/bin/lib/ui-consideration-probe.cjs +9 -1
- package/gsd-core/bin/lib/ui-frontend-evidence.cjs +157 -0
- package/gsd-core/bin/lib/ui-safety-gate.cjs +51 -12
- package/gsd-core/bin/lib/unusable-input.cjs +37 -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-command-router.cjs +2 -2
- package/gsd-core/bin/lib/validate.cjs +20 -6
- package/gsd-core/bin/lib/vendor/README.md +75 -0
- package/gsd-core/bin/lib/vendor/js-yaml.cjs +3014 -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 +272 -9
- package/gsd-core/bin/lib/verify-command-grounding.cjs +846 -0
- package/gsd-core/bin/lib/verify.cjs +453 -918
- package/gsd-core/bin/lib/workstream-inventory-builder.cjs +53 -32
- package/gsd-core/bin/lib/workstream-inventory.cjs +63 -10
- package/gsd-core/bin/lib/workstream-name-policy.cjs +25 -4
- package/gsd-core/bin/lib/workstream.cjs +2 -2
- package/gsd-core/bin/lib/worktree-base-ref.cjs +66 -12
- package/gsd-core/bin/lib/worktree-safety.cjs +341 -18
- package/gsd-core/bin/shared/config-defaults.manifest.json +8 -1
- package/gsd-core/bin/shared/config-schema.manifest.json +12 -1
- package/gsd-core/bin/shared/exit-codes.json +8 -0
- package/gsd-core/bin/shared/exit-codes.sh +20 -0
- package/gsd-core/bin/shared/model-catalog.json +8 -1
- package/gsd-core/references/agent-contracts.md +44 -26
- package/gsd-core/references/api-coverage.md +24 -2
- package/gsd-core/references/autonomous-smart-discuss.md +3 -3
- package/gsd-core/references/checkpoints.md +39 -21
- package/gsd-core/references/context-budget.md +1 -1
- package/gsd-core/references/decimal-phase-calculation.md +5 -5
- package/gsd-core/references/dispatch-isolation-gate.md +138 -0
- package/gsd-core/references/doc-conflict-engine.md +1 -1
- package/gsd-core/references/edge-probe.md +8 -0
- package/gsd-core/references/execute-mvp-tdd.md +4 -6
- package/gsd-core/references/execute-phase-between-wave-reset.md +15 -14
- 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 +17 -11
- package/gsd-core/references/failing-direction.md +78 -0
- package/gsd-core/references/gate-prompts.md +1 -1
- package/gsd-core/references/git-integration.md +5 -5
- package/gsd-core/references/git-planning-commit.md +5 -4
- package/gsd-core/references/gsd-run-resolver.md +1 -1
- package/gsd-core/references/loop-hook-dispatch.md +61 -2
- package/gsd-core/references/model-profiles.md +12 -4
- package/gsd-core/references/mvp-concepts.md +9 -9
- package/gsd-core/references/nyquist-compliance.md +74 -0
- package/gsd-core/references/offer-next.md +3 -5
- package/gsd-core/references/phase-argument-parsing.md +3 -3
- package/gsd-core/references/planner-failing-direction.md +53 -0
- package/gsd-core/references/planner-guidance.md +3 -9
- package/gsd-core/references/planner-human-verify-mode.md +15 -1
- package/gsd-core/references/planner-preconditions.md +1 -1
- package/gsd-core/references/planner-reviews.md +1 -1
- package/gsd-core/references/planner-revision.md +1 -1
- package/gsd-core/references/planner-verify-command-grounding.md +17 -0
- package/gsd-core/references/planning-config.md +44 -13
- package/gsd-core/references/reviewer-instances.md +31 -0
- package/gsd-core/references/revision-loop.md +1 -1
- package/gsd-core/references/runtime-aware-dispatch.md +1 -1
- package/gsd-core/references/specless-probe-fallback.md +1 -1
- package/gsd-core/references/tdd.md +1 -3
- package/gsd-core/references/ui-brand.md +65 -21
- package/gsd-core/references/ui-consideration-probe.md +1 -1
- package/gsd-core/references/universal-anti-patterns.md +5 -5
- package/gsd-core/references/verifier-phase-gates.md +192 -0
- package/gsd-core/references/verify-command-path-resolvability.md +42 -0
- package/gsd-core/references/verify-mvp-mode.md +2 -2
- package/gsd-core/references/workstream-flag.md +33 -17
- package/gsd-core/templates/README.md +1 -1
- package/gsd-core/templates/SECURITY.md +3 -3
- package/gsd-core/templates/UI-SPEC.md +25 -3
- package/gsd-core/templates/VALIDATION.md +3 -3
- package/gsd-core/templates/discussion-log.md +1 -1
- package/gsd-core/templates/phase-prompt.md +5 -4
- package/gsd-core/templates/state.md +11 -4
- package/gsd-core/templates/verification-report.md +9 -1
- package/gsd-core/workflows/_runtime-launcher.snippet.sh +1 -1
- package/gsd-core/workflows/add-backlog.md +1 -1
- package/gsd-core/workflows/add-phase.md +3 -3
- package/gsd-core/workflows/add-tests.md +3 -8
- package/gsd-core/workflows/add-todo.md +1 -1
- package/gsd-core/workflows/ai-integration-phase.md +13 -20
- package/gsd-core/workflows/audit-fix.md +12 -3
- package/gsd-core/workflows/audit-milestone.md +9 -9
- package/gsd-core/workflows/audit-uat.md +17 -2
- package/gsd-core/workflows/autonomous/steps/converge-fail-fast.md +2 -2
- package/gsd-core/workflows/autonomous.md +11 -27
- package/gsd-core/workflows/check-todos.md +1 -1
- package/gsd-core/workflows/cleanup.md +64 -5
- package/gsd-core/workflows/code-review/steps/structural-pre-pass.md +14 -4
- package/gsd-core/workflows/code-review-fix.md +38 -11
- package/gsd-core/workflows/code-review.md +159 -52
- package/gsd-core/workflows/complete-milestone.md +151 -23
- package/gsd-core/workflows/debug.md +12 -8
- package/gsd-core/workflows/diagnose-issues.md +47 -15
- package/gsd-core/workflows/discuss-phase/modes/advisor.md +1 -1
- package/gsd-core/workflows/discuss-phase/modes/chain.md +5 -8
- package/gsd-core/workflows/discuss-phase/modes/default.md +1 -1
- package/gsd-core/workflows/discuss-phase/modes/text.md +1 -1
- package/gsd-core/workflows/discuss-phase-assumptions/steps/auto-advance-dispatch.md +1 -3
- package/gsd-core/workflows/discuss-phase-assumptions.md +4 -3
- package/gsd-core/workflows/discuss-phase.md +1 -1
- package/gsd-core/workflows/do.md +3 -6
- package/gsd-core/workflows/docs-update.md +5 -4
- package/gsd-core/workflows/edit-phase.md +27 -2
- package/gsd-core/workflows/eval-review.md +7 -14
- package/gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md +1 -1
- package/gsd-core/workflows/execute-phase/steps/executor-isolation-dispatch.md +142 -15
- package/gsd-core/workflows/execute-phase/steps/gap-closure-artifacts.md +1 -1
- package/gsd-core/workflows/execute-phase/steps/partial-wave.md +1 -1
- 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 +24 -4
- package/gsd-core/workflows/execute-phase/steps/post-merge-gate.md +2 -2
- package/gsd-core/workflows/execute-phase/steps/protected-branch.md +21 -0
- package/gsd-core/workflows/execute-phase/steps/regression-gate-run.md +2 -2
- package/gsd-core/workflows/execute-phase/steps/wave-post-gate-hooks.md +39 -0
- package/gsd-core/workflows/execute-phase.md +72 -100
- package/gsd-core/workflows/execute-plan.md +52 -15
- package/gsd-core/workflows/explore.md +131 -4
- package/gsd-core/workflows/extract-learnings.md +1 -1
- package/gsd-core/workflows/fast.md +10 -2
- package/gsd-core/workflows/forensics.md +1 -1
- package/gsd-core/workflows/graduation.md +5 -5
- package/gsd-core/workflows/health.md +76 -10
- package/gsd-core/workflows/import.md +18 -15
- package/gsd-core/workflows/inbox.md +4 -5
- package/gsd-core/workflows/ingest-docs.md +49 -16
- package/gsd-core/workflows/insert-phase.md +5 -5
- package/gsd-core/workflows/list-seeds.md +5 -3
- package/gsd-core/workflows/list-workspaces.md +1 -1
- package/gsd-core/workflows/manager.md +12 -23
- package/gsd-core/workflows/map-codebase.md +1 -1
- package/gsd-core/workflows/milestone-summary.md +1 -1
- package/gsd-core/workflows/mvp-phase.md +8 -5
- package/gsd-core/workflows/new-milestone.md +22 -29
- package/gsd-core/workflows/new-project/steps/auto-mode-config.md +1 -1
- package/gsd-core/workflows/new-project.md +26 -40
- package/gsd-core/workflows/new-workspace.md +1 -1
- package/gsd-core/workflows/next.md +14 -2
- package/gsd-core/workflows/pause-work.md +1 -1
- package/gsd-core/workflows/plan-phase/steps/adr-ingest-express-path.md +1 -1
- package/gsd-core/workflows/plan-phase/steps/chunked-planning-mode.md +1 -1
- package/gsd-core/workflows/plan-phase/steps/prd-express-path.md +2 -4
- package/gsd-core/workflows/plan-phase/steps/stall-detection-helpers.md +3 -3
- package/gsd-core/workflows/plan-phase.md +162 -59
- package/gsd-core/workflows/plan-review-convergence.md +96 -11
- package/gsd-core/workflows/plant-seed.md +2 -2
- package/gsd-core/workflows/pr-branch.md +187 -51
- package/gsd-core/workflows/profile-user.md +16 -14
- package/gsd-core/workflows/progress.md +61 -18
- package/gsd-core/workflows/quick/steps/discussion-phase.md +1 -3
- package/gsd-core/workflows/quick/steps/plan-checker-loop.md +5 -7
- package/gsd-core/workflows/quick/steps/quick-verification.md +28 -9
- package/gsd-core/workflows/quick/steps/research-phase.md +4 -6
- package/gsd-core/workflows/quick/steps/worktree-pre-dispatch-commit.md +3 -3
- package/gsd-core/workflows/quick.md +55 -44
- package/gsd-core/workflows/remove-phase.md +4 -4
- package/gsd-core/workflows/remove-workspace.md +2 -2
- package/gsd-core/workflows/resume-project.md +8 -12
- package/gsd-core/workflows/review.md +219 -20
- package/gsd-core/workflows/scan.md +1 -1
- package/gsd-core/workflows/secure-phase.md +3 -3
- package/gsd-core/workflows/session-report.md +2 -1
- package/gsd-core/workflows/settings-advanced.md +7 -9
- package/gsd-core/workflows/settings-integrations.md +64 -31
- package/gsd-core/workflows/settings.md +69 -7
- package/gsd-core/workflows/ship.md +116 -50
- package/gsd-core/workflows/sketch-wrap-up.md +11 -17
- package/gsd-core/workflows/sketch.md +12 -18
- package/gsd-core/workflows/smart-entry.md +3 -5
- package/gsd-core/workflows/spec-phase.md +53 -13
- package/gsd-core/workflows/spike-wrap-up.md +7 -11
- package/gsd-core/workflows/spike.md +20 -31
- package/gsd-core/workflows/stats.md +2 -2
- package/gsd-core/workflows/sync-skills.md +64 -9
- package/gsd-core/workflows/thread.md +11 -7
- package/gsd-core/workflows/transition.md +49 -14
- package/gsd-core/workflows/ui-phase.md +15 -21
- package/gsd-core/workflows/ui-review.md +8 -12
- package/gsd-core/workflows/ultraplan-phase.md +5 -13
- package/gsd-core/workflows/undo.md +8 -16
- package/gsd-core/workflows/update.md +7 -11
- package/gsd-core/workflows/validate-phase.md +3 -3
- package/gsd-core/workflows/verify-work/steps/automated-ui-verification.md +25 -1
- package/gsd-core/workflows/verify-work/steps/mvp-uat-framing.md +1 -1
- package/gsd-core/workflows/verify-work.md +66 -25
- package/hooks/dist/gsd-agent-isolation-guard.js +158 -30
- package/hooks/dist/gsd-check-update-worker.js +56 -13
- package/hooks/dist/gsd-check-update.js +19 -1
- package/hooks/dist/gsd-config-reload.js +18 -12
- package/hooks/dist/gsd-context-monitor.js +19 -10
- package/hooks/dist/gsd-cursor-post-tool.js +3 -1
- package/hooks/dist/gsd-cursor-pre-tool.js +2 -3
- package/hooks/dist/gsd-cursor-session-start.js +2 -1
- package/hooks/dist/gsd-cursor-stop.js +2 -1
- package/hooks/dist/gsd-cursor-subagent-start.js +83 -3
- package/hooks/dist/gsd-cursor-subagent-stop.js +6 -3
- package/hooks/dist/gsd-ensure-canonical-path.js +2 -1
- package/hooks/dist/gsd-graphify-update.sh +22 -18
- package/hooks/dist/gsd-node-runner.sh +76 -0
- package/hooks/dist/gsd-phase-boundary.sh +1 -0
- package/hooks/dist/gsd-prompt-guard.js +37 -27
- package/hooks/dist/gsd-read-guard.js +16 -7
- package/hooks/dist/gsd-read-injection-scanner.js +55 -32
- package/hooks/dist/gsd-session-state.sh +1 -0
- package/hooks/dist/gsd-statusline.js +231 -24
- package/hooks/dist/gsd-update-banner.js +22 -1
- package/hooks/dist/gsd-validate-commit.sh +80 -6
- package/hooks/dist/gsd-windsurf-pre-command.js +16 -11
- package/hooks/dist/gsd-windsurf-pre-write.js +22 -13
- package/hooks/dist/gsd-workflow-guard.js +162 -46
- package/hooks/dist/gsd-worktree-path-guard.js +36 -21
- package/hooks/dist/gsd-write-guard.js +35 -25
- package/hooks/dist/lib/cli-exit.js +560 -0
- package/hooks/dist/lib/exit-code-registry.js +98 -0
- package/hooks/dist/lib/git-cmd.js +92 -59
- package/hooks/dist/lib/git-probe.js +84 -0
- package/hooks/dist/lib/hook-exit.js +81 -0
- 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 +9 -0
- package/hooks/dist/managed-hooks-registry.cjs +3 -0
- package/hooks/gsd-agent-isolation-guard.js +158 -30
- package/hooks/gsd-check-update-worker.js +56 -13
- package/hooks/gsd-check-update.js +19 -1
- package/hooks/gsd-config-reload.js +18 -12
- package/hooks/gsd-context-monitor.js +19 -10
- package/hooks/gsd-cursor-post-tool.js +3 -1
- package/hooks/gsd-cursor-pre-tool.js +2 -3
- package/hooks/gsd-cursor-session-start.js +2 -1
- package/hooks/gsd-cursor-stop.js +2 -1
- package/hooks/gsd-cursor-subagent-start.js +83 -3
- package/hooks/gsd-cursor-subagent-stop.js +6 -3
- package/hooks/gsd-ensure-canonical-path.js +2 -1
- package/hooks/gsd-graphify-update.sh +22 -18
- package/hooks/gsd-node-runner.sh +76 -0
- package/hooks/gsd-phase-boundary.sh +1 -0
- package/hooks/gsd-prompt-guard.js +37 -27
- package/hooks/gsd-read-guard.js +16 -7
- package/hooks/gsd-read-injection-scanner.js +55 -32
- package/hooks/gsd-session-state.sh +1 -0
- package/hooks/gsd-statusline.js +231 -24
- package/hooks/gsd-update-banner.js +22 -1
- package/hooks/gsd-validate-commit.sh +80 -6
- package/hooks/gsd-windsurf-pre-command.js +16 -11
- package/hooks/gsd-windsurf-pre-write.js +22 -13
- package/hooks/gsd-workflow-guard.js +162 -46
- package/hooks/gsd-worktree-path-guard.js +36 -21
- package/hooks/gsd-write-guard.js +35 -25
- package/hooks/lib/cli-exit.js +560 -0
- package/hooks/lib/exit-code-registry.js +98 -0
- package/hooks/lib/git-cmd.js +92 -59
- package/hooks/lib/git-probe.js +84 -0
- package/hooks/lib/hook-exit.js +81 -0
- package/hooks/lib/injection-patterns.js +45 -0
- package/hooks/lib/isolation-deny-reason.js +39 -0
- package/hooks/lib/isolation-sentinel.js +9 -0
- package/hooks/managed-hooks-registry.cjs +3 -0
- package/package.json +28 -11
- package/pi/gsd.cjs +19 -5
- package/scripts/base64-scan.sh +74 -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 +5 -0
- package/scripts/changeset/lint.cjs +60 -5
- package/scripts/check-alias-drift.cjs +7 -43
- package/scripts/check-contract-drift.cjs +297 -0
- package/scripts/check-glossary-refs.cjs +77 -15
- package/scripts/check-mutation-score-ratchet.cjs +156 -0
- package/scripts/ci-check-job-near-cap.cjs +49 -0
- package/scripts/ci-pr-mergeability.cjs +262 -0
- package/scripts/ci-test-scope.cjs +64 -14
- package/scripts/ci-timeout-report.cjs +230 -0
- package/scripts/command-contract-helpers.cjs +903 -1
- package/scripts/docs-guard-registry.cjs +396 -0
- package/scripts/gen-adr-index.cjs +728 -38
- package/scripts/gen-capability-registry.cjs +11 -21
- package/scripts/gen-context-index.cjs +2 -11
- package/scripts/gen-exit-code-docs.cjs +318 -0
- package/scripts/gen-exit-code-registry.cjs +891 -0
- package/scripts/gen-features.cjs +836 -0
- package/scripts/gen-health-docs.cjs +390 -0
- package/scripts/gen-hooks-cli-exit.cjs +239 -0
- package/scripts/gen-install-tree-fixtures.cjs +2 -2
- package/scripts/gen-inventory-manifest.cjs +50 -4
- package/scripts/gen-loop-host-contract.cjs +138 -25
- package/scripts/gen-registry.cjs +3 -14
- package/scripts/gen-scripts-cli-exit.cjs +185 -0
- package/scripts/gen-state-md-docs.cjs +727 -0
- package/scripts/{test-failure-reasons.cjs → gsd-test-gate-reasons.cjs} +6 -0
- package/scripts/lib/alias-drift-families.cjs +46 -0
- package/scripts/lib/ci-job-timing.cjs +72 -0
- package/scripts/lib/cli-exit.cjs +546 -44
- package/scripts/lib/drift-scan.cjs +308 -0
- package/scripts/lib/exit-code-registry.cjs +98 -0
- package/scripts/lib/ndjson-reporter.cjs +119 -0
- package/scripts/lint-allow-test-rule-refs.allowlist.json +1 -26
- 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-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-guard-registration.cjs +495 -0
- package/scripts/lint-docs-guard-registration.exempt-baseline.cjs +193 -0
- package/scripts/lint-eslint-glob-coverage.allowlist.json +38 -0
- package/scripts/lint-eslint-glob-coverage.cjs +340 -0
- package/scripts/{lint-fix-has-regression-test.cjs → lint-fix-has-regression-tests.cjs} +12 -6
- package/scripts/lint-frontmatter-scalar-broad-grep.cjs +237 -0
- package/scripts/lint-health-diagnostic-rule-table.cjs +461 -0
- package/scripts/lint-hooks-runtime-build-seam.cjs +262 -0
- package/scripts/lint-milestone-window-drift.cjs +468 -0
- package/scripts/lint-mutation-test-derivation-drift.cjs +86 -0
- package/scripts/lint-phase-enumeration-drift.cjs +492 -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 +471 -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 +488 -0
- package/scripts/lint-seam-enforcement.cjs +182 -0
- package/scripts/lint-slug-derivation-drift.cjs +921 -0
- package/scripts/lint-source-test-name-collision.cjs +241 -0
- package/scripts/lint-state-field-drift.cjs +805 -0
- package/scripts/lint-state-write-path-drift.cjs +950 -0
- package/scripts/lint-test-file-count.allowlist.json +137 -8
- package/scripts/lint-test-file-count.cjs +25 -3
- package/scripts/lint-unreachable-guard-drift.cjs +830 -0
- package/scripts/lint-vendored-deps.cjs +297 -0
- package/scripts/mutation-matrix.cjs +599 -50
- package/scripts/pr-changed-files.cjs +63 -0
- package/scripts/pr-template-policy.cjs +14 -4
- package/scripts/prompt-injection-scan.sh +100 -14
- package/scripts/require-issue-link-policy.cjs +192 -0
- package/scripts/secret-scan.sh +75 -13
- package/scripts/select-docs-guards.cjs +56 -0
- package/scripts/sync-runtime-launcher.cjs +24 -7
- package/skills/gsd-autonomous/SKILL.md +0 -1
- package/skills/gsd-code-review/SKILL.md +1 -1
- package/skills/gsd-discuss-phase/SKILL.md +1 -1
- package/skills/gsd-execute-phase/SKILL.md +1 -2
- package/skills/gsd-import/SKILL.md +1 -1
- package/skills/gsd-map-codebase/SKILL.md +1 -1
- package/skills/gsd-mempalace-capture/SKILL.md +1 -1
- package/skills/gsd-mempalace-recall/SKILL.md +1 -1
- package/skills/gsd-new-milestone/SKILL.md +1 -1
- package/skills/gsd-next/SKILL.md +0 -1
- package/skills/gsd-plan-phase/SKILL.md +0 -1
- package/skills/gsd-progress/SKILL.md +0 -1
- package/skills/gsd-quick/SKILL.md +9 -5
- 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/bin/lib/ui-safety-gate.cjs +0 -107
- 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 -574
- package/scripts/affected-tests-lib.cjs +0 -554
- package/scripts/lint-allow-test-rule-refs.cjs +0 -162
- package/scripts/lint-emitted-drift-ack.cjs +0 -344
- package/scripts/run-affected-tests.cjs +0 -7
- package/scripts/run-tests.cjs +0 -1051
|
@@ -8,7 +8,7 @@ Rules that apply to ALL workflows and agents. Individual workflows may have addi
|
|
|
8
8
|
|
|
9
9
|
1. **Never** read agent definition files (`agents/*.md`) -- `subagent_type` auto-loads them. Reading agent definitions into the orchestrator wastes context for content automatically injected into subagent sessions.
|
|
10
10
|
2. **Never** inline large files into subagent prompts -- tell agents to read files from disk instead. Agents have their own context windows.
|
|
11
|
-
3. **Read depth scales with context window** -- check `context_window` in `.planning/config.json`. At < 500000: read only frontmatter, status fields, or summaries. At >= 500000 (1M model): full body reads permitted when content is needed for inline decisions. See `references/context-budget.md` for the complete table.
|
|
11
|
+
3. **Read depth scales with context window** -- check `context_window` in `.planning/config.json`. At < 500000: read only frontmatter, status fields, or summaries. At >= 500000 (1M model): full body reads permitted when content is needed for inline decisions. See `gsd-core/references/context-budget.md` for the complete table.
|
|
12
12
|
4. **Delegate** heavy work to subagents -- the orchestrator routes, it does not build, analyze, research, investigate, or verify.
|
|
13
13
|
5. **Proactive pause warning**: If you have already consumed significant context (large file reads, multiple subagent results), warn the user: "Context budget is getting heavy. Consider checkpointing progress."
|
|
14
14
|
|
|
@@ -26,7 +26,7 @@ Rules that apply to ALL workflows and agents. Individual workflows may have addi
|
|
|
26
26
|
|
|
27
27
|
## Questioning Anti-Patterns
|
|
28
28
|
|
|
29
|
-
Reference: `references/questioning.md` for the full anti-pattern list.
|
|
29
|
+
Reference: `gsd-core/references/questioning.md` for the full anti-pattern list.
|
|
30
30
|
|
|
31
31
|
12. **Do not** walk through checklists -- checklist walking (asking items one by one from a list) is the #1 anti-pattern. Instead, use progressive depth: start broad, dig where interesting.
|
|
32
32
|
13. **Do not** use corporate speak -- avoid jargon like "stakeholder alignment", "synergize", "deliverables". Use plain language.
|
|
@@ -34,7 +34,7 @@ Reference: `references/questioning.md` for the full anti-pattern list.
|
|
|
34
34
|
|
|
35
35
|
## State Management Anti-Patterns
|
|
36
36
|
|
|
37
|
-
15. **No direct Write/Edit to STATE.md or ROADMAP.md for mutations.** Always use `
|
|
37
|
+
15. **No direct Write/Edit to STATE.md or ROADMAP.md for mutations.** Always use `gsd_run query` for registered state/roadmap handlers (e.g. `state.update`, `state.advance-plan`, `roadmap.update-plan-progress`), or legacy `node …/gsd-tools.cjs` for CLI-only commands. Direct Write tool usage bypasses safe update logic and is unsafe in multi-session environments. Exception: first-time creation of STATE.md from template is allowed.
|
|
38
38
|
|
|
39
39
|
## Behavioral Rules
|
|
40
40
|
|
|
@@ -53,11 +53,11 @@ Reference: `references/questioning.md` for the full anti-pattern list.
|
|
|
53
53
|
## GSD-Specific Rules
|
|
54
54
|
|
|
55
55
|
24. **Do not** check for `mode === 'auto'` or `mode === 'autonomous'` -- GSD uses `yolo` config flag. Check `yolo: true` for autonomous mode, absence or `false` for interactive mode.
|
|
56
|
-
25. **Prefer `
|
|
56
|
+
25. **Prefer `gsd_run query`** for orchestration when a handler exists; when shelling out to the legacy CLI, go through the same `gsd_run` launcher rather than naming the shim file. The shim is not on PATH under any name ending in `.cjs`, and an agent that meets the bare filename falls back to searching the filesystem for it — on Git Bash for Windows that is a full-drive `find.exe` traversal (#3809). `gsd_run` resolves the CommonJS shim itself across every runtime home.
|
|
57
57
|
26. **Plan files MUST follow `{padded_phase}-{NN}-PLAN.md` pattern** (e.g., `01-01-PLAN.md`). Never use `PLAN-01.md`, `plan-01.md`, or any other variation -- gsd-tools detection depends on this exact pattern.
|
|
58
58
|
27. **Do not start executing the next plan before writing the SUMMARY.md for the current plan** -- downstream plans may reference it via `@` includes.
|
|
59
59
|
|
|
60
60
|
## iOS / Apple Platform Rules
|
|
61
61
|
|
|
62
|
-
28. **NEVER use `Package.swift` + `.executableTarget` (or `.target`) as the primary build system for iOS apps.** SPM executable targets produce macOS CLI binaries, not iOS `.app` bundles. They cannot be installed on iOS devices or submitted to the App Store. Use XcodeGen (`project.yml` + `xcodegen generate`) to create a proper `.xcodeproj`. See `references/ios-scaffold.md` for the full pattern.
|
|
62
|
+
28. **NEVER use `Package.swift` + `.executableTarget` (or `.target`) as the primary build system for iOS apps.** SPM executable targets produce macOS CLI binaries, not iOS `.app` bundles. They cannot be installed on iOS devices or submitted to the App Store. Use XcodeGen (`project.yml` + `xcodegen generate`) to create a proper `.xcodeproj`. See `gsd-core/references/ios-scaffold.md` for the full pattern.
|
|
63
63
|
29. **Verify SwiftUI API availability before use.** Many SwiftUI APIs require a specific minimum iOS version (e.g., `NavigationSplitView` is iOS 16+, `List(selection:)` with multi-select and `@Observable` require iOS 17). If a plan uses an API that exceeds the declared `IPHONEOS_DEPLOYMENT_TARGET`, raise the deployment target or add `#available` guards.
|
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
# Verifier Phase Gates
|
|
2
|
+
|
|
3
|
+
> Loaded eagerly by `agents/gsd-verifier.md` (`<required_reading>`). Carries the three
|
|
4
|
+
> verification-time gates that lived in the retired `verify-phase` workflow
|
|
5
|
+
> (#1892 / epic #1891 F7): decision-coverage validation (#2492), the test-quality audit,
|
|
6
|
+
> and infrastructure-phase human-verification scoping (#2504) — plus the backstop-abstention
|
|
7
|
+
> reporting contract (#3206). Run each gate at its named
|
|
8
|
+
> agent step; `gsd_run` is the launcher shim defined in the agent's own Step 1 block.
|
|
9
|
+
|
|
10
|
+
## verify_decisions — Decision Coverage Gate (run after Step 6, requirements coverage)
|
|
11
|
+
|
|
12
|
+
<step name="verify_decisions">
|
|
13
|
+
**Decision coverage validation gate (issue #2492).**
|
|
14
|
+
|
|
15
|
+
After requirements coverage, also check that each trackable CONTEXT.md
|
|
16
|
+
`<decisions>` entry shows up somewhere in the shipped artifacts (plans,
|
|
17
|
+
SUMMARY.md, files modified by the phase, or recent commit subjects on the
|
|
18
|
+
phase branch).
|
|
19
|
+
|
|
20
|
+
This gate is **non-blocking / warning only** by deliberate asymmetry with
|
|
21
|
+
the plan-phase translation gate. The plan-phase gate already blocked at
|
|
22
|
+
translation time, so by the time verification runs every decision has
|
|
23
|
+
either been translated or explicitly deferred. This gate's job is to
|
|
24
|
+
surface decisions that *were* translated but vanished during execution —
|
|
25
|
+
that's a soft signal because "honors a decision" is a fuzzy substring
|
|
26
|
+
heuristic, and we don't want a paraphrase miss to fail an otherwise good
|
|
27
|
+
phase.
|
|
28
|
+
|
|
29
|
+
**Skip if** `workflow.context_coverage_gate` is explicitly set to `false`
|
|
30
|
+
(absent key = enabled). Also skip cleanly when CONTEXT.md is missing or has
|
|
31
|
+
no `<decisions>` block.
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
GATE_CFG=$(gsd_run query config-get workflow.context_coverage_gate 2>/dev/null || echo "true")
|
|
35
|
+
if [ "$GATE_CFG" != "false" ]; then
|
|
36
|
+
CONTEXT_PATH=$(ls "${PHASE_DIR}"/*-CONTEXT.md 2>/dev/null | head -1) # #2962: not a for-glob (zsh aborts)
|
|
37
|
+
DECISION_RESULT=$(gsd_run query check.decision-coverage-verify "${PHASE_DIR}" "${CONTEXT_PATH}")
|
|
38
|
+
fi
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
The handler returns JSON `{ skipped, blocking: false, total, honored,
|
|
42
|
+
not_honored: [...], message }`.
|
|
43
|
+
|
|
44
|
+
**Reporting:** Append the handler's `message` (a `### Decision Coverage`
|
|
45
|
+
section) to VERIFICATION.md regardless of outcome — even when all
|
|
46
|
+
decisions are honored, recording the count helps reviewers spot drift over
|
|
47
|
+
time. Set `decision_coverage` in the verification result to
|
|
48
|
+
`{honored, total, not_honored: [...]}` so downstream tooling can read it.
|
|
49
|
+
|
|
50
|
+
**Status impact:** none. The decision gate does NOT influence the
|
|
51
|
+
`gaps_found` / `human_needed` / `passed` decision tree in Step 9. Its
|
|
52
|
+
findings are warnings the user reviews and may act on by re-opening the
|
|
53
|
+
phase or by acknowledging the decision was abandoned intentionally.
|
|
54
|
+
</step>
|
|
55
|
+
|
|
56
|
+
## audit_test_quality (run after Step 7b, alongside anti-patterns)
|
|
57
|
+
|
|
58
|
+
<step name="audit_test_quality">
|
|
59
|
+
**Verify that tests PROVE what they claim to prove.**
|
|
60
|
+
|
|
61
|
+
This step catches test-level deceptions that pass all prior checks: files exist, are substantive, are wired, and tests pass — but the tests don't actually validate the requirement.
|
|
62
|
+
|
|
63
|
+
**1. Identify requirement-linked test files**
|
|
64
|
+
|
|
65
|
+
From PLAN and SUMMARY files, map each requirement to the test files that are supposed to prove it.
|
|
66
|
+
|
|
67
|
+
**2. Disabled test scan**
|
|
68
|
+
|
|
69
|
+
For ALL test files linked to requirements, search for disabled/skipped patterns:
|
|
70
|
+
|
|
71
|
+
```bash
|
|
72
|
+
grep -rn -E "it\.skip|describe\.skip|test\.skip|xit\(|xdescribe\(|xtest\(|@pytest\.mark\.skip|@unittest\.skip|#\[ignore\]|\.pending|it\.todo|test\.todo" "$TEST_FILE"
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
**Rule:** A disabled test linked to a requirement = requirement NOT tested.
|
|
76
|
+
- 🛑 BLOCKER if the disabled test is the only test proving that requirement
|
|
77
|
+
- ⚠️ WARNING if other active tests also cover the requirement
|
|
78
|
+
|
|
79
|
+
**3. Circular test detection**
|
|
80
|
+
|
|
81
|
+
Search for scripts/utilities that generate expected values by running the system under test:
|
|
82
|
+
|
|
83
|
+
```bash
|
|
84
|
+
grep -rn -E "writeFileSync|writeFile|fs\.write|open\(.*w\)" "$TEST_DIRS"
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
For each match, check if it also imports the system/service/module being tested. If a script both imports the system-under-test AND writes expected output values → CIRCULAR.
|
|
88
|
+
|
|
89
|
+
**Circular test indicators:**
|
|
90
|
+
- Script imports a service AND writes to fixture files
|
|
91
|
+
- Expected values have comments like "computed from engine", "captured from baseline"
|
|
92
|
+
- Script filename contains "capture", "baseline", "generate", "snapshot" in test context
|
|
93
|
+
- Expected values were added in the same commit as the test assertions
|
|
94
|
+
|
|
95
|
+
**Rule:** A test comparing system output against values generated by the same system is circular. It proves consistency, not correctness.
|
|
96
|
+
|
|
97
|
+
**4. Expected value provenance** (for comparison/parity/migration requirements)
|
|
98
|
+
|
|
99
|
+
When a requirement demands comparison with an external source ("identical to X", "matches Y", "same output as Z"):
|
|
100
|
+
|
|
101
|
+
- Is the external source actually invoked or referenced in the test pipeline?
|
|
102
|
+
- Do fixture files contain data sourced from the external system?
|
|
103
|
+
- Or do all expected values come from the new system itself or from mathematical formulas?
|
|
104
|
+
|
|
105
|
+
**Provenance classification:**
|
|
106
|
+
- VALID: Expected value from external/legacy system output, manual capture, or independent oracle
|
|
107
|
+
- PARTIAL: Expected value from mathematical derivation (proves formula, not system match)
|
|
108
|
+
- CIRCULAR: Expected value from the system being tested
|
|
109
|
+
- UNKNOWN: No provenance information — treat as SUSPECT
|
|
110
|
+
|
|
111
|
+
**5. Assertion strength**
|
|
112
|
+
|
|
113
|
+
For each test linked to a requirement, classify the strongest assertion:
|
|
114
|
+
|
|
115
|
+
| Level | Examples | Proves |
|
|
116
|
+
|-------|---------|--------|
|
|
117
|
+
| Existence | `toBeDefined()`, `!= null` | Something returned |
|
|
118
|
+
| Type | `typeof x === 'number'` | Correct shape |
|
|
119
|
+
| Status | `code === 200` | No error |
|
|
120
|
+
| Value | `toEqual(expected)`, `toBeCloseTo(x)` | Specific value |
|
|
121
|
+
| Behavioral | Multi-step workflow assertions | End-to-end correctness |
|
|
122
|
+
|
|
123
|
+
If a requirement demands value-level or behavioral-level proof and the test only has existence/type/status assertions → INSUFFICIENT.
|
|
124
|
+
|
|
125
|
+
**6. Coverage quantity**
|
|
126
|
+
|
|
127
|
+
If a requirement specifies a quantity of test cases (e.g., "30 calculations"), check if the actual number of active (non-skipped) test cases meets the requirement.
|
|
128
|
+
|
|
129
|
+
**Reporting — add to VERIFICATION.md:**
|
|
130
|
+
|
|
131
|
+
```markdown
|
|
132
|
+
### Test Quality Audit
|
|
133
|
+
|
|
134
|
+
| Test File | Linked Req | Active | Skipped | Circular | Assertion Level | Verdict |
|
|
135
|
+
|-----------|-----------|--------|---------|----------|-----------------|---------|
|
|
136
|
+
|
|
137
|
+
**Disabled tests on requirements:** {N} → {BLOCKER if any req has ONLY disabled tests}
|
|
138
|
+
**Circular patterns detected:** {N} → {BLOCKER if any}
|
|
139
|
+
**Insufficient assertions:** {N} → {WARNING}
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
**Impact on status:** Any BLOCKER from test quality audit → overall status = `gaps_found` (Step 9 rule 1), regardless of other checks passing.
|
|
143
|
+
</step>
|
|
144
|
+
|
|
145
|
+
## identify_human_verification — infrastructure/foundation scoping (apply at Step 8)
|
|
146
|
+
|
|
147
|
+
**First: determine if this is an infrastructure/foundation phase.**
|
|
148
|
+
|
|
149
|
+
Infrastructure and foundation phases — code foundations, database schema, internal APIs, data models, build tooling, CI/CD, internal service integrations — have no user-facing elements by definition. For these phases:
|
|
150
|
+
|
|
151
|
+
- Do NOT invent artificial manual steps (e.g., "manually run git commits", "manually invoke methods", "manually check database state").
|
|
152
|
+
- Mark human verification as **N/A** with rationale: "Infrastructure/foundation phase — no user-facing elements to test manually."
|
|
153
|
+
- Set `human_verification: []` and do **not** produce a `human_needed` status solely due to lack of user-facing features.
|
|
154
|
+
- Only add human verification items if the phase goal or success criteria explicitly describe something a user would interact with (UI, CLI command output visible to end users, external service UX).
|
|
155
|
+
- **Exception — behavior-unverified truths still count.** A truth marked ⚠️ PRESENT_BEHAVIOR_UNVERIFIED (a state transition or a cancellation/cleanup/ordering invariant with no test exercising it) is a behavioral-evidence gap, not an artificial user-facing step. Record it in `behavior_unverified_items` and emit a human-verification item for it **even on an infrastructure/foundation phase** — these invariants are exactly where infra phases hide runtime state leaks. Such a truth drives `human_needed`; the auto-pass-UAT shortcut applies only to the absence of user-facing UX, never to a behavior-unverified invariant. The same carve-out covers an **abstained non-inferable truth** (⚠️ `insufficient_spec`, § Backstop abstention below) — an insufficient-spec gap is an evidence gap, not a user-facing step, so it too still emits its human-verification item and drives `human_needed` on an infrastructure phase.
|
|
156
|
+
|
|
157
|
+
**How to determine if a phase is infrastructure/foundation:**
|
|
158
|
+
- Phase goal or name contains: "foundation", "infrastructure", "schema", "database", "internal API", "data model", "scaffolding", "pipeline", "tooling", "CI", "migrations", "service layer", "backend", "core library"
|
|
159
|
+
- Phase success criteria describe only technical artifacts (files exist, tests pass, schema is valid) with no user interaction required
|
|
160
|
+
- There is no UI, CLI output visible to end users, or real-time behavior to observe
|
|
161
|
+
|
|
162
|
+
**If the phase IS infrastructure/foundation:** auto-pass UAT — skip the human verification items list entirely, **except any ⚠️ PRESENT_BEHAVIOR_UNVERIFIED or abstained ⚠️ `insufficient_spec` truth (see exception above), which still emits a human-verification item and drives `human_needed`.** Only when no such excepted truth exists, log:
|
|
163
|
+
|
|
164
|
+
```markdown
|
|
165
|
+
## Human Verification
|
|
166
|
+
|
|
167
|
+
N/A — Infrastructure/foundation phase with no user-facing elements.
|
|
168
|
+
All acceptance criteria are verifiable programmatically.
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
**If the phase IS user-facing:** only flag items that genuinely require a human — per the Step 8 always/uncertain lists already in the agent. Do not invent steps.
|
|
172
|
+
|
|
173
|
+
## Backstop abstention — reporting contract (#3206, companion to agent Step 3 item 5b)
|
|
174
|
+
|
|
175
|
+
When a non-inferable (`verification: backstop`) truth abstains for lack of explicit evidence:
|
|
176
|
+
|
|
177
|
+
- **Never silent, never a hard halt.** *Interactive:* the abstained item routes to the end-of-phase
|
|
178
|
+
human checkpoint. *Autonomous (AFK):* it produces a prominent `unverified — held-out test
|
|
179
|
+
recommended` flag and the completion line reads "complete with N unverified non-inferable checks";
|
|
180
|
+
the run neither silently passes the blind spot nor hard-halts.
|
|
181
|
+
- **Distinguishable reason.** The abstain disposition carries `reason: insufficient_spec` so its
|
|
182
|
+
`human_needed` outcome is never conflated with an ordinary manual-UAT `human_needed`.
|
|
183
|
+
- **Infrastructure phases included.** This rides the same carve-out as ⚠️ PRESENT_BEHAVIOR_UNVERIFIED
|
|
184
|
+
in the infrastructure-phase gate above: an abstention is an evidence gap, not a user-facing step,
|
|
185
|
+
so the infra auto-pass-UAT shortcut never absorbs it.
|
|
186
|
+
|
|
187
|
+
Full protocol and rationale: `gsd-core/references/honest-verifier.md`.
|
|
188
|
+
|
|
189
|
+
## Lazy references
|
|
190
|
+
|
|
191
|
+
- **Per-stack verification patterns:** before Step 4 (artifact verification) on an unfamiliar stack, Read `~/.claude/gsd-core/references/verification-patterns.md` — the grep catalog for React/Next.js components, API routes, database schema, and the universal stub patterns. Read it lazily (only the sections for the stack under verification); it is too large to load wholesale on every run.
|
|
192
|
+
- **Canonical report shape:** the emitted VERIFICATION.md follows `@~/.claude/gsd-core/templates/verification-report.md` — the template whose Guidelines and row shapes `src/uat.cts` treats as canonical when consuming verification output.
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# Verify Command Path Resolvability (#2401)
|
|
2
|
+
|
|
3
|
+
> Reference file for gsd-plan-checker agent. Loaded on-demand via `@` reference.
|
|
4
|
+
|
|
5
|
+
**Question:** Does each `<automated>` command's target directory actually resolve from the
|
|
6
|
+
executor's cwd (the project root)? Format sanity above asks whether the *pattern* can match;
|
|
7
|
+
this asks whether the command can *run at all*.
|
|
8
|
+
|
|
9
|
+
**Do not hand-reason the filesystem.** #2401 is precisely the failure of doing so: this
|
|
10
|
+
checker flagged a bad `cd ../../frontend` (correct), then prescribed two successively-wrong
|
|
11
|
+
replacement paths — the second citing a `package.json` that did not exist. Consume the
|
|
12
|
+
deterministic probe result, never re-derive it yourself.
|
|
13
|
+
|
|
14
|
+
`gsd-core/workflows/plan-phase.md` already runs the probe **before** spawning this checker and
|
|
15
|
+
interpolates the result into the verification prompt as `{VERIFY_PATHS}`, inside a
|
|
16
|
+
`<verify_command_path_probe>` block. This dimension reads that already-supplied JSON — it never
|
|
17
|
+
invokes `gsd_run check verify-command-paths` itself. If `{VERIFY_PATHS}` is absent from the
|
|
18
|
+
prompt, treat this dimension as silent (nothing to check) rather than trying to run the probe.
|
|
19
|
+
|
|
20
|
+
The probe never executes command text (PLAN.md is untrusted, LLM-authored). It recognizes two
|
|
21
|
+
grounded forms — a leading `cd <literal>` chain and `npm --prefix <literal>` — and refuses to
|
|
22
|
+
guess at anything else.
|
|
23
|
+
|
|
24
|
+
**Process:** for each row in `.commands`, act on `severity` only:
|
|
25
|
+
|
|
26
|
+
| `severity` | `reason` | Action |
|
|
27
|
+
|---|---|---|
|
|
28
|
+
| `blocker` | `missing_dir` / `no_manifest` | **BLOCKER** — quote `rawTarget` and `target` verbatim |
|
|
29
|
+
| `warning` | `dynamic_path` / `outside_root` / `script_missing` / `manifest_unreadable` | **WARNING** |
|
|
30
|
+
| `none` | — | silent |
|
|
31
|
+
|
|
32
|
+
Rules:
|
|
33
|
+
- **Report, never prescribe.** State the target that failed to resolve and what was missing.
|
|
34
|
+
Choosing the replacement is the planner's job — it now receives the prior phase's proven
|
|
35
|
+
commands (see `prior_verify_commands` in the planning context).
|
|
36
|
+
- `status: pending_creation` means an earlier task in this phase creates that directory. **Not
|
|
37
|
+
a finding.** Say nothing.
|
|
38
|
+
- `unresolvable` means the probe could not ground the path (a variable, glob, substitution, or
|
|
39
|
+
`~`). That is a WARNING, never a BLOCKER — and never a licence to guess the literal path.
|
|
40
|
+
- A non-empty `readError` means the probe **could not look**. Report that as a WARNING in its
|
|
41
|
+
own words; it is not a clean bill of health.
|
|
42
|
+
- `MISSING …` sentinels are Dimension 8's business — this dimension stays silent on them.
|
|
@@ -14,10 +14,10 @@ The user-flow form mirrors what a real user does: open, fill, click, see. No HTT
|
|
|
14
14
|
## When this framing applies
|
|
15
15
|
|
|
16
16
|
The framing fires when:
|
|
17
|
-
- The phase under verification has `**Mode:** mvp` in ROADMAP.md (parsed via `
|
|
17
|
+
- The phase under verification has `**Mode:** mvp` in ROADMAP.md (parsed via `gsd_run query roadmap.get-phase --pick mode`).
|
|
18
18
|
- AND the phase has a user-story-formatted goal (set by `/gsd mvp-phase` per Phase 2): "As a [user role], I want to [capability], so that [outcome]."
|
|
19
19
|
|
|
20
|
-
If the phase has `mode: mvp` but the goal is NOT in user-story format, the verifier surfaces this as a discrepancy and asks the user to run `/gsd mvp-phase` to reformat the goal — same pattern as the planner agent under MVP_MODE (per `references/planner-mvp-mode.md`).
|
|
20
|
+
If the phase has `mode: mvp` but the goal is NOT in user-story format, the verifier surfaces this as a discrepancy and asks the user to run `/gsd mvp-phase` to reformat the goal — same pattern as the planner agent under MVP_MODE (per `gsd-core/references/planner-mvp-mode.md`).
|
|
21
21
|
|
|
22
22
|
## Generated UAT script structure under MVP mode
|
|
23
23
|
|
|
@@ -9,8 +9,12 @@ parallel milestone work by multiple Claude Code instances on the same codebase.
|
|
|
9
9
|
|
|
10
10
|
1. `--ws <name>` flag (explicit, highest priority)
|
|
11
11
|
2. `GSD_WORKSTREAM` environment variable (per-instance)
|
|
12
|
-
3. Session-scoped active workstream pointer in temp storage (per runtime session / terminal)
|
|
13
|
-
|
|
12
|
+
3. Session-scoped active workstream pointer in temp storage (per runtime session / terminal),
|
|
13
|
+
when that pointer exists and is non-blank
|
|
14
|
+
4. `.planning/active-workstream` file — consulted whenever step 3 has nothing to say: either
|
|
15
|
+
there is no session identity at all, or there is one but it has never pointed at a
|
|
16
|
+
workstream. A session that already has its own pointer (step 3) is never overridden by
|
|
17
|
+
this step, even if that pointer is stale.
|
|
14
18
|
5. `null` — flat mode (no workstreams)
|
|
15
19
|
|
|
16
20
|
## Why session-scoped pointers exist
|
|
@@ -20,16 +24,22 @@ Claude/Codex instances are active on the same repo at the same time. One session
|
|
|
20
24
|
silently repoint another session's `STATE.md`, `ROADMAP.md`, and phase paths.
|
|
21
25
|
|
|
22
26
|
GSD now prefers a session-scoped pointer keyed by runtime/session identity
|
|
23
|
-
(`GSD_SESSION_KEY`, `CODEX_THREAD_ID`, `
|
|
27
|
+
(`GSD_SESSION_KEY`, `CODEX_THREAD_ID`, `CLAUDE_CODE_SESSION_ID`,
|
|
28
|
+
`CLAUDE_CODE_SSE_PORT`, terminal session IDs,
|
|
24
29
|
or the controlling TTY). This keeps concurrent sessions isolated while preserving
|
|
25
30
|
legacy compatibility for runtimes that do not expose a stable session key.
|
|
26
31
|
|
|
32
|
+
A session that has never set its own pointer inherits `.planning/active-workstream`
|
|
33
|
+
(step 4) rather than silently falling back to flat mode — this does not weaken the
|
|
34
|
+
isolation guarantee above: inheritance only fires when a session's own pointer is
|
|
35
|
+
absent, and a session that has ever set one is never repointed by the shared file.
|
|
36
|
+
|
|
27
37
|
## Session Identity Resolution
|
|
28
38
|
|
|
29
39
|
When GSD resolves the session-scoped pointer in step 3 above, it uses this order:
|
|
30
40
|
|
|
31
41
|
1. Explicit runtime/session env vars such as `GSD_SESSION_KEY`, `CODEX_THREAD_ID`,
|
|
32
|
-
`CLAUDE_SESSION_ID`, `CLAUDE_CODE_SSE_PORT`, `OPENCODE_SESSION_ID`,
|
|
42
|
+
`CLAUDE_SESSION_ID`, `CLAUDE_CODE_SESSION_ID`, `CLAUDE_CODE_SSE_PORT`, `OPENCODE_SESSION_ID`,
|
|
33
43
|
`GEMINI_SESSION_ID`, `CURSOR_SESSION_ID`, `WINDSURF_SESSION_ID`,
|
|
34
44
|
`TERM_SESSION_ID`, `WT_SESSION`, `TMUX_PANE`, and `ZELLIJ_SESSION_NAME`
|
|
35
45
|
2. `TTY` or `SSH_TTY` if the shell/runtime already exposes the terminal path
|
|
@@ -47,7 +57,13 @@ routing hot path.
|
|
|
47
57
|
|
|
48
58
|
Session-scoped pointers are intentionally lightweight and best-effort:
|
|
49
59
|
|
|
50
|
-
- Clearing a workstream for one session removes only that session's pointer file
|
|
60
|
+
- Clearing a workstream for one session removes only that session's pointer file.
|
|
61
|
+
This returns that session to step 4 of Resolution Priority above — it goes back
|
|
62
|
+
to **inheriting** `.planning/active-workstream` (if a marker exists there), not
|
|
63
|
+
to flat mode. A cleared session with no marker present resolves to `null`; a
|
|
64
|
+
cleared session with a marker present resolves to whatever that marker names.
|
|
65
|
+
To force flat mode for a cleared session, remove the shared marker file, or use
|
|
66
|
+
an explicit override such as `--ws` / `GSD_WORKSTREAM` on the command in question.
|
|
51
67
|
- If that was the last pointer for the repo, GSD also removes the now-empty
|
|
52
68
|
per-project temp directory
|
|
53
69
|
- If sibling session pointers still exist, the temp directory is left in place
|
|
@@ -76,7 +92,7 @@ This ensures workstream scope chains automatically through the workflow:
|
|
|
76
92
|
├── config.json # Shared
|
|
77
93
|
├── milestones/ # Shared
|
|
78
94
|
├── codebase/ # Shared
|
|
79
|
-
├── active-workstream #
|
|
95
|
+
├── active-workstream # Shared marker; inherited when a session has no pointer of its own
|
|
80
96
|
└── workstreams/
|
|
81
97
|
├── feature-a/ # Workstream A
|
|
82
98
|
│ ├── STATE.md
|
|
@@ -93,19 +109,19 @@ This ensures workstream scope chains automatically through the workflow:
|
|
|
93
109
|
## CLI Usage
|
|
94
110
|
|
|
95
111
|
```bash
|
|
96
|
-
# All
|
|
97
|
-
|
|
98
|
-
|
|
112
|
+
# All gsd_run query commands accept --ws
|
|
113
|
+
gsd_run query state.json --ws feature-a
|
|
114
|
+
gsd_run query find-phase 3 --ws feature-b
|
|
99
115
|
|
|
100
116
|
# Session-local switching without --ws on every command
|
|
101
|
-
GSD_SESSION_KEY=my-terminal-a
|
|
102
|
-
GSD_SESSION_KEY=my-terminal-a
|
|
103
|
-
GSD_SESSION_KEY=my-terminal-b
|
|
104
|
-
GSD_SESSION_KEY=my-terminal-b
|
|
117
|
+
GSD_SESSION_KEY=my-terminal-a gsd_run query workstream.set feature-a
|
|
118
|
+
GSD_SESSION_KEY=my-terminal-a gsd_run query state.json
|
|
119
|
+
GSD_SESSION_KEY=my-terminal-b gsd_run query workstream.set feature-b
|
|
120
|
+
GSD_SESSION_KEY=my-terminal-b gsd_run query state.json
|
|
105
121
|
|
|
106
122
|
# Workstream CRUD
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
123
|
+
gsd_run query workstream.create <name>
|
|
124
|
+
gsd_run query workstream.list
|
|
125
|
+
gsd_run query workstream.status <name>
|
|
126
|
+
gsd_run query workstream.complete <name>
|
|
111
127
|
```
|
|
@@ -18,7 +18,7 @@ These files live directly at `.planning/` — not inside phase subdirectories.
|
|
|
18
18
|
| `REQUIREMENTS.md` | `requirements.md` | `/gsd:new-milestone` | Functional requirements with traceability |
|
|
19
19
|
| `MILESTONES.md` | `milestone.md` | `/gsd:complete-milestone` | Log of completed milestones with accomplishments |
|
|
20
20
|
| `BACKLOG.md` | *(inline)* | `/gsd-add-backlog` | Pending ideas and deferred work |
|
|
21
|
-
| `LEARNINGS.md` | *(inline)* | `/gsd:extract-learnings`, `/gsd:execute-phase` | Phase retrospective learnings for future plans |
|
|
21
|
+
| `LEARNINGS.md` | *(inline)* | `/gsd:extract-learnings`, `/gsd:execute-phase` (gated: `features.global_learnings`) | Phase retrospective learnings for future plans |
|
|
22
22
|
| `THREADS.md` | *(inline)* | `/gsd:thread` | Persistent discussion threads |
|
|
23
23
|
| `config.json` | `config.json` | `/gsd:new-project`, `/gsd:health --repair` | Project-specific GSD configuration |
|
|
24
24
|
| `CLAUDE.md` | `claude-md.md` | `/gsd-profile` | Auto-assembled Claude Code context file |
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
---
|
|
2
|
-
phase: {N}
|
|
3
|
-
slug: {phase-slug}
|
|
2
|
+
phase: "{N}"
|
|
3
|
+
slug: "{phase-slug}"
|
|
4
4
|
status: draft
|
|
5
5
|
# threats_open = count of OPEN threats at or above workflow.security_block_on severity (the blocking gate)
|
|
6
6
|
threats_open: 0
|
|
7
7
|
asvs_level: 1
|
|
8
|
-
created: {date}
|
|
8
|
+
created: "{date}"
|
|
9
9
|
---
|
|
10
10
|
|
|
11
11
|
# Phase {N} — Security
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
---
|
|
2
|
-
phase: {N}
|
|
3
|
-
slug: {phase-slug}
|
|
2
|
+
phase: "{N}"
|
|
3
|
+
slug: "{phase-slug}"
|
|
4
4
|
status: draft
|
|
5
5
|
shadcn_initialized: false
|
|
6
6
|
preset: none
|
|
7
|
-
created: {date}
|
|
7
|
+
created: "{date}"
|
|
8
8
|
---
|
|
9
9
|
|
|
10
10
|
# Phase {N} — UI Design Contract
|
|
@@ -25,6 +25,27 @@ created: {date}
|
|
|
25
25
|
|
|
26
26
|
---
|
|
27
27
|
|
|
28
|
+
## Component Inventory
|
|
29
|
+
|
|
30
|
+
> What the project's design system actually provides. **Enumerate this from the installed
|
|
31
|
+
> package — never from recall.** Delete whichever provenance line below does not apply.
|
|
32
|
+
|
|
33
|
+
Enumerated by `<command>` — <N> components — <package>@<version> — <YYYY-MM-DD>.
|
|
34
|
+
Could not enumerate: <reason>.
|
|
35
|
+
|
|
36
|
+
Without a provenance line this table is a **non-exhaustive** list of known-good components and
|
|
37
|
+
never a closed allowlist — the executor may use anything the design system exports, and
|
|
38
|
+
`gsd-ui-checker` Dimension 7 reports the missing line as a defect. Checking for a component
|
|
39
|
+
outside the table is the expected path, not an exception.
|
|
40
|
+
|
|
41
|
+
| Component | Import path | Notes |
|
|
42
|
+
|-----------|-------------|-------|
|
|
43
|
+
| {name} | {import path} | {when to reach for it} |
|
|
44
|
+
|
|
45
|
+
Omit this section entirely when the project has no design system (`Tool: none`).
|
|
46
|
+
|
|
47
|
+
---
|
|
48
|
+
|
|
28
49
|
## Spacing Scale
|
|
29
50
|
|
|
30
51
|
Declared values (must be multiples of 4):
|
|
@@ -121,5 +142,6 @@ Applicable state considerations resolved: {N covered, M backstop, K unresolved
|
|
|
121
142
|
- [ ] Dimension 4 Typography: PASS
|
|
122
143
|
- [ ] Dimension 5 Spacing: PASS
|
|
123
144
|
- [ ] Dimension 6 Registry Safety: PASS
|
|
145
|
+
- [ ] Dimension 7 Inventory Provenance: PASS
|
|
124
146
|
|
|
125
147
|
**Approval:** {pending / approved YYYY-MM-DD}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
---
|
|
2
|
-
phase: {N}
|
|
3
|
-
slug: {phase-slug}
|
|
2
|
+
phase: "{N}"
|
|
3
|
+
slug: "{phase-slug}"
|
|
4
4
|
# status lifecycle: draft (seeded by plan-phase) → validated (set by validate-phase §6)
|
|
5
5
|
# audit-milestone §5.5 distinguishes NOT-VALIDATED (draft) from PARTIAL (validated + nyquist_compliant: false) (#2117)
|
|
6
6
|
status: draft
|
|
7
7
|
nyquist_compliant: false
|
|
8
8
|
wave_0_complete: false
|
|
9
|
-
created: {date}
|
|
9
|
+
created: "{date}"
|
|
10
10
|
---
|
|
11
11
|
|
|
12
12
|
# Phase {N} — Validation Strategy
|
|
@@ -4,7 +4,7 @@ Template for `.planning/phases/XX-name/{phase_num}-DISCUSSION-LOG.md` — audit
|
|
|
4
4
|
|
|
5
5
|
**Purpose:** Software audit trail for decision-making. Captures all options considered, not just the selected one. Separate from CONTEXT.md which is the implementation artifact consumed by downstream agents.
|
|
6
6
|
|
|
7
|
-
**NOT for LLM consumption.** This file should never be referenced in `<
|
|
7
|
+
**NOT for LLM consumption.** This file should never be referenced in `<required_reading>` blocks or agent prompts.
|
|
8
8
|
|
|
9
9
|
## Format
|
|
10
10
|
|
|
@@ -19,6 +19,9 @@ type: execute
|
|
|
19
19
|
wave: N # Execution wave (1, 2, 3...). Pre-computed at plan time.
|
|
20
20
|
depends_on: [] # Plan IDs this plan requires (e.g., ["01-01"]).
|
|
21
21
|
files_modified: [] # Files this plan modifies.
|
|
22
|
+
files_deleted: [] # OPTIONAL. Files this plan REMOVES. Declaring a path here is what
|
|
23
|
+
# lets worktree cleanup-wave merge the branch that deletes it; an
|
|
24
|
+
# undeclared deletion still blocks. Exact paths, not globs or dirs.
|
|
22
25
|
autonomous: true # false if plan has checkpoints requiring user interaction
|
|
23
26
|
requirements: [] # REQUIRED — Requirement IDs from ROADMAP this plan addresses. MUST NOT be empty.
|
|
24
27
|
user_setup: [] # Human-required setup Claude cannot automate (see below)
|
|
@@ -187,7 +190,7 @@ autonomous: true
|
|
|
187
190
|
|
|
188
191
|
# Plan 02 - Protected features (needs auth)
|
|
189
192
|
wave: 2
|
|
190
|
-
depends_on: ["01"]
|
|
193
|
+
depends_on: ["01-01"]
|
|
191
194
|
files_modified: [src/features/dashboard.ts]
|
|
192
195
|
autonomous: true
|
|
193
196
|
```
|
|
@@ -199,7 +202,7 @@ Plan 02 in Wave 2 waits for Plan 01 in Wave 1 - genuine dependency on auth types
|
|
|
199
202
|
```yaml
|
|
200
203
|
# Plan 03 - UI with verification
|
|
201
204
|
wave: 3
|
|
202
|
-
depends_on: ["01", "02"]
|
|
205
|
+
depends_on: ["01-01", "01-02"]
|
|
203
206
|
files_modified: [src/components/Dashboard.tsx]
|
|
204
207
|
autonomous: false # Has checkpoint:human-verify
|
|
205
208
|
```
|
|
@@ -606,5 +609,3 @@ Task completion ≠ Goal achievement. A task "create chat component" can complet
|
|
|
606
609
|
4. Verification subagent checks must_haves against codebase
|
|
607
610
|
5. Gaps found → fix plans created → execute → re-verify
|
|
608
611
|
6. All must_haves pass → phase complete
|
|
609
|
-
|
|
610
|
-
See `~/.claude/gsd-core/workflows/verify-phase.md` for verification logic.
|
|
@@ -6,6 +6,12 @@ Template for `.planning/STATE.md` — the project's living memory.
|
|
|
6
6
|
|
|
7
7
|
## File Template
|
|
8
8
|
|
|
9
|
+
The frontmatter block below is generated from `STATE_FIELD_SCHEMA`
|
|
10
|
+
(`src/state-md-schema.cts`, ADR-3473 §8.8) by `scripts/gen-state-md-docs.cjs
|
|
11
|
+
--write` — do not hand-edit the marked region; the body below it is
|
|
12
|
+
hand-authored.
|
|
13
|
+
|
|
14
|
+
<!-- STATE-MD-SCHEMA:START:frontmatter — generated by scripts/gen-state-md-docs.cjs from src/state-md-schema.cts; do not edit by hand -->
|
|
9
15
|
```markdown
|
|
10
16
|
---
|
|
11
17
|
gsd_state_version: '1.0' # placeholder; syncStateFrontmatter overwrites on first state.* call
|
|
@@ -17,6 +23,7 @@ progress:
|
|
|
17
23
|
completed_plans: 0
|
|
18
24
|
percent: 0
|
|
19
25
|
---
|
|
26
|
+
<!-- STATE-MD-SCHEMA:END:frontmatter -->
|
|
20
27
|
|
|
21
28
|
# Project State
|
|
22
29
|
|
|
@@ -79,11 +86,11 @@ None yet.
|
|
|
79
86
|
|
|
80
87
|
## Deferred Items
|
|
81
88
|
|
|
82
|
-
Items acknowledged and
|
|
89
|
+
Items acknowledged and deferred at milestone close, most recent first:
|
|
83
90
|
|
|
84
|
-
| Category | Item | Status | Deferred At |
|
|
85
|
-
|
|
86
|
-
| *(none)* | | | |
|
|
91
|
+
| Category | Item | Status | Deferred At | Milestone |
|
|
92
|
+
|----------|------|--------|-------------|-----------|
|
|
93
|
+
| *(none)* | | | | |
|
|
87
94
|
|
|
88
95
|
## Session Continuity
|
|
89
96
|
|
|
@@ -18,6 +18,10 @@ behavior_unverified_items: # Only if behavior_unverified > 0 — the truths abov
|
|
|
18
18
|
test: "What to trigger"
|
|
19
19
|
expected: "What state must hold afterward"
|
|
20
20
|
why_human: "Why presence checks can't see it"
|
|
21
|
+
coincidental_reliance_items: # Only if a ✓ VERIFIED truth holds incidentally — emitted regardless of overall status (survives gaps_found)
|
|
22
|
+
- truth: "Observable truth that holds incidentally"
|
|
23
|
+
reason: undeclared-precondition | incidental-ordering | fixture-only
|
|
24
|
+
harden: "Precondition/ordering to declare or enforce"
|
|
21
25
|
---
|
|
22
26
|
|
|
23
27
|
# Phase {X}: {Name} Verification Report
|
|
@@ -35,7 +39,8 @@ behavior_unverified_items: # Only if behavior_unverified > 0 — the truths abov
|
|
|
35
39
|
| 1 | {truth from must_haves} | ✓ VERIFIED | {what confirmed it} |
|
|
36
40
|
| 2 | {truth from must_haves} | ✗ FAILED | {what's wrong} |
|
|
37
41
|
| 3 | {truth from must_haves} | ⚠️ PRESENT_BEHAVIOR_UNVERIFIED | {present + wired; transition/invariant not exercised by a test — see Human Verification} |
|
|
38
|
-
| 4 | {truth from must_haves} |
|
|
42
|
+
| 4 | {truth from must_haves} | ✓ VERIFIED (coincidental-reliance) | {holds, but incidentally — see coincidental_reliance_items} |
|
|
43
|
+
| 5 | {truth from must_haves} | ? UNCERTAIN | {why can't verify} |
|
|
39
44
|
|
|
40
45
|
**Score:** {N}/{M} truths verified ({P} present, behavior-unverified)
|
|
41
46
|
|
|
@@ -176,6 +181,9 @@ None — all verifiable items checked programmatically.
|
|
|
176
181
|
**Per-truth states (Observable Truths `Status` column):**
|
|
177
182
|
- `✓ VERIFIED` — supporting artifacts pass all checks; for a behavior-dependent truth, a behavioral test exercised the asserted behavior
|
|
178
183
|
- `⚠️ PRESENT_BEHAVIOR_UNVERIFIED` — present + wired, but a state transition or cancellation/cleanup/ordering invariant was not exercised by any test. Counts toward `behavior_unverified`, routes to human verification, and is *excluded* from the verified score. Per-truth only — on its own the overall `status:` becomes `human_needed` (unless a higher-precedence `gaps_found` also applies); the item is preserved in `behavior_unverified_items` regardless.
|
|
184
|
+
- `✓ VERIFIED (coincidental-reliance)` — an **advisory** qualifier on a truth that *is* verified but holds for an incidental reason rather than a guaranteed one (#1955): `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), or `fixture-only` (the test's own setup establishes the precondition; the production path has no equivalent). The base `✓ VERIFIED` token is kept verbatim and leading, so it counts toward the verified score exactly as before — the advisory changes no score and no status, and never produces a human-verification item. Each flagged truth is listed in `coincidental_reliance_items` with the reason and what to harden. Not applied to a truth that never reached `✓ VERIFIED`, nor to a `PASSED (override)` truth.
|
|
185
|
+
|
|
186
|
+
**Filling this column — apply the reliance check to every `✓ VERIFIED` truth before writing the row.** Ask why the truth holds and classify the evidence you already recorded, not your confidence in it. Flag it when the evidence names one of the three reasons above. 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. The check is endogenous and so weaker than an exogenous tag (`gsd-core/references/honest-verifier.md`) — which is why it is advisory and never a gate. The usual fix is to promote the hidden assumption into a declared precondition.
|
|
179
187
|
- `✗ FAILED` — artifact missing, stub, or unwired
|
|
180
188
|
- `? UNCERTAIN` — can't verify programmatically
|
|
181
189
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
_GSD_SHIM_NAME="gsd-tools.cjs"; _GSD_RUNTIME_ROOT="${RUNTIME_DIR:-$(git rev-parse --show-toplevel 2>/dev/null || pwd)}"; GSD_TOOLS="${_GSD_RUNTIME_ROOT}/gsd-core/bin/${_GSD_SHIM_NAME}"; if [ -f "$
|
|
1
|
+
_GSD_SHIM_NAME="gsd-tools.cjs"; _GSD_RUNTIME_ROOT="${RUNTIME_DIR:-$(git rev-parse --show-toplevel 2>/dev/null || pwd)}"; GSD_TOOLS="${_GSD_RUNTIME_ROOT}/gsd-core/bin/${_GSD_SHIM_NAME}"; _gsd_at() { for _p; do if [ -f "$_p" ]; then GSD_TOOLS="$_p"; return 0; fi; done; return 1; }; if _gsd_at "${_GSD_RUNTIME_ROOT}/gsd-core/bin/${_GSD_SHIM_NAME}" "${_GSD_RUNTIME_ROOT}/.claude/gsd-core/bin/${_GSD_SHIM_NAME}" "${_GSD_RUNTIME_ROOT}/.codex/gsd-core/bin/${_GSD_SHIM_NAME}"; then gsd_run() { node "$GSD_TOOLS" "$@"; }; elif unset -f gsd_run; _G="$(command -v gsd_run)"; then GSD_TOOLS="$_G"; gsd_run() { "$GSD_TOOLS" "$@"; }; elif _gsd_at "${CLAUDE_CONFIG_DIR:-$HOME/.claude}/gsd-core/bin/${_GSD_SHIM_NAME}" "${HERMES_HOME:-$HOME/.hermes}/gsd-core/bin/${_GSD_SHIM_NAME}" "${CURSOR_CONFIG_DIR:-$HOME/.cursor}/gsd-core/bin/${_GSD_SHIM_NAME}" "${CODEX_HOME:-$HOME/.codex}/gsd-core/bin/${_GSD_SHIM_NAME}" "${GEMINI_CONFIG_DIR:-$HOME/.gemini}/gsd-core/bin/${_GSD_SHIM_NAME}" "${COPILOT_CONFIG_DIR:-$HOME/.copilot}/gsd-core/bin/${_GSD_SHIM_NAME}" "${WINDSURF_CONFIG_DIR:-$HOME/.codeium/windsurf}/gsd-core/bin/${_GSD_SHIM_NAME}" "${AUGMENT_CONFIG_DIR:-$HOME/.augment}/gsd-core/bin/${_GSD_SHIM_NAME}" "${TRAE_CONFIG_DIR:-$HOME/.trae}/gsd-core/bin/${_GSD_SHIM_NAME}" "${QWEN_CONFIG_DIR:-$HOME/.qwen}/gsd-core/bin/${_GSD_SHIM_NAME}" "${CODEBUDDY_CONFIG_DIR:-$HOME/.codebuddy}/gsd-core/bin/${_GSD_SHIM_NAME}" "${CLINE_CONFIG_DIR:-$HOME/.cline}/gsd-core/bin/${_GSD_SHIM_NAME}" "${GROK_AGENTS_HOME:-$HOME/.agents}/gsd-core/bin/${_GSD_SHIM_NAME}" "${ANTIGRAVITY_CONFIG_DIR:-$HOME/.gemini/antigravity}/gsd-core/bin/${_GSD_SHIM_NAME}" "${OPENCODE_CONFIG_DIR:-${XDG_CONFIG_HOME:-$HOME/.config}/opencode}/gsd-core/bin/${_GSD_SHIM_NAME}" "${KILO_CONFIG_DIR:-${XDG_CONFIG_HOME:-$HOME/.config}/kilo}/gsd-core/bin/${_GSD_SHIM_NAME}"; then gsd_run() { node "$GSD_TOOLS" "$@"; }; else echo "ERROR: gsd-tools.cjs not found at $GSD_TOOLS and gsd_run is not on PATH. Run: npx -y @opengsd/gsd-core@latest --claude --local" >&2; exit 1; fi; GSD_IDENTITY_STATUS=unverified; case "$(gsd_run runtime-identity --raw 2>/dev/null || true)" in '{"packageName":"@opengsd/gsd-core"'*'}') GSD_IDENTITY_STATUS=ok;; esac; export GSD_IDENTITY_STATUS; [ "$GSD_IDENTITY_STATUS" = ok ] || echo "WARNING: \"$GSD_TOOLS\" did not prove it is @opengsd/gsd-core - it is either a different package or an @opengsd/gsd-core older than the runtime-identity verb. See docs/how-to/diagnose-a-foreign-gsd-tools.md" >&2; if [ -n "${CLAUDE_ENV_FILE:-}" ] && [ -n "${GSD_TOOLS:-}" ]; then printf "export PATH='%s':\"\$PATH\"\n" "${GSD_TOOLS%/*}" >> "$CLAUDE_ENV_FILE" 2>/dev/null || true; fi
|