@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
|
@@ -45,7 +45,9 @@
|
|
|
45
45
|
"scripts/wizard.mjs",
|
|
46
46
|
"scripts/skill-resources.json",
|
|
47
47
|
"scripts/_common.py",
|
|
48
|
+
"scripts/build_recovery.py",
|
|
48
49
|
"scripts/state_checkpoint.py",
|
|
50
|
+
"scripts/roadmap.py",
|
|
49
51
|
"scripts/state_promote.py",
|
|
50
52
|
"scripts/discussion_validate.py",
|
|
51
53
|
"scripts/integration.py",
|
|
@@ -70,6 +72,7 @@
|
|
|
70
72
|
"scripts/loop_run.py",
|
|
71
73
|
"scripts/workflow_run.py",
|
|
72
74
|
"scripts/dispatch_driver.py",
|
|
75
|
+
"scripts/task_context.py",
|
|
73
76
|
"scripts/lean_verification.py",
|
|
74
77
|
"scripts/token_budget.py",
|
|
75
78
|
"scripts/pipeline_undo.py",
|
|
@@ -90,9 +93,17 @@
|
|
|
90
93
|
],
|
|
91
94
|
"phase_resources": {
|
|
92
95
|
"gsd-path-build": [
|
|
96
|
+
"references/build-recovery.md",
|
|
97
|
+
"references/build-native.md",
|
|
98
|
+
"references/build-abandon.md",
|
|
93
99
|
"references/coder.md",
|
|
94
100
|
"references/dispatch.md",
|
|
95
101
|
"references/reviewer.md",
|
|
102
|
+
"references/reviewer-wave.md",
|
|
103
|
+
"references/reviewer-skeptic.md",
|
|
104
|
+
"references/reviewer-final.md",
|
|
105
|
+
"references/reviewer-panel.md",
|
|
106
|
+
|
|
96
107
|
"templates/task.md",
|
|
97
108
|
"templates/wave-review.md",
|
|
98
109
|
"templates/wave-panel.md",
|
|
@@ -108,6 +119,7 @@
|
|
|
108
119
|
"templates/docs-audit.md"
|
|
109
120
|
],
|
|
110
121
|
"gsd-path-define": [
|
|
122
|
+
"references/build-recovery.md",
|
|
111
123
|
"templates/charter.md",
|
|
112
124
|
"templates/intent.md",
|
|
113
125
|
"templates/state.md"
|
|
@@ -126,6 +138,7 @@
|
|
|
126
138
|
"templates/loop.md"
|
|
127
139
|
],
|
|
128
140
|
"gsd-path-plan": [
|
|
141
|
+
"references/build-recovery.md",
|
|
129
142
|
"references/dispatch.md",
|
|
130
143
|
"references/planner.md",
|
|
131
144
|
"templates/patch-findings.md",
|
|
@@ -147,6 +160,11 @@
|
|
|
147
160
|
"gsd-path-ship": [
|
|
148
161
|
"references/dispatch.md",
|
|
149
162
|
"references/reviewer.md",
|
|
163
|
+
"references/reviewer-wave.md",
|
|
164
|
+
"references/reviewer-skeptic.md",
|
|
165
|
+
"references/reviewer-final.md",
|
|
166
|
+
"references/reviewer-panel.md",
|
|
167
|
+
|
|
150
168
|
"templates/archive-manifest.md",
|
|
151
169
|
"templates/final-review.md",
|
|
152
170
|
"templates/gap-review.md",
|
|
@@ -192,6 +210,43 @@
|
|
|
192
210
|
["scripts/detect_project.py", "skills/gsd-path/scripts/detect_project.py"],
|
|
193
211
|
["scripts/detect_project.py", "skills/gsd-path-define/scripts/detect_project.py"],
|
|
194
212
|
["scripts/detect_project.py", "skills/gsd-path-inspect/scripts/detect_project.py"],
|
|
213
|
+
["scripts/promote_lookahead.py", "skills/gsd-path-build/scripts/promote_lookahead.py"],
|
|
214
|
+
["scripts/detect_project.py", "skills/gsd-path-build/scripts/detect_project.py"],
|
|
215
|
+
["scripts/promote_lookahead.py", "skills/gsd-path-ship/scripts/promote_lookahead.py"],
|
|
216
|
+
["scripts/detect_project.py", "skills/gsd-path-ship/scripts/detect_project.py"],
|
|
217
|
+
["scripts/promote_lookahead.py", "skills/gsd-path-plan/scripts/promote_lookahead.py"],
|
|
218
|
+
["scripts/archive_milestone.py", "skills/gsd-path-plan/scripts/archive_milestone.py"],
|
|
219
|
+
["scripts/detect_project.py", "skills/gsd-path-plan/scripts/detect_project.py"],
|
|
220
|
+
["scripts/integration.py", "skills/gsd-path-plan/scripts/integration.py"],
|
|
221
|
+
["scripts/discussion_validate.py", "skills/gsd-path-plan/scripts/discussion_validate.py"],
|
|
222
|
+
["scripts/promote_lookahead.py", "skills/gsd-path-research/scripts/promote_lookahead.py"],
|
|
223
|
+
["scripts/archive_milestone.py", "skills/gsd-path-research/scripts/archive_milestone.py"],
|
|
224
|
+
["scripts/detect_project.py", "skills/gsd-path-research/scripts/detect_project.py"],
|
|
225
|
+
["scripts/integration.py", "skills/gsd-path-research/scripts/integration.py"],
|
|
226
|
+
["scripts/discussion_validate.py", "skills/gsd-path-research/scripts/discussion_validate.py"],
|
|
227
|
+
["scripts/review_panel.py", "skills/gsd-path-research/scripts/review_panel.py"],
|
|
228
|
+
["scripts/promote_lookahead.py", "skills/gsd-path-decide/scripts/promote_lookahead.py"],
|
|
229
|
+
["scripts/archive_milestone.py", "skills/gsd-path-decide/scripts/archive_milestone.py"],
|
|
230
|
+
["scripts/detect_project.py", "skills/gsd-path-decide/scripts/detect_project.py"],
|
|
231
|
+
["scripts/integration.py", "skills/gsd-path-decide/scripts/integration.py"],
|
|
232
|
+
["scripts/discussion_validate.py", "skills/gsd-path-decide/scripts/discussion_validate.py"],
|
|
233
|
+
["scripts/review_panel.py", "skills/gsd-path-decide/scripts/review_panel.py"],
|
|
234
|
+
["scripts/promote_lookahead.py", "skills/gsd-path-define/scripts/promote_lookahead.py"],
|
|
235
|
+
["scripts/archive_milestone.py", "skills/gsd-path-define/scripts/archive_milestone.py"],
|
|
236
|
+
["scripts/integration.py", "skills/gsd-path-define/scripts/integration.py"],
|
|
237
|
+
["scripts/discussion_validate.py", "skills/gsd-path-define/scripts/discussion_validate.py"],
|
|
238
|
+
["scripts/review_panel.py", "skills/gsd-path-define/scripts/review_panel.py"],
|
|
239
|
+
["scripts/promote_lookahead.py", "skills/gsd-path-inspect/scripts/promote_lookahead.py"],
|
|
240
|
+
["scripts/archive_milestone.py", "skills/gsd-path-inspect/scripts/archive_milestone.py"],
|
|
241
|
+
["scripts/integration.py", "skills/gsd-path-inspect/scripts/integration.py"],
|
|
242
|
+
["scripts/discussion_validate.py", "skills/gsd-path-inspect/scripts/discussion_validate.py"],
|
|
243
|
+
["scripts/review_panel.py", "skills/gsd-path-inspect/scripts/review_panel.py"],
|
|
244
|
+
["scripts/promote_lookahead.py", "skills/gsd-path-docs-audit/scripts/promote_lookahead.py"],
|
|
245
|
+
["scripts/archive_milestone.py", "skills/gsd-path-docs-audit/scripts/archive_milestone.py"],
|
|
246
|
+
["scripts/detect_project.py", "skills/gsd-path-docs-audit/scripts/detect_project.py"],
|
|
247
|
+
["scripts/integration.py", "skills/gsd-path-docs-audit/scripts/integration.py"],
|
|
248
|
+
["scripts/discussion_validate.py", "skills/gsd-path-docs-audit/scripts/discussion_validate.py"],
|
|
249
|
+
["scripts/review_panel.py", "skills/gsd-path-docs-audit/scripts/review_panel.py"],
|
|
195
250
|
["scripts/promote_lookahead.py", "skills/gsd-path/scripts/promote_lookahead.py"],
|
|
196
251
|
["scripts/promote_lookahead.py", "skills/gsd-path-roadmap/scripts/promote_lookahead.py"],
|
|
197
252
|
["scripts/archive_milestone.py", "skills/gsd-path-roadmap/scripts/archive_milestone.py"],
|
|
@@ -258,9 +313,12 @@
|
|
|
258
313
|
["scripts/loop_run.py", "skills/gsd-path-build/scripts/loop_run.py"],
|
|
259
314
|
["scripts/workflow_run.py", "skills/gsd-path/scripts/workflow_run.py"],
|
|
260
315
|
["scripts/workflow_run.py", "skills/gsd-path-plan/scripts/workflow_run.py"],
|
|
316
|
+
["scripts/workflow_run.py", "skills/gsd-path-inspect/scripts/workflow_run.py"],
|
|
261
317
|
["scripts/workflow_run.py", "skills/gsd-path-build/scripts/workflow_run.py"],
|
|
262
318
|
["scripts/dispatch_driver.py", "skills/gsd-path/scripts/dispatch_driver.py"],
|
|
319
|
+
["scripts/task_context.py", "skills/gsd-path/scripts/task_context.py"],
|
|
263
320
|
["scripts/dispatch_driver.py", "skills/gsd-path-build/scripts/dispatch_driver.py"],
|
|
321
|
+
["scripts/task_context.py", "skills/gsd-path-build/scripts/task_context.py"],
|
|
264
322
|
["scripts/workflow_run.py", "skills/gsd-path-ship/scripts/workflow_run.py"],
|
|
265
323
|
["scripts/lean_verification.py", "skills/gsd-path/scripts/lean_verification.py"],
|
|
266
324
|
["scripts/lean_verification.py", "skills/gsd-path-ship/scripts/lean_verification.py"],
|
|
@@ -290,38 +348,58 @@
|
|
|
290
348
|
["scripts/pipeline_git.py", "skills/gsd-path-decide/scripts/pipeline_git.py"],
|
|
291
349
|
["scripts/pipeline_git.py", "skills/gsd-path-define/scripts/pipeline_git.py"],
|
|
292
350
|
["scripts/pipeline_state.py", "skills/gsd-path/scripts/pipeline_state.py"],
|
|
351
|
+
["scripts/build_recovery.py", "skills/gsd-path/scripts/build_recovery.py"],
|
|
293
352
|
["scripts/state_checkpoint.py", "skills/gsd-path/scripts/state_checkpoint.py"],
|
|
294
353
|
["scripts/state_promote.py", "skills/gsd-path/scripts/state_promote.py"],
|
|
295
354
|
["scripts/pipeline_state.py", "skills/gsd-path-build/scripts/pipeline_state.py"],
|
|
355
|
+
["scripts/build_recovery.py", "skills/gsd-path-build/scripts/build_recovery.py"],
|
|
296
356
|
["scripts/state_checkpoint.py", "skills/gsd-path-build/scripts/state_checkpoint.py"],
|
|
297
357
|
["scripts/state_promote.py", "skills/gsd-path-build/scripts/state_promote.py"],
|
|
298
358
|
["scripts/pipeline_state.py", "skills/gsd-path-ship/scripts/pipeline_state.py"],
|
|
359
|
+
["scripts/build_recovery.py", "skills/gsd-path-ship/scripts/build_recovery.py"],
|
|
299
360
|
["scripts/state_checkpoint.py", "skills/gsd-path-ship/scripts/state_checkpoint.py"],
|
|
300
361
|
["scripts/state_promote.py", "skills/gsd-path-ship/scripts/state_promote.py"],
|
|
301
362
|
["scripts/pipeline_state.py", "skills/gsd-path-plan/scripts/pipeline_state.py"],
|
|
363
|
+
["scripts/build_recovery.py", "skills/gsd-path-plan/scripts/build_recovery.py"],
|
|
302
364
|
["scripts/state_checkpoint.py", "skills/gsd-path-plan/scripts/state_checkpoint.py"],
|
|
303
365
|
["scripts/state_promote.py", "skills/gsd-path-plan/scripts/state_promote.py"],
|
|
304
366
|
["scripts/pipeline_state.py", "skills/gsd-path-roadmap/scripts/pipeline_state.py"],
|
|
367
|
+
["scripts/build_recovery.py", "skills/gsd-path-roadmap/scripts/build_recovery.py"],
|
|
305
368
|
["scripts/state_checkpoint.py", "skills/gsd-path-roadmap/scripts/state_checkpoint.py"],
|
|
306
369
|
["scripts/state_promote.py", "skills/gsd-path-roadmap/scripts/state_promote.py"],
|
|
307
370
|
["scripts/pipeline_state.py", "skills/gsd-path-research/scripts/pipeline_state.py"],
|
|
371
|
+
["scripts/build_recovery.py", "skills/gsd-path-research/scripts/build_recovery.py"],
|
|
308
372
|
["scripts/state_checkpoint.py", "skills/gsd-path-research/scripts/state_checkpoint.py"],
|
|
309
373
|
["scripts/state_promote.py", "skills/gsd-path-research/scripts/state_promote.py"],
|
|
310
374
|
["scripts/pipeline_state.py", "skills/gsd-path-decide/scripts/pipeline_state.py"],
|
|
375
|
+
["scripts/build_recovery.py", "skills/gsd-path-decide/scripts/build_recovery.py"],
|
|
311
376
|
["scripts/state_checkpoint.py", "skills/gsd-path-decide/scripts/state_checkpoint.py"],
|
|
312
377
|
["scripts/state_promote.py", "skills/gsd-path-decide/scripts/state_promote.py"],
|
|
313
378
|
["scripts/pipeline_state.py", "skills/gsd-path-define/scripts/pipeline_state.py"],
|
|
379
|
+
["scripts/build_recovery.py", "skills/gsd-path-define/scripts/build_recovery.py"],
|
|
314
380
|
["scripts/state_checkpoint.py", "skills/gsd-path-define/scripts/state_checkpoint.py"],
|
|
315
381
|
["scripts/state_promote.py", "skills/gsd-path-define/scripts/state_promote.py"],
|
|
316
382
|
["scripts/pipeline_state.py", "skills/gsd-path-inspect/scripts/pipeline_state.py"],
|
|
383
|
+
["scripts/build_recovery.py", "skills/gsd-path-inspect/scripts/build_recovery.py"],
|
|
317
384
|
["scripts/state_checkpoint.py", "skills/gsd-path-inspect/scripts/state_checkpoint.py"],
|
|
318
385
|
["scripts/state_promote.py", "skills/gsd-path-inspect/scripts/state_promote.py"],
|
|
319
386
|
["scripts/pipeline_state.py", "skills/gsd-path-docs-audit/scripts/pipeline_state.py"],
|
|
387
|
+
["scripts/build_recovery.py", "skills/gsd-path-docs-audit/scripts/build_recovery.py"],
|
|
320
388
|
["scripts/state_checkpoint.py", "skills/gsd-path-docs-audit/scripts/state_checkpoint.py"],
|
|
321
389
|
["scripts/state_promote.py", "skills/gsd-path-docs-audit/scripts/state_promote.py"],
|
|
322
390
|
["scripts/build_state.py", "skills/gsd-path/scripts/build_state.py"],
|
|
323
391
|
["scripts/build_state.py", "skills/gsd-path-build/scripts/build_state.py"],
|
|
324
|
-
["scripts/build_state.py", "skills/gsd-path-ship/scripts/build_state.py"]
|
|
392
|
+
["scripts/build_state.py", "skills/gsd-path-ship/scripts/build_state.py"],
|
|
393
|
+
["scripts/roadmap.py", "skills/gsd-path-build/scripts/roadmap.py"],
|
|
394
|
+
["scripts/roadmap.py", "skills/gsd-path-decide/scripts/roadmap.py"],
|
|
395
|
+
["scripts/roadmap.py", "skills/gsd-path-define/scripts/roadmap.py"],
|
|
396
|
+
["scripts/roadmap.py", "skills/gsd-path-docs-audit/scripts/roadmap.py"],
|
|
397
|
+
["scripts/roadmap.py", "skills/gsd-path-inspect/scripts/roadmap.py"],
|
|
398
|
+
["scripts/roadmap.py", "skills/gsd-path-plan/scripts/roadmap.py"],
|
|
399
|
+
["scripts/roadmap.py", "skills/gsd-path-research/scripts/roadmap.py"],
|
|
400
|
+
["scripts/roadmap.py", "skills/gsd-path-roadmap/scripts/roadmap.py"],
|
|
401
|
+
["scripts/roadmap.py", "skills/gsd-path-ship/scripts/roadmap.py"],
|
|
402
|
+
["scripts/roadmap.py", "skills/gsd-path/scripts/roadmap.py"]
|
|
325
403
|
],
|
|
326
404
|
"phase_contract_targets": [
|
|
327
405
|
["skills/gsd-path-build/SKILL.md", "skills/gsd-path/BUILD.md"],
|
|
@@ -20,6 +20,43 @@ except ModuleNotFoundError as error: # pragma: no cover - package imports used
|
|
|
20
20
|
from scripts.isolation import IsolationError, checkpoint as isolation_checkpoint, require_commit, require_full_sha, PROJECT_ENTRIES
|
|
21
21
|
|
|
22
22
|
|
|
23
|
+
if __package__:
|
|
24
|
+
from . import roadmap
|
|
25
|
+
else:
|
|
26
|
+
import roadmap
|
|
27
|
+
|
|
28
|
+
if __package__: # imported as scripts.state_checkpoint
|
|
29
|
+
from . import pipeline_state
|
|
30
|
+
from .pipeline_state import (
|
|
31
|
+
CHECKPOINT_JOURNAL_NAME,
|
|
32
|
+
CHECKPOINT_KINDS,
|
|
33
|
+
CHECKPOINT_SCHEMA,
|
|
34
|
+
PLAN_APPROVAL_SUBJECT,
|
|
35
|
+
PROMOTION_TRACKS,
|
|
36
|
+
SLUG_RE,
|
|
37
|
+
TASK_FILE_RE,
|
|
38
|
+
TASK_ID_RE,
|
|
39
|
+
ApprovedTaskContract,
|
|
40
|
+
PipelineState,
|
|
41
|
+
PipelineStateError,
|
|
42
|
+
)
|
|
43
|
+
else: # standalone script or sibling import
|
|
44
|
+
import pipeline_state
|
|
45
|
+
from pipeline_state import (
|
|
46
|
+
CHECKPOINT_JOURNAL_NAME,
|
|
47
|
+
CHECKPOINT_KINDS,
|
|
48
|
+
CHECKPOINT_SCHEMA,
|
|
49
|
+
PLAN_APPROVAL_SUBJECT,
|
|
50
|
+
PROMOTION_TRACKS,
|
|
51
|
+
SLUG_RE,
|
|
52
|
+
TASK_FILE_RE,
|
|
53
|
+
TASK_ID_RE,
|
|
54
|
+
ApprovedTaskContract,
|
|
55
|
+
PipelineState,
|
|
56
|
+
PipelineStateError,
|
|
57
|
+
)
|
|
58
|
+
|
|
59
|
+
|
|
23
60
|
def _sha256(content: str) -> str:
|
|
24
61
|
return hashlib.sha256(content.encode("utf-8")).hexdigest()
|
|
25
62
|
|
|
@@ -65,41 +102,29 @@ def _checkpoint_artifact_digest(project: Path, mutable_paths: set[str]) -> str:
|
|
|
65
102
|
return digest.hexdigest()
|
|
66
103
|
|
|
67
104
|
|
|
68
|
-
def _roadmap_status(lines: list[str], start: int, end: int) -> str:
|
|
69
|
-
values = []
|
|
70
|
-
for line in lines[start:end]:
|
|
71
|
-
match = re.fullmatch(r"Status:\s*(\S+)\s*", line.rstrip("\r\n"))
|
|
72
|
-
if match:
|
|
73
|
-
values.append(match.group(1))
|
|
74
|
-
if len(values) != 1:
|
|
75
|
-
raise PipelineStateError("ROADMAP.md milestone must have one Status field")
|
|
76
|
-
return values[0]
|
|
77
|
-
|
|
78
|
-
|
|
79
105
|
def _activate_roadmap_milestone(text: str, milestone: str) -> str:
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
active = [
|
|
85
|
-
slug
|
|
86
|
-
for slug, (_, start, end) in sections.items()
|
|
87
|
-
if _roadmap_status(lines, start, end) == "active"
|
|
88
|
-
]
|
|
89
|
-
if active:
|
|
90
|
-
raise PipelineStateError(
|
|
91
|
-
"ROADMAP.md already has an active milestone: " + ", ".join(active)
|
|
92
|
-
)
|
|
93
|
-
_, start, end = sections[milestone]
|
|
94
|
-
pipeline_state._replace_roadmap_field(lines, start, end, "Status", {"pending"}, "active")
|
|
95
|
-
return "".join(lines)
|
|
96
|
-
|
|
106
|
+
try:
|
|
107
|
+
return roadmap.activate_milestone(text, milestone)
|
|
108
|
+
except roadmap.RoadmapError as error:
|
|
109
|
+
raise PipelineStateError(str(error)) from error
|
|
97
110
|
|
|
98
111
|
def _approval_details(
|
|
99
112
|
kind: str,
|
|
100
113
|
state: PipelineState,
|
|
101
114
|
selected_milestone: Optional[str],
|
|
102
115
|
) -> tuple[dict[str, Optional[str]], str, str, str]:
|
|
116
|
+
if kind == "roadmap-reslice":
|
|
117
|
+
if state.status != "active" or state.archive is not None:
|
|
118
|
+
raise PipelineStateError("roadmap re-slice requires active, unarchived state")
|
|
119
|
+
if state.phase in {"inspect", "define"} and selected_milestone == state.milestone and state.milestone:
|
|
120
|
+
changes = {}
|
|
121
|
+
event = "program roadmap re-slice approved"
|
|
122
|
+
elif state.phase == "roadmap" and state.milestone is None and selected_milestone and SLUG_RE.fullmatch(selected_milestone):
|
|
123
|
+
changes = {"phase": "inspect", "milestone": selected_milestone}
|
|
124
|
+
event = "roadmap approved after abandoned milestone"
|
|
125
|
+
else:
|
|
126
|
+
raise PipelineStateError("roadmap re-slice must preserve the active milestone or select after abandon")
|
|
127
|
+
return changes, event, "roadmap: program roadmap approved", "Why: approved roadmap checkpoint"
|
|
103
128
|
if kind == "plan":
|
|
104
129
|
if selected_milestone is not None:
|
|
105
130
|
raise PipelineStateError("plan approval does not accept a selected milestone")
|
|
@@ -126,6 +151,12 @@ def _approval_details(
|
|
|
126
151
|
raise PipelineStateError(f"unsupported approval kind: {kind}")
|
|
127
152
|
|
|
128
153
|
|
|
154
|
+
def _reslice_roadmap(before: str, candidate: str, state: PipelineState, selected: str) -> str:
|
|
155
|
+
try:
|
|
156
|
+
return roadmap.reslice(before, candidate, state.phase, selected)
|
|
157
|
+
except roadmap.RoadmapError as error:
|
|
158
|
+
raise PipelineStateError(str(error)) from error
|
|
159
|
+
|
|
129
160
|
def _checkpoint_request_fields(
|
|
130
161
|
kind: str,
|
|
131
162
|
project_dir: str,
|
|
@@ -175,6 +206,10 @@ def _approval_journal(repo: Path, journal: Mapping[str, object]) -> dict[str, ob
|
|
|
175
206
|
"roadmap_before",
|
|
176
207
|
"roadmap_after",
|
|
177
208
|
}
|
|
209
|
+
if journal.get("kind") == "roadmap-reslice":
|
|
210
|
+
expected_keys.add("baseline_before")
|
|
211
|
+
if not isinstance(journal.get("baseline_before"), str):
|
|
212
|
+
raise PipelineStateError("checkpoint journal has an invalid re-slice baseline")
|
|
178
213
|
if set(journal) != expected_keys:
|
|
179
214
|
raise PipelineStateError("checkpoint journal has invalid fields")
|
|
180
215
|
if journal.get("schema") != CHECKPOINT_SCHEMA or journal.get("repo") != str(repo):
|
|
@@ -253,12 +288,14 @@ def _approval_journal(repo: Path, journal: Mapping[str, object]) -> dict[str, ob
|
|
|
253
288
|
or journal["state_after"] != rendered
|
|
254
289
|
):
|
|
255
290
|
raise PipelineStateError("checkpoint journal approval contract is invalid")
|
|
256
|
-
if
|
|
291
|
+
if journal["kind"] in {"roadmap", "roadmap-reslice"}:
|
|
257
292
|
if project_dir != ".project":
|
|
258
293
|
raise PipelineStateError("roadmap approval is legal only on the active track")
|
|
259
294
|
if journal["roadmap_path"] != ".project/ROADMAP.md":
|
|
260
295
|
raise PipelineStateError("checkpoint journal has an invalid ROADMAP path")
|
|
261
|
-
expected_roadmap =
|
|
296
|
+
expected_roadmap = _reslice_roadmap(
|
|
297
|
+
str(journal["baseline_before"]), str(journal["roadmap_before"]), before, str(selected),
|
|
298
|
+
) if journal["kind"] == "roadmap-reslice" else _activate_roadmap_milestone(
|
|
262
299
|
str(journal["roadmap_before"]),
|
|
263
300
|
str(selected),
|
|
264
301
|
)
|
|
@@ -307,6 +344,12 @@ def _resume_checkpoint_locked(
|
|
|
307
344
|
transaction = _approval_journal(repo, journal)
|
|
308
345
|
state_path = _checkpoint_file(repo, str(transaction["state_path"]), "STATE.md")
|
|
309
346
|
mutable = {state_path.relative_to(project).as_posix()}
|
|
347
|
+
baseline = project / "ROADMAP.before-reslice.md" if transaction["kind"] == "roadmap-reslice" else None
|
|
348
|
+
if baseline is not None:
|
|
349
|
+
mutable.add(baseline.name)
|
|
350
|
+
if baseline.exists() or baseline.is_symlink():
|
|
351
|
+
if pipeline_state._read_real_file(baseline, "re-slice baseline") != transaction["baseline_before"]:
|
|
352
|
+
raise PipelineStateError("re-slice baseline drifted during checkpoint recovery")
|
|
310
353
|
roadmap_path: Optional[Path] = None
|
|
311
354
|
if transaction["roadmap_path"] is not None:
|
|
312
355
|
roadmap_path = _checkpoint_file(
|
|
@@ -354,6 +397,8 @@ def _resume_checkpoint_locked(
|
|
|
354
397
|
raise PipelineStateError("completed checkpoint has the wrong ROADMAP.md")
|
|
355
398
|
|
|
356
399
|
try:
|
|
400
|
+
if baseline is not None and baseline.exists():
|
|
401
|
+
baseline.unlink()
|
|
357
402
|
committed = isolation_checkpoint(
|
|
358
403
|
repo,
|
|
359
404
|
expected_head,
|
|
@@ -362,6 +407,8 @@ def _resume_checkpoint_locked(
|
|
|
362
407
|
[".project"],
|
|
363
408
|
)
|
|
364
409
|
except IsolationError as error:
|
|
410
|
+
if baseline is not None and pipeline_state._run_git(repo, "rev-parse", "HEAD").stdout.strip() == expected_head:
|
|
411
|
+
pipeline_state._atomic_write(baseline, str(transaction["baseline_before"]))
|
|
365
412
|
raise PipelineStateError(f"approval checkpoint failed: {error}") from error
|
|
366
413
|
if committed.get("commit") != pipeline_state._run_git(repo, "rev-parse", "HEAD").stdout.strip():
|
|
367
414
|
raise PipelineStateError("approval checkpoint returned the wrong commit")
|
|
@@ -381,6 +428,8 @@ def _resume_checkpoint_locked(
|
|
|
381
428
|
def _validate_plan_briefs(repo: Path, kind: str, project_dir: str) -> None:
|
|
382
429
|
if kind != "plan":
|
|
383
430
|
return
|
|
431
|
+
if project_dir == ".project":
|
|
432
|
+
pipeline_state._build_recovery().validate_plan(repo)
|
|
384
433
|
head = pipeline_state._run_git(repo, "rev-parse", "--verify", "HEAD", check=False)
|
|
385
434
|
if head.returncode != 0:
|
|
386
435
|
# Pre-Git approval defers base-dependent checks to build.
|
|
@@ -476,6 +525,8 @@ def checkpoint_approval(
|
|
|
476
525
|
state, state_before, state_path = pipeline_state.load_state(resolved, project_dir)
|
|
477
526
|
changes, event, subject, body = _approval_details(kind, state, selected_milestone)
|
|
478
527
|
_validate_plan_briefs(resolved, kind, project_dir)
|
|
528
|
+
if kind == "plan" and project_dir == ".project":
|
|
529
|
+
pipeline_state._build_recovery().restore_unchanged_reviews(resolved)
|
|
479
530
|
expected = {
|
|
480
531
|
"phase": state.phase,
|
|
481
532
|
"status": state.status,
|
|
@@ -497,13 +548,18 @@ def checkpoint_approval(
|
|
|
497
548
|
roadmap_path: Optional[Path] = None
|
|
498
549
|
roadmap_before: Optional[str] = None
|
|
499
550
|
roadmap_after: Optional[str] = None
|
|
500
|
-
|
|
551
|
+
baseline_before = None
|
|
552
|
+
if kind in {"roadmap", "roadmap-reslice"}:
|
|
501
553
|
if project_dir != ".project":
|
|
502
554
|
raise PipelineStateError("roadmap approval is legal only on the active track")
|
|
503
555
|
assert selected_milestone is not None
|
|
504
556
|
roadmap_path = project / "ROADMAP.md"
|
|
505
557
|
roadmap_before = pipeline_state._read_real_file(roadmap_path, "ROADMAP.md")
|
|
506
|
-
|
|
558
|
+
if kind == "roadmap-reslice":
|
|
559
|
+
baseline_before = pipeline_state._read_real_file(project / "ROADMAP.before-reslice.md", "re-slice baseline")
|
|
560
|
+
roadmap_after = _reslice_roadmap(
|
|
561
|
+
baseline_before, roadmap_before, state, selected_milestone,
|
|
562
|
+
) if kind == "roadmap-reslice" else _activate_roadmap_milestone(
|
|
507
563
|
roadmap_before,
|
|
508
564
|
selected_milestone,
|
|
509
565
|
)
|
|
@@ -512,6 +568,8 @@ def checkpoint_approval(
|
|
|
512
568
|
mutable = {state_relative}
|
|
513
569
|
if roadmap_path is not None:
|
|
514
570
|
mutable.add(roadmap_path.relative_to(project).as_posix())
|
|
571
|
+
if baseline_before is not None:
|
|
572
|
+
mutable.add("ROADMAP.before-reslice.md")
|
|
515
573
|
journal: dict[str, object] = {
|
|
516
574
|
"schema": CHECKPOINT_SCHEMA,
|
|
517
575
|
"repo": str(resolved),
|
|
@@ -528,6 +586,8 @@ def checkpoint_approval(
|
|
|
528
586
|
"roadmap_before": roadmap_before,
|
|
529
587
|
"roadmap_after": roadmap_after,
|
|
530
588
|
}
|
|
589
|
+
if baseline_before is not None:
|
|
590
|
+
journal["baseline_before"] = baseline_before
|
|
531
591
|
pipeline_state._write_json(journal_path, journal)
|
|
532
592
|
return _resume_checkpoint_locked(resolved, project, journal_path, journal)
|
|
533
593
|
|
|
@@ -576,6 +636,10 @@ def defer_approval(
|
|
|
576
636
|
with pipeline_state._state_lock(project):
|
|
577
637
|
state, state_before, state_path = pipeline_state.load_state(resolved, project_dir)
|
|
578
638
|
changes, event, _, _ = _approval_details(kind, state, selected_milestone)
|
|
639
|
+
if project_dir == ".project":
|
|
640
|
+
recovery = pipeline_state._build_recovery().context(resolved, state_before)
|
|
641
|
+
if recovery and recovery["active"]:
|
|
642
|
+
raise PipelineStateError("build recovery requires a plan checkpoint")
|
|
579
643
|
_validate_plan_briefs(resolved, kind, project_dir)
|
|
580
644
|
if patch:
|
|
581
645
|
event = "patch plan approved"
|
|
@@ -595,17 +659,25 @@ def defer_approval(
|
|
|
595
659
|
project_dir,
|
|
596
660
|
approval_kind=kind,
|
|
597
661
|
)
|
|
598
|
-
|
|
662
|
+
baseline = None
|
|
663
|
+
if kind in {"roadmap", "roadmap-reslice"}:
|
|
599
664
|
if project_dir != ".project":
|
|
600
665
|
raise PipelineStateError("roadmap approval is legal only on the active track")
|
|
601
666
|
assert selected_milestone is not None
|
|
602
667
|
roadmap_path = project / "ROADMAP.md"
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
668
|
+
roadmap_before = pipeline_state._read_real_file(roadmap_path, "ROADMAP.md")
|
|
669
|
+
if kind == "roadmap-reslice":
|
|
670
|
+
baseline = project / "ROADMAP.before-reslice.md"
|
|
671
|
+
roadmap_after = _reslice_roadmap(
|
|
672
|
+
pipeline_state._read_real_file(baseline, "re-slice baseline"),
|
|
673
|
+
roadmap_before, state, selected_milestone,
|
|
674
|
+
)
|
|
675
|
+
else:
|
|
676
|
+
roadmap_after = _activate_roadmap_milestone(roadmap_before, selected_milestone)
|
|
607
677
|
pipeline_state._atomic_write(roadmap_path, roadmap_after)
|
|
608
678
|
pipeline_state._atomic_write(state_path, state_after)
|
|
679
|
+
if baseline is not None:
|
|
680
|
+
baseline.unlink()
|
|
609
681
|
return {
|
|
610
682
|
"schema": CHECKPOINT_SCHEMA,
|
|
611
683
|
"status": "approved",
|
|
@@ -1002,38 +1074,3 @@ def _classify_plan_drift(
|
|
|
1002
1074
|
"contract_paths": sorted(contract_paths),
|
|
1003
1075
|
"reason": "; ".join(reasons) if reasons else "approval contracts and declared paths are unchanged",
|
|
1004
1076
|
}
|
|
1005
|
-
|
|
1006
|
-
|
|
1007
|
-
# pipeline_state imports this module, so the parent is resolved after the
|
|
1008
|
-
# definitions above. Parent functions are looked up on the module at call time
|
|
1009
|
-
# so patches applied to pipeline_state stay visible here.
|
|
1010
|
-
if __package__: # imported as scripts.state_checkpoint
|
|
1011
|
-
from . import pipeline_state
|
|
1012
|
-
from .pipeline_state import (
|
|
1013
|
-
CHECKPOINT_JOURNAL_NAME,
|
|
1014
|
-
CHECKPOINT_KINDS,
|
|
1015
|
-
CHECKPOINT_SCHEMA,
|
|
1016
|
-
PLAN_APPROVAL_SUBJECT,
|
|
1017
|
-
PROMOTION_TRACKS,
|
|
1018
|
-
SLUG_RE,
|
|
1019
|
-
TASK_FILE_RE,
|
|
1020
|
-
TASK_ID_RE,
|
|
1021
|
-
ApprovedTaskContract,
|
|
1022
|
-
PipelineState,
|
|
1023
|
-
PipelineStateError,
|
|
1024
|
-
)
|
|
1025
|
-
else: # standalone script or sibling import
|
|
1026
|
-
import pipeline_state
|
|
1027
|
-
from pipeline_state import (
|
|
1028
|
-
CHECKPOINT_JOURNAL_NAME,
|
|
1029
|
-
CHECKPOINT_KINDS,
|
|
1030
|
-
CHECKPOINT_SCHEMA,
|
|
1031
|
-
PLAN_APPROVAL_SUBJECT,
|
|
1032
|
-
PROMOTION_TRACKS,
|
|
1033
|
-
SLUG_RE,
|
|
1034
|
-
TASK_FILE_RE,
|
|
1035
|
-
TASK_ID_RE,
|
|
1036
|
-
ApprovedTaskContract,
|
|
1037
|
-
PipelineState,
|
|
1038
|
-
PipelineStateError,
|
|
1039
|
-
)
|
package/scripts/state_promote.py
CHANGED
|
@@ -11,6 +11,31 @@ from pathlib import Path, PurePosixPath
|
|
|
11
11
|
from typing import Mapping, Optional
|
|
12
12
|
|
|
13
13
|
|
|
14
|
+
if __package__: # imported as scripts.state_promote
|
|
15
|
+
from . import pipeline_state, state_checkpoint
|
|
16
|
+
from .pipeline_state import (
|
|
17
|
+
NULL,
|
|
18
|
+
PROMOTION_RESIDUAL,
|
|
19
|
+
PROMOTION_SCHEMA,
|
|
20
|
+
PROMOTION_TRACKS,
|
|
21
|
+
SLUG_RE,
|
|
22
|
+
PipelineState,
|
|
23
|
+
PipelineStateError,
|
|
24
|
+
)
|
|
25
|
+
else: # standalone script or sibling import
|
|
26
|
+
import pipeline_state
|
|
27
|
+
import state_checkpoint
|
|
28
|
+
from pipeline_state import (
|
|
29
|
+
NULL,
|
|
30
|
+
PROMOTION_RESIDUAL,
|
|
31
|
+
PROMOTION_SCHEMA,
|
|
32
|
+
PROMOTION_TRACKS,
|
|
33
|
+
SLUG_RE,
|
|
34
|
+
PipelineState,
|
|
35
|
+
PipelineStateError,
|
|
36
|
+
)
|
|
37
|
+
|
|
38
|
+
|
|
14
39
|
def _render_roadmap(
|
|
15
40
|
text: str,
|
|
16
41
|
previous_milestone: str,
|
|
@@ -243,9 +268,9 @@ def _completed_promotion(
|
|
|
243
268
|
if _head_with_exact_message(repo, subject, fields) != head:
|
|
244
269
|
raise PipelineStateError("completed promotion has the wrong commit message")
|
|
245
270
|
|
|
246
|
-
active_text =
|
|
247
|
-
next_text =
|
|
248
|
-
roadmap_text =
|
|
271
|
+
active_text = state_checkpoint._git_text_at(repo, base, ".project/STATE.md")
|
|
272
|
+
next_text = state_checkpoint._git_text_at(repo, base, ".project/next/STATE.md")
|
|
273
|
+
roadmap_text = state_checkpoint._git_text_at(repo, base, ".project/ROADMAP.md")
|
|
249
274
|
if active_text is None or next_text is None or roadmap_text is None:
|
|
250
275
|
raise PipelineStateError("promotion parent is missing required metadata")
|
|
251
276
|
active_state = pipeline_state._state_from_text(active_text, "promotion parent STATE.md")
|
|
@@ -265,7 +290,7 @@ def _completed_promotion(
|
|
|
265
290
|
)
|
|
266
291
|
|
|
267
292
|
_promotion_tree_mapping(repo, base, head)
|
|
268
|
-
drift =
|
|
293
|
+
drift = state_checkpoint._classify_plan_drift(repo, next_state, base, landing)
|
|
269
294
|
expected_roadmap = _render_roadmap(
|
|
270
295
|
roadmap_text,
|
|
271
296
|
active_state.milestone,
|
|
@@ -273,11 +298,11 @@ def _completed_promotion(
|
|
|
273
298
|
branch,
|
|
274
299
|
landing,
|
|
275
300
|
)
|
|
276
|
-
current_roadmap =
|
|
301
|
+
current_roadmap = state_checkpoint._git_text_at(repo, head, ".project/ROADMAP.md")
|
|
277
302
|
if current_roadmap != expected_roadmap:
|
|
278
303
|
raise PipelineStateError("completed promotion has invalid ROADMAP.md")
|
|
279
304
|
|
|
280
|
-
current_state =
|
|
305
|
+
current_state = state_checkpoint._git_text_at(repo, head, ".project/STATE.md")
|
|
281
306
|
if current_state is None:
|
|
282
307
|
raise PipelineStateError("completed promotion has no STATE.md")
|
|
283
308
|
event = re.escape(_promotion_event(drift, branch, landing, base))
|
|
@@ -438,10 +463,10 @@ def _prepare_promotion(
|
|
|
438
463
|
if source.exists() or source.is_symlink():
|
|
439
464
|
if destination.exists() or destination.is_symlink():
|
|
440
465
|
raise PipelineStateError(f"promotion destination already exists: {destination}")
|
|
441
|
-
tracks[name] =
|
|
466
|
+
tracks[name] = state_checkpoint._tree_digest(source)
|
|
442
467
|
if not tracks:
|
|
443
468
|
raise PipelineStateError("lookahead track has no promotable artifacts")
|
|
444
|
-
drift =
|
|
469
|
+
drift = state_checkpoint._classify_plan_drift(repo, next_state, base, landing)
|
|
445
470
|
roadmap_path = project / "ROADMAP.md"
|
|
446
471
|
roadmap_text = pipeline_state._read_real_file(roadmap_path, "ROADMAP.md")
|
|
447
472
|
target_state = _promotion_state(
|
|
@@ -464,10 +489,10 @@ def _prepare_promotion(
|
|
|
464
489
|
"landing": landing,
|
|
465
490
|
"base": base,
|
|
466
491
|
"tracks": tracks,
|
|
467
|
-
"residual_sha256":
|
|
468
|
-
"next_state_sha256":
|
|
469
|
-
"active_state_sha256":
|
|
470
|
-
"roadmap_sha256":
|
|
492
|
+
"residual_sha256": state_checkpoint._tree_digest(next_root, tuple(tracks)),
|
|
493
|
+
"next_state_sha256": state_checkpoint._sha256(next_text),
|
|
494
|
+
"active_state_sha256": state_checkpoint._sha256(active_text),
|
|
495
|
+
"roadmap_sha256": state_checkpoint._sha256(roadmap_text),
|
|
471
496
|
"target_state": target_state,
|
|
472
497
|
"target_roadmap": target_roadmap,
|
|
473
498
|
"drift": drift,
|
|
@@ -521,7 +546,7 @@ def _resume_track_moves(project: Path, journal: dict[str, object], path: Path) -
|
|
|
521
546
|
if not source_exists and not destination_exists:
|
|
522
547
|
raise PipelineStateError(f"promotion lost both source and destination: {name}")
|
|
523
548
|
candidate = source if source_exists else destination
|
|
524
|
-
if
|
|
549
|
+
if state_checkpoint._tree_digest(candidate) != expected_digest:
|
|
525
550
|
raise PipelineStateError(f"promotion track drifted: {name}")
|
|
526
551
|
if source_exists:
|
|
527
552
|
source.rename(destination)
|
|
@@ -542,7 +567,7 @@ def _resume_metadata(project: Path, journal: dict[str, object], path: Path) -> N
|
|
|
542
567
|
raise PipelineStateError("promotion journal has invalid metadata")
|
|
543
568
|
if current == desired:
|
|
544
569
|
continue
|
|
545
|
-
if
|
|
570
|
+
if state_checkpoint._sha256(current) != expected_original:
|
|
546
571
|
raise PipelineStateError(f"promotion metadata drifted: {target}")
|
|
547
572
|
pipeline_state._atomic_write(target, desired)
|
|
548
573
|
journal["stage"] = f"updated:{target.name}"
|
|
@@ -560,9 +585,9 @@ def _resume_next_removal(
|
|
|
560
585
|
if residual.exists() or residual.is_symlink():
|
|
561
586
|
raise PipelineStateError("promotion has both next track and residual staging")
|
|
562
587
|
next_text = pipeline_state._read_real_file(next_root / "STATE.md", "next/STATE.md")
|
|
563
|
-
if
|
|
588
|
+
if state_checkpoint._sha256(next_text) != journal.get("next_state_sha256"):
|
|
564
589
|
raise PipelineStateError("lookahead STATE drifted during promotion")
|
|
565
|
-
if
|
|
590
|
+
if state_checkpoint._tree_digest(next_root) != journal.get("residual_sha256"):
|
|
566
591
|
raise PipelineStateError("lookahead residual drifted during promotion")
|
|
567
592
|
next_root.rename(residual)
|
|
568
593
|
journal["stage"] = "next-staged"
|
|
@@ -574,7 +599,7 @@ def _resume_next_removal(
|
|
|
574
599
|
raise PipelineStateError("promotion lost next track and residual staging")
|
|
575
600
|
if residual.is_symlink() or not residual.is_dir():
|
|
576
601
|
raise PipelineStateError(f"promotion residual must be a real directory: {residual}")
|
|
577
|
-
if
|
|
602
|
+
if state_checkpoint._tree_digest(residual) != journal.get("residual_sha256"):
|
|
578
603
|
raise PipelineStateError("staged lookahead residual drifted during promotion")
|
|
579
604
|
|
|
580
605
|
|
|
@@ -714,30 +739,3 @@ def promote_next(
|
|
|
714
739
|
"commit": commit,
|
|
715
740
|
"drift": journal["drift"],
|
|
716
741
|
}
|
|
717
|
-
|
|
718
|
-
|
|
719
|
-
# pipeline_state imports this module, so the parent is resolved after the
|
|
720
|
-
# definitions above. Parent functions are looked up on the module at call time
|
|
721
|
-
# so patches applied to pipeline_state stay visible here.
|
|
722
|
-
if __package__: # imported as scripts.state_promote
|
|
723
|
-
from . import pipeline_state
|
|
724
|
-
from .pipeline_state import (
|
|
725
|
-
NULL,
|
|
726
|
-
PROMOTION_RESIDUAL,
|
|
727
|
-
PROMOTION_SCHEMA,
|
|
728
|
-
PROMOTION_TRACKS,
|
|
729
|
-
SLUG_RE,
|
|
730
|
-
PipelineState,
|
|
731
|
-
PipelineStateError,
|
|
732
|
-
)
|
|
733
|
-
else: # standalone script or sibling import
|
|
734
|
-
import pipeline_state
|
|
735
|
-
from pipeline_state import (
|
|
736
|
-
NULL,
|
|
737
|
-
PROMOTION_RESIDUAL,
|
|
738
|
-
PROMOTION_SCHEMA,
|
|
739
|
-
PROMOTION_TRACKS,
|
|
740
|
-
SLUG_RE,
|
|
741
|
-
PipelineState,
|
|
742
|
-
PipelineStateError,
|
|
743
|
-
)
|