@opengsd/gsd-path 1.0.0 → 1.2.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.
Files changed (498) hide show
  1. package/AGENTS.md +33 -13
  2. package/CHANGELOG.md +68 -0
  3. package/DOCS.md +75 -6
  4. package/FULL.md +12 -15
  5. package/HOOKS.md +18 -9
  6. package/QUICK.md +8 -6
  7. package/README.md +218 -14
  8. package/RUNTIME.md +16 -5
  9. package/UPDATE.md +30 -11
  10. package/WORKFLOW.md +35 -16
  11. package/package.json +23 -1
  12. package/platforms/claude/dispatch.md +4 -4
  13. package/platforms/copilot/dispatch.md +4 -4
  14. package/platforms/cursor/dispatch.md +5 -10
  15. package/platforms/grok/dispatch.md +4 -6
  16. package/platforms/kimi/dispatch.md +4 -4
  17. package/platforms/kiro/dispatch.md +4 -6
  18. package/platforms/opencode/dispatch.md +4 -4
  19. package/platforms/qwen/dispatch.md +4 -4
  20. package/platforms/shared-agents/dispatch.md +12 -19
  21. package/scripts/_common.py +5 -0
  22. package/scripts/archive_milestone.py +30 -124
  23. package/scripts/bootstrap_repository.py +33 -4
  24. package/scripts/build_recovery.py +292 -0
  25. package/scripts/build_state.py +2 -0
  26. package/scripts/check_docs_audit.py +7 -3
  27. package/scripts/check_handoffs.py +7 -1
  28. package/scripts/check_task_briefs.py +3 -0
  29. package/scripts/detect_project.py +22 -3
  30. package/scripts/discussion_records.py +3 -0
  31. package/scripts/discussion_validate.py +8 -3
  32. package/scripts/dispatch_driver.py +233 -22
  33. package/scripts/git_guard.py +14 -5
  34. package/scripts/guard_hook.py +11 -1
  35. package/scripts/install.mjs +54 -1448
  36. package/scripts/install.py +155 -188
  37. package/scripts/integration.py +54 -28
  38. package/scripts/isolation.py +24 -6
  39. package/scripts/jev_review.py +138 -0
  40. package/scripts/lean_verification.py +3 -1
  41. package/scripts/loop_run.py +2 -0
  42. package/scripts/model_policy.py +279 -0
  43. package/scripts/path_config.py +248 -0
  44. package/scripts/pipeline_diagnose.py +15 -3
  45. package/scripts/pipeline_git.py +3 -0
  46. package/scripts/pipeline_state.py +117 -186
  47. package/scripts/pipeline_undo.py +14 -7
  48. package/scripts/promote_lookahead.py +33 -162
  49. package/scripts/review_panel.py +11 -0
  50. package/scripts/roadmap.py +326 -0
  51. package/scripts/runtime_store.py +278 -0
  52. package/scripts/skill-resources.json +182 -4
  53. package/scripts/state_checkpoint.py +114 -72
  54. package/scripts/state_promote.py +47 -44
  55. package/scripts/status_runtime.py +92 -6
  56. package/scripts/task_context.py +73 -0
  57. package/scripts/token_budget.py +40 -1
  58. package/scripts/workflow_run.py +128 -8
  59. package/scripts/worktree_paths.py +94 -0
  60. package/skills/gsd-path/BUILD.md +54 -575
  61. package/skills/gsd-path/DECIDE.md +4 -6
  62. package/skills/gsd-path/DEFINE.md +23 -21
  63. package/skills/gsd-path/DOCS-AUDIT.md +2 -0
  64. package/skills/gsd-path/INSPECT.md +32 -8
  65. package/skills/gsd-path/PLAN.md +29 -19
  66. package/skills/gsd-path/RESEARCH.md +5 -6
  67. package/skills/gsd-path/ROADMAP.md +24 -58
  68. package/skills/gsd-path/SHIP.md +29 -17
  69. package/skills/gsd-path/SKILL.md +46 -22
  70. package/skills/gsd-path/references/build-abandon.md +33 -0
  71. package/skills/gsd-path/references/build-native.md +502 -0
  72. package/skills/gsd-path/references/build-recovery.md +78 -0
  73. package/skills/gsd-path/references/coder.md +8 -3
  74. package/skills/gsd-path/references/config.md +57 -0
  75. package/skills/gsd-path/references/dispatch.md +12 -19
  76. package/skills/gsd-path/references/docs-auditor.md +14 -0
  77. package/skills/gsd-path/references/jev-review.md +82 -0
  78. package/skills/gsd-path/references/model-policy.md +139 -0
  79. package/skills/gsd-path/references/reviewer-final.md +21 -0
  80. package/skills/gsd-path/references/reviewer-panel.md +17 -0
  81. package/skills/gsd-path/references/reviewer-skeptic.md +20 -0
  82. package/skills/gsd-path/references/reviewer-wave.md +89 -0
  83. package/skills/gsd-path/references/reviewer.md +12 -148
  84. package/skills/gsd-path/references/runtime-selection.md +25 -0
  85. package/skills/gsd-path/scripts/__pycache__/_common.cpython-312.pyc +0 -0
  86. package/skills/gsd-path/scripts/__pycache__/check_handoffs.cpython-312.pyc +0 -0
  87. package/skills/gsd-path/scripts/_common.py +5 -0
  88. package/skills/gsd-path/scripts/archive_milestone.py +30 -124
  89. package/skills/gsd-path/scripts/bootstrap_repository.py +33 -4
  90. package/skills/gsd-path/scripts/build_recovery.py +292 -0
  91. package/skills/gsd-path/scripts/build_state.py +2 -0
  92. package/skills/gsd-path/scripts/check_docs_audit.py +7 -3
  93. package/skills/gsd-path/scripts/check_handoffs.py +7 -1
  94. package/skills/gsd-path/scripts/check_task_briefs.py +3 -0
  95. package/skills/gsd-path/scripts/detect_project.py +22 -3
  96. package/skills/gsd-path/scripts/discussion_records.py +3 -0
  97. package/skills/gsd-path/scripts/discussion_validate.py +8 -3
  98. package/skills/gsd-path/scripts/dispatch_driver.py +233 -22
  99. package/skills/gsd-path/scripts/git_guard.py +768 -0
  100. package/skills/gsd-path/scripts/integration.py +54 -28
  101. package/skills/gsd-path/scripts/isolation.py +24 -6
  102. package/skills/gsd-path/scripts/jev_review.py +138 -0
  103. package/skills/gsd-path/scripts/lean_verification.py +3 -1
  104. package/skills/gsd-path/scripts/loop_run.py +2 -0
  105. package/skills/gsd-path/scripts/model_policy.py +279 -0
  106. package/skills/gsd-path/scripts/path_config.py +248 -0
  107. package/skills/gsd-path/scripts/pipeline_git.py +3 -0
  108. package/skills/gsd-path/scripts/pipeline_state.py +117 -186
  109. package/skills/gsd-path/scripts/promote_lookahead.py +33 -162
  110. package/skills/gsd-path/scripts/review_panel.py +11 -0
  111. package/skills/gsd-path/scripts/roadmap.py +326 -0
  112. package/skills/gsd-path/scripts/state_checkpoint.py +114 -72
  113. package/skills/gsd-path/scripts/state_promote.py +47 -44
  114. package/skills/gsd-path/scripts/status_runtime.py +208 -0
  115. package/skills/gsd-path/scripts/task_context.py +73 -0
  116. package/skills/gsd-path/scripts/token_budget.py +40 -1
  117. package/skills/gsd-path/scripts/workflow_run.py +128 -8
  118. package/skills/gsd-path/scripts/worktree_paths.py +94 -0
  119. package/skills/gsd-path/templates/skeptic.md +1 -1
  120. package/skills/gsd-path/templates/task.md +2 -0
  121. package/skills/gsd-path/templates/wave-panel.md +1 -1
  122. package/skills/gsd-path/templates/wave-review.md +1 -1
  123. package/skills/gsd-path-build/SKILL.md +54 -575
  124. package/skills/gsd-path-build/references/build-abandon.md +33 -0
  125. package/skills/gsd-path-build/references/build-native.md +502 -0
  126. package/skills/gsd-path-build/references/build-recovery.md +78 -0
  127. package/skills/gsd-path-build/references/coder.md +8 -3
  128. package/skills/gsd-path-build/references/dispatch.md +12 -19
  129. package/skills/gsd-path-build/references/jev-review.md +82 -0
  130. package/skills/gsd-path-build/references/model-policy.md +139 -0
  131. package/skills/gsd-path-build/references/reviewer-final.md +21 -0
  132. package/skills/gsd-path-build/references/reviewer-panel.md +17 -0
  133. package/skills/gsd-path-build/references/reviewer-skeptic.md +20 -0
  134. package/skills/gsd-path-build/references/reviewer-wave.md +89 -0
  135. package/skills/gsd-path-build/references/reviewer.md +12 -148
  136. package/skills/gsd-path-build/references/runtime-selection.md +25 -0
  137. package/skills/gsd-path-build/scripts/__pycache__/_common.cpython-312.pyc +0 -0
  138. package/skills/gsd-path-build/scripts/__pycache__/check_handoffs.cpython-312.pyc +0 -0
  139. package/skills/gsd-path-build/scripts/_common.py +5 -0
  140. package/skills/gsd-path-build/scripts/archive_milestone.py +30 -124
  141. package/skills/gsd-path-build/scripts/build_recovery.py +292 -0
  142. package/skills/gsd-path-build/scripts/build_state.py +2 -0
  143. package/skills/gsd-path-build/scripts/check_handoffs.py +7 -1
  144. package/skills/gsd-path-build/scripts/check_task_briefs.py +3 -0
  145. package/skills/gsd-path-build/scripts/detect_project.py +1536 -0
  146. package/skills/gsd-path-build/scripts/discussion_records.py +3 -0
  147. package/skills/gsd-path-build/scripts/discussion_validate.py +8 -3
  148. package/skills/gsd-path-build/scripts/dispatch_driver.py +233 -22
  149. package/skills/gsd-path-build/scripts/integration.py +54 -28
  150. package/skills/gsd-path-build/scripts/isolation.py +24 -6
  151. package/skills/gsd-path-build/scripts/jev_review.py +138 -0
  152. package/skills/gsd-path-build/scripts/loop_run.py +2 -0
  153. package/skills/gsd-path-build/scripts/model_policy.py +279 -0
  154. package/skills/gsd-path-build/scripts/path_config.py +248 -0
  155. package/skills/gsd-path-build/scripts/pipeline_git.py +3 -0
  156. package/skills/gsd-path-build/scripts/pipeline_state.py +117 -186
  157. package/skills/gsd-path-build/scripts/promote_lookahead.py +286 -0
  158. package/skills/gsd-path-build/scripts/review_panel.py +11 -0
  159. package/skills/gsd-path-build/scripts/roadmap.py +326 -0
  160. package/skills/gsd-path-build/scripts/state_checkpoint.py +114 -72
  161. package/skills/gsd-path-build/scripts/state_promote.py +47 -44
  162. package/skills/gsd-path-build/scripts/task_context.py +73 -0
  163. package/skills/gsd-path-build/scripts/token_budget.py +40 -1
  164. package/skills/gsd-path-build/scripts/workflow_run.py +128 -8
  165. package/skills/gsd-path-build/scripts/worktree_paths.py +94 -0
  166. package/skills/gsd-path-build/templates/skeptic.md +1 -1
  167. package/skills/gsd-path-build/templates/task.md +2 -0
  168. package/skills/gsd-path-build/templates/wave-panel.md +1 -1
  169. package/skills/gsd-path-build/templates/wave-review.md +1 -1
  170. package/skills/gsd-path-decide/SKILL.md +4 -6
  171. package/skills/gsd-path-decide/references/dispatch.md +12 -19
  172. package/skills/gsd-path-decide/references/model-policy.md +139 -0
  173. package/skills/gsd-path-decide/references/runtime-selection.md +25 -0
  174. package/skills/gsd-path-decide/scripts/_common.py +5 -0
  175. package/skills/gsd-path-decide/scripts/archive_milestone.py +2171 -0
  176. package/skills/gsd-path-decide/scripts/build_recovery.py +292 -0
  177. package/skills/gsd-path-decide/scripts/check_handoffs.py +7 -1
  178. package/skills/gsd-path-decide/scripts/check_task_briefs.py +3 -0
  179. package/skills/gsd-path-decide/scripts/detect_project.py +1536 -0
  180. package/skills/gsd-path-decide/scripts/discussion_records.py +3 -0
  181. package/skills/gsd-path-decide/scripts/discussion_validate.py +1326 -0
  182. package/skills/gsd-path-decide/scripts/integration.py +1459 -0
  183. package/skills/gsd-path-decide/scripts/isolation.py +24 -6
  184. package/skills/gsd-path-decide/scripts/loop_run.py +839 -0
  185. package/skills/gsd-path-decide/scripts/model_policy.py +279 -0
  186. package/skills/gsd-path-decide/scripts/path_config.py +248 -0
  187. package/skills/gsd-path-decide/scripts/pipeline_git.py +3 -0
  188. package/skills/gsd-path-decide/scripts/pipeline_state.py +117 -186
  189. package/skills/gsd-path-decide/scripts/promote_lookahead.py +286 -0
  190. package/skills/gsd-path-decide/scripts/review_panel.py +564 -0
  191. package/skills/gsd-path-decide/scripts/roadmap.py +326 -0
  192. package/skills/gsd-path-decide/scripts/state_checkpoint.py +114 -72
  193. package/skills/gsd-path-decide/scripts/state_promote.py +47 -44
  194. package/skills/gsd-path-decide/scripts/worktree_paths.py +94 -0
  195. package/skills/gsd-path-define/SKILL.md +23 -21
  196. package/skills/gsd-path-define/references/build-recovery.md +78 -0
  197. package/skills/gsd-path-define/references/runtime-selection.md +25 -0
  198. package/skills/gsd-path-define/scripts/_common.py +5 -0
  199. package/skills/gsd-path-define/scripts/archive_milestone.py +2171 -0
  200. package/skills/gsd-path-define/scripts/build_recovery.py +292 -0
  201. package/skills/gsd-path-define/scripts/check_handoffs.py +7 -1
  202. package/skills/gsd-path-define/scripts/check_task_briefs.py +3 -0
  203. package/skills/gsd-path-define/scripts/detect_project.py +22 -3
  204. package/skills/gsd-path-define/scripts/discussion_records.py +3 -0
  205. package/skills/gsd-path-define/scripts/discussion_validate.py +1326 -0
  206. package/skills/gsd-path-define/scripts/integration.py +1459 -0
  207. package/skills/gsd-path-define/scripts/isolation.py +24 -6
  208. package/skills/gsd-path-define/scripts/loop_run.py +839 -0
  209. package/skills/gsd-path-define/scripts/model_policy.py +279 -0
  210. package/skills/gsd-path-define/scripts/path_config.py +248 -0
  211. package/skills/gsd-path-define/scripts/pipeline_git.py +3 -0
  212. package/skills/gsd-path-define/scripts/pipeline_state.py +117 -186
  213. package/skills/gsd-path-define/scripts/promote_lookahead.py +286 -0
  214. package/skills/gsd-path-define/scripts/review_panel.py +564 -0
  215. package/skills/gsd-path-define/scripts/roadmap.py +326 -0
  216. package/skills/gsd-path-define/scripts/state_checkpoint.py +114 -72
  217. package/skills/gsd-path-define/scripts/state_promote.py +47 -44
  218. package/skills/gsd-path-define/scripts/worktree_paths.py +94 -0
  219. package/skills/gsd-path-discuss/SKILL.md +2 -0
  220. package/skills/gsd-path-discuss/references/runtime-selection.md +25 -0
  221. package/skills/gsd-path-discuss/scripts/_common.py +5 -0
  222. package/skills/gsd-path-discuss/scripts/discussion_records.py +3 -0
  223. package/skills/gsd-path-discuss/scripts/loop_run.py +839 -0
  224. package/skills/gsd-path-discuss/scripts/model_policy.py +279 -0
  225. package/skills/gsd-path-discuss/scripts/path_config.py +248 -0
  226. package/skills/gsd-path-discuss/scripts/review_panel.py +564 -0
  227. package/skills/gsd-path-discuss/scripts/worktree_paths.py +94 -0
  228. package/skills/gsd-path-docs-audit/SKILL.md +2 -0
  229. package/skills/gsd-path-docs-audit/references/dispatch.md +12 -19
  230. package/skills/gsd-path-docs-audit/references/docs-auditor.md +14 -0
  231. package/skills/gsd-path-docs-audit/references/model-policy.md +139 -0
  232. package/skills/gsd-path-docs-audit/references/runtime-selection.md +25 -0
  233. package/skills/gsd-path-docs-audit/scripts/_common.py +5 -0
  234. package/skills/gsd-path-docs-audit/scripts/archive_milestone.py +2171 -0
  235. package/skills/gsd-path-docs-audit/scripts/build_recovery.py +292 -0
  236. package/skills/gsd-path-docs-audit/scripts/check_docs_audit.py +7 -3
  237. package/skills/gsd-path-docs-audit/scripts/check_handoffs.py +7 -1
  238. package/skills/gsd-path-docs-audit/scripts/check_task_briefs.py +3 -0
  239. package/skills/gsd-path-docs-audit/scripts/detect_project.py +1536 -0
  240. package/skills/gsd-path-docs-audit/scripts/discussion_records.py +3 -0
  241. package/skills/gsd-path-docs-audit/scripts/discussion_validate.py +1326 -0
  242. package/skills/gsd-path-docs-audit/scripts/integration.py +1459 -0
  243. package/skills/gsd-path-docs-audit/scripts/isolation.py +24 -6
  244. package/skills/gsd-path-docs-audit/scripts/loop_run.py +839 -0
  245. package/skills/gsd-path-docs-audit/scripts/model_policy.py +279 -0
  246. package/skills/gsd-path-docs-audit/scripts/path_config.py +248 -0
  247. package/skills/gsd-path-docs-audit/scripts/pipeline_git.py +3 -0
  248. package/skills/gsd-path-docs-audit/scripts/pipeline_state.py +117 -186
  249. package/skills/gsd-path-docs-audit/scripts/promote_lookahead.py +286 -0
  250. package/skills/gsd-path-docs-audit/scripts/review_panel.py +564 -0
  251. package/skills/gsd-path-docs-audit/scripts/roadmap.py +326 -0
  252. package/skills/gsd-path-docs-audit/scripts/state_checkpoint.py +114 -72
  253. package/skills/gsd-path-docs-audit/scripts/state_promote.py +47 -44
  254. package/skills/gsd-path-docs-audit/scripts/worktree_paths.py +94 -0
  255. package/skills/gsd-path-forensics/SKILL.md +9 -5
  256. package/skills/gsd-path-forensics/references/runtime-selection.md +25 -0
  257. package/skills/gsd-path-forensics/scripts/_common.py +5 -0
  258. package/skills/gsd-path-forensics/scripts/discussion_records.py +3 -0
  259. package/skills/gsd-path-forensics/scripts/loop_run.py +839 -0
  260. package/skills/gsd-path-forensics/scripts/model_policy.py +279 -0
  261. package/skills/gsd-path-forensics/scripts/path_config.py +248 -0
  262. package/skills/gsd-path-forensics/scripts/pipeline_diagnose.py +15 -3
  263. package/skills/gsd-path-forensics/scripts/pipeline_undo.py +14 -7
  264. package/skills/gsd-path-forensics/scripts/review_panel.py +564 -0
  265. package/skills/gsd-path-forensics/scripts/worktree_paths.py +94 -0
  266. package/skills/gsd-path-inspect/SKILL.md +32 -8
  267. package/skills/gsd-path-inspect/references/dispatch.md +12 -19
  268. package/skills/gsd-path-inspect/references/docs-auditor.md +14 -0
  269. package/skills/gsd-path-inspect/references/model-policy.md +139 -0
  270. package/skills/gsd-path-inspect/references/runtime-selection.md +25 -0
  271. package/skills/gsd-path-inspect/scripts/__pycache__/_common.cpython-312.pyc +0 -0
  272. package/skills/gsd-path-inspect/scripts/_common.py +5 -0
  273. package/skills/gsd-path-inspect/scripts/archive_milestone.py +2171 -0
  274. package/skills/gsd-path-inspect/scripts/build_recovery.py +292 -0
  275. package/skills/gsd-path-inspect/scripts/check_docs_audit.py +7 -3
  276. package/skills/gsd-path-inspect/scripts/check_handoffs.py +7 -1
  277. package/skills/gsd-path-inspect/scripts/check_task_briefs.py +3 -0
  278. package/skills/gsd-path-inspect/scripts/detect_project.py +22 -3
  279. package/skills/gsd-path-inspect/scripts/discussion_records.py +3 -0
  280. package/skills/gsd-path-inspect/scripts/discussion_validate.py +1326 -0
  281. package/skills/gsd-path-inspect/scripts/integration.py +1459 -0
  282. package/skills/gsd-path-inspect/scripts/isolation.py +24 -6
  283. package/skills/gsd-path-inspect/scripts/loop_run.py +839 -0
  284. package/skills/gsd-path-inspect/scripts/model_policy.py +279 -0
  285. package/skills/gsd-path-inspect/scripts/path_config.py +248 -0
  286. package/skills/gsd-path-inspect/scripts/pipeline_git.py +3 -0
  287. package/skills/gsd-path-inspect/scripts/pipeline_state.py +117 -186
  288. package/skills/gsd-path-inspect/scripts/promote_lookahead.py +286 -0
  289. package/skills/gsd-path-inspect/scripts/review_panel.py +564 -0
  290. package/skills/gsd-path-inspect/scripts/roadmap.py +326 -0
  291. package/skills/gsd-path-inspect/scripts/state_checkpoint.py +114 -72
  292. package/skills/gsd-path-inspect/scripts/state_promote.py +47 -44
  293. package/skills/gsd-path-inspect/scripts/workflow_run.py +237 -0
  294. package/skills/gsd-path-inspect/scripts/worktree_paths.py +94 -0
  295. package/skills/gsd-path-loop/SKILL.md +2 -0
  296. package/skills/gsd-path-loop/references/runtime-selection.md +25 -0
  297. package/skills/gsd-path-loop/scripts/_common.py +5 -0
  298. package/skills/gsd-path-loop/scripts/discussion_records.py +3 -0
  299. package/skills/gsd-path-loop/scripts/loop_run.py +2 -0
  300. package/skills/gsd-path-loop/scripts/model_policy.py +279 -0
  301. package/skills/gsd-path-loop/scripts/path_config.py +248 -0
  302. package/skills/gsd-path-loop/scripts/review_panel.py +564 -0
  303. package/skills/gsd-path-loop/scripts/worktree_paths.py +94 -0
  304. package/skills/gsd-path-migrate/SKILL.md +2 -0
  305. package/skills/gsd-path-migrate/references/runtime-selection.md +25 -0
  306. package/skills/gsd-path-migrate/scripts/_common.py +185 -0
  307. package/skills/gsd-path-migrate/scripts/discussion_records.py +3 -0
  308. package/skills/gsd-path-migrate/scripts/loop_run.py +839 -0
  309. package/skills/gsd-path-migrate/scripts/model_policy.py +279 -0
  310. package/skills/gsd-path-migrate/scripts/path_config.py +248 -0
  311. package/skills/gsd-path-migrate/scripts/review_panel.py +564 -0
  312. package/skills/gsd-path-plan/SKILL.md +29 -19
  313. package/skills/gsd-path-plan/references/build-recovery.md +78 -0
  314. package/skills/gsd-path-plan/references/dispatch.md +12 -19
  315. package/skills/gsd-path-plan/references/model-policy.md +139 -0
  316. package/skills/gsd-path-plan/references/runtime-selection.md +25 -0
  317. package/skills/gsd-path-plan/scripts/__pycache__/_common.cpython-312.pyc +0 -0
  318. package/skills/gsd-path-plan/scripts/_common.py +5 -0
  319. package/skills/gsd-path-plan/scripts/archive_milestone.py +2171 -0
  320. package/skills/gsd-path-plan/scripts/build_recovery.py +292 -0
  321. package/skills/gsd-path-plan/scripts/check_handoffs.py +7 -1
  322. package/skills/gsd-path-plan/scripts/check_task_briefs.py +3 -0
  323. package/skills/gsd-path-plan/scripts/detect_project.py +1536 -0
  324. package/skills/gsd-path-plan/scripts/discussion_records.py +3 -0
  325. package/skills/gsd-path-plan/scripts/discussion_validate.py +1326 -0
  326. package/skills/gsd-path-plan/scripts/integration.py +1459 -0
  327. package/skills/gsd-path-plan/scripts/isolation.py +24 -6
  328. package/skills/gsd-path-plan/scripts/loop_run.py +839 -0
  329. package/skills/gsd-path-plan/scripts/model_policy.py +279 -0
  330. package/skills/gsd-path-plan/scripts/path_config.py +248 -0
  331. package/skills/gsd-path-plan/scripts/pipeline_git.py +3 -0
  332. package/skills/gsd-path-plan/scripts/pipeline_state.py +117 -186
  333. package/skills/gsd-path-plan/scripts/promote_lookahead.py +286 -0
  334. package/skills/gsd-path-plan/scripts/review_panel.py +11 -0
  335. package/skills/gsd-path-plan/scripts/roadmap.py +326 -0
  336. package/skills/gsd-path-plan/scripts/state_checkpoint.py +114 -72
  337. package/skills/gsd-path-plan/scripts/state_promote.py +47 -44
  338. package/skills/gsd-path-plan/scripts/workflow_run.py +128 -8
  339. package/skills/gsd-path-plan/scripts/worktree_paths.py +94 -0
  340. package/skills/gsd-path-plan/templates/task.md +2 -0
  341. package/skills/gsd-path-research/SKILL.md +5 -6
  342. package/skills/gsd-path-research/references/dispatch.md +12 -19
  343. package/skills/gsd-path-research/references/model-policy.md +139 -0
  344. package/skills/gsd-path-research/references/runtime-selection.md +25 -0
  345. package/skills/gsd-path-research/scripts/_common.py +5 -0
  346. package/skills/gsd-path-research/scripts/archive_milestone.py +2171 -0
  347. package/skills/gsd-path-research/scripts/build_recovery.py +292 -0
  348. package/skills/gsd-path-research/scripts/check_handoffs.py +7 -1
  349. package/skills/gsd-path-research/scripts/check_task_briefs.py +3 -0
  350. package/skills/gsd-path-research/scripts/detect_project.py +1536 -0
  351. package/skills/gsd-path-research/scripts/discussion_records.py +3 -0
  352. package/skills/gsd-path-research/scripts/discussion_validate.py +1326 -0
  353. package/skills/gsd-path-research/scripts/integration.py +1459 -0
  354. package/skills/gsd-path-research/scripts/isolation.py +24 -6
  355. package/skills/gsd-path-research/scripts/loop_run.py +839 -0
  356. package/skills/gsd-path-research/scripts/model_policy.py +279 -0
  357. package/skills/gsd-path-research/scripts/path_config.py +248 -0
  358. package/skills/gsd-path-research/scripts/pipeline_git.py +3 -0
  359. package/skills/gsd-path-research/scripts/pipeline_state.py +117 -186
  360. package/skills/gsd-path-research/scripts/promote_lookahead.py +286 -0
  361. package/skills/gsd-path-research/scripts/review_panel.py +564 -0
  362. package/skills/gsd-path-research/scripts/roadmap.py +326 -0
  363. package/skills/gsd-path-research/scripts/state_checkpoint.py +114 -72
  364. package/skills/gsd-path-research/scripts/state_promote.py +47 -44
  365. package/skills/gsd-path-research/scripts/worktree_paths.py +94 -0
  366. package/skills/gsd-path-roadmap/SKILL.md +24 -58
  367. package/skills/gsd-path-roadmap/references/dispatch.md +12 -19
  368. package/skills/gsd-path-roadmap/references/model-policy.md +139 -0
  369. package/skills/gsd-path-roadmap/references/runtime-selection.md +25 -0
  370. package/skills/gsd-path-roadmap/scripts/_common.py +5 -0
  371. package/skills/gsd-path-roadmap/scripts/archive_milestone.py +30 -124
  372. package/skills/gsd-path-roadmap/scripts/build_recovery.py +292 -0
  373. package/skills/gsd-path-roadmap/scripts/check_handoffs.py +7 -1
  374. package/skills/gsd-path-roadmap/scripts/check_task_briefs.py +3 -0
  375. package/skills/gsd-path-roadmap/scripts/detect_project.py +22 -3
  376. package/skills/gsd-path-roadmap/scripts/discussion_records.py +3 -0
  377. package/skills/gsd-path-roadmap/scripts/discussion_validate.py +8 -3
  378. package/skills/gsd-path-roadmap/scripts/integration.py +54 -28
  379. package/skills/gsd-path-roadmap/scripts/isolation.py +24 -6
  380. package/skills/gsd-path-roadmap/scripts/loop_run.py +839 -0
  381. package/skills/gsd-path-roadmap/scripts/model_policy.py +279 -0
  382. package/skills/gsd-path-roadmap/scripts/path_config.py +248 -0
  383. package/skills/gsd-path-roadmap/scripts/pipeline_git.py +3 -0
  384. package/skills/gsd-path-roadmap/scripts/pipeline_state.py +117 -186
  385. package/skills/gsd-path-roadmap/scripts/promote_lookahead.py +33 -162
  386. package/skills/gsd-path-roadmap/scripts/review_panel.py +11 -0
  387. package/skills/gsd-path-roadmap/scripts/roadmap.py +326 -0
  388. package/skills/gsd-path-roadmap/scripts/state_checkpoint.py +114 -72
  389. package/skills/gsd-path-roadmap/scripts/state_promote.py +47 -44
  390. package/skills/gsd-path-roadmap/scripts/worktree_paths.py +94 -0
  391. package/skills/gsd-path-ship/SKILL.md +29 -17
  392. package/skills/gsd-path-ship/references/dispatch.md +12 -19
  393. package/skills/gsd-path-ship/references/jev-review.md +82 -0
  394. package/skills/gsd-path-ship/references/model-policy.md +139 -0
  395. package/skills/gsd-path-ship/references/reviewer-final.md +21 -0
  396. package/skills/gsd-path-ship/references/reviewer-panel.md +17 -0
  397. package/skills/gsd-path-ship/references/reviewer-skeptic.md +20 -0
  398. package/skills/gsd-path-ship/references/reviewer-wave.md +89 -0
  399. package/skills/gsd-path-ship/references/reviewer.md +12 -148
  400. package/skills/gsd-path-ship/references/runtime-selection.md +25 -0
  401. package/skills/gsd-path-ship/scripts/__pycache__/_common.cpython-312.pyc +0 -0
  402. package/skills/gsd-path-ship/scripts/_common.py +5 -0
  403. package/skills/gsd-path-ship/scripts/archive_milestone.py +30 -124
  404. package/skills/gsd-path-ship/scripts/build_recovery.py +292 -0
  405. package/skills/gsd-path-ship/scripts/build_state.py +2 -0
  406. package/skills/gsd-path-ship/scripts/check_handoffs.py +7 -1
  407. package/skills/gsd-path-ship/scripts/check_task_briefs.py +3 -0
  408. package/skills/gsd-path-ship/scripts/detect_project.py +1536 -0
  409. package/skills/gsd-path-ship/scripts/discussion_records.py +3 -0
  410. package/skills/gsd-path-ship/scripts/discussion_validate.py +8 -3
  411. package/skills/gsd-path-ship/scripts/integration.py +54 -28
  412. package/skills/gsd-path-ship/scripts/isolation.py +24 -6
  413. package/skills/gsd-path-ship/scripts/jev_review.py +138 -0
  414. package/skills/gsd-path-ship/scripts/lean_verification.py +3 -1
  415. package/skills/gsd-path-ship/scripts/loop_run.py +839 -0
  416. package/skills/gsd-path-ship/scripts/model_policy.py +279 -0
  417. package/skills/gsd-path-ship/scripts/path_config.py +248 -0
  418. package/skills/gsd-path-ship/scripts/pipeline_git.py +3 -0
  419. package/skills/gsd-path-ship/scripts/pipeline_state.py +117 -186
  420. package/skills/gsd-path-ship/scripts/promote_lookahead.py +286 -0
  421. package/skills/gsd-path-ship/scripts/review_panel.py +11 -0
  422. package/skills/gsd-path-ship/scripts/roadmap.py +326 -0
  423. package/skills/gsd-path-ship/scripts/state_checkpoint.py +114 -72
  424. package/skills/gsd-path-ship/scripts/state_promote.py +47 -44
  425. package/skills/gsd-path-ship/scripts/workflow_run.py +128 -8
  426. package/skills/gsd-path-ship/scripts/worktree_paths.py +94 -0
  427. package/skills/gsd-path-ship/templates/wave-review.md +1 -1
  428. package/skills/gsd-path-undo/SKILL.md +2 -0
  429. package/skills/gsd-path-undo/references/runtime-selection.md +25 -0
  430. package/skills/gsd-path-undo/scripts/_common.py +5 -0
  431. package/skills/gsd-path-undo/scripts/discussion_records.py +3 -0
  432. package/skills/gsd-path-undo/scripts/loop_run.py +839 -0
  433. package/skills/gsd-path-undo/scripts/model_policy.py +279 -0
  434. package/skills/gsd-path-undo/scripts/path_config.py +248 -0
  435. package/skills/gsd-path-undo/scripts/pipeline_undo.py +14 -7
  436. package/skills/gsd-path-undo/scripts/review_panel.py +564 -0
  437. package/skills/gsd-path-undo/scripts/worktree_paths.py +94 -0
  438. package/skills/path/BUILD.md +54 -575
  439. package/skills/path/DECIDE.md +4 -6
  440. package/skills/path/DEFINE.md +23 -21
  441. package/skills/path/DOCS-AUDIT.md +2 -0
  442. package/skills/path/INSPECT.md +32 -8
  443. package/skills/path/PLAN.md +29 -19
  444. package/skills/path/RESEARCH.md +5 -6
  445. package/skills/path/ROADMAP.md +24 -58
  446. package/skills/path/SHIP.md +29 -17
  447. package/skills/path/SKILL.md +46 -22
  448. package/skills/path/references/build-abandon.md +33 -0
  449. package/skills/path/references/build-native.md +502 -0
  450. package/skills/path/references/build-recovery.md +78 -0
  451. package/skills/path/references/coder.md +8 -3
  452. package/skills/path/references/config.md +57 -0
  453. package/skills/path/references/dispatch.md +12 -19
  454. package/skills/path/references/docs-auditor.md +14 -0
  455. package/skills/path/references/jev-review.md +82 -0
  456. package/skills/path/references/model-policy.md +139 -0
  457. package/skills/path/references/reviewer-final.md +21 -0
  458. package/skills/path/references/reviewer-panel.md +17 -0
  459. package/skills/path/references/reviewer-skeptic.md +20 -0
  460. package/skills/path/references/reviewer-wave.md +89 -0
  461. package/skills/path/references/reviewer.md +12 -148
  462. package/skills/path/references/runtime-selection.md +25 -0
  463. package/skills/path/scripts/_common.py +5 -0
  464. package/skills/path/scripts/archive_milestone.py +30 -124
  465. package/skills/path/scripts/bootstrap_repository.py +33 -4
  466. package/skills/path/scripts/build_recovery.py +292 -0
  467. package/skills/path/scripts/build_state.py +2 -0
  468. package/skills/path/scripts/check_docs_audit.py +7 -3
  469. package/skills/path/scripts/check_handoffs.py +7 -1
  470. package/skills/path/scripts/check_task_briefs.py +3 -0
  471. package/skills/path/scripts/detect_project.py +22 -3
  472. package/skills/path/scripts/discussion_records.py +3 -0
  473. package/skills/path/scripts/discussion_validate.py +8 -3
  474. package/skills/path/scripts/dispatch_driver.py +233 -22
  475. package/skills/path/scripts/git_guard.py +768 -0
  476. package/skills/path/scripts/integration.py +54 -28
  477. package/skills/path/scripts/isolation.py +24 -6
  478. package/skills/path/scripts/jev_review.py +138 -0
  479. package/skills/path/scripts/lean_verification.py +3 -1
  480. package/skills/path/scripts/loop_run.py +2 -0
  481. package/skills/path/scripts/model_policy.py +279 -0
  482. package/skills/path/scripts/path_config.py +248 -0
  483. package/skills/path/scripts/pipeline_git.py +3 -0
  484. package/skills/path/scripts/pipeline_state.py +117 -186
  485. package/skills/path/scripts/promote_lookahead.py +33 -162
  486. package/skills/path/scripts/review_panel.py +11 -0
  487. package/skills/path/scripts/roadmap.py +326 -0
  488. package/skills/path/scripts/state_checkpoint.py +114 -72
  489. package/skills/path/scripts/state_promote.py +47 -44
  490. package/skills/path/scripts/status_runtime.py +208 -0
  491. package/skills/path/scripts/task_context.py +73 -0
  492. package/skills/path/scripts/token_budget.py +40 -1
  493. package/skills/path/scripts/workflow_run.py +128 -8
  494. package/skills/path/scripts/worktree_paths.py +94 -0
  495. package/skills/path/templates/skeptic.md +1 -1
  496. package/skills/path/templates/task.md +2 -0
  497. package/skills/path/templates/wave-panel.md +1 -1
  498. package/skills/path/templates/wave-review.md +1 -1
@@ -4,6 +4,11 @@
4
4
 
5
5
  from __future__ import annotations
6
6
 
7
+ import sys
8
+
9
+ # Runtime helpers must not modify their immutable installation.
10
+ sys.dont_write_bytecode = True
11
+
7
12
  import json
8
13
  import re
9
14
  import shutil
@@ -11,6 +16,31 @@ from pathlib import Path, PurePosixPath
11
16
  from typing import Mapping, Optional
12
17
 
13
18
 
19
+ if __package__: # imported as scripts.state_promote
20
+ from . import pipeline_state, state_checkpoint
21
+ from .pipeline_state import (
22
+ NULL,
23
+ PROMOTION_RESIDUAL,
24
+ PROMOTION_SCHEMA,
25
+ PROMOTION_TRACKS,
26
+ SLUG_RE,
27
+ PipelineState,
28
+ PipelineStateError,
29
+ )
30
+ else: # standalone script or sibling import
31
+ import pipeline_state
32
+ import state_checkpoint
33
+ from pipeline_state import (
34
+ NULL,
35
+ PROMOTION_RESIDUAL,
36
+ PROMOTION_SCHEMA,
37
+ PROMOTION_TRACKS,
38
+ SLUG_RE,
39
+ PipelineState,
40
+ PipelineStateError,
41
+ )
42
+
43
+
14
44
  def _render_roadmap(
15
45
  text: str,
16
46
  previous_milestone: str,
@@ -243,9 +273,9 @@ def _completed_promotion(
243
273
  if _head_with_exact_message(repo, subject, fields) != head:
244
274
  raise PipelineStateError("completed promotion has the wrong commit message")
245
275
 
246
- active_text = pipeline_state._git_text_at(repo, base, ".project/STATE.md")
247
- next_text = pipeline_state._git_text_at(repo, base, ".project/next/STATE.md")
248
- roadmap_text = pipeline_state._git_text_at(repo, base, ".project/ROADMAP.md")
276
+ active_text = state_checkpoint._git_text_at(repo, base, ".project/STATE.md")
277
+ next_text = state_checkpoint._git_text_at(repo, base, ".project/next/STATE.md")
278
+ roadmap_text = state_checkpoint._git_text_at(repo, base, ".project/ROADMAP.md")
249
279
  if active_text is None or next_text is None or roadmap_text is None:
250
280
  raise PipelineStateError("promotion parent is missing required metadata")
251
281
  active_state = pipeline_state._state_from_text(active_text, "promotion parent STATE.md")
@@ -265,7 +295,7 @@ def _completed_promotion(
265
295
  )
266
296
 
267
297
  _promotion_tree_mapping(repo, base, head)
268
- drift = pipeline_state._classify_plan_drift(repo, next_state, base, landing)
298
+ drift = state_checkpoint._classify_plan_drift(repo, next_state, base, landing)
269
299
  expected_roadmap = _render_roadmap(
270
300
  roadmap_text,
271
301
  active_state.milestone,
@@ -273,11 +303,11 @@ def _completed_promotion(
273
303
  branch,
274
304
  landing,
275
305
  )
276
- current_roadmap = pipeline_state._git_text_at(repo, head, ".project/ROADMAP.md")
306
+ current_roadmap = state_checkpoint._git_text_at(repo, head, ".project/ROADMAP.md")
277
307
  if current_roadmap != expected_roadmap:
278
308
  raise PipelineStateError("completed promotion has invalid ROADMAP.md")
279
309
 
280
- current_state = pipeline_state._git_text_at(repo, head, ".project/STATE.md")
310
+ current_state = state_checkpoint._git_text_at(repo, head, ".project/STATE.md")
281
311
  if current_state is None:
282
312
  raise PipelineStateError("completed promotion has no STATE.md")
283
313
  event = re.escape(_promotion_event(drift, branch, landing, base))
@@ -438,10 +468,10 @@ def _prepare_promotion(
438
468
  if source.exists() or source.is_symlink():
439
469
  if destination.exists() or destination.is_symlink():
440
470
  raise PipelineStateError(f"promotion destination already exists: {destination}")
441
- tracks[name] = pipeline_state._tree_digest(source)
471
+ tracks[name] = state_checkpoint._tree_digest(source)
442
472
  if not tracks:
443
473
  raise PipelineStateError("lookahead track has no promotable artifacts")
444
- drift = pipeline_state._classify_plan_drift(repo, next_state, base, landing)
474
+ drift = state_checkpoint._classify_plan_drift(repo, next_state, base, landing)
445
475
  roadmap_path = project / "ROADMAP.md"
446
476
  roadmap_text = pipeline_state._read_real_file(roadmap_path, "ROADMAP.md")
447
477
  target_state = _promotion_state(
@@ -464,10 +494,10 @@ def _prepare_promotion(
464
494
  "landing": landing,
465
495
  "base": base,
466
496
  "tracks": tracks,
467
- "residual_sha256": pipeline_state._tree_digest(next_root, tuple(tracks)),
468
- "next_state_sha256": pipeline_state._sha256(next_text),
469
- "active_state_sha256": pipeline_state._sha256(active_text),
470
- "roadmap_sha256": pipeline_state._sha256(roadmap_text),
497
+ "residual_sha256": state_checkpoint._tree_digest(next_root, tuple(tracks)),
498
+ "next_state_sha256": state_checkpoint._sha256(next_text),
499
+ "active_state_sha256": state_checkpoint._sha256(active_text),
500
+ "roadmap_sha256": state_checkpoint._sha256(roadmap_text),
471
501
  "target_state": target_state,
472
502
  "target_roadmap": target_roadmap,
473
503
  "drift": drift,
@@ -521,7 +551,7 @@ def _resume_track_moves(project: Path, journal: dict[str, object], path: Path) -
521
551
  if not source_exists and not destination_exists:
522
552
  raise PipelineStateError(f"promotion lost both source and destination: {name}")
523
553
  candidate = source if source_exists else destination
524
- if pipeline_state._tree_digest(candidate) != expected_digest:
554
+ if state_checkpoint._tree_digest(candidate) != expected_digest:
525
555
  raise PipelineStateError(f"promotion track drifted: {name}")
526
556
  if source_exists:
527
557
  source.rename(destination)
@@ -542,7 +572,7 @@ def _resume_metadata(project: Path, journal: dict[str, object], path: Path) -> N
542
572
  raise PipelineStateError("promotion journal has invalid metadata")
543
573
  if current == desired:
544
574
  continue
545
- if pipeline_state._sha256(current) != expected_original:
575
+ if state_checkpoint._sha256(current) != expected_original:
546
576
  raise PipelineStateError(f"promotion metadata drifted: {target}")
547
577
  pipeline_state._atomic_write(target, desired)
548
578
  journal["stage"] = f"updated:{target.name}"
@@ -560,9 +590,9 @@ def _resume_next_removal(
560
590
  if residual.exists() or residual.is_symlink():
561
591
  raise PipelineStateError("promotion has both next track and residual staging")
562
592
  next_text = pipeline_state._read_real_file(next_root / "STATE.md", "next/STATE.md")
563
- if pipeline_state._sha256(next_text) != journal.get("next_state_sha256"):
593
+ if state_checkpoint._sha256(next_text) != journal.get("next_state_sha256"):
564
594
  raise PipelineStateError("lookahead STATE drifted during promotion")
565
- if pipeline_state._tree_digest(next_root) != journal.get("residual_sha256"):
595
+ if state_checkpoint._tree_digest(next_root) != journal.get("residual_sha256"):
566
596
  raise PipelineStateError("lookahead residual drifted during promotion")
567
597
  next_root.rename(residual)
568
598
  journal["stage"] = "next-staged"
@@ -574,7 +604,7 @@ def _resume_next_removal(
574
604
  raise PipelineStateError("promotion lost next track and residual staging")
575
605
  if residual.is_symlink() or not residual.is_dir():
576
606
  raise PipelineStateError(f"promotion residual must be a real directory: {residual}")
577
- if pipeline_state._tree_digest(residual) != journal.get("residual_sha256"):
607
+ if state_checkpoint._tree_digest(residual) != journal.get("residual_sha256"):
578
608
  raise PipelineStateError("staged lookahead residual drifted during promotion")
579
609
 
580
610
 
@@ -714,30 +744,3 @@ def promote_next(
714
744
  "commit": commit,
715
745
  "drift": journal["drift"],
716
746
  }
717
-
718
-
719
- # pipeline_state imports this module, so the parent is resolved after the
720
- # definitions above. Parent functions are looked up on the module at call time
721
- # so patches applied to pipeline_state stay visible here.
722
- if __package__: # imported as scripts.state_promote
723
- from . import pipeline_state
724
- from .pipeline_state import (
725
- NULL,
726
- PROMOTION_RESIDUAL,
727
- PROMOTION_SCHEMA,
728
- PROMOTION_TRACKS,
729
- SLUG_RE,
730
- PipelineState,
731
- PipelineStateError,
732
- )
733
- else: # standalone script or sibling import
734
- import pipeline_state
735
- from pipeline_state import (
736
- NULL,
737
- PROMOTION_RESIDUAL,
738
- PROMOTION_SCHEMA,
739
- PROMOTION_TRACKS,
740
- SLUG_RE,
741
- PipelineState,
742
- PipelineStateError,
743
- )
@@ -0,0 +1,94 @@
1
+ #!/usr/bin/env python3
2
+ # gsd-path project runtime
3
+ """Placement shared by task isolation, verification, and integration."""
4
+
5
+ import sys
6
+
7
+ # Runtime helpers must not modify their immutable installation.
8
+ sys.dont_write_bytecode = True
9
+
10
+ import hashlib
11
+ import json
12
+ import os
13
+ import tempfile
14
+ from pathlib import Path
15
+
16
+ try:
17
+ import _common
18
+ except ImportError:
19
+ from scripts import _common
20
+
21
+
22
+ def _git(primary: Path, *args: str) -> str:
23
+ result = _common.run_git(primary, *args)
24
+ if result.returncode:
25
+ raise ValueError(result.stderr.strip() or "cannot inspect worktree placement")
26
+ return result.stdout.rstrip("\n")
27
+
28
+
29
+ def _identity(path: Path) -> str:
30
+ return hashlib.sha256(os.fsencode(path)).hexdigest()
31
+
32
+
33
+ def _workspace(primary: Path, pin: bool) -> Path:
34
+ common = Path(_git(primary, "rev-parse", "--git-common-dir"))
35
+ common = (primary / common).resolve()
36
+ identity = _identity(primary)
37
+ receipt = common / "gsd-path" / "workspaces" / f"{identity}.json"
38
+ try:
39
+ data = json.loads(receipt.read_text(encoding="utf-8"))
40
+ except FileNotFoundError:
41
+ pass
42
+ else:
43
+ if (not isinstance(data, dict) or data.get("primary") != str(primary)
44
+ or not isinstance(data.get("root"), str)
45
+ or not Path(data["root"]).is_absolute()):
46
+ raise ValueError(f"invalid worktree placement receipt: {receipt}")
47
+ return Path(data["root"])
48
+
49
+ root = Path(os.environ.get("GSD_PATH_WORKTREE_ROOT") or Path.home() / ".gsd-path" / "projects").expanduser()
50
+ if not root.is_absolute():
51
+ raise ValueError("GSD_PATH_WORKTREE_ROOT must be absolute")
52
+ root = root.resolve()
53
+ parent = root
54
+ while not parent.exists():
55
+ parent = parent.parent
56
+ ancestor = _common.run_git(parent, "rev-parse", "--git-common-dir")
57
+ same_repository = (
58
+ ancestor.returncode == 0
59
+ and (parent / ancestor.stdout.strip()).resolve() == common
60
+ )
61
+ if root.is_relative_to(primary) or same_repository:
62
+ raise ValueError(f"managed worktree root must be outside this repository's worktrees: {root}")
63
+ workspace = root / _identity(common) / identity
64
+ if pin:
65
+ receipt.parent.mkdir(parents=True, exist_ok=True)
66
+ fd, temporary = tempfile.mkstemp(dir=receipt.parent)
67
+ try:
68
+ with os.fdopen(fd, "w", encoding="utf-8") as handle:
69
+ json.dump({"primary": str(primary), "root": str(workspace)}, handle)
70
+ try:
71
+ os.link(temporary, receipt)
72
+ except FileExistsError:
73
+ return _workspace(primary, False)
74
+ finally:
75
+ os.unlink(temporary)
76
+ return workspace
77
+
78
+
79
+ def worktree_path(primary: Path, kind: str, name: str, *, pin: bool = False) -> Path:
80
+ primary = primary.resolve()
81
+ if kind not in {"task", "verify", "integrate"} or not name or Path(name).name != name or name in {".", ".."}:
82
+ raise ValueError("invalid managed worktree kind or name")
83
+ legacy = (primary.parent / f".{primary.name}-gsd-path-integrate-{name}"
84
+ if kind == "integrate" else primary.parent / f"{primary.name}.gsd-path" / kind / name)
85
+ branch = f"refs/heads/gsd-path-{kind}/{name}"
86
+ records = _git(primary, "worktree", "list", "--porcelain", "-z").split("\0\0")
87
+ for record in records:
88
+ fields = record.split("\0")
89
+ if f"worktree {legacy}" in fields and f"branch {branch}" in fields:
90
+ return legacy
91
+ # Keep collision checks and missing-directory recovery at the old location.
92
+ if os.path.lexists(legacy):
93
+ return legacy
94
+ return _workspace(primary, pin) / kind / name
@@ -3,13 +3,15 @@ name: gsd-path-ship
3
3
  description: Verify a completed GSD Path milestone, manage evidence-backed patch decisions, request final shipping approval, and archive the validated result. Use only when the user explicitly invokes $gsd-path-ship or an active $gsd-path router or build orchestrator explicitly routes to this phase.
4
4
  ---
5
5
 
6
+ Before executing project helpers, read [runtime selection](references/runtime-selection.md).
7
+
6
8
  # GSD Path Ship Phase
7
9
 
8
10
  Reuse proven review scope; dispatch reviewers for remaining claims. They never fix
9
11
  product code.
10
12
 
11
- Routing instructions below are caller handoffs under the AGENTS.md handoff
12
- rule; never invoke an explicit-only sibling skill yourself.
13
+ After completion, use the executable phase handoff in AGENTS.md.
14
+ Before completion, preserve the approval and recovery gates below.
13
15
 
14
16
  Require `pipeline: gsd-path/v2` in `.project/STATE.md`; a missing or different
15
17
  marker returns to `$gsd-path` for ownership checking. Read the local
@@ -174,8 +176,9 @@ so the position is unchanged. Then:
174
176
 
175
177
  ## Archive transaction
176
178
 
177
- Resolve the project's guard-owned `.gsd-path/runtime/archive_milestone.py` and
178
- `.gsd-path/runtime/pipeline_state.py` to absolute paths for `prepare`,
179
+ Resolve the declared runtime with `python3 -B
180
+ <project>/.gsd-path/status_runtime.py --repo <project> --runtime-path`; use
181
+ `archive_milestone.py` and `pipeline_state.py` from that verified directory for `prepare`,
179
182
  `render-manifest`, `preflight`, `record-shipment`, `validate`, `integrate`, and
180
183
  `validate-integrated`. Invoke them with `python3`; the files need not be
181
184
  executable. Skill-bundle copies are not the guard's trust anchor, even when
@@ -269,8 +272,9 @@ The persisted `STATE.archive` field is the transaction identity.
269
272
  create the ship phase's one commit with exact subject
270
273
  `ship: M00N — <milestone-slug>` and a body of exactly two consecutive lines,
271
274
  `Archive: .project/archive/<NNN>-<slug>` then
272
- `Reviewed-HEAD: <reviewed SHA>`, with no comment lines or blank line between them
273
- (pass the body as one `-m` value or from a message file). M00N and NNN come from STATE.archive.
275
+ `Reviewed-HEAD: <reviewed SHA>`, with no comment lines or blank line between them.
276
+ Write the subject, a blank line, and the two body lines to a message file,
277
+ then use `git commit -F <message-file>`. M00N and NNN come from STATE.archive.
274
278
  There is no untracked-project exception and no product or older-archive
275
279
  path may enter this commit.
276
280
  6. Immediately run `python3 <absolute archive_milestone.py> validate --repo <root>`. It requires the committed shipped state, exact archive and
@@ -363,27 +367,35 @@ Run this recovery setup from a separate checkout, outside the closed primary
363
367
  worktree's guard.
364
368
 
365
369
  1. Create separate disposable trust and validation checkouts from the same
366
- published origin and `STATE.branch`. This separation is required because a
367
- managed runtime refresh may dirty a checkout when `.gsd-path/` is tracked,
370
+ published origin and `STATE.branch`. This separation is required because an
371
+ explicit runtime upgrade changes the trust checkout's declaration and launcher,
368
372
  while archive validation requires a clean checkout. Never use the primary
369
373
  worktree for either role.
370
- 2. From the trusted fixed GSD Path checkout, preview and then refresh only the
374
+ 2. From the trusted fixed GSD Path checkout, preview and then explicitly upgrade only the
371
375
  disposable trust checkout's managed trust anchor:
372
376
 
373
377
  ```bash
374
- node <trusted-gsd-path>/scripts/install.mjs --hooks-refresh --dry-run --project <trust-root>
375
- node <trusted-gsd-path>/scripts/install.mjs --hooks-refresh --project <trust-root>
378
+ node <trusted-gsd-path>/scripts/install.mjs --runtime-upgrade --dry-run --project <trust-root>
379
+ node <trusted-gsd-path>/scripts/install.mjs --runtime-upgrade --project <trust-root>
380
+ ```
381
+
382
+ Confirm that the preview identifies the intended fixed version and digest.
383
+ Upgrade changes only the disposable trust project's declaration and compatible
384
+ launcher. For a legacy trust checkout with no declaration, use the explicit
385
+ `--runtime-migrate` preview and migration first. Resolve the upgraded runtime:
386
+
387
+ ```bash
388
+ python3 -B <trust-root>/.gsd-path/status_runtime.py --repo <trust-root> --runtime-path
376
389
  ```
377
390
 
378
- Continue only when the preview names managed `.gsd-path/` runtime or guard
379
- files and no `.project/` path. The installer owns the atomic refresh and
380
- refuses unmanaged or unsafe runtime entries.
381
- 3. Use only the refreshed project-local trust anchor to refresh publication
391
+ Use the returned absolute directory as `<verified-runtime>` below. Stop on any
392
+ error; do not substitute the validation checkout's older selected runtime.
393
+ 3. Use only this verified upgraded runtime to refresh publication
382
394
  refs in the clean validation checkout and validate its integrated milestone:
383
395
 
384
396
  ```bash
385
- python3 <trust-root>/.gsd-path/runtime/archive_milestone.py refresh-origin --repo <validation-root>
386
- python3 <trust-root>/.gsd-path/runtime/archive_milestone.py validate-integrated --repo <validation-root> --slug <STATE.milestone>
397
+ python3 -B <verified-runtime>/archive_milestone.py refresh-origin --repo <validation-root>
398
+ python3 -B <verified-runtime>/archive_milestone.py validate-integrated --repo <validation-root> --slug <STATE.milestone>
387
399
  ```
388
400
 
389
401
  4. A pass restores the normal shipped handoff without another commit or
@@ -7,10 +7,7 @@ use exactly one matching branch:
7
7
  - A `spawn_agent` tool exposing `task_name`, `agent_type`, and `fork_turns` is
8
8
  Codex. Use `fork_turns: "none"`; coders use the built-in `worker` type and
9
9
  every other role uses `default`. Reuse a completed logical target with
10
- `followup_task`. For Codex reasoning effort, use `high` for the portable
11
- `heavy` tier and `low` for the portable `light` tier; leave reasoning effort
12
- unset for the session-default tier, and never pass `heavy` or `light` as a
13
- literal Codex value.
10
+ `followup_task`.
14
11
  - A `spawn_agent` tool without those Codex fields is Zed. Spawn one isolated,
15
12
  full-capability child per brief. Zed children are not resumable, so retries
16
13
  use a fresh child and a complete prompt.
@@ -26,7 +23,7 @@ use exactly one matching branch:
26
23
  the complete new prompt for later work. Wait for a colliding active child and
27
24
  collect results with `wait_commands_or_subagents`.
28
25
  - A `Task` tool advertising the custom `gsd-path` subagent is Cursor. Use that
29
- model-inheriting, full-capability child. Resume it by returned agent ID when
26
+ full-capability child. Resume it by returned agent ID when
30
27
  available; otherwise retry with a fresh child and a complete prompt.
31
28
  - A `Task` tool advertising the built-in `general` subagent is OpenCode. Use
32
29
  that child; if an installed OpenCode v2 host exposes the renamed `subagent`
@@ -65,20 +62,10 @@ For every branch:
65
62
  - Resolve the phase's linked role brief to an absolute path, include it in the
66
63
  prompt, and require the child to read it before acting. The role brief
67
64
  supplies the read-only boundary for auditors and reviewers.
68
- - Tier hints: use the portable `heavy` tier for `plan`, `plan_patch`, `decide`,
69
- and `roadmap`, the portable `light` tier for `inspect_docs` and `docs_audit`,
70
- and the session-default tier for every other role. Apply the Codex mapping
71
- above when its schema advertises reasoning-effort selection. On every other
72
- host, use only an exact native equivalent advertised by that host; otherwise
73
- do not override the model or reasoning effort. The only exception is a
74
- review-panel child: when the host advertises model selection, pass the exact
75
- slug returned by `scripts/review_panel.py resolve` for that family. Never
76
- override the model on the canonical reviewer, planner, coder, or any other
77
- role.
78
- Host isolation: none. The child's working directory is the exact absolute
79
- root GSD Path supplied; a host SHA checkout or extra worktree is a contract
80
- failure. Never ask the host to create a worktree. Give the child the exact
81
- repository or linked-worktree root supplied by GSD Path.
65
+ - Model selection: before every child launch or continuation, follow
66
+ [the model-policy contract](model-policy.md) and apply its recorded
67
+ native arguments. It owns defaults, project settings, task overrides,
68
+ capability failures, and reassignment. Host isolation: none. Use the exact GSD Path supplied root; create no extra checkout.
82
69
  - Send a self-contained prompt with absolute input, template, and output paths
83
70
  plus the child's bounded responsibility. Every brief also names the absolute
84
71
  `AGENTS.md` and `WORKFLOW.md` paths (or explicitly says they are absent), the
@@ -122,6 +109,12 @@ directory for the full logical session; resumptions reuse it. Record completed
122
109
  parent CLI run events and each native child's session events with stable logical
123
110
  task names before the next dispatch. The helper reads host counters and refuses
124
111
  incomplete or ambiguous usage; never estimate tokens or reset the ledger.
112
+ When the verified CLI adapter reports cumulative counters across `resume`, record
113
+ each later invocation with `--previous-events <previous recorded CLI events>`.
114
+ The helper checks thread identity and records only the new output, preserving the
115
+ raw total and predecessor. Keep that chain in order; never sum cumulative totals.
116
+ Use ordinary `record` for per-invocation counters. An unknown counter convention
117
+ is unproven usage, not permission to guess.
125
118
  Run `admit` for the next task and stop dispatch on a blocked result. Preserve
126
119
  its output in the dispatch evidence. This gates observed usage only: concurrent
127
120
  or in-flight work can overrun before the host reports usage. Codex CLI has no
@@ -0,0 +1,82 @@
1
+ # Optional Jev evidence screening
2
+
3
+ Jev screens selected criterion/evidence pairs for a wave or final reviewer.
4
+ It is disabled by default. Normal Path review needs no account, API key, SDK,
5
+ or network access. This helper uses Python's standard library.
6
+
7
+ ## Enable or disable
8
+
9
+ Set these environment variables in the session that launches the reviewing
10
+ agent; child agents must inherit them to use Jev:
11
+
12
+ | Variable | Value |
13
+ | --- | --- |
14
+ | `GSD_PATH_JEV` | Exactly `1` enables screening. Unset it to disable. |
15
+ | `TYPESAFE_API_KEY` | Your TypeSafe API key, supplied through the environment. |
16
+ | `GSD_PATH_JEV_TIMEOUT_SECONDS` | Positive finite seconds chosen by the owner for the HTTP socket timeout. There is no default. |
17
+
18
+ Enabling this option permits the selected criterion and evidence text to be
19
+ sent to TypeSafe's hosted API. Supply only material authorized for that service.
20
+ Do not include credentials, environment dumps, or unrelated repository content.
21
+ Having a key alone does not enable Jev. Do not put keys in commands or artifacts.
22
+
23
+ ## Reviewer procedure
24
+
25
+ 1. Use only still-uncovered criteria from the assigned wave/final review and
26
+ the corresponding evidence already available in the supplied verify sidecar.
27
+ Keep existing rules for isolated evidence, command reuse, and provenance.
28
+ 2. Pass JSON through stdin to `python3 -B <absolute skill scripts/jev_review.py>`
29
+ from that sidecar. Resolve the helper as `../scripts/jev_review.py` relative
30
+ to this reference directory. Do not create another project report. The input
31
+ has exactly this shape; replace the illustrative revision and contents:
32
+
33
+ ```json
34
+ {
35
+ "reviewed_head": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
36
+ "items": [
37
+ {
38
+ "id": "T001-AC1",
39
+ "criterion": "Reject an empty name.",
40
+ "evidence": "Recorded isolated Verify: test_empty_name passed."
41
+ }
42
+ ]
43
+ }
44
+ ```
45
+
46
+ Use the full review SHA supplied by the orchestrator, unique nonempty item
47
+ IDs, verbatim criterion text, and selected evidence text. Empty evidence is
48
+ allowed. The SHA is caller-supplied context; the helper does not prove Git
49
+ ancestry or that the text actually came from that revision.
50
+ 3. Read the JSON status. `disabled` means ordinary review. `unavailable` means
51
+ ordinary review with the explicit reason recorded in the assigned artifact.
52
+ Neither is a failed criterion. The helper exits zero for these optional
53
+ outcomes and makes no automatic retries. Correct invalid input/configuration
54
+ before an explicit retry; keep a service failure visible and continue review.
55
+ 4. For `ok`, inspect per-item `supported`, `partial`, `unsupported`, or `unclear`
56
+ answers, their probabilities, and confidence. Independently examine suggested
57
+ gaps under the existing rubric. A Jev answer is neither executable evidence
58
+ nor an independent review verdict. It cannot satisfy or waive a criterion,
59
+ change a gate, select a route, or authorize publication.
60
+ 5. Keep the advisory JSON receipt in the assigned review artifact's notes or
61
+ evidence prose, outside fixed-format verdict fields. An `ok` receipt includes
62
+ the supplied revision, SHA-256 of the exact canonical request, versioned model,
63
+ item IDs and answers, and token usage. An `unavailable` receipt includes the
64
+ reason and, only after request construction, the revision and request hash;
65
+ it has no model, answers, or usage. A `disabled` receipt contains only the
66
+ status and advisory marker. Retain the selected input with that evidence if it
67
+ is not already reconstructible from cited sources. Keep all canonical verdicts and template
68
+ structure unchanged. Reuse the recorded advisory when its exact request and
69
+ review revision remain unchanged; skip screening for a reused proven review.
70
+
71
+ ## Service behavior
72
+
73
+ The helper calls only `https://api.typesafe.ai/v1/systemone` with the documented
74
+ version `jev-1.13.0`. It does not follow redirects, echo provider error bodies,
75
+ write files, or install packages. Missing keys/timeouts, HTTP and network errors,
76
+ and invalid input/responses return `unavailable`. There is no confidence cutoff:
77
+ the existing reviewer owns acceptance. Real model accuracy and savings must be
78
+ evaluated on chosen evidence before relying on this advisory signal.
79
+
80
+ Sources: [HTTP API](https://docs.typesafe.ai/api),
81
+ [models](https://docs.typesafe.ai/models),
82
+ [confidence](https://docs.typesafe.ai/confidence).
@@ -0,0 +1,139 @@
1
+ # Dispatch model policy
2
+
3
+ Before native dispatch, run the bundled `scripts/model_policy.py`. CLI dispatch
4
+ uses the same resolver inside `dispatch_driver.py`. The helper owns model and
5
+ effort decisions; apply its output instead of choosing again in prose.
6
+
7
+ ## Project choices
8
+
9
+ Use `<repo>/.project/model-policy.json`, including when the active track is
10
+ `.project/next`. This file owns project overrides. It is not phase status.
11
+ No file is required to retain existing behavior. `path config` can also set user
12
+ defaults in `~/.gsd-path/config.json` under `models`. Project common roles override
13
+ user host and common roles. Within each scope, host roles override common roles.
14
+ Task overrides still win, and recorded assignments stay pinned.
15
+
16
+ ```json
17
+ {
18
+ "roles": {"coder": {"model": "inherit"}},
19
+ "hosts": {"codex": {"plan": {"effort": "high"}}}
20
+ }
21
+ ```
22
+
23
+ Values are exact advertised model/effort strings or `inherit`. This example
24
+ illustrates configuration; it is not a cost-saving preset. Set concrete models
25
+ only from the current host's advertised choices. Host-specific role settings
26
+ override common role settings. Task settings override both, independently for
27
+ model and effort; omitted fields retain the next applicable value. Explicit
28
+ `inherit` removes that field's override. There are no automatic fallbacks.
29
+
30
+ Role keys are `coder`, `reviewer` (wave, final, and gap review), `review_panel`,
31
+ `skeptic`, `inspect_codebase`, `inspect_docs`, `docs_audit`, `research`, `decide`,
32
+ `roadmap`, `plan`, and `plan_patch`. Use the logical task name as the assignment,
33
+ not as the role. Keep each panel family and review lens a distinct assignment.
34
+
35
+ The helper retains heavy effort hints for plan, plan_patch, decide, and roadmap;
36
+ light hints for inspect_docs and docs_audit; otherwise effort inherits. Codex
37
+ maps these hints to high/low. Other hosts use only advertised equivalents.
38
+ Hints are conditional; unsupported explicit settings stop the affected child.
39
+
40
+ Coders may have scalar `model:` and `effort:` fields in their task frontmatter.
41
+ These are part of the approved task contract. Pass the task file with `--task`.
42
+ For other roles, pass assignment-specific `--model` or `--effort` when the owner
43
+ explicitly overrides the role choice. Coder settings do not affect reviewers.
44
+
45
+ ## Advertised capabilities
46
+
47
+ Capture the current child tool's schema and advertised choices in a JSON file
48
+ outside the product tree. For each supported control, provide its native field,
49
+ allowed values, and, for CLI dispatch, its documented argument template. Omit
50
+ unsupported controls. The values below are fixture examples, not a host catalog:
51
+
52
+ ```json
53
+ {
54
+ "host": "codex",
55
+ "model": {"field": "model", "values": ["example-model"],
56
+ "args": ["--model", "{value}"]},
57
+ "effort": {"field": "reasoning_effort", "values": ["low", "high"],
58
+ "args": ["-c", "model_reasoning_effort={value}"]}
59
+ }
60
+ ```
61
+
62
+ `effort_hints` may map heavy/light to exact advertised equivalents. Supply
63
+ `inherited_model` only when the host exposes its identity. Never infer models,
64
+ fields, or CLI flags from a host name. Every existing host uses this contract,
65
+ including hosts with no model or effort controls. Their explicit unsupported
66
+ settings block; their default inheritance remains usable.
67
+
68
+ ## Native lifecycle
69
+
70
+ Resolve the bundled helper to an absolute path. Use one record under the Git
71
+ common directory's `gsd-path/model-selection/` directory per assignment. Scope
72
+ the path and `--scope` to the milestone, active/lookahead track, and review cycle
73
+ where applicable; later work must not reuse an earlier record.
74
+
75
+ ```text
76
+ python3 -B <helper> resolve --repo <primary> --scope <milestone/track/cycle> --assignment <logical-name> --role <role> --record <absolute-record> --capabilities <advertised-json>
77
+ ```
78
+
79
+ Only `status: ready` authorizes launch. Apply `selection.native` exactly to
80
+ the advertised child tool, preserving the host adapter's other controls and
81
+ GSD Path task isolation. The recorded selection applies to a fresh child too.
82
+ If an existing child is still active, reattach or send its continuation;
83
+ resolving again does not authorize launching a second copy. When a host cannot
84
+ change model/effort on a resumed child, a changed selection requires a fresh
85
+ child after terminal completion of the earlier one.
86
+
87
+ After terminal completion, release the assignment with `release` using the
88
+ same identity arguments and `--terminal-result <host-completion-evidence>`.
89
+ To change the selection, use `reassign` with the same identity, current
90
+ capabilities, explicit model/effort changes, and `--ruling <verbatim-owner-ruling>`.
91
+ It requires an inactive assignment and preserves prior selection history.
92
+ Resolve again before starting the replacement. A project-policy edit alone
93
+ does not change an existing selection. Task-contract edits still require their
94
+ legal pipeline path.
95
+
96
+ For panel children, first resolve membership with `review_panel.py resolve`,
97
+ passing `--parent-slug` when known and repeating `--exclude-family` for every
98
+ known parent and canonical-reviewer family (including all deep review lenses).
99
+ Apply these exclusions before persisting membership. Detected membership skips
100
+ excluded families; explicitly named conflicts block. Pass its selected model through `--panel-model`, and pass `--panel-family` plus
101
+ `--exclude-family` for known parent and
102
+ canonical-reviewer families. Persist and reuse the panel roster. Policy cannot
103
+ waive family independence or change canonical review authority. A changed
104
+ panel roster requires a new legal review assignment.
105
+
106
+ Requested controls are durable evidence. When the host hides the inherited
107
+ model identity, exact effective-model continuity across fresh children remains
108
+ unproven; report that limitation rather than asserting an identity.
109
+
110
+ ## CLI lifecycle
111
+
112
+ Pass `--model-capabilities <advertised-json>` to the driver. Commands use whole
113
+ argument slots `{model_args}` and `{effort_args}`; the resolver expands these
114
+ to argument arrays. They are not shell substitutions. Remove fixed model and
115
+ effort flags when using these slots; conflicting controls block dispatch.
116
+ Commands with explicit policy choices must expose the corresponding slots,
117
+ including when an explicit choice is `inherit`. Unconfigured legacy commands
118
+ without a capability file retain their existing behavior.
119
+ An existing legacy assignment with no recorded selection keeps its saved
120
+ command across retries, even if project policy or capabilities are later added.
121
+ It cannot use `reassign-model`; model controls require a new explicit assignment.
122
+
123
+ Review and skeptic commands accept `--model` and `--effort` for that assignment.
124
+ For distinct panel families or review lenses, pass `--model-overrides <json>`:
125
+ a mapping from exact logical assignment names to model/effort objects. Each
126
+ entry applies only to its named assignment; conflicting explicit inputs block.
127
+ A common panel model must satisfy every selected family, so use these scoped
128
+ overrides when families need different models. Family checks remain mandatory.
129
+ Coders read their task overrides. Panels with capabilities use the argument
130
+ slots; legacy panel commands may retain their existing `{model}` placeholder.
131
+
132
+ The driver persists selection before launch and retains it on retry. Use
133
+ `dispatch_driver.py reassign-model --repo <primary> --task-id <logical-name>
134
+ --model-capabilities <advertised-json> --model <slug> --ruling <owner-ruling>`
135
+ for an inactive unfinished assignment. Finished work and pinned panel rosters
136
+ require a new legal assignment. Earlier attempt evidence is retained.
137
+
138
+ Compare total cost only with observed usage and outcomes, including retries.
139
+ These controls do not establish cost savings, pricing, or quality rankings.