@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,146 @@
1
+ #!/usr/bin/env python3
2
+ """Persist observed Codex output usage and block admission after exhaustion.
3
+
4
+ This is an admission gate, not an in-flight generation cap. Codex CLI does not
5
+ expose a hard output-token cap. Unobserved calls are not budget evidence.
6
+ """
7
+
8
+ import argparse
9
+ import json
10
+ import sys
11
+ from pathlib import Path
12
+
13
+ try:
14
+ from _common import atomic_write
15
+ from loop_run import log_lock
16
+ except ModuleNotFoundError: # pragma: no cover - package imports
17
+ from scripts._common import atomic_write
18
+ from scripts.loop_run import log_lock
19
+
20
+
21
+ SCHEMA = "gsd-path/token-budget/v1"
22
+
23
+
24
+ def positive(value):
25
+ result = int(value)
26
+ if result <= 0:
27
+ raise argparse.ArgumentTypeError("budget must be positive")
28
+ return result
29
+
30
+
31
+ def output_usage(path: Path) -> int:
32
+ usages = []
33
+ child_usage = None
34
+ child = False
35
+ starts = 0
36
+ complete = False
37
+ text = path.read_text(encoding="utf-8")
38
+ try:
39
+ document = json.loads(text)
40
+ except ValueError:
41
+ document = None
42
+ if isinstance(document, dict) and isinstance(document.get("usage"), dict):
43
+ # Claude Code `-p --output-format json`: one document with the run's usage.
44
+ usages.append(document["usage"].get("output_tokens"))
45
+ text = ""
46
+ for line in text.splitlines():
47
+ event = json.loads(line)
48
+ if "raw" in event:
49
+ event = json.loads(event["raw"])
50
+ if event.get("type") == "turn.completed":
51
+ usages.append(event["usage"]["output_tokens"])
52
+ payload = event.get("payload", {})
53
+ if event.get("type") == "session_meta":
54
+ source = payload.get("source", {})
55
+ child = isinstance(source, dict) and "subagent" in source
56
+ if event.get("type") == "event_msg":
57
+ if payload.get("type") == "task_started":
58
+ starts += 1
59
+ complete = False
60
+ elif payload.get("type") == "token_count" and payload.get("info"):
61
+ child_usage = payload["info"]["total_token_usage"]["output_tokens"]
62
+ elif payload.get("type") == "task_complete":
63
+ complete = True
64
+ if not usages and child and starts == 1 and complete and child_usage is not None:
65
+ # Only a single native invocation has an unambiguous cumulative counter.
66
+ usages = [child_usage]
67
+ if not usages or any(type(value) is not int or value < 0 for value in usages):
68
+ raise ValueError("complete supported output usage is unavailable; budget is unproven")
69
+ return sum(usages)
70
+
71
+
72
+ def operate(args):
73
+ ledger = args.ledger.absolute()
74
+ if ledger.is_symlink():
75
+ raise ValueError("ledger must be a real file")
76
+ with log_lock({"log": str(ledger)}):
77
+ if args.action == "configure":
78
+ policy = {"schema": SCHEMA, "host": "codex-cli", "metric": "output_tokens",
79
+ "task_limit": args.task_limit, "session_limit": args.session_limit,
80
+ "authority": args.authority}
81
+ if ledger.exists():
82
+ data = json.loads(ledger.read_text())
83
+ if any(data.get(key) != value for key, value in policy.items()):
84
+ raise ValueError("existing session policy differs; configuration cannot reset usage")
85
+ else:
86
+ data = {**policy, "observations": {}}
87
+ atomic_write(ledger, json.dumps(data, indent=2) + "\n")
88
+ return {"status": "configured", "hard_cap_supported": False}
89
+ data = json.loads(ledger.read_text())
90
+ if data.get("schema") != SCHEMA or data.get("host") != "codex-cli":
91
+ raise ValueError("unsupported budget ledger")
92
+ if args.action == "record":
93
+ source = str(args.events.resolve())
94
+ observation = {"task": args.task, "output_tokens": output_usage(args.events)}
95
+ previous = data["observations"].get(source)
96
+ if previous and (previous["task"] != args.task or
97
+ previous["output_tokens"] > observation["output_tokens"]):
98
+ raise ValueError("observation cannot change task or reduce recorded usage")
99
+ data["observations"][source] = observation
100
+ atomic_write(ledger, json.dumps(data, indent=2) + "\n")
101
+ return {"status": "recorded", **observation, "hard_cap_supported": False}
102
+ observations = data["observations"].values()
103
+ task_used = sum(row["output_tokens"] for row in observations if row["task"] == args.task)
104
+ session_used = sum(row["output_tokens"] for row in observations)
105
+ task_remaining = max(0, data["task_limit"] - task_used)
106
+ session_remaining = max(0, data["session_limit"] - session_used)
107
+ reason = "observed usage is within budget; unobserved and in-flight usage is unproven"
108
+ blocked = not task_remaining or not session_remaining
109
+ if blocked:
110
+ reason = "observed output budget exhausted"
111
+ if args.require_hard_cap:
112
+ blocked = True
113
+ reason = "hard generation cap unsupported by Codex CLI"
114
+ return {"decision": "blocked" if blocked else "admit", "reason": reason,
115
+ "task_output_tokens": task_used, "session_output_tokens": session_used,
116
+ "task_remaining": task_remaining, "session_remaining": session_remaining,
117
+ "hard_cap_supported": False, "enforcement": "observed-admission-only"}
118
+
119
+
120
+ def main(argv=None):
121
+ parser = argparse.ArgumentParser(description=__doc__)
122
+ subparsers = parser.add_subparsers(dest="action", required=True)
123
+ for name in ("configure", "record", "admit"):
124
+ command = subparsers.add_parser(name)
125
+ command.add_argument("--ledger", type=Path, required=True)
126
+ if name == "configure":
127
+ command.add_argument("--task-limit", type=positive, required=True)
128
+ command.add_argument("--session-limit", type=positive, required=True)
129
+ command.add_argument("--authority", required=True)
130
+ else:
131
+ command.add_argument("--task", required=True)
132
+ if name == "record":
133
+ command.add_argument("--events", type=Path, required=True)
134
+ if name == "admit":
135
+ command.add_argument("--require-hard-cap", action="store_true")
136
+ try:
137
+ result = operate(parser.parse_args(argv))
138
+ except (ValueError, OSError, KeyError, TypeError) as error:
139
+ print(json.dumps({"decision": "blocked", "reason": str(error)}))
140
+ return 1
141
+ print(json.dumps(result, sort_keys=True))
142
+ return 1 if result.get("decision") == "blocked" else 0
143
+
144
+
145
+ if __name__ == "__main__":
146
+ raise SystemExit(main())
@@ -0,0 +1,117 @@
1
+ #!/usr/bin/env python3
2
+ """Run canonical workflow helpers with fixed arguments and fail-stop receipts."""
3
+
4
+ import argparse
5
+ import json
6
+ import subprocess
7
+ import sys
8
+ from pathlib import Path
9
+
10
+ try:
11
+ from scripts import _common
12
+ except ImportError: # bundled copy inside a skill's scripts directory
13
+ import _common
14
+
15
+
16
+ class StepFailed(RuntimeError):
17
+ pass
18
+
19
+
20
+ def run_workflow(repo: Path, action: str, project_dir: str, expected_head: str = None,
21
+ task_id: str = None, round_size: int = None) -> dict:
22
+ steps = []
23
+ scripts = Path(__file__).resolve().parent
24
+
25
+ def step(script, *arguments):
26
+ command = [sys.executable, "-B", str(scripts / script), *arguments]
27
+ completed = subprocess.run(command, cwd=repo, capture_output=True, text=True)
28
+ receipt = {"script": script, "command": command, "exit_code": completed.returncode,
29
+ "stdout": completed.stdout, "stderr": completed.stderr}
30
+ steps.append(receipt)
31
+ if completed.stderr:
32
+ sys.stderr.write(completed.stderr)
33
+ if completed.returncode:
34
+ raise StepFailed(script)
35
+ try:
36
+ receipt["result"] = json.loads(completed.stdout)
37
+ except json.JSONDecodeError as error:
38
+ raise StepFailed(f"{script} did not return JSON") from error
39
+ return receipt["result"]
40
+
41
+ common = ["--repo", str(repo), "--project-dir", project_dir]
42
+ try:
43
+ if action == "route":
44
+ step("pipeline_state.py", "route", *common)
45
+ elif action == "lint-round":
46
+ head = subprocess.run(["git", "rev-parse", "--verify", "HEAD"],
47
+ cwd=repo, capture_output=True, text=True, check=True).stdout.strip()
48
+ step("check_task_briefs.py", "--repo", str(repo), "--base", head,
49
+ "--tasks-dir", f"{project_dir}/tasks")
50
+ step("check_handoffs.py", "plan", *common)
51
+ elif action == "prepare-task":
52
+ task = step("isolation.py", "isolate-task", "--repo", str(repo),
53
+ "--base", expected_head, "--task-id", task_id,
54
+ "--round-size", str(round_size))
55
+ if task["mode"] == "serial":
56
+ step("isolation.py", "isolate-verify", "--repo", str(repo),
57
+ "--base", expected_head, "--name", f"task-{task_id.lower()}-verify")
58
+ elif action == "build-evidence":
59
+ proof = step("build_state.py", "verify-landed", *common, "--head", expected_head)
60
+ # The landing proof has one canonical home; lean final-review reuse allows only this path.
61
+ evidence = repo / project_dir / "build" / "evidence.json"
62
+ _common.atomic_write(evidence, json.dumps(proof, indent=2, sort_keys=True) + "\n")
63
+ steps.append({"script": "workflow_run.py", "evidence": str(evidence)})
64
+ elif action == "prepare-final":
65
+ if project_dir != ".project":
66
+ raise StepFailed("final review requires the active milestone")
67
+ pending = step("discussion_records.py", "pending", "--repo", str(repo))
68
+ if pending["pending"]:
69
+ raise StepFailed("pending discussion requires its owner disposition")
70
+ step("build_state.py", "verify-landed", *common, "--head", expected_head)
71
+ step("lean_verification.py", "--repo", str(repo), "--expected-head", expected_head)
72
+ else:
73
+ pending = step("discussion_records.py", "pending", "--repo", str(repo))
74
+ if pending["pending"]:
75
+ raise StepFailed("pending discussion requires its owner disposition")
76
+ step("check_handoffs.py", "plan", *common)
77
+ head = subprocess.run(["git", "rev-parse", "--verify", "HEAD"],
78
+ cwd=repo, capture_output=True, text=True, check=True).stdout.strip()
79
+ step("check_task_briefs.py", "--repo", str(repo), "--base", head,
80
+ "--tasks-dir", f"{project_dir}/tasks")
81
+ panel = ["validate-plan", "--plan", str(repo / project_dir / "plan/PLAN.md"),
82
+ "--intent", str(repo / project_dir / "intent/INTENT.md")]
83
+ charter = repo / ".project/CHARTER.md"
84
+ if charter.exists():
85
+ panel += ["--charter", str(charter)]
86
+ step("review_panel.py", *panel)
87
+ if action == "approve-plan":
88
+ step("pipeline_state.py", "approve", *common, "--kind", "plan",
89
+ "--expected-head", expected_head)
90
+ except (StepFailed, OSError, subprocess.CalledProcessError) as error:
91
+ return {"status": "blocked", "reason": str(error), "steps": steps,
92
+ "next": "$gsd-path-forensics"}
93
+ return {"status": "complete", "steps": steps}
94
+
95
+
96
+ def main(argv=None):
97
+ parser = argparse.ArgumentParser(description=__doc__)
98
+ parser.add_argument("action", choices=("route", "gate-plan", "approve-plan", "build-evidence", "lint-round", "prepare-task", "prepare-final"))
99
+ parser.add_argument("--repo", type=Path, required=True)
100
+ parser.add_argument("--project-dir", choices=(".project", ".project/next"), default=".project")
101
+ parser.add_argument("--expected-head")
102
+ parser.add_argument("--task-id")
103
+ parser.add_argument("--round-size", type=int)
104
+ arguments = parser.parse_args(argv)
105
+ if arguments.action in {"approve-plan", "build-evidence", "prepare-task", "prepare-final"} and not arguments.expected_head:
106
+ parser.error(f"{arguments.action} requires --expected-head")
107
+ if arguments.action == "prepare-task" and (not arguments.task_id or arguments.round_size is None):
108
+ parser.error("prepare-task requires --task-id and --round-size")
109
+ result = run_workflow(arguments.repo.resolve(), arguments.action,
110
+ arguments.project_dir, arguments.expected_head,
111
+ arguments.task_id, arguments.round_size)
112
+ print(json.dumps(result, sort_keys=True))
113
+ return 0 if result["status"] == "complete" else 1
114
+
115
+
116
+ if __name__ == "__main__":
117
+ raise SystemExit(main())
@@ -0,0 +1,36 @@
1
+ # Skeptic — wave <N>, cycle <C>
2
+
3
+ <!-- Written by one finding-skeptic child. Advisory to fix-task batching
4
+ only: the inherit reviewer owns Wave verdict. -->
5
+
6
+ - Criterion: <the failed criterion, verbatim from the lens file>
7
+ - Criterion locator: <t001_ac2 | t001_files | sc3>
8
+ - Lenses: <contract | adversarial | both>
9
+
10
+ ## Observations
11
+
12
+ <!-- Repeat for every distinct lens observation. Collapse only true
13
+ duplicates. Give each observation a unique number and exactly one
14
+ verdict with that number below; unknown or duplicate verdict numbers
15
+ are invalid. The criterion locator, not these local numbers, is the
16
+ finding identity across cycles. -->
17
+
18
+ ### Observation <n> — <contract | adversarial>
19
+
20
+ <the observation verbatim: criterion, observed result, file:line>
21
+
22
+ ## Observation verdicts
23
+
24
+ ### Observation <n>: <refuted | stands>
25
+
26
+ <checked evidence for this observation>
27
+
28
+ ## Verdict
29
+
30
+ <refuted | stands>
31
+
32
+ ## Evidence
33
+
34
+ <checked evidence: the command re-run in the sidecar or the artifact
35
+ re-read, with its result. A refuted verdict requires every observation above
36
+ to be individually refuted; anything short of that is stands.>
@@ -0,0 +1,74 @@
1
+ ---
2
+ id: T001
3
+ title: <imperative, specific>
4
+ wave: 1
5
+ deps: [] # task ids whose output or landed effect this task needs
6
+ status: pending # orchestrator-owned: pending | in-progress | done | failed | blocked
7
+ agent: null # orchestrator-owned: set at dispatch
8
+ base: null # orchestrator-owned: clean layer SHA for isolated Verify
9
+ worktree: null # orchestrator-owned: isolated task worktree while active
10
+ task_branch: null # orchestrator-owned: gsd-path-task/<id> while parallel; null when serial
11
+ files: # every file this task may touch — dispatch checks overlap
12
+ - <path>
13
+ ---
14
+
15
+ # T001 — <title>
16
+
17
+ ## Context
18
+
19
+ <!-- 3–5 sentences. Everything the coder needs from SYNTHESIS, inlined.
20
+ The coder reads this file, INTENT.md, and the codebase. -->
21
+
22
+ ## Approach
23
+
24
+ <!-- Constraints, applicable pitfalls from research, and pointers to real
25
+ paths, symbols, and schemas. Not an edit script — the coder owns the
26
+ how within these constraints and the acceptance criteria. -->
27
+ - <constraint or pointer>
28
+
29
+ ## Interface contract
30
+
31
+ <!-- Planner-owned. The exact shared symbols, signatures, types, paths,
32
+ schemas, or formats this task exchanges with other tasks. Required when
33
+ another task consumes this task's output or this task consumes a
34
+ sibling's; write the identical contract in every involved task. Otherwise
35
+ write `None`. Only shapes this task's `files` define or consume — never
36
+ the whole plan's contracts. Binding like the acceptance criteria: needing to deviate
37
+ is a plan defect — block, never negotiate or improvise. -->
38
+ - None
39
+
40
+ ## Intent coverage
41
+
42
+ <!-- SCn ids this task owns, matching PLAN.md Intent coverage. Write
43
+ `- None` when this task owns no INTENT success criterion. -->
44
+ - SC1
45
+
46
+ ## Acceptance criteria
47
+
48
+ <!-- Observable. The reviewer checks the diff against exactly these. -->
49
+ 1. <behavior/command/output that must be true>
50
+
51
+ ## Verify
52
+
53
+ ```bash
54
+ <one command that fails if this task wasn't done; names a path from files>
55
+ ```
56
+ <!-- Runs in a fresh sidecar worktree at the landed commit with nothing
57
+ installed. Provision dependencies inside the command when the project
58
+ needs them, e.g. `pnpm install --frozen-lockfile && pnpm vitest run
59
+ src/x.test.ts`. -->
60
+
61
+ Heavy: no <!-- yes when this command must not run beside another heavy Verify -->
62
+
63
+ <!-- Fix tasks only: add ## Review findings before Log, with one
64
+ ### <canonical locator> block per group in the helper's batch.
65
+ Each block contains Criterion: <verbatim criterion> and all supplied
66
+ observations verbatim. Set deps to include the source tasks and files
67
+ to the batch's files. Ordinary tasks omit this section. -->
68
+
69
+ ## Log
70
+
71
+ <!-- Append-only: coder summary, blocks (`NEEDS-ORCHESTRATOR: <question> —
72
+ readings: <candidates>` for contract ambiguity), orchestrator answers,
73
+ review verdicts, fixes. -->
74
+ - <date> — created by planner
@@ -0,0 +1,25 @@
1
+ # Panel — wave <N>, cycle <C>
2
+
3
+ <!-- Written by one review-panel child. Advisory only: the inherit reviewer
4
+ owns Wave verdict. Kind criterion may be presented to the user when
5
+ Severity is high; preference stays a warning. -->
6
+
7
+ - Family: <claude | gpt | grok | composer | gemini | deepseek | kimi | qwen>
8
+ - Model: <exact advertised slug>
9
+ - Depth: <full | adversarial>
10
+
11
+ ## Findings
12
+
13
+ <!-- One ### F# block per finding, or a single `- none` line. -->
14
+
15
+ ### F1
16
+ - Severity: high
17
+ - Kind: criterion
18
+ - Criterion: T001 acceptance 1
19
+ - Evidence: src/app.py:12
20
+ - Found: <what exists instead>
21
+ - Fix direction: <concrete coder direction>
22
+
23
+ ## Summary
24
+
25
+ <one paragraph; do not edit code, tasks, or the canonical wave review>
@@ -0,0 +1,64 @@
1
+ # Review — wave <N>, cycle <C>
2
+
3
+ <!-- Written by the reviewer role in wave mode. File: wave-N.cycleC.md —
4
+ deep reviews use wave-N.cycleC.contract.md and
5
+ wave-N.cycleC.adversarial.md instead. Keep validated fields on their
6
+ own lines: Cycle holds only the number
7
+ (C > 1 means re-review after fixes; see previous cycle file). -->
8
+
9
+ <!-- For quick single-full-wave final scope, include these two metadata lines
10
+ with actual values, otherwise omit them:
11
+ Reviewed HEAD: <full review commit SHA>
12
+ Review scope: final
13
+ In each surface SC block also include Surface, Check, and Observed fields
14
+ using the final-review format. Record the actual walkthrough evidence once. -->
15
+
16
+ Wave verdict: <pass | blocked — blocked if any task fails>
17
+ Cycle: <C>
18
+ Depth: <full | deep | verify-only — verify-only is orchestrator-written from
19
+ its isolated Verify evidence; no independent reviewer ran>
20
+ Lens: <contract | adversarial — deep reviews only; empty or omitted
21
+ otherwise>
22
+ Tasks reviewed: <count>
23
+
24
+ ## T001 — <title>: <pass | fail>
25
+
26
+ <!-- Per task criterion: copy the full acceptance/interface criterion verbatim
27
+ before the em dash; join wrapped lines with spaces. An AC id or summary
28
+ alone cannot be matched by review_findings.py. -->
29
+ - ✅ <criterion> — <evidence: verify output / file:line checked>
30
+ - ❌ <criterion> — found: <what exists instead, file:line>
31
+ fix: <concrete direction a coder can execute without re-investigating>
32
+
33
+ Warnings (non-blocking):
34
+ - <weakened test / unfailable verify / none>
35
+
36
+ Contract violations (blocking):
37
+ - ❌ <task changed path outside its files list> — <evidence and fix direction>
38
+
39
+ <!-- Repeat per task. -->
40
+
41
+ ## Intent coverage
42
+
43
+ <!-- One heading per INTENT.md success criterion owned by a task in this
44
+ wave, ending `: pass` or `: fail`. `scripts/check_handoffs.py wave
45
+ --review <this file>` gates the SC id set and verdicts. Omit this
46
+ section when no task in the wave owns an SC. -->
47
+
48
+ ### SC1 — <criterion>: <pass | fail>
49
+ - ✅ <evidence: verify output / file:line checked>
50
+ - ❌ <criterion> — found: <what exists instead, file:line>
51
+ fix: <concrete direction a coder can execute without re-investigating>
52
+
53
+ ## Fixed since last cycle
54
+
55
+ <!-- C > 1 only: previously failed criteria now confirmed fixed (re-checked,
56
+ not assumed), and any regressions the fixes introduced. -->
57
+ - <criterion> — confirmed fixed / regressed: <evidence>
58
+
59
+ ## Summary for orchestrator
60
+
61
+ - blocked findings: <failed criteria grouped by disjoint file scope; the
62
+ orchestrator applies the configured skeptic or fix-task path>
63
+ - repeat offenders: <criteria failing across cycles — possible plan defect>
64
+ - warnings worth a human eye: <...or none>
@@ -0,0 +1,115 @@
1
+ ---
2
+ name: gsd-path-decide
3
+ description: Decide implementation direction from approved intent and complete research evidence, recording settled choices in SYNTHESIS.md. Use only when the user explicitly invokes $gsd-path-decide or an active $gsd-path router explicitly routes to this phase.
4
+ ---
5
+
6
+ # GSD Path Decide Phase
7
+
8
+ Dispatch one reasoning-intensive decider and validate its decision artifact.
9
+
10
+ Routing instructions below are caller handoffs under the AGENTS.md handoff
11
+ rule; never invoke an explicit-only sibling skill yourself.
12
+
13
+ Before dispatch and again before completion, apply the AGENTS.md
14
+ pending-answer rule with the bundled `scripts/discussion_records.py`; a
15
+ follow-up owned by decide is resolved in SYNTHESIS.md, or the phase blocks.
16
+
17
+ ## Preconditions
18
+
19
+ Require `pipeline_state.py validate --repo <absolute root> [--project-dir
20
+ .project/next]` to pass; otherwise return to `$gsd-path` for ownership
21
+ checking. Legal entry is `research/done` or `decide/active|blocked`. On
22
+ `research/done`, enter with `pipeline_state.py transition`, expected
23
+ phase/status `research/done`, exact branch and archive values, event `decision
24
+ synthesis started`, and set phase/status `decide/active` (plus the same
25
+ lookahead project dir); never edit STATE directly. `decide/done` or any later phase blocks rather
26
+ than replacing decisions beneath an existing plan. When an active router
27
+ supplies the lookahead track root `.project/next/`, evaluate these
28
+ preconditions against the track instead; see Lookahead mode. Require
29
+ `.project/intent/INTENT.md`, `.project/research/RESEARCH.md`, and every
30
+ `evidence-*.md` file named as `dispatched` there. In program flow (CHARTER.md
31
+ exists, no milestone INTENT yet) require `.project/CHARTER.md` in INTENT.md's
32
+ place. A standard file may be absent
33
+ only when the handoff manifest records that dimension as skipped; a missing or
34
+ invalid manifest or dispatched file routes to `$gsd-path-research`. Include
35
+ every additional `evidence-*.md` file present only when the manifest names it.
36
+
37
+ Output path: when `.project/CHARTER.md` exists and `.project/ROADMAP.md` does
38
+ not, this is program scope — the required output is `.project/SYNTHESIS.md`
39
+ at the `.project/` top level; it persists across milestones and never
40
+ archives. Otherwise the required output is `.project/research/SYNTHESIS.md`,
41
+ which archives with its milestone.
42
+
43
+ ## Lookahead mode
44
+
45
+ Entered only when an active router supplies the lookahead track root
46
+ `.project/next/` while the active STATE.md is `build/active` in program
47
+ flow. Evaluate every state and artifact precondition against the track:
48
+ `.project/next/STATE.md` is the state file, and INTENT.md, RESEARCH.md, and
49
+ the evidence files are read from `.project/next/`. The output is always
50
+ milestone scope: `.project/next/research/SYNTHESIS.md` — the program
51
+ SYNTHESIS.md already exists at the active `.project/` top level and is
52
+ never rewritten here, so the program-scope output-path rule above does not
53
+ apply. Run the research hand-off validator with `--project-dir
54
+ .project/next`. Dispatch, gates, `NEEDS-USER` handling, and completion
55
+ rules are unchanged; never write an active-path artifact.
56
+
57
+ ## Process
58
+
59
+ 1. Read the local [synthesis template](templates/synthesis.md),
60
+ `.project/research/RESEARCH.md`, and the bundled `scripts/check_handoffs.py`;
61
+ resolve each to an absolute path. Run the research hand-off validator before
62
+ dispatch so decide receives a complete, intentional evidence set.
63
+ 2. Read the local [decider role](references/decider.md), then follow
64
+ the local [runtime dispatch contract](references/dispatch.md) with
65
+ deterministic logical task name `decide`. Give it absolute paths to the role,
66
+ `AGENTS.md`, `WORKFLOW.md`, INTENT.md (or CHARTER.md in program flow),
67
+ RESEARCH.md, every evidence file, the
68
+ template, and the required output path from the Preconditions.
69
+ 3. Validate SYNTHESIS.md with `python3 <absolute check_handoffs.py> decide
70
+ --repo <absolute root> [--project-dir .project/next]`. Require one decision block for every genuinely open
71
+ choice in INTENT.md and the evidence, including stack and architecture
72
+ shape plus build-vs-buy when open. A choice already settled by an intent
73
+ constraint or the existing codebase belongs under `## Settled` as one line
74
+ citing the settling source — never a full block with an invented
75
+ runner-up. Require Decision, Runner-up, Evidence, and
76
+ Confidence in every decision block. Require `## For the planner` with wave-1
77
+ blockers, walking skeleton, and pitfall-to-task guidance.
78
+ 4. If structural validation fails, redispatch one complete corrected brief
79
+ under logical task name `decide`, following the runtime dispatch
80
+ contract, and validate again. If it still fails, use
81
+ `pipeline_state.py transition` with expected `decide/active`, exact branch
82
+ and archive values, `--set-status blocked`, and an event naming the failed
83
+ synthesis gate, and
84
+ present **Outcome** with the failed gate, **Review** linking SYNTHESIS.md or
85
+ STATE.md when it is missing, and **Next** naming the one correction or user
86
+ decision required; then stop.
87
+ 5. Present the decision-list outcome and a Markdown link to the resolved
88
+ absolute SYNTHESIS.md output path before every `NEEDS-USER`
89
+ item. Use an interactive user-input tool when available; otherwise ask in
90
+ chat and wait. Present
91
+ each item's options with the evidence-preferred option first, marked
92
+ `(recommended)` and justified in one line; a pure values call with no
93
+ evidence either way carries no recommendation, stated as such. For each
94
+ answer, append the ruling under `## User rulings`, revise every affected
95
+ decision so it reflects the ruling, and only then remove its tag.
96
+ 6. Re-run the structural gate. When it passes with no unresolved user items,
97
+ use `pipeline_state.py transition` with expected `decide/active`, exact
98
+ branch and archive values, `--set-phase decide --set-status done`, and an
99
+ event naming the validated synthesis path. Include `--project-dir
100
+ .project/next` in lookahead and require returned `decide/done`. Confirm the
101
+ settled outcome, link SYNTHESIS.md again, and name
102
+ the next phase: the roadmap phase in program scope, planning otherwise.
103
+ When routed by an active `$gsd-path`, return control to
104
+ that router. When invoked directly, stop and tell the user to explicitly
105
+ invoke `$gsd-path`, which routes to that next phase; do not invoke an
106
+ explicit-only sibling skill yourself.
107
+
108
+ ## Rules
109
+
110
+ - Make commitments, not option lists. Name the runner-up and why it lost
111
+ when a real alternative was weighed; never invent one.
112
+ - Cite evidence by file and finding heading for every decision.
113
+ - Route low-confidence decisions to wave 1 for verification. Reject uncited
114
+ decisions.
115
+ - Resolve evidence conflicts or escalate a true values decision; never average.
@@ -0,0 +1,6 @@
1
+ interface:
2
+ display_name: "GSD Path Decide"
3
+ short_description: "Turn evidence into settled decisions"
4
+ default_prompt: "Use $gsd-path-decide to settle implementation decisions from the available evidence."
5
+ policy:
6
+ allow_implicit_invocation: false
@@ -0,0 +1,36 @@
1
+ # Decider role
2
+
3
+ Turn supplied research into settled decisions. Do not conduct new research.
4
+
5
+ ## Input and output
6
+
7
+ - Require absolute paths for INTENT.md, every evidence file, SYNTHESIS.md, and
8
+ the synthesis template.
9
+ - Read AGENTS.md, INTENT.md, the template, and every evidence file.
10
+ - Write only the exact output using the template. Stop on a missing input or
11
+ template.
12
+
13
+ ## Decide
14
+
15
+ 1. Treat intent constraints and vetoes as hard limits.
16
+ 2. Map agreements, conflicts, and gaps across all evidence.
17
+ 3. For every genuinely open choice, select one decision, name the runner-up
18
+ and why it lost, and cite the evidence file and finding heading. Record a
19
+ choice already settled by an intent constraint or the existing codebase in
20
+ one line under Settled, citing the settling source; do not invent a
21
+ runner-up for it.
22
+ 4. Resolve conflicts by source quality and fit to intent. Preserve a user
23
+ values choice as `NEEDS-USER` with the genuinely viable options; never
24
+ guess.
25
+ When the evidence leans one way, order that option first with a one-line
26
+ reason so the checkpoint can mark it recommended; note when it is a pure
27
+ values call with no lean.
28
+ 5. Route decisions supported only by low-confidence evidence to wave 1.
29
+ 6. Write For the planner with wave-1 blockers, the walking skeleton, and each
30
+ pitfall mapped to a future task.
31
+ 7. Carry every unanswered intent question into Still unknown.
32
+
33
+ Every decision requires cited evidence. Compress to decisions and rationale
34
+ rather than re-narrating research.
35
+
36
+ Return the output path, one line per decision, and the `NEEDS-USER` count.