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,116 +1,124 @@
1
1
  ---
2
2
  name: build
3
- description: The default engine — read the next planned step from intent, implement it (its done-when, seam, Decisions, Constraints), then verify it through to the approval pause. Swappable — build by hand/vibed/another harness and run /plumbbob:verify instead. `--auto` self-approves and chains to done; a step range like `1-3` self-approves through step 3, then pauses.
3
+ description: "The default engine: read the next planned step from intent, implement it (its done-when, seam, Decisions, Constraints), then verify it through to the approval pause. Swappable: build by hand/vibed/another harness and run /plumbbob:verify instead. `--auto` self-approves and chains to done; a step range like `1-3` self-approves through step 3, then pauses."
4
4
  argument-hint: "[step-number | step-range] [--auto]"
5
5
  disable-model-invocation: true
6
6
  allowed-tools: Read, Edit, Write, Bash(plumbbob status:*), Bash(plumbbob build:*), Bash(plumbbob handoff:*), Bash(plumbbob check:*), Bash(plumbbob checkpoint:*), Bash(plumbbob park:*), Bash(plumbbob agent:*), Bash(plumbbob spike:*), Bash(git diff:*)
7
7
  ---
8
8
 
9
- # PlumbBob — build a step (the default engine)
9
+ # PlumbBob: build a step (the default engine)
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
- This is the **bundled executor** — the default engine, not the only one. It is
13
+ This is the **bundled executor**: the default engine, not the only one. It is
14
14
  **swappable**: you can implement any step by hand, in a vibe session, or with
15
- another harness and go straight to `/plumbbob:verify` instead — plumbbob does not care how
15
+ another harness and go straight to `/plumbbob:verify` instead; plumbbob does not care how
16
16
  the diff appeared. When you do run it, it reads the plan, writes the step, and
17
17
  carries straight through to the verify pause.
18
18
 
19
- Since `/plumbbob:plan` lays down the whole step list up front, the happy path is to fire
20
- `/plumbbob:build` once per step until done — each run builds the next undone step and stops
21
- at the pause for your approval. **Re-firing `/plumbbob:build` is itself the clock tick.**
19
+ Since `/plumbbob:plan` lays down the whole step list up front, the happy path is to run
20
+ `/plumbbob:build` once per step until done: each run builds the next undone step and stops
21
+ at the pause for your approval. **Running `/plumbbob:build` again is itself the clock tick.**
22
22
 
23
- A model note: this skill **inherits the session model** — nothing pins or switches
23
+ A model note: this skill **inherits the session model**; nothing pins or switches
24
24
  it. If the step you're about to build carries a `- model:` recommendation that
25
- differs from the model you're running as, say so before implementing — the human can
26
- `/model` and re-fire to honor it, or wave you on. Advisory, never a gate.
25
+ differs from the model you're running as, say so before implementing; the human can
26
+ switch with `/model` and rerun to honor it, or wave you on. Advisory, never a gate.
27
27
 
28
28
  ## What this skill does, in order
29
29
 
30
- 1. **Pick the step.** Use the number you were invoked with (e.g. `/plumbbob:build 4`) — or,
30
+ 1. **Pick the step.** Use the number you were invoked with (for example `/plumbbob:build 4`), or,
31
31
  if you were given a range like `/plumbbob:build 1-3`, start at the first number and treat
32
32
  the second as the auto-approve ceiling (see the range note under `--auto`). With no
33
- argument, don't resolve the next step yourself — the CLI does: bare `plumbbob build`
33
+ argument, don't resolve the next step yourself; the CLI does: bare `plumbbob build`
34
34
  (step 2) enters the next undone step and refuses with a `/plumbbob:step` nudge when every
35
35
  step is checkpointed.
36
- 2. **Enter the step.** Run `plumbbob build <n>` — or bare `plumbbob build` to enter the
36
+ 2. **Enter the step.** Run `plumbbob build <n>`, or bare `plumbbob build` to enter the
37
37
  next undone step (records the in-flight STEP + SEAM so `/plumbbob:status` shows the step in
38
38
  flight; the seam is awareness, not a lock).
39
39
  - **Spike-as-step.** If the step's title opens with `spike:` / `Spike:`, the increment
40
- *is* the experiment — resolving a fork the plan couldn't settle on paper. After
40
+ *is* the experiment: resolving a fork the plan couldn't settle on paper. After
41
41
  entering it, run `plumbbob spike report "<slug>"` (the CLI scaffolds a
42
42
  `spike-NN-<slug>.md` in the build folder, stamped `via: step <n>`), then work the
43
43
  experiment and record your **Findings** and **Verdict** there. A recorded verdict is
44
- what the step's done-when should check — the report, not just the code, is the
45
- deliverable. This is the same artifact `/plumbbob:spike` produces for a mid-build fork (D70).
44
+ what the step's done-when should check; the report, not just the code, is the
45
+ deliverable. This is the same artifact `/plumbbob:spike` produces for a mid-build fork
46
+ ([D70 (spike-reports)](https://github.com/robmclarty/plumbbob/blob/main/docs/decisions.md#d70)).
46
47
  3. **Read the plan.** Read the step's **done-when**, its **seam**, and the
47
- **Decisions** and **Constraints** in `intent.md`. Build to *that* — the deciding
48
+ **Decisions** and **Constraints** in `intent.md`. Build to *that*; the deciding
48
49
  already happened, off the chat.
49
50
  - **Bound `before`-agents load context first.** If `plumbbob status` shows a
50
- `harness bindings:` block, this build binds agents — see **§ Running bound agents**
51
+ `harness bindings:` block, this build binds agents; see **§ Running bound agents**
51
52
  and load their context in before you write. No bindings, no harness: just build.
52
53
  4. **Implement** the step, and only that step, staying within the declared seam. A
53
54
  new problem or "ooh what if" that surfaces mid-build is a park, **not** an edit:
54
- capture it by running `plumbbob park "<one tidy line>"` — **saying "let's defer
55
+ capture it by running `plumbbob park "<one tidy line>"`: **saying "let's defer
55
56
  that" writes nothing; only the park line in the build log is a capture.** When the
56
57
  *human* hands you the tangent mid-build, their message **is** the approval to park
57
- it — capture it right away, say what you parked, and stay on the step. If you
58
+ it; capture it right away, say what you parked, and stay on the step. If you
58
59
  genuinely cannot finish without touching more than the seam, that is scope drift:
59
60
  surface it to the human rather than sprawling.
60
61
  - **Bound agents can shape the build.** If `plumbbob status` shows a
61
62
  `harness bindings:` block, a `build`-slot agent may author the diff, a `when`-cue may
62
- fire an agent mid-build, and a non-`done` envelope routes by its status — see
63
+ fire an agent mid-build, and a non-`done` envelope routes by its status; see
63
64
  **§ Running bound agents**.
64
65
  5. **Verify, through to the pause.** Run the verify tick exactly as `/plumbbob:verify`
65
66
  does: `plumbbob check` (on red, read `.check/summary.json` and the failing slot's
66
67
  raw output under `.check/` for the actual diagnostics; while iterating on a fix,
67
- narrow the loop with `plumbbob check --bail --only <slots>` — the checkpoint gate
68
+ narrow the loop with `plumbbob check --bail --only <slots>`; the checkpoint gate
68
69
  still runs everything) → self-review the diff against the done-when, the Decisions,
69
- and the Constraints (a single structured read) → validate → **PAUSE
70
+ and the Constraints (a single structured read; cite each with its slug from
71
+ `intent.md`: `C1 (no-new-deps)`, never a bare `C1`) → validate → **PAUSE
70
72
  for the human's approval** → only on approval, checkpoint with
71
- `plumbbob checkpoint <n> --body <<'BODY' … BODY` — a commit body **proportional to the
73
+ `plumbbob checkpoint <n> --body <<'BODY' … BODY`: a commit body **proportional to the
72
74
  step** (a line for a trivial change, a short paragraph for a meatier one; no TIL scan,
73
75
  no separate commit skill). The CLI owns the subject and appends this step to the
74
- build-log's `## Log`, so the history writes itself — you only supply the body (or omit
76
+ build-log's `## Log`, so the history writes itself; you only supply the body (or omit
75
77
  `--body` for the deterministic done-when + seam + diffstat fallback). Do **not** bump
76
- the version or changelog — that is the human's `/version` call.
77
- - **A drifted subject is reconciled at the pause, never silently (D5/D6).** The planned
78
- title *is* the checkpoint subject (D1). If the diff drifted from it, **present** a
79
- corrected subject at the pause — `planned title → proposed subject`, one line — for
80
- explicit approval, and only on approval land it by adding `-m "<subject>"` to the
81
- checkpoint. Present nothing and the deterministic title-derived subject lands
82
- untouched: the reconcile is the human-approved exception, not a quiet `-m` swap (which
83
- is the agent-authored subject D68 refuses).
78
+ the version or changelog; that is the human's `/version` call.
79
+ - **`--body` reads stdin only.** Redirect the heredoc *into* the command (`--body
80
+ <<'BODY'`). Do **not** pass it as an argument value (`--body "$(cat <<'BODY'…)"`):
81
+ `--body` ignores an argument and always reads stdin. Under an agent harness that
82
+ stdin is a socket, and `--body` now refuses rather than blocking on one; the
83
+ refusal names this exact heredoc form.
84
+ - **A drifted subject is reconciled at the pause, never silently.** The planned
85
+ title *is* the checkpoint subject ([D68 (conventional-subjects)](https://github.com/robmclarty/plumbbob/blob/main/docs/decisions.md#d68)). If the diff drifted
86
+ from it, **present** a corrected subject at the pause (`planned title → proposed
87
+ subject`, one line) for explicit approval, and only on approval land it by adding
88
+ `-m "<subject>"` to the checkpoint. Present nothing and the deterministic
89
+ title-derived subject lands untouched: the reconcile is the human-approved exception,
90
+ not a quiet `-m` swap (which is the agent-authored subject [D68 (conventional-subjects)](https://github.com/robmclarty/plumbbob/blob/main/docs/decisions.md#d68)
91
+ refuses).
84
92
  - **If `plumbbob status` shows a `harness bindings:` block**, fold any bound
85
- `after`-agents into that self-review as advisory input — see **§ Running bound
93
+ `after`-agents into that self-review as advisory input; see **§ Running bound
86
94
  agents**.
87
95
 
88
96
  **The latch makes this pause real.** On the default (non-`--auto`) path you
89
- build the step and reach the pause *in one turn* — so under plumbbob's turn hook the
97
+ build the step and reach the pause *in one turn*, so under plumbbob's turn hook the
90
98
  checkpoint at the end of that turn is **refused** ("no human turn since this step
91
99
  began"), and that refusal **is** the pause working as designed. Do exactly what the
92
100
  pause asks: present the diff and the self-review, emit the closing block below, and
93
- **end the turn**. The human's next message — their approval — is the human turn that
101
+ **end the turn**. The human's next message (their approval) is the human turn that
94
102
  lets the checkpoint land: on that turn you run `plumbbob checkpoint <n>` (now allowed)
95
- and **stop at the boundary**. Landing the checkpoint is its own deliberate beat — the
96
- thing approval triggers — never a side effect of starting the next step, and
103
+ and **stop at the boundary**. Landing the checkpoint is its own deliberate beat (the
104
+ thing approval triggers), never a side effect of starting the next step, and
97
105
  `/plumbbob:build` only ever starts the *next* step. **Never route around a refusal with a
98
- raw `git commit`** — the work plane stays free, but the *record* is latched on purpose.
106
+ raw `git commit`**; the work plane stays free, but the *record* is latched on purpose.
99
107
 
100
108
  **End every default build turn with the standardized hand-off block.** Run `plumbbob
101
- handoff` and present its output — it renders the same three-part shape (the state, the
109
+ handoff` and present its output; it renders the same three-part shape (the state, the
102
110
  choice, what's next) straight from the session: step N built, the looks-good /
103
111
  needs-work choice, and the next undone step with its `- model:` recommendation. Show
104
112
  your diff and self-review above it. The CLI owns the block so it can't drift from what
105
113
  `/plumbbob:status` reports; you supply only the judgment above it. It already drops the model
106
- clause when the next step has none, and says so when no planned step remains — you
114
+ clause when the next step has none, and says so when no planned step remains; you
107
115
  don't reproduce the template by hand.
108
116
 
109
117
  **Then hand off with the next model.** Once the checkpoint lands in the approval turn,
110
- run `plumbbob handoff` again and relay its boundary block — with the step gone from
118
+ run `plumbbob handoff` again and relay its boundary block; with the step gone from
111
119
  in-flight it renders "step N checkpointed" and points at the next undone step, carrying
112
120
  that step's `- model:` recommendation (the plan's smallest-model-that-fits call) so the
113
- human knows which `/model` to select before firing `/plumbbob:build` again. It is what
121
+ human knows which `/model` to select before running `/plumbbob:build` again. It is what
114
122
  carries the plan's suggestion across a fresh context window, which inherits the session
115
123
  model, not the plan's. No `- model:` line means any model will do. Guidance, never a
116
124
  gate.
@@ -118,38 +126,38 @@ differs from the model you're running as, say so before implementing — the hum
118
126
  ## Running bound agents
119
127
 
120
128
  Skip this section unless `plumbbob status` shows a `harness bindings:` block. Nearly every
121
- build binds **no** agents — for them the default path above is the whole story. When a
129
+ build binds **no** agents; for them the default path above is the whole story. When a
122
130
  harness *is* bound, this is what each affected step gains, in lifecycle order.
123
131
 
124
- - **`before` — load context in (step 3).** If the build's `harness.json` binds agents to
132
+ - **`before`: load context in (step 3).** If the build's `harness.json` binds agents to
125
133
  this step's `before` slot, run `plumbbob agent run --step <n> --mode before` first: each
126
134
  returns a validated envelope on stdout that plumbbob also appends to the step's
127
135
  `handoff.json`, and its `summary`/`body` become **context you read into the build** (that
128
- is the whole point of the slot — load the context in before you write). No binding, or no
129
- harness, is a clean no-op — just build.
130
- - **`build` — delegate the diff (step 4).** If a `build`-slot agent is bound, run
136
+ is the whole point of the slot: load the context in before you write). No binding, or no
137
+ harness, is a clean no-op: just build.
138
+ - **`build`: delegate the diff (step 4).** If a `build`-slot agent is bound, run
131
139
  `plumbbob agent run --step <n> --mode build` and let that agent author the step's code
132
140
  instead of writing it yourself; its envelope reports what it did. You still own the verify
133
- tick — the diff is reviewed the same way whoever wrote it.
134
- - **A manifest's `when` prose is your cue to fire an agent mid-build (step 4).** The three
141
+ tick; the diff is reviewed the same way whoever wrote it.
142
+ - **A manifest's `when` prose is your cue to run an agent mid-build (step 4).** The three
135
143
  slots are the only *declarative* lifecycle points; there is no config for "a salient
136
144
  moment in the middle." That is judgment, and you are the frontier model in the room: when
137
- the work reaches the situation a bound agent's `when` (or a step `note`) describes, fire
145
+ the work reaches the situation a bound agent's `when` (or a step `note`) describes, run
138
146
  `plumbbob agent run <name> --step <n>` yourself. Prose is the orchestration language; you
139
147
  are the workflow engine.
140
148
  - **Route a non-`done` envelope by its status (step 4).** An agent that returns `blocked`
141
149
  couldn't finish (missing input, failed precondition): surface its `notes`, let the human
142
- unblock, and re-run it — don't work around it. One that returns `drift` finished but found
150
+ unblock, and re-run it; don't work around it. One that returns `drift` finished but found
143
151
  the plan no longer matches reality: **stop and send the human to `/plumbbob:refine`** to repair
144
152
  the plan before continuing, rather than building on a plan that's now wrong. A non-zero
145
153
  exit is a failed run: report it and stop.
146
- - **`after` — advisory input to the verify tick (step 5).** After `plumbbob check`, run any
154
+ - **`after`: advisory input to the verify tick (step 5).** After `plumbbob check`, run any
147
155
  bound `after`-agents (`plumbbob agent run --step <n> --mode after`) and fold their
148
- envelopes into the self-review as **advisory input** — they inform, they never gate
149
- (checkride gates, the human is the clock; an `after`-agent that could fail a step is the
150
- lock in autonomy's costume).
156
+ envelopes into the self-review as **advisory input**; they inform, they never gate
157
+ (checkride gates, the human is the clock; an `after`-agent that could fail a step would
158
+ be the old lock back in another form).
151
159
 
152
- ## `--auto` — let the agent be the clock (opt-in)
160
+ ## `--auto`: let the agent be the clock (opt-in)
153
161
 
154
162
  `/plumbbob:build --auto` is the explicit escape hatch when the human wants unattended
155
163
  progress instead of approving each step. It does the same work, but **the agent reviews
@@ -159,41 +167,41 @@ and approves in the human's place**, and it **chains**:
159
167
  order as the default path: bound `before`-agents → implement (or the bound `build`-agent) → bound
160
168
  `after`-agents → `check` → self-review → **if the check is green AND the
161
169
  self-review finds no done-when / Decision / Constraint mismatch, checkpoint** and move
162
- straight on to the next planned step. Repeat. `--auto` adds no new machinery — the
170
+ straight on to the next planned step. Repeat. `--auto` adds no new machinery; the
163
171
  `after`-agent output simply feeds the *existing* self-review halt condition.
164
172
  - **Stop and hand back to the human** the moment any of these is true: the check is red,
165
173
  the self-review finds a mismatch (surface exactly what, and do not checkpoint it), a
166
- bound agent returns `blocked` or `drift` (unblock-and-re-run, or `/plumbbob:refine` — an
174
+ bound agent returns `blocked` or `drift` (unblock-and-re-run, or `/plumbbob:refine`; an
167
175
  agent cannot advance the loop), a new decision is needed, no planned steps
168
176
  remain, or the top of a requested range is reached. **When `--auto` halts back to the
169
- human, give the same hand-off the default pause does** — run `plumbbob handoff` and
177
+ human, give the same hand-off the default pause does**; run `plumbbob handoff` and
170
178
  relay its block: the step just completed, the next undone step, and that next step's
171
179
  `- model:` recommendation if it has one, so a fresh context window knows which `/model`
172
180
  to select.
173
181
 
174
182
  `--auto` and a step range are the only paths that checkpoint without a human pause, and
175
183
  only because the human asked for it by name; a range re-imposes the pause at its top.
176
- The default — no flag, no range — always ends at the pause.
184
+ The default (no flag, no range) always ends at the pause.
177
185
 
178
186
  ### A step range (`N-M`) is a bounded `--auto`
179
187
 
180
188
  `/plumbbob:build 1-3` self-approves steps 1 through 3 exactly as `--auto` does, then **pauses
181
- after step 3** instead of chaining to done. The range *is* the opt-in — you do not also
189
+ after step 3** instead of chaining to done. The range *is* the opt-in; you do not also
182
190
  pass `--auto`. Run it as the `--auto` loop with one extra halt: **stop before building
183
- any next step whose plan number is past the top of the range.** It adds no machinery —
191
+ any next step whose plan number is past the top of the range.** It adds no machinery:
184
192
  just the one more entry already in the halt list above.
185
193
 
186
- - **`N-M` with N ≤ M** — build N…M, self-approving and checkpointing each, then pause at
194
+ - **`N-M` with N ≤ M**: build N…M, self-approving and checkpointing each, then pause at
187
195
  M. `N-N` is just the single step `N` (which already ends at the pause).
188
- - **N > M** (e.g. `3-1`) — that is not a range you can walk; report it and stop rather
196
+ - **N > M** (for example `3-1`): that is not a range you can walk; report it and stop rather
189
197
  than guess the intent.
190
- - **M past the last planned step** (e.g. `1-9` with three steps) — build through the
198
+ - **M past the last planned step** (for example `1-9` with three steps): build through the
191
199
  last planned step and stop; that is the existing "no planned steps remain" halt, not
192
200
  an error.
193
- - **A step inside the range won't build** (missing, or its seam won't parse) — `plumbbob
201
+ - **A step inside the range won't build** (missing, or its seam won't parse): `plumbbob
194
202
  build <n>` fails exactly as it always does; surface it and stop, the same as a red
195
203
  check. Do not skip past the gap.
196
- - **N is above the next undone step** — you are jumping over earlier planned work; note
204
+ - **N is above the next undone step**: you are jumping over earlier planned work; note
197
205
  that you are skipping the steps before N, then proceed (the same latitude as a
198
206
  single-number jump like `/plumbbob:build 4`).
199
207
 
@@ -202,26 +210,27 @@ just the one more entry already in the halt list above.
202
210
  - **Swappable, never required.** The loop works without this skill; `/plumbbob:verify`
203
211
  checkpoints a hand-built or vibed diff just the same.
204
212
  - **Build the decided step, not a new one.** Implement what `intent.md` settled. A
205
- new idea mid-build is captured with `plumbbob park`, not an edit — a promise to
213
+ new idea mid-build is captured with `plumbbob park`, not an edit: a promise to
206
214
  defer writes nothing; the park line does.
207
215
  - **Default ends at the pause.** Implement → verify → wait for approval; never
208
216
  checkpoint without it. Only an explicit `--auto` or a step range lets the agent approve
209
- in your place, and it still halts on a red check or any mismatch — a range also stops
217
+ in your place, and it still halts on a red check or any mismatch; a range also stops
210
218
  at its top.
211
219
  - **Agents feed the beat; they never advance it**. `before` loads context,
212
- `build` writes the diff, `after` is advisory — none can checkpoint, flip a step, or
220
+ `build` writes the diff, `after` is advisory; none can checkpoint, flip a step, or
213
221
  chain. `blocked` → unblock and re-run; `drift` → `/plumbbob:refine`. You are still the one
214
222
  who verifies and (bar `--auto`) the human is still the clock. See **§ Running bound
215
223
  agents** for the mechanics.
216
224
  - **A refused checkpoint is the pause, not an error.** Under plumbbob's turn
217
- hook a same-turn `checkpoint` is refused by design — present the diff and the closing
225
+ hook a same-turn `checkpoint` is refused by design: present the diff and the closing
218
226
  block, **end the turn**; the human's approval on their next turn is what lets you land
219
227
  it, and landing it is a deliberate beat, not a side effect of the next `/plumbbob:build`.
220
228
  Never route around it with a raw `git commit`. An explicit `/plumbbob:build --auto` or a typed
221
- step range in the human's own prompt are the only self-approvals — **never write `auto`
229
+ step range in the human's own prompt are the only self-approvals; **never write `auto`
222
230
  into a settings file yourself to unlock a checkpoint. A grant you mint is no grant (the
223
- latch ignores it since D67); ask the human to re-fire `/plumbbob:build --auto` instead.**
231
+ latch ignores it; [D67 (auto-not-a-grant)](https://github.com/robmclarty/plumbbob/blob/main/docs/decisions.md#d67)); ask the human to type
232
+ `/plumbbob:build --auto` again instead.**
224
233
  - **Close with the next model.** When a step lands, run `plumbbob handoff` and relay its
225
- block — it cites the completed step and the next undone step, and names that next step's
234
+ block; it cites the completed step and the next undone step, and names that next step's
226
235
  `- model:` recommendation if it has one, which is what a fresh context window needs to
227
- pick the right `/model` before re-firing. Guidance, never a gate.
236
+ pick the right `/model` before the next run. Guidance, never a gate.
@@ -1,16 +1,16 @@
1
1
  ---
2
2
  name: doctor
3
- description: Diagnose the plugin install from inside a session — is plumbbob linked, are the skills and hook present, is there a collision. A thin trigger for `plumbbob doctor`. Matters most for a marketplace install, where the CLI is on PATH only inside Claude Code.
3
+ description: "Diagnose the plugin install from inside a session: is plumbbob linked, are the skills and hook present, is there a collision. A thin trigger for `plumbbob doctor`. Matters most for a marketplace install, where the CLI is on PATH only inside Claude Code."
4
4
  disable-model-invocation: true
5
5
  model: haiku
6
6
  allowed-tools: Bash(plumbbob doctor:*)
7
7
  ---
8
8
 
9
- # PlumbBob — doctor (the is-it-installed-right move)
9
+ # PlumbBob: doctor (the is-it-installed-right move)
10
10
 
11
11
  Install diagnostic (injected when this skill runs): !`plumbbob doctor 2>&1 || true`
12
12
 
13
- This is a **thin driver** for `plumbbob doctor`. The report above is read-only — `doctor`
13
+ This is a **thin driver** for `plumbbob doctor`. The report above is read-only: `doctor`
14
14
  inspects, it never writes. This skill carries **no Edit and no Write tool**: never edit a file
15
15
  to change what the report says. If a check failed, surface its `→ fix` verbatim and apply
16
16
  *that* fix, then have the human **restart Claude Code (or `/reload-plugins`)**. **Never retry.**
@@ -19,23 +19,23 @@ to change what the report says. If a check failed, surface its `→ fix` verbati
19
19
 
20
20
  The CLI's reach differs by install path, and that is the whole point of running `doctor` here:
21
21
 
22
- - **Marketplace plugin** — `plumbbob` is on PATH **only inside a Claude Code session** (its
23
- `bin/` shims are injected into the Bash tool while the plugin is enabled). There is **no
24
- terminal `plumbbob`** to run. So this skill — or letting me run `plumbbob doctor` in-session
25
- — is the *only* way to reach `doctor`. The fact that this skill loaded at all already proves
22
+ - **Marketplace plugin**: `plumbbob` is on PATH **only inside a Claude Code session** (its
23
+ `bin/` shims are injected into the Bash tool while the plugin is enabled). **No
24
+ terminal `plumbbob`** exists. So this skill (or letting me run `plumbbob doctor` in-session)
25
+ is the *only* way to reach `doctor`. The fact that this skill loaded at all already proves
26
26
  the plugin is enabled and the shim is on PATH.
27
- - **Skills-dir / global install** (`npm i -g plumbbob` + `plumbbob init`) — `plumbbob` is on
27
+ - **Skills-dir / global install** (`npm i -g plumbbob` + `plumbbob init`): `plumbbob` is on
28
28
  PATH everywhere, so terminal `plumbbob doctor` works too; this skill is just convenience.
29
29
 
30
30
  The one failure `doctor` **cannot** diagnose: a plugin that never loaded at all (no
31
- `/plumbbob:*` skill appears). That is a `/plugin` / `/reload-plugins` problem, not doctor's —
31
+ `/plumbbob:*` skill appears). That is a `/plugin` / `/reload-plugins` problem, not doctor's,
32
32
  and if you are reading this, that is not your situation.
33
33
 
34
34
  ## What it does
35
35
 
36
- 1. Surface the injected `doctor` report verbatim — every `✓` and any `✗` with its `→ fix`.
36
+ 1. Surface the injected `doctor` report verbatim: every `✓` and any `✗` with its `→ fix`.
37
37
  If nothing rendered above (a few headless `-p` sessions skip the injection), just run
38
- `plumbbob doctor` yourself — it is in your tools — and surface that.
38
+ `plumbbob doctor` yourself (it is in your tools) and surface that.
39
39
  2. If all checks passed, say so; if a skill still misbehaves, the fix is a restart, not a re-run.
40
40
  3. If a check failed, apply its named `→ fix`, then restart Claude Code (or `/reload-plugins`).
41
41
  4. If the report is empty or shows `command not found`, the CLI is not on PATH: for a
@@ -1,42 +1,44 @@
1
1
  ---
2
2
  name: finish
3
- description: Finish the build — write the report (what shipped, decisions, parked/harvested items, deferred tangents), then make the final commit that closes the session. The build folder rides the branch into the PR — no separate archive. Report by default, no gate.
3
+ description: "Finish the build: write the report (what shipped, decisions, parked/harvested items, deferred tangents), then make the final commit that closes the session. The build folder rides the branch into the PR: no separate archive. Report by default, no gate."
4
4
  disable-model-invocation: true
5
5
  allowed-tools: Read, Write, Bash(plumbbob status:*), Bash(plumbbob finish:*)
6
6
  ---
7
7
 
8
- # PlumbBob — finish the build (the close-out)
8
+ # PlumbBob: finish the build (the close-out)
9
9
 
10
10
  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."`
11
11
 
12
12
  `/plumbbob:finish` ends the build: it captures what happened, then makes the final commit
13
- that closes the session. **Report by default** — no refuse-without-report gate,
13
+ that closes the session. **Report by default**: no refuse-without-report gate,
14
14
  and no separate docs phase. The build folder is tracked: it merges with the
15
- branch and shows up in the PR, so there is nothing to archive — the folder *is* the
15
+ branch and shows up in the PR, so there is nothing to archive; the folder *is* the
16
16
  record.
17
17
 
18
18
  ## What this skill does, in order
19
19
 
20
20
  1. **Write the report** to the active build's `report.md`
21
21
  (`.plumbbob/builds/<slug>/report.md`), from `intent.md` + `build-log.md`.
22
- The build-log's `## Log` is already the chronological history — `plumbbob checkpoint`
22
+ The build-log's `## Log` is already the chronological history; `plumbbob checkpoint`
23
23
  wrote a dated line for every step as it landed. **Read it as the spine; do not
24
24
  re-narrate it.** The report adds only what the log does not already carry:
25
- - **What shipped** — summarize from the `## Log` timeline; don't rebuild it step by step.
26
- - **Decisions and why** — the settled calls that shaped the build (the *why* behind the log).
27
- - **Parked & harvested** — what was captured and how each was classified.
28
- - **Final status** — done or partial, and what is left.
29
- - **Deferred tangents** — the harvested items that become future work.
25
+ - **What shipped**: summarize from the `## Log` timeline; don't rebuild it step by step.
26
+ - **Decisions and why**: the settled calls that shaped the build (the *why* behind
27
+ the log). Copy each one's `D# (slug)` from `intent.md` (never a bare `D#`) so
28
+ the report reads without flipping back to the intent.
29
+ - **Parked & harvested**: what was captured and how each was classified.
30
+ - **Final status**: done or partial, and what is left.
31
+ - **Deferred tangents**: the harvested items that become future work.
30
32
  This is the "yeah, I did that" artifact. Write it by default; the human may edit it.
31
33
  2. **Finish.** Run `plumbbob finish`, which appends the checkpoint SHAs to the
32
- report and makes the final commit — subject `chore(<scope>): finish`, its body
33
- led by a `plumbbob finish` marker plus an optional proportional `--body` — then
34
- clears the control state (the in-flight markers, then `STATE` last — one delete
34
+ report and makes the final commit (subject `chore(<scope>): finish`, its body
35
+ led by a `plumbbob finish` marker plus an optional proportional `--body`), then
36
+ clears the control state (the in-flight markers, then `STATE` last; one delete
35
37
  drops both the session sentinel and the active-build cursor it carries). The
36
38
  build folder stays in place, committed, and rides the branch into the PR.
37
39
 
38
40
  `--body` reads the close-out message from **stdin via a single-quoted heredoc
39
- redirect** — the same form the other verbs use:
41
+ redirect**, the same form the other verbs use:
40
42
 
41
43
  ```
42
44
  plumbbob finish --body <<'BODY'
@@ -46,16 +48,17 @@ record.
46
48
 
47
49
  Redirect the heredoc *into* the command (`--body <<'BODY'`). Do **not** pass it as
48
50
  an argument value (`--body "$(cat <<'BODY'…)"`): `--body` ignores an argument and
49
- reads stdin, so that form leaves stdin open with no EOF and the command hangs. Omit
51
+ always reads stdin. Under an agent harness that stdin is a socket, and `--body` now
52
+ refuses rather than blocking on one; the refusal names this exact heredoc form. Omit
50
53
  `--body` entirely and the commit carries the `plumbbob finish` marker subject only.
51
- 3. **Point at the next goal** — `/plumbbob:plan` to frame the next one.
54
+ 3. **Point at the next goal**: `/plumbbob:plan` to frame the next one.
52
55
 
53
56
  ## The hard contracts
54
57
 
55
58
  - **Report by default, never a gate.** Always offer the report; never wall the exit. A
56
- bug fix's report can be three lines — size it to the work.
59
+ bug fix's report can be three lines; size it to the work.
57
60
  - **The log is the history; the report is the synthesis.** `checkpoint` already recorded
58
- what shipped, step by step — finish applies the *unique additions* (the why, the deferred
61
+ what shipped, step by step; finish applies the *unique additions* (the why, the deferred
59
62
  tangents, the final status), it does not rewrite the timeline.
60
63
  - **The folder is the archive, never destroy**. `finish` keeps intent +
61
64
  build-log + report in `builds/<slug>/` and commits them; nothing is copied out and
@@ -1,37 +1,37 @@
1
1
  ---
2
2
  name: harvest
3
- description: Triage the park list at a step boundary — propose one class (blocker/tangent/pivot) per parked item, write only after the human confirms each, record under ## Harvest, and fold a confirmed blocker into intent.
3
+ description: "Triage the park list at a step boundary: propose one class (blocker/tangent/pivot) per parked item, write only after the human confirms each, record under ## Harvest, and fold a confirmed blocker into intent."
4
4
  disable-model-invocation: true
5
5
  allowed-tools: Read, Edit, Bash(plumbbob status:*)
6
6
  ---
7
7
 
8
- # PlumbBob — harvest the park list
8
+ # PlumbBob: harvest the park list
9
9
 
10
10
  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."`
11
11
 
12
12
  `/plumbbob:harvest` is the complement of `/plumbbob:park`: you parked ideas as seeds during a
13
- build; now, at a boundary, you harvest them — decide what each one is.
13
+ build; now, at a boundary, you harvest them: decide what each one is.
14
14
 
15
- ## When to run it — boundary only
15
+ ## When to run it: boundary only
16
16
 
17
17
  Harvest at a **step boundary**: after a step is checkpointed and you are back at the
18
18
  DESIGN boundary, not mid-step. Read the dashboard injected above:
19
19
 
20
- - `NO ACTIVE SESSION` — **refuse**; tell the human to `plumbbob start "<title>"` first.
20
+ - `NO ACTIVE SESSION`: **refuse**; tell the human to `plumbbob start "<title>"` first.
21
21
  - A step in flight (the dashboard reads `[BUILD]`, and `next →` points at finishing the
22
- step) — **refuse** and suggest finishing it with `/plumbbob:verify` before harvesting.
22
+ step): **refuse** and suggest finishing it with `/plumbbob:verify` before harvesting.
23
23
  Chasing parked items mid-step is the disease parking prevents.
24
- - At the boundary (the dashboard reads `[DESIGN]`) — go ahead.
24
+ - At the boundary (the dashboard reads `[DESIGN]`): go ahead.
25
25
 
26
26
  ## What this skill does
27
27
 
28
28
  Walk the **Park list** in `build-log.md` item by item and, for each, **propose exactly
29
29
  one class**:
30
30
 
31
- - **blocker** — the plan was wrong or incomplete; can't proceed. Folds into `intent.md`
31
+ - **blocker**: the plan was wrong or incomplete; can't proceed. Folds into `intent.md`
32
32
  and is handled now.
33
- - **tangent** — a different path, not clearly better. **The default** — defer or kill.
34
- - **pivot signal** — real evidence the whole approach is wrong. Stop and replan.
33
+ - **tangent**: a different path, not clearly better. **The default**: defer or kill.
34
+ - **pivot signal**: real evidence the whole approach is wrong. Stop and replan.
35
35
 
36
36
  ## The one hard contract
37
37
 
@@ -42,6 +42,8 @@ one line of reasoning, then **wait for the human to confirm or override**. Write
42
42
  - Record each confirmed class in `build-log.md`'s `## Harvest` section.
43
43
  - **Flip the harvested item** from `- [ ]` to `- [x]` in the Park list, so `/plumbbob:status`
44
44
  stops counting it as open.
45
- - A confirmed **blocker** also folds its decision into `intent.md`.
45
+ - A confirmed **blocker** also folds its decision into `intent.md`, slugged at birth
46
+ like any Decision, anchored the same way
47
+ (`- <a id="d5"></a>**D5 (retry-cap)**: <the call>, *because* <why>`), never a bare `D5`.
46
48
  - Never reclassify or resolve an item the human hasn't confirmed, and default every
47
49
  uncertain item to **tangent**, never to blocker.
@@ -1,35 +1,35 @@
1
1
  ---
2
2
  name: park
3
- description: Compose one tidy tagged park line, get the human's OK in-turn, then capture it by shelling `plumbbob park` — never by editing a file. The capture half of the park/harvest loop.
3
+ description: "Compose one tidy tagged park line, get the human's OK in-turn, then capture it by shelling `plumbbob park`, never by editing a file. The capture half of the park/harvest loop."
4
4
  argument-hint: "[idea]"
5
5
  disable-model-invocation: true
6
6
  model: haiku
7
7
  allowed-tools: Bash(plumbbob status:*), Bash(plumbbob park:*)
8
8
  ---
9
9
 
10
- # PlumbBob — park an idea (capture, don't chase)
10
+ # PlumbBob: park an idea (capture, don't chase)
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
14
  `/plumbbob:park` is the **capture** half of the loop; `/plumbbob:harvest` is where parked items
15
- get triaged later. Capturing the instant an idea arrives — instead of acting on
16
- it — is the whole point: it protects the step in flight.
15
+ get triaged later. Capturing the instant an idea arrives (instead of acting on
16
+ it) is the whole point: it protects the step in flight.
17
17
 
18
18
  ## Wrong-state refusal
19
19
 
20
20
  Parking needs an **active session** to capture into. Read the dashboard injected above: if
21
21
  it is `NO ACTIVE SESSION`, **refuse** and tell the human to run `plumbbob start
22
- "<title>"` first. Any time the session is live — at the boundary, mid-step, or in a spike —
22
+ "<title>"` first. Any time the session is live (at the boundary, mid-step, or in a spike)
23
23
  is fine; capture is always available, which is the whole point of parking.
24
24
 
25
25
  ## What this skill does
26
26
 
27
27
  Take the idea, problem, or "ooh what if" the human just had and **compose it into one
28
- tidy, tagged line** — short, legible, self-contained, and carrying a **one-clause why**
28
+ tidy, tagged line**: short, legible, self-contained, and carrying a **one-clause why**
29
29
  (what it is *and* why it's worth revisiting), so it still reads cleanly weeks later when
30
30
  harvest triages it cold. Then:
31
31
 
32
- 1. **Show the composed line to the human** and wait for **in-turn approval** — they
32
+ 1. **Show the composed line to the human** and wait for **in-turn approval**: they
33
33
  confirm it as-is or edit the wording.
34
34
  2. **Only after** that approval, capture it by running `plumbbob park "<the
35
35
  approved line>"` via Bash.
@@ -38,8 +38,8 @@ harvest triages it cold. Then:
38
38
 
39
39
  The capture itself is the **dumb CLI**, never an edit. This skill carries **no Edit and
40
40
  no Write tool** on purpose: you may not append to `build-log.md` yourself. Compose, get
41
- approval, then shell `plumbbob park` — that is the only write path. If approval
42
- never comes, capture nothing. (When the human's **own message** states the idea — a
43
- tangent they raise mid-build — that message **is** the approval: capture it directly
41
+ approval, then shell `plumbbob park`; that is the only write path. If approval
42
+ never comes, capture nothing. (When the human's **own message** states the idea, a
43
+ tangent they raise mid-build, that message **is** the approval: capture it directly
44
44
  with `plumbbob park`, don't ask again. Deferring in words without the CLI line captures
45
45
  nothing.)