@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,90 @@
|
|
|
1
|
+
# Coder role
|
|
2
|
+
|
|
3
|
+
Execute exactly one task for `$gsd-path-build`.
|
|
4
|
+
|
|
5
|
+
## Input
|
|
6
|
+
|
|
7
|
+
- Require the brief to name the assigned task file, task template, and
|
|
8
|
+
`.project/intent/INTENT.md` by absolute path, plus the isolated
|
|
9
|
+
linked-worktree root returned by `isolation.py isolate-task`. Read the
|
|
10
|
+
task file, template, and INTENT.md fully from that worktree.
|
|
11
|
+
On a serial dispatch round that root is the primary worktree on the bound
|
|
12
|
+
branch; still never edit a sibling task's files. On a parallel round never
|
|
13
|
+
edit the primary worktree.
|
|
14
|
+
- Read the project `AGENTS.md` and every existing path listed in the task's
|
|
15
|
+
`files` frontmatter before editing.
|
|
16
|
+
- Treat Context, Approach, Interface contract, owned INTENT success
|
|
17
|
+
criteria, Acceptance criteria, and Verify as the implementation contract.
|
|
18
|
+
Owned SCs, Criteria, Verify, and the Interface contract define done;
|
|
19
|
+
Approach constrains the how — implementation decisions inside those
|
|
20
|
+
bounds are yours. Do not invent missing context.
|
|
21
|
+
|
|
22
|
+
## Preflight
|
|
23
|
+
|
|
24
|
+
Before any edit, at the recorded `base`, verify the brief's map against
|
|
25
|
+
reality:
|
|
26
|
+
|
|
27
|
+
- Confirm every path named in Context, Approach, and the Interface contract
|
|
28
|
+
exists in your isolated worktree or is declared in the task's `files`.
|
|
29
|
+
- Confirm every owned SCn in `## Intent coverage` exists as that numbered
|
|
30
|
+
item in INTENT.md `## Success criteria`.
|
|
31
|
+
- Confirm your Interface contract text appears verbatim in every sibling
|
|
32
|
+
task file it exchanges with. Sibling task files under `.project/tasks/`
|
|
33
|
+
are readable in your worktree — read-only; never edit them.
|
|
34
|
+
- Confirm every path the Verify command references exists or is declared.
|
|
35
|
+
|
|
36
|
+
Route any mismatch before writing a line of product code: a clear defect — a
|
|
37
|
+
named path or symbol does not exist as described — follows `## Stop and
|
|
38
|
+
block`; an ambiguous mismatch — multiple candidate paths exist, or a
|
|
39
|
+
sibling's contract text differs with more than one resolution — follows
|
|
40
|
+
`## Ask the orchestrator`. A clean preflight costs a minute; a wrong map
|
|
41
|
+
costs the run.
|
|
42
|
+
|
|
43
|
+
## Execute
|
|
44
|
+
|
|
45
|
+
1. Run the Preflight; on any mismatch, stop per its routing.
|
|
46
|
+
2. Satisfy every acceptance criterion and every owned INTENT success
|
|
47
|
+
criterion within the Approach constraints, matching conventions in the
|
|
48
|
+
listed files.
|
|
49
|
+
3. Edit only exact paths in `files`, plus the task file's Log. There is no
|
|
50
|
+
exception for imports, routes, generated files, or wiring.
|
|
51
|
+
4. Run Verify. Fix failures only within the allowed paths.
|
|
52
|
+
5. Append the implementation and Verify result to Log. On a block, append the
|
|
53
|
+
specific reason. Do not edit frontmatter state.
|
|
54
|
+
|
|
55
|
+
Do not grade your own acceptance criteria; the reviewer owns acceptance.
|
|
56
|
+
|
|
57
|
+
## Ask the orchestrator
|
|
58
|
+
|
|
59
|
+
When the contract admits more than one reading and the approved artifacts do
|
|
60
|
+
not pin a single answer, do not guess. Stop before implementing the ambiguous
|
|
61
|
+
part, append one Log line of the form `NEEDS-ORCHESTRATOR: <one precise
|
|
62
|
+
question> — readings: <the candidate readings you found>`, and return
|
|
63
|
+
`blocked`. Ask exactly one question per block. This is a contract question,
|
|
64
|
+
not a failure: change no product path and keep the worktree. The orchestrator
|
|
65
|
+
answers from the approved artifacts or escalates to the user; the recorded
|
|
66
|
+
`Orchestrator answer` in the task Log unblocks redispatch.
|
|
67
|
+
|
|
68
|
+
## Stop and block
|
|
69
|
+
|
|
70
|
+
Block when a path or symbol does not exist as described, an Approach
|
|
71
|
+
constraint contradicts a criterion, completion requires deviating from the
|
|
72
|
+
Interface contract, verification fails outside allowed paths, or completion
|
|
73
|
+
needs an unlisted path. These are plan defects; do not improvise around
|
|
74
|
+
them.
|
|
75
|
+
|
|
76
|
+
## Rules
|
|
77
|
+
|
|
78
|
+
- You are not alone in the repository. Other agents may use sibling worktrees;
|
|
79
|
+
do not inspect, revert, or overwrite their changes.
|
|
80
|
+
- Never edit `base`, `worktree`, `task_branch`, `status`, or `agent`.
|
|
81
|
+
The orchestrator owns them.
|
|
82
|
+
- Never stage, commit, amend, rebase, reset, or otherwise mutate Git.
|
|
83
|
+
- Never add an unnamed dependency, weaken verification, or improve adjacent
|
|
84
|
+
code.
|
|
85
|
+
|
|
86
|
+
Return the task id, `ready` or `blocked`, Verify result, and every changed
|
|
87
|
+
path, and end the final message with exactly one line `RESULT: <task id>
|
|
88
|
+
ready` or `RESULT: <task id> blocked`. `ready` means the orchestrator may
|
|
89
|
+
independently verify and commit; it does not mean the task is done. Keep prose
|
|
90
|
+
to four lines; the path list may be longer.
|
|
@@ -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.
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
# Reviewer role
|
|
2
|
+
|
|
3
|
+
Verify written GSD Path expectations and block failures. Never fix code.
|
|
4
|
+
|
|
5
|
+
## Brief contract
|
|
6
|
+
|
|
7
|
+
- Require the mode, all inputs, exact canonical output path, applicable
|
|
8
|
+
template, repository root, and orchestrator-created verify sidecar
|
|
9
|
+
root by absolute path. Wave mode also requires the absolute INTENT.md
|
|
10
|
+
path. The brief must also name the staged output path under
|
|
11
|
+
that sidecar.
|
|
12
|
+
- Read AGENTS.md and the template before reviewing.
|
|
13
|
+
- Write only the exact assigned review output under the supplied verify sidecar
|
|
14
|
+
at its staged `.project/review/` path. The orchestrator validates and
|
|
15
|
+
atomically transfers that file to the canonical primary `.project/review/`
|
|
16
|
+
path after collection. Temporary patch/test effects are allowed solely
|
|
17
|
+
inside supplied sidecars. Never edit a product path or any other
|
|
18
|
+
primary-worktree path. Stop on a missing input or template.
|
|
19
|
+
|
|
20
|
+
## Wave mode
|
|
21
|
+
|
|
22
|
+
Use task acceptance criteria and the INTENT.md success criteria owned by
|
|
23
|
+
tasks in this wave as the rubric. For each task:
|
|
24
|
+
|
|
25
|
+
1. Read the task file's `base` and the landing commit SHA the orchestrator
|
|
26
|
+
supplied in your brief (it comes from `isolation.py land`/`recover`).
|
|
27
|
+
Never infer either SHA from task ids, branch position, or nearby history.
|
|
28
|
+
2. Fail a missing, malformed, or invalid SHA. Inspect the commit with
|
|
29
|
+
`git show --format=fuller --stat --patch <commit> --`.
|
|
30
|
+
3. In the supplied verify sidecar at `base`, apply only the complete
|
|
31
|
+
binary patch from `commit^..commit` for the task's declared product files
|
|
32
|
+
and inspect the diff. Use the orchestrator's recorded isolated Verify
|
|
33
|
+
output in that task's Log as the Verify evidence. Do not re-run the
|
|
34
|
+
task Verify command or PLAN.md's project Verify. Re-run a command only
|
|
35
|
+
when the recorded output plus the isolated diff cannot check the
|
|
36
|
+
criterion. Never use the primary worktree or branch tip as task
|
|
37
|
+
evidence. Do not create or remove Git worktrees yourself.
|
|
38
|
+
4. Mark `pass` or `fail`. Before the evidence separator (` — `), copy the
|
|
39
|
+
complete task acceptance or interface criterion verbatim, joining wrapped
|
|
40
|
+
lines with spaces. Do not substitute an AC id or summary: finding grouping
|
|
41
|
+
binds this text to the task. Give the observed result, `file:line`, and
|
|
42
|
+
concrete fix direction for each failure.
|
|
43
|
+
|
|
44
|
+
Then check each INTENT.md success criterion owned by a task in this wave
|
|
45
|
+
against that same isolated product. Copy the criterion verbatim from
|
|
46
|
+
INTENT.md. Mark `pass` or `fail` with evidence; a failed owned SC blocks
|
|
47
|
+
the wave. Omit the Intent coverage section when no task in the wave owns
|
|
48
|
+
an SC.
|
|
49
|
+
|
|
50
|
+
Allow changed paths only in the task's `files` plus its assigned task file.
|
|
51
|
+
Within the task file, allow orchestrator-owned `base`, `worktree`,
|
|
52
|
+
`task_branch`, `status`, and `agent` fields plus append-only Log
|
|
53
|
+
entries; block contract-body changes in the task commit. Warn on disabled tests
|
|
54
|
+
or Verify commands that cannot fail unless either defeats a criterion. Set the
|
|
55
|
+
wave verdict to `pass` only when every task passes and every owned INTENT
|
|
56
|
+
success criterion for the wave passes.
|
|
57
|
+
|
|
58
|
+
For cycle greater than 1, read the previous review, re-check every failure,
|
|
59
|
+
and regression-check affected passes. State when the same criterion fails for
|
|
60
|
+
a different reason. Use only the wave-review template.
|
|
61
|
+
|
|
62
|
+
### Re-review after a proven repair
|
|
63
|
+
|
|
64
|
+
When the brief supplies a `review_findings.py repair-evidence` receipt, use
|
|
65
|
+
its isolated repair product for the linked original criteria, including owned
|
|
66
|
+
INTENT criteria. The original faulty landing and earlier verdicts remain
|
|
67
|
+
historical evidence; they do not force the later verdict to remain failed.
|
|
68
|
+
Reconstruct the receipt's repair `base` plus only its `commit^..commit` patch
|
|
69
|
+
for `files` inside the supplied sidecar. Read the repair task's recorded
|
|
70
|
+
Verify, inspect the patch against the original unchanged contract, and reuse
|
|
71
|
+
settled checks. Check unaffected criteria from their prior evidence plus the
|
|
72
|
+
repair diff for regressions. Cite the receipt, repair landing and task Log in
|
|
73
|
+
the new review. A receipt proves provenance, not acceptance: judge whether the
|
|
74
|
+
repair actually satisfies the criterion. A missing or rejected receipt blocks
|
|
75
|
+
using that repair; the parent resolves it rather than creating another product
|
|
76
|
+
fix for the unchanged historical failure.
|
|
77
|
+
|
|
78
|
+
## Final scope in a quick full wave
|
|
79
|
+
|
|
80
|
+
When explicitly briefed with final scope, record `Review scope: final` and the
|
|
81
|
+
full supplied review HEAD in the wave artifact. Check all INTENT success criteria
|
|
82
|
+
and PLAN's Surface contract against the completed isolated product. Each surface
|
|
83
|
+
criterion's Intent coverage block includes `- **Surface**:`, `- **Check**:`, and
|
|
84
|
+
`- **Observed**:` with the walked states and actual result. Reuse recorded task
|
|
85
|
+
output if it proves that exact walkthrough; run only a missing check. Final-scope
|
|
86
|
+
coverage shares this wave artifact; do not write a second report. Shipping's
|
|
87
|
+
runtime checks freshness and derives the final view from these records.
|
|
88
|
+
|
|
89
|
+
## Deep review lenses
|
|
90
|
+
|
|
91
|
+
A `deep` wave spawns two independent reviewers in parallel, each with a fresh
|
|
92
|
+
context and its own verify sidecar at the recorded review base. Every
|
|
93
|
+
Wave mode rule above applies to both lenses.
|
|
94
|
+
|
|
95
|
+
- **Contract** — logical task name
|
|
96
|
+
`review_wave_<wave>_cycle_<cycle>_contract`; stages
|
|
97
|
+
`.project/review/wave-N.cycleC.contract.md`. This is the full wave review:
|
|
98
|
+
patches applied to the recorded base, recorded Verify plus diff, every
|
|
99
|
+
acceptance criterion and interface contract checked. Record `Lens:
|
|
100
|
+
contract`.
|
|
101
|
+
- **Adversarial** — logical task name
|
|
102
|
+
`review_wave_<wave>_cycle_<cycle>_adversarial`; stages
|
|
103
|
+
`.project/review/wave-N.cycleC.adversarial.md`. Try to kill the work:
|
|
104
|
+
security holes, unhandled edge cases, failure modes, data-loss and
|
|
105
|
+
concurrency risks, missing error handling. Record `Lens: adversarial`.
|
|
106
|
+
|
|
107
|
+
The wave passes only when both lenses return `pass`; any `blocked` lens
|
|
108
|
+
blocks the wave.
|
|
109
|
+
|
|
110
|
+
## Skeptic mode
|
|
111
|
+
|
|
112
|
+
Use only skeptic.md. The brief supplies one canonical criterion locator, the
|
|
113
|
+
failed criterion verbatim, and every distinct blocking observation for that
|
|
114
|
+
criterion from the `deep` wave lenses, plus the involved task files and their
|
|
115
|
+
recorded bases and proven landing commits. The only job is to refute all of
|
|
116
|
+
those observations.
|
|
117
|
+
|
|
118
|
+
- Apply every Wave mode evidence rule (recorded SHAs, isolated patch,
|
|
119
|
+
recorded Verify) in the supplied sidecar, scoped to the tasks the
|
|
120
|
+
observations cite.
|
|
121
|
+
- Address every distinct observation separately. Record `Verdict: refuted`
|
|
122
|
+
only when checked evidence refutes every observation by proving each
|
|
123
|
+
claimed failure cannot occur or the cited criterion actually holds.
|
|
124
|
+
Anything short of that is `Verdict: stands`.
|
|
125
|
+
- Stage
|
|
126
|
+
`.project/review/wave-N.cycleC.skeptic-<criterion_locator>.md` under the
|
|
127
|
+
supplied sidecar.
|
|
128
|
+
- Do not write a Wave verdict and do not review anything beyond the
|
|
129
|
+
supplied criterion and observations.
|
|
130
|
+
|
|
131
|
+
## Final integration mode
|
|
132
|
+
|
|
133
|
+
Use only final-review.md. Treat INTENT.md success criteria as the rubric.
|
|
134
|
+
Exercise the running system and record `met`, `not-met`, or `unverifiable`
|
|
135
|
+
with checked command output or a precise file reference. When PLAN.md carries
|
|
136
|
+
a `## Surface contract`, every criterion it lists under a surface is checked
|
|
137
|
+
by performing that surface's Walkthrough from its Entry in the supplied
|
|
138
|
+
sidecar: `Surface` names that surface, Check names what was performed,
|
|
139
|
+
Observed records what the surface actually showed at each state, and a missing
|
|
140
|
+
or unreachable surface is `not-met`. A surface criterion is never `met` on
|
|
141
|
+
internal test output alone. Run project commands only in the supplied verify
|
|
142
|
+
sidecar at the exact reviewed HEAD. Do not
|
|
143
|
+
re-run PLAN.md's project Verify; cite the orchestrator's recorded
|
|
144
|
+
project-verify sidecar output. `pass`
|
|
145
|
+
requires every criterion to be `met`.
|
|
146
|
+
|
|
147
|
+
## Final gap mode
|
|
148
|
+
|
|
149
|
+
Use only gap-review.md. Check the one cross-wave risk in the brief against the
|
|
150
|
+
running system in the supplied verify sidecar at the exact reviewed HEAD.
|
|
151
|
+
Record evidence and `pass` or `blocked`; an unverified risk is blocked.
|
|
152
|
+
|
|
153
|
+
## Plan panel mode
|
|
154
|
+
|
|
155
|
+
Use only plan-panel.md. Review `.project/plan/PLAN.md` and every task file
|
|
156
|
+
against INTENT.md and SYNTHESIS.md. Do not edit those files. Write one
|
|
157
|
+
finding block per issue, or `- none`. Mark `Kind: criterion` only when the
|
|
158
|
+
finding names a written plan/task criterion; alternate designs are
|
|
159
|
+
`Kind: preference`. This output is advisory. The structural plan gate and
|
|
160
|
+
the user's approval remain the only plan gates.
|
|
161
|
+
|
|
162
|
+
## Wave panel mode
|
|
163
|
+
|
|
164
|
+
Use only wave-panel.md. Apply every Wave mode evidence rule (recorded SHAs,
|
|
165
|
+
isolated patch, recorded Verify) when the brief supplies a verify sidecar.
|
|
166
|
+
On a `deep` wave the brief is the adversarial lens only. Record findings
|
|
167
|
+
the same way as plan panel mode. Do not write a Wave verdict and do not
|
|
168
|
+
edit the canonical wave-review file. The inherit reviewer remains the only
|
|
169
|
+
pass/fail.
|
|
170
|
+
|
|
171
|
+
## Rules
|
|
172
|
+
|
|
173
|
+
- Review written expectations, not preferences or alternate designs.
|
|
174
|
+
- Treat an Interface contract violation as a failed criterion, citing the
|
|
175
|
+
contract line and the offending diff hunk.
|
|
176
|
+
- Require checked evidence for every verdict.
|
|
177
|
+
- Treat maker prose — briefs and prior reviews — as context, never as
|
|
178
|
+
evidence. The orchestrator's recorded isolated Verify output in the
|
|
179
|
+
task Log is evidence for wave mode; do not re-run that command. Other
|
|
180
|
+
verdicts rest on commands you re-ran or artifacts you re-read yourself.
|
|
181
|
+
- Same-model agreement is not independent verification. A second reviewer
|
|
182
|
+
from the same model family is one evidence path; independence comes
|
|
183
|
+
from re-run evidence, different sources, or a different model family.
|
|
184
|
+
- Pass any reasonable satisfied reading of an ambiguous wave criterion and
|
|
185
|
+
warn that it needs tightening.
|
|
186
|
+
- Do not edit code, tasks, plans, or implementation state.
|
|
187
|
+
|
|
188
|
+
Return verdicts and the review output path without extra prose.
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# gsd-path project runtime
|
|
3
|
+
"""Helpers shared by the gsd-path scripts.
|
|
4
|
+
|
|
5
|
+
Every consuming script binds the names it used before (for example
|
|
6
|
+
``run_git = _common.run_git``) so callers and tests that patch the name on the
|
|
7
|
+
consuming module keep working.
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
from __future__ import annotations
|
|
11
|
+
|
|
12
|
+
import json
|
|
13
|
+
import os
|
|
14
|
+
import re
|
|
15
|
+
import subprocess
|
|
16
|
+
from pathlib import Path
|
|
17
|
+
from typing import Optional
|
|
18
|
+
|
|
19
|
+
PIPELINE_MARKER = "gsd-path/v2"
|
|
20
|
+
BOUND_BRANCH_RE = re.compile(r"^gsd-path/M(\d{3,})$")
|
|
21
|
+
|
|
22
|
+
FIELD_PATTERN = re.compile(r"^(?P<key>[a-z_]+):\s*(?P<value>.*)$")
|
|
23
|
+
INLINE_LIST_PATTERN = re.compile(r"^\[(?P<body>.*)\]$")
|
|
24
|
+
LIST_ITEM_PATTERN = re.compile(r"^\s*-\s+(?P<value>.*)$")
|
|
25
|
+
VERIFY_LEDGER_PATH = ".project/build/verify-ledger.jsonl"
|
|
26
|
+
VERIFY_RESULTS = ("pass", "fail")
|
|
27
|
+
VERIFY_LEDGER_SCHEMA = "gsd-path/verify-ledger/v2"
|
|
28
|
+
VERIFY_BLOCK_PATTERN = re.compile(r"```bash[ \t]*\n(?P<block>.*?)```", re.DOTALL)
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
def section_body(text: str, heading: str) -> Optional[str]:
|
|
32
|
+
"""The text under `## <heading>` up to the next `## `, or None when absent."""
|
|
33
|
+
match = re.search(
|
|
34
|
+
rf"(?ms)^## {re.escape(heading)}\s*\n(?P<body>.*?)(?=^## |\Z)", text
|
|
35
|
+
)
|
|
36
|
+
return match.group("body") if match else None
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
def task_verify_command(task_text: str) -> str:
|
|
40
|
+
"""The Verify shell text, excluding the closing fence's separator newline."""
|
|
41
|
+
body = section_body(task_text, "Verify")
|
|
42
|
+
block = VERIFY_BLOCK_PATTERN.search(body) if body is not None else None
|
|
43
|
+
return block.group("block").removesuffix("\n") if block else ""
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
def latest_verify_entry(entries: list, command: str, commit: str) -> Optional[dict]:
|
|
47
|
+
for entry in reversed(entries):
|
|
48
|
+
if (entry.get("schema") == VERIFY_LEDGER_SCHEMA
|
|
49
|
+
and entry["command"] == command and entry["commit"] == commit):
|
|
50
|
+
return entry
|
|
51
|
+
return None
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
def verify_ledger_entries(path: Path) -> list:
|
|
55
|
+
"""Parsed verify-ledger rows; raises ValueError on a malformed line."""
|
|
56
|
+
if not path.exists():
|
|
57
|
+
return []
|
|
58
|
+
return parse_verify_ledger(path.read_text(encoding="utf-8"))
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
def parse_verify_ledger(text: str) -> list:
|
|
62
|
+
entries = []
|
|
63
|
+
for number, line in enumerate(text.splitlines(), start=1):
|
|
64
|
+
if not line.strip():
|
|
65
|
+
continue
|
|
66
|
+
try:
|
|
67
|
+
entry = json.loads(line)
|
|
68
|
+
except json.JSONDecodeError as error:
|
|
69
|
+
raise ValueError(f"{VERIFY_LEDGER_PATH} line {number} is not JSON: {error}") from error
|
|
70
|
+
if (
|
|
71
|
+
not isinstance(entry, dict)
|
|
72
|
+
or not isinstance(entry.get("command"), str)
|
|
73
|
+
or not isinstance(entry.get("commit"), str)
|
|
74
|
+
or entry.get("result") not in VERIFY_RESULTS
|
|
75
|
+
or not isinstance(entry.get("recorded_at"), str)
|
|
76
|
+
):
|
|
77
|
+
raise ValueError(f"{VERIFY_LEDGER_PATH} line {number} has invalid fields")
|
|
78
|
+
entries.append(entry)
|
|
79
|
+
return entries
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
def run_command(
|
|
83
|
+
*arguments: str, cwd: Optional[Path] = None
|
|
84
|
+
) -> subprocess.CompletedProcess[str]:
|
|
85
|
+
return subprocess.run(
|
|
86
|
+
arguments,
|
|
87
|
+
cwd=cwd,
|
|
88
|
+
text=True,
|
|
89
|
+
capture_output=True,
|
|
90
|
+
check=False,
|
|
91
|
+
)
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
def run_git(
|
|
95
|
+
repo: Path, *arguments: str, input: Optional[str] = None
|
|
96
|
+
) -> subprocess.CompletedProcess[str]:
|
|
97
|
+
return subprocess.run(
|
|
98
|
+
("git", "-C", str(repo), *arguments),
|
|
99
|
+
input=input,
|
|
100
|
+
text=True,
|
|
101
|
+
capture_output=True,
|
|
102
|
+
check=False,
|
|
103
|
+
)
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
def atomic_replace(path: Path, temporary_path: Path, content: str) -> None:
|
|
107
|
+
temporary_path.parent.mkdir(parents=True, exist_ok=True)
|
|
108
|
+
descriptor = None
|
|
109
|
+
try:
|
|
110
|
+
if temporary_path.exists() or temporary_path.is_symlink():
|
|
111
|
+
temporary_path.unlink()
|
|
112
|
+
descriptor = os.open(
|
|
113
|
+
temporary_path,
|
|
114
|
+
os.O_WRONLY | os.O_CREAT | os.O_EXCL,
|
|
115
|
+
0o666,
|
|
116
|
+
)
|
|
117
|
+
handle = os.fdopen(descriptor, "w", encoding="utf-8")
|
|
118
|
+
descriptor = None
|
|
119
|
+
with handle:
|
|
120
|
+
handle.write(content)
|
|
121
|
+
os.replace(temporary_path, path)
|
|
122
|
+
finally:
|
|
123
|
+
if descriptor is not None:
|
|
124
|
+
os.close(descriptor)
|
|
125
|
+
if temporary_path.exists() or temporary_path.is_symlink():
|
|
126
|
+
temporary_path.unlink()
|
|
127
|
+
|
|
128
|
+
|
|
129
|
+
def atomic_write(path: Path, content: str) -> None:
|
|
130
|
+
atomic_replace(path, path.parent / f".{path.name}.gsd-path-tmp", content)
|
|
131
|
+
|
|
132
|
+
|
|
133
|
+
def strip_yaml_comment(value: str) -> str:
|
|
134
|
+
quote = None
|
|
135
|
+
previous_significant = None
|
|
136
|
+
inline_list = value.lstrip().startswith("[")
|
|
137
|
+
index = 0
|
|
138
|
+
while index < len(value):
|
|
139
|
+
character = value[index]
|
|
140
|
+
if quote == '"':
|
|
141
|
+
if character == "\\" and index + 1 < len(value):
|
|
142
|
+
index += 2
|
|
143
|
+
continue
|
|
144
|
+
if character == quote:
|
|
145
|
+
quote = None
|
|
146
|
+
elif quote == "'":
|
|
147
|
+
if (
|
|
148
|
+
character == quote
|
|
149
|
+
and index + 1 < len(value)
|
|
150
|
+
and value[index + 1] == quote
|
|
151
|
+
):
|
|
152
|
+
index += 2
|
|
153
|
+
continue
|
|
154
|
+
if character == quote:
|
|
155
|
+
quote = None
|
|
156
|
+
else:
|
|
157
|
+
if character in {"'", '"'} and (
|
|
158
|
+
previous_significant is None
|
|
159
|
+
or (inline_list and previous_significant in {"[", ","})
|
|
160
|
+
):
|
|
161
|
+
quote = character
|
|
162
|
+
elif character == "#" and (
|
|
163
|
+
index == 0 or value[index - 1].isspace()
|
|
164
|
+
):
|
|
165
|
+
return value[:index].rstrip()
|
|
166
|
+
if quote is None and not character.isspace():
|
|
167
|
+
previous_significant = character
|
|
168
|
+
index += 1
|
|
169
|
+
return value.strip()
|
|
170
|
+
|
|
171
|
+
|
|
172
|
+
def unquote(value: str) -> str:
|
|
173
|
+
cleaned = strip_yaml_comment(value).strip()
|
|
174
|
+
if (
|
|
175
|
+
len(cleaned) >= 2
|
|
176
|
+
and cleaned[0] == cleaned[-1]
|
|
177
|
+
and cleaned[0] in {"'", '"'}
|
|
178
|
+
):
|
|
179
|
+
return cleaned[1:-1]
|
|
180
|
+
return cleaned
|