@opengsd/gsd-path 1.4.0 → 1.5.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 (347) hide show
  1. package/CHANGELOG.md +325 -344
  2. package/DOCS.md +12 -2
  3. package/FULL.md +3 -2
  4. package/HOOKS.md +95 -8
  5. package/QUICK.md +1 -1
  6. package/README.md +78 -110
  7. package/RUNTIME.md +1 -1
  8. package/UPDATE.md +4 -3
  9. package/WORKFLOW.md +22 -1
  10. package/package.json +5 -2
  11. package/platforms/shared-agents/dispatch.md +13 -0
  12. package/scripts/_common.py +149 -1
  13. package/scripts/archive_milestone.py +14 -13
  14. package/scripts/build_recovery.py +96 -31
  15. package/scripts/build_state.py +79 -3
  16. package/scripts/check_docs_audit.py +77 -4
  17. package/scripts/check_handoffs.py +546 -30
  18. package/scripts/check_task_briefs.py +279 -23
  19. package/scripts/detect_project.py +243 -18
  20. package/scripts/discussion_validate.py +86 -29
  21. package/scripts/dispatch_driver.py +392 -22
  22. package/scripts/git_guard.py +3 -3
  23. package/scripts/guard_hook.py +1416 -165
  24. package/scripts/install.mjs +23 -8
  25. package/scripts/install.py +49 -9
  26. package/scripts/integration.py +146 -1
  27. package/scripts/isolation.py +392 -60
  28. package/scripts/loop_run.py +16 -4
  29. package/scripts/members.py +11 -9
  30. package/scripts/path_config.py +3 -3
  31. package/scripts/pipeline_git.py +63 -12
  32. package/scripts/pipeline_state.py +111 -33
  33. package/scripts/pipeline_undo.py +101 -8
  34. package/scripts/runtime_store.py +20 -2
  35. package/scripts/skill-resources.json +9 -2
  36. package/scripts/state_checkpoint.py +9 -27
  37. package/scripts/status_runtime.py +22 -4
  38. package/scripts/task_context.py +12 -3
  39. package/scripts/wizard.mjs +1 -0
  40. package/scripts/workflow_run.py +5 -2
  41. package/scripts/worktree_paths.py +54 -2
  42. package/skills/gsd-path/DEFINE.md +28 -3
  43. package/skills/gsd-path/PLAN.md +11 -3
  44. package/skills/gsd-path/RESEARCH.md +11 -0
  45. package/skills/gsd-path/SHIP.md +6 -1
  46. package/skills/gsd-path/references/build-native.md +16 -1
  47. package/skills/gsd-path/references/dispatch.md +13 -0
  48. package/skills/gsd-path/references/docs-auditor.md +5 -0
  49. package/skills/gsd-path/references/planner.md +14 -4
  50. package/skills/gsd-path/references/reviewer-final.md +20 -2
  51. package/skills/gsd-path/references/reviewer-wave.md +15 -4
  52. package/skills/gsd-path/references/reviewer.md +3 -1
  53. package/skills/gsd-path/references/spec-probes.md +150 -0
  54. package/skills/gsd-path/scripts/_common.py +149 -1
  55. package/skills/gsd-path/scripts/archive_milestone.py +14 -13
  56. package/skills/gsd-path/scripts/build_recovery.py +96 -31
  57. package/skills/gsd-path/scripts/build_state.py +79 -3
  58. package/skills/gsd-path/scripts/check_docs_audit.py +77 -4
  59. package/skills/gsd-path/scripts/check_handoffs.py +546 -30
  60. package/skills/gsd-path/scripts/check_task_briefs.py +279 -23
  61. package/skills/gsd-path/scripts/detect_project.py +243 -18
  62. package/skills/gsd-path/scripts/discussion_validate.py +86 -29
  63. package/skills/gsd-path/scripts/dispatch_driver.py +392 -22
  64. package/skills/gsd-path/scripts/git_guard.py +3 -3
  65. package/skills/gsd-path/scripts/integration.py +146 -1
  66. package/skills/gsd-path/scripts/isolation.py +392 -60
  67. package/skills/gsd-path/scripts/loop_run.py +16 -4
  68. package/skills/gsd-path/scripts/members.py +11 -9
  69. package/skills/gsd-path/scripts/path_config.py +3 -3
  70. package/skills/gsd-path/scripts/pipeline_git.py +63 -12
  71. package/skills/gsd-path/scripts/pipeline_state.py +111 -33
  72. package/skills/gsd-path/scripts/state_checkpoint.py +9 -27
  73. package/skills/gsd-path/scripts/status_runtime.py +22 -4
  74. package/skills/gsd-path/scripts/task_context.py +12 -3
  75. package/skills/gsd-path/scripts/workflow_run.py +5 -2
  76. package/skills/gsd-path/scripts/worktree_paths.py +54 -2
  77. package/skills/gsd-path/templates/docs-audit.md +5 -1
  78. package/skills/gsd-path/templates/final-review.md +11 -2
  79. package/skills/gsd-path/templates/intent.md +30 -0
  80. package/skills/gsd-path/templates/patch-findings.md +3 -3
  81. package/skills/gsd-path/templates/plan.md +17 -2
  82. package/skills/gsd-path/templates/research-handoff.md +14 -3
  83. package/skills/gsd-path/templates/state.md +1 -1
  84. package/skills/gsd-path/templates/wave-review.md +16 -6
  85. package/skills/gsd-path-build/references/build-native.md +16 -1
  86. package/skills/gsd-path-build/references/dispatch.md +13 -0
  87. package/skills/gsd-path-build/references/reviewer-final.md +20 -2
  88. package/skills/gsd-path-build/references/reviewer-wave.md +15 -4
  89. package/skills/gsd-path-build/references/reviewer.md +3 -1
  90. package/skills/gsd-path-build/references/spec-probes.md +150 -0
  91. package/skills/gsd-path-build/scripts/_common.py +149 -1
  92. package/skills/gsd-path-build/scripts/archive_milestone.py +14 -13
  93. package/skills/gsd-path-build/scripts/build_recovery.py +96 -31
  94. package/skills/gsd-path-build/scripts/build_state.py +79 -3
  95. package/skills/gsd-path-build/scripts/check_handoffs.py +546 -30
  96. package/skills/gsd-path-build/scripts/check_task_briefs.py +279 -23
  97. package/skills/gsd-path-build/scripts/detect_project.py +243 -18
  98. package/skills/gsd-path-build/scripts/discussion_validate.py +86 -29
  99. package/skills/gsd-path-build/scripts/dispatch_driver.py +392 -22
  100. package/skills/gsd-path-build/scripts/integration.py +146 -1
  101. package/skills/gsd-path-build/scripts/isolation.py +392 -60
  102. package/skills/gsd-path-build/scripts/loop_run.py +16 -4
  103. package/skills/gsd-path-build/scripts/members.py +11 -9
  104. package/skills/gsd-path-build/scripts/path_config.py +3 -3
  105. package/skills/gsd-path-build/scripts/pipeline_git.py +63 -12
  106. package/skills/gsd-path-build/scripts/pipeline_state.py +111 -33
  107. package/skills/gsd-path-build/scripts/state_checkpoint.py +9 -27
  108. package/skills/gsd-path-build/scripts/task_context.py +12 -3
  109. package/skills/gsd-path-build/scripts/workflow_run.py +5 -2
  110. package/skills/gsd-path-build/scripts/worktree_paths.py +54 -2
  111. package/skills/gsd-path-build/templates/wave-review.md +16 -6
  112. package/skills/gsd-path-decide/references/dispatch.md +13 -0
  113. package/skills/gsd-path-decide/scripts/_common.py +149 -1
  114. package/skills/gsd-path-decide/scripts/archive_milestone.py +14 -13
  115. package/skills/gsd-path-decide/scripts/build_recovery.py +96 -31
  116. package/skills/gsd-path-decide/scripts/check_handoffs.py +546 -30
  117. package/skills/gsd-path-decide/scripts/check_task_briefs.py +279 -23
  118. package/skills/gsd-path-decide/scripts/detect_project.py +243 -18
  119. package/skills/gsd-path-decide/scripts/discussion_validate.py +86 -29
  120. package/skills/gsd-path-decide/scripts/integration.py +146 -1
  121. package/skills/gsd-path-decide/scripts/isolation.py +392 -60
  122. package/skills/gsd-path-decide/scripts/loop_run.py +16 -4
  123. package/skills/gsd-path-decide/scripts/members.py +11 -9
  124. package/skills/gsd-path-decide/scripts/path_config.py +3 -3
  125. package/skills/gsd-path-decide/scripts/pipeline_git.py +63 -12
  126. package/skills/gsd-path-decide/scripts/pipeline_state.py +111 -33
  127. package/skills/gsd-path-decide/scripts/state_checkpoint.py +9 -27
  128. package/skills/gsd-path-decide/scripts/worktree_paths.py +54 -2
  129. package/skills/gsd-path-define/SKILL.md +28 -3
  130. package/skills/gsd-path-define/references/spec-probes.md +150 -0
  131. package/skills/gsd-path-define/scripts/_common.py +149 -1
  132. package/skills/gsd-path-define/scripts/archive_milestone.py +14 -13
  133. package/skills/gsd-path-define/scripts/build_recovery.py +96 -31
  134. package/skills/gsd-path-define/scripts/check_handoffs.py +546 -30
  135. package/skills/gsd-path-define/scripts/check_task_briefs.py +279 -23
  136. package/skills/gsd-path-define/scripts/detect_project.py +243 -18
  137. package/skills/gsd-path-define/scripts/discussion_validate.py +86 -29
  138. package/skills/gsd-path-define/scripts/integration.py +146 -1
  139. package/skills/gsd-path-define/scripts/isolation.py +392 -60
  140. package/skills/gsd-path-define/scripts/loop_run.py +16 -4
  141. package/skills/gsd-path-define/scripts/members.py +11 -9
  142. package/skills/gsd-path-define/scripts/path_config.py +3 -3
  143. package/skills/gsd-path-define/scripts/pipeline_git.py +63 -12
  144. package/skills/gsd-path-define/scripts/pipeline_state.py +111 -33
  145. package/skills/gsd-path-define/scripts/state_checkpoint.py +9 -27
  146. package/skills/gsd-path-define/scripts/worktree_paths.py +54 -2
  147. package/skills/gsd-path-define/templates/intent.md +30 -0
  148. package/skills/gsd-path-define/templates/state.md +1 -1
  149. package/skills/gsd-path-discuss/scripts/_common.py +149 -1
  150. package/skills/gsd-path-discuss/scripts/loop_run.py +16 -4
  151. package/skills/gsd-path-discuss/scripts/path_config.py +3 -3
  152. package/skills/gsd-path-discuss/scripts/worktree_paths.py +54 -2
  153. package/skills/gsd-path-docs-audit/references/dispatch.md +13 -0
  154. package/skills/gsd-path-docs-audit/references/docs-auditor.md +5 -0
  155. package/skills/gsd-path-docs-audit/scripts/_common.py +149 -1
  156. package/skills/gsd-path-docs-audit/scripts/archive_milestone.py +14 -13
  157. package/skills/gsd-path-docs-audit/scripts/build_recovery.py +96 -31
  158. package/skills/gsd-path-docs-audit/scripts/check_docs_audit.py +77 -4
  159. package/skills/gsd-path-docs-audit/scripts/check_handoffs.py +546 -30
  160. package/skills/gsd-path-docs-audit/scripts/check_task_briefs.py +279 -23
  161. package/skills/gsd-path-docs-audit/scripts/detect_project.py +243 -18
  162. package/skills/gsd-path-docs-audit/scripts/discussion_validate.py +86 -29
  163. package/skills/gsd-path-docs-audit/scripts/integration.py +146 -1
  164. package/skills/gsd-path-docs-audit/scripts/isolation.py +392 -60
  165. package/skills/gsd-path-docs-audit/scripts/loop_run.py +16 -4
  166. package/skills/gsd-path-docs-audit/scripts/members.py +11 -9
  167. package/skills/gsd-path-docs-audit/scripts/path_config.py +3 -3
  168. package/skills/gsd-path-docs-audit/scripts/pipeline_git.py +63 -12
  169. package/skills/gsd-path-docs-audit/scripts/pipeline_state.py +111 -33
  170. package/skills/gsd-path-docs-audit/scripts/state_checkpoint.py +9 -27
  171. package/skills/gsd-path-docs-audit/scripts/worktree_paths.py +54 -2
  172. package/skills/gsd-path-docs-audit/templates/docs-audit.md +5 -1
  173. package/skills/gsd-path-forensics/scripts/_common.py +149 -1
  174. package/skills/gsd-path-forensics/scripts/loop_run.py +16 -4
  175. package/skills/gsd-path-forensics/scripts/path_config.py +3 -3
  176. package/skills/gsd-path-forensics/scripts/pipeline_undo.py +101 -8
  177. package/skills/gsd-path-forensics/scripts/worktree_paths.py +54 -2
  178. package/skills/gsd-path-inspect/references/dispatch.md +13 -0
  179. package/skills/gsd-path-inspect/references/docs-auditor.md +5 -0
  180. package/skills/gsd-path-inspect/scripts/_common.py +149 -1
  181. package/skills/gsd-path-inspect/scripts/archive_milestone.py +14 -13
  182. package/skills/gsd-path-inspect/scripts/build_recovery.py +96 -31
  183. package/skills/gsd-path-inspect/scripts/check_docs_audit.py +77 -4
  184. package/skills/gsd-path-inspect/scripts/check_handoffs.py +546 -30
  185. package/skills/gsd-path-inspect/scripts/check_task_briefs.py +279 -23
  186. package/skills/gsd-path-inspect/scripts/detect_project.py +243 -18
  187. package/skills/gsd-path-inspect/scripts/discussion_validate.py +86 -29
  188. package/skills/gsd-path-inspect/scripts/integration.py +146 -1
  189. package/skills/gsd-path-inspect/scripts/isolation.py +392 -60
  190. package/skills/gsd-path-inspect/scripts/loop_run.py +16 -4
  191. package/skills/gsd-path-inspect/scripts/members.py +11 -9
  192. package/skills/gsd-path-inspect/scripts/path_config.py +3 -3
  193. package/skills/gsd-path-inspect/scripts/pipeline_git.py +63 -12
  194. package/skills/gsd-path-inspect/scripts/pipeline_state.py +111 -33
  195. package/skills/gsd-path-inspect/scripts/state_checkpoint.py +9 -27
  196. package/skills/gsd-path-inspect/scripts/workflow_run.py +5 -2
  197. package/skills/gsd-path-inspect/scripts/worktree_paths.py +54 -2
  198. package/skills/gsd-path-inspect/templates/docs-audit.md +5 -1
  199. package/skills/gsd-path-inspect/templates/state.md +1 -1
  200. package/skills/gsd-path-loop/scripts/_common.py +149 -1
  201. package/skills/gsd-path-loop/scripts/loop_run.py +16 -4
  202. package/skills/gsd-path-loop/scripts/path_config.py +3 -3
  203. package/skills/gsd-path-loop/scripts/worktree_paths.py +54 -2
  204. package/skills/gsd-path-migrate/scripts/_common.py +149 -1
  205. package/skills/gsd-path-migrate/scripts/loop_run.py +16 -4
  206. package/skills/gsd-path-migrate/scripts/path_config.py +3 -3
  207. package/skills/gsd-path-plan/SKILL.md +11 -3
  208. package/skills/gsd-path-plan/references/dispatch.md +13 -0
  209. package/skills/gsd-path-plan/references/planner.md +14 -4
  210. package/skills/gsd-path-plan/references/spec-probes.md +150 -0
  211. package/skills/gsd-path-plan/scripts/_common.py +149 -1
  212. package/skills/gsd-path-plan/scripts/archive_milestone.py +14 -13
  213. package/skills/gsd-path-plan/scripts/build_recovery.py +96 -31
  214. package/skills/gsd-path-plan/scripts/check_handoffs.py +546 -30
  215. package/skills/gsd-path-plan/scripts/check_task_briefs.py +279 -23
  216. package/skills/gsd-path-plan/scripts/detect_project.py +243 -18
  217. package/skills/gsd-path-plan/scripts/discussion_validate.py +86 -29
  218. package/skills/gsd-path-plan/scripts/integration.py +146 -1
  219. package/skills/gsd-path-plan/scripts/isolation.py +392 -60
  220. package/skills/gsd-path-plan/scripts/loop_run.py +16 -4
  221. package/skills/gsd-path-plan/scripts/members.py +11 -9
  222. package/skills/gsd-path-plan/scripts/path_config.py +3 -3
  223. package/skills/gsd-path-plan/scripts/pipeline_git.py +63 -12
  224. package/skills/gsd-path-plan/scripts/pipeline_state.py +111 -33
  225. package/skills/gsd-path-plan/scripts/state_checkpoint.py +9 -27
  226. package/skills/gsd-path-plan/scripts/workflow_run.py +5 -2
  227. package/skills/gsd-path-plan/scripts/worktree_paths.py +54 -2
  228. package/skills/gsd-path-plan/templates/patch-findings.md +3 -3
  229. package/skills/gsd-path-plan/templates/plan.md +17 -2
  230. package/skills/gsd-path-research/SKILL.md +11 -0
  231. package/skills/gsd-path-research/references/dispatch.md +13 -0
  232. package/skills/gsd-path-research/scripts/_common.py +149 -1
  233. package/skills/gsd-path-research/scripts/archive_milestone.py +14 -13
  234. package/skills/gsd-path-research/scripts/build_recovery.py +96 -31
  235. package/skills/gsd-path-research/scripts/check_handoffs.py +546 -30
  236. package/skills/gsd-path-research/scripts/check_task_briefs.py +279 -23
  237. package/skills/gsd-path-research/scripts/detect_project.py +243 -18
  238. package/skills/gsd-path-research/scripts/discussion_validate.py +86 -29
  239. package/skills/gsd-path-research/scripts/integration.py +146 -1
  240. package/skills/gsd-path-research/scripts/isolation.py +392 -60
  241. package/skills/gsd-path-research/scripts/loop_run.py +16 -4
  242. package/skills/gsd-path-research/scripts/members.py +11 -9
  243. package/skills/gsd-path-research/scripts/path_config.py +3 -3
  244. package/skills/gsd-path-research/scripts/pipeline_git.py +63 -12
  245. package/skills/gsd-path-research/scripts/pipeline_state.py +111 -33
  246. package/skills/gsd-path-research/scripts/state_checkpoint.py +9 -27
  247. package/skills/gsd-path-research/scripts/worktree_paths.py +54 -2
  248. package/skills/gsd-path-research/templates/research-handoff.md +14 -3
  249. package/skills/gsd-path-roadmap/references/dispatch.md +13 -0
  250. package/skills/gsd-path-roadmap/scripts/_common.py +149 -1
  251. package/skills/gsd-path-roadmap/scripts/archive_milestone.py +14 -13
  252. package/skills/gsd-path-roadmap/scripts/build_recovery.py +96 -31
  253. package/skills/gsd-path-roadmap/scripts/check_handoffs.py +546 -30
  254. package/skills/gsd-path-roadmap/scripts/check_task_briefs.py +279 -23
  255. package/skills/gsd-path-roadmap/scripts/detect_project.py +243 -18
  256. package/skills/gsd-path-roadmap/scripts/discussion_validate.py +86 -29
  257. package/skills/gsd-path-roadmap/scripts/integration.py +146 -1
  258. package/skills/gsd-path-roadmap/scripts/isolation.py +392 -60
  259. package/skills/gsd-path-roadmap/scripts/loop_run.py +16 -4
  260. package/skills/gsd-path-roadmap/scripts/members.py +11 -9
  261. package/skills/gsd-path-roadmap/scripts/path_config.py +3 -3
  262. package/skills/gsd-path-roadmap/scripts/pipeline_git.py +63 -12
  263. package/skills/gsd-path-roadmap/scripts/pipeline_state.py +111 -33
  264. package/skills/gsd-path-roadmap/scripts/state_checkpoint.py +9 -27
  265. package/skills/gsd-path-roadmap/scripts/worktree_paths.py +54 -2
  266. package/skills/gsd-path-ship/SKILL.md +6 -1
  267. package/skills/gsd-path-ship/references/dispatch.md +13 -0
  268. package/skills/gsd-path-ship/references/reviewer-final.md +20 -2
  269. package/skills/gsd-path-ship/references/reviewer-wave.md +15 -4
  270. package/skills/gsd-path-ship/references/reviewer.md +3 -1
  271. package/skills/gsd-path-ship/references/spec-probes.md +150 -0
  272. package/skills/gsd-path-ship/scripts/_common.py +149 -1
  273. package/skills/gsd-path-ship/scripts/archive_milestone.py +14 -13
  274. package/skills/gsd-path-ship/scripts/build_recovery.py +96 -31
  275. package/skills/gsd-path-ship/scripts/build_state.py +79 -3
  276. package/skills/gsd-path-ship/scripts/check_handoffs.py +546 -30
  277. package/skills/gsd-path-ship/scripts/check_task_briefs.py +279 -23
  278. package/skills/gsd-path-ship/scripts/detect_project.py +243 -18
  279. package/skills/gsd-path-ship/scripts/discussion_validate.py +86 -29
  280. package/skills/gsd-path-ship/scripts/integration.py +146 -1
  281. package/skills/gsd-path-ship/scripts/isolation.py +392 -60
  282. package/skills/gsd-path-ship/scripts/loop_run.py +16 -4
  283. package/skills/gsd-path-ship/scripts/members.py +11 -9
  284. package/skills/gsd-path-ship/scripts/path_config.py +3 -3
  285. package/skills/gsd-path-ship/scripts/pipeline_git.py +63 -12
  286. package/skills/gsd-path-ship/scripts/pipeline_state.py +111 -33
  287. package/skills/gsd-path-ship/scripts/state_checkpoint.py +9 -27
  288. package/skills/gsd-path-ship/scripts/workflow_run.py +5 -2
  289. package/skills/gsd-path-ship/scripts/worktree_paths.py +54 -2
  290. package/skills/gsd-path-ship/templates/final-review.md +11 -2
  291. package/skills/gsd-path-ship/templates/patch-findings.md +3 -3
  292. package/skills/gsd-path-ship/templates/wave-review.md +16 -6
  293. package/skills/gsd-path-undo/scripts/_common.py +149 -1
  294. package/skills/gsd-path-undo/scripts/loop_run.py +16 -4
  295. package/skills/gsd-path-undo/scripts/path_config.py +3 -3
  296. package/skills/gsd-path-undo/scripts/pipeline_undo.py +101 -8
  297. package/skills/gsd-path-undo/scripts/worktree_paths.py +54 -2
  298. package/skills/path/DEFINE.md +28 -3
  299. package/skills/path/PLAN.md +11 -3
  300. package/skills/path/RESEARCH.md +11 -0
  301. package/skills/path/SHIP.md +6 -1
  302. package/skills/path/references/build-native.md +16 -1
  303. package/skills/path/references/dispatch.md +13 -0
  304. package/skills/path/references/docs-auditor.md +5 -0
  305. package/skills/path/references/planner.md +14 -4
  306. package/skills/path/references/reviewer-final.md +20 -2
  307. package/skills/path/references/reviewer-wave.md +15 -4
  308. package/skills/path/references/reviewer.md +3 -1
  309. package/skills/path/references/spec-probes.md +150 -0
  310. package/skills/path/scripts/_common.py +149 -1
  311. package/skills/path/scripts/archive_milestone.py +14 -13
  312. package/skills/path/scripts/build_recovery.py +96 -31
  313. package/skills/path/scripts/build_state.py +79 -3
  314. package/skills/path/scripts/check_docs_audit.py +77 -4
  315. package/skills/path/scripts/check_handoffs.py +546 -30
  316. package/skills/path/scripts/check_task_briefs.py +279 -23
  317. package/skills/path/scripts/detect_project.py +243 -18
  318. package/skills/path/scripts/discussion_validate.py +86 -29
  319. package/skills/path/scripts/dispatch_driver.py +392 -22
  320. package/skills/path/scripts/git_guard.py +3 -3
  321. package/skills/path/scripts/integration.py +146 -1
  322. package/skills/path/scripts/isolation.py +392 -60
  323. package/skills/path/scripts/loop_run.py +16 -4
  324. package/skills/path/scripts/members.py +11 -9
  325. package/skills/path/scripts/path_config.py +3 -3
  326. package/skills/path/scripts/pipeline_git.py +63 -12
  327. package/skills/path/scripts/pipeline_state.py +111 -33
  328. package/skills/path/scripts/state_checkpoint.py +9 -27
  329. package/skills/path/scripts/status_runtime.py +22 -4
  330. package/skills/path/scripts/task_context.py +12 -3
  331. package/skills/path/scripts/workflow_run.py +5 -2
  332. package/skills/path/scripts/worktree_paths.py +54 -2
  333. package/skills/path/templates/docs-audit.md +5 -1
  334. package/skills/path/templates/final-review.md +11 -2
  335. package/skills/path/templates/intent.md +30 -0
  336. package/skills/path/templates/patch-findings.md +3 -3
  337. package/skills/path/templates/plan.md +17 -2
  338. package/skills/path/templates/research-handoff.md +14 -3
  339. package/skills/path/templates/state.md +1 -1
  340. package/skills/path/templates/wave-review.md +16 -6
  341. package/skills/gsd-path/scripts/__pycache__/_common.cpython-312.pyc +0 -0
  342. package/skills/gsd-path/scripts/__pycache__/check_handoffs.cpython-312.pyc +0 -0
  343. package/skills/gsd-path-build/scripts/__pycache__/_common.cpython-312.pyc +0 -0
  344. package/skills/gsd-path-build/scripts/__pycache__/check_handoffs.cpython-312.pyc +0 -0
  345. package/skills/gsd-path-inspect/scripts/__pycache__/_common.cpython-312.pyc +0 -0
  346. package/skills/gsd-path-plan/scripts/__pycache__/_common.cpython-312.pyc +0 -0
  347. package/skills/gsd-path-ship/scripts/__pycache__/_common.cpython-312.pyc +0 -0
@@ -22,6 +22,27 @@ else:
22
22
  from scripts import _common
23
23
 
24
24
 
25
+ def _worktree_list_porcelain(primary: Path) -> tuple[str, bool]:
26
+ try:
27
+ if __package__:
28
+ from . import pipeline_git as pg
29
+ else:
30
+ from scripts import pipeline_git as pg
31
+ except ImportError:
32
+ try:
33
+ import pipeline_git as pg
34
+ except ImportError:
35
+ pg = None
36
+ if pg is not None:
37
+ return pg.worktree_list_porcelain(primary)
38
+ try:
39
+ output = _git(primary, "worktree", "list", "--porcelain", "-z")
40
+ return output, True
41
+ except ValueError:
42
+ output = _git(primary, "worktree", "list", "--porcelain")
43
+ return output, False
44
+
45
+
25
46
  def _git(primary: Path, *args: str) -> str:
26
47
  result = _common.run_git(primary, *args)
27
48
  if result.returncode:
@@ -82,6 +103,33 @@ def _workspace(primary: Path, pin: bool) -> Path:
82
103
  return workspace
83
104
 
84
105
 
106
+ def release_workspace(primary: Path) -> bool:
107
+ """Forget the pinned placement receipt once no linked worktrees remain.
108
+
109
+ Lets GSD_PATH_WORKTREE_ROOT (or a new default) apply again at the next
110
+ milestone's first allocation. Returns True when a receipt was removed;
111
+ any remaining linked worktree (including one only still registered) keeps
112
+ the pin.
113
+ """
114
+ primary = primary.resolve()
115
+ common = Path(_git(primary, "rev-parse", "--git-common-dir"))
116
+ common = (primary / common).resolve()
117
+ receipt = common / "gsd-path" / "workspaces" / f"{_identity(primary)}.json"
118
+ if not receipt.is_file():
119
+ return False
120
+ output, nul_separated = _worktree_list_porcelain(primary)
121
+ records = output.split("\0\0") if nul_separated else [
122
+ block for block in output.strip().split("\n\n") if block.strip()
123
+ ]
124
+ for record in records:
125
+ fields = record.split("\0") if nul_separated else record.splitlines()
126
+ for field in fields:
127
+ if field.startswith("worktree ") and Path(field[len("worktree "):]).resolve() != primary:
128
+ return False
129
+ receipt.unlink()
130
+ return True
131
+
132
+
85
133
  def worktree_path(primary: Path, kind: str, name: str, *, pin: bool = False) -> Path:
86
134
  primary = primary.resolve()
87
135
  if kind not in {"task", "verify", "integrate", "bound"} or not name or Path(name).name != name or name in {".", ".."}:
@@ -91,9 +139,13 @@ def worktree_path(primary: Path, kind: str, name: str, *, pin: bool = False) ->
91
139
  legacy = (primary.parent / f".{primary.name}-gsd-path-integrate-{name}"
92
140
  if kind == "integrate" else primary.parent / f"{primary.name}.gsd-path" / kind / name)
93
141
  branch = f"refs/heads/gsd-path-{kind}/{name}"
94
- records = _git(primary, "worktree", "list", "--porcelain", "-z").split("\0\0")
142
+ output, nul_separated = _worktree_list_porcelain(primary)
143
+ if nul_separated:
144
+ records = output.split("\0\0")
145
+ else:
146
+ records = [block for block in output.strip().split("\n\n") if block.strip()]
95
147
  for record in records:
96
- fields = record.split("\0")
148
+ fields = record.split("\0") if nul_separated else record.splitlines()
97
149
  # Compare as paths: git prints forward slashes on Windows.
98
150
  worktrees = [Path(field[len("worktree "):]) for field in fields if field.startswith("worktree ")]
99
151
  if legacy in worktrees and f"branch {branch}" in fields:
@@ -62,7 +62,11 @@ Worst drift: <one sentence — the most misleading claim found>
62
62
  ## Remediation queue
63
63
 
64
64
  <!-- Every non-verified claim, classified. The user rules on this queue;
65
- the auditor never fixes anything. -->
65
+ the auditor never fixes anything.
66
+ Numbers are unique and strictly increasing, not necessarily contiguous.
67
+ A persisting row keeps its number; a new row takes a number above every
68
+ prior queue number and every User rulings Queue #. Never reuse a retired
69
+ number: a ruling stays bound to the item it was made for. -->
66
70
 
67
71
  | # | Doc | Claim | Verdict | Class | Suggested action |
68
72
  |---|-----|-------|---------|-------|------------------|
@@ -13,11 +13,20 @@ Reviewed HEAD: <full SHA>
13
13
  Overall verdict: <pass | blocked>
14
14
 
15
15
  <!-- pass only when every criterion is met; blocked when any criterion is
16
- not-met or unverifiable. -->
16
+ not-met or unverifiable.
17
+ A criterion with a held-out edge (E#) or judgment prohibition (N#) in
18
+ INTENT.md is met only when Check, Observed, or Reference cites every such
19
+ id with its evidence; otherwise it is unverifiable with
20
+ `Finding: insufficient spec evidence: <id> ...`. -->
17
21
 
18
22
  ## Success criteria
19
23
 
20
- ### SC1 — <criterion copied verbatim from INTENT.md>
24
+ <!-- Each `### SCn —` title must match INTENT.md `## Success criteria` as
25
+ `_success_criteria` stores it: continuation lines join with a single
26
+ space and keep `- ` sub-bullet markers; comparison uses `_normalize_ws`
27
+ only. -->
28
+
29
+ ### SC1 — <criterion as stored by the gate>
21
30
 
22
31
  - **Verdict**: <met | not-met | unverifiable>
23
32
  - **Surface**: <exactly the surface name PLAN.md's Surface contract lists this criterion under, with no detail after it; omit the whole field for any other criterion>
@@ -57,6 +57,36 @@ paragraph the user signed off on — do not edit without a new sign-off.>
57
57
  1. <criterion — a thing you can run/measure/see>
58
58
  2. ...
59
59
 
60
+ ## Edge coverage
61
+
62
+ <!-- Written by define's edge probe (references/spec-probes.md). Walk every
63
+ success criterion; each applicable edge gets one row ruled by the user.
64
+ Disposition: criterion SCn (stated in that criterion) | held-out (a named
65
+ test pins the ruling written in Detail) | dismissed (Detail says why the
66
+ edge cannot occur). Every SCn appears at least once; a criterion with no
67
+ data shape gets category none, dismissed. Categories: boundary,
68
+ adjacency, empty, encoding, ordering, precision, idempotency,
69
+ concurrency, none. `check_handoffs.py intent` gates this table. -->
70
+
71
+ | Edge | Criterion | Category | Disposition | Detail |
72
+ |------|-----------|----------|-------------|--------|
73
+ | E1 | SC1 | <category> | <disposition> | <ruling, examples, or dismissal reason> |
74
+
75
+ ## Prohibitions
76
+
77
+ <!-- Written by define's prohibition probe. What each criterion must never
78
+ silently become: values, safety, privacy, fairness, transparency. Not
79
+ routine engineering, not generic security canon.
80
+ Disposition: criterion SCn (checkable; stated in that criterion) |
81
+ judgment (final reviewer judges it; Detail says what to look for) |
82
+ dismissed. A single row with Criterion `all`, Must not `none`, and
83
+ disposition dismissed, and no other row, records work that affects no
84
+ person directly. -->
85
+
86
+ | Prohibition | Criterion | Must not | Disposition | Detail |
87
+ |-------------|-----------|----------|-------------|--------|
88
+ | N1 | SC1 | <what it must never become> | <disposition> | <what the reviewer looks for, or why dismissed> |
89
+
60
90
  ## Scope: in
61
91
 
62
92
  <The smallest version that hits the success criteria. Bullet list.>
@@ -11,6 +11,6 @@ State: ship/blocked
11
11
  ### P001 — <short finding title>
12
12
 
13
13
  - **Source**: `.project/review/FINAL.md`
14
- - **Locator**: `<SC number or gap risk row>`
15
- - **Evidence**: <observed result copied from the source review>
16
- - **Fix direction**: <concrete direction for the patch task>
14
+ - **Locator**: <copy the full `Risk: ...` line from a gap review, or the `SC<n>` id from `FINAL.md`>
15
+ - **Evidence**: <copy the gap review's `Found` or `FINAL.md`'s `Finding` field verbatim>
16
+ - **Fix direction**: <copy the source's `Fix direction` field verbatim>
@@ -47,8 +47,8 @@ Goal: <the end-to-end slice that runs>
47
47
  Review depth: <full | deep | verify-only>
48
48
 
49
49
  <!-- More waves: features by dependency, then polish. Rules:
50
- - deps only in earlier waves, or same wave with no file overlap
51
- - no two same-wave tasks share files
50
+ - deps only in earlier waves or the same wave
51
+ - same-wave tasks share files only when one transitively depends on the other
52
52
  - nothing from INTENT.md scope-out appears anywhere -->
53
53
 
54
54
  ## Surface contract
@@ -83,6 +83,21 @@ Walkthrough:
83
83
  |-----------|------|------------|
84
84
  | SC1 | T001 | AC1 |
85
85
 
86
+ ## Held-out checks
87
+
88
+ <!-- Required when INTENT.md Edge coverage has a held-out edge; omit the
89
+ section entirely when it has none. One row per held-out edge, given to
90
+ the task that owns the edge's criterion. Test is a file listed in that
91
+ task's files (optionally `path::test_name`); the task's Verify runs it
92
+ and its Acceptance
93
+ criteria state the edge id and the ruling from INTENT.md Detail. Final
94
+ review cites this test's recorded result for the edge.
95
+ `scripts/check_handoffs.py plan` gates this table. -->
96
+
97
+ | Edge | Task | Test |
98
+ |------|------|------|
99
+ | E1 | T001 | <test path from T001 files> |
100
+
86
101
  ## Dependency notes
87
102
 
88
103
  <Per non-obvious edge: the exact data or landed effect that makes X precede Y,
@@ -14,12 +14,23 @@ Intent: `.project/intent/INTENT.md`
14
14
  <!-- Include every standard dimension exactly once. A custom dimension may
15
15
  supplement these rows, never replace a standard row. -->
16
16
  - `domain` — dispatched → `.project/research/evidence-domain.md` — <why this dimension ran>
17
- - `stack` — skipped → none — <why this dimension was skipped>
17
+ - `stack` — dispatched → `.project/research/evidence-stack.md` — <why this dimension ran>
18
18
  - `pitfalls` — skipped → none — <why this dimension was skipped>
19
19
  - `similar` — skipped → none — <why this dimension was skipped>
20
20
 
21
21
  ## Question assignments
22
22
 
23
23
  <!-- Copy every [RESEARCH] question from INTENT.md exactly once. Use `- none`
24
- only when INTENT.md has no [RESEARCH] questions. -->
25
- - `[RESEARCH] <question copied from INTENT.md>` → `domain`
24
+ only when INTENT.md has no [RESEARCH] questions. The question is a
25
+ CommonMark code span: choose a fence length not used by a backtick run in
26
+ the question (a longer fence is usually easiest), with one space of
27
+ padding on each side. Each row may target one or more dispatched
28
+ dimensions, each in its own code span and separated by commas. Every
29
+ dispatched dimension must receive a question and answer all its assigned
30
+ questions in its evidence file. For example:
31
+ - `` [RESEARCH] Does `Widget` match `sample.json`? `` → `domain`, `stack`
32
+ A question that ends in a backtick also needs padding, as in:
33
+ - `` [RESEARCH] Does the label end with `Widget`?` `` → `domain`
34
+ After removing the fence and CommonMark padding, the text must equal the
35
+ INTENT question exactly. -->
36
+ - `` [RESEARCH] <question copied from INTENT.md> `` → `domain`, `stack`
@@ -10,7 +10,7 @@ branch: null # bound per milestone as gsd-path/M00N; after integration
10
10
  # the router rebinds before any next-milestone file change
11
11
  # the bound branch is never main; ship integrates it there
12
12
  archive: null # persisted archive transaction path; never recomputed
13
- integration_default: direct # direct | pull-request; project setting
13
+ integration_default: direct # direct | pull-request | external-landing; project setting
14
14
  integration: direct # current milestone; may override the default before build
15
15
  integration_source: default # default | milestone; preserves override provenance
16
16
  ---
@@ -10,10 +10,11 @@
10
10
  with actual values, otherwise omit them:
11
11
  Reviewed HEAD: <full review commit SHA>
12
12
  Review scope: final
13
- In each surface SC block also include Surface, Check, and Observed fields
14
- using the final-review format. Surface holds exactly the surface name from
15
- PLAN.md's Surface contract; put walkthrough detail in Check and Observed.
16
- Record the actual walkthrough evidence once. -->
13
+ In each surface SC block keep the mandatory `- ✅` / `- ❌` evidence line
14
+ (the wave gate requires it). Also include Surface, Check, and Observed
15
+ fields using the final-review format. Surface holds exactly the surface name
16
+ from PLAN.md's Surface contract; put walkthrough detail in Check and Observed.
17
+ The `- ✅` line may summarize Observed; do not omit it. -->
17
18
 
18
19
  Wave verdict: <pass | blocked — blocked if any task fails>
19
20
  Cycle: <C>
@@ -45,12 +46,21 @@ Contract violations (blocking):
45
46
  <!-- One heading per INTENT.md success criterion owned by a task in this
46
47
  wave, ending `: pass` or `: fail`. `scripts/check_handoffs.py wave
47
48
  --review <this file>` gates the SC id set and verdicts. Omit this
48
- section when no task in the wave owns an SC. -->
49
+ section when no task in the wave owns an SC.
50
+ Copy the criterion text from INTENT.md `## Success criteria` exactly as
51
+ `_success_criteria` stores it: indented continuation lines join with a
52
+ single space and keep their leading `- ` markers; the gate compares
53
+ heading text with `_normalize_ws` only (no paraphrase or stripped
54
+ sub-bullets). -->
49
55
 
50
- ### SC1 — <criterion>: <pass | fail>
56
+ ### SC1 — <criterion as stored by the gate>: <pass | fail>
51
57
  - ✅ <evidence: verify output / file:line checked>
52
58
  - ❌ <criterion> — found: <what exists instead, file:line>
53
59
  fix: <concrete direction a coder can execute without re-investigating>
60
+ <!-- Quick-lane final scope (Review scope: final): add after the evidence line:
61
+ - **Surface**: <surface name from PLAN.md>
62
+ - **Check**: `<walkthrough command>`
63
+ - **Observed**: <what was seen> -->
54
64
 
55
65
  ## Fixed since last cycle
56
66
 
@@ -24,6 +24,14 @@ python3 <absolute dispatch_driver.py> round --repo <absolute primary> --wave <N>
24
24
  [--child-timeout <owner seconds>]
25
25
  ```
26
26
 
27
+ Use the absolute `dispatch_driver.py` from the active installed
28
+ `gsd-path-build` skill when orchestrating a consuming project's build; that
29
+ copy resolves role briefs and templates from its own skill bundle. The
30
+ repository or npm package also supports the top-level `scripts/dispatch_driver.py`:
31
+ when a default is not beside that script, it resolves from the shipped
32
+ `skills/gsd-path` bundle. Explicit `--role-brief`, `--task-template`, and
33
+ `--template` paths override those defaults and must name existing files.
34
+
27
35
  `round` owns the entry transition described in Preconditions and branch
28
36
  binding, checkpointed as `build: start milestone`, and sets `build/blocked`
29
37
  on a dependency deadlock or a blocked
@@ -136,6 +144,13 @@ dispatch contract and perform steps 1–5 by hand.
136
144
  even while unrelated tasks still run, so rerun `ready` after each landing.
137
145
  A `NEEDS-ORCHESTRATOR` block stays unselectable until its `Orchestrator
138
146
  answer` is recorded in the task Log and the task is back to `pending`.
147
+ An all-done wave whose latest canonical review cycle has any blocked lens
148
+ gates later waves: `ready` selects unfinished later tasks with a `## Review
149
+ findings` section that depend on it, sets `current_wave` to the earliest
150
+ repair wave, and adds `repair_for_wave` with the source wave. When no such
151
+ repair remains, `ready` returns no tasks and adds `blocked_review` (`wave`,
152
+ `cycle`, `waiting_waves`); a later passing canonical review cycle releases
153
+ the waiting waves.
139
154
  Its typed errors are the recovery rule:
140
155
  - `task-recovery-required`: for each listed failed or blocked task run
141
156
  `python3 <absolute build_state.py> reconcile --repo <absolute primary>
@@ -196,7 +211,7 @@ dispatch contract and perform steps 1–5 by hand.
196
211
  a later round unlocked by fresh landings records the later HEAD — and
197
212
  lint every ready task's brief with the bundled
198
213
  `scripts/check_task_briefs.py --repo <absolute repo root> --base <recorded
199
- base>` and re-check Intent coverage with
214
+ base> --project-dir <routed project dir>` and re-check Intent coverage with
200
215
  `python3 <absolute check_handoffs.py> plan --repo <absolute repo root>`
201
216
  before creating any worktree; a lint or coverage failure is a documented plan
202
217
  defect — repair it against INTENT.md and SYNTHESIS.md, then re-establish
@@ -44,6 +44,19 @@ use exactly one matching branch:
44
44
  create another worktree. Encode task dependencies explicitly; launch
45
45
  independent children concurrently up to the host's advertised
46
46
  concurrent-subagent capacity.
47
+ - A `muse.subagent_spawn` tool (with `muse.subagent_wait`,
48
+ `muse.subagent_read_result`, and `muse.subagent_send_message` siblings) is
49
+ Muse Code. Omit `subagent_type` (general-purpose, full capability), pass the
50
+ logical task name as `task_name` and `role`, and the complete brief as
51
+ `objective`. Never set `worktree_isolation`. Keep the returned
52
+ `subagent_id`; send a correction to a still-live child with
53
+ `muse.subagent_send_message` mode `followup` and the complete new prompt,
54
+ otherwise start a fresh child. Collect with `muse.subagent_wait`
55
+ (`wait_for: task_terminal`) then `muse.subagent_read_result`; on
56
+ `root_capacity_exhausted`, wait for a child to finish and retry. Spawn has no
57
+ model or effort argument, so record no such capability. If only
58
+ `muse.workflow` is exposed (untrusted workspace), do not script or inline
59
+ the work; stop and report that the workspace must be trusted.
47
60
 
48
61
  For every branch:
49
62
 
@@ -1,8 +1,13 @@
1
1
  ## Final integration mode
2
2
 
3
3
  Use only final-review.md. Treat INTENT.md success criteria as the rubric.
4
- Exercise the running system and record `met`, `not-met`, or `unverifiable`
5
- with checked command output or a precise file reference. When PLAN.md carries
4
+ Each `### SCn —` heading must match the criterion text as
5
+ `check_handoffs._success_criteria` stores it from INTENT.md `## Success
6
+ criteria`: indented continuation lines join with a single space and keep
7
+ their `- ` list markers; the gate compares titles with `_normalize_ws`
8
+ only. Exercise the running system and record `met`, `not-met`, or
9
+ `unverifiable` with checked command output or a precise file reference.
10
+ When PLAN.md carries
6
11
  a `## Surface contract`, every criterion it lists under a surface is checked
7
12
  by performing that surface's Walkthrough from its Entry in the supplied
8
13
  sidecar: `Surface` names that surface, Check names what was performed,
@@ -14,6 +19,19 @@ re-run PLAN.md's project Verify; cite the orchestrator's recorded
14
19
  project-verify sidecar output. `pass`
15
20
  requires every criterion to be `met`.
16
21
 
22
+ When INTENT.md `## Edge coverage` or `## Prohibitions` tags a criterion with a
23
+ `held-out` edge or a `judgment` prohibition, grade that criterion on cited
24
+ evidence for every tag (see the [spec-reach probes](spec-probes.md)). Name
25
+ each id in Check, Observed, or Reference with its evidence: the held-out
26
+ test's recorded passing output from the PLAN.md `## Held-out checks` test, or
27
+ the observed behavior judged against the prohibition's Detail. When a tag's
28
+ evidence is missing, did not run, or cannot be judged, record `unverifiable`
29
+ with `Finding: insufficient spec evidence: <id> <what is missing>` and a Fix
30
+ direction naming the check to add or run. Never mark such a criterion `met`
31
+ on inference or on code that merely looks right; the ship gate refuses a
32
+ `met` verdict that does not cite every tag. Grade untagged criteria as usual:
33
+ the trigger is the INTENT.md tag, never your own doubt.
34
+
17
35
  ## Final gap mode
18
36
 
19
37
  Use only gap-review.md. Check the one cross-wave risk in the brief against the
@@ -23,10 +23,18 @@ tasks in this wave as the rubric. For each task:
23
23
  concrete fix direction for each failure.
24
24
 
25
25
  Then check each INTENT.md success criterion owned by a task in this wave
26
- against that same isolated product. Copy the criterion verbatim from
27
- INTENT.md. Mark `pass` or `fail` with evidence; a failed owned SC blocks
26
+ against that same isolated product. In each `### SCn —` heading, copy the
27
+ criterion text exactly as `check_handoffs._success_criteria` stores it from
28
+ INTENT.md `## Success criteria`: indented continuation lines are joined
29
+ with a single space and keep their `- ` list markers in the compared text;
30
+ only whitespace is normalized at the gate. Do not paraphrase or drop
31
+ sub-bullets. Mark `pass` or `fail` with evidence; a failed owned SC blocks
28
32
  the wave. Omit the Intent coverage section when no task in the wave owns
29
- an SC.
33
+ an SC. When INTENT.md `## Edge coverage` or `## Prohibitions` has rows for
34
+ an owned SC, judge it against those rulings too: cite each `held-out` edge
35
+ id with its held-out test's recorded output and each `judgment` prohibition
36
+ id with what you observed. A missing held-out result or a violated ruling
37
+ fails the SC.
30
38
 
31
39
  Allow changed paths only in the task's `files` plus its assigned task file.
32
40
  Within the task file, allow orchestrator-owned `base`, `worktree`,
@@ -65,7 +73,10 @@ criterion's Intent coverage block includes `- **Surface**:`, `- **Check**:`, and
65
73
  `- **Observed**:` with the walked states and actual result. `Surface` holds
66
74
  exactly the surface name from PLAN's Surface contract; walkthrough detail belongs
67
75
  in Check and Observed. Reuse recorded task
68
- output if it proves that exact walkthrough; run only a missing check. Final-scope
76
+ output if it proves that exact walkthrough; run only a missing check. Cite
77
+ every `held-out` edge and `judgment` prohibition id of each criterion in its
78
+ evidence; shipping derives FINAL.md from these records, and an uncited id
79
+ sends the milestone to a dispatched final review instead. Final-scope
69
80
  coverage shares this wave artifact; do not write a second report. Shipping's
70
81
  runtime checks freshness and derives the final view from these records.
71
82
 
@@ -46,7 +46,9 @@ Resolve sibling links against this role file's directory.
46
46
  from the same model family is one evidence path; independence comes
47
47
  from re-run evidence, different sources, or a different model family.
48
48
  - Pass any reasonable satisfied reading of an ambiguous wave criterion and
49
- warn that it needs tightening.
49
+ warn that it needs tightening, unless INTENT.md `## Edge coverage` or
50
+ `## Prohibitions` rules on that reading: a ruling there binds, and a
51
+ reading that contradicts it fails.
50
52
  - Do not edit code, tasks, plans, or implementation state.
51
53
 
52
54
  Return verdicts and the review output path without extra prose.
@@ -0,0 +1,150 @@
1
+ # Spec-reach probes
2
+
3
+ Define runs two probes over the success criteria before approval: the edge
4
+ probe (what each criterion must do at its edges) and the prohibition probe
5
+ (what each criterion must never silently become). Both leave a table in
6
+ INTENT.md. Plan, build review, and final review read those tables; the
7
+ `check_handoffs.py intent`, `plan`, and `final` gates enforce them.
8
+
9
+ ## Why define owns this
10
+
11
+ A reviewer can only check what the intent states. An edge nobody wrote down
12
+ is never checked: final review covers exactly the INTENT success criteria,
13
+ and a reviewer passes any reasonable reading of an ambiguous one. Model
14
+ reviewers are also confidently wrong on exactly these gaps. On three tasks
15
+ whose correct behavior the spec left unstated, LLM verifier verdicts caught
16
+ the defect 0 times in 12 while a held-out test caught all three; in a larger
17
+ replication, stating the surfaced edge in the spec raised the verifier's
18
+ catch rate to 98% ([Verifier Reach Is Spec Reach](https://github.com/davesienkowski/verifier-reach-is-spec-reach)).
19
+ A smarter reviewer does not close that gap; a wider intent does. The user is
20
+ present at define, so define is where the edge gets its ruling.
21
+
22
+ ## Edge probe
23
+
24
+ Walk every success criterion:
25
+
26
+ 1. Name the data shapes the criterion handles, then raise only the
27
+ categories those shapes reach:
28
+
29
+ | Shape | Categories |
30
+ |-------|------------|
31
+ | numeric range, dates, money, counts | boundary, precision |
32
+ | list, set, rows, intervals | adjacency, empty, ordering |
33
+ | text, names, identifiers | empty, encoding |
34
+ | state that persists or repeats | idempotency, concurrency |
35
+ | files, network, processes | concurrency |
36
+
37
+ 2. For each raised category, write one concrete candidate edge and the
38
+ ruling you recommend:
39
+
40
+ | Category | Probe question |
41
+ |----------|----------------|
42
+ | boundary | What happens exactly at each minimum, maximum, or threshold, and one step either side? |
43
+ | adjacency | When two items are equal or just touch, do they merge, collide, or stay separate? |
44
+ | empty | What is the result for empty, single-item, or missing input? |
45
+ | encoding | Whose length or equality applies: bytes, code points, grapheme clusters, normalized form, case? |
46
+ | ordering | When items compare equal, is output order specified and stable? |
47
+ | precision | Where can rounding, overflow, or truncation happen, and which rule applies? |
48
+ | idempotency | What happens when this runs twice on the same input? |
49
+ | concurrency | If interrupted or run in parallel, what is guaranteed? |
50
+
51
+ 3. Ask the user in one small round, all criteria together, recommended
52
+ ruling first. Never rule on an edge's behavior yourself: the correct
53
+ answer is exactly what the criteria did not say, so a guess here is the
54
+ defect this probe exists to prevent. Under pre-approval, an edge whose
55
+ behavior the user has not stated is still a required answer: stop and
56
+ ask instead of ruling.
57
+
58
+ 4. Record each ruling as one row:
59
+ - `criterion SCn` when the answer is observable where the user sees the
60
+ work. Add or amend that success criterion (define owns criteria), then
61
+ point the row at it. An existing criterion that already states the
62
+ edge may be named directly.
63
+ - `held-out` when the answer is a precise rule or a set of examples that
64
+ belongs in a test rather than a user-facing criterion (a normalization
65
+ form, a rounding rule, an inclusive bound on an internal API). Write the
66
+ ruling or the user's examples verbatim in Detail. The plan must schedule
67
+ a named test that pins it.
68
+ - `dismissed` when the edge cannot occur for this criterion. Detail says
69
+ why ("input is a closed enum"). "Not important" is not a reason.
70
+
71
+ Every criterion gets at least one row. A criterion with no data shape gets
72
+ one row with category `none`, dismissed with its reason.
73
+
74
+ ## Prohibition probe
75
+
76
+ Walk every success criterion with one adversarial question: what could this
77
+ silently become that the user would not want, although nothing in INTENT.md
78
+ forbids it? Generate candidates privately, then keep only values, safety,
79
+ privacy, fairness, and transparency items: "must not email unsubscribed
80
+ users", "must not store raw card numbers in logs", "must not use guilt
81
+ wording". Drop routine engineering items (mutating input, throwing on empty
82
+ input, leaking handles); those are edges or ordinary review. Do not mint
83
+ generic security or compliance canon (injection, path traversal, data
84
+ retention law); record a real compliance need under Constraints instead.
85
+ Expect two or three kept items for work people touch, and often none for
86
+ internals.
87
+
88
+ Present the kept items with a recommended ruling and record each as a row:
89
+
90
+ - `criterion SCn` when a test or command can check it. State it as a
91
+ success criterion and point the row at it.
92
+ - `judgment` when it is real but not mechanically checkable. Detail says
93
+ what the final reviewer looks for.
94
+ - `dismissed` when the user rules it out. Detail records the reason.
95
+
96
+ Work that affects no person directly records a single row instead, and no
97
+ other: `| N1 | all | none | dismissed | <why no person is affected> |`.
98
+
99
+ ## INTENT.md tables
100
+
101
+ ```markdown
102
+ ## Edge coverage
103
+
104
+ | Edge | Criterion | Category | Disposition | Detail |
105
+ |------|-----------|----------|-------------|--------|
106
+ | E1 | SC1 | boundary | criterion SC4 | |
107
+ | E2 | SC1 | empty | dismissed | the command always receives at least one file |
108
+ | E3 | SC2 | encoding | held-out | names compare by NFC code points, case-sensitive |
109
+
110
+ ## Prohibitions
111
+
112
+ | Prohibition | Criterion | Must not | Disposition | Detail |
113
+ |-------------|-----------|----------|-------------|--------|
114
+ | N1 | SC2 | send a reminder to an unsubscribed user | criterion SC5 | |
115
+ | N2 | SC2 | use guilt or shame wording | judgment | reminder copy is neutral and states only the due item |
116
+ ```
117
+
118
+ Ids are contiguous from `E1` and `N1`. Detail is required for every row that
119
+ is not `criterion SCn`. The headings are exact: `## Edge coverage` and
120
+ `## Prohibitions`. An INTENT.md without them predates the probes and is not
121
+ rechecked; a near-miss heading fails the gate rather than switching it off.
122
+
123
+ ## Downstream
124
+
125
+ - **Plan.** Every `held-out` edge gets one PLAN.md `## Held-out checks` row
126
+ naming the task that owns the edge's criterion and the test file (a
127
+ `path::test_name` node id is fine). That file is listed in the task's
128
+ `files`, the task's Verify runs it, and the task's Acceptance criteria
129
+ state the edge id and its ruling. A `criterion SCn` row needs nothing extra: SCn is
130
+ already covered like any criterion. A `judgment` prohibition belongs in
131
+ the owning task's Approach so the coder knows the line.
132
+ - **Review.** A row pins the reading of its criterion. A reviewer does not
133
+ pass a reading that contradicts a ruling in either table, and cites each
134
+ held-out edge and judgment prohibition id with its evidence.
135
+ - **Final review.** A criterion that carries a held-out edge or a judgment
136
+ prohibition is `met` only when its Check, Observed, or Reference cites
137
+ every such id with the evidence: the held-out test's recorded passing
138
+ output, or the observed behavior judged against Detail. When that
139
+ evidence is missing, did not run, or cannot be judged, record
140
+ `unverifiable` with `Finding: insufficient spec evidence: <id> ...`;
141
+ never `met` on inference. The trigger is the tag, not reviewer doubt:
142
+ criteria without a tag are graded as usual and never abstained.
143
+
144
+ ## What the gates can and cannot prove
145
+
146
+ `check_handoffs.py intent` (before approval and again when define records
147
+ approval), `plan`, and `final` prove the tables are complete, every held-out
148
+ edge has a scheduled test, and every tagged `met` cites its tags. They cannot
149
+ prove who made a ruling or that a cited result says what the verdict claims.
150
+ Those stay with the define conversation and the reviewer's recorded evidence.