@opengsd/gsd-path 1.5.0 → 1.6.1
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 +1 -1
- package/CHANGELOG.md +169 -0
- package/DOCS.md +4 -3
- package/FULL.md +68 -7
- package/HOOKS.md +81 -4
- package/MIGRATE.md +12 -0
- package/QUICK.md +4 -2
- package/README.md +69 -16
- package/RUNTIME.md +23 -5
- package/UPDATE.md +35 -0
- package/WORKFLOW.md +66 -7
- package/package.json +1 -1
- package/scripts/_common.py +150 -1
- package/scripts/build_recovery.py +62 -30
- package/scripts/build_state.py +195 -5
- package/scripts/check_handoffs.py +92 -30
- package/scripts/check_task_briefs.py +27 -19
- package/scripts/detect_project.py +17 -2
- package/scripts/discussion_records.py +9 -1
- package/scripts/discussion_validate.py +7 -6
- package/scripts/dispatch_driver.py +174 -36
- package/scripts/git_guard.py +42 -7
- package/scripts/guard_hook.py +1216 -47
- package/scripts/install.mjs +76 -3
- package/scripts/install.py +182 -37
- package/scripts/integration.py +115 -68
- package/scripts/isolation.py +192 -23
- package/scripts/members.py +68 -25
- package/scripts/migrate_core.py +2 -0
- package/scripts/model_policy.py +13 -2
- package/scripts/pipeline_diagnose.py +17 -2
- package/scripts/pipeline_git.py +87 -35
- package/scripts/pipeline_state.py +31 -7
- package/scripts/pipeline_undo.py +17 -8
- package/scripts/promote_lookahead.py +3 -3
- package/scripts/review_findings.py +180 -44
- package/scripts/roadmap.py +9 -1
- package/scripts/runtime_store.py +1 -0
- package/scripts/state_checkpoint.py +30 -9
- package/scripts/state_promote.py +92 -5
- package/scripts/task_context.py +2 -0
- package/scripts/workflow_run.py +9 -2
- package/skills/gsd-path/DEFINE.md +6 -2
- package/skills/gsd-path/PLAN.md +6 -2
- package/skills/gsd-path/ROADMAP.md +16 -6
- package/skills/gsd-path/SHIP.md +38 -11
- package/skills/gsd-path/SKILL.md +52 -24
- package/skills/gsd-path/references/build-native.md +96 -9
- package/skills/gsd-path/references/build-recovery.md +13 -0
- package/skills/gsd-path/references/coder.md +7 -3
- package/skills/gsd-path/references/model-policy.md +3 -1
- package/skills/gsd-path/references/operating-rules.md +14 -5
- package/skills/gsd-path/references/planner.md +13 -1
- package/skills/gsd-path/references/reviewer-final.md +5 -5
- package/skills/gsd-path/references/reviewer-wave.md +46 -13
- package/skills/gsd-path/references/runtime-selection.md +10 -0
- package/skills/gsd-path/scripts/_common.py +150 -1
- package/skills/gsd-path/scripts/build_recovery.py +62 -30
- package/skills/gsd-path/scripts/build_state.py +195 -5
- package/skills/gsd-path/scripts/check_handoffs.py +92 -30
- package/skills/gsd-path/scripts/check_task_briefs.py +27 -19
- package/skills/gsd-path/scripts/detect_project.py +17 -2
- package/skills/gsd-path/scripts/discussion_records.py +9 -1
- package/skills/gsd-path/scripts/discussion_validate.py +7 -6
- package/skills/gsd-path/scripts/dispatch_driver.py +174 -36
- package/skills/gsd-path/scripts/git_guard.py +42 -7
- package/skills/gsd-path/scripts/integration.py +115 -68
- package/skills/gsd-path/scripts/isolation.py +192 -23
- package/skills/gsd-path/scripts/members.py +68 -25
- package/skills/gsd-path/scripts/model_policy.py +13 -2
- package/skills/gsd-path/scripts/pipeline_git.py +87 -35
- package/skills/gsd-path/scripts/pipeline_state.py +31 -7
- package/skills/gsd-path/scripts/promote_lookahead.py +3 -3
- package/skills/gsd-path/scripts/review_findings.py +180 -44
- package/skills/gsd-path/scripts/roadmap.py +9 -1
- package/skills/gsd-path/scripts/state_checkpoint.py +30 -9
- package/skills/gsd-path/scripts/state_promote.py +92 -5
- package/skills/gsd-path/scripts/task_context.py +2 -0
- package/skills/gsd-path/scripts/workflow_run.py +9 -2
- package/skills/gsd-path/templates/final-review.md +5 -5
- package/skills/gsd-path/templates/state.md +1 -0
- package/skills/gsd-path/templates/task.md +1 -0
- package/skills/gsd-path/templates/wave-review.md +18 -9
- package/skills/gsd-path-build/references/build-native.md +96 -9
- package/skills/gsd-path-build/references/build-recovery.md +13 -0
- package/skills/gsd-path-build/references/coder.md +7 -3
- package/skills/gsd-path-build/references/model-policy.md +3 -1
- package/skills/gsd-path-build/references/operating-rules.md +14 -5
- package/skills/gsd-path-build/references/reviewer-final.md +5 -5
- package/skills/gsd-path-build/references/reviewer-wave.md +46 -13
- package/skills/gsd-path-build/references/runtime-selection.md +10 -0
- package/skills/gsd-path-build/scripts/_common.py +150 -1
- package/skills/gsd-path-build/scripts/build_recovery.py +62 -30
- package/skills/gsd-path-build/scripts/build_state.py +195 -5
- package/skills/gsd-path-build/scripts/check_handoffs.py +92 -30
- package/skills/gsd-path-build/scripts/check_task_briefs.py +27 -19
- package/skills/gsd-path-build/scripts/detect_project.py +17 -2
- package/skills/gsd-path-build/scripts/discussion_records.py +9 -1
- package/skills/gsd-path-build/scripts/discussion_validate.py +7 -6
- package/skills/gsd-path-build/scripts/dispatch_driver.py +174 -36
- package/skills/gsd-path-build/scripts/integration.py +115 -68
- package/skills/gsd-path-build/scripts/isolation.py +192 -23
- package/skills/gsd-path-build/scripts/members.py +68 -25
- package/skills/gsd-path-build/scripts/model_policy.py +13 -2
- package/skills/gsd-path-build/scripts/pipeline_git.py +87 -35
- package/skills/gsd-path-build/scripts/pipeline_state.py +31 -7
- package/skills/gsd-path-build/scripts/promote_lookahead.py +3 -3
- package/skills/gsd-path-build/scripts/review_findings.py +180 -44
- package/skills/gsd-path-build/scripts/roadmap.py +9 -1
- package/skills/gsd-path-build/scripts/state_checkpoint.py +30 -9
- package/skills/gsd-path-build/scripts/state_promote.py +92 -5
- package/skills/gsd-path-build/scripts/task_context.py +2 -0
- package/skills/gsd-path-build/scripts/workflow_run.py +9 -2
- package/skills/gsd-path-build/templates/task.md +1 -0
- package/skills/gsd-path-build/templates/wave-review.md +18 -9
- package/skills/gsd-path-decide/references/model-policy.md +3 -1
- package/skills/gsd-path-decide/references/operating-rules.md +14 -5
- package/skills/gsd-path-decide/references/runtime-selection.md +10 -0
- package/skills/gsd-path-decide/scripts/_common.py +150 -1
- package/skills/gsd-path-decide/scripts/build_recovery.py +62 -30
- package/skills/gsd-path-decide/scripts/check_handoffs.py +92 -30
- package/skills/gsd-path-decide/scripts/check_task_briefs.py +27 -19
- package/skills/gsd-path-decide/scripts/detect_project.py +17 -2
- package/skills/gsd-path-decide/scripts/discussion_records.py +9 -1
- package/skills/gsd-path-decide/scripts/discussion_validate.py +7 -6
- package/skills/gsd-path-decide/scripts/integration.py +115 -68
- package/skills/gsd-path-decide/scripts/isolation.py +192 -23
- package/skills/gsd-path-decide/scripts/members.py +68 -25
- package/skills/gsd-path-decide/scripts/model_policy.py +13 -2
- package/skills/gsd-path-decide/scripts/pipeline_git.py +87 -35
- package/skills/gsd-path-decide/scripts/pipeline_state.py +31 -7
- package/skills/gsd-path-decide/scripts/promote_lookahead.py +3 -3
- package/skills/gsd-path-decide/scripts/roadmap.py +9 -1
- package/skills/gsd-path-decide/scripts/state_checkpoint.py +30 -9
- package/skills/gsd-path-decide/scripts/state_promote.py +92 -5
- package/skills/gsd-path-define/SKILL.md +6 -2
- package/skills/gsd-path-define/references/build-recovery.md +13 -0
- package/skills/gsd-path-define/references/operating-rules.md +14 -5
- package/skills/gsd-path-define/references/runtime-selection.md +10 -0
- package/skills/gsd-path-define/scripts/_common.py +150 -1
- package/skills/gsd-path-define/scripts/build_recovery.py +62 -30
- package/skills/gsd-path-define/scripts/check_handoffs.py +92 -30
- package/skills/gsd-path-define/scripts/check_task_briefs.py +27 -19
- package/skills/gsd-path-define/scripts/detect_project.py +17 -2
- package/skills/gsd-path-define/scripts/discussion_records.py +9 -1
- package/skills/gsd-path-define/scripts/discussion_validate.py +7 -6
- package/skills/gsd-path-define/scripts/integration.py +115 -68
- package/skills/gsd-path-define/scripts/isolation.py +192 -23
- package/skills/gsd-path-define/scripts/members.py +68 -25
- package/skills/gsd-path-define/scripts/model_policy.py +13 -2
- package/skills/gsd-path-define/scripts/pipeline_git.py +87 -35
- package/skills/gsd-path-define/scripts/pipeline_state.py +31 -7
- package/skills/gsd-path-define/scripts/promote_lookahead.py +3 -3
- package/skills/gsd-path-define/scripts/roadmap.py +9 -1
- package/skills/gsd-path-define/scripts/state_checkpoint.py +30 -9
- package/skills/gsd-path-define/scripts/state_promote.py +92 -5
- package/skills/gsd-path-define/templates/state.md +1 -0
- package/skills/gsd-path-discuss/references/operating-rules.md +14 -5
- package/skills/gsd-path-discuss/references/runtime-selection.md +10 -0
- package/skills/gsd-path-discuss/scripts/_common.py +150 -1
- package/skills/gsd-path-discuss/scripts/discussion_records.py +9 -1
- package/skills/gsd-path-discuss/scripts/model_policy.py +13 -2
- package/skills/gsd-path-docs-audit/references/model-policy.md +3 -1
- package/skills/gsd-path-docs-audit/references/operating-rules.md +14 -5
- package/skills/gsd-path-docs-audit/references/runtime-selection.md +10 -0
- package/skills/gsd-path-docs-audit/scripts/_common.py +150 -1
- package/skills/gsd-path-docs-audit/scripts/build_recovery.py +62 -30
- package/skills/gsd-path-docs-audit/scripts/check_handoffs.py +92 -30
- package/skills/gsd-path-docs-audit/scripts/check_task_briefs.py +27 -19
- package/skills/gsd-path-docs-audit/scripts/detect_project.py +17 -2
- package/skills/gsd-path-docs-audit/scripts/discussion_records.py +9 -1
- package/skills/gsd-path-docs-audit/scripts/discussion_validate.py +7 -6
- package/skills/gsd-path-docs-audit/scripts/integration.py +115 -68
- package/skills/gsd-path-docs-audit/scripts/isolation.py +192 -23
- package/skills/gsd-path-docs-audit/scripts/members.py +68 -25
- package/skills/gsd-path-docs-audit/scripts/model_policy.py +13 -2
- package/skills/gsd-path-docs-audit/scripts/pipeline_git.py +87 -35
- package/skills/gsd-path-docs-audit/scripts/pipeline_state.py +31 -7
- package/skills/gsd-path-docs-audit/scripts/promote_lookahead.py +3 -3
- package/skills/gsd-path-docs-audit/scripts/roadmap.py +9 -1
- package/skills/gsd-path-docs-audit/scripts/state_checkpoint.py +30 -9
- package/skills/gsd-path-docs-audit/scripts/state_promote.py +92 -5
- package/skills/gsd-path-forensics/references/operating-rules.md +14 -5
- package/skills/gsd-path-forensics/references/runtime-selection.md +10 -0
- package/skills/gsd-path-forensics/scripts/_common.py +150 -1
- package/skills/gsd-path-forensics/scripts/discussion_records.py +9 -1
- package/skills/gsd-path-forensics/scripts/model_policy.py +13 -2
- package/skills/gsd-path-forensics/scripts/pipeline_diagnose.py +17 -2
- package/skills/gsd-path-forensics/scripts/pipeline_undo.py +17 -8
- package/skills/gsd-path-inspect/references/model-policy.md +3 -1
- package/skills/gsd-path-inspect/references/operating-rules.md +14 -5
- package/skills/gsd-path-inspect/references/runtime-selection.md +10 -0
- package/skills/gsd-path-inspect/scripts/_common.py +150 -1
- package/skills/gsd-path-inspect/scripts/build_recovery.py +62 -30
- package/skills/gsd-path-inspect/scripts/check_handoffs.py +92 -30
- package/skills/gsd-path-inspect/scripts/check_task_briefs.py +27 -19
- package/skills/gsd-path-inspect/scripts/detect_project.py +17 -2
- package/skills/gsd-path-inspect/scripts/discussion_records.py +9 -1
- package/skills/gsd-path-inspect/scripts/discussion_validate.py +7 -6
- package/skills/gsd-path-inspect/scripts/integration.py +115 -68
- package/skills/gsd-path-inspect/scripts/isolation.py +192 -23
- package/skills/gsd-path-inspect/scripts/members.py +68 -25
- package/skills/gsd-path-inspect/scripts/model_policy.py +13 -2
- package/skills/gsd-path-inspect/scripts/pipeline_git.py +87 -35
- package/skills/gsd-path-inspect/scripts/pipeline_state.py +31 -7
- package/skills/gsd-path-inspect/scripts/promote_lookahead.py +3 -3
- package/skills/gsd-path-inspect/scripts/roadmap.py +9 -1
- package/skills/gsd-path-inspect/scripts/state_checkpoint.py +30 -9
- package/skills/gsd-path-inspect/scripts/state_promote.py +92 -5
- package/skills/gsd-path-inspect/scripts/workflow_run.py +9 -2
- package/skills/gsd-path-inspect/templates/state.md +1 -0
- package/skills/gsd-path-loop/references/operating-rules.md +14 -5
- package/skills/gsd-path-loop/references/runtime-selection.md +10 -0
- package/skills/gsd-path-loop/scripts/_common.py +150 -1
- package/skills/gsd-path-loop/scripts/discussion_records.py +9 -1
- package/skills/gsd-path-loop/scripts/model_policy.py +13 -2
- package/skills/gsd-path-migrate/SKILL.md +8 -0
- package/skills/gsd-path-migrate/references/operating-rules.md +14 -5
- package/skills/gsd-path-migrate/references/runtime-selection.md +10 -0
- package/skills/gsd-path-migrate/scripts/_common.py +150 -1
- package/skills/gsd-path-migrate/scripts/discussion_records.py +9 -1
- package/skills/gsd-path-migrate/scripts/migrate_core.py +2 -0
- package/skills/gsd-path-migrate/scripts/model_policy.py +13 -2
- package/skills/gsd-path-plan/SKILL.md +6 -2
- package/skills/gsd-path-plan/references/build-recovery.md +13 -0
- package/skills/gsd-path-plan/references/model-policy.md +3 -1
- package/skills/gsd-path-plan/references/operating-rules.md +14 -5
- package/skills/gsd-path-plan/references/planner.md +13 -1
- package/skills/gsd-path-plan/references/runtime-selection.md +10 -0
- package/skills/gsd-path-plan/scripts/_common.py +150 -1
- package/skills/gsd-path-plan/scripts/build_recovery.py +62 -30
- package/skills/gsd-path-plan/scripts/check_handoffs.py +92 -30
- package/skills/gsd-path-plan/scripts/check_task_briefs.py +27 -19
- package/skills/gsd-path-plan/scripts/detect_project.py +17 -2
- package/skills/gsd-path-plan/scripts/discussion_records.py +9 -1
- package/skills/gsd-path-plan/scripts/discussion_validate.py +7 -6
- package/skills/gsd-path-plan/scripts/integration.py +115 -68
- package/skills/gsd-path-plan/scripts/isolation.py +192 -23
- package/skills/gsd-path-plan/scripts/members.py +68 -25
- package/skills/gsd-path-plan/scripts/model_policy.py +13 -2
- package/skills/gsd-path-plan/scripts/pipeline_git.py +87 -35
- package/skills/gsd-path-plan/scripts/pipeline_state.py +31 -7
- package/skills/gsd-path-plan/scripts/promote_lookahead.py +3 -3
- package/skills/gsd-path-plan/scripts/roadmap.py +9 -1
- package/skills/gsd-path-plan/scripts/state_checkpoint.py +30 -9
- package/skills/gsd-path-plan/scripts/state_promote.py +92 -5
- package/skills/gsd-path-plan/scripts/workflow_run.py +9 -2
- package/skills/gsd-path-plan/templates/task.md +1 -0
- package/skills/gsd-path-research/references/model-policy.md +3 -1
- package/skills/gsd-path-research/references/operating-rules.md +14 -5
- package/skills/gsd-path-research/references/runtime-selection.md +10 -0
- package/skills/gsd-path-research/scripts/_common.py +150 -1
- package/skills/gsd-path-research/scripts/build_recovery.py +62 -30
- package/skills/gsd-path-research/scripts/check_handoffs.py +92 -30
- package/skills/gsd-path-research/scripts/check_task_briefs.py +27 -19
- package/skills/gsd-path-research/scripts/detect_project.py +17 -2
- package/skills/gsd-path-research/scripts/discussion_records.py +9 -1
- package/skills/gsd-path-research/scripts/discussion_validate.py +7 -6
- package/skills/gsd-path-research/scripts/integration.py +115 -68
- package/skills/gsd-path-research/scripts/isolation.py +192 -23
- package/skills/gsd-path-research/scripts/members.py +68 -25
- package/skills/gsd-path-research/scripts/model_policy.py +13 -2
- package/skills/gsd-path-research/scripts/pipeline_git.py +87 -35
- package/skills/gsd-path-research/scripts/pipeline_state.py +31 -7
- package/skills/gsd-path-research/scripts/promote_lookahead.py +3 -3
- package/skills/gsd-path-research/scripts/roadmap.py +9 -1
- package/skills/gsd-path-research/scripts/state_checkpoint.py +30 -9
- package/skills/gsd-path-research/scripts/state_promote.py +92 -5
- package/skills/gsd-path-roadmap/SKILL.md +16 -6
- package/skills/gsd-path-roadmap/references/model-policy.md +3 -1
- package/skills/gsd-path-roadmap/references/operating-rules.md +14 -5
- package/skills/gsd-path-roadmap/references/runtime-selection.md +10 -0
- package/skills/gsd-path-roadmap/scripts/_common.py +150 -1
- package/skills/gsd-path-roadmap/scripts/build_recovery.py +62 -30
- package/skills/gsd-path-roadmap/scripts/check_handoffs.py +92 -30
- package/skills/gsd-path-roadmap/scripts/check_task_briefs.py +27 -19
- package/skills/gsd-path-roadmap/scripts/detect_project.py +17 -2
- package/skills/gsd-path-roadmap/scripts/discussion_records.py +9 -1
- package/skills/gsd-path-roadmap/scripts/discussion_validate.py +7 -6
- package/skills/gsd-path-roadmap/scripts/integration.py +115 -68
- package/skills/gsd-path-roadmap/scripts/isolation.py +192 -23
- package/skills/gsd-path-roadmap/scripts/members.py +68 -25
- package/skills/gsd-path-roadmap/scripts/model_policy.py +13 -2
- package/skills/gsd-path-roadmap/scripts/pipeline_git.py +87 -35
- package/skills/gsd-path-roadmap/scripts/pipeline_state.py +31 -7
- package/skills/gsd-path-roadmap/scripts/promote_lookahead.py +3 -3
- package/skills/gsd-path-roadmap/scripts/roadmap.py +9 -1
- package/skills/gsd-path-roadmap/scripts/state_checkpoint.py +30 -9
- package/skills/gsd-path-roadmap/scripts/state_promote.py +92 -5
- package/skills/gsd-path-ship/SKILL.md +38 -11
- package/skills/gsd-path-ship/references/model-policy.md +3 -1
- package/skills/gsd-path-ship/references/operating-rules.md +14 -5
- package/skills/gsd-path-ship/references/reviewer-final.md +5 -5
- package/skills/gsd-path-ship/references/reviewer-wave.md +46 -13
- package/skills/gsd-path-ship/references/runtime-selection.md +10 -0
- package/skills/gsd-path-ship/scripts/_common.py +150 -1
- package/skills/gsd-path-ship/scripts/build_recovery.py +62 -30
- package/skills/gsd-path-ship/scripts/build_state.py +195 -5
- package/skills/gsd-path-ship/scripts/check_handoffs.py +92 -30
- package/skills/gsd-path-ship/scripts/check_task_briefs.py +27 -19
- package/skills/gsd-path-ship/scripts/detect_project.py +17 -2
- package/skills/gsd-path-ship/scripts/discussion_records.py +9 -1
- package/skills/gsd-path-ship/scripts/discussion_validate.py +7 -6
- package/skills/gsd-path-ship/scripts/integration.py +115 -68
- package/skills/gsd-path-ship/scripts/isolation.py +192 -23
- package/skills/gsd-path-ship/scripts/members.py +68 -25
- package/skills/gsd-path-ship/scripts/model_policy.py +13 -2
- package/skills/gsd-path-ship/scripts/pipeline_git.py +87 -35
- package/skills/gsd-path-ship/scripts/pipeline_state.py +31 -7
- package/skills/gsd-path-ship/scripts/promote_lookahead.py +3 -3
- package/skills/gsd-path-ship/scripts/roadmap.py +9 -1
- package/skills/gsd-path-ship/scripts/state_checkpoint.py +30 -9
- package/skills/gsd-path-ship/scripts/state_promote.py +92 -5
- package/skills/gsd-path-ship/scripts/workflow_run.py +9 -2
- package/skills/gsd-path-ship/templates/final-review.md +5 -5
- package/skills/gsd-path-ship/templates/wave-review.md +18 -9
- package/skills/gsd-path-undo/references/operating-rules.md +14 -5
- package/skills/gsd-path-undo/references/runtime-selection.md +10 -0
- package/skills/gsd-path-undo/scripts/_common.py +150 -1
- package/skills/gsd-path-undo/scripts/discussion_records.py +9 -1
- package/skills/gsd-path-undo/scripts/model_policy.py +13 -2
- package/skills/gsd-path-undo/scripts/pipeline_undo.py +17 -8
- package/skills/path/DEFINE.md +6 -2
- package/skills/path/PLAN.md +6 -2
- package/skills/path/ROADMAP.md +16 -6
- package/skills/path/SHIP.md +38 -11
- package/skills/path/SKILL.md +52 -24
- package/skills/path/references/build-native.md +96 -9
- package/skills/path/references/build-recovery.md +13 -0
- package/skills/path/references/coder.md +7 -3
- package/skills/path/references/model-policy.md +3 -1
- package/skills/path/references/operating-rules.md +14 -5
- package/skills/path/references/planner.md +13 -1
- package/skills/path/references/reviewer-final.md +5 -5
- package/skills/path/references/reviewer-wave.md +46 -13
- package/skills/path/references/runtime-selection.md +10 -0
- package/skills/path/scripts/_common.py +150 -1
- package/skills/path/scripts/build_recovery.py +62 -30
- package/skills/path/scripts/build_state.py +195 -5
- package/skills/path/scripts/check_handoffs.py +92 -30
- package/skills/path/scripts/check_task_briefs.py +27 -19
- package/skills/path/scripts/detect_project.py +17 -2
- package/skills/path/scripts/discussion_records.py +9 -1
- package/skills/path/scripts/discussion_validate.py +7 -6
- package/skills/path/scripts/dispatch_driver.py +174 -36
- package/skills/path/scripts/git_guard.py +42 -7
- package/skills/path/scripts/integration.py +115 -68
- package/skills/path/scripts/isolation.py +192 -23
- package/skills/path/scripts/members.py +68 -25
- package/skills/path/scripts/model_policy.py +13 -2
- package/skills/path/scripts/pipeline_git.py +87 -35
- package/skills/path/scripts/pipeline_state.py +31 -7
- package/skills/path/scripts/promote_lookahead.py +3 -3
- package/skills/path/scripts/review_findings.py +180 -44
- package/skills/path/scripts/roadmap.py +9 -1
- package/skills/path/scripts/state_checkpoint.py +30 -9
- package/skills/path/scripts/state_promote.py +92 -5
- package/skills/path/scripts/task_context.py +2 -0
- package/skills/path/scripts/workflow_run.py +9 -2
- package/skills/path/templates/final-review.md +5 -5
- package/skills/path/templates/state.md +1 -0
- package/skills/path/templates/task.md +1 -0
- package/skills/path/templates/wave-review.md +18 -9
package/AGENTS.md
CHANGED
|
@@ -139,7 +139,7 @@ full-repo suite on a tiny edit outrank the phase brief.
|
|
|
139
139
|
canonical contents, carry-forward, and manifest pass the bundled precommit
|
|
140
140
|
validator; report shipped only after the exact `.project/`-only ship commit
|
|
141
141
|
passes the postcommit validator and `validate-integrated` proves the
|
|
142
|
-
|
|
142
|
+
integration landing, its tag, and its ancestry on origin/main —
|
|
143
143
|
while integration is pending the router routes back to ship instead of
|
|
144
144
|
reporting shipped or starting the next milestone.
|
|
145
145
|
|
package/CHANGELOG.md
CHANGED
|
@@ -11,6 +11,175 @@ app and the daemon have their own file,
|
|
|
11
11
|
[daemon/app/CHANGELOG.md](daemon/app/CHANGELOG.md). Release bookkeeping and
|
|
12
12
|
test-only changes are not listed; the Git history has them.
|
|
13
13
|
|
|
14
|
+
## [1.6.1] - 2026-10-16
|
|
15
|
+
|
|
16
|
+
### Added
|
|
17
|
+
- accept GitHub rebase merges in pull-request integration
|
|
18
|
+
|
|
19
|
+
### Changed
|
|
20
|
+
- record 1.6.1 live host release evidence
|
|
21
|
+
- prepare 1.6.1 patch candidate
|
|
22
|
+
- Note PR rebase-merge landing in CONTEXT, WORKFLOW, AGENTS
|
|
23
|
+
- Note owner-authorized push exception in FULL.md and HOOKS.md
|
|
24
|
+
- correct the minimum Git version in TEST_ENVIRONMENT.md
|
|
25
|
+
- prove the landed member base through the file scope check
|
|
26
|
+
- describe project Update with no project install
|
|
27
|
+
- update release notes for v1.6.0
|
|
28
|
+
|
|
29
|
+
### Fixed
|
|
30
|
+
- run dispatch_driver subprocess helpers from the selected runtime
|
|
31
|
+
- refuse a relative model_policy --record and check release before locking
|
|
32
|
+
- let promote-next replace a DOCS-AUDIT carry-forward the lookahead keeps
|
|
33
|
+
- let the owner authorize one exact pre-ship push to a task branch
|
|
34
|
+
- post Discord changelogs from automated releases
|
|
35
|
+
- stage a landing or checkpoint change set with one git add
|
|
36
|
+
- pass the landing message and member paths to git through stdin
|
|
37
|
+
- do not check the paths that a landed task brief names
|
|
38
|
+
- accept a landed task as the only owner of an Interface contract bullet
|
|
39
|
+
- say why a project has no workflow status in the desktop app
|
|
40
|
+
|
|
41
|
+
### Other
|
|
42
|
+
- Accept only same value or T### for pending rulings
|
|
43
|
+
- list not-started projects and re-probe after project install
|
|
44
|
+
- sort idle projects with shipped in legacy dashboard
|
|
45
|
+
## [1.6.0] - 2026-10-12
|
|
46
|
+
|
|
47
|
+
### Added
|
|
48
|
+
- let a later task supersede an earlier task and retire its Verify
|
|
49
|
+
- document the default branch record of a member
|
|
50
|
+
- member paths read the default branch that MEMBERS.md records
|
|
51
|
+
- record the default branch of a member in MEMBERS.md
|
|
52
|
+
- add --uninstall to the skill installers
|
|
53
|
+
- expose default_branch to the router and document the rule
|
|
54
|
+
- refuse members under a coordinator whose default branch is not main
|
|
55
|
+
- status, promotion and the git guard follow STATE default_branch
|
|
56
|
+
- integrate and validate on the default branch that STATE records
|
|
57
|
+
- bind milestones at the default branch that STATE records
|
|
58
|
+
- record the origin default branch in STATE at initialization
|
|
59
|
+
|
|
60
|
+
### Changed
|
|
61
|
+
- make each checkpoint commit different in the stale sidecar test
|
|
62
|
+
- record 1.6.0 live release evidence
|
|
63
|
+
- prepare 1.6.0 minor candidate
|
|
64
|
+
- Merge main into fix/issue-392-wave-review-validator
|
|
65
|
+
- Merge main into fix/issue-393-helper-papercuts
|
|
66
|
+
- Merge main into fix/issue-357-regression-verify
|
|
67
|
+
- Merge main into fix/issue-358-multi-repo-batches
|
|
68
|
+
- Merge main into fix/issue-390-build-helpers-runtime
|
|
69
|
+
- state the repair base-to-landing rule in build-native.md
|
|
70
|
+
- document supersedes gate rule in plan skill
|
|
71
|
+
- describe finish retry, stale Verify sidecar, leftover isolate
|
|
72
|
+
- document retired Verify key in RUNTIME.md
|
|
73
|
+
- name per-repo batching in review_findings docstring
|
|
74
|
+
- correct task_review_observation docstring after marker-tolerant matching
|
|
75
|
+
- state the wave review format rules and name them in the gate errors
|
|
76
|
+
- Document alias denial in directories that do not exist
|
|
77
|
+
- a done task brief with a deleted Context path does not fail later lint
|
|
78
|
+
- Document directory overlap rule in planner brief
|
|
79
|
+
- prove the issue 374 fixes through the real commands
|
|
80
|
+
- prove a define re-slice that removes a surface reaches the plan gate
|
|
81
|
+
- Merge remote-tracking branch 'origin/main' into fix/issue-344-scope-destructive-git-guards
|
|
82
|
+
- correct fix-tasks carried rule in RUNTIME.md
|
|
83
|
+
- document regression Verify at landing in RUNTIME.md
|
|
84
|
+
- point stale Python-installer flag lists to README
|
|
85
|
+
- say how more than one person can work on a project
|
|
86
|
+
- show host proof tiers in README and QUICK
|
|
87
|
+
- Document literal attestation limit for declared directories
|
|
88
|
+
- Align coder file-scope rule with declared-directory landing
|
|
89
|
+
- add contributing guide, security policy, and issue forms
|
|
90
|
+
- style: fix assignment spacing in round lint test
|
|
91
|
+
- prove round lint accepts dependency-supplied contract paths
|
|
92
|
+
- bind the next milestone after a direct ship on a master default
|
|
93
|
+
- Add GitHub Actions workflow for Discord changelog
|
|
94
|
+
- update release notes for v1.5.0
|
|
95
|
+
- quote portable repository paths in shell fixture
|
|
96
|
+
|
|
97
|
+
### Fixed
|
|
98
|
+
- plan gate reads a declared directory when it checks supersedes
|
|
99
|
+
- give no removal advice for an isolate that holds a gitignored file
|
|
100
|
+
- replace a stale Verify sidecar only when it is proven untouched
|
|
101
|
+
- check the chain files from the repair base, not from the repair landing
|
|
102
|
+
- read update-ref, branch and worktree targets as Git does
|
|
103
|
+
- deny scoped deletions when the guard cannot prove the repository
|
|
104
|
+
- link review repairs by finding, not by criterion text alone
|
|
105
|
+
- give a superseding task the protective role of the task it supersedes
|
|
106
|
+
- check the files of every later linked repair before a chain receipt
|
|
107
|
+
- name only the leftover isolate when a landed task could not be cleaned up
|
|
108
|
+
- make only sub-bullet line markers optional in a criterion quote
|
|
109
|
+
- give a receipt to a chain of review repairs on the same files
|
|
110
|
+
- report a landed task as landed when the removal of its isolate fails
|
|
111
|
+
- deliver review_findings and task_context through the project runtime
|
|
112
|
+
- prove a member review repair in the member repository
|
|
113
|
+
- match a quoted criterion without the list markers of its sub-bullets
|
|
114
|
+
- let finish run again after a failed serial Verify, and prepare-task replace a stale Verify sidecar
|
|
115
|
+
- accept a review repair whose files are not in its fix batch
|
|
116
|
+
- report unreviewed earlier waves in ready and prove repair-wave order
|
|
117
|
+
- say how to record a Log event when a transition changes no field
|
|
118
|
+
- tell the user how to get the full SHA when a ref is refused
|
|
119
|
+
- name the differing identity field when a model policy record does not match
|
|
120
|
+
- a review cycle replaces an older one only with a valid wave verdict
|
|
121
|
+
- land tasks that share an earlier task one at a time
|
|
122
|
+
- list worktrees on Git versions without worktree list -z
|
|
123
|
+
- keep tracked cd targets valid with the scoped deletion rules
|
|
124
|
+
- keep ordinary Git commands allowed with env and in new directories
|
|
125
|
+
- accept an unset base milestone only for a closed build recovery
|
|
126
|
+
- keep review evidence checks when a criterion number repeats
|
|
127
|
+
- keep the fallback for a missing bundled helper module
|
|
128
|
+
- git guard uses main when STATE has no default_branch
|
|
129
|
+
- do not skip an earlier Verify because its text is in the own Verify
|
|
130
|
+
- treat a declared directory and a path below it as overlapping files
|
|
131
|
+
- accept a default branch that starts with origin/ at ship
|
|
132
|
+
- re-raise an import error from inside a bundled helper module
|
|
133
|
+
- keep a blocked review cycle until a newer cycle has a verdict
|
|
134
|
+
- keep the cap exemption when a cap line carries the template comment
|
|
135
|
+
- run earlier-wave Verify at landing when a task edits the same files
|
|
136
|
+
- keep each review repair in one repo and lint landed briefs as history
|
|
137
|
+
- give a repeat finding its next repair and ignore repairs of a replaced review
|
|
138
|
+
- land files under a declared files directory
|
|
139
|
+
- let a define-entered re-slice amend the active roadmap entry
|
|
140
|
+
- keep wave reviews when a plan repair changes only caps or dependency notes
|
|
141
|
+
- drop superseded review cycles from the dashboard attention list
|
|
142
|
+
- load bundled helpers when a foreign `scripts` package is importable
|
|
143
|
+
- tolerate repeated criterion numbers and unset recovery base milestone
|
|
144
|
+
- chain an existing Git hook instead of refusing the hook install
|
|
145
|
+
- accept external-landing proof when the forge deletes the bound branch
|
|
146
|
+
- fail early on a non-main default and document external-landing
|
|
147
|
+
- cover all parameter syntaxes in scoped deletion
|
|
148
|
+
- fail closed on literal parameter target ambiguity
|
|
149
|
+
- scope destructive Git cleanup to Path-owned targets
|
|
150
|
+
|
|
151
|
+
### Other
|
|
152
|
+
- Resolve macOS temp path in ownership scope test fixture
|
|
153
|
+
- Check unfolded and folded readings of process substitutions
|
|
154
|
+
- Fold process substitutions; count only real earlier Git commands
|
|
155
|
+
- Check each reading of inexact Git commands; limit descriptor denial
|
|
156
|
+
- Split separator-joined redirections; read attached printf -v name
|
|
157
|
+
- Strip shell redirections before Git detection; keep alias words
|
|
158
|
+
- Both Windows failures have one cause, and it is a test defect, not a product defect. The fix is one line in `tests/test_member_native.py`; it is not committed. **Cause.** The failing assertion is the second leftover check in `test_next_finish_names_only_the_leftover_sidecar_of_a_landed_member_task` (line 136). The test's `attempt()` helper writes `app.py` with `write_text("v2\n")`, which is `v2\r\n` on Windows, and CI runs with `core.autocrlf=false`, so the landed blob is CRLF. The test then wrote the file back with `write_bytes(b"v2\n")`. On Windows those bytes are not the landed blob, so the driver correctly gave no "remove its leftover isolate" stop and reported `landed`, and the test raised `KeyError: 'reason'`. **Invariant.** A test that puts a "landed" file back must write the same bytes that were landed, on every platform. This was the only place in the branch's new tests that broke it: the sibling leftover tests in `test_dispatch_driver.py` and `test_isolation.py` pass on Windows. **Fix.** The restore now uses the same `write_text("v2\n", encoding="utf-8")` call as `attempt()`. No product code changed, so no generated copies needed a sync. **Verification (macOS only; no Windows run was possible here).** - `python3 -m unittest tests.test_member_native`: 6 tests pass. - With `Path.write_text` patched to write CRLF for `app.py` (to emulate Windows), the original test fails with the same `KeyError: 'reason'` at line 136, and the fixed test passes
|
|
159
|
+
- Read redirections and Git context names as the shell does
|
|
160
|
+
- list a part as retired only when dropped; document it
|
|
161
|
+
- record each retired part of a fix-task Verify
|
|
162
|
+
- retire copied Verify in fix tasks; restore _task_deps
|
|
163
|
+
- Prefer exact criterion quote; join any-indent sub-bullets
|
|
164
|
+
- give the leftover-isolate stop only after a content check
|
|
165
|
+
- Cause: both Windows checks fail in one test only, `test_gsd_path_text_in_a_path_does_not_make_a_worktree_path_owned` (18 subtest failures = 6 targets x 3 pipeline states). The test put a native path, not quoted, into a Bash command. On Windows the path has backslashes, Bash word splitting removes them (`C:\Users\x` becomes `C:Usersx`), and the guard correctly answers "needs a literal target". The guard code is correct; the test was not cross-platform. Invariant: a test that puts a filesystem path into a shell command must quote it, so the guard sees the same path on each OS. Fix (tests/test_guard_hook.py only, no change to scripts/guard_hook.py): - The two commands in the failing test now use `shlex.quote(str(target))`, the convention the file already uses in other tests. - Same edit at the two sibling sites in `test_forced_worktree_remove_checks_registered_path_and_owner` (`{task_worktree}`, `{managed}`). They passed on Windows only because `assert_denied` accepts any denial reason, so they did not test ownership there. - No other unquoted path interpolation into a `worktree remove` command exists in tests/test_guard_hook.py, tests/test_guard_hook_windows.py or tests/test_git_guard.py. Verification: the two changed tests pass locally on macOS (2 tests, OK). A check with `shlex.split` on a sample Windows path shows the unquoted form loses the backslashes and the quoted form keeps them. Not verified: an actual Windows run; that needs the next CI run. The full test suite was not run, because only two test methods changed. Changes are in the working tree, not committed
|
|
166
|
+
- restore the exact-heading repair marker test method
|
|
167
|
+
- align plan gate supersedes with runtime; trim reviewer rule
|
|
168
|
+
- match em-dash criteria in review_findings; correct placeholder message
|
|
169
|
+
- leave landed repair waves out of unreviewed_waves
|
|
170
|
+
- scope guard built-ins and worktree ownership correctly
|
|
171
|
+
- void wave reviews on any review_panel line change
|
|
172
|
+
- Cause: the PR's new test `test_validate_refuses_a_default_branch_that_cannot_be_recorded` (tests/test_members.py) wrote a MEMBERS.md row with `Checkout: /x`. On Windows `/x` is not an absolute path, so `members.py validate` stopped at the earlier check (`Checkout must be absolute`) and never reached the `Default branch` check. All 3 subtests failed on both Windows jobs (3.9 and 3.12, shard 2). The product code is correct. Invariant: a test row that targets one validation rule must be valid for every earlier rule on every OS. Sites checked in the changed area: - `test_validate_refuses_a_default_branch_that_cannot_be_recorded`: violated, fixed. - `repeated default branch` case in `test_validate_refuses_malformed_members_file` (also added by this PR, also uses `/x`): holds. It asserts only `MEMBERS.md` in stderr and passed on Windows. Not changed. Fix (1 line, test only): the row now uses `Checkout: {self.root / 'web'}`, which is absolute on each OS. This is the same pattern as the existing row at tests/test_members.py:190. Verification (macOS, local): - `python3 -m unittest tests.test_members -k default_branch`: 6 tests, OK. - Mutation check: with the `valid_default_branch` check in scripts/members.py disabled, the test fails with `failures=3`. The mutation was reverted; only tests/test_members.py is changed. - Not run on Windows locally. The Windows result depends on the next CI run. The change is not committed. The test-writer and ponytail skills were not invoked for this one-line test edit
|
|
173
|
+
- drop dash from cap value class, allow cost caps
|
|
174
|
+
- compare Config as raw text except cap values
|
|
175
|
+
- accept member-create rerun on row without default branch
|
|
176
|
+
- All 4 failing checks have one cause: the two new tests `test_land_staging_failure_reports_git_stderr` and `test_checkpoint_staging_failure_reports_git_stderr` in `tests/test_isolation.py` ("IsolationError not raised"). The fix is a test-only change in the helper `refuse_crlf_staging`; the product code is correct and is not changed. Root cause: the helper made `git add` fail with repository config `core.autocrlf=input` + `core.safecrlf=true`. The CI test runner (`scripts/dev/py.mjs`) sets `core.autocrlf=false` through `GIT_CONFIG_*` environment variables, and the environment overrides repository config. Thus on CI git did no CRLF conversion, `git add` passed, and no error was raised. The tests passed with plain `python3 -m unittest`, which is why the failure was not seen before the push. This is not an OS or git-version problem (Linux and Windows failed the same way). Invariant: a test that needs `git add` to fail must not depend on a git setting that the test runner overrides. The helper is the one shared boundary; only these two tests use it. No other test in this change sets `core.autocrlf`. Fix: the helper now writes `* text eol=lf` to `.git/info/attributes` (an attribute overrides `core.autocrlf`, and the file is outside the work tree, so it adds no pending path) and keeps `core.safecrlf=true`. The assertions are unchanged: they still require the error to end with git's stderr ("CRLF would be replaced by LF") and HEAD to stay at the base. Verification: - Reproduced the CI failure locally through `node scripts/dev/py.mjs` before the fix (2 failures). - After the fix the two tests pass through `node scripts/dev/py.mjs`, with plain `python3`, and with `core.autocrlf=true` forced through the environment. - Full `tests/test_isolation.py` through the CI runner: 155 tests, 1 failure. That failure is `RecoverTests.test_serial_task_recovers_after_only_project_bookkeeping_commits` (blocked subtest: verdict 'none', expected 'reconcile'). It also fails when run alone, it does not use the changed helper, the test and the recover code are not in this PR's diff, and CI reported only the two staging tests as failures. I did not change it. It looks like a local-environment difference (local git is 2.54, CI is 2.55), but I did not find its cause. Not run: the full repository suite and the Windows jobs (CI owns those)
|
|
177
|
+
- identify replaced-review repairs by history, not name
|
|
178
|
+
- split cap lines like the Config parser
|
|
179
|
+
- state Codex native hook needs trust in README
|
|
180
|
+
- keep cap lines with comment markers under Config guard
|
|
181
|
+
- correct canonical-file rule in CONTRIBUTING.md
|
|
182
|
+
- journal recovery_reviews so resumed approvals report dropped reviews
|
|
14
183
|
## [1.5.0] - 2026-10-09
|
|
15
184
|
|
|
16
185
|
### Added
|
package/DOCS.md
CHANGED
|
@@ -36,6 +36,7 @@ DOCS.md (here) four journeys in one place
|
|
|
36
36
|
| **Team** — pin skills in repo | `--local` install; see [Installing](#installing) |
|
|
37
37
|
| **Shipping broke** — archive commit blocked | [HOOKS.md](HOOKS.md) (expected with hooks) |
|
|
38
38
|
| **Several repos** — one milestone changes them all | [Multi-repo milestones](README.md#multi-repo-milestones) |
|
|
39
|
+
| **Several people** — one project | [Working with more than one person](FULL.md#working-with-more-than-one-person) |
|
|
39
40
|
|
|
40
41
|
---
|
|
41
42
|
|
|
@@ -101,9 +102,9 @@ README's Windows notes). **Always** restart the agent session after install.
|
|
|
101
102
|
|
|
102
103
|
Full roots and invocation table: [README.md](README.md#install-summary).
|
|
103
104
|
|
|
104
|
-
**Python installer:** `scripts/install.py
|
|
105
|
-
|
|
106
|
-
entry point.
|
|
105
|
+
**Python installer:** `scripts/install.py`; see
|
|
106
|
+
[README.md](README.md#install-summary) for what it supports. The Node CLI
|
|
107
|
+
remains the interactive wizard and npm entry point.
|
|
107
108
|
Help: `node scripts/install.mjs --help`
|
|
108
109
|
|
|
109
110
|
---
|
package/FULL.md
CHANGED
|
@@ -8,7 +8,8 @@ Complete walkthrough from install to shipped milestone.
|
|
|
8
8
|
|
|
9
9
|
**Contents:** [What it is](#what-gsd-path-is) · [Installation](#installation) ·
|
|
10
10
|
[Starting a milestone](#starting-a-milestone) · [Phases](#phases-and-your-role) ·
|
|
11
|
-
[Shipping](#shipping) · [Resume](#resume-and-recovery) ·
|
|
11
|
+
[Shipping](#shipping) · [Resume](#resume-and-recovery) ·
|
|
12
|
+
[More than one person](#working-with-more-than-one-person) · [Troubleshooting](#troubleshooting)
|
|
12
13
|
|
|
13
14
|
**Related docs**
|
|
14
15
|
|
|
@@ -86,8 +87,8 @@ Use the [router and phase invocation table](README.md#install-summary) for your
|
|
|
86
87
|
- **Python 3.9+** found as `python3`, `python`, or `py -3`; required for project
|
|
87
88
|
installs, project refresh, and project-state
|
|
88
89
|
doctor checks; optional for global-only Node installs. `scripts/install.py`
|
|
89
|
-
|
|
90
|
-
|
|
90
|
+
does not provide the interactive wizard; see
|
|
91
|
+
[README.md](README.md#install-summary) for what it supports
|
|
91
92
|
|
|
92
93
|
### Global install (default)
|
|
93
94
|
|
|
@@ -321,14 +322,18 @@ approve **Archive and ship**, the archive transaction begins:
|
|
|
321
322
|
- `MANIFEST.md` records contents and ship metadata
|
|
322
323
|
- One **ship commit** (subject `ship: M00N — <slug>`) touches only `.project/`
|
|
323
324
|
- Ship then either merges `gsd-path/M00N` onto `main` directly or opens a
|
|
324
|
-
GitHub PR and waits for you to merge it with a merge commit
|
|
325
|
-
include a GSD Path credit footer.
|
|
326
|
-
- After the
|
|
325
|
+
GitHub PR and waits for you to merge it with a merge commit or a rebase
|
|
326
|
+
merge. Path-created PRs include a GSD Path credit footer.
|
|
327
|
+
- After the landing validates, Path tags `milestone/<NNN>-<slug>`
|
|
327
328
|
- Archives are **read-only** — guard hooks enforce this if installed
|
|
328
329
|
|
|
329
330
|
Direct integration is the project default. Before build, ask the router to set
|
|
330
331
|
`pull-request` as the project default or as an override for the current
|
|
331
|
-
milestone. The setting locks when build starts.
|
|
332
|
+
milestone. The setting locks when build starts. When origin is not GitHub.com
|
|
333
|
+
and `main` accepts merge requests only, set `external-landing`: Path publishes
|
|
334
|
+
the milestone branch, you merge it in your own forge with the merge message
|
|
335
|
+
that Path returns, and Path then validates the merge and tags it. See
|
|
336
|
+
[integration](WORKFLOW.md#integration).
|
|
332
337
|
|
|
333
338
|
After `validate-integrated` passes, the next milestone starts clean on a new
|
|
334
339
|
`gsd-path/M00N` cut from `origin/main`. Invoke the router again; brownfield
|
|
@@ -407,6 +412,62 @@ in force; see [the collection helper](scripts/isolation.py).
|
|
|
407
412
|
|
|
408
413
|
---
|
|
409
414
|
|
|
415
|
+
## Working with more than one person
|
|
416
|
+
|
|
417
|
+
One operator drives a milestone. One checkout holds the bound branch
|
|
418
|
+
`gsd-path/M00N` and the `.project/` state of that milestone. A multi-repo
|
|
419
|
+
milestone does not change this: one coordinator checkout holds the state.
|
|
420
|
+
|
|
421
|
+
GSD Path does not record or check who approves a gate. The `STATE.md` log
|
|
422
|
+
keeps the date, the phase, and the event. The only name is the Git author of a
|
|
423
|
+
checkpoint commit, and GSD Path does not read it. Agree in your team who
|
|
424
|
+
approves.
|
|
425
|
+
|
|
426
|
+
**Supported**
|
|
427
|
+
|
|
428
|
+
- One person runs the router and approves the gates, in one checkout.
|
|
429
|
+
- Other people review and merge the result. Set `pull-request` integration
|
|
430
|
+
before build. Path opens the pull request and waits until a GitHub user
|
|
431
|
+
account merges it with a merge commit. Path does not check which user. With
|
|
432
|
+
`external-landing`, the review is the merge request in your own forge.
|
|
433
|
+
- A second session in the same checkout can ask for status and can run the
|
|
434
|
+
discussion skill. Status only reads. The discussion helper takes a lock and
|
|
435
|
+
only appends records.
|
|
436
|
+
- The desktop app and the monitor only read a watched project in the
|
|
437
|
+
background. Their explicit actions change install and configuration files.
|
|
438
|
+
They cannot advance a phase. See [daemon/README.md](daemon/README.md).
|
|
439
|
+
|
|
440
|
+
**Not protected**
|
|
441
|
+
|
|
442
|
+
- The locks are file locks on one computer, in one clone. They put helper
|
|
443
|
+
calls in sequence: state changes, approvals, discussion records, and
|
|
444
|
+
dispatch driver calls. A state change from an old view fails with
|
|
445
|
+
`expected state does not match`. A second dispatch driver call returns
|
|
446
|
+
`blocked`.
|
|
447
|
+
- The locks do not cover the files that agents write: the artifacts in
|
|
448
|
+
`.project/` and the product files. Two sessions that do phase work in one
|
|
449
|
+
checkout write to the same working tree.
|
|
450
|
+
- The locks do not reach a second clone. Each clone keeps its own `STATE.md`,
|
|
451
|
+
task landings, and approvals. GSD Path does not merge them. Ship stops
|
|
452
|
+
(`moved or collides`) when `origin` already has `gsd-path/M00N` from another
|
|
453
|
+
clone.
|
|
454
|
+
- You cannot share a milestone in progress through the remote. With
|
|
455
|
+
[guard hooks](HOOKS.md) installed, the pre-push hook refuses `gsd-path/M00N`
|
|
456
|
+
before its ship commit. It also refuses any other branch that carries the
|
|
457
|
+
unfinished state, unless the owner authorizes that exact commit (see
|
|
458
|
+
[HOOKS.md](HOOKS.md)). Hooks are optional and local to each clone. A clone
|
|
459
|
+
without hooks has no such check.
|
|
460
|
+
|
|
461
|
+
**Do not**
|
|
462
|
+
|
|
463
|
+
- Do not run the router or a phase skill for one milestone from two clones, or
|
|
464
|
+
from two sessions at the same time.
|
|
465
|
+
- Do not push `gsd-path/M00N` by hand, and do not merge another branch into
|
|
466
|
+
it.
|
|
467
|
+
- Do not squash or rebase the integration pull request or merge request.
|
|
468
|
+
|
|
469
|
+
---
|
|
470
|
+
|
|
410
471
|
## Standalone docs audit
|
|
411
472
|
|
|
412
473
|
`/gsd-path-docs-audit` runs between phases as a drift check. Findings get
|
package/HOOKS.md
CHANGED
|
@@ -77,6 +77,29 @@ setups (Husky and friends) and linked worktrees (where `.git` is a file).
|
|
|
77
77
|
Every selected host requires an initialized repository with a resolvable hooks
|
|
78
78
|
directory; otherwise installation stops before writing.
|
|
79
79
|
|
|
80
|
+
### Existing Git hooks
|
|
81
|
+
|
|
82
|
+
A repository can already have its own `pre-commit`, `commit-msg`, or `pre-push`
|
|
83
|
+
hook.
|
|
84
|
+
|
|
85
|
+
- **In the repository's own `.git/hooks`:** the installer keeps your hook as
|
|
86
|
+
`<hook>.gsd-path-chained` and writes the guard hook in its place. The guard
|
|
87
|
+
runs first. Your hook runs after it, with the same arguments and the same
|
|
88
|
+
`pre-push` input, only when the guard accepts. If the installation fails,
|
|
89
|
+
your hook is put back unchanged.
|
|
90
|
+
- **In a `core.hooksPath` directory (for example Husky) or a linked worktree:**
|
|
91
|
+
the installer stops with `cannot chain` and changes nothing. That directory
|
|
92
|
+
can be tracked or shared, so a rename there reaches other clones. Rename your
|
|
93
|
+
hook to `<hook>.gsd-path-chained` yourself, then rerun the installer. Commit
|
|
94
|
+
the rename when the directory is tracked.
|
|
95
|
+
- **`<hook>.gsd-path-chained` already exists beside a foreign hook:** the
|
|
96
|
+
installer stops. Decide which of the two files you want to keep.
|
|
97
|
+
|
|
98
|
+
Git hooks are local to a clone. A bot that merges on the server, such as
|
|
99
|
+
Renovate, never runs them, and its commits on the default branch do not
|
|
100
|
+
disturb milestone validation. A merge request can still conflict when the bot
|
|
101
|
+
and the milestone change the same file; Path does not resolve that conflict.
|
|
102
|
+
|
|
80
103
|
Git hooks work for **any** agent that commits. Native guard wiring denies a tool
|
|
81
104
|
call when its event is malformed or the guard cannot validate it.
|
|
82
105
|
|
|
@@ -128,9 +151,46 @@ See [UPDATE.md](UPDATE.md).
|
|
|
128
151
|
the archive tree; shell operands count an ancestor only for deletion or move
|
|
129
152
|
commands
|
|
130
153
|
- `git reset --hard`, destructive `git clean` modes, force pushes (including
|
|
131
|
-
`+` refspecs),
|
|
132
|
-
`git worktree remove --force`, `git stash drop`/`clear`, and whole-tree
|
|
154
|
+
`+` refspecs), `git branch -m`, `git stash drop`/`clear`, and whole-tree
|
|
133
155
|
`git checkout -- .`/`git restore .`
|
|
156
|
+
- forced branch deletion (`git branch -D`), `git update-ref` deletion, and
|
|
157
|
+
`git worktree remove --force` when the target is Path-owned: a `gsd-path/`,
|
|
158
|
+
`gsd-path-task/`, `gsd-path-verify/`, or `gsd-path-integrate/` branch, a
|
|
159
|
+
`refs/gsd-path/` ref, the bound `STATE.branch`, a task branch or worktree
|
|
160
|
+
that task frontmatter records, a worktree on one of these branches, and a
|
|
161
|
+
worktree below a managed worktree root (`~/.gsd-path`,
|
|
162
|
+
`GSD_PATH_WORKTREE_ROOT`, a pinned workspace root, or the earlier
|
|
163
|
+
`<repo>.gsd-path/` and `.<repo>-gsd-path-integrate-*` locations beside the
|
|
164
|
+
repository). The text `gsd-path` in a path does not make a worktree
|
|
165
|
+
Path-owned. Also Path-owned: the remote-tracking ref of one of these
|
|
166
|
+
branches (`origin/gsd-path/M001`), `refs/stash`, and a name that differs
|
|
167
|
+
from a recorded branch only in letter case. Other branches, refs, and
|
|
168
|
+
registered worktrees are allowed in each pipeline state. These three
|
|
169
|
+
commands are also denied when the guard cannot prove the target: a missing,
|
|
170
|
+
non-literal, or unregistered target, a shell parameter in the Git command
|
|
171
|
+
(`git -C "$dir" branch -D x`), a `~` or glob in a Git option value,
|
|
172
|
+
`update-ref --stdin`, an `update-ref` name outside `refs/` (`HEAD`) or an
|
|
173
|
+
option cluster (`-dm`), an `update-ref` deletion without `--no-deref` after
|
|
174
|
+
another Git command in the same command line, ownership metadata it cannot
|
|
175
|
+
read, a working directory that does not exist yet, or an `env` wrapper that
|
|
176
|
+
resets or unsets `HOME`, `XDG_CONFIG_HOME`, or a `GIT_*` variable. They are
|
|
177
|
+
denied too after a directory change the guard cannot model. Only
|
|
178
|
+
`cd <directory>` or `cd -- <directory>` is modeled, with one literal
|
|
179
|
+
directory that is absolute or starts with `./` or `../` (a shell with
|
|
180
|
+
`CDPATH` looks for a plain relative name in other directories). Another
|
|
181
|
+
command name (`pushd`, `chdir`), an option, a second operand, a redirection,
|
|
182
|
+
a `cd` in a subshell, pipeline, condition, function, alias, trap, or
|
|
183
|
+
comment line is not modeled. Use `git -C <directory>` there. A plain
|
|
184
|
+
redirection on the Git command (`2>/dev/null`, `>file`, `>>file`, `<file`,
|
|
185
|
+
`2>&1`, `&>file`) is not a target. A here-document, here-string, process
|
|
186
|
+
substitution, a redirection target that is not one literal word, or a
|
|
187
|
+
`# comment` after the command keeps the denial. So does a file
|
|
188
|
+
descriptor word of more than one digit or a `{name}` word against a
|
|
189
|
+
redirection (`10>file`, `{fd}>file`), because bash and zsh read that word
|
|
190
|
+
differently. With
|
|
191
|
+
such an `env` wrapper, or in a directory that does not exist yet, a Git
|
|
192
|
+
command that is not a built-in command is denied too, because its alias
|
|
193
|
+
cannot be inspected
|
|
134
194
|
- shell writes (redirections, `tee`, `cp`, `mv`, `rm`, `sed -i`, ...) that
|
|
135
195
|
target a routing control (`.git`, `.project/STATE.md`, `.project/next`,
|
|
136
196
|
`.gsd-path`) while `.project/STATE.md` exists, or target a product file
|
|
@@ -291,6 +351,22 @@ such as `rm -rf scratch` passes the archive check; other guard rules still apply
|
|
|
291
351
|
without `STATE.md` passes on an ordinary ref. An absent bound ref passes
|
|
292
352
|
deletion. The authorized publisher is `archive_milestone.py integrate`;
|
|
293
353
|
the hook checks ref updates, not which client initiated them
|
|
354
|
+
- **allows** an owner-approved push of unshipped work, such as a task
|
|
355
|
+
branch that CI must measure before the task can finish. The owner records
|
|
356
|
+
the exact commit for the exact branch, then pushes it:
|
|
357
|
+
|
|
358
|
+
```bash
|
|
359
|
+
git update-ref refs/gsd-path/authorizations/<project>/push/refs/heads/<branch> <commit>
|
|
360
|
+
```
|
|
361
|
+
|
|
362
|
+
`<project>` is the `project` field in that commit's `STATE.md`. The hook
|
|
363
|
+
accepts the push only at that commit; a later commit, such as one that
|
|
364
|
+
removes the measurement inputs, needs its own record. Bound `gsd-path/M###`
|
|
365
|
+
refs, the default branch, and tags never accept an authorization. The
|
|
366
|
+
authorization accepts every push of that commit to that branch until the
|
|
367
|
+
owner removes it with `git update-ref -d <same ref>`. Deleting the remote
|
|
368
|
+
branch afterwards needs no authorization. Only the owner records an
|
|
369
|
+
authorization; an agent asks the owner for one
|
|
294
370
|
- **allows** adding files to archive during the ship transaction, before the
|
|
295
371
|
branch closes
|
|
296
372
|
|
|
@@ -298,8 +374,8 @@ These local hooks cover pushes made by plain Git and clients that invoke
|
|
|
298
374
|
Git with hooks enabled. Creating a PR from an already published ref does not
|
|
299
375
|
run the pre-push hook. A branch cut from `main` carrying `shipped/done` passes;
|
|
300
376
|
if `main` instead carries an unshipped bound state, pushes of branches carrying
|
|
301
|
-
that state remain blocked
|
|
302
|
-
pipeline.
|
|
377
|
+
that state remain blocked, except owner-authorized commits, until the
|
|
378
|
+
milestone records are repaired through the pipeline.
|
|
303
379
|
|
|
304
380
|
## GitHub-side gate
|
|
305
381
|
|
|
@@ -366,6 +442,7 @@ not intercept subagent tools — treat coverage as orchestrator-level.
|
|
|
366
442
|
| `ship:` commit blocked with `app.py` staged | Ship commits may only touch `.project/` |
|
|
367
443
|
| Tool denied editing archive | Pre-tool guard — use active paths, not archive |
|
|
368
444
|
| Hook not running in Cursor | Run `--hooks-refresh-full --cursor --project /path/to/repo` |
|
|
445
|
+
| Installer stops with `cannot chain` | See [existing Git hooks](#existing-git-hooks): rename your hook to `<hook>.gsd-path-chained`, or remove the stale chained file, then rerun |
|
|
369
446
|
| `--hooks-refresh` rejects an unmanaged guard | Move the foreign guard aside, then rerun refresh; use `--hooks-init` if guards are wanted |
|
|
370
447
|
| Runtime missing, invalid, or legacy | Follow [runtime restoration or migration](DOCS.md#project-runtime-versions) |
|
|
371
448
|
|
package/MIGRATE.md
CHANGED
|
@@ -10,6 +10,18 @@ selected project. Core history stays in `.planning/`; Path creates its own
|
|
|
10
10
|
`.project/` state through the normal router. Core phase positions and completed
|
|
11
11
|
plans do not become passed Path gates.
|
|
12
12
|
|
|
13
|
+
## Requirements
|
|
14
|
+
|
|
15
|
+
- The default branch of `origin` can have any name, for example `master`.
|
|
16
|
+
Path initialization records it in `.project/STATE.md` as `default_branch`
|
|
17
|
+
and ships onto it. Run `git remote set-head origin --auto` before the first
|
|
18
|
+
Path run: an unset `origin/HEAD` records `main`. See
|
|
19
|
+
[default branch](WORKFLOW.md#default-branch).
|
|
20
|
+
- Pull-request shipping supports GitHub.com only. On GitLab, Gitea, or GitHub
|
|
21
|
+
Enterprise Server, ship with `direct`, or with
|
|
22
|
+
[`external-landing`](WORKFLOW.md#integration) when the default branch
|
|
23
|
+
accepts merge requests only.
|
|
24
|
+
|
|
13
25
|
## Start
|
|
14
26
|
|
|
15
27
|
Install or update GSD Path using [the install guide](QUICK.md). In the Core
|
package/QUICK.md
CHANGED
|
@@ -13,8 +13,10 @@
|
|
|
13
13
|
One router skill drives a gated pipeline: inspect → define → research → decide →
|
|
14
14
|
plan → build → ship. Every handoff lives in `.project/` so any session can resume from disk.
|
|
15
15
|
|
|
16
|
-
**Hosts:** Codex, Claude Code, Grok, OpenCode,
|
|
17
|
-
|
|
16
|
+
**Hosts:** Codex, Claude Code, Grok, OpenCode, Antigravity, Cursor, and Kimi
|
|
17
|
+
Code have a passing live milestone for release 1.6.1. Copilot CLI, Qwen, Zed,
|
|
18
|
+
Kiro, and Muse Code install, but have no live milestone for that release. See
|
|
19
|
+
[host tiers](README.md).
|
|
18
20
|
|
|
19
21
|
---
|
|
20
22
|
|
package/README.md
CHANGED
|
@@ -9,21 +9,29 @@ milestone loop. While a milestone builds, the next one can be planned in
|
|
|
9
9
|
parallel under `.project/next/` (lookahead); a building milestone can also be
|
|
10
10
|
abandoned on an explicit ruling, archiving its partial work for a re-slice.
|
|
11
11
|
|
|
12
|
-
**
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
12
|
+
**Hosts with a passing full live milestone for release 1.6.1:** Codex, Claude
|
|
13
|
+
Code, Grok, OpenCode, Antigravity CLI, Cursor, and Kimi Code.
|
|
14
|
+
|
|
15
|
+
**Hosts with an installer and a dispatch contract, but no live milestone for
|
|
16
|
+
release 1.6.1:** GitHub Copilot CLI (account quota exhausted), Qwen Code, Zed,
|
|
17
|
+
and Kiro (API credits), and Muse Code (no live release evidence recorded yet).
|
|
18
|
+
These hosts are excluded from the release evaluation. Exclusion is not a pass.
|
|
19
|
+
|
|
20
|
+
With guard hooks installed, only Claude Code and Cursor get a fail-closed
|
|
21
|
+
native guard; every other host relies on Git hooks. The installer also writes a
|
|
22
|
+
native Codex hook, and it runs only after you trust it (see [HOOKS.md](HOOKS.md)).
|
|
23
|
+
The [host trust matrix](https://github.com/open-gsd/gsd-path/blob/main/docs/trust-validation/HOST-MATRIX.md)
|
|
24
|
+
is the source of truth for live milestone proof and each host's guard tier.
|
|
17
25
|
|
|
18
26
|
<!-- release-docs -->
|
|
19
|
-
**Latest npm release:** [@opengsd/gsd-path@1.
|
|
27
|
+
**Latest npm release:** [@opengsd/gsd-path@1.6.1](https://www.npmjs.com/package/@opengsd/gsd-path/v/1.6.1) — [release notes](CHANGELOG.md#161---2026-10-16)
|
|
20
28
|
|
|
21
29
|
**Recent highlights**
|
|
22
|
-
-
|
|
23
|
-
-
|
|
24
|
-
-
|
|
25
|
-
-
|
|
26
|
-
-
|
|
30
|
+
- accept GitHub rebase merges in pull-request integration
|
|
31
|
+
- run dispatch_driver subprocess helpers from the selected runtime
|
|
32
|
+
- refuse a relative model_policy --record and check release before locking
|
|
33
|
+
- let promote-next replace a DOCS-AUDIT carry-forward the lookahead keeps
|
|
34
|
+
- let the owner authorize one exact pre-ship push to a task branch
|
|
27
35
|
|
|
28
36
|
<!-- /release-docs -->
|
|
29
37
|
|
|
@@ -120,7 +128,13 @@ contain newer changes.
|
|
|
120
128
|
|
|
121
129
|
1. Open your project folder in your coding-agent host. Existing repositories
|
|
122
130
|
need Git; GitHub repository creation and pull-request operations also need
|
|
123
|
-
an authenticated GitHub CLI (`gh`).
|
|
131
|
+
an authenticated GitHub CLI (`gh`). The default branch of `origin` can have
|
|
132
|
+
any name: Path records it at initialization and ships onto it. This guide
|
|
133
|
+
calls it `main`; see [default branch](WORKFLOW.md#default-branch).
|
|
134
|
+
Pull-request
|
|
135
|
+
shipping supports GitHub.com only. On GitLab, Gitea, or GitHub Enterprise
|
|
136
|
+
Server, use the [`external-landing` mode](WORKFLOW.md#integration) when
|
|
137
|
+
the default branch accepts merge requests only.
|
|
124
138
|
2. Start or reload the host session so it discovers the installed skills.
|
|
125
139
|
3. Invoke `$path` in Codex, or `/path` on slash-command hosts. The router
|
|
126
140
|
identifies the project and guides you through the required inputs and approvals.
|
|
@@ -151,6 +165,25 @@ project settings. Dashboard users can open **Settings → Path settings** for th
|
|
|
151
165
|
same shipping, model/effort, and future review-panel controls. See
|
|
152
166
|
[Path settings](skills/gsd-path/references/config.md) for precedence and locks.
|
|
153
167
|
|
|
168
|
+
### Uninstall
|
|
169
|
+
|
|
170
|
+
```bash
|
|
171
|
+
npx @opengsd/gsd-path@latest --uninstall --all --dry-run
|
|
172
|
+
npx @opengsd/gsd-path@latest --uninstall --all
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
`--uninstall` removes the installed GSD Path skills from the selected hosts.
|
|
176
|
+
For Cursor it also removes the GSD Path subagent file. Use host flags instead
|
|
177
|
+
of `--all` to select hosts. For project-local skills, run the command from
|
|
178
|
+
your project directory and add `--local`. `--dry-run` shows each path and
|
|
179
|
+
removes nothing.
|
|
180
|
+
|
|
181
|
+
The command removes only GSD Path skills. It keeps other skills, host
|
|
182
|
+
settings, and `disabled-gsd-skills` backups. It makes no backup: changes that
|
|
183
|
+
you made in a GSD Path skill directory are lost. It does not remove project
|
|
184
|
+
contracts or hooks (`.project/`, `.gsd-path/`, the `AGENTS.md` block, guard
|
|
185
|
+
hooks). See [Uninstall skills](UPDATE.md#uninstall-skills).
|
|
186
|
+
|
|
154
187
|
## Desktop app
|
|
155
188
|
|
|
156
189
|
The **OpenGSD Path app** shows your projects without opening each project's
|
|
@@ -358,12 +391,30 @@ partial remote/clone/worktree transaction; the default checkout stays clean.
|
|
|
358
391
|
One project can change several repositories in the same milestone. The
|
|
359
392
|
**coordinator** repo holds `.project/` and runs the pipeline; each other repo
|
|
360
393
|
is a **member** listed in `.project/MEMBERS.md`. A member needs a GitHub.com
|
|
361
|
-
`origin
|
|
394
|
+
`origin`. Its default branch can have any name, and it can differ from the
|
|
395
|
+
default branch of the coordinator and of the other members. See
|
|
362
396
|
[ADR 0002](docs/adr/0002-multi-repo-coordinator.md) for the design.
|
|
363
397
|
|
|
398
|
+
`MEMBERS.md` has one section per member, in ship order. `members.py` writes
|
|
399
|
+
it; do not edit it by hand:
|
|
400
|
+
|
|
401
|
+
```markdown
|
|
402
|
+
## web
|
|
403
|
+
Checkout: /absolute/path/to/web
|
|
404
|
+
Remote: https://github.com/acme/web.git
|
|
405
|
+
Integration: default
|
|
406
|
+
Default branch: master
|
|
407
|
+
```
|
|
408
|
+
|
|
409
|
+
`Default branch` is the member's default branch on `origin`. `members.py add`
|
|
410
|
+
records it one time, from the member's local `origin/HEAD`; run
|
|
411
|
+
`git remote set-head origin --auto` in the member first. A section without
|
|
412
|
+
the field means `main`. See [default branch](WORKFLOW.md#default-branch).
|
|
413
|
+
|
|
364
414
|
- Add members at a milestone boundary: ask the router to add an existing repo
|
|
365
415
|
(`members.py add`) or to create a new one (`members.py add --create`, after
|
|
366
|
-
you approve the exact owner, name, visibility, and checkout
|
|
416
|
+
you approve the exact owner, name, visibility, and checkout; a new
|
|
417
|
+
repository uses `main`). For optional
|
|
367
418
|
guard hooks, install them in the member with
|
|
368
419
|
`npx @opengsd/gsd-path@latest --member-of <coordinator> --project <member>`.
|
|
369
420
|
- The planner gives each member task `repo: <member>`; one task changes one
|
|
@@ -414,7 +465,8 @@ an atomic close across repos.
|
|
|
414
465
|
Shipping moves milestone artifacts into `archive/` with a MANIFEST. It then
|
|
415
466
|
either merges the milestone's `gsd-path/M00N` branch into `main` directly or
|
|
416
467
|
opens/reuses a GitHub PR and waits for its user-controlled merge. Path reports
|
|
417
|
-
shipped only after a two-parent merge
|
|
468
|
+
shipped only after the landing (a two-parent merge, or a proven GitHub rebase
|
|
469
|
+
merge of the PR) and the milestone tag validate. Before
|
|
418
470
|
any next-milestone files change, the router binds
|
|
419
471
|
a new `gsd-path/M00N` at the updated `origin/main`. `STATE.md`, `REPOSITORY.md`,
|
|
420
472
|
`LESSONS.md`, `next/`, and the program artifacts (`CHARTER.md`, `ROADMAP.md`,
|
|
@@ -438,6 +490,7 @@ node scripts/install.mjs --all --local
|
|
|
438
490
|
node scripts/install.mjs --all --project /path/to/project
|
|
439
491
|
node scripts/install.mjs --update
|
|
440
492
|
node scripts/install.mjs --all --update --project /path/to/project # refresh .gsd-path/; keeps contracts
|
|
493
|
+
node scripts/install.mjs --uninstall --all --dry-run # preview; removes skills only
|
|
441
494
|
```
|
|
442
495
|
|
|
443
496
|
| Flag | User skills root | Invoke |
|
|
@@ -457,7 +510,7 @@ OpenCode stable: ask to load and use the `gsd-path` skill.
|
|
|
457
510
|
`gsd-path` remains the canonical router name; `path` is its short menu alias.
|
|
458
511
|
For a single phase, use `$gsd-path-plan` in Codex or `/gsd-path-plan` on slash hosts.
|
|
459
512
|
|
|
460
|
-
`scripts/install.py` — Python install, including `--local
|
|
513
|
+
`scripts/install.py` — Python install, including `--local`, `--update`, and `--uninstall`.
|
|
461
514
|
The Node CLI remains the interactive and npm entry point. See [FULL.md](FULL.md) and
|
|
462
515
|
[UPDATE.md](UPDATE.md) for `--hooks`, `--hooks-refresh`, `--local`, and host notes.
|
|
463
516
|
|