plumbbob 0.9.3 → 0.10.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 (320) hide show
  1. package/.claude-plugin/plugin.json +1 -1
  2. package/README.md +92 -89
  3. package/dist/cli-core.js +25 -8
  4. package/dist/cli.js +1 -1
  5. package/dist/lib/agents.js +26 -26
  6. package/dist/lib/buildlog.js +11 -11
  7. package/dist/lib/buildlogsync.js +8 -8
  8. package/dist/lib/check.js +55 -22
  9. package/dist/lib/commitbody.js +72 -0
  10. package/dist/lib/commitmsg.js +7 -7
  11. package/dist/lib/git.js +44 -15
  12. package/dist/lib/intent.js +21 -20
  13. package/dist/lib/latch.js +19 -19
  14. package/dist/lib/orient.js +36 -17
  15. package/dist/lib/reentry.js +70 -0
  16. package/dist/lib/settings.js +16 -16
  17. package/dist/lib/sidecar.js +54 -54
  18. package/dist/lib/templates.js +1 -1
  19. package/dist/verbs/agent.js +27 -27
  20. package/dist/verbs/build.js +9 -9
  21. package/dist/verbs/check.js +6 -6
  22. package/dist/verbs/checkpoint.js +48 -47
  23. package/dist/verbs/doctor.js +31 -30
  24. package/dist/verbs/finish.js +28 -41
  25. package/dist/verbs/handoff.js +9 -8
  26. package/dist/verbs/init.js +9 -9
  27. package/dist/verbs/park.js +3 -3
  28. package/dist/verbs/recover.js +297 -0
  29. package/dist/verbs/revert.js +13 -13
  30. package/dist/verbs/spike.js +25 -19
  31. package/dist/verbs/start.js +49 -19
  32. package/dist/verbs/status.js +8 -8
  33. package/dist/verbs/turn.js +16 -16
  34. package/dist/verbs/use.js +4 -4
  35. package/hooks/post-edit.sh +4 -4
  36. package/hooks/pre-bash-commit.sh +3 -3
  37. package/node_modules/checkride/.claude-plugin/plugin.json +11 -0
  38. package/node_modules/checkride/CHANGELOG.md +1404 -0
  39. package/node_modules/checkride/LICENSE +201 -21
  40. package/node_modules/checkride/README.md +197 -38
  41. package/node_modules/checkride/dist/__tests__/fixtures/released-stanzas.d.ts +15 -0
  42. package/node_modules/checkride/dist/__tests__/fixtures/released-stanzas.d.ts.map +1 -0
  43. package/node_modules/checkride/dist/__tests__/fixtures/released-stanzas.js +17 -0
  44. package/node_modules/checkride/dist/__tests__/fixtures/released-stanzas.js.map +1 -0
  45. package/node_modules/checkride/dist/adapters.d.ts +30 -10
  46. package/node_modules/checkride/dist/adapters.d.ts.map +1 -1
  47. package/node_modules/checkride/dist/adapters.js +62 -23
  48. package/node_modules/checkride/dist/adapters.js.map +1 -1
  49. package/node_modules/checkride/dist/agent-setup/claude.d.ts +88 -0
  50. package/node_modules/checkride/dist/agent-setup/claude.d.ts.map +1 -0
  51. package/node_modules/checkride/dist/agent-setup/claude.js +305 -0
  52. package/node_modules/checkride/dist/agent-setup/claude.js.map +1 -0
  53. package/node_modules/checkride/dist/agent-setup/command.d.ts +43 -0
  54. package/node_modules/checkride/dist/agent-setup/command.d.ts.map +1 -0
  55. package/node_modules/checkride/dist/agent-setup/command.js +77 -0
  56. package/node_modules/checkride/dist/agent-setup/command.js.map +1 -0
  57. package/node_modules/checkride/dist/agent-setup/cursor.d.ts +69 -0
  58. package/node_modules/checkride/dist/agent-setup/cursor.d.ts.map +1 -0
  59. package/node_modules/checkride/dist/agent-setup/cursor.js +247 -0
  60. package/node_modules/checkride/dist/agent-setup/cursor.js.map +1 -0
  61. package/node_modules/checkride/dist/agent-setup/files.d.ts +50 -0
  62. package/node_modules/checkride/dist/agent-setup/files.d.ts.map +1 -0
  63. package/node_modules/checkride/dist/agent-setup/files.js +80 -0
  64. package/node_modules/checkride/dist/agent-setup/files.js.map +1 -0
  65. package/node_modules/checkride/dist/agent-setup/harness.d.ts +101 -0
  66. package/node_modules/checkride/dist/agent-setup/harness.d.ts.map +1 -0
  67. package/node_modules/checkride/dist/agent-setup/harness.js +93 -0
  68. package/node_modules/checkride/dist/agent-setup/harness.js.map +1 -0
  69. package/node_modules/checkride/dist/agent-setup/hook.d.ts +45 -52
  70. package/node_modules/checkride/dist/agent-setup/hook.d.ts.map +1 -1
  71. package/node_modules/checkride/dist/agent-setup/hook.js +64 -95
  72. package/node_modules/checkride/dist/agent-setup/hook.js.map +1 -1
  73. package/node_modules/checkride/dist/agent-setup/index.d.ts +10 -4
  74. package/node_modules/checkride/dist/agent-setup/index.d.ts.map +1 -1
  75. package/node_modules/checkride/dist/agent-setup/index.js +9 -4
  76. package/node_modules/checkride/dist/agent-setup/index.js.map +1 -1
  77. package/node_modules/checkride/dist/agent-setup/scripts.d.ts +81 -0
  78. package/node_modules/checkride/dist/agent-setup/scripts.d.ts.map +1 -0
  79. package/node_modules/checkride/dist/agent-setup/scripts.js +604 -0
  80. package/node_modules/checkride/dist/agent-setup/scripts.js.map +1 -0
  81. package/node_modules/checkride/dist/agent-setup/skills.d.ts +31 -0
  82. package/node_modules/checkride/dist/agent-setup/skills.d.ts.map +1 -0
  83. package/node_modules/checkride/dist/agent-setup/skills.js +56 -0
  84. package/node_modules/checkride/dist/agent-setup/skills.js.map +1 -0
  85. package/node_modules/checkride/dist/artifacts/configured.d.ts +30 -0
  86. package/node_modules/checkride/dist/artifacts/configured.d.ts.map +1 -0
  87. package/node_modules/checkride/dist/artifacts/configured.js +45 -0
  88. package/node_modules/checkride/dist/artifacts/configured.js.map +1 -0
  89. package/node_modules/checkride/dist/artifacts/format.d.ts +33 -0
  90. package/node_modules/checkride/dist/artifacts/format.d.ts.map +1 -0
  91. package/node_modules/checkride/dist/artifacts/format.js +56 -0
  92. package/node_modules/checkride/dist/artifacts/format.js.map +1 -0
  93. package/node_modules/checkride/dist/artifacts/freshness.d.ts +32 -0
  94. package/node_modules/checkride/dist/artifacts/freshness.d.ts.map +1 -0
  95. package/node_modules/checkride/dist/artifacts/freshness.js +37 -0
  96. package/node_modules/checkride/dist/artifacts/freshness.js.map +1 -0
  97. package/node_modules/checkride/dist/artifacts/index.d.ts +22 -0
  98. package/node_modules/checkride/dist/artifacts/index.d.ts.map +1 -0
  99. package/node_modules/checkride/dist/artifacts/index.js +19 -0
  100. package/node_modules/checkride/dist/artifacts/index.js.map +1 -0
  101. package/node_modules/checkride/dist/artifacts/json.d.ts +31 -0
  102. package/node_modules/checkride/dist/artifacts/json.d.ts.map +1 -0
  103. package/node_modules/checkride/dist/artifacts/json.js +47 -0
  104. package/node_modules/checkride/dist/artifacts/json.js.map +1 -0
  105. package/node_modules/checkride/dist/artifacts/raw.d.ts +60 -0
  106. package/node_modules/checkride/dist/artifacts/raw.d.ts.map +1 -0
  107. package/node_modules/checkride/dist/artifacts/raw.js +91 -0
  108. package/node_modules/checkride/dist/artifacts/raw.js.map +1 -0
  109. package/node_modules/checkride/dist/artifacts/summary.d.ts +69 -0
  110. package/node_modules/checkride/dist/artifacts/summary.d.ts.map +1 -0
  111. package/node_modules/checkride/dist/artifacts/summary.js +108 -0
  112. package/node_modules/checkride/dist/artifacts/summary.js.map +1 -0
  113. package/node_modules/checkride/dist/atomic.d.ts +16 -1
  114. package/node_modules/checkride/dist/atomic.d.ts.map +1 -1
  115. package/node_modules/checkride/dist/atomic.js +25 -3
  116. package/node_modules/checkride/dist/atomic.js.map +1 -1
  117. package/node_modules/checkride/dist/baseline/fallow.d.ts +9 -5
  118. package/node_modules/checkride/dist/baseline/fallow.d.ts.map +1 -1
  119. package/node_modules/checkride/dist/baseline/fallow.js +163 -60
  120. package/node_modules/checkride/dist/baseline/fallow.js.map +1 -1
  121. package/node_modules/checkride/dist/baseline/fingerprint.d.ts +20 -11
  122. package/node_modules/checkride/dist/baseline/fingerprint.d.ts.map +1 -1
  123. package/node_modules/checkride/dist/baseline/fingerprint.js +73 -23
  124. package/node_modules/checkride/dist/baseline/fingerprint.js.map +1 -1
  125. package/node_modules/checkride/dist/baseline/history.d.ts +98 -0
  126. package/node_modules/checkride/dist/baseline/history.d.ts.map +1 -0
  127. package/node_modules/checkride/dist/baseline/history.js +232 -0
  128. package/node_modules/checkride/dist/baseline/history.js.map +1 -0
  129. package/node_modules/checkride/dist/baseline/index.d.ts +7 -5
  130. package/node_modules/checkride/dist/baseline/index.d.ts.map +1 -1
  131. package/node_modules/checkride/dist/baseline/index.js +5 -4
  132. package/node_modules/checkride/dist/baseline/index.js.map +1 -1
  133. package/node_modules/checkride/dist/baseline/store.d.ts +41 -10
  134. package/node_modules/checkride/dist/baseline/store.d.ts.map +1 -1
  135. package/node_modules/checkride/dist/baseline/store.js +65 -24
  136. package/node_modules/checkride/dist/baseline/store.js.map +1 -1
  137. package/node_modules/checkride/dist/baseline-command.d.ts +5 -5
  138. package/node_modules/checkride/dist/baseline-command.js +7 -7
  139. package/node_modules/checkride/dist/baseline-command.js.map +1 -1
  140. package/node_modules/checkride/dist/cli.d.ts +21 -4
  141. package/node_modules/checkride/dist/cli.d.ts.map +1 -1
  142. package/node_modules/checkride/dist/cli.js +350 -36
  143. package/node_modules/checkride/dist/cli.js.map +1 -1
  144. package/node_modules/checkride/dist/config.d.ts +114 -9
  145. package/node_modules/checkride/dist/config.d.ts.map +1 -1
  146. package/node_modules/checkride/dist/config.js +142 -23
  147. package/node_modules/checkride/dist/config.js.map +1 -1
  148. package/node_modules/checkride/dist/digest/digest.d.ts +5 -5
  149. package/node_modules/checkride/dist/digest/digest.js +6 -6
  150. package/node_modules/checkride/dist/digest/index.d.ts +2 -2
  151. package/node_modules/checkride/dist/digest/index.js +2 -2
  152. package/node_modules/checkride/dist/doctor.d.ts +27 -6
  153. package/node_modules/checkride/dist/doctor.d.ts.map +1 -1
  154. package/node_modules/checkride/dist/doctor.js +231 -27
  155. package/node_modules/checkride/dist/doctor.js.map +1 -1
  156. package/node_modules/checkride/dist/gate.d.ts +180 -0
  157. package/node_modules/checkride/dist/gate.d.ts.map +1 -0
  158. package/node_modules/checkride/dist/gate.js +617 -0
  159. package/node_modules/checkride/dist/gate.js.map +1 -0
  160. package/node_modules/checkride/dist/init.d.ts +79 -12
  161. package/node_modules/checkride/dist/init.d.ts.map +1 -1
  162. package/node_modules/checkride/dist/init.js +385 -81
  163. package/node_modules/checkride/dist/init.js.map +1 -1
  164. package/node_modules/checkride/dist/json.d.ts +21 -0
  165. package/node_modules/checkride/dist/json.d.ts.map +1 -0
  166. package/node_modules/checkride/dist/json.js +21 -0
  167. package/node_modules/checkride/dist/json.js.map +1 -0
  168. package/node_modules/checkride/dist/links.d.ts +31 -5
  169. package/node_modules/checkride/dist/links.d.ts.map +1 -1
  170. package/node_modules/checkride/dist/links.js +141 -32
  171. package/node_modules/checkride/dist/links.js.map +1 -1
  172. package/node_modules/checkride/dist/node-pin.d.ts +129 -0
  173. package/node_modules/checkride/dist/node-pin.d.ts.map +1 -0
  174. package/node_modules/checkride/dist/node-pin.js +211 -0
  175. package/node_modules/checkride/dist/node-pin.js.map +1 -0
  176. package/node_modules/checkride/dist/orchestrator.d.ts +53 -10
  177. package/node_modules/checkride/dist/orchestrator.d.ts.map +1 -1
  178. package/node_modules/checkride/dist/orchestrator.js +312 -113
  179. package/node_modules/checkride/dist/orchestrator.js.map +1 -1
  180. package/node_modules/checkride/dist/pack.d.ts +8 -9
  181. package/node_modules/checkride/dist/pack.d.ts.map +1 -1
  182. package/node_modules/checkride/dist/pack.js +53 -17
  183. package/node_modules/checkride/dist/pack.js.map +1 -1
  184. package/node_modules/checkride/dist/pm/detect.d.ts +6 -1
  185. package/node_modules/checkride/dist/pm/detect.d.ts.map +1 -1
  186. package/node_modules/checkride/dist/pm/detect.js +6 -1
  187. package/node_modules/checkride/dist/pm/detect.js.map +1 -1
  188. package/node_modules/checkride/dist/pm/index.d.ts +7 -2
  189. package/node_modules/checkride/dist/pm/index.d.ts.map +1 -1
  190. package/node_modules/checkride/dist/pm/index.js +6 -2
  191. package/node_modules/checkride/dist/pm/index.js.map +1 -1
  192. package/node_modules/checkride/dist/pm/launch.d.ts +72 -0
  193. package/node_modules/checkride/dist/pm/launch.d.ts.map +1 -0
  194. package/node_modules/checkride/dist/pm/launch.js +108 -0
  195. package/node_modules/checkride/dist/pm/launch.js.map +1 -0
  196. package/node_modules/checkride/dist/pm/tools.d.ts +73 -0
  197. package/node_modules/checkride/dist/pm/tools.d.ts.map +1 -0
  198. package/node_modules/checkride/dist/pm/tools.js +124 -0
  199. package/node_modules/checkride/dist/pm/tools.js.map +1 -0
  200. package/node_modules/checkride/dist/pm/translate.d.ts +35 -9
  201. package/node_modules/checkride/dist/pm/translate.d.ts.map +1 -1
  202. package/node_modules/checkride/dist/pm/translate.js +78 -18
  203. package/node_modules/checkride/dist/pm/translate.js.map +1 -1
  204. package/node_modules/checkride/dist/proc.d.ts +30 -0
  205. package/node_modules/checkride/dist/proc.d.ts.map +1 -0
  206. package/node_modules/checkride/dist/proc.js +42 -0
  207. package/node_modules/checkride/dist/proc.js.map +1 -0
  208. package/node_modules/checkride/dist/qa/cli.d.ts +20 -0
  209. package/node_modules/checkride/dist/qa/cli.d.ts.map +1 -0
  210. package/node_modules/checkride/dist/qa/cli.js +24 -0
  211. package/node_modules/checkride/dist/qa/cli.js.map +1 -0
  212. package/node_modules/checkride/dist/qa/dead.d.ts +39 -0
  213. package/node_modules/checkride/dist/qa/dead.d.ts.map +1 -0
  214. package/node_modules/checkride/dist/qa/dead.js +88 -0
  215. package/node_modules/checkride/dist/qa/dead.js.map +1 -0
  216. package/node_modules/checkride/dist/qa/dupes.d.ts +45 -0
  217. package/node_modules/checkride/dist/qa/dupes.d.ts.map +1 -0
  218. package/node_modules/checkride/dist/qa/dupes.js +62 -0
  219. package/node_modules/checkride/dist/qa/dupes.js.map +1 -0
  220. package/node_modules/checkride/dist/qa/health.d.ts +85 -0
  221. package/node_modules/checkride/dist/qa/health.d.ts.map +1 -0
  222. package/node_modules/checkride/dist/qa/health.js +109 -0
  223. package/node_modules/checkride/dist/qa/health.js.map +1 -0
  224. package/node_modules/checkride/dist/qa/index.d.ts +23 -0
  225. package/node_modules/checkride/dist/qa/index.d.ts.map +1 -0
  226. package/node_modules/checkride/dist/qa/index.js +22 -0
  227. package/node_modules/checkride/dist/qa/index.js.map +1 -0
  228. package/node_modules/checkride/dist/qa/mutation.d.ts +80 -0
  229. package/node_modules/checkride/dist/qa/mutation.d.ts.map +1 -0
  230. package/node_modules/checkride/dist/qa/mutation.js +195 -0
  231. package/node_modules/checkride/dist/qa/mutation.js.map +1 -0
  232. package/node_modules/checkride/dist/qa/qa.d.ts +71 -0
  233. package/node_modules/checkride/dist/qa/qa.d.ts.map +1 -0
  234. package/node_modules/checkride/dist/qa/qa.js +158 -0
  235. package/node_modules/checkride/dist/qa/qa.js.map +1 -0
  236. package/node_modules/checkride/dist/qa/read.d.ts +40 -0
  237. package/node_modules/checkride/dist/qa/read.d.ts.map +1 -0
  238. package/node_modules/checkride/dist/qa/read.js +47 -0
  239. package/node_modules/checkride/dist/qa/read.js.map +1 -0
  240. package/node_modules/checkride/dist/qa/render.d.ts +26 -0
  241. package/node_modules/checkride/dist/qa/render.d.ts.map +1 -0
  242. package/node_modules/checkride/dist/qa/render.js +310 -0
  243. package/node_modules/checkride/dist/qa/render.js.map +1 -0
  244. package/node_modules/checkride/dist/recover.d.ts +48 -0
  245. package/node_modules/checkride/dist/recover.d.ts.map +1 -0
  246. package/node_modules/checkride/dist/recover.js +220 -0
  247. package/node_modules/checkride/dist/recover.js.map +1 -0
  248. package/node_modules/checkride/dist/security.d.ts +45 -0
  249. package/node_modules/checkride/dist/security.d.ts.map +1 -0
  250. package/node_modules/checkride/dist/security.js +86 -0
  251. package/node_modules/checkride/dist/security.js.map +1 -0
  252. package/node_modules/checkride/dist/smoke.d.ts +6 -6
  253. package/node_modules/checkride/dist/smoke.js +6 -6
  254. package/node_modules/checkride/dist/snippets.d.ts +27 -30
  255. package/node_modules/checkride/dist/snippets.d.ts.map +1 -1
  256. package/node_modules/checkride/dist/snippets.js +26 -30
  257. package/node_modules/checkride/dist/snippets.js.map +1 -1
  258. package/node_modules/checkride/dist/tool-json.d.ts +33 -0
  259. package/node_modules/checkride/dist/tool-json.d.ts.map +1 -0
  260. package/node_modules/checkride/dist/tool-json.js +58 -0
  261. package/node_modules/checkride/dist/tool-json.js.map +1 -0
  262. package/node_modules/checkride/dist/triage/cli.d.ts +21 -0
  263. package/node_modules/checkride/dist/triage/cli.d.ts.map +1 -0
  264. package/node_modules/checkride/dist/triage/cli.js +26 -0
  265. package/node_modules/checkride/dist/triage/cli.js.map +1 -0
  266. package/node_modules/checkride/dist/triage/doctor-fold.d.ts +51 -0
  267. package/node_modules/checkride/dist/triage/doctor-fold.d.ts.map +1 -0
  268. package/node_modules/checkride/dist/triage/doctor-fold.js +88 -0
  269. package/node_modules/checkride/dist/triage/doctor-fold.js.map +1 -0
  270. package/node_modules/checkride/dist/triage/env.d.ts +54 -0
  271. package/node_modules/checkride/dist/triage/env.d.ts.map +1 -0
  272. package/node_modules/checkride/dist/triage/env.js +81 -0
  273. package/node_modules/checkride/dist/triage/env.js.map +1 -0
  274. package/node_modules/checkride/dist/triage/gate.d.ts +61 -0
  275. package/node_modules/checkride/dist/triage/gate.d.ts.map +1 -0
  276. package/node_modules/checkride/dist/triage/gate.js +121 -0
  277. package/node_modules/checkride/dist/triage/gate.js.map +1 -0
  278. package/node_modules/checkride/dist/triage/index.d.ts +22 -0
  279. package/node_modules/checkride/dist/triage/index.d.ts.map +1 -0
  280. package/node_modules/checkride/dist/triage/index.js +20 -0
  281. package/node_modules/checkride/dist/triage/index.js.map +1 -0
  282. package/node_modules/checkride/dist/triage/render.d.ts +19 -0
  283. package/node_modules/checkride/dist/triage/render.d.ts.map +1 -0
  284. package/node_modules/checkride/dist/triage/render.js +419 -0
  285. package/node_modules/checkride/dist/triage/render.js.map +1 -0
  286. package/node_modules/checkride/dist/triage/triage.d.ts +83 -0
  287. package/node_modules/checkride/dist/triage/triage.d.ts.map +1 -0
  288. package/node_modules/checkride/dist/triage/triage.js +131 -0
  289. package/node_modules/checkride/dist/triage/triage.js.map +1 -0
  290. package/node_modules/checkride/package.json +18 -15
  291. package/node_modules/checkride/schema/checkride.config.schema.json +70 -5
  292. package/node_modules/checkride/schema/checkride.summary.schema.json +1 -1
  293. package/node_modules/checkride/skills/check/SKILL.md +265 -0
  294. package/node_modules/checkride/skills/qa/SKILL.md +231 -0
  295. package/node_modules/checkride/templates/shared/cspell.json +1 -0
  296. package/node_modules/checkride/templates/shared/oxlintrc.json +1 -1
  297. package/node_modules/checkride/templates/shared/styles/Repo/Drift.yml +41 -0
  298. package/node_modules/checkride/templates/shared/styles/Repo/Latin.yml +14 -0
  299. package/node_modules/checkride/templates/shared/styles/Repo/LyHyphen.yml +28 -0
  300. package/node_modules/checkride/templates/shared/styles/Repo/Minted.yml +33 -0
  301. package/node_modules/checkride/templates/shared/styles/Repo/ThereIs.yml +16 -0
  302. package/node_modules/checkride/templates/shared/styles/Repo/Weasel.yml +26 -0
  303. package/node_modules/checkride/templates/shared/vale.ini +34 -0
  304. package/package.json +10 -9
  305. package/skills/build/SKILL.md +85 -76
  306. package/skills/doctor/SKILL.md +11 -11
  307. package/skills/finish/SKILL.md +21 -18
  308. package/skills/harvest/SKILL.md +13 -11
  309. package/skills/park/SKILL.md +10 -10
  310. package/skills/plan/SKILL.md +69 -59
  311. package/skills/recover/SKILL.md +28 -0
  312. package/skills/refine/SKILL.md +21 -18
  313. package/skills/revert/SKILL.md +6 -6
  314. package/skills/spike/SKILL.md +9 -9
  315. package/skills/status/SKILL.md +5 -5
  316. package/skills/step/SKILL.md +20 -15
  317. package/skills/verify/SKILL.md +56 -46
  318. package/templates/build-log.md +7 -7
  319. package/templates/intent.md +52 -41
  320. package/templates/spike-report.md +10 -10
@@ -1,27 +1,27 @@
1
1
  ---
2
2
  name: plan
3
- description: "Frame a fresh goal and author the whole plan — Frame, Decisions, Constraints, and all Steps — before any code. Three input modes: no arg interviews you; a file path (or @-mention) absorbs a spec; any other text expands your inline intent."
3
+ description: "Frame a fresh goal and author the whole plan (Frame, Decisions, Constraints, and all Steps) before any code. Three input modes: no arg interviews you; a file path (or @-mention) absorbs a spec; any other text expands your inline intent."
4
4
  argument-hint: "[spec-path | intent]"
5
5
  disable-model-invocation: true
6
6
  allowed-tools: Read, Edit, Write, Bash(plumbbob status:*), Bash(plumbbob start:*), Bash(plumbbob checkpoint:*), Bash(plumbbob agent list:*)
7
7
  ---
8
8
 
9
- # PlumbBob — plan a goal (the whole-goal move)
9
+ # PlumbBob: plan a goal (the whole-goal move)
10
10
 
11
11
  Current session state (injected when this skill runs): !`plumbbob status 2>/dev/null || echo "plumbbob CLI not on PATH in this session. Marketplace install: confirm the plugin is enabled in /plugin, then /reload-plugins. Skills-dir/global install: npm i -g plumbbob && plumbbob init."`
12
12
 
13
- `/plumbbob:plan` is the **whole-goal** move — it opens a session and gets the deciding out
13
+ `/plumbbob:plan` is the **whole-goal** move; it opens a session and gets the deciding out
14
14
  of your head and onto `intent.md` *before* any code. By default it authors the
15
15
  **complete plan, including all the Steps**, so the happy path afterward is just
16
16
  `/plumbbob:build` until done. (Revising a single increment later is the separate `/plumbbob:step`
17
17
  move; do not confuse the two.)
18
18
 
19
- A model note: this skill **inherits the session model** — nothing pins or switches
19
+ A model note: this skill **inherits the session model**; nothing pins or switches
20
20
  it. Planning is where frontier-class judgment pays for itself, so if the session is
21
- running a small model, suggest `/model opus` (or better) before framing — the
21
+ running a small model, suggest `/model opus` (or better) before framing: the
22
22
  human's call, never a gate.
23
23
 
24
- ## Three input modes (disambiguated for you — no quotes needed)
24
+ ## Three input modes (disambiguated for you; no quotes needed)
25
25
 
26
26
  Look at the argument the human gave and pick the mode yourself:
27
27
 
@@ -32,10 +32,10 @@ Look at the argument the human gave and pick the mode yourself:
32
32
  the token with the `Read` tool; if Claude Code has already injected the referenced
33
33
  file's contents into your context, treat that as the spec rather than re-fetching.
34
34
  Read the spec and distill it into `intent.md`, **retaining enough detail that
35
- `intent.md` stands on its own** — don't just link to the source. Add a one-line
35
+ `intent.md` stands on its own**; don't just link to the source. Add a one-line
36
36
  provenance (`*Source: <path>*`) and, for anything sizable, a `## Source` appendix
37
- preserving the original text. Any prose wrapped around the reference (e.g. "absorb
38
- @spec.md") is extra intent — fold it in. (If the token isn't a real file, fall to
37
+ preserving the original text. Any prose wrapped around the reference (for example "absorb
38
+ @spec.md") is extra intent; fold it in. (If the token isn't a real file, fall to
39
39
  mode 3.)
40
40
  3. **Any other text → expand the inline intent.** Treat the text as the human's
41
41
  rough plan, expand it into the full `intent.md`, and ask only about what is
@@ -50,73 +50,77 @@ an agent can follow with `/plumbbob:build`. The argument only seeds how you get
50
50
  to create `.plumbbob/` (baseline recorded, session opened). If a session already
51
51
  exists, say so and edit the existing `intent.md` rather than starting over.
52
52
  - **If `start` warns that the gate sees no code checks**, surface that to the
53
- human now — while they're still deciding, not at the first refused
54
- checkpoint — and offer to set the `check` key in `.plumbbob/settings.json`
55
- (e.g. `"check": "npm test"`) before any step is built.
53
+ human now (while they're still deciding, not at the first refused
54
+ checkpoint) and offer to set the `check` key in `.plumbbob/settings.json`
55
+ (for example `"check": "npm test"`) before any step is built.
56
56
  2. **Frame** (`.plumbbob/intent.md`), with the human: the **Problem** in plain words,
57
57
  the **smallest thing** that solves it, what **done looks like**, and what you are
58
- **explicitly NOT doing**. This is the human's convergence — propose wording, but
58
+ **explicitly NOT doing**. This is the human's convergence: propose wording, but
59
59
  the human decides every line.
60
60
  3. **Decisions & Constraints.** Record the settled calls (one line each, with the
61
- *because*) and the hard rules the build must honor. **Slug each at birth** — mint a
62
- two- or three-word slug where the item is born (`D1 (default-waves): …`,
63
- `C1 (no-new-deps): …`) and copy that slug at every reference site, so a later
64
- mention reads `D4 (default-waves)` and stays legible: **never a bare `D4`/`C6`/`Q2`
65
- reference — always carry its gloss**, so a cold reader never has to hunt the number
66
- down. An unresolved hole goes to **Open questions**, never guessed into a Decision —
67
- and it goes in the expanded form the template shows: a slugged opener (the hole as a
68
- question), a `*plain:*` sub-line (what's at stake, in plain words, enough to judge it
69
- cold), then a `*lean:*` sub-line (your proposed resolution — one answer to react to,
70
- not a menu), so the human settles it in one pass without a round-trip. (A tiny,
71
- obvious question may stay one bare line; the sub-lines earn their keep only when a
72
- human decision genuinely waits on it.)
73
- 4. **Author the Steps.** Write the **full build plan** under `## Steps` — each step a
74
- small, verifiable increment in the exact format the parser reads:
61
+ *because*) and the hard rules the build must honor. **Anchor and slug each at birth**:
62
+ mint a two- or three-word slug where the item is born and give it an anchor for
63
+ references to land on (`- <a id="d1"></a>**D1 (default-waves)**: …`,
64
+ `- <a id="c1"></a>**C1 (no-new-deps)**: …`), then cite it everywhere else in the file
65
+ as `[D4 (default-waves)](#d4)`, carrying that slug verbatim: **never a bare
66
+ `D4`/`C6`/`Q2` reference, and never a linkless one**: one link to the definition,
67
+ one glance at the gloss, so a cold reader never has to hunt the number down.
68
+ An unresolved hole goes to **Open questions**, never guessed into a Decision,
69
+ and it goes in the expanded form the template shows: an anchored, slugged opener
70
+ (the hole as a question, `- <a id="q1"></a>**Q1 (default-waves)**: …`, so
71
+ `[Q1 (default-waves)](#q1)` has somewhere to land), a `*plain:*` sub-line (what's at
72
+ stake, in plain words, enough to judge it cold), then a `*lean:*` sub-line (your
73
+ proposed resolution: one answer to react to, not a menu), so the human settles it in
74
+ one pass without a round-trip. (A tiny, obvious question may stay one bare line; the
75
+ sub-lines earn their keep only when a human decision genuinely waits on it.)
76
+ 4. **Author the Steps.** Write the **full build plan** under `## Steps` (each step a
77
+ small, verifiable increment) in the exact format the parser reads:
75
78
 
76
79
  ```markdown
77
- 1. [ ] feat(scope): <title> — **done when:** <criterion, ideally a test or check result>
80
+ 1. [ ] feat(scope): <title>, **done when:** <criterion, ideally a test or check result>
78
81
  - seam: `<file>`, `<file>`
79
- - model: <optional — smallest that can carry it, with the one-phrase why>
82
+ - model: <optional; smallest that can carry it, with the one-phrase why>
80
83
  ```
81
84
 
82
85
  Every step needs a **done-when** `/plumbbob:verify` can check and a **seam** (the exact
83
- paths it touches). Later steps may be fuzzier than the first — that's fine; they get
86
+ paths it touches). Later steps may be fuzzier than the first (that's fine); they get
84
87
  sharpened just-in-time when you reach them with `/plumbbob:step`. Keep each small enough to
85
88
  verify in one review pass.
86
89
 
87
- **The title *is* the commit subject — author it as one** *(D1)*: write each
90
+ **The title *is* the commit subject; author it as one**
91
+ ([D68 (conventional-subjects)](https://github.com/robmclarty/plumbbob/blob/main/docs/decisions.md#d68)): write each
88
92
  `<title>` as a plain, single-line Conventional-Commit subject,
89
93
  `type(scope): description`, and it lands in `git log` verbatim (its breaking `!`
90
- honored) — this is how each step lands a *real* `feat`/`fix`/`chore` in the history.
91
- Keep load-bearing detail — file paths, module names — in `seam` and `done-when`; it is
92
- **never jammed into the title** (D2), which has to read as plain English and as a clean
93
- subject at once. Aim for **≤72 characters** (GitHub's subject convention) — soft
94
- guidance you eyeball at plan time, no lint, no gate (D9).
95
-
96
- **Set the build's default scope, then let steps override it** *(D8)*: fill the
97
- `**Scope:**` header once with a short feature-level name — the catch-all every step
98
- inherits — and give a step its own `(scope)` when it touches a distinct code area
94
+ honored); this is how each step lands a *real* `feat`/`fix`/`chore` in the history.
95
+ Keep load-bearing detail (file paths, module names) in `seam` and `done-when`; it is
96
+ **never jammed into the title**, which has to read as plain English and as a clean
97
+ subject at once. Aim for **≤72 characters** (GitHub's subject convention): soft
98
+ guidance you eyeball at plan time, no lint, no gate.
99
+
100
+ **Set the build's default scope, then let steps override it**: fill the
101
+ `**Scope:**` header once with a short feature-level name (the catch-all every step
102
+ inherits) and give a step its own `(scope)` when it touches a distinct code area
99
103
  (`plan`, `commitmsg`, `docs`). A step's `(scope)` names the *code area*; the header
100
104
  names the *feature*, so scopes stay consistent and greppable across builds. Scope
101
105
  resolves title-scope → `**Scope:**` default → build slug → bare, and type resolves
102
106
  title-type → `feat`, so a scopeless plain title still yields a clean
103
- `feat(<slug>): <title>` unchanged ([D68](../../docs/decisions.md#d68), D3).
107
+ `feat(<slug>): <title>` unchanged.
104
108
 
105
109
  **Recommend a model per step where the signal is clear** *(optional)*: the
106
110
  `- model:` sub-line names the **smallest model that can carry the step**, with the
107
- one-phrase why — the human buys capability only where the step needs it. E.g.
108
- `model: sonnet — mechanical, fully specified by the done-when` for rote edits;
109
- `model: opus — strong-assertion test authoring` where the tests do the thinking;
110
- `model: fable — subtle cross-cutting design` for judgment-heavy or creative work.
111
- It is advisory metadata for the human — `/plumbbob:status` surfaces it before each build —
111
+ one-phrase why; the human buys capability only where the step needs it. E.g.
112
+ `model: sonnet (mechanical, fully specified by the done-when)` for rote edits;
113
+ `model: opus (strong-assertion test authoring)` where the tests do the thinking;
114
+ `model: fable (subtle cross-cutting design)` for judgment-heavy or creative work.
115
+ It is advisory metadata for the human (`/plumbbob:status` surfaces it before each build),
112
116
  never a gate, and nothing switches models automatically. Write it plain (no
113
117
  backticks) and omit it when any model would do.
114
118
  5. **Offer harness bindings** *(optional)*. If the build will lean on
115
119
  user-authored agents, author `harness.json` in the build folder (beside `intent.md`)
116
- and review it at the **same plan pause**, alongside the steps — bindings are
120
+ and review it at the **same plan pause**, alongside the steps; bindings are
117
121
  plan-adjacent configuration, so they converge with the plan. It binds agents to a
118
- step's three lifecycle slots — `before` (context in), `build` (the diff), `after`
119
- (advisory review) — with an optional prose `note`; a `defaults` block binds every
122
+ step's three lifecycle slots, `before` (context in), `build` (the diff), and `after`
123
+ (advisory review), with an optional prose `note`; a `defaults` block binds every
120
124
  step. Run `plumbbob agent list` to see what's resolvable, per step:
121
125
 
122
126
  ```json
@@ -128,31 +132,37 @@ an agent can follow with `/plumbbob:build`. The argument only seeds how you get
128
132
  ```
129
133
 
130
134
  Keep it **bindings + prose only, never a conditional**: the file says *which*
131
- agent, not *when* — the host model reads each manifest's `when` prose and a step's
132
- `note` and decides when to fire one mid-build. Skip the file entirely when no step
133
- uses an agent — the loop runs identically without it. The plan commit picks it
135
+ agent, not *when*; the host model reads each manifest's `when` prose and a step's
136
+ `note` and decides when to run one mid-build. Skip the file entirely when no step
137
+ uses an agent; the loop runs identically without it. The plan commit picks it
134
138
  up automatically (it lives in the build folder).
135
139
  6. **Commit the plan.** Once the human approves the frame and steps, run
136
- `plumbbob checkpoint --plan` to commit the scaffold on its own — subject
140
+ `plumbbob checkpoint --plan` to commit the scaffold on its own: subject
137
141
  `chore(<scope>): plan` (with a `plumbbob plan` body marker), only `.plumbbob/builds/<slug>/`,
138
142
  a `plan <sha>` line in
139
143
  `checkpoints`. This keeps the first step's diff clean, so history reads
140
144
  baseline → plan → steps. Pass a proportional `--body` (the single-quoted stdin
141
145
  heredoc) when the rationale is worth carrying; skip it for a small plan. Do this
142
- only on the human's approval — the plan is their convergence.
146
+ only on the human's approval; the plan is their convergence.
143
147
  - **The plan commit is latched too.** Once the turn ledger exists, `checkpoint
144
148
  --plan` refuses to land in the same turn `start` stamped it: present the plan,
145
149
  **end the turn**, and the human's approving message is the tick that lets it
146
- commit on re-fire — the refusal *is* the plan pause. Never route around it with a
150
+ commit on the next run; the refusal *is* the plan pause. Never route around it with a
147
151
  raw `git commit`. (One documented seam: the very first plan of a brand-new
148
152
  session runs `start` *before* the turn hook has ever ticked, so that single
149
- commit predates the ledger and stays guidance-governed — it lands without a
153
+ commit predates the ledger and stays guidance-governed; it lands without a
150
154
  refusal.)
151
155
  - **Say what the commit publishes.** The close-out line names the tracked folder:
152
156
  `.plumbbob/builds/<slug>/` now rides this branch into the PR, so teammates will
153
157
  see the plan and build record in review. In the same breath, offer the way out:
154
158
  a repo that won't track a tool folder can restart with `plumbbob start --local`
155
159
  (a fully untracked sidecar) before any steps are built.
160
+ - **Record-only variant.** When the repo's own `.gitignore` excludes `.plumbbob/`,
161
+ the folder can't ride the branch; `start` flags this up front, and the plan
162
+ commit lands *record-only*: an empty commit whose message carries the plan
163
+ (the `--body` earns its keep here), the files staying untracked. Say that
164
+ instead: the rationale is published in `git log`, not the folder, so pass a
165
+ fuller `--body` than you otherwise would, since the message is the whole record.
156
166
  7. **Offer to stress-test it.** Suggest `/plumbbob:refine` to attack the frame for holes (or
157
167
  to repair the plan as it drifts). Optional, the human's call.
158
168
 
@@ -160,17 +170,17 @@ an agent can follow with `/plumbbob:build`. The argument only seeds how you get
160
170
 
161
171
  Make it easy and non-intrusive:
162
172
 
163
- - **Triage size first.** A tiny change earns a 3-line Frame and one Step, fast — never
173
+ - **Triage size first.** A tiny change earns a 3-line Frame and one Step, fast: never
164
174
  ceremony on a one-liner. Scale the questions to the work.
165
175
  - **Propose, don't interrogate.** Offer concrete suggestions the human can **accept as-is
166
- without typing** ("done-when: the 6th request in 60s returns 429 — good?"), while
176
+ without typing** ("done-when: the 6th request in 60s returns 429, good?"), while
167
177
  taking arbitrary detail when they want to give it, including pointers to other files.
168
178
  - **Let them double back.** They will revise as the picture sharpens; that's expected.
169
179
  They can also edit `intent.md` by hand at any time, or call `/plumbbob:refine` to repair it.
170
180
 
171
181
  ## The hard contracts
172
182
 
173
- - **Deciding before code.** `/plumbbob:plan` writes `intent.md` only — never source.
183
+ - **Deciding before code.** `/plumbbob:plan` writes `intent.md` only, never source.
174
184
  - **The human converges.** You surface options and draft wording; the human picks.
175
185
  An unresolved hole is an Open question, not a guessed Decision.
176
186
  - **Stands on its own.** Whatever the input mode, the finished `intent.md` carries
@@ -0,0 +1,28 @@
1
+ ---
2
+ name: recover
3
+ description: "Human-triggered driver for `plumbbob recover`; reconcile the control plane when the session looks wrong: a cursor pointing at a build that is gone, a step marked in flight that the plan no longer has, leftovers from an interrupted spike. Reports by default; `--fix` repairs the stale files it can."
4
+ argument-hint: "[--fix]"
5
+ disable-model-invocation: true
6
+ model: haiku
7
+ allowed-tools: Bash(plumbbob status:*), Bash(plumbbob recover:*)
8
+ ---
9
+
10
+ # PlumbBob: reconcile the control plane (driver)
11
+
12
+ Current session state (injected when this skill runs): !`plumbbob status 2>/dev/null || echo "plumbbob CLI not on PATH in this session. Marketplace install: confirm the plugin is enabled in /plugin, then /reload-plugins. Skills-dir/global install: npm i -g plumbbob && plumbbob init."`
13
+
14
+ This is a **driver skill**: a chat-side trigger for the mechanical `plumbbob recover` verb, so the whole workflow runs from the agent window instead of a terminal. It is `disable-model-invocation: true`: only the human fires it. It carries **no Edit and no Write tool**; its only action is to shell the verb and report the verb's output verbatim, including any refusal. The CLI is the source of truth: never retry a refused transition, and never edit a file to work around one.
15
+
16
+ Reach for it when the dashboard and reality disagree: `status` shows a build you thought you finished, or an empty plan for a build you know you wrote, or a step in flight you have no memory of starting. Those are the shapes a crashed session, a lost context window, or a mid-step build switch leaves behind. `/plumbbob:doctor` answers "is plumbbob installed correctly"; this answers "is this session's own state telling the truth".
17
+
18
+ ## What it does
19
+
20
+ 1. Run `plumbbob recover` via Bash. It reads the control plane (the active-build cursor, the step and spike markers, the latch's stamp, the agent handoff ledger, and any leftover spike worktrees) and prints one line per check.
21
+ 2. Report that output verbatim, `✓` and `✗` lines alike. Every problem carries a `→` line naming the fix; relay those as written rather than paraphrasing them into your own advice.
22
+ 3. **Only if the human asks for the repair**, run `plumbbob recover --fix`. It clears stale untracked control files and re-points a cursor when exactly one build survives. It never touches intent.md, the build log, the checkpoints ledger, a report, or git history, and it never lands or advances a step.
23
+
24
+ ## What it will not do for you
25
+
26
+ - **Spike leftovers are reported, never removed.** Those worktrees sit outside the repo and may hold the only copy of what a spike learned, so the verb prints the exact `git worktree remove` / `git branch -D` commands and stops. Relay them; do not run them yourself.
27
+ - **A contradictory phase is yours to settle.** A spike and a step both marked in flight, or a step number the plan no longer contains, need a decision about which one is real; `--fix` deliberately leaves them alone.
28
+ - **It is not a rewind.** Recovering reconciles bookkeeping; it never restores lost work. Discarding a half-done step is `/plumbbob:revert`, and that is a different, destructive move the human asks for by name.
@@ -1,16 +1,16 @@
1
1
  ---
2
2
  name: refine
3
- description: Keep intent.md true — attack the plan for holes (append as Open questions) and refine or repair the Frame, Decisions, Constraints, and Steps to match reality. Usable at any point; you propose, the human approves.
3
+ description: "Keep intent.md true: attack the plan for holes (append as Open questions) and refine or repair the Frame, Decisions, Constraints, and Steps to match reality. Usable at any point; you propose, the human approves."
4
4
  argument-hint: "[focus]"
5
5
  disable-model-invocation: true
6
6
  allowed-tools: Read, Edit, Bash(plumbbob status:*)
7
7
  ---
8
8
 
9
- # PlumbBob — refine the plan
9
+ # PlumbBob: refine the plan
10
10
 
11
11
  Current session state (injected when this skill runs): !`plumbbob status 2>/dev/null || echo "plumbbob CLI not on PATH in this session. Marketplace install: confirm the plugin is enabled in /plugin, then /reload-plugins. Skills-dir/global install: npm i -g plumbbob && plumbbob init."`
12
12
 
13
- `/plumbbob:refine` keeps `intent.md` honest. Use it at **any point** — right after `/plumbbob:plan`
13
+ `/plumbbob:refine` keeps `intent.md` honest. Use it at **any point**: right after `/plumbbob:plan`
14
14
  to stress-test a fresh frame, or mid-build to repair a plan that drifted from what the
15
15
  code is actually doing. It is the document-level complement to `/plumbbob:step` (which only
16
16
  sharpens the *next* step): `/plumbbob:refine` works the *whole* plan.
@@ -20,34 +20,37 @@ sharpens the *next* step): `/plumbbob:refine` works the *whole* plan.
20
20
  This skill refines an existing plan, so it needs one. Read the state injected above: if
21
21
  it is `NO ACTIVE SESSION`, **refuse** in one line and tell the human to run
22
22
  `plumbbob start "<title>"` (or `/plumbbob:plan`) first, and edit nothing. Every active state
23
- is fine — refining is always available.
23
+ is fine; refining is always available.
24
24
 
25
25
  ## Two modes
26
26
 
27
27
  - **Attack (diverge in the problem space).** Hand the **Frame**, **Decisions**, and
28
- **Architecture sketch** a cold, adversarial read and surface holes — ambiguities,
28
+ **Architecture sketch** a cold, adversarial read and surface holes: ambiguities,
29
29
  unhandled edge cases, hidden assumptions, collisions with the existing code. Append
30
- each under `## Open questions` in the expanded form the template shows — an opener
31
- line (the hole as a question, slugged at birth: `- Q2 (some-slug): …`), a `*plain:*`
32
- sub-line (what's at stake in plain words, enough to judge it cold), and a `*lean:*`
33
- sub-line (your proposed resolution — one answer to react to, not a menu). Never
34
- append a hole as a Decision: resolving it is the human's convergence, not yours —
30
+ each under `## Open questions` in the expanded form the template shows: an opener
31
+ line (the hole as a question, anchored and slugged at birth like any Decision,
32
+ `- <a id="q2"></a>**Q2 (some-slug)**: …`, so a `[Q2 (some-slug)](#q2)` reference
33
+ elsewhere in the file lands on it), a `*plain:*` sub-line (what's at stake in plain
34
+ words, enough to judge it cold), and a `*lean:*` sub-line (your proposed resolution:
35
+ one answer to react to, not a menu). Never
36
+ append a hole as a Decision: resolving it is the human's convergence, not yours;
35
37
  the lean proposes; this mode surfaces, it does not decide. (A tiny, obvious question
36
38
  may stay one bare line; the sub-lines earn their keep only when a human decision
37
39
  genuinely waits on it.)
38
40
 
39
41
  Then walk the human through it in the chat: list every hole you appended, each as
40
- its explanation first and its lean second, and invite per-question answers — the
42
+ its explanation first and its lean second, and invite per-question answers; the
41
43
  human can settle any of them right there in one message, no doc-flipping, no extra
42
44
  round-trip per hole.
43
- - **Repair (re-sync to reality).** When the plan has drifted — a Decision was overtaken
45
+ - **Repair (re-sync to reality).** When the plan has drifted (a Decision was overtaken
44
46
  by what you built, a Constraint changed, a Step no longer matches the seam, or a
45
- **step's title no longer describes what the diff actually does** — propose the edits
47
+ **step's title no longer describes what the diff actually does**), propose the edits
46
48
  that bring `intent.md` back in line with the truth. A step title *is* its checkpoint
47
- commit subject (D1), so bringing a drifted one back in line means keeping it a plain,
48
- single-line `type(scope): description` subject, with load-bearing detail (file paths,
49
- module names) in `seam` and `done-when`, **never jammed into the title** (D2) — the
50
- checkpoint body pass then reconciles and lands that subject at the verify pause (D5).
49
+ commit subject ([D68 (conventional-subjects)](https://github.com/robmclarty/plumbbob/blob/main/docs/decisions.md#d68)), so bringing a drifted one back in line
50
+ means keeping it a plain, single-line `type(scope): description` subject, with
51
+ load-bearing detail (file paths, module names) in `seam` and `done-when`,
52
+ **never jammed into the title**; the checkpoint body pass then reconciles and lands
53
+ that subject at the verify pause.
51
54
  Show the before/after for each, and **write only what the human approves**.
52
55
 
53
56
  ## The hard contracts
@@ -56,5 +59,5 @@ is fine — refining is always available.
56
59
  approves every change to `intent.md`. Never guess a hole into a Decision.
57
60
  - **Open questions for holes, edits for drift.** New uncertainty goes to
58
61
  `## Open questions`; settled drift gets repaired in place once the human OKs it.
59
- - **Refine the plan, not the code.** `/plumbbob:refine` touches `intent.md` only — turning a
62
+ - **Refine the plan, not the code.** `/plumbbob:refine` touches `intent.md` only; turning a
60
63
  decision into a diff is `/plumbbob:build` or your own hands, never this skill.
@@ -1,20 +1,20 @@
1
1
  ---
2
2
  name: revert
3
- description: Human-triggered driver for `plumbbob revert` — git reset --hard to a checkpoint SHA (discarding the half-done step) and return to the boundary.
3
+ description: "Human-triggered driver for `plumbbob revert`: git reset --hard to a checkpoint SHA (discarding the half-done step) and return to the boundary."
4
4
  argument-hint: "[--to <step>]"
5
5
  disable-model-invocation: true
6
6
  model: haiku
7
7
  allowed-tools: Bash(plumbbob status:*), Bash(plumbbob revert:*)
8
8
  ---
9
9
 
10
- # PlumbBob — revert to a checkpoint (driver)
10
+ # PlumbBob: revert to a checkpoint (driver)
11
11
 
12
12
  Current session state (injected when this skill runs): !`plumbbob status 2>/dev/null || echo "plumbbob CLI not on PATH in this session. Marketplace install: confirm the plugin is enabled in /plugin, then /reload-plugins. Skills-dir/global install: npm i -g plumbbob && plumbbob init."`
13
13
 
14
- This is a **driver skill** — a chat-side trigger for the mechanical `plumbbob revert` verb, so the whole workflow runs from the agent window instead of a terminal. It is `disable-model-invocation: true`: only the human fires it. It carries **no Edit and no Write tool** — its only action is to shell the verb and report the verb's output verbatim, including any refusal. The CLI is the source of truth: never retry a refused transition, and never edit a file to work around one.
14
+ This is a **driver skill**: a chat-side trigger for the mechanical `plumbbob revert` verb, so the whole workflow runs from the agent window instead of a terminal. It is `disable-model-invocation: true`: only the human fires it. It carries **no Edit and no Write tool**; its only action is to shell the verb and report the verb's output verbatim, including any refusal. The CLI is the source of truth: never retry a refused transition, and never edit a file to work around one.
15
15
 
16
16
  ## What it does
17
17
 
18
- 1. Read an optional target step from the way you were invoked (e.g. `/plumbbob:revert --to 2` → step `2`). With no target, revert goes to the last done-checkpoint.
19
- 2. Run `plumbbob revert` (or `plumbbob revert --to <n>`) via Bash. This is a `git reset --hard` — it discards the current in-progress step. Run it exactly as the human asked; do not add or drop the `--to` on your own.
20
- 3. Report the verb's output verbatim — which checkpoint it reset to, or any refusal.
18
+ 1. Read an optional target step from the way you were invoked (for example `/plumbbob:revert --to 2` → step `2`). With no target, revert goes to the last done-checkpoint.
19
+ 2. Run `plumbbob revert` (or `plumbbob revert --to <n>`) via Bash. This is a `git reset --hard`; it discards the current in-progress step. Run it exactly as the human asked; do not add or drop the `--to` on your own.
20
+ 3. Report the verb's output verbatim: which checkpoint it reset to, or any refusal.
@@ -1,29 +1,29 @@
1
1
  ---
2
2
  name: spike
3
- description: Human-triggered driver for `plumbbob spike` — open a throwaway worktree experiment for a genuine fork, scaffold a spike report for a spike-as-step, or tear it down with `spike done`.
3
+ description: "Human-triggered driver for `plumbbob spike`: open a throwaway worktree experiment for a genuine fork, scaffold a spike report for a spike-as-step, or tear it down with `spike done`."
4
4
  argument-hint: "<slug> | report <slug> | done"
5
5
  disable-model-invocation: true
6
6
  model: haiku
7
7
  allowed-tools: Bash(plumbbob status:*), Bash(plumbbob spike:*)
8
8
  ---
9
9
 
10
- # PlumbBob — spike an experiment (driver)
10
+ # PlumbBob: spike an experiment (driver)
11
11
 
12
12
  Current session state (injected when this skill runs): !`plumbbob status 2>/dev/null || echo "plumbbob CLI not on PATH in this session. Marketplace install: confirm the plugin is enabled in /plugin, then /reload-plugins. Skills-dir/global install: npm i -g plumbbob && plumbbob init."`
13
13
 
14
- This is a **driver skill** — a chat-side trigger for the mechanical `plumbbob spike` verb, so the whole workflow runs from the agent window instead of a terminal. It is `disable-model-invocation: true`: only the human fires it. It carries **no Edit and no Write tool** — its only action is to shell the verb and report the verb's output verbatim, including any refusal. The CLI is the source of truth: never retry a refused transition, and never edit a file to work around one.
14
+ This is a **driver skill**: a chat-side trigger for the mechanical `plumbbob spike` verb, so the whole workflow runs from the agent window instead of a terminal. It is `disable-model-invocation: true`: only the human fires it. It carries **no Edit and no Write tool**; its only action is to shell the verb and report the verb's output verbatim, including any refusal. The CLI is the source of truth: never retry a refused transition, and never edit a file to work around one.
15
15
 
16
16
  ## What it does
17
17
 
18
- 1. Read the spike target from the way you were invoked: a slug to open one (e.g. `/plumbbob:spike redis-cache`), `report <slug>` to scaffold a report without worktrees (`/plumbbob:spike report auth-store`), or the literal `done` to tear the current spike down (`/plumbbob:spike done`). If none is present, ask which and run nothing.
18
+ 1. Read the spike target from the way you were invoked: a slug to open one (for example `/plumbbob:spike redis-cache`), `report <slug>` to scaffold a report without worktrees (`/plumbbob:spike report auth-store`), or the literal `done` to tear the current spike down (`/plumbbob:spike done`). If none is present, ask which and run nothing.
19
19
  2. Run `plumbbob spike "<slug>"`, `plumbbob spike report "<slug>"`, or `plumbbob spike done` via Bash.
20
- 3. Report the verb's output verbatim — the worktree it created or removed, the spike report it scaffolded, or any refusal. When the verb names a `spike-NN-<slug>.md` report, point the human at it; when `spike done` nudges that a verdict is unrecorded, relay that nudge verbatim.
20
+ 3. Report the verb's output verbatim: the worktree it created or removed, the spike report it scaffolded, or any refusal. When the verb names a `spike-NN-<slug>.md` report, point the human at it; when `spike done` nudges that a verdict is unrecorded, relay that nudge verbatim.
21
21
 
22
- ## The spike report (D70)
22
+ ## The spike report ([D70 (spike-reports)](https://github.com/robmclarty/plumbbob/blob/main/docs/decisions.md#d70))
23
23
 
24
- Every spike leaves a durable `spike-NN-<slug>.md` in the build folder, beside `intent.md`/`report.md`, so the fork's verdict rides the branch into the PR instead of evaporating. The CLI scaffolds it from a template and numbers it — you never create or number the file:
24
+ Every spike leaves a durable `spike-NN-<slug>.md` in the build folder, beside `intent.md`/`report.md`, so the fork's verdict rides the branch into the PR instead of evaporating. The CLI scaffolds it from a template and numbers it; you never create or number the file:
25
25
 
26
26
  - **`/plumbbob:spike <slug>`** scaffolds the report *at open*, so findings accrue while the throwaway worktrees are still live. Fill its **Findings** and **Verdict** before `/plumbbob:spike done`.
27
- - **`/plumbbob:spike report <slug>`** is for a *spike-as-step* — a planned step titled `spike: …`, where the increment itself is the experiment and there are no worktrees. It stamps the report's provenance as `step <n>` when a step is in flight.
27
+ - **`/plumbbob:spike report <slug>`** is for a *spike-as-step*: a planned step titled `spike: …`, where the increment itself is the experiment and there are no worktrees. It stamps the report's provenance as `step <n>` when a step is in flight.
28
28
 
29
- This skill stays Write-less: the CLI owns the file. Your job is to run the verb and, between runs, help the human fill the report's prose — but the edits land through the normal build flow, not this driver.
29
+ This skill stays Write-less: the CLI owns the file. Your job is to run the verb and, between runs, help the human fill the report's prose, but the edits land through the normal build flow, not this driver.
@@ -1,26 +1,26 @@
1
1
  ---
2
2
  name: status
3
- description: Show the orientation dashboard — where you are, what's done, what's parked, and the next move. A thin trigger for `plumbbob status`.
3
+ description: "Show the orientation dashboard: where you are, what's done, what's parked, and the next move. A thin trigger for `plumbbob status`."
4
4
  disable-model-invocation: true
5
5
  model: haiku
6
6
  allowed-tools: Bash(plumbbob status:*)
7
7
  ---
8
8
 
9
- # PlumbBob — orient (the where-am-I move)
9
+ # PlumbBob: orient (the where-am-I move)
10
10
 
11
11
  Current session state (injected when this skill runs): !`plumbbob status 2>/dev/null || echo "plumbbob CLI not on PATH in this session. Marketplace install: confirm the plugin is enabled in /plugin, then /reload-plugins. Skills-dir/global install: npm i -g plumbbob && plumbbob init."`
12
12
 
13
13
  This is a **thin driver** for `plumbbob status`. The dashboard above is your
14
- orientation — the intent, the step list, the parked/open-question counts, and the
14
+ orientation: the intent, the step list, the parked/open-question counts, and the
15
15
  inferred next move. Report it verbatim and point the human at that next move. This
16
16
  skill carries **no Edit and no Write tool**: the CLI is the source of truth, so
17
17
  **never retry**, and never edit a file to change what the orientation says.
18
18
 
19
19
  ## What it does
20
20
 
21
- 1. Surface the injected `status` output — the dashboard and its suggested next move.
21
+ 1. Surface the injected `status` output: the dashboard and its suggested next move.
22
22
  2. If the next step's detail carries a `model:` line, point it out: it is the
23
23
  plan's recommendation of the smallest model that can carry that step, so the human
24
- can switch (e.g. `/model sonnet`) before firing `/plumbbob:build` — or ignore it. Guidance,
24
+ can switch (for example `/model sonnet`) before firing `/plumbbob:build`, or ignore it. Guidance,
25
25
  never a gate.
26
26
  3. If it reads `NO ACTIVE SESSION`, tell the human to `/plumbbob:plan` to frame a goal.
@@ -1,12 +1,12 @@
1
1
  ---
2
2
  name: step
3
- description: Revise the next increment just-in-time — sharpen the next undone step against what's now true, or (with input) re-cut, split, or add a step. Empty input runs an automatic sharpen. One at a time; the human approves.
3
+ description: "Revise the next increment just-in-time: sharpen the next undone step against what's now true, or (with input) re-cut, split, or add a step. Empty input runs an automatic sharpen. One at a time; the human approves."
4
4
  argument-hint: "[what-changed]"
5
5
  disable-model-invocation: true
6
6
  allowed-tools: Read, Edit, Write, Bash(plumbbob status:*), Bash(plumbbob agent list:*)
7
7
  ---
8
8
 
9
- # PlumbBob — revise the next step (the single-increment move)
9
+ # PlumbBob: revise the next step (the single-increment move)
10
10
 
11
11
  Current session state (injected when this skill runs): !`plumbbob status 2>/dev/null || echo "plumbbob CLI not on PATH in this session. Marketplace install: confirm the plugin is enabled in /plugin, then /reload-plugins. Skills-dir/global install: npm i -g plumbbob && plumbbob init."`
12
12
 
@@ -14,14 +14,14 @@ Current session state (injected when this skill runs): !`plumbbob status 2>/dev/
14
14
  **just-in-time revision** move: it keeps the *next* undone step honest against what the
15
15
  build has actually taught you, right before you `/plumbbob:build` it. (Framing the whole goal
16
16
  is the separate `/plumbbob:plan` move.) It can also add or re-cut a step when scope genuinely
17
- grew — but its everyday job is to sharpen, not to invent.
17
+ grew, but its everyday job is to sharpen, not to invent.
18
18
 
19
- ## Two ways to fire it
19
+ ## Two ways to run it
20
20
 
21
21
  - **`/plumbbob:step` (no input) → automatic sharpen.** Re-examine the next undone step
22
22
  against the completed code, the Decisions, the Constraints, and the build-log, then
23
- make the obvious revisions to its **done-when** and **seam** so it matches reality —
24
- e.g. a file moved, a decision narrowed the scope, an earlier step already did part of
23
+ make the obvious revisions to its **done-when** and **seam** so it matches reality:
24
+ for example a file moved, a decision narrowed the scope, an earlier step already did part of
25
25
  it. This is the zero-effort "keep my next step in sync" move: if the human does
26
26
  nothing else, the next step stays current.
27
27
  - **`/plumbbob:step <what changed>` → directed revision.** Take the human's input and propose
@@ -38,21 +38,21 @@ grew — but its everyday job is to sharpen, not to invent.
38
38
  what you changed and why. Re-check the optional `- model:` recommendation too:
39
39
  a step that sharpened into rote work can drop to a smaller model; one that grew subtle
40
40
  earns a frontier one. Advisory, plain text (no backticks), never a gate.
41
- 3. **Get the human's OK**, then write it into `## Steps` in the standard format —
42
- `N. [ ] <title> — **done when:** <criterion>` with a `- seam:` sub-line. Keep the
41
+ 3. **Get the human's OK**, then write it into `## Steps` in the standard format:
42
+ `N. [ ] <title>, **done when:** <criterion>` with a `- seam:` sub-line. Keep the
43
43
  sharpened `<title>` a plain, single-line Conventional-Commit subject,
44
- `type(scope): description` — it lands in `git log` verbatim, so as the step tightens
44
+ `type(scope): description`; it lands in `git log` verbatim, so as the step tightens
45
45
  keep load-bearing detail (file paths, module names) in `seam` and `done-when`,
46
- **never jammed into the title** (D1/D2). A sharpened step carries its own `(scope)`
47
- when it touches a distinct code area — one that **overrides the build-default**
46
+ **never jammed into the title**. A sharpened step carries its own `(scope)`
47
+ when it touches a distinct code area, one that **overrides the build-default**
48
48
  `**Scope:**` header; drop the scope and it falls back to that default → build slug →
49
- bare, and the type to `feat` ([D68](../../docs/decisions.md#d68), D8). Aim for a soft
50
- ≤72 chars, no gate (D9). Revise the existing step in place; only append when you are
49
+ bare, and the type to `feat` ([D68 (conventional-subjects)](https://github.com/robmclarty/plumbbob/blob/main/docs/decisions.md#d68)). Aim for a soft
50
+ ≤72 chars, no gate. Revise the existing step in place; only append when you are
51
51
  genuinely adding an increment.
52
52
  4. **Revise the step's harness bindings if they drifted too** *(optional)*. If the
53
53
  build carries a `harness.json` (beside `intent.md`) and the reality that moved the
54
54
  step also changed which agents it wants, sharpen that step's slot bindings
55
- (`before`/`build`/`after`) and `note` at the same time — this is the just-in-time
55
+ (`before`/`build`/`after`) and `note` at the same time; this is the just-in-time
56
56
  counterpart to `/plumbbob:plan`'s plan-time binding. `plumbbob agent list` shows what's
57
57
  resolvable. Same rule as the plan move: bindings + prose only, never a conditional
58
58
  . Leave it untouched when the step's agents are still right, or when the build
@@ -62,6 +62,11 @@ grew — but its everyday job is to sharpen, not to invent.
62
62
 
63
63
  - **One verifiable increment.** Each step carries a done-when `/plumbbob:verify` can check
64
64
  and a seam small enough to review in one pass.
65
- - **Edit `## Steps` only**, in the standard format `status` and `build` parse — never
65
+ - **Edit `## Steps` only**, in the standard format `status` and `build` parse: never
66
66
  the Roadmap, never loose prose. A done step (`[x]`) is history; do not rewrite it.
67
+ - **Cite the plan's own numbers in the linked form.** A `D`/`C`/`Q` you write into a
68
+ step's done-when, seam, or notes reads `[D4 (default-waves)](#d4)`; the slug travels
69
+ with the number, and the link lands on the `<a id="d4">` anchor minted where the item
70
+ was born. Never a bare `D4`; if the item you want to cite has no anchor yet, that is a
71
+ `/plumbbob:refine` repair, not something to invent here.
67
72
  - **The human approves the revision** before it lands. You propose; they decide.