@opengsd/gsd-path 1.1.0 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (578) hide show
  1. package/AGENTS.md +5 -2
  2. package/CHANGELOG.md +87 -0
  3. package/DOCS.md +73 -1
  4. package/FULL.md +3 -2
  5. package/HOOKS.md +18 -9
  6. package/QUICK.md +3 -4
  7. package/README.md +72 -5
  8. package/RUNTIME.md +9 -4
  9. package/UPDATE.md +56 -11
  10. package/WORKFLOW.md +5 -2
  11. package/package.json +9 -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 +6 -19
  21. package/scripts/_common.py +5 -0
  22. package/scripts/archive_milestone.py +20 -6
  23. package/scripts/bootstrap_repository.py +8 -1
  24. package/scripts/build_recovery.py +5 -0
  25. package/scripts/build_state.py +2 -0
  26. package/scripts/check_docs_audit.py +2 -0
  27. package/scripts/check_handoffs.py +6 -0
  28. package/scripts/check_task_briefs.py +3 -0
  29. package/scripts/detect_project.py +11 -1
  30. package/scripts/discussion_records.py +3 -0
  31. package/scripts/discussion_validate.py +8 -3
  32. package/scripts/dispatch_driver.py +230 -21
  33. package/scripts/git_guard.py +12 -4
  34. package/scripts/guard_hook.py +11 -1
  35. package/scripts/install.mjs +74 -1448
  36. package/scripts/install.py +165 -201
  37. package/scripts/integration.py +28 -8
  38. package/scripts/isolation.py +15 -5
  39. package/scripts/jev_review.py +138 -0
  40. package/scripts/lean_verification.py +2 -0
  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 +3 -0
  45. package/scripts/pipeline_git.py +3 -0
  46. package/scripts/pipeline_state.py +4 -1
  47. package/scripts/pipeline_undo.py +3 -0
  48. package/scripts/promote_lookahead.py +3 -0
  49. package/scripts/review_panel.py +11 -0
  50. package/scripts/roadmap.py +5 -0
  51. package/scripts/runtime_store.py +281 -0
  52. package/scripts/skill-resources.json +104 -4
  53. package/scripts/state_checkpoint.py +5 -0
  54. package/scripts/state_promote.py +5 -0
  55. package/scripts/status_runtime.py +92 -6
  56. package/scripts/wizard.mjs +8 -2
  57. package/scripts/workflow_run.py +12 -1
  58. package/scripts/worktree_paths.py +94 -0
  59. package/skills/gsd-path/BUILD.md +7 -0
  60. package/skills/gsd-path/DECIDE.md +2 -0
  61. package/skills/gsd-path/DEFINE.md +13 -7
  62. package/skills/gsd-path/DOCS-AUDIT.md +2 -0
  63. package/skills/gsd-path/INSPECT.md +2 -0
  64. package/skills/gsd-path/PLAN.md +4 -2
  65. package/skills/gsd-path/RESEARCH.md +2 -0
  66. package/skills/gsd-path/ROADMAP.md +2 -0
  67. package/skills/gsd-path/SHIP.md +24 -13
  68. package/skills/gsd-path/SKILL.md +23 -9
  69. package/skills/gsd-path/references/build-native.md +15 -7
  70. package/skills/gsd-path/references/config.md +57 -0
  71. package/skills/gsd-path/references/dispatch.md +6 -19
  72. package/skills/gsd-path/references/jev-review.md +82 -0
  73. package/skills/gsd-path/references/model-policy.md +139 -0
  74. package/skills/gsd-path/references/reviewer-panel.md +1 -1
  75. package/skills/gsd-path/references/reviewer.md +2 -0
  76. package/skills/gsd-path/references/runtime-selection.md +25 -0
  77. package/skills/gsd-path/scripts/__pycache__/_common.cpython-312.pyc +0 -0
  78. package/skills/gsd-path/scripts/__pycache__/check_handoffs.cpython-312.pyc +0 -0
  79. package/skills/gsd-path/scripts/_common.py +5 -0
  80. package/skills/gsd-path/scripts/archive_milestone.py +20 -6
  81. package/skills/gsd-path/scripts/bootstrap_repository.py +8 -1
  82. package/skills/gsd-path/scripts/build_recovery.py +5 -0
  83. package/skills/gsd-path/scripts/build_state.py +2 -0
  84. package/skills/gsd-path/scripts/check_docs_audit.py +2 -0
  85. package/skills/gsd-path/scripts/check_handoffs.py +6 -0
  86. package/skills/gsd-path/scripts/check_task_briefs.py +3 -0
  87. package/skills/gsd-path/scripts/detect_project.py +11 -1
  88. package/skills/gsd-path/scripts/discussion_records.py +3 -0
  89. package/skills/gsd-path/scripts/discussion_validate.py +8 -3
  90. package/skills/gsd-path/scripts/dispatch_driver.py +230 -21
  91. package/skills/gsd-path/scripts/git_guard.py +768 -0
  92. package/skills/gsd-path/scripts/integration.py +28 -8
  93. package/skills/gsd-path/scripts/isolation.py +15 -5
  94. package/skills/gsd-path/scripts/jev_review.py +138 -0
  95. package/skills/gsd-path/scripts/lean_verification.py +2 -0
  96. package/skills/gsd-path/scripts/loop_run.py +2 -0
  97. package/skills/gsd-path/scripts/model_policy.py +279 -0
  98. package/skills/gsd-path/scripts/path_config.py +248 -0
  99. package/skills/gsd-path/scripts/pipeline_git.py +3 -0
  100. package/skills/gsd-path/scripts/pipeline_state.py +4 -1
  101. package/skills/gsd-path/scripts/promote_lookahead.py +3 -0
  102. package/skills/gsd-path/scripts/review_panel.py +11 -0
  103. package/skills/gsd-path/scripts/roadmap.py +5 -0
  104. package/skills/gsd-path/scripts/state_checkpoint.py +5 -0
  105. package/skills/gsd-path/scripts/state_promote.py +5 -0
  106. package/skills/gsd-path/scripts/status_runtime.py +208 -0
  107. package/skills/gsd-path/scripts/workflow_run.py +12 -1
  108. package/skills/gsd-path/scripts/worktree_paths.py +94 -0
  109. package/skills/gsd-path/templates/skeptic.md +1 -1
  110. package/skills/gsd-path/templates/task.md +2 -0
  111. package/skills/gsd-path/templates/wave-panel.md +1 -1
  112. package/skills/gsd-path-build/SKILL.md +7 -0
  113. package/skills/gsd-path-build/references/build-native.md +15 -7
  114. package/skills/gsd-path-build/references/dispatch.md +6 -19
  115. package/skills/gsd-path-build/references/jev-review.md +82 -0
  116. package/skills/gsd-path-build/references/model-policy.md +139 -0
  117. package/skills/gsd-path-build/references/reviewer-panel.md +1 -1
  118. package/skills/gsd-path-build/references/reviewer.md +2 -0
  119. package/skills/gsd-path-build/references/runtime-selection.md +25 -0
  120. package/skills/gsd-path-build/scripts/__pycache__/_common.cpython-312.pyc +0 -0
  121. package/skills/gsd-path-build/scripts/__pycache__/check_handoffs.cpython-312.pyc +0 -0
  122. package/skills/gsd-path-build/scripts/_common.py +5 -0
  123. package/skills/gsd-path-build/scripts/archive_milestone.py +20 -6
  124. package/skills/gsd-path-build/scripts/build_recovery.py +5 -0
  125. package/skills/gsd-path-build/scripts/build_state.py +2 -0
  126. package/skills/gsd-path-build/scripts/check_handoffs.py +6 -0
  127. package/skills/gsd-path-build/scripts/check_task_briefs.py +3 -0
  128. package/skills/gsd-path-build/scripts/detect_project.py +11 -1
  129. package/skills/gsd-path-build/scripts/discussion_records.py +3 -0
  130. package/skills/gsd-path-build/scripts/discussion_validate.py +8 -3
  131. package/skills/gsd-path-build/scripts/dispatch_driver.py +230 -21
  132. package/skills/gsd-path-build/scripts/integration.py +28 -8
  133. package/skills/gsd-path-build/scripts/isolation.py +15 -5
  134. package/skills/gsd-path-build/scripts/jev_review.py +138 -0
  135. package/skills/gsd-path-build/scripts/loop_run.py +2 -0
  136. package/skills/gsd-path-build/scripts/model_policy.py +279 -0
  137. package/skills/gsd-path-build/scripts/path_config.py +248 -0
  138. package/skills/gsd-path-build/scripts/pipeline_git.py +3 -0
  139. package/skills/gsd-path-build/scripts/pipeline_state.py +4 -1
  140. package/skills/gsd-path-build/scripts/promote_lookahead.py +3 -0
  141. package/skills/gsd-path-build/scripts/review_panel.py +11 -0
  142. package/skills/gsd-path-build/scripts/roadmap.py +5 -0
  143. package/skills/gsd-path-build/scripts/state_checkpoint.py +5 -0
  144. package/skills/gsd-path-build/scripts/state_promote.py +5 -0
  145. package/skills/gsd-path-build/scripts/workflow_run.py +12 -1
  146. package/skills/gsd-path-build/scripts/worktree_paths.py +94 -0
  147. package/skills/gsd-path-build/templates/skeptic.md +1 -1
  148. package/skills/gsd-path-build/templates/task.md +2 -0
  149. package/skills/gsd-path-build/templates/wave-panel.md +1 -1
  150. package/skills/gsd-path-decide/SKILL.md +2 -0
  151. package/skills/gsd-path-decide/references/dispatch.md +6 -19
  152. package/skills/gsd-path-decide/references/model-policy.md +139 -0
  153. package/skills/gsd-path-decide/references/runtime-selection.md +25 -0
  154. package/skills/gsd-path-decide/scripts/_common.py +5 -0
  155. package/skills/gsd-path-decide/scripts/archive_milestone.py +20 -6
  156. package/skills/gsd-path-decide/scripts/build_recovery.py +5 -0
  157. package/skills/gsd-path-decide/scripts/check_handoffs.py +6 -0
  158. package/skills/gsd-path-decide/scripts/check_task_briefs.py +3 -0
  159. package/skills/gsd-path-decide/scripts/detect_project.py +11 -1
  160. package/skills/gsd-path-decide/scripts/discussion_records.py +3 -0
  161. package/skills/gsd-path-decide/scripts/discussion_validate.py +8 -3
  162. package/skills/gsd-path-decide/scripts/integration.py +28 -8
  163. package/skills/gsd-path-decide/scripts/isolation.py +15 -5
  164. package/skills/gsd-path-decide/scripts/loop_run.py +839 -0
  165. package/skills/gsd-path-decide/scripts/model_policy.py +279 -0
  166. package/skills/gsd-path-decide/scripts/path_config.py +248 -0
  167. package/skills/gsd-path-decide/scripts/pipeline_git.py +3 -0
  168. package/skills/gsd-path-decide/scripts/pipeline_state.py +4 -1
  169. package/skills/gsd-path-decide/scripts/promote_lookahead.py +3 -0
  170. package/skills/gsd-path-decide/scripts/review_panel.py +11 -0
  171. package/skills/gsd-path-decide/scripts/roadmap.py +5 -0
  172. package/skills/gsd-path-decide/scripts/state_checkpoint.py +5 -0
  173. package/skills/gsd-path-decide/scripts/state_promote.py +5 -0
  174. package/skills/gsd-path-decide/scripts/worktree_paths.py +94 -0
  175. package/skills/gsd-path-define/SKILL.md +13 -7
  176. package/skills/gsd-path-define/references/runtime-selection.md +25 -0
  177. package/skills/gsd-path-define/scripts/_common.py +5 -0
  178. package/skills/gsd-path-define/scripts/archive_milestone.py +20 -6
  179. package/skills/gsd-path-define/scripts/build_recovery.py +5 -0
  180. package/skills/gsd-path-define/scripts/check_handoffs.py +6 -0
  181. package/skills/gsd-path-define/scripts/check_task_briefs.py +3 -0
  182. package/skills/gsd-path-define/scripts/detect_project.py +11 -1
  183. package/skills/gsd-path-define/scripts/discussion_records.py +3 -0
  184. package/skills/gsd-path-define/scripts/discussion_validate.py +8 -3
  185. package/skills/gsd-path-define/scripts/integration.py +28 -8
  186. package/skills/gsd-path-define/scripts/isolation.py +15 -5
  187. package/skills/gsd-path-define/scripts/loop_run.py +839 -0
  188. package/skills/gsd-path-define/scripts/model_policy.py +279 -0
  189. package/skills/gsd-path-define/scripts/path_config.py +248 -0
  190. package/skills/gsd-path-define/scripts/pipeline_git.py +3 -0
  191. package/skills/gsd-path-define/scripts/pipeline_state.py +4 -1
  192. package/skills/gsd-path-define/scripts/promote_lookahead.py +3 -0
  193. package/skills/gsd-path-define/scripts/review_panel.py +11 -0
  194. package/skills/gsd-path-define/scripts/roadmap.py +5 -0
  195. package/skills/gsd-path-define/scripts/state_checkpoint.py +5 -0
  196. package/skills/gsd-path-define/scripts/state_promote.py +5 -0
  197. package/skills/gsd-path-define/scripts/worktree_paths.py +94 -0
  198. package/skills/gsd-path-discuss/SKILL.md +2 -0
  199. package/skills/gsd-path-discuss/references/runtime-selection.md +25 -0
  200. package/skills/gsd-path-discuss/scripts/_common.py +5 -0
  201. package/skills/gsd-path-discuss/scripts/discussion_records.py +3 -0
  202. package/skills/gsd-path-discuss/scripts/loop_run.py +839 -0
  203. package/skills/gsd-path-discuss/scripts/model_policy.py +279 -0
  204. package/skills/gsd-path-discuss/scripts/path_config.py +248 -0
  205. package/skills/gsd-path-discuss/scripts/review_panel.py +564 -0
  206. package/skills/gsd-path-discuss/scripts/worktree_paths.py +94 -0
  207. package/skills/gsd-path-docs-audit/SKILL.md +2 -0
  208. package/skills/gsd-path-docs-audit/references/dispatch.md +6 -19
  209. package/skills/gsd-path-docs-audit/references/model-policy.md +139 -0
  210. package/skills/gsd-path-docs-audit/references/runtime-selection.md +25 -0
  211. package/skills/gsd-path-docs-audit/scripts/_common.py +5 -0
  212. package/skills/gsd-path-docs-audit/scripts/archive_milestone.py +20 -6
  213. package/skills/gsd-path-docs-audit/scripts/build_recovery.py +5 -0
  214. package/skills/gsd-path-docs-audit/scripts/check_docs_audit.py +2 -0
  215. package/skills/gsd-path-docs-audit/scripts/check_handoffs.py +6 -0
  216. package/skills/gsd-path-docs-audit/scripts/check_task_briefs.py +3 -0
  217. package/skills/gsd-path-docs-audit/scripts/detect_project.py +11 -1
  218. package/skills/gsd-path-docs-audit/scripts/discussion_records.py +3 -0
  219. package/skills/gsd-path-docs-audit/scripts/discussion_validate.py +8 -3
  220. package/skills/gsd-path-docs-audit/scripts/integration.py +28 -8
  221. package/skills/gsd-path-docs-audit/scripts/isolation.py +15 -5
  222. package/skills/gsd-path-docs-audit/scripts/loop_run.py +839 -0
  223. package/skills/gsd-path-docs-audit/scripts/model_policy.py +279 -0
  224. package/skills/gsd-path-docs-audit/scripts/path_config.py +248 -0
  225. package/skills/gsd-path-docs-audit/scripts/pipeline_git.py +3 -0
  226. package/skills/gsd-path-docs-audit/scripts/pipeline_state.py +4 -1
  227. package/skills/gsd-path-docs-audit/scripts/promote_lookahead.py +3 -0
  228. package/skills/gsd-path-docs-audit/scripts/review_panel.py +11 -0
  229. package/skills/gsd-path-docs-audit/scripts/roadmap.py +5 -0
  230. package/skills/gsd-path-docs-audit/scripts/state_checkpoint.py +5 -0
  231. package/skills/gsd-path-docs-audit/scripts/state_promote.py +5 -0
  232. package/skills/gsd-path-docs-audit/scripts/worktree_paths.py +94 -0
  233. package/skills/gsd-path-forensics/SKILL.md +9 -5
  234. package/skills/gsd-path-forensics/references/runtime-selection.md +25 -0
  235. package/skills/gsd-path-forensics/scripts/_common.py +5 -0
  236. package/skills/gsd-path-forensics/scripts/discussion_records.py +3 -0
  237. package/skills/gsd-path-forensics/scripts/loop_run.py +839 -0
  238. package/skills/gsd-path-forensics/scripts/model_policy.py +279 -0
  239. package/skills/gsd-path-forensics/scripts/path_config.py +248 -0
  240. package/skills/gsd-path-forensics/scripts/pipeline_diagnose.py +3 -0
  241. package/skills/gsd-path-forensics/scripts/pipeline_undo.py +3 -0
  242. package/skills/gsd-path-forensics/scripts/review_panel.py +564 -0
  243. package/skills/gsd-path-forensics/scripts/worktree_paths.py +94 -0
  244. package/skills/gsd-path-inspect/SKILL.md +2 -0
  245. package/skills/gsd-path-inspect/references/dispatch.md +6 -19
  246. package/skills/gsd-path-inspect/references/model-policy.md +139 -0
  247. package/skills/gsd-path-inspect/references/runtime-selection.md +25 -0
  248. package/skills/gsd-path-inspect/scripts/__pycache__/_common.cpython-312.pyc +0 -0
  249. package/skills/gsd-path-inspect/scripts/_common.py +5 -0
  250. package/skills/gsd-path-inspect/scripts/archive_milestone.py +20 -6
  251. package/skills/gsd-path-inspect/scripts/build_recovery.py +5 -0
  252. package/skills/gsd-path-inspect/scripts/check_docs_audit.py +2 -0
  253. package/skills/gsd-path-inspect/scripts/check_handoffs.py +6 -0
  254. package/skills/gsd-path-inspect/scripts/check_task_briefs.py +3 -0
  255. package/skills/gsd-path-inspect/scripts/detect_project.py +11 -1
  256. package/skills/gsd-path-inspect/scripts/discussion_records.py +3 -0
  257. package/skills/gsd-path-inspect/scripts/discussion_validate.py +8 -3
  258. package/skills/gsd-path-inspect/scripts/integration.py +28 -8
  259. package/skills/gsd-path-inspect/scripts/isolation.py +15 -5
  260. package/skills/gsd-path-inspect/scripts/loop_run.py +839 -0
  261. package/skills/gsd-path-inspect/scripts/model_policy.py +279 -0
  262. package/skills/gsd-path-inspect/scripts/path_config.py +248 -0
  263. package/skills/gsd-path-inspect/scripts/pipeline_git.py +3 -0
  264. package/skills/gsd-path-inspect/scripts/pipeline_state.py +4 -1
  265. package/skills/gsd-path-inspect/scripts/promote_lookahead.py +3 -0
  266. package/skills/gsd-path-inspect/scripts/review_panel.py +11 -0
  267. package/skills/gsd-path-inspect/scripts/roadmap.py +5 -0
  268. package/skills/gsd-path-inspect/scripts/state_checkpoint.py +5 -0
  269. package/skills/gsd-path-inspect/scripts/state_promote.py +5 -0
  270. package/skills/gsd-path-inspect/scripts/workflow_run.py +12 -1
  271. package/skills/gsd-path-inspect/scripts/worktree_paths.py +94 -0
  272. package/skills/gsd-path-loop/SKILL.md +2 -0
  273. package/skills/gsd-path-loop/references/runtime-selection.md +25 -0
  274. package/skills/gsd-path-loop/scripts/_common.py +5 -0
  275. package/skills/gsd-path-loop/scripts/discussion_records.py +3 -0
  276. package/skills/gsd-path-loop/scripts/loop_run.py +2 -0
  277. package/skills/gsd-path-loop/scripts/model_policy.py +279 -0
  278. package/skills/gsd-path-loop/scripts/path_config.py +248 -0
  279. package/skills/gsd-path-loop/scripts/review_panel.py +564 -0
  280. package/skills/gsd-path-loop/scripts/worktree_paths.py +94 -0
  281. package/skills/gsd-path-migrate/SKILL.md +2 -0
  282. package/skills/gsd-path-migrate/references/runtime-selection.md +25 -0
  283. package/skills/gsd-path-migrate/scripts/_common.py +185 -0
  284. package/skills/gsd-path-migrate/scripts/discussion_records.py +3 -0
  285. package/skills/gsd-path-migrate/scripts/loop_run.py +839 -0
  286. package/skills/gsd-path-migrate/scripts/model_policy.py +279 -0
  287. package/skills/gsd-path-migrate/scripts/path_config.py +248 -0
  288. package/skills/gsd-path-migrate/scripts/review_panel.py +564 -0
  289. package/skills/gsd-path-plan/SKILL.md +4 -2
  290. package/skills/gsd-path-plan/references/dispatch.md +6 -19
  291. package/skills/gsd-path-plan/references/model-policy.md +139 -0
  292. package/skills/gsd-path-plan/references/runtime-selection.md +25 -0
  293. package/skills/gsd-path-plan/scripts/__pycache__/_common.cpython-312.pyc +0 -0
  294. package/skills/gsd-path-plan/scripts/_common.py +5 -0
  295. package/skills/gsd-path-plan/scripts/archive_milestone.py +20 -6
  296. package/skills/gsd-path-plan/scripts/build_recovery.py +5 -0
  297. package/skills/gsd-path-plan/scripts/check_handoffs.py +6 -0
  298. package/skills/gsd-path-plan/scripts/check_task_briefs.py +3 -0
  299. package/skills/gsd-path-plan/scripts/detect_project.py +11 -1
  300. package/skills/gsd-path-plan/scripts/discussion_records.py +3 -0
  301. package/skills/gsd-path-plan/scripts/discussion_validate.py +8 -3
  302. package/skills/gsd-path-plan/scripts/integration.py +28 -8
  303. package/skills/gsd-path-plan/scripts/isolation.py +15 -5
  304. package/skills/gsd-path-plan/scripts/loop_run.py +839 -0
  305. package/skills/gsd-path-plan/scripts/model_policy.py +279 -0
  306. package/skills/gsd-path-plan/scripts/path_config.py +248 -0
  307. package/skills/gsd-path-plan/scripts/pipeline_git.py +3 -0
  308. package/skills/gsd-path-plan/scripts/pipeline_state.py +4 -1
  309. package/skills/gsd-path-plan/scripts/promote_lookahead.py +3 -0
  310. package/skills/gsd-path-plan/scripts/review_panel.py +11 -0
  311. package/skills/gsd-path-plan/scripts/roadmap.py +5 -0
  312. package/skills/gsd-path-plan/scripts/state_checkpoint.py +5 -0
  313. package/skills/gsd-path-plan/scripts/state_promote.py +5 -0
  314. package/skills/gsd-path-plan/scripts/workflow_run.py +12 -1
  315. package/skills/gsd-path-plan/scripts/worktree_paths.py +94 -0
  316. package/skills/gsd-path-plan/templates/task.md +2 -0
  317. package/skills/gsd-path-research/SKILL.md +2 -0
  318. package/skills/gsd-path-research/references/dispatch.md +6 -19
  319. package/skills/gsd-path-research/references/model-policy.md +139 -0
  320. package/skills/gsd-path-research/references/runtime-selection.md +25 -0
  321. package/skills/gsd-path-research/scripts/_common.py +5 -0
  322. package/skills/gsd-path-research/scripts/archive_milestone.py +20 -6
  323. package/skills/gsd-path-research/scripts/build_recovery.py +5 -0
  324. package/skills/gsd-path-research/scripts/check_handoffs.py +6 -0
  325. package/skills/gsd-path-research/scripts/check_task_briefs.py +3 -0
  326. package/skills/gsd-path-research/scripts/detect_project.py +11 -1
  327. package/skills/gsd-path-research/scripts/discussion_records.py +3 -0
  328. package/skills/gsd-path-research/scripts/discussion_validate.py +8 -3
  329. package/skills/gsd-path-research/scripts/integration.py +28 -8
  330. package/skills/gsd-path-research/scripts/isolation.py +15 -5
  331. package/skills/gsd-path-research/scripts/loop_run.py +839 -0
  332. package/skills/gsd-path-research/scripts/model_policy.py +279 -0
  333. package/skills/gsd-path-research/scripts/path_config.py +248 -0
  334. package/skills/gsd-path-research/scripts/pipeline_git.py +3 -0
  335. package/skills/gsd-path-research/scripts/pipeline_state.py +4 -1
  336. package/skills/gsd-path-research/scripts/promote_lookahead.py +3 -0
  337. package/skills/gsd-path-research/scripts/review_panel.py +11 -0
  338. package/skills/gsd-path-research/scripts/roadmap.py +5 -0
  339. package/skills/gsd-path-research/scripts/state_checkpoint.py +5 -0
  340. package/skills/gsd-path-research/scripts/state_promote.py +5 -0
  341. package/skills/gsd-path-research/scripts/worktree_paths.py +94 -0
  342. package/skills/gsd-path-roadmap/SKILL.md +2 -0
  343. package/skills/gsd-path-roadmap/references/dispatch.md +6 -19
  344. package/skills/gsd-path-roadmap/references/model-policy.md +139 -0
  345. package/skills/gsd-path-roadmap/references/runtime-selection.md +25 -0
  346. package/skills/gsd-path-roadmap/scripts/_common.py +5 -0
  347. package/skills/gsd-path-roadmap/scripts/archive_milestone.py +20 -6
  348. package/skills/gsd-path-roadmap/scripts/build_recovery.py +5 -0
  349. package/skills/gsd-path-roadmap/scripts/check_handoffs.py +6 -0
  350. package/skills/gsd-path-roadmap/scripts/check_task_briefs.py +3 -0
  351. package/skills/gsd-path-roadmap/scripts/detect_project.py +11 -1
  352. package/skills/gsd-path-roadmap/scripts/discussion_records.py +3 -0
  353. package/skills/gsd-path-roadmap/scripts/discussion_validate.py +8 -3
  354. package/skills/gsd-path-roadmap/scripts/integration.py +28 -8
  355. package/skills/gsd-path-roadmap/scripts/isolation.py +15 -5
  356. package/skills/gsd-path-roadmap/scripts/loop_run.py +839 -0
  357. package/skills/gsd-path-roadmap/scripts/model_policy.py +279 -0
  358. package/skills/gsd-path-roadmap/scripts/path_config.py +248 -0
  359. package/skills/gsd-path-roadmap/scripts/pipeline_git.py +3 -0
  360. package/skills/gsd-path-roadmap/scripts/pipeline_state.py +4 -1
  361. package/skills/gsd-path-roadmap/scripts/promote_lookahead.py +3 -0
  362. package/skills/gsd-path-roadmap/scripts/review_panel.py +11 -0
  363. package/skills/gsd-path-roadmap/scripts/roadmap.py +5 -0
  364. package/skills/gsd-path-roadmap/scripts/state_checkpoint.py +5 -0
  365. package/skills/gsd-path-roadmap/scripts/state_promote.py +5 -0
  366. package/skills/gsd-path-roadmap/scripts/worktree_paths.py +94 -0
  367. package/skills/gsd-path-ship/SKILL.md +24 -13
  368. package/skills/gsd-path-ship/references/dispatch.md +6 -19
  369. package/skills/gsd-path-ship/references/jev-review.md +82 -0
  370. package/skills/gsd-path-ship/references/model-policy.md +139 -0
  371. package/skills/gsd-path-ship/references/reviewer-panel.md +1 -1
  372. package/skills/gsd-path-ship/references/reviewer.md +2 -0
  373. package/skills/gsd-path-ship/references/runtime-selection.md +25 -0
  374. package/skills/gsd-path-ship/scripts/__pycache__/_common.cpython-312.pyc +0 -0
  375. package/skills/gsd-path-ship/scripts/_common.py +5 -0
  376. package/skills/gsd-path-ship/scripts/archive_milestone.py +20 -6
  377. package/skills/gsd-path-ship/scripts/build_recovery.py +5 -0
  378. package/skills/gsd-path-ship/scripts/build_state.py +2 -0
  379. package/skills/gsd-path-ship/scripts/check_handoffs.py +6 -0
  380. package/skills/gsd-path-ship/scripts/check_task_briefs.py +3 -0
  381. package/skills/gsd-path-ship/scripts/detect_project.py +11 -1
  382. package/skills/gsd-path-ship/scripts/discussion_records.py +3 -0
  383. package/skills/gsd-path-ship/scripts/discussion_validate.py +8 -3
  384. package/skills/gsd-path-ship/scripts/integration.py +28 -8
  385. package/skills/gsd-path-ship/scripts/isolation.py +15 -5
  386. package/skills/gsd-path-ship/scripts/jev_review.py +138 -0
  387. package/skills/gsd-path-ship/scripts/lean_verification.py +2 -0
  388. package/skills/gsd-path-ship/scripts/loop_run.py +839 -0
  389. package/skills/gsd-path-ship/scripts/model_policy.py +279 -0
  390. package/skills/gsd-path-ship/scripts/path_config.py +248 -0
  391. package/skills/gsd-path-ship/scripts/pipeline_git.py +3 -0
  392. package/skills/gsd-path-ship/scripts/pipeline_state.py +4 -1
  393. package/skills/gsd-path-ship/scripts/promote_lookahead.py +3 -0
  394. package/skills/gsd-path-ship/scripts/review_panel.py +11 -0
  395. package/skills/gsd-path-ship/scripts/roadmap.py +5 -0
  396. package/skills/gsd-path-ship/scripts/state_checkpoint.py +5 -0
  397. package/skills/gsd-path-ship/scripts/state_promote.py +5 -0
  398. package/skills/gsd-path-ship/scripts/workflow_run.py +12 -1
  399. package/skills/gsd-path-ship/scripts/worktree_paths.py +94 -0
  400. package/skills/gsd-path-undo/SKILL.md +2 -0
  401. package/skills/gsd-path-undo/references/runtime-selection.md +25 -0
  402. package/skills/gsd-path-undo/scripts/_common.py +5 -0
  403. package/skills/gsd-path-undo/scripts/discussion_records.py +3 -0
  404. package/skills/gsd-path-undo/scripts/loop_run.py +839 -0
  405. package/skills/gsd-path-undo/scripts/model_policy.py +279 -0
  406. package/skills/gsd-path-undo/scripts/path_config.py +248 -0
  407. package/skills/gsd-path-undo/scripts/pipeline_undo.py +3 -0
  408. package/skills/gsd-path-undo/scripts/review_panel.py +564 -0
  409. package/skills/gsd-path-undo/scripts/worktree_paths.py +94 -0
  410. package/skills/path/BUILD.md +7 -0
  411. package/skills/path/DECIDE.md +2 -0
  412. package/skills/path/DEFINE.md +13 -7
  413. package/skills/path/DOCS-AUDIT.md +2 -0
  414. package/skills/path/INSPECT.md +2 -0
  415. package/skills/path/PLAN.md +4 -2
  416. package/skills/path/RESEARCH.md +2 -0
  417. package/skills/path/ROADMAP.md +2 -0
  418. package/skills/path/SHIP.md +24 -13
  419. package/skills/path/SKILL.md +23 -9
  420. package/skills/path/references/build-native.md +15 -7
  421. package/skills/path/references/config.md +57 -0
  422. package/skills/path/references/dispatch.md +6 -19
  423. package/skills/path/references/jev-review.md +82 -0
  424. package/skills/path/references/model-policy.md +139 -0
  425. package/skills/path/references/reviewer-panel.md +1 -1
  426. package/skills/path/references/reviewer.md +2 -0
  427. package/skills/path/references/runtime-selection.md +25 -0
  428. package/skills/path/scripts/_common.py +5 -0
  429. package/skills/path/scripts/archive_milestone.py +20 -6
  430. package/skills/path/scripts/bootstrap_repository.py +8 -1
  431. package/skills/path/scripts/build_recovery.py +5 -0
  432. package/skills/path/scripts/build_state.py +2 -0
  433. package/skills/path/scripts/check_docs_audit.py +2 -0
  434. package/skills/path/scripts/check_handoffs.py +6 -0
  435. package/skills/path/scripts/check_task_briefs.py +3 -0
  436. package/skills/path/scripts/detect_project.py +11 -1
  437. package/skills/path/scripts/discussion_records.py +3 -0
  438. package/skills/path/scripts/discussion_validate.py +8 -3
  439. package/skills/path/scripts/dispatch_driver.py +230 -21
  440. package/skills/path/scripts/git_guard.py +768 -0
  441. package/skills/path/scripts/integration.py +28 -8
  442. package/skills/path/scripts/isolation.py +15 -5
  443. package/skills/path/scripts/jev_review.py +138 -0
  444. package/skills/path/scripts/lean_verification.py +2 -0
  445. package/skills/path/scripts/loop_run.py +2 -0
  446. package/skills/path/scripts/model_policy.py +279 -0
  447. package/skills/path/scripts/path_config.py +248 -0
  448. package/skills/path/scripts/pipeline_git.py +3 -0
  449. package/skills/path/scripts/pipeline_state.py +4 -1
  450. package/skills/path/scripts/promote_lookahead.py +3 -0
  451. package/skills/path/scripts/review_panel.py +11 -0
  452. package/skills/path/scripts/roadmap.py +5 -0
  453. package/skills/path/scripts/state_checkpoint.py +5 -0
  454. package/skills/path/scripts/state_promote.py +5 -0
  455. package/skills/path/scripts/status_runtime.py +208 -0
  456. package/skills/path/scripts/workflow_run.py +12 -1
  457. package/skills/path/scripts/worktree_paths.py +94 -0
  458. package/skills/path/templates/skeptic.md +1 -1
  459. package/skills/path/templates/task.md +2 -0
  460. package/skills/path/templates/wave-panel.md +1 -1
  461. package/skills/gsd-path/scripts/__pycache__/archive_milestone.cpython-312.pyc +0 -0
  462. package/skills/gsd-path/scripts/__pycache__/build_recovery.cpython-312.pyc +0 -0
  463. package/skills/gsd-path/scripts/__pycache__/build_state.cpython-312.pyc +0 -0
  464. package/skills/gsd-path/scripts/__pycache__/check_task_briefs.cpython-312.pyc +0 -0
  465. package/skills/gsd-path/scripts/__pycache__/detect_project.cpython-312.pyc +0 -0
  466. package/skills/gsd-path/scripts/__pycache__/discussion_records.cpython-312.pyc +0 -0
  467. package/skills/gsd-path/scripts/__pycache__/discussion_validate.cpython-312.pyc +0 -0
  468. package/skills/gsd-path/scripts/__pycache__/integration.cpython-312.pyc +0 -0
  469. package/skills/gsd-path/scripts/__pycache__/isolation.cpython-312.pyc +0 -0
  470. package/skills/gsd-path/scripts/__pycache__/loop_run.cpython-312.pyc +0 -0
  471. package/skills/gsd-path/scripts/__pycache__/pipeline_git.cpython-312.pyc +0 -0
  472. package/skills/gsd-path/scripts/__pycache__/pipeline_state.cpython-312.pyc +0 -0
  473. package/skills/gsd-path/scripts/__pycache__/review_findings.cpython-312.pyc +0 -0
  474. package/skills/gsd-path/scripts/__pycache__/review_panel.cpython-312.pyc +0 -0
  475. package/skills/gsd-path/scripts/__pycache__/roadmap.cpython-312.pyc +0 -0
  476. package/skills/gsd-path/scripts/__pycache__/state_checkpoint.cpython-312.pyc +0 -0
  477. package/skills/gsd-path/scripts/__pycache__/task_context.cpython-312.pyc +0 -0
  478. package/skills/gsd-path/scripts/__pycache__/workflow_run.cpython-312.pyc +0 -0
  479. package/skills/gsd-path-build/scripts/__pycache__/archive_milestone.cpython-312.pyc +0 -0
  480. package/skills/gsd-path-build/scripts/__pycache__/build_recovery.cpython-312.pyc +0 -0
  481. package/skills/gsd-path-build/scripts/__pycache__/build_state.cpython-312.pyc +0 -0
  482. package/skills/gsd-path-build/scripts/__pycache__/check_task_briefs.cpython-312.pyc +0 -0
  483. package/skills/gsd-path-build/scripts/__pycache__/detect_project.cpython-312.pyc +0 -0
  484. package/skills/gsd-path-build/scripts/__pycache__/discussion_validate.cpython-312.pyc +0 -0
  485. package/skills/gsd-path-build/scripts/__pycache__/isolation.cpython-312.pyc +0 -0
  486. package/skills/gsd-path-build/scripts/__pycache__/loop_run.cpython-312.pyc +0 -0
  487. package/skills/gsd-path-build/scripts/__pycache__/pipeline_git.cpython-312.pyc +0 -0
  488. package/skills/gsd-path-build/scripts/__pycache__/pipeline_state.cpython-312.pyc +0 -0
  489. package/skills/gsd-path-build/scripts/__pycache__/review_findings.cpython-312.pyc +0 -0
  490. package/skills/gsd-path-build/scripts/__pycache__/review_panel.cpython-312.pyc +0 -0
  491. package/skills/gsd-path-build/scripts/__pycache__/roadmap.cpython-312.pyc +0 -0
  492. package/skills/gsd-path-build/scripts/__pycache__/state_checkpoint.cpython-312.pyc +0 -0
  493. package/skills/gsd-path-build/scripts/__pycache__/task_context.cpython-312.pyc +0 -0
  494. package/skills/gsd-path-build/scripts/__pycache__/workflow_run.cpython-312.pyc +0 -0
  495. package/skills/gsd-path-decide/scripts/__pycache__/_common.cpython-312.pyc +0 -0
  496. package/skills/gsd-path-decide/scripts/__pycache__/archive_milestone.cpython-312.pyc +0 -0
  497. package/skills/gsd-path-decide/scripts/__pycache__/detect_project.cpython-312.pyc +0 -0
  498. package/skills/gsd-path-decide/scripts/__pycache__/discussion_validate.cpython-312.pyc +0 -0
  499. package/skills/gsd-path-decide/scripts/__pycache__/isolation.cpython-312.pyc +0 -0
  500. package/skills/gsd-path-decide/scripts/__pycache__/pipeline_git.cpython-312.pyc +0 -0
  501. package/skills/gsd-path-decide/scripts/__pycache__/pipeline_state.cpython-312.pyc +0 -0
  502. package/skills/gsd-path-decide/scripts/__pycache__/review_panel.cpython-312.pyc +0 -0
  503. package/skills/gsd-path-decide/scripts/__pycache__/roadmap.cpython-312.pyc +0 -0
  504. package/skills/gsd-path-decide/scripts/__pycache__/state_checkpoint.cpython-312.pyc +0 -0
  505. package/skills/gsd-path-define/scripts/__pycache__/_common.cpython-312.pyc +0 -0
  506. package/skills/gsd-path-define/scripts/__pycache__/archive_milestone.cpython-312.pyc +0 -0
  507. package/skills/gsd-path-define/scripts/__pycache__/detect_project.cpython-312.pyc +0 -0
  508. package/skills/gsd-path-define/scripts/__pycache__/discussion_validate.cpython-312.pyc +0 -0
  509. package/skills/gsd-path-define/scripts/__pycache__/isolation.cpython-312.pyc +0 -0
  510. package/skills/gsd-path-define/scripts/__pycache__/pipeline_git.cpython-312.pyc +0 -0
  511. package/skills/gsd-path-define/scripts/__pycache__/pipeline_state.cpython-312.pyc +0 -0
  512. package/skills/gsd-path-define/scripts/__pycache__/review_panel.cpython-312.pyc +0 -0
  513. package/skills/gsd-path-define/scripts/__pycache__/roadmap.cpython-312.pyc +0 -0
  514. package/skills/gsd-path-define/scripts/__pycache__/state_checkpoint.cpython-312.pyc +0 -0
  515. package/skills/gsd-path-docs-audit/scripts/__pycache__/_common.cpython-312.pyc +0 -0
  516. package/skills/gsd-path-docs-audit/scripts/__pycache__/archive_milestone.cpython-312.pyc +0 -0
  517. package/skills/gsd-path-docs-audit/scripts/__pycache__/build_recovery.cpython-312.pyc +0 -0
  518. package/skills/gsd-path-docs-audit/scripts/__pycache__/detect_project.cpython-312.pyc +0 -0
  519. package/skills/gsd-path-docs-audit/scripts/__pycache__/discussion_validate.cpython-312.pyc +0 -0
  520. package/skills/gsd-path-docs-audit/scripts/__pycache__/isolation.cpython-312.pyc +0 -0
  521. package/skills/gsd-path-docs-audit/scripts/__pycache__/pipeline_git.cpython-312.pyc +0 -0
  522. package/skills/gsd-path-docs-audit/scripts/__pycache__/pipeline_state.cpython-312.pyc +0 -0
  523. package/skills/gsd-path-docs-audit/scripts/__pycache__/review_panel.cpython-312.pyc +0 -0
  524. package/skills/gsd-path-docs-audit/scripts/__pycache__/roadmap.cpython-312.pyc +0 -0
  525. package/skills/gsd-path-docs-audit/scripts/__pycache__/state_checkpoint.cpython-312.pyc +0 -0
  526. package/skills/gsd-path-forensics/scripts/__pycache__/pipeline_undo.cpython-312.pyc +0 -0
  527. package/skills/gsd-path-inspect/scripts/__pycache__/archive_milestone.cpython-312.pyc +0 -0
  528. package/skills/gsd-path-inspect/scripts/__pycache__/build_recovery.cpython-312.pyc +0 -0
  529. package/skills/gsd-path-inspect/scripts/__pycache__/detect_project.cpython-312.pyc +0 -0
  530. package/skills/gsd-path-inspect/scripts/__pycache__/discussion_validate.cpython-312.pyc +0 -0
  531. package/skills/gsd-path-inspect/scripts/__pycache__/isolation.cpython-312.pyc +0 -0
  532. package/skills/gsd-path-inspect/scripts/__pycache__/pipeline_git.cpython-312.pyc +0 -0
  533. package/skills/gsd-path-inspect/scripts/__pycache__/pipeline_state.cpython-312.pyc +0 -0
  534. package/skills/gsd-path-inspect/scripts/__pycache__/review_panel.cpython-312.pyc +0 -0
  535. package/skills/gsd-path-inspect/scripts/__pycache__/roadmap.cpython-312.pyc +0 -0
  536. package/skills/gsd-path-inspect/scripts/__pycache__/state_checkpoint.cpython-312.pyc +0 -0
  537. package/skills/gsd-path-plan/scripts/__pycache__/archive_milestone.cpython-312.pyc +0 -0
  538. package/skills/gsd-path-plan/scripts/__pycache__/detect_project.cpython-312.pyc +0 -0
  539. package/skills/gsd-path-plan/scripts/__pycache__/discussion_validate.cpython-312.pyc +0 -0
  540. package/skills/gsd-path-plan/scripts/__pycache__/isolation.cpython-312.pyc +0 -0
  541. package/skills/gsd-path-plan/scripts/__pycache__/pipeline_git.cpython-312.pyc +0 -0
  542. package/skills/gsd-path-plan/scripts/__pycache__/pipeline_state.cpython-312.pyc +0 -0
  543. package/skills/gsd-path-plan/scripts/__pycache__/review_panel.cpython-312.pyc +0 -0
  544. package/skills/gsd-path-plan/scripts/__pycache__/roadmap.cpython-312.pyc +0 -0
  545. package/skills/gsd-path-plan/scripts/__pycache__/state_checkpoint.cpython-312.pyc +0 -0
  546. package/skills/gsd-path-research/scripts/__pycache__/_common.cpython-312.pyc +0 -0
  547. package/skills/gsd-path-research/scripts/__pycache__/archive_milestone.cpython-312.pyc +0 -0
  548. package/skills/gsd-path-research/scripts/__pycache__/detect_project.cpython-312.pyc +0 -0
  549. package/skills/gsd-path-research/scripts/__pycache__/discussion_validate.cpython-312.pyc +0 -0
  550. package/skills/gsd-path-research/scripts/__pycache__/isolation.cpython-312.pyc +0 -0
  551. package/skills/gsd-path-research/scripts/__pycache__/pipeline_git.cpython-312.pyc +0 -0
  552. package/skills/gsd-path-research/scripts/__pycache__/pipeline_state.cpython-312.pyc +0 -0
  553. package/skills/gsd-path-research/scripts/__pycache__/review_panel.cpython-312.pyc +0 -0
  554. package/skills/gsd-path-research/scripts/__pycache__/roadmap.cpython-312.pyc +0 -0
  555. package/skills/gsd-path-research/scripts/__pycache__/state_checkpoint.cpython-312.pyc +0 -0
  556. package/skills/gsd-path-roadmap/scripts/__pycache__/_common.cpython-312.pyc +0 -0
  557. package/skills/gsd-path-roadmap/scripts/__pycache__/archive_milestone.cpython-312.pyc +0 -0
  558. package/skills/gsd-path-roadmap/scripts/__pycache__/detect_project.cpython-312.pyc +0 -0
  559. package/skills/gsd-path-roadmap/scripts/__pycache__/discussion_validate.cpython-312.pyc +0 -0
  560. package/skills/gsd-path-roadmap/scripts/__pycache__/isolation.cpython-312.pyc +0 -0
  561. package/skills/gsd-path-roadmap/scripts/__pycache__/pipeline_git.cpython-312.pyc +0 -0
  562. package/skills/gsd-path-roadmap/scripts/__pycache__/pipeline_state.cpython-312.pyc +0 -0
  563. package/skills/gsd-path-roadmap/scripts/__pycache__/review_panel.cpython-312.pyc +0 -0
  564. package/skills/gsd-path-roadmap/scripts/__pycache__/roadmap.cpython-312.pyc +0 -0
  565. package/skills/gsd-path-roadmap/scripts/__pycache__/state_checkpoint.cpython-312.pyc +0 -0
  566. package/skills/gsd-path-ship/scripts/__pycache__/archive_milestone.cpython-312.pyc +0 -0
  567. package/skills/gsd-path-ship/scripts/__pycache__/build_recovery.cpython-312.pyc +0 -0
  568. package/skills/gsd-path-ship/scripts/__pycache__/build_state.cpython-312.pyc +0 -0
  569. package/skills/gsd-path-ship/scripts/__pycache__/check_handoffs.cpython-312.pyc +0 -0
  570. package/skills/gsd-path-ship/scripts/__pycache__/check_task_briefs.cpython-312.pyc +0 -0
  571. package/skills/gsd-path-ship/scripts/__pycache__/detect_project.cpython-312.pyc +0 -0
  572. package/skills/gsd-path-ship/scripts/__pycache__/discussion_validate.cpython-312.pyc +0 -0
  573. package/skills/gsd-path-ship/scripts/__pycache__/isolation.cpython-312.pyc +0 -0
  574. package/skills/gsd-path-ship/scripts/__pycache__/pipeline_git.cpython-312.pyc +0 -0
  575. package/skills/gsd-path-ship/scripts/__pycache__/pipeline_state.cpython-312.pyc +0 -0
  576. package/skills/gsd-path-ship/scripts/__pycache__/review_panel.cpython-312.pyc +0 -0
  577. package/skills/gsd-path-ship/scripts/__pycache__/roadmap.cpython-312.pyc +0 -0
  578. package/skills/gsd-path-ship/scripts/__pycache__/state_checkpoint.cpython-312.pyc +0 -0
@@ -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-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
@@ -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
@@ -364,27 +367,35 @@ Run this recovery setup from a separate checkout, outside the closed primary
364
367
  worktree's guard.
365
368
 
366
369
  1. Create separate disposable trust and validation checkouts from the same
367
- published origin and `STATE.branch`. This separation is required because a
368
- 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,
369
372
  while archive validation requires a clean checkout. Never use the primary
370
373
  worktree for either role.
371
- 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
372
375
  disposable trust checkout's managed trust anchor:
373
376
 
374
377
  ```bash
375
- node <trusted-gsd-path>/scripts/install.mjs --hooks-refresh --dry-run --project <trust-root>
376
- 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
377
389
  ```
378
390
 
379
- Continue only when the preview names managed `.gsd-path/` runtime or guard
380
- files and no `.project/` path. The installer owns the atomic refresh and
381
- refuses unmanaged or unsafe runtime entries.
382
- 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
383
394
  refs in the clean validation checkout and validate its integrated milestone:
384
395
 
385
396
  ```bash
386
- python3 <trust-root>/.gsd-path/runtime/archive_milestone.py refresh-origin --repo <validation-root>
387
- 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>
388
399
  ```
389
400
 
390
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
@@ -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.
@@ -13,5 +13,5 @@ Use only wave-panel.md. Apply every Wave mode evidence rule (recorded SHAs,
13
13
  isolated patch, recorded Verify) when the brief supplies a verify sidecar.
14
14
  On a `deep` wave the brief is the adversarial lens only. Record findings
15
15
  the same way as plan panel mode. Do not write a Wave verdict and do not
16
- edit the canonical wave-review file. The inherit reviewer remains the only
16
+ edit the canonical wave-review file. The canonical reviewer remains the only
17
17
  pass/fail.
@@ -32,6 +32,8 @@ Resolve sibling links against this role file's directory.
32
32
 
33
33
  ## Rules
34
34
 
35
+ - When `GSD_PATH_JEV=1`, wave and final reviewers follow the optional
36
+ [Jev evidence screening procedure](jev-review.md) for uncovered criteria.
35
37
  - Review written expectations, not preferences or alternate designs.
36
38
  - Treat an Interface contract violation as a failed criterion, citing the
37
39
  contract line and the offending diff hunk.
@@ -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
@@ -16,6 +16,9 @@ import re
16
16
  import shutil
17
17
  import subprocess
18
18
  import sys
19
+
20
+ # Runtime helpers must not modify their immutable installation.
21
+ sys.dont_write_bytecode = True
19
22
  from contextlib import contextmanager
20
23
  from datetime import date
21
24
  from pathlib import Path, PurePosixPath
@@ -1743,6 +1746,12 @@ def require_clean_active_root(active_root: Path, archive: Path) -> None:
1743
1746
  carried_forward = pending_ruling_count(archived_audit)
1744
1747
  # Persistent project metadata ships but never archives with a milestone.
1745
1748
  allowed = {"STATE.md", "REPOSITORY.md", "archive", "LESSONS.md", "next"}
1749
+ for name in ("config.json", "model-policy.json"):
1750
+ path = active_root / name
1751
+ if path.exists() or path.is_symlink():
1752
+ if path.is_symlink() or not path.is_file() or path.stat().st_nlink != 1:
1753
+ raise ArchiveError(f"project settings must be a regular unlinked file: {path}")
1754
+ allowed.add(name)
1746
1755
  if (active_root / "CHARTER.md").is_file():
1747
1756
  # Program flow: these persist at the .project/ top level.
1748
1757
  allowed |= {"CHARTER.md", "ROADMAP.md", "SYNTHESIS.md"}
@@ -1808,6 +1817,7 @@ def prepared_transaction(
1808
1817
  repo: Path,
1809
1818
  phases: Sequence[str],
1810
1819
  must_be_uncommitted: bool = False,
1820
+ *, historical: bool = False,
1811
1821
  ) -> tuple:
1812
1822
  project = repo.resolve()
1813
1823
  active_root = require_project_layout(project)
@@ -1816,7 +1826,7 @@ def prepared_transaction(
1816
1826
  state, _, loaded_state_path = strict_state(project)
1817
1827
  if loaded_state_path.resolve() != state_path.resolve():
1818
1828
  raise ArchiveError("strict STATE.md loader returned an unexpected path")
1819
- require_transaction_context(project, state, phases)
1829
+ require_transaction_context(project, state, phases, historical=historical)
1820
1830
 
1821
1831
  configured = state.archive
1822
1832
  if configured is None:
@@ -1880,10 +1890,11 @@ def require_canonical_commit_body(
1880
1890
  raise ArchiveError(f"{label} commit body does not match required fields")
1881
1891
 
1882
1892
 
1883
- def find_ship_commit(project: Path, archive_name: str) -> str:
1893
+ def find_ship_commit(project: Path, archive_name: str, *, historical: bool = False) -> str:
1884
1894
  expected_subject = ship_subject(archive_name)
1885
1895
  log = require_git_success(
1886
- run_git(project, "log", "--first-parent", "--format=%H%x00%s", "HEAD"),
1896
+ run_git(project, "log", *([] if historical else ["--first-parent"]),
1897
+ "--format=%H%x00%s", "HEAD"),
1887
1898
  "inspect HEAD history for the ship commit",
1888
1899
  )
1889
1900
  matches = []
@@ -1926,19 +1937,22 @@ def validate_shipped_roadmap(text: str, state: PipelineState, archive: str) -> N
1926
1937
  raise ArchiveError("ROADMAP.md must record Status: shipped and the exact Archive")
1927
1938
 
1928
1939
 
1929
- def validate(repo: Path) -> dict:
1940
+ def validate(repo: Path, *, historical: bool = False) -> dict:
1930
1941
  project, _, state, configured, archive, archived_files, reviewed_head = prepared_transaction(
1931
1942
  repo,
1932
1943
  ("shipped",),
1944
+ historical=historical,
1933
1945
  )
1934
1946
  if state.status != "done":
1935
1947
  raise ArchiveError("STATE.md is not shipped/done")
1936
1948
 
1937
- project_status = require_git_success(run_git(project, "status", "--porcelain"), "inspect worktree status")
1949
+ project_status = require_git_success(
1950
+ run_git(project, "status", "--porcelain", *(["--", ".project"] if historical else [])),
1951
+ "inspect worktree status")
1938
1952
  if project_status:
1939
1953
  raise ArchiveError("ship transaction worktree is not clean")
1940
1954
 
1941
- ship_commit = find_ship_commit(project, archive.name)
1955
+ ship_commit = find_ship_commit(project, archive.name, historical=historical)
1942
1956
 
1943
1957
  parents = require_git_success(
1944
1958
  run_git(project, "rev-list", "--parents", "-n", "1", ship_commit),
@@ -3,6 +3,11 @@
3
3
 
4
4
  from __future__ import annotations
5
5
 
6
+ import sys
7
+
8
+ # Runtime helpers must not modify their immutable installation.
9
+ sys.dont_write_bytecode = True
10
+
6
11
  import json
7
12
  import re
8
13
  from pathlib import Path
@@ -1,4 +1,5 @@
1
1
  #!/usr/bin/env python3
2
+ # gsd-path project runtime
2
3
  """Build task readiness, landing reconciliation, and the verify ledger."""
3
4
 
4
5
  from __future__ import annotations
@@ -7,6 +8,7 @@ import argparse
7
8
  import json
8
9
  import re
9
10
  import sys
11
+ sys.dont_write_bytecode = True
10
12
  from dataclasses import dataclass
11
13
  from datetime import datetime, timezone
12
14
  from pathlib import Path, PurePosixPath
@@ -7,6 +7,9 @@ import json
7
7
  import re
8
8
  import subprocess
9
9
  import sys
10
+
11
+ # Runtime helpers must not modify their immutable installation.
12
+ sys.dont_write_bytecode = True
10
13
  from pathlib import Path, PurePosixPath
11
14
  from typing import Dict, List, Optional, Sequence, Set, Tuple
12
15
 
@@ -131,6 +134,9 @@ def _strict_frontmatter(text: str, label: str) -> Dict[str, object]:
131
134
  while index < len(lines):
132
135
  line = lines[index]
133
136
  if line == "---":
137
+ for field in ('model', 'effort'):
138
+ if field in values and (not isinstance(values[field], str) or not values[field].strip()):
139
+ raise HandoffError(f'{label}: {field} must be a nonempty scalar or inherit')
134
140
  return values
135
141
  if not line.strip() or line.lstrip().startswith("#"):
136
142
  index += 1
@@ -6,6 +6,9 @@ import argparse
6
6
  import json
7
7
  import re
8
8
  import sys
9
+
10
+ # Runtime helpers must not modify their immutable installation.
11
+ sys.dont_write_bytecode = True
9
12
  from pathlib import Path, PurePosixPath
10
13
  from typing import Dict, List, Optional, Sequence, Set, Tuple
11
14
 
@@ -34,6 +34,9 @@ import re
34
34
  import stat
35
35
  import subprocess
36
36
  import sys
37
+
38
+ # Runtime helpers must not modify their immutable installation.
39
+ sys.dont_write_bytecode = True
37
40
  from datetime import date
38
41
  from pathlib import Path, PurePosixPath, PureWindowsPath
39
42
  from typing import Iterable, NamedTuple, Optional, Sequence
@@ -1200,7 +1203,14 @@ def filled_state_template(template: str, slug: str, phase: str) -> str:
1200
1203
  text = text.replace("YYYY-MM-DD — <phase> — project initialized", stamp)
1201
1204
  if "<slug>" in text or "YYYY-MM-DD" in text:
1202
1205
  raise DetectError("state template placeholder remains")
1203
- return text
1206
+ try:
1207
+ from .path_config import initial_state
1208
+ except ImportError:
1209
+ from path_config import initial_state
1210
+ try:
1211
+ return initial_state(text)
1212
+ except (OSError, ValueError, RuntimeError) as error:
1213
+ raise DetectError(str(error)) from error
1204
1214
 
1205
1215
 
1206
1216
  def write_all(descriptor: int, payload: bytes) -> None: