@opengsd/gsd-path 1.0.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/AGENTS.md +397 -0
- package/DOCS.md +341 -0
- package/FULL.md +475 -0
- package/GUIDE.md +23 -0
- package/HOOKS.md +273 -0
- package/LICENSE +21 -0
- package/MIGRATE.md +100 -0
- package/QUICK.md +146 -0
- package/README.md +280 -0
- package/RUNTIME.md +229 -0
- package/UPDATE.md +196 -0
- package/WORKFLOW.md +683 -0
- package/package.json +80 -0
- package/platforms/claude/dispatch.md +63 -0
- package/platforms/copilot/dispatch.md +61 -0
- package/platforms/cursor/agent.md +17 -0
- package/platforms/cursor/dispatch.md +63 -0
- package/platforms/grok/dispatch.md +61 -0
- package/platforms/kimi/dispatch.md +64 -0
- package/platforms/kiro/dispatch.md +58 -0
- package/platforms/opencode/dispatch.md +62 -0
- package/platforms/qwen/dispatch.md +60 -0
- package/platforms/shared-agents/dispatch.md +131 -0
- package/plugin.json +14 -0
- package/scripts/_common.py +180 -0
- package/scripts/archive_milestone.py +2265 -0
- package/scripts/bootstrap_repository.py +710 -0
- package/scripts/build_state.py +854 -0
- package/scripts/check_docs_audit.py +463 -0
- package/scripts/check_handoffs.py +1855 -0
- package/scripts/check_task_briefs.py +376 -0
- package/scripts/check_update.py +93 -0
- package/scripts/core_hook_gate.py +34 -0
- package/scripts/core_hook_settings.py +119 -0
- package/scripts/detect_project.py +1517 -0
- package/scripts/discussion_records.py +619 -0
- package/scripts/discussion_validate.py +1321 -0
- package/scripts/dispatch_driver.py +1812 -0
- package/scripts/git_guard.py +759 -0
- package/scripts/guard_hook.py +2124 -0
- package/scripts/install.mjs +3239 -0
- package/scripts/install.py +3008 -0
- package/scripts/integration.py +1433 -0
- package/scripts/isolation.py +3538 -0
- package/scripts/lean_verification.py +256 -0
- package/scripts/loop_run.py +837 -0
- package/scripts/migrate_core.py +169 -0
- package/scripts/pipeline_diagnose.py +715 -0
- package/scripts/pipeline_git.py +940 -0
- package/scripts/pipeline_state.py +2291 -0
- package/scripts/pipeline_undo.py +1039 -0
- package/scripts/promote_lookahead.py +415 -0
- package/scripts/review_findings.py +714 -0
- package/scripts/review_panel.py +553 -0
- package/scripts/skill-resources.json +340 -0
- package/scripts/state_checkpoint.py +1039 -0
- package/scripts/state_promote.py +743 -0
- package/scripts/status_runtime.py +122 -0
- package/scripts/sync_skill_resources.py +259 -0
- package/scripts/token_budget.py +146 -0
- package/scripts/wizard.mjs +179 -0
- package/scripts/workflow_run.py +117 -0
- package/skills/gsd-path/BUILD.md +700 -0
- package/skills/gsd-path/DECIDE.md +115 -0
- package/skills/gsd-path/DEFINE.md +297 -0
- package/skills/gsd-path/DOCS-AUDIT.md +190 -0
- package/skills/gsd-path/INSPECT.md +167 -0
- package/skills/gsd-path/PLAN.md +411 -0
- package/skills/gsd-path/RESEARCH.md +159 -0
- package/skills/gsd-path/ROADMAP.md +215 -0
- package/skills/gsd-path/SHIP.md +412 -0
- package/skills/gsd-path/SKILL.md +471 -0
- package/skills/gsd-path/agents/openai.yaml +6 -0
- package/skills/gsd-path/references/codebase-mapper.md +52 -0
- package/skills/gsd-path/references/coder.md +90 -0
- package/skills/gsd-path/references/decider.md +36 -0
- package/skills/gsd-path/references/dispatch.md +131 -0
- package/skills/gsd-path/references/docs-auditor.md +60 -0
- package/skills/gsd-path/references/planner.md +104 -0
- package/skills/gsd-path/references/researcher.md +42 -0
- package/skills/gsd-path/references/reviewer.md +188 -0
- package/skills/gsd-path/references/roadmapper.md +48 -0
- package/skills/gsd-path/scripts/_common.py +180 -0
- package/skills/gsd-path/scripts/archive_milestone.py +2265 -0
- package/skills/gsd-path/scripts/bootstrap_repository.py +710 -0
- package/skills/gsd-path/scripts/build_state.py +854 -0
- package/skills/gsd-path/scripts/check_docs_audit.py +463 -0
- package/skills/gsd-path/scripts/check_handoffs.py +1855 -0
- package/skills/gsd-path/scripts/check_task_briefs.py +376 -0
- package/skills/gsd-path/scripts/check_update.py +93 -0
- package/skills/gsd-path/scripts/detect_project.py +1517 -0
- package/skills/gsd-path/scripts/discussion_records.py +619 -0
- package/skills/gsd-path/scripts/discussion_validate.py +1321 -0
- package/skills/gsd-path/scripts/dispatch_driver.py +1812 -0
- package/skills/gsd-path/scripts/integration.py +1433 -0
- package/skills/gsd-path/scripts/isolation.py +3538 -0
- package/skills/gsd-path/scripts/lean_verification.py +256 -0
- package/skills/gsd-path/scripts/loop_run.py +837 -0
- package/skills/gsd-path/scripts/pipeline_git.py +940 -0
- package/skills/gsd-path/scripts/pipeline_state.py +2291 -0
- package/skills/gsd-path/scripts/promote_lookahead.py +415 -0
- package/skills/gsd-path/scripts/review_findings.py +714 -0
- package/skills/gsd-path/scripts/review_panel.py +553 -0
- package/skills/gsd-path/scripts/state_checkpoint.py +1039 -0
- package/skills/gsd-path/scripts/state_promote.py +743 -0
- package/skills/gsd-path/scripts/token_budget.py +146 -0
- package/skills/gsd-path/scripts/workflow_run.py +117 -0
- package/skills/gsd-path/templates/answers.md +29 -0
- package/skills/gsd-path/templates/archive-manifest.md +37 -0
- package/skills/gsd-path/templates/charter.md +50 -0
- package/skills/gsd-path/templates/codebase.md +46 -0
- package/skills/gsd-path/templates/dialogue.md +21 -0
- package/skills/gsd-path/templates/docs-audit.md +69 -0
- package/skills/gsd-path/templates/evidence.md +24 -0
- package/skills/gsd-path/templates/final-review.md +27 -0
- package/skills/gsd-path/templates/gap-review.md +20 -0
- package/skills/gsd-path/templates/intent.md +98 -0
- package/skills/gsd-path/templates/loop.md +59 -0
- package/skills/gsd-path/templates/patch-findings.md +16 -0
- package/skills/gsd-path/templates/plan-panel.md +25 -0
- package/skills/gsd-path/templates/plan.md +89 -0
- package/skills/gsd-path/templates/repository.md +16 -0
- package/skills/gsd-path/templates/research-handoff.md +25 -0
- package/skills/gsd-path/templates/roadmap.md +38 -0
- package/skills/gsd-path/templates/skeptic.md +36 -0
- package/skills/gsd-path/templates/state.md +27 -0
- package/skills/gsd-path/templates/synthesis.md +36 -0
- package/skills/gsd-path/templates/task.md +74 -0
- package/skills/gsd-path/templates/wave-panel.md +25 -0
- package/skills/gsd-path/templates/wave-review.md +64 -0
- package/skills/gsd-path-build/SKILL.md +700 -0
- package/skills/gsd-path-build/agents/openai.yaml +6 -0
- package/skills/gsd-path-build/references/coder.md +90 -0
- package/skills/gsd-path-build/references/dispatch.md +131 -0
- package/skills/gsd-path-build/references/reviewer.md +188 -0
- package/skills/gsd-path-build/scripts/_common.py +180 -0
- package/skills/gsd-path-build/scripts/archive_milestone.py +2265 -0
- package/skills/gsd-path-build/scripts/build_state.py +854 -0
- package/skills/gsd-path-build/scripts/check_handoffs.py +1855 -0
- package/skills/gsd-path-build/scripts/check_task_briefs.py +376 -0
- package/skills/gsd-path-build/scripts/discussion_records.py +619 -0
- package/skills/gsd-path-build/scripts/discussion_validate.py +1321 -0
- package/skills/gsd-path-build/scripts/dispatch_driver.py +1812 -0
- package/skills/gsd-path-build/scripts/integration.py +1433 -0
- package/skills/gsd-path-build/scripts/isolation.py +3538 -0
- package/skills/gsd-path-build/scripts/loop_run.py +837 -0
- package/skills/gsd-path-build/scripts/pipeline_git.py +940 -0
- package/skills/gsd-path-build/scripts/pipeline_state.py +2291 -0
- package/skills/gsd-path-build/scripts/review_findings.py +714 -0
- package/skills/gsd-path-build/scripts/review_panel.py +553 -0
- package/skills/gsd-path-build/scripts/state_checkpoint.py +1039 -0
- package/skills/gsd-path-build/scripts/state_promote.py +743 -0
- package/skills/gsd-path-build/scripts/token_budget.py +146 -0
- package/skills/gsd-path-build/scripts/workflow_run.py +117 -0
- package/skills/gsd-path-build/templates/skeptic.md +36 -0
- package/skills/gsd-path-build/templates/task.md +74 -0
- package/skills/gsd-path-build/templates/wave-panel.md +25 -0
- package/skills/gsd-path-build/templates/wave-review.md +64 -0
- package/skills/gsd-path-decide/SKILL.md +115 -0
- package/skills/gsd-path-decide/agents/openai.yaml +6 -0
- package/skills/gsd-path-decide/references/decider.md +36 -0
- package/skills/gsd-path-decide/references/dispatch.md +131 -0
- package/skills/gsd-path-decide/scripts/_common.py +180 -0
- package/skills/gsd-path-decide/scripts/check_handoffs.py +1855 -0
- package/skills/gsd-path-decide/scripts/check_task_briefs.py +376 -0
- package/skills/gsd-path-decide/scripts/discussion_records.py +619 -0
- package/skills/gsd-path-decide/scripts/isolation.py +3538 -0
- package/skills/gsd-path-decide/scripts/pipeline_git.py +940 -0
- package/skills/gsd-path-decide/scripts/pipeline_state.py +2291 -0
- package/skills/gsd-path-decide/scripts/state_checkpoint.py +1039 -0
- package/skills/gsd-path-decide/scripts/state_promote.py +743 -0
- package/skills/gsd-path-decide/templates/synthesis.md +36 -0
- package/skills/gsd-path-define/SKILL.md +297 -0
- package/skills/gsd-path-define/agents/openai.yaml +6 -0
- package/skills/gsd-path-define/scripts/_common.py +180 -0
- package/skills/gsd-path-define/scripts/check_handoffs.py +1855 -0
- package/skills/gsd-path-define/scripts/check_task_briefs.py +376 -0
- package/skills/gsd-path-define/scripts/detect_project.py +1517 -0
- package/skills/gsd-path-define/scripts/discussion_records.py +619 -0
- package/skills/gsd-path-define/scripts/isolation.py +3538 -0
- package/skills/gsd-path-define/scripts/pipeline_git.py +940 -0
- package/skills/gsd-path-define/scripts/pipeline_state.py +2291 -0
- package/skills/gsd-path-define/scripts/state_checkpoint.py +1039 -0
- package/skills/gsd-path-define/scripts/state_promote.py +743 -0
- package/skills/gsd-path-define/templates/charter.md +50 -0
- package/skills/gsd-path-define/templates/intent.md +98 -0
- package/skills/gsd-path-define/templates/state.md +27 -0
- package/skills/gsd-path-discuss/SKILL.md +162 -0
- package/skills/gsd-path-discuss/agents/openai.yaml +6 -0
- package/skills/gsd-path-discuss/scripts/_common.py +180 -0
- package/skills/gsd-path-discuss/scripts/discussion_records.py +619 -0
- package/skills/gsd-path-discuss/templates/answers.md +29 -0
- package/skills/gsd-path-discuss/templates/dialogue.md +21 -0
- package/skills/gsd-path-docs-audit/SKILL.md +190 -0
- package/skills/gsd-path-docs-audit/agents/openai.yaml +6 -0
- package/skills/gsd-path-docs-audit/references/dispatch.md +131 -0
- package/skills/gsd-path-docs-audit/references/docs-auditor.md +60 -0
- package/skills/gsd-path-docs-audit/scripts/_common.py +180 -0
- package/skills/gsd-path-docs-audit/scripts/check_docs_audit.py +463 -0
- package/skills/gsd-path-docs-audit/scripts/check_handoffs.py +1855 -0
- package/skills/gsd-path-docs-audit/scripts/check_task_briefs.py +376 -0
- package/skills/gsd-path-docs-audit/scripts/discussion_records.py +619 -0
- package/skills/gsd-path-docs-audit/scripts/isolation.py +3538 -0
- package/skills/gsd-path-docs-audit/scripts/pipeline_git.py +940 -0
- package/skills/gsd-path-docs-audit/scripts/pipeline_state.py +2291 -0
- package/skills/gsd-path-docs-audit/scripts/state_checkpoint.py +1039 -0
- package/skills/gsd-path-docs-audit/scripts/state_promote.py +743 -0
- package/skills/gsd-path-docs-audit/templates/docs-audit.md +69 -0
- package/skills/gsd-path-forensics/SKILL.md +39 -0
- package/skills/gsd-path-forensics/agents/openai.yaml +6 -0
- package/skills/gsd-path-forensics/scripts/_common.py +180 -0
- package/skills/gsd-path-forensics/scripts/discussion_records.py +619 -0
- package/skills/gsd-path-forensics/scripts/pipeline_diagnose.py +715 -0
- package/skills/gsd-path-forensics/scripts/pipeline_undo.py +1039 -0
- package/skills/gsd-path-inspect/SKILL.md +167 -0
- package/skills/gsd-path-inspect/agents/openai.yaml +6 -0
- package/skills/gsd-path-inspect/references/codebase-mapper.md +52 -0
- package/skills/gsd-path-inspect/references/dispatch.md +131 -0
- package/skills/gsd-path-inspect/references/docs-auditor.md +60 -0
- package/skills/gsd-path-inspect/scripts/_common.py +180 -0
- package/skills/gsd-path-inspect/scripts/check_docs_audit.py +463 -0
- package/skills/gsd-path-inspect/scripts/check_handoffs.py +1855 -0
- package/skills/gsd-path-inspect/scripts/check_task_briefs.py +376 -0
- package/skills/gsd-path-inspect/scripts/detect_project.py +1517 -0
- package/skills/gsd-path-inspect/scripts/discussion_records.py +619 -0
- package/skills/gsd-path-inspect/scripts/isolation.py +3538 -0
- package/skills/gsd-path-inspect/scripts/pipeline_git.py +940 -0
- package/skills/gsd-path-inspect/scripts/pipeline_state.py +2291 -0
- package/skills/gsd-path-inspect/scripts/state_checkpoint.py +1039 -0
- package/skills/gsd-path-inspect/scripts/state_promote.py +743 -0
- package/skills/gsd-path-inspect/templates/codebase.md +46 -0
- package/skills/gsd-path-inspect/templates/docs-audit.md +69 -0
- package/skills/gsd-path-inspect/templates/state.md +27 -0
- package/skills/gsd-path-loop/SKILL.md +98 -0
- package/skills/gsd-path-loop/agents/openai.yaml +6 -0
- package/skills/gsd-path-loop/examples/ci-repair.LOOP.md +61 -0
- package/skills/gsd-path-loop/scripts/_common.py +180 -0
- package/skills/gsd-path-loop/scripts/discussion_records.py +619 -0
- package/skills/gsd-path-loop/scripts/loop_run.py +837 -0
- package/skills/gsd-path-loop/templates/loop.md +59 -0
- package/skills/gsd-path-migrate/SKILL.md +134 -0
- package/skills/gsd-path-migrate/agents/openai.yaml +6 -0
- package/skills/gsd-path-migrate/scripts/core_hook_gate.py +34 -0
- package/skills/gsd-path-migrate/scripts/core_hook_settings.py +119 -0
- package/skills/gsd-path-migrate/scripts/discussion_records.py +619 -0
- package/skills/gsd-path-migrate/scripts/migrate_core.py +169 -0
- package/skills/gsd-path-plan/SKILL.md +411 -0
- package/skills/gsd-path-plan/agents/openai.yaml +6 -0
- package/skills/gsd-path-plan/references/dispatch.md +131 -0
- package/skills/gsd-path-plan/references/planner.md +104 -0
- package/skills/gsd-path-plan/scripts/_common.py +180 -0
- package/skills/gsd-path-plan/scripts/check_handoffs.py +1855 -0
- package/skills/gsd-path-plan/scripts/check_task_briefs.py +376 -0
- package/skills/gsd-path-plan/scripts/discussion_records.py +619 -0
- package/skills/gsd-path-plan/scripts/isolation.py +3538 -0
- package/skills/gsd-path-plan/scripts/pipeline_git.py +940 -0
- package/skills/gsd-path-plan/scripts/pipeline_state.py +2291 -0
- package/skills/gsd-path-plan/scripts/review_panel.py +553 -0
- package/skills/gsd-path-plan/scripts/state_checkpoint.py +1039 -0
- package/skills/gsd-path-plan/scripts/state_promote.py +743 -0
- package/skills/gsd-path-plan/scripts/workflow_run.py +117 -0
- package/skills/gsd-path-plan/templates/patch-findings.md +16 -0
- package/skills/gsd-path-plan/templates/plan-panel.md +25 -0
- package/skills/gsd-path-plan/templates/plan.md +89 -0
- package/skills/gsd-path-plan/templates/task.md +74 -0
- package/skills/gsd-path-research/SKILL.md +159 -0
- package/skills/gsd-path-research/agents/openai.yaml +6 -0
- package/skills/gsd-path-research/references/dispatch.md +131 -0
- package/skills/gsd-path-research/references/researcher.md +42 -0
- package/skills/gsd-path-research/scripts/_common.py +180 -0
- package/skills/gsd-path-research/scripts/check_handoffs.py +1855 -0
- package/skills/gsd-path-research/scripts/check_task_briefs.py +376 -0
- package/skills/gsd-path-research/scripts/discussion_records.py +619 -0
- package/skills/gsd-path-research/scripts/isolation.py +3538 -0
- package/skills/gsd-path-research/scripts/pipeline_git.py +940 -0
- package/skills/gsd-path-research/scripts/pipeline_state.py +2291 -0
- package/skills/gsd-path-research/scripts/state_checkpoint.py +1039 -0
- package/skills/gsd-path-research/scripts/state_promote.py +743 -0
- package/skills/gsd-path-research/templates/evidence.md +24 -0
- package/skills/gsd-path-research/templates/research-handoff.md +25 -0
- package/skills/gsd-path-roadmap/SKILL.md +215 -0
- package/skills/gsd-path-roadmap/agents/openai.yaml +6 -0
- package/skills/gsd-path-roadmap/references/dispatch.md +131 -0
- package/skills/gsd-path-roadmap/references/roadmapper.md +48 -0
- package/skills/gsd-path-roadmap/scripts/_common.py +180 -0
- package/skills/gsd-path-roadmap/scripts/archive_milestone.py +2265 -0
- package/skills/gsd-path-roadmap/scripts/check_handoffs.py +1855 -0
- package/skills/gsd-path-roadmap/scripts/check_task_briefs.py +376 -0
- package/skills/gsd-path-roadmap/scripts/detect_project.py +1517 -0
- package/skills/gsd-path-roadmap/scripts/discussion_records.py +619 -0
- package/skills/gsd-path-roadmap/scripts/discussion_validate.py +1321 -0
- package/skills/gsd-path-roadmap/scripts/integration.py +1433 -0
- package/skills/gsd-path-roadmap/scripts/isolation.py +3538 -0
- package/skills/gsd-path-roadmap/scripts/pipeline_git.py +940 -0
- package/skills/gsd-path-roadmap/scripts/pipeline_state.py +2291 -0
- package/skills/gsd-path-roadmap/scripts/promote_lookahead.py +415 -0
- package/skills/gsd-path-roadmap/scripts/review_panel.py +553 -0
- package/skills/gsd-path-roadmap/scripts/state_checkpoint.py +1039 -0
- package/skills/gsd-path-roadmap/scripts/state_promote.py +743 -0
- package/skills/gsd-path-roadmap/templates/roadmap.md +38 -0
- package/skills/gsd-path-ship/SKILL.md +412 -0
- package/skills/gsd-path-ship/agents/openai.yaml +6 -0
- package/skills/gsd-path-ship/references/dispatch.md +131 -0
- package/skills/gsd-path-ship/references/reviewer.md +188 -0
- package/skills/gsd-path-ship/scripts/_common.py +180 -0
- package/skills/gsd-path-ship/scripts/archive_milestone.py +2265 -0
- package/skills/gsd-path-ship/scripts/build_state.py +854 -0
- package/skills/gsd-path-ship/scripts/check_handoffs.py +1855 -0
- package/skills/gsd-path-ship/scripts/check_task_briefs.py +376 -0
- package/skills/gsd-path-ship/scripts/discussion_records.py +619 -0
- package/skills/gsd-path-ship/scripts/discussion_validate.py +1321 -0
- package/skills/gsd-path-ship/scripts/integration.py +1433 -0
- package/skills/gsd-path-ship/scripts/isolation.py +3538 -0
- package/skills/gsd-path-ship/scripts/lean_verification.py +256 -0
- package/skills/gsd-path-ship/scripts/pipeline_git.py +940 -0
- package/skills/gsd-path-ship/scripts/pipeline_state.py +2291 -0
- package/skills/gsd-path-ship/scripts/review_panel.py +553 -0
- package/skills/gsd-path-ship/scripts/state_checkpoint.py +1039 -0
- package/skills/gsd-path-ship/scripts/state_promote.py +743 -0
- package/skills/gsd-path-ship/scripts/workflow_run.py +117 -0
- package/skills/gsd-path-ship/templates/archive-manifest.md +37 -0
- package/skills/gsd-path-ship/templates/final-review.md +27 -0
- package/skills/gsd-path-ship/templates/gap-review.md +20 -0
- package/skills/gsd-path-ship/templates/patch-findings.md +16 -0
- package/skills/gsd-path-ship/templates/wave-review.md +64 -0
- package/skills/gsd-path-undo/SKILL.md +45 -0
- package/skills/gsd-path-undo/agents/openai.yaml +6 -0
- package/skills/gsd-path-undo/scripts/_common.py +180 -0
- package/skills/gsd-path-undo/scripts/discussion_records.py +619 -0
- package/skills/gsd-path-undo/scripts/pipeline_undo.py +1039 -0
- package/skills/path/BUILD.md +700 -0
- package/skills/path/DECIDE.md +115 -0
- package/skills/path/DEFINE.md +297 -0
- package/skills/path/DOCS-AUDIT.md +190 -0
- package/skills/path/INSPECT.md +167 -0
- package/skills/path/PLAN.md +411 -0
- package/skills/path/RESEARCH.md +159 -0
- package/skills/path/ROADMAP.md +215 -0
- package/skills/path/SHIP.md +412 -0
- package/skills/path/SKILL.md +471 -0
- package/skills/path/agents/openai.yaml +6 -0
- package/skills/path/references/codebase-mapper.md +52 -0
- package/skills/path/references/coder.md +90 -0
- package/skills/path/references/decider.md +36 -0
- package/skills/path/references/dispatch.md +131 -0
- package/skills/path/references/docs-auditor.md +60 -0
- package/skills/path/references/planner.md +104 -0
- package/skills/path/references/researcher.md +42 -0
- package/skills/path/references/reviewer.md +188 -0
- package/skills/path/references/roadmapper.md +48 -0
- package/skills/path/scripts/_common.py +180 -0
- package/skills/path/scripts/archive_milestone.py +2265 -0
- package/skills/path/scripts/bootstrap_repository.py +710 -0
- package/skills/path/scripts/build_state.py +854 -0
- package/skills/path/scripts/check_docs_audit.py +463 -0
- package/skills/path/scripts/check_handoffs.py +1855 -0
- package/skills/path/scripts/check_task_briefs.py +376 -0
- package/skills/path/scripts/check_update.py +93 -0
- package/skills/path/scripts/detect_project.py +1517 -0
- package/skills/path/scripts/discussion_records.py +619 -0
- package/skills/path/scripts/discussion_validate.py +1321 -0
- package/skills/path/scripts/dispatch_driver.py +1812 -0
- package/skills/path/scripts/integration.py +1433 -0
- package/skills/path/scripts/isolation.py +3538 -0
- package/skills/path/scripts/lean_verification.py +256 -0
- package/skills/path/scripts/loop_run.py +837 -0
- package/skills/path/scripts/pipeline_git.py +940 -0
- package/skills/path/scripts/pipeline_state.py +2291 -0
- package/skills/path/scripts/promote_lookahead.py +415 -0
- package/skills/path/scripts/review_findings.py +714 -0
- package/skills/path/scripts/review_panel.py +553 -0
- package/skills/path/scripts/state_checkpoint.py +1039 -0
- package/skills/path/scripts/state_promote.py +743 -0
- package/skills/path/scripts/token_budget.py +146 -0
- package/skills/path/scripts/workflow_run.py +117 -0
- package/skills/path/templates/answers.md +29 -0
- package/skills/path/templates/archive-manifest.md +37 -0
- package/skills/path/templates/charter.md +50 -0
- package/skills/path/templates/codebase.md +46 -0
- package/skills/path/templates/dialogue.md +21 -0
- package/skills/path/templates/docs-audit.md +69 -0
- package/skills/path/templates/evidence.md +24 -0
- package/skills/path/templates/final-review.md +27 -0
- package/skills/path/templates/gap-review.md +20 -0
- package/skills/path/templates/intent.md +98 -0
- package/skills/path/templates/loop.md +59 -0
- package/skills/path/templates/patch-findings.md +16 -0
- package/skills/path/templates/plan-panel.md +25 -0
- package/skills/path/templates/plan.md +89 -0
- package/skills/path/templates/repository.md +16 -0
- package/skills/path/templates/research-handoff.md +25 -0
- package/skills/path/templates/roadmap.md +38 -0
- package/skills/path/templates/skeptic.md +36 -0
- package/skills/path/templates/state.md +27 -0
- package/skills/path/templates/synthesis.md +36 -0
- package/skills/path/templates/task.md +74 -0
- package/skills/path/templates/wave-panel.md +25 -0
- package/skills/path/templates/wave-review.md +64 -0
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""Run canonical workflow helpers with fixed arguments and fail-stop receipts."""
|
|
3
|
+
|
|
4
|
+
import argparse
|
|
5
|
+
import json
|
|
6
|
+
import subprocess
|
|
7
|
+
import sys
|
|
8
|
+
from pathlib import Path
|
|
9
|
+
|
|
10
|
+
try:
|
|
11
|
+
from scripts import _common
|
|
12
|
+
except ImportError: # bundled copy inside a skill's scripts directory
|
|
13
|
+
import _common
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class StepFailed(RuntimeError):
|
|
17
|
+
pass
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def run_workflow(repo: Path, action: str, project_dir: str, expected_head: str = None,
|
|
21
|
+
task_id: str = None, round_size: int = None) -> dict:
|
|
22
|
+
steps = []
|
|
23
|
+
scripts = Path(__file__).resolve().parent
|
|
24
|
+
|
|
25
|
+
def step(script, *arguments):
|
|
26
|
+
command = [sys.executable, "-B", str(scripts / script), *arguments]
|
|
27
|
+
completed = subprocess.run(command, cwd=repo, capture_output=True, text=True)
|
|
28
|
+
receipt = {"script": script, "command": command, "exit_code": completed.returncode,
|
|
29
|
+
"stdout": completed.stdout, "stderr": completed.stderr}
|
|
30
|
+
steps.append(receipt)
|
|
31
|
+
if completed.stderr:
|
|
32
|
+
sys.stderr.write(completed.stderr)
|
|
33
|
+
if completed.returncode:
|
|
34
|
+
raise StepFailed(script)
|
|
35
|
+
try:
|
|
36
|
+
receipt["result"] = json.loads(completed.stdout)
|
|
37
|
+
except json.JSONDecodeError as error:
|
|
38
|
+
raise StepFailed(f"{script} did not return JSON") from error
|
|
39
|
+
return receipt["result"]
|
|
40
|
+
|
|
41
|
+
common = ["--repo", str(repo), "--project-dir", project_dir]
|
|
42
|
+
try:
|
|
43
|
+
if action == "route":
|
|
44
|
+
step("pipeline_state.py", "route", *common)
|
|
45
|
+
elif action == "lint-round":
|
|
46
|
+
head = subprocess.run(["git", "rev-parse", "--verify", "HEAD"],
|
|
47
|
+
cwd=repo, capture_output=True, text=True, check=True).stdout.strip()
|
|
48
|
+
step("check_task_briefs.py", "--repo", str(repo), "--base", head,
|
|
49
|
+
"--tasks-dir", f"{project_dir}/tasks")
|
|
50
|
+
step("check_handoffs.py", "plan", *common)
|
|
51
|
+
elif action == "prepare-task":
|
|
52
|
+
task = step("isolation.py", "isolate-task", "--repo", str(repo),
|
|
53
|
+
"--base", expected_head, "--task-id", task_id,
|
|
54
|
+
"--round-size", str(round_size))
|
|
55
|
+
if task["mode"] == "serial":
|
|
56
|
+
step("isolation.py", "isolate-verify", "--repo", str(repo),
|
|
57
|
+
"--base", expected_head, "--name", f"task-{task_id.lower()}-verify")
|
|
58
|
+
elif action == "build-evidence":
|
|
59
|
+
proof = step("build_state.py", "verify-landed", *common, "--head", expected_head)
|
|
60
|
+
# The landing proof has one canonical home; lean final-review reuse allows only this path.
|
|
61
|
+
evidence = repo / project_dir / "build" / "evidence.json"
|
|
62
|
+
_common.atomic_write(evidence, json.dumps(proof, indent=2, sort_keys=True) + "\n")
|
|
63
|
+
steps.append({"script": "workflow_run.py", "evidence": str(evidence)})
|
|
64
|
+
elif action == "prepare-final":
|
|
65
|
+
if project_dir != ".project":
|
|
66
|
+
raise StepFailed("final review requires the active milestone")
|
|
67
|
+
pending = step("discussion_records.py", "pending", "--repo", str(repo))
|
|
68
|
+
if pending["pending"]:
|
|
69
|
+
raise StepFailed("pending discussion requires its owner disposition")
|
|
70
|
+
step("build_state.py", "verify-landed", *common, "--head", expected_head)
|
|
71
|
+
step("lean_verification.py", "--repo", str(repo), "--expected-head", expected_head)
|
|
72
|
+
else:
|
|
73
|
+
pending = step("discussion_records.py", "pending", "--repo", str(repo))
|
|
74
|
+
if pending["pending"]:
|
|
75
|
+
raise StepFailed("pending discussion requires its owner disposition")
|
|
76
|
+
step("check_handoffs.py", "plan", *common)
|
|
77
|
+
head = subprocess.run(["git", "rev-parse", "--verify", "HEAD"],
|
|
78
|
+
cwd=repo, capture_output=True, text=True, check=True).stdout.strip()
|
|
79
|
+
step("check_task_briefs.py", "--repo", str(repo), "--base", head,
|
|
80
|
+
"--tasks-dir", f"{project_dir}/tasks")
|
|
81
|
+
panel = ["validate-plan", "--plan", str(repo / project_dir / "plan/PLAN.md"),
|
|
82
|
+
"--intent", str(repo / project_dir / "intent/INTENT.md")]
|
|
83
|
+
charter = repo / ".project/CHARTER.md"
|
|
84
|
+
if charter.exists():
|
|
85
|
+
panel += ["--charter", str(charter)]
|
|
86
|
+
step("review_panel.py", *panel)
|
|
87
|
+
if action == "approve-plan":
|
|
88
|
+
step("pipeline_state.py", "approve", *common, "--kind", "plan",
|
|
89
|
+
"--expected-head", expected_head)
|
|
90
|
+
except (StepFailed, OSError, subprocess.CalledProcessError) as error:
|
|
91
|
+
return {"status": "blocked", "reason": str(error), "steps": steps,
|
|
92
|
+
"next": "$gsd-path-forensics"}
|
|
93
|
+
return {"status": "complete", "steps": steps}
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
def main(argv=None):
|
|
97
|
+
parser = argparse.ArgumentParser(description=__doc__)
|
|
98
|
+
parser.add_argument("action", choices=("route", "gate-plan", "approve-plan", "build-evidence", "lint-round", "prepare-task", "prepare-final"))
|
|
99
|
+
parser.add_argument("--repo", type=Path, required=True)
|
|
100
|
+
parser.add_argument("--project-dir", choices=(".project", ".project/next"), default=".project")
|
|
101
|
+
parser.add_argument("--expected-head")
|
|
102
|
+
parser.add_argument("--task-id")
|
|
103
|
+
parser.add_argument("--round-size", type=int)
|
|
104
|
+
arguments = parser.parse_args(argv)
|
|
105
|
+
if arguments.action in {"approve-plan", "build-evidence", "prepare-task", "prepare-final"} and not arguments.expected_head:
|
|
106
|
+
parser.error(f"{arguments.action} requires --expected-head")
|
|
107
|
+
if arguments.action == "prepare-task" and (not arguments.task_id or arguments.round_size is None):
|
|
108
|
+
parser.error("prepare-task requires --task-id and --round-size")
|
|
109
|
+
result = run_workflow(arguments.repo.resolve(), arguments.action,
|
|
110
|
+
arguments.project_dir, arguments.expected_head,
|
|
111
|
+
arguments.task_id, arguments.round_size)
|
|
112
|
+
print(json.dumps(result, sort_keys=True))
|
|
113
|
+
return 0 if result["status"] == "complete" else 1
|
|
114
|
+
|
|
115
|
+
|
|
116
|
+
if __name__ == "__main__":
|
|
117
|
+
raise SystemExit(main())
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
# Patch Findings
|
|
2
|
+
|
|
3
|
+
<!-- Written by final review when it blocks and consumed by patch planning. -->
|
|
4
|
+
|
|
5
|
+
Reviewed HEAD: <full SHA>
|
|
6
|
+
State: ship/blocked
|
|
7
|
+
|
|
8
|
+
## Findings
|
|
9
|
+
|
|
10
|
+
<!-- Copy only evidenced, selected findings. Keep IDs contiguous and ordered. -->
|
|
11
|
+
### P001 — <short finding title>
|
|
12
|
+
|
|
13
|
+
- **Source**: `.project/review/FINAL.md`
|
|
14
|
+
- **Locator**: `<SC number or gap risk row>`
|
|
15
|
+
- **Evidence**: <observed result copied from the source review>
|
|
16
|
+
- **Fix direction**: <concrete direction for the patch task>
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# Plan panel — <family>
|
|
2
|
+
|
|
3
|
+
<!-- Written by one review-panel child. The orchestrator validates this file
|
|
4
|
+
with scripts/review_panel.py merge and never treats it as a plan gate.
|
|
5
|
+
Kind criterion requires a named PLAN/task criterion; preference is
|
|
6
|
+
taste or an alternate design and must not flip approval. -->
|
|
7
|
+
|
|
8
|
+
- Family: <claude | gpt | grok | composer | gemini | deepseek | kimi | qwen>
|
|
9
|
+
- Model: <exact advertised slug>
|
|
10
|
+
|
|
11
|
+
## Findings
|
|
12
|
+
|
|
13
|
+
<!-- One ### F# block per finding, or a single `- none` line. -->
|
|
14
|
+
|
|
15
|
+
### F1
|
|
16
|
+
- Severity: high
|
|
17
|
+
- Kind: criterion
|
|
18
|
+
- Criterion: Wave 1 / T001 / acceptance 1
|
|
19
|
+
- Evidence: .project/tasks/T001-slug.md:12
|
|
20
|
+
- Found: <what is missing or wrong>
|
|
21
|
+
- Fix direction: <concrete plan/task edit>
|
|
22
|
+
|
|
23
|
+
## Summary
|
|
24
|
+
|
|
25
|
+
<one paragraph; do not edit PLAN.md or tasks>
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
# Plan — <project name>
|
|
2
|
+
|
|
3
|
+
<!-- Written by the planner role. Executed wave-by-wave by $gsd-path-build. -->
|
|
4
|
+
|
|
5
|
+
Project verify: `<command that installs dependencies, builds + tests the whole project>`
|
|
6
|
+
<!-- Run once at ship, in a fresh sidecar worktree checked out at the
|
|
7
|
+
reviewed commit: no node_modules, virtualenv, build output, or untracked
|
|
8
|
+
env files exist there. The command must provision what it needs first,
|
|
9
|
+
e.g. `pnpm install --frozen-lockfile && pnpm test`. A task Verify must
|
|
10
|
+
not copy this command unless an owned INTENT success criterion names it.
|
|
11
|
+
Otherwise the task Verify names a path from that task's files. -->
|
|
12
|
+
|
|
13
|
+
## Config
|
|
14
|
+
|
|
15
|
+
- max_review_cycles: 3 <!-- review→fix→re-review loops per wave before escalating -->
|
|
16
|
+
- wave_budget: none <!-- none | optional per-wave resource cap: wall-clock,
|
|
17
|
+
tokens, or cost (e.g. 2h, 500k tokens). Reaching the
|
|
18
|
+
cap blocks the wave like an exhausted cycle cap and
|
|
19
|
+
escalates to the user. none is default. -->
|
|
20
|
+
- review_panel: off <!-- off | detected | claude,gpt,grok — optional
|
|
21
|
+
cross-model panel. off is default. detected uses
|
|
22
|
+
advertised host families except the parent, cap 3.
|
|
23
|
+
Named families are an assertion. Quick lane stays
|
|
24
|
+
off. The planner copies INTENT.md; it does not
|
|
25
|
+
invent a non-off value. -->
|
|
26
|
+
- finding_skeptics: off <!-- off | on — deep waves only. on spawns one
|
|
27
|
+
read-only skeptic per blocking finding before
|
|
28
|
+
fix tasks are batched; a refuted finding spawns
|
|
29
|
+
no fix task unless the user explicitly overrides
|
|
30
|
+
all cycle refutations. off is default. The planner
|
|
31
|
+
copies INTENT.md; it does not invent on. -->
|
|
32
|
+
|
|
33
|
+
## Wave 1 — risk burn-down
|
|
34
|
+
|
|
35
|
+
Goal: <what this wave proves; if it fails, what changes>
|
|
36
|
+
Review depth: full <!-- full | deep | verify-only. Wave 1 and auth/payments/
|
|
37
|
+
data migration/concurrency waves must be full or
|
|
38
|
+
deep. Assign deep sparingly: irreversible or
|
|
39
|
+
security-critical merges. -->
|
|
40
|
+
|
|
41
|
+
<!-- No task table. Task id, title, deps, and files live only in each
|
|
42
|
+
`tasks/T###-slug.md` frontmatter; `wave: N` there assigns it here. -->
|
|
43
|
+
|
|
44
|
+
## Wave 2 — walking skeleton
|
|
45
|
+
|
|
46
|
+
Goal: <the end-to-end slice that runs>
|
|
47
|
+
Review depth: <full | deep | verify-only>
|
|
48
|
+
|
|
49
|
+
<!-- More waves: features by dependency, then polish. Rules:
|
|
50
|
+
- deps only in earlier waves, or same wave with no file overlap
|
|
51
|
+
- no two same-wave tasks share files
|
|
52
|
+
- nothing from INTENT.md scope-out appears anywhere -->
|
|
53
|
+
|
|
54
|
+
## Surface contract
|
|
55
|
+
|
|
56
|
+
<!-- Required when INTENT.md `Surfaces:` is not `none`; omit the section
|
|
57
|
+
entirely when it is. One block per declared surface, named exactly as
|
|
58
|
+
INTENT.md names it, owned by the task that delivers it. That task must
|
|
59
|
+
name in Criteria the success criteria this surface is proven by — the
|
|
60
|
+
owning task must own every listed criterion in its Intent coverage. A
|
|
61
|
+
criterion may appear in only one surface block. This is what the final
|
|
62
|
+
reviewer walks before the milestone is called done, and FINAL.md records
|
|
63
|
+
the surface it was walked on. Replace every whole-value angle-bracket
|
|
64
|
+
placeholder; angle brackets may appear inside concrete routes, commands,
|
|
65
|
+
states, and walkthrough steps. -->
|
|
66
|
+
|
|
67
|
+
### <surface name as INTENT.md writes it> — T001
|
|
68
|
+
|
|
69
|
+
Criteria: SC1
|
|
70
|
+
Entry: <the route, screen, or command a person opens>
|
|
71
|
+
States: <what empty, loading, error, and success each show>
|
|
72
|
+
Walkthrough:
|
|
73
|
+
1. <step a reviewer performs to see this surface working>
|
|
74
|
+
|
|
75
|
+
## Intent coverage
|
|
76
|
+
|
|
77
|
+
<!-- Every INTENT.md success criterion, as SCn, maps to at least one task
|
|
78
|
+
acceptance item. The named task's Verify command is what must fail if
|
|
79
|
+
that criterion is skipped. `scripts/check_handoffs.py plan` gates this
|
|
80
|
+
table against INTENT.md and each task's Intent coverage section. -->
|
|
81
|
+
|
|
82
|
+
| Criterion | Task | Acceptance |
|
|
83
|
+
|-----------|------|------------|
|
|
84
|
+
| SC1 | T001 | AC1 |
|
|
85
|
+
|
|
86
|
+
## Dependency notes
|
|
87
|
+
|
|
88
|
+
<Per non-obvious edge: the exact data or landed effect that makes X precede Y,
|
|
89
|
+
and how a reviewer sees it. Narrative order is not a dependency.>
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: T001
|
|
3
|
+
title: <imperative, specific>
|
|
4
|
+
wave: 1
|
|
5
|
+
deps: [] # task ids whose output or landed effect this task needs
|
|
6
|
+
status: pending # orchestrator-owned: pending | in-progress | done | failed | blocked
|
|
7
|
+
agent: null # orchestrator-owned: set at dispatch
|
|
8
|
+
base: null # orchestrator-owned: clean layer SHA for isolated Verify
|
|
9
|
+
worktree: null # orchestrator-owned: isolated task worktree while active
|
|
10
|
+
task_branch: null # orchestrator-owned: gsd-path-task/<id> while parallel; null when serial
|
|
11
|
+
files: # every file this task may touch — dispatch checks overlap
|
|
12
|
+
- <path>
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
# T001 — <title>
|
|
16
|
+
|
|
17
|
+
## Context
|
|
18
|
+
|
|
19
|
+
<!-- 3–5 sentences. Everything the coder needs from SYNTHESIS, inlined.
|
|
20
|
+
The coder reads this file, INTENT.md, and the codebase. -->
|
|
21
|
+
|
|
22
|
+
## Approach
|
|
23
|
+
|
|
24
|
+
<!-- Constraints, applicable pitfalls from research, and pointers to real
|
|
25
|
+
paths, symbols, and schemas. Not an edit script — the coder owns the
|
|
26
|
+
how within these constraints and the acceptance criteria. -->
|
|
27
|
+
- <constraint or pointer>
|
|
28
|
+
|
|
29
|
+
## Interface contract
|
|
30
|
+
|
|
31
|
+
<!-- Planner-owned. The exact shared symbols, signatures, types, paths,
|
|
32
|
+
schemas, or formats this task exchanges with other tasks. Required when
|
|
33
|
+
another task consumes this task's output or this task consumes a
|
|
34
|
+
sibling's; write the identical contract in every involved task. Otherwise
|
|
35
|
+
write `None`. Only shapes this task's `files` define or consume — never
|
|
36
|
+
the whole plan's contracts. Binding like the acceptance criteria: needing to deviate
|
|
37
|
+
is a plan defect — block, never negotiate or improvise. -->
|
|
38
|
+
- None
|
|
39
|
+
|
|
40
|
+
## Intent coverage
|
|
41
|
+
|
|
42
|
+
<!-- SCn ids this task owns, matching PLAN.md Intent coverage. Write
|
|
43
|
+
`- None` when this task owns no INTENT success criterion. -->
|
|
44
|
+
- SC1
|
|
45
|
+
|
|
46
|
+
## Acceptance criteria
|
|
47
|
+
|
|
48
|
+
<!-- Observable. The reviewer checks the diff against exactly these. -->
|
|
49
|
+
1. <behavior/command/output that must be true>
|
|
50
|
+
|
|
51
|
+
## Verify
|
|
52
|
+
|
|
53
|
+
```bash
|
|
54
|
+
<one command that fails if this task wasn't done; names a path from files>
|
|
55
|
+
```
|
|
56
|
+
<!-- Runs in a fresh sidecar worktree at the landed commit with nothing
|
|
57
|
+
installed. Provision dependencies inside the command when the project
|
|
58
|
+
needs them, e.g. `pnpm install --frozen-lockfile && pnpm vitest run
|
|
59
|
+
src/x.test.ts`. -->
|
|
60
|
+
|
|
61
|
+
Heavy: no <!-- yes when this command must not run beside another heavy Verify -->
|
|
62
|
+
|
|
63
|
+
<!-- Fix tasks only: add ## Review findings before Log, with one
|
|
64
|
+
### <canonical locator> block per group in the helper's batch.
|
|
65
|
+
Each block contains Criterion: <verbatim criterion> and all supplied
|
|
66
|
+
observations verbatim. Set deps to include the source tasks and files
|
|
67
|
+
to the batch's files. Ordinary tasks omit this section. -->
|
|
68
|
+
|
|
69
|
+
## Log
|
|
70
|
+
|
|
71
|
+
<!-- Append-only: coder summary, blocks (`NEEDS-ORCHESTRATOR: <question> —
|
|
72
|
+
readings: <candidates>` for contract ambiguity), orchestrator answers,
|
|
73
|
+
review verdicts, fixes. -->
|
|
74
|
+
- <date> — created by planner
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: gsd-path-research
|
|
3
|
+
description: Dispatch parallel researchers and collect cited GSD Path evidence about domain, stack, pitfalls, and comparable products. Use only when the user explicitly invokes $gsd-path-research or an active $gsd-path router explicitly routes to this phase.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# GSD Path Research Phase
|
|
7
|
+
|
|
8
|
+
Dispatch independent researchers and gate their evidence. Keep synthesis out
|
|
9
|
+
of this phase. The durable output is a research dispatch manifest plus one
|
|
10
|
+
evidence file per dispatched dimension.
|
|
11
|
+
|
|
12
|
+
Routing instructions below are caller handoffs under the AGENTS.md handoff
|
|
13
|
+
rule; never invoke an explicit-only sibling skill yourself.
|
|
14
|
+
|
|
15
|
+
Before dispatch and again before completion, apply the AGENTS.md
|
|
16
|
+
pending-answer rule with the bundled `scripts/discussion_records.py`; a
|
|
17
|
+
follow-up owned by research is resolved through its evidence handoff, or
|
|
18
|
+
the phase blocks.
|
|
19
|
+
|
|
20
|
+
## Preconditions
|
|
21
|
+
|
|
22
|
+
Require `pipeline_state.py validate --repo <absolute root> [--project-dir
|
|
23
|
+
.project/next]` to pass; otherwise return to `$gsd-path` for ownership
|
|
24
|
+
checking. Legal entry is `define/done` or `research/active|blocked`. On
|
|
25
|
+
`define/done`, enter with `pipeline_state.py transition`, expected phase/status
|
|
26
|
+
`define/done`, exact branch and archive values, event `research started`, and
|
|
27
|
+
set phase/status `research/active` (plus the same `--project-dir` in
|
|
28
|
+
lookahead); never edit STATE directly. `research/done`
|
|
29
|
+
`research/done` or any later phase blocks rather than replacing settled
|
|
30
|
+
evidence beneath downstream artifacts. When an active router supplies the
|
|
31
|
+
lookahead track root `.project/next/`, evaluate these preconditions against
|
|
32
|
+
the track instead; see Lookahead mode. Require
|
|
33
|
+
`.project/intent/INTENT.md` — or, in program flow, `.project/CHARTER.md` when
|
|
34
|
+
the router dispatched program-scope research before any milestone INTENT
|
|
35
|
+
exists. If neither exists, stop and route to
|
|
36
|
+
`$gsd-path-define`. Confirm live search or web-reading capability before
|
|
37
|
+
dispatch; if unavailable, block rather than allowing memory-based citations.
|
|
38
|
+
|
|
39
|
+
Program scope: when working from CHARTER.md, dimensions decompose the full
|
|
40
|
+
charter scope, not one milestone. Add program dimensions such as
|
|
41
|
+
`domain-decomposition` (capability areas and their boundaries) and
|
|
42
|
+
`capability-map` (what exists vs. what must be built) as custom dimensions
|
|
43
|
+
alongside the standard set, so the roadmap phase inherits a complete scope
|
|
44
|
+
map. The manifest's `Intent:` line names `.project/CHARTER.md` in this flow.
|
|
45
|
+
|
|
46
|
+
## Lookahead mode
|
|
47
|
+
|
|
48
|
+
Entered only when an active router supplies the lookahead track root
|
|
49
|
+
`.project/next/` while the active STATE.md is `build/active` in program
|
|
50
|
+
flow. Evaluate every state and artifact precondition against the track:
|
|
51
|
+
`.project/next/STATE.md` is the state file, INTENT.md is
|
|
52
|
+
`.project/next/intent/INTENT.md`, and the manifest and evidence files live
|
|
53
|
+
under `.project/next/research/`. Program-level inputs (CHARTER.md,
|
|
54
|
+
ROADMAP.md, top-level SYNTHESIS.md) are read from their active `.project/`
|
|
55
|
+
paths. Brownfield input is the track's
|
|
56
|
+
`.project/next/research/evidence-codebase.md` after lookahead inspect;
|
|
57
|
+
do not substitute the building milestone's map. Archived evidence from
|
|
58
|
+
earlier milestones uses the same archived-manifest rule as the roadmap
|
|
59
|
+
phase. Validate the handoff with
|
|
60
|
+
`python3 <absolute check_handoffs.py> research --repo <absolute repo root>
|
|
61
|
+
--project-dir .project/next`. Dispatch, gates, and completion rules are
|
|
62
|
+
unchanged; never write an active-path artifact.
|
|
63
|
+
|
|
64
|
+
## Dispatch contract
|
|
65
|
+
|
|
66
|
+
Read the local [researcher role](references/researcher.md), then follow the
|
|
67
|
+
local [runtime dispatch contract](references/dispatch.md). Resolve the local
|
|
68
|
+
[evidence template](templates/evidence.md), research-handoff template
|
|
69
|
+
(`templates/research-handoff.md`), and `scripts/check_handoffs.py` to absolute
|
|
70
|
+
paths. Include the role, `AGENTS.md`, `WORKFLOW.md`, INTENT.md, manifest,
|
|
71
|
+
dimension, assigned questions, deterministic logical task name
|
|
72
|
+
`research_<dimension>`, and exact output path in every brief. When
|
|
73
|
+
`evidence-codebase.md` exists, include its absolute path in every brief as
|
|
74
|
+
settled brownfield input.
|
|
75
|
+
|
|
76
|
+
## Process
|
|
77
|
+
|
|
78
|
+
1. Read INTENT.md — or CHARTER.md in program flow. Extract constraints,
|
|
79
|
+
vetoes, risks, and `RESEARCH`
|
|
80
|
+
questions. Create `.project/research/RESEARCH.md` from the local handoff
|
|
81
|
+
template before dispatch. Record every standard dimension exactly once as
|
|
82
|
+
`dispatched` or `skipped` with a reason, and assign every research question
|
|
83
|
+
to at least one dispatched dimension. No question may remain unassigned.
|
|
84
|
+
2. Decide which standard dimensions have work: dispatch a dimension only when
|
|
85
|
+
it has at least one assigned `RESEARCH` question from INTENT.md or
|
|
86
|
+
CHARTER.md. Unsettled choices and risks need that source question before
|
|
87
|
+
dispatch. Skip a dimension
|
|
88
|
+
with nothing to answer — never spawn a researcher to fill a file — and
|
|
89
|
+
record every skipped dimension with its reason in `RESEARCH.md`. The
|
|
90
|
+
standard dimensions:
|
|
91
|
+
|
|
92
|
+
| Dimension | Output file | Focus |
|
|
93
|
+
| --- | --- | --- |
|
|
94
|
+
| domain | `evidence-domain.md` | prior art, domain rules, terminology, practitioner expectations |
|
|
95
|
+
| stack | `evidence-stack.md` | two or three viable stacks against the constraints |
|
|
96
|
+
| pitfalls | `evidence-pitfalls.md` | security, scale, reliability, and UX failure modes |
|
|
97
|
+
| similar | `evidence-similar.md` | comparable products and reusable lessons |
|
|
98
|
+
|
|
99
|
+
Dispatch up to the available child capacity, then dispatch each remaining
|
|
100
|
+
dimension when a slot opens. A pending corrected redispatch takes the slot
|
|
101
|
+
before any queued not-yet-dispatched dimension. Keep all briefs independent.
|
|
102
|
+
A custom fifth dimension supplements at least one dispatched standard
|
|
103
|
+
dimension; it never replaces the standard set.
|
|
104
|
+
|
|
105
|
+
In brownfield work, require stack research to weigh migration cost and
|
|
106
|
+
pitfalls research to check which failure modes already exist in the mapped
|
|
107
|
+
codebase.
|
|
108
|
+
|
|
109
|
+
3. If a risk needs a distinct dimension, add one researcher, up to five total
|
|
110
|
+
(project policy).
|
|
111
|
+
Derive its filename deterministically as `evidence-<dimension-slug>.md`:
|
|
112
|
+
lowercase the label, replace non-alphanumeric runs with one hyphen, and
|
|
113
|
+
trim hyphens. Append `-2` only if it collides with an existing dimension.
|
|
114
|
+
4. Validate each dispatched evidence file as its researcher returns. Require
|
|
115
|
+
at least one `## Finding` — a documented `no reliable source found` null
|
|
116
|
+
result recorded as a finding satisfies this gate, with the searches that
|
|
117
|
+
came up empty noted as its evidence — require Claim, Source, Confidence,
|
|
118
|
+
and Why it matters fields for every finding, and require an answer for
|
|
119
|
+
every question assigned to that dimension. For a missing or invalid file,
|
|
120
|
+
redispatch one complete corrected brief under the same logical task name,
|
|
121
|
+
following the runtime dispatch contract, as soon as a child slot allows —
|
|
122
|
+
never held until the remaining dimensions settle.
|
|
123
|
+
5. After every dimension settles — validated, or its one corrected
|
|
124
|
+
redispatch collected — confirm every extracted `RESEARCH` question was
|
|
125
|
+
assigned to a dispatched dimension. Then run:
|
|
126
|
+
|
|
127
|
+
`python3 <absolute check_handoffs.py> research --repo <absolute repo root>`
|
|
128
|
+
|
|
129
|
+
The manifest is the source of truth for dispatched and skipped dimensions;
|
|
130
|
+
the STATE log records only a human-readable summary.
|
|
131
|
+
If any expected file still fails after its one corrected redispatch,
|
|
132
|
+
run `pipeline_state.py transition` with
|
|
133
|
+
expected `research/active`, exact branch and archive values,
|
|
134
|
+
`--set-status blocked`, and an event listing the failed evidence gate; then
|
|
135
|
+
present **Outcome** with the
|
|
136
|
+
failed gate, **Review** linking RESEARCH.md or STATE.md when the manifest is
|
|
137
|
+
missing, and **Next** naming the one correction or user decision required.
|
|
138
|
+
Stop; never advance with partial research.
|
|
139
|
+
6. When all dispatched files and `RESEARCH.md` pass, run
|
|
140
|
+
`pipeline_state.py transition` with expected `research/active`, exact
|
|
141
|
+
branch and archive values, `--set-phase research --set-status done`, and
|
|
142
|
+
an event naming the manifest path, dispatched dimensions, skipped
|
|
143
|
+
dimensions, and question count. Include `--project-dir .project/next` for
|
|
144
|
+
lookahead. Require the returned state to be `research/done`. Report the
|
|
145
|
+
outcome, link the resolved absolute `RESEARCH.md` path,
|
|
146
|
+
summarize the dispatched evidence files, and name the decide phase as next.
|
|
147
|
+
The decide phase reads the manifest; it must not infer dispatch state from
|
|
148
|
+
a glob or free-form log. When routed by an active
|
|
149
|
+
`$gsd-path`, return control to that router. When invoked directly, stop and
|
|
150
|
+
tell the user to explicitly invoke `$gsd-path`, which routes to decide; do
|
|
151
|
+
not invoke an explicit-only sibling skill yourself.
|
|
152
|
+
|
|
153
|
+
## Rules
|
|
154
|
+
|
|
155
|
+
- Require evidence, not opinion: every claim needs a source actually checked
|
|
156
|
+
and a one-line tie-back to this project's intent.
|
|
157
|
+
- Record conflicting sources rather than resolving them here.
|
|
158
|
+
- Preserve dead ends and explicit `no reliable source found` answers.
|
|
159
|
+
- Do not summarize the evidence; `$gsd-path-decide` owns that work.
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
# Shared Agent Skills dispatch
|
|
2
|
+
|
|
3
|
+
Apply this contract whenever a GSD Path skill delegates work from the shared
|
|
4
|
+
`~/.agents/skills` bundle. Inspect the advertised child-agent tool schema and
|
|
5
|
+
use exactly one matching branch:
|
|
6
|
+
|
|
7
|
+
- A `spawn_agent` tool exposing `task_name`, `agent_type`, and `fork_turns` is
|
|
8
|
+
Codex. Use `fork_turns: "none"`; coders use the built-in `worker` type and
|
|
9
|
+
every other role uses `default`. Reuse a completed logical target with
|
|
10
|
+
`followup_task`. For Codex reasoning effort, use `high` for the portable
|
|
11
|
+
`heavy` tier and `low` for the portable `light` tier; leave reasoning effort
|
|
12
|
+
unset for the session-default tier, and never pass `heavy` or `light` as a
|
|
13
|
+
literal Codex value.
|
|
14
|
+
- A `spawn_agent` tool without those Codex fields is Zed. Spawn one isolated,
|
|
15
|
+
full-capability child per brief. Zed children are not resumable, so retries
|
|
16
|
+
use a fresh child and a complete prompt.
|
|
17
|
+
- An `invoke_subagent` tool advertising `TypeName`, `Workspace`, and `Role` is
|
|
18
|
+
Antigravity. Use `TypeName: self`, the exact supplied root as `Workspace`,
|
|
19
|
+
and the logical task name as `Role`. Keep the returned child ID and use
|
|
20
|
+
`send_message` for follow-up work when available; otherwise start a fresh
|
|
21
|
+
child with the complete prompt.
|
|
22
|
+
- A `spawn_subagent` tool advertising the `general-purpose` type is Grok. Use
|
|
23
|
+
`subagent_type: general-purpose`, `capability_mode: all`, the exact supplied
|
|
24
|
+
root as `cwd`, `isolation: none`, and `background: true`. Supply the logical
|
|
25
|
+
task name as `description`, keep the returned ID, and use `resume_from` with
|
|
26
|
+
the complete new prompt for later work. Wait for a colliding active child and
|
|
27
|
+
collect results with `wait_commands_or_subagents`.
|
|
28
|
+
- A `Task` tool advertising the custom `gsd-path` subagent is Cursor. Use that
|
|
29
|
+
model-inheriting, full-capability child. Resume it by returned agent ID when
|
|
30
|
+
available; otherwise retry with a fresh child and a complete prompt.
|
|
31
|
+
- A `Task` tool advertising the built-in `general` subagent is OpenCode. Use
|
|
32
|
+
that child; if an installed OpenCode v2 host exposes the renamed `subagent`
|
|
33
|
+
tool instead, use its advertised schema with the built-in `general` agent.
|
|
34
|
+
Supply the logical task name as the child description. Reuse a returned
|
|
35
|
+
child-session ID only when the host advertises a resume parameter; otherwise
|
|
36
|
+
use a fresh `general` child and the complete prompt.
|
|
37
|
+
- A `task` tool advertising the `general-purpose` child is GitHub Copilot CLI.
|
|
38
|
+
Use that child. Keep its returned ID for follow-up while the host exposes
|
|
39
|
+
it; otherwise retry with a fresh child and a complete prompt.
|
|
40
|
+
- An `invoke_sub_agent` tool with a `general-purpose` subagent is Kiro. Use
|
|
41
|
+
that child for every role; there is no worker/default type split. Start a
|
|
42
|
+
fresh general-purpose child for every correction, retry, post-patch review,
|
|
43
|
+
repeated audit, or later milestone — Kiro subagents are not resumable and
|
|
44
|
+
disk artifacts are the source of truth. Supply the logical task name as the
|
|
45
|
+
task description. Set the child working directory to the exact repository or
|
|
46
|
+
linked-worktree root supplied by GSD Path; do not ask Kiro or the child to
|
|
47
|
+
create another worktree. Encode task dependencies explicitly; launch
|
|
48
|
+
independent children concurrently up to the host's advertised
|
|
49
|
+
concurrent-subagent capacity.
|
|
50
|
+
|
|
51
|
+
For every branch:
|
|
52
|
+
|
|
53
|
+
- Supply the deterministic logical task name: `inspect_codebase`,
|
|
54
|
+
`inspect_docs`, `docs_audit`, `research_<dimension>`, `decide`, `roadmap`,
|
|
55
|
+
`plan`,
|
|
56
|
+
`plan_patch`, `build_<task_id>`, `review_wave_<wave>_cycle_<cycle>`
|
|
57
|
+
(a `deep` wave review appends the lens suffix `_contract` or
|
|
58
|
+
`_adversarial`; an optional review panel uses
|
|
59
|
+
`review_wave_<wave>_cycle_<cycle>_panel_<family>`; an optional finding
|
|
60
|
+
skeptic uses `review_wave_<wave>_cycle_<cycle>_skeptic_<criterion_locator>`),
|
|
61
|
+
`review_plan_panel_<family>`,
|
|
62
|
+
`review_final`, or `review_gap_<number>`. Normalize variable parts to
|
|
63
|
+
lowercase ASCII and replace non-alphanumeric runs with one underscore.
|
|
64
|
+
Never add a random suffix or collide with a running logical target.
|
|
65
|
+
- Resolve the phase's linked role brief to an absolute path, include it in the
|
|
66
|
+
prompt, and require the child to read it before acting. The role brief
|
|
67
|
+
supplies the read-only boundary for auditors and reviewers.
|
|
68
|
+
- Tier hints: use the portable `heavy` tier for `plan`, `plan_patch`, `decide`,
|
|
69
|
+
and `roadmap`, the portable `light` tier for `inspect_docs` and `docs_audit`,
|
|
70
|
+
and the session-default tier for every other role. Apply the Codex mapping
|
|
71
|
+
above when its schema advertises reasoning-effort selection. On every other
|
|
72
|
+
host, use only an exact native equivalent advertised by that host; otherwise
|
|
73
|
+
do not override the model or reasoning effort. The only exception is a
|
|
74
|
+
review-panel child: when the host advertises model selection, pass the exact
|
|
75
|
+
slug returned by `scripts/review_panel.py resolve` for that family. Never
|
|
76
|
+
override the model on the canonical reviewer, planner, coder, or any other
|
|
77
|
+
role.
|
|
78
|
+
Host isolation: none. The child's working directory is the exact absolute
|
|
79
|
+
root GSD Path supplied; a host SHA checkout or extra worktree is a contract
|
|
80
|
+
failure. Never ask the host to create a worktree. Give the child the exact
|
|
81
|
+
repository or linked-worktree root supplied by GSD Path.
|
|
82
|
+
- Send a self-contained prompt with absolute input, template, and output paths
|
|
83
|
+
plus the child's bounded responsibility. Every brief also names the absolute
|
|
84
|
+
`AGENTS.md` and `WORKFLOW.md` paths (or explicitly says they are absent), the
|
|
85
|
+
next phase that consumes the output, the gate it must satisfy, and the
|
|
86
|
+
terminal result it must return. A coder prompt also names its isolated
|
|
87
|
+
linked-worktree root; no child may infer the primary worktree.
|
|
88
|
+
- The parent is the sole dispatcher and lifecycle owner. If the runtime exposes
|
|
89
|
+
structured Run/Task/Dispatch orchestration, bind one Run, create one Task per
|
|
90
|
+
independent brief with explicit dependencies, inject the brief, and wait for
|
|
91
|
+
every `worker_done`, `escalation`, or question before applying the gate.
|
|
92
|
+
Verify the task and dispatch records before reporting the work as
|
|
93
|
+
orchestrated. On runtimes without that layer, use the host adapter's
|
|
94
|
+
equivalent and preserve the same logical name, completion state,
|
|
95
|
+
timeout/cancellation, and cleanup rules; never silently delegate again from a
|
|
96
|
+
child.
|
|
97
|
+
- When the structured layer exposes a blocking ask/reply channel, route a
|
|
98
|
+
coder's `NEEDS-ORCHESTRATOR` question through it as a live question with
|
|
99
|
+
the worker held alive for the reply, instead of block-and-redispatch. The
|
|
100
|
+
answer is still appended to the task Log as
|
|
101
|
+
`Orchestrator answer:` so the portable on-disk record stays complete, and a
|
|
102
|
+
timed-out or unavailable channel falls back to the portable block path.
|
|
103
|
+
- A child that receives a disposable worktree stages its assigned artifact
|
|
104
|
+
under that root. The parent validates it and atomically transfers it to the
|
|
105
|
+
canonical project path before removing the exact disposable root. A child
|
|
106
|
+
never writes a disposable-review output directly into the primary worktree.
|
|
107
|
+
- Launch independent briefs concurrently up to the advertised child capacity,
|
|
108
|
+
batch any remainder without combining briefs, and collect every result
|
|
109
|
+
before applying the phase gate. Do not leave an active child, logical task, or
|
|
110
|
+
temporary worktree after collection; a timeout or cancellation is a blocked
|
|
111
|
+
result, not a silent success.
|
|
112
|
+
- If the tool schema is ambiguous or the required full-capability child is
|
|
113
|
+
unavailable, stop and report the missing capability. Do not guess the host
|
|
114
|
+
or silently collapse an independence boundary into the main context.
|
|
115
|
+
|
|
116
|
+
## Configured output budgets
|
|
117
|
+
|
|
118
|
+
When the owner supplies token budgets, use the router bundle's
|
|
119
|
+
`scripts/token_budget.py` with the owner's exact task and session values and
|
|
120
|
+
quoted authority. Keep one ledger outside the worktree under the Git common
|
|
121
|
+
directory for the full logical session; resumptions reuse it. Record completed
|
|
122
|
+
parent CLI run events and each native child's session events with stable logical
|
|
123
|
+
task names before the next dispatch. The helper reads host counters and refuses
|
|
124
|
+
incomplete or ambiguous usage; never estimate tokens or reset the ledger.
|
|
125
|
+
Run `admit` for the next task and stop dispatch on a blocked result. Preserve
|
|
126
|
+
its output in the dispatch evidence. This gates observed usage only: concurrent
|
|
127
|
+
or in-flight work can overrun before the host reports usage. Codex CLI has no
|
|
128
|
+
advertised hard output cap; report that limitation once. If the owner requires
|
|
129
|
+
hard generation enforcement, use `admit --require-hard-cap`; unsupported means
|
|
130
|
+
blocked, not budget compliance. Other hosts require a verified native counter
|
|
131
|
+
and cap adapter before any enforcement claim.
|