@opengsd/gsd-path 1.3.1 → 1.5.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 +2 -207
- package/CHANGELOG.md +331 -69
- package/DOCS.md +25 -9
- package/FULL.md +12 -5
- package/GUIDE.md +1 -1
- package/HOOKS.md +104 -14
- package/QUICK.md +5 -2
- package/README.md +131 -111
- package/RUNTIME.md +2 -2
- package/UPDATE.md +61 -11
- package/WORKFLOW.md +44 -7
- package/package.json +13 -9
- package/platforms/shared-agents/dispatch.md +13 -0
- package/scripts/_common.py +619 -18
- package/scripts/archive_milestone.py +160 -86
- package/scripts/bootstrap_repository.py +8 -5
- package/scripts/build_recovery.py +100 -32
- package/scripts/build_state.py +143 -24
- package/scripts/check_docs_audit.py +91 -7
- package/scripts/check_handoffs.py +662 -50
- package/scripts/check_task_briefs.py +338 -30
- package/scripts/check_update.py +2 -2
- package/scripts/core_hook_gate.py +10 -1
- package/scripts/core_hook_settings.py +11 -4
- package/scripts/detect_project.py +587 -32
- package/scripts/discussion_records.py +19 -13
- package/scripts/discussion_validate.py +152 -50
- package/scripts/dispatch_driver.py +501 -46
- package/scripts/git_guard.py +118 -31
- package/scripts/guard_hook.py +1567 -194
- package/scripts/install.mjs +77 -46
- package/scripts/install.py +611 -50
- package/scripts/integration.py +580 -25
- package/scripts/isolation.py +1438 -57
- package/scripts/lean_verification.py +99 -19
- package/scripts/loop_run.py +31 -29
- package/scripts/members.py +706 -0
- package/scripts/migrate_core.py +2 -2
- package/scripts/path_config.py +5 -5
- package/scripts/pipeline_diagnose.py +82 -31
- package/scripts/pipeline_git.py +124 -34
- package/scripts/pipeline_state.py +287 -87
- package/scripts/pipeline_undo.py +218 -30
- package/scripts/promote_lookahead.py +1 -1
- package/scripts/review_panel.py +1 -1
- package/scripts/runtime_store.py +55 -11
- package/scripts/skill-resources.json +37 -5
- package/scripts/state_checkpoint.py +135 -44
- package/scripts/state_promote.py +2 -0
- package/scripts/status_runtime.py +58 -10
- package/scripts/sync_skill_resources.py +8 -7
- package/scripts/task_context.py +12 -3
- package/scripts/token_budget.py +12 -8
- package/scripts/wizard.mjs +1 -0
- package/scripts/workflow_run.py +107 -30
- package/scripts/worktree_paths.py +72 -10
- package/skills/gsd-path/BUILD.md +7 -1
- package/skills/gsd-path/DECIDE.md +11 -4
- package/skills/gsd-path/DEFINE.md +36 -4
- package/skills/gsd-path/DOCS-AUDIT.md +6 -4
- package/skills/gsd-path/INSPECT.md +5 -4
- package/skills/gsd-path/PLAN.md +18 -4
- package/skills/gsd-path/RESEARCH.md +13 -1
- package/skills/gsd-path/ROADMAP.md +2 -1
- package/skills/gsd-path/SHIP.md +33 -11
- package/skills/gsd-path/SKILL.md +45 -1
- package/skills/gsd-path/references/build-native.md +63 -15
- package/skills/gsd-path/references/codebase-mapper.md +2 -1
- package/skills/gsd-path/references/dispatch.md +13 -0
- package/skills/gsd-path/references/docs-auditor.md +7 -1
- package/skills/gsd-path/references/operating-rules.md +214 -0
- package/skills/gsd-path/references/planner.md +22 -4
- package/skills/gsd-path/references/reviewer-final.md +20 -2
- package/skills/gsd-path/references/reviewer-wave.md +18 -5
- package/skills/gsd-path/references/reviewer.md +3 -1
- package/skills/gsd-path/references/spec-probes.md +150 -0
- package/skills/gsd-path/scripts/_common.py +619 -18
- package/skills/gsd-path/scripts/archive_milestone.py +160 -86
- package/skills/gsd-path/scripts/bootstrap_repository.py +8 -5
- package/skills/gsd-path/scripts/build_recovery.py +100 -32
- package/skills/gsd-path/scripts/build_state.py +143 -24
- package/skills/gsd-path/scripts/check_docs_audit.py +91 -7
- package/skills/gsd-path/scripts/check_handoffs.py +662 -50
- package/skills/gsd-path/scripts/check_task_briefs.py +338 -30
- package/skills/gsd-path/scripts/check_update.py +2 -2
- package/skills/gsd-path/scripts/detect_project.py +587 -32
- package/skills/gsd-path/scripts/discussion_records.py +19 -13
- package/skills/gsd-path/scripts/discussion_validate.py +152 -50
- package/skills/gsd-path/scripts/dispatch_driver.py +501 -46
- package/skills/gsd-path/scripts/git_guard.py +118 -31
- package/skills/gsd-path/scripts/integration.py +580 -25
- package/skills/gsd-path/scripts/isolation.py +1438 -57
- package/skills/gsd-path/scripts/lean_verification.py +99 -19
- package/skills/gsd-path/scripts/loop_run.py +31 -29
- package/skills/gsd-path/scripts/members.py +706 -0
- package/skills/gsd-path/scripts/path_config.py +5 -5
- package/skills/gsd-path/scripts/pipeline_git.py +124 -34
- package/skills/gsd-path/scripts/pipeline_state.py +287 -87
- package/skills/gsd-path/scripts/promote_lookahead.py +1 -1
- package/skills/gsd-path/scripts/review_panel.py +1 -1
- package/skills/gsd-path/scripts/state_checkpoint.py +135 -44
- package/skills/gsd-path/scripts/state_promote.py +2 -0
- package/skills/gsd-path/scripts/status_runtime.py +58 -10
- package/skills/gsd-path/scripts/task_context.py +12 -3
- package/skills/gsd-path/scripts/token_budget.py +12 -8
- package/skills/gsd-path/scripts/workflow_run.py +107 -30
- package/skills/gsd-path/scripts/worktree_paths.py +72 -10
- package/skills/gsd-path/templates/codebase.md +1 -1
- package/skills/gsd-path/templates/docs-audit.md +6 -2
- package/skills/gsd-path/templates/final-review.md +16 -4
- package/skills/gsd-path/templates/gap-review.md +2 -1
- package/skills/gsd-path/templates/intent.md +30 -0
- package/skills/gsd-path/templates/patch-findings.md +3 -3
- package/skills/gsd-path/templates/plan.md +17 -2
- package/skills/gsd-path/templates/research-handoff.md +14 -3
- package/skills/gsd-path/templates/state.md +1 -1
- package/skills/gsd-path/templates/task.md +1 -0
- package/skills/gsd-path/templates/wave-review.md +16 -4
- package/skills/gsd-path-build/SKILL.md +7 -1
- package/skills/gsd-path-build/references/build-native.md +63 -15
- package/skills/gsd-path-build/references/dispatch.md +13 -0
- package/skills/gsd-path-build/references/operating-rules.md +214 -0
- package/skills/gsd-path-build/references/reviewer-final.md +20 -2
- package/skills/gsd-path-build/references/reviewer-wave.md +18 -5
- package/skills/gsd-path-build/references/reviewer.md +3 -1
- package/skills/gsd-path-build/references/spec-probes.md +150 -0
- package/skills/gsd-path-build/scripts/_common.py +619 -18
- package/skills/gsd-path-build/scripts/archive_milestone.py +160 -86
- package/skills/gsd-path-build/scripts/build_recovery.py +100 -32
- package/skills/gsd-path-build/scripts/build_state.py +143 -24
- package/skills/gsd-path-build/scripts/check_handoffs.py +662 -50
- package/skills/gsd-path-build/scripts/check_task_briefs.py +338 -30
- package/skills/gsd-path-build/scripts/detect_project.py +587 -32
- package/skills/gsd-path-build/scripts/discussion_records.py +19 -13
- package/skills/gsd-path-build/scripts/discussion_validate.py +152 -50
- package/skills/gsd-path-build/scripts/dispatch_driver.py +501 -46
- package/skills/gsd-path-build/scripts/integration.py +580 -25
- package/skills/gsd-path-build/scripts/isolation.py +1438 -57
- package/skills/gsd-path-build/scripts/loop_run.py +31 -29
- package/skills/gsd-path-build/scripts/members.py +706 -0
- package/skills/gsd-path-build/scripts/path_config.py +5 -5
- package/skills/gsd-path-build/scripts/pipeline_git.py +124 -34
- package/skills/gsd-path-build/scripts/pipeline_state.py +287 -87
- package/skills/gsd-path-build/scripts/promote_lookahead.py +1 -1
- package/skills/gsd-path-build/scripts/review_panel.py +1 -1
- package/skills/gsd-path-build/scripts/state_checkpoint.py +135 -44
- package/skills/gsd-path-build/scripts/state_promote.py +2 -0
- package/skills/gsd-path-build/scripts/task_context.py +12 -3
- package/skills/gsd-path-build/scripts/token_budget.py +12 -8
- package/skills/gsd-path-build/scripts/workflow_run.py +107 -30
- package/skills/gsd-path-build/scripts/worktree_paths.py +72 -10
- package/skills/gsd-path-build/templates/task.md +1 -0
- package/skills/gsd-path-build/templates/wave-review.md +16 -4
- package/skills/gsd-path-decide/SKILL.md +11 -4
- package/skills/gsd-path-decide/references/dispatch.md +13 -0
- package/skills/gsd-path-decide/references/operating-rules.md +214 -0
- package/skills/gsd-path-decide/scripts/_common.py +619 -18
- package/skills/gsd-path-decide/scripts/archive_milestone.py +160 -86
- package/skills/gsd-path-decide/scripts/build_recovery.py +100 -32
- package/skills/gsd-path-decide/scripts/check_handoffs.py +662 -50
- package/skills/gsd-path-decide/scripts/check_task_briefs.py +338 -30
- package/skills/gsd-path-decide/scripts/detect_project.py +587 -32
- package/skills/gsd-path-decide/scripts/discussion_records.py +19 -13
- package/skills/gsd-path-decide/scripts/discussion_validate.py +152 -50
- package/skills/gsd-path-decide/scripts/integration.py +580 -25
- package/skills/gsd-path-decide/scripts/isolation.py +1438 -57
- package/skills/gsd-path-decide/scripts/loop_run.py +31 -29
- package/skills/gsd-path-decide/scripts/members.py +706 -0
- package/skills/gsd-path-decide/scripts/path_config.py +5 -5
- package/skills/gsd-path-decide/scripts/pipeline_git.py +124 -34
- package/skills/gsd-path-decide/scripts/pipeline_state.py +287 -87
- package/skills/gsd-path-decide/scripts/promote_lookahead.py +1 -1
- package/skills/gsd-path-decide/scripts/review_panel.py +1 -1
- package/skills/gsd-path-decide/scripts/state_checkpoint.py +135 -44
- package/skills/gsd-path-decide/scripts/state_promote.py +2 -0
- package/skills/gsd-path-decide/scripts/worktree_paths.py +72 -10
- package/skills/gsd-path-define/SKILL.md +36 -4
- package/skills/gsd-path-define/references/operating-rules.md +214 -0
- package/skills/gsd-path-define/references/spec-probes.md +150 -0
- package/skills/gsd-path-define/scripts/_common.py +619 -18
- package/skills/gsd-path-define/scripts/archive_milestone.py +160 -86
- package/skills/gsd-path-define/scripts/build_recovery.py +100 -32
- package/skills/gsd-path-define/scripts/check_handoffs.py +662 -50
- package/skills/gsd-path-define/scripts/check_task_briefs.py +338 -30
- package/skills/gsd-path-define/scripts/detect_project.py +587 -32
- package/skills/gsd-path-define/scripts/discussion_records.py +19 -13
- package/skills/gsd-path-define/scripts/discussion_validate.py +152 -50
- package/skills/gsd-path-define/scripts/integration.py +580 -25
- package/skills/gsd-path-define/scripts/isolation.py +1438 -57
- package/skills/gsd-path-define/scripts/loop_run.py +31 -29
- package/skills/gsd-path-define/scripts/members.py +706 -0
- package/skills/gsd-path-define/scripts/path_config.py +5 -5
- package/skills/gsd-path-define/scripts/pipeline_git.py +124 -34
- package/skills/gsd-path-define/scripts/pipeline_state.py +287 -87
- package/skills/gsd-path-define/scripts/promote_lookahead.py +1 -1
- package/skills/gsd-path-define/scripts/review_panel.py +1 -1
- package/skills/gsd-path-define/scripts/state_checkpoint.py +135 -44
- package/skills/gsd-path-define/scripts/state_promote.py +2 -0
- package/skills/gsd-path-define/scripts/worktree_paths.py +72 -10
- package/skills/gsd-path-define/templates/intent.md +30 -0
- package/skills/gsd-path-define/templates/state.md +1 -1
- package/skills/gsd-path-discuss/SKILL.md +2 -1
- package/skills/gsd-path-discuss/references/operating-rules.md +214 -0
- package/skills/gsd-path-discuss/scripts/_common.py +619 -18
- package/skills/gsd-path-discuss/scripts/discussion_records.py +19 -13
- package/skills/gsd-path-discuss/scripts/loop_run.py +31 -29
- package/skills/gsd-path-discuss/scripts/path_config.py +5 -5
- package/skills/gsd-path-discuss/scripts/review_panel.py +1 -1
- package/skills/gsd-path-discuss/scripts/worktree_paths.py +72 -10
- package/skills/gsd-path-docs-audit/SKILL.md +6 -4
- package/skills/gsd-path-docs-audit/references/dispatch.md +13 -0
- package/skills/gsd-path-docs-audit/references/docs-auditor.md +7 -1
- package/skills/gsd-path-docs-audit/references/operating-rules.md +214 -0
- package/skills/gsd-path-docs-audit/scripts/_common.py +619 -18
- package/skills/gsd-path-docs-audit/scripts/archive_milestone.py +160 -86
- package/skills/gsd-path-docs-audit/scripts/build_recovery.py +100 -32
- package/skills/gsd-path-docs-audit/scripts/check_docs_audit.py +91 -7
- package/skills/gsd-path-docs-audit/scripts/check_handoffs.py +662 -50
- package/skills/gsd-path-docs-audit/scripts/check_task_briefs.py +338 -30
- package/skills/gsd-path-docs-audit/scripts/detect_project.py +587 -32
- package/skills/gsd-path-docs-audit/scripts/discussion_records.py +19 -13
- package/skills/gsd-path-docs-audit/scripts/discussion_validate.py +152 -50
- package/skills/gsd-path-docs-audit/scripts/integration.py +580 -25
- package/skills/gsd-path-docs-audit/scripts/isolation.py +1438 -57
- package/skills/gsd-path-docs-audit/scripts/loop_run.py +31 -29
- package/skills/gsd-path-docs-audit/scripts/members.py +706 -0
- package/skills/gsd-path-docs-audit/scripts/path_config.py +5 -5
- package/skills/gsd-path-docs-audit/scripts/pipeline_git.py +124 -34
- package/skills/gsd-path-docs-audit/scripts/pipeline_state.py +287 -87
- package/skills/gsd-path-docs-audit/scripts/promote_lookahead.py +1 -1
- package/skills/gsd-path-docs-audit/scripts/review_panel.py +1 -1
- package/skills/gsd-path-docs-audit/scripts/state_checkpoint.py +135 -44
- package/skills/gsd-path-docs-audit/scripts/state_promote.py +2 -0
- package/skills/gsd-path-docs-audit/scripts/worktree_paths.py +72 -10
- package/skills/gsd-path-docs-audit/templates/docs-audit.md +6 -2
- package/skills/gsd-path-forensics/SKILL.md +2 -1
- package/skills/gsd-path-forensics/references/operating-rules.md +214 -0
- package/skills/gsd-path-forensics/scripts/_common.py +619 -18
- package/skills/gsd-path-forensics/scripts/discussion_records.py +19 -13
- package/skills/gsd-path-forensics/scripts/loop_run.py +31 -29
- package/skills/gsd-path-forensics/scripts/path_config.py +5 -5
- package/skills/gsd-path-forensics/scripts/pipeline_diagnose.py +82 -31
- package/skills/gsd-path-forensics/scripts/pipeline_undo.py +218 -30
- package/skills/gsd-path-forensics/scripts/review_panel.py +1 -1
- package/skills/gsd-path-forensics/scripts/worktree_paths.py +72 -10
- package/skills/gsd-path-inspect/SKILL.md +5 -4
- package/skills/gsd-path-inspect/references/codebase-mapper.md +2 -1
- package/skills/gsd-path-inspect/references/dispatch.md +13 -0
- package/skills/gsd-path-inspect/references/docs-auditor.md +7 -1
- package/skills/gsd-path-inspect/references/operating-rules.md +214 -0
- package/skills/gsd-path-inspect/scripts/_common.py +619 -18
- package/skills/gsd-path-inspect/scripts/archive_milestone.py +160 -86
- package/skills/gsd-path-inspect/scripts/build_recovery.py +100 -32
- package/skills/gsd-path-inspect/scripts/check_docs_audit.py +91 -7
- package/skills/gsd-path-inspect/scripts/check_handoffs.py +662 -50
- package/skills/gsd-path-inspect/scripts/check_task_briefs.py +338 -30
- package/skills/gsd-path-inspect/scripts/detect_project.py +587 -32
- package/skills/gsd-path-inspect/scripts/discussion_records.py +19 -13
- package/skills/gsd-path-inspect/scripts/discussion_validate.py +152 -50
- package/skills/gsd-path-inspect/scripts/integration.py +580 -25
- package/skills/gsd-path-inspect/scripts/isolation.py +1438 -57
- package/skills/gsd-path-inspect/scripts/loop_run.py +31 -29
- package/skills/gsd-path-inspect/scripts/members.py +706 -0
- package/skills/gsd-path-inspect/scripts/path_config.py +5 -5
- package/skills/gsd-path-inspect/scripts/pipeline_git.py +124 -34
- package/skills/gsd-path-inspect/scripts/pipeline_state.py +287 -87
- package/skills/gsd-path-inspect/scripts/promote_lookahead.py +1 -1
- package/skills/gsd-path-inspect/scripts/review_panel.py +1 -1
- package/skills/gsd-path-inspect/scripts/state_checkpoint.py +135 -44
- package/skills/gsd-path-inspect/scripts/state_promote.py +2 -0
- package/skills/gsd-path-inspect/scripts/workflow_run.py +107 -30
- package/skills/gsd-path-inspect/scripts/worktree_paths.py +72 -10
- package/skills/gsd-path-inspect/templates/codebase.md +1 -1
- package/skills/gsd-path-inspect/templates/docs-audit.md +6 -2
- package/skills/gsd-path-inspect/templates/state.md +1 -1
- package/skills/gsd-path-loop/SKILL.md +2 -1
- package/skills/gsd-path-loop/references/operating-rules.md +214 -0
- package/skills/gsd-path-loop/scripts/_common.py +619 -18
- package/skills/gsd-path-loop/scripts/discussion_records.py +19 -13
- package/skills/gsd-path-loop/scripts/loop_run.py +31 -29
- package/skills/gsd-path-loop/scripts/path_config.py +5 -5
- package/skills/gsd-path-loop/scripts/review_panel.py +1 -1
- package/skills/gsd-path-loop/scripts/worktree_paths.py +72 -10
- package/skills/gsd-path-migrate/SKILL.md +2 -1
- package/skills/gsd-path-migrate/references/operating-rules.md +214 -0
- package/skills/gsd-path-migrate/scripts/_common.py +619 -18
- package/skills/gsd-path-migrate/scripts/core_hook_gate.py +10 -1
- package/skills/gsd-path-migrate/scripts/core_hook_settings.py +11 -4
- package/skills/gsd-path-migrate/scripts/discussion_records.py +19 -13
- package/skills/gsd-path-migrate/scripts/loop_run.py +31 -29
- package/skills/gsd-path-migrate/scripts/migrate_core.py +2 -2
- package/skills/gsd-path-migrate/scripts/path_config.py +5 -5
- package/skills/gsd-path-migrate/scripts/review_panel.py +1 -1
- package/skills/gsd-path-plan/SKILL.md +18 -4
- package/skills/gsd-path-plan/references/dispatch.md +13 -0
- package/skills/gsd-path-plan/references/operating-rules.md +214 -0
- package/skills/gsd-path-plan/references/planner.md +22 -4
- package/skills/gsd-path-plan/references/spec-probes.md +150 -0
- package/skills/gsd-path-plan/scripts/_common.py +619 -18
- package/skills/gsd-path-plan/scripts/archive_milestone.py +160 -86
- package/skills/gsd-path-plan/scripts/build_recovery.py +100 -32
- package/skills/gsd-path-plan/scripts/check_handoffs.py +662 -50
- package/skills/gsd-path-plan/scripts/check_task_briefs.py +338 -30
- package/skills/gsd-path-plan/scripts/detect_project.py +587 -32
- package/skills/gsd-path-plan/scripts/discussion_records.py +19 -13
- package/skills/gsd-path-plan/scripts/discussion_validate.py +152 -50
- package/skills/gsd-path-plan/scripts/integration.py +580 -25
- package/skills/gsd-path-plan/scripts/isolation.py +1438 -57
- package/skills/gsd-path-plan/scripts/loop_run.py +31 -29
- package/skills/gsd-path-plan/scripts/members.py +706 -0
- package/skills/gsd-path-plan/scripts/path_config.py +5 -5
- package/skills/gsd-path-plan/scripts/pipeline_git.py +124 -34
- package/skills/gsd-path-plan/scripts/pipeline_state.py +287 -87
- package/skills/gsd-path-plan/scripts/promote_lookahead.py +1 -1
- package/skills/gsd-path-plan/scripts/review_panel.py +1 -1
- package/skills/gsd-path-plan/scripts/state_checkpoint.py +135 -44
- package/skills/gsd-path-plan/scripts/state_promote.py +2 -0
- package/skills/gsd-path-plan/scripts/workflow_run.py +107 -30
- package/skills/gsd-path-plan/scripts/worktree_paths.py +72 -10
- package/skills/gsd-path-plan/templates/patch-findings.md +3 -3
- package/skills/gsd-path-plan/templates/plan.md +17 -2
- package/skills/gsd-path-plan/templates/task.md +1 -0
- package/skills/gsd-path-research/SKILL.md +13 -1
- package/skills/gsd-path-research/references/dispatch.md +13 -0
- package/skills/gsd-path-research/references/operating-rules.md +214 -0
- package/skills/gsd-path-research/scripts/_common.py +619 -18
- package/skills/gsd-path-research/scripts/archive_milestone.py +160 -86
- package/skills/gsd-path-research/scripts/build_recovery.py +100 -32
- package/skills/gsd-path-research/scripts/check_handoffs.py +662 -50
- package/skills/gsd-path-research/scripts/check_task_briefs.py +338 -30
- package/skills/gsd-path-research/scripts/detect_project.py +587 -32
- package/skills/gsd-path-research/scripts/discussion_records.py +19 -13
- package/skills/gsd-path-research/scripts/discussion_validate.py +152 -50
- package/skills/gsd-path-research/scripts/integration.py +580 -25
- package/skills/gsd-path-research/scripts/isolation.py +1438 -57
- package/skills/gsd-path-research/scripts/loop_run.py +31 -29
- package/skills/gsd-path-research/scripts/members.py +706 -0
- package/skills/gsd-path-research/scripts/path_config.py +5 -5
- package/skills/gsd-path-research/scripts/pipeline_git.py +124 -34
- package/skills/gsd-path-research/scripts/pipeline_state.py +287 -87
- package/skills/gsd-path-research/scripts/promote_lookahead.py +1 -1
- package/skills/gsd-path-research/scripts/review_panel.py +1 -1
- package/skills/gsd-path-research/scripts/state_checkpoint.py +135 -44
- package/skills/gsd-path-research/scripts/state_promote.py +2 -0
- package/skills/gsd-path-research/scripts/worktree_paths.py +72 -10
- package/skills/gsd-path-research/templates/research-handoff.md +14 -3
- package/skills/gsd-path-roadmap/SKILL.md +2 -1
- package/skills/gsd-path-roadmap/references/dispatch.md +13 -0
- package/skills/gsd-path-roadmap/references/operating-rules.md +214 -0
- package/skills/gsd-path-roadmap/scripts/_common.py +619 -18
- package/skills/gsd-path-roadmap/scripts/archive_milestone.py +160 -86
- package/skills/gsd-path-roadmap/scripts/build_recovery.py +100 -32
- package/skills/gsd-path-roadmap/scripts/check_handoffs.py +662 -50
- package/skills/gsd-path-roadmap/scripts/check_task_briefs.py +338 -30
- package/skills/gsd-path-roadmap/scripts/detect_project.py +587 -32
- package/skills/gsd-path-roadmap/scripts/discussion_records.py +19 -13
- package/skills/gsd-path-roadmap/scripts/discussion_validate.py +152 -50
- package/skills/gsd-path-roadmap/scripts/integration.py +580 -25
- package/skills/gsd-path-roadmap/scripts/isolation.py +1438 -57
- package/skills/gsd-path-roadmap/scripts/loop_run.py +31 -29
- package/skills/gsd-path-roadmap/scripts/members.py +706 -0
- package/skills/gsd-path-roadmap/scripts/path_config.py +5 -5
- package/skills/gsd-path-roadmap/scripts/pipeline_git.py +124 -34
- package/skills/gsd-path-roadmap/scripts/pipeline_state.py +287 -87
- package/skills/gsd-path-roadmap/scripts/promote_lookahead.py +1 -1
- package/skills/gsd-path-roadmap/scripts/review_panel.py +1 -1
- package/skills/gsd-path-roadmap/scripts/state_checkpoint.py +135 -44
- package/skills/gsd-path-roadmap/scripts/state_promote.py +2 -0
- package/skills/gsd-path-roadmap/scripts/worktree_paths.py +72 -10
- package/skills/gsd-path-ship/SKILL.md +33 -11
- package/skills/gsd-path-ship/references/dispatch.md +13 -0
- package/skills/gsd-path-ship/references/operating-rules.md +214 -0
- package/skills/gsd-path-ship/references/reviewer-final.md +20 -2
- package/skills/gsd-path-ship/references/reviewer-wave.md +18 -5
- package/skills/gsd-path-ship/references/reviewer.md +3 -1
- package/skills/gsd-path-ship/references/spec-probes.md +150 -0
- package/skills/gsd-path-ship/scripts/_common.py +619 -18
- package/skills/gsd-path-ship/scripts/archive_milestone.py +160 -86
- package/skills/gsd-path-ship/scripts/build_recovery.py +100 -32
- package/skills/gsd-path-ship/scripts/build_state.py +143 -24
- package/skills/gsd-path-ship/scripts/check_handoffs.py +662 -50
- package/skills/gsd-path-ship/scripts/check_task_briefs.py +338 -30
- package/skills/gsd-path-ship/scripts/detect_project.py +587 -32
- package/skills/gsd-path-ship/scripts/discussion_records.py +19 -13
- package/skills/gsd-path-ship/scripts/discussion_validate.py +152 -50
- package/skills/gsd-path-ship/scripts/integration.py +580 -25
- package/skills/gsd-path-ship/scripts/isolation.py +1438 -57
- package/skills/gsd-path-ship/scripts/lean_verification.py +99 -19
- package/skills/gsd-path-ship/scripts/loop_run.py +31 -29
- package/skills/gsd-path-ship/scripts/members.py +706 -0
- package/skills/gsd-path-ship/scripts/path_config.py +5 -5
- package/skills/gsd-path-ship/scripts/pipeline_git.py +124 -34
- package/skills/gsd-path-ship/scripts/pipeline_state.py +287 -87
- package/skills/gsd-path-ship/scripts/promote_lookahead.py +1 -1
- package/skills/gsd-path-ship/scripts/review_panel.py +1 -1
- package/skills/gsd-path-ship/scripts/state_checkpoint.py +135 -44
- package/skills/gsd-path-ship/scripts/state_promote.py +2 -0
- package/skills/gsd-path-ship/scripts/workflow_run.py +107 -30
- package/skills/gsd-path-ship/scripts/worktree_paths.py +72 -10
- package/skills/gsd-path-ship/templates/final-review.md +16 -4
- package/skills/gsd-path-ship/templates/gap-review.md +2 -1
- package/skills/gsd-path-ship/templates/patch-findings.md +3 -3
- package/skills/gsd-path-ship/templates/wave-review.md +16 -4
- package/skills/gsd-path-undo/SKILL.md +2 -1
- package/skills/gsd-path-undo/references/operating-rules.md +214 -0
- package/skills/gsd-path-undo/scripts/_common.py +619 -18
- package/skills/gsd-path-undo/scripts/discussion_records.py +19 -13
- package/skills/gsd-path-undo/scripts/loop_run.py +31 -29
- package/skills/gsd-path-undo/scripts/path_config.py +5 -5
- package/skills/gsd-path-undo/scripts/pipeline_undo.py +218 -30
- package/skills/gsd-path-undo/scripts/review_panel.py +1 -1
- package/skills/gsd-path-undo/scripts/worktree_paths.py +72 -10
- package/skills/path/BUILD.md +7 -1
- package/skills/path/DECIDE.md +11 -4
- package/skills/path/DEFINE.md +36 -4
- package/skills/path/DOCS-AUDIT.md +6 -4
- package/skills/path/INSPECT.md +5 -4
- package/skills/path/PLAN.md +18 -4
- package/skills/path/RESEARCH.md +13 -1
- package/skills/path/ROADMAP.md +2 -1
- package/skills/path/SHIP.md +33 -11
- package/skills/path/SKILL.md +45 -1
- package/skills/path/references/build-native.md +63 -15
- package/skills/path/references/codebase-mapper.md +2 -1
- package/skills/path/references/dispatch.md +13 -0
- package/skills/path/references/docs-auditor.md +7 -1
- package/skills/path/references/operating-rules.md +214 -0
- package/skills/path/references/planner.md +22 -4
- package/skills/path/references/reviewer-final.md +20 -2
- package/skills/path/references/reviewer-wave.md +18 -5
- package/skills/path/references/reviewer.md +3 -1
- package/skills/path/references/spec-probes.md +150 -0
- package/skills/path/scripts/_common.py +619 -18
- package/skills/path/scripts/archive_milestone.py +160 -86
- package/skills/path/scripts/bootstrap_repository.py +8 -5
- package/skills/path/scripts/build_recovery.py +100 -32
- package/skills/path/scripts/build_state.py +143 -24
- package/skills/path/scripts/check_docs_audit.py +91 -7
- package/skills/path/scripts/check_handoffs.py +662 -50
- package/skills/path/scripts/check_task_briefs.py +338 -30
- package/skills/path/scripts/check_update.py +2 -2
- package/skills/path/scripts/detect_project.py +587 -32
- package/skills/path/scripts/discussion_records.py +19 -13
- package/skills/path/scripts/discussion_validate.py +152 -50
- package/skills/path/scripts/dispatch_driver.py +501 -46
- package/skills/path/scripts/git_guard.py +118 -31
- package/skills/path/scripts/integration.py +580 -25
- package/skills/path/scripts/isolation.py +1438 -57
- package/skills/path/scripts/lean_verification.py +99 -19
- package/skills/path/scripts/loop_run.py +31 -29
- package/skills/path/scripts/members.py +706 -0
- package/skills/path/scripts/path_config.py +5 -5
- package/skills/path/scripts/pipeline_git.py +124 -34
- package/skills/path/scripts/pipeline_state.py +287 -87
- package/skills/path/scripts/promote_lookahead.py +1 -1
- package/skills/path/scripts/review_panel.py +1 -1
- package/skills/path/scripts/state_checkpoint.py +135 -44
- package/skills/path/scripts/state_promote.py +2 -0
- package/skills/path/scripts/status_runtime.py +58 -10
- package/skills/path/scripts/task_context.py +12 -3
- package/skills/path/scripts/token_budget.py +12 -8
- package/skills/path/scripts/workflow_run.py +107 -30
- package/skills/path/scripts/worktree_paths.py +72 -10
- package/skills/path/templates/codebase.md +1 -1
- package/skills/path/templates/docs-audit.md +6 -2
- package/skills/path/templates/final-review.md +16 -4
- package/skills/path/templates/gap-review.md +2 -1
- package/skills/path/templates/intent.md +30 -0
- package/skills/path/templates/patch-findings.md +3 -3
- package/skills/path/templates/plan.md +17 -2
- package/skills/path/templates/research-handoff.md +14 -3
- package/skills/path/templates/state.md +1 -1
- package/skills/path/templates/task.md +1 -0
- package/skills/path/templates/wave-review.md +16 -4
- 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-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-inspect/scripts/__pycache__/_common.cpython-312.pyc +0 -0
- package/skills/gsd-path-plan/scripts/__pycache__/_common.cpython-312.pyc +0 -0
- package/skills/gsd-path-ship/scripts/__pycache__/_common.cpython-312.pyc +0 -0
|
@@ -12,6 +12,9 @@ def main():
|
|
|
12
12
|
parser = argparse.ArgumentParser(description=__doc__)
|
|
13
13
|
parser.add_argument("--repo", required=True, action="append", type=Path)
|
|
14
14
|
parser.add_argument("--command", required=True)
|
|
15
|
+
# Windows wrappers record bash: the host ran the original through Git Bash,
|
|
16
|
+
# and shell=True would run it through cmd.exe instead.
|
|
17
|
+
parser.add_argument("--shell", choices=("bash",))
|
|
15
18
|
args = parser.parse_args()
|
|
16
19
|
payload = sys.stdin.buffer.read()
|
|
17
20
|
try:
|
|
@@ -26,7 +29,13 @@ def main():
|
|
|
26
29
|
except (OSError, ValueError, RuntimeError):
|
|
27
30
|
# An uncertain event keeps the original hook's protection and errors.
|
|
28
31
|
pass
|
|
29
|
-
|
|
32
|
+
if args.shell == "bash":
|
|
33
|
+
sys.path.insert(0, str(Path(__file__).resolve().parent))
|
|
34
|
+
import _common
|
|
35
|
+
|
|
36
|
+
result = subprocess.run(_common.bash_argv(args.command), input=payload)
|
|
37
|
+
else:
|
|
38
|
+
result = subprocess.run(args.command, shell=True, input=payload)
|
|
30
39
|
return result.returncode if result.returncode >= 0 else 128 - result.returncode
|
|
31
40
|
|
|
32
41
|
|
|
@@ -8,7 +8,6 @@ import os
|
|
|
8
8
|
from pathlib import Path
|
|
9
9
|
import shlex
|
|
10
10
|
import stat
|
|
11
|
-
import subprocess
|
|
12
11
|
import sys
|
|
13
12
|
import tempfile
|
|
14
13
|
|
|
@@ -47,8 +46,15 @@ def plan(args):
|
|
|
47
46
|
gate = Path(__file__).resolve().with_name("core_hook_gate.py")
|
|
48
47
|
if not gate.is_file():
|
|
49
48
|
raise ValueError(f"missing installed hook gate: {gate}")
|
|
50
|
-
|
|
51
|
-
|
|
49
|
+
if os.name == "nt":
|
|
50
|
+
# Claude Code runs Windows hook commands in Git Bash: quote for bash,
|
|
51
|
+
# use forward slashes, and have the gate run the original through bash
|
|
52
|
+
# rather than cmd.exe.
|
|
53
|
+
argv = [Path(sys.executable).as_posix(), "-B", gate.as_posix(), "--repo", repo.as_posix(),
|
|
54
|
+
"--shell", "bash", "--command", original]
|
|
55
|
+
else:
|
|
56
|
+
argv = [sys.executable, "-B", str(gate), "--repo", str(repo), "--command", original]
|
|
57
|
+
replacement = shlex.join(argv)
|
|
52
58
|
entry["command"] = replacement
|
|
53
59
|
after = (json.dumps(data, indent=2) + "\n").encode()
|
|
54
60
|
receipt = {
|
|
@@ -60,7 +66,8 @@ def plan(args):
|
|
|
60
66
|
"after": base64.b64encode(after).decode(),
|
|
61
67
|
}
|
|
62
68
|
# Settings may contain secrets; the review/rollback copy is owner-only.
|
|
63
|
-
with open(args.receipt, "x", encoding="utf-8",
|
|
69
|
+
with open(args.receipt, "x", encoding="utf-8", newline="\n",
|
|
70
|
+
opener=lambda path, flags: os.open(path, flags, 0o600)) as handle:
|
|
64
71
|
json.dump(receipt, handle, indent=2)
|
|
65
72
|
handle.write("\n")
|
|
66
73
|
return {"status": "planned", "receipt": str(args.receipt.absolute())}
|
|
@@ -16,14 +16,20 @@ from pathlib import Path
|
|
|
16
16
|
from typing import Iterator, Optional, Sequence
|
|
17
17
|
|
|
18
18
|
def _load_pipeline_modules():
|
|
19
|
-
|
|
20
|
-
import archive_milestone
|
|
21
|
-
import pipeline_state
|
|
22
|
-
import _common
|
|
19
|
+
if __package__:
|
|
20
|
+
from . import archive_milestone
|
|
21
|
+
from . import pipeline_state
|
|
22
|
+
from . import _common
|
|
23
23
|
return _common, archive_milestone, pipeline_state
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
24
|
+
else:
|
|
25
|
+
try:
|
|
26
|
+
import archive_milestone
|
|
27
|
+
import pipeline_state
|
|
28
|
+
import _common
|
|
29
|
+
return _common, archive_milestone, pipeline_state
|
|
30
|
+
except ModuleNotFoundError as error:
|
|
31
|
+
if error.name not in {"archive_milestone", "pipeline_state", "_common"}:
|
|
32
|
+
raise
|
|
27
33
|
try:
|
|
28
34
|
from scripts import archive_milestone, pipeline_state, _common
|
|
29
35
|
return _common, archive_milestone, pipeline_state
|
|
@@ -111,7 +117,7 @@ def record_count(directory: Path) -> int:
|
|
|
111
117
|
def validate_or_empty(directory: Path) -> None:
|
|
112
118
|
if directory.is_symlink() or not directory.is_dir():
|
|
113
119
|
raise DiscussionError("discussion records must be a real directory")
|
|
114
|
-
if sorted(path.name for path in directory.iterdir()) != sorted(FILES):
|
|
120
|
+
if sorted(path.name for path in directory.iterdir() if not _common.is_ignored_junk(path)) != sorted(FILES):
|
|
115
121
|
raise DiscussionError("discussion directory must contain exactly DIALOGUE.md and ANSWERS.md")
|
|
116
122
|
if record_count(directory) == 0:
|
|
117
123
|
if "### D" in (directory / "DIALOGUE.md").read_text(encoding="utf-8"):
|
|
@@ -170,7 +176,7 @@ def validate_contents(project: Path, files: dict) -> None:
|
|
|
170
176
|
staging.mkdir()
|
|
171
177
|
try:
|
|
172
178
|
for name in FILES:
|
|
173
|
-
(staging / name).
|
|
179
|
+
(staging / name).write_bytes(files[name].encode("utf-8"))
|
|
174
180
|
validate_or_empty(staging)
|
|
175
181
|
finally:
|
|
176
182
|
shutil.rmtree(staging)
|
|
@@ -187,11 +193,11 @@ def initialize_records(discussion: Path, dialogue_template: Path, answers_templa
|
|
|
187
193
|
shutil.rmtree(staging)
|
|
188
194
|
staging.mkdir()
|
|
189
195
|
try:
|
|
190
|
-
(staging / "DIALOGUE.md").
|
|
191
|
-
template_header(dialogue_template, "### D001")
|
|
196
|
+
(staging / "DIALOGUE.md").write_bytes(
|
|
197
|
+
template_header(dialogue_template, "### D001").encode("utf-8")
|
|
192
198
|
)
|
|
193
|
-
(staging / "ANSWERS.md").
|
|
194
|
-
template_header(answers_template, "## Answer A001")
|
|
199
|
+
(staging / "ANSWERS.md").write_bytes(
|
|
200
|
+
template_header(answers_template, "## Answer A001").encode("utf-8")
|
|
195
201
|
)
|
|
196
202
|
os.replace(staging, discussion)
|
|
197
203
|
finally:
|
|
@@ -32,10 +32,10 @@ from datetime import datetime, timedelta, timezone
|
|
|
32
32
|
from pathlib import Path
|
|
33
33
|
from typing import Iterator, Optional, Sequence
|
|
34
34
|
|
|
35
|
-
|
|
36
|
-
import
|
|
37
|
-
|
|
38
|
-
import
|
|
35
|
+
try:
|
|
36
|
+
from . import _common
|
|
37
|
+
except ImportError:
|
|
38
|
+
import _common
|
|
39
39
|
|
|
40
40
|
|
|
41
41
|
class LoopError(RuntimeError):
|
|
@@ -119,25 +119,8 @@ def log_path(fields: dict) -> Path:
|
|
|
119
119
|
def log_lock(fields: dict) -> Iterator[None]:
|
|
120
120
|
path = log_path(fields)
|
|
121
121
|
path.parent.mkdir(parents=True, exist_ok=True)
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
if sys.platform == "win32":
|
|
125
|
-
handle.seek(0, os.SEEK_END)
|
|
126
|
-
if handle.tell() == 0:
|
|
127
|
-
handle.write(b"\0")
|
|
128
|
-
handle.flush()
|
|
129
|
-
handle.seek(0)
|
|
130
|
-
msvcrt.locking(handle.fileno(), msvcrt.LK_LOCK, 1)
|
|
131
|
-
else:
|
|
132
|
-
fcntl.flock(handle.fileno(), fcntl.LOCK_EX)
|
|
133
|
-
try:
|
|
134
|
-
yield
|
|
135
|
-
finally:
|
|
136
|
-
if sys.platform == "win32":
|
|
137
|
-
handle.seek(0)
|
|
138
|
-
msvcrt.locking(handle.fileno(), msvcrt.LK_UNLCK, 1)
|
|
139
|
-
else:
|
|
140
|
-
fcntl.flock(handle.fileno(), fcntl.LOCK_UN)
|
|
122
|
+
with _common.exclusive_lock(path.with_name(f".{path.name}.lock")):
|
|
123
|
+
yield
|
|
141
124
|
|
|
142
125
|
|
|
143
126
|
def load_log(fields: dict) -> list[dict]:
|
|
@@ -528,15 +511,34 @@ def command_claim(fields: dict) -> dict:
|
|
|
528
511
|
|
|
529
512
|
|
|
530
513
|
def run_shell(command: str, timeout: float) -> tuple[Optional[int], str]:
|
|
531
|
-
"""Run one spec command; a hung command counts as failed (exit None).
|
|
514
|
+
"""Run one spec command; a hung command counts as failed (exit None).
|
|
515
|
+
|
|
516
|
+
POSIX runs /bin/sh as shell=True did; Windows runs Git for Windows bash, not
|
|
517
|
+
cmd.exe. A timeout kills the whole process group when possible; if output
|
|
518
|
+
pipes stay open, drain them with a short grace timeout and then close them.
|
|
519
|
+
"""
|
|
520
|
+
argv = _common.bash_argv(command) if os.name == "nt" else ["/bin/sh", "-c", command]
|
|
521
|
+
process = _common.popen_group(argv, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
|
|
522
|
+
stdout = b""
|
|
523
|
+
stderr = b""
|
|
532
524
|
try:
|
|
533
|
-
|
|
534
|
-
command, shell=True, capture_output=True, text=True, check=False, timeout=timeout
|
|
535
|
-
)
|
|
525
|
+
stdout, stderr = process.communicate(timeout=timeout)
|
|
536
526
|
except subprocess.TimeoutExpired as expired:
|
|
537
|
-
|
|
527
|
+
_common.kill_tree(process)
|
|
528
|
+
try:
|
|
529
|
+
stdout, stderr = process.communicate(timeout=5)
|
|
530
|
+
except subprocess.TimeoutExpired as drained:
|
|
531
|
+
stdout = drained.stdout or expired.stdout or b""
|
|
532
|
+
stderr = drained.stderr or expired.stderr or b""
|
|
533
|
+
if process.stdout:
|
|
534
|
+
process.stdout.close()
|
|
535
|
+
if process.stderr:
|
|
536
|
+
process.stderr.close()
|
|
537
|
+
process.kill()
|
|
538
|
+
process.wait(timeout=5)
|
|
539
|
+
output = stdout.decode("utf-8", errors="replace") + stderr.decode("utf-8", errors="replace")
|
|
538
540
|
return None, f"{output}\ntimed out at the admitted wall-clock deadline"
|
|
539
|
-
return
|
|
541
|
+
return process.returncode, (stdout + stderr).decode("utf-8", errors="replace")
|
|
540
542
|
|
|
541
543
|
|
|
542
544
|
def command_verify(fields: dict, claim_identifier: Optional[str]) -> dict:
|
|
@@ -119,8 +119,8 @@ def prepare(repo, output, files, manifest):
|
|
|
119
119
|
target.parent.mkdir(parents=True, exist_ok=True)
|
|
120
120
|
target.write_bytes(content)
|
|
121
121
|
manifest = dict(manifest, status="prepared", output=str(output))
|
|
122
|
-
(output / "manifest.json").
|
|
123
|
-
json.dumps(manifest, indent=2) + "\n"
|
|
122
|
+
(output / "manifest.json").write_bytes(
|
|
123
|
+
(json.dumps(manifest, indent=2) + "\n").encode("utf-8")
|
|
124
124
|
)
|
|
125
125
|
except BaseException:
|
|
126
126
|
shutil.rmtree(output)
|
|
@@ -13,7 +13,7 @@ sys.dont_write_bytecode = True
|
|
|
13
13
|
ROLES = ('coder', 'reviewer', 'review_panel', 'skeptic', 'inspect_codebase',
|
|
14
14
|
'inspect_docs', 'docs_audit', 'research', 'decide', 'roadmap', 'plan', 'plan_patch')
|
|
15
15
|
HOSTS = ('codex', 'claude', 'grok', 'opencode', 'copilot', 'qwen', 'antigravity',
|
|
16
|
-
'cursor', 'zed', 'kiro', 'kimi')
|
|
16
|
+
'cursor', 'zed', 'kiro', 'kimi', 'muse')
|
|
17
17
|
|
|
18
18
|
|
|
19
19
|
def sibling(name):
|
|
@@ -73,8 +73,8 @@ def validate_value(key, value):
|
|
|
73
73
|
if not isinstance(value, str) or not value or value != value.strip():
|
|
74
74
|
raise ValueError(f'{key} requires a nonempty string')
|
|
75
75
|
if key == 'integration':
|
|
76
|
-
if value not in ('direct', 'pull-request'):
|
|
77
|
-
raise ValueError('integration must be direct or
|
|
76
|
+
if value not in ('direct', 'pull-request', 'external-landing'):
|
|
77
|
+
raise ValueError('integration must be direct, pull-request, or external-landing')
|
|
78
78
|
elif key == 'review_panel':
|
|
79
79
|
if any(char.isspace() for char in value):
|
|
80
80
|
raise ValueError('use off, detected, or comma-separated families without spaces')
|
|
@@ -174,13 +174,13 @@ def set_value(repo, scope, key, value, reset=False):
|
|
|
174
174
|
if scope == 'project':
|
|
175
175
|
state, _, _ = sibling('pipeline_state').load_state(repo)
|
|
176
176
|
branch = subprocess.run(['git', '-C', str(repo), 'branch', '--show-current'],
|
|
177
|
-
capture_output=True,
|
|
177
|
+
capture_output=True, encoding="utf-8", errors="replace")
|
|
178
178
|
if branch.returncode or not state.branch or branch.stdout.strip() != state.branch:
|
|
179
179
|
raise ValueError('Run the router to bind the project branch before editing settings.')
|
|
180
180
|
head = subprocess.run(['git', '-C', str(repo), 'rev-parse', '--verify', 'HEAD'], capture_output=True)
|
|
181
181
|
if head.returncode == 0:
|
|
182
182
|
closed = subprocess.run([sys.executable, '-B', str(Path(__file__).with_name('git_guard.py')),
|
|
183
|
-
'closed-milestone'], cwd=repo, capture_output=True,
|
|
183
|
+
'closed-milestone'], cwd=repo, capture_output=True, encoding="utf-8", errors="replace")
|
|
184
184
|
if closed.returncode:
|
|
185
185
|
raise ValueError(closed.stderr.strip() or 'Cannot verify the milestone branch is open.')
|
|
186
186
|
if scope == 'project' and key == 'integration':
|
|
@@ -470,7 +470,7 @@ def merge_artifacts(
|
|
|
470
470
|
lines.append(artifact["text"].rstrip())
|
|
471
471
|
lines.append("")
|
|
472
472
|
output.parent.mkdir(parents=True, exist_ok=True)
|
|
473
|
-
output.
|
|
473
|
+
output.write_bytes(("\n".join(lines).rstrip() + "\n").encode("utf-8"))
|
|
474
474
|
return {
|
|
475
475
|
"output": str(output.resolve()),
|
|
476
476
|
"families": families,
|
|
@@ -3,7 +3,8 @@ name: gsd-path-plan
|
|
|
3
3
|
description: Create and validate dependency-ordered GSD Path build waves and complete task contracts. Use only when the user explicitly invokes $gsd-path-plan or an active $gsd-path router explicitly routes to this phase.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
Before executing project helpers, read [runtime selection](references/runtime-selection.md)
|
|
6
|
+
Before executing project helpers, read [runtime selection](references/runtime-selection.md)
|
|
7
|
+
and [operating rules](references/operating-rules.md).
|
|
7
8
|
|
|
8
9
|
# GSD Path Planning Phase
|
|
9
10
|
|
|
@@ -114,9 +115,10 @@ as stated in Lookahead mode.
|
|
|
114
115
|
In patch mode, tasks already `done` keep their landed metadata; only
|
|
115
116
|
the appended patch tasks must start clean.
|
|
116
117
|
- Require every dependency id to exist, forbid later-wave dependencies,
|
|
117
|
-
detect cycles, and forbid file overlap between planned tasks
|
|
118
|
-
wave. Same-wave
|
|
119
|
-
|
|
118
|
+
detect cycles, and forbid unordered file overlap between planned tasks
|
|
119
|
+
in the same wave. Same-wave tasks may share files only when one
|
|
120
|
+
transitively depends on the other through `deps`; the build executes
|
|
121
|
+
them in dependency layers.
|
|
120
122
|
- Reject a declared dependency that carries neither data nor a prerequisite
|
|
121
123
|
effect. A `deps` edge is valid only when the dependent consumes a symbol,
|
|
122
124
|
signature, schema, endpoint, file format, or path named in that
|
|
@@ -156,6 +158,13 @@ as stated in Lookahead mode.
|
|
|
156
158
|
command's output — not an internal unit test.
|
|
157
159
|
Require the surface to land in the same wave as the capability behind
|
|
158
160
|
it, never in a later polish wave.
|
|
161
|
+
- When INTENT.md has `## Edge coverage`, require a PLAN.md
|
|
162
|
+
`## Held-out checks` row for every `held-out` edge and for no other
|
|
163
|
+
edge. The named test is in that task's `files`, the task's Verify runs
|
|
164
|
+
it, and the task's Acceptance criteria state the edge id and its ruling
|
|
165
|
+
(see [spec-reach probes](references/spec-probes.md)). An edge or
|
|
166
|
+
prohibition ruled `criterion SCn` needs no extra row; it is covered as
|
|
167
|
+
SCn. Put each `judgment` prohibition in its owning task's Approach.
|
|
159
168
|
- Prove every intent constraint and synthesis decision is covered, that no
|
|
160
169
|
scope-out veto appears in a task, and that `Project verify` is a real,
|
|
161
170
|
non-placeholder command in PLAN.md. Every Verify — task and project —
|
|
@@ -226,6 +235,11 @@ as stated in Lookahead mode.
|
|
|
226
235
|
Before asking for approval, require exactly one panel artifact for non-off
|
|
227
236
|
Config: `PLAN-PANEL.md` for `ready`, or `PLAN-PANEL.skipped.json` for
|
|
228
237
|
`skipped`. Off Config requires neither. A mismatch blocks approval.
|
|
238
|
+
When the active router recorded a `plan` pre-approval grant, first run
|
|
239
|
+
`python3 <absolute workflow_run.py> preauthorize --repo <absolute root>
|
|
240
|
+
--kind plan`. On `complete`, present Outcome and Review, say the owner's
|
|
241
|
+
pre-approval passed this gate, and continue at step 6 as approved. On
|
|
242
|
+
`blocked`, ask as below.
|
|
229
243
|
Ask one explicit next question: whether to approve this plan and start the
|
|
230
244
|
build. When PLAN-PANEL.md has `Actionable: 0` or the panel did not run,
|
|
231
245
|
list `Approve and start build (recommended)` first, with `Request changes`
|
|
@@ -44,6 +44,19 @@ use exactly one matching branch:
|
|
|
44
44
|
create another worktree. Encode task dependencies explicitly; launch
|
|
45
45
|
independent children concurrently up to the host's advertised
|
|
46
46
|
concurrent-subagent capacity.
|
|
47
|
+
- A `muse.subagent_spawn` tool (with `muse.subagent_wait`,
|
|
48
|
+
`muse.subagent_read_result`, and `muse.subagent_send_message` siblings) is
|
|
49
|
+
Muse Code. Omit `subagent_type` (general-purpose, full capability), pass the
|
|
50
|
+
logical task name as `task_name` and `role`, and the complete brief as
|
|
51
|
+
`objective`. Never set `worktree_isolation`. Keep the returned
|
|
52
|
+
`subagent_id`; send a correction to a still-live child with
|
|
53
|
+
`muse.subagent_send_message` mode `followup` and the complete new prompt,
|
|
54
|
+
otherwise start a fresh child. Collect with `muse.subagent_wait`
|
|
55
|
+
(`wait_for: task_terminal`) then `muse.subagent_read_result`; on
|
|
56
|
+
`root_capacity_exhausted`, wait for a child to finish and retry. Spawn has no
|
|
57
|
+
model or effort argument, so record no such capability. If only
|
|
58
|
+
`muse.workflow` is exposed (untrusted workspace), do not script or inline
|
|
59
|
+
the work; stop and report that the workspace must be trusted.
|
|
47
60
|
|
|
48
61
|
For every branch:
|
|
49
62
|
|
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
# Operating rules for phase work
|
|
2
|
+
|
|
3
|
+
These rules extend the project `AGENTS.md` block. Every GSD Path skill
|
|
4
|
+
bundles this file; spawned agents follow their role brief instead.
|
|
5
|
+
|
|
6
|
+
## Files and state
|
|
7
|
+
|
|
8
|
+
- `.project/discuss/DIALOGUE.md` and `.project/discuss/ANSWERS.md` are the
|
|
9
|
+
append-only memory for any-phase discussion. Read them before continuing an
|
|
10
|
+
existing thread; never treat chat history alone as durable context.
|
|
11
|
+
- The discussion skill never commits. Every phase orchestrator treats only
|
|
12
|
+
complete append-only discussion records as expected bookkeeping and includes
|
|
13
|
+
them in its next normal `.project/` checkpoint; build does so before its next
|
|
14
|
+
clean layer base, and ship includes them in its transaction.
|
|
15
|
+
- Write every output to the handoff path in WORKFLOW.md, using the absolute
|
|
16
|
+
bundled template path supplied by the active phase skill. An output that
|
|
17
|
+
needs verbal explanation is defective.
|
|
18
|
+
- With no `.project/STATE.md`, route through the bundled
|
|
19
|
+
`scripts/detect_project.py initialize --repo <absolute-root> --template
|
|
20
|
+
<absolute-state-template> --require-git` helper; `route: setup-repository`
|
|
21
|
+
leaves the invocation folder unchanged and routes to repository setup before
|
|
22
|
+
state creation or branch binding. Never delete the invocation folder or its
|
|
23
|
+
state to satisfy bootstrap path checks. Do not classify from a directory listing
|
|
24
|
+
or conversation. Follow its JSON `verdict` and `route`. Reserve `classify`
|
|
25
|
+
for read-only inspection; do not use it as a state-initialization preflight.
|
|
26
|
+
- `.project/STATE.md` tracks phase position. Parse and validate it only with
|
|
27
|
+
the bundled `scripts/pipeline_state.py validate` command, route with its
|
|
28
|
+
`route` command, and make ordinary phase transitions only with its
|
|
29
|
+
expected-state `transition`. A journaled transaction helper may write only
|
|
30
|
+
the state fields its contract explicitly owns. Never reproduce these
|
|
31
|
+
deterministic operations in model reasoning. The
|
|
32
|
+
orchestrator alone owns task frontmatter base, isolated worktree/branch,
|
|
33
|
+
status, and agent; the landing commit is proven from git by `isolation.py
|
|
34
|
+
recover`, never recorded. Require `pipeline: gsd-path/v2`; never
|
|
35
|
+
consume an ambiguous or differently owned state file. Artifacts outrank
|
|
36
|
+
summaries; reconcile STATE.md when it disagrees with task frontmatter.
|
|
37
|
+
During a program build, `.project/next/STATE.md` may hold
|
|
38
|
+
the lookahead planning track for the next milestone; it follows the same
|
|
39
|
+
marker rule, owns no task frontmatter, and never binds a branch.
|
|
40
|
+
- STATE.integration_default is the project closeout choice and
|
|
41
|
+
STATE.integration is the current milestone choice. Both are `direct` or
|
|
42
|
+
`pull-request`; STATE.integration_source is `default` or `milestone` and
|
|
43
|
+
preserves explicit override provenance. Older v2 state defaults to `direct`,
|
|
44
|
+
and modes may be changed only through `pipeline_state.py
|
|
45
|
+
configure-integration` before build. A next milestone resets its current
|
|
46
|
+
choice from the project default.
|
|
47
|
+
- Spawned agents have isolated context. Follow the installed runtime dispatch
|
|
48
|
+
contract and brief them with exact input and output paths, constraints, a
|
|
49
|
+
deterministic logical task name, and a bounded responsibility. Independent
|
|
50
|
+
briefs may run in parallel up to available child capacity; a dependent
|
|
51
|
+
brief runs as soon as its dependencies complete.
|
|
52
|
+
|
|
53
|
+
## Stay in role
|
|
54
|
+
|
|
55
|
+
- The codebase mapper and docs auditor observe and verify; they are strictly
|
|
56
|
+
read-only, report observations rather than judgments, and never resolve a
|
|
57
|
+
doc-vs-code conflict — that ruling belongs to the user.
|
|
58
|
+
- Build, test, lint, and help commands are not presumed read-safe. Read-only
|
|
59
|
+
roles run project commands only in orchestrator-created disposable worktrees
|
|
60
|
+
at a recorded revision; otherwise they use static evidence or mark the check
|
|
61
|
+
unverifiable. They never create worktrees or run commands in the source tree.
|
|
62
|
+
- Researchers gather evidence; they do not decide. A dimension is researched
|
|
63
|
+
only when it has open questions; the research phase records dispatched and
|
|
64
|
+
skipped dimensions. Brownfield adds `evidence-codebase.md` as settled input.
|
|
65
|
+
- The decider works from existing evidence; it does not re-research. An
|
|
66
|
+
unresolved or uncited required decision fails the synthesis gate.
|
|
67
|
+
- The planner reads both INTENT.md and SYNTHESIS.md and specs
|
|
68
|
+
deliverable-sized outcomes and constraints; every INTENT success criterion
|
|
69
|
+
maps to a task AC and Verify in PLAN.md Intent coverage. Coders own
|
|
70
|
+
implementation decisions inside those bounds.
|
|
71
|
+
- Coders implement only their full task contract, including owned INTENT
|
|
72
|
+
success criteria read from INTENT.md, and append their result to the
|
|
73
|
+
task Log. They never change task state, review acceptance, stage, commit, or
|
|
74
|
+
freelance outside declared files.
|
|
75
|
+
- The orchestrator dispatches, arbitrates, and creates task isolation and
|
|
76
|
+
verify sidecars through the bundled `scripts/isolation.py` helper — named
|
|
77
|
+
branches only, never a detached HEAD — lands task work serially, and
|
|
78
|
+
records each clean base in task frontmatter; `land` stamps the landed
|
|
79
|
+
state into the task's own commit, so a task has exactly one commit. It
|
|
80
|
+
writes no product code. When a done task's work already sits on the bound
|
|
81
|
+
branch without a landing commit, only an explicit owner ruling through
|
|
82
|
+
`isolation.py attest` may stand in for it: one `.project/`-only commit that
|
|
83
|
+
names the base, the attested HEAD, the declared files that changed, the
|
|
84
|
+
task Verify recorded as passing at that HEAD, and the ruling verbatim.
|
|
85
|
+
`recover` reports it as `attested`, never as a proven landing.
|
|
86
|
+
- All pipeline work for a milestone lives on `gsd-path/M00N` (M001, M002,
|
|
87
|
+
…) bound in STATE.branch. The next milestone binds a new unused
|
|
88
|
+
`gsd-path/M00N` at the remote default after the previous ship integrates.
|
|
89
|
+
Integration at ship is the only path from the bound branch to the default
|
|
90
|
+
branch — either Path's direct merge or a Path-owned PR merged by the user.
|
|
91
|
+
The bound branch never receives merges or back-merges and is never the
|
|
92
|
+
GitHub default.
|
|
93
|
+
- After initialization writes STATE.md, and before entering the first pipeline
|
|
94
|
+
phase in an existing Git repository, the router calls
|
|
95
|
+
`scripts/pipeline_git.py bind-initial` with the selected M00N and exact
|
|
96
|
+
fetched `origin/main` SHA. The helper alone checks worktree identity and
|
|
97
|
+
cleanliness, exact base, and every local, remote, and other-worktree
|
|
98
|
+
collision before creating or adopting the branch. The sole cleanliness
|
|
99
|
+
exception is untracked `.project/STATE.md`: validated v2 state in active
|
|
100
|
+
inspect or define, with null milestone, branch, and archive, in a real
|
|
101
|
+
directory containing only that regular file with no hard links. The helper
|
|
102
|
+
checks its identity and bytes across binding. Do not commit initialization
|
|
103
|
+
before binding. The router persists its
|
|
104
|
+
typed result in the new state. Build has no branch-creation authority.
|
|
105
|
+
- After `validate-integrated` passes and before any next-milestone file
|
|
106
|
+
changes, the router calls the bundled `scripts/pipeline_git.py bind-next`
|
|
107
|
+
helper with the previous bound branch, exact ship SHA, and exact current
|
|
108
|
+
`origin/main` SHA. The helper moves the clean primary worktree to the new
|
|
109
|
+
unused `gsd-path/M00N` branch at that SHA without moving the previous
|
|
110
|
+
branch or entering the default checkout, then retires the integrated
|
|
111
|
+
previous branch — deleted locally and on origin; the ship commit stays
|
|
112
|
+
reachable from the integration merge and its annotated tag. The router
|
|
113
|
+
persists the new branch in STATE; a wrong-SHA or colliding branch blocks.
|
|
114
|
+
After validated PR integration, `bind-next --allow-missing-previous` may
|
|
115
|
+
retire only the local previous branch when GitHub already auto-deleted its
|
|
116
|
+
remote branch.
|
|
117
|
+
`bind-initial`, this handoff, and the approved new-repository bootstrap are
|
|
118
|
+
the only bound-branch creation authorities, and the handoff's retirement
|
|
119
|
+
push is the router's only bound-branch deletion authority. When a lookahead
|
|
120
|
+
track exists, the router then calls `scripts/pipeline_state.py promote-next`;
|
|
121
|
+
only that journaled helper moves the track, updates state and roadmap,
|
|
122
|
+
classifies plan drift, and writes the router promotion commit.
|
|
123
|
+
- Build adopts the branch recorded in STATE.branch, never whatever is current
|
|
124
|
+
when a recorded branch exists. A new-GitHub REPOSITORY.md proves the
|
|
125
|
+
default checkout and first bound branch; later milestones may rebind
|
|
126
|
+
`gsd-path/M00N` without rewriting that artifact. Build ignores older
|
|
127
|
+
milestone ship and integrate commits inherited through main. A ship commit
|
|
128
|
+
for the current STATE.branch milestone must be an ancestor of origin/main;
|
|
129
|
+
if it is not, that milestone's integration is incomplete and control routes
|
|
130
|
+
to ship, not build. Direct mode requires the matching canonical `integrate:`
|
|
131
|
+
commit; PR mode requires tag metadata and a two-parent merge whose second
|
|
132
|
+
parent is the ship commit. A null branch returns
|
|
133
|
+
to the router; build never creates, selects, switches, or rebinds it.
|
|
134
|
+
- The ship phase makes exactly one commit on the bound branch — the
|
|
135
|
+
`.project/`-only ship commit recording
|
|
136
|
+
STATE.md, the final-review artifacts, and the archive — and additionally
|
|
137
|
+
owns the integration leg. Direct mode creates and pushes one `--no-ff` merge
|
|
138
|
+
onto `main` with subject
|
|
139
|
+
`integrate: M00N — merge gsd-path/M00N into main`. Pull-request mode creates
|
|
140
|
+
or reuses one GitHub.com PR and waits for the user to merge it with a merge
|
|
141
|
+
commit; it never auto-merges. Both modes create one annotated
|
|
142
|
+
`milestone/<NNN>-<slug>` tag after merge validation.
|
|
143
|
+
The roadmap and
|
|
144
|
+
plan phases each make exactly one approval checkpoint commit
|
|
145
|
+
(`.project/`-only, deferred to the build transition commit during a
|
|
146
|
+
new-repository transaction or before Git exists). Their bundled
|
|
147
|
+
`pipeline_state.py approve` command journals before changing STATE or
|
|
148
|
+
ROADMAP.md and owns that canonical checkpoint; a routed
|
|
149
|
+
`resume-checkpoint` must finish before phase work. The router makes one
|
|
150
|
+
bookkeeping commit through `pipeline_state.py promote-next` when promoting a
|
|
151
|
+
lookahead track at a milestone boundary. Every other commit belongs to the
|
|
152
|
+
orchestrator.
|
|
153
|
+
- Reviewers verify and block; they never fix. A block names the criterion,
|
|
154
|
+
observed result, evidence location, and concrete fix direction. An optional
|
|
155
|
+
review panel is advisory: the canonical reviewer remains the only wave
|
|
156
|
+
pass/fail, and panel findings never average or auto-replan. Same-model
|
|
157
|
+
agreement is not independent verification: matching verdicts from one
|
|
158
|
+
model family count as a single evidence path. Independence comes from
|
|
159
|
+
re-run commands, reconstructed patches, different sources, or a
|
|
160
|
+
different model family. Resolve panel
|
|
161
|
+
membership with the bundled `scripts/review_panel.py` helper; do not invent
|
|
162
|
+
model families or slugs. Create task isolation and verify sidecars with the
|
|
163
|
+
bundled `scripts/isolation.py` helper; do not invent `git worktree add` or
|
|
164
|
+
`--detach`. Undo unpublished pipeline work with `scripts/pipeline_undo.py`;
|
|
165
|
+
do not invent `git reset`. Diagnose a stuck pipeline with
|
|
166
|
+
`scripts/pipeline_diagnose.py`.
|
|
167
|
+
- A bundled helper that exits non-zero stops the current step. Print its
|
|
168
|
+
stderr verbatim, run `scripts/pipeline_diagnose.py diagnose --repo
|
|
169
|
+
<absolute-root>` (bundled with `$gsd-path-forensics`), and report both.
|
|
170
|
+
Do not rerun the same command unchanged unless the helper's own contract
|
|
171
|
+
names that exact rerun as its interruption recovery. Never repair state or
|
|
172
|
+
Git by hand instead.
|
|
173
|
+
- The discussion sidecar may run during any non-shipped phase. It grounds
|
|
174
|
+
answers in code and phase artifacts, may perform focused research when
|
|
175
|
+
needed, and writes only its discussion artifacts; it never changes phase
|
|
176
|
+
state or bypasses a phase gate.
|
|
177
|
+
- During an uncommitted archive transaction, discussion writes a complete
|
|
178
|
+
active copy that extends the archived pair. The ship phase reruns `prepare`;
|
|
179
|
+
the helper validates the prefix and atomically reconciles both files.
|
|
180
|
+
Discussion never edits an archive directly or writes after shipment.
|
|
181
|
+
- The loop runner wraps explicit skills in a bounded check → verify → fix →
|
|
182
|
+
verify pass driven by a LOOP.md spec. It never advances a phase gate
|
|
183
|
+
itself and never commits or pushes.
|
|
184
|
+
- Fix tasks use the complete task template, not an abbreviated finding.
|
|
185
|
+
|
|
186
|
+
## New GitHub repositories
|
|
187
|
+
|
|
188
|
+
- Create a GitHub repository only from an explicit user request followed by an
|
|
189
|
+
approval of the exact owner/name, visibility, default-checkout path,
|
|
190
|
+
`gsd-path/M001` branch, and linked primary-worktree path. Before the
|
|
191
|
+
external action produces an artifact, present those proposed targets as the
|
|
192
|
+
inline **Review** surface using the active router's preview contract.
|
|
193
|
+
Do not write a
|
|
194
|
+
preview file into the invocation directory or another repository. Run the
|
|
195
|
+
bundled bootstrap helper's read-only `preview` command for this evidence.
|
|
196
|
+
- After approval, the bootstrap helper persists the exact targets under the
|
|
197
|
+
approved workspace before the first external mutation. Its `create` command
|
|
198
|
+
creates or verifies the remote, checkout, branch, and linked worktree one
|
|
199
|
+
stage at a time. A matching journal permits explicit resume and adoption; a
|
|
200
|
+
collision without that journal blocks. The helper removes the journal only
|
|
201
|
+
after writing owned STATE.md and fixed-format `.project/REPOSITORY.md` in the
|
|
202
|
+
linked worktree.
|
|
203
|
+
- During an approved new-repository transaction, the router may create the
|
|
204
|
+
first GSD Path branch and linked primary worktree at the verified
|
|
205
|
+
remote-default SHA and persist that branch in STATE.md and REPOSITORY.md.
|
|
206
|
+
Build must verify and adopt that exact binding from REPOSITORY.md, never a
|
|
207
|
+
free-form log. Task branches and task worktrees remain exclusively
|
|
208
|
+
build-orchestrator owned.
|
|
209
|
+
- Keep the cloned default checkout clean on the remote default branch. Run the
|
|
210
|
+
pipeline from the linked GSD Path worktree; never initialize `.project/` in
|
|
211
|
+
the default checkout, reuse an existing branch or path (except an explicitly
|
|
212
|
+
approved empty linked-worktree folder via `--reuse-empty-worktree`), move an existing
|
|
213
|
+
repository, or recover a partial GitHub creation without the exact approved
|
|
214
|
+
journal and re-verification.
|
|
@@ -38,8 +38,9 @@ the how.
|
|
|
38
38
|
security-critical; `verify-only` suits polish and low-risk feature waves
|
|
39
39
|
whose Verify commands meaningfully cover the criteria.
|
|
40
40
|
|
|
41
|
-
Every dependency must be in an earlier wave or in the same wave
|
|
42
|
-
|
|
41
|
+
Every dependency must be in an earlier wave or in the same wave. Same-wave
|
|
42
|
+
tasks may share files only when one transitively depends on the other. Produce
|
|
43
|
+
an acyclic graph; same-wave chains execute in layers.
|
|
43
44
|
|
|
44
45
|
Declare a dependency only when something real crosses it: data — the dependent
|
|
45
46
|
consumes a symbol, signature, schema, endpoint, file format, or path named in
|
|
@@ -72,8 +73,17 @@ plan order above, which still keeps plan-invalidating risk in wave 1.
|
|
|
72
73
|
criterion may appear in only one surface block. Put the surface in the same
|
|
73
74
|
wave as the capability behind it. A milestone with a surface is not done
|
|
74
75
|
when only its internals run.
|
|
76
|
+
- When INTENT.md carries `## Edge coverage` or `## Prohibitions` (read the
|
|
77
|
+
supplied [spec-reach probes](spec-probes.md)), treat every ruling as a hard
|
|
78
|
+
limit on its criterion. For each `held-out` edge, write one PLAN.md
|
|
79
|
+
`## Held-out checks` row: a test file in the owning task's `files`, a
|
|
80
|
+
Verify that runs it, and an Acceptance criterion that names the edge id
|
|
81
|
+
and states its ruling from Detail. Omit the section when no edge is
|
|
82
|
+
held-out. Put each `judgment` prohibition's Must not and Detail in the
|
|
83
|
+
owning task's Approach.
|
|
75
84
|
- Make `files` exhaustive, including imports, routes, generated artifacts,
|
|
76
|
-
tests, and wiring. Require disjoint files for same-wave tasks
|
|
85
|
+
tests, and wiring. Require disjoint files for same-wave tasks that are not
|
|
86
|
+
dependency-ordered.
|
|
77
87
|
- Write an Interface contract in every task: `None` for independent tasks;
|
|
78
88
|
for any tasks that exchange a symbol, signature, schema, endpoint, file
|
|
79
89
|
format, or path, the exact shapes both sides code against — identical text
|
|
@@ -86,6 +96,14 @@ plan order above, which still keeps plan-invalidating risk in wave 1.
|
|
|
86
96
|
this task's work is skipped. That command must name a path from `files`,
|
|
87
97
|
and must not be PLAN.md's project Verify unless an SC this task owns names
|
|
88
98
|
that command. Criteria and Verify are the contract; Approach is guidance.
|
|
99
|
+
- In a multi-repo milestone (`.project/MEMBERS.md` lists members), each task
|
|
100
|
+
changes exactly one repo. Give a member task `repo: <member>`; its `files`
|
|
101
|
+
and Verify are relative to that member's root, and its Verify runs there.
|
|
102
|
+
Coordinator tasks omit `repo:`. Split work that spans repos into one task
|
|
103
|
+
per repo joined by an Interface contract. PLAN.md's project Verify runs
|
|
104
|
+
from the coordinator root and reaches a member as `../<member>`. Do not
|
|
105
|
+
plan a task for a member this milestone already closed at ship; plan it in
|
|
106
|
+
the next milestone.
|
|
89
107
|
- Preserve every template field and its required initial value.
|
|
90
108
|
|
|
91
109
|
Put the full-project build-and-test command in PLAN.md. Copy `Review panel:`
|
|
@@ -97,7 +115,7 @@ family list. Copy `Finding skeptics:` from INTENT.md into PLAN.md Config as
|
|
|
97
115
|
invent `on`. Quick-lane plans always write both values as `off`.
|
|
98
116
|
|
|
99
117
|
Before returning, check veto exclusion, decision coverage, Intent coverage,
|
|
100
|
-
the Surface contract, dependencies, file overlap, task size, criteria, and
|
|
118
|
+
the Surface contract, Held-out checks, dependencies, file overlap, task size, criteria, and
|
|
101
119
|
Verify commands.
|
|
102
120
|
|
|
103
121
|
Return a brief structured summary: wave count, task count, and the wave-1
|