@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-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.
@@ -110,12 +112,13 @@ the charter instead of the single-milestone checklist:
110
112
  4. **Constraints** — program-level stack, budget, deadline, integrations.
111
113
  5. **Program success criteria** — observable when the last milestone ships.
112
114
  6. **Review panel** — optional durable default (`off` | `detected` | named
113
- 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
114
117
  milestone INTENT files copy it and may override.
115
118
 
116
119
  Read the local [charter template](templates/charter.md), write the approval
117
- draft to `.project/CHARTER.md` including `Review panel:` (default `off`;
118
- 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
119
122
  loop as the standard Process. On approval, retain the reviewed
120
123
  `Review panel:` value on CHARTER.md, run `pipeline_state.py transition` with
121
124
  expected `define/active`, milestone/branch/archive all at their exact current
@@ -144,7 +147,7 @@ State ownership. There is no re-interview of charter or roadmap scope:
144
147
  Risks and Open questions from the entry (tagged `RESEARCH`/`NEEDS-USER`),
145
148
  `Lane: milestone`, `Surfaces:` copied verbatim from the entry, and
146
149
  `Review panel:` copied from CHARTER.md (default
147
- `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
148
151
  panel value; do not invent `detected` or a named list. When brownfield,
149
152
  fill `## Current state` from the map, record doc-vs-code rulings as in
150
153
  Brownfield mode, and add protected existing behavior under Scope out.
@@ -271,9 +274,12 @@ question. The rules change for every primary mode:
271
274
  ## Output contract
272
275
 
273
276
  At approval, retain the already reviewed `Lane:` value and its one-line reason.
274
- Retain `Review panel:` as reviewed: the CHARTER copy or the user's override
275
- in milestone/lookahead mode, the CHARTER value in program mode, or `off`
276
- 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.
277
283
 
278
284
  After approval, finalize `.project/intent/INTENT.md` and run
279
285
  `pipeline_state.py transition` with expected `define/active`, the exact
@@ -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
@@ -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:
@@ -7,6 +7,9 @@ import json
7
7
  import os
8
8
  import shutil
9
9
  import sys
10
+
11
+ # Runtime helpers must not modify their immutable installation.
12
+ sys.dont_write_bytecode = True
10
13
  from contextlib import contextmanager
11
14
  from datetime import date
12
15
  from pathlib import Path
@@ -2,6 +2,11 @@
2
2
  # gsd-path project runtime
3
3
  """Validate discussion records, reviews and the manifest for archive_milestone."""
4
4
 
5
+ import sys
6
+
7
+ # Runtime helpers must not modify their immutable installation.
8
+ sys.dont_write_bytecode = True
9
+
5
10
  import json
6
11
  import re
7
12
  import shutil
@@ -409,7 +414,7 @@ def remove_interrupted_carry_copy(active_root: Path, archive: Path) -> None:
409
414
 
410
415
 
411
416
  def require_transaction_context(
412
- project: Path, state: PipelineState, phases: Sequence[str]
417
+ project: Path, state: PipelineState, phases: Sequence[str], *, historical: bool = False
413
418
  ) -> None:
414
419
  phase = state.phase
415
420
  if phase not in phases:
@@ -429,7 +434,7 @@ def require_transaction_context(
429
434
  )
430
435
  if archive_milestone.is_unset(expected_branch):
431
436
  raise ArchiveError("STATE.md does not name a bound build branch")
432
- if current_branch != expected_branch:
437
+ if current_branch != expected_branch and not historical:
433
438
  raise ArchiveError(
434
439
  f"current branch {current_branch!r} does not match STATE.branch {expected_branch!r}"
435
440
  )
@@ -446,7 +451,7 @@ def require_transaction_context(
446
451
  ),
447
452
  "inspect non-project worktree status",
448
453
  )
449
- if non_project_status:
454
+ if non_project_status and not historical:
450
455
  raise ArchiveError("non-.project worktree changes block the archive transaction")
451
456
 
452
457
 
@@ -2,6 +2,11 @@
2
2
  # gsd-path project runtime
3
3
  """Own milestone integration, publication, tags, and completion proof."""
4
4
 
5
+ import sys
6
+
7
+ # Runtime helpers must not modify their immutable installation.
8
+ sys.dont_write_bytecode = True
9
+
5
10
  import json
6
11
  import re
7
12
  from pathlib import Path, PurePosixPath
@@ -21,6 +26,7 @@ try:
21
26
  from pipeline_state import PipelineState
22
27
  from isolation import publication_base
23
28
  import _common
29
+ import worktree_paths
24
30
  except ImportError: # pragma: no cover - package import used by tests
25
31
  from scripts.pipeline_git import (
26
32
  bound_branch_name,
@@ -35,6 +41,7 @@ except ImportError: # pragma: no cover - package import used by tests
35
41
  from scripts.pipeline_state import PipelineState
36
42
  from scripts.isolation import publication_base
37
43
  from scripts import _common
44
+ from scripts import worktree_paths
38
45
 
39
46
 
40
47
  if __package__:
@@ -156,10 +163,13 @@ def optional_ref(project: Path, ref: str) -> Optional[str]:
156
163
  return result.stdout.strip() if result.returncode == 0 else None
157
164
 
158
165
 
159
- def integration_names(project: Path, archive_name: str) -> tuple[str, Path]:
166
+ def integration_names(project: Path, archive_name: str, *, pin: bool = False) -> tuple[str, Path]:
160
167
  identifier = milestone_id(milestone_number(archive_name))
161
168
  branch = f"gsd-path-integrate/{identifier}"
162
- worktree = project.parent / f".{project.name}-gsd-path-integrate-{identifier}"
169
+ try:
170
+ worktree = worktree_paths.worktree_path(project, "integrate", identifier, pin=pin)
171
+ except (ValueError, OSError) as error:
172
+ raise ArchiveError(str(error)) from error
163
173
  return branch, worktree
164
174
 
165
175
 
@@ -1044,7 +1054,7 @@ def integrate(repo: Path, slug: str) -> dict:
1044
1054
  ship_commit,
1045
1055
  )
1046
1056
  publishable_bound_branch(project, bound_branch, ship_commit)
1047
- integration_branch, worktree = integration_names(project, archive_name)
1057
+ integration_branch, worktree = integration_names(project, archive_name, pin=True)
1048
1058
  interrupted_worktree = registered_worktree(project, integration_branch)
1049
1059
  if (
1050
1060
  interrupted_worktree is not None
@@ -1222,7 +1232,9 @@ def find_integrate_commit(
1222
1232
  return merge_commit
1223
1233
 
1224
1234
 
1225
- def validate_integrated(repo: Path, slug: str, *, refresh: bool = True) -> dict:
1235
+ def validate_integrated(
1236
+ repo: Path, slug: str, *, refresh: bool = True, historical: bool = False
1237
+ ) -> dict:
1226
1238
  project = repo.resolve()
1227
1239
  active_root = archive_milestone.require_project_layout(project)
1228
1240
  state, _, loaded_state_path = archive_milestone.strict_state(project)
@@ -1235,7 +1247,7 @@ def validate_integrated(repo: Path, slug: str, *, refresh: bool = True) -> dict:
1235
1247
  )
1236
1248
 
1237
1249
  # (a) The shipped transaction itself must still validate.
1238
- shipped = archive_milestone.validate(repo)
1250
+ shipped = archive_milestone.validate(repo, historical=historical)
1239
1251
  configured = shipped["archive"]
1240
1252
  ship_commit = shipped["commit"]
1241
1253
  archive_name = PurePosixPath(configured).name
@@ -1340,6 +1352,10 @@ def validate_integrated(repo: Path, slug: str, *, refresh: bool = True) -> dict:
1340
1352
  contains = run_git(project, "merge-base", "--is-ancestor", merge_commit, remote_default)
1341
1353
  if contains.returncode != 0:
1342
1354
  raise ArchiveError(f"{remote_default} does not contain the integration merge")
1355
+ if (historical
1356
+ and run_git(project, "branch", "--show-current").stdout.strip() != bound_branch
1357
+ and run_git(project, "merge-base", "--is-ancestor", merge_commit, "HEAD").returncode):
1358
+ raise ArchiveError("HEAD does not contain the integration merge")
1343
1359
 
1344
1360
  # (e) The bound branch tip and annotated tag must be published on origin.
1345
1361
  require_published_integration(
@@ -1348,7 +1364,8 @@ def validate_integrated(repo: Path, slug: str, *, refresh: bool = True) -> dict:
1348
1364
  ship_commit,
1349
1365
  tag_name,
1350
1366
  merge_commit,
1351
- allow_missing_bound=state.integration == "pull-request",
1367
+ allow_missing_bound=state.integration == "pull-request" or (historical and has_origin),
1368
+ retired=historical,
1352
1369
  )
1353
1370
 
1354
1371
  result = {
@@ -1369,7 +1386,9 @@ def validate_integrated(repo: Path, slug: str, *, refresh: bool = True) -> dict:
1369
1386
  refs = [(f"refs/heads/{default_name}", result["base"]),
1370
1387
  (f"refs/tags/{tag_name}", optional_ref(project, tag_ref))]
1371
1388
  if state.integration == "direct":
1372
- refs.append((f"refs/heads/{bound_branch}", ship_commit))
1389
+ bound_ref = f"refs/heads/{bound_branch}"
1390
+ if not historical or live_remote_ref(project, bound_ref) is not None:
1391
+ refs.append((bound_ref, ship_commit))
1373
1392
  for ref, expected in refs:
1374
1393
  if live_remote_ref(project, ref) != expected:
1375
1394
  raise ArchiveError(f"published {ref} differs from local integration evidence")
@@ -1385,6 +1404,7 @@ def require_published_integration(
1385
1404
  tag_name: str,
1386
1405
  merge_commit: str,
1387
1406
  allow_missing_bound: bool = False,
1407
+ retired: bool = False,
1388
1408
  ) -> None:
1389
1409
  if allow_missing_bound:
1390
1410
  published_ship = live_remote_ref(project, f"refs/heads/{bound_branch}")
@@ -1408,7 +1428,7 @@ def require_published_integration(
1408
1428
 
1409
1429
  bound_ref = f"refs/remotes/origin/{bound_branch}"
1410
1430
  if run_git(project, "rev-parse", "--verify", "--quiet", bound_ref).returncode != 0:
1411
- if not allow_missing_bound:
1431
+ if not retired:
1412
1432
  raise ArchiveError(f"missing published bound branch: origin/{bound_branch}")
1413
1433
  else:
1414
1434
  published_ship = archive_milestone.require_git_success(
@@ -18,6 +18,9 @@ import re
18
18
  import stat
19
19
  import subprocess
20
20
  import sys
21
+
22
+ # Runtime helpers must not modify their immutable installation.
23
+ sys.dont_write_bytecode = True
21
24
  import tempfile
22
25
  from pathlib import Path, PurePosixPath
23
26
  from typing import Dict, Optional, Sequence, Set
@@ -33,6 +36,7 @@ try:
33
36
  task_commit_subject,
34
37
  )
35
38
  import _common
39
+ import worktree_paths
36
40
  except ImportError: # pragma: no cover - package import used by tests
37
41
  from scripts.pipeline_git import (
38
42
  attest_commit_body,
@@ -44,6 +48,7 @@ except ImportError: # pragma: no cover - package import used by tests
44
48
  task_commit_subject,
45
49
  )
46
50
  from scripts import _common
51
+ from scripts import worktree_paths
47
52
 
48
53
 
49
54
  TASK_BRANCH_PREFIX = "gsd-path-task/"
@@ -57,7 +62,9 @@ VERIFY_LEDGER_PATH = _common.VERIFY_LEDGER_PATH
57
62
  LANDED_VERDICTS = frozenset({"recovered", "attested"})
58
63
  # Orchestrator bookkeeping that may stay uncommitted in the primary while a
59
64
  # parallel task lands; the next `.project` checkpoint commits it.
60
- BOOKKEEPING_PATHS = DISCUSSION_PATHS | {VERIFY_LEDGER_PATH}
65
+ BOOKKEEPING_PATHS = DISCUSSION_PATHS | {
66
+ VERIFY_LEDGER_PATH, ".project/config.json", ".project/model-policy.json",
67
+ }
61
68
  # Bookkeeping path prefixes: pipeline records plus the guard's own install
62
69
  # artifacts. git_guard and the post-adoption proof share this one definition.
63
70
  BOOKKEEPING_PREFIXES = (
@@ -142,8 +149,11 @@ def common_git_dir(repo: Path) -> Path:
142
149
  return (repo / raw).resolve()
143
150
 
144
151
 
145
- def sidecar_root(primary: Path, kind: str, name: str) -> Path:
146
- return primary.parent / f"{primary.name}.gsd-path" / kind / name
152
+ def sidecar_root(primary: Path, kind: str, name: str, *, pin: bool = False) -> Path:
153
+ try:
154
+ return worktree_paths.worktree_path(primary, kind, name, pin=pin)
155
+ except (ValueError, OSError) as error:
156
+ raise IsolationError(str(error)) from error
147
157
 
148
158
 
149
159
  def validate_task_id(task_id: str) -> str:
@@ -553,7 +563,7 @@ def isolate_task(
553
563
  "worktree": str(primary),
554
564
  }
555
565
  branch = task_branch_name(task_id)
556
- destination = sidecar_root(primary, "task", task_id)
566
+ destination = sidecar_root(primary, "task", task_id, pin=True)
557
567
  create_named_worktree(primary, branch, destination, resolved_base)
558
568
  return {
559
569
  "base": resolved_base,
@@ -589,7 +599,7 @@ def isolate_verify(primary: Path, base: str, name: str, historical_task: Optiona
589
599
  + ", ".join(product_dirt)
590
600
  )
591
601
  branch = verify_branch_name(name)
592
- destination = sidecar_root(primary, "verify", name)
602
+ destination = sidecar_root(primary, "verify", name, pin=True)
593
603
  create_named_worktree(primary, branch, destination, resolved_base)
594
604
  return {
595
605
  "base": resolved_base,