@opengsd/gsd-path 1.5.0 → 1.6.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 (352) hide show
  1. package/CHANGELOG.md +138 -0
  2. package/DOCS.md +4 -3
  3. package/FULL.md +64 -4
  4. package/HOOKS.md +63 -2
  5. package/MIGRATE.md +12 -0
  6. package/QUICK.md +4 -2
  7. package/README.md +67 -15
  8. package/RUNTIME.md +23 -5
  9. package/UPDATE.md +35 -0
  10. package/WORKFLOW.md +58 -3
  11. package/package.json +1 -1
  12. package/scripts/_common.py +107 -1
  13. package/scripts/build_recovery.py +62 -30
  14. package/scripts/build_state.py +195 -5
  15. package/scripts/check_handoffs.py +92 -30
  16. package/scripts/check_task_briefs.py +19 -14
  17. package/scripts/detect_project.py +17 -2
  18. package/scripts/discussion_records.py +9 -1
  19. package/scripts/discussion_validate.py +7 -6
  20. package/scripts/dispatch_driver.py +157 -31
  21. package/scripts/git_guard.py +24 -5
  22. package/scripts/guard_hook.py +1216 -47
  23. package/scripts/install.mjs +76 -3
  24. package/scripts/install.py +182 -37
  25. package/scripts/integration.py +98 -64
  26. package/scripts/isolation.py +148 -11
  27. package/scripts/members.py +68 -25
  28. package/scripts/migrate_core.py +2 -0
  29. package/scripts/model_policy.py +5 -1
  30. package/scripts/pipeline_diagnose.py +17 -2
  31. package/scripts/pipeline_git.py +68 -30
  32. package/scripts/pipeline_state.py +28 -6
  33. package/scripts/pipeline_undo.py +17 -8
  34. package/scripts/promote_lookahead.py +3 -3
  35. package/scripts/review_findings.py +180 -44
  36. package/scripts/roadmap.py +9 -1
  37. package/scripts/runtime_store.py +1 -0
  38. package/scripts/state_checkpoint.py +30 -9
  39. package/scripts/state_promote.py +15 -4
  40. package/scripts/task_context.py +2 -0
  41. package/scripts/workflow_run.py +9 -2
  42. package/skills/gsd-path/DEFINE.md +6 -2
  43. package/skills/gsd-path/PLAN.md +3 -0
  44. package/skills/gsd-path/ROADMAP.md +16 -6
  45. package/skills/gsd-path/SHIP.md +26 -4
  46. package/skills/gsd-path/SKILL.md +52 -24
  47. package/skills/gsd-path/references/build-native.md +96 -9
  48. package/skills/gsd-path/references/build-recovery.md +13 -0
  49. package/skills/gsd-path/references/coder.md +7 -3
  50. package/skills/gsd-path/references/operating-rules.md +11 -3
  51. package/skills/gsd-path/references/planner.md +13 -1
  52. package/skills/gsd-path/references/reviewer-final.md +5 -5
  53. package/skills/gsd-path/references/reviewer-wave.md +46 -13
  54. package/skills/gsd-path/references/runtime-selection.md +9 -0
  55. package/skills/gsd-path/scripts/_common.py +107 -1
  56. package/skills/gsd-path/scripts/build_recovery.py +62 -30
  57. package/skills/gsd-path/scripts/build_state.py +195 -5
  58. package/skills/gsd-path/scripts/check_handoffs.py +92 -30
  59. package/skills/gsd-path/scripts/check_task_briefs.py +19 -14
  60. package/skills/gsd-path/scripts/detect_project.py +17 -2
  61. package/skills/gsd-path/scripts/discussion_records.py +9 -1
  62. package/skills/gsd-path/scripts/discussion_validate.py +7 -6
  63. package/skills/gsd-path/scripts/dispatch_driver.py +157 -31
  64. package/skills/gsd-path/scripts/git_guard.py +24 -5
  65. package/skills/gsd-path/scripts/integration.py +98 -64
  66. package/skills/gsd-path/scripts/isolation.py +148 -11
  67. package/skills/gsd-path/scripts/members.py +68 -25
  68. package/skills/gsd-path/scripts/model_policy.py +5 -1
  69. package/skills/gsd-path/scripts/pipeline_git.py +68 -30
  70. package/skills/gsd-path/scripts/pipeline_state.py +28 -6
  71. package/skills/gsd-path/scripts/promote_lookahead.py +3 -3
  72. package/skills/gsd-path/scripts/review_findings.py +180 -44
  73. package/skills/gsd-path/scripts/roadmap.py +9 -1
  74. package/skills/gsd-path/scripts/state_checkpoint.py +30 -9
  75. package/skills/gsd-path/scripts/state_promote.py +15 -4
  76. package/skills/gsd-path/scripts/task_context.py +2 -0
  77. package/skills/gsd-path/scripts/workflow_run.py +9 -2
  78. package/skills/gsd-path/templates/final-review.md +5 -5
  79. package/skills/gsd-path/templates/state.md +1 -0
  80. package/skills/gsd-path/templates/task.md +1 -0
  81. package/skills/gsd-path/templates/wave-review.md +18 -9
  82. package/skills/gsd-path-build/references/build-native.md +96 -9
  83. package/skills/gsd-path-build/references/build-recovery.md +13 -0
  84. package/skills/gsd-path-build/references/coder.md +7 -3
  85. package/skills/gsd-path-build/references/operating-rules.md +11 -3
  86. package/skills/gsd-path-build/references/reviewer-final.md +5 -5
  87. package/skills/gsd-path-build/references/reviewer-wave.md +46 -13
  88. package/skills/gsd-path-build/references/runtime-selection.md +9 -0
  89. package/skills/gsd-path-build/scripts/_common.py +107 -1
  90. package/skills/gsd-path-build/scripts/build_recovery.py +62 -30
  91. package/skills/gsd-path-build/scripts/build_state.py +195 -5
  92. package/skills/gsd-path-build/scripts/check_handoffs.py +92 -30
  93. package/skills/gsd-path-build/scripts/check_task_briefs.py +19 -14
  94. package/skills/gsd-path-build/scripts/detect_project.py +17 -2
  95. package/skills/gsd-path-build/scripts/discussion_records.py +9 -1
  96. package/skills/gsd-path-build/scripts/discussion_validate.py +7 -6
  97. package/skills/gsd-path-build/scripts/dispatch_driver.py +157 -31
  98. package/skills/gsd-path-build/scripts/integration.py +98 -64
  99. package/skills/gsd-path-build/scripts/isolation.py +148 -11
  100. package/skills/gsd-path-build/scripts/members.py +68 -25
  101. package/skills/gsd-path-build/scripts/model_policy.py +5 -1
  102. package/skills/gsd-path-build/scripts/pipeline_git.py +68 -30
  103. package/skills/gsd-path-build/scripts/pipeline_state.py +28 -6
  104. package/skills/gsd-path-build/scripts/promote_lookahead.py +3 -3
  105. package/skills/gsd-path-build/scripts/review_findings.py +180 -44
  106. package/skills/gsd-path-build/scripts/roadmap.py +9 -1
  107. package/skills/gsd-path-build/scripts/state_checkpoint.py +30 -9
  108. package/skills/gsd-path-build/scripts/state_promote.py +15 -4
  109. package/skills/gsd-path-build/scripts/task_context.py +2 -0
  110. package/skills/gsd-path-build/scripts/workflow_run.py +9 -2
  111. package/skills/gsd-path-build/templates/task.md +1 -0
  112. package/skills/gsd-path-build/templates/wave-review.md +18 -9
  113. package/skills/gsd-path-decide/references/operating-rules.md +11 -3
  114. package/skills/gsd-path-decide/references/runtime-selection.md +9 -0
  115. package/skills/gsd-path-decide/scripts/_common.py +107 -1
  116. package/skills/gsd-path-decide/scripts/build_recovery.py +62 -30
  117. package/skills/gsd-path-decide/scripts/check_handoffs.py +92 -30
  118. package/skills/gsd-path-decide/scripts/check_task_briefs.py +19 -14
  119. package/skills/gsd-path-decide/scripts/detect_project.py +17 -2
  120. package/skills/gsd-path-decide/scripts/discussion_records.py +9 -1
  121. package/skills/gsd-path-decide/scripts/discussion_validate.py +7 -6
  122. package/skills/gsd-path-decide/scripts/integration.py +98 -64
  123. package/skills/gsd-path-decide/scripts/isolation.py +148 -11
  124. package/skills/gsd-path-decide/scripts/members.py +68 -25
  125. package/skills/gsd-path-decide/scripts/model_policy.py +5 -1
  126. package/skills/gsd-path-decide/scripts/pipeline_git.py +68 -30
  127. package/skills/gsd-path-decide/scripts/pipeline_state.py +28 -6
  128. package/skills/gsd-path-decide/scripts/promote_lookahead.py +3 -3
  129. package/skills/gsd-path-decide/scripts/roadmap.py +9 -1
  130. package/skills/gsd-path-decide/scripts/state_checkpoint.py +30 -9
  131. package/skills/gsd-path-decide/scripts/state_promote.py +15 -4
  132. package/skills/gsd-path-define/SKILL.md +6 -2
  133. package/skills/gsd-path-define/references/build-recovery.md +13 -0
  134. package/skills/gsd-path-define/references/operating-rules.md +11 -3
  135. package/skills/gsd-path-define/references/runtime-selection.md +9 -0
  136. package/skills/gsd-path-define/scripts/_common.py +107 -1
  137. package/skills/gsd-path-define/scripts/build_recovery.py +62 -30
  138. package/skills/gsd-path-define/scripts/check_handoffs.py +92 -30
  139. package/skills/gsd-path-define/scripts/check_task_briefs.py +19 -14
  140. package/skills/gsd-path-define/scripts/detect_project.py +17 -2
  141. package/skills/gsd-path-define/scripts/discussion_records.py +9 -1
  142. package/skills/gsd-path-define/scripts/discussion_validate.py +7 -6
  143. package/skills/gsd-path-define/scripts/integration.py +98 -64
  144. package/skills/gsd-path-define/scripts/isolation.py +148 -11
  145. package/skills/gsd-path-define/scripts/members.py +68 -25
  146. package/skills/gsd-path-define/scripts/model_policy.py +5 -1
  147. package/skills/gsd-path-define/scripts/pipeline_git.py +68 -30
  148. package/skills/gsd-path-define/scripts/pipeline_state.py +28 -6
  149. package/skills/gsd-path-define/scripts/promote_lookahead.py +3 -3
  150. package/skills/gsd-path-define/scripts/roadmap.py +9 -1
  151. package/skills/gsd-path-define/scripts/state_checkpoint.py +30 -9
  152. package/skills/gsd-path-define/scripts/state_promote.py +15 -4
  153. package/skills/gsd-path-define/templates/state.md +1 -0
  154. package/skills/gsd-path-discuss/references/operating-rules.md +11 -3
  155. package/skills/gsd-path-discuss/references/runtime-selection.md +9 -0
  156. package/skills/gsd-path-discuss/scripts/_common.py +107 -1
  157. package/skills/gsd-path-discuss/scripts/discussion_records.py +9 -1
  158. package/skills/gsd-path-discuss/scripts/model_policy.py +5 -1
  159. package/skills/gsd-path-docs-audit/references/operating-rules.md +11 -3
  160. package/skills/gsd-path-docs-audit/references/runtime-selection.md +9 -0
  161. package/skills/gsd-path-docs-audit/scripts/_common.py +107 -1
  162. package/skills/gsd-path-docs-audit/scripts/build_recovery.py +62 -30
  163. package/skills/gsd-path-docs-audit/scripts/check_handoffs.py +92 -30
  164. package/skills/gsd-path-docs-audit/scripts/check_task_briefs.py +19 -14
  165. package/skills/gsd-path-docs-audit/scripts/detect_project.py +17 -2
  166. package/skills/gsd-path-docs-audit/scripts/discussion_records.py +9 -1
  167. package/skills/gsd-path-docs-audit/scripts/discussion_validate.py +7 -6
  168. package/skills/gsd-path-docs-audit/scripts/integration.py +98 -64
  169. package/skills/gsd-path-docs-audit/scripts/isolation.py +148 -11
  170. package/skills/gsd-path-docs-audit/scripts/members.py +68 -25
  171. package/skills/gsd-path-docs-audit/scripts/model_policy.py +5 -1
  172. package/skills/gsd-path-docs-audit/scripts/pipeline_git.py +68 -30
  173. package/skills/gsd-path-docs-audit/scripts/pipeline_state.py +28 -6
  174. package/skills/gsd-path-docs-audit/scripts/promote_lookahead.py +3 -3
  175. package/skills/gsd-path-docs-audit/scripts/roadmap.py +9 -1
  176. package/skills/gsd-path-docs-audit/scripts/state_checkpoint.py +30 -9
  177. package/skills/gsd-path-docs-audit/scripts/state_promote.py +15 -4
  178. package/skills/gsd-path-forensics/references/operating-rules.md +11 -3
  179. package/skills/gsd-path-forensics/references/runtime-selection.md +9 -0
  180. package/skills/gsd-path-forensics/scripts/_common.py +107 -1
  181. package/skills/gsd-path-forensics/scripts/discussion_records.py +9 -1
  182. package/skills/gsd-path-forensics/scripts/model_policy.py +5 -1
  183. package/skills/gsd-path-forensics/scripts/pipeline_diagnose.py +17 -2
  184. package/skills/gsd-path-forensics/scripts/pipeline_undo.py +17 -8
  185. package/skills/gsd-path-inspect/references/operating-rules.md +11 -3
  186. package/skills/gsd-path-inspect/references/runtime-selection.md +9 -0
  187. package/skills/gsd-path-inspect/scripts/_common.py +107 -1
  188. package/skills/gsd-path-inspect/scripts/build_recovery.py +62 -30
  189. package/skills/gsd-path-inspect/scripts/check_handoffs.py +92 -30
  190. package/skills/gsd-path-inspect/scripts/check_task_briefs.py +19 -14
  191. package/skills/gsd-path-inspect/scripts/detect_project.py +17 -2
  192. package/skills/gsd-path-inspect/scripts/discussion_records.py +9 -1
  193. package/skills/gsd-path-inspect/scripts/discussion_validate.py +7 -6
  194. package/skills/gsd-path-inspect/scripts/integration.py +98 -64
  195. package/skills/gsd-path-inspect/scripts/isolation.py +148 -11
  196. package/skills/gsd-path-inspect/scripts/members.py +68 -25
  197. package/skills/gsd-path-inspect/scripts/model_policy.py +5 -1
  198. package/skills/gsd-path-inspect/scripts/pipeline_git.py +68 -30
  199. package/skills/gsd-path-inspect/scripts/pipeline_state.py +28 -6
  200. package/skills/gsd-path-inspect/scripts/promote_lookahead.py +3 -3
  201. package/skills/gsd-path-inspect/scripts/roadmap.py +9 -1
  202. package/skills/gsd-path-inspect/scripts/state_checkpoint.py +30 -9
  203. package/skills/gsd-path-inspect/scripts/state_promote.py +15 -4
  204. package/skills/gsd-path-inspect/scripts/workflow_run.py +9 -2
  205. package/skills/gsd-path-inspect/templates/state.md +1 -0
  206. package/skills/gsd-path-loop/references/operating-rules.md +11 -3
  207. package/skills/gsd-path-loop/references/runtime-selection.md +9 -0
  208. package/skills/gsd-path-loop/scripts/_common.py +107 -1
  209. package/skills/gsd-path-loop/scripts/discussion_records.py +9 -1
  210. package/skills/gsd-path-loop/scripts/model_policy.py +5 -1
  211. package/skills/gsd-path-migrate/SKILL.md +8 -0
  212. package/skills/gsd-path-migrate/references/operating-rules.md +11 -3
  213. package/skills/gsd-path-migrate/references/runtime-selection.md +9 -0
  214. package/skills/gsd-path-migrate/scripts/_common.py +107 -1
  215. package/skills/gsd-path-migrate/scripts/discussion_records.py +9 -1
  216. package/skills/gsd-path-migrate/scripts/migrate_core.py +2 -0
  217. package/skills/gsd-path-migrate/scripts/model_policy.py +5 -1
  218. package/skills/gsd-path-plan/SKILL.md +3 -0
  219. package/skills/gsd-path-plan/references/build-recovery.md +13 -0
  220. package/skills/gsd-path-plan/references/operating-rules.md +11 -3
  221. package/skills/gsd-path-plan/references/planner.md +13 -1
  222. package/skills/gsd-path-plan/references/runtime-selection.md +9 -0
  223. package/skills/gsd-path-plan/scripts/_common.py +107 -1
  224. package/skills/gsd-path-plan/scripts/build_recovery.py +62 -30
  225. package/skills/gsd-path-plan/scripts/check_handoffs.py +92 -30
  226. package/skills/gsd-path-plan/scripts/check_task_briefs.py +19 -14
  227. package/skills/gsd-path-plan/scripts/detect_project.py +17 -2
  228. package/skills/gsd-path-plan/scripts/discussion_records.py +9 -1
  229. package/skills/gsd-path-plan/scripts/discussion_validate.py +7 -6
  230. package/skills/gsd-path-plan/scripts/integration.py +98 -64
  231. package/skills/gsd-path-plan/scripts/isolation.py +148 -11
  232. package/skills/gsd-path-plan/scripts/members.py +68 -25
  233. package/skills/gsd-path-plan/scripts/model_policy.py +5 -1
  234. package/skills/gsd-path-plan/scripts/pipeline_git.py +68 -30
  235. package/skills/gsd-path-plan/scripts/pipeline_state.py +28 -6
  236. package/skills/gsd-path-plan/scripts/promote_lookahead.py +3 -3
  237. package/skills/gsd-path-plan/scripts/roadmap.py +9 -1
  238. package/skills/gsd-path-plan/scripts/state_checkpoint.py +30 -9
  239. package/skills/gsd-path-plan/scripts/state_promote.py +15 -4
  240. package/skills/gsd-path-plan/scripts/workflow_run.py +9 -2
  241. package/skills/gsd-path-plan/templates/task.md +1 -0
  242. package/skills/gsd-path-research/references/operating-rules.md +11 -3
  243. package/skills/gsd-path-research/references/runtime-selection.md +9 -0
  244. package/skills/gsd-path-research/scripts/_common.py +107 -1
  245. package/skills/gsd-path-research/scripts/build_recovery.py +62 -30
  246. package/skills/gsd-path-research/scripts/check_handoffs.py +92 -30
  247. package/skills/gsd-path-research/scripts/check_task_briefs.py +19 -14
  248. package/skills/gsd-path-research/scripts/detect_project.py +17 -2
  249. package/skills/gsd-path-research/scripts/discussion_records.py +9 -1
  250. package/skills/gsd-path-research/scripts/discussion_validate.py +7 -6
  251. package/skills/gsd-path-research/scripts/integration.py +98 -64
  252. package/skills/gsd-path-research/scripts/isolation.py +148 -11
  253. package/skills/gsd-path-research/scripts/members.py +68 -25
  254. package/skills/gsd-path-research/scripts/model_policy.py +5 -1
  255. package/skills/gsd-path-research/scripts/pipeline_git.py +68 -30
  256. package/skills/gsd-path-research/scripts/pipeline_state.py +28 -6
  257. package/skills/gsd-path-research/scripts/promote_lookahead.py +3 -3
  258. package/skills/gsd-path-research/scripts/roadmap.py +9 -1
  259. package/skills/gsd-path-research/scripts/state_checkpoint.py +30 -9
  260. package/skills/gsd-path-research/scripts/state_promote.py +15 -4
  261. package/skills/gsd-path-roadmap/SKILL.md +16 -6
  262. package/skills/gsd-path-roadmap/references/operating-rules.md +11 -3
  263. package/skills/gsd-path-roadmap/references/runtime-selection.md +9 -0
  264. package/skills/gsd-path-roadmap/scripts/_common.py +107 -1
  265. package/skills/gsd-path-roadmap/scripts/build_recovery.py +62 -30
  266. package/skills/gsd-path-roadmap/scripts/check_handoffs.py +92 -30
  267. package/skills/gsd-path-roadmap/scripts/check_task_briefs.py +19 -14
  268. package/skills/gsd-path-roadmap/scripts/detect_project.py +17 -2
  269. package/skills/gsd-path-roadmap/scripts/discussion_records.py +9 -1
  270. package/skills/gsd-path-roadmap/scripts/discussion_validate.py +7 -6
  271. package/skills/gsd-path-roadmap/scripts/integration.py +98 -64
  272. package/skills/gsd-path-roadmap/scripts/isolation.py +148 -11
  273. package/skills/gsd-path-roadmap/scripts/members.py +68 -25
  274. package/skills/gsd-path-roadmap/scripts/model_policy.py +5 -1
  275. package/skills/gsd-path-roadmap/scripts/pipeline_git.py +68 -30
  276. package/skills/gsd-path-roadmap/scripts/pipeline_state.py +28 -6
  277. package/skills/gsd-path-roadmap/scripts/promote_lookahead.py +3 -3
  278. package/skills/gsd-path-roadmap/scripts/roadmap.py +9 -1
  279. package/skills/gsd-path-roadmap/scripts/state_checkpoint.py +30 -9
  280. package/skills/gsd-path-roadmap/scripts/state_promote.py +15 -4
  281. package/skills/gsd-path-ship/SKILL.md +26 -4
  282. package/skills/gsd-path-ship/references/operating-rules.md +11 -3
  283. package/skills/gsd-path-ship/references/reviewer-final.md +5 -5
  284. package/skills/gsd-path-ship/references/reviewer-wave.md +46 -13
  285. package/skills/gsd-path-ship/references/runtime-selection.md +9 -0
  286. package/skills/gsd-path-ship/scripts/_common.py +107 -1
  287. package/skills/gsd-path-ship/scripts/build_recovery.py +62 -30
  288. package/skills/gsd-path-ship/scripts/build_state.py +195 -5
  289. package/skills/gsd-path-ship/scripts/check_handoffs.py +92 -30
  290. package/skills/gsd-path-ship/scripts/check_task_briefs.py +19 -14
  291. package/skills/gsd-path-ship/scripts/detect_project.py +17 -2
  292. package/skills/gsd-path-ship/scripts/discussion_records.py +9 -1
  293. package/skills/gsd-path-ship/scripts/discussion_validate.py +7 -6
  294. package/skills/gsd-path-ship/scripts/integration.py +98 -64
  295. package/skills/gsd-path-ship/scripts/isolation.py +148 -11
  296. package/skills/gsd-path-ship/scripts/members.py +68 -25
  297. package/skills/gsd-path-ship/scripts/model_policy.py +5 -1
  298. package/skills/gsd-path-ship/scripts/pipeline_git.py +68 -30
  299. package/skills/gsd-path-ship/scripts/pipeline_state.py +28 -6
  300. package/skills/gsd-path-ship/scripts/promote_lookahead.py +3 -3
  301. package/skills/gsd-path-ship/scripts/roadmap.py +9 -1
  302. package/skills/gsd-path-ship/scripts/state_checkpoint.py +30 -9
  303. package/skills/gsd-path-ship/scripts/state_promote.py +15 -4
  304. package/skills/gsd-path-ship/scripts/workflow_run.py +9 -2
  305. package/skills/gsd-path-ship/templates/final-review.md +5 -5
  306. package/skills/gsd-path-ship/templates/wave-review.md +18 -9
  307. package/skills/gsd-path-undo/references/operating-rules.md +11 -3
  308. package/skills/gsd-path-undo/references/runtime-selection.md +9 -0
  309. package/skills/gsd-path-undo/scripts/_common.py +107 -1
  310. package/skills/gsd-path-undo/scripts/discussion_records.py +9 -1
  311. package/skills/gsd-path-undo/scripts/model_policy.py +5 -1
  312. package/skills/gsd-path-undo/scripts/pipeline_undo.py +17 -8
  313. package/skills/path/DEFINE.md +6 -2
  314. package/skills/path/PLAN.md +3 -0
  315. package/skills/path/ROADMAP.md +16 -6
  316. package/skills/path/SHIP.md +26 -4
  317. package/skills/path/SKILL.md +52 -24
  318. package/skills/path/references/build-native.md +96 -9
  319. package/skills/path/references/build-recovery.md +13 -0
  320. package/skills/path/references/coder.md +7 -3
  321. package/skills/path/references/operating-rules.md +11 -3
  322. package/skills/path/references/planner.md +13 -1
  323. package/skills/path/references/reviewer-final.md +5 -5
  324. package/skills/path/references/reviewer-wave.md +46 -13
  325. package/skills/path/references/runtime-selection.md +9 -0
  326. package/skills/path/scripts/_common.py +107 -1
  327. package/skills/path/scripts/build_recovery.py +62 -30
  328. package/skills/path/scripts/build_state.py +195 -5
  329. package/skills/path/scripts/check_handoffs.py +92 -30
  330. package/skills/path/scripts/check_task_briefs.py +19 -14
  331. package/skills/path/scripts/detect_project.py +17 -2
  332. package/skills/path/scripts/discussion_records.py +9 -1
  333. package/skills/path/scripts/discussion_validate.py +7 -6
  334. package/skills/path/scripts/dispatch_driver.py +157 -31
  335. package/skills/path/scripts/git_guard.py +24 -5
  336. package/skills/path/scripts/integration.py +98 -64
  337. package/skills/path/scripts/isolation.py +148 -11
  338. package/skills/path/scripts/members.py +68 -25
  339. package/skills/path/scripts/model_policy.py +5 -1
  340. package/skills/path/scripts/pipeline_git.py +68 -30
  341. package/skills/path/scripts/pipeline_state.py +28 -6
  342. package/skills/path/scripts/promote_lookahead.py +3 -3
  343. package/skills/path/scripts/review_findings.py +180 -44
  344. package/skills/path/scripts/roadmap.py +9 -1
  345. package/skills/path/scripts/state_checkpoint.py +30 -9
  346. package/skills/path/scripts/state_promote.py +15 -4
  347. package/skills/path/scripts/task_context.py +2 -0
  348. package/skills/path/scripts/workflow_run.py +9 -2
  349. package/skills/path/templates/final-review.md +5 -5
  350. package/skills/path/templates/state.md +1 -0
  351. package/skills/path/templates/task.md +1 -0
  352. package/skills/path/templates/wave-review.md +18 -9
package/CHANGELOG.md CHANGED
@@ -11,6 +11,144 @@ app and the daemon have their own file,
11
11
  [daemon/app/CHANGELOG.md](daemon/app/CHANGELOG.md). Release bookkeeping and
12
12
  test-only changes are not listed; the Git history has them.
13
13
 
14
+ ## [1.6.0] - 2026-10-12
15
+
16
+ ### Added
17
+ - let a later task supersede an earlier task and retire its Verify
18
+ - document the default branch record of a member
19
+ - member paths read the default branch that MEMBERS.md records
20
+ - record the default branch of a member in MEMBERS.md
21
+ - add --uninstall to the skill installers
22
+ - expose default_branch to the router and document the rule
23
+ - refuse members under a coordinator whose default branch is not main
24
+ - status, promotion and the git guard follow STATE default_branch
25
+ - integrate and validate on the default branch that STATE records
26
+ - bind milestones at the default branch that STATE records
27
+ - record the origin default branch in STATE at initialization
28
+
29
+ ### Changed
30
+ - make each checkpoint commit different in the stale sidecar test
31
+ - record 1.6.0 live release evidence
32
+ - prepare 1.6.0 minor candidate
33
+ - Merge main into fix/issue-392-wave-review-validator
34
+ - Merge main into fix/issue-393-helper-papercuts
35
+ - Merge main into fix/issue-357-regression-verify
36
+ - Merge main into fix/issue-358-multi-repo-batches
37
+ - Merge main into fix/issue-390-build-helpers-runtime
38
+ - state the repair base-to-landing rule in build-native.md
39
+ - document supersedes gate rule in plan skill
40
+ - describe finish retry, stale Verify sidecar, leftover isolate
41
+ - document retired Verify key in RUNTIME.md
42
+ - name per-repo batching in review_findings docstring
43
+ - correct task_review_observation docstring after marker-tolerant matching
44
+ - state the wave review format rules and name them in the gate errors
45
+ - Document alias denial in directories that do not exist
46
+ - a done task brief with a deleted Context path does not fail later lint
47
+ - Document directory overlap rule in planner brief
48
+ - prove the issue 374 fixes through the real commands
49
+ - prove a define re-slice that removes a surface reaches the plan gate
50
+ - Merge remote-tracking branch 'origin/main' into fix/issue-344-scope-destructive-git-guards
51
+ - correct fix-tasks carried rule in RUNTIME.md
52
+ - document regression Verify at landing in RUNTIME.md
53
+ - point stale Python-installer flag lists to README
54
+ - say how more than one person can work on a project
55
+ - show host proof tiers in README and QUICK
56
+ - Document literal attestation limit for declared directories
57
+ - Align coder file-scope rule with declared-directory landing
58
+ - add contributing guide, security policy, and issue forms
59
+ - style: fix assignment spacing in round lint test
60
+ - prove round lint accepts dependency-supplied contract paths
61
+ - bind the next milestone after a direct ship on a master default
62
+ - Add GitHub Actions workflow for Discord changelog
63
+ - update release notes for v1.5.0
64
+ - quote portable repository paths in shell fixture
65
+
66
+ ### Fixed
67
+ - plan gate reads a declared directory when it checks supersedes
68
+ - give no removal advice for an isolate that holds a gitignored file
69
+ - replace a stale Verify sidecar only when it is proven untouched
70
+ - check the chain files from the repair base, not from the repair landing
71
+ - read update-ref, branch and worktree targets as Git does
72
+ - deny scoped deletions when the guard cannot prove the repository
73
+ - link review repairs by finding, not by criterion text alone
74
+ - give a superseding task the protective role of the task it supersedes
75
+ - check the files of every later linked repair before a chain receipt
76
+ - name only the leftover isolate when a landed task could not be cleaned up
77
+ - make only sub-bullet line markers optional in a criterion quote
78
+ - give a receipt to a chain of review repairs on the same files
79
+ - report a landed task as landed when the removal of its isolate fails
80
+ - deliver review_findings and task_context through the project runtime
81
+ - prove a member review repair in the member repository
82
+ - match a quoted criterion without the list markers of its sub-bullets
83
+ - let finish run again after a failed serial Verify, and prepare-task replace a stale Verify sidecar
84
+ - accept a review repair whose files are not in its fix batch
85
+ - report unreviewed earlier waves in ready and prove repair-wave order
86
+ - say how to record a Log event when a transition changes no field
87
+ - tell the user how to get the full SHA when a ref is refused
88
+ - name the differing identity field when a model policy record does not match
89
+ - a review cycle replaces an older one only with a valid wave verdict
90
+ - land tasks that share an earlier task one at a time
91
+ - list worktrees on Git versions without worktree list -z
92
+ - keep tracked cd targets valid with the scoped deletion rules
93
+ - keep ordinary Git commands allowed with env and in new directories
94
+ - accept an unset base milestone only for a closed build recovery
95
+ - keep review evidence checks when a criterion number repeats
96
+ - keep the fallback for a missing bundled helper module
97
+ - git guard uses main when STATE has no default_branch
98
+ - do not skip an earlier Verify because its text is in the own Verify
99
+ - treat a declared directory and a path below it as overlapping files
100
+ - accept a default branch that starts with origin/ at ship
101
+ - re-raise an import error from inside a bundled helper module
102
+ - keep a blocked review cycle until a newer cycle has a verdict
103
+ - keep the cap exemption when a cap line carries the template comment
104
+ - run earlier-wave Verify at landing when a task edits the same files
105
+ - keep each review repair in one repo and lint landed briefs as history
106
+ - give a repeat finding its next repair and ignore repairs of a replaced review
107
+ - land files under a declared files directory
108
+ - let a define-entered re-slice amend the active roadmap entry
109
+ - keep wave reviews when a plan repair changes only caps or dependency notes
110
+ - drop superseded review cycles from the dashboard attention list
111
+ - load bundled helpers when a foreign `scripts` package is importable
112
+ - tolerate repeated criterion numbers and unset recovery base milestone
113
+ - chain an existing Git hook instead of refusing the hook install
114
+ - accept external-landing proof when the forge deletes the bound branch
115
+ - fail early on a non-main default and document external-landing
116
+ - cover all parameter syntaxes in scoped deletion
117
+ - fail closed on literal parameter target ambiguity
118
+ - scope destructive Git cleanup to Path-owned targets
119
+
120
+ ### Other
121
+ - Resolve macOS temp path in ownership scope test fixture
122
+ - Check unfolded and folded readings of process substitutions
123
+ - Fold process substitutions; count only real earlier Git commands
124
+ - Check each reading of inexact Git commands; limit descriptor denial
125
+ - Split separator-joined redirections; read attached printf -v name
126
+ - Strip shell redirections before Git detection; keep alias words
127
+ - Both Windows failures have one cause, and it is a test defect, not a product defect. The fix is one line in `tests/test_member_native.py`; it is not committed. **Cause.** The failing assertion is the second leftover check in `test_next_finish_names_only_the_leftover_sidecar_of_a_landed_member_task` (line 136). The test's `attempt()` helper writes `app.py` with `write_text("v2\n")`, which is `v2\r\n` on Windows, and CI runs with `core.autocrlf=false`, so the landed blob is CRLF. The test then wrote the file back with `write_bytes(b"v2\n")`. On Windows those bytes are not the landed blob, so the driver correctly gave no "remove its leftover isolate" stop and reported `landed`, and the test raised `KeyError: 'reason'`. **Invariant.** A test that puts a "landed" file back must write the same bytes that were landed, on every platform. This was the only place in the branch's new tests that broke it: the sibling leftover tests in `test_dispatch_driver.py` and `test_isolation.py` pass on Windows. **Fix.** The restore now uses the same `write_text("v2\n", encoding="utf-8")` call as `attempt()`. No product code changed, so no generated copies needed a sync. **Verification (macOS only; no Windows run was possible here).** - `python3 -m unittest tests.test_member_native`: 6 tests pass. - With `Path.write_text` patched to write CRLF for `app.py` (to emulate Windows), the original test fails with the same `KeyError: 'reason'` at line 136, and the fixed test passes
128
+ - Read redirections and Git context names as the shell does
129
+ - list a part as retired only when dropped; document it
130
+ - record each retired part of a fix-task Verify
131
+ - retire copied Verify in fix tasks; restore _task_deps
132
+ - Prefer exact criterion quote; join any-indent sub-bullets
133
+ - give the leftover-isolate stop only after a content check
134
+ - Cause: both Windows checks fail in one test only, `test_gsd_path_text_in_a_path_does_not_make_a_worktree_path_owned` (18 subtest failures = 6 targets x 3 pipeline states). The test put a native path, not quoted, into a Bash command. On Windows the path has backslashes, Bash word splitting removes them (`C:\Users\x` becomes `C:Usersx`), and the guard correctly answers "needs a literal target". The guard code is correct; the test was not cross-platform. Invariant: a test that puts a filesystem path into a shell command must quote it, so the guard sees the same path on each OS. Fix (tests/test_guard_hook.py only, no change to scripts/guard_hook.py): - The two commands in the failing test now use `shlex.quote(str(target))`, the convention the file already uses in other tests. - Same edit at the two sibling sites in `test_forced_worktree_remove_checks_registered_path_and_owner` (`{task_worktree}`, `{managed}`). They passed on Windows only because `assert_denied` accepts any denial reason, so they did not test ownership there. - No other unquoted path interpolation into a `worktree remove` command exists in tests/test_guard_hook.py, tests/test_guard_hook_windows.py or tests/test_git_guard.py. Verification: the two changed tests pass locally on macOS (2 tests, OK). A check with `shlex.split` on a sample Windows path shows the unquoted form loses the backslashes and the quoted form keeps them. Not verified: an actual Windows run; that needs the next CI run. The full test suite was not run, because only two test methods changed. Changes are in the working tree, not committed
135
+ - restore the exact-heading repair marker test method
136
+ - align plan gate supersedes with runtime; trim reviewer rule
137
+ - match em-dash criteria in review_findings; correct placeholder message
138
+ - leave landed repair waves out of unreviewed_waves
139
+ - scope guard built-ins and worktree ownership correctly
140
+ - void wave reviews on any review_panel line change
141
+ - Cause: the PR's new test `test_validate_refuses_a_default_branch_that_cannot_be_recorded` (tests/test_members.py) wrote a MEMBERS.md row with `Checkout: /x`. On Windows `/x` is not an absolute path, so `members.py validate` stopped at the earlier check (`Checkout must be absolute`) and never reached the `Default branch` check. All 3 subtests failed on both Windows jobs (3.9 and 3.12, shard 2). The product code is correct. Invariant: a test row that targets one validation rule must be valid for every earlier rule on every OS. Sites checked in the changed area: - `test_validate_refuses_a_default_branch_that_cannot_be_recorded`: violated, fixed. - `repeated default branch` case in `test_validate_refuses_malformed_members_file` (also added by this PR, also uses `/x`): holds. It asserts only `MEMBERS.md` in stderr and passed on Windows. Not changed. Fix (1 line, test only): the row now uses `Checkout: {self.root / 'web'}`, which is absolute on each OS. This is the same pattern as the existing row at tests/test_members.py:190. Verification (macOS, local): - `python3 -m unittest tests.test_members -k default_branch`: 6 tests, OK. - Mutation check: with the `valid_default_branch` check in scripts/members.py disabled, the test fails with `failures=3`. The mutation was reverted; only tests/test_members.py is changed. - Not run on Windows locally. The Windows result depends on the next CI run. The change is not committed. The test-writer and ponytail skills were not invoked for this one-line test edit
142
+ - drop dash from cap value class, allow cost caps
143
+ - compare Config as raw text except cap values
144
+ - accept member-create rerun on row without default branch
145
+ - All 4 failing checks have one cause: the two new tests `test_land_staging_failure_reports_git_stderr` and `test_checkpoint_staging_failure_reports_git_stderr` in `tests/test_isolation.py` ("IsolationError not raised"). The fix is a test-only change in the helper `refuse_crlf_staging`; the product code is correct and is not changed. Root cause: the helper made `git add` fail with repository config `core.autocrlf=input` + `core.safecrlf=true`. The CI test runner (`scripts/dev/py.mjs`) sets `core.autocrlf=false` through `GIT_CONFIG_*` environment variables, and the environment overrides repository config. Thus on CI git did no CRLF conversion, `git add` passed, and no error was raised. The tests passed with plain `python3 -m unittest`, which is why the failure was not seen before the push. This is not an OS or git-version problem (Linux and Windows failed the same way). Invariant: a test that needs `git add` to fail must not depend on a git setting that the test runner overrides. The helper is the one shared boundary; only these two tests use it. No other test in this change sets `core.autocrlf`. Fix: the helper now writes `* text eol=lf` to `.git/info/attributes` (an attribute overrides `core.autocrlf`, and the file is outside the work tree, so it adds no pending path) and keeps `core.safecrlf=true`. The assertions are unchanged: they still require the error to end with git's stderr ("CRLF would be replaced by LF") and HEAD to stay at the base. Verification: - Reproduced the CI failure locally through `node scripts/dev/py.mjs` before the fix (2 failures). - After the fix the two tests pass through `node scripts/dev/py.mjs`, with plain `python3`, and with `core.autocrlf=true` forced through the environment. - Full `tests/test_isolation.py` through the CI runner: 155 tests, 1 failure. That failure is `RecoverTests.test_serial_task_recovers_after_only_project_bookkeeping_commits` (blocked subtest: verdict 'none', expected 'reconcile'). It also fails when run alone, it does not use the changed helper, the test and the recover code are not in this PR's diff, and CI reported only the two staging tests as failures. I did not change it. It looks like a local-environment difference (local git is 2.54, CI is 2.55), but I did not find its cause. Not run: the full repository suite and the Windows jobs (CI owns those)
146
+ - identify replaced-review repairs by history, not name
147
+ - split cap lines like the Config parser
148
+ - state Codex native hook needs trust in README
149
+ - keep cap lines with comment markers under Config guard
150
+ - correct canonical-file rule in CONTRIBUTING.md
151
+ - journal recovery_reviews so resumed approvals report dropped reviews
14
152
  ## [1.5.0] - 2026-10-09
15
153
 
16
154
  ### Added
package/DOCS.md CHANGED
@@ -36,6 +36,7 @@ DOCS.md (here) four journeys in one place
36
36
  | **Team** — pin skills in repo | `--local` install; see [Installing](#installing) |
37
37
  | **Shipping broke** — archive commit blocked | [HOOKS.md](HOOKS.md) (expected with hooks) |
38
38
  | **Several repos** — one milestone changes them all | [Multi-repo milestones](README.md#multi-repo-milestones) |
39
+ | **Several people** — one project | [Working with more than one person](FULL.md#working-with-more-than-one-person) |
39
40
 
40
41
  ---
41
42
 
@@ -101,9 +102,9 @@ README's Windows notes). **Always** restart the agent session after install.
101
102
 
102
103
  Full roots and invocation table: [README.md](README.md#install-summary).
103
104
 
104
- **Python installer:** `scripts/install.py` supports global and `--local`
105
- installs plus `--update`. The Node CLI remains the interactive wizard and npm
106
- entry point.
105
+ **Python installer:** `scripts/install.py`; see
106
+ [README.md](README.md#install-summary) for what it supports. The Node CLI
107
+ remains the interactive wizard and npm entry point.
107
108
  Help: `node scripts/install.mjs --help`
108
109
 
109
110
  ---
package/FULL.md CHANGED
@@ -8,7 +8,8 @@ Complete walkthrough from install to shipped milestone.
8
8
 
9
9
  **Contents:** [What it is](#what-gsd-path-is) · [Installation](#installation) ·
10
10
  [Starting a milestone](#starting-a-milestone) · [Phases](#phases-and-your-role) ·
11
- [Shipping](#shipping) · [Resume](#resume-and-recovery) · [Troubleshooting](#troubleshooting)
11
+ [Shipping](#shipping) · [Resume](#resume-and-recovery) ·
12
+ [More than one person](#working-with-more-than-one-person) · [Troubleshooting](#troubleshooting)
12
13
 
13
14
  **Related docs**
14
15
 
@@ -86,8 +87,8 @@ Use the [router and phase invocation table](README.md#install-summary) for your
86
87
  - **Python 3.9+** found as `python3`, `python`, or `py -3`; required for project
87
88
  installs, project refresh, and project-state
88
89
  doctor checks; optional for global-only Node installs. `scripts/install.py`
89
- mirrors global and `--local` install transactions and `--update`; it does not
90
- provide the interactive wizard
90
+ does not provide the interactive wizard; see
91
+ [README.md](README.md#install-summary) for what it supports
91
92
 
92
93
  ### Global install (default)
93
94
 
@@ -328,7 +329,11 @@ approve **Archive and ship**, the archive transaction begins:
328
329
 
329
330
  Direct integration is the project default. Before build, ask the router to set
330
331
  `pull-request` as the project default or as an override for the current
331
- milestone. The setting locks when build starts.
332
+ milestone. The setting locks when build starts. When origin is not GitHub.com
333
+ and `main` accepts merge requests only, set `external-landing`: Path publishes
334
+ the milestone branch, you merge it in your own forge with the merge message
335
+ that Path returns, and Path then validates the merge and tags it. See
336
+ [integration](WORKFLOW.md#integration).
332
337
 
333
338
  After `validate-integrated` passes, the next milestone starts clean on a new
334
339
  `gsd-path/M00N` cut from `origin/main`. Invoke the router again; brownfield
@@ -407,6 +412,61 @@ in force; see [the collection helper](scripts/isolation.py).
407
412
 
408
413
  ---
409
414
 
415
+ ## Working with more than one person
416
+
417
+ One operator drives a milestone. One checkout holds the bound branch
418
+ `gsd-path/M00N` and the `.project/` state of that milestone. A multi-repo
419
+ milestone does not change this: one coordinator checkout holds the state.
420
+
421
+ GSD Path does not record or check who approves a gate. The `STATE.md` log
422
+ keeps the date, the phase, and the event. The only name is the Git author of a
423
+ checkpoint commit, and GSD Path does not read it. Agree in your team who
424
+ approves.
425
+
426
+ **Supported**
427
+
428
+ - One person runs the router and approves the gates, in one checkout.
429
+ - Other people review and merge the result. Set `pull-request` integration
430
+ before build. Path opens the pull request and waits until a GitHub user
431
+ account merges it with a merge commit. Path does not check which user. With
432
+ `external-landing`, the review is the merge request in your own forge.
433
+ - A second session in the same checkout can ask for status and can run the
434
+ discussion skill. Status only reads. The discussion helper takes a lock and
435
+ only appends records.
436
+ - The desktop app and the monitor only read a watched project in the
437
+ background. Their explicit actions change install and configuration files.
438
+ They cannot advance a phase. See [daemon/README.md](daemon/README.md).
439
+
440
+ **Not protected**
441
+
442
+ - The locks are file locks on one computer, in one clone. They put helper
443
+ calls in sequence: state changes, approvals, discussion records, and
444
+ dispatch driver calls. A state change from an old view fails with
445
+ `expected state does not match`. A second dispatch driver call returns
446
+ `blocked`.
447
+ - The locks do not cover the files that agents write: the artifacts in
448
+ `.project/` and the product files. Two sessions that do phase work in one
449
+ checkout write to the same working tree.
450
+ - The locks do not reach a second clone. Each clone keeps its own `STATE.md`,
451
+ task landings, and approvals. GSD Path does not merge them. Ship stops
452
+ (`moved or collides`) when `origin` already has `gsd-path/M00N` from another
453
+ clone.
454
+ - You cannot share a milestone in progress through the remote. With
455
+ [guard hooks](HOOKS.md) installed, the pre-push hook refuses `gsd-path/M00N`
456
+ before its ship commit. It also refuses any other branch that carries the
457
+ unfinished state. Hooks are optional and local to each clone. A clone
458
+ without hooks has no such check.
459
+
460
+ **Do not**
461
+
462
+ - Do not run the router or a phase skill for one milestone from two clones, or
463
+ from two sessions at the same time.
464
+ - Do not push `gsd-path/M00N` by hand, and do not merge another branch into
465
+ it.
466
+ - Do not squash or rebase the integration pull request or merge request.
467
+
468
+ ---
469
+
410
470
  ## Standalone docs audit
411
471
 
412
472
  `/gsd-path-docs-audit` runs between phases as a drift check. Findings get
package/HOOKS.md CHANGED
@@ -77,6 +77,29 @@ setups (Husky and friends) and linked worktrees (where `.git` is a file).
77
77
  Every selected host requires an initialized repository with a resolvable hooks
78
78
  directory; otherwise installation stops before writing.
79
79
 
80
+ ### Existing Git hooks
81
+
82
+ A repository can already have its own `pre-commit`, `commit-msg`, or `pre-push`
83
+ hook.
84
+
85
+ - **In the repository's own `.git/hooks`:** the installer keeps your hook as
86
+ `<hook>.gsd-path-chained` and writes the guard hook in its place. The guard
87
+ runs first. Your hook runs after it, with the same arguments and the same
88
+ `pre-push` input, only when the guard accepts. If the installation fails,
89
+ your hook is put back unchanged.
90
+ - **In a `core.hooksPath` directory (for example Husky) or a linked worktree:**
91
+ the installer stops with `cannot chain` and changes nothing. That directory
92
+ can be tracked or shared, so a rename there reaches other clones. Rename your
93
+ hook to `<hook>.gsd-path-chained` yourself, then rerun the installer. Commit
94
+ the rename when the directory is tracked.
95
+ - **`<hook>.gsd-path-chained` already exists beside a foreign hook:** the
96
+ installer stops. Decide which of the two files you want to keep.
97
+
98
+ Git hooks are local to a clone. A bot that merges on the server, such as
99
+ Renovate, never runs them, and its commits on the default branch do not
100
+ disturb milestone validation. A merge request can still conflict when the bot
101
+ and the milestone change the same file; Path does not resolve that conflict.
102
+
80
103
  Git hooks work for **any** agent that commits. Native guard wiring denies a tool
81
104
  call when its event is malformed or the guard cannot validate it.
82
105
 
@@ -128,9 +151,46 @@ See [UPDATE.md](UPDATE.md).
128
151
  the archive tree; shell operands count an ancestor only for deletion or move
129
152
  commands
130
153
  - `git reset --hard`, destructive `git clean` modes, force pushes (including
131
- `+` refspecs), destructive branch or ref deletion, `git branch -m`,
132
- `git worktree remove --force`, `git stash drop`/`clear`, and whole-tree
154
+ `+` refspecs), `git branch -m`, `git stash drop`/`clear`, and whole-tree
133
155
  `git checkout -- .`/`git restore .`
156
+ - forced branch deletion (`git branch -D`), `git update-ref` deletion, and
157
+ `git worktree remove --force` when the target is Path-owned: a `gsd-path/`,
158
+ `gsd-path-task/`, `gsd-path-verify/`, or `gsd-path-integrate/` branch, a
159
+ `refs/gsd-path/` ref, the bound `STATE.branch`, a task branch or worktree
160
+ that task frontmatter records, a worktree on one of these branches, and a
161
+ worktree below a managed worktree root (`~/.gsd-path`,
162
+ `GSD_PATH_WORKTREE_ROOT`, a pinned workspace root, or the earlier
163
+ `<repo>.gsd-path/` and `.<repo>-gsd-path-integrate-*` locations beside the
164
+ repository). The text `gsd-path` in a path does not make a worktree
165
+ Path-owned. Also Path-owned: the remote-tracking ref of one of these
166
+ branches (`origin/gsd-path/M001`), `refs/stash`, and a name that differs
167
+ from a recorded branch only in letter case. Other branches, refs, and
168
+ registered worktrees are allowed in each pipeline state. These three
169
+ commands are also denied when the guard cannot prove the target: a missing,
170
+ non-literal, or unregistered target, a shell parameter in the Git command
171
+ (`git -C "$dir" branch -D x`), a `~` or glob in a Git option value,
172
+ `update-ref --stdin`, an `update-ref` name outside `refs/` (`HEAD`) or an
173
+ option cluster (`-dm`), an `update-ref` deletion without `--no-deref` after
174
+ another Git command in the same command line, ownership metadata it cannot
175
+ read, a working directory that does not exist yet, or an `env` wrapper that
176
+ resets or unsets `HOME`, `XDG_CONFIG_HOME`, or a `GIT_*` variable. They are
177
+ denied too after a directory change the guard cannot model. Only
178
+ `cd <directory>` or `cd -- <directory>` is modeled, with one literal
179
+ directory that is absolute or starts with `./` or `../` (a shell with
180
+ `CDPATH` looks for a plain relative name in other directories). Another
181
+ command name (`pushd`, `chdir`), an option, a second operand, a redirection,
182
+ a `cd` in a subshell, pipeline, condition, function, alias, trap, or
183
+ comment line is not modeled. Use `git -C <directory>` there. A plain
184
+ redirection on the Git command (`2>/dev/null`, `>file`, `>>file`, `<file`,
185
+ `2>&1`, `&>file`) is not a target. A here-document, here-string, process
186
+ substitution, a redirection target that is not one literal word, or a
187
+ `# comment` after the command keeps the denial. So does a file
188
+ descriptor word of more than one digit or a `{name}` word against a
189
+ redirection (`10>file`, `{fd}>file`), because bash and zsh read that word
190
+ differently. With
191
+ such an `env` wrapper, or in a directory that does not exist yet, a Git
192
+ command that is not a built-in command is denied too, because its alias
193
+ cannot be inspected
134
194
  - shell writes (redirections, `tee`, `cp`, `mv`, `rm`, `sed -i`, ...) that
135
195
  target a routing control (`.git`, `.project/STATE.md`, `.project/next`,
136
196
  `.gsd-path`) while `.project/STATE.md` exists, or target a product file
@@ -366,6 +426,7 @@ not intercept subagent tools — treat coverage as orchestrator-level.
366
426
  | `ship:` commit blocked with `app.py` staged | Ship commits may only touch `.project/` |
367
427
  | Tool denied editing archive | Pre-tool guard — use active paths, not archive |
368
428
  | Hook not running in Cursor | Run `--hooks-refresh-full --cursor --project /path/to/repo` |
429
+ | Installer stops with `cannot chain` | See [existing Git hooks](#existing-git-hooks): rename your hook to `<hook>.gsd-path-chained`, or remove the stale chained file, then rerun |
369
430
  | `--hooks-refresh` rejects an unmanaged guard | Move the foreign guard aside, then rerun refresh; use `--hooks-init` if guards are wanted |
370
431
  | Runtime missing, invalid, or legacy | Follow [runtime restoration or migration](DOCS.md#project-runtime-versions) |
371
432
 
package/MIGRATE.md CHANGED
@@ -10,6 +10,18 @@ selected project. Core history stays in `.planning/`; Path creates its own
10
10
  `.project/` state through the normal router. Core phase positions and completed
11
11
  plans do not become passed Path gates.
12
12
 
13
+ ## Requirements
14
+
15
+ - The default branch of `origin` can have any name, for example `master`.
16
+ Path initialization records it in `.project/STATE.md` as `default_branch`
17
+ and ships onto it. Run `git remote set-head origin --auto` before the first
18
+ Path run: an unset `origin/HEAD` records `main`. See
19
+ [default branch](WORKFLOW.md#default-branch).
20
+ - Pull-request shipping supports GitHub.com only. On GitLab, Gitea, or GitHub
21
+ Enterprise Server, ship with `direct`, or with
22
+ [`external-landing`](WORKFLOW.md#integration) when the default branch
23
+ accepts merge requests only.
24
+
13
25
  ## Start
14
26
 
15
27
  Install or update GSD Path using [the install guide](QUICK.md). In the Core
package/QUICK.md CHANGED
@@ -13,8 +13,10 @@
13
13
  One router skill drives a gated pipeline: inspect → define → research → decide →
14
14
  plan → build → ship. Every handoff lives in `.project/` so any session can resume from disk.
15
15
 
16
- **Hosts:** Codex, Claude Code, Grok, OpenCode, Copilot CLI, Qwen, Antigravity,
17
- Cursor, Zed, Kiro, Kimi Code, Muse Code.
16
+ **Hosts:** Codex, Claude Code, Grok, OpenCode, Antigravity, Cursor, and Kimi
17
+ Code have a passing live milestone for release 1.6.0. Copilot CLI, Qwen, Zed,
18
+ Kiro, and Muse Code install, but have no live milestone for that release. See
19
+ [host tiers](README.md).
18
20
 
19
21
  ---
20
22
 
package/README.md CHANGED
@@ -9,21 +9,29 @@ milestone loop. While a milestone builds, the next one can be planned in
9
9
  parallel under `.project/next/` (lookahead); a building milestone can also be
10
10
  abandoned on an explicit ruling, archiving its partial work for a re-slice.
11
11
 
12
- **Supported hosts:** Codex, Claude Code, Grok, OpenCode, GitHub Copilot CLI,
13
- Qwen Code, Antigravity CLI, Cursor, Zed, Kiro, Kimi Code, and Muse Code.
14
- Support means the installer and dispatch contract exist. See the
15
- [host trust matrix](https://github.com/open-gsd/gsd-path/blob/main/docs/trust-validation/HOST-MATRIX.md) for live milestone
16
- proof and each host's guard tier.
12
+ **Hosts with a passing full live milestone for release 1.6.0:** Codex, Claude
13
+ Code, Grok, OpenCode, Antigravity CLI, Cursor, and Kimi Code.
14
+
15
+ **Hosts with an installer and a dispatch contract, but no live milestone for
16
+ release 1.6.0:** GitHub Copilot CLI (account quota exhausted), Qwen Code, Zed,
17
+ and Kiro (API credits), and Muse Code (no live release evidence recorded yet).
18
+ These hosts are excluded from the release evaluation. Exclusion is not a pass.
19
+
20
+ With guard hooks installed, only Claude Code and Cursor get a fail-closed
21
+ native guard; every other host relies on Git hooks. The installer also writes a
22
+ native Codex hook, and it runs only after you trust it (see [HOOKS.md](HOOKS.md)).
23
+ The [host trust matrix](https://github.com/open-gsd/gsd-path/blob/main/docs/trust-validation/HOST-MATRIX.md)
24
+ is the source of truth for live milestone proof and each host's guard tier.
17
25
 
18
26
  <!-- release-docs -->
19
- **Latest npm release:** [@opengsd/gsd-path@1.5.0](https://www.npmjs.com/package/@opengsd/gsd-path/v/1.5.0) — [release notes](CHANGELOG.md#150---2026-10-09)
27
+ **Latest npm release:** [@opengsd/gsd-path@1.6.0](https://www.npmjs.com/package/@opengsd/gsd-path/v/1.6.0) — [release notes](CHANGELOG.md#160---2026-10-12)
20
28
 
21
29
  **Recent highlights**
22
- - record runtime hotfix provenance on the declaration
23
- - add signed self-update
24
- - add the Skills, Stats, Settings, and Environment pages and the setup wizard
25
- - register the hosts, project operation, and env routes
26
- - add project setup operations for the app
30
+ - let a later task supersede an earlier task and retire its Verify
31
+ - document the default branch record of a member
32
+ - member paths read the default branch that MEMBERS.md records
33
+ - record the default branch of a member in MEMBERS.md
34
+ - add --uninstall to the skill installers
27
35
 
28
36
  <!-- /release-docs -->
29
37
 
@@ -120,7 +128,13 @@ contain newer changes.
120
128
 
121
129
  1. Open your project folder in your coding-agent host. Existing repositories
122
130
  need Git; GitHub repository creation and pull-request operations also need
123
- an authenticated GitHub CLI (`gh`).
131
+ an authenticated GitHub CLI (`gh`). The default branch of `origin` can have
132
+ any name: Path records it at initialization and ships onto it. This guide
133
+ calls it `main`; see [default branch](WORKFLOW.md#default-branch).
134
+ Pull-request
135
+ shipping supports GitHub.com only. On GitLab, Gitea, or GitHub Enterprise
136
+ Server, use the [`external-landing` mode](WORKFLOW.md#integration) when
137
+ the default branch accepts merge requests only.
124
138
  2. Start or reload the host session so it discovers the installed skills.
125
139
  3. Invoke `$path` in Codex, or `/path` on slash-command hosts. The router
126
140
  identifies the project and guides you through the required inputs and approvals.
@@ -151,6 +165,25 @@ project settings. Dashboard users can open **Settings → Path settings** for th
151
165
  same shipping, model/effort, and future review-panel controls. See
152
166
  [Path settings](skills/gsd-path/references/config.md) for precedence and locks.
153
167
 
168
+ ### Uninstall
169
+
170
+ ```bash
171
+ npx @opengsd/gsd-path@latest --uninstall --all --dry-run
172
+ npx @opengsd/gsd-path@latest --uninstall --all
173
+ ```
174
+
175
+ `--uninstall` removes the installed GSD Path skills from the selected hosts.
176
+ For Cursor it also removes the GSD Path subagent file. Use host flags instead
177
+ of `--all` to select hosts. For project-local skills, run the command from
178
+ your project directory and add `--local`. `--dry-run` shows each path and
179
+ removes nothing.
180
+
181
+ The command removes only GSD Path skills. It keeps other skills, host
182
+ settings, and `disabled-gsd-skills` backups. It makes no backup: changes that
183
+ you made in a GSD Path skill directory are lost. It does not remove project
184
+ contracts or hooks (`.project/`, `.gsd-path/`, the `AGENTS.md` block, guard
185
+ hooks). See [Uninstall skills](UPDATE.md#uninstall-skills).
186
+
154
187
  ## Desktop app
155
188
 
156
189
  The **OpenGSD Path app** shows your projects without opening each project's
@@ -358,12 +391,30 @@ partial remote/clone/worktree transaction; the default checkout stays clean.
358
391
  One project can change several repositories in the same milestone. The
359
392
  **coordinator** repo holds `.project/` and runs the pipeline; each other repo
360
393
  is a **member** listed in `.project/MEMBERS.md`. A member needs a GitHub.com
361
- `origin` whose default is `main`. See
394
+ `origin`. Its default branch can have any name, and it can differ from the
395
+ default branch of the coordinator and of the other members. See
362
396
  [ADR 0002](docs/adr/0002-multi-repo-coordinator.md) for the design.
363
397
 
398
+ `MEMBERS.md` has one section per member, in ship order. `members.py` writes
399
+ it; do not edit it by hand:
400
+
401
+ ```markdown
402
+ ## web
403
+ Checkout: /absolute/path/to/web
404
+ Remote: https://github.com/acme/web.git
405
+ Integration: default
406
+ Default branch: master
407
+ ```
408
+
409
+ `Default branch` is the member's default branch on `origin`. `members.py add`
410
+ records it one time, from the member's local `origin/HEAD`; run
411
+ `git remote set-head origin --auto` in the member first. A section without
412
+ the field means `main`. See [default branch](WORKFLOW.md#default-branch).
413
+
364
414
  - Add members at a milestone boundary: ask the router to add an existing repo
365
415
  (`members.py add`) or to create a new one (`members.py add --create`, after
366
- you approve the exact owner, name, visibility, and checkout). For optional
416
+ you approve the exact owner, name, visibility, and checkout; a new
417
+ repository uses `main`). For optional
367
418
  guard hooks, install them in the member with
368
419
  `npx @opengsd/gsd-path@latest --member-of <coordinator> --project <member>`.
369
420
  - The planner gives each member task `repo: <member>`; one task changes one
@@ -438,6 +489,7 @@ node scripts/install.mjs --all --local
438
489
  node scripts/install.mjs --all --project /path/to/project
439
490
  node scripts/install.mjs --update
440
491
  node scripts/install.mjs --all --update --project /path/to/project # refresh .gsd-path/; keeps contracts
492
+ node scripts/install.mjs --uninstall --all --dry-run # preview; removes skills only
441
493
  ```
442
494
 
443
495
  | Flag | User skills root | Invoke |
@@ -457,7 +509,7 @@ OpenCode stable: ask to load and use the `gsd-path` skill.
457
509
  `gsd-path` remains the canonical router name; `path` is its short menu alias.
458
510
  For a single phase, use `$gsd-path-plan` in Codex or `/gsd-path-plan` on slash hosts.
459
511
 
460
- `scripts/install.py` — Python install, including `--local` and `--update`.
512
+ `scripts/install.py` — Python install, including `--local`, `--update`, and `--uninstall`.
461
513
  The Node CLI remains the interactive and npm entry point. See [FULL.md](FULL.md) and
462
514
  [UPDATE.md](UPDATE.md) for `--hooks`, `--hooks-refresh`, `--local`, and host notes.
463
515
 
package/RUNTIME.md CHANGED
@@ -23,7 +23,7 @@ inputs, receipt handling, and entry conditions are owned by the
23
23
  | `gate-plan` | Git HEAD; optional lookahead project directory | Pending discussion, intent coverage, brief paths, and panel configuration checked in order. |
24
24
  | `approve-plan` | Owner approval and `--expected-head <reviewed full SHA>` | Plan gates followed by the existing journaled approval checkpoint. |
25
25
  | `lint-round` | Git HEAD; optional `--project-dir .project/next` | Task brief checks against HEAD, then plan handoff checks. |
26
- | `prepare-task` | `--expected-head <clean base> --task-id <id> --round-size <ready task count>` | Canonical task isolation; serial work also gets a verification sidecar before the primary becomes dirty. |
26
+ | `prepare-task` | `--expected-head <clean base> --task-id <id> --round-size <ready task count>` | Canonical task isolation; serial work also gets a verification sidecar before the primary becomes dirty. A verification sidecar that an earlier `prepare-task` left for the task is retired first only when it is proven untouched: its branch did not move from its creation base on the bound branch, and it has no tracked change and no untracked or gitignored file. Any other sidecar stays, and the command stops with its path and what was found. |
27
27
  | `build-evidence` | `--expected-head <full SHA>` | Canonical landing proof written to `<project-dir>/build/evidence.json` (default: `.project/build/evidence.json`). |
28
28
 
29
29
  Plan approval recovery remains `pipeline_state.py resume-checkpoint`. Pre-Git
@@ -68,7 +68,7 @@ skeptic attempts under `skeptics/`.
68
68
  | `skeptics --repo <root> --wave <N> --cycle <C> --child-command '<cmd>' [--wait <s>] [--child-timeout <s>]` | Step 7 skeptic branch: one read-only skeptic per `skeptic_groups` locator in its own sidecar at the recorded review base, briefed with the criterion, every observation, and the cited tasks verbatim; validate with `review_findings.py`, collect, retire, then rerun the helper. `none` without skeptic groups; `escalate` for structural blockers or the cycle cap. The skeptic files stay uncommitted for the fix-task or ruling checkpoint. |
69
69
  | `fix-tasks --repo <root> --wave <N> --cycle <C>` | Step 7 batching: one fix task per `review_findings.py collect` batch with the failed criteria and observations verbatim, lint-checked; `escalate` for structural blockers, skeptic groups, cycle cap, or all-refuted. |
70
70
  | `complete --repo <root>` | Completion: clean primary at `build/active` (or a crash-left `build/done`), no unfinished wave, the archive-time review cycle check (`discussion_validate.review_cycle_counts`: contiguous cycles, passing last cycle, panel and skeptic artifacts present); `workflow_run.py build-evidence` at HEAD; `pipeline_state.py transition` to `ship/active` with event `build done; final review pending`; checkpoint `build: complete milestone`. |
71
- | `finish --repo <root> --task-id <id>` | Recover first; return a proven landing without repeating Verify, or verify, land, record, and retire one returned task. Without a dispatch record, or when the newest record is settled and its base differs from the task's current in-progress base (a native retry after a driver block), read the primary task's in-progress state; if it lacks a recorded base, use the parallel task isolate's state only if that worktree is authorized. A blocked record at the same base still refuses the retry. A deactivated isolate stays blocked. |
71
+ | `finish --repo <root> --task-id <id>` | Recover first; return a proven landing without repeating Verify, or verify, land, record, and retire one returned task. Without a dispatch record, or when the newest record is settled and its base differs from the task's current in-progress base (a native retry after a driver block), read the primary task's in-progress state; if it lacks a recorded base, use the parallel task isolate's state only if that worktree is authorized. A blocked record at the same base still refuses the retry, except a host-dispatched record (no child command) while the task is still in progress at that base: `finish` may run again after a failed Verify. A deactivated isolate stays blocked. |
72
72
  | `answer --repo <root> --task-id <id> --answer '<text>'` | Append `Orchestrator answer:` to the isolate's task Log; the next `round` redispatches that isolate. |
73
73
  | `status --repo <root>` | Every task's newest dispatch record. |
74
74
 
@@ -95,6 +95,13 @@ For `round`, `review`, `panel`, and `skeptics`, when the child process is gone a
95
95
  unset, the driver rereads that attempt's state and exit receipt before
96
96
  collecting the result or blocking with
97
97
  `child wrapper exited without recording a result`.
98
+ A landing is final when the removal of its isolate fails: the receipt reports
99
+ the task as landed with a `cleanup_warning`, and the next `round` or `finish`
100
+ checks the isolate again. When only a leftover of a landed task's isolate
101
+ remains and it holds nothing that Git does not have, the driver stops with
102
+ `task <id> is landed; remove its leftover isolate: <path>`, changes neither
103
+ STATE nor HEAD, and never deletes the path itself. Every other isolate error
104
+ keeps its recovery block.
98
105
  Review starts from a clean base. A same-cycle retry may dispatch a missing lens
99
106
  at that unchanged base while verified, already-collected review artifacts remain
100
107
  uncommitted. Altered artifacts or unrelated changes block recovery.
@@ -127,7 +134,15 @@ with `another dispatch_driver invocation holds the lock`; wait for the
127
134
  active call to return before retrying. Bookkeeping also blocks if an
128
135
  in-progress primary task has no open dispatch record.
129
136
 
130
- Verify output is saved in `verify.json`. A `verify-record` ledger entry is
137
+ Verify output is saved in `verify.json`. `finish` also runs the Verify of each
138
+ earlier-wave task that shares a file with the task, under the
139
+ [wave loop](skills/gsd-path/references/build-native.md#wave-loop) rule; those
140
+ runs are saved under `regressions` and a failure blocks the landing. A Verify
141
+ that a `supersedes` field retires does not run; it is listed under `retired`. A fix
142
+ task Verify that loses only the copy of a retired Verify has a `retired` entry with
143
+ the key `part` (the superseded task) and the Log entry `orchestrator regression
144
+ Verify of <fix task id>: part of <task id> retired: superseded by <task id>`. A task
145
+ with a `Heavy: yes` regression Verify counts as heavy. A `verify-record` ledger entry is
131
146
  written only when the landing commit's parent equals the recorded task base;
132
147
  a later parallel landing can therefore have no ledger entry.
133
148
 
@@ -174,8 +189,11 @@ through its receipt only when the canonical file matches the saved hash.
174
189
 
175
190
  `fix-tasks` reconciles existing repair tasks and PLAN rows before linting and
176
191
  checkpointing. It creates missing batches in an appended repair wave and
177
- reports new tasks in `created`, reused tasks in `existing`, and batches already
178
- covered by other repair tasks in `carried`. Status `created` includes restored
192
+ reports new tasks in `created`, reused tasks in `existing`, and batches that
193
+ other repair tasks not yet `done` cover in the same repo in `carried`. A member
194
+ batch and its task carry `repo`. A fix task for a finding that repeats after
195
+ its fix landed also depends on that landed fix task, so
196
+ `review_findings.py repair-evidence` can link the two. Status `created` includes restored
179
197
  PLAN rows or pending project bookkeeping; `exists` means nothing was written
180
198
  and no project changes needed a checkpoint. Status `none` means no batches
181
199
  need work; `escalate` leaves the named decisions with build step 7 and the user.
package/UPDATE.md CHANGED
@@ -273,6 +273,41 @@ Unrecognized or foreign `.project/` state is never auto-migrated — the router
273
273
 
274
274
  ---
275
275
 
276
+ ## Uninstall skills
277
+
278
+ ```bash
279
+ npx @opengsd/gsd-path@latest --uninstall --all --dry-run
280
+ npx @opengsd/gsd-path@latest --uninstall --all
281
+ ```
282
+
283
+ From a git clone, use `node scripts/install.mjs` with the same flags.
284
+
285
+ - Select the hosts with host flags or `--all`. A selection is necessary.
286
+ - Add `--local`, from the project directory, for project-local skills.
287
+ - `--dry-run` lists each path and removes nothing. A real run lists each
288
+ removed path.
289
+ - A host that has no GSD Path skills shows `nothing to remove`. This is not an
290
+ error. A second run removes nothing.
291
+
292
+ **Removed:** skill directories that GSD Path owns, and Cursor's
293
+ `agents/gsd-path.md`. A directory is owned when it has a GSD Path name
294
+ (`gsd-path`, `gsd-path-*`, the legacy `ogsd` names, or the `path` alias) and
295
+ contains a `VERSION` file or a `SKILL.md` that names `gsd-path`. The `path`
296
+ alias must also pass the ownership rule in
297
+ [What auto-updates](#what-auto-updates). A directory with a GSD Path name
298
+ that is not owned shows as `kept` and stays in place.
299
+
300
+ **Not removed:** other skills, host settings, `disabled-gsd-skills` backups,
301
+ and all project files: `.project/`, `.gsd-path/`, the `AGENTS.md` block, and
302
+ guard hooks. `--uninstall` with `--project`, `--update`, `--doctor`, or a hook
303
+ or runtime flag stops with an error.
304
+
305
+ Removal makes no backup. Changes that you made in a GSD Path skill directory
306
+ are lost. Codex, Zed, and Muse use one skills root (with `--local`, also
307
+ Antigravity): an uninstall for one of them removes the skills for all of them.
308
+
309
+ ---
310
+
276
311
  ## Troubleshooting
277
312
 
278
313
  | Symptom | Fix |