@opengsd/gsd-path 1.0.0 → 1.1.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 +28 -11
- package/DOCS.md +6 -5
- package/FULL.md +9 -13
- package/QUICK.md +3 -3
- package/README.md +151 -14
- package/RUNTIME.md +7 -1
- package/WORKFLOW.md +30 -14
- package/package.json +15 -1
- package/platforms/shared-agents/dispatch.md +6 -0
- package/scripts/archive_milestone.py +10 -118
- package/scripts/bootstrap_repository.py +25 -3
- package/scripts/build_recovery.py +287 -0
- package/scripts/check_docs_audit.py +5 -3
- package/scripts/check_handoffs.py +1 -1
- package/scripts/detect_project.py +11 -2
- package/scripts/dispatch_driver.py +4 -2
- package/scripts/git_guard.py +2 -1
- package/scripts/install.mjs +2 -0
- package/scripts/install.py +2 -0
- package/scripts/integration.py +28 -22
- package/scripts/isolation.py +9 -1
- package/scripts/lean_verification.py +1 -1
- package/scripts/pipeline_diagnose.py +12 -3
- package/scripts/pipeline_state.py +114 -186
- package/scripts/pipeline_undo.py +11 -7
- package/scripts/promote_lookahead.py +30 -162
- package/scripts/roadmap.py +321 -0
- package/scripts/skill-resources.json +79 -1
- package/scripts/state_checkpoint.py +109 -72
- package/scripts/state_promote.py +42 -44
- package/scripts/task_context.py +73 -0
- package/scripts/token_budget.py +40 -1
- package/scripts/workflow_run.py +116 -7
- package/skills/gsd-path/BUILD.md +47 -575
- package/skills/gsd-path/DECIDE.md +2 -6
- package/skills/gsd-path/DEFINE.md +10 -14
- package/skills/gsd-path/INSPECT.md +30 -8
- package/skills/gsd-path/PLAN.md +25 -17
- package/skills/gsd-path/RESEARCH.md +3 -6
- package/skills/gsd-path/ROADMAP.md +22 -58
- package/skills/gsd-path/SHIP.md +5 -4
- package/skills/gsd-path/SKILL.md +24 -14
- package/skills/gsd-path/references/build-abandon.md +33 -0
- package/skills/gsd-path/references/build-native.md +494 -0
- package/skills/gsd-path/references/build-recovery.md +78 -0
- package/skills/gsd-path/references/coder.md +8 -3
- package/skills/gsd-path/references/dispatch.md +6 -0
- package/skills/gsd-path/references/docs-auditor.md +14 -0
- package/skills/gsd-path/references/reviewer-final.md +21 -0
- package/skills/gsd-path/references/reviewer-panel.md +17 -0
- package/skills/gsd-path/references/reviewer-skeptic.md +20 -0
- package/skills/gsd-path/references/reviewer-wave.md +89 -0
- package/skills/gsd-path/references/reviewer.md +12 -150
- package/skills/gsd-path/scripts/__pycache__/_common.cpython-312.pyc +0 -0
- package/skills/gsd-path/scripts/__pycache__/archive_milestone.cpython-312.pyc +0 -0
- package/skills/gsd-path/scripts/__pycache__/build_recovery.cpython-312.pyc +0 -0
- package/skills/gsd-path/scripts/__pycache__/build_state.cpython-312.pyc +0 -0
- package/skills/gsd-path/scripts/__pycache__/check_handoffs.cpython-312.pyc +0 -0
- package/skills/gsd-path/scripts/__pycache__/check_task_briefs.cpython-312.pyc +0 -0
- package/skills/gsd-path/scripts/__pycache__/detect_project.cpython-312.pyc +0 -0
- package/skills/gsd-path/scripts/__pycache__/discussion_records.cpython-312.pyc +0 -0
- package/skills/gsd-path/scripts/__pycache__/discussion_validate.cpython-312.pyc +0 -0
- package/skills/gsd-path/scripts/__pycache__/integration.cpython-312.pyc +0 -0
- package/skills/gsd-path/scripts/__pycache__/isolation.cpython-312.pyc +0 -0
- package/skills/gsd-path/scripts/__pycache__/loop_run.cpython-312.pyc +0 -0
- package/skills/gsd-path/scripts/__pycache__/pipeline_git.cpython-312.pyc +0 -0
- package/skills/gsd-path/scripts/__pycache__/pipeline_state.cpython-312.pyc +0 -0
- package/skills/gsd-path/scripts/__pycache__/review_findings.cpython-312.pyc +0 -0
- package/skills/gsd-path/scripts/__pycache__/review_panel.cpython-312.pyc +0 -0
- package/skills/gsd-path/scripts/__pycache__/roadmap.cpython-312.pyc +0 -0
- package/skills/gsd-path/scripts/__pycache__/state_checkpoint.cpython-312.pyc +0 -0
- package/skills/gsd-path/scripts/__pycache__/task_context.cpython-312.pyc +0 -0
- package/skills/gsd-path/scripts/__pycache__/workflow_run.cpython-312.pyc +0 -0
- package/skills/gsd-path/scripts/archive_milestone.py +10 -118
- package/skills/gsd-path/scripts/bootstrap_repository.py +25 -3
- package/skills/gsd-path/scripts/build_recovery.py +287 -0
- package/skills/gsd-path/scripts/check_docs_audit.py +5 -3
- package/skills/gsd-path/scripts/check_handoffs.py +1 -1
- package/skills/gsd-path/scripts/detect_project.py +11 -2
- package/skills/gsd-path/scripts/dispatch_driver.py +4 -2
- package/skills/gsd-path/scripts/integration.py +28 -22
- package/skills/gsd-path/scripts/isolation.py +9 -1
- package/skills/gsd-path/scripts/lean_verification.py +1 -1
- package/skills/gsd-path/scripts/pipeline_state.py +114 -186
- package/skills/gsd-path/scripts/promote_lookahead.py +30 -162
- package/skills/gsd-path/scripts/roadmap.py +321 -0
- package/skills/gsd-path/scripts/state_checkpoint.py +109 -72
- package/skills/gsd-path/scripts/state_promote.py +42 -44
- package/skills/gsd-path/scripts/task_context.py +73 -0
- package/skills/gsd-path/scripts/token_budget.py +40 -1
- package/skills/gsd-path/scripts/workflow_run.py +116 -7
- package/skills/gsd-path/templates/wave-review.md +1 -1
- package/skills/gsd-path-build/SKILL.md +47 -575
- package/skills/gsd-path-build/references/build-abandon.md +33 -0
- package/skills/gsd-path-build/references/build-native.md +494 -0
- package/skills/gsd-path-build/references/build-recovery.md +78 -0
- package/skills/gsd-path-build/references/coder.md +8 -3
- package/skills/gsd-path-build/references/dispatch.md +6 -0
- package/skills/gsd-path-build/references/reviewer-final.md +21 -0
- package/skills/gsd-path-build/references/reviewer-panel.md +17 -0
- package/skills/gsd-path-build/references/reviewer-skeptic.md +20 -0
- package/skills/gsd-path-build/references/reviewer-wave.md +89 -0
- package/skills/gsd-path-build/references/reviewer.md +12 -150
- package/skills/gsd-path-build/scripts/__pycache__/_common.cpython-312.pyc +0 -0
- package/skills/gsd-path-build/scripts/__pycache__/archive_milestone.cpython-312.pyc +0 -0
- package/skills/gsd-path-build/scripts/__pycache__/build_recovery.cpython-312.pyc +0 -0
- package/skills/gsd-path-build/scripts/__pycache__/build_state.cpython-312.pyc +0 -0
- package/skills/gsd-path-build/scripts/__pycache__/check_handoffs.cpython-312.pyc +0 -0
- package/skills/gsd-path-build/scripts/__pycache__/check_task_briefs.cpython-312.pyc +0 -0
- package/skills/gsd-path-build/scripts/__pycache__/detect_project.cpython-312.pyc +0 -0
- package/skills/gsd-path-build/scripts/__pycache__/discussion_validate.cpython-312.pyc +0 -0
- package/skills/gsd-path-build/scripts/__pycache__/isolation.cpython-312.pyc +0 -0
- package/skills/gsd-path-build/scripts/__pycache__/loop_run.cpython-312.pyc +0 -0
- package/skills/gsd-path-build/scripts/__pycache__/pipeline_git.cpython-312.pyc +0 -0
- package/skills/gsd-path-build/scripts/__pycache__/pipeline_state.cpython-312.pyc +0 -0
- package/skills/gsd-path-build/scripts/__pycache__/review_findings.cpython-312.pyc +0 -0
- package/skills/gsd-path-build/scripts/__pycache__/review_panel.cpython-312.pyc +0 -0
- package/skills/gsd-path-build/scripts/__pycache__/roadmap.cpython-312.pyc +0 -0
- package/skills/gsd-path-build/scripts/__pycache__/state_checkpoint.cpython-312.pyc +0 -0
- package/skills/gsd-path-build/scripts/__pycache__/task_context.cpython-312.pyc +0 -0
- package/skills/gsd-path-build/scripts/__pycache__/workflow_run.cpython-312.pyc +0 -0
- package/skills/gsd-path-build/scripts/archive_milestone.py +10 -118
- package/skills/gsd-path-build/scripts/build_recovery.py +287 -0
- package/skills/gsd-path-build/scripts/check_handoffs.py +1 -1
- package/skills/gsd-path-build/scripts/detect_project.py +1526 -0
- package/skills/gsd-path-build/scripts/dispatch_driver.py +4 -2
- package/skills/gsd-path-build/scripts/integration.py +28 -22
- package/skills/gsd-path-build/scripts/isolation.py +9 -1
- package/skills/gsd-path-build/scripts/pipeline_state.py +114 -186
- package/skills/gsd-path-build/scripts/promote_lookahead.py +283 -0
- package/skills/gsd-path-build/scripts/roadmap.py +321 -0
- package/skills/gsd-path-build/scripts/state_checkpoint.py +109 -72
- package/skills/gsd-path-build/scripts/state_promote.py +42 -44
- package/skills/gsd-path-build/scripts/task_context.py +73 -0
- package/skills/gsd-path-build/scripts/token_budget.py +40 -1
- package/skills/gsd-path-build/scripts/workflow_run.py +116 -7
- package/skills/gsd-path-build/templates/wave-review.md +1 -1
- package/skills/gsd-path-decide/SKILL.md +2 -6
- package/skills/gsd-path-decide/references/dispatch.md +6 -0
- package/skills/gsd-path-decide/scripts/__pycache__/_common.cpython-312.pyc +0 -0
- package/skills/gsd-path-decide/scripts/__pycache__/archive_milestone.cpython-312.pyc +0 -0
- package/skills/gsd-path-decide/scripts/__pycache__/detect_project.cpython-312.pyc +0 -0
- package/skills/gsd-path-decide/scripts/__pycache__/discussion_validate.cpython-312.pyc +0 -0
- package/skills/gsd-path-decide/scripts/__pycache__/isolation.cpython-312.pyc +0 -0
- package/skills/gsd-path-decide/scripts/__pycache__/pipeline_git.cpython-312.pyc +0 -0
- package/skills/gsd-path-decide/scripts/__pycache__/pipeline_state.cpython-312.pyc +0 -0
- package/skills/gsd-path-decide/scripts/__pycache__/review_panel.cpython-312.pyc +0 -0
- package/skills/gsd-path-decide/scripts/__pycache__/roadmap.cpython-312.pyc +0 -0
- package/skills/gsd-path-decide/scripts/__pycache__/state_checkpoint.cpython-312.pyc +0 -0
- package/skills/gsd-path-decide/scripts/archive_milestone.py +2157 -0
- package/skills/gsd-path-decide/scripts/build_recovery.py +287 -0
- package/skills/gsd-path-decide/scripts/check_handoffs.py +1 -1
- package/skills/gsd-path-decide/scripts/detect_project.py +1526 -0
- package/skills/gsd-path-decide/scripts/discussion_validate.py +1321 -0
- package/skills/gsd-path-decide/scripts/integration.py +1439 -0
- package/skills/gsd-path-decide/scripts/isolation.py +9 -1
- package/skills/gsd-path-decide/scripts/pipeline_state.py +114 -186
- package/skills/gsd-path-decide/scripts/promote_lookahead.py +283 -0
- package/skills/gsd-path-decide/scripts/review_panel.py +553 -0
- package/skills/gsd-path-decide/scripts/roadmap.py +321 -0
- package/skills/gsd-path-decide/scripts/state_checkpoint.py +109 -72
- package/skills/gsd-path-decide/scripts/state_promote.py +42 -44
- package/skills/gsd-path-define/SKILL.md +10 -14
- package/skills/gsd-path-define/references/build-recovery.md +78 -0
- package/skills/gsd-path-define/scripts/__pycache__/_common.cpython-312.pyc +0 -0
- package/skills/gsd-path-define/scripts/__pycache__/archive_milestone.cpython-312.pyc +0 -0
- package/skills/gsd-path-define/scripts/__pycache__/detect_project.cpython-312.pyc +0 -0
- package/skills/gsd-path-define/scripts/__pycache__/discussion_validate.cpython-312.pyc +0 -0
- package/skills/gsd-path-define/scripts/__pycache__/isolation.cpython-312.pyc +0 -0
- package/skills/gsd-path-define/scripts/__pycache__/pipeline_git.cpython-312.pyc +0 -0
- package/skills/gsd-path-define/scripts/__pycache__/pipeline_state.cpython-312.pyc +0 -0
- package/skills/gsd-path-define/scripts/__pycache__/review_panel.cpython-312.pyc +0 -0
- package/skills/gsd-path-define/scripts/__pycache__/roadmap.cpython-312.pyc +0 -0
- package/skills/gsd-path-define/scripts/__pycache__/state_checkpoint.cpython-312.pyc +0 -0
- package/skills/gsd-path-define/scripts/archive_milestone.py +2157 -0
- package/skills/gsd-path-define/scripts/build_recovery.py +287 -0
- package/skills/gsd-path-define/scripts/check_handoffs.py +1 -1
- package/skills/gsd-path-define/scripts/detect_project.py +11 -2
- package/skills/gsd-path-define/scripts/discussion_validate.py +1321 -0
- package/skills/gsd-path-define/scripts/integration.py +1439 -0
- package/skills/gsd-path-define/scripts/isolation.py +9 -1
- package/skills/gsd-path-define/scripts/pipeline_state.py +114 -186
- package/skills/gsd-path-define/scripts/promote_lookahead.py +283 -0
- package/skills/gsd-path-define/scripts/review_panel.py +553 -0
- package/skills/gsd-path-define/scripts/roadmap.py +321 -0
- package/skills/gsd-path-define/scripts/state_checkpoint.py +109 -72
- package/skills/gsd-path-define/scripts/state_promote.py +42 -44
- package/skills/gsd-path-docs-audit/references/dispatch.md +6 -0
- package/skills/gsd-path-docs-audit/references/docs-auditor.md +14 -0
- package/skills/gsd-path-docs-audit/scripts/__pycache__/_common.cpython-312.pyc +0 -0
- package/skills/gsd-path-docs-audit/scripts/__pycache__/archive_milestone.cpython-312.pyc +0 -0
- package/skills/gsd-path-docs-audit/scripts/__pycache__/build_recovery.cpython-312.pyc +0 -0
- package/skills/gsd-path-docs-audit/scripts/__pycache__/detect_project.cpython-312.pyc +0 -0
- package/skills/gsd-path-docs-audit/scripts/__pycache__/discussion_validate.cpython-312.pyc +0 -0
- package/skills/gsd-path-docs-audit/scripts/__pycache__/isolation.cpython-312.pyc +0 -0
- package/skills/gsd-path-docs-audit/scripts/__pycache__/pipeline_git.cpython-312.pyc +0 -0
- package/skills/gsd-path-docs-audit/scripts/__pycache__/pipeline_state.cpython-312.pyc +0 -0
- package/skills/gsd-path-docs-audit/scripts/__pycache__/review_panel.cpython-312.pyc +0 -0
- package/skills/gsd-path-docs-audit/scripts/__pycache__/roadmap.cpython-312.pyc +0 -0
- package/skills/gsd-path-docs-audit/scripts/__pycache__/state_checkpoint.cpython-312.pyc +0 -0
- package/skills/gsd-path-docs-audit/scripts/archive_milestone.py +2157 -0
- package/skills/gsd-path-docs-audit/scripts/build_recovery.py +287 -0
- package/skills/gsd-path-docs-audit/scripts/check_docs_audit.py +5 -3
- package/skills/gsd-path-docs-audit/scripts/check_handoffs.py +1 -1
- package/skills/gsd-path-docs-audit/scripts/detect_project.py +1526 -0
- package/skills/gsd-path-docs-audit/scripts/discussion_validate.py +1321 -0
- package/skills/gsd-path-docs-audit/scripts/integration.py +1439 -0
- package/skills/gsd-path-docs-audit/scripts/isolation.py +9 -1
- package/skills/gsd-path-docs-audit/scripts/pipeline_state.py +114 -186
- package/skills/gsd-path-docs-audit/scripts/promote_lookahead.py +283 -0
- package/skills/gsd-path-docs-audit/scripts/review_panel.py +553 -0
- package/skills/gsd-path-docs-audit/scripts/roadmap.py +321 -0
- package/skills/gsd-path-docs-audit/scripts/state_checkpoint.py +109 -72
- package/skills/gsd-path-docs-audit/scripts/state_promote.py +42 -44
- package/skills/gsd-path-forensics/scripts/__pycache__/pipeline_undo.cpython-312.pyc +0 -0
- package/skills/gsd-path-forensics/scripts/pipeline_diagnose.py +12 -3
- package/skills/gsd-path-forensics/scripts/pipeline_undo.py +11 -7
- package/skills/gsd-path-inspect/SKILL.md +30 -8
- package/skills/gsd-path-inspect/references/dispatch.md +6 -0
- package/skills/gsd-path-inspect/references/docs-auditor.md +14 -0
- package/skills/gsd-path-inspect/scripts/__pycache__/_common.cpython-312.pyc +0 -0
- package/skills/gsd-path-inspect/scripts/__pycache__/archive_milestone.cpython-312.pyc +0 -0
- package/skills/gsd-path-inspect/scripts/__pycache__/build_recovery.cpython-312.pyc +0 -0
- package/skills/gsd-path-inspect/scripts/__pycache__/detect_project.cpython-312.pyc +0 -0
- package/skills/gsd-path-inspect/scripts/__pycache__/discussion_validate.cpython-312.pyc +0 -0
- package/skills/gsd-path-inspect/scripts/__pycache__/isolation.cpython-312.pyc +0 -0
- package/skills/gsd-path-inspect/scripts/__pycache__/pipeline_git.cpython-312.pyc +0 -0
- package/skills/gsd-path-inspect/scripts/__pycache__/pipeline_state.cpython-312.pyc +0 -0
- package/skills/gsd-path-inspect/scripts/__pycache__/review_panel.cpython-312.pyc +0 -0
- package/skills/gsd-path-inspect/scripts/__pycache__/roadmap.cpython-312.pyc +0 -0
- package/skills/gsd-path-inspect/scripts/__pycache__/state_checkpoint.cpython-312.pyc +0 -0
- package/skills/gsd-path-inspect/scripts/archive_milestone.py +2157 -0
- package/skills/gsd-path-inspect/scripts/build_recovery.py +287 -0
- package/skills/gsd-path-inspect/scripts/check_docs_audit.py +5 -3
- package/skills/gsd-path-inspect/scripts/check_handoffs.py +1 -1
- package/skills/gsd-path-inspect/scripts/detect_project.py +11 -2
- package/skills/gsd-path-inspect/scripts/discussion_validate.py +1321 -0
- package/skills/gsd-path-inspect/scripts/integration.py +1439 -0
- package/skills/gsd-path-inspect/scripts/isolation.py +9 -1
- package/skills/gsd-path-inspect/scripts/pipeline_state.py +114 -186
- package/skills/gsd-path-inspect/scripts/promote_lookahead.py +283 -0
- package/skills/gsd-path-inspect/scripts/review_panel.py +553 -0
- package/skills/gsd-path-inspect/scripts/roadmap.py +321 -0
- package/skills/gsd-path-inspect/scripts/state_checkpoint.py +109 -72
- package/skills/gsd-path-inspect/scripts/state_promote.py +42 -44
- package/skills/gsd-path-inspect/scripts/workflow_run.py +226 -0
- package/skills/gsd-path-plan/SKILL.md +25 -17
- package/skills/gsd-path-plan/references/build-recovery.md +78 -0
- package/skills/gsd-path-plan/references/dispatch.md +6 -0
- package/skills/gsd-path-plan/scripts/__pycache__/_common.cpython-312.pyc +0 -0
- package/skills/gsd-path-plan/scripts/__pycache__/archive_milestone.cpython-312.pyc +0 -0
- package/skills/gsd-path-plan/scripts/__pycache__/detect_project.cpython-312.pyc +0 -0
- package/skills/gsd-path-plan/scripts/__pycache__/discussion_validate.cpython-312.pyc +0 -0
- package/skills/gsd-path-plan/scripts/__pycache__/isolation.cpython-312.pyc +0 -0
- package/skills/gsd-path-plan/scripts/__pycache__/pipeline_git.cpython-312.pyc +0 -0
- package/skills/gsd-path-plan/scripts/__pycache__/pipeline_state.cpython-312.pyc +0 -0
- package/skills/gsd-path-plan/scripts/__pycache__/review_panel.cpython-312.pyc +0 -0
- package/skills/gsd-path-plan/scripts/__pycache__/roadmap.cpython-312.pyc +0 -0
- package/skills/gsd-path-plan/scripts/__pycache__/state_checkpoint.cpython-312.pyc +0 -0
- package/skills/gsd-path-plan/scripts/archive_milestone.py +2157 -0
- package/skills/gsd-path-plan/scripts/build_recovery.py +287 -0
- package/skills/gsd-path-plan/scripts/check_handoffs.py +1 -1
- package/skills/gsd-path-plan/scripts/detect_project.py +1526 -0
- package/skills/gsd-path-plan/scripts/discussion_validate.py +1321 -0
- package/skills/gsd-path-plan/scripts/integration.py +1439 -0
- package/skills/gsd-path-plan/scripts/isolation.py +9 -1
- package/skills/gsd-path-plan/scripts/pipeline_state.py +114 -186
- package/skills/gsd-path-plan/scripts/promote_lookahead.py +283 -0
- package/skills/gsd-path-plan/scripts/roadmap.py +321 -0
- package/skills/gsd-path-plan/scripts/state_checkpoint.py +109 -72
- package/skills/gsd-path-plan/scripts/state_promote.py +42 -44
- package/skills/gsd-path-plan/scripts/workflow_run.py +116 -7
- package/skills/gsd-path-research/SKILL.md +3 -6
- package/skills/gsd-path-research/references/dispatch.md +6 -0
- package/skills/gsd-path-research/scripts/__pycache__/_common.cpython-312.pyc +0 -0
- package/skills/gsd-path-research/scripts/__pycache__/archive_milestone.cpython-312.pyc +0 -0
- package/skills/gsd-path-research/scripts/__pycache__/detect_project.cpython-312.pyc +0 -0
- package/skills/gsd-path-research/scripts/__pycache__/discussion_validate.cpython-312.pyc +0 -0
- package/skills/gsd-path-research/scripts/__pycache__/isolation.cpython-312.pyc +0 -0
- package/skills/gsd-path-research/scripts/__pycache__/pipeline_git.cpython-312.pyc +0 -0
- package/skills/gsd-path-research/scripts/__pycache__/pipeline_state.cpython-312.pyc +0 -0
- package/skills/gsd-path-research/scripts/__pycache__/review_panel.cpython-312.pyc +0 -0
- package/skills/gsd-path-research/scripts/__pycache__/roadmap.cpython-312.pyc +0 -0
- package/skills/gsd-path-research/scripts/__pycache__/state_checkpoint.cpython-312.pyc +0 -0
- package/skills/gsd-path-research/scripts/archive_milestone.py +2157 -0
- package/skills/gsd-path-research/scripts/build_recovery.py +287 -0
- package/skills/gsd-path-research/scripts/check_handoffs.py +1 -1
- package/skills/gsd-path-research/scripts/detect_project.py +1526 -0
- package/skills/gsd-path-research/scripts/discussion_validate.py +1321 -0
- package/skills/gsd-path-research/scripts/integration.py +1439 -0
- package/skills/gsd-path-research/scripts/isolation.py +9 -1
- package/skills/gsd-path-research/scripts/pipeline_state.py +114 -186
- package/skills/gsd-path-research/scripts/promote_lookahead.py +283 -0
- package/skills/gsd-path-research/scripts/review_panel.py +553 -0
- package/skills/gsd-path-research/scripts/roadmap.py +321 -0
- package/skills/gsd-path-research/scripts/state_checkpoint.py +109 -72
- package/skills/gsd-path-research/scripts/state_promote.py +42 -44
- package/skills/gsd-path-roadmap/SKILL.md +22 -58
- package/skills/gsd-path-roadmap/references/dispatch.md +6 -0
- package/skills/gsd-path-roadmap/scripts/__pycache__/_common.cpython-312.pyc +0 -0
- package/skills/gsd-path-roadmap/scripts/__pycache__/archive_milestone.cpython-312.pyc +0 -0
- package/skills/gsd-path-roadmap/scripts/__pycache__/detect_project.cpython-312.pyc +0 -0
- package/skills/gsd-path-roadmap/scripts/__pycache__/discussion_validate.cpython-312.pyc +0 -0
- package/skills/gsd-path-roadmap/scripts/__pycache__/isolation.cpython-312.pyc +0 -0
- package/skills/gsd-path-roadmap/scripts/__pycache__/pipeline_git.cpython-312.pyc +0 -0
- package/skills/gsd-path-roadmap/scripts/__pycache__/pipeline_state.cpython-312.pyc +0 -0
- package/skills/gsd-path-roadmap/scripts/__pycache__/review_panel.cpython-312.pyc +0 -0
- package/skills/gsd-path-roadmap/scripts/__pycache__/roadmap.cpython-312.pyc +0 -0
- package/skills/gsd-path-roadmap/scripts/__pycache__/state_checkpoint.cpython-312.pyc +0 -0
- package/skills/gsd-path-roadmap/scripts/archive_milestone.py +10 -118
- package/skills/gsd-path-roadmap/scripts/build_recovery.py +287 -0
- package/skills/gsd-path-roadmap/scripts/check_handoffs.py +1 -1
- package/skills/gsd-path-roadmap/scripts/detect_project.py +11 -2
- package/skills/gsd-path-roadmap/scripts/integration.py +28 -22
- package/skills/gsd-path-roadmap/scripts/isolation.py +9 -1
- package/skills/gsd-path-roadmap/scripts/pipeline_state.py +114 -186
- package/skills/gsd-path-roadmap/scripts/promote_lookahead.py +30 -162
- package/skills/gsd-path-roadmap/scripts/roadmap.py +321 -0
- package/skills/gsd-path-roadmap/scripts/state_checkpoint.py +109 -72
- package/skills/gsd-path-roadmap/scripts/state_promote.py +42 -44
- package/skills/gsd-path-ship/SKILL.md +5 -4
- package/skills/gsd-path-ship/references/dispatch.md +6 -0
- package/skills/gsd-path-ship/references/reviewer-final.md +21 -0
- package/skills/gsd-path-ship/references/reviewer-panel.md +17 -0
- package/skills/gsd-path-ship/references/reviewer-skeptic.md +20 -0
- package/skills/gsd-path-ship/references/reviewer-wave.md +89 -0
- package/skills/gsd-path-ship/references/reviewer.md +12 -150
- package/skills/gsd-path-ship/scripts/__pycache__/_common.cpython-312.pyc +0 -0
- package/skills/gsd-path-ship/scripts/__pycache__/archive_milestone.cpython-312.pyc +0 -0
- package/skills/gsd-path-ship/scripts/__pycache__/build_recovery.cpython-312.pyc +0 -0
- package/skills/gsd-path-ship/scripts/__pycache__/build_state.cpython-312.pyc +0 -0
- package/skills/gsd-path-ship/scripts/__pycache__/check_handoffs.cpython-312.pyc +0 -0
- package/skills/gsd-path-ship/scripts/__pycache__/check_task_briefs.cpython-312.pyc +0 -0
- package/skills/gsd-path-ship/scripts/__pycache__/detect_project.cpython-312.pyc +0 -0
- package/skills/gsd-path-ship/scripts/__pycache__/discussion_validate.cpython-312.pyc +0 -0
- package/skills/gsd-path-ship/scripts/__pycache__/isolation.cpython-312.pyc +0 -0
- package/skills/gsd-path-ship/scripts/__pycache__/pipeline_git.cpython-312.pyc +0 -0
- package/skills/gsd-path-ship/scripts/__pycache__/pipeline_state.cpython-312.pyc +0 -0
- package/skills/gsd-path-ship/scripts/__pycache__/review_panel.cpython-312.pyc +0 -0
- package/skills/gsd-path-ship/scripts/__pycache__/roadmap.cpython-312.pyc +0 -0
- package/skills/gsd-path-ship/scripts/__pycache__/state_checkpoint.cpython-312.pyc +0 -0
- package/skills/gsd-path-ship/scripts/archive_milestone.py +10 -118
- package/skills/gsd-path-ship/scripts/build_recovery.py +287 -0
- package/skills/gsd-path-ship/scripts/check_handoffs.py +1 -1
- package/skills/gsd-path-ship/scripts/detect_project.py +1526 -0
- package/skills/gsd-path-ship/scripts/integration.py +28 -22
- package/skills/gsd-path-ship/scripts/isolation.py +9 -1
- package/skills/gsd-path-ship/scripts/lean_verification.py +1 -1
- package/skills/gsd-path-ship/scripts/pipeline_state.py +114 -186
- package/skills/gsd-path-ship/scripts/promote_lookahead.py +283 -0
- package/skills/gsd-path-ship/scripts/roadmap.py +321 -0
- package/skills/gsd-path-ship/scripts/state_checkpoint.py +109 -72
- package/skills/gsd-path-ship/scripts/state_promote.py +42 -44
- package/skills/gsd-path-ship/scripts/workflow_run.py +116 -7
- package/skills/gsd-path-ship/templates/wave-review.md +1 -1
- package/skills/gsd-path-undo/scripts/pipeline_undo.py +11 -7
- package/skills/path/BUILD.md +47 -575
- package/skills/path/DECIDE.md +2 -6
- package/skills/path/DEFINE.md +10 -14
- package/skills/path/INSPECT.md +30 -8
- package/skills/path/PLAN.md +25 -17
- package/skills/path/RESEARCH.md +3 -6
- package/skills/path/ROADMAP.md +22 -58
- package/skills/path/SHIP.md +5 -4
- package/skills/path/SKILL.md +24 -14
- package/skills/path/references/build-abandon.md +33 -0
- package/skills/path/references/build-native.md +494 -0
- package/skills/path/references/build-recovery.md +78 -0
- package/skills/path/references/coder.md +8 -3
- package/skills/path/references/dispatch.md +6 -0
- package/skills/path/references/docs-auditor.md +14 -0
- package/skills/path/references/reviewer-final.md +21 -0
- package/skills/path/references/reviewer-panel.md +17 -0
- package/skills/path/references/reviewer-skeptic.md +20 -0
- package/skills/path/references/reviewer-wave.md +89 -0
- package/skills/path/references/reviewer.md +12 -150
- package/skills/path/scripts/archive_milestone.py +10 -118
- package/skills/path/scripts/bootstrap_repository.py +25 -3
- package/skills/path/scripts/build_recovery.py +287 -0
- package/skills/path/scripts/check_docs_audit.py +5 -3
- package/skills/path/scripts/check_handoffs.py +1 -1
- package/skills/path/scripts/detect_project.py +11 -2
- package/skills/path/scripts/dispatch_driver.py +4 -2
- package/skills/path/scripts/integration.py +28 -22
- package/skills/path/scripts/isolation.py +9 -1
- package/skills/path/scripts/lean_verification.py +1 -1
- package/skills/path/scripts/pipeline_state.py +114 -186
- package/skills/path/scripts/promote_lookahead.py +30 -162
- package/skills/path/scripts/roadmap.py +321 -0
- package/skills/path/scripts/state_checkpoint.py +109 -72
- package/skills/path/scripts/state_promote.py +42 -44
- package/skills/path/scripts/task_context.py +73 -0
- package/skills/path/scripts/token_budget.py +40 -1
- package/skills/path/scripts/workflow_run.py +116 -7
- package/skills/path/templates/wave-review.md +1 -1
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
## Milestone abandon (program flow only)
|
|
2
|
+
|
|
3
|
+
Abandon the active milestone only on an explicit user ruling — from the
|
|
4
|
+
review-cycle-cap escalation, a decision invalidation, or a direct request.
|
|
5
|
+
Require `.project/ROADMAP.md`; a single-milestone project has no abandon
|
|
6
|
+
path — stop and let the user decide how to restart.
|
|
7
|
+
|
|
8
|
+
1. Retire every recorded task worktree and branch with `isolation.py retire`
|
|
9
|
+
after confirming ownership, recording each discarded uncommitted diff's
|
|
10
|
+
exact path set and hash in the STATE.md log. Never discard work the
|
|
11
|
+
recorded metadata cannot own.
|
|
12
|
+
2. Run the bundled `scripts/archive_milestone.py abandon --repo <absolute
|
|
13
|
+
repo root> --slug <milestone slug> --reason <user ruling, verbatim>`.
|
|
14
|
+
This one helper-owned transaction journals the exact request and starting
|
|
15
|
+
HEAD before mutation; archives the partial artifacts without review gates;
|
|
16
|
+
marks the exact ROADMAP entry `Status: abandoned` with its `Archive:` path;
|
|
17
|
+
appends `- <NNN>-<slug> — abandoned: <collapsed ruling>` exactly once to
|
|
18
|
+
LESSONS.md; transitions STATE to `roadmap/active` with `milestone: null`
|
|
19
|
+
and `archive: null`; and creates the checkpoint with exact subject `build:
|
|
20
|
+
abandon milestone <slug>` and body `Why: <collapsed ruling>`. The manifest
|
|
21
|
+
`Reason:` and checkpoint `Why:` are the same normalized ruling.
|
|
22
|
+
3. Rerun the same command with the same slug and ruling after any interruption.
|
|
23
|
+
It resumes archive moves, metadata, state transition, or checkpoint from
|
|
24
|
+
the journaled starting HEAD; a changed slug, ruling, archive, branch, or
|
|
25
|
+
manifest reason blocks. Success returns the archive, exact checkpoint
|
|
26
|
+
commit, and `committed` or `already-complete` status. Never edit or commit
|
|
27
|
+
any part of this transaction manually and never select another sequence
|
|
28
|
+
number.
|
|
29
|
+
4. Return to the router, which routes `roadmap/active` to the roadmap
|
|
30
|
+
contract in re-slice mode. The abandoned code stays on the build branch
|
|
31
|
+
until the next milestone's integration, then reaches the default branch as
|
|
32
|
+
inert history; the re-slice plans around it. Never revert product commits
|
|
33
|
+
yourself.
|
|
@@ -0,0 +1,494 @@
|
|
|
1
|
+
# Native dispatch and build recovery
|
|
2
|
+
|
|
3
|
+
Read only when no owner-supplied child command exists, a driver receipt requires
|
|
4
|
+
manual recovery, or the wave uses verify-only review. Entry and bookkeeping
|
|
5
|
+
preconditions remain in the build skill. Do not repeat a proven driver step.
|
|
6
|
+
|
|
7
|
+
## Wave loop
|
|
8
|
+
|
|
9
|
+
For each `## Wave N` in PLAN.md order (a wave's tasks are the task files whose
|
|
10
|
+
`wave` equals N):
|
|
11
|
+
|
|
12
|
+
**Dispatch driver.** Steps 1–5 below are deterministic, and the bundled
|
|
13
|
+
`scripts/dispatch_driver.py` runs them: recover, settle exited coders, the
|
|
14
|
+
bookkeeping checkpoint, `ready`, brief lint, `prepare-task`, `activate-task`,
|
|
15
|
+
one child per ready task, then Verify in the isolate, Log append, `land`,
|
|
16
|
+
`verify-record`, and `retire` in task-id order. Prefer it whenever the owner
|
|
17
|
+
supplies a child command (a headless CLI that reads the brief on stdin, for
|
|
18
|
+
example `claude -p --output-format json ...` or `codex exec --json ...`; the
|
|
19
|
+
owner's flags own the child's permissions):
|
|
20
|
+
|
|
21
|
+
```text
|
|
22
|
+
python3 <absolute dispatch_driver.py> round --repo <absolute primary> --wave <N> \
|
|
23
|
+
--child-command '<owner command>' [--wait <owner seconds>] \
|
|
24
|
+
[--child-timeout <owner seconds>]
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
`round` owns the entry transition described in Preconditions and branch
|
|
28
|
+
binding, checkpointed as `build: start milestone`, and sets `build/blocked`
|
|
29
|
+
on a dependency deadlock or a blocked
|
|
30
|
+
recovery; every other stop stays with the parent. Act only on its receipt:
|
|
31
|
+
`done` means every wave task landed — run
|
|
32
|
+
`review --wave <N> --cycle <C> --child-command '<owner command>' [--wait
|
|
33
|
+
<owner seconds>]` for step 6 at `full` or `deep` depth: it records the clean
|
|
34
|
+
review base, creates one verify sidecar per lens, briefs one reviewer child
|
|
35
|
+
per lens with every task's base and landing commit, validates each file in
|
|
36
|
+
its sidecar, copies it to the canonical path, retires the sidecar, and only
|
|
37
|
+
after every lens settles concludes: a passing cycle with no panel is
|
|
38
|
+
checkpointed; with a panel configured (`panel_required: true`) run `panel
|
|
39
|
+
--wave <N> --cycle <C> --advertised <slugs> [--parent-slug <slug>]
|
|
40
|
+
--child-command '<owner command with {model}>'`, which resolves the panel,
|
|
41
|
+
persists a skipped receipt or runs one panelist per family in its own
|
|
42
|
+
sidecar, merges the family files, and makes the single on-pass checkpoint;
|
|
43
|
+
`blocked` returns the `review_findings.py collect` grouping; when its
|
|
44
|
+
`skeptic_groups` is non-empty, `skeptics --wave <N> --cycle <C>
|
|
45
|
+
--child-command '<owner command>'` runs one read-only skeptic per locator in
|
|
46
|
+
its own sidecar at the review base, validates and collects each file, and
|
|
47
|
+
reruns the helper; then `fix-tasks --wave <N> --cycle <C>` writes one
|
|
48
|
+
lint-clean fix task per batch carrying the failed criteria and observations
|
|
49
|
+
verbatim, or returns `escalate` for structural blockers, skeptic groups, the
|
|
50
|
+
cycle cap, or an all-refuted ruling, which stay with step 7 and the user.
|
|
51
|
+
The driver never writes a `verify-only` file (`status: not-applicable`);
|
|
52
|
+
`in-flight` means call `round` again; `question` means answer from the
|
|
53
|
+
approved artifacts or the user, record it with `answer --task-id <id>
|
|
54
|
+
--answer '<answer> — <citation>'`, and call `round` again, which redispatches
|
|
55
|
+
the retained isolate; `blocked` names the task, reason, and output and leaves
|
|
56
|
+
the isolate in place — apply the recovery, retry, or plan-defect procedure in
|
|
57
|
+
steps 1–2 by hand, then call `round` again. The driver counts dispatches per
|
|
58
|
+
task per milestone and stops at `--max-attempts` (default 2: the first
|
|
59
|
+
dispatch plus this contract's one logged redispatch); owner token limits, when
|
|
60
|
+
supplied, gate every dispatch through the milestone's budget ledger. Do not repeat a step the receipt
|
|
61
|
+
already proves. Without a child command, dispatch through the runtime
|
|
62
|
+
dispatch contract and perform steps 1–5 by hand.
|
|
63
|
+
|
|
64
|
+
1. **Recover before dispatch.** Run `python3 <absolute isolation.py> recover
|
|
65
|
+
--repo <absolute primary>`. It is read-only and proves every `done` task's
|
|
66
|
+
landing commit from its exact stamped base (first-parent scan for
|
|
67
|
+
`<task-id>: <task title>`, body `Task:`/`Base:`/`Files:`, the base task's
|
|
68
|
+
declared path allow-list from the task file at that base, exact landing
|
|
69
|
+
metadata, append-only task-file body, and
|
|
70
|
+
patch equality with a retained task branch). Pending and `in-progress`
|
|
71
|
+
tasks bypass landing-history proof and report retained resume state or
|
|
72
|
+
`none`; failed and blocked tasks with retained isolation report
|
|
73
|
+
`reconcile`. Act only on its verdicts;
|
|
74
|
+
do not re-derive them in prose, rerun Verify on a proven commit, use an
|
|
75
|
+
unanchored log grep, infer a SHA from `done`, or reset unknown work.
|
|
76
|
+
- `attested`: an owner ruling stands in for the landing commit (see the
|
|
77
|
+
block escalation below); treat it as landed and never redispatch.
|
|
78
|
+
- `recovered`: the task is landed (`land` already stamped `status: done`
|
|
79
|
+
and `base`). Retire a still-present task worktree with `isolation.py
|
|
80
|
+
retire` only when the report shows it present, clean, and on the task
|
|
81
|
+
branch. If only `task_branch` remains, finish its proven interrupted
|
|
82
|
+
retirement with `retire --branch <task_branch> --force --landed-commit
|
|
83
|
+
<commit>`; both absent is valid.
|
|
84
|
+
- `resume`: continue from the returned `base`, `task_branch`, and worktree
|
|
85
|
+
(the primary itself when no task branch exists); when the report shows
|
|
86
|
+
the worktree absent, return the task to `pending` only when ownership is
|
|
87
|
+
clear. When `dispatch_retry` is true, reuse the returned clean isolate,
|
|
88
|
+
write fresh dispatch metadata and agent there, then dispatch; do not
|
|
89
|
+
recreate it. When `landing_retry` is true, do not resume implementation
|
|
90
|
+
or redispatch; rerun `land` against the returned isolate and base.
|
|
91
|
+
- `reconcile`: do not resume implementation. Preserve the returned isolate
|
|
92
|
+
evidence and follow the failed/blocked reconciliation in step 2.
|
|
93
|
+
- `block` on a `done` task with reason `done but no landing commit proves
|
|
94
|
+
it` or `done task has invalid base`: the work was committed outside
|
|
95
|
+
`land`. Never repair history or task frontmatter by hand. Set
|
|
96
|
+
`build/blocked`, present **Outcome** naming every such task, and ask the
|
|
97
|
+
user for a ruling per task; put any suggested ruling text in its own
|
|
98
|
+
fenced code block so it pastes cleanly. On an explicit ruling, run that task's Verify
|
|
99
|
+
at HEAD, record it with `python3 <absolute build_state.py> verify-record
|
|
100
|
+
--repo <absolute primary> --command <task Verify> --commit <HEAD>
|
|
101
|
+
--result pass`, then run `python3 <absolute isolation.py> attest --repo
|
|
102
|
+
<absolute primary> --task-file <task file> --ruling <ruling verbatim>`
|
|
103
|
+
(add `--base <SHA>` only to repair an abbreviated or invalid recorded
|
|
104
|
+
base). The helper stamps the task and creates the attestation commit
|
|
105
|
+
itself; each one moves HEAD, so attest tasks one at a time and rerun
|
|
106
|
+
`recover` afterwards.
|
|
107
|
+
- Rewritten lineage: when every `done` task is rejected with `commit does
|
|
108
|
+
not descend from its Base:` after a rebase or replay, the owner may run
|
|
109
|
+
`python3 <absolute isolation.py> adopt-rebase --repo <absolute primary>
|
|
110
|
+
--original-head <preserved original tip> --head <HEAD> --ruling
|
|
111
|
+
"<ruling verbatim>"`, commit the receipt
|
|
112
|
+
`.project/build/rebase-adoption.json` as `.project/` bookkeeping, and
|
|
113
|
+
rerun `recover`. The original lineage must stay reachable: keep a local
|
|
114
|
+
branch on the old tip until the milestone ships. Adopted tasks report
|
|
115
|
+
`attested` with `provenance: owner-authorized-rebase`.
|
|
116
|
+
- `block` for any other reason: set `build/blocked` with the returned
|
|
117
|
+
reason and stop.
|
|
118
|
+
- `none`: take no recovery action for that task.
|
|
119
|
+
|
|
120
|
+
2. **Prepare the ready set.** Run `python3 <absolute build_state.py> ready
|
|
121
|
+
--repo <absolute primary>`. It is read-only: it validates every task's
|
|
122
|
+
frontmatter against its dispatch metadata and the recovery report, then
|
|
123
|
+
returns `ready` — the current wave's `pending` tasks whose dependencies are
|
|
124
|
+
all `done`, each with `id`, `title`, `deps`, `files`, `task_file`, and
|
|
125
|
+
`verify_heavy` — after proving that ready and `in-progress` tasks have
|
|
126
|
+
disjoint `files`. Dispatch exactly the tasks it returns; do not select,
|
|
127
|
+
order, or overlap-check tasks in prose. Readiness is continuous, not
|
|
128
|
+
layered: a task becomes selectable the moment its last dependency lands,
|
|
129
|
+
even while unrelated tasks still run, so rerun `ready` after each landing.
|
|
130
|
+
A `NEEDS-ORCHESTRATOR` block stays unselectable until its `Orchestrator
|
|
131
|
+
answer` is recorded in the task Log and the task is back to `pending`.
|
|
132
|
+
Its typed errors are the recovery rule:
|
|
133
|
+
- `task-recovery-required`: for each listed failed or blocked task run
|
|
134
|
+
`python3 <absolute build_state.py> reconcile --repo <absolute primary>
|
|
135
|
+
--task-id <id>` and act on its `classification`. `proven-landed`: the
|
|
136
|
+
task already landed at `landed_commit` and its frontmatter is stale —
|
|
137
|
+
reconcile the task file to that landed state and checkpoint it.
|
|
138
|
+
`resumable` or `reconcile`: apply the retry procedure below with the
|
|
139
|
+
returned `history.candidates` as the rejected evidence. `blocked`: set
|
|
140
|
+
`build/blocked` with the returned `reasons` and stop.
|
|
141
|
+
- `dependency-deadlock`: set `build/blocked` with its `tasks` list and stop.
|
|
142
|
+
- `ready-file-overlap` or `invalid-task-state`: a documented plan defect or
|
|
143
|
+
drifted bookkeeping; repair it before a new clean base.
|
|
144
|
+
A documented plan
|
|
145
|
+
defect may be repaired against INTENT.md and SYNTHESIS.md and logged before
|
|
146
|
+
a new clean base. A repair edits only the fields the lint or ruling named
|
|
147
|
+
in the tasks it named — `files`, Verify, Interface contract text, Intent
|
|
148
|
+
coverage rows, an ambiguous AC. It never adds, removes, splits, merges, or
|
|
149
|
+
renames tasks, moves a task between waves, or rewrites another task's
|
|
150
|
+
acceptance criteria; a defect that needs any of those sets `build/blocked`
|
|
151
|
+
with the lint output and follows [build recovery](build-recovery.md) to
|
|
152
|
+
plan, which owns the task inventory.
|
|
153
|
+
A user ruling that changes a success criterion,
|
|
154
|
+
constraint, or veto is not a plan defect: set `build/blocked`, do not
|
|
155
|
+
rewrite the AC, and follow [build recovery](build-recovery.md) to
|
|
156
|
+
`$gsd-path-define` to append INTENT.md
|
|
157
|
+
`## Corrections` before plan re-gates. A task Log is not that record. One failed implementation gets one logged redispatch when
|
|
158
|
+
its contract remains valid. Repeated failure, ambiguous ownership, a user
|
|
159
|
+
ruling, or a dependency deadlock sets build state to `blocked` and stops.
|
|
160
|
+
Concurrent tasks must have disjoint `files`; serialize overlapping fix
|
|
161
|
+
tasks. A retry never reuses a rejected dirty worktree: first copy its
|
|
162
|
+
validated append-only task Log delta into the primary task file, record the
|
|
163
|
+
rejected diff's exact path set and hash, and checkpoint the block bookkeeping.
|
|
164
|
+
After confirming every old change is task-owned, retire that exact worktree
|
|
165
|
+
with `python3 <absolute isolation.py> retire --repo <absolute primary>
|
|
166
|
+
--worktree <path> --branch <task_branch> --force --task-file <task path>`,
|
|
167
|
+
then create the retry. If retirement was interrupted after removing the
|
|
168
|
+
worktree, rerun the same command; the recorded failed or blocked task and
|
|
169
|
+
its exact base prove the remaining branch before deletion. Create the retry
|
|
170
|
+
from the new clean primary HEAD. After
|
|
171
|
+
resolving a recoverable `build/blocked` condition, use
|
|
172
|
+
`pipeline_state.py transition` with the blocked state and bound branch as
|
|
173
|
+
expected fields to set `build/active` and log the resolution. Checkpoint it
|
|
174
|
+
through the bookkeeping rule before recording that new dispatch-round base.
|
|
175
|
+
|
|
176
|
+
3. **Isolate every task.** Checkpoint pending bookkeeping through the rule
|
|
177
|
+
above, then record clean `HEAD` as
|
|
178
|
+
this dispatch round's base — tasks dispatched in the same round share it;
|
|
179
|
+
a later round unlocked by fresh landings records the later HEAD — and
|
|
180
|
+
lint every ready task's brief with the bundled
|
|
181
|
+
`scripts/check_task_briefs.py --repo <absolute repo root> --base <recorded
|
|
182
|
+
base>` and re-check Intent coverage with
|
|
183
|
+
`python3 <absolute check_handoffs.py> plan --repo <absolute repo root>`
|
|
184
|
+
before creating any worktree; a lint or coverage failure is a documented plan
|
|
185
|
+
defect — repair it against INTENT.md and SYNTHESIS.md, then re-establish
|
|
186
|
+
the base. Then isolate each ready task with
|
|
187
|
+
`python3 <absolute workflow_run.py> prepare-task --repo <absolute primary>
|
|
188
|
+
--expected-head <recorded base> --task-id <id> --round-size <N>` where N is the
|
|
189
|
+
number of tasks in this dispatch round. Serial (`N=1`) returns the primary
|
|
190
|
+
worktree and `task_branch: null` — the coder works on the bound branch.
|
|
191
|
+
The runner also creates a named verification sidecar at this clean base
|
|
192
|
+
before dispatch. Retain both helper results in the dispatch evidence.
|
|
193
|
+
Parallel (`N>=2`) creates a named `gsd-path-task/<id>` branch and linked
|
|
194
|
+
worktree at that base; never a detached HEAD. Record dispatch through
|
|
195
|
+
`python3 <absolute isolation.py> activate-task --repo <returned worktree>
|
|
196
|
+
--base <recorded base> --task-id <id> --agent build_<id> --task-file
|
|
197
|
+
<exact selected task-file path> [--task-branch <returned task_branch>]`.
|
|
198
|
+
The helper sets `base`, `worktree`, `task_branch`, `status: in-progress`,
|
|
199
|
+
and `agent` in the isolated task and records parallel build authorization.
|
|
200
|
+
Do not edit those fields directly. Do not commit this dispatch state: it lands
|
|
201
|
+
inside the task's own commit, and `recover` derives it from the task
|
|
202
|
+
branch and worktree meanwhile. The primary stays clean during a parallel
|
|
203
|
+
round. Do not append a dispatch Log entry: the isolated task later appends
|
|
204
|
+
at that location, and two parallel appends make the cherry-pick ambiguous. Reuse a retained worktree only when
|
|
205
|
+
its recorded base, branch, and task agree exactly.
|
|
206
|
+
|
|
207
|
+
4. **Dispatch the round.** Following the local runtime dispatch contract,
|
|
208
|
+
spawn one implementation-capable child per task with deterministic logical
|
|
209
|
+
task name `build_<task_id>`.
|
|
210
|
+
Its brief contains the absolute isolated-worktree root, coder role, task
|
|
211
|
+
file, task template, and the absolute INTENT.md path in that worktree.
|
|
212
|
+
Generate the coder's intent view with `python3 <absolute task_context.py>
|
|
213
|
+
--repo <absolute isolated-worktree> --task <absolute task file>` and include
|
|
214
|
+
its output in the brief. The helper preserves all global rules and falls
|
|
215
|
+
back to full intent when projection is ambiguous. Never summarize it by hand.
|
|
216
|
+
Add no hidden implementation context; repair a
|
|
217
|
+
defective task contract before establishing the round base. Run ready work
|
|
218
|
+
up to capacity. Verify commands marked `Heavy: yes` (`verify_heavy` in the
|
|
219
|
+
ready set) run one at a time across every concurrent task, including the
|
|
220
|
+
step 5 rerun; light ones are unconstrained. Do not wait for the whole
|
|
221
|
+
round before unlocking dependents: each task landing in step 5 re-opens
|
|
222
|
+
step 2, and a newly ready
|
|
223
|
+
task dispatches in a fresh round at the current clean HEAD while unrelated
|
|
224
|
+
tasks still run. The wave advances to review only when every wave task is
|
|
225
|
+
`done`.
|
|
226
|
+
|
|
227
|
+
5. **Verify and land serially as results arrive.** A coder returns only
|
|
228
|
+
`ready` or `blocked`; it never owns frontmatter or Git. Process each
|
|
229
|
+
completion when it lands — never wait for slower in-flight tasks first;
|
|
230
|
+
when several results wait, land them in task-id order.
|
|
231
|
+
|
|
232
|
+
- For `ready`, compare the complete worktree diff to `base`. Permit only
|
|
233
|
+
declared `files` plus append-only Log changes in that task file. Include
|
|
234
|
+
additions, deletions, renames, and binary changes; an unexpected path
|
|
235
|
+
blocks before any product commit.
|
|
236
|
+
- For a returned `ready` coder, run `python3 <absolute dispatch_driver.py>
|
|
237
|
+
finish --repo <absolute primary> --task-id <id>`. This action works with
|
|
238
|
+
native child tools; no child command is needed. It reproduces serial work
|
|
239
|
+
in its prepared sidecar, runs authoritative Verify, records exact output,
|
|
240
|
+
lands through `isolation.py`, records eligible ledger evidence, and retires
|
|
241
|
+
the isolate. A `landed` receipt proves those steps; do not run them again
|
|
242
|
+
or author another implementation narrative. A blocked receipt preserves
|
|
243
|
+
its failure evidence and follows the recovery rule, never a manual bypass.
|
|
244
|
+
Keep the pre-finish declared-path check above. Each landing re-opens step 2
|
|
245
|
+
so ready dependents can run while unrelated children remain in flight.
|
|
246
|
+
- A block whose Log delta leads with `NEEDS-ORCHESTRATOR:` is a contract
|
|
247
|
+
question, not a failure. When the approved artifacts (PLAN.md,
|
|
248
|
+
INTENT.md, SYNTHESIS.md, and the Interface contracts of every involved
|
|
249
|
+
task) pin exactly one answer, append `Orchestrator answer: <answer> —
|
|
250
|
+
<artifact citation>` to the task Log, return the task to `pending`,
|
|
251
|
+
checkpoint the bookkeeping, and let a later layer redispatch it; a question
|
|
252
|
+
redispatch never consumes the failed-implementation redispatch. When the
|
|
253
|
+
runtime's structured layer exposes a blocking ask/reply channel, relay
|
|
254
|
+
the answer through it with the worker held alive per the runtime
|
|
255
|
+
dispatch contract instead of redispatching. A dispatch-driver question
|
|
256
|
+
keeps the isolate active: record the answer with `dispatch_driver.py
|
|
257
|
+
answer`, and the next `round` redispatches that same isolate. When
|
|
258
|
+
the artifacts admit more than one reading, ask the user through an
|
|
259
|
+
interactive user-input tool when available, record the ruling verbatim
|
|
260
|
+
as the answer, and repair the task contract as a documented plan defect
|
|
261
|
+
when the ruling changes it — except a ruling that changes a success
|
|
262
|
+
criterion, constraint, or veto, which follows the define-Corrections
|
|
263
|
+
path above. A question block creates no product commit
|
|
264
|
+
and preserves the isolated worktree under the same retirement rule. Before
|
|
265
|
+
changing its canonical bookkeeping, revoke a parallel isolate's active
|
|
266
|
+
dispatch with `python3 <absolute isolation.py> deactivate-task --repo
|
|
267
|
+
<isolated worktree> --task-id <id> --task-branch <task_branch>`.
|
|
268
|
+
- A blocked report, invalid diff, or failed Verify creates no product
|
|
269
|
+
commit. Validate and copy the isolated task's append-only Log delta once;
|
|
270
|
+
it is the coder's sole block/implementation narrative. Add orchestrator
|
|
271
|
+
evidence only for a distinct diff or Verify rejection. Before changing the
|
|
272
|
+
task to `blocked` or `failed`, revoke a parallel isolate's active dispatch
|
|
273
|
+
with `python3 <absolute isolation.py> deactivate-task
|
|
274
|
+
--repo <isolated worktree> --task-id <id> --task-branch <task_branch>`.
|
|
275
|
+
Then update and checkpoint the bookkeeping and apply the recovery
|
|
276
|
+
rule. Preserve the isolated worktree unless and until the explicit clean
|
|
277
|
+
retry-retirement procedure in step 2 owns and removes it.
|
|
278
|
+
|
|
279
|
+
6. **Review the wave.** The build orchestrator owns wave reviews; ship never
|
|
280
|
+
runs them. Only after every wave task is done, read the wave's
|
|
281
|
+
`Review depth` from PLAN.md (default `full`). At `full` or `deep` the
|
|
282
|
+
dispatch driver's `review` action performs the sidecar, brief, validate,
|
|
283
|
+
collect, and retire work of this step; perform it by hand only without a
|
|
284
|
+
child command.
|
|
285
|
+
- `full`: spawn one independent reviewer using deterministic logical task
|
|
286
|
+
name `review_wave_<wave>_cycle_<cycle>`. Supply every task path, its
|
|
287
|
+
recorded base and proven landing commit, the reviewer role, and
|
|
288
|
+
wave-review template, and the absolute INTENT.md path.
|
|
289
|
+
When INTENT selects quick lane and PLAN has one full wave, also assign
|
|
290
|
+
final scope: supply PLAN.md's Surface contract and the recorded review HEAD.
|
|
291
|
+
The same reviewer checks all success criteria and any remaining walkthrough
|
|
292
|
+
in this pass, records `Review scope: final` and `Reviewed HEAD`, and adds
|
|
293
|
+
Surface/Check/Observed fields to each surface criterion. Reuse recorded
|
|
294
|
+
command evidence when it already proves the named walkthrough; execute
|
|
295
|
+
only missing checks. Ship can then derive FINAL.md without another reviewer.
|
|
296
|
+
Record current clean primary HEAD as the review collection base. Create
|
|
297
|
+
a fresh review sidecar there; the serial task verification sidecar belongs
|
|
298
|
+
to the earlier task base and cannot be collected after landing.
|
|
299
|
+
Use `python3 <absolute isolation.py> isolate-verify --repo <absolute primary>
|
|
300
|
+
--base <recorded review base> --name wave-<N>-cycle-<C>`. Each task's
|
|
301
|
+
recorded base and landing commit still define its isolated review diff.
|
|
302
|
+
Keep primary HEAD fixed until collection completes. Brief the
|
|
303
|
+
recorded isolated Verify output per task (the Log entry the
|
|
304
|
+
orchestrator appended at landing). The reviewer must not re-run that
|
|
305
|
+
command or PLAN.md's project Verify. The reviewer
|
|
306
|
+
stages `.project/review/wave-N.cycleC.md` there; the
|
|
307
|
+
orchestrator validates it, atomically copies it to the primary canonical
|
|
308
|
+
path, and only then retires that sidecar with `retire`.
|
|
309
|
+
- `deep`: spawn two independent reviewers in parallel, each with a fresh
|
|
310
|
+
isolated context and its own verify sidecar from `isolate-verify` at the
|
|
311
|
+
recorded review base (`--name wave-<N>-cycle-<C>-contract` and
|
|
312
|
+
`wave-<N>-cycle-<C>-adversarial`). Supply both every task path, its
|
|
313
|
+
recorded base and proven landing commit, the reviewer role, and the
|
|
314
|
+
wave-review template, and the absolute INTENT.md path. The contract lens —
|
|
315
|
+
logical task name `review_wave_<wave>_cycle_<cycle>_contract` — does the
|
|
316
|
+
full review: apply each task's `commit^..commit` product patch to the
|
|
317
|
+
recorded base, check the recorded Verify plus the isolated diff, and
|
|
318
|
+
check every acceptance criterion,
|
|
319
|
+
owned INTENT success criterion, and interface contract. The adversarial
|
|
320
|
+
lens — logical task name
|
|
321
|
+
`review_wave_<wave>_cycle_<cycle>_adversarial` — tries to kill the work:
|
|
322
|
+
security holes, unhandled edge cases, failure modes, data-loss and
|
|
323
|
+
concurrency risks, and missing error handling. Each stages its own file
|
|
324
|
+
in its own worktree — `.project/review/wave-N.cycleC.contract.md` and
|
|
325
|
+
`.project/review/wave-N.cycleC.adversarial.md`; the orchestrator validates
|
|
326
|
+
each, atomically copies both to their primary canonical paths, and only
|
|
327
|
+
then retires those sidecars. The wave passes only when both lenses
|
|
328
|
+
return `pass`; any `blocked` lens blocks the wave, and both files'
|
|
329
|
+
findings feed the fix-task batching in step 7.
|
|
330
|
+
- A review file is written only during that cycle, at that cycle's recorded
|
|
331
|
+
base, by the writer the selected depth names: a dispatched reviewer at
|
|
332
|
+
`full` or `deep`, or the orchestrator at `verify-only`. Never backfill,
|
|
333
|
+
split, rename, or reconstruct a review file for a cycle that already ran,
|
|
334
|
+
and never write a placeholder verdict for a task that did not exist at
|
|
335
|
+
that cycle. A missing or non-canonical earlier artifact is reported to
|
|
336
|
+
the user; the
|
|
337
|
+
only repair is a new review cycle at the current HEAD, which counts
|
|
338
|
+
toward the cap.
|
|
339
|
+
- `verify-only`: spawn no reviewer. The orchestrator writes
|
|
340
|
+
`.project/review/wave-N.cycleC.md` itself from evidence it already
|
|
341
|
+
holds — per task, the Verify evidence and the declared-files diff
|
|
342
|
+
check — recording `Depth: verify-only`. Same command, same commit
|
|
343
|
+
reuses the recorded pass: the task's Verify evidence is the ledger
|
|
344
|
+
entry when `python3 <absolute build_state.py> verify-lookup --repo
|
|
345
|
+
<absolute primary> --command <task Verify> --commit <landed commit>`
|
|
346
|
+
returns `reuse: true`; otherwise run the command in an
|
|
347
|
+
`isolate-verify --historical-task <task id>` sidecar at that commit, record it with
|
|
348
|
+
`verify-record`, and use that result. A re-review after a fix cycle
|
|
349
|
+
follows the same rule. It checks each acceptance
|
|
350
|
+
criterion and each INTENT success criterion owned by the wave's tasks
|
|
351
|
+
against that evidence and the diff; anything it cannot
|
|
352
|
+
confirm from them is a finding, not a pass. Never spawn a review panel
|
|
353
|
+
at `verify-only`.
|
|
354
|
+
- After the canonical inherit reviewer (or orchestrator-written
|
|
355
|
+
`verify-only` file) is collected, run the optional review panel only
|
|
356
|
+
for `full` and `deep`. Inspect advertised model slugs and run
|
|
357
|
+
`python3 <absolute review_panel.py> resolve --plan <absolute PLAN.md>
|
|
358
|
+
--intent <absolute INTENT.md> --advertised <comma slugs>
|
|
359
|
+
--parent-slug <current model slug when known>` and `--charter
|
|
360
|
+
<absolute .project/CHARTER.md>` when that file exists. `status: off`
|
|
361
|
+
continues with no current-cycle panel artifact. For `skipped`,
|
|
362
|
+
persist the helper's exact JSON stdout as
|
|
363
|
+
`.project/review/wave-N.cycleC.panel.skipped.json` and continue without
|
|
364
|
+
a panel; do not translate or summarize the receipt. Exit 2 / `error`
|
|
365
|
+
blocks the wave. `ready` requires that skipped-receipt path to be absent,
|
|
366
|
+
then spawns one child per selected family with
|
|
367
|
+
logical task name `review_wave_<wave>_cycle_<cycle>_panel_<family>`,
|
|
368
|
+
the reviewer role in wave-panel mode, the wave-panel template, and the
|
|
369
|
+
exact helper-returned model slug when the host advertises model
|
|
370
|
+
selection. On `deep`, each panel brief is the adversarial lens only.
|
|
371
|
+
Never override the model on the canonical reviewer. Each child stages
|
|
372
|
+
its family file in its own verify sidecar from `isolate-verify`
|
|
373
|
+
(`--name wave-<N>-cycle-<C>-panel-<family>`); the parent validates
|
|
374
|
+
those files and runs `python3 <absolute review_panel.py> merge --kind
|
|
375
|
+
wave --wave <N> --cycle <C> --inputs <family files> --output
|
|
376
|
+
<absolute .project/review/wave-N.cycleC.panel.md> --mode
|
|
377
|
+
<detected|named>`. The inherit reviewer remains the only Wave verdict.
|
|
378
|
+
Do not average panel findings into that verdict or auto-create fix
|
|
379
|
+
tasks from preference findings.
|
|
380
|
+
- After the canonical inherit reviewer file (and each deep lens file) is
|
|
381
|
+
on the primary path, run
|
|
382
|
+
`python3 <absolute check_handoffs.py> wave --repo <absolute primary>
|
|
383
|
+
--review <canonical wave-review path>`. A non-zero exit is a blocked
|
|
384
|
+
wave, not a pass, including `verify-only`. Do not advance on helper
|
|
385
|
+
failure.
|
|
386
|
+
|
|
387
|
+
7. **Fix or advance.** A valid canonical `pass` advances unless an
|
|
388
|
+
actionable review-panel finding is waiting for a user ruling. On
|
|
389
|
+
`blocked`, run `python3 <absolute review_findings.py> collect --repo
|
|
390
|
+
<absolute primary> --wave <N> --cycle <C>`, adding one `--helper-failure
|
|
391
|
+
"<helper and stderr>"` per bundled helper that exited non-zero in this
|
|
392
|
+
cycle. The helper alone reads PLAN.md Config (`max_review_cycles`,
|
|
393
|
+
`finding_skeptics`, `wave_budget`), the cycle's lens files, and every
|
|
394
|
+
skeptic file of the wave; it groups blocking findings by criterion
|
|
395
|
+
locator, collapses true duplicates, carries earlier refutations forward,
|
|
396
|
+
separates structural blockers, batches fix groups by disjoint file scope,
|
|
397
|
+
and reports `cap_reached`. Exit 2 blocks the wave. Never regroup,
|
|
398
|
+
re-derive a locator, or re-decide refutation in model reasoning; act on
|
|
399
|
+
the result in this order:
|
|
400
|
+
- `structural_blockers` non-empty: a missing or invalid lens, panel, or
|
|
401
|
+
skeptic artifact, a helper failure, or a finding that names no
|
|
402
|
+
contract criterion never enters skeptic filtering. Keep it blocking
|
|
403
|
+
through the ordinary blocked-wave handling — a fix task when applicable
|
|
404
|
+
or `build/blocked` escalation otherwise.
|
|
405
|
+
- `cap_reached` true: skip every branch below and use the cycle-cap
|
|
406
|
+
escalation at the end of this step.
|
|
407
|
+
- `skeptic_groups` non-empty: spawn one independent read-only skeptic
|
|
408
|
+
per listed locator, concurrently up to the advertised child capacity,
|
|
409
|
+
with logical task name
|
|
410
|
+
`review_wave_<wave>_cycle_<cycle>_skeptic_<criterion_locator>`, the
|
|
411
|
+
reviewer role in skeptic mode, the skeptic template, and its own verify
|
|
412
|
+
sidecar from `isolate-verify`
|
|
413
|
+
(`--name wave-<N>-cycle-<C>-skeptic-<criterion_locator>`) at the
|
|
414
|
+
recorded review base. Brief each with the group's `locator`,
|
|
415
|
+
`criterion` verbatim, every `observations` entry verbatim, the group's
|
|
416
|
+
`tasks` files, their recorded bases and proven landing commits, and the
|
|
417
|
+
absolute INTENT.md path. Each skeptic stages
|
|
418
|
+
`.project/review/wave-N.cycleC.skeptic-<criterion_locator>.md` in its
|
|
419
|
+
sidecar; validate each against the skeptic template, atomically copy it
|
|
420
|
+
to the primary canonical path, then retire that sidecar. Rerun the
|
|
421
|
+
helper; a locator refuted in an earlier cycle never gets a second
|
|
422
|
+
skeptic, and the helper already routes it.
|
|
423
|
+
- `all_refuted` true: stop and ask. Present **Outcome** with the blocked
|
|
424
|
+
verdict and the refutation count, **Review** linking the lens and
|
|
425
|
+
skeptic files, and **Next** listing `Re-run the review cycle with the
|
|
426
|
+
skeptic files in the reviewer briefs (recommended — no finding survived
|
|
427
|
+
scrutiny)` first, then `Open fix tasks from the findings anyway (an
|
|
428
|
+
explicit ruling that overrides their refutations)`. A selected re-run
|
|
429
|
+
consumes a cycle. After the user selects either option, record exact
|
|
430
|
+
full HEAD, then use `pipeline_state.py transition` with the exact
|
|
431
|
+
current phase, status, branch, and archive as expected and unchanged
|
|
432
|
+
phase/status as the result. Append `wave <N> cycle <C> all-refuted
|
|
433
|
+
ruling: <selected option verbatim>` to the STATE.md Log and require the
|
|
434
|
+
returned position to remain `build/active`. Checkpoint STATE.md and the
|
|
435
|
+
collected skeptic artifacts through the Bookkeeping checkpoint rule with
|
|
436
|
+
subject `build: record wave <N> cycle <C> skeptic ruling`, body `Why:
|
|
437
|
+
persist the all-refuted user ruling before acting`, and `Wave: <N>`. Do
|
|
438
|
+
not start the selected review cycle or create, batch, or dispatch fix
|
|
439
|
+
tasks until the checkpoint returns its commit. When the persisted ruling
|
|
440
|
+
selects `Open fix tasks from the findings anyway`, the override set is
|
|
441
|
+
every `refuted_groups` locator with its preserved `observations`; its
|
|
442
|
+
governing refutation is the group's `skeptic` entry (the current
|
|
443
|
+
cycle's file, or the earlier cycle's file for a same-evidence repeat).
|
|
444
|
+
Add that set to `fix_groups` for batching. No other ruling re-admits
|
|
445
|
+
refuted groups. Preserve their skeptic verdicts and eligibility
|
|
446
|
+
history. After a crash, resume the recorded choice without asking
|
|
447
|
+
again.
|
|
448
|
+
- Otherwise batch `fix_batches` into complete fix tasks from the task
|
|
449
|
+
template — one task per batch, never one per finding — each carrying
|
|
450
|
+
its groups' failed criteria and observed evidence verbatim. A group
|
|
451
|
+
with `repeat` true is evidence its earlier fix failed, never a new
|
|
452
|
+
finding; a re-review never spawns a duplicate fix task for a finding
|
|
453
|
+
already carried. Write each fix task to `.project/tasks/` with `wave`
|
|
454
|
+
set to the current wave or a newly appended `## Wave N` heading in
|
|
455
|
+
PLAN.md before dispatch. Its dependencies include every source task in
|
|
456
|
+
the batch; its files match the batch. In `## Review findings`, use one
|
|
457
|
+
`### <locator>` block per group, `Criterion: <verbatim criterion>`, and
|
|
458
|
+
every observation verbatim. Run the repair through the same isolated
|
|
459
|
+
layer loop, even when its appended wave repairs an earlier blocked wave.
|
|
460
|
+
After landing, call `review_findings.py repair-evidence --repo <primary>
|
|
461
|
+
--wave <source wave> --cycle <source cycle> --task <repair id>` and save
|
|
462
|
+
its JSON as the repair evidence for the next review. The helper validates
|
|
463
|
+
the carried batch, original and repair landings, isolated product scope,
|
|
464
|
+
unchanged source reports and reusable Verify. On success, brief the next
|
|
465
|
+
original-wave review with this receipt and the reviewer role's
|
|
466
|
+
**Re-review after a proven repair** contract. Reuse command evidence;
|
|
467
|
+
the new review judges the repaired product against the original criteria.
|
|
468
|
+
Preserve prior verdicts and source tasks. On helper rejection, resolve
|
|
469
|
+
the evidence blocker rather than redispatching an already proven fix.
|
|
470
|
+
At the cap, record all attempts in the STATE.md log and ask the user —
|
|
471
|
+
through an interactive user-input tool when available — after linking
|
|
472
|
+
the resolved absolute blocking wave review, every deep lens file for the
|
|
473
|
+
cycle, and every skeptic file collected for the wave, plus the STATE.md
|
|
474
|
+
attempt log. Ask whether to redirect the approach, raise the cap, or send
|
|
475
|
+
define to amend INTENT.md `## Corrections` — never rewrite an AC from a
|
|
476
|
+
Log waiver — or, in program flow (ROADMAP.md exists), to abandon the
|
|
477
|
+
milestone under the Milestone abandon procedure — listing the
|
|
478
|
+
orchestrator's recommended option first marked `(recommended)` with a
|
|
479
|
+
one-line reason drawn from the review evidence. Never choose silently.
|
|
480
|
+
When the canonical verdict is `pass` and `wave-N.cycleC.panel.md` reports
|
|
481
|
+
`Actionable` greater than 0, do not advance silently: present **Outcome**
|
|
482
|
+
with the canonical pass plus the actionable count, **Review** linking the
|
|
483
|
+
panel file, and **Next** listing `Open fix tasks from panel findings
|
|
484
|
+
(recommended)` first, then `Advance and keep panel findings as warnings`.
|
|
485
|
+
Preference-only panel warnings do not block advance. On pass, checkpoint
|
|
486
|
+
the review artifact, the panel file when present, STATE.md, and wave
|
|
487
|
+
bookkeeping, then report `wave N/M done, C review cycle(s)`.
|
|
488
|
+
|
|
489
|
+
## Completion
|
|
490
|
+
|
|
491
|
+
Run `python3 <absolute dispatch_driver.py> complete --repo <absolute primary>`
|
|
492
|
+
even when the coders used native child tools. Follow the build skill's Completion
|
|
493
|
+
handoff. The runtime owns landing evidence, transition, and checkpoint; ship owns
|
|
494
|
+
project Verify. Never repeat a proven operation in a manual sequence.
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
# Return a blocked build to its contract owner
|
|
2
|
+
|
|
3
|
+
Use this contract only for an active milestone at `build/blocked`: a documented
|
|
4
|
+
structural plan defect, or an explicit user ruling that changes approved intent.
|
|
5
|
+
It does not reopen ship, archived milestones, or lookahead. Build owns entry;
|
|
6
|
+
Define owns intent corrections; Plan owns the replacement task inventory and
|
|
7
|
+
approval. Routing remains a caller handoff under AGENTS.md.
|
|
8
|
+
|
|
9
|
+
## Build: checkpoint and enter
|
|
10
|
+
|
|
11
|
+
1. Record the finding or verbatim user ruling in STATE through its helper.
|
|
12
|
+
Stop dispatch. Use the normal recovery and retirement procedures until
|
|
13
|
+
every task is either unstarted `pending` with null dispatch metadata or
|
|
14
|
+
proven `done`. Preserve owned uncommitted work before any retirement.
|
|
15
|
+
Settle reviewers and their sidecars too. Dispatch records must have no pending
|
|
16
|
+
cleanup; records with reviewer `worktree` and `branch` ownership must also
|
|
17
|
+
record `cleanup_complete`. A `blocked` or `collected` outcome alone does not
|
|
18
|
+
prove retirement. Records that never owned a reviewer sidecar do not require
|
|
19
|
+
that retirement receipt. Use the existing dispatch retirement procedures;
|
|
20
|
+
recovery does not retire sidecars itself. Never infer that a timed-out child
|
|
21
|
+
stopped. Checkpoint the blocked state and artifacts using the Build
|
|
22
|
+
bookkeeping contract; the primary must be clean.
|
|
23
|
+
2. Run `pipeline_state.py transition` with the complete current state expected,
|
|
24
|
+
`--set-status active`, and the matching target and event:
|
|
25
|
+
|
|
26
|
+
| Cause | Target | Exact event |
|
|
27
|
+
| --- | --- | --- |
|
|
28
|
+
| User changes a criterion, constraint, or veto | `--set-phase define` | `build intent corrections requested` |
|
|
29
|
+
| Task inventory, dependency, or wave repair | `--set-phase plan` | `build plan repair requested` |
|
|
30
|
+
|
|
31
|
+
The helper records the committed recovery base in STATE atomically. Do not
|
|
32
|
+
author or edit that record. Milestone, branch, integration settings, and
|
|
33
|
+
landed task contracts remain fixed throughout recovery.
|
|
34
|
+
3. Return to the router or name the selected explicit skill. The route names
|
|
35
|
+
`corrections` for Define and `build-repair` for Plan. Other blocked-build
|
|
36
|
+
failures continue through ordinary Build recovery.
|
|
37
|
+
|
|
38
|
+
## Define and Plan: prepare before editing
|
|
39
|
+
|
|
40
|
+
Run the bundled `pipeline_state.py prepare-build-recovery --repo <absolute-root>`
|
|
41
|
+
before changing any recovery artifact. This repeatable operation preserves the
|
|
42
|
+
old review directory under `plan/build-recovery-<base>/review` and starts a fresh
|
|
43
|
+
active review directory. STATE's recorded base owns an interrupted move; rerun
|
|
44
|
+
this command to finish it. The helper validates the preserved bytes against Git.
|
|
45
|
+
Do not remove, rewrite, or use the preserved reviews as current approval.
|
|
46
|
+
|
|
47
|
+
**Define corrections.** Read the existing intent and governing program artifacts.
|
|
48
|
+
Interview only the requested change; append the user's words under
|
|
49
|
+
`## Corrections`, revise the affected intent, and present the delta for approval.
|
|
50
|
+
Keep the milestone identity. Reclassify the lane using the normal lane rules.
|
|
51
|
+
After approval, use the normal `define/active → define/done` transition and route
|
|
52
|
+
from the approved lane. Standard intent goes through Research and Decide again;
|
|
53
|
+
quick and milestone intent use their existing evidence gates. A program charter
|
|
54
|
+
or roadmap conflict still requires its legal owner gate; this path cannot waive it.
|
|
55
|
+
|
|
56
|
+
**Plan build-repair.** Read the corrected intent, current synthesis, existing plan,
|
|
57
|
+
task files, and recovery base. Use the normal planner, lint, panel, and approval
|
|
58
|
+
gates. Repair the remaining task inventory as needed, including split, rename,
|
|
59
|
+
dependency, or wave changes. Keep IDs ordered and contiguous. Preserve every
|
|
60
|
+
landed task file byte-for-byte, including its recorded base and proof. Any new
|
|
61
|
+
work to satisfy a corrected criterion belongs in new pending tasks, not rewritten
|
|
62
|
+
landed contracts. A plan-only recovery must not change approved intent.
|
|
63
|
+
|
|
64
|
+
## Approve and return to Build
|
|
65
|
+
|
|
66
|
+
Use normal `pipeline_state.py approve --kind plan --expected-head <HEAD>`.
|
|
67
|
+
Neither `--patch` nor `--defer-checkpoint` is legal for recovery. The helper
|
|
68
|
+
checks landed-task preservation and restored intent ownership, restores review
|
|
69
|
+
evidence only for unchanged contracts, and creates the normal journaled plan
|
|
70
|
+
checkpoint. A failed approval leaves recovery open.
|
|
71
|
+
|
|
72
|
+
Return through `plan/done → build/active` with event `build started`. The dispatch
|
|
73
|
+
driver uses a separate record directory for this recovery base, while retaining
|
|
74
|
+
the milestone budget ledger. Resume only from the new approved task inventory.
|
|
75
|
+
Unchanged wave evidence remains usable; changed waves need review in the new
|
|
76
|
+
record directory. Retained task Verify receipts remain historical evidence for
|
|
77
|
+
their original task and base, never proof for a changed task. Final review still
|
|
78
|
+
requires current-HEAD evidence before shipment.
|
|
@@ -7,12 +7,17 @@ Execute exactly one task for `$gsd-path-build`.
|
|
|
7
7
|
- Require the brief to name the assigned task file, task template, and
|
|
8
8
|
`.project/intent/INTENT.md` by absolute path, plus the isolated
|
|
9
9
|
linked-worktree root returned by `isolation.py isolate-task`. Read the
|
|
10
|
-
task file
|
|
10
|
+
task file fully from that worktree. Use the generated intent context in the
|
|
11
|
+
brief when supplied; it retains global rules, corrections, and owned or
|
|
12
|
+
explicitly referenced criteria with source hashes. Otherwise read INTENT.md
|
|
13
|
+
fully. Read the task template only to resolve a missing or ambiguous field;
|
|
14
|
+
the completed task already supplies the implementation contract.
|
|
11
15
|
On a serial dispatch round that root is the primary worktree on the bound
|
|
12
16
|
branch; still never edit a sibling task's files. On a parallel round never
|
|
13
17
|
edit the primary worktree.
|
|
14
|
-
-
|
|
15
|
-
`files`
|
|
18
|
+
- Apply the project `AGENTS.md`; read it if the host has not already supplied
|
|
19
|
+
that exact file. Read every existing path listed in the task's `files`
|
|
20
|
+
frontmatter before editing. Load WORKFLOW.md only for a workflow ambiguity.
|
|
16
21
|
- Treat Context, Approach, Interface contract, owned INTENT success
|
|
17
22
|
criteria, Acceptance criteria, and Verify as the implementation contract.
|
|
18
23
|
Owned SCs, Criteria, Verify, and the Interface contract define done;
|
|
@@ -122,6 +122,12 @@ directory for the full logical session; resumptions reuse it. Record completed
|
|
|
122
122
|
parent CLI run events and each native child's session events with stable logical
|
|
123
123
|
task names before the next dispatch. The helper reads host counters and refuses
|
|
124
124
|
incomplete or ambiguous usage; never estimate tokens or reset the ledger.
|
|
125
|
+
When the verified CLI adapter reports cumulative counters across `resume`, record
|
|
126
|
+
each later invocation with `--previous-events <previous recorded CLI events>`.
|
|
127
|
+
The helper checks thread identity and records only the new output, preserving the
|
|
128
|
+
raw total and predecessor. Keep that chain in order; never sum cumulative totals.
|
|
129
|
+
Use ordinary `record` for per-invocation counters. An unknown counter convention
|
|
130
|
+
is unproven usage, not permission to guess.
|
|
125
131
|
Run `admit` for the next task and stop dispatch on a blocked result. Preserve
|
|
126
132
|
its output in the dispatch evidence. This gates observed usage only: concurrent
|
|
127
133
|
or in-flight work can overrun before the host reports usage. Codex CLI has no
|