@opengsd/gsd-path 1.1.0 → 1.3.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 +5 -2
- package/CHANGELOG.md +87 -0
- package/DOCS.md +73 -1
- package/FULL.md +3 -2
- package/HOOKS.md +18 -9
- package/QUICK.md +3 -4
- package/README.md +72 -5
- package/RUNTIME.md +9 -4
- package/UPDATE.md +56 -11
- package/WORKFLOW.md +5 -2
- package/package.json +9 -1
- package/platforms/claude/dispatch.md +4 -4
- package/platforms/copilot/dispatch.md +4 -4
- package/platforms/cursor/dispatch.md +5 -10
- package/platforms/grok/dispatch.md +4 -6
- package/platforms/kimi/dispatch.md +4 -4
- package/platforms/kiro/dispatch.md +4 -6
- package/platforms/opencode/dispatch.md +4 -4
- package/platforms/qwen/dispatch.md +4 -4
- package/platforms/shared-agents/dispatch.md +6 -19
- package/scripts/_common.py +5 -0
- package/scripts/archive_milestone.py +20 -6
- package/scripts/bootstrap_repository.py +8 -1
- package/scripts/build_recovery.py +5 -0
- package/scripts/build_state.py +2 -0
- package/scripts/check_docs_audit.py +2 -0
- package/scripts/check_handoffs.py +6 -0
- package/scripts/check_task_briefs.py +3 -0
- package/scripts/detect_project.py +11 -1
- package/scripts/discussion_records.py +3 -0
- package/scripts/discussion_validate.py +8 -3
- package/scripts/dispatch_driver.py +230 -21
- package/scripts/git_guard.py +12 -4
- package/scripts/guard_hook.py +11 -1
- package/scripts/install.mjs +74 -1448
- package/scripts/install.py +165 -201
- package/scripts/integration.py +28 -8
- package/scripts/isolation.py +15 -5
- package/scripts/jev_review.py +138 -0
- package/scripts/lean_verification.py +2 -0
- package/scripts/loop_run.py +2 -0
- package/scripts/model_policy.py +279 -0
- package/scripts/path_config.py +248 -0
- package/scripts/pipeline_diagnose.py +3 -0
- package/scripts/pipeline_git.py +3 -0
- package/scripts/pipeline_state.py +4 -1
- package/scripts/pipeline_undo.py +3 -0
- package/scripts/promote_lookahead.py +3 -0
- package/scripts/review_panel.py +11 -0
- package/scripts/roadmap.py +5 -0
- package/scripts/runtime_store.py +281 -0
- package/scripts/skill-resources.json +104 -4
- package/scripts/state_checkpoint.py +5 -0
- package/scripts/state_promote.py +5 -0
- package/scripts/status_runtime.py +92 -6
- package/scripts/wizard.mjs +8 -2
- package/scripts/workflow_run.py +12 -1
- package/scripts/worktree_paths.py +94 -0
- package/skills/gsd-path/BUILD.md +7 -0
- package/skills/gsd-path/DECIDE.md +2 -0
- package/skills/gsd-path/DEFINE.md +13 -7
- package/skills/gsd-path/DOCS-AUDIT.md +2 -0
- package/skills/gsd-path/INSPECT.md +2 -0
- package/skills/gsd-path/PLAN.md +4 -2
- package/skills/gsd-path/RESEARCH.md +2 -0
- package/skills/gsd-path/ROADMAP.md +2 -0
- package/skills/gsd-path/SHIP.md +24 -13
- package/skills/gsd-path/SKILL.md +23 -9
- package/skills/gsd-path/references/build-native.md +15 -7
- package/skills/gsd-path/references/config.md +57 -0
- package/skills/gsd-path/references/dispatch.md +6 -19
- package/skills/gsd-path/references/jev-review.md +82 -0
- package/skills/gsd-path/references/model-policy.md +139 -0
- package/skills/gsd-path/references/reviewer-panel.md +1 -1
- package/skills/gsd-path/references/reviewer.md +2 -0
- package/skills/gsd-path/references/runtime-selection.md +25 -0
- package/skills/gsd-path/scripts/__pycache__/_common.cpython-312.pyc +0 -0
- package/skills/gsd-path/scripts/__pycache__/check_handoffs.cpython-312.pyc +0 -0
- package/skills/gsd-path/scripts/_common.py +5 -0
- package/skills/gsd-path/scripts/archive_milestone.py +20 -6
- package/skills/gsd-path/scripts/bootstrap_repository.py +8 -1
- package/skills/gsd-path/scripts/build_recovery.py +5 -0
- package/skills/gsd-path/scripts/build_state.py +2 -0
- package/skills/gsd-path/scripts/check_docs_audit.py +2 -0
- package/skills/gsd-path/scripts/check_handoffs.py +6 -0
- package/skills/gsd-path/scripts/check_task_briefs.py +3 -0
- package/skills/gsd-path/scripts/detect_project.py +11 -1
- package/skills/gsd-path/scripts/discussion_records.py +3 -0
- package/skills/gsd-path/scripts/discussion_validate.py +8 -3
- package/skills/gsd-path/scripts/dispatch_driver.py +230 -21
- package/skills/gsd-path/scripts/git_guard.py +768 -0
- package/skills/gsd-path/scripts/integration.py +28 -8
- package/skills/gsd-path/scripts/isolation.py +15 -5
- package/skills/gsd-path/scripts/jev_review.py +138 -0
- package/skills/gsd-path/scripts/lean_verification.py +2 -0
- package/skills/gsd-path/scripts/loop_run.py +2 -0
- package/skills/gsd-path/scripts/model_policy.py +279 -0
- package/skills/gsd-path/scripts/path_config.py +248 -0
- package/skills/gsd-path/scripts/pipeline_git.py +3 -0
- package/skills/gsd-path/scripts/pipeline_state.py +4 -1
- package/skills/gsd-path/scripts/promote_lookahead.py +3 -0
- package/skills/gsd-path/scripts/review_panel.py +11 -0
- package/skills/gsd-path/scripts/roadmap.py +5 -0
- package/skills/gsd-path/scripts/state_checkpoint.py +5 -0
- package/skills/gsd-path/scripts/state_promote.py +5 -0
- package/skills/gsd-path/scripts/status_runtime.py +208 -0
- package/skills/gsd-path/scripts/workflow_run.py +12 -1
- package/skills/gsd-path/scripts/worktree_paths.py +94 -0
- package/skills/gsd-path/templates/skeptic.md +1 -1
- package/skills/gsd-path/templates/task.md +2 -0
- package/skills/gsd-path/templates/wave-panel.md +1 -1
- package/skills/gsd-path-build/SKILL.md +7 -0
- package/skills/gsd-path-build/references/build-native.md +15 -7
- package/skills/gsd-path-build/references/dispatch.md +6 -19
- package/skills/gsd-path-build/references/jev-review.md +82 -0
- package/skills/gsd-path-build/references/model-policy.md +139 -0
- package/skills/gsd-path-build/references/reviewer-panel.md +1 -1
- package/skills/gsd-path-build/references/reviewer.md +2 -0
- package/skills/gsd-path-build/references/runtime-selection.md +25 -0
- package/skills/gsd-path-build/scripts/__pycache__/_common.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/_common.py +5 -0
- package/skills/gsd-path-build/scripts/archive_milestone.py +20 -6
- package/skills/gsd-path-build/scripts/build_recovery.py +5 -0
- package/skills/gsd-path-build/scripts/build_state.py +2 -0
- package/skills/gsd-path-build/scripts/check_handoffs.py +6 -0
- package/skills/gsd-path-build/scripts/check_task_briefs.py +3 -0
- package/skills/gsd-path-build/scripts/detect_project.py +11 -1
- package/skills/gsd-path-build/scripts/discussion_records.py +3 -0
- package/skills/gsd-path-build/scripts/discussion_validate.py +8 -3
- package/skills/gsd-path-build/scripts/dispatch_driver.py +230 -21
- package/skills/gsd-path-build/scripts/integration.py +28 -8
- package/skills/gsd-path-build/scripts/isolation.py +15 -5
- package/skills/gsd-path-build/scripts/jev_review.py +138 -0
- package/skills/gsd-path-build/scripts/loop_run.py +2 -0
- package/skills/gsd-path-build/scripts/model_policy.py +279 -0
- package/skills/gsd-path-build/scripts/path_config.py +248 -0
- package/skills/gsd-path-build/scripts/pipeline_git.py +3 -0
- package/skills/gsd-path-build/scripts/pipeline_state.py +4 -1
- package/skills/gsd-path-build/scripts/promote_lookahead.py +3 -0
- package/skills/gsd-path-build/scripts/review_panel.py +11 -0
- package/skills/gsd-path-build/scripts/roadmap.py +5 -0
- package/skills/gsd-path-build/scripts/state_checkpoint.py +5 -0
- package/skills/gsd-path-build/scripts/state_promote.py +5 -0
- package/skills/gsd-path-build/scripts/workflow_run.py +12 -1
- package/skills/gsd-path-build/scripts/worktree_paths.py +94 -0
- package/skills/gsd-path-build/templates/skeptic.md +1 -1
- package/skills/gsd-path-build/templates/task.md +2 -0
- package/skills/gsd-path-build/templates/wave-panel.md +1 -1
- package/skills/gsd-path-decide/SKILL.md +2 -0
- package/skills/gsd-path-decide/references/dispatch.md +6 -19
- package/skills/gsd-path-decide/references/model-policy.md +139 -0
- package/skills/gsd-path-decide/references/runtime-selection.md +25 -0
- package/skills/gsd-path-decide/scripts/_common.py +5 -0
- package/skills/gsd-path-decide/scripts/archive_milestone.py +20 -6
- package/skills/gsd-path-decide/scripts/build_recovery.py +5 -0
- package/skills/gsd-path-decide/scripts/check_handoffs.py +6 -0
- package/skills/gsd-path-decide/scripts/check_task_briefs.py +3 -0
- package/skills/gsd-path-decide/scripts/detect_project.py +11 -1
- package/skills/gsd-path-decide/scripts/discussion_records.py +3 -0
- package/skills/gsd-path-decide/scripts/discussion_validate.py +8 -3
- package/skills/gsd-path-decide/scripts/integration.py +28 -8
- package/skills/gsd-path-decide/scripts/isolation.py +15 -5
- package/skills/gsd-path-decide/scripts/loop_run.py +839 -0
- package/skills/gsd-path-decide/scripts/model_policy.py +279 -0
- package/skills/gsd-path-decide/scripts/path_config.py +248 -0
- package/skills/gsd-path-decide/scripts/pipeline_git.py +3 -0
- package/skills/gsd-path-decide/scripts/pipeline_state.py +4 -1
- package/skills/gsd-path-decide/scripts/promote_lookahead.py +3 -0
- package/skills/gsd-path-decide/scripts/review_panel.py +11 -0
- package/skills/gsd-path-decide/scripts/roadmap.py +5 -0
- package/skills/gsd-path-decide/scripts/state_checkpoint.py +5 -0
- package/skills/gsd-path-decide/scripts/state_promote.py +5 -0
- package/skills/gsd-path-decide/scripts/worktree_paths.py +94 -0
- package/skills/gsd-path-define/SKILL.md +13 -7
- package/skills/gsd-path-define/references/runtime-selection.md +25 -0
- package/skills/gsd-path-define/scripts/_common.py +5 -0
- package/skills/gsd-path-define/scripts/archive_milestone.py +20 -6
- package/skills/gsd-path-define/scripts/build_recovery.py +5 -0
- package/skills/gsd-path-define/scripts/check_handoffs.py +6 -0
- package/skills/gsd-path-define/scripts/check_task_briefs.py +3 -0
- package/skills/gsd-path-define/scripts/detect_project.py +11 -1
- package/skills/gsd-path-define/scripts/discussion_records.py +3 -0
- package/skills/gsd-path-define/scripts/discussion_validate.py +8 -3
- package/skills/gsd-path-define/scripts/integration.py +28 -8
- package/skills/gsd-path-define/scripts/isolation.py +15 -5
- package/skills/gsd-path-define/scripts/loop_run.py +839 -0
- package/skills/gsd-path-define/scripts/model_policy.py +279 -0
- package/skills/gsd-path-define/scripts/path_config.py +248 -0
- package/skills/gsd-path-define/scripts/pipeline_git.py +3 -0
- package/skills/gsd-path-define/scripts/pipeline_state.py +4 -1
- package/skills/gsd-path-define/scripts/promote_lookahead.py +3 -0
- package/skills/gsd-path-define/scripts/review_panel.py +11 -0
- package/skills/gsd-path-define/scripts/roadmap.py +5 -0
- package/skills/gsd-path-define/scripts/state_checkpoint.py +5 -0
- package/skills/gsd-path-define/scripts/state_promote.py +5 -0
- package/skills/gsd-path-define/scripts/worktree_paths.py +94 -0
- package/skills/gsd-path-discuss/SKILL.md +2 -0
- package/skills/gsd-path-discuss/references/runtime-selection.md +25 -0
- package/skills/gsd-path-discuss/scripts/_common.py +5 -0
- package/skills/gsd-path-discuss/scripts/discussion_records.py +3 -0
- package/skills/gsd-path-discuss/scripts/loop_run.py +839 -0
- package/skills/gsd-path-discuss/scripts/model_policy.py +279 -0
- package/skills/gsd-path-discuss/scripts/path_config.py +248 -0
- package/skills/gsd-path-discuss/scripts/review_panel.py +564 -0
- package/skills/gsd-path-discuss/scripts/worktree_paths.py +94 -0
- package/skills/gsd-path-docs-audit/SKILL.md +2 -0
- package/skills/gsd-path-docs-audit/references/dispatch.md +6 -19
- package/skills/gsd-path-docs-audit/references/model-policy.md +139 -0
- package/skills/gsd-path-docs-audit/references/runtime-selection.md +25 -0
- package/skills/gsd-path-docs-audit/scripts/_common.py +5 -0
- package/skills/gsd-path-docs-audit/scripts/archive_milestone.py +20 -6
- package/skills/gsd-path-docs-audit/scripts/build_recovery.py +5 -0
- package/skills/gsd-path-docs-audit/scripts/check_docs_audit.py +2 -0
- package/skills/gsd-path-docs-audit/scripts/check_handoffs.py +6 -0
- package/skills/gsd-path-docs-audit/scripts/check_task_briefs.py +3 -0
- package/skills/gsd-path-docs-audit/scripts/detect_project.py +11 -1
- package/skills/gsd-path-docs-audit/scripts/discussion_records.py +3 -0
- package/skills/gsd-path-docs-audit/scripts/discussion_validate.py +8 -3
- package/skills/gsd-path-docs-audit/scripts/integration.py +28 -8
- package/skills/gsd-path-docs-audit/scripts/isolation.py +15 -5
- package/skills/gsd-path-docs-audit/scripts/loop_run.py +839 -0
- package/skills/gsd-path-docs-audit/scripts/model_policy.py +279 -0
- package/skills/gsd-path-docs-audit/scripts/path_config.py +248 -0
- package/skills/gsd-path-docs-audit/scripts/pipeline_git.py +3 -0
- package/skills/gsd-path-docs-audit/scripts/pipeline_state.py +4 -1
- package/skills/gsd-path-docs-audit/scripts/promote_lookahead.py +3 -0
- package/skills/gsd-path-docs-audit/scripts/review_panel.py +11 -0
- package/skills/gsd-path-docs-audit/scripts/roadmap.py +5 -0
- package/skills/gsd-path-docs-audit/scripts/state_checkpoint.py +5 -0
- package/skills/gsd-path-docs-audit/scripts/state_promote.py +5 -0
- package/skills/gsd-path-docs-audit/scripts/worktree_paths.py +94 -0
- package/skills/gsd-path-forensics/SKILL.md +9 -5
- package/skills/gsd-path-forensics/references/runtime-selection.md +25 -0
- package/skills/gsd-path-forensics/scripts/_common.py +5 -0
- package/skills/gsd-path-forensics/scripts/discussion_records.py +3 -0
- package/skills/gsd-path-forensics/scripts/loop_run.py +839 -0
- package/skills/gsd-path-forensics/scripts/model_policy.py +279 -0
- package/skills/gsd-path-forensics/scripts/path_config.py +248 -0
- package/skills/gsd-path-forensics/scripts/pipeline_diagnose.py +3 -0
- package/skills/gsd-path-forensics/scripts/pipeline_undo.py +3 -0
- package/skills/gsd-path-forensics/scripts/review_panel.py +564 -0
- package/skills/gsd-path-forensics/scripts/worktree_paths.py +94 -0
- package/skills/gsd-path-inspect/SKILL.md +2 -0
- package/skills/gsd-path-inspect/references/dispatch.md +6 -19
- package/skills/gsd-path-inspect/references/model-policy.md +139 -0
- package/skills/gsd-path-inspect/references/runtime-selection.md +25 -0
- package/skills/gsd-path-inspect/scripts/__pycache__/_common.cpython-312.pyc +0 -0
- package/skills/gsd-path-inspect/scripts/_common.py +5 -0
- package/skills/gsd-path-inspect/scripts/archive_milestone.py +20 -6
- package/skills/gsd-path-inspect/scripts/build_recovery.py +5 -0
- package/skills/gsd-path-inspect/scripts/check_docs_audit.py +2 -0
- package/skills/gsd-path-inspect/scripts/check_handoffs.py +6 -0
- package/skills/gsd-path-inspect/scripts/check_task_briefs.py +3 -0
- package/skills/gsd-path-inspect/scripts/detect_project.py +11 -1
- package/skills/gsd-path-inspect/scripts/discussion_records.py +3 -0
- package/skills/gsd-path-inspect/scripts/discussion_validate.py +8 -3
- package/skills/gsd-path-inspect/scripts/integration.py +28 -8
- package/skills/gsd-path-inspect/scripts/isolation.py +15 -5
- package/skills/gsd-path-inspect/scripts/loop_run.py +839 -0
- package/skills/gsd-path-inspect/scripts/model_policy.py +279 -0
- package/skills/gsd-path-inspect/scripts/path_config.py +248 -0
- package/skills/gsd-path-inspect/scripts/pipeline_git.py +3 -0
- package/skills/gsd-path-inspect/scripts/pipeline_state.py +4 -1
- package/skills/gsd-path-inspect/scripts/promote_lookahead.py +3 -0
- package/skills/gsd-path-inspect/scripts/review_panel.py +11 -0
- package/skills/gsd-path-inspect/scripts/roadmap.py +5 -0
- package/skills/gsd-path-inspect/scripts/state_checkpoint.py +5 -0
- package/skills/gsd-path-inspect/scripts/state_promote.py +5 -0
- package/skills/gsd-path-inspect/scripts/workflow_run.py +12 -1
- package/skills/gsd-path-inspect/scripts/worktree_paths.py +94 -0
- package/skills/gsd-path-loop/SKILL.md +2 -0
- package/skills/gsd-path-loop/references/runtime-selection.md +25 -0
- package/skills/gsd-path-loop/scripts/_common.py +5 -0
- package/skills/gsd-path-loop/scripts/discussion_records.py +3 -0
- package/skills/gsd-path-loop/scripts/loop_run.py +2 -0
- package/skills/gsd-path-loop/scripts/model_policy.py +279 -0
- package/skills/gsd-path-loop/scripts/path_config.py +248 -0
- package/skills/gsd-path-loop/scripts/review_panel.py +564 -0
- package/skills/gsd-path-loop/scripts/worktree_paths.py +94 -0
- package/skills/gsd-path-migrate/SKILL.md +2 -0
- package/skills/gsd-path-migrate/references/runtime-selection.md +25 -0
- package/skills/gsd-path-migrate/scripts/_common.py +185 -0
- package/skills/gsd-path-migrate/scripts/discussion_records.py +3 -0
- package/skills/gsd-path-migrate/scripts/loop_run.py +839 -0
- package/skills/gsd-path-migrate/scripts/model_policy.py +279 -0
- package/skills/gsd-path-migrate/scripts/path_config.py +248 -0
- package/skills/gsd-path-migrate/scripts/review_panel.py +564 -0
- package/skills/gsd-path-plan/SKILL.md +4 -2
- package/skills/gsd-path-plan/references/dispatch.md +6 -19
- package/skills/gsd-path-plan/references/model-policy.md +139 -0
- package/skills/gsd-path-plan/references/runtime-selection.md +25 -0
- package/skills/gsd-path-plan/scripts/__pycache__/_common.cpython-312.pyc +0 -0
- package/skills/gsd-path-plan/scripts/_common.py +5 -0
- package/skills/gsd-path-plan/scripts/archive_milestone.py +20 -6
- package/skills/gsd-path-plan/scripts/build_recovery.py +5 -0
- package/skills/gsd-path-plan/scripts/check_handoffs.py +6 -0
- package/skills/gsd-path-plan/scripts/check_task_briefs.py +3 -0
- package/skills/gsd-path-plan/scripts/detect_project.py +11 -1
- package/skills/gsd-path-plan/scripts/discussion_records.py +3 -0
- package/skills/gsd-path-plan/scripts/discussion_validate.py +8 -3
- package/skills/gsd-path-plan/scripts/integration.py +28 -8
- package/skills/gsd-path-plan/scripts/isolation.py +15 -5
- package/skills/gsd-path-plan/scripts/loop_run.py +839 -0
- package/skills/gsd-path-plan/scripts/model_policy.py +279 -0
- package/skills/gsd-path-plan/scripts/path_config.py +248 -0
- package/skills/gsd-path-plan/scripts/pipeline_git.py +3 -0
- package/skills/gsd-path-plan/scripts/pipeline_state.py +4 -1
- package/skills/gsd-path-plan/scripts/promote_lookahead.py +3 -0
- package/skills/gsd-path-plan/scripts/review_panel.py +11 -0
- package/skills/gsd-path-plan/scripts/roadmap.py +5 -0
- package/skills/gsd-path-plan/scripts/state_checkpoint.py +5 -0
- package/skills/gsd-path-plan/scripts/state_promote.py +5 -0
- package/skills/gsd-path-plan/scripts/workflow_run.py +12 -1
- package/skills/gsd-path-plan/scripts/worktree_paths.py +94 -0
- package/skills/gsd-path-plan/templates/task.md +2 -0
- package/skills/gsd-path-research/SKILL.md +2 -0
- package/skills/gsd-path-research/references/dispatch.md +6 -19
- package/skills/gsd-path-research/references/model-policy.md +139 -0
- package/skills/gsd-path-research/references/runtime-selection.md +25 -0
- package/skills/gsd-path-research/scripts/_common.py +5 -0
- package/skills/gsd-path-research/scripts/archive_milestone.py +20 -6
- package/skills/gsd-path-research/scripts/build_recovery.py +5 -0
- package/skills/gsd-path-research/scripts/check_handoffs.py +6 -0
- package/skills/gsd-path-research/scripts/check_task_briefs.py +3 -0
- package/skills/gsd-path-research/scripts/detect_project.py +11 -1
- package/skills/gsd-path-research/scripts/discussion_records.py +3 -0
- package/skills/gsd-path-research/scripts/discussion_validate.py +8 -3
- package/skills/gsd-path-research/scripts/integration.py +28 -8
- package/skills/gsd-path-research/scripts/isolation.py +15 -5
- package/skills/gsd-path-research/scripts/loop_run.py +839 -0
- package/skills/gsd-path-research/scripts/model_policy.py +279 -0
- package/skills/gsd-path-research/scripts/path_config.py +248 -0
- package/skills/gsd-path-research/scripts/pipeline_git.py +3 -0
- package/skills/gsd-path-research/scripts/pipeline_state.py +4 -1
- package/skills/gsd-path-research/scripts/promote_lookahead.py +3 -0
- package/skills/gsd-path-research/scripts/review_panel.py +11 -0
- package/skills/gsd-path-research/scripts/roadmap.py +5 -0
- package/skills/gsd-path-research/scripts/state_checkpoint.py +5 -0
- package/skills/gsd-path-research/scripts/state_promote.py +5 -0
- package/skills/gsd-path-research/scripts/worktree_paths.py +94 -0
- package/skills/gsd-path-roadmap/SKILL.md +2 -0
- package/skills/gsd-path-roadmap/references/dispatch.md +6 -19
- package/skills/gsd-path-roadmap/references/model-policy.md +139 -0
- package/skills/gsd-path-roadmap/references/runtime-selection.md +25 -0
- package/skills/gsd-path-roadmap/scripts/_common.py +5 -0
- package/skills/gsd-path-roadmap/scripts/archive_milestone.py +20 -6
- package/skills/gsd-path-roadmap/scripts/build_recovery.py +5 -0
- package/skills/gsd-path-roadmap/scripts/check_handoffs.py +6 -0
- package/skills/gsd-path-roadmap/scripts/check_task_briefs.py +3 -0
- package/skills/gsd-path-roadmap/scripts/detect_project.py +11 -1
- package/skills/gsd-path-roadmap/scripts/discussion_records.py +3 -0
- package/skills/gsd-path-roadmap/scripts/discussion_validate.py +8 -3
- package/skills/gsd-path-roadmap/scripts/integration.py +28 -8
- package/skills/gsd-path-roadmap/scripts/isolation.py +15 -5
- package/skills/gsd-path-roadmap/scripts/loop_run.py +839 -0
- package/skills/gsd-path-roadmap/scripts/model_policy.py +279 -0
- package/skills/gsd-path-roadmap/scripts/path_config.py +248 -0
- package/skills/gsd-path-roadmap/scripts/pipeline_git.py +3 -0
- package/skills/gsd-path-roadmap/scripts/pipeline_state.py +4 -1
- package/skills/gsd-path-roadmap/scripts/promote_lookahead.py +3 -0
- package/skills/gsd-path-roadmap/scripts/review_panel.py +11 -0
- package/skills/gsd-path-roadmap/scripts/roadmap.py +5 -0
- package/skills/gsd-path-roadmap/scripts/state_checkpoint.py +5 -0
- package/skills/gsd-path-roadmap/scripts/state_promote.py +5 -0
- package/skills/gsd-path-roadmap/scripts/worktree_paths.py +94 -0
- package/skills/gsd-path-ship/SKILL.md +24 -13
- package/skills/gsd-path-ship/references/dispatch.md +6 -19
- package/skills/gsd-path-ship/references/jev-review.md +82 -0
- package/skills/gsd-path-ship/references/model-policy.md +139 -0
- package/skills/gsd-path-ship/references/reviewer-panel.md +1 -1
- package/skills/gsd-path-ship/references/reviewer.md +2 -0
- package/skills/gsd-path-ship/references/runtime-selection.md +25 -0
- package/skills/gsd-path-ship/scripts/__pycache__/_common.cpython-312.pyc +0 -0
- package/skills/gsd-path-ship/scripts/_common.py +5 -0
- package/skills/gsd-path-ship/scripts/archive_milestone.py +20 -6
- package/skills/gsd-path-ship/scripts/build_recovery.py +5 -0
- package/skills/gsd-path-ship/scripts/build_state.py +2 -0
- package/skills/gsd-path-ship/scripts/check_handoffs.py +6 -0
- package/skills/gsd-path-ship/scripts/check_task_briefs.py +3 -0
- package/skills/gsd-path-ship/scripts/detect_project.py +11 -1
- package/skills/gsd-path-ship/scripts/discussion_records.py +3 -0
- package/skills/gsd-path-ship/scripts/discussion_validate.py +8 -3
- package/skills/gsd-path-ship/scripts/integration.py +28 -8
- package/skills/gsd-path-ship/scripts/isolation.py +15 -5
- package/skills/gsd-path-ship/scripts/jev_review.py +138 -0
- package/skills/gsd-path-ship/scripts/lean_verification.py +2 -0
- package/skills/gsd-path-ship/scripts/loop_run.py +839 -0
- package/skills/gsd-path-ship/scripts/model_policy.py +279 -0
- package/skills/gsd-path-ship/scripts/path_config.py +248 -0
- package/skills/gsd-path-ship/scripts/pipeline_git.py +3 -0
- package/skills/gsd-path-ship/scripts/pipeline_state.py +4 -1
- package/skills/gsd-path-ship/scripts/promote_lookahead.py +3 -0
- package/skills/gsd-path-ship/scripts/review_panel.py +11 -0
- package/skills/gsd-path-ship/scripts/roadmap.py +5 -0
- package/skills/gsd-path-ship/scripts/state_checkpoint.py +5 -0
- package/skills/gsd-path-ship/scripts/state_promote.py +5 -0
- package/skills/gsd-path-ship/scripts/workflow_run.py +12 -1
- package/skills/gsd-path-ship/scripts/worktree_paths.py +94 -0
- package/skills/gsd-path-undo/SKILL.md +2 -0
- package/skills/gsd-path-undo/references/runtime-selection.md +25 -0
- package/skills/gsd-path-undo/scripts/_common.py +5 -0
- package/skills/gsd-path-undo/scripts/discussion_records.py +3 -0
- package/skills/gsd-path-undo/scripts/loop_run.py +839 -0
- package/skills/gsd-path-undo/scripts/model_policy.py +279 -0
- package/skills/gsd-path-undo/scripts/path_config.py +248 -0
- package/skills/gsd-path-undo/scripts/pipeline_undo.py +3 -0
- package/skills/gsd-path-undo/scripts/review_panel.py +564 -0
- package/skills/gsd-path-undo/scripts/worktree_paths.py +94 -0
- package/skills/path/BUILD.md +7 -0
- package/skills/path/DECIDE.md +2 -0
- package/skills/path/DEFINE.md +13 -7
- package/skills/path/DOCS-AUDIT.md +2 -0
- package/skills/path/INSPECT.md +2 -0
- package/skills/path/PLAN.md +4 -2
- package/skills/path/RESEARCH.md +2 -0
- package/skills/path/ROADMAP.md +2 -0
- package/skills/path/SHIP.md +24 -13
- package/skills/path/SKILL.md +23 -9
- package/skills/path/references/build-native.md +15 -7
- package/skills/path/references/config.md +57 -0
- package/skills/path/references/dispatch.md +6 -19
- package/skills/path/references/jev-review.md +82 -0
- package/skills/path/references/model-policy.md +139 -0
- package/skills/path/references/reviewer-panel.md +1 -1
- package/skills/path/references/reviewer.md +2 -0
- package/skills/path/references/runtime-selection.md +25 -0
- package/skills/path/scripts/_common.py +5 -0
- package/skills/path/scripts/archive_milestone.py +20 -6
- package/skills/path/scripts/bootstrap_repository.py +8 -1
- package/skills/path/scripts/build_recovery.py +5 -0
- package/skills/path/scripts/build_state.py +2 -0
- package/skills/path/scripts/check_docs_audit.py +2 -0
- package/skills/path/scripts/check_handoffs.py +6 -0
- package/skills/path/scripts/check_task_briefs.py +3 -0
- package/skills/path/scripts/detect_project.py +11 -1
- package/skills/path/scripts/discussion_records.py +3 -0
- package/skills/path/scripts/discussion_validate.py +8 -3
- package/skills/path/scripts/dispatch_driver.py +230 -21
- package/skills/path/scripts/git_guard.py +768 -0
- package/skills/path/scripts/integration.py +28 -8
- package/skills/path/scripts/isolation.py +15 -5
- package/skills/path/scripts/jev_review.py +138 -0
- package/skills/path/scripts/lean_verification.py +2 -0
- package/skills/path/scripts/loop_run.py +2 -0
- package/skills/path/scripts/model_policy.py +279 -0
- package/skills/path/scripts/path_config.py +248 -0
- package/skills/path/scripts/pipeline_git.py +3 -0
- package/skills/path/scripts/pipeline_state.py +4 -1
- package/skills/path/scripts/promote_lookahead.py +3 -0
- package/skills/path/scripts/review_panel.py +11 -0
- package/skills/path/scripts/roadmap.py +5 -0
- package/skills/path/scripts/state_checkpoint.py +5 -0
- package/skills/path/scripts/state_promote.py +5 -0
- package/skills/path/scripts/status_runtime.py +208 -0
- package/skills/path/scripts/workflow_run.py +12 -1
- package/skills/path/scripts/worktree_paths.py +94 -0
- package/skills/path/templates/skeptic.md +1 -1
- package/skills/path/templates/task.md +2 -0
- package/skills/path/templates/wave-panel.md +1 -1
- 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_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-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_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-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-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-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-forensics/scripts/__pycache__/pipeline_undo.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-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-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-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-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
|
@@ -7,10 +7,7 @@ use exactly one matching branch:
|
|
|
7
7
|
- A `spawn_agent` tool exposing `task_name`, `agent_type`, and `fork_turns` is
|
|
8
8
|
Codex. Use `fork_turns: "none"`; coders use the built-in `worker` type and
|
|
9
9
|
every other role uses `default`. Reuse a completed logical target with
|
|
10
|
-
`followup_task`.
|
|
11
|
-
`heavy` tier and `low` for the portable `light` tier; leave reasoning effort
|
|
12
|
-
unset for the session-default tier, and never pass `heavy` or `light` as a
|
|
13
|
-
literal Codex value.
|
|
10
|
+
`followup_task`.
|
|
14
11
|
- A `spawn_agent` tool without those Codex fields is Zed. Spawn one isolated,
|
|
15
12
|
full-capability child per brief. Zed children are not resumable, so retries
|
|
16
13
|
use a fresh child and a complete prompt.
|
|
@@ -26,7 +23,7 @@ use exactly one matching branch:
|
|
|
26
23
|
the complete new prompt for later work. Wait for a colliding active child and
|
|
27
24
|
collect results with `wait_commands_or_subagents`.
|
|
28
25
|
- A `Task` tool advertising the custom `gsd-path` subagent is Cursor. Use that
|
|
29
|
-
|
|
26
|
+
full-capability child. Resume it by returned agent ID when
|
|
30
27
|
available; otherwise retry with a fresh child and a complete prompt.
|
|
31
28
|
- A `Task` tool advertising the built-in `general` subagent is OpenCode. Use
|
|
32
29
|
that child; if an installed OpenCode v2 host exposes the renamed `subagent`
|
|
@@ -65,20 +62,10 @@ For every branch:
|
|
|
65
62
|
- Resolve the phase's linked role brief to an absolute path, include it in the
|
|
66
63
|
prompt, and require the child to read it before acting. The role brief
|
|
67
64
|
supplies the read-only boundary for auditors and reviewers.
|
|
68
|
-
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
host, use only an exact native equivalent advertised by that host; otherwise
|
|
73
|
-
do not override the model or reasoning effort. The only exception is a
|
|
74
|
-
review-panel child: when the host advertises model selection, pass the exact
|
|
75
|
-
slug returned by `scripts/review_panel.py resolve` for that family. Never
|
|
76
|
-
override the model on the canonical reviewer, planner, coder, or any other
|
|
77
|
-
role.
|
|
78
|
-
Host isolation: none. The child's working directory is the exact absolute
|
|
79
|
-
root GSD Path supplied; a host SHA checkout or extra worktree is a contract
|
|
80
|
-
failure. Never ask the host to create a worktree. Give the child the exact
|
|
81
|
-
repository or linked-worktree root supplied by GSD Path.
|
|
65
|
+
- Model selection: before every child launch or continuation, follow
|
|
66
|
+
[the model-policy contract](model-policy.md) and apply its recorded
|
|
67
|
+
native arguments. It owns defaults, project settings, task overrides,
|
|
68
|
+
capability failures, and reassignment. Host isolation: none. Use the exact GSD Path supplied root; create no extra checkout.
|
|
82
69
|
- Send a self-contained prompt with absolute input, template, and output paths
|
|
83
70
|
plus the child's bounded responsibility. Every brief also names the absolute
|
|
84
71
|
`AGENTS.md` and `WORKFLOW.md` paths (or explicitly says they are absent), the
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
# Dispatch model policy
|
|
2
|
+
|
|
3
|
+
Before native dispatch, run the bundled `scripts/model_policy.py`. CLI dispatch
|
|
4
|
+
uses the same resolver inside `dispatch_driver.py`. The helper owns model and
|
|
5
|
+
effort decisions; apply its output instead of choosing again in prose.
|
|
6
|
+
|
|
7
|
+
## Project choices
|
|
8
|
+
|
|
9
|
+
Use `<repo>/.project/model-policy.json`, including when the active track is
|
|
10
|
+
`.project/next`. This file owns project overrides. It is not phase status.
|
|
11
|
+
No file is required to retain existing behavior. `path config` can also set user
|
|
12
|
+
defaults in `~/.gsd-path/config.json` under `models`. Project common roles override
|
|
13
|
+
user host and common roles. Within each scope, host roles override common roles.
|
|
14
|
+
Task overrides still win, and recorded assignments stay pinned.
|
|
15
|
+
|
|
16
|
+
```json
|
|
17
|
+
{
|
|
18
|
+
"roles": {"coder": {"model": "inherit"}},
|
|
19
|
+
"hosts": {"codex": {"plan": {"effort": "high"}}}
|
|
20
|
+
}
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
Values are exact advertised model/effort strings or `inherit`. This example
|
|
24
|
+
illustrates configuration; it is not a cost-saving preset. Set concrete models
|
|
25
|
+
only from the current host's advertised choices. Host-specific role settings
|
|
26
|
+
override common role settings. Task settings override both, independently for
|
|
27
|
+
model and effort; omitted fields retain the next applicable value. Explicit
|
|
28
|
+
`inherit` removes that field's override. There are no automatic fallbacks.
|
|
29
|
+
|
|
30
|
+
Role keys are `coder`, `reviewer` (wave, final, and gap review), `review_panel`,
|
|
31
|
+
`skeptic`, `inspect_codebase`, `inspect_docs`, `docs_audit`, `research`, `decide`,
|
|
32
|
+
`roadmap`, `plan`, and `plan_patch`. Use the logical task name as the assignment,
|
|
33
|
+
not as the role. Keep each panel family and review lens a distinct assignment.
|
|
34
|
+
|
|
35
|
+
The helper retains heavy effort hints for plan, plan_patch, decide, and roadmap;
|
|
36
|
+
light hints for inspect_docs and docs_audit; otherwise effort inherits. Codex
|
|
37
|
+
maps these hints to high/low. Other hosts use only advertised equivalents.
|
|
38
|
+
Hints are conditional; unsupported explicit settings stop the affected child.
|
|
39
|
+
|
|
40
|
+
Coders may have scalar `model:` and `effort:` fields in their task frontmatter.
|
|
41
|
+
These are part of the approved task contract. Pass the task file with `--task`.
|
|
42
|
+
For other roles, pass assignment-specific `--model` or `--effort` when the owner
|
|
43
|
+
explicitly overrides the role choice. Coder settings do not affect reviewers.
|
|
44
|
+
|
|
45
|
+
## Advertised capabilities
|
|
46
|
+
|
|
47
|
+
Capture the current child tool's schema and advertised choices in a JSON file
|
|
48
|
+
outside the product tree. For each supported control, provide its native field,
|
|
49
|
+
allowed values, and, for CLI dispatch, its documented argument template. Omit
|
|
50
|
+
unsupported controls. The values below are fixture examples, not a host catalog:
|
|
51
|
+
|
|
52
|
+
```json
|
|
53
|
+
{
|
|
54
|
+
"host": "codex",
|
|
55
|
+
"model": {"field": "model", "values": ["example-model"],
|
|
56
|
+
"args": ["--model", "{value}"]},
|
|
57
|
+
"effort": {"field": "reasoning_effort", "values": ["low", "high"],
|
|
58
|
+
"args": ["-c", "model_reasoning_effort={value}"]}
|
|
59
|
+
}
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
`effort_hints` may map heavy/light to exact advertised equivalents. Supply
|
|
63
|
+
`inherited_model` only when the host exposes its identity. Never infer models,
|
|
64
|
+
fields, or CLI flags from a host name. Every existing host uses this contract,
|
|
65
|
+
including hosts with no model or effort controls. Their explicit unsupported
|
|
66
|
+
settings block; their default inheritance remains usable.
|
|
67
|
+
|
|
68
|
+
## Native lifecycle
|
|
69
|
+
|
|
70
|
+
Resolve the bundled helper to an absolute path. Use one record under the Git
|
|
71
|
+
common directory's `gsd-path/model-selection/` directory per assignment. Scope
|
|
72
|
+
the path and `--scope` to the milestone, active/lookahead track, and review cycle
|
|
73
|
+
where applicable; later work must not reuse an earlier record.
|
|
74
|
+
|
|
75
|
+
```text
|
|
76
|
+
python3 -B <helper> resolve --repo <primary> --scope <milestone/track/cycle> --assignment <logical-name> --role <role> --record <absolute-record> --capabilities <advertised-json>
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
Only `status: ready` authorizes launch. Apply `selection.native` exactly to
|
|
80
|
+
the advertised child tool, preserving the host adapter's other controls and
|
|
81
|
+
GSD Path task isolation. The recorded selection applies to a fresh child too.
|
|
82
|
+
If an existing child is still active, reattach or send its continuation;
|
|
83
|
+
resolving again does not authorize launching a second copy. When a host cannot
|
|
84
|
+
change model/effort on a resumed child, a changed selection requires a fresh
|
|
85
|
+
child after terminal completion of the earlier one.
|
|
86
|
+
|
|
87
|
+
After terminal completion, release the assignment with `release` using the
|
|
88
|
+
same identity arguments and `--terminal-result <host-completion-evidence>`.
|
|
89
|
+
To change the selection, use `reassign` with the same identity, current
|
|
90
|
+
capabilities, explicit model/effort changes, and `--ruling <verbatim-owner-ruling>`.
|
|
91
|
+
It requires an inactive assignment and preserves prior selection history.
|
|
92
|
+
Resolve again before starting the replacement. A project-policy edit alone
|
|
93
|
+
does not change an existing selection. Task-contract edits still require their
|
|
94
|
+
legal pipeline path.
|
|
95
|
+
|
|
96
|
+
For panel children, first resolve membership with `review_panel.py resolve`,
|
|
97
|
+
passing `--parent-slug` when known and repeating `--exclude-family` for every
|
|
98
|
+
known parent and canonical-reviewer family (including all deep review lenses).
|
|
99
|
+
Apply these exclusions before persisting membership. Detected membership skips
|
|
100
|
+
excluded families; explicitly named conflicts block. Pass its selected model through `--panel-model`, and pass `--panel-family` plus
|
|
101
|
+
`--exclude-family` for known parent and
|
|
102
|
+
canonical-reviewer families. Persist and reuse the panel roster. Policy cannot
|
|
103
|
+
waive family independence or change canonical review authority. A changed
|
|
104
|
+
panel roster requires a new legal review assignment.
|
|
105
|
+
|
|
106
|
+
Requested controls are durable evidence. When the host hides the inherited
|
|
107
|
+
model identity, exact effective-model continuity across fresh children remains
|
|
108
|
+
unproven; report that limitation rather than asserting an identity.
|
|
109
|
+
|
|
110
|
+
## CLI lifecycle
|
|
111
|
+
|
|
112
|
+
Pass `--model-capabilities <advertised-json>` to the driver. Commands use whole
|
|
113
|
+
argument slots `{model_args}` and `{effort_args}`; the resolver expands these
|
|
114
|
+
to argument arrays. They are not shell substitutions. Remove fixed model and
|
|
115
|
+
effort flags when using these slots; conflicting controls block dispatch.
|
|
116
|
+
Commands with explicit policy choices must expose the corresponding slots,
|
|
117
|
+
including when an explicit choice is `inherit`. Unconfigured legacy commands
|
|
118
|
+
without a capability file retain their existing behavior.
|
|
119
|
+
An existing legacy assignment with no recorded selection keeps its saved
|
|
120
|
+
command across retries, even if project policy or capabilities are later added.
|
|
121
|
+
It cannot use `reassign-model`; model controls require a new explicit assignment.
|
|
122
|
+
|
|
123
|
+
Review and skeptic commands accept `--model` and `--effort` for that assignment.
|
|
124
|
+
For distinct panel families or review lenses, pass `--model-overrides <json>`:
|
|
125
|
+
a mapping from exact logical assignment names to model/effort objects. Each
|
|
126
|
+
entry applies only to its named assignment; conflicting explicit inputs block.
|
|
127
|
+
A common panel model must satisfy every selected family, so use these scoped
|
|
128
|
+
overrides when families need different models. Family checks remain mandatory.
|
|
129
|
+
Coders read their task overrides. Panels with capabilities use the argument
|
|
130
|
+
slots; legacy panel commands may retain their existing `{model}` placeholder.
|
|
131
|
+
|
|
132
|
+
The driver persists selection before launch and retains it on retry. Use
|
|
133
|
+
`dispatch_driver.py reassign-model --repo <primary> --task-id <logical-name>
|
|
134
|
+
--model-capabilities <advertised-json> --model <slug> --ruling <owner-ruling>`
|
|
135
|
+
for an inactive unfinished assignment. Finished work and pinned panel rosters
|
|
136
|
+
require a new legal assignment. Earlier attempt evidence is retained.
|
|
137
|
+
|
|
138
|
+
Compare total cost only with observed usage and outcomes, including retries.
|
|
139
|
+
These controls do not establish cost savings, pricing, or quality rankings.
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# Project runtime selection
|
|
2
|
+
|
|
3
|
+
Before running a project runtime helper, check for
|
|
4
|
+
`<absolute-project>/.gsd-path/runtime.json`. When present, run the stable launcher:
|
|
5
|
+
|
|
6
|
+
```sh
|
|
7
|
+
python3 -B <absolute-project>/.gsd-path/status_runtime.py --repo <absolute-project> --runtime-path
|
|
8
|
+
```
|
|
9
|
+
|
|
10
|
+
Use `python` only when it is the compatible Python 3.9+ interpreter. A failure
|
|
11
|
+
stops helper execution: follow the exact-version restore action in the error.
|
|
12
|
+
Do not install, upgrade, or fall back to the current plugin's runtime implicitly.
|
|
13
|
+
|
|
14
|
+
The returned directory is the verified Project runtime. Resolve helper names
|
|
15
|
+
present in its `manifest.json` from that directory, including status, state,
|
|
16
|
+
isolation, integration, archive, recovery, build-state, final-verification, and guard helpers.
|
|
17
|
+
The workflow runner resolves its subprocess helpers from this same directory;
|
|
18
|
+
helper imports stay within the selected runtime. This rule overrides
|
|
19
|
+
references to bundled copies of those helpers. Other skill helpers, templates,
|
|
20
|
+
and role briefs remain in the installed skill bundle. Pass `-B` to Python helper
|
|
21
|
+
invocations so execution does not create bytecode in the runtime store.
|
|
22
|
+
|
|
23
|
+
With no declaration, retain the legacy helper lookup. An existing
|
|
24
|
+
`.gsd-path/runtime/` requires the explicit `--runtime-migrate --project PATH`
|
|
25
|
+
operation before adopting external storage; review the resulting Git diff.
|
|
Binary file
|
|
@@ -16,6 +16,9 @@ import re
|
|
|
16
16
|
import shutil
|
|
17
17
|
import subprocess
|
|
18
18
|
import sys
|
|
19
|
+
|
|
20
|
+
# Runtime helpers must not modify their immutable installation.
|
|
21
|
+
sys.dont_write_bytecode = True
|
|
19
22
|
from contextlib import contextmanager
|
|
20
23
|
from datetime import date
|
|
21
24
|
from pathlib import Path, PurePosixPath
|
|
@@ -1743,6 +1746,12 @@ def require_clean_active_root(active_root: Path, archive: Path) -> None:
|
|
|
1743
1746
|
carried_forward = pending_ruling_count(archived_audit)
|
|
1744
1747
|
# Persistent project metadata ships but never archives with a milestone.
|
|
1745
1748
|
allowed = {"STATE.md", "REPOSITORY.md", "archive", "LESSONS.md", "next"}
|
|
1749
|
+
for name in ("config.json", "model-policy.json"):
|
|
1750
|
+
path = active_root / name
|
|
1751
|
+
if path.exists() or path.is_symlink():
|
|
1752
|
+
if path.is_symlink() or not path.is_file() or path.stat().st_nlink != 1:
|
|
1753
|
+
raise ArchiveError(f"project settings must be a regular unlinked file: {path}")
|
|
1754
|
+
allowed.add(name)
|
|
1746
1755
|
if (active_root / "CHARTER.md").is_file():
|
|
1747
1756
|
# Program flow: these persist at the .project/ top level.
|
|
1748
1757
|
allowed |= {"CHARTER.md", "ROADMAP.md", "SYNTHESIS.md"}
|
|
@@ -1808,6 +1817,7 @@ def prepared_transaction(
|
|
|
1808
1817
|
repo: Path,
|
|
1809
1818
|
phases: Sequence[str],
|
|
1810
1819
|
must_be_uncommitted: bool = False,
|
|
1820
|
+
*, historical: bool = False,
|
|
1811
1821
|
) -> tuple:
|
|
1812
1822
|
project = repo.resolve()
|
|
1813
1823
|
active_root = require_project_layout(project)
|
|
@@ -1816,7 +1826,7 @@ def prepared_transaction(
|
|
|
1816
1826
|
state, _, loaded_state_path = strict_state(project)
|
|
1817
1827
|
if loaded_state_path.resolve() != state_path.resolve():
|
|
1818
1828
|
raise ArchiveError("strict STATE.md loader returned an unexpected path")
|
|
1819
|
-
require_transaction_context(project, state, phases)
|
|
1829
|
+
require_transaction_context(project, state, phases, historical=historical)
|
|
1820
1830
|
|
|
1821
1831
|
configured = state.archive
|
|
1822
1832
|
if configured is None:
|
|
@@ -1880,10 +1890,11 @@ def require_canonical_commit_body(
|
|
|
1880
1890
|
raise ArchiveError(f"{label} commit body does not match required fields")
|
|
1881
1891
|
|
|
1882
1892
|
|
|
1883
|
-
def find_ship_commit(project: Path, archive_name: str) -> str:
|
|
1893
|
+
def find_ship_commit(project: Path, archive_name: str, *, historical: bool = False) -> str:
|
|
1884
1894
|
expected_subject = ship_subject(archive_name)
|
|
1885
1895
|
log = require_git_success(
|
|
1886
|
-
run_git(project, "log", "--first-parent"
|
|
1896
|
+
run_git(project, "log", *([] if historical else ["--first-parent"]),
|
|
1897
|
+
"--format=%H%x00%s", "HEAD"),
|
|
1887
1898
|
"inspect HEAD history for the ship commit",
|
|
1888
1899
|
)
|
|
1889
1900
|
matches = []
|
|
@@ -1926,19 +1937,22 @@ def validate_shipped_roadmap(text: str, state: PipelineState, archive: str) -> N
|
|
|
1926
1937
|
raise ArchiveError("ROADMAP.md must record Status: shipped and the exact Archive")
|
|
1927
1938
|
|
|
1928
1939
|
|
|
1929
|
-
def validate(repo: Path) -> dict:
|
|
1940
|
+
def validate(repo: Path, *, historical: bool = False) -> dict:
|
|
1930
1941
|
project, _, state, configured, archive, archived_files, reviewed_head = prepared_transaction(
|
|
1931
1942
|
repo,
|
|
1932
1943
|
("shipped",),
|
|
1944
|
+
historical=historical,
|
|
1933
1945
|
)
|
|
1934
1946
|
if state.status != "done":
|
|
1935
1947
|
raise ArchiveError("STATE.md is not shipped/done")
|
|
1936
1948
|
|
|
1937
|
-
project_status = require_git_success(
|
|
1949
|
+
project_status = require_git_success(
|
|
1950
|
+
run_git(project, "status", "--porcelain", *(["--", ".project"] if historical else [])),
|
|
1951
|
+
"inspect worktree status")
|
|
1938
1952
|
if project_status:
|
|
1939
1953
|
raise ArchiveError("ship transaction worktree is not clean")
|
|
1940
1954
|
|
|
1941
|
-
ship_commit = find_ship_commit(project, archive.name)
|
|
1955
|
+
ship_commit = find_ship_commit(project, archive.name, historical=historical)
|
|
1942
1956
|
|
|
1943
1957
|
parents = require_git_success(
|
|
1944
1958
|
run_git(project, "rev-list", "--parents", "-n", "1", ship_commit),
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env python3
|
|
2
|
+
# gsd-path project runtime
|
|
2
3
|
"""Gate a GSD Path docs audit (.project/research/DOCS-AUDIT.md) against its contract.
|
|
3
4
|
|
|
4
5
|
Checks the rules the docs-audit contract states in prose: the header lines,
|
|
@@ -32,6 +33,7 @@ import json
|
|
|
32
33
|
import re
|
|
33
34
|
import subprocess
|
|
34
35
|
import sys
|
|
36
|
+
sys.dont_write_bytecode = True
|
|
35
37
|
from datetime import date
|
|
36
38
|
from pathlib import Path
|
|
37
39
|
from typing import Dict, List, Optional, Sequence
|
|
@@ -7,6 +7,9 @@ import json
|
|
|
7
7
|
import re
|
|
8
8
|
import subprocess
|
|
9
9
|
import sys
|
|
10
|
+
|
|
11
|
+
# Runtime helpers must not modify their immutable installation.
|
|
12
|
+
sys.dont_write_bytecode = True
|
|
10
13
|
from pathlib import Path, PurePosixPath
|
|
11
14
|
from typing import Dict, List, Optional, Sequence, Set, Tuple
|
|
12
15
|
|
|
@@ -131,6 +134,9 @@ def _strict_frontmatter(text: str, label: str) -> Dict[str, object]:
|
|
|
131
134
|
while index < len(lines):
|
|
132
135
|
line = lines[index]
|
|
133
136
|
if line == "---":
|
|
137
|
+
for field in ('model', 'effort'):
|
|
138
|
+
if field in values and (not isinstance(values[field], str) or not values[field].strip()):
|
|
139
|
+
raise HandoffError(f'{label}: {field} must be a nonempty scalar or inherit')
|
|
134
140
|
return values
|
|
135
141
|
if not line.strip() or line.lstrip().startswith("#"):
|
|
136
142
|
index += 1
|
|
@@ -6,6 +6,9 @@ import argparse
|
|
|
6
6
|
import json
|
|
7
7
|
import re
|
|
8
8
|
import sys
|
|
9
|
+
|
|
10
|
+
# Runtime helpers must not modify their immutable installation.
|
|
11
|
+
sys.dont_write_bytecode = True
|
|
9
12
|
from pathlib import Path, PurePosixPath
|
|
10
13
|
from typing import Dict, List, Optional, Sequence, Set, Tuple
|
|
11
14
|
|
|
@@ -34,6 +34,9 @@ import re
|
|
|
34
34
|
import stat
|
|
35
35
|
import subprocess
|
|
36
36
|
import sys
|
|
37
|
+
|
|
38
|
+
# Runtime helpers must not modify their immutable installation.
|
|
39
|
+
sys.dont_write_bytecode = True
|
|
37
40
|
from datetime import date
|
|
38
41
|
from pathlib import Path, PurePosixPath, PureWindowsPath
|
|
39
42
|
from typing import Iterable, NamedTuple, Optional, Sequence
|
|
@@ -1200,7 +1203,14 @@ def filled_state_template(template: str, slug: str, phase: str) -> str:
|
|
|
1200
1203
|
text = text.replace("YYYY-MM-DD — <phase> — project initialized", stamp)
|
|
1201
1204
|
if "<slug>" in text or "YYYY-MM-DD" in text:
|
|
1202
1205
|
raise DetectError("state template placeholder remains")
|
|
1203
|
-
|
|
1206
|
+
try:
|
|
1207
|
+
from .path_config import initial_state
|
|
1208
|
+
except ImportError:
|
|
1209
|
+
from path_config import initial_state
|
|
1210
|
+
try:
|
|
1211
|
+
return initial_state(text)
|
|
1212
|
+
except (OSError, ValueError, RuntimeError) as error:
|
|
1213
|
+
raise DetectError(str(error)) from error
|
|
1204
1214
|
|
|
1205
1215
|
|
|
1206
1216
|
def write_all(descriptor: int, payload: bytes) -> None:
|
|
@@ -2,6 +2,11 @@
|
|
|
2
2
|
# gsd-path project runtime
|
|
3
3
|
"""Validate discussion records, reviews and the manifest for archive_milestone."""
|
|
4
4
|
|
|
5
|
+
import sys
|
|
6
|
+
|
|
7
|
+
# Runtime helpers must not modify their immutable installation.
|
|
8
|
+
sys.dont_write_bytecode = True
|
|
9
|
+
|
|
5
10
|
import json
|
|
6
11
|
import re
|
|
7
12
|
import shutil
|
|
@@ -409,7 +414,7 @@ def remove_interrupted_carry_copy(active_root: Path, archive: Path) -> None:
|
|
|
409
414
|
|
|
410
415
|
|
|
411
416
|
def require_transaction_context(
|
|
412
|
-
project: Path, state: PipelineState, phases: Sequence[str]
|
|
417
|
+
project: Path, state: PipelineState, phases: Sequence[str], *, historical: bool = False
|
|
413
418
|
) -> None:
|
|
414
419
|
phase = state.phase
|
|
415
420
|
if phase not in phases:
|
|
@@ -429,7 +434,7 @@ def require_transaction_context(
|
|
|
429
434
|
)
|
|
430
435
|
if archive_milestone.is_unset(expected_branch):
|
|
431
436
|
raise ArchiveError("STATE.md does not name a bound build branch")
|
|
432
|
-
if current_branch != expected_branch:
|
|
437
|
+
if current_branch != expected_branch and not historical:
|
|
433
438
|
raise ArchiveError(
|
|
434
439
|
f"current branch {current_branch!r} does not match STATE.branch {expected_branch!r}"
|
|
435
440
|
)
|
|
@@ -446,7 +451,7 @@ def require_transaction_context(
|
|
|
446
451
|
),
|
|
447
452
|
"inspect non-project worktree status",
|
|
448
453
|
)
|
|
449
|
-
if non_project_status:
|
|
454
|
+
if non_project_status and not historical:
|
|
450
455
|
raise ArchiveError("non-.project worktree changes block the archive transaction")
|
|
451
456
|
|
|
452
457
|
|
|
@@ -2,6 +2,11 @@
|
|
|
2
2
|
# gsd-path project runtime
|
|
3
3
|
"""Own milestone integration, publication, tags, and completion proof."""
|
|
4
4
|
|
|
5
|
+
import sys
|
|
6
|
+
|
|
7
|
+
# Runtime helpers must not modify their immutable installation.
|
|
8
|
+
sys.dont_write_bytecode = True
|
|
9
|
+
|
|
5
10
|
import json
|
|
6
11
|
import re
|
|
7
12
|
from pathlib import Path, PurePosixPath
|
|
@@ -21,6 +26,7 @@ try:
|
|
|
21
26
|
from pipeline_state import PipelineState
|
|
22
27
|
from isolation import publication_base
|
|
23
28
|
import _common
|
|
29
|
+
import worktree_paths
|
|
24
30
|
except ImportError: # pragma: no cover - package import used by tests
|
|
25
31
|
from scripts.pipeline_git import (
|
|
26
32
|
bound_branch_name,
|
|
@@ -35,6 +41,7 @@ except ImportError: # pragma: no cover - package import used by tests
|
|
|
35
41
|
from scripts.pipeline_state import PipelineState
|
|
36
42
|
from scripts.isolation import publication_base
|
|
37
43
|
from scripts import _common
|
|
44
|
+
from scripts import worktree_paths
|
|
38
45
|
|
|
39
46
|
|
|
40
47
|
if __package__:
|
|
@@ -156,10 +163,13 @@ def optional_ref(project: Path, ref: str) -> Optional[str]:
|
|
|
156
163
|
return result.stdout.strip() if result.returncode == 0 else None
|
|
157
164
|
|
|
158
165
|
|
|
159
|
-
def integration_names(project: Path, archive_name: str) -> tuple[str, Path]:
|
|
166
|
+
def integration_names(project: Path, archive_name: str, *, pin: bool = False) -> tuple[str, Path]:
|
|
160
167
|
identifier = milestone_id(milestone_number(archive_name))
|
|
161
168
|
branch = f"gsd-path-integrate/{identifier}"
|
|
162
|
-
|
|
169
|
+
try:
|
|
170
|
+
worktree = worktree_paths.worktree_path(project, "integrate", identifier, pin=pin)
|
|
171
|
+
except (ValueError, OSError) as error:
|
|
172
|
+
raise ArchiveError(str(error)) from error
|
|
163
173
|
return branch, worktree
|
|
164
174
|
|
|
165
175
|
|
|
@@ -1044,7 +1054,7 @@ def integrate(repo: Path, slug: str) -> dict:
|
|
|
1044
1054
|
ship_commit,
|
|
1045
1055
|
)
|
|
1046
1056
|
publishable_bound_branch(project, bound_branch, ship_commit)
|
|
1047
|
-
integration_branch, worktree = integration_names(project, archive_name)
|
|
1057
|
+
integration_branch, worktree = integration_names(project, archive_name, pin=True)
|
|
1048
1058
|
interrupted_worktree = registered_worktree(project, integration_branch)
|
|
1049
1059
|
if (
|
|
1050
1060
|
interrupted_worktree is not None
|
|
@@ -1222,7 +1232,9 @@ def find_integrate_commit(
|
|
|
1222
1232
|
return merge_commit
|
|
1223
1233
|
|
|
1224
1234
|
|
|
1225
|
-
def validate_integrated(
|
|
1235
|
+
def validate_integrated(
|
|
1236
|
+
repo: Path, slug: str, *, refresh: bool = True, historical: bool = False
|
|
1237
|
+
) -> dict:
|
|
1226
1238
|
project = repo.resolve()
|
|
1227
1239
|
active_root = archive_milestone.require_project_layout(project)
|
|
1228
1240
|
state, _, loaded_state_path = archive_milestone.strict_state(project)
|
|
@@ -1235,7 +1247,7 @@ def validate_integrated(repo: Path, slug: str, *, refresh: bool = True) -> dict:
|
|
|
1235
1247
|
)
|
|
1236
1248
|
|
|
1237
1249
|
# (a) The shipped transaction itself must still validate.
|
|
1238
|
-
shipped = archive_milestone.validate(repo)
|
|
1250
|
+
shipped = archive_milestone.validate(repo, historical=historical)
|
|
1239
1251
|
configured = shipped["archive"]
|
|
1240
1252
|
ship_commit = shipped["commit"]
|
|
1241
1253
|
archive_name = PurePosixPath(configured).name
|
|
@@ -1340,6 +1352,10 @@ def validate_integrated(repo: Path, slug: str, *, refresh: bool = True) -> dict:
|
|
|
1340
1352
|
contains = run_git(project, "merge-base", "--is-ancestor", merge_commit, remote_default)
|
|
1341
1353
|
if contains.returncode != 0:
|
|
1342
1354
|
raise ArchiveError(f"{remote_default} does not contain the integration merge")
|
|
1355
|
+
if (historical
|
|
1356
|
+
and run_git(project, "branch", "--show-current").stdout.strip() != bound_branch
|
|
1357
|
+
and run_git(project, "merge-base", "--is-ancestor", merge_commit, "HEAD").returncode):
|
|
1358
|
+
raise ArchiveError("HEAD does not contain the integration merge")
|
|
1343
1359
|
|
|
1344
1360
|
# (e) The bound branch tip and annotated tag must be published on origin.
|
|
1345
1361
|
require_published_integration(
|
|
@@ -1348,7 +1364,8 @@ def validate_integrated(repo: Path, slug: str, *, refresh: bool = True) -> dict:
|
|
|
1348
1364
|
ship_commit,
|
|
1349
1365
|
tag_name,
|
|
1350
1366
|
merge_commit,
|
|
1351
|
-
allow_missing_bound=state.integration == "pull-request",
|
|
1367
|
+
allow_missing_bound=state.integration == "pull-request" or (historical and has_origin),
|
|
1368
|
+
retired=historical,
|
|
1352
1369
|
)
|
|
1353
1370
|
|
|
1354
1371
|
result = {
|
|
@@ -1369,7 +1386,9 @@ def validate_integrated(repo: Path, slug: str, *, refresh: bool = True) -> dict:
|
|
|
1369
1386
|
refs = [(f"refs/heads/{default_name}", result["base"]),
|
|
1370
1387
|
(f"refs/tags/{tag_name}", optional_ref(project, tag_ref))]
|
|
1371
1388
|
if state.integration == "direct":
|
|
1372
|
-
|
|
1389
|
+
bound_ref = f"refs/heads/{bound_branch}"
|
|
1390
|
+
if not historical or live_remote_ref(project, bound_ref) is not None:
|
|
1391
|
+
refs.append((bound_ref, ship_commit))
|
|
1373
1392
|
for ref, expected in refs:
|
|
1374
1393
|
if live_remote_ref(project, ref) != expected:
|
|
1375
1394
|
raise ArchiveError(f"published {ref} differs from local integration evidence")
|
|
@@ -1385,6 +1404,7 @@ def require_published_integration(
|
|
|
1385
1404
|
tag_name: str,
|
|
1386
1405
|
merge_commit: str,
|
|
1387
1406
|
allow_missing_bound: bool = False,
|
|
1407
|
+
retired: bool = False,
|
|
1388
1408
|
) -> None:
|
|
1389
1409
|
if allow_missing_bound:
|
|
1390
1410
|
published_ship = live_remote_ref(project, f"refs/heads/{bound_branch}")
|
|
@@ -1408,7 +1428,7 @@ def require_published_integration(
|
|
|
1408
1428
|
|
|
1409
1429
|
bound_ref = f"refs/remotes/origin/{bound_branch}"
|
|
1410
1430
|
if run_git(project, "rev-parse", "--verify", "--quiet", bound_ref).returncode != 0:
|
|
1411
|
-
if not
|
|
1431
|
+
if not retired:
|
|
1412
1432
|
raise ArchiveError(f"missing published bound branch: origin/{bound_branch}")
|
|
1413
1433
|
else:
|
|
1414
1434
|
published_ship = archive_milestone.require_git_success(
|
|
@@ -18,6 +18,9 @@ import re
|
|
|
18
18
|
import stat
|
|
19
19
|
import subprocess
|
|
20
20
|
import sys
|
|
21
|
+
|
|
22
|
+
# Runtime helpers must not modify their immutable installation.
|
|
23
|
+
sys.dont_write_bytecode = True
|
|
21
24
|
import tempfile
|
|
22
25
|
from pathlib import Path, PurePosixPath
|
|
23
26
|
from typing import Dict, Optional, Sequence, Set
|
|
@@ -33,6 +36,7 @@ try:
|
|
|
33
36
|
task_commit_subject,
|
|
34
37
|
)
|
|
35
38
|
import _common
|
|
39
|
+
import worktree_paths
|
|
36
40
|
except ImportError: # pragma: no cover - package import used by tests
|
|
37
41
|
from scripts.pipeline_git import (
|
|
38
42
|
attest_commit_body,
|
|
@@ -44,6 +48,7 @@ except ImportError: # pragma: no cover - package import used by tests
|
|
|
44
48
|
task_commit_subject,
|
|
45
49
|
)
|
|
46
50
|
from scripts import _common
|
|
51
|
+
from scripts import worktree_paths
|
|
47
52
|
|
|
48
53
|
|
|
49
54
|
TASK_BRANCH_PREFIX = "gsd-path-task/"
|
|
@@ -57,7 +62,9 @@ VERIFY_LEDGER_PATH = _common.VERIFY_LEDGER_PATH
|
|
|
57
62
|
LANDED_VERDICTS = frozenset({"recovered", "attested"})
|
|
58
63
|
# Orchestrator bookkeeping that may stay uncommitted in the primary while a
|
|
59
64
|
# parallel task lands; the next `.project` checkpoint commits it.
|
|
60
|
-
BOOKKEEPING_PATHS = DISCUSSION_PATHS | {
|
|
65
|
+
BOOKKEEPING_PATHS = DISCUSSION_PATHS | {
|
|
66
|
+
VERIFY_LEDGER_PATH, ".project/config.json", ".project/model-policy.json",
|
|
67
|
+
}
|
|
61
68
|
# Bookkeeping path prefixes: pipeline records plus the guard's own install
|
|
62
69
|
# artifacts. git_guard and the post-adoption proof share this one definition.
|
|
63
70
|
BOOKKEEPING_PREFIXES = (
|
|
@@ -142,8 +149,11 @@ def common_git_dir(repo: Path) -> Path:
|
|
|
142
149
|
return (repo / raw).resolve()
|
|
143
150
|
|
|
144
151
|
|
|
145
|
-
def sidecar_root(primary: Path, kind: str, name: str) -> Path:
|
|
146
|
-
|
|
152
|
+
def sidecar_root(primary: Path, kind: str, name: str, *, pin: bool = False) -> Path:
|
|
153
|
+
try:
|
|
154
|
+
return worktree_paths.worktree_path(primary, kind, name, pin=pin)
|
|
155
|
+
except (ValueError, OSError) as error:
|
|
156
|
+
raise IsolationError(str(error)) from error
|
|
147
157
|
|
|
148
158
|
|
|
149
159
|
def validate_task_id(task_id: str) -> str:
|
|
@@ -553,7 +563,7 @@ def isolate_task(
|
|
|
553
563
|
"worktree": str(primary),
|
|
554
564
|
}
|
|
555
565
|
branch = task_branch_name(task_id)
|
|
556
|
-
destination = sidecar_root(primary, "task", task_id)
|
|
566
|
+
destination = sidecar_root(primary, "task", task_id, pin=True)
|
|
557
567
|
create_named_worktree(primary, branch, destination, resolved_base)
|
|
558
568
|
return {
|
|
559
569
|
"base": resolved_base,
|
|
@@ -589,7 +599,7 @@ def isolate_verify(primary: Path, base: str, name: str, historical_task: Optiona
|
|
|
589
599
|
+ ", ".join(product_dirt)
|
|
590
600
|
)
|
|
591
601
|
branch = verify_branch_name(name)
|
|
592
|
-
destination = sidecar_root(primary, "verify", name)
|
|
602
|
+
destination = sidecar_root(primary, "verify", name, pin=True)
|
|
593
603
|
create_named_worktree(primary, branch, destination, resolved_base)
|
|
594
604
|
return {
|
|
595
605
|
"base": resolved_base,
|