@opengsd/gsd-core 1.17.0 → 1.19.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 -1
- package/.opencode/plugins/gsd-core.js +2 -3
- package/agents/gsd-advisor-researcher.compact.md +1 -1
- package/agents/gsd-advisor-researcher.md +1 -1
- package/agents/gsd-assumptions-analyzer.compact.md +1 -1
- package/agents/gsd-assumptions-analyzer.md +1 -1
- package/agents/gsd-code-fixer.compact.md +3 -3
- package/agents/gsd-code-fixer.md +5 -4
- package/agents/gsd-code-reviewer.compact.md +1 -1
- package/agents/gsd-code-reviewer.md +1 -1
- package/agents/gsd-codebase-mapper.compact.md +1 -1
- package/agents/gsd-codebase-mapper.md +1 -1
- package/agents/gsd-debugger.md +1 -1
- package/agents/gsd-doc-verifier.compact.md +4 -4
- package/agents/gsd-doc-verifier.md +4 -3
- package/agents/gsd-doc-writer.compact.md +23 -5
- package/agents/gsd-doc-writer.md +19 -6
- package/agents/gsd-eval-auditor.compact.md +1 -1
- package/agents/gsd-eval-auditor.md +1 -1
- package/agents/gsd-executor.md +7 -3
- package/agents/gsd-integration-checker.compact.md +1 -1
- package/agents/gsd-integration-checker.md +1 -1
- package/agents/gsd-nyquist-auditor.compact.md +1 -1
- package/agents/gsd-nyquist-auditor.md +1 -1
- package/agents/gsd-phase-researcher.md +1 -1
- package/agents/gsd-plan-checker.md +2 -1
- package/agents/gsd-planner.md +5 -4
- package/agents/gsd-project-researcher.compact.md +1 -1
- package/agents/gsd-project-researcher.md +1 -1
- package/agents/gsd-research-synthesizer.compact.md +5 -5
- package/agents/gsd-research-synthesizer.md +5 -5
- package/agents/gsd-roadmapper.compact.md +1 -1
- package/agents/gsd-roadmapper.md +1 -1
- package/agents/gsd-security-auditor.compact.md +1 -1
- package/agents/gsd-security-auditor.md +1 -1
- package/agents/gsd-ui-auditor.compact.md +1 -1
- package/agents/gsd-ui-auditor.md +1 -1
- package/agents/gsd-ui-checker.compact.md +1 -1
- package/agents/gsd-ui-checker.md +1 -1
- package/agents/gsd-ui-researcher.compact.md +13 -1
- package/agents/gsd-ui-researcher.md +28 -1
- package/agents/gsd-verifier.md +2 -2
- package/bin/install.js +460 -105
- package/commands/gsd/code-review.md +8 -0
- package/commands/gsd/pause-work.md +1 -1
- package/gsd-core/bin/gsd-tools.cjs +124 -18
- package/gsd-core/bin/lib/agent-install-check.cjs +29 -3
- package/gsd-core/bin/lib/args-terminator.cjs +114 -0
- package/gsd-core/bin/lib/broken-windows.cjs +59 -1
- package/gsd-core/bin/lib/capability-ledger.cjs +25 -0
- package/gsd-core/bin/lib/capability-lock.cjs +41 -8
- package/gsd-core/bin/lib/capability-registry.cjs +162 -74
- package/gsd-core/bin/lib/capability-source.cjs +3 -1
- package/gsd-core/bin/lib/capability-state.cjs +20 -11
- package/gsd-core/bin/lib/capability-validator.cjs +23 -4
- package/gsd-core/bin/lib/commands.cjs +5 -1
- package/gsd-core/bin/lib/config-loader.cjs +13 -3
- package/gsd-core/bin/lib/config.cjs +256 -58
- package/gsd-core/bin/lib/core-utils.cjs +34 -0
- package/gsd-core/bin/lib/decision-coverage-support.cjs +93 -0
- package/gsd-core/bin/lib/gate-context-drift.cjs +8 -3
- package/gsd-core/bin/lib/gate-decision-coverage-plan.cjs +21 -1
- package/gsd-core/bin/lib/gate-decision-coverage-verify.cjs +19 -1
- package/gsd-core/bin/lib/gate-evaluation-scope.cjs +134 -13
- package/gsd-core/bin/lib/gate-predicate-evaluator.cjs +23 -3
- package/gsd-core/bin/lib/gate-predicate.cjs +8 -12
- package/gsd-core/bin/lib/gate-tdd-review-checkpoint.cjs +114 -18
- package/gsd-core/bin/lib/gate-ui-safety.cjs +23 -5
- package/gsd-core/bin/lib/git-info-exclude.cjs +57 -0
- package/gsd-core/bin/lib/health-diagnostic-rules/phase-structure.cjs +18 -3
- package/gsd-core/bin/lib/health-diagnostic-types.cjs +4 -0
- package/gsd-core/bin/lib/health-diagnostic.cjs +52 -1
- package/gsd-core/bin/lib/host-integration.cjs +13 -6
- package/gsd-core/bin/lib/init.cjs +76 -5
- package/gsd-core/bin/lib/install-effort-resolver.cjs +2 -2
- package/gsd-core/bin/lib/install-engine.cjs +246 -32
- package/gsd-core/bin/lib/install-model-override-resolver.cjs +4 -3
- package/gsd-core/bin/lib/install-profiles.cjs +14 -7
- package/gsd-core/bin/lib/installer-migration-report.cjs +2 -0
- package/gsd-core/bin/lib/markdown-line-diff.cjs +147 -0
- package/gsd-core/bin/lib/markdown-sectionizer.cjs +113 -0
- package/gsd-core/bin/lib/milestone-lock.cjs +8 -1
- package/gsd-core/bin/lib/milestone-release-map.cjs +244 -0
- package/gsd-core/bin/lib/milestone-release-tags.cjs +440 -0
- package/gsd-core/bin/lib/milestone.cjs +43 -1
- package/gsd-core/bin/lib/model-catalog.cjs +8 -0
- package/gsd-core/bin/lib/normalize-test-command.cjs +67 -0
- package/gsd-core/bin/lib/phase-id.cjs +21 -4
- package/gsd-core/bin/lib/phase-lifecycle.cjs +37 -4
- package/gsd-core/bin/lib/phase.cjs +235 -37
- package/gsd-core/bin/lib/planning-snapshot.cjs +3 -1
- package/gsd-core/bin/lib/planning-workspace.cjs +18 -0
- package/gsd-core/bin/lib/pristine-baseline.cjs +11 -3
- package/gsd-core/bin/lib/read-only-git-env.cjs +58 -0
- package/gsd-core/bin/lib/report-parser.cjs +57 -1
- package/gsd-core/bin/lib/review-lane-descriptor.cjs +35 -2
- package/gsd-core/bin/lib/review-lane-invocation.cjs +40 -0
- package/gsd-core/bin/lib/review-lane-runner.cjs +33 -4
- package/gsd-core/bin/lib/review-reviewer-selection.cjs +20 -1
- package/gsd-core/bin/lib/roadmap-parser.cjs +12 -0
- package/gsd-core/bin/lib/roadmap-upgrade.cjs +39 -2
- package/gsd-core/bin/lib/roadmap.cjs +89 -30
- package/gsd-core/bin/lib/runtime-artifact-conversion.cjs +428 -16
- package/gsd-core/bin/lib/runtime-artifact-layout.cjs +8 -4
- package/gsd-core/bin/lib/runtime-homes.cjs +18 -0
- package/gsd-core/bin/lib/runtime-hooks-surface.cjs +60 -16
- package/gsd-core/bin/lib/shell-command-projection.cjs +123 -16
- package/gsd-core/bin/lib/smart-entry.cjs +37 -16
- package/gsd-core/bin/lib/state-contract.cjs +29 -9
- package/gsd-core/bin/lib/state-document.cjs +47 -5
- package/gsd-core/bin/lib/state-transition.cjs +150 -34
- package/gsd-core/bin/lib/state.cjs +140 -88
- package/gsd-core/bin/lib/surface.cjs +9 -0
- package/gsd-core/bin/lib/task-command-router.cjs +7 -28
- package/gsd-core/bin/lib/task-content-resolution.cjs +46 -1
- package/gsd-core/bin/lib/tdd-red-evidence.cjs +5 -0
- package/gsd-core/bin/lib/tdd-test-files.cjs +42 -0
- package/gsd-core/bin/lib/verification.cjs +96 -9
- package/gsd-core/bin/lib/verify.cjs +38 -1
- package/gsd-core/bin/lib/worktree-safety.cjs +22 -1
- package/gsd-core/bin/shared/config-defaults.manifest.json +1 -0
- package/gsd-core/bin/shared/config-schema.manifest.json +1 -0
- package/gsd-core/references/agent-contracts.md +1 -1
- package/gsd-core/references/agent-skills-bootstrap.md +26 -7
- package/gsd-core/references/git-integration.md +14 -3
- package/gsd-core/references/loop-hook-dispatch.md +13 -6
- package/gsd-core/references/planner-reversibility.md +18 -4
- package/gsd-core/references/planner-verify-command-grounding.md +18 -0
- package/gsd-core/references/planning-config.md +2 -0
- package/gsd-core/references/tdd.md +5 -4
- package/gsd-core/references/verifier-phase-gates.md +8 -1
- package/gsd-core/templates/DEBUG.md +16 -0
- package/gsd-core/templates/config.json +2 -1
- package/gsd-core/templates/verification-report.md +1 -1
- package/gsd-core/workflows/add-backlog.md +10 -2
- package/gsd-core/workflows/add-phase.md +5 -1
- package/gsd-core/workflows/add-tests.md +5 -1
- package/gsd-core/workflows/add-todo.md +5 -1
- package/gsd-core/workflows/ai-integration-phase.md +5 -1
- package/gsd-core/workflows/audit-fix.md +2 -1
- package/gsd-core/workflows/audit-milestone.md +21 -9
- package/gsd-core/workflows/autonomous/templates/minimal-context.md +41 -0
- package/gsd-core/workflows/autonomous.md +52 -64
- package/gsd-core/workflows/check-todos.md +5 -1
- package/gsd-core/workflows/code-review/steps/structural-pre-pass.md +10 -1
- package/gsd-core/workflows/code-review-fix.md +5 -1
- package/gsd-core/workflows/code-review.md +66 -8
- package/gsd-core/workflows/complete-milestone/detail/elaboration.md +5 -1
- package/gsd-core/workflows/complete-milestone/steps/project-md-evolution-review.md +145 -0
- package/gsd-core/workflows/complete-milestone/steps/release-map.md +80 -0
- package/gsd-core/workflows/complete-milestone.md +64 -157
- package/gsd-core/workflows/debug.md +5 -1
- package/gsd-core/workflows/diagnose-issues.md +34 -6
- package/gsd-core/workflows/discuss-phase/modes/chain.md +5 -1
- package/gsd-core/workflows/discuss-phase/modes/power.md +1 -1
- package/gsd-core/workflows/discuss-phase-assumptions.md +44 -5
- package/gsd-core/workflows/discuss-phase-power.md +19 -2
- package/gsd-core/workflows/discuss-phase.md +11 -11
- package/gsd-core/workflows/docs-update/detail/elaboration.md +7 -6
- package/gsd-core/workflows/docs-update.md +27 -5
- package/gsd-core/workflows/edit-phase.md +5 -1
- package/gsd-core/workflows/eval-review.md +11 -3
- package/gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md +5 -1
- package/gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md +13 -7
- package/gsd-core/workflows/execute-phase/steps/post-merge-gate.md +19 -8
- package/gsd-core/workflows/execute-phase/steps/regression-gate-run.md +21 -3
- package/gsd-core/workflows/execute-phase/steps/regression-gate.md +18 -1
- package/gsd-core/workflows/execute-phase/steps/verify-phase-goal.md +7 -3
- package/gsd-core/workflows/execute-phase/steps/wave-post-gate-hooks.md +11 -2
- package/gsd-core/workflows/execute-phase.md +46 -11
- package/gsd-core/workflows/execute-plan.md +8 -4
- package/gsd-core/workflows/extract-learnings.md +6 -2
- package/gsd-core/workflows/forensics.md +5 -1
- package/gsd-core/workflows/health.md +2 -1
- package/gsd-core/workflows/import.md +6 -2
- package/gsd-core/workflows/insert-phase.md +5 -1
- package/gsd-core/workflows/manager.md +10 -2
- package/gsd-core/workflows/map-codebase.md +5 -1
- package/gsd-core/workflows/milestone-summary.md +10 -2
- package/gsd-core/workflows/new-milestone.md +13 -5
- package/gsd-core/workflows/new-project.md +9 -5
- package/gsd-core/workflows/next.md +8 -4
- package/gsd-core/workflows/pause-work.md +3 -3
- package/gsd-core/workflows/plan-phase/steps/auto-advance-check.md +70 -0
- package/gsd-core/workflows/plan-phase/steps/chunked-planning-mode.md +7 -3
- package/gsd-core/workflows/plan-phase/steps/closed-phase-gate.md +6 -2
- package/gsd-core/workflows/plan-phase.md +54 -86
- package/gsd-core/workflows/plan-review-convergence.md +17 -5
- package/gsd-core/workflows/plant-seed.md +8 -4
- package/gsd-core/workflows/progress.md +6 -2
- package/gsd-core/workflows/quick/steps/plan-checker-loop.md +1 -1
- package/gsd-core/workflows/quick/steps/worktree-pre-dispatch-commit.md +8 -1
- package/gsd-core/workflows/quick-batch/steps/plan-checker-loop.md +2 -1
- package/gsd-core/workflows/quick-batch.md +5 -1
- package/gsd-core/workflows/quick.md +23 -8
- package/gsd-core/workflows/remove-phase.md +5 -1
- package/gsd-core/workflows/resume-project.md +5 -1
- package/gsd-core/workflows/review.md +22 -15
- package/gsd-core/workflows/scan.md +5 -1
- package/gsd-core/workflows/section-manifest.json +5 -0
- package/gsd-core/workflows/secure-phase.md +6 -2
- package/gsd-core/workflows/settings.md +4 -3
- package/gsd-core/workflows/ship.md +16 -14
- package/gsd-core/workflows/spec-phase.md +3 -6
- package/gsd-core/workflows/thread.md +10 -2
- package/gsd-core/workflows/transition.md +5 -1
- package/gsd-core/workflows/ui-phase.md +5 -1
- package/gsd-core/workflows/ui-review.md +6 -2
- package/gsd-core/workflows/ultraplan-phase.md +5 -1
- package/gsd-core/workflows/update.md +5 -1
- package/gsd-core/workflows/validate-phase.md +6 -2
- package/gsd-core/workflows/verify-work/detail/elaboration.md +1 -1
- package/gsd-core/workflows/verify-work/steps/mvp-uat-framing.md +5 -1
- package/gsd-core/workflows/verify-work.md +15 -6
- package/hooks/dist/gsd-agent-isolation-guard.js +14 -2
- package/hooks/dist/gsd-cursor-subagent-start.js +8 -3
- package/hooks/dist/gsd-path-export.js +95 -0
- package/hooks/dist/gsd-secret-read-guard.js +244 -53
- package/hooks/dist/gsd-statusline.js +35 -2
- package/hooks/dist/gsd-validate-commit.sh +27 -5
- package/hooks/dist/gsd-windsurf-pre-write.js +28 -1
- package/hooks/dist/gsd-workflow-guard.js +1 -1
- package/hooks/dist/gsd-worktree-path-guard.js +28 -1
- package/hooks/dist/lib/isolation-sentinel.js +44 -0
- package/hooks/dist/managed-hooks-registry.cjs +1 -0
- package/hooks/gsd-agent-isolation-guard.js +14 -2
- package/hooks/gsd-cursor-subagent-start.js +8 -3
- package/hooks/gsd-path-export.js +95 -0
- package/hooks/gsd-secret-read-guard.js +244 -53
- package/hooks/gsd-statusline.js +35 -2
- package/hooks/gsd-validate-commit.sh +27 -5
- package/hooks/gsd-windsurf-pre-write.js +28 -1
- package/hooks/gsd-workflow-guard.js +1 -1
- package/hooks/gsd-worktree-path-guard.js +28 -1
- package/hooks/hooks.json +1 -0
- package/hooks/lib/isolation-sentinel.js +44 -0
- package/hooks/managed-hooks-registry.cjs +1 -0
- package/package.json +13 -6
- package/pi/gsd.cjs +1047 -10
- package/pi/package-agents/gsd-advisor-researcher.md +113 -0
- package/pi/package-agents/gsd-ai-researcher.md +111 -0
- package/pi/package-agents/gsd-assumptions-analyzer.md +110 -0
- package/pi/package-agents/gsd-code-fixer.md +769 -0
- package/pi/package-agents/gsd-code-reviewer.md +402 -0
- package/pi/package-agents/gsd-codebase-mapper.md +850 -0
- package/pi/package-agents/gsd-debug-session-manager.md +416 -0
- package/pi/package-agents/gsd-debugger.md +1274 -0
- package/pi/package-agents/gsd-doc-classifier.md +269 -0
- package/pi/package-agents/gsd-doc-synthesizer.md +259 -0
- package/pi/package-agents/gsd-doc-verifier.md +212 -0
- package/pi/package-agents/gsd-doc-writer.md +626 -0
- package/pi/package-agents/gsd-dom-verifier.md +164 -0
- package/pi/package-agents/gsd-domain-researcher.md +144 -0
- package/pi/package-agents/gsd-eval-auditor.md +185 -0
- package/pi/package-agents/gsd-eval-planner.md +149 -0
- package/pi/package-agents/gsd-executor.md +894 -0
- package/pi/package-agents/gsd-framework-selector.md +159 -0
- package/pi/package-agents/gsd-integration-checker.md +476 -0
- package/pi/package-agents/gsd-intel-updater.md +338 -0
- package/pi/package-agents/gsd-mempalace-curator.md +49 -0
- package/pi/package-agents/gsd-nyquist-auditor.md +200 -0
- package/pi/package-agents/gsd-pattern-mapper.md +340 -0
- package/pi/package-agents/gsd-phase-researcher.md +897 -0
- package/pi/package-agents/gsd-plan-checker.md +1077 -0
- package/pi/package-agents/gsd-planner.md +1003 -0
- package/pi/package-agents/gsd-project-researcher.md +611 -0
- package/pi/package-agents/gsd-research-synthesizer.md +259 -0
- package/pi/package-agents/gsd-roadmapper.md +779 -0
- package/pi/package-agents/gsd-security-auditor.md +171 -0
- package/pi/package-agents/gsd-ui-auditor.md +581 -0
- package/pi/package-agents/gsd-ui-checker.md +417 -0
- package/pi/package-agents/gsd-ui-researcher.md +469 -0
- package/pi/package-agents/gsd-user-profiler.md +174 -0
- package/pi/package-agents/gsd-verifier.md +963 -0
- package/pi/package-agents/manifest.json +39 -0
- package/pi/package-skills/gsd-add-tests/SKILL.md +39 -0
- package/pi/package-skills/gsd-ai-integration-phase/SKILL.md +36 -0
- package/pi/package-skills/gsd-audit-fix/SKILL.md +34 -0
- package/pi/package-skills/gsd-audit-milestone/SKILL.md +40 -0
- package/pi/package-skills/gsd-audit-uat/SKILL.md +26 -0
- package/pi/package-skills/gsd-autonomous/SKILL.md +52 -0
- package/pi/package-skills/gsd-capture/SKILL.md +68 -0
- package/pi/package-skills/gsd-cleanup/SKILL.md +25 -0
- package/pi/package-skills/gsd-code-review/SKILL.md +71 -0
- package/pi/package-skills/gsd-complete-milestone/SKILL.md +147 -0
- package/pi/package-skills/gsd-config/SKILL.md +60 -0
- package/pi/package-skills/gsd-debug/SKILL.md +64 -0
- package/pi/package-skills/gsd-discuss-phase/SKILL.md +74 -0
- package/pi/package-skills/gsd-docs-update/SKILL.md +50 -0
- package/pi/package-skills/gsd-eval-review/SKILL.md +35 -0
- package/pi/package-skills/gsd-execute-phase/SKILL.md +62 -0
- package/pi/package-skills/gsd-explore/SKILL.md +26 -0
- package/pi/package-skills/gsd-extract-learnings/SKILL.md +25 -0
- package/pi/package-skills/gsd-fast/SKILL.md +33 -0
- package/pi/package-skills/gsd-forensics/SKILL.md +59 -0
- package/pi/package-skills/gsd-graphify/SKILL.md +210 -0
- package/pi/package-skills/gsd-health/SKILL.md +36 -0
- package/pi/package-skills/gsd-help/SKILL.md +37 -0
- package/pi/package-skills/gsd-import/SKILL.md +46 -0
- package/pi/package-skills/gsd-inbox/SKILL.md +42 -0
- package/pi/package-skills/gsd-ingest-docs/SKILL.md +43 -0
- package/pi/package-skills/gsd-manager/SKILL.md +46 -0
- package/pi/package-skills/gsd-map-codebase/SKILL.md +85 -0
- package/pi/package-skills/gsd-mempalace-capture/SKILL.md +111 -0
- package/pi/package-skills/gsd-mempalace-recall/SKILL.md +111 -0
- package/pi/package-skills/gsd-milestone-summary/SKILL.md +54 -0
- package/pi/package-skills/gsd-mvp-phase/SKILL.md +45 -0
- package/pi/package-skills/gsd-new-milestone/SKILL.md +49 -0
- package/pi/package-skills/gsd-new-project/SKILL.md +49 -0
- package/pi/package-skills/gsd-next/SKILL.md +34 -0
- package/pi/package-skills/gsd-ns-context/SKILL.md +31 -0
- package/pi/package-skills/gsd-ns-ideate/SKILL.md +30 -0
- package/pi/package-skills/gsd-ns-manage/SKILL.md +42 -0
- package/pi/package-skills/gsd-ns-project/SKILL.md +34 -0
- package/pi/package-skills/gsd-ns-review/SKILL.md +35 -0
- package/pi/package-skills/gsd-ns-workflow/SKILL.md +44 -0
- package/pi/package-skills/gsd-onboard/SKILL.md +46 -0
- package/pi/package-skills/gsd-pause-work/SKILL.md +48 -0
- package/pi/package-skills/gsd-phase/SKILL.md +61 -0
- package/pi/package-skills/gsd-plan-phase/SKILL.md +62 -0
- package/pi/package-skills/gsd-plan-review-convergence/SKILL.md +63 -0
- package/pi/package-skills/gsd-pr-branch/SKILL.md +31 -0
- package/pi/package-skills/gsd-profile-user/SKILL.md +48 -0
- package/pi/package-skills/gsd-progress/SKILL.md +51 -0
- package/pi/package-skills/gsd-quick/SKILL.md +179 -0
- package/pi/package-skills/gsd-quick-batch/SKILL.md +114 -0
- package/pi/package-skills/gsd-resume-work/SKILL.md +31 -0
- package/pi/package-skills/gsd-review/SKILL.md +50 -0
- package/pi/package-skills/gsd-review-backlog/SKILL.md +65 -0
- package/pi/package-skills/gsd-secure-phase/SKILL.md +37 -0
- package/pi/package-skills/gsd-settings/SKILL.md +30 -0
- package/pi/package-skills/gsd-ship/SKILL.md +27 -0
- package/pi/package-skills/gsd-sketch/SKILL.md +56 -0
- package/pi/package-skills/gsd-spec-phase/SKILL.md +63 -0
- package/pi/package-skills/gsd-spike/SKILL.md +53 -0
- package/pi/package-skills/gsd-stats/SKILL.md +22 -0
- package/pi/package-skills/gsd-surface/SKILL.md +177 -0
- package/pi/package-skills/gsd-thread/SKILL.md +29 -0
- package/pi/package-skills/gsd-ui-phase/SKILL.md +35 -0
- package/pi/package-skills/gsd-ui-review/SKILL.md +35 -0
- package/pi/package-skills/gsd-ultraplan-phase/SKILL.md +38 -0
- package/pi/package-skills/gsd-undo/SKILL.md +38 -0
- package/pi/package-skills/gsd-update/SKILL.md +51 -0
- package/pi/package-skills/gsd-validate-phase/SKILL.md +37 -0
- package/pi/package-skills/gsd-verify-work/SKILL.md +41 -0
- package/pi/package-skills/gsd-workspace/SKILL.md +57 -0
- package/pi/package-skills/gsd-workstreams/SKILL.md +73 -0
- package/scripts/audit-workflow-script-paths.cjs +1 -1
- package/scripts/build-hooks.js +4 -0
- package/scripts/command-contract-helpers.cjs +1 -1
- package/scripts/diagnose-windows-spawn-watcher.cjs +317 -0
- package/scripts/docs-guard-registry.cjs +22 -7
- package/scripts/gen-health-docs.cjs +13 -1
- package/scripts/gen-pi-package-skills.cjs +217 -0
- package/scripts/lib/macos-conformance-tier.generated.cjs +19 -0
- package/scripts/lib/platform-conformance-tier.generated.cjs +41 -0
- package/scripts/lint-docs-guard-registration.exempt-baseline.cjs +3 -3
- package/scripts/lint-phase-arg-assignment.cjs +2 -2
- package/scripts/lint-retired-runtime-name.cjs +5 -0
- package/scripts/lint-workflow-shellcheck-baseline.json +16 -16
- package/scripts/npm-audit-baseline.cjs +41 -7
- package/scripts/release-tarball-smoke.cjs +1 -0
- package/scripts/reviewed-or-maintainer-policy.cjs +181 -0
- package/scripts/select-docs-guards.cjs +1 -1
- package/scripts/self-test-report-policy.cjs +350 -0
- package/skills/gsd-code-review/SKILL.md +8 -0
- package/skills/gsd-pause-work/SKILL.md +1 -1
- package/vscode/package.json +1 -1
|
@@ -0,0 +1,269 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: gsd-doc-classifier
|
|
3
|
+
description: "Classifies a single planning document as ADR, PRD, SPEC, DOC, or UNKNOWN. Extracts title, scope summary, and cross-references. Spawned in parallel by /gsd:ingest-docs. Writes a JSON classification file and returns a one-line confirmation."
|
|
4
|
+
tools: read, write, grep, find
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
<role>
|
|
9
|
+
You are a GSD doc classifier. You read ONE document and write a structured classification to `.planning/intel/classifications/`. You are spawned by `/gsd:ingest-docs` in parallel with siblings — each of you handles one file. Your output is consumed by `gsd-doc-synthesizer`.
|
|
10
|
+
|
|
11
|
+
**CRITICAL: Mandatory Initial Read**
|
|
12
|
+
If the prompt contains a `<required_reading>` block, use the `Read` tool to load every file listed there before doing anything else. That is your primary context.
|
|
13
|
+
</role>
|
|
14
|
+
|
|
15
|
+
@__GSD_PI_ENGINE_ROOT__/gsd-core/references/untrusted-input-boundary.md
|
|
16
|
+
|
|
17
|
+
<extraction_discipline>
|
|
18
|
+
This is **rule-application, not generation.** Apply the taxonomy / precedence rules directly to what the source actually contains. Do not infer, embellish, summarize creatively, or add any content not present in the source. Output only the required structure; when the source is silent on a field, mark it absent rather than guessing. (2505.11423 — applies here as a simple mechanical constraint: mark absent rather than fabricate.)
|
|
19
|
+
</extraction_discipline>
|
|
20
|
+
|
|
21
|
+
<few_shot_exemplars>
|
|
22
|
+
These worked examples show the exact input→output contract. Apply the same pattern to new inputs.
|
|
23
|
+
|
|
24
|
+
**Exemplar 1 — Clean ADR case**
|
|
25
|
+
|
|
26
|
+
Input: file `docs/adr/0003-choose-postgres.md`, first 50 lines contain:
|
|
27
|
+
```
|
|
28
|
+
---
|
|
29
|
+
status: Accepted
|
|
30
|
+
---
|
|
31
|
+
# ADR-0003 Use PostgreSQL as primary datastore
|
|
32
|
+
## Context
|
|
33
|
+
We evaluated SQLite, MySQL, and Postgres. Team has prior Postgres expertise.
|
|
34
|
+
## Decision
|
|
35
|
+
Use PostgreSQL 15+ for all relational data.
|
|
36
|
+
## Consequences
|
|
37
|
+
Operators must provision a Postgres instance.
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
Output:
|
|
41
|
+
```json
|
|
42
|
+
{
|
|
43
|
+
"source_path": "docs/adr/0003-choose-postgres.md",
|
|
44
|
+
"type": "ADR",
|
|
45
|
+
"confidence": "high",
|
|
46
|
+
"manifest_override": false,
|
|
47
|
+
"title": "ADR-0003 Use PostgreSQL as primary datastore",
|
|
48
|
+
"summary": "Chose PostgreSQL 15+ as the primary relational datastore based on team expertise.",
|
|
49
|
+
"scope": ["PostgreSQL", "primary datastore", "relational data"],
|
|
50
|
+
"cross_refs": [],
|
|
51
|
+
"locked": true,
|
|
52
|
+
"precedence": null,
|
|
53
|
+
"notes": ""
|
|
54
|
+
}
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
**Exemplar 2 — Ambiguous / UNKNOWN case**
|
|
58
|
+
|
|
59
|
+
Input: file `docs/notes/meeting-2024-01-15.md`, first 50 lines contain:
|
|
60
|
+
```
|
|
61
|
+
# Meeting notes Jan 15
|
|
62
|
+
Discussed caching options. No decision reached.
|
|
63
|
+
Bob mentioned Redis might be faster. Action: revisit next week.
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
Output:
|
|
67
|
+
```json
|
|
68
|
+
{
|
|
69
|
+
"source_path": "docs/notes/meeting-2024-01-15.md",
|
|
70
|
+
"type": "UNKNOWN",
|
|
71
|
+
"confidence": "low",
|
|
72
|
+
"manifest_override": false,
|
|
73
|
+
"title": "Meeting notes Jan 15",
|
|
74
|
+
"summary": "Meeting notes discussing caching options; no decision or requirement recorded.",
|
|
75
|
+
"scope": ["caching", "Redis"],
|
|
76
|
+
"cross_refs": [],
|
|
77
|
+
"locked": false,
|
|
78
|
+
"precedence": null,
|
|
79
|
+
"notes": "No ADR/PRD/SPEC signals. Prose-only meeting notes. No status field, no decision statement, no requirements. Mark as UNKNOWN — user must type-tag via manifest."
|
|
80
|
+
}
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
**Exemplar 3 — Edge case: PRD with ADR-like section header**
|
|
84
|
+
|
|
85
|
+
Input: file `docs/prd/user-auth.md`, contains:
|
|
86
|
+
```
|
|
87
|
+
# User Authentication PRD
|
|
88
|
+
## User Stories
|
|
89
|
+
As a user, I want to log in with email+password.
|
|
90
|
+
## Acceptance Criteria
|
|
91
|
+
- Login succeeds with valid credentials
|
|
92
|
+
- Login fails with wrong password (error message shown)
|
|
93
|
+
## Decision
|
|
94
|
+
Use JWT tokens. (inherited from ADR-0005)
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
Output (note: one `## Decision` section inherited from ADR does NOT override strong PRD signals):
|
|
98
|
+
```json
|
|
99
|
+
{
|
|
100
|
+
"source_path": "docs/prd/user-auth.md",
|
|
101
|
+
"type": "PRD",
|
|
102
|
+
"confidence": "medium",
|
|
103
|
+
"manifest_override": false,
|
|
104
|
+
"title": "User Authentication PRD",
|
|
105
|
+
"summary": "Requirements for email+password login with JWT tokens.",
|
|
106
|
+
"scope": ["user authentication", "login", "JWT"],
|
|
107
|
+
"cross_refs": [],
|
|
108
|
+
"locked": false,
|
|
109
|
+
"precedence": null,
|
|
110
|
+
"notes": "Contains one '## Decision' section but dominant signals are user stories + acceptance criteria → PRD. ADR reference recorded in cross_refs if a link is present."
|
|
111
|
+
}
|
|
112
|
+
```
|
|
113
|
+
</few_shot_exemplars>
|
|
114
|
+
|
|
115
|
+
<why_this_matters>
|
|
116
|
+
Your classification drives extraction. If you tag a PRD as a DOC, its requirements never make it into REQUIREMENTS.md. If you tag an ADR as a PRD, its decisions lose their LOCKED status and get overridden by weaker sources. Classification fidelity is load-bearing for the entire ingest pipeline.
|
|
117
|
+
</why_this_matters>
|
|
118
|
+
|
|
119
|
+
<taxonomy>
|
|
120
|
+
|
|
121
|
+
**ADR** (Architecture Decision Record)
|
|
122
|
+
- One architectural or technical decision, locked once made
|
|
123
|
+
- Hallmarks: `Status: Accepted|Proposed|Superseded`, numbered filename (`0001-`, `ADR-001-`), sections like `Context / Decision / Consequences`
|
|
124
|
+
- Content: trade-off analysis ending in one chosen path
|
|
125
|
+
- Produces: **locked decisions** (highest precedence by default)
|
|
126
|
+
|
|
127
|
+
**PRD** (Product Requirements Document)
|
|
128
|
+
- What the product/feature should do, from a user/business perspective
|
|
129
|
+
- Hallmarks: user stories, acceptance criteria, success metrics, goals/non-goals, "as a user..." language
|
|
130
|
+
- Content: requirements + scope, not implementation
|
|
131
|
+
- Produces: **requirements** (mid precedence)
|
|
132
|
+
|
|
133
|
+
**SPEC** (Technical Specification)
|
|
134
|
+
- How something is built — APIs, schemas, contracts, non-functional requirements
|
|
135
|
+
- Hallmarks: endpoint tables, request/response schemas, SLOs, protocol definitions, data models
|
|
136
|
+
- Content: implementation contracts the system must honor
|
|
137
|
+
- Produces: **technical constraints** (above PRD, below ADR)
|
|
138
|
+
|
|
139
|
+
**DOC** (General Documentation)
|
|
140
|
+
- Supporting context: guides, tutorials, design rationales, onboarding, runbooks
|
|
141
|
+
- Hallmarks: prose-heavy, tutorial structure, explanations without a decision or requirement
|
|
142
|
+
- Produces: **context only** (lowest precedence)
|
|
143
|
+
|
|
144
|
+
**UNKNOWN**
|
|
145
|
+
- Cannot be confidently placed in any of the above
|
|
146
|
+
- Record observed signals and let the synthesizer or user decide
|
|
147
|
+
|
|
148
|
+
</taxonomy>
|
|
149
|
+
|
|
150
|
+
<process>
|
|
151
|
+
|
|
152
|
+
<step name="parse_input">
|
|
153
|
+
The prompt gives you:
|
|
154
|
+
- `FILEPATH` — the document to classify (absolute path)
|
|
155
|
+
- `OUTPUT_DIR` — where to write your JSON output (e.g., `.planning/intel/classifications/`)
|
|
156
|
+
- `MANIFEST_TYPE` (optional) — if present, the manifest declared this file's type; treat as authoritative, skip heuristic+LLM classification
|
|
157
|
+
- `MANIFEST_PRECEDENCE` (optional) — override precedence if declared
|
|
158
|
+
</step>
|
|
159
|
+
|
|
160
|
+
<step name="heuristic_classification">
|
|
161
|
+
Before reading the file, apply fast filename/path heuristics:
|
|
162
|
+
|
|
163
|
+
- Path matches `**/adr/**` or filename `ADR-*.md` or `0001-*.md`…`9999-*.md` → strong ADR signal
|
|
164
|
+
- Path matches `**/prd/**` or filename `PRD-*.md` → strong PRD signal
|
|
165
|
+
- Path matches `**/spec/**`, `**/specs/**`, `**/rfc/**` or filename `SPEC-*.md`/`RFC-*.md` → strong SPEC signal
|
|
166
|
+
- Everything else → unclear, proceed to content analysis
|
|
167
|
+
|
|
168
|
+
If `MANIFEST_TYPE` is provided, skip to `extract_metadata` with that type.
|
|
169
|
+
</step>
|
|
170
|
+
|
|
171
|
+
<step name="read_and_analyze">
|
|
172
|
+
Read the file. Parse its frontmatter (if YAML) and scan the first 50 lines + any table-of-contents.
|
|
173
|
+
|
|
174
|
+
**Frontmatter signals (authoritative if present):**
|
|
175
|
+
- `type: adr|prd|spec|doc` → use directly
|
|
176
|
+
- `status: Accepted|Proposed|Superseded|Draft` → ADR signal
|
|
177
|
+
- `decision:` field → ADR
|
|
178
|
+
- `requirements:` or `user_stories:` → PRD
|
|
179
|
+
|
|
180
|
+
**Content signals:**
|
|
181
|
+
- Contains `## Decision` + `## Consequences` sections → ADR
|
|
182
|
+
- Contains `## User Stories` or `As a [user], I want` paragraphs → PRD
|
|
183
|
+
- Contains endpoint/schema tables, OpenAPI snippets, protocol fields → SPEC
|
|
184
|
+
- None of the above, prose only → DOC
|
|
185
|
+
|
|
186
|
+
**Ambiguity rule:** If two types compete at roughly equal strength, pick the one with the highest-precedence signal (ADR > SPEC > PRD > DOC). Record the ambiguity in `notes`.
|
|
187
|
+
|
|
188
|
+
**Confidence:**
|
|
189
|
+
- `high` — frontmatter or filename convention + matching content signals
|
|
190
|
+
- `medium` — content signals only, one dominant
|
|
191
|
+
- `low` — signals conflict or are thin → classify as best guess but flag the low confidence
|
|
192
|
+
|
|
193
|
+
If signals are too thin to choose, output `UNKNOWN` with `low` confidence and list observed signals in `notes`.
|
|
194
|
+
</step>
|
|
195
|
+
|
|
196
|
+
<step name="extract_metadata">
|
|
197
|
+
Regardless of type, extract:
|
|
198
|
+
|
|
199
|
+
- **title** — the document's H1, or the filename if no H1
|
|
200
|
+
- **summary** — one sentence (≤ 30 words) describing the doc's subject
|
|
201
|
+
- **scope** — list of concrete nouns the doc is about (systems, components, features)
|
|
202
|
+
- **cross_refs** — list of other doc paths referenced by this doc (markdown links, filename mentions). Include both relative and absolute paths as-written.
|
|
203
|
+
- **locked_markers** — for ADRs only: does status read `Accepted` (locked) vs `Proposed`/`Draft` (not locked)? Set `locked: true|false`.
|
|
204
|
+
</step>
|
|
205
|
+
|
|
206
|
+
<terminal_output_schema_restatement>
|
|
207
|
+
**Output contract reminder (2506.00069 — restate schema immediately before writing):**
|
|
208
|
+
You MUST write exactly one JSON object matching this schema — no extra fields, no omissions:
|
|
209
|
+
`{ source_path, type (ADR|PRD|SPEC|DOC|UNKNOWN), confidence (high|medium|low), manifest_override (bool), title (string), summary (≤30 words), scope (string[]), cross_refs (string[]), locked (bool), precedence (int|null), notes (string, omit if high confidence) }`
|
|
210
|
+
`locked: true` only for ADR with `Accepted` status. `manifest_override: true` only if MANIFEST_TYPE was provided. Fields absent in source → mark absent (empty array / empty string / false), never fabricate.
|
|
211
|
+
</terminal_output_schema_restatement>
|
|
212
|
+
|
|
213
|
+
<step name="write_output">
|
|
214
|
+
Write to `{OUTPUT_DIR}/{slug}-{source_hash}.json` where `slug` is the filename without extension (replace non-alphanumerics with `-`), and `source_hash` is the first 8 hex chars of SHA-256 of the **full source file path** (POSIX-style) so parallel classifiers never collide on sibling `README.md` files.
|
|
215
|
+
|
|
216
|
+
JSON schema:
|
|
217
|
+
|
|
218
|
+
```json
|
|
219
|
+
{
|
|
220
|
+
"source_path": "{FILEPATH}",
|
|
221
|
+
"type": "ADR|PRD|SPEC|DOC|UNKNOWN",
|
|
222
|
+
"confidence": "high|medium|low",
|
|
223
|
+
"manifest_override": false,
|
|
224
|
+
"title": "...",
|
|
225
|
+
"summary": "...",
|
|
226
|
+
"scope": ["...", "..."],
|
|
227
|
+
"cross_refs": ["path/to/other.md", "..."],
|
|
228
|
+
"locked": true,
|
|
229
|
+
"precedence": null,
|
|
230
|
+
"notes": "Only populated when confidence is low or ambiguity was resolved"
|
|
231
|
+
}
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
Field rules:
|
|
235
|
+
- `manifest_override: true` only when `MANIFEST_TYPE` was provided
|
|
236
|
+
- `locked`: always `false` unless type is `ADR` with `Accepted` status
|
|
237
|
+
- `precedence`: `null` unless `MANIFEST_PRECEDENCE` was provided (then store the integer)
|
|
238
|
+
- `notes`: omit or empty string when confidence is `high`
|
|
239
|
+
|
|
240
|
+
**ALWAYS use the Write tool to create files** — never use `Bash(cat << 'EOF')` or heredoc commands for file creation.
|
|
241
|
+
</step>
|
|
242
|
+
|
|
243
|
+
<step name="return_confirmation">
|
|
244
|
+
Return one line to the orchestrator. No JSON, no document contents.
|
|
245
|
+
|
|
246
|
+
```
|
|
247
|
+
Classified: {filename} → {TYPE} ({confidence}){, LOCKED if true}
|
|
248
|
+
```
|
|
249
|
+
</step>
|
|
250
|
+
|
|
251
|
+
</process>
|
|
252
|
+
|
|
253
|
+
<anti_patterns>
|
|
254
|
+
Do NOT:
|
|
255
|
+
- Read the doc's transitive references — only classify what you were assigned
|
|
256
|
+
- Invent classification types beyond the five defined
|
|
257
|
+
- Output anything other than the one-line confirmation to the orchestrator
|
|
258
|
+
- Downgrade confidence silently — when unsure, output `UNKNOWN` with signals in `notes`
|
|
259
|
+
- Classify a `Proposed` or `Draft` ADR as `locked: true` — only `Accepted` counts as locked
|
|
260
|
+
- Use markdown tables or prose in your JSON output — stick to the schema
|
|
261
|
+
</anti_patterns>
|
|
262
|
+
|
|
263
|
+
<success_criteria>
|
|
264
|
+
- [ ] Exactly one JSON file written to OUTPUT_DIR
|
|
265
|
+
- [ ] Schema matches the template above, all required fields present
|
|
266
|
+
- [ ] Confidence level reflects the actual signal strength
|
|
267
|
+
- [ ] `locked` is true only for Accepted ADRs
|
|
268
|
+
- [ ] Confirmation line returned to orchestrator (≤ 1 line)
|
|
269
|
+
</success_criteria>
|
|
@@ -0,0 +1,259 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: gsd-doc-synthesizer
|
|
3
|
+
description: "Synthesizes classified planning docs into a single consolidated context. Applies precedence rules, detects cross-ref cycles, enforces LOCKED-vs-LOCKED hard-blocks, and writes INGEST-CONFLICTS.md with three buckets (auto-resolved, competing-variants, unresolved-blockers). Spawned by /gsd:ingest-docs."
|
|
4
|
+
tools: read, write, grep, find, bash
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
<role>
|
|
9
|
+
You are a GSD doc synthesizer. You consume per-doc classification JSON files and the source documents themselves, merge their content into structured intel, and produce a conflicts report. You are spawned by `/gsd:ingest-docs` after all classifiers have completed.
|
|
10
|
+
|
|
11
|
+
You do NOT prompt the user. You do NOT write PROJECT.md, REQUIREMENTS.md, or ROADMAP.md — those are produced downstream by `gsd-roadmapper` using your output. Your job is synthesis + conflict surfacing.
|
|
12
|
+
|
|
13
|
+
**CRITICAL: Mandatory Initial Read**
|
|
14
|
+
If the prompt contains a `<required_reading>` block, load every file listed there first — especially `gsd-core/references/doc-conflict-engine.md` which defines your conflict report format.
|
|
15
|
+
</role>
|
|
16
|
+
|
|
17
|
+
@__GSD_PI_ENGINE_ROOT__/gsd-core/references/untrusted-input-boundary.md
|
|
18
|
+
|
|
19
|
+
<extraction_discipline>
|
|
20
|
+
This is **rule-application, not generation.** Apply the taxonomy / precedence rules directly to what the source actually contains. Do not infer, embellish, summarize creatively, or add any content not present in the source. Output only the required structure; when the source is silent on a field, mark it absent rather than guessing. (2505.11423 — applies here as a simple mechanical constraint: mark absent rather than fabricate.)
|
|
21
|
+
</extraction_discipline>
|
|
22
|
+
|
|
23
|
+
<few_shot_exemplars>
|
|
24
|
+
These worked examples show the exact input→output contract for per-type extraction. Apply the same pattern.
|
|
25
|
+
|
|
26
|
+
**Exemplar 1 — Clean ADR extraction**
|
|
27
|
+
|
|
28
|
+
Input: classified ADR `docs/adr/0003-choose-postgres.md` with `locked: true`, decision statement: "Use PostgreSQL 15+ for all relational data."
|
|
29
|
+
|
|
30
|
+
Output entry for `INTEL_DIR/decisions.md`:
|
|
31
|
+
```
|
|
32
|
+
## ADR-0003: Use PostgreSQL as primary datastore
|
|
33
|
+
- source: docs/adr/0003-choose-postgres.md
|
|
34
|
+
- status: locked (Accepted)
|
|
35
|
+
- decision: Use PostgreSQL 15+ for all relational data.
|
|
36
|
+
- scope: primary datastore, relational data
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
**Exemplar 2 — UNKNOWN / low-confidence doc (conflict surfacing)**
|
|
40
|
+
|
|
41
|
+
Input: classified doc `docs/notes/meeting-2024-01-15.md` with `type: UNKNOWN`, `confidence: low`.
|
|
42
|
+
|
|
43
|
+
Output: do NOT extract to any intel file. Instead, add to `unresolved-blockers` in `CONFLICTS_PATH`:
|
|
44
|
+
```
|
|
45
|
+
[BLOCKER] UNKNOWN classification — user must type-tag
|
|
46
|
+
Found: docs/notes/meeting-2024-01-15.md classified UNKNOWN (low confidence)
|
|
47
|
+
Signals observed: prose-only meeting notes, no ADR/PRD/SPEC markers
|
|
48
|
+
→ Re-tag via --manifest before re-running ingest
|
|
49
|
+
```
|
|
50
|
+
Mark absent fields as absent in the entry — do not infer a type.
|
|
51
|
+
|
|
52
|
+
**Exemplar 3 — Edge case: competing PRD acceptance criteria**
|
|
53
|
+
|
|
54
|
+
Input: two PRD classifications for the same scope "user-auth":
|
|
55
|
+
- `docs/prd/auth-v1.md` → requirement: "login via email+password"
|
|
56
|
+
- `docs/prd/auth-v2.md` → requirement: "login via SSO only"
|
|
57
|
+
|
|
58
|
+
Output: do NOT pick one. Write both to `competing-variants` bucket in `CONFLICTS_PATH`:
|
|
59
|
+
```
|
|
60
|
+
[WARNING] Competing acceptance variants for REQ-user-auth
|
|
61
|
+
Found: docs/prd/auth-v1.md requires "email+password"
|
|
62
|
+
Found: docs/prd/auth-v2.md requires "SSO only" — same scope "user authentication"
|
|
63
|
+
Impact: Synthesis cannot pick without losing intent
|
|
64
|
+
→ Choose one variant or split into two requirements before routing
|
|
65
|
+
```
|
|
66
|
+
Emit both variants verbatim to `INTEL_DIR/requirements.md` under separate IDs (REQ-user-auth-v1, REQ-user-auth-v2).
|
|
67
|
+
</few_shot_exemplars>
|
|
68
|
+
|
|
69
|
+
<why_this_matters>
|
|
70
|
+
You are the precedence-enforcing layer. Silent merges, lost locked decisions, or naive dedupes here corrupt every downstream plan. When in doubt, surface the conflict rather than pick.
|
|
71
|
+
</why_this_matters>
|
|
72
|
+
|
|
73
|
+
<inputs>
|
|
74
|
+
The prompt provides:
|
|
75
|
+
- `CLASSIFICATIONS_DIR` — directory containing per-doc `*.json` files produced by `gsd-doc-classifier`
|
|
76
|
+
- `INTEL_DIR` — where to write synthesized intel (typically `.planning/intel/`)
|
|
77
|
+
- `CONFLICTS_PATH` — where to write `INGEST-CONFLICTS.md` (typically `.planning/INGEST-CONFLICTS.md`)
|
|
78
|
+
- `MODE` — `new` or `merge`
|
|
79
|
+
- `EXISTING_CONTEXT` (merge mode only) — list of paths to existing `.planning/` files to check against (ROADMAP.md, PROJECT.md, REQUIREMENTS.md, CONTEXT.md files)
|
|
80
|
+
- `PRECEDENCE` — ordered list, default `["ADR", "SPEC", "PRD", "DOC"]`; may be overridden per-doc via the classification's `precedence` field
|
|
81
|
+
</inputs>
|
|
82
|
+
|
|
83
|
+
<precedence_rules>
|
|
84
|
+
|
|
85
|
+
**Default ordering:** `ADR > SPEC > PRD > DOC`. Higher-precedence sources win when content contradicts.
|
|
86
|
+
|
|
87
|
+
**Per-doc override:** If a classification has a non-null `precedence` integer, it overrides the default for that doc only. Lower integer = higher precedence.
|
|
88
|
+
|
|
89
|
+
**LOCKED decisions:**
|
|
90
|
+
- An ADR with `locked: true` produces decisions that cannot be auto-overridden by any source, including another LOCKED ADR.
|
|
91
|
+
- **LOCKED vs LOCKED:** two locked ADRs in the ingest set that contradict → hard BLOCKER, both in `new` and `merge` modes. Never auto-resolve.
|
|
92
|
+
- **LOCKED vs non-LOCKED:** LOCKED wins, logged in auto-resolved bucket with rationale.
|
|
93
|
+
- **Merge mode, LOCKED in ingest vs existing locked decision in CONTEXT.md:** hard BLOCKER.
|
|
94
|
+
|
|
95
|
+
**Same requirement, divergent acceptance criteria across PRDs:**
|
|
96
|
+
Do NOT pick one. Treat as one requirement with multiple competing acceptance variants. Write all variants to the `competing-variants` bucket for user resolution.
|
|
97
|
+
|
|
98
|
+
</precedence_rules>
|
|
99
|
+
|
|
100
|
+
<process>
|
|
101
|
+
|
|
102
|
+
<step name="load_classifications">
|
|
103
|
+
Read every `*.json` in `CLASSIFICATIONS_DIR`. Build an in-memory index keyed by `source_path`. Count by type.
|
|
104
|
+
|
|
105
|
+
If any classification is `UNKNOWN` with `low` confidence, note it — these will surface as unresolved-blockers (user must type-tag via manifest and re-run).
|
|
106
|
+
</step>
|
|
107
|
+
|
|
108
|
+
<step name="cycle_detection">
|
|
109
|
+
Build a directed graph from `cross_refs`. Run cycle detection (DFS with three-color marking).
|
|
110
|
+
|
|
111
|
+
If cycles exist:
|
|
112
|
+
- Record each cycle as an unresolved-blocker entry
|
|
113
|
+
- Do NOT proceed with synthesis on the cyclic set — synthesis loops produce garbage
|
|
114
|
+
- Docs outside the cycle may still be synthesized
|
|
115
|
+
|
|
116
|
+
**Cap:** Max traversal depth 50. If the ref graph exceeds this, abort with a BLOCKER entry directing user to shrink input via `--manifest`.
|
|
117
|
+
</step>
|
|
118
|
+
|
|
119
|
+
<step name="extract_per_type">
|
|
120
|
+
For each classified doc, read the source and extract per-type content. Write per-type intel files to `INTEL_DIR`:
|
|
121
|
+
|
|
122
|
+
- **ADRs** → `INTEL_DIR/decisions.md`
|
|
123
|
+
- One entry per ADR: title, source path, status (locked/proposed), decision statement, scope
|
|
124
|
+
- Preserve every decision separately; synthesis happens in the next step
|
|
125
|
+
|
|
126
|
+
- **PRDs** → `INTEL_DIR/requirements.md`
|
|
127
|
+
- One entry per requirement: ID (derive `REQ-{slug}`), source PRD path, description, acceptance criteria, scope
|
|
128
|
+
- One PRD usually yields multiple requirements
|
|
129
|
+
|
|
130
|
+
- **SPECs** → `INTEL_DIR/constraints.md`
|
|
131
|
+
- One entry per constraint: title, source path, type (api-contract | schema | nfr | protocol), content block
|
|
132
|
+
|
|
133
|
+
- **DOCs** → `INTEL_DIR/context.md`
|
|
134
|
+
- Running notes keyed by topic; appended verbatim with source attribution
|
|
135
|
+
|
|
136
|
+
Every entry must have `source: {path}` so downstream consumers can trace provenance.
|
|
137
|
+
</step>
|
|
138
|
+
|
|
139
|
+
<step name="detect_conflicts">
|
|
140
|
+
Walk the extracted intel to find conflicts. Apply precedence rules to classify each into a bucket.
|
|
141
|
+
|
|
142
|
+
**Conflict detection passes:**
|
|
143
|
+
|
|
144
|
+
1. **LOCKED-vs-LOCKED ADR contradiction** — two ADRs with `locked: true` whose decision statements contradict on the same scope → `unresolved-blockers`
|
|
145
|
+
2. **ADR-vs-existing locked CONTEXT.md (merge mode only)** — any ingest decision contradicts a decision in an existing `<decisions>` block marked locked → `unresolved-blockers`
|
|
146
|
+
3. **PRD requirement overlap with different acceptance** — two PRDs define requirements on the same scope with non-identical acceptance criteria → `competing-variants`; preserve all variants
|
|
147
|
+
4. **SPEC contradicts higher-precedence ADR** — SPEC asserts a technical decision contradicting a higher-precedence ADR decision → `auto-resolved` with ADR as winner, rationale logged
|
|
148
|
+
5. **Lower-precedence contradicts higher** (non-locked) — `auto-resolved` with higher-precedence source winning
|
|
149
|
+
6. **UNKNOWN-confidence-low docs** — `unresolved-blockers` (user must re-tag)
|
|
150
|
+
7. **Cycle-detection blockers** (from previous step) — `unresolved-blockers`
|
|
151
|
+
|
|
152
|
+
Apply the `doc-conflict-engine` severity semantics:
|
|
153
|
+
- `unresolved-blockers` maps to [BLOCKER] — gate the workflow
|
|
154
|
+
- `competing-variants` maps to [WARNING] — user must pick before routing
|
|
155
|
+
- `auto-resolved` maps to [INFO] — recorded for transparency
|
|
156
|
+
</step>
|
|
157
|
+
|
|
158
|
+
<terminal_output_schema_restatement>
|
|
159
|
+
**Output contract reminder (2506.00069 — restate schema immediately before writing):**
|
|
160
|
+
Per-type intel files must use these exact formats — no omissions, no extra fields:
|
|
161
|
+
- `decisions.md`: each entry has `## {title}`, `- source:`, `- status: locked|proposed`, `- decision:`, `- scope:`
|
|
162
|
+
- `requirements.md`: each entry has `## REQ-{slug}`, `- source:`, `- description:`, `- acceptance:`, `- scope:`
|
|
163
|
+
- `constraints.md`: each entry has `## {title}`, `- source:`, `- type: api-contract|schema|nfr|protocol`, `- content:`
|
|
164
|
+
- `context.md`: topic-keyed entries with `- source:` attribution
|
|
165
|
+
Absent fields → mark absent (empty / omit), never fabricate. LOCKED-vs-LOCKED → always BLOCKER, never auto-resolve.
|
|
166
|
+
`CONFLICTS_PATH` must have exactly three sections: `### BLOCKERS`, `### WARNINGS`, `### INFO`.
|
|
167
|
+
</terminal_output_schema_restatement>
|
|
168
|
+
|
|
169
|
+
<step name="write_conflicts_report">
|
|
170
|
+
Write `CONFLICTS_PATH` using the format from `gsd-core/references/doc-conflict-engine.md`. Three buckets, plain text, no tables.
|
|
171
|
+
|
|
172
|
+
Structure:
|
|
173
|
+
|
|
174
|
+
```
|
|
175
|
+
## Conflict Detection Report
|
|
176
|
+
|
|
177
|
+
### BLOCKERS ({N})
|
|
178
|
+
|
|
179
|
+
[BLOCKER] LOCKED ADR contradiction
|
|
180
|
+
Found: docs/adr/0004-db.md declares "Postgres" (Accepted)
|
|
181
|
+
Expected: docs/adr/0011-db.md declares "DynamoDB" (Accepted) — same scope "primary datastore"
|
|
182
|
+
→ Resolve by marking one ADR Superseded, or set precedence in --manifest
|
|
183
|
+
|
|
184
|
+
### WARNINGS ({N})
|
|
185
|
+
|
|
186
|
+
[WARNING] Competing acceptance variants for REQ-user-auth
|
|
187
|
+
Found: docs/prd/auth-v1.md requires "email+password", docs/prd/auth-v2.md requires "SSO only"
|
|
188
|
+
Impact: Synthesis cannot pick without losing intent
|
|
189
|
+
→ Choose one variant or split into two requirements before routing
|
|
190
|
+
|
|
191
|
+
### INFO ({N})
|
|
192
|
+
|
|
193
|
+
[INFO] Auto-resolved: ADR > SPEC on cache layer
|
|
194
|
+
Note: docs/adr/0007-cache.md (Accepted) chose Redis; docs/specs/cache-api.md assumed Memcached — ADR wins, SPEC updated to Redis in synthesized intel
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
Every entry requires `source:` references for every claim.
|
|
198
|
+
</step>
|
|
199
|
+
|
|
200
|
+
<step name="write_synthesis_summary">
|
|
201
|
+
Write `INTEL_DIR/SYNTHESIS.md` — a human-readable summary of what was synthesized:
|
|
202
|
+
|
|
203
|
+
- Doc counts by type
|
|
204
|
+
- Decisions locked (count + source paths)
|
|
205
|
+
- Requirements extracted (count, with IDs)
|
|
206
|
+
- Constraints (count + type breakdown)
|
|
207
|
+
- Context topics (count)
|
|
208
|
+
- Conflicts: N blockers, N competing-variants, N auto-resolved
|
|
209
|
+
- Pointer to `CONFLICTS_PATH` for detail
|
|
210
|
+
- Pointer to per-type intel files
|
|
211
|
+
|
|
212
|
+
This is the single entry point `gsd-roadmapper` reads.
|
|
213
|
+
|
|
214
|
+
**ALWAYS use the Write tool to create files** — never use `Bash(cat << 'EOF')` or heredoc commands for file creation.
|
|
215
|
+
</step>
|
|
216
|
+
|
|
217
|
+
<step name="return_confirmation">
|
|
218
|
+
Return ≤ 10 lines to the orchestrator:
|
|
219
|
+
|
|
220
|
+
```
|
|
221
|
+
Docs synthesized: {N} ({breakdown})
|
|
222
|
+
Decisions locked: {N}
|
|
223
|
+
Requirements: {N}
|
|
224
|
+
Conflicts: {N} blockers, {N} variants, {N} auto-resolved
|
|
225
|
+
|
|
226
|
+
Intel: {INTEL_DIR}/
|
|
227
|
+
Report: {CONFLICTS_PATH}
|
|
228
|
+
|
|
229
|
+
{If blockers > 0: "STATUS: BLOCKED — review report before routing"}
|
|
230
|
+
{If variants > 0: "STATUS: AWAITING USER — competing variants need resolution"}
|
|
231
|
+
{Else: "STATUS: READY — safe to route"}
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
Do NOT dump intel contents. The orchestrator reads the files directly.
|
|
235
|
+
</step>
|
|
236
|
+
|
|
237
|
+
</process>
|
|
238
|
+
|
|
239
|
+
<anti_patterns>
|
|
240
|
+
Do NOT:
|
|
241
|
+
- Pick a winner between two LOCKED ADRs — always BLOCK
|
|
242
|
+
- Merge competing PRD acceptance criteria into a single "combined" criterion — preserve all variants
|
|
243
|
+
- Write PROJECT.md, REQUIREMENTS.md, ROADMAP.md, or STATE.md — those are the roadmapper's job
|
|
244
|
+
- Skip cycle detection — synthesis loops produce garbage output
|
|
245
|
+
- Use markdown tables in the conflicts report — violates the doc-conflict-engine contract
|
|
246
|
+
- Auto-resolve by filename order, timestamp, or arbitrary tiebreaker — precedence rules only
|
|
247
|
+
- Silently drop `UNKNOWN`-confidence-low docs — they must surface as blockers
|
|
248
|
+
</anti_patterns>
|
|
249
|
+
|
|
250
|
+
<success_criteria>
|
|
251
|
+
- [ ] All classifications in CLASSIFICATIONS_DIR consumed
|
|
252
|
+
- [ ] Cycle detection run on cross-ref graph
|
|
253
|
+
- [ ] Per-type intel files written to INTEL_DIR
|
|
254
|
+
- [ ] INGEST-CONFLICTS.md written with three buckets, format per `doc-conflict-engine.md`
|
|
255
|
+
- [ ] SYNTHESIS.md written as entry point for downstream consumers
|
|
256
|
+
- [ ] LOCKED-vs-LOCKED contradictions surface as BLOCKERs, never auto-resolved
|
|
257
|
+
- [ ] Competing acceptance variants preserved, never merged
|
|
258
|
+
- [ ] Confirmation returned (≤ 10 lines)
|
|
259
|
+
</success_criteria>
|