@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,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,16 @@
1
+ # Patch Findings
2
+
3
+ <!-- Written by final review when it blocks and consumed by patch planning. -->
4
+
5
+ Reviewed HEAD: <full SHA>
6
+ State: ship/blocked
7
+
8
+ ## Findings
9
+
10
+ <!-- Copy only evidenced, selected findings. Keep IDs contiguous and ordered. -->
11
+ ### P001 — <short finding title>
12
+
13
+ - **Source**: `.project/review/FINAL.md`
14
+ - **Locator**: `<SC number or gap risk row>`
15
+ - **Evidence**: <observed result copied from the source review>
16
+ - **Fix direction**: <concrete direction for the patch task>
@@ -0,0 +1,25 @@
1
+ # Plan panel — <family>
2
+
3
+ <!-- Written by one review-panel child. The orchestrator validates this file
4
+ with scripts/review_panel.py merge and never treats it as a plan gate.
5
+ Kind criterion requires a named PLAN/task criterion; preference is
6
+ taste or an alternate design and must not flip approval. -->
7
+
8
+ - Family: <claude | gpt | grok | composer | gemini | deepseek | kimi | qwen>
9
+ - Model: <exact advertised slug>
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: Wave 1 / T001 / acceptance 1
19
+ - Evidence: .project/tasks/T001-slug.md:12
20
+ - Found: <what is missing or wrong>
21
+ - Fix direction: <concrete plan/task edit>
22
+
23
+ ## Summary
24
+
25
+ <one paragraph; do not edit PLAN.md or tasks>
@@ -0,0 +1,89 @@
1
+ # Plan — <project name>
2
+
3
+ <!-- Written by the planner role. Executed wave-by-wave by $gsd-path-build. -->
4
+
5
+ Project verify: `<command that installs dependencies, builds + tests the whole project>`
6
+ <!-- Run once at ship, in a fresh sidecar worktree checked out at the
7
+ reviewed commit: no node_modules, virtualenv, build output, or untracked
8
+ env files exist there. The command must provision what it needs first,
9
+ e.g. `pnpm install --frozen-lockfile && pnpm test`. A task Verify must
10
+ not copy this command unless an owned INTENT success criterion names it.
11
+ Otherwise the task Verify names a path from that task's files. -->
12
+
13
+ ## Config
14
+
15
+ - max_review_cycles: 3 <!-- review→fix→re-review loops per wave before escalating -->
16
+ - wave_budget: none <!-- none | optional per-wave resource cap: wall-clock,
17
+ tokens, or cost (e.g. 2h, 500k tokens). Reaching the
18
+ cap blocks the wave like an exhausted cycle cap and
19
+ escalates to the user. none is default. -->
20
+ - review_panel: off <!-- off | detected | claude,gpt,grok — optional
21
+ cross-model panel. off is default. detected uses
22
+ advertised host families except the parent, cap 3.
23
+ Named families are an assertion. Quick lane stays
24
+ off. The planner copies INTENT.md; it does not
25
+ invent a non-off value. -->
26
+ - finding_skeptics: off <!-- off | on — deep waves only. on spawns one
27
+ read-only skeptic per blocking finding before
28
+ fix tasks are batched; a refuted finding spawns
29
+ no fix task unless the user explicitly overrides
30
+ all cycle refutations. off is default. The planner
31
+ copies INTENT.md; it does not invent on. -->
32
+
33
+ ## Wave 1 — risk burn-down
34
+
35
+ Goal: <what this wave proves; if it fails, what changes>
36
+ Review depth: full <!-- full | deep | verify-only. Wave 1 and auth/payments/
37
+ data migration/concurrency waves must be full or
38
+ deep. Assign deep sparingly: irreversible or
39
+ security-critical merges. -->
40
+
41
+ <!-- No task table. Task id, title, deps, and files live only in each
42
+ `tasks/T###-slug.md` frontmatter; `wave: N` there assigns it here. -->
43
+
44
+ ## Wave 2 — walking skeleton
45
+
46
+ Goal: <the end-to-end slice that runs>
47
+ Review depth: <full | deep | verify-only>
48
+
49
+ <!-- More waves: features by dependency, then polish. Rules:
50
+ - deps only in earlier waves, or same wave with no file overlap
51
+ - no two same-wave tasks share files
52
+ - nothing from INTENT.md scope-out appears anywhere -->
53
+
54
+ ## Surface contract
55
+
56
+ <!-- Required when INTENT.md `Surfaces:` is not `none`; omit the section
57
+ entirely when it is. One block per declared surface, named exactly as
58
+ INTENT.md names it, owned by the task that delivers it. That task must
59
+ name in Criteria the success criteria this surface is proven by — the
60
+ owning task must own every listed criterion in its Intent coverage. A
61
+ criterion may appear in only one surface block. This is what the final
62
+ reviewer walks before the milestone is called done, and FINAL.md records
63
+ the surface it was walked on. Replace every whole-value angle-bracket
64
+ placeholder; angle brackets may appear inside concrete routes, commands,
65
+ states, and walkthrough steps. -->
66
+
67
+ ### <surface name as INTENT.md writes it> — T001
68
+
69
+ Criteria: SC1
70
+ Entry: <the route, screen, or command a person opens>
71
+ States: <what empty, loading, error, and success each show>
72
+ Walkthrough:
73
+ 1. <step a reviewer performs to see this surface working>
74
+
75
+ ## Intent coverage
76
+
77
+ <!-- Every INTENT.md success criterion, as SCn, maps to at least one task
78
+ acceptance item. The named task's Verify command is what must fail if
79
+ that criterion is skipped. `scripts/check_handoffs.py plan` gates this
80
+ table against INTENT.md and each task's Intent coverage section. -->
81
+
82
+ | Criterion | Task | Acceptance |
83
+ |-----------|------|------------|
84
+ | SC1 | T001 | AC1 |
85
+
86
+ ## Dependency notes
87
+
88
+ <Per non-obvious edge: the exact data or landed effect that makes X precede Y,
89
+ and how a reviewer sees it. Narrative order is not a dependency.>
@@ -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,159 @@
1
+ ---
2
+ name: gsd-path-research
3
+ description: Dispatch parallel researchers and collect cited GSD Path evidence about domain, stack, pitfalls, and comparable products. Use only when the user explicitly invokes $gsd-path-research or an active $gsd-path router explicitly routes to this phase.
4
+ ---
5
+
6
+ # GSD Path Research Phase
7
+
8
+ Dispatch independent researchers and gate their evidence. Keep synthesis out
9
+ of this phase. The durable output is a research dispatch manifest plus one
10
+ evidence file per dispatched dimension.
11
+
12
+ Routing instructions below are caller handoffs under the AGENTS.md handoff
13
+ rule; never invoke an explicit-only sibling skill yourself.
14
+
15
+ Before dispatch and again before completion, apply the AGENTS.md
16
+ pending-answer rule with the bundled `scripts/discussion_records.py`; a
17
+ follow-up owned by research is resolved through its evidence handoff, or
18
+ the phase blocks.
19
+
20
+ ## Preconditions
21
+
22
+ Require `pipeline_state.py validate --repo <absolute root> [--project-dir
23
+ .project/next]` to pass; otherwise return to `$gsd-path` for ownership
24
+ checking. Legal entry is `define/done` or `research/active|blocked`. On
25
+ `define/done`, enter with `pipeline_state.py transition`, expected phase/status
26
+ `define/done`, exact branch and archive values, event `research started`, and
27
+ set phase/status `research/active` (plus the same `--project-dir` in
28
+ lookahead); never edit STATE directly. `research/done`
29
+ `research/done` or any later phase blocks rather than replacing settled
30
+ evidence beneath downstream artifacts. When an active router supplies the
31
+ lookahead track root `.project/next/`, evaluate these preconditions against
32
+ the track instead; see Lookahead mode. Require
33
+ `.project/intent/INTENT.md` — or, in program flow, `.project/CHARTER.md` when
34
+ the router dispatched program-scope research before any milestone INTENT
35
+ exists. If neither exists, stop and route to
36
+ `$gsd-path-define`. Confirm live search or web-reading capability before
37
+ dispatch; if unavailable, block rather than allowing memory-based citations.
38
+
39
+ Program scope: when working from CHARTER.md, dimensions decompose the full
40
+ charter scope, not one milestone. Add program dimensions such as
41
+ `domain-decomposition` (capability areas and their boundaries) and
42
+ `capability-map` (what exists vs. what must be built) as custom dimensions
43
+ alongside the standard set, so the roadmap phase inherits a complete scope
44
+ map. The manifest's `Intent:` line names `.project/CHARTER.md` in this flow.
45
+
46
+ ## Lookahead mode
47
+
48
+ Entered only when an active router supplies the lookahead track root
49
+ `.project/next/` while the active STATE.md is `build/active` in program
50
+ flow. Evaluate every state and artifact precondition against the track:
51
+ `.project/next/STATE.md` is the state file, INTENT.md is
52
+ `.project/next/intent/INTENT.md`, and the manifest and evidence files live
53
+ under `.project/next/research/`. Program-level inputs (CHARTER.md,
54
+ ROADMAP.md, top-level SYNTHESIS.md) are read from their active `.project/`
55
+ paths. Brownfield input is the track's
56
+ `.project/next/research/evidence-codebase.md` after lookahead inspect;
57
+ do not substitute the building milestone's map. Archived evidence from
58
+ earlier milestones uses the same archived-manifest rule as the roadmap
59
+ phase. Validate the handoff with
60
+ `python3 <absolute check_handoffs.py> research --repo <absolute repo root>
61
+ --project-dir .project/next`. Dispatch, gates, and completion rules are
62
+ unchanged; never write an active-path artifact.
63
+
64
+ ## Dispatch contract
65
+
66
+ Read the local [researcher role](references/researcher.md), then follow the
67
+ local [runtime dispatch contract](references/dispatch.md). Resolve the local
68
+ [evidence template](templates/evidence.md), research-handoff template
69
+ (`templates/research-handoff.md`), and `scripts/check_handoffs.py` to absolute
70
+ paths. Include the role, `AGENTS.md`, `WORKFLOW.md`, INTENT.md, manifest,
71
+ dimension, assigned questions, deterministic logical task name
72
+ `research_<dimension>`, and exact output path in every brief. When
73
+ `evidence-codebase.md` exists, include its absolute path in every brief as
74
+ settled brownfield input.
75
+
76
+ ## Process
77
+
78
+ 1. Read INTENT.md — or CHARTER.md in program flow. Extract constraints,
79
+ vetoes, risks, and `RESEARCH`
80
+ questions. Create `.project/research/RESEARCH.md` from the local handoff
81
+ template before dispatch. Record every standard dimension exactly once as
82
+ `dispatched` or `skipped` with a reason, and assign every research question
83
+ to at least one dispatched dimension. No question may remain unassigned.
84
+ 2. Decide which standard dimensions have work: dispatch a dimension only when
85
+ it has at least one assigned `RESEARCH` question from INTENT.md or
86
+ CHARTER.md. Unsettled choices and risks need that source question before
87
+ dispatch. Skip a dimension
88
+ with nothing to answer — never spawn a researcher to fill a file — and
89
+ record every skipped dimension with its reason in `RESEARCH.md`. The
90
+ standard dimensions:
91
+
92
+ | Dimension | Output file | Focus |
93
+ | --- | --- | --- |
94
+ | domain | `evidence-domain.md` | prior art, domain rules, terminology, practitioner expectations |
95
+ | stack | `evidence-stack.md` | two or three viable stacks against the constraints |
96
+ | pitfalls | `evidence-pitfalls.md` | security, scale, reliability, and UX failure modes |
97
+ | similar | `evidence-similar.md` | comparable products and reusable lessons |
98
+
99
+ Dispatch up to the available child capacity, then dispatch each remaining
100
+ dimension when a slot opens. A pending corrected redispatch takes the slot
101
+ before any queued not-yet-dispatched dimension. Keep all briefs independent.
102
+ A custom fifth dimension supplements at least one dispatched standard
103
+ dimension; it never replaces the standard set.
104
+
105
+ In brownfield work, require stack research to weigh migration cost and
106
+ pitfalls research to check which failure modes already exist in the mapped
107
+ codebase.
108
+
109
+ 3. If a risk needs a distinct dimension, add one researcher, up to five total
110
+ (project policy).
111
+ Derive its filename deterministically as `evidence-<dimension-slug>.md`:
112
+ lowercase the label, replace non-alphanumeric runs with one hyphen, and
113
+ trim hyphens. Append `-2` only if it collides with an existing dimension.
114
+ 4. Validate each dispatched evidence file as its researcher returns. Require
115
+ at least one `## Finding` — a documented `no reliable source found` null
116
+ result recorded as a finding satisfies this gate, with the searches that
117
+ came up empty noted as its evidence — require Claim, Source, Confidence,
118
+ and Why it matters fields for every finding, and require an answer for
119
+ every question assigned to that dimension. For a missing or invalid file,
120
+ redispatch one complete corrected brief under the same logical task name,
121
+ following the runtime dispatch contract, as soon as a child slot allows —
122
+ never held until the remaining dimensions settle.
123
+ 5. After every dimension settles — validated, or its one corrected
124
+ redispatch collected — confirm every extracted `RESEARCH` question was
125
+ assigned to a dispatched dimension. Then run:
126
+
127
+ `python3 <absolute check_handoffs.py> research --repo <absolute repo root>`
128
+
129
+ The manifest is the source of truth for dispatched and skipped dimensions;
130
+ the STATE log records only a human-readable summary.
131
+ If any expected file still fails after its one corrected redispatch,
132
+ run `pipeline_state.py transition` with
133
+ expected `research/active`, exact branch and archive values,
134
+ `--set-status blocked`, and an event listing the failed evidence gate; then
135
+ present **Outcome** with the
136
+ failed gate, **Review** linking RESEARCH.md or STATE.md when the manifest is
137
+ missing, and **Next** naming the one correction or user decision required.
138
+ Stop; never advance with partial research.
139
+ 6. When all dispatched files and `RESEARCH.md` pass, run
140
+ `pipeline_state.py transition` with expected `research/active`, exact
141
+ branch and archive values, `--set-phase research --set-status done`, and
142
+ an event naming the manifest path, dispatched dimensions, skipped
143
+ dimensions, and question count. Include `--project-dir .project/next` for
144
+ lookahead. Require the returned state to be `research/done`. Report the
145
+ outcome, link the resolved absolute `RESEARCH.md` path,
146
+ summarize the dispatched evidence files, and name the decide phase as next.
147
+ The decide phase reads the manifest; it must not infer dispatch state from
148
+ a glob or free-form log. When routed by an active
149
+ `$gsd-path`, return control to that router. When invoked directly, stop and
150
+ tell the user to explicitly invoke `$gsd-path`, which routes to decide; do
151
+ not invoke an explicit-only sibling skill yourself.
152
+
153
+ ## Rules
154
+
155
+ - Require evidence, not opinion: every claim needs a source actually checked
156
+ and a one-line tie-back to this project's intent.
157
+ - Record conflicting sources rather than resolving them here.
158
+ - Preserve dead ends and explicit `no reliable source found` answers.
159
+ - Do not summarize the evidence; `$gsd-path-decide` owns that work.
@@ -0,0 +1,6 @@
1
+ interface:
2
+ display_name: "GSD Path Research"
3
+ short_description: "Gather cited evidence for project decisions"
4
+ default_prompt: "Use $gsd-path-research to gather cited evidence for the approved project intent."
5
+ policy:
6
+ allow_implicit_invocation: false
@@ -0,0 +1,131 @@
1
+ # Shared Agent Skills dispatch
2
+
3
+ Apply this contract whenever a GSD Path skill delegates work from the shared
4
+ `~/.agents/skills` bundle. Inspect the advertised child-agent tool schema and
5
+ use exactly one matching branch:
6
+
7
+ - A `spawn_agent` tool exposing `task_name`, `agent_type`, and `fork_turns` is
8
+ Codex. Use `fork_turns: "none"`; coders use the built-in `worker` type and
9
+ every other role uses `default`. Reuse a completed logical target with
10
+ `followup_task`. For Codex reasoning effort, use `high` for the portable
11
+ `heavy` tier and `low` for the portable `light` tier; leave reasoning effort
12
+ unset for the session-default tier, and never pass `heavy` or `light` as a
13
+ literal Codex value.
14
+ - A `spawn_agent` tool without those Codex fields is Zed. Spawn one isolated,
15
+ full-capability child per brief. Zed children are not resumable, so retries
16
+ use a fresh child and a complete prompt.
17
+ - An `invoke_subagent` tool advertising `TypeName`, `Workspace`, and `Role` is
18
+ Antigravity. Use `TypeName: self`, the exact supplied root as `Workspace`,
19
+ and the logical task name as `Role`. Keep the returned child ID and use
20
+ `send_message` for follow-up work when available; otherwise start a fresh
21
+ child with the complete prompt.
22
+ - A `spawn_subagent` tool advertising the `general-purpose` type is Grok. Use
23
+ `subagent_type: general-purpose`, `capability_mode: all`, the exact supplied
24
+ root as `cwd`, `isolation: none`, and `background: true`. Supply the logical
25
+ task name as `description`, keep the returned ID, and use `resume_from` with
26
+ the complete new prompt for later work. Wait for a colliding active child and
27
+ collect results with `wait_commands_or_subagents`.
28
+ - A `Task` tool advertising the custom `gsd-path` subagent is Cursor. Use that
29
+ model-inheriting, full-capability child. Resume it by returned agent ID when
30
+ available; otherwise retry with a fresh child and a complete prompt.
31
+ - A `Task` tool advertising the built-in `general` subagent is OpenCode. Use
32
+ that child; if an installed OpenCode v2 host exposes the renamed `subagent`
33
+ tool instead, use its advertised schema with the built-in `general` agent.
34
+ Supply the logical task name as the child description. Reuse a returned
35
+ child-session ID only when the host advertises a resume parameter; otherwise
36
+ use a fresh `general` child and the complete prompt.
37
+ - A `task` tool advertising the `general-purpose` child is GitHub Copilot CLI.
38
+ Use that child. Keep its returned ID for follow-up while the host exposes
39
+ it; otherwise retry with a fresh child and a complete prompt.
40
+ - An `invoke_sub_agent` tool with a `general-purpose` subagent is Kiro. Use
41
+ that child for every role; there is no worker/default type split. Start a
42
+ fresh general-purpose child for every correction, retry, post-patch review,
43
+ repeated audit, or later milestone — Kiro subagents are not resumable and
44
+ disk artifacts are the source of truth. Supply the logical task name as the
45
+ task description. Set the child working directory to the exact repository or
46
+ linked-worktree root supplied by GSD Path; do not ask Kiro or the child to
47
+ create another worktree. Encode task dependencies explicitly; launch
48
+ independent children concurrently up to the host's advertised
49
+ concurrent-subagent capacity.
50
+
51
+ For every branch:
52
+
53
+ - Supply the deterministic logical task name: `inspect_codebase`,
54
+ `inspect_docs`, `docs_audit`, `research_<dimension>`, `decide`, `roadmap`,
55
+ `plan`,
56
+ `plan_patch`, `build_<task_id>`, `review_wave_<wave>_cycle_<cycle>`
57
+ (a `deep` wave review appends the lens suffix `_contract` or
58
+ `_adversarial`; an optional review panel uses
59
+ `review_wave_<wave>_cycle_<cycle>_panel_<family>`; an optional finding
60
+ skeptic uses `review_wave_<wave>_cycle_<cycle>_skeptic_<criterion_locator>`),
61
+ `review_plan_panel_<family>`,
62
+ `review_final`, or `review_gap_<number>`. Normalize variable parts to
63
+ lowercase ASCII and replace non-alphanumeric runs with one underscore.
64
+ Never add a random suffix or collide with a running logical target.
65
+ - Resolve the phase's linked role brief to an absolute path, include it in the
66
+ prompt, and require the child to read it before acting. The role brief
67
+ supplies the read-only boundary for auditors and reviewers.
68
+ - Tier hints: use the portable `heavy` tier for `plan`, `plan_patch`, `decide`,
69
+ and `roadmap`, the portable `light` tier for `inspect_docs` and `docs_audit`,
70
+ and the session-default tier for every other role. Apply the Codex mapping
71
+ above when its schema advertises reasoning-effort selection. On every other
72
+ host, use only an exact native equivalent advertised by that host; otherwise
73
+ do not override the model or reasoning effort. The only exception is a
74
+ review-panel child: when the host advertises model selection, pass the exact
75
+ slug returned by `scripts/review_panel.py resolve` for that family. Never
76
+ override the model on the canonical reviewer, planner, coder, or any other
77
+ role.
78
+ Host isolation: none. The child's working directory is the exact absolute
79
+ root GSD Path supplied; a host SHA checkout or extra worktree is a contract
80
+ failure. Never ask the host to create a worktree. Give the child the exact
81
+ repository or linked-worktree root supplied by GSD Path.
82
+ - Send a self-contained prompt with absolute input, template, and output paths
83
+ plus the child's bounded responsibility. Every brief also names the absolute
84
+ `AGENTS.md` and `WORKFLOW.md` paths (or explicitly says they are absent), the
85
+ next phase that consumes the output, the gate it must satisfy, and the
86
+ terminal result it must return. A coder prompt also names its isolated
87
+ linked-worktree root; no child may infer the primary worktree.
88
+ - The parent is the sole dispatcher and lifecycle owner. If the runtime exposes
89
+ structured Run/Task/Dispatch orchestration, bind one Run, create one Task per
90
+ independent brief with explicit dependencies, inject the brief, and wait for
91
+ every `worker_done`, `escalation`, or question before applying the gate.
92
+ Verify the task and dispatch records before reporting the work as
93
+ orchestrated. On runtimes without that layer, use the host adapter's
94
+ equivalent and preserve the same logical name, completion state,
95
+ timeout/cancellation, and cleanup rules; never silently delegate again from a
96
+ child.
97
+ - When the structured layer exposes a blocking ask/reply channel, route a
98
+ coder's `NEEDS-ORCHESTRATOR` question through it as a live question with
99
+ the worker held alive for the reply, instead of block-and-redispatch. The
100
+ answer is still appended to the task Log as
101
+ `Orchestrator answer:` so the portable on-disk record stays complete, and a
102
+ timed-out or unavailable channel falls back to the portable block path.
103
+ - A child that receives a disposable worktree stages its assigned artifact
104
+ under that root. The parent validates it and atomically transfers it to the
105
+ canonical project path before removing the exact disposable root. A child
106
+ never writes a disposable-review output directly into the primary worktree.
107
+ - Launch independent briefs concurrently up to the advertised child capacity,
108
+ batch any remainder without combining briefs, and collect every result
109
+ before applying the phase gate. Do not leave an active child, logical task, or
110
+ temporary worktree after collection; a timeout or cancellation is a blocked
111
+ result, not a silent success.
112
+ - If the tool schema is ambiguous or the required full-capability child is
113
+ unavailable, stop and report the missing capability. Do not guess the host
114
+ or silently collapse an independence boundary into the main context.
115
+
116
+ ## Configured output budgets
117
+
118
+ When the owner supplies token budgets, use the router bundle's
119
+ `scripts/token_budget.py` with the owner's exact task and session values and
120
+ quoted authority. Keep one ledger outside the worktree under the Git common
121
+ directory for the full logical session; resumptions reuse it. Record completed
122
+ parent CLI run events and each native child's session events with stable logical
123
+ task names before the next dispatch. The helper reads host counters and refuses
124
+ incomplete or ambiguous usage; never estimate tokens or reset the ledger.
125
+ Run `admit` for the next task and stop dispatch on a blocked result. Preserve
126
+ its output in the dispatch evidence. This gates observed usage only: concurrent
127
+ or in-flight work can overrun before the host reports usage. Codex CLI has no
128
+ advertised hard output cap; report that limitation once. If the owner requires
129
+ hard generation enforcement, use `admit --require-hard-cap`; unsupported means
130
+ blocked, not budget compliance. Other hosts require a verified native counter
131
+ and cap adapter before any enforcement claim.