@opengsd/gsd-path 1.3.1 → 1.4.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 (434) hide show
  1. package/AGENTS.md +2 -207
  2. package/CHANGELOG.md +281 -0
  3. package/DOCS.md +13 -7
  4. package/FULL.md +9 -3
  5. package/GUIDE.md +1 -1
  6. package/HOOKS.md +9 -6
  7. package/QUICK.md +4 -1
  8. package/README.md +63 -11
  9. package/RUNTIME.md +1 -1
  10. package/UPDATE.md +57 -8
  11. package/WORKFLOW.md +22 -6
  12. package/package.json +9 -8
  13. package/scripts/_common.py +472 -19
  14. package/scripts/archive_milestone.py +146 -73
  15. package/scripts/bootstrap_repository.py +8 -5
  16. package/scripts/build_recovery.py +4 -1
  17. package/scripts/build_state.py +66 -23
  18. package/scripts/check_docs_audit.py +14 -3
  19. package/scripts/check_handoffs.py +116 -20
  20. package/scripts/check_task_briefs.py +60 -8
  21. package/scripts/check_update.py +2 -2
  22. package/scripts/core_hook_gate.py +10 -1
  23. package/scripts/core_hook_settings.py +11 -4
  24. package/scripts/detect_project.py +345 -15
  25. package/scripts/discussion_records.py +19 -13
  26. package/scripts/discussion_validate.py +66 -21
  27. package/scripts/dispatch_driver.py +111 -26
  28. package/scripts/git_guard.py +116 -29
  29. package/scripts/guard_hook.py +151 -29
  30. package/scripts/install.mjs +54 -38
  31. package/scripts/install.py +562 -41
  32. package/scripts/integration.py +434 -24
  33. package/scripts/isolation.py +1077 -28
  34. package/scripts/lean_verification.py +99 -19
  35. package/scripts/loop_run.py +20 -30
  36. package/scripts/members.py +704 -0
  37. package/scripts/migrate_core.py +2 -2
  38. package/scripts/path_config.py +2 -2
  39. package/scripts/pipeline_diagnose.py +82 -31
  40. package/scripts/pipeline_git.py +61 -22
  41. package/scripts/pipeline_state.py +176 -54
  42. package/scripts/pipeline_undo.py +117 -22
  43. package/scripts/promote_lookahead.py +1 -1
  44. package/scripts/review_panel.py +1 -1
  45. package/scripts/runtime_store.py +35 -9
  46. package/scripts/skill-resources.json +28 -3
  47. package/scripts/state_checkpoint.py +140 -31
  48. package/scripts/state_promote.py +2 -0
  49. package/scripts/status_runtime.py +36 -6
  50. package/scripts/sync_skill_resources.py +8 -7
  51. package/scripts/token_budget.py +12 -8
  52. package/scripts/workflow_run.py +103 -29
  53. package/scripts/worktree_paths.py +18 -8
  54. package/skills/gsd-path/BUILD.md +7 -1
  55. package/skills/gsd-path/DECIDE.md +11 -4
  56. package/skills/gsd-path/DEFINE.md +8 -1
  57. package/skills/gsd-path/DOCS-AUDIT.md +6 -4
  58. package/skills/gsd-path/INSPECT.md +5 -4
  59. package/skills/gsd-path/PLAN.md +7 -1
  60. package/skills/gsd-path/RESEARCH.md +2 -1
  61. package/skills/gsd-path/ROADMAP.md +2 -1
  62. package/skills/gsd-path/SHIP.md +27 -10
  63. package/skills/gsd-path/SKILL.md +45 -1
  64. package/skills/gsd-path/references/build-native.md +47 -14
  65. package/skills/gsd-path/references/codebase-mapper.md +2 -1
  66. package/skills/gsd-path/references/docs-auditor.md +2 -1
  67. package/skills/gsd-path/references/operating-rules.md +214 -0
  68. package/skills/gsd-path/references/planner.md +8 -0
  69. package/skills/gsd-path/references/reviewer-wave.md +3 -1
  70. package/skills/gsd-path/scripts/__pycache__/_common.cpython-312.pyc +0 -0
  71. package/skills/gsd-path/scripts/__pycache__/check_handoffs.cpython-312.pyc +0 -0
  72. package/skills/gsd-path/scripts/_common.py +472 -19
  73. package/skills/gsd-path/scripts/archive_milestone.py +146 -73
  74. package/skills/gsd-path/scripts/bootstrap_repository.py +8 -5
  75. package/skills/gsd-path/scripts/build_recovery.py +4 -1
  76. package/skills/gsd-path/scripts/build_state.py +66 -23
  77. package/skills/gsd-path/scripts/check_docs_audit.py +14 -3
  78. package/skills/gsd-path/scripts/check_handoffs.py +116 -20
  79. package/skills/gsd-path/scripts/check_task_briefs.py +60 -8
  80. package/skills/gsd-path/scripts/check_update.py +2 -2
  81. package/skills/gsd-path/scripts/detect_project.py +345 -15
  82. package/skills/gsd-path/scripts/discussion_records.py +19 -13
  83. package/skills/gsd-path/scripts/discussion_validate.py +66 -21
  84. package/skills/gsd-path/scripts/dispatch_driver.py +111 -26
  85. package/skills/gsd-path/scripts/git_guard.py +116 -29
  86. package/skills/gsd-path/scripts/integration.py +434 -24
  87. package/skills/gsd-path/scripts/isolation.py +1077 -28
  88. package/skills/gsd-path/scripts/lean_verification.py +99 -19
  89. package/skills/gsd-path/scripts/loop_run.py +20 -30
  90. package/skills/gsd-path/scripts/members.py +704 -0
  91. package/skills/gsd-path/scripts/path_config.py +2 -2
  92. package/skills/gsd-path/scripts/pipeline_git.py +61 -22
  93. package/skills/gsd-path/scripts/pipeline_state.py +176 -54
  94. package/skills/gsd-path/scripts/promote_lookahead.py +1 -1
  95. package/skills/gsd-path/scripts/review_panel.py +1 -1
  96. package/skills/gsd-path/scripts/state_checkpoint.py +140 -31
  97. package/skills/gsd-path/scripts/state_promote.py +2 -0
  98. package/skills/gsd-path/scripts/status_runtime.py +36 -6
  99. package/skills/gsd-path/scripts/token_budget.py +12 -8
  100. package/skills/gsd-path/scripts/workflow_run.py +103 -29
  101. package/skills/gsd-path/scripts/worktree_paths.py +18 -8
  102. package/skills/gsd-path/templates/codebase.md +1 -1
  103. package/skills/gsd-path/templates/docs-audit.md +1 -1
  104. package/skills/gsd-path/templates/final-review.md +5 -2
  105. package/skills/gsd-path/templates/gap-review.md +2 -1
  106. package/skills/gsd-path/templates/task.md +1 -0
  107. package/skills/gsd-path/templates/wave-review.md +3 -1
  108. package/skills/gsd-path-build/SKILL.md +7 -1
  109. package/skills/gsd-path-build/references/build-native.md +47 -14
  110. package/skills/gsd-path-build/references/operating-rules.md +214 -0
  111. package/skills/gsd-path-build/references/reviewer-wave.md +3 -1
  112. package/skills/gsd-path-build/scripts/__pycache__/_common.cpython-312.pyc +0 -0
  113. package/skills/gsd-path-build/scripts/__pycache__/check_handoffs.cpython-312.pyc +0 -0
  114. package/skills/gsd-path-build/scripts/_common.py +472 -19
  115. package/skills/gsd-path-build/scripts/archive_milestone.py +146 -73
  116. package/skills/gsd-path-build/scripts/build_recovery.py +4 -1
  117. package/skills/gsd-path-build/scripts/build_state.py +66 -23
  118. package/skills/gsd-path-build/scripts/check_handoffs.py +116 -20
  119. package/skills/gsd-path-build/scripts/check_task_briefs.py +60 -8
  120. package/skills/gsd-path-build/scripts/detect_project.py +345 -15
  121. package/skills/gsd-path-build/scripts/discussion_records.py +19 -13
  122. package/skills/gsd-path-build/scripts/discussion_validate.py +66 -21
  123. package/skills/gsd-path-build/scripts/dispatch_driver.py +111 -26
  124. package/skills/gsd-path-build/scripts/integration.py +434 -24
  125. package/skills/gsd-path-build/scripts/isolation.py +1077 -28
  126. package/skills/gsd-path-build/scripts/loop_run.py +20 -30
  127. package/skills/gsd-path-build/scripts/members.py +704 -0
  128. package/skills/gsd-path-build/scripts/path_config.py +2 -2
  129. package/skills/gsd-path-build/scripts/pipeline_git.py +61 -22
  130. package/skills/gsd-path-build/scripts/pipeline_state.py +176 -54
  131. package/skills/gsd-path-build/scripts/promote_lookahead.py +1 -1
  132. package/skills/gsd-path-build/scripts/review_panel.py +1 -1
  133. package/skills/gsd-path-build/scripts/state_checkpoint.py +140 -31
  134. package/skills/gsd-path-build/scripts/state_promote.py +2 -0
  135. package/skills/gsd-path-build/scripts/token_budget.py +12 -8
  136. package/skills/gsd-path-build/scripts/workflow_run.py +103 -29
  137. package/skills/gsd-path-build/scripts/worktree_paths.py +18 -8
  138. package/skills/gsd-path-build/templates/task.md +1 -0
  139. package/skills/gsd-path-build/templates/wave-review.md +3 -1
  140. package/skills/gsd-path-decide/SKILL.md +11 -4
  141. package/skills/gsd-path-decide/references/operating-rules.md +214 -0
  142. package/skills/gsd-path-decide/scripts/_common.py +472 -19
  143. package/skills/gsd-path-decide/scripts/archive_milestone.py +146 -73
  144. package/skills/gsd-path-decide/scripts/build_recovery.py +4 -1
  145. package/skills/gsd-path-decide/scripts/check_handoffs.py +116 -20
  146. package/skills/gsd-path-decide/scripts/check_task_briefs.py +60 -8
  147. package/skills/gsd-path-decide/scripts/detect_project.py +345 -15
  148. package/skills/gsd-path-decide/scripts/discussion_records.py +19 -13
  149. package/skills/gsd-path-decide/scripts/discussion_validate.py +66 -21
  150. package/skills/gsd-path-decide/scripts/integration.py +434 -24
  151. package/skills/gsd-path-decide/scripts/isolation.py +1077 -28
  152. package/skills/gsd-path-decide/scripts/loop_run.py +20 -30
  153. package/skills/gsd-path-decide/scripts/members.py +704 -0
  154. package/skills/gsd-path-decide/scripts/path_config.py +2 -2
  155. package/skills/gsd-path-decide/scripts/pipeline_git.py +61 -22
  156. package/skills/gsd-path-decide/scripts/pipeline_state.py +176 -54
  157. package/skills/gsd-path-decide/scripts/promote_lookahead.py +1 -1
  158. package/skills/gsd-path-decide/scripts/review_panel.py +1 -1
  159. package/skills/gsd-path-decide/scripts/state_checkpoint.py +140 -31
  160. package/skills/gsd-path-decide/scripts/state_promote.py +2 -0
  161. package/skills/gsd-path-decide/scripts/worktree_paths.py +18 -8
  162. package/skills/gsd-path-define/SKILL.md +8 -1
  163. package/skills/gsd-path-define/references/operating-rules.md +214 -0
  164. package/skills/gsd-path-define/scripts/_common.py +472 -19
  165. package/skills/gsd-path-define/scripts/archive_milestone.py +146 -73
  166. package/skills/gsd-path-define/scripts/build_recovery.py +4 -1
  167. package/skills/gsd-path-define/scripts/check_handoffs.py +116 -20
  168. package/skills/gsd-path-define/scripts/check_task_briefs.py +60 -8
  169. package/skills/gsd-path-define/scripts/detect_project.py +345 -15
  170. package/skills/gsd-path-define/scripts/discussion_records.py +19 -13
  171. package/skills/gsd-path-define/scripts/discussion_validate.py +66 -21
  172. package/skills/gsd-path-define/scripts/integration.py +434 -24
  173. package/skills/gsd-path-define/scripts/isolation.py +1077 -28
  174. package/skills/gsd-path-define/scripts/loop_run.py +20 -30
  175. package/skills/gsd-path-define/scripts/members.py +704 -0
  176. package/skills/gsd-path-define/scripts/path_config.py +2 -2
  177. package/skills/gsd-path-define/scripts/pipeline_git.py +61 -22
  178. package/skills/gsd-path-define/scripts/pipeline_state.py +176 -54
  179. package/skills/gsd-path-define/scripts/promote_lookahead.py +1 -1
  180. package/skills/gsd-path-define/scripts/review_panel.py +1 -1
  181. package/skills/gsd-path-define/scripts/state_checkpoint.py +140 -31
  182. package/skills/gsd-path-define/scripts/state_promote.py +2 -0
  183. package/skills/gsd-path-define/scripts/worktree_paths.py +18 -8
  184. package/skills/gsd-path-discuss/SKILL.md +2 -1
  185. package/skills/gsd-path-discuss/references/operating-rules.md +214 -0
  186. package/skills/gsd-path-discuss/scripts/_common.py +472 -19
  187. package/skills/gsd-path-discuss/scripts/discussion_records.py +19 -13
  188. package/skills/gsd-path-discuss/scripts/loop_run.py +20 -30
  189. package/skills/gsd-path-discuss/scripts/path_config.py +2 -2
  190. package/skills/gsd-path-discuss/scripts/review_panel.py +1 -1
  191. package/skills/gsd-path-discuss/scripts/worktree_paths.py +18 -8
  192. package/skills/gsd-path-docs-audit/SKILL.md +6 -4
  193. package/skills/gsd-path-docs-audit/references/docs-auditor.md +2 -1
  194. package/skills/gsd-path-docs-audit/references/operating-rules.md +214 -0
  195. package/skills/gsd-path-docs-audit/scripts/_common.py +472 -19
  196. package/skills/gsd-path-docs-audit/scripts/archive_milestone.py +146 -73
  197. package/skills/gsd-path-docs-audit/scripts/build_recovery.py +4 -1
  198. package/skills/gsd-path-docs-audit/scripts/check_docs_audit.py +14 -3
  199. package/skills/gsd-path-docs-audit/scripts/check_handoffs.py +116 -20
  200. package/skills/gsd-path-docs-audit/scripts/check_task_briefs.py +60 -8
  201. package/skills/gsd-path-docs-audit/scripts/detect_project.py +345 -15
  202. package/skills/gsd-path-docs-audit/scripts/discussion_records.py +19 -13
  203. package/skills/gsd-path-docs-audit/scripts/discussion_validate.py +66 -21
  204. package/skills/gsd-path-docs-audit/scripts/integration.py +434 -24
  205. package/skills/gsd-path-docs-audit/scripts/isolation.py +1077 -28
  206. package/skills/gsd-path-docs-audit/scripts/loop_run.py +20 -30
  207. package/skills/gsd-path-docs-audit/scripts/members.py +704 -0
  208. package/skills/gsd-path-docs-audit/scripts/path_config.py +2 -2
  209. package/skills/gsd-path-docs-audit/scripts/pipeline_git.py +61 -22
  210. package/skills/gsd-path-docs-audit/scripts/pipeline_state.py +176 -54
  211. package/skills/gsd-path-docs-audit/scripts/promote_lookahead.py +1 -1
  212. package/skills/gsd-path-docs-audit/scripts/review_panel.py +1 -1
  213. package/skills/gsd-path-docs-audit/scripts/state_checkpoint.py +140 -31
  214. package/skills/gsd-path-docs-audit/scripts/state_promote.py +2 -0
  215. package/skills/gsd-path-docs-audit/scripts/worktree_paths.py +18 -8
  216. package/skills/gsd-path-docs-audit/templates/docs-audit.md +1 -1
  217. package/skills/gsd-path-forensics/SKILL.md +2 -1
  218. package/skills/gsd-path-forensics/references/operating-rules.md +214 -0
  219. package/skills/gsd-path-forensics/scripts/_common.py +472 -19
  220. package/skills/gsd-path-forensics/scripts/discussion_records.py +19 -13
  221. package/skills/gsd-path-forensics/scripts/loop_run.py +20 -30
  222. package/skills/gsd-path-forensics/scripts/path_config.py +2 -2
  223. package/skills/gsd-path-forensics/scripts/pipeline_diagnose.py +82 -31
  224. package/skills/gsd-path-forensics/scripts/pipeline_undo.py +117 -22
  225. package/skills/gsd-path-forensics/scripts/review_panel.py +1 -1
  226. package/skills/gsd-path-forensics/scripts/worktree_paths.py +18 -8
  227. package/skills/gsd-path-inspect/SKILL.md +5 -4
  228. package/skills/gsd-path-inspect/references/codebase-mapper.md +2 -1
  229. package/skills/gsd-path-inspect/references/docs-auditor.md +2 -1
  230. package/skills/gsd-path-inspect/references/operating-rules.md +214 -0
  231. package/skills/gsd-path-inspect/scripts/__pycache__/_common.cpython-312.pyc +0 -0
  232. package/skills/gsd-path-inspect/scripts/_common.py +472 -19
  233. package/skills/gsd-path-inspect/scripts/archive_milestone.py +146 -73
  234. package/skills/gsd-path-inspect/scripts/build_recovery.py +4 -1
  235. package/skills/gsd-path-inspect/scripts/check_docs_audit.py +14 -3
  236. package/skills/gsd-path-inspect/scripts/check_handoffs.py +116 -20
  237. package/skills/gsd-path-inspect/scripts/check_task_briefs.py +60 -8
  238. package/skills/gsd-path-inspect/scripts/detect_project.py +345 -15
  239. package/skills/gsd-path-inspect/scripts/discussion_records.py +19 -13
  240. package/skills/gsd-path-inspect/scripts/discussion_validate.py +66 -21
  241. package/skills/gsd-path-inspect/scripts/integration.py +434 -24
  242. package/skills/gsd-path-inspect/scripts/isolation.py +1077 -28
  243. package/skills/gsd-path-inspect/scripts/loop_run.py +20 -30
  244. package/skills/gsd-path-inspect/scripts/members.py +704 -0
  245. package/skills/gsd-path-inspect/scripts/path_config.py +2 -2
  246. package/skills/gsd-path-inspect/scripts/pipeline_git.py +61 -22
  247. package/skills/gsd-path-inspect/scripts/pipeline_state.py +176 -54
  248. package/skills/gsd-path-inspect/scripts/promote_lookahead.py +1 -1
  249. package/skills/gsd-path-inspect/scripts/review_panel.py +1 -1
  250. package/skills/gsd-path-inspect/scripts/state_checkpoint.py +140 -31
  251. package/skills/gsd-path-inspect/scripts/state_promote.py +2 -0
  252. package/skills/gsd-path-inspect/scripts/workflow_run.py +103 -29
  253. package/skills/gsd-path-inspect/scripts/worktree_paths.py +18 -8
  254. package/skills/gsd-path-inspect/templates/codebase.md +1 -1
  255. package/skills/gsd-path-inspect/templates/docs-audit.md +1 -1
  256. package/skills/gsd-path-loop/SKILL.md +2 -1
  257. package/skills/gsd-path-loop/references/operating-rules.md +214 -0
  258. package/skills/gsd-path-loop/scripts/_common.py +472 -19
  259. package/skills/gsd-path-loop/scripts/discussion_records.py +19 -13
  260. package/skills/gsd-path-loop/scripts/loop_run.py +20 -30
  261. package/skills/gsd-path-loop/scripts/path_config.py +2 -2
  262. package/skills/gsd-path-loop/scripts/review_panel.py +1 -1
  263. package/skills/gsd-path-loop/scripts/worktree_paths.py +18 -8
  264. package/skills/gsd-path-migrate/SKILL.md +2 -1
  265. package/skills/gsd-path-migrate/references/operating-rules.md +214 -0
  266. package/skills/gsd-path-migrate/scripts/_common.py +472 -19
  267. package/skills/gsd-path-migrate/scripts/core_hook_gate.py +10 -1
  268. package/skills/gsd-path-migrate/scripts/core_hook_settings.py +11 -4
  269. package/skills/gsd-path-migrate/scripts/discussion_records.py +19 -13
  270. package/skills/gsd-path-migrate/scripts/loop_run.py +20 -30
  271. package/skills/gsd-path-migrate/scripts/migrate_core.py +2 -2
  272. package/skills/gsd-path-migrate/scripts/path_config.py +2 -2
  273. package/skills/gsd-path-migrate/scripts/review_panel.py +1 -1
  274. package/skills/gsd-path-plan/SKILL.md +7 -1
  275. package/skills/gsd-path-plan/references/operating-rules.md +214 -0
  276. package/skills/gsd-path-plan/references/planner.md +8 -0
  277. package/skills/gsd-path-plan/scripts/__pycache__/_common.cpython-312.pyc +0 -0
  278. package/skills/gsd-path-plan/scripts/_common.py +472 -19
  279. package/skills/gsd-path-plan/scripts/archive_milestone.py +146 -73
  280. package/skills/gsd-path-plan/scripts/build_recovery.py +4 -1
  281. package/skills/gsd-path-plan/scripts/check_handoffs.py +116 -20
  282. package/skills/gsd-path-plan/scripts/check_task_briefs.py +60 -8
  283. package/skills/gsd-path-plan/scripts/detect_project.py +345 -15
  284. package/skills/gsd-path-plan/scripts/discussion_records.py +19 -13
  285. package/skills/gsd-path-plan/scripts/discussion_validate.py +66 -21
  286. package/skills/gsd-path-plan/scripts/integration.py +434 -24
  287. package/skills/gsd-path-plan/scripts/isolation.py +1077 -28
  288. package/skills/gsd-path-plan/scripts/loop_run.py +20 -30
  289. package/skills/gsd-path-plan/scripts/members.py +704 -0
  290. package/skills/gsd-path-plan/scripts/path_config.py +2 -2
  291. package/skills/gsd-path-plan/scripts/pipeline_git.py +61 -22
  292. package/skills/gsd-path-plan/scripts/pipeline_state.py +176 -54
  293. package/skills/gsd-path-plan/scripts/promote_lookahead.py +1 -1
  294. package/skills/gsd-path-plan/scripts/review_panel.py +1 -1
  295. package/skills/gsd-path-plan/scripts/state_checkpoint.py +140 -31
  296. package/skills/gsd-path-plan/scripts/state_promote.py +2 -0
  297. package/skills/gsd-path-plan/scripts/workflow_run.py +103 -29
  298. package/skills/gsd-path-plan/scripts/worktree_paths.py +18 -8
  299. package/skills/gsd-path-plan/templates/task.md +1 -0
  300. package/skills/gsd-path-research/SKILL.md +2 -1
  301. package/skills/gsd-path-research/references/operating-rules.md +214 -0
  302. package/skills/gsd-path-research/scripts/_common.py +472 -19
  303. package/skills/gsd-path-research/scripts/archive_milestone.py +146 -73
  304. package/skills/gsd-path-research/scripts/build_recovery.py +4 -1
  305. package/skills/gsd-path-research/scripts/check_handoffs.py +116 -20
  306. package/skills/gsd-path-research/scripts/check_task_briefs.py +60 -8
  307. package/skills/gsd-path-research/scripts/detect_project.py +345 -15
  308. package/skills/gsd-path-research/scripts/discussion_records.py +19 -13
  309. package/skills/gsd-path-research/scripts/discussion_validate.py +66 -21
  310. package/skills/gsd-path-research/scripts/integration.py +434 -24
  311. package/skills/gsd-path-research/scripts/isolation.py +1077 -28
  312. package/skills/gsd-path-research/scripts/loop_run.py +20 -30
  313. package/skills/gsd-path-research/scripts/members.py +704 -0
  314. package/skills/gsd-path-research/scripts/path_config.py +2 -2
  315. package/skills/gsd-path-research/scripts/pipeline_git.py +61 -22
  316. package/skills/gsd-path-research/scripts/pipeline_state.py +176 -54
  317. package/skills/gsd-path-research/scripts/promote_lookahead.py +1 -1
  318. package/skills/gsd-path-research/scripts/review_panel.py +1 -1
  319. package/skills/gsd-path-research/scripts/state_checkpoint.py +140 -31
  320. package/skills/gsd-path-research/scripts/state_promote.py +2 -0
  321. package/skills/gsd-path-research/scripts/worktree_paths.py +18 -8
  322. package/skills/gsd-path-roadmap/SKILL.md +2 -1
  323. package/skills/gsd-path-roadmap/references/operating-rules.md +214 -0
  324. package/skills/gsd-path-roadmap/scripts/_common.py +472 -19
  325. package/skills/gsd-path-roadmap/scripts/archive_milestone.py +146 -73
  326. package/skills/gsd-path-roadmap/scripts/build_recovery.py +4 -1
  327. package/skills/gsd-path-roadmap/scripts/check_handoffs.py +116 -20
  328. package/skills/gsd-path-roadmap/scripts/check_task_briefs.py +60 -8
  329. package/skills/gsd-path-roadmap/scripts/detect_project.py +345 -15
  330. package/skills/gsd-path-roadmap/scripts/discussion_records.py +19 -13
  331. package/skills/gsd-path-roadmap/scripts/discussion_validate.py +66 -21
  332. package/skills/gsd-path-roadmap/scripts/integration.py +434 -24
  333. package/skills/gsd-path-roadmap/scripts/isolation.py +1077 -28
  334. package/skills/gsd-path-roadmap/scripts/loop_run.py +20 -30
  335. package/skills/gsd-path-roadmap/scripts/members.py +704 -0
  336. package/skills/gsd-path-roadmap/scripts/path_config.py +2 -2
  337. package/skills/gsd-path-roadmap/scripts/pipeline_git.py +61 -22
  338. package/skills/gsd-path-roadmap/scripts/pipeline_state.py +176 -54
  339. package/skills/gsd-path-roadmap/scripts/promote_lookahead.py +1 -1
  340. package/skills/gsd-path-roadmap/scripts/review_panel.py +1 -1
  341. package/skills/gsd-path-roadmap/scripts/state_checkpoint.py +140 -31
  342. package/skills/gsd-path-roadmap/scripts/state_promote.py +2 -0
  343. package/skills/gsd-path-roadmap/scripts/worktree_paths.py +18 -8
  344. package/skills/gsd-path-ship/SKILL.md +27 -10
  345. package/skills/gsd-path-ship/references/operating-rules.md +214 -0
  346. package/skills/gsd-path-ship/references/reviewer-wave.md +3 -1
  347. package/skills/gsd-path-ship/scripts/__pycache__/_common.cpython-312.pyc +0 -0
  348. package/skills/gsd-path-ship/scripts/_common.py +472 -19
  349. package/skills/gsd-path-ship/scripts/archive_milestone.py +146 -73
  350. package/skills/gsd-path-ship/scripts/build_recovery.py +4 -1
  351. package/skills/gsd-path-ship/scripts/build_state.py +66 -23
  352. package/skills/gsd-path-ship/scripts/check_handoffs.py +116 -20
  353. package/skills/gsd-path-ship/scripts/check_task_briefs.py +60 -8
  354. package/skills/gsd-path-ship/scripts/detect_project.py +345 -15
  355. package/skills/gsd-path-ship/scripts/discussion_records.py +19 -13
  356. package/skills/gsd-path-ship/scripts/discussion_validate.py +66 -21
  357. package/skills/gsd-path-ship/scripts/integration.py +434 -24
  358. package/skills/gsd-path-ship/scripts/isolation.py +1077 -28
  359. package/skills/gsd-path-ship/scripts/lean_verification.py +99 -19
  360. package/skills/gsd-path-ship/scripts/loop_run.py +20 -30
  361. package/skills/gsd-path-ship/scripts/members.py +704 -0
  362. package/skills/gsd-path-ship/scripts/path_config.py +2 -2
  363. package/skills/gsd-path-ship/scripts/pipeline_git.py +61 -22
  364. package/skills/gsd-path-ship/scripts/pipeline_state.py +176 -54
  365. package/skills/gsd-path-ship/scripts/promote_lookahead.py +1 -1
  366. package/skills/gsd-path-ship/scripts/review_panel.py +1 -1
  367. package/skills/gsd-path-ship/scripts/state_checkpoint.py +140 -31
  368. package/skills/gsd-path-ship/scripts/state_promote.py +2 -0
  369. package/skills/gsd-path-ship/scripts/workflow_run.py +103 -29
  370. package/skills/gsd-path-ship/scripts/worktree_paths.py +18 -8
  371. package/skills/gsd-path-ship/templates/final-review.md +5 -2
  372. package/skills/gsd-path-ship/templates/gap-review.md +2 -1
  373. package/skills/gsd-path-ship/templates/wave-review.md +3 -1
  374. package/skills/gsd-path-undo/SKILL.md +2 -1
  375. package/skills/gsd-path-undo/references/operating-rules.md +214 -0
  376. package/skills/gsd-path-undo/scripts/_common.py +472 -19
  377. package/skills/gsd-path-undo/scripts/discussion_records.py +19 -13
  378. package/skills/gsd-path-undo/scripts/loop_run.py +20 -30
  379. package/skills/gsd-path-undo/scripts/path_config.py +2 -2
  380. package/skills/gsd-path-undo/scripts/pipeline_undo.py +117 -22
  381. package/skills/gsd-path-undo/scripts/review_panel.py +1 -1
  382. package/skills/gsd-path-undo/scripts/worktree_paths.py +18 -8
  383. package/skills/path/BUILD.md +7 -1
  384. package/skills/path/DECIDE.md +11 -4
  385. package/skills/path/DEFINE.md +8 -1
  386. package/skills/path/DOCS-AUDIT.md +6 -4
  387. package/skills/path/INSPECT.md +5 -4
  388. package/skills/path/PLAN.md +7 -1
  389. package/skills/path/RESEARCH.md +2 -1
  390. package/skills/path/ROADMAP.md +2 -1
  391. package/skills/path/SHIP.md +27 -10
  392. package/skills/path/SKILL.md +45 -1
  393. package/skills/path/references/build-native.md +47 -14
  394. package/skills/path/references/codebase-mapper.md +2 -1
  395. package/skills/path/references/docs-auditor.md +2 -1
  396. package/skills/path/references/operating-rules.md +214 -0
  397. package/skills/path/references/planner.md +8 -0
  398. package/skills/path/references/reviewer-wave.md +3 -1
  399. package/skills/path/scripts/_common.py +472 -19
  400. package/skills/path/scripts/archive_milestone.py +146 -73
  401. package/skills/path/scripts/bootstrap_repository.py +8 -5
  402. package/skills/path/scripts/build_recovery.py +4 -1
  403. package/skills/path/scripts/build_state.py +66 -23
  404. package/skills/path/scripts/check_docs_audit.py +14 -3
  405. package/skills/path/scripts/check_handoffs.py +116 -20
  406. package/skills/path/scripts/check_task_briefs.py +60 -8
  407. package/skills/path/scripts/check_update.py +2 -2
  408. package/skills/path/scripts/detect_project.py +345 -15
  409. package/skills/path/scripts/discussion_records.py +19 -13
  410. package/skills/path/scripts/discussion_validate.py +66 -21
  411. package/skills/path/scripts/dispatch_driver.py +111 -26
  412. package/skills/path/scripts/git_guard.py +116 -29
  413. package/skills/path/scripts/integration.py +434 -24
  414. package/skills/path/scripts/isolation.py +1077 -28
  415. package/skills/path/scripts/lean_verification.py +99 -19
  416. package/skills/path/scripts/loop_run.py +20 -30
  417. package/skills/path/scripts/members.py +704 -0
  418. package/skills/path/scripts/path_config.py +2 -2
  419. package/skills/path/scripts/pipeline_git.py +61 -22
  420. package/skills/path/scripts/pipeline_state.py +176 -54
  421. package/skills/path/scripts/promote_lookahead.py +1 -1
  422. package/skills/path/scripts/review_panel.py +1 -1
  423. package/skills/path/scripts/state_checkpoint.py +140 -31
  424. package/skills/path/scripts/state_promote.py +2 -0
  425. package/skills/path/scripts/status_runtime.py +36 -6
  426. package/skills/path/scripts/token_budget.py +12 -8
  427. package/skills/path/scripts/workflow_run.py +103 -29
  428. package/skills/path/scripts/worktree_paths.py +18 -8
  429. package/skills/path/templates/codebase.md +1 -1
  430. package/skills/path/templates/docs-audit.md +1 -1
  431. package/skills/path/templates/final-review.md +5 -2
  432. package/skills/path/templates/gap-review.md +2 -1
  433. package/skills/path/templates/task.md +1 -0
  434. package/skills/path/templates/wave-review.md +3 -1
@@ -22,8 +22,8 @@ else:
22
22
 
23
23
 
24
24
  def _git(repo, *arguments):
25
- return subprocess.run(["git", "-C", str(repo), *arguments],
26
- capture_output=True, text=True, check=True).stdout.strip()
25
+ return subprocess.run(["git", "-C", str(repo), *arguments], capture_output=True,
26
+ encoding="utf-8", errors="surrogateescape", check=True).stdout.strip()
27
27
 
28
28
 
29
29
  def _reusable_wave(repo, expected_head):
@@ -71,7 +71,25 @@ def _reusable_wave(repo, expected_head):
71
71
  return relative, text, criteria, reviewed
72
72
 
73
73
 
74
- def _final_view(relative, text, criteria, reviewed, head):
74
+ def _surface_name(value, expected):
75
+ """The surface a wave review's Surface field names, without the reviewer's detail.
76
+
77
+ Reviewers write the PLAN surface name and often a note after it
78
+ ("count.py CLI — entry `python count.py`, run from the root"). Keep exactly
79
+ the expected name when the field starts with it and the detail is set off by
80
+ a comma, dash, colon, semicolon, or parenthesis; otherwise keep the text before
81
+ the first comma, which FINAL.md validation then compares with the plan.
82
+ """
83
+ named = " ".join(contracts._unquoted(value).split())
84
+ if expected:
85
+ name = " ".join(expected.split())
86
+ rest = named[len(name):] if named.casefold().startswith(name.casefold()) else None
87
+ if rest is not None and (not rest or re.match(r"\s*[,;:(]|\s+[—–-]\s", rest)):
88
+ return expected
89
+ return named.partition(",")[0]
90
+
91
+
92
+ def _final_view(relative, text, criteria, reviewed, head, surfaces=None):
75
93
  coverage = contracts._section(text, "Intent coverage")
76
94
  headings = list(re.finditer(r"(?m)^### (SC[1-9]\d*) — (.+): pass\s*$", coverage))
77
95
  blocks = {}
@@ -96,22 +114,32 @@ def _final_view(relative, text, criteria, reviewed, head):
96
114
  f"- **Reference**: {relative} — {criterion}",
97
115
  "- **Finding**: none", "- **Fix direction**: none"]
98
116
  if "Surface" in fields:
99
- lines.append(f"- **Surface**: {contracts._unquoted(fields['Surface']).partition(',')[0]}")
117
+ expected = (surfaces or {}).get(criterion)
118
+ lines.append(f"- **Surface**: {_surface_name(fields['Surface'], expected)}")
100
119
  lines.append("")
101
120
  return "\n".join(lines)
102
121
 
103
122
 
123
+ def _locked_members(repo):
124
+ lock = repo / ".project/build/members.json"
125
+ return json.loads(lock.read_text(encoding="utf-8"))["members"] if lock.is_file() else []
126
+
127
+
104
128
  def reuse_final(repo, expected_head):
105
129
  """Materialize a final view only when the existing proof still covers it."""
106
130
  repo = Path(repo).resolve()
107
131
  try:
132
+ # Wave reviews name only the coordinator head, so a member milestone needs its own final review.
133
+ if _locked_members(repo):
134
+ raise contracts.HandoffError("member milestone needs a final review of the member heads")
108
135
  relative, text, criteria, reviewed = _reusable_wave(repo, expected_head)
109
- final = _final_view(relative, text, criteria, reviewed, expected_head)
136
+ final = _final_view(relative, text, criteria, reviewed, expected_head,
137
+ contracts.criterion_surfaces(repo))
110
138
  contracts.validate_final(repo, final_text=final)
111
139
  destination = repo / ".project/review/FINAL.md"
112
140
  if destination.is_symlink():
113
141
  raise contracts.HandoffError("FINAL.md must be a real file")
114
- if destination.exists() and destination.read_text() != final:
142
+ if destination.exists() and destination.read_text(encoding="utf-8") != final:
115
143
  raise contracts.HandoffError("existing final evidence needs explicit reconciliation")
116
144
  if not destination.exists():
117
145
  _common.atomic_write(destination, final)
@@ -123,9 +151,36 @@ def reuse_final(repo, expected_head):
123
151
 
124
152
  def _gap_view(command, head, execution, waves):
125
153
  passed = execution["exit_code"] == 0
154
+ members = execution.get("members")
155
+ output = ""
156
+ if members:
157
+ observed = "exact stdout and stderr are in the Output section; member heads are not in the ledger key"
158
+ reference = "project Verify at " + head + " with members " + ", ".join(
159
+ f"{name} {tip}" for name, tip in members.items())
160
+ stdout, stderr = execution["stdout"], execution["stderr"]
161
+ fence = "`" * max([3] + [len(run) + 1 for run in re.findall(r"`+", stdout + "\n" + stderr)])
162
+ stdout_end = "" if not stdout or stdout.endswith("\n") else "\n"
163
+ stderr_end = "" if not stderr or stderr.endswith("\n") else "\n"
164
+ output = f"""
165
+
166
+ ## Output
167
+
168
+ ### stdout
169
+
170
+ {fence}
171
+ {stdout}{stdout_end}{fence}
172
+
173
+ ### stderr
174
+
175
+ {fence}
176
+ {stderr}{stderr_end}{fence}"""
177
+ else:
178
+ members = {}
179
+ observed = "exact stdout and stderr are in the command/commit ledger entry"
180
+ reference = f".project/build/verify-ledger.jsonl — {head}, command above"
126
181
  return f"""# Gap Review — 1: project Verify
127
182
 
128
- Reviewed HEAD: {head}
183
+ Reviewed HEAD: {head}{"".join(f"{chr(10)}Member reviewed HEAD: {name} {tip}" for name, tip in members.items())}
129
184
  Gap verdict: {'pass' if passed else 'blocked'}
130
185
  Risk: project Verify
131
186
  Waves checked: {', '.join(str(wave) for wave in waves)}
@@ -133,13 +188,13 @@ Waves checked: {', '.join(str(wave) for wave in waves)}
133
188
  ## Checked evidence
134
189
 
135
190
  - **Check**: `{command}`
136
- - **Observed**: Exit {execution['exit_code']}; exact stdout and stderr are in the command/commit ledger entry.
137
- - **Reference**: .project/build/verify-ledger.jsonl — {head}, command above
191
+ - **Observed**: Exit {execution['exit_code']}; {observed}.
192
+ - **Reference**: {reference}
138
193
 
139
194
  ## Finding
140
195
 
141
196
  - **Found**: Project Verify {'passed' if passed else 'failed'} at the reviewed commit.
142
- - **Fix direction**: {'none' if passed else 'Resolve the recorded command failure before shipping.'}
197
+ - **Fix direction**: {'none' if passed else 'Resolve the recorded command failure before shipping.'}{output}
143
198
  """
144
199
 
145
200
 
@@ -147,8 +202,11 @@ def _require_ship_inputs(repo, expected_head):
147
202
  contracts._require_state(repo, "ship", "active", ".project")
148
203
  if _git(repo, "rev-parse", "HEAD") != expected_head:
149
204
  raise contracts.HandoffError("primary HEAD changed")
205
+ isolation.prune_host_scratch(repo / ".project")
206
+ # Ignored, untracked entries (.DS_Store) never ship, so they are not artifacts.
207
+ visible = _common.git_visible_entries(repo / ".project")
150
208
  unexpected = sorted(path.name for path in (repo / ".project").iterdir()
151
- if path.name not in isolation.PROJECT_ENTRIES)
209
+ if path.name not in isolation.PROJECT_ENTRIES and path.name in visible)
152
210
  if unexpected:
153
211
  raise contracts.HandoffError("unsupported .project artifacts: " + ", ".join(unexpected))
154
212
  dirty = isolation.uncommitted_paths(repo)
@@ -176,8 +234,11 @@ def verify_project(repo, expected_head):
176
234
  plan = contracts._read(repo, ".project/plan/PLAN.md")
177
235
  command = contracts._line_value(plan, "Project verify:")
178
236
  _, waves = contracts._plan_waves(plan)
179
- lookup = build_state.verify_lookup(str(repo), command, expected_head)
180
- entry = lookup["entry"]
237
+ # Member heads are not in the ledger key, so a member milestone always runs again.
238
+ members = _locked_members(repo)
239
+ if members:
240
+ isolation.check_member_verify_collision(members, "project-verify")
241
+ entry = None if members else build_state.verify_lookup(str(repo), command, expected_head)["entry"]
181
242
  relative = ".project/review/final-gap-1.md"
182
243
  destination = repo / relative
183
244
  if destination.is_symlink():
@@ -199,19 +260,38 @@ def verify_project(repo, expected_head):
199
260
  )
200
261
  _retire_execution(repo, expected_head, execution)
201
262
  view = _gap_view(command, expected_head, execution, waves)
202
- if not destination.exists() or destination.read_text() != view:
263
+ if not destination.exists() or destination.read_text(encoding="utf-8") != view:
203
264
  _common.atomic_write(destination, view)
204
265
  return {"passed": entry["result"] == "pass", "reused": True,
205
266
  "path": str(destination), "execution": execution}
206
267
  sidecar = isolation.isolate_verify(repo, expected_head, "project-verify")
207
268
  worktree = Path(sidecar["worktree"])
208
- completed = subprocess.run(["bash", "-c", command], cwd=worktree,
209
- text=True, capture_output=True)
269
+ try:
270
+ sidecars = isolation.isolate_member_verify(repo, worktree) if members else None
271
+ except BaseException:
272
+ isolation.retire(repo, worktree, sidecar["branch"], force=False)
273
+ raise
274
+ try:
275
+ try:
276
+ completed = subprocess.run(_common.bash_argv(command), cwd=worktree,
277
+ encoding="utf-8", errors="replace", capture_output=True)
278
+ if sidecars:
279
+ isolation.check_member_verify(sidecars)
280
+ finally:
281
+ if sidecars:
282
+ isolation.retire_member_verify(sidecars)
283
+ except BaseException:
284
+ isolation.clean_verify(repo, worktree, expected_head, sidecar["branch"])
285
+ isolation.retire(repo, worktree, sidecar["branch"], force=False)
286
+ raise
210
287
  execution = {"exit_code": completed.returncode, "stdout": completed.stdout,
211
288
  "stderr": completed.stderr, "worktree": str(worktree), "branch": sidecar["branch"]}
212
289
  passed = completed.returncode == 0
213
- build_state.verify_record(str(repo), command, expected_head,
214
- "pass" if passed else "fail", execution=execution)
290
+ if members:
291
+ execution["members"] = {name: record["tip"] for name, record in sidecars.items()}
292
+ else:
293
+ build_state.verify_record(str(repo), command, expected_head,
294
+ "pass" if passed else "fail", execution=execution)
215
295
  isolation.clean_verify(repo, worktree, expected_head, sidecar["branch"])
216
296
  _common.atomic_write(worktree / relative, _gap_view(command, expected_head, execution, waves))
217
297
  collection = isolation.collect_artifact(repo, worktree, expected_head, sidecar["branch"],
@@ -227,7 +307,7 @@ def prepare_final(repo, expected_head):
227
307
  return {"status": "blocked", "verification": verification,
228
308
  "reason": "project Verify failed; use its recorded output"}
229
309
  final = reuse_final(repo, expected_head)
230
- if not final["reused"] and (Path(repo) / ".project/review/FINAL.md").exists():
310
+ if not _locked_members(Path(repo)) and not final["reused"] and (Path(repo) / ".project/review/FINAL.md").exists():
231
311
  try:
232
312
  valid = contracts.validate_final(Path(repo))
233
313
  if valid["verdict"] == "pass":
@@ -32,10 +32,10 @@ from datetime import datetime, timedelta, timezone
32
32
  from pathlib import Path
33
33
  from typing import Iterator, Optional, Sequence
34
34
 
35
- if sys.platform == "win32":
36
- import msvcrt
37
- else:
38
- import fcntl
35
+ try:
36
+ from . import _common
37
+ except ImportError:
38
+ import _common
39
39
 
40
40
 
41
41
  class LoopError(RuntimeError):
@@ -119,25 +119,8 @@ def log_path(fields: dict) -> Path:
119
119
  def log_lock(fields: dict) -> Iterator[None]:
120
120
  path = log_path(fields)
121
121
  path.parent.mkdir(parents=True, exist_ok=True)
122
- lock_path = path.with_name(f".{path.name}.lock")
123
- with lock_path.open("a+b") as handle:
124
- if sys.platform == "win32":
125
- handle.seek(0, os.SEEK_END)
126
- if handle.tell() == 0:
127
- handle.write(b"\0")
128
- handle.flush()
129
- handle.seek(0)
130
- msvcrt.locking(handle.fileno(), msvcrt.LK_LOCK, 1)
131
- else:
132
- fcntl.flock(handle.fileno(), fcntl.LOCK_EX)
133
- try:
134
- yield
135
- finally:
136
- if sys.platform == "win32":
137
- handle.seek(0)
138
- msvcrt.locking(handle.fileno(), msvcrt.LK_UNLCK, 1)
139
- else:
140
- fcntl.flock(handle.fileno(), fcntl.LOCK_UN)
122
+ with _common.exclusive_lock(path.with_name(f".{path.name}.lock")):
123
+ yield
141
124
 
142
125
 
143
126
  def load_log(fields: dict) -> list[dict]:
@@ -528,15 +511,22 @@ def command_claim(fields: dict) -> dict:
528
511
 
529
512
 
530
513
  def run_shell(command: str, timeout: float) -> tuple[Optional[int], str]:
531
- """Run one spec command; a hung command counts as failed (exit None)."""
514
+ """Run one spec command; a hung command counts as failed (exit None).
515
+
516
+ POSIX runs /bin/sh as shell=True did; Windows runs Git for Windows bash, not
517
+ cmd.exe. A timeout kills the whole process group, so a grandchild cannot
518
+ keep the output pipes open.
519
+ """
520
+ argv = _common.bash_argv(command) if os.name == "nt" else ["/bin/sh", "-c", command]
521
+ process = _common.popen_group(argv, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
532
522
  try:
533
- completed = subprocess.run(
534
- command, shell=True, capture_output=True, text=True, check=False, timeout=timeout
535
- )
536
- except subprocess.TimeoutExpired as expired:
537
- output = (expired.stdout or b"").decode(errors="replace") + (expired.stderr or b"").decode(errors="replace")
523
+ stdout, stderr = process.communicate(timeout=timeout)
524
+ except subprocess.TimeoutExpired:
525
+ _common.kill_tree(process)
526
+ stdout, stderr = process.communicate()
527
+ output = stdout.decode("utf-8", errors="replace") + stderr.decode("utf-8", errors="replace")
538
528
  return None, f"{output}\ntimed out at the admitted wall-clock deadline"
539
- return completed.returncode, completed.stdout + completed.stderr
529
+ return process.returncode, (stdout + stderr).decode("utf-8", errors="replace")
540
530
 
541
531
 
542
532
  def command_verify(fields: dict, claim_identifier: Optional[str]) -> dict: