@opengsd/gsd-path 1.0.0 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (498) hide show
  1. package/AGENTS.md +33 -13
  2. package/CHANGELOG.md +68 -0
  3. package/DOCS.md +75 -6
  4. package/FULL.md +12 -15
  5. package/HOOKS.md +18 -9
  6. package/QUICK.md +8 -6
  7. package/README.md +218 -14
  8. package/RUNTIME.md +16 -5
  9. package/UPDATE.md +30 -11
  10. package/WORKFLOW.md +35 -16
  11. package/package.json +23 -1
  12. package/platforms/claude/dispatch.md +4 -4
  13. package/platforms/copilot/dispatch.md +4 -4
  14. package/platforms/cursor/dispatch.md +5 -10
  15. package/platforms/grok/dispatch.md +4 -6
  16. package/platforms/kimi/dispatch.md +4 -4
  17. package/platforms/kiro/dispatch.md +4 -6
  18. package/platforms/opencode/dispatch.md +4 -4
  19. package/platforms/qwen/dispatch.md +4 -4
  20. package/platforms/shared-agents/dispatch.md +12 -19
  21. package/scripts/_common.py +5 -0
  22. package/scripts/archive_milestone.py +30 -124
  23. package/scripts/bootstrap_repository.py +33 -4
  24. package/scripts/build_recovery.py +292 -0
  25. package/scripts/build_state.py +2 -0
  26. package/scripts/check_docs_audit.py +7 -3
  27. package/scripts/check_handoffs.py +7 -1
  28. package/scripts/check_task_briefs.py +3 -0
  29. package/scripts/detect_project.py +22 -3
  30. package/scripts/discussion_records.py +3 -0
  31. package/scripts/discussion_validate.py +8 -3
  32. package/scripts/dispatch_driver.py +233 -22
  33. package/scripts/git_guard.py +14 -5
  34. package/scripts/guard_hook.py +11 -1
  35. package/scripts/install.mjs +54 -1448
  36. package/scripts/install.py +155 -188
  37. package/scripts/integration.py +54 -28
  38. package/scripts/isolation.py +24 -6
  39. package/scripts/jev_review.py +138 -0
  40. package/scripts/lean_verification.py +3 -1
  41. package/scripts/loop_run.py +2 -0
  42. package/scripts/model_policy.py +279 -0
  43. package/scripts/path_config.py +248 -0
  44. package/scripts/pipeline_diagnose.py +15 -3
  45. package/scripts/pipeline_git.py +3 -0
  46. package/scripts/pipeline_state.py +117 -186
  47. package/scripts/pipeline_undo.py +14 -7
  48. package/scripts/promote_lookahead.py +33 -162
  49. package/scripts/review_panel.py +11 -0
  50. package/scripts/roadmap.py +326 -0
  51. package/scripts/runtime_store.py +278 -0
  52. package/scripts/skill-resources.json +182 -4
  53. package/scripts/state_checkpoint.py +114 -72
  54. package/scripts/state_promote.py +47 -44
  55. package/scripts/status_runtime.py +92 -6
  56. package/scripts/task_context.py +73 -0
  57. package/scripts/token_budget.py +40 -1
  58. package/scripts/workflow_run.py +128 -8
  59. package/scripts/worktree_paths.py +94 -0
  60. package/skills/gsd-path/BUILD.md +54 -575
  61. package/skills/gsd-path/DECIDE.md +4 -6
  62. package/skills/gsd-path/DEFINE.md +23 -21
  63. package/skills/gsd-path/DOCS-AUDIT.md +2 -0
  64. package/skills/gsd-path/INSPECT.md +32 -8
  65. package/skills/gsd-path/PLAN.md +29 -19
  66. package/skills/gsd-path/RESEARCH.md +5 -6
  67. package/skills/gsd-path/ROADMAP.md +24 -58
  68. package/skills/gsd-path/SHIP.md +29 -17
  69. package/skills/gsd-path/SKILL.md +46 -22
  70. package/skills/gsd-path/references/build-abandon.md +33 -0
  71. package/skills/gsd-path/references/build-native.md +502 -0
  72. package/skills/gsd-path/references/build-recovery.md +78 -0
  73. package/skills/gsd-path/references/coder.md +8 -3
  74. package/skills/gsd-path/references/config.md +57 -0
  75. package/skills/gsd-path/references/dispatch.md +12 -19
  76. package/skills/gsd-path/references/docs-auditor.md +14 -0
  77. package/skills/gsd-path/references/jev-review.md +82 -0
  78. package/skills/gsd-path/references/model-policy.md +139 -0
  79. package/skills/gsd-path/references/reviewer-final.md +21 -0
  80. package/skills/gsd-path/references/reviewer-panel.md +17 -0
  81. package/skills/gsd-path/references/reviewer-skeptic.md +20 -0
  82. package/skills/gsd-path/references/reviewer-wave.md +89 -0
  83. package/skills/gsd-path/references/reviewer.md +12 -148
  84. package/skills/gsd-path/references/runtime-selection.md +25 -0
  85. package/skills/gsd-path/scripts/__pycache__/_common.cpython-312.pyc +0 -0
  86. package/skills/gsd-path/scripts/__pycache__/check_handoffs.cpython-312.pyc +0 -0
  87. package/skills/gsd-path/scripts/_common.py +5 -0
  88. package/skills/gsd-path/scripts/archive_milestone.py +30 -124
  89. package/skills/gsd-path/scripts/bootstrap_repository.py +33 -4
  90. package/skills/gsd-path/scripts/build_recovery.py +292 -0
  91. package/skills/gsd-path/scripts/build_state.py +2 -0
  92. package/skills/gsd-path/scripts/check_docs_audit.py +7 -3
  93. package/skills/gsd-path/scripts/check_handoffs.py +7 -1
  94. package/skills/gsd-path/scripts/check_task_briefs.py +3 -0
  95. package/skills/gsd-path/scripts/detect_project.py +22 -3
  96. package/skills/gsd-path/scripts/discussion_records.py +3 -0
  97. package/skills/gsd-path/scripts/discussion_validate.py +8 -3
  98. package/skills/gsd-path/scripts/dispatch_driver.py +233 -22
  99. package/skills/gsd-path/scripts/git_guard.py +768 -0
  100. package/skills/gsd-path/scripts/integration.py +54 -28
  101. package/skills/gsd-path/scripts/isolation.py +24 -6
  102. package/skills/gsd-path/scripts/jev_review.py +138 -0
  103. package/skills/gsd-path/scripts/lean_verification.py +3 -1
  104. package/skills/gsd-path/scripts/loop_run.py +2 -0
  105. package/skills/gsd-path/scripts/model_policy.py +279 -0
  106. package/skills/gsd-path/scripts/path_config.py +248 -0
  107. package/skills/gsd-path/scripts/pipeline_git.py +3 -0
  108. package/skills/gsd-path/scripts/pipeline_state.py +117 -186
  109. package/skills/gsd-path/scripts/promote_lookahead.py +33 -162
  110. package/skills/gsd-path/scripts/review_panel.py +11 -0
  111. package/skills/gsd-path/scripts/roadmap.py +326 -0
  112. package/skills/gsd-path/scripts/state_checkpoint.py +114 -72
  113. package/skills/gsd-path/scripts/state_promote.py +47 -44
  114. package/skills/gsd-path/scripts/status_runtime.py +208 -0
  115. package/skills/gsd-path/scripts/task_context.py +73 -0
  116. package/skills/gsd-path/scripts/token_budget.py +40 -1
  117. package/skills/gsd-path/scripts/workflow_run.py +128 -8
  118. package/skills/gsd-path/scripts/worktree_paths.py +94 -0
  119. package/skills/gsd-path/templates/skeptic.md +1 -1
  120. package/skills/gsd-path/templates/task.md +2 -0
  121. package/skills/gsd-path/templates/wave-panel.md +1 -1
  122. package/skills/gsd-path/templates/wave-review.md +1 -1
  123. package/skills/gsd-path-build/SKILL.md +54 -575
  124. package/skills/gsd-path-build/references/build-abandon.md +33 -0
  125. package/skills/gsd-path-build/references/build-native.md +502 -0
  126. package/skills/gsd-path-build/references/build-recovery.md +78 -0
  127. package/skills/gsd-path-build/references/coder.md +8 -3
  128. package/skills/gsd-path-build/references/dispatch.md +12 -19
  129. package/skills/gsd-path-build/references/jev-review.md +82 -0
  130. package/skills/gsd-path-build/references/model-policy.md +139 -0
  131. package/skills/gsd-path-build/references/reviewer-final.md +21 -0
  132. package/skills/gsd-path-build/references/reviewer-panel.md +17 -0
  133. package/skills/gsd-path-build/references/reviewer-skeptic.md +20 -0
  134. package/skills/gsd-path-build/references/reviewer-wave.md +89 -0
  135. package/skills/gsd-path-build/references/reviewer.md +12 -148
  136. package/skills/gsd-path-build/references/runtime-selection.md +25 -0
  137. package/skills/gsd-path-build/scripts/__pycache__/_common.cpython-312.pyc +0 -0
  138. package/skills/gsd-path-build/scripts/__pycache__/check_handoffs.cpython-312.pyc +0 -0
  139. package/skills/gsd-path-build/scripts/_common.py +5 -0
  140. package/skills/gsd-path-build/scripts/archive_milestone.py +30 -124
  141. package/skills/gsd-path-build/scripts/build_recovery.py +292 -0
  142. package/skills/gsd-path-build/scripts/build_state.py +2 -0
  143. package/skills/gsd-path-build/scripts/check_handoffs.py +7 -1
  144. package/skills/gsd-path-build/scripts/check_task_briefs.py +3 -0
  145. package/skills/gsd-path-build/scripts/detect_project.py +1536 -0
  146. package/skills/gsd-path-build/scripts/discussion_records.py +3 -0
  147. package/skills/gsd-path-build/scripts/discussion_validate.py +8 -3
  148. package/skills/gsd-path-build/scripts/dispatch_driver.py +233 -22
  149. package/skills/gsd-path-build/scripts/integration.py +54 -28
  150. package/skills/gsd-path-build/scripts/isolation.py +24 -6
  151. package/skills/gsd-path-build/scripts/jev_review.py +138 -0
  152. package/skills/gsd-path-build/scripts/loop_run.py +2 -0
  153. package/skills/gsd-path-build/scripts/model_policy.py +279 -0
  154. package/skills/gsd-path-build/scripts/path_config.py +248 -0
  155. package/skills/gsd-path-build/scripts/pipeline_git.py +3 -0
  156. package/skills/gsd-path-build/scripts/pipeline_state.py +117 -186
  157. package/skills/gsd-path-build/scripts/promote_lookahead.py +286 -0
  158. package/skills/gsd-path-build/scripts/review_panel.py +11 -0
  159. package/skills/gsd-path-build/scripts/roadmap.py +326 -0
  160. package/skills/gsd-path-build/scripts/state_checkpoint.py +114 -72
  161. package/skills/gsd-path-build/scripts/state_promote.py +47 -44
  162. package/skills/gsd-path-build/scripts/task_context.py +73 -0
  163. package/skills/gsd-path-build/scripts/token_budget.py +40 -1
  164. package/skills/gsd-path-build/scripts/workflow_run.py +128 -8
  165. package/skills/gsd-path-build/scripts/worktree_paths.py +94 -0
  166. package/skills/gsd-path-build/templates/skeptic.md +1 -1
  167. package/skills/gsd-path-build/templates/task.md +2 -0
  168. package/skills/gsd-path-build/templates/wave-panel.md +1 -1
  169. package/skills/gsd-path-build/templates/wave-review.md +1 -1
  170. package/skills/gsd-path-decide/SKILL.md +4 -6
  171. package/skills/gsd-path-decide/references/dispatch.md +12 -19
  172. package/skills/gsd-path-decide/references/model-policy.md +139 -0
  173. package/skills/gsd-path-decide/references/runtime-selection.md +25 -0
  174. package/skills/gsd-path-decide/scripts/_common.py +5 -0
  175. package/skills/gsd-path-decide/scripts/archive_milestone.py +2171 -0
  176. package/skills/gsd-path-decide/scripts/build_recovery.py +292 -0
  177. package/skills/gsd-path-decide/scripts/check_handoffs.py +7 -1
  178. package/skills/gsd-path-decide/scripts/check_task_briefs.py +3 -0
  179. package/skills/gsd-path-decide/scripts/detect_project.py +1536 -0
  180. package/skills/gsd-path-decide/scripts/discussion_records.py +3 -0
  181. package/skills/gsd-path-decide/scripts/discussion_validate.py +1326 -0
  182. package/skills/gsd-path-decide/scripts/integration.py +1459 -0
  183. package/skills/gsd-path-decide/scripts/isolation.py +24 -6
  184. package/skills/gsd-path-decide/scripts/loop_run.py +839 -0
  185. package/skills/gsd-path-decide/scripts/model_policy.py +279 -0
  186. package/skills/gsd-path-decide/scripts/path_config.py +248 -0
  187. package/skills/gsd-path-decide/scripts/pipeline_git.py +3 -0
  188. package/skills/gsd-path-decide/scripts/pipeline_state.py +117 -186
  189. package/skills/gsd-path-decide/scripts/promote_lookahead.py +286 -0
  190. package/skills/gsd-path-decide/scripts/review_panel.py +564 -0
  191. package/skills/gsd-path-decide/scripts/roadmap.py +326 -0
  192. package/skills/gsd-path-decide/scripts/state_checkpoint.py +114 -72
  193. package/skills/gsd-path-decide/scripts/state_promote.py +47 -44
  194. package/skills/gsd-path-decide/scripts/worktree_paths.py +94 -0
  195. package/skills/gsd-path-define/SKILL.md +23 -21
  196. package/skills/gsd-path-define/references/build-recovery.md +78 -0
  197. package/skills/gsd-path-define/references/runtime-selection.md +25 -0
  198. package/skills/gsd-path-define/scripts/_common.py +5 -0
  199. package/skills/gsd-path-define/scripts/archive_milestone.py +2171 -0
  200. package/skills/gsd-path-define/scripts/build_recovery.py +292 -0
  201. package/skills/gsd-path-define/scripts/check_handoffs.py +7 -1
  202. package/skills/gsd-path-define/scripts/check_task_briefs.py +3 -0
  203. package/skills/gsd-path-define/scripts/detect_project.py +22 -3
  204. package/skills/gsd-path-define/scripts/discussion_records.py +3 -0
  205. package/skills/gsd-path-define/scripts/discussion_validate.py +1326 -0
  206. package/skills/gsd-path-define/scripts/integration.py +1459 -0
  207. package/skills/gsd-path-define/scripts/isolation.py +24 -6
  208. package/skills/gsd-path-define/scripts/loop_run.py +839 -0
  209. package/skills/gsd-path-define/scripts/model_policy.py +279 -0
  210. package/skills/gsd-path-define/scripts/path_config.py +248 -0
  211. package/skills/gsd-path-define/scripts/pipeline_git.py +3 -0
  212. package/skills/gsd-path-define/scripts/pipeline_state.py +117 -186
  213. package/skills/gsd-path-define/scripts/promote_lookahead.py +286 -0
  214. package/skills/gsd-path-define/scripts/review_panel.py +564 -0
  215. package/skills/gsd-path-define/scripts/roadmap.py +326 -0
  216. package/skills/gsd-path-define/scripts/state_checkpoint.py +114 -72
  217. package/skills/gsd-path-define/scripts/state_promote.py +47 -44
  218. package/skills/gsd-path-define/scripts/worktree_paths.py +94 -0
  219. package/skills/gsd-path-discuss/SKILL.md +2 -0
  220. package/skills/gsd-path-discuss/references/runtime-selection.md +25 -0
  221. package/skills/gsd-path-discuss/scripts/_common.py +5 -0
  222. package/skills/gsd-path-discuss/scripts/discussion_records.py +3 -0
  223. package/skills/gsd-path-discuss/scripts/loop_run.py +839 -0
  224. package/skills/gsd-path-discuss/scripts/model_policy.py +279 -0
  225. package/skills/gsd-path-discuss/scripts/path_config.py +248 -0
  226. package/skills/gsd-path-discuss/scripts/review_panel.py +564 -0
  227. package/skills/gsd-path-discuss/scripts/worktree_paths.py +94 -0
  228. package/skills/gsd-path-docs-audit/SKILL.md +2 -0
  229. package/skills/gsd-path-docs-audit/references/dispatch.md +12 -19
  230. package/skills/gsd-path-docs-audit/references/docs-auditor.md +14 -0
  231. package/skills/gsd-path-docs-audit/references/model-policy.md +139 -0
  232. package/skills/gsd-path-docs-audit/references/runtime-selection.md +25 -0
  233. package/skills/gsd-path-docs-audit/scripts/_common.py +5 -0
  234. package/skills/gsd-path-docs-audit/scripts/archive_milestone.py +2171 -0
  235. package/skills/gsd-path-docs-audit/scripts/build_recovery.py +292 -0
  236. package/skills/gsd-path-docs-audit/scripts/check_docs_audit.py +7 -3
  237. package/skills/gsd-path-docs-audit/scripts/check_handoffs.py +7 -1
  238. package/skills/gsd-path-docs-audit/scripts/check_task_briefs.py +3 -0
  239. package/skills/gsd-path-docs-audit/scripts/detect_project.py +1536 -0
  240. package/skills/gsd-path-docs-audit/scripts/discussion_records.py +3 -0
  241. package/skills/gsd-path-docs-audit/scripts/discussion_validate.py +1326 -0
  242. package/skills/gsd-path-docs-audit/scripts/integration.py +1459 -0
  243. package/skills/gsd-path-docs-audit/scripts/isolation.py +24 -6
  244. package/skills/gsd-path-docs-audit/scripts/loop_run.py +839 -0
  245. package/skills/gsd-path-docs-audit/scripts/model_policy.py +279 -0
  246. package/skills/gsd-path-docs-audit/scripts/path_config.py +248 -0
  247. package/skills/gsd-path-docs-audit/scripts/pipeline_git.py +3 -0
  248. package/skills/gsd-path-docs-audit/scripts/pipeline_state.py +117 -186
  249. package/skills/gsd-path-docs-audit/scripts/promote_lookahead.py +286 -0
  250. package/skills/gsd-path-docs-audit/scripts/review_panel.py +564 -0
  251. package/skills/gsd-path-docs-audit/scripts/roadmap.py +326 -0
  252. package/skills/gsd-path-docs-audit/scripts/state_checkpoint.py +114 -72
  253. package/skills/gsd-path-docs-audit/scripts/state_promote.py +47 -44
  254. package/skills/gsd-path-docs-audit/scripts/worktree_paths.py +94 -0
  255. package/skills/gsd-path-forensics/SKILL.md +9 -5
  256. package/skills/gsd-path-forensics/references/runtime-selection.md +25 -0
  257. package/skills/gsd-path-forensics/scripts/_common.py +5 -0
  258. package/skills/gsd-path-forensics/scripts/discussion_records.py +3 -0
  259. package/skills/gsd-path-forensics/scripts/loop_run.py +839 -0
  260. package/skills/gsd-path-forensics/scripts/model_policy.py +279 -0
  261. package/skills/gsd-path-forensics/scripts/path_config.py +248 -0
  262. package/skills/gsd-path-forensics/scripts/pipeline_diagnose.py +15 -3
  263. package/skills/gsd-path-forensics/scripts/pipeline_undo.py +14 -7
  264. package/skills/gsd-path-forensics/scripts/review_panel.py +564 -0
  265. package/skills/gsd-path-forensics/scripts/worktree_paths.py +94 -0
  266. package/skills/gsd-path-inspect/SKILL.md +32 -8
  267. package/skills/gsd-path-inspect/references/dispatch.md +12 -19
  268. package/skills/gsd-path-inspect/references/docs-auditor.md +14 -0
  269. package/skills/gsd-path-inspect/references/model-policy.md +139 -0
  270. package/skills/gsd-path-inspect/references/runtime-selection.md +25 -0
  271. package/skills/gsd-path-inspect/scripts/__pycache__/_common.cpython-312.pyc +0 -0
  272. package/skills/gsd-path-inspect/scripts/_common.py +5 -0
  273. package/skills/gsd-path-inspect/scripts/archive_milestone.py +2171 -0
  274. package/skills/gsd-path-inspect/scripts/build_recovery.py +292 -0
  275. package/skills/gsd-path-inspect/scripts/check_docs_audit.py +7 -3
  276. package/skills/gsd-path-inspect/scripts/check_handoffs.py +7 -1
  277. package/skills/gsd-path-inspect/scripts/check_task_briefs.py +3 -0
  278. package/skills/gsd-path-inspect/scripts/detect_project.py +22 -3
  279. package/skills/gsd-path-inspect/scripts/discussion_records.py +3 -0
  280. package/skills/gsd-path-inspect/scripts/discussion_validate.py +1326 -0
  281. package/skills/gsd-path-inspect/scripts/integration.py +1459 -0
  282. package/skills/gsd-path-inspect/scripts/isolation.py +24 -6
  283. package/skills/gsd-path-inspect/scripts/loop_run.py +839 -0
  284. package/skills/gsd-path-inspect/scripts/model_policy.py +279 -0
  285. package/skills/gsd-path-inspect/scripts/path_config.py +248 -0
  286. package/skills/gsd-path-inspect/scripts/pipeline_git.py +3 -0
  287. package/skills/gsd-path-inspect/scripts/pipeline_state.py +117 -186
  288. package/skills/gsd-path-inspect/scripts/promote_lookahead.py +286 -0
  289. package/skills/gsd-path-inspect/scripts/review_panel.py +564 -0
  290. package/skills/gsd-path-inspect/scripts/roadmap.py +326 -0
  291. package/skills/gsd-path-inspect/scripts/state_checkpoint.py +114 -72
  292. package/skills/gsd-path-inspect/scripts/state_promote.py +47 -44
  293. package/skills/gsd-path-inspect/scripts/workflow_run.py +237 -0
  294. package/skills/gsd-path-inspect/scripts/worktree_paths.py +94 -0
  295. package/skills/gsd-path-loop/SKILL.md +2 -0
  296. package/skills/gsd-path-loop/references/runtime-selection.md +25 -0
  297. package/skills/gsd-path-loop/scripts/_common.py +5 -0
  298. package/skills/gsd-path-loop/scripts/discussion_records.py +3 -0
  299. package/skills/gsd-path-loop/scripts/loop_run.py +2 -0
  300. package/skills/gsd-path-loop/scripts/model_policy.py +279 -0
  301. package/skills/gsd-path-loop/scripts/path_config.py +248 -0
  302. package/skills/gsd-path-loop/scripts/review_panel.py +564 -0
  303. package/skills/gsd-path-loop/scripts/worktree_paths.py +94 -0
  304. package/skills/gsd-path-migrate/SKILL.md +2 -0
  305. package/skills/gsd-path-migrate/references/runtime-selection.md +25 -0
  306. package/skills/gsd-path-migrate/scripts/_common.py +185 -0
  307. package/skills/gsd-path-migrate/scripts/discussion_records.py +3 -0
  308. package/skills/gsd-path-migrate/scripts/loop_run.py +839 -0
  309. package/skills/gsd-path-migrate/scripts/model_policy.py +279 -0
  310. package/skills/gsd-path-migrate/scripts/path_config.py +248 -0
  311. package/skills/gsd-path-migrate/scripts/review_panel.py +564 -0
  312. package/skills/gsd-path-plan/SKILL.md +29 -19
  313. package/skills/gsd-path-plan/references/build-recovery.md +78 -0
  314. package/skills/gsd-path-plan/references/dispatch.md +12 -19
  315. package/skills/gsd-path-plan/references/model-policy.md +139 -0
  316. package/skills/gsd-path-plan/references/runtime-selection.md +25 -0
  317. package/skills/gsd-path-plan/scripts/__pycache__/_common.cpython-312.pyc +0 -0
  318. package/skills/gsd-path-plan/scripts/_common.py +5 -0
  319. package/skills/gsd-path-plan/scripts/archive_milestone.py +2171 -0
  320. package/skills/gsd-path-plan/scripts/build_recovery.py +292 -0
  321. package/skills/gsd-path-plan/scripts/check_handoffs.py +7 -1
  322. package/skills/gsd-path-plan/scripts/check_task_briefs.py +3 -0
  323. package/skills/gsd-path-plan/scripts/detect_project.py +1536 -0
  324. package/skills/gsd-path-plan/scripts/discussion_records.py +3 -0
  325. package/skills/gsd-path-plan/scripts/discussion_validate.py +1326 -0
  326. package/skills/gsd-path-plan/scripts/integration.py +1459 -0
  327. package/skills/gsd-path-plan/scripts/isolation.py +24 -6
  328. package/skills/gsd-path-plan/scripts/loop_run.py +839 -0
  329. package/skills/gsd-path-plan/scripts/model_policy.py +279 -0
  330. package/skills/gsd-path-plan/scripts/path_config.py +248 -0
  331. package/skills/gsd-path-plan/scripts/pipeline_git.py +3 -0
  332. package/skills/gsd-path-plan/scripts/pipeline_state.py +117 -186
  333. package/skills/gsd-path-plan/scripts/promote_lookahead.py +286 -0
  334. package/skills/gsd-path-plan/scripts/review_panel.py +11 -0
  335. package/skills/gsd-path-plan/scripts/roadmap.py +326 -0
  336. package/skills/gsd-path-plan/scripts/state_checkpoint.py +114 -72
  337. package/skills/gsd-path-plan/scripts/state_promote.py +47 -44
  338. package/skills/gsd-path-plan/scripts/workflow_run.py +128 -8
  339. package/skills/gsd-path-plan/scripts/worktree_paths.py +94 -0
  340. package/skills/gsd-path-plan/templates/task.md +2 -0
  341. package/skills/gsd-path-research/SKILL.md +5 -6
  342. package/skills/gsd-path-research/references/dispatch.md +12 -19
  343. package/skills/gsd-path-research/references/model-policy.md +139 -0
  344. package/skills/gsd-path-research/references/runtime-selection.md +25 -0
  345. package/skills/gsd-path-research/scripts/_common.py +5 -0
  346. package/skills/gsd-path-research/scripts/archive_milestone.py +2171 -0
  347. package/skills/gsd-path-research/scripts/build_recovery.py +292 -0
  348. package/skills/gsd-path-research/scripts/check_handoffs.py +7 -1
  349. package/skills/gsd-path-research/scripts/check_task_briefs.py +3 -0
  350. package/skills/gsd-path-research/scripts/detect_project.py +1536 -0
  351. package/skills/gsd-path-research/scripts/discussion_records.py +3 -0
  352. package/skills/gsd-path-research/scripts/discussion_validate.py +1326 -0
  353. package/skills/gsd-path-research/scripts/integration.py +1459 -0
  354. package/skills/gsd-path-research/scripts/isolation.py +24 -6
  355. package/skills/gsd-path-research/scripts/loop_run.py +839 -0
  356. package/skills/gsd-path-research/scripts/model_policy.py +279 -0
  357. package/skills/gsd-path-research/scripts/path_config.py +248 -0
  358. package/skills/gsd-path-research/scripts/pipeline_git.py +3 -0
  359. package/skills/gsd-path-research/scripts/pipeline_state.py +117 -186
  360. package/skills/gsd-path-research/scripts/promote_lookahead.py +286 -0
  361. package/skills/gsd-path-research/scripts/review_panel.py +564 -0
  362. package/skills/gsd-path-research/scripts/roadmap.py +326 -0
  363. package/skills/gsd-path-research/scripts/state_checkpoint.py +114 -72
  364. package/skills/gsd-path-research/scripts/state_promote.py +47 -44
  365. package/skills/gsd-path-research/scripts/worktree_paths.py +94 -0
  366. package/skills/gsd-path-roadmap/SKILL.md +24 -58
  367. package/skills/gsd-path-roadmap/references/dispatch.md +12 -19
  368. package/skills/gsd-path-roadmap/references/model-policy.md +139 -0
  369. package/skills/gsd-path-roadmap/references/runtime-selection.md +25 -0
  370. package/skills/gsd-path-roadmap/scripts/_common.py +5 -0
  371. package/skills/gsd-path-roadmap/scripts/archive_milestone.py +30 -124
  372. package/skills/gsd-path-roadmap/scripts/build_recovery.py +292 -0
  373. package/skills/gsd-path-roadmap/scripts/check_handoffs.py +7 -1
  374. package/skills/gsd-path-roadmap/scripts/check_task_briefs.py +3 -0
  375. package/skills/gsd-path-roadmap/scripts/detect_project.py +22 -3
  376. package/skills/gsd-path-roadmap/scripts/discussion_records.py +3 -0
  377. package/skills/gsd-path-roadmap/scripts/discussion_validate.py +8 -3
  378. package/skills/gsd-path-roadmap/scripts/integration.py +54 -28
  379. package/skills/gsd-path-roadmap/scripts/isolation.py +24 -6
  380. package/skills/gsd-path-roadmap/scripts/loop_run.py +839 -0
  381. package/skills/gsd-path-roadmap/scripts/model_policy.py +279 -0
  382. package/skills/gsd-path-roadmap/scripts/path_config.py +248 -0
  383. package/skills/gsd-path-roadmap/scripts/pipeline_git.py +3 -0
  384. package/skills/gsd-path-roadmap/scripts/pipeline_state.py +117 -186
  385. package/skills/gsd-path-roadmap/scripts/promote_lookahead.py +33 -162
  386. package/skills/gsd-path-roadmap/scripts/review_panel.py +11 -0
  387. package/skills/gsd-path-roadmap/scripts/roadmap.py +326 -0
  388. package/skills/gsd-path-roadmap/scripts/state_checkpoint.py +114 -72
  389. package/skills/gsd-path-roadmap/scripts/state_promote.py +47 -44
  390. package/skills/gsd-path-roadmap/scripts/worktree_paths.py +94 -0
  391. package/skills/gsd-path-ship/SKILL.md +29 -17
  392. package/skills/gsd-path-ship/references/dispatch.md +12 -19
  393. package/skills/gsd-path-ship/references/jev-review.md +82 -0
  394. package/skills/gsd-path-ship/references/model-policy.md +139 -0
  395. package/skills/gsd-path-ship/references/reviewer-final.md +21 -0
  396. package/skills/gsd-path-ship/references/reviewer-panel.md +17 -0
  397. package/skills/gsd-path-ship/references/reviewer-skeptic.md +20 -0
  398. package/skills/gsd-path-ship/references/reviewer-wave.md +89 -0
  399. package/skills/gsd-path-ship/references/reviewer.md +12 -148
  400. package/skills/gsd-path-ship/references/runtime-selection.md +25 -0
  401. package/skills/gsd-path-ship/scripts/__pycache__/_common.cpython-312.pyc +0 -0
  402. package/skills/gsd-path-ship/scripts/_common.py +5 -0
  403. package/skills/gsd-path-ship/scripts/archive_milestone.py +30 -124
  404. package/skills/gsd-path-ship/scripts/build_recovery.py +292 -0
  405. package/skills/gsd-path-ship/scripts/build_state.py +2 -0
  406. package/skills/gsd-path-ship/scripts/check_handoffs.py +7 -1
  407. package/skills/gsd-path-ship/scripts/check_task_briefs.py +3 -0
  408. package/skills/gsd-path-ship/scripts/detect_project.py +1536 -0
  409. package/skills/gsd-path-ship/scripts/discussion_records.py +3 -0
  410. package/skills/gsd-path-ship/scripts/discussion_validate.py +8 -3
  411. package/skills/gsd-path-ship/scripts/integration.py +54 -28
  412. package/skills/gsd-path-ship/scripts/isolation.py +24 -6
  413. package/skills/gsd-path-ship/scripts/jev_review.py +138 -0
  414. package/skills/gsd-path-ship/scripts/lean_verification.py +3 -1
  415. package/skills/gsd-path-ship/scripts/loop_run.py +839 -0
  416. package/skills/gsd-path-ship/scripts/model_policy.py +279 -0
  417. package/skills/gsd-path-ship/scripts/path_config.py +248 -0
  418. package/skills/gsd-path-ship/scripts/pipeline_git.py +3 -0
  419. package/skills/gsd-path-ship/scripts/pipeline_state.py +117 -186
  420. package/skills/gsd-path-ship/scripts/promote_lookahead.py +286 -0
  421. package/skills/gsd-path-ship/scripts/review_panel.py +11 -0
  422. package/skills/gsd-path-ship/scripts/roadmap.py +326 -0
  423. package/skills/gsd-path-ship/scripts/state_checkpoint.py +114 -72
  424. package/skills/gsd-path-ship/scripts/state_promote.py +47 -44
  425. package/skills/gsd-path-ship/scripts/workflow_run.py +128 -8
  426. package/skills/gsd-path-ship/scripts/worktree_paths.py +94 -0
  427. package/skills/gsd-path-ship/templates/wave-review.md +1 -1
  428. package/skills/gsd-path-undo/SKILL.md +2 -0
  429. package/skills/gsd-path-undo/references/runtime-selection.md +25 -0
  430. package/skills/gsd-path-undo/scripts/_common.py +5 -0
  431. package/skills/gsd-path-undo/scripts/discussion_records.py +3 -0
  432. package/skills/gsd-path-undo/scripts/loop_run.py +839 -0
  433. package/skills/gsd-path-undo/scripts/model_policy.py +279 -0
  434. package/skills/gsd-path-undo/scripts/path_config.py +248 -0
  435. package/skills/gsd-path-undo/scripts/pipeline_undo.py +14 -7
  436. package/skills/gsd-path-undo/scripts/review_panel.py +564 -0
  437. package/skills/gsd-path-undo/scripts/worktree_paths.py +94 -0
  438. package/skills/path/BUILD.md +54 -575
  439. package/skills/path/DECIDE.md +4 -6
  440. package/skills/path/DEFINE.md +23 -21
  441. package/skills/path/DOCS-AUDIT.md +2 -0
  442. package/skills/path/INSPECT.md +32 -8
  443. package/skills/path/PLAN.md +29 -19
  444. package/skills/path/RESEARCH.md +5 -6
  445. package/skills/path/ROADMAP.md +24 -58
  446. package/skills/path/SHIP.md +29 -17
  447. package/skills/path/SKILL.md +46 -22
  448. package/skills/path/references/build-abandon.md +33 -0
  449. package/skills/path/references/build-native.md +502 -0
  450. package/skills/path/references/build-recovery.md +78 -0
  451. package/skills/path/references/coder.md +8 -3
  452. package/skills/path/references/config.md +57 -0
  453. package/skills/path/references/dispatch.md +12 -19
  454. package/skills/path/references/docs-auditor.md +14 -0
  455. package/skills/path/references/jev-review.md +82 -0
  456. package/skills/path/references/model-policy.md +139 -0
  457. package/skills/path/references/reviewer-final.md +21 -0
  458. package/skills/path/references/reviewer-panel.md +17 -0
  459. package/skills/path/references/reviewer-skeptic.md +20 -0
  460. package/skills/path/references/reviewer-wave.md +89 -0
  461. package/skills/path/references/reviewer.md +12 -148
  462. package/skills/path/references/runtime-selection.md +25 -0
  463. package/skills/path/scripts/_common.py +5 -0
  464. package/skills/path/scripts/archive_milestone.py +30 -124
  465. package/skills/path/scripts/bootstrap_repository.py +33 -4
  466. package/skills/path/scripts/build_recovery.py +292 -0
  467. package/skills/path/scripts/build_state.py +2 -0
  468. package/skills/path/scripts/check_docs_audit.py +7 -3
  469. package/skills/path/scripts/check_handoffs.py +7 -1
  470. package/skills/path/scripts/check_task_briefs.py +3 -0
  471. package/skills/path/scripts/detect_project.py +22 -3
  472. package/skills/path/scripts/discussion_records.py +3 -0
  473. package/skills/path/scripts/discussion_validate.py +8 -3
  474. package/skills/path/scripts/dispatch_driver.py +233 -22
  475. package/skills/path/scripts/git_guard.py +768 -0
  476. package/skills/path/scripts/integration.py +54 -28
  477. package/skills/path/scripts/isolation.py +24 -6
  478. package/skills/path/scripts/jev_review.py +138 -0
  479. package/skills/path/scripts/lean_verification.py +3 -1
  480. package/skills/path/scripts/loop_run.py +2 -0
  481. package/skills/path/scripts/model_policy.py +279 -0
  482. package/skills/path/scripts/path_config.py +248 -0
  483. package/skills/path/scripts/pipeline_git.py +3 -0
  484. package/skills/path/scripts/pipeline_state.py +117 -186
  485. package/skills/path/scripts/promote_lookahead.py +33 -162
  486. package/skills/path/scripts/review_panel.py +11 -0
  487. package/skills/path/scripts/roadmap.py +326 -0
  488. package/skills/path/scripts/state_checkpoint.py +114 -72
  489. package/skills/path/scripts/state_promote.py +47 -44
  490. package/skills/path/scripts/status_runtime.py +208 -0
  491. package/skills/path/scripts/task_context.py +73 -0
  492. package/skills/path/scripts/token_budget.py +40 -1
  493. package/skills/path/scripts/workflow_run.py +128 -8
  494. package/skills/path/scripts/worktree_paths.py +94 -0
  495. package/skills/path/templates/skeptic.md +1 -1
  496. package/skills/path/templates/task.md +2 -0
  497. package/skills/path/templates/wave-panel.md +1 -1
  498. package/skills/path/templates/wave-review.md +1 -1
@@ -26,10 +26,10 @@ Apply this contract whenever a GSD Path skill delegates work:
26
26
  never create a colliding logical target.
27
27
  - Resolve the phase's linked role brief to an absolute path. Include that path
28
28
  in the prompt and require the child to read it before acting.
29
- - Tier hints: when the host advertises model or reasoning-effort selection,
30
- request `heavy` for `plan`, `plan_patch`, `decide`, and `roadmap`, and
31
- `light` for `inspect_docs` and `docs_audit`; when it offers no such
32
- selection, do not override the model except on a review-panel child, which receives the exact slug from `scripts/review_panel.py resolve`. Do not ask Copilot to create another
29
+ - Model selection: before every child launch or continuation, follow
30
+ [the model-policy contract](model-policy.md) and apply its recorded
31
+ native arguments. It owns defaults, project settings, task overrides,
32
+ capability failures, and reassignment. Do not ask Copilot to create another
33
33
  worktree: GSD Path supplies the exact repository or linked-worktree root,
34
34
  and the child must work only there. Host isolation: none.
35
35
  - Give every child a self-contained prompt with absolute input, template, and
@@ -3,7 +3,7 @@
3
3
  Apply this contract whenever a GSD Path skill delegates work:
4
4
 
5
5
  - Use Cursor's `Task` tool with the installed custom `gsd-path` subagent. Its
6
- model is `inherit` and it has full tool access; the linked role brief supplies
6
+ model inherits unless the model-policy helper selects an override; it has full tool access; the linked role brief supplies
7
7
  the read-only boundary for auditors and reviewers.
8
8
  - Supply the deterministic logical task name as the task description:
9
9
  `inspect_codebase`, `inspect_docs`, `docs_audit`,
@@ -25,15 +25,10 @@ Apply this contract whenever a GSD Path skill delegates work:
25
25
  brief. If the prior child is still running, wait; never collide targets.
26
26
  - Resolve the phase's linked role brief to an absolute path. Include that path
27
27
  in the prompt and require the child to read it before acting.
28
- - Tier hints: when the host advertises model or reasoning-effort selection,
29
- request `heavy` for `plan`, `plan_patch`, `decide`, and `roadmap`, and
30
- `light` for `inspect_docs` and `docs_audit`; when it offers no such
31
- selection, do not override the model. The only exception is a review-panel
32
- child: pass the exact slug returned by `scripts/review_panel.py resolve`
33
- for that family. Never override the model on the canonical reviewer,
34
- planner, or coder. Set the task working directory to the
35
- exact repository or linked-worktree root supplied by GSD Path; do not ask
36
- Cursor or the child to create another worktree. Host isolation: none.
28
+ - Model selection: before every child launch or continuation, follow
29
+ [the model-policy contract](model-policy.md) and apply its recorded
30
+ native arguments. It owns defaults, project settings, task overrides,
31
+ capability failures, and reassignment. Host isolation: none. Use the exact GSD Path supplied root; create no extra checkout.
37
32
  - Give every child a self-contained prompt with absolute input, template, and
38
33
  output paths plus its bounded responsibility. A coder prompt also names its
39
34
  isolated linked-worktree root; no child may infer the primary worktree.
@@ -26,12 +26,10 @@ Apply this contract whenever a GSD Path skill delegates work:
26
26
  it; never create a colliding logical target.
27
27
  - Resolve the phase's linked role brief to an absolute path. Include that path
28
28
  in the prompt and require the subagent to read it before acting.
29
- - Tier hints: when the host advertises model or reasoning-effort selection,
30
- request `heavy` for `plan`, `plan_patch`, `decide`, and `roadmap`, and
31
- `light` for `inspect_docs` and `docs_audit`; when it offers no such
32
- selection, do not override the model except on a review-panel child, which receives the exact slug from `scripts/review_panel.py resolve`. Set `cwd` to the exact root supplied
33
- by GSD Path and use `isolation: none`; the pipeline already owns any
34
- required linked worktree. Host isolation: none.
29
+ - Model selection: before every child launch or continuation, follow
30
+ [the model-policy contract](model-policy.md) and apply its recorded
31
+ native arguments. It owns defaults, project settings, task overrides,
32
+ capability failures, and reassignment. Host isolation: none. Use the exact GSD Path supplied root; create no extra checkout.
35
33
  - Give every subagent a self-contained prompt with absolute input, template,
36
34
  and output paths plus its bounded responsibility. A coder prompt also names
37
35
  its isolated linked-worktree root; no child may infer the primary worktree.
@@ -27,10 +27,10 @@ Apply this contract whenever a GSD Path skill delegates work:
27
27
  brief, wait for it; never create a colliding logical target.
28
28
  - Resolve the phase's linked role brief to an absolute path. Include that
29
29
  path in the prompt and require the child to read it before acting.
30
- - Tier hints: when the host advertises model or reasoning-effort selection,
31
- request `heavy` for `plan`, `plan_patch`, `decide`, and `roadmap`, and
32
- `light` for `inspect_docs` and `docs_audit`; when it offers no such
33
- selection, do not override the model except on a review-panel child, which receives the exact slug from `scripts/review_panel.py resolve`. Do not ask Kimi to create a worktree:
30
+ - Model selection: before every child launch or continuation, follow
31
+ [the model-policy contract](model-policy.md) and apply its recorded
32
+ native arguments. It owns defaults, project settings, task overrides,
33
+ capability failures, and reassignment. Do not ask Kimi to create a worktree:
34
34
  GSD Path supplies the exact repository or linked-worktree root in the
35
35
  brief, and the child must work only there. Host isolation: none.
36
36
  - Give every child a self-contained prompt with absolute input, template,
@@ -23,12 +23,10 @@ Apply this contract whenever a GSD Path skill delegates work:
23
23
  self-contained brief. Disk artifacts remain the source of truth.
24
24
  - Resolve the phase's linked role brief to an absolute path. Include that path
25
25
  in the prompt and require the subagent to read it before acting.
26
- - Tier hints: when the host advertises model or reasoning-effort selection,
27
- request `heavy` for `plan`, `plan_patch`, `decide`, and `roadmap`, and
28
- `light` for `inspect_docs` and `docs_audit`; when it offers no such
29
- selection, do not override the model except on a review-panel child, which receives the exact slug from `scripts/review_panel.py resolve`. Set the child working directory to the
30
- exact repository or linked-worktree root supplied by GSD Path; do not ask
31
- Kiro or the child to create another worktree. Host isolation: none.
26
+ - Model selection: before every child launch or continuation, follow
27
+ [the model-policy contract](model-policy.md) and apply its recorded
28
+ native arguments. It owns defaults, project settings, task overrides,
29
+ capability failures, and reassignment. Host isolation: none. Use the exact GSD Path supplied root; create no extra checkout.
32
30
  - Give every child a self-contained prompt with absolute input, template, and
33
31
  output paths plus its bounded responsibility. A coder prompt also names its
34
32
  isolated linked-worktree root; no child may infer the primary worktree.
@@ -28,10 +28,10 @@ Apply this contract whenever a GSD Path skill delegates work:
28
28
  source of truth.
29
29
  - Resolve the phase's linked role brief to an absolute path. Include that path
30
30
  in the prompt and require the child to read it before acting.
31
- - Tier hints: when the host advertises model or reasoning-effort selection,
32
- request `heavy` for `plan`, `plan_patch`, `decide`, and `roadmap`, and
33
- `light` for `inspect_docs` and `docs_audit`; when it offers no such
34
- selection, do not override the model except on a review-panel child, which receives the exact slug from `scripts/review_panel.py resolve`. Host isolation: none. The child's working directory is the exact absolute root GSD Path supplied; a host SHA checkout or extra worktree is a contract failure.
31
+ - Model selection: before every child launch or continuation, follow
32
+ [the model-policy contract](model-policy.md) and apply its recorded
33
+ native arguments. It owns defaults, project settings, task overrides,
34
+ capability failures, and reassignment. Host isolation: none. Use the exact GSD Path supplied root; create no extra checkout.
35
35
  - Give every child a self-contained prompt with
36
36
  absolute repository, input, template, and output paths plus its bounded
37
37
  responsibility. A coder prompt also names its isolated linked-worktree root;
@@ -25,10 +25,10 @@ Apply this contract whenever a GSD Path skill delegates work:
25
25
  Disk artifacts, not child chat history, remain the source of truth.
26
26
  - Resolve the phase's linked role brief to an absolute path. Include that path
27
27
  in the prompt and require the child to read it before acting.
28
- - Tier hints: when the host advertises model or reasoning-effort selection,
29
- request `heavy` for `plan`, `plan_patch`, `decide`, and `roadmap`, and
30
- `light` for `inspect_docs` and `docs_audit`; when it offers no such
31
- selection, do not override the model except on a review-panel child, which receives the exact slug from `scripts/review_panel.py resolve`. Do not ask Qwen Code to create another
28
+ - Model selection: before every child launch or continuation, follow
29
+ [the model-policy contract](model-policy.md) and apply its recorded
30
+ native arguments. It owns defaults, project settings, task overrides,
31
+ capability failures, and reassignment. Do not ask Qwen Code to create another
32
32
  worktree: GSD Path supplies the exact repository or linked-worktree root,
33
33
  and the child must work only there. Host isolation: none.
34
34
  - Give every child a self-contained prompt with absolute input, template, and
@@ -7,10 +7,7 @@ use exactly one matching branch:
7
7
  - A `spawn_agent` tool exposing `task_name`, `agent_type`, and `fork_turns` is
8
8
  Codex. Use `fork_turns: "none"`; coders use the built-in `worker` type and
9
9
  every other role uses `default`. Reuse a completed logical target with
10
- `followup_task`. For Codex reasoning effort, use `high` for the portable
11
- `heavy` tier and `low` for the portable `light` tier; leave reasoning effort
12
- unset for the session-default tier, and never pass `heavy` or `light` as a
13
- literal Codex value.
10
+ `followup_task`.
14
11
  - A `spawn_agent` tool without those Codex fields is Zed. Spawn one isolated,
15
12
  full-capability child per brief. Zed children are not resumable, so retries
16
13
  use a fresh child and a complete prompt.
@@ -26,7 +23,7 @@ use exactly one matching branch:
26
23
  the complete new prompt for later work. Wait for a colliding active child and
27
24
  collect results with `wait_commands_or_subagents`.
28
25
  - A `Task` tool advertising the custom `gsd-path` subagent is Cursor. Use that
29
- model-inheriting, full-capability child. Resume it by returned agent ID when
26
+ full-capability child. Resume it by returned agent ID when
30
27
  available; otherwise retry with a fresh child and a complete prompt.
31
28
  - A `Task` tool advertising the built-in `general` subagent is OpenCode. Use
32
29
  that child; if an installed OpenCode v2 host exposes the renamed `subagent`
@@ -65,20 +62,10 @@ For every branch:
65
62
  - Resolve the phase's linked role brief to an absolute path, include it in the
66
63
  prompt, and require the child to read it before acting. The role brief
67
64
  supplies the read-only boundary for auditors and reviewers.
68
- - Tier hints: use the portable `heavy` tier for `plan`, `plan_patch`, `decide`,
69
- and `roadmap`, the portable `light` tier for `inspect_docs` and `docs_audit`,
70
- and the session-default tier for every other role. Apply the Codex mapping
71
- above when its schema advertises reasoning-effort selection. On every other
72
- host, use only an exact native equivalent advertised by that host; otherwise
73
- do not override the model or reasoning effort. The only exception is a
74
- review-panel child: when the host advertises model selection, pass the exact
75
- slug returned by `scripts/review_panel.py resolve` for that family. Never
76
- override the model on the canonical reviewer, planner, coder, or any other
77
- role.
78
- Host isolation: none. The child's working directory is the exact absolute
79
- root GSD Path supplied; a host SHA checkout or extra worktree is a contract
80
- failure. Never ask the host to create a worktree. Give the child the exact
81
- repository or linked-worktree root supplied by GSD Path.
65
+ - Model selection: before every child launch or continuation, follow
66
+ [the model-policy contract](model-policy.md) and apply its recorded
67
+ native arguments. It owns defaults, project settings, task overrides,
68
+ capability failures, and reassignment. Host isolation: none. Use the exact GSD Path supplied root; create no extra checkout.
82
69
  - Send a self-contained prompt with absolute input, template, and output paths
83
70
  plus the child's bounded responsibility. Every brief also names the absolute
84
71
  `AGENTS.md` and `WORKFLOW.md` paths (or explicitly says they are absent), the
@@ -122,6 +109,12 @@ directory for the full logical session; resumptions reuse it. Record completed
122
109
  parent CLI run events and each native child's session events with stable logical
123
110
  task names before the next dispatch. The helper reads host counters and refuses
124
111
  incomplete or ambiguous usage; never estimate tokens or reset the ledger.
112
+ When the verified CLI adapter reports cumulative counters across `resume`, record
113
+ each later invocation with `--previous-events <previous recorded CLI events>`.
114
+ The helper checks thread identity and records only the new output, preserving the
115
+ raw total and predecessor. Keep that chain in order; never sum cumulative totals.
116
+ Use ordinary `record` for per-invocation counters. An unknown counter convention
117
+ is unproven usage, not permission to guess.
125
118
  Run `admit` for the next task and stop dispatch on a blocked result. Preserve
126
119
  its output in the dispatch evidence. This gates observed usage only: concurrent
127
120
  or in-flight work can overrun before the host reports usage. Codex CLI has no
@@ -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
@@ -239,15 +242,10 @@ class ArchiveError(RuntimeError):
239
242
 
240
243
 
241
244
  PIPELINE_MARKER = _common.PIPELINE_MARKER
242
- PR_CREDIT_LINE = (
243
- "PR prepared with [GSD Path](https://github.com/open-gsd/gsd-path)."
244
- )
245
- GITHUB_HOST = "github.com"
246
245
 
247
246
 
248
- # discussion_validate and integration call back into this module through a
249
- # module reference and import the constants and ArchiveError above, so this
250
- # import must stay below those definitions.
247
+ # discussion_validate calls back into this module and imports its constants
248
+ # and ArchiveError, so this import must stay below those definitions.
251
249
  if __package__: # imported as scripts.archive_milestone
252
250
  from .discussion_validate import (
253
251
  record_sections,
@@ -280,42 +278,6 @@ if __package__: # imported as scripts.archive_milestone
280
278
  render_manifest,
281
279
  validate_manifest,
282
280
  )
283
- from .integration import (
284
- resolve_remote_default,
285
- live_remote_ref,
286
- publish_bound_branch,
287
- refresh_origin,
288
- optional_ref,
289
- integration_names,
290
- registered_worktree,
291
- remove_registered_worktree,
292
- delete_integration_branch,
293
- require_generated_integration_commit,
294
- discard_unpublished_stale_integration,
295
- create_integration_merge,
296
- require_annotated_tag,
297
- ensure_integration_tag,
298
- github_repository,
299
- require_github_authentication,
300
- github_api_json,
301
- require_pull_request_shape,
302
- require_pull_request_pages,
303
- pull_request_head_matches_repository,
304
- require_pull_request_identity,
305
- find_pull_request,
306
- pull_request_body,
307
- update_pull_request_body,
308
- create_pull_request,
309
- pull_request_tag_message,
310
- pull_request_tag_metadata,
311
- require_pull_request_merge,
312
- require_pull_request_merge_provenance,
313
- integrate_pull_request,
314
- integrate,
315
- find_integrate_commit,
316
- validate_integrated,
317
- require_published_integration,
318
- )
319
281
  else: # standalone script or sibling import
320
282
  if __name__ == "__main__":
321
283
  sys.modules.setdefault("archive_milestone", sys.modules[__name__])
@@ -351,42 +313,6 @@ else: # standalone script or sibling import
351
313
  render_manifest,
352
314
  validate_manifest,
353
315
  )
354
- from integration import (
355
- resolve_remote_default,
356
- live_remote_ref,
357
- publish_bound_branch,
358
- refresh_origin,
359
- optional_ref,
360
- integration_names,
361
- registered_worktree,
362
- remove_registered_worktree,
363
- delete_integration_branch,
364
- require_generated_integration_commit,
365
- discard_unpublished_stale_integration,
366
- create_integration_merge,
367
- require_annotated_tag,
368
- ensure_integration_tag,
369
- github_repository,
370
- require_github_authentication,
371
- github_api_json,
372
- require_pull_request_shape,
373
- require_pull_request_pages,
374
- pull_request_head_matches_repository,
375
- require_pull_request_identity,
376
- find_pull_request,
377
- pull_request_body,
378
- update_pull_request_body,
379
- create_pull_request,
380
- pull_request_tag_message,
381
- pull_request_tag_metadata,
382
- require_pull_request_merge,
383
- require_pull_request_merge_provenance,
384
- integrate_pull_request,
385
- integrate,
386
- find_integrate_commit,
387
- validate_integrated,
388
- require_published_integration,
389
- )
390
316
  except ImportError: # pragma: no cover - package import used by tests
391
317
  from scripts.discussion_validate import (
392
318
  record_sections,
@@ -419,42 +345,6 @@ else: # standalone script or sibling import
419
345
  render_manifest,
420
346
  validate_manifest,
421
347
  )
422
- from scripts.integration import (
423
- resolve_remote_default,
424
- live_remote_ref,
425
- publish_bound_branch,
426
- refresh_origin,
427
- optional_ref,
428
- integration_names,
429
- registered_worktree,
430
- remove_registered_worktree,
431
- delete_integration_branch,
432
- require_generated_integration_commit,
433
- discard_unpublished_stale_integration,
434
- create_integration_merge,
435
- require_annotated_tag,
436
- ensure_integration_tag,
437
- github_repository,
438
- require_github_authentication,
439
- github_api_json,
440
- require_pull_request_shape,
441
- require_pull_request_pages,
442
- pull_request_head_matches_repository,
443
- require_pull_request_identity,
444
- find_pull_request,
445
- pull_request_body,
446
- update_pull_request_body,
447
- create_pull_request,
448
- pull_request_tag_message,
449
- pull_request_tag_metadata,
450
- require_pull_request_merge,
451
- require_pull_request_merge_provenance,
452
- integrate_pull_request,
453
- integrate,
454
- find_integrate_commit,
455
- validate_integrated,
456
- require_published_integration,
457
- )
458
348
 
459
349
 
460
350
  @contextmanager
@@ -1856,6 +1746,12 @@ def require_clean_active_root(active_root: Path, archive: Path) -> None:
1856
1746
  carried_forward = pending_ruling_count(archived_audit)
1857
1747
  # Persistent project metadata ships but never archives with a milestone.
1858
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)
1859
1755
  if (active_root / "CHARTER.md").is_file():
1860
1756
  # Program flow: these persist at the .project/ top level.
1861
1757
  allowed |= {"CHARTER.md", "ROADMAP.md", "SYNTHESIS.md"}
@@ -1921,6 +1817,7 @@ def prepared_transaction(
1921
1817
  repo: Path,
1922
1818
  phases: Sequence[str],
1923
1819
  must_be_uncommitted: bool = False,
1820
+ *, historical: bool = False,
1924
1821
  ) -> tuple:
1925
1822
  project = repo.resolve()
1926
1823
  active_root = require_project_layout(project)
@@ -1929,7 +1826,7 @@ def prepared_transaction(
1929
1826
  state, _, loaded_state_path = strict_state(project)
1930
1827
  if loaded_state_path.resolve() != state_path.resolve():
1931
1828
  raise ArchiveError("strict STATE.md loader returned an unexpected path")
1932
- require_transaction_context(project, state, phases)
1829
+ require_transaction_context(project, state, phases, historical=historical)
1933
1830
 
1934
1831
  configured = state.archive
1935
1832
  if configured is None:
@@ -1993,10 +1890,11 @@ def require_canonical_commit_body(
1993
1890
  raise ArchiveError(f"{label} commit body does not match required fields")
1994
1891
 
1995
1892
 
1996
- def find_ship_commit(project: Path, archive_name: str) -> str:
1893
+ def find_ship_commit(project: Path, archive_name: str, *, historical: bool = False) -> str:
1997
1894
  expected_subject = ship_subject(archive_name)
1998
1895
  log = require_git_success(
1999
- 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"),
2000
1898
  "inspect HEAD history for the ship commit",
2001
1899
  )
2002
1900
  matches = []
@@ -2039,19 +1937,22 @@ def validate_shipped_roadmap(text: str, state: PipelineState, archive: str) -> N
2039
1937
  raise ArchiveError("ROADMAP.md must record Status: shipped and the exact Archive")
2040
1938
 
2041
1939
 
2042
- def validate(repo: Path) -> dict:
1940
+ def validate(repo: Path, *, historical: bool = False) -> dict:
2043
1941
  project, _, state, configured, archive, archived_files, reviewed_head = prepared_transaction(
2044
1942
  repo,
2045
1943
  ("shipped",),
1944
+ historical=historical,
2046
1945
  )
2047
1946
  if state.status != "done":
2048
1947
  raise ArchiveError("STATE.md is not shipped/done")
2049
1948
 
2050
- 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")
2051
1952
  if project_status:
2052
1953
  raise ArchiveError("ship transaction worktree is not clean")
2053
1954
 
2054
- ship_commit = find_ship_commit(project, archive.name)
1955
+ ship_commit = find_ship_commit(project, archive.name, historical=historical)
2055
1956
 
2056
1957
  parents = require_git_success(
2057
1958
  run_git(project, "rev-list", "--parents", "-n", "1", ship_commit),
@@ -2238,6 +2139,11 @@ def parser() -> argparse.ArgumentParser:
2238
2139
  def main(argv: Optional[Sequence[str]] = None) -> int:
2239
2140
  arguments = parser().parse_args(argv)
2240
2141
  try:
2142
+ if arguments.command in {"validate-integrated", "refresh-origin", "integrate"}:
2143
+ if __package__:
2144
+ from . import integration
2145
+ else:
2146
+ import integration
2241
2147
  if arguments.command == "prepare":
2242
2148
  result = prepare(arguments.repo, arguments.slug)
2243
2149
  elif arguments.command == "render-manifest":
@@ -2247,11 +2153,11 @@ def main(argv: Optional[Sequence[str]] = None) -> int:
2247
2153
  elif arguments.command == "abandon":
2248
2154
  result = abandon(arguments.repo, arguments.slug, arguments.reason)
2249
2155
  elif arguments.command == "validate-integrated":
2250
- result = validate_integrated(arguments.repo, arguments.slug)
2156
+ result = integration.validate_integrated(arguments.repo, arguments.slug)
2251
2157
  elif arguments.command == "refresh-origin":
2252
- result = refresh_origin(arguments.repo)
2158
+ result = integration.refresh_origin(arguments.repo)
2253
2159
  elif arguments.command == "integrate":
2254
- result = integrate(arguments.repo, arguments.slug)
2160
+ result = integration.integrate(arguments.repo, arguments.slug)
2255
2161
  else:
2256
2162
  result = validate(arguments.repo)
2257
2163
  except (ArchiveError, OSError) as error:
@@ -32,6 +32,7 @@ class BootstrapRequest:
32
32
  worktree: str
33
33
  branch: str
34
34
  description: Optional[str]
35
+ reuse_empty_worktree: bool = False
35
36
 
36
37
  @property
37
38
  def repository(self) -> str:
@@ -95,6 +96,8 @@ def request_from_arguments(arguments: argparse.Namespace) -> BootstrapRequest:
95
96
  if arguments.visibility not in {"public", "private", "internal"}:
96
97
  raise BootstrapError("visibility must be public, private, or internal")
97
98
 
99
+ if arguments.reuse_empty_worktree and arguments.worktree.is_symlink():
100
+ raise BootstrapError("linked worktree must not be a symlink")
98
101
  workspace = arguments.workspace.resolve()
99
102
  checkout = arguments.default_checkout.resolve()
100
103
  worktree = arguments.worktree.resolve()
@@ -116,6 +119,7 @@ def request_from_arguments(arguments: argparse.Namespace) -> BootstrapRequest:
116
119
  worktree=str(worktree),
117
120
  branch="gsd-path/M001",
118
121
  description=arguments.description,
122
+ reuse_empty_worktree=arguments.reuse_empty_worktree,
119
123
  )
120
124
 
121
125
 
@@ -148,7 +152,10 @@ def transaction_directory(request: BootstrapRequest, create: bool = False) -> Pa
148
152
 
149
153
 
150
154
  def request_payload(request: BootstrapRequest) -> dict:
151
- return {"schema": "gsd-path/new-github/v1", **asdict(request)}
155
+ payload = {"schema": "gsd-path/new-github/v1", **asdict(request)}
156
+ if not request.reuse_empty_worktree:
157
+ del payload["reuse_empty_worktree"]
158
+ return payload
152
159
 
153
160
 
154
161
  def read_journal(request: BootstrapRequest) -> Optional[dict]:
@@ -272,6 +279,16 @@ def transaction_stages(request: BootstrapRequest) -> dict:
272
279
  }
273
280
 
274
281
 
282
+ def reusable_empty_worktree(request: BootstrapRequest) -> bool:
283
+ path = request.worktree_path
284
+ return (
285
+ request.reuse_empty_worktree
286
+ and not path.is_symlink()
287
+ and path.is_dir()
288
+ and not any(path.iterdir())
289
+ )
290
+
291
+
275
292
  def preview(request: BootstrapRequest) -> dict:
276
293
  gh_authentication()
277
294
  stages = transaction_stages(request)
@@ -288,8 +305,12 @@ def preview(request: BootstrapRequest) -> dict:
288
305
  ("default checkout", request.checkout_path),
289
306
  ("linked worktree", request.worktree_path),
290
307
  ):
308
+ if path == request.worktree_path and reusable_empty_worktree(request):
309
+ continue
291
310
  if path.exists() or path.is_symlink():
292
- raise BootstrapError(f"{label} path already exists: {path}")
311
+ raise BootstrapError(
312
+ f"{label} path already exists: {path}; preserve it and choose another path"
313
+ )
293
314
  return {**request_payload(request), "mode": "create", "stages": stages}
294
315
 
295
316
 
@@ -448,7 +469,7 @@ def allowed_partial_project_status(worktree: Path) -> bool:
448
469
  def create_or_verify_worktree(request: BootstrapRequest, base: str) -> None:
449
470
  checkout = request.checkout_path
450
471
  worktree = request.worktree_path
451
- if not worktree.exists():
472
+ if not worktree.exists() or reusable_empty_worktree(request):
452
473
  branch_ref = f"refs/heads/{request.branch}"
453
474
  branch = run("git", "-C", str(checkout), "rev-parse", "--verify", branch_ref)
454
475
  if branch.returncode == 0:
@@ -540,7 +561,14 @@ def render_state(template: Path, request: BootstrapRequest) -> str:
540
561
  )
541
562
  if "<slug>" in content or "branch: null" in content:
542
563
  raise BootstrapError("state template placeholders were not fully replaced")
543
- return content
564
+ try:
565
+ from .path_config import initial_state
566
+ except ImportError:
567
+ from path_config import initial_state
568
+ try:
569
+ return initial_state(content)
570
+ except (OSError, ValueError, RuntimeError) as error:
571
+ raise BootstrapError(str(error)) from error
544
572
 
545
573
 
546
574
  def render_binding(
@@ -680,6 +708,7 @@ def parser() -> argparse.ArgumentParser:
680
708
  argument_parser.add_argument("--default-checkout", type=Path, required=True)
681
709
  argument_parser.add_argument("--worktree", type=Path, required=True)
682
710
  argument_parser.add_argument("--description")
711
+ argument_parser.add_argument("--reuse-empty-worktree", action="store_true")
683
712
  argument_parser.add_argument("--state-template", type=Path)
684
713
  argument_parser.add_argument("--repository-template", type=Path)
685
714
  return argument_parser