@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,146 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""Persist observed Codex output usage and block admission after exhaustion.
|
|
3
|
+
|
|
4
|
+
This is an admission gate, not an in-flight generation cap. Codex CLI does not
|
|
5
|
+
expose a hard output-token cap. Unobserved calls are not budget evidence.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
import argparse
|
|
9
|
+
import json
|
|
10
|
+
import sys
|
|
11
|
+
from pathlib import Path
|
|
12
|
+
|
|
13
|
+
try:
|
|
14
|
+
from _common import atomic_write
|
|
15
|
+
from loop_run import log_lock
|
|
16
|
+
except ModuleNotFoundError: # pragma: no cover - package imports
|
|
17
|
+
from scripts._common import atomic_write
|
|
18
|
+
from scripts.loop_run import log_lock
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
SCHEMA = "gsd-path/token-budget/v1"
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def positive(value):
|
|
25
|
+
result = int(value)
|
|
26
|
+
if result <= 0:
|
|
27
|
+
raise argparse.ArgumentTypeError("budget must be positive")
|
|
28
|
+
return result
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
def output_usage(path: Path) -> int:
|
|
32
|
+
usages = []
|
|
33
|
+
child_usage = None
|
|
34
|
+
child = False
|
|
35
|
+
starts = 0
|
|
36
|
+
complete = False
|
|
37
|
+
text = path.read_text(encoding="utf-8")
|
|
38
|
+
try:
|
|
39
|
+
document = json.loads(text)
|
|
40
|
+
except ValueError:
|
|
41
|
+
document = None
|
|
42
|
+
if isinstance(document, dict) and isinstance(document.get("usage"), dict):
|
|
43
|
+
# Claude Code `-p --output-format json`: one document with the run's usage.
|
|
44
|
+
usages.append(document["usage"].get("output_tokens"))
|
|
45
|
+
text = ""
|
|
46
|
+
for line in text.splitlines():
|
|
47
|
+
event = json.loads(line)
|
|
48
|
+
if "raw" in event:
|
|
49
|
+
event = json.loads(event["raw"])
|
|
50
|
+
if event.get("type") == "turn.completed":
|
|
51
|
+
usages.append(event["usage"]["output_tokens"])
|
|
52
|
+
payload = event.get("payload", {})
|
|
53
|
+
if event.get("type") == "session_meta":
|
|
54
|
+
source = payload.get("source", {})
|
|
55
|
+
child = isinstance(source, dict) and "subagent" in source
|
|
56
|
+
if event.get("type") == "event_msg":
|
|
57
|
+
if payload.get("type") == "task_started":
|
|
58
|
+
starts += 1
|
|
59
|
+
complete = False
|
|
60
|
+
elif payload.get("type") == "token_count" and payload.get("info"):
|
|
61
|
+
child_usage = payload["info"]["total_token_usage"]["output_tokens"]
|
|
62
|
+
elif payload.get("type") == "task_complete":
|
|
63
|
+
complete = True
|
|
64
|
+
if not usages and child and starts == 1 and complete and child_usage is not None:
|
|
65
|
+
# Only a single native invocation has an unambiguous cumulative counter.
|
|
66
|
+
usages = [child_usage]
|
|
67
|
+
if not usages or any(type(value) is not int or value < 0 for value in usages):
|
|
68
|
+
raise ValueError("complete supported output usage is unavailable; budget is unproven")
|
|
69
|
+
return sum(usages)
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
def operate(args):
|
|
73
|
+
ledger = args.ledger.absolute()
|
|
74
|
+
if ledger.is_symlink():
|
|
75
|
+
raise ValueError("ledger must be a real file")
|
|
76
|
+
with log_lock({"log": str(ledger)}):
|
|
77
|
+
if args.action == "configure":
|
|
78
|
+
policy = {"schema": SCHEMA, "host": "codex-cli", "metric": "output_tokens",
|
|
79
|
+
"task_limit": args.task_limit, "session_limit": args.session_limit,
|
|
80
|
+
"authority": args.authority}
|
|
81
|
+
if ledger.exists():
|
|
82
|
+
data = json.loads(ledger.read_text())
|
|
83
|
+
if any(data.get(key) != value for key, value in policy.items()):
|
|
84
|
+
raise ValueError("existing session policy differs; configuration cannot reset usage")
|
|
85
|
+
else:
|
|
86
|
+
data = {**policy, "observations": {}}
|
|
87
|
+
atomic_write(ledger, json.dumps(data, indent=2) + "\n")
|
|
88
|
+
return {"status": "configured", "hard_cap_supported": False}
|
|
89
|
+
data = json.loads(ledger.read_text())
|
|
90
|
+
if data.get("schema") != SCHEMA or data.get("host") != "codex-cli":
|
|
91
|
+
raise ValueError("unsupported budget ledger")
|
|
92
|
+
if args.action == "record":
|
|
93
|
+
source = str(args.events.resolve())
|
|
94
|
+
observation = {"task": args.task, "output_tokens": output_usage(args.events)}
|
|
95
|
+
previous = data["observations"].get(source)
|
|
96
|
+
if previous and (previous["task"] != args.task or
|
|
97
|
+
previous["output_tokens"] > observation["output_tokens"]):
|
|
98
|
+
raise ValueError("observation cannot change task or reduce recorded usage")
|
|
99
|
+
data["observations"][source] = observation
|
|
100
|
+
atomic_write(ledger, json.dumps(data, indent=2) + "\n")
|
|
101
|
+
return {"status": "recorded", **observation, "hard_cap_supported": False}
|
|
102
|
+
observations = data["observations"].values()
|
|
103
|
+
task_used = sum(row["output_tokens"] for row in observations if row["task"] == args.task)
|
|
104
|
+
session_used = sum(row["output_tokens"] for row in observations)
|
|
105
|
+
task_remaining = max(0, data["task_limit"] - task_used)
|
|
106
|
+
session_remaining = max(0, data["session_limit"] - session_used)
|
|
107
|
+
reason = "observed usage is within budget; unobserved and in-flight usage is unproven"
|
|
108
|
+
blocked = not task_remaining or not session_remaining
|
|
109
|
+
if blocked:
|
|
110
|
+
reason = "observed output budget exhausted"
|
|
111
|
+
if args.require_hard_cap:
|
|
112
|
+
blocked = True
|
|
113
|
+
reason = "hard generation cap unsupported by Codex CLI"
|
|
114
|
+
return {"decision": "blocked" if blocked else "admit", "reason": reason,
|
|
115
|
+
"task_output_tokens": task_used, "session_output_tokens": session_used,
|
|
116
|
+
"task_remaining": task_remaining, "session_remaining": session_remaining,
|
|
117
|
+
"hard_cap_supported": False, "enforcement": "observed-admission-only"}
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
def main(argv=None):
|
|
121
|
+
parser = argparse.ArgumentParser(description=__doc__)
|
|
122
|
+
subparsers = parser.add_subparsers(dest="action", required=True)
|
|
123
|
+
for name in ("configure", "record", "admit"):
|
|
124
|
+
command = subparsers.add_parser(name)
|
|
125
|
+
command.add_argument("--ledger", type=Path, required=True)
|
|
126
|
+
if name == "configure":
|
|
127
|
+
command.add_argument("--task-limit", type=positive, required=True)
|
|
128
|
+
command.add_argument("--session-limit", type=positive, required=True)
|
|
129
|
+
command.add_argument("--authority", required=True)
|
|
130
|
+
else:
|
|
131
|
+
command.add_argument("--task", required=True)
|
|
132
|
+
if name == "record":
|
|
133
|
+
command.add_argument("--events", type=Path, required=True)
|
|
134
|
+
if name == "admit":
|
|
135
|
+
command.add_argument("--require-hard-cap", action="store_true")
|
|
136
|
+
try:
|
|
137
|
+
result = operate(parser.parse_args(argv))
|
|
138
|
+
except (ValueError, OSError, KeyError, TypeError) as error:
|
|
139
|
+
print(json.dumps({"decision": "blocked", "reason": str(error)}))
|
|
140
|
+
return 1
|
|
141
|
+
print(json.dumps(result, sort_keys=True))
|
|
142
|
+
return 1 if result.get("decision") == "blocked" else 0
|
|
143
|
+
|
|
144
|
+
|
|
145
|
+
if __name__ == "__main__":
|
|
146
|
+
raise SystemExit(main())
|
|
@@ -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,36 @@
|
|
|
1
|
+
# Skeptic — wave <N>, cycle <C>
|
|
2
|
+
|
|
3
|
+
<!-- Written by one finding-skeptic child. Advisory to fix-task batching
|
|
4
|
+
only: the inherit reviewer owns Wave verdict. -->
|
|
5
|
+
|
|
6
|
+
- Criterion: <the failed criterion, verbatim from the lens file>
|
|
7
|
+
- Criterion locator: <t001_ac2 | t001_files | sc3>
|
|
8
|
+
- Lenses: <contract | adversarial | both>
|
|
9
|
+
|
|
10
|
+
## Observations
|
|
11
|
+
|
|
12
|
+
<!-- Repeat for every distinct lens observation. Collapse only true
|
|
13
|
+
duplicates. Give each observation a unique number and exactly one
|
|
14
|
+
verdict with that number below; unknown or duplicate verdict numbers
|
|
15
|
+
are invalid. The criterion locator, not these local numbers, is the
|
|
16
|
+
finding identity across cycles. -->
|
|
17
|
+
|
|
18
|
+
### Observation <n> — <contract | adversarial>
|
|
19
|
+
|
|
20
|
+
<the observation verbatim: criterion, observed result, file:line>
|
|
21
|
+
|
|
22
|
+
## Observation verdicts
|
|
23
|
+
|
|
24
|
+
### Observation <n>: <refuted | stands>
|
|
25
|
+
|
|
26
|
+
<checked evidence for this observation>
|
|
27
|
+
|
|
28
|
+
## Verdict
|
|
29
|
+
|
|
30
|
+
<refuted | stands>
|
|
31
|
+
|
|
32
|
+
## Evidence
|
|
33
|
+
|
|
34
|
+
<checked evidence: the command re-run in the sidecar or the artifact
|
|
35
|
+
re-read, with its result. A refuted verdict requires every observation above
|
|
36
|
+
to be individually refuted; anything short of that is stands.>
|
|
@@ -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,25 @@
|
|
|
1
|
+
# Panel — wave <N>, cycle <C>
|
|
2
|
+
|
|
3
|
+
<!-- Written by one review-panel child. Advisory only: the inherit reviewer
|
|
4
|
+
owns Wave verdict. Kind criterion may be presented to the user when
|
|
5
|
+
Severity is high; preference stays a warning. -->
|
|
6
|
+
|
|
7
|
+
- Family: <claude | gpt | grok | composer | gemini | deepseek | kimi | qwen>
|
|
8
|
+
- Model: <exact advertised slug>
|
|
9
|
+
- Depth: <full | adversarial>
|
|
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: T001 acceptance 1
|
|
19
|
+
- Evidence: src/app.py:12
|
|
20
|
+
- Found: <what exists instead>
|
|
21
|
+
- Fix direction: <concrete coder direction>
|
|
22
|
+
|
|
23
|
+
## Summary
|
|
24
|
+
|
|
25
|
+
<one paragraph; do not edit code, tasks, or the canonical wave review>
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
# Review — wave <N>, cycle <C>
|
|
2
|
+
|
|
3
|
+
<!-- Written by the reviewer role in wave mode. File: wave-N.cycleC.md —
|
|
4
|
+
deep reviews use wave-N.cycleC.contract.md and
|
|
5
|
+
wave-N.cycleC.adversarial.md instead. Keep validated fields on their
|
|
6
|
+
own lines: Cycle holds only the number
|
|
7
|
+
(C > 1 means re-review after fixes; see previous cycle file). -->
|
|
8
|
+
|
|
9
|
+
<!-- For quick single-full-wave final scope, include these two metadata lines
|
|
10
|
+
with actual values, otherwise omit them:
|
|
11
|
+
Reviewed HEAD: <full review commit SHA>
|
|
12
|
+
Review scope: final
|
|
13
|
+
In each surface SC block also include Surface, Check, and Observed fields
|
|
14
|
+
using the final-review format. Record the actual walkthrough evidence once. -->
|
|
15
|
+
|
|
16
|
+
Wave verdict: <pass | blocked — blocked if any task fails>
|
|
17
|
+
Cycle: <C>
|
|
18
|
+
Depth: <full | deep | verify-only — verify-only is orchestrator-written from
|
|
19
|
+
its isolated Verify evidence; no independent reviewer ran>
|
|
20
|
+
Lens: <contract | adversarial — deep reviews only; empty or omitted
|
|
21
|
+
otherwise>
|
|
22
|
+
Tasks reviewed: <count>
|
|
23
|
+
|
|
24
|
+
## T001 — <title>: <pass | fail>
|
|
25
|
+
|
|
26
|
+
<!-- Per task criterion: copy the full acceptance/interface criterion verbatim
|
|
27
|
+
before the em dash; join wrapped lines with spaces. An AC id or summary
|
|
28
|
+
alone cannot be matched by review_findings.py. -->
|
|
29
|
+
- ✅ <criterion> — <evidence: verify output / file:line checked>
|
|
30
|
+
- ❌ <criterion> — found: <what exists instead, file:line>
|
|
31
|
+
fix: <concrete direction a coder can execute without re-investigating>
|
|
32
|
+
|
|
33
|
+
Warnings (non-blocking):
|
|
34
|
+
- <weakened test / unfailable verify / none>
|
|
35
|
+
|
|
36
|
+
Contract violations (blocking):
|
|
37
|
+
- ❌ <task changed path outside its files list> — <evidence and fix direction>
|
|
38
|
+
|
|
39
|
+
<!-- Repeat per task. -->
|
|
40
|
+
|
|
41
|
+
## Intent coverage
|
|
42
|
+
|
|
43
|
+
<!-- One heading per INTENT.md success criterion owned by a task in this
|
|
44
|
+
wave, ending `: pass` or `: fail`. `scripts/check_handoffs.py wave
|
|
45
|
+
--review <this file>` gates the SC id set and verdicts. Omit this
|
|
46
|
+
section when no task in the wave owns an SC. -->
|
|
47
|
+
|
|
48
|
+
### SC1 — <criterion>: <pass | fail>
|
|
49
|
+
- ✅ <evidence: verify output / file:line checked>
|
|
50
|
+
- ❌ <criterion> — found: <what exists instead, file:line>
|
|
51
|
+
fix: <concrete direction a coder can execute without re-investigating>
|
|
52
|
+
|
|
53
|
+
## Fixed since last cycle
|
|
54
|
+
|
|
55
|
+
<!-- C > 1 only: previously failed criteria now confirmed fixed (re-checked,
|
|
56
|
+
not assumed), and any regressions the fixes introduced. -->
|
|
57
|
+
- <criterion> — confirmed fixed / regressed: <evidence>
|
|
58
|
+
|
|
59
|
+
## Summary for orchestrator
|
|
60
|
+
|
|
61
|
+
- blocked findings: <failed criteria grouped by disjoint file scope; the
|
|
62
|
+
orchestrator applies the configured skeptic or fix-task path>
|
|
63
|
+
- repeat offenders: <criteria failing across cycles — possible plan defect>
|
|
64
|
+
- warnings worth a human eye: <...or none>
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: gsd-path-decide
|
|
3
|
+
description: Decide implementation direction from approved intent and complete research evidence, recording settled choices in SYNTHESIS.md. Use only when the user explicitly invokes $gsd-path-decide or an active $gsd-path router explicitly routes to this phase.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# GSD Path Decide Phase
|
|
7
|
+
|
|
8
|
+
Dispatch one reasoning-intensive decider and validate its decision artifact.
|
|
9
|
+
|
|
10
|
+
Routing instructions below are caller handoffs under the AGENTS.md handoff
|
|
11
|
+
rule; never invoke an explicit-only sibling skill yourself.
|
|
12
|
+
|
|
13
|
+
Before dispatch and again before completion, apply the AGENTS.md
|
|
14
|
+
pending-answer rule with the bundled `scripts/discussion_records.py`; a
|
|
15
|
+
follow-up owned by decide is resolved in SYNTHESIS.md, or the phase blocks.
|
|
16
|
+
|
|
17
|
+
## Preconditions
|
|
18
|
+
|
|
19
|
+
Require `pipeline_state.py validate --repo <absolute root> [--project-dir
|
|
20
|
+
.project/next]` to pass; otherwise return to `$gsd-path` for ownership
|
|
21
|
+
checking. Legal entry is `research/done` or `decide/active|blocked`. On
|
|
22
|
+
`research/done`, enter with `pipeline_state.py transition`, expected
|
|
23
|
+
phase/status `research/done`, exact branch and archive values, event `decision
|
|
24
|
+
synthesis started`, and set phase/status `decide/active` (plus the same
|
|
25
|
+
lookahead project dir); never edit STATE directly. `decide/done` or any later phase blocks rather
|
|
26
|
+
than replacing decisions beneath an existing plan. When an active router
|
|
27
|
+
supplies the lookahead track root `.project/next/`, evaluate these
|
|
28
|
+
preconditions against the track instead; see Lookahead mode. Require
|
|
29
|
+
`.project/intent/INTENT.md`, `.project/research/RESEARCH.md`, and every
|
|
30
|
+
`evidence-*.md` file named as `dispatched` there. In program flow (CHARTER.md
|
|
31
|
+
exists, no milestone INTENT yet) require `.project/CHARTER.md` in INTENT.md's
|
|
32
|
+
place. A standard file may be absent
|
|
33
|
+
only when the handoff manifest records that dimension as skipped; a missing or
|
|
34
|
+
invalid manifest or dispatched file routes to `$gsd-path-research`. Include
|
|
35
|
+
every additional `evidence-*.md` file present only when the manifest names it.
|
|
36
|
+
|
|
37
|
+
Output path: when `.project/CHARTER.md` exists and `.project/ROADMAP.md` does
|
|
38
|
+
not, this is program scope — the required output is `.project/SYNTHESIS.md`
|
|
39
|
+
at the `.project/` top level; it persists across milestones and never
|
|
40
|
+
archives. Otherwise the required output is `.project/research/SYNTHESIS.md`,
|
|
41
|
+
which archives with its milestone.
|
|
42
|
+
|
|
43
|
+
## Lookahead mode
|
|
44
|
+
|
|
45
|
+
Entered only when an active router supplies the lookahead track root
|
|
46
|
+
`.project/next/` while the active STATE.md is `build/active` in program
|
|
47
|
+
flow. Evaluate every state and artifact precondition against the track:
|
|
48
|
+
`.project/next/STATE.md` is the state file, and INTENT.md, RESEARCH.md, and
|
|
49
|
+
the evidence files are read from `.project/next/`. The output is always
|
|
50
|
+
milestone scope: `.project/next/research/SYNTHESIS.md` — the program
|
|
51
|
+
SYNTHESIS.md already exists at the active `.project/` top level and is
|
|
52
|
+
never rewritten here, so the program-scope output-path rule above does not
|
|
53
|
+
apply. Run the research hand-off validator with `--project-dir
|
|
54
|
+
.project/next`. Dispatch, gates, `NEEDS-USER` handling, and completion
|
|
55
|
+
rules are unchanged; never write an active-path artifact.
|
|
56
|
+
|
|
57
|
+
## Process
|
|
58
|
+
|
|
59
|
+
1. Read the local [synthesis template](templates/synthesis.md),
|
|
60
|
+
`.project/research/RESEARCH.md`, and the bundled `scripts/check_handoffs.py`;
|
|
61
|
+
resolve each to an absolute path. Run the research hand-off validator before
|
|
62
|
+
dispatch so decide receives a complete, intentional evidence set.
|
|
63
|
+
2. Read the local [decider role](references/decider.md), then follow
|
|
64
|
+
the local [runtime dispatch contract](references/dispatch.md) with
|
|
65
|
+
deterministic logical task name `decide`. Give it absolute paths to the role,
|
|
66
|
+
`AGENTS.md`, `WORKFLOW.md`, INTENT.md (or CHARTER.md in program flow),
|
|
67
|
+
RESEARCH.md, every evidence file, the
|
|
68
|
+
template, and the required output path from the Preconditions.
|
|
69
|
+
3. Validate SYNTHESIS.md with `python3 <absolute check_handoffs.py> decide
|
|
70
|
+
--repo <absolute root> [--project-dir .project/next]`. Require one decision block for every genuinely open
|
|
71
|
+
choice in INTENT.md and the evidence, including stack and architecture
|
|
72
|
+
shape plus build-vs-buy when open. A choice already settled by an intent
|
|
73
|
+
constraint or the existing codebase belongs under `## Settled` as one line
|
|
74
|
+
citing the settling source — never a full block with an invented
|
|
75
|
+
runner-up. Require Decision, Runner-up, Evidence, and
|
|
76
|
+
Confidence in every decision block. Require `## For the planner` with wave-1
|
|
77
|
+
blockers, walking skeleton, and pitfall-to-task guidance.
|
|
78
|
+
4. If structural validation fails, redispatch one complete corrected brief
|
|
79
|
+
under logical task name `decide`, following the runtime dispatch
|
|
80
|
+
contract, and validate again. If it still fails, use
|
|
81
|
+
`pipeline_state.py transition` with expected `decide/active`, exact branch
|
|
82
|
+
and archive values, `--set-status blocked`, and an event naming the failed
|
|
83
|
+
synthesis gate, and
|
|
84
|
+
present **Outcome** with the failed gate, **Review** linking SYNTHESIS.md or
|
|
85
|
+
STATE.md when it is missing, and **Next** naming the one correction or user
|
|
86
|
+
decision required; then stop.
|
|
87
|
+
5. Present the decision-list outcome and a Markdown link to the resolved
|
|
88
|
+
absolute SYNTHESIS.md output path before every `NEEDS-USER`
|
|
89
|
+
item. Use an interactive user-input tool when available; otherwise ask in
|
|
90
|
+
chat and wait. Present
|
|
91
|
+
each item's options with the evidence-preferred option first, marked
|
|
92
|
+
`(recommended)` and justified in one line; a pure values call with no
|
|
93
|
+
evidence either way carries no recommendation, stated as such. For each
|
|
94
|
+
answer, append the ruling under `## User rulings`, revise every affected
|
|
95
|
+
decision so it reflects the ruling, and only then remove its tag.
|
|
96
|
+
6. Re-run the structural gate. When it passes with no unresolved user items,
|
|
97
|
+
use `pipeline_state.py transition` with expected `decide/active`, exact
|
|
98
|
+
branch and archive values, `--set-phase decide --set-status done`, and an
|
|
99
|
+
event naming the validated synthesis path. Include `--project-dir
|
|
100
|
+
.project/next` in lookahead and require returned `decide/done`. Confirm the
|
|
101
|
+
settled outcome, link SYNTHESIS.md again, and name
|
|
102
|
+
the next phase: the roadmap phase in program scope, planning otherwise.
|
|
103
|
+
When routed by an active `$gsd-path`, return control to
|
|
104
|
+
that router. When invoked directly, stop and tell the user to explicitly
|
|
105
|
+
invoke `$gsd-path`, which routes to that next phase; do not invoke an
|
|
106
|
+
explicit-only sibling skill yourself.
|
|
107
|
+
|
|
108
|
+
## Rules
|
|
109
|
+
|
|
110
|
+
- Make commitments, not option lists. Name the runner-up and why it lost
|
|
111
|
+
when a real alternative was weighed; never invent one.
|
|
112
|
+
- Cite evidence by file and finding heading for every decision.
|
|
113
|
+
- Route low-confidence decisions to wave 1 for verification. Reject uncited
|
|
114
|
+
decisions.
|
|
115
|
+
- Resolve evidence conflicts or escalate a true values decision; never average.
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# Decider role
|
|
2
|
+
|
|
3
|
+
Turn supplied research into settled decisions. Do not conduct new research.
|
|
4
|
+
|
|
5
|
+
## Input and output
|
|
6
|
+
|
|
7
|
+
- Require absolute paths for INTENT.md, every evidence file, SYNTHESIS.md, and
|
|
8
|
+
the synthesis template.
|
|
9
|
+
- Read AGENTS.md, INTENT.md, the template, and every evidence file.
|
|
10
|
+
- Write only the exact output using the template. Stop on a missing input or
|
|
11
|
+
template.
|
|
12
|
+
|
|
13
|
+
## Decide
|
|
14
|
+
|
|
15
|
+
1. Treat intent constraints and vetoes as hard limits.
|
|
16
|
+
2. Map agreements, conflicts, and gaps across all evidence.
|
|
17
|
+
3. For every genuinely open choice, select one decision, name the runner-up
|
|
18
|
+
and why it lost, and cite the evidence file and finding heading. Record a
|
|
19
|
+
choice already settled by an intent constraint or the existing codebase in
|
|
20
|
+
one line under Settled, citing the settling source; do not invent a
|
|
21
|
+
runner-up for it.
|
|
22
|
+
4. Resolve conflicts by source quality and fit to intent. Preserve a user
|
|
23
|
+
values choice as `NEEDS-USER` with the genuinely viable options; never
|
|
24
|
+
guess.
|
|
25
|
+
When the evidence leans one way, order that option first with a one-line
|
|
26
|
+
reason so the checkpoint can mark it recommended; note when it is a pure
|
|
27
|
+
values call with no lean.
|
|
28
|
+
5. Route decisions supported only by low-confidence evidence to wave 1.
|
|
29
|
+
6. Write For the planner with wave-1 blockers, the walking skeleton, and each
|
|
30
|
+
pitfall mapped to a future task.
|
|
31
|
+
7. Carry every unanswered intent question into Still unknown.
|
|
32
|
+
|
|
33
|
+
Every decision requires cited evidence. Compress to decisions and rationale
|
|
34
|
+
rather than re-narrating research.
|
|
35
|
+
|
|
36
|
+
Return the output path, one line per decision, and the `NEEDS-USER` count.
|