@opengsd/gsd-path 1.0.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 (398) hide show
  1. package/AGENTS.md +397 -0
  2. package/DOCS.md +341 -0
  3. package/FULL.md +475 -0
  4. package/GUIDE.md +23 -0
  5. package/HOOKS.md +273 -0
  6. package/LICENSE +21 -0
  7. package/MIGRATE.md +100 -0
  8. package/QUICK.md +146 -0
  9. package/README.md +280 -0
  10. package/RUNTIME.md +229 -0
  11. package/UPDATE.md +196 -0
  12. package/WORKFLOW.md +683 -0
  13. package/package.json +80 -0
  14. package/platforms/claude/dispatch.md +63 -0
  15. package/platforms/copilot/dispatch.md +61 -0
  16. package/platforms/cursor/agent.md +17 -0
  17. package/platforms/cursor/dispatch.md +63 -0
  18. package/platforms/grok/dispatch.md +61 -0
  19. package/platforms/kimi/dispatch.md +64 -0
  20. package/platforms/kiro/dispatch.md +58 -0
  21. package/platforms/opencode/dispatch.md +62 -0
  22. package/platforms/qwen/dispatch.md +60 -0
  23. package/platforms/shared-agents/dispatch.md +131 -0
  24. package/plugin.json +14 -0
  25. package/scripts/_common.py +180 -0
  26. package/scripts/archive_milestone.py +2265 -0
  27. package/scripts/bootstrap_repository.py +710 -0
  28. package/scripts/build_state.py +854 -0
  29. package/scripts/check_docs_audit.py +463 -0
  30. package/scripts/check_handoffs.py +1855 -0
  31. package/scripts/check_task_briefs.py +376 -0
  32. package/scripts/check_update.py +93 -0
  33. package/scripts/core_hook_gate.py +34 -0
  34. package/scripts/core_hook_settings.py +119 -0
  35. package/scripts/detect_project.py +1517 -0
  36. package/scripts/discussion_records.py +619 -0
  37. package/scripts/discussion_validate.py +1321 -0
  38. package/scripts/dispatch_driver.py +1812 -0
  39. package/scripts/git_guard.py +759 -0
  40. package/scripts/guard_hook.py +2124 -0
  41. package/scripts/install.mjs +3239 -0
  42. package/scripts/install.py +3008 -0
  43. package/scripts/integration.py +1433 -0
  44. package/scripts/isolation.py +3538 -0
  45. package/scripts/lean_verification.py +256 -0
  46. package/scripts/loop_run.py +837 -0
  47. package/scripts/migrate_core.py +169 -0
  48. package/scripts/pipeline_diagnose.py +715 -0
  49. package/scripts/pipeline_git.py +940 -0
  50. package/scripts/pipeline_state.py +2291 -0
  51. package/scripts/pipeline_undo.py +1039 -0
  52. package/scripts/promote_lookahead.py +415 -0
  53. package/scripts/review_findings.py +714 -0
  54. package/scripts/review_panel.py +553 -0
  55. package/scripts/skill-resources.json +340 -0
  56. package/scripts/state_checkpoint.py +1039 -0
  57. package/scripts/state_promote.py +743 -0
  58. package/scripts/status_runtime.py +122 -0
  59. package/scripts/sync_skill_resources.py +259 -0
  60. package/scripts/token_budget.py +146 -0
  61. package/scripts/wizard.mjs +179 -0
  62. package/scripts/workflow_run.py +117 -0
  63. package/skills/gsd-path/BUILD.md +700 -0
  64. package/skills/gsd-path/DECIDE.md +115 -0
  65. package/skills/gsd-path/DEFINE.md +297 -0
  66. package/skills/gsd-path/DOCS-AUDIT.md +190 -0
  67. package/skills/gsd-path/INSPECT.md +167 -0
  68. package/skills/gsd-path/PLAN.md +411 -0
  69. package/skills/gsd-path/RESEARCH.md +159 -0
  70. package/skills/gsd-path/ROADMAP.md +215 -0
  71. package/skills/gsd-path/SHIP.md +412 -0
  72. package/skills/gsd-path/SKILL.md +471 -0
  73. package/skills/gsd-path/agents/openai.yaml +6 -0
  74. package/skills/gsd-path/references/codebase-mapper.md +52 -0
  75. package/skills/gsd-path/references/coder.md +90 -0
  76. package/skills/gsd-path/references/decider.md +36 -0
  77. package/skills/gsd-path/references/dispatch.md +131 -0
  78. package/skills/gsd-path/references/docs-auditor.md +60 -0
  79. package/skills/gsd-path/references/planner.md +104 -0
  80. package/skills/gsd-path/references/researcher.md +42 -0
  81. package/skills/gsd-path/references/reviewer.md +188 -0
  82. package/skills/gsd-path/references/roadmapper.md +48 -0
  83. package/skills/gsd-path/scripts/_common.py +180 -0
  84. package/skills/gsd-path/scripts/archive_milestone.py +2265 -0
  85. package/skills/gsd-path/scripts/bootstrap_repository.py +710 -0
  86. package/skills/gsd-path/scripts/build_state.py +854 -0
  87. package/skills/gsd-path/scripts/check_docs_audit.py +463 -0
  88. package/skills/gsd-path/scripts/check_handoffs.py +1855 -0
  89. package/skills/gsd-path/scripts/check_task_briefs.py +376 -0
  90. package/skills/gsd-path/scripts/check_update.py +93 -0
  91. package/skills/gsd-path/scripts/detect_project.py +1517 -0
  92. package/skills/gsd-path/scripts/discussion_records.py +619 -0
  93. package/skills/gsd-path/scripts/discussion_validate.py +1321 -0
  94. package/skills/gsd-path/scripts/dispatch_driver.py +1812 -0
  95. package/skills/gsd-path/scripts/integration.py +1433 -0
  96. package/skills/gsd-path/scripts/isolation.py +3538 -0
  97. package/skills/gsd-path/scripts/lean_verification.py +256 -0
  98. package/skills/gsd-path/scripts/loop_run.py +837 -0
  99. package/skills/gsd-path/scripts/pipeline_git.py +940 -0
  100. package/skills/gsd-path/scripts/pipeline_state.py +2291 -0
  101. package/skills/gsd-path/scripts/promote_lookahead.py +415 -0
  102. package/skills/gsd-path/scripts/review_findings.py +714 -0
  103. package/skills/gsd-path/scripts/review_panel.py +553 -0
  104. package/skills/gsd-path/scripts/state_checkpoint.py +1039 -0
  105. package/skills/gsd-path/scripts/state_promote.py +743 -0
  106. package/skills/gsd-path/scripts/token_budget.py +146 -0
  107. package/skills/gsd-path/scripts/workflow_run.py +117 -0
  108. package/skills/gsd-path/templates/answers.md +29 -0
  109. package/skills/gsd-path/templates/archive-manifest.md +37 -0
  110. package/skills/gsd-path/templates/charter.md +50 -0
  111. package/skills/gsd-path/templates/codebase.md +46 -0
  112. package/skills/gsd-path/templates/dialogue.md +21 -0
  113. package/skills/gsd-path/templates/docs-audit.md +69 -0
  114. package/skills/gsd-path/templates/evidence.md +24 -0
  115. package/skills/gsd-path/templates/final-review.md +27 -0
  116. package/skills/gsd-path/templates/gap-review.md +20 -0
  117. package/skills/gsd-path/templates/intent.md +98 -0
  118. package/skills/gsd-path/templates/loop.md +59 -0
  119. package/skills/gsd-path/templates/patch-findings.md +16 -0
  120. package/skills/gsd-path/templates/plan-panel.md +25 -0
  121. package/skills/gsd-path/templates/plan.md +89 -0
  122. package/skills/gsd-path/templates/repository.md +16 -0
  123. package/skills/gsd-path/templates/research-handoff.md +25 -0
  124. package/skills/gsd-path/templates/roadmap.md +38 -0
  125. package/skills/gsd-path/templates/skeptic.md +36 -0
  126. package/skills/gsd-path/templates/state.md +27 -0
  127. package/skills/gsd-path/templates/synthesis.md +36 -0
  128. package/skills/gsd-path/templates/task.md +74 -0
  129. package/skills/gsd-path/templates/wave-panel.md +25 -0
  130. package/skills/gsd-path/templates/wave-review.md +64 -0
  131. package/skills/gsd-path-build/SKILL.md +700 -0
  132. package/skills/gsd-path-build/agents/openai.yaml +6 -0
  133. package/skills/gsd-path-build/references/coder.md +90 -0
  134. package/skills/gsd-path-build/references/dispatch.md +131 -0
  135. package/skills/gsd-path-build/references/reviewer.md +188 -0
  136. package/skills/gsd-path-build/scripts/_common.py +180 -0
  137. package/skills/gsd-path-build/scripts/archive_milestone.py +2265 -0
  138. package/skills/gsd-path-build/scripts/build_state.py +854 -0
  139. package/skills/gsd-path-build/scripts/check_handoffs.py +1855 -0
  140. package/skills/gsd-path-build/scripts/check_task_briefs.py +376 -0
  141. package/skills/gsd-path-build/scripts/discussion_records.py +619 -0
  142. package/skills/gsd-path-build/scripts/discussion_validate.py +1321 -0
  143. package/skills/gsd-path-build/scripts/dispatch_driver.py +1812 -0
  144. package/skills/gsd-path-build/scripts/integration.py +1433 -0
  145. package/skills/gsd-path-build/scripts/isolation.py +3538 -0
  146. package/skills/gsd-path-build/scripts/loop_run.py +837 -0
  147. package/skills/gsd-path-build/scripts/pipeline_git.py +940 -0
  148. package/skills/gsd-path-build/scripts/pipeline_state.py +2291 -0
  149. package/skills/gsd-path-build/scripts/review_findings.py +714 -0
  150. package/skills/gsd-path-build/scripts/review_panel.py +553 -0
  151. package/skills/gsd-path-build/scripts/state_checkpoint.py +1039 -0
  152. package/skills/gsd-path-build/scripts/state_promote.py +743 -0
  153. package/skills/gsd-path-build/scripts/token_budget.py +146 -0
  154. package/skills/gsd-path-build/scripts/workflow_run.py +117 -0
  155. package/skills/gsd-path-build/templates/skeptic.md +36 -0
  156. package/skills/gsd-path-build/templates/task.md +74 -0
  157. package/skills/gsd-path-build/templates/wave-panel.md +25 -0
  158. package/skills/gsd-path-build/templates/wave-review.md +64 -0
  159. package/skills/gsd-path-decide/SKILL.md +115 -0
  160. package/skills/gsd-path-decide/agents/openai.yaml +6 -0
  161. package/skills/gsd-path-decide/references/decider.md +36 -0
  162. package/skills/gsd-path-decide/references/dispatch.md +131 -0
  163. package/skills/gsd-path-decide/scripts/_common.py +180 -0
  164. package/skills/gsd-path-decide/scripts/check_handoffs.py +1855 -0
  165. package/skills/gsd-path-decide/scripts/check_task_briefs.py +376 -0
  166. package/skills/gsd-path-decide/scripts/discussion_records.py +619 -0
  167. package/skills/gsd-path-decide/scripts/isolation.py +3538 -0
  168. package/skills/gsd-path-decide/scripts/pipeline_git.py +940 -0
  169. package/skills/gsd-path-decide/scripts/pipeline_state.py +2291 -0
  170. package/skills/gsd-path-decide/scripts/state_checkpoint.py +1039 -0
  171. package/skills/gsd-path-decide/scripts/state_promote.py +743 -0
  172. package/skills/gsd-path-decide/templates/synthesis.md +36 -0
  173. package/skills/gsd-path-define/SKILL.md +297 -0
  174. package/skills/gsd-path-define/agents/openai.yaml +6 -0
  175. package/skills/gsd-path-define/scripts/_common.py +180 -0
  176. package/skills/gsd-path-define/scripts/check_handoffs.py +1855 -0
  177. package/skills/gsd-path-define/scripts/check_task_briefs.py +376 -0
  178. package/skills/gsd-path-define/scripts/detect_project.py +1517 -0
  179. package/skills/gsd-path-define/scripts/discussion_records.py +619 -0
  180. package/skills/gsd-path-define/scripts/isolation.py +3538 -0
  181. package/skills/gsd-path-define/scripts/pipeline_git.py +940 -0
  182. package/skills/gsd-path-define/scripts/pipeline_state.py +2291 -0
  183. package/skills/gsd-path-define/scripts/state_checkpoint.py +1039 -0
  184. package/skills/gsd-path-define/scripts/state_promote.py +743 -0
  185. package/skills/gsd-path-define/templates/charter.md +50 -0
  186. package/skills/gsd-path-define/templates/intent.md +98 -0
  187. package/skills/gsd-path-define/templates/state.md +27 -0
  188. package/skills/gsd-path-discuss/SKILL.md +162 -0
  189. package/skills/gsd-path-discuss/agents/openai.yaml +6 -0
  190. package/skills/gsd-path-discuss/scripts/_common.py +180 -0
  191. package/skills/gsd-path-discuss/scripts/discussion_records.py +619 -0
  192. package/skills/gsd-path-discuss/templates/answers.md +29 -0
  193. package/skills/gsd-path-discuss/templates/dialogue.md +21 -0
  194. package/skills/gsd-path-docs-audit/SKILL.md +190 -0
  195. package/skills/gsd-path-docs-audit/agents/openai.yaml +6 -0
  196. package/skills/gsd-path-docs-audit/references/dispatch.md +131 -0
  197. package/skills/gsd-path-docs-audit/references/docs-auditor.md +60 -0
  198. package/skills/gsd-path-docs-audit/scripts/_common.py +180 -0
  199. package/skills/gsd-path-docs-audit/scripts/check_docs_audit.py +463 -0
  200. package/skills/gsd-path-docs-audit/scripts/check_handoffs.py +1855 -0
  201. package/skills/gsd-path-docs-audit/scripts/check_task_briefs.py +376 -0
  202. package/skills/gsd-path-docs-audit/scripts/discussion_records.py +619 -0
  203. package/skills/gsd-path-docs-audit/scripts/isolation.py +3538 -0
  204. package/skills/gsd-path-docs-audit/scripts/pipeline_git.py +940 -0
  205. package/skills/gsd-path-docs-audit/scripts/pipeline_state.py +2291 -0
  206. package/skills/gsd-path-docs-audit/scripts/state_checkpoint.py +1039 -0
  207. package/skills/gsd-path-docs-audit/scripts/state_promote.py +743 -0
  208. package/skills/gsd-path-docs-audit/templates/docs-audit.md +69 -0
  209. package/skills/gsd-path-forensics/SKILL.md +39 -0
  210. package/skills/gsd-path-forensics/agents/openai.yaml +6 -0
  211. package/skills/gsd-path-forensics/scripts/_common.py +180 -0
  212. package/skills/gsd-path-forensics/scripts/discussion_records.py +619 -0
  213. package/skills/gsd-path-forensics/scripts/pipeline_diagnose.py +715 -0
  214. package/skills/gsd-path-forensics/scripts/pipeline_undo.py +1039 -0
  215. package/skills/gsd-path-inspect/SKILL.md +167 -0
  216. package/skills/gsd-path-inspect/agents/openai.yaml +6 -0
  217. package/skills/gsd-path-inspect/references/codebase-mapper.md +52 -0
  218. package/skills/gsd-path-inspect/references/dispatch.md +131 -0
  219. package/skills/gsd-path-inspect/references/docs-auditor.md +60 -0
  220. package/skills/gsd-path-inspect/scripts/_common.py +180 -0
  221. package/skills/gsd-path-inspect/scripts/check_docs_audit.py +463 -0
  222. package/skills/gsd-path-inspect/scripts/check_handoffs.py +1855 -0
  223. package/skills/gsd-path-inspect/scripts/check_task_briefs.py +376 -0
  224. package/skills/gsd-path-inspect/scripts/detect_project.py +1517 -0
  225. package/skills/gsd-path-inspect/scripts/discussion_records.py +619 -0
  226. package/skills/gsd-path-inspect/scripts/isolation.py +3538 -0
  227. package/skills/gsd-path-inspect/scripts/pipeline_git.py +940 -0
  228. package/skills/gsd-path-inspect/scripts/pipeline_state.py +2291 -0
  229. package/skills/gsd-path-inspect/scripts/state_checkpoint.py +1039 -0
  230. package/skills/gsd-path-inspect/scripts/state_promote.py +743 -0
  231. package/skills/gsd-path-inspect/templates/codebase.md +46 -0
  232. package/skills/gsd-path-inspect/templates/docs-audit.md +69 -0
  233. package/skills/gsd-path-inspect/templates/state.md +27 -0
  234. package/skills/gsd-path-loop/SKILL.md +98 -0
  235. package/skills/gsd-path-loop/agents/openai.yaml +6 -0
  236. package/skills/gsd-path-loop/examples/ci-repair.LOOP.md +61 -0
  237. package/skills/gsd-path-loop/scripts/_common.py +180 -0
  238. package/skills/gsd-path-loop/scripts/discussion_records.py +619 -0
  239. package/skills/gsd-path-loop/scripts/loop_run.py +837 -0
  240. package/skills/gsd-path-loop/templates/loop.md +59 -0
  241. package/skills/gsd-path-migrate/SKILL.md +134 -0
  242. package/skills/gsd-path-migrate/agents/openai.yaml +6 -0
  243. package/skills/gsd-path-migrate/scripts/core_hook_gate.py +34 -0
  244. package/skills/gsd-path-migrate/scripts/core_hook_settings.py +119 -0
  245. package/skills/gsd-path-migrate/scripts/discussion_records.py +619 -0
  246. package/skills/gsd-path-migrate/scripts/migrate_core.py +169 -0
  247. package/skills/gsd-path-plan/SKILL.md +411 -0
  248. package/skills/gsd-path-plan/agents/openai.yaml +6 -0
  249. package/skills/gsd-path-plan/references/dispatch.md +131 -0
  250. package/skills/gsd-path-plan/references/planner.md +104 -0
  251. package/skills/gsd-path-plan/scripts/_common.py +180 -0
  252. package/skills/gsd-path-plan/scripts/check_handoffs.py +1855 -0
  253. package/skills/gsd-path-plan/scripts/check_task_briefs.py +376 -0
  254. package/skills/gsd-path-plan/scripts/discussion_records.py +619 -0
  255. package/skills/gsd-path-plan/scripts/isolation.py +3538 -0
  256. package/skills/gsd-path-plan/scripts/pipeline_git.py +940 -0
  257. package/skills/gsd-path-plan/scripts/pipeline_state.py +2291 -0
  258. package/skills/gsd-path-plan/scripts/review_panel.py +553 -0
  259. package/skills/gsd-path-plan/scripts/state_checkpoint.py +1039 -0
  260. package/skills/gsd-path-plan/scripts/state_promote.py +743 -0
  261. package/skills/gsd-path-plan/scripts/workflow_run.py +117 -0
  262. package/skills/gsd-path-plan/templates/patch-findings.md +16 -0
  263. package/skills/gsd-path-plan/templates/plan-panel.md +25 -0
  264. package/skills/gsd-path-plan/templates/plan.md +89 -0
  265. package/skills/gsd-path-plan/templates/task.md +74 -0
  266. package/skills/gsd-path-research/SKILL.md +159 -0
  267. package/skills/gsd-path-research/agents/openai.yaml +6 -0
  268. package/skills/gsd-path-research/references/dispatch.md +131 -0
  269. package/skills/gsd-path-research/references/researcher.md +42 -0
  270. package/skills/gsd-path-research/scripts/_common.py +180 -0
  271. package/skills/gsd-path-research/scripts/check_handoffs.py +1855 -0
  272. package/skills/gsd-path-research/scripts/check_task_briefs.py +376 -0
  273. package/skills/gsd-path-research/scripts/discussion_records.py +619 -0
  274. package/skills/gsd-path-research/scripts/isolation.py +3538 -0
  275. package/skills/gsd-path-research/scripts/pipeline_git.py +940 -0
  276. package/skills/gsd-path-research/scripts/pipeline_state.py +2291 -0
  277. package/skills/gsd-path-research/scripts/state_checkpoint.py +1039 -0
  278. package/skills/gsd-path-research/scripts/state_promote.py +743 -0
  279. package/skills/gsd-path-research/templates/evidence.md +24 -0
  280. package/skills/gsd-path-research/templates/research-handoff.md +25 -0
  281. package/skills/gsd-path-roadmap/SKILL.md +215 -0
  282. package/skills/gsd-path-roadmap/agents/openai.yaml +6 -0
  283. package/skills/gsd-path-roadmap/references/dispatch.md +131 -0
  284. package/skills/gsd-path-roadmap/references/roadmapper.md +48 -0
  285. package/skills/gsd-path-roadmap/scripts/_common.py +180 -0
  286. package/skills/gsd-path-roadmap/scripts/archive_milestone.py +2265 -0
  287. package/skills/gsd-path-roadmap/scripts/check_handoffs.py +1855 -0
  288. package/skills/gsd-path-roadmap/scripts/check_task_briefs.py +376 -0
  289. package/skills/gsd-path-roadmap/scripts/detect_project.py +1517 -0
  290. package/skills/gsd-path-roadmap/scripts/discussion_records.py +619 -0
  291. package/skills/gsd-path-roadmap/scripts/discussion_validate.py +1321 -0
  292. package/skills/gsd-path-roadmap/scripts/integration.py +1433 -0
  293. package/skills/gsd-path-roadmap/scripts/isolation.py +3538 -0
  294. package/skills/gsd-path-roadmap/scripts/pipeline_git.py +940 -0
  295. package/skills/gsd-path-roadmap/scripts/pipeline_state.py +2291 -0
  296. package/skills/gsd-path-roadmap/scripts/promote_lookahead.py +415 -0
  297. package/skills/gsd-path-roadmap/scripts/review_panel.py +553 -0
  298. package/skills/gsd-path-roadmap/scripts/state_checkpoint.py +1039 -0
  299. package/skills/gsd-path-roadmap/scripts/state_promote.py +743 -0
  300. package/skills/gsd-path-roadmap/templates/roadmap.md +38 -0
  301. package/skills/gsd-path-ship/SKILL.md +412 -0
  302. package/skills/gsd-path-ship/agents/openai.yaml +6 -0
  303. package/skills/gsd-path-ship/references/dispatch.md +131 -0
  304. package/skills/gsd-path-ship/references/reviewer.md +188 -0
  305. package/skills/gsd-path-ship/scripts/_common.py +180 -0
  306. package/skills/gsd-path-ship/scripts/archive_milestone.py +2265 -0
  307. package/skills/gsd-path-ship/scripts/build_state.py +854 -0
  308. package/skills/gsd-path-ship/scripts/check_handoffs.py +1855 -0
  309. package/skills/gsd-path-ship/scripts/check_task_briefs.py +376 -0
  310. package/skills/gsd-path-ship/scripts/discussion_records.py +619 -0
  311. package/skills/gsd-path-ship/scripts/discussion_validate.py +1321 -0
  312. package/skills/gsd-path-ship/scripts/integration.py +1433 -0
  313. package/skills/gsd-path-ship/scripts/isolation.py +3538 -0
  314. package/skills/gsd-path-ship/scripts/lean_verification.py +256 -0
  315. package/skills/gsd-path-ship/scripts/pipeline_git.py +940 -0
  316. package/skills/gsd-path-ship/scripts/pipeline_state.py +2291 -0
  317. package/skills/gsd-path-ship/scripts/review_panel.py +553 -0
  318. package/skills/gsd-path-ship/scripts/state_checkpoint.py +1039 -0
  319. package/skills/gsd-path-ship/scripts/state_promote.py +743 -0
  320. package/skills/gsd-path-ship/scripts/workflow_run.py +117 -0
  321. package/skills/gsd-path-ship/templates/archive-manifest.md +37 -0
  322. package/skills/gsd-path-ship/templates/final-review.md +27 -0
  323. package/skills/gsd-path-ship/templates/gap-review.md +20 -0
  324. package/skills/gsd-path-ship/templates/patch-findings.md +16 -0
  325. package/skills/gsd-path-ship/templates/wave-review.md +64 -0
  326. package/skills/gsd-path-undo/SKILL.md +45 -0
  327. package/skills/gsd-path-undo/agents/openai.yaml +6 -0
  328. package/skills/gsd-path-undo/scripts/_common.py +180 -0
  329. package/skills/gsd-path-undo/scripts/discussion_records.py +619 -0
  330. package/skills/gsd-path-undo/scripts/pipeline_undo.py +1039 -0
  331. package/skills/path/BUILD.md +700 -0
  332. package/skills/path/DECIDE.md +115 -0
  333. package/skills/path/DEFINE.md +297 -0
  334. package/skills/path/DOCS-AUDIT.md +190 -0
  335. package/skills/path/INSPECT.md +167 -0
  336. package/skills/path/PLAN.md +411 -0
  337. package/skills/path/RESEARCH.md +159 -0
  338. package/skills/path/ROADMAP.md +215 -0
  339. package/skills/path/SHIP.md +412 -0
  340. package/skills/path/SKILL.md +471 -0
  341. package/skills/path/agents/openai.yaml +6 -0
  342. package/skills/path/references/codebase-mapper.md +52 -0
  343. package/skills/path/references/coder.md +90 -0
  344. package/skills/path/references/decider.md +36 -0
  345. package/skills/path/references/dispatch.md +131 -0
  346. package/skills/path/references/docs-auditor.md +60 -0
  347. package/skills/path/references/planner.md +104 -0
  348. package/skills/path/references/researcher.md +42 -0
  349. package/skills/path/references/reviewer.md +188 -0
  350. package/skills/path/references/roadmapper.md +48 -0
  351. package/skills/path/scripts/_common.py +180 -0
  352. package/skills/path/scripts/archive_milestone.py +2265 -0
  353. package/skills/path/scripts/bootstrap_repository.py +710 -0
  354. package/skills/path/scripts/build_state.py +854 -0
  355. package/skills/path/scripts/check_docs_audit.py +463 -0
  356. package/skills/path/scripts/check_handoffs.py +1855 -0
  357. package/skills/path/scripts/check_task_briefs.py +376 -0
  358. package/skills/path/scripts/check_update.py +93 -0
  359. package/skills/path/scripts/detect_project.py +1517 -0
  360. package/skills/path/scripts/discussion_records.py +619 -0
  361. package/skills/path/scripts/discussion_validate.py +1321 -0
  362. package/skills/path/scripts/dispatch_driver.py +1812 -0
  363. package/skills/path/scripts/integration.py +1433 -0
  364. package/skills/path/scripts/isolation.py +3538 -0
  365. package/skills/path/scripts/lean_verification.py +256 -0
  366. package/skills/path/scripts/loop_run.py +837 -0
  367. package/skills/path/scripts/pipeline_git.py +940 -0
  368. package/skills/path/scripts/pipeline_state.py +2291 -0
  369. package/skills/path/scripts/promote_lookahead.py +415 -0
  370. package/skills/path/scripts/review_findings.py +714 -0
  371. package/skills/path/scripts/review_panel.py +553 -0
  372. package/skills/path/scripts/state_checkpoint.py +1039 -0
  373. package/skills/path/scripts/state_promote.py +743 -0
  374. package/skills/path/scripts/token_budget.py +146 -0
  375. package/skills/path/scripts/workflow_run.py +117 -0
  376. package/skills/path/templates/answers.md +29 -0
  377. package/skills/path/templates/archive-manifest.md +37 -0
  378. package/skills/path/templates/charter.md +50 -0
  379. package/skills/path/templates/codebase.md +46 -0
  380. package/skills/path/templates/dialogue.md +21 -0
  381. package/skills/path/templates/docs-audit.md +69 -0
  382. package/skills/path/templates/evidence.md +24 -0
  383. package/skills/path/templates/final-review.md +27 -0
  384. package/skills/path/templates/gap-review.md +20 -0
  385. package/skills/path/templates/intent.md +98 -0
  386. package/skills/path/templates/loop.md +59 -0
  387. package/skills/path/templates/patch-findings.md +16 -0
  388. package/skills/path/templates/plan-panel.md +25 -0
  389. package/skills/path/templates/plan.md +89 -0
  390. package/skills/path/templates/repository.md +16 -0
  391. package/skills/path/templates/research-handoff.md +25 -0
  392. package/skills/path/templates/roadmap.md +38 -0
  393. package/skills/path/templates/skeptic.md +36 -0
  394. package/skills/path/templates/state.md +27 -0
  395. package/skills/path/templates/synthesis.md +36 -0
  396. package/skills/path/templates/task.md +74 -0
  397. package/skills/path/templates/wave-panel.md +25 -0
  398. package/skills/path/templates/wave-review.md +64 -0
@@ -0,0 +1,700 @@
1
+ ---
2
+ name: gsd-path-build
3
+ description: Execute or resume an approved GSD Path plan with isolated task worktrees, deterministic commits, and independent wave review. Use only when the user explicitly invokes $gsd-path-build or an active $gsd-path router explicitly routes to this phase.
4
+ ---
5
+
6
+ # GSD Path Build Orchestrator
7
+
8
+ Orchestrate coders, task landing, and reviewers from the main conversation.
9
+ Never write product code in the orchestrator.
10
+
11
+ Routing instructions below are caller handoffs under the AGENTS.md handoff
12
+ rule; never invoke an explicit-only sibling skill yourself.
13
+
14
+ ## Preconditions and branch binding
15
+
16
+ - Require `pipeline: gsd-path/v2` in `.project/STATE.md`, an approved
17
+ `.project/plan/PLAN.md`, and valid task files in `.project/tasks/`. A missing
18
+ or different pipeline marker returns to `$gsd-path` for ownership checking.
19
+ Legal entry is `plan/done`, `build/active|blocked`, or transition recovery
20
+ from `build/done`; any later phase or an incomplete predecessor blocks
21
+ rather than rewinding state. A concrete STATE.archive during `build/*`
22
+ marks an interrupted milestone-abandon transaction: resume the Milestone
23
+ abandon procedure below before any recovery or dispatch. `build/done` is
24
+ recovery-only: follow [Completion](#completion) instead of dispatching.
25
+ - Read the local [coder role](references/coder.md),
26
+ [reviewer role](references/reviewer.md), [dispatch contract](references/dispatch.md),
27
+ [task template](templates/task.md),
28
+ [wave-review template](templates/wave-review.md),
29
+ [wave-panel template](templates/wave-panel.md), and
30
+ [skeptic template](templates/skeptic.md). Resolve them to absolute
31
+ paths before briefing agents. Resolve `scripts/review_panel.py` when
32
+ PLAN.md Config names a review panel. Resolve `scripts/review_findings.py`
33
+ for blocked-wave finding sets. Resolve `scripts/check_handoffs.py`
34
+ for Intent coverage. Resolve `scripts/pipeline_state.py` for guarded state
35
+ transitions. Resolve `scripts/isolation.py` for task isolation, recovery,
36
+ verify sidecars, task landing, and bookkeeping checkpoints; do not invent
37
+ `git worktree add`, `--detach`, commit, or cherry-pick commands. Resolve
38
+ `scripts/build_state.py` for the ready set, task reconciliation, the
39
+ landed-task proof, and the verify ledger
40
+ (`.project/build/verify-ledger.jsonl`, one JSON line per run: command,
41
+ commit, result, timestamp); do not select or reconcile tasks in prose.
42
+ - There is no board file. Task frontmatter is the only task-state record;
43
+ when a report or question needs a wave summary, render it inline from the
44
+ task files and wave reviews. Record escalations and plan defects in the
45
+ STATE.md log.
46
+ - Require a Git worktree with no unrelated changes. Roadmap and plan
47
+ approval checkpoints normally leave `.project/` fully committed; expected
48
+ uncommitted `.project/` planning artifacts may remain only through initial
49
+ branch binding when a checkpoint was deferred (a `Kind: new-github`
50
+ transaction or no Git repository at approval time). On an approved patch
51
+ re-entry, the exact review findings, appended
52
+ plan/tasks, approval state, and no other changes are also expected; the build
53
+ orchestrator checkpoints them with the `build/active` transition before a layer
54
+ base. Append-only `.project/discuss/DIALOGUE.md` and `ANSWERS.md` records are
55
+ also expected bookkeeping: verify that their diff only appends complete
56
+ records, then include them in the next normal orchestrator bookkeeping checkpoint
57
+ before establishing a layer base. Never discard, stash, or absorb another
58
+ change.
59
+ - Before recovery or dispatch and again before each layer/wave gate, scan
60
+ ANSWERS.md for pending required follow-ups under AGENTS.md. Apply an answer
61
+ addressed to build only through PLAN/task bookkeeping that is legal in
62
+ the current build state and append its disposition receipt. If it changes an
63
+ approved upstream contract or names another owner, set `build/blocked`, link
64
+ ANSWERS.md and the target artifact, and ask the user; never establish a new
65
+ layer base from stale inputs.
66
+ - Fetch the configured remote and resolve its default ref and exact SHA without
67
+ checking out, pulling, or updating the local default branch. When
68
+ `STATE.branch` is set, adopt that recorded branch — never whatever clean
69
+ unmerged non-default branch happens to be current: require the current
70
+ symbolic branch to equal it. Ignore ship and integrate commits for older
71
+ milestones inherited from main. Find only a ship subject whose M00N matches
72
+ STATE.branch (including its legacy sequence form). If one exists and is not
73
+ an ancestor of the resolved remote-default SHA, this milestone's integration
74
+ is incomplete: stop and return to `$gsd-path`, which routes to ship, not
75
+ build. If that current-milestone ship is on the default without its matching
76
+ `integrate:` commit, block as externally polluted. A newly prebound branch
77
+ whose HEAD equals the resolved remote-default SHA is valid. A null branch is
78
+ always an incomplete router binding: return to `$gsd-path`, which runs
79
+ `pipeline_git.py bind-initial` or resumes `bind-next`. Build never creates,
80
+ selects, switches, or rebinds a milestone branch. A mismatch or a branch
81
+ owned by another worktree blocks.
82
+ - When `.project/REPOSITORY.md` records `Kind: new-github`, parse its required
83
+ fixed fields and verify the current root is the recorded linked primary
84
+ worktree and the recorded default checkout stays clean on the remote
85
+ default. Its local default ref may lag origin as integrations advance the
86
+ remote default — that lag is not a violation, and the checkout is never
87
+ entered or updated. The artifact's `GSD Path branch` is the first bound
88
+ branch (`gsd-path/M001`); after a shipped milestone STATE.branch may be a
89
+ later `gsd-path/M00N` created at the then-current remote-default SHA. Adopt
90
+ the proven worktree and default checkout; do not parse STATE log prose or
91
+ create another primary worktree.
92
+ - With the dispatch driver, let `round` perform the entry transition below.
93
+ For manual dispatch, on entry from `plan/done`, run the bundled
94
+ `pipeline_state.py transition` helper with the loaded state's full field
95
+ set expected. Set `phase: build` and `status: active`, and use event `build
96
+ started`. Recover `build/blocked` the same way with all old values expected.
97
+ Checkpoint that transition with the expected initial `.project/` artifacts
98
+ before dispatch. Never edit or append STATE.md through model-side text
99
+ transforms. From then on, every
100
+ dispatch round starts from a clean primary worktree and exact full `HEAD`
101
+ SHA. Every orchestrator bookkeeping checkpoint uses subject `build: <what
102
+ changed>` plus a body that starts with `Why: <one sentence>` and may add
103
+ `Wave:`, `Tasks:`, and `Base:` field lines. Task landing still goes
104
+ through `isolation.py land`; do not invent those commit messages.
105
+
106
+ **Bookkeeping checkpoint.** Every build-orchestrator instruction below to
107
+ checkpoint `.project/` records uses this helper. Record the exact full HEAD
108
+ before the first metadata change in that checkpoint, then run:
109
+
110
+ ```text
111
+ python3 <absolute isolation.py> checkpoint \
112
+ --repo <absolute primary> \
113
+ --expected-head <recorded-full-HEAD> \
114
+ --subject 'build: <what changed>' \
115
+ --body 'Why: <one sentence>' \
116
+ --allow-path .project
117
+ ```
118
+
119
+ Add only the documented optional `Wave:`, `Tasks:`, and `Base:` body lines.
120
+ A typed error blocks and leaves no claimed checkpoint. The returned full
121
+ commit becomes the next clean base. This is the only build bookkeeping commit
122
+ path; product landing remains `isolation.py land`, and the ship commit remains
123
+ ship-owned. One checkpoint per repair, ruling, or transition: the edits and
124
+ the STATE.md log line that records them land together. Never add a second
125
+ STATE.md-only "finalize" checkpoint for work already checkpointed. The helper
126
+ refuses a `build:` checkpoint that deletes or renames a `.project/tasks/`
127
+ brief unless the canonical `build: abandon milestone <slug>` checkpoint moves
128
+ that same brief into `.project/archive/`; build adds fix tasks and repairs
129
+ briefs, it never replans.
130
+
131
+ ## Wave loop
132
+
133
+ For each `## Wave N` in PLAN.md order (a wave's tasks are the task files whose
134
+ `wave` equals N):
135
+
136
+ **Dispatch driver.** Steps 1–5 below are deterministic, and the bundled
137
+ `scripts/dispatch_driver.py` runs them: recover, settle exited coders, the
138
+ bookkeeping checkpoint, `ready`, brief lint, `prepare-task`, `activate-task`,
139
+ one child per ready task, then Verify in the isolate, Log append, `land`,
140
+ `verify-record`, and `retire` in task-id order. Prefer it whenever the owner
141
+ supplies a child command (a headless CLI that reads the brief on stdin, for
142
+ example `claude -p --output-format json ...` or `codex exec --json ...`; the
143
+ owner's flags own the child's permissions):
144
+
145
+ ```text
146
+ python3 <absolute dispatch_driver.py> round --repo <absolute primary> --wave <N> \
147
+ --child-command '<owner command>' [--wait <owner seconds>] \
148
+ [--child-timeout <owner seconds>]
149
+ ```
150
+
151
+ `round` owns the entry transition described in Preconditions and branch
152
+ binding, checkpointed as `build: start milestone`, and sets `build/blocked`
153
+ on a dependency deadlock or a blocked
154
+ recovery; every other stop stays with the parent. Act only on its receipt:
155
+ `done` means every wave task landed — run
156
+ `review --wave <N> --cycle <C> --child-command '<owner command>' [--wait
157
+ <owner seconds>]` for step 6 at `full` or `deep` depth: it records the clean
158
+ review base, creates one verify sidecar per lens, briefs one reviewer child
159
+ per lens with every task's base and landing commit, validates each file in
160
+ its sidecar, copies it to the canonical path, retires the sidecar, and only
161
+ after every lens settles concludes: a passing cycle with no panel is
162
+ checkpointed; with a panel configured (`panel_required: true`) run `panel
163
+ --wave <N> --cycle <C> --advertised <slugs> [--parent-slug <slug>]
164
+ --child-command '<owner command with {model}>'`, which resolves the panel,
165
+ persists a skipped receipt or runs one panelist per family in its own
166
+ sidecar, merges the family files, and makes the single on-pass checkpoint;
167
+ `blocked` returns the `review_findings.py collect` grouping; when its
168
+ `skeptic_groups` is non-empty, `skeptics --wave <N> --cycle <C>
169
+ --child-command '<owner command>'` runs one read-only skeptic per locator in
170
+ its own sidecar at the review base, validates and collects each file, and
171
+ reruns the helper; then `fix-tasks --wave <N> --cycle <C>` writes one
172
+ lint-clean fix task per batch carrying the failed criteria and observations
173
+ verbatim, or returns `escalate` for structural blockers, skeptic groups, the
174
+ cycle cap, or an all-refuted ruling, which stay with step 7 and the user.
175
+ The driver never writes a `verify-only` file (`status: not-applicable`);
176
+ `in-flight` means call `round` again; `question` means answer from the
177
+ approved artifacts or the user, record it with `answer --task-id <id>
178
+ --answer '<answer> — <citation>'`, and call `round` again, which redispatches
179
+ the retained isolate; `blocked` names the task, reason, and output and leaves
180
+ the isolate in place — apply the recovery, retry, or plan-defect procedure in
181
+ steps 1–2 by hand, then call `round` again. The driver counts dispatches per
182
+ task per milestone and stops at `--max-attempts` (default 2: the first
183
+ dispatch plus this contract's one logged redispatch); owner token limits, when
184
+ supplied, gate every dispatch through the milestone's budget ledger. Do not repeat a step the receipt
185
+ already proves. Without a child command, dispatch through the runtime
186
+ dispatch contract and perform steps 1–5 by hand.
187
+
188
+ 1. **Recover before dispatch.** Run `python3 <absolute isolation.py> recover
189
+ --repo <absolute primary>`. It is read-only and proves every `done` task's
190
+ landing commit from its exact stamped base (first-parent scan for
191
+ `<task-id>: <task title>`, body `Task:`/`Base:`/`Files:`, the base task's
192
+ declared path allow-list from the task file at that base, exact landing
193
+ metadata, append-only task-file body, and
194
+ patch equality with a retained task branch). Pending and `in-progress`
195
+ tasks bypass landing-history proof and report retained resume state or
196
+ `none`; failed and blocked tasks with retained isolation report
197
+ `reconcile`. Act only on its verdicts;
198
+ do not re-derive them in prose, rerun Verify on a proven commit, use an
199
+ unanchored log grep, infer a SHA from `done`, or reset unknown work.
200
+ - `attested`: an owner ruling stands in for the landing commit (see the
201
+ block escalation below); treat it as landed and never redispatch.
202
+ - `recovered`: the task is landed (`land` already stamped `status: done`
203
+ and `base`). Retire a still-present task worktree with `isolation.py
204
+ retire` only when the report shows it present, clean, and on the task
205
+ branch. If only `task_branch` remains, finish its proven interrupted
206
+ retirement with `retire --branch <task_branch> --force --landed-commit
207
+ <commit>`; both absent is valid.
208
+ - `resume`: continue from the returned `base`, `task_branch`, and worktree
209
+ (the primary itself when no task branch exists); when the report shows
210
+ the worktree absent, return the task to `pending` only when ownership is
211
+ clear. When `dispatch_retry` is true, reuse the returned clean isolate,
212
+ write fresh dispatch metadata and agent there, then dispatch; do not
213
+ recreate it. When `landing_retry` is true, do not resume implementation
214
+ or redispatch; rerun `land` against the returned isolate and base.
215
+ - `reconcile`: do not resume implementation. Preserve the returned isolate
216
+ evidence and follow the failed/blocked reconciliation in step 2.
217
+ - `block` on a `done` task with reason `done but no landing commit proves
218
+ it` or `done task has invalid base`: the work was committed outside
219
+ `land`. Never repair history or task frontmatter by hand. Set
220
+ `build/blocked`, present **Outcome** naming every such task, and ask the
221
+ user for a ruling per task; put any suggested ruling text in its own
222
+ fenced code block so it pastes cleanly. On an explicit ruling, run that task's Verify
223
+ at HEAD, record it with `python3 <absolute build_state.py> verify-record
224
+ --repo <absolute primary> --command <task Verify> --commit <HEAD>
225
+ --result pass`, then run `python3 <absolute isolation.py> attest --repo
226
+ <absolute primary> --task-file <task file> --ruling <ruling verbatim>`
227
+ (add `--base <SHA>` only to repair an abbreviated or invalid recorded
228
+ base). The helper stamps the task and creates the attestation commit
229
+ itself; each one moves HEAD, so attest tasks one at a time and rerun
230
+ `recover` afterwards.
231
+ - Rewritten lineage: when every `done` task is rejected with `commit does
232
+ not descend from its Base:` after a rebase or replay, the owner may run
233
+ `python3 <absolute isolation.py> adopt-rebase --repo <absolute primary>
234
+ --original-head <preserved original tip> --head <HEAD> --ruling
235
+ "<ruling verbatim>"`, commit the receipt
236
+ `.project/build/rebase-adoption.json` as `.project/` bookkeeping, and
237
+ rerun `recover`. The original lineage must stay reachable: keep a local
238
+ branch on the old tip until the milestone ships. Adopted tasks report
239
+ `attested` with `provenance: owner-authorized-rebase`.
240
+ - `block` for any other reason: set `build/blocked` with the returned
241
+ reason and stop.
242
+ - `none`: take no recovery action for that task.
243
+
244
+ 2. **Prepare the ready set.** Run `python3 <absolute build_state.py> ready
245
+ --repo <absolute primary>`. It is read-only: it validates every task's
246
+ frontmatter against its dispatch metadata and the recovery report, then
247
+ returns `ready` — the current wave's `pending` tasks whose dependencies are
248
+ all `done`, each with `id`, `title`, `deps`, `files`, `task_file`, and
249
+ `verify_heavy` — after proving that ready and `in-progress` tasks have
250
+ disjoint `files`. Dispatch exactly the tasks it returns; do not select,
251
+ order, or overlap-check tasks in prose. Readiness is continuous, not
252
+ layered: a task becomes selectable the moment its last dependency lands,
253
+ even while unrelated tasks still run, so rerun `ready` after each landing.
254
+ A `NEEDS-ORCHESTRATOR` block stays unselectable until its `Orchestrator
255
+ answer` is recorded in the task Log and the task is back to `pending`.
256
+ Its typed errors are the recovery rule:
257
+ - `task-recovery-required`: for each listed failed or blocked task run
258
+ `python3 <absolute build_state.py> reconcile --repo <absolute primary>
259
+ --task-id <id>` and act on its `classification`. `proven-landed`: the
260
+ task already landed at `landed_commit` and its frontmatter is stale —
261
+ reconcile the task file to that landed state and checkpoint it.
262
+ `resumable` or `reconcile`: apply the retry procedure below with the
263
+ returned `history.candidates` as the rejected evidence. `blocked`: set
264
+ `build/blocked` with the returned `reasons` and stop.
265
+ - `dependency-deadlock`: set `build/blocked` with its `tasks` list and stop.
266
+ - `ready-file-overlap` or `invalid-task-state`: a documented plan defect or
267
+ drifted bookkeeping; repair it before a new clean base.
268
+ A documented plan
269
+ defect may be repaired against INTENT.md and SYNTHESIS.md and logged before
270
+ a new clean base. A repair edits only the fields the lint or ruling named
271
+ in the tasks it named — `files`, Verify, Interface contract text, Intent
272
+ coverage rows, an ambiguous AC. It never adds, removes, splits, merges, or
273
+ renames tasks, moves a task between waves, or rewrites another task's
274
+ acceptance criteria; a defect that needs any of those sets `build/blocked`
275
+ with the lint output and returns to plan, which owns the task inventory.
276
+ A user ruling that changes a success criterion,
277
+ constraint, or veto is not a plan defect: set `build/blocked`, do not
278
+ rewrite the AC, and send `$gsd-path-define` to append INTENT.md
279
+ `## Corrections` before plan re-gates. A task Log is not that record. One failed implementation gets one logged redispatch when
280
+ its contract remains valid. Repeated failure, ambiguous ownership, a user
281
+ ruling, or a dependency deadlock sets build state to `blocked` and stops.
282
+ Concurrent tasks must have disjoint `files`; serialize overlapping fix
283
+ tasks. A retry never reuses a rejected dirty worktree: first copy its
284
+ validated append-only task Log delta into the primary task file, record the
285
+ rejected diff's exact path set and hash, and checkpoint the block bookkeeping.
286
+ After confirming every old change is task-owned, retire that exact worktree
287
+ with `python3 <absolute isolation.py> retire --repo <absolute primary>
288
+ --worktree <path> --branch <task_branch> --force --task-file <task path>`,
289
+ then create the retry. If retirement was interrupted after removing the
290
+ worktree, rerun the same command; the recorded failed or blocked task and
291
+ its exact base prove the remaining branch before deletion. Create the retry
292
+ from the new clean primary HEAD. After
293
+ resolving a recoverable `build/blocked` condition, use
294
+ `pipeline_state.py transition` with the blocked state and bound branch as
295
+ expected fields to set `build/active` and log the resolution. Checkpoint it
296
+ through the bookkeeping rule before recording that new dispatch-round base.
297
+
298
+ 3. **Isolate every task.** Checkpoint pending bookkeeping through the rule
299
+ above, then record clean `HEAD` as
300
+ this dispatch round's base — tasks dispatched in the same round share it;
301
+ a later round unlocked by fresh landings records the later HEAD — and
302
+ lint every ready task's brief with the bundled
303
+ `scripts/check_task_briefs.py --repo <absolute repo root> --base <recorded
304
+ base>` and re-check Intent coverage with
305
+ `python3 <absolute check_handoffs.py> plan --repo <absolute repo root>`
306
+ before creating any worktree; a lint or coverage failure is a documented plan
307
+ defect — repair it against INTENT.md and SYNTHESIS.md, then re-establish
308
+ the base. Then isolate each ready task with
309
+ `python3 <absolute workflow_run.py> prepare-task --repo <absolute primary>
310
+ --expected-head <recorded base> --task-id <id> --round-size <N>` where N is the
311
+ number of tasks in this dispatch round. Serial (`N=1`) returns the primary
312
+ worktree and `task_branch: null` — the coder works on the bound branch.
313
+ The runner also creates a named verification sidecar at this clean base
314
+ before dispatch. Retain both helper results in the dispatch evidence.
315
+ Parallel (`N>=2`) creates a named `gsd-path-task/<id>` branch and linked
316
+ worktree at that base; never a detached HEAD. Record dispatch through
317
+ `python3 <absolute isolation.py> activate-task --repo <returned worktree>
318
+ --base <recorded base> --task-id <id> --agent build_<id> --task-file
319
+ <exact selected task-file path> [--task-branch <returned task_branch>]`.
320
+ The helper sets `base`, `worktree`, `task_branch`, `status: in-progress`,
321
+ and `agent` in the isolated task and records parallel build authorization.
322
+ Do not edit those fields directly. Do not commit this dispatch state: it lands
323
+ inside the task's own commit, and `recover` derives it from the task
324
+ branch and worktree meanwhile. The primary stays clean during a parallel
325
+ round. Do not append a dispatch Log entry: the isolated task later appends
326
+ at that location, and two parallel appends make the cherry-pick ambiguous. Reuse a retained worktree only when
327
+ its recorded base, branch, and task agree exactly.
328
+
329
+ 4. **Dispatch the round.** Following the local runtime dispatch contract,
330
+ spawn one implementation-capable child per task with deterministic logical
331
+ task name `build_<task_id>`.
332
+ Its brief contains the absolute isolated-worktree root, coder role, task
333
+ file, task template, and the absolute INTENT.md path in that worktree.
334
+ Add no hidden implementation context; repair a
335
+ defective task contract before establishing the round base. Run ready work
336
+ up to capacity. Verify commands marked `Heavy: yes` (`verify_heavy` in the
337
+ ready set) run one at a time across every concurrent task, including the
338
+ step 5 rerun; light ones are unconstrained. Do not wait for the whole
339
+ round before unlocking dependents: each task landing in step 5 re-opens
340
+ step 2, and a newly ready
341
+ task dispatches in a fresh round at the current clean HEAD while unrelated
342
+ tasks still run. The wave advances to review only when every wave task is
343
+ `done`.
344
+
345
+ 5. **Verify and land serially as results arrive.** A coder returns only
346
+ `ready` or `blocked`; it never owns frontmatter or Git. Process each
347
+ completion when it lands — never wait for slower in-flight tasks first;
348
+ when several results wait, land them in task-id order.
349
+
350
+ - For `ready`, compare the complete worktree diff to `base`. Permit only
351
+ declared `files` plus append-only Log changes in that task file. Include
352
+ additions, deletions, renames, and binary changes; an unexpected path
353
+ blocks before any product commit.
354
+ - For serial work, reproduce the validated complete task patch, including
355
+ untracked additions, in the pre-created verification sidecar. Keep the
356
+ primary patch intact. Check its product diff against the primary task
357
+ diff before verifying; retire the sidecar through `isolation.py retire`
358
+ after preserving its evidence and removing only those reproduced changes.
359
+ Parallel work uses the task's existing isolated worktree.
360
+ - Run the task's Verify command in that isolated worktree. This rerun is the
361
+ authoritative task evidence; a command run in the primary or a sibling
362
+ worktree never counts. Append its exact result to the task Log. After
363
+ `land` returns, when `git rev-parse <landed commit>^` equals the
364
+ recorded `base` the landed tree is the verified tree: record the run
365
+ with `python3 <absolute build_state.py> verify-record --repo <absolute
366
+ primary> --command <task Verify> --commit <landed commit> --result
367
+ pass`. The ledger is `.project` bookkeeping; the next checkpoint
368
+ commits it.
369
+ - Land with
370
+ `python3 <absolute isolation.py> land --repo <absolute primary>
371
+ --source <isolated worktree> --base <recorded base> --task-id <id>
372
+ --title <task title> --task-file <task path> --allow-path <each declared
373
+ file>`. Do not invent commit or cherry-pick commands. For a serial round,
374
+ the primary must still be on the bound branch at the recorded base. A
375
+ non-zero exit reports the exact landing failure, such as an unexpected
376
+ path, base or branch mismatch, invalid task proof, conflict, or empty diff.
377
+ On conflict the helper aborts and leaves the primary clean on the bound
378
+ branch. Never leave task landing in progress.
379
+ - `land` stamps `status: done`, `base`, and null `worktree`/`task_branch`
380
+ into the task frontmatter and records `Base:` in the commit body, so the
381
+ product commit is the task's only commit; there is no `commit`
382
+ frontmatter field — `recover` proves the SHA from git. Do not write a
383
+ separate bookkeeping commit. Retire the isolate with
384
+ `python3 <absolute isolation.py> retire --repo <absolute primary>
385
+ --worktree <isolated worktree> [--branch <task_branch>]`. Serial rounds
386
+ return `retired: false` and leave the bound branch untouched. Each
387
+ completed task landing re-opens step 2: dispatch newly
388
+ ready dependents in a fresh round at the current clean HEAD instead of
389
+ idling behind unrelated in-flight tasks.
390
+ - A block whose Log delta leads with `NEEDS-ORCHESTRATOR:` is a contract
391
+ question, not a failure. When the approved artifacts (PLAN.md,
392
+ INTENT.md, SYNTHESIS.md, and the Interface contracts of every involved
393
+ task) pin exactly one answer, append `Orchestrator answer: <answer> —
394
+ <artifact citation>` to the task Log, return the task to `pending`,
395
+ checkpoint the bookkeeping, and let a later layer redispatch it; a question
396
+ redispatch never consumes the failed-implementation redispatch. When the
397
+ runtime's structured layer exposes a blocking ask/reply channel, relay
398
+ the answer through it with the worker held alive per the runtime
399
+ dispatch contract instead of redispatching. A dispatch-driver question
400
+ keeps the isolate active: record the answer with `dispatch_driver.py
401
+ answer`, and the next `round` redispatches that same isolate. When
402
+ the artifacts admit more than one reading, ask the user through an
403
+ interactive user-input tool when available, record the ruling verbatim
404
+ as the answer, and repair the task contract as a documented plan defect
405
+ when the ruling changes it — except a ruling that changes a success
406
+ criterion, constraint, or veto, which follows the define-Corrections
407
+ path above. A question block creates no product commit
408
+ and preserves the isolated worktree under the same retirement rule. Before
409
+ changing its canonical bookkeeping, revoke a parallel isolate's active
410
+ dispatch with `python3 <absolute isolation.py> deactivate-task --repo
411
+ <isolated worktree> --task-id <id> --task-branch <task_branch>`.
412
+ - A blocked report, invalid diff, or failed Verify creates no product
413
+ commit. Validate and copy the isolated task's append-only Log delta once;
414
+ it is the coder's sole block/implementation narrative. Add orchestrator
415
+ evidence only for a distinct diff or Verify rejection. Before changing the
416
+ task to `blocked` or `failed`, revoke a parallel isolate's active dispatch
417
+ with `python3 <absolute isolation.py> deactivate-task
418
+ --repo <isolated worktree> --task-id <id> --task-branch <task_branch>`.
419
+ Then update and checkpoint the bookkeeping and apply the recovery
420
+ rule. Preserve the isolated worktree unless and until the explicit clean
421
+ retry-retirement procedure in step 2 owns and removes it.
422
+
423
+ 6. **Review the wave.** The build orchestrator owns wave reviews; ship never
424
+ runs them. Only after every wave task is done, read the wave's
425
+ `Review depth` from PLAN.md (default `full`). At `full` or `deep` the
426
+ dispatch driver's `review` action performs the sidecar, brief, validate,
427
+ collect, and retire work of this step; perform it by hand only without a
428
+ child command.
429
+ - `full`: spawn one independent reviewer using deterministic logical task
430
+ name `review_wave_<wave>_cycle_<cycle>`. Supply every task path, its
431
+ recorded base and proven landing commit, the reviewer role, and
432
+ wave-review template, and the absolute INTENT.md path.
433
+ When INTENT selects quick lane and PLAN has one full wave, also assign
434
+ final scope: supply PLAN.md's Surface contract and the recorded review HEAD.
435
+ The same reviewer checks all success criteria and any remaining walkthrough
436
+ in this pass, records `Review scope: final` and `Reviewed HEAD`, and adds
437
+ Surface/Check/Observed fields to each surface criterion. Reuse recorded
438
+ command evidence when it already proves the named walkthrough; execute
439
+ only missing checks. Ship can then derive FINAL.md without another reviewer.
440
+ Record current clean primary HEAD as the review collection base. Create
441
+ a fresh review sidecar there; the serial task verification sidecar belongs
442
+ to the earlier task base and cannot be collected after landing.
443
+ Use `python3 <absolute isolation.py> isolate-verify --repo <absolute primary>
444
+ --base <recorded review base> --name wave-<N>-cycle-<C>`. Each task's
445
+ recorded base and landing commit still define its isolated review diff.
446
+ Keep primary HEAD fixed until collection completes. Brief the
447
+ recorded isolated Verify output per task (the Log entry the
448
+ orchestrator appended at landing). The reviewer must not re-run that
449
+ command or PLAN.md's project Verify. The reviewer
450
+ stages `.project/review/wave-N.cycleC.md` there; the
451
+ orchestrator validates it, atomically copies it to the primary canonical
452
+ path, and only then retires that sidecar with `retire`.
453
+ - `deep`: spawn two independent reviewers in parallel, each with a fresh
454
+ isolated context and its own verify sidecar from `isolate-verify` at the
455
+ recorded review base (`--name wave-<N>-cycle-<C>-contract` and
456
+ `wave-<N>-cycle-<C>-adversarial`). Supply both every task path, its
457
+ recorded base and proven landing commit, the reviewer role, and the
458
+ wave-review template, and the absolute INTENT.md path. The contract lens —
459
+ logical task name `review_wave_<wave>_cycle_<cycle>_contract` — does the
460
+ full review: apply each task's `commit^..commit` product patch to the
461
+ recorded base, check the recorded Verify plus the isolated diff, and
462
+ check every acceptance criterion,
463
+ owned INTENT success criterion, and interface contract. The adversarial
464
+ lens — logical task name
465
+ `review_wave_<wave>_cycle_<cycle>_adversarial` — tries to kill the work:
466
+ security holes, unhandled edge cases, failure modes, data-loss and
467
+ concurrency risks, and missing error handling. Each stages its own file
468
+ in its own worktree — `.project/review/wave-N.cycleC.contract.md` and
469
+ `.project/review/wave-N.cycleC.adversarial.md`; the orchestrator validates
470
+ each, atomically copies both to their primary canonical paths, and only
471
+ then retires those sidecars. The wave passes only when both lenses
472
+ return `pass`; any `blocked` lens blocks the wave, and both files'
473
+ findings feed the fix-task batching in step 7.
474
+ - A review file is written only during that cycle, at that cycle's recorded
475
+ base, by the writer the selected depth names: a dispatched reviewer at
476
+ `full` or `deep`, or the orchestrator at `verify-only`. Never backfill,
477
+ split, rename, or reconstruct a review file for a cycle that already ran,
478
+ and never write a placeholder verdict for a task that did not exist at
479
+ that cycle. A missing or non-canonical earlier artifact is reported to
480
+ the user; the
481
+ only repair is a new review cycle at the current HEAD, which counts
482
+ toward the cap.
483
+ - `verify-only`: spawn no reviewer. The orchestrator writes
484
+ `.project/review/wave-N.cycleC.md` itself from evidence it already
485
+ holds — per task, the Verify evidence and the declared-files diff
486
+ check — recording `Depth: verify-only`. Same command, same commit
487
+ reuses the recorded pass: the task's Verify evidence is the ledger
488
+ entry when `python3 <absolute build_state.py> verify-lookup --repo
489
+ <absolute primary> --command <task Verify> --commit <landed commit>`
490
+ returns `reuse: true`; otherwise run the command in an
491
+ `isolate-verify --historical-task <task id>` sidecar at that commit, record it with
492
+ `verify-record`, and use that result. A re-review after a fix cycle
493
+ follows the same rule. It checks each acceptance
494
+ criterion and each INTENT success criterion owned by the wave's tasks
495
+ against that evidence and the diff; anything it cannot
496
+ confirm from them is a finding, not a pass. Never spawn a review panel
497
+ at `verify-only`.
498
+ - After the canonical inherit reviewer (or orchestrator-written
499
+ `verify-only` file) is collected, run the optional review panel only
500
+ for `full` and `deep`. Inspect advertised model slugs and run
501
+ `python3 <absolute review_panel.py> resolve --plan <absolute PLAN.md>
502
+ --intent <absolute INTENT.md> --advertised <comma slugs>
503
+ --parent-slug <current model slug when known>` and `--charter
504
+ <absolute .project/CHARTER.md>` when that file exists. `status: off`
505
+ continues with no current-cycle panel artifact. For `skipped`,
506
+ persist the helper's exact JSON stdout as
507
+ `.project/review/wave-N.cycleC.panel.skipped.json` and continue without
508
+ a panel; do not translate or summarize the receipt. Exit 2 / `error`
509
+ blocks the wave. `ready` requires that skipped-receipt path to be absent,
510
+ then spawns one child per selected family with
511
+ logical task name `review_wave_<wave>_cycle_<cycle>_panel_<family>`,
512
+ the reviewer role in wave-panel mode, the wave-panel template, and the
513
+ exact helper-returned model slug when the host advertises model
514
+ selection. On `deep`, each panel brief is the adversarial lens only.
515
+ Never override the model on the canonical reviewer. Each child stages
516
+ its family file in its own verify sidecar from `isolate-verify`
517
+ (`--name wave-<N>-cycle-<C>-panel-<family>`); the parent validates
518
+ those files and runs `python3 <absolute review_panel.py> merge --kind
519
+ wave --wave <N> --cycle <C> --inputs <family files> --output
520
+ <absolute .project/review/wave-N.cycleC.panel.md> --mode
521
+ <detected|named>`. The inherit reviewer remains the only Wave verdict.
522
+ Do not average panel findings into that verdict or auto-create fix
523
+ tasks from preference findings.
524
+ - After the canonical inherit reviewer file (and each deep lens file) is
525
+ on the primary path, run
526
+ `python3 <absolute check_handoffs.py> wave --repo <absolute primary>
527
+ --review <canonical wave-review path>`. A non-zero exit is a blocked
528
+ wave, not a pass, including `verify-only`. Do not advance on helper
529
+ failure.
530
+
531
+ 7. **Fix or advance.** A valid canonical `pass` advances unless an
532
+ actionable review-panel finding is waiting for a user ruling. On
533
+ `blocked`, run `python3 <absolute review_findings.py> collect --repo
534
+ <absolute primary> --wave <N> --cycle <C>`, adding one `--helper-failure
535
+ "<helper and stderr>"` per bundled helper that exited non-zero in this
536
+ cycle. The helper alone reads PLAN.md Config (`max_review_cycles`,
537
+ `finding_skeptics`, `wave_budget`), the cycle's lens files, and every
538
+ skeptic file of the wave; it groups blocking findings by criterion
539
+ locator, collapses true duplicates, carries earlier refutations forward,
540
+ separates structural blockers, batches fix groups by disjoint file scope,
541
+ and reports `cap_reached`. Exit 2 blocks the wave. Never regroup,
542
+ re-derive a locator, or re-decide refutation in model reasoning; act on
543
+ the result in this order:
544
+ - `structural_blockers` non-empty: a missing or invalid lens, panel, or
545
+ skeptic artifact, a helper failure, or a finding that names no
546
+ contract criterion never enters skeptic filtering. Keep it blocking
547
+ through the ordinary blocked-wave handling — a fix task when applicable
548
+ or `build/blocked` escalation otherwise.
549
+ - `cap_reached` true: skip every branch below and use the cycle-cap
550
+ escalation at the end of this step.
551
+ - `skeptic_groups` non-empty: spawn one independent read-only skeptic
552
+ per listed locator, concurrently up to the advertised child capacity,
553
+ with logical task name
554
+ `review_wave_<wave>_cycle_<cycle>_skeptic_<criterion_locator>`, the
555
+ reviewer role in skeptic mode, the skeptic template, and its own verify
556
+ sidecar from `isolate-verify`
557
+ (`--name wave-<N>-cycle-<C>-skeptic-<criterion_locator>`) at the
558
+ recorded review base. Brief each with the group's `locator`,
559
+ `criterion` verbatim, every `observations` entry verbatim, the group's
560
+ `tasks` files, their recorded bases and proven landing commits, and the
561
+ absolute INTENT.md path. Each skeptic stages
562
+ `.project/review/wave-N.cycleC.skeptic-<criterion_locator>.md` in its
563
+ sidecar; validate each against the skeptic template, atomically copy it
564
+ to the primary canonical path, then retire that sidecar. Rerun the
565
+ helper; a locator refuted in an earlier cycle never gets a second
566
+ skeptic, and the helper already routes it.
567
+ - `all_refuted` true: stop and ask. Present **Outcome** with the blocked
568
+ verdict and the refutation count, **Review** linking the lens and
569
+ skeptic files, and **Next** listing `Re-run the review cycle with the
570
+ skeptic files in the reviewer briefs (recommended — no finding survived
571
+ scrutiny)` first, then `Open fix tasks from the findings anyway (an
572
+ explicit ruling that overrides their refutations)`. A selected re-run
573
+ consumes a cycle. After the user selects either option, record exact
574
+ full HEAD, then use `pipeline_state.py transition` with the exact
575
+ current phase, status, branch, and archive as expected and unchanged
576
+ phase/status as the result. Append `wave <N> cycle <C> all-refuted
577
+ ruling: <selected option verbatim>` to the STATE.md Log and require the
578
+ returned position to remain `build/active`. Checkpoint STATE.md and the
579
+ collected skeptic artifacts through the Bookkeeping checkpoint rule with
580
+ subject `build: record wave <N> cycle <C> skeptic ruling`, body `Why:
581
+ persist the all-refuted user ruling before acting`, and `Wave: <N>`. Do
582
+ not start the selected review cycle or create, batch, or dispatch fix
583
+ tasks until the checkpoint returns its commit. When the persisted ruling
584
+ selects `Open fix tasks from the findings anyway`, the override set is
585
+ every `refuted_groups` locator with its preserved `observations`; its
586
+ governing refutation is the group's `skeptic` entry (the current
587
+ cycle's file, or the earlier cycle's file for a same-evidence repeat).
588
+ Add that set to `fix_groups` for batching. No other ruling re-admits
589
+ refuted groups. Preserve their skeptic verdicts and eligibility
590
+ history. After a crash, resume the recorded choice without asking
591
+ again.
592
+ - Otherwise batch `fix_batches` into complete fix tasks from the task
593
+ template — one task per batch, never one per finding — each carrying
594
+ its groups' failed criteria and observed evidence verbatim. A group
595
+ with `repeat` true is evidence its earlier fix failed, never a new
596
+ finding; a re-review never spawns a duplicate fix task for a finding
597
+ already carried. Write each fix task to `.project/tasks/` with `wave`
598
+ set to the current wave or a newly appended `## Wave N` heading in
599
+ PLAN.md before dispatch. Its dependencies include every source task in
600
+ the batch; its files match the batch. In `## Review findings`, use one
601
+ `### <locator>` block per group, `Criterion: <verbatim criterion>`, and
602
+ every observation verbatim. Run the repair through the same isolated
603
+ layer loop, even when its appended wave repairs an earlier blocked wave.
604
+ After landing, call `review_findings.py repair-evidence --repo <primary>
605
+ --wave <source wave> --cycle <source cycle> --task <repair id>` and save
606
+ its JSON as the repair evidence for the next review. The helper validates
607
+ the carried batch, original and repair landings, isolated product scope,
608
+ unchanged source reports and reusable Verify. On success, brief the next
609
+ original-wave review with this receipt and the reviewer role's
610
+ **Re-review after a proven repair** contract. Reuse command evidence;
611
+ the new review judges the repaired product against the original criteria.
612
+ Preserve prior verdicts and source tasks. On helper rejection, resolve
613
+ the evidence blocker rather than redispatching an already proven fix.
614
+ At the cap, record all attempts in the STATE.md log and ask the user —
615
+ through an interactive user-input tool when available — after linking
616
+ the resolved absolute blocking wave review, every deep lens file for the
617
+ cycle, and every skeptic file collected for the wave, plus the STATE.md
618
+ attempt log. Ask whether to redirect the approach, raise the cap, or send
619
+ define to amend INTENT.md `## Corrections` — never rewrite an AC from a
620
+ Log waiver — or, in program flow (ROADMAP.md exists), to abandon the
621
+ milestone under the Milestone abandon procedure — listing the
622
+ orchestrator's recommended option first marked `(recommended)` with a
623
+ one-line reason drawn from the review evidence. Never choose silently.
624
+ When the canonical verdict is `pass` and `wave-N.cycleC.panel.md` reports
625
+ `Actionable` greater than 0, do not advance silently: present **Outcome**
626
+ with the canonical pass plus the actionable count, **Review** linking the
627
+ panel file, and **Next** listing `Open fix tasks from panel findings
628
+ (recommended)` first, then `Advance and keep panel findings as warnings`.
629
+ Preference-only panel warnings do not block advance. On pass, checkpoint
630
+ the review artifact, the panel file when present, STATE.md, and wave
631
+ bookkeeping, then report `wave N/M done, C review cycle(s)`.
632
+
633
+ ## Completion
634
+
635
+ Run `python3 <absolute dispatch_driver.py> complete --repo <absolute primary>`
636
+ from a clean primary at `build/active` or crash-left `build/done`. It checks
637
+ readiness and the archive-time review cycle contract before recording landing
638
+ proof, entering `ship/active`, and checkpointing. A blocked receipt stops
639
+ completion; a `done` receipt proves these steps, so do not repeat
640
+ them. For manual completion:
641
+ after every wave passes, record exact full HEAD and prove every task landed
642
+ with `python3 <absolute workflow_run.py> build-evidence --repo <absolute primary>
643
+ --expected-head <HEAD>`. The runner writes the wrapped `verify-landed` result
644
+ to `.project/build/evidence.json`; that path is the only landing-proof
645
+ location the ship runtime recognizes, so never save the receipt under another
646
+ name. The result must return one
647
+ `proven-landed` or `attested` evidence entry per task, and any non-zero exit
648
+ blocks completion. A `done` task without landing proof follows the `block`
649
+ handling in step 1 above (owner ruling, Verify, `verify-record`, `attest`).
650
+ Then run
651
+ `pipeline_state.py transition`, expecting `build/active` plus the exact branch
652
+ and archive, to set `phase: ship`, `status: active` with event `build done;
653
+ final review pending`. Checkpoint that transition through the rule above with
654
+ subject `build: complete milestone` and a concrete `Why:` body. Do not run
655
+ PLAN.md's project Verify here — ship runs it once. This
656
+ keeps the primary worktree clean and avoids a separate review-phase transition
657
+ checkpoint. Report waves, exact task commits, fixed findings, and remaining risk.
658
+ Link the resolved absolute final wave review as the review surface and state
659
+ that ship is next. Do not merge to the default branch, tag, mark `shipped`, or
660
+ integrate; ship owns FINAL.md, project Verify, and those steps. When invoked
661
+ directly, stop and tell the user to explicitly
662
+ invoke `$gsd-path`, which routes to ship; do not invoke an explicit-only sibling
663
+ skill yourself.
664
+ If a crash leaves `build/done`, use that phase and status as the expected
665
+ transition values, then checkpoint the same `ship/active` result before
666
+ returning to the router.
667
+
668
+ ## Milestone abandon (program flow only)
669
+
670
+ Abandon the active milestone only on an explicit user ruling — from the
671
+ review-cycle-cap escalation, a decision invalidation, or a direct request.
672
+ Require `.project/ROADMAP.md`; a single-milestone project has no abandon
673
+ path — stop and let the user decide how to restart.
674
+
675
+ 1. Retire every recorded task worktree and branch with `isolation.py retire`
676
+ after confirming ownership, recording each discarded uncommitted diff's
677
+ exact path set and hash in the STATE.md log. Never discard work the
678
+ recorded metadata cannot own.
679
+ 2. Run the bundled `scripts/archive_milestone.py abandon --repo <absolute
680
+ repo root> --slug <milestone slug> --reason <user ruling, verbatim>`.
681
+ This one helper-owned transaction journals the exact request and starting
682
+ HEAD before mutation; archives the partial artifacts without review gates;
683
+ marks the exact ROADMAP entry `Status: abandoned` with its `Archive:` path;
684
+ appends `- <NNN>-<slug> — abandoned: <collapsed ruling>` exactly once to
685
+ LESSONS.md; transitions STATE to `roadmap/active` with `milestone: null`
686
+ and `archive: null`; and creates the checkpoint with exact subject `build:
687
+ abandon milestone <slug>` and body `Why: <collapsed ruling>`. The manifest
688
+ `Reason:` and checkpoint `Why:` are the same normalized ruling.
689
+ 3. Rerun the same command with the same slug and ruling after any interruption.
690
+ It resumes archive moves, metadata, state transition, or checkpoint from
691
+ the journaled starting HEAD; a changed slug, ruling, archive, branch, or
692
+ manifest reason blocks. Success returns the archive, exact checkpoint
693
+ commit, and `committed` or `already-complete` status. Never edit or commit
694
+ any part of this transaction manually and never select another sequence
695
+ number.
696
+ 4. Return to the router, which routes `roadmap/active` to the roadmap
697
+ contract in re-slice mode. The abandoned code stays on the build branch
698
+ until the next milestone's integration, then reaches the default branch as
699
+ inert history; the re-slice plans around it. Never revert product commits
700
+ yourself.