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,65 +1,69 @@
1
1
  ---
2
2
  name: verify
3
- description: "The verify tick — run the check, self-review the diff against intent, validate the step's done-when, pause for your approval, then checkpoint. Executor-agnostic: it reads the diff, not who wrote it."
3
+ description: "The verify tick: run the check, self-review the diff against intent, validate the step's done-when, pause for your approval, then checkpoint. Executor-agnostic: it reads the diff, not who wrote it."
4
4
  disable-model-invocation: true
5
5
  allowed-tools: Read, Bash(plumbbob status:*), Bash(plumbbob handoff:*), Bash(plumbbob check:*), Bash(plumbbob checkpoint:*), Bash(plumbbob agent:*), Bash(git diff:*), Bash(git status:*)
6
6
  ---
7
7
 
8
- # PlumbBob — verify a step (the tick)
8
+ # PlumbBob: verify a step (the tick)
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
- This is the **tick** — the one beat where the human is the clock. Whatever produced
13
- the current diff — `/plumbbob:build`, your own hands, a vibe session, another harness —
14
- this skill verifies it the same way: **it reads the diff, not the author**.
12
+ This is the **tick**: the one beat where the human is the clock. Whatever produced
13
+ the current diff (`/plumbbob:build`, your own hands, a vibe session, another harness),
14
+ this skill verifies it the same way: **it reads the diff, not the author**
15
+ ([D3 (author-blind-executor)](https://github.com/robmclarty/plumbbob/blob/main/docs/decisions.md#d3)).
15
16
 
16
17
  ## What this skill does, in order
17
18
 
18
- 1. **Check.** Run `plumbbob check` (the heavy gate — checkride unless the repo
19
+ 1. **Check.** Run `plumbbob check` (the heavy gate: checkride unless the repo
19
20
  configures a `check` override). If it comes back **red**, stop here: the gate
20
- names the failing slots and where each tool's raw output landed — read
21
+ names the failing slots and where each tool's raw output landed: read
21
22
  `.check/summary.json`, then the failing slot's own file (`.check/<slot>.json` or
22
23
  `.check/<slot>.stdout.txt`) for the actual diagnostics instead of scraping
23
- scrollback. Report what failed and do **not** pause for approval — there is
24
+ scrollback. Report what failed and do **not** pause for approval; there is
24
25
  nothing to approve yet. The human fixes it and re-invokes. (Exit 2 means the gate
25
- itself broke — a harness problem to surface, not a code failure.)
26
+ itself broke: a harness problem to surface, not a code failure.)
26
27
  2. **Run any bound `after`-agents** *(optional)*. If the build's `harness.json`
27
28
  binds agents to this step's `after` slot, run `plumbbob agent run --step <n> --mode
28
- after`. Their envelopes are **advisory input to the self-review, never a gate** —
29
+ after`. Their envelopes are **advisory input to the self-review, never a gate**;
29
30
  `plumbbob check` already gated in step 1, and an `after`-agent that could fail a step
30
- is the lock returning in autonomy's costume. Fold a `done` envelope's
31
- `summary`/`body` into the review below; route a non-`done` one by its status: a
32
- `blocked` agent couldn't finish — surface its `notes`, let the human unblock, re-run;
33
- a `drift` agent found the plan no longer matches reality — stop and send the human to
31
+ would be the old lock back in another form. Fold a `done` envelope's
32
+ `summary`/`body` into the review below; route a non-`done` one by its status. A
33
+ `blocked` agent couldn't finish: surface its `notes`, let the human unblock, re-run.
34
+ A `drift` agent found the plan no longer matches reality: stop and send the human to
34
35
  `/plumbbob:refine` to repair the plan before checkpointing. No binding, or no harness, is a
35
36
  clean no-op.
36
37
  3. **Self-review** *(a single structured read)*. Read `git diff` and
37
38
  `.plumbbob/intent.md`, then in one pass check the diff against:
38
- - the current step's **done-when** criterion — is it actually met?
39
- - the **Decisions** — does anything contradict a settled call?
40
- - the **Constraints** — are any violated?
41
- - any **`after`-agent findings** from step 2 — advisory, weigh them, don't defer to them.
42
- Surface every mismatch plainly. You are reviewing, not building — do not fix anything.
39
+ - the current step's **done-when** criterion: is it actually met?
40
+ - the **Decisions**: does anything contradict a settled call?
41
+ - the **Constraints**: are any violated?
42
+ - any **`after`-agent findings** from step 2: advisory, weigh them, don't defer to them.
43
+ Surface every mismatch plainly, and when you cite a Decision or Constraint, carry its
44
+ slug from `intent.md` (`C1 (no-new-deps)`, never a bare `C1`) so each finding reads
45
+ on its own. You are reviewing, not building; do not fix anything.
43
46
  4. **Validate.** State, yes or no, whether the step's done-when is met, with the evidence.
44
47
  5. **PAUSE.** Present the check result, the self-review (with any `after`-agent
45
48
  findings), and the validation, then
46
49
  **stop and wait for the human's explicit approval.** This is the convergence beat;
47
50
  the human is the clock. Never checkpoint without it.
48
- - **Reconcile a drifted subject here, in the open (D5).** The planned title *is* the
49
- checkpoint subject (D1). If the diff drifted from it — the step landed something the
50
- title no longer describes — the body pass may propose a corrected subject, but it
51
- **presents** it at this pause for explicit approval: show `planned title → proposed
52
- subject`, one line, as part of what the human OKs. This is the exception, not the
53
- default (D6): with **nothing presented**, the deterministic title-derived subject
54
- lands untouched. A silent `-m` swap is exactly the agent-authored subject D68 refuses
55
- — so a reconcile is *only ever* the visible, approved kind.
51
+ - **Reconcile a drifted subject here, in the open.** The planned title *is* the
52
+ checkpoint subject ([D68 (conventional-subjects)](https://github.com/robmclarty/plumbbob/blob/main/docs/decisions.md#d68)). If the diff drifted from it (the
53
+ step landed something the title no longer describes), the body pass may propose a
54
+ corrected subject, but it **presents** it at this pause for explicit approval: show
55
+ `planned title → proposed subject`, one line, as part of what the human OKs. This is
56
+ the exception, not the default: with **nothing presented**, the deterministic
57
+ title-derived subject lands untouched. A silent `-m` swap is exactly the
58
+ agent-authored subject [D68 (conventional-subjects)](https://github.com/robmclarty/plumbbob/blob/main/docs/decisions.md#d68) refuses, so a reconcile is
59
+ *only ever* the visible, approved kind.
56
60
  6. **Checkpoint** *(only after approval)*. Run `plumbbob checkpoint`: it makes the WIP
57
61
  commit, records the SHA, flips the step to done, appends the step to the build-log's
58
- `## Log`, and returns to DESIGN. The CLI owns the commit **subject** — a Conventional
59
- `<type>(<scope>): <description>` composed from the step title and the build slug — and
62
+ `## Log`, and returns to DESIGN. The CLI owns the commit **subject** (a Conventional
63
+ `<type>(<scope>): <description>` composed from the step title and the build slug) and
60
64
  leads the **body** with a `plumbbob step N` marker; you own the rest of the **body**.
61
- Compose a body *proportional to the step* — a one-liner for a trivial change, a short
62
- paragraph on the what/why for a meatier one — and pass it on stdin:
65
+ Compose a body *proportional to the step* (a one-liner for a trivial change, a short
66
+ paragraph on the what/why for a meatier one) and pass it on stdin:
63
67
 
64
68
  ```bash
65
69
  plumbbob checkpoint <n> --body <<'BODY'
@@ -67,11 +71,16 @@ this skill verifies it the same way: **it reads the diff, not the author**.
67
71
  BODY
68
72
  ```
69
73
 
70
- Do **not** run a TIL scan or reach for a separate commit skill — the body is yours to
74
+ Redirect the heredoc *into* the command (`--body <<'BODY'`). Do **not** pass it as
75
+ an argument value (`--body "$(cat <<'BODY'…)"`): `--body` ignores an argument and
76
+ always reads stdin. Under an agent harness that stdin is a socket, and `--body` now
77
+ refuses rather than blocking on one; the refusal names this exact heredoc form.
78
+
79
+ Do **not** run a TIL scan or reach for a separate commit skill; the body is yours to
71
80
  write in one breath. Omit `--body` entirely and the CLI writes a deterministic body
72
81
  (done-when + seam + diffstat) on its own. Either way, do **not** bump the version or
73
- touch the changelog — that is the human's `/version` call. And if step 5 surfaced a
74
- drifted subject the human approved, land *that* subject by adding `-m "<subject>"` —
82
+ touch the changelog; that is the human's `/version` call. And if step 5 surfaced a
83
+ drifted subject the human approved, land *that* subject by adding `-m "<subject>"`,
75
84
  overriding the title-derived default for this one commit; unpresented, the CLI's
76
85
  deterministic subject stands.
77
86
  7. **Hand off with the next model** *(once the checkpoint lands)*. `plumbbob checkpoint`
@@ -79,7 +88,7 @@ this skill verifies it the same way: **it reads the diff, not the author**.
79
88
  step gone from in-flight it renders `step N checkpointed — back at the boundary` and
80
89
  points at the **next undone step**, carrying that step's `- model:` recommendation (the
81
90
  plan's smallest-model-that-fits call) so the human knows which `/model` to select before
82
- firing `/plumbbob:build` again. This matters most across a context boundary: a fresh window
91
+ running `/plumbbob:build` again. This matters most across a context boundary: a fresh window
83
92
  inherits the *session's* model, not the plan's suggestion, so this line is what carries
84
93
  the recommendation over. The CLI owns the block, so it can't drift from what `plumbbob
85
94
  status` reports; no `- model:` line means any model will do. Guidance, never a gate.
@@ -87,17 +96,18 @@ this skill verifies it the same way: **it reads the diff, not the author**.
87
96
  ## The latch makes the pause real
88
97
 
89
98
  When this session runs under plumbbob's turn hook, `plumbbob checkpoint` **refuses to
90
- land a step in the same turn it was entered** — and that refusal **is** this pause, not
91
- an error to route around. If the checkpoint prints *"checkpoint refused — no human turn
92
- since this step began,"* you have reached the pause the hard way: present the diff and
99
+ land a step in the same turn it was entered**, and that refusal **is** this pause, not
100
+ an error to route around. If the checkpoint prints `checkpoint refused — no human turn
101
+ since this step began`, you have reached the pause the hard way: present the diff and
93
102
  the self-review, **end the turn**, and the human's next message is the tick that lets
94
- the checkpoint land when you re-fire. **Never reach for a raw `git commit` to force the
95
- land** — that forges the very record the latch exists to keep honest, and the
103
+ the checkpoint land when you run it again. **Never reach for a raw `git commit` to force the
104
+ land**; that forges the very record the latch exists to keep honest, and the
96
105
  commit-ask hook asks the human about it anyway. The refusal is a healthy latch doing its
97
106
  job on the *record* while the *work* plane stays free; a `/plumbbob:build --auto` or
98
- a typed step range in the human's own prompt is the only self-approval — **never write
107
+ a typed step range in the human's own prompt is the only self-approval; **never write
99
108
  `auto` into a settings file to unlock the land; the latch ignores a model-minted grant
100
- (D67), so ask the human to re-fire `/plumbbob:build --auto` instead.**
109
+ ([D67 (auto-not-a-grant)](https://github.com/robmclarty/plumbbob/blob/main/docs/decisions.md#d67)), so ask the human to type `/plumbbob:build --auto` again
110
+ instead.**
101
111
 
102
112
  ## The hard contracts
103
113
 
@@ -108,15 +118,15 @@ a typed step range in the human's own prompt is the only self-approval — **nev
108
118
  - **Red means stop, not pause.** A failing check is not an approval decision; report
109
119
  it and end your turn.
110
120
  - **You review; you do not build.** If the self-review finds a problem, surface it
111
- and stop — fixing is a new build beat, not part of verify.
121
+ and stop; fixing is a new build beat, not part of verify.
112
122
  - **`after`-agents advise; they never gate**. Their output feeds the
113
- self-review — checkride gates, the human approves. `blocked` → unblock and re-run;
123
+ self-review; checkride gates, the human approves. `blocked` → unblock and re-run;
114
124
  `drift` → `/plumbbob:refine` before checkpointing. No code path makes them blocking.
115
125
  - **A refused checkpoint is the pause, never a workaround.** Under the turn
116
- hook a same-turn checkpoint is refused *by design* — present the diff, **end the
126
+ hook a same-turn checkpoint is refused *by design*: present the diff, **end the
117
127
  turn**, and let the human's next message re-tick it. Never route around it with a raw
118
128
  `git commit`; the latch guards the record, not the work.
119
129
  - **Close with the next model.** After the checkpoint lands, run `plumbbob handoff` and
120
- relay its block — it cites the completed step and the next undone step, and surfaces that
130
+ relay its block; it cites the completed step and the next undone step, and surfaces that
121
131
  next step's `- model:` recommendation when it has one, which is what a fresh context
122
132
  window needs to pick the right `/model`. Guidance, never a gate.
@@ -1,26 +1,26 @@
1
1
  <!--
2
- build-log.md — your live ledger for execution. Append constantly; reorganize at
2
+ build-log.md: your live ledger for execution. Append constantly; reorganize at
3
3
  step boundaries. The antidote to "my plan got lost in the noise."
4
4
 
5
5
  Steps : where you are. One step in flight at a time. CLI-maintained: `build`,
6
6
  `checkpoint`, and `revert` keep this mirror and the Current step line
7
- in sync with intent.md — you never hand-edit them.
7
+ in sync with intent.md; you never hand-edit them.
8
8
  Park list : where ideas go so you do not chase them. CAPTURE, never act inline.
9
9
  Harvest : the boundary ritual that keeps you on one branch.
10
10
  Log : the build's history. `plumbbob checkpoint` appends a line per step as it
11
11
  lands; feeds the /plumbbob:finish report, which rides the branch into the PR.
12
12
  -->
13
13
 
14
- # Build log — {{TITLE}}
14
+ # Build log: {{TITLE}}
15
15
 
16
16
  **Current step:** none (at the boundary)
17
17
  **Heavy check:** {{CHECK}}
18
18
 
19
19
  ## Steps
20
20
 
21
- *(Mirror of intent.md's Steps, with live status — CLI-maintained, not hand-edited.
21
+ *(Mirror of intent.md's Steps, with live status; CLI-maintained, not hand-edited.
22
22
  `build`/`checkpoint`/`revert` re-render this from intent.md, and set the Current step
23
- line above. Only ONE step is in flight; a step is done only after a checkpoint —
23
+ line above. Only ONE step is in flight; a step is done only after a checkpoint:
24
24
  check green + checkpoint taken, via `/plumbbob:verify` or `/plumbbob:build`.)*
25
25
 
26
26
  - ☐ 1. <step>
@@ -52,8 +52,8 @@ Harvest results this boundary:
52
52
  ## Log
53
53
 
54
54
  *(The build's history, oldest first. `plumbbob checkpoint` appends a dated line here
55
- every time a step lands — via `/plumbbob:build` or `/plumbbob:verify` — so this
55
+ every time a step lands (via `/plumbbob:build` or `/plumbbob:verify`), so this
56
56
  fills in as you go, not at the end. Add your own decision/event lines too: this is what
57
- you point at to say "I did that — the LLM helped, but those were my calls."
57
+ you point at to say "I did that: the LLM helped, but those were my calls."
58
58
  `/plumbbob:finish` reads this for the report; `plumbbob finish` commits it with the build
59
59
  folder, so it rides the branch into the PR.)*
@@ -1,5 +1,5 @@
1
1
  <!--
2
- intent.md — your canonical intent, written in DESIGN before any code. This is the
2
+ intent.md: your canonical intent, written in DESIGN before any code. This is the
3
3
  head; the chat is the hand. When the model floods you, read this, not your memory.
4
4
 
5
5
  Size to the work: a small change fills Frame + a couple of Decisions and deletes
@@ -7,8 +7,8 @@ the rest; a medium feature fills it all. Opinionated where decided, explicit whe
7
7
  open. If the implementor (you-later, or the LLM) has to guess, the doc failed.
8
8
 
9
9
  One rule runs through the whole doc: compress what's settled; expand what's pending.
10
- Decisions and Constraints stay one line each — they re-inject into every build step,
11
- so their tokens recur. Open questions expand into plain-then-lean prose — a human
10
+ Decisions and Constraints stay one line each; they re-inject into every build step,
11
+ so their tokens recur. Open questions expand into plain-then-lean prose; a human
12
12
  reads them once, to decide, and that legibility buys back a chat round-trip.
13
13
  -->
14
14
 
@@ -16,11 +16,11 @@ reads them once, to decide, and that legibility buys back a chat round-trip.
16
16
 
17
17
  **Phase** (your own bookkeeping while framing): frame
18
18
  **Size:** tiny | small | medium
19
- **Scope:** <short-scope> <!-- the build's default commit scope (D4): a short feature-level name each step's own `(scope)` overrides. Leave the `<…>` placeholder (or blank) and it parses as absent — commits fall through to the build slug (D7). -->
19
+ **Scope:** <short-scope> <!-- the build's default commit scope (plumbbob [D68 (conventional-subjects)](https://github.com/robmclarty/plumbbob/blob/main/docs/decisions.md#d68)): a short feature-level name each step's own `(scope)` overrides. Leave the `<…>` placeholder (or blank) and it parses as absent; commits fall through to the build slug. -->
20
20
 
21
21
  ## Frame
22
22
 
23
- *(You, on paper first. The problem in plain words — before any solution.)*
23
+ *(You, on paper first. The problem in plain words, before any solution.)*
24
24
 
25
25
  - **Problem:** <what is wrong or missing, and why it matters>
26
26
  - **Smallest thing that solves it:** <the minimal change, not the ideal system>
@@ -37,84 +37,95 @@ reads them once, to decide, and that legibility buys back a chat round-trip.
37
37
 
38
38
  ## Decisions
39
39
 
40
- *(One line each — settled, not re-litigated in the chat. Grows as you resolve the
41
- holes `/plumbbob:refine` surfaces, and as blockers fold in during BUILD. Mint a two- or
42
- three-word slug where each item is born — `D1 (slug-here)` — and copy that slug at
43
- every reference site, so a later `D4 (default-waves)` never decays into a bare `D4`
44
- a cold reader has to hunt down.)*
40
+ *(One line each: settled, not re-litigated in the chat. Grows as you resolve the
41
+ holes `/plumbbob:refine` surfaces, and as blockers fold in during BUILD. **Anchor and slug
42
+ each item where it is born**: a two- or three-word slug, and an `<a id="…">` for
43
+ references to land on; then cite it from anywhere else in this file as
44
+ `[D1 (slug-here)](#d1)`, carrying that same slug verbatim. One link, one glance: a later
45
+ `D4` never decays into a bare number a cold reader has to hunt down.)*
45
46
 
46
- - D1 (slug-here): <decision> — *because* <the one reason that mattered>
47
+ - <a id="d1"></a>**D1 (slug-here)**: <decision>, *because* <the one reason that mattered>
47
48
 
48
49
  ## Constraints
49
50
 
50
51
  *(Hard rules the build must honor. `/plumbbob:verify` and `/plumbbob:refine` read against these.
51
- Slug and gloss them at birth too — `C1 (no-new-deps)` — same one line, same rule.)*
52
+ Anchor and slug them at birth too (cited as `[C1 (no-new-deps)](#c1)`): same one line,
53
+ same rule.)*
52
54
 
53
- - C1 (no-new-deps): <e.g. functional/procedural only; no new dependencies>
55
+ - <a id="c1"></a>**C1 (no-new-deps)**: <for example functional/procedural only; no new dependencies>
54
56
 
55
57
  ## Steps
56
58
 
57
- *(The build plan. `/plumbbob:plan` authors the **whole list up front** — each step a small,
59
+ *(The build plan. `/plumbbob:plan` authors the **whole list up front**: each step a small,
58
60
  verifiable increment with its own **done-when** and **seam** (the paths it will touch,
59
- which `/plumbbob:build` records in the build folder's `SEAM` for orientation — awareness, not a lock).
60
- An optional **model** line recommends the smallest model that can carry the step —
61
+ which `/plumbbob:build` records in the build folder's `SEAM` for orientation: awareness, not a lock).
62
+ An optional **model** line recommends the smallest model that can carry the step:
61
63
  mechanical work runs fine on a small model; subtle or creative work earns a frontier
62
- one. Advisory for the human, never a gate; write it plain, no backticks (D62).
63
- The step title *is* the checkpoint's commit subject: write it as one plain line,
64
- `type(scope): description` — load-bearing paths live in `seam`, never jammed into the
65
- title (D2) — aiming for ≤72 characters (GitHub's subject convention: soft, no gate, D9).
64
+ one. Advisory for the human, never a gate; write it plain, no backticks (plumbbob
65
+ [D62 (model-recommendation)](https://github.com/robmclarty/plumbbob/blob/main/docs/decisions.md#d62)). The step title *is* the checkpoint's commit subject
66
+ (plumbbob [D68 (conventional-subjects)](https://github.com/robmclarty/plumbbob/blob/main/docs/decisions.md#d68)): write it as one plain line, `type(scope): description`
67
+ (load-bearing paths live in `seam`, never jammed into the title), aiming for ≤72
68
+ characters (GitHub's subject convention: soft, no gate).
66
69
  The `(scope)` names the primary code area the step touches (`plan`, `commitmsg`); the
67
- build's `**Scope:**` header is the feature-level catch-all a step overrides (D8). Scope
70
+ build's `**Scope:**` header is the feature-level catch-all a step overrides. Scope
68
71
  resolves title-scope → `**Scope:**` default → build slug → bare, and type resolves
69
- title-type → `feat` (D3/D68). Then drive `/plumbbob:build` until done. Later steps may be
72
+ title-type → `feat`. Then drive `/plumbbob:build` until done. Later steps may be
70
73
  fuzzier than the first; sharpen the next one just-in-time with `/plumbbob:step` (empty input
71
74
  auto-syncs it), and use `/plumbbob:refine` to repair the whole plan when a blocker rewrites it.)*
72
75
 
73
- 1. [ ] feat: <step> — **done when:** <criterion, ideally a test or check result>
76
+ 1. [ ] feat: <step>, **done when:** <criterion, ideally a test or check result>
74
77
  - seam: `<file>`, `<file>`
75
- - model: <smallest that can carry it, e.g. sonnet — mechanical, fully specified>
76
- 2. [ ] <step> — **done when:** <criterion>
78
+ - model: <smallest that can carry it, for example sonnet (mechanical, fully specified)>
79
+ 2. [ ] <step>, **done when:** <criterion>
77
80
  - seam: `<file>`
78
81
 
79
82
  ## Open questions
80
83
 
81
- *(Holes you could NOT resolve on paper — the one section that expands rather than
84
+ *(Holes you could NOT resolve on paper: the one section that expands rather than
82
85
  compresses. Do not guess them into Decisions; a genuine fork goes to a SPIKE, with
83
86
  the verdict recorded below and in Decisions.)*
84
87
 
85
88
  <!--
86
89
  Write each open question so a cold reader could answer it without flipping back to
87
- the code or the chat — that cold-reader test is the whole point of expanding it.
90
+ the code or the chat; that cold-reader test is the whole point of expanding it.
88
91
  Three lines:
89
92
 
90
- · the opener — the hole as a question, slugged at birth, tagged
91
- *resolve by:* decide | spike | ask
92
- · *plain:* — what's at stake, in plain words: the context and the cost of getting
93
+ · the opener: the hole as a question, anchored and slugged at birth the same way a
94
+ Decision is (`- <a id="q1"></a>**Q1 (slug-here)**: …`, so a `[Q1 (slug-here)](#q1)`
95
+ reference has somewhere to land), tagged *resolve by:* decide | spike | ask
96
+ · *plain:* what's at stake, in plain words: the context and the cost of getting
93
97
  it wrong, enough to judge it cold
94
- · *lean:* — the model's proposed resolution: one answer to react to, not a menu
98
+ · *lean:* the model's proposed resolution: one answer to react to, not a menu
95
99
 
96
- The human reads *plain* to understand, then *lean* to approve or redirect — one
100
+ The human reads *plain* to understand, then *lean* to approve or redirect: one
97
101
  pass, no round-trip.
98
102
 
99
103
  When a question resolves, swap *resolve by:* for *resolved:* <date, the call> ON THE
100
104
  OPENER LINE, e.g.
101
105
 
102
- - Q3 (default-waves): *resolved:* 2026-07-18, default off
106
+ - <a id="q3"></a>**Q3 (default-waves)**: *resolved:* 2026-07-18, default off
103
107
 
104
108
  The status counter reads opener lines only, so a *resolved:* left on a *plain:* or
105
- *lean:* sub-line leaves the question still counted as open.
106
-
107
- Size to the work: a tiny build's single, obvious question may stay one bare line —
109
+ *lean:* sub-line leaves the question still counted as open
110
+ ([D76 (resolved-on-opener)](https://github.com/robmclarty/plumbbob/blob/main/docs/decisions.md#d76)).
111
+ It reads "resolved" as a whole word, so an opener that still calls itself
112
+ "unresolved" keeps counting. The scaffolded Q1 below stays uncounted for as long as
113
+ its body is unfilled, still opening on its `<...>` fill-in, which is how a fresh
114
+ build reports zero open questions
115
+ ([D77 (placeholder-uncounted)](https://github.com/robmclarty/plumbbob/blob/main/docs/decisions.md#d77));
116
+ fill it in and it counts.
117
+
118
+ Size to the work: a tiny build's single, obvious question may stay one bare line;
108
119
  the *plain:*/*lean:* pair earns its keep only when a human decision genuinely waits
109
120
  on it.
110
121
  -->
111
122
 
112
- - Q1 (slug-here): <the unresolved hole, framed as a question> — *resolve by:* decide | spike | ask
113
- - *plain:* <what's at stake, in plain words — enough to judge it cold>
114
- - *lean:* <the model's proposed resolution — the answer to react to>
123
+ - <a id="q1"></a>**Q1 (slug-here)**: <the unresolved hole, framed as a question>, *resolve by:* decide | spike | ask
124
+ - *plain:* <what's at stake, in plain words, enough to judge it cold>
125
+ - *lean:* <the model's proposed resolution: the answer to react to>
115
126
 
116
127
  ## Verdicts
117
128
 
118
- *(Filled in as spikes and forks resolve — the audit trail of "these were my calls.")*
129
+ *(Filled in as spikes and forks resolve: the audit trail of "these were my calls.")*
119
130
 
120
- - <date> — <fork> → chose <option> because <reason>; deleted <the rest>
131
+ - <date>: <fork> → chose <option> because <reason>; deleted <the rest>
@@ -1,16 +1,16 @@
1
1
  <!--
2
- spike-report.md — the durable receipt for a spike (a fork the plan couldn't settle
2
+ spike-report.md: the durable receipt for a spike (a fork the plan couldn't settle
3
3
  on paper). One per spike, numbered and named `spike-NN-<slug>.md`, riding the build
4
- folder into the PR beside intent.md / report.md. Fill it while the experiment is live
5
- — the worktrees and their learnings are torn down at `spike done`, but this stays.
4
+ folder into the PR beside intent.md / report.md. Fill it while the experiment is
5
+ live; the worktrees and their learnings are torn down at `spike done`, but this stays.
6
6
 
7
7
  Two ways a spike is born, both landing here:
8
- - `/plumbbob:spike <slug>` — an explicit mid-build fork with throwaway worktrees.
9
- - a planned step titled `spike: …` — the increment IS the experiment.
8
+ - `/plumbbob:spike <slug>`: an explicit mid-build fork with throwaway worktrees.
9
+ - a planned step titled `spike: …`: the increment IS the experiment.
10
10
  Record the Verdict before you close the spike (or check off the step).
11
11
  -->
12
12
 
13
- # Spike — {{TITLE}}
13
+ # Spike: {{TITLE}}
14
14
 
15
15
  **Via:** {{VIA}}
16
16
  **Opened:** {{DATE}}
@@ -22,17 +22,17 @@ would each answer commit us to?)*
22
22
 
23
23
  ## Options tried
24
24
 
25
- *(Each path you actually ran, and what it took — one bullet each.)*
25
+ *(Each path you actually ran, and what it took: one bullet each.)*
26
26
 
27
27
  ## Findings
28
28
 
29
- *(What the experiment showed — evidence, not opinion. Numbers, errors, surprises.)*
29
+ *(What the experiment showed: evidence, not opinion. Numbers, errors, surprises.)*
30
30
 
31
31
  ## Verdict
32
32
 
33
- **Verdict:** *(viable | not viable | partial — replace this line with the call and why)*
33
+ **Verdict:** *(viable | not viable | partial; replace this line with the call and why)*
34
34
 
35
35
  ## What this decides
36
36
 
37
- *(The intent.md Decision this feeds — which option won, what dies, and the one reason
37
+ *(The intent.md Decision this feeds: which option won, what dies, and the one reason
38
38
  that settled it. Copy the call into intent.md's Decisions / Verdicts too.)*