@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,6 +3,8 @@ name: gsd-path-define
3
3
  description: Define and approve project or milestone intent through an interview or milestone confirmation, writing .project/CHARTER.md or .project/intent/INTENT.md. Use only when the user explicitly invokes $gsd-path-define or an active $gsd-path router explicitly routes to this phase.
4
4
  ---
5
5
 
6
+ Before executing project helpers, read [runtime selection](references/runtime-selection.md).
7
+
6
8
  # GSD Path Define Phase
7
9
 
8
10
  Turn a project idea or approved roadmap entry into an approved intent artifact.
@@ -36,16 +38,22 @@ ROADMAP.md exists), `roadmap/done`
36
38
  lookahead track at `define/active|blocked` also requires both current-track
37
39
  inspection artifacts and a Log entry proving `inspect/done` for the same
38
40
  milestone after its latest activation; otherwise route to inspect.
41
+ The sole later-phase exception is a blocked build entered through the
42
+ [build recovery contract](references/build-recovery.md). Follow its preparation
43
+ and corrections procedure when the runtime returns mode `corrections`; keep
44
+ the existing milestone identity and approval gate. Otherwise
39
45
  `define/done` or any later phase blocks rather than overwriting approved
40
46
  intent and leaving downstream artifacts stale. When an active router supplies
41
47
  the lookahead track root `.project/next/`, require its STATE.md to be a regular
42
48
  non-symlink file and evaluate this section against that track's state and
43
49
  paths; see Lookahead mode. If STATE.md is missing, run the bundled
44
50
  `python3 <absolute-bundled-script> initialize --repo <absolute-root>
45
- --template <absolute-state-template>` helper (`scripts/detect_project.py`) and
51
+ --template <absolute-state-template> --require-git` helper (`scripts/detect_project.py`) and
46
52
  follow its returned JSON `verdict` / `route`. This is the only no-state
47
53
  boundary; do not run `classify` first or classify from a directory listing or
48
- conversation. If the command exits nonzero, returns `error`, or returns
54
+ conversation. Handle `route: setup-repository` before the write gate: preserve
55
+ the folder unchanged and return to `$gsd-path` for repository setup; no state
56
+ was written. If the command exits nonzero, returns `error`, or returns
49
57
  `wrote_state: false`, report the error and block without routing or claiming
50
58
  STATE.md was written.
51
59
  - `owned` — continue under the existing-state rules above.
@@ -104,12 +112,13 @@ the charter instead of the single-milestone checklist:
104
112
  4. **Constraints** — program-level stack, budget, deadline, integrations.
105
113
  5. **Program success criteria** — observable when the last milestone ships.
106
114
  6. **Review panel** — optional durable default (`off` | `detected` | named
107
- families). Default `off`. This value persists on CHARTER.md; later
115
+ families). Use the configured future preference unless the user chooses
116
+ otherwise (see Output contract). This value persists on CHARTER.md; later
108
117
  milestone INTENT files copy it and may override.
109
118
 
110
119
  Read the local [charter template](templates/charter.md), write the approval
111
- draft to `.project/CHARTER.md` including `Review panel:` (default `off`;
112
- never invent `detected` or a named list), and run the same playback-approval
120
+ draft to `.project/CHARTER.md` including the configured or explicitly chosen
121
+ `Review panel:` value, and run the same playback-approval
113
122
  loop as the standard Process. On approval, retain the reviewed
114
123
  `Review panel:` value on CHARTER.md, run `pipeline_state.py transition` with
115
124
  expected `define/active`, milestone/branch/archive all at their exact current
@@ -138,7 +147,7 @@ State ownership. There is no re-interview of charter or roadmap scope:
138
147
  Risks and Open questions from the entry (tagged `RESEARCH`/`NEEDS-USER`),
139
148
  `Lane: milestone`, `Surfaces:` copied verbatim from the entry, and
140
149
  `Review panel:` copied from CHARTER.md (default
141
- `off` when CHARTER omits it). The confirmation may override the copied
150
+ the configured preference when CHARTER omits it). The confirmation may override the copied
142
151
  panel value; do not invent `detected` or a named list. When brownfield,
143
152
  fill `## Current state` from the map, record doc-vs-code rulings as in
144
153
  Brownfield mode, and add protected existing behavior under Scope out.
@@ -265,27 +274,20 @@ question. The rules change for every primary mode:
265
274
  ## Output contract
266
275
 
267
276
  At approval, retain the already reviewed `Lane:` value and its one-line reason.
268
- Retain `Review panel:` as reviewed: the CHARTER copy or the user's override
269
- in milestone/lookahead mode, the CHARTER value in program mode, or `off`
270
- when the user did not choose a panel and no CHARTER default exists.
277
+ Before presenting an approval draft without a CHARTER or explicit panel choice,
278
+ read `settings.review_panel.value` from the selected runtime's `path_config.py
279
+ show --repo <absolute-root>` (bundle for legacy projects; off for older selected
280
+ runtimes without config support). Include that preference in the draft.
281
+ Retain `Review panel:` as reviewed: the CHARTER copy, the explicit user choice,
282
+ or the configured future preference. Quick lane keeps the panel off.
271
283
 
272
284
  After approval, finalize `.project/intent/INTENT.md` and run
273
285
  `pipeline_state.py transition` with expected `define/active`, the exact
274
286
  current milestone/branch/archive values, event `milestone intent approved`,
275
287
  `--set-phase define --set-status done --set-milestone <milestone slug>`, and
276
288
  `--project-dir .project/next` in lookahead. Require returned `define/done` and
277
- the exact milestone. Report the next phase
278
- from the approved lane. For `Lane: standard`, research is next. For
279
- `Lane: quick`, planning is next and research and decide are skipped. For
280
- `Lane: milestone`, use the resolved roadmap entry matching the track STATE's
281
- `milestone`: milestone-scoped research is next when that entry lists open
282
- questions; otherwise planning is next and research and decide are skipped.
283
- Confirm the approved outcome, link the final INTENT.md again, and name that
284
- next phase before routing. When routed by an active `$gsd-path`, return control
285
- to that router so its bundled next contract can auto-advance to the named
286
- phase. When invoked directly, stop and tell the user to explicitly invoke
287
- `$gsd-path`, which selects that next phase; do not invoke an explicit-only
288
- sibling skill yourself.
289
+ the exact milestone. Confirm the approved outcome and link INTENT.md again.
290
+ Use the executable phase handoff in AGENTS.md for the next action.
289
291
 
290
292
  ## Rules
291
293
 
@@ -0,0 +1,78 @@
1
+ # Return a blocked build to its contract owner
2
+
3
+ Use this contract only for an active milestone at `build/blocked`: a documented
4
+ structural plan defect, or an explicit user ruling that changes approved intent.
5
+ It does not reopen ship, archived milestones, or lookahead. Build owns entry;
6
+ Define owns intent corrections; Plan owns the replacement task inventory and
7
+ approval. Routing remains a caller handoff under AGENTS.md.
8
+
9
+ ## Build: checkpoint and enter
10
+
11
+ 1. Record the finding or verbatim user ruling in STATE through its helper.
12
+ Stop dispatch. Use the normal recovery and retirement procedures until
13
+ every task is either unstarted `pending` with null dispatch metadata or
14
+ proven `done`. Preserve owned uncommitted work before any retirement.
15
+ Settle reviewers and their sidecars too. Dispatch records must have no pending
16
+ cleanup; records with reviewer `worktree` and `branch` ownership must also
17
+ record `cleanup_complete`. A `blocked` or `collected` outcome alone does not
18
+ prove retirement. Records that never owned a reviewer sidecar do not require
19
+ that retirement receipt. Use the existing dispatch retirement procedures;
20
+ recovery does not retire sidecars itself. Never infer that a timed-out child
21
+ stopped. Checkpoint the blocked state and artifacts using the Build
22
+ bookkeeping contract; the primary must be clean.
23
+ 2. Run `pipeline_state.py transition` with the complete current state expected,
24
+ `--set-status active`, and the matching target and event:
25
+
26
+ | Cause | Target | Exact event |
27
+ | --- | --- | --- |
28
+ | User changes a criterion, constraint, or veto | `--set-phase define` | `build intent corrections requested` |
29
+ | Task inventory, dependency, or wave repair | `--set-phase plan` | `build plan repair requested` |
30
+
31
+ The helper records the committed recovery base in STATE atomically. Do not
32
+ author or edit that record. Milestone, branch, integration settings, and
33
+ landed task contracts remain fixed throughout recovery.
34
+ 3. Return to the router or name the selected explicit skill. The route names
35
+ `corrections` for Define and `build-repair` for Plan. Other blocked-build
36
+ failures continue through ordinary Build recovery.
37
+
38
+ ## Define and Plan: prepare before editing
39
+
40
+ Run the bundled `pipeline_state.py prepare-build-recovery --repo <absolute-root>`
41
+ before changing any recovery artifact. This repeatable operation preserves the
42
+ old review directory under `plan/build-recovery-<base>/review` and starts a fresh
43
+ active review directory. STATE's recorded base owns an interrupted move; rerun
44
+ this command to finish it. The helper validates the preserved bytes against Git.
45
+ Do not remove, rewrite, or use the preserved reviews as current approval.
46
+
47
+ **Define corrections.** Read the existing intent and governing program artifacts.
48
+ Interview only the requested change; append the user's words under
49
+ `## Corrections`, revise the affected intent, and present the delta for approval.
50
+ Keep the milestone identity. Reclassify the lane using the normal lane rules.
51
+ After approval, use the normal `define/active → define/done` transition and route
52
+ from the approved lane. Standard intent goes through Research and Decide again;
53
+ quick and milestone intent use their existing evidence gates. A program charter
54
+ or roadmap conflict still requires its legal owner gate; this path cannot waive it.
55
+
56
+ **Plan build-repair.** Read the corrected intent, current synthesis, existing plan,
57
+ task files, and recovery base. Use the normal planner, lint, panel, and approval
58
+ gates. Repair the remaining task inventory as needed, including split, rename,
59
+ dependency, or wave changes. Keep IDs ordered and contiguous. Preserve every
60
+ landed task file byte-for-byte, including its recorded base and proof. Any new
61
+ work to satisfy a corrected criterion belongs in new pending tasks, not rewritten
62
+ landed contracts. A plan-only recovery must not change approved intent.
63
+
64
+ ## Approve and return to Build
65
+
66
+ Use normal `pipeline_state.py approve --kind plan --expected-head <HEAD>`.
67
+ Neither `--patch` nor `--defer-checkpoint` is legal for recovery. The helper
68
+ checks landed-task preservation and restored intent ownership, restores review
69
+ evidence only for unchanged contracts, and creates the normal journaled plan
70
+ checkpoint. A failed approval leaves recovery open.
71
+
72
+ Return through `plan/done → build/active` with event `build started`. The dispatch
73
+ driver uses a separate record directory for this recovery base, while retaining
74
+ the milestone budget ledger. Resume only from the new approved task inventory.
75
+ Unchanged wave evidence remains usable; changed waves need review in the new
76
+ record directory. Retained task Verify receipts remain historical evidence for
77
+ their original task and base, never proof for a changed task. Final review still
78
+ requires current-HEAD evidence before shipment.
@@ -0,0 +1,25 @@
1
+ # Project runtime selection
2
+
3
+ Before running a project runtime helper, check for
4
+ `<absolute-project>/.gsd-path/runtime.json`. When present, run the stable launcher:
5
+
6
+ ```sh
7
+ python3 -B <absolute-project>/.gsd-path/status_runtime.py --repo <absolute-project> --runtime-path
8
+ ```
9
+
10
+ Use `python` only when it is the compatible Python 3.9+ interpreter. A failure
11
+ stops helper execution: follow the exact-version restore action in the error.
12
+ Do not install, upgrade, or fall back to the current plugin's runtime implicitly.
13
+
14
+ The returned directory is the verified Project runtime. Resolve helper names
15
+ present in its `manifest.json` from that directory, including status, state,
16
+ isolation, integration, archive, recovery, build-state, final-verification, and guard helpers.
17
+ The workflow runner resolves its subprocess helpers from this same directory;
18
+ helper imports stay within the selected runtime. This rule overrides
19
+ references to bundled copies of those helpers. Other skill helpers, templates,
20
+ and role briefs remain in the installed skill bundle. Pass `-B` to Python helper
21
+ invocations so execution does not create bytecode in the runtime store.
22
+
23
+ With no declaration, retain the legacy helper lookup. An existing
24
+ `.gsd-path/runtime/` requires the explicit `--runtime-migrate --project PATH`
25
+ operation before adopting external storage; review the resulting Git diff.
@@ -9,6 +9,11 @@ consuming module keep working.
9
9
 
10
10
  from __future__ import annotations
11
11
 
12
+ import sys
13
+
14
+ # Runtime helpers must not modify their immutable installation.
15
+ sys.dont_write_bytecode = True
16
+
12
17
  import json
13
18
  import os
14
19
  import re