agent-bober 0.12.0 → 0.15.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 (518) hide show
  1. package/CHANGELOG.md +213 -0
  2. package/README.md +112 -3
  3. package/agents/bober-architect.md +38 -0
  4. package/agents/bober-code-reviewer.md +236 -0
  5. package/agents/bober-curator.md +37 -0
  6. package/agents/bober-deployer.md +267 -0
  7. package/agents/bober-diagnoser.md +289 -0
  8. package/agents/bober-evaluator.md +89 -1
  9. package/agents/bober-generator.md +68 -3
  10. package/agents/bober-planner.md +39 -0
  11. package/agents/bober-postmortemer.md +185 -0
  12. package/agents/bober-researcher.md +38 -0
  13. package/dist/cli/commands/approve.d.ts +17 -0
  14. package/dist/cli/commands/approve.d.ts.map +1 -0
  15. package/dist/cli/commands/approve.js +64 -0
  16. package/dist/cli/commands/approve.js.map +1 -0
  17. package/dist/cli/commands/audit-show.d.ts +14 -0
  18. package/dist/cli/commands/audit-show.d.ts.map +1 -0
  19. package/dist/cli/commands/audit-show.js +85 -0
  20. package/dist/cli/commands/audit-show.js.map +1 -0
  21. package/dist/cli/commands/config.d.ts +10 -0
  22. package/dist/cli/commands/config.d.ts.map +1 -0
  23. package/dist/cli/commands/config.js +73 -0
  24. package/dist/cli/commands/config.js.map +1 -0
  25. package/dist/cli/commands/graph.d.ts +8 -0
  26. package/dist/cli/commands/graph.d.ts.map +1 -0
  27. package/dist/cli/commands/graph.js +219 -0
  28. package/dist/cli/commands/graph.js.map +1 -0
  29. package/dist/cli/commands/impact.d.ts +19 -0
  30. package/dist/cli/commands/impact.d.ts.map +1 -0
  31. package/dist/cli/commands/impact.js +191 -0
  32. package/dist/cli/commands/impact.js.map +1 -0
  33. package/dist/cli/commands/incident.d.ts +19 -0
  34. package/dist/cli/commands/incident.d.ts.map +1 -0
  35. package/dist/cli/commands/incident.js +324 -0
  36. package/dist/cli/commands/incident.js.map +1 -0
  37. package/dist/cli/commands/init.js +36 -1
  38. package/dist/cli/commands/init.js.map +1 -1
  39. package/dist/cli/commands/list-approvals.d.ts +16 -0
  40. package/dist/cli/commands/list-approvals.d.ts.map +1 -0
  41. package/dist/cli/commands/list-approvals.js +57 -0
  42. package/dist/cli/commands/list-approvals.js.map +1 -0
  43. package/dist/cli/commands/onboard.d.ts +3 -0
  44. package/dist/cli/commands/onboard.d.ts.map +1 -0
  45. package/dist/cli/commands/onboard.js +190 -0
  46. package/dist/cli/commands/onboard.js.map +1 -0
  47. package/dist/cli/commands/playbook.d.ts +17 -0
  48. package/dist/cli/commands/playbook.d.ts.map +1 -0
  49. package/dist/cli/commands/playbook.js +123 -0
  50. package/dist/cli/commands/playbook.js.map +1 -0
  51. package/dist/cli/commands/postmortem.d.ts +12 -0
  52. package/dist/cli/commands/postmortem.d.ts.map +1 -0
  53. package/dist/cli/commands/postmortem.js +67 -0
  54. package/dist/cli/commands/postmortem.js.map +1 -0
  55. package/dist/cli/commands/reject.d.ts +17 -0
  56. package/dist/cli/commands/reject.d.ts.map +1 -0
  57. package/dist/cli/commands/reject.js +52 -0
  58. package/dist/cli/commands/reject.js.map +1 -0
  59. package/dist/cli/commands/rollback.d.ts +21 -0
  60. package/dist/cli/commands/rollback.d.ts.map +1 -0
  61. package/dist/cli/commands/rollback.js +90 -0
  62. package/dist/cli/commands/rollback.js.map +1 -0
  63. package/dist/cli/commands/run.d.ts +9 -0
  64. package/dist/cli/commands/run.d.ts.map +1 -1
  65. package/dist/cli/commands/run.js +29 -0
  66. package/dist/cli/commands/run.js.map +1 -1
  67. package/dist/cli/commands/telemetry.d.ts +16 -0
  68. package/dist/cli/commands/telemetry.d.ts.map +1 -0
  69. package/dist/cli/commands/telemetry.js +152 -0
  70. package/dist/cli/commands/telemetry.js.map +1 -0
  71. package/dist/cli/commands/worktree.d.ts +12 -0
  72. package/dist/cli/commands/worktree.d.ts.map +1 -0
  73. package/dist/cli/commands/worktree.js +57 -0
  74. package/dist/cli/commands/worktree.js.map +1 -0
  75. package/dist/cli/index.js +50 -0
  76. package/dist/cli/index.js.map +1 -1
  77. package/dist/config/defaults.d.ts.map +1 -1
  78. package/dist/config/defaults.js +27 -0
  79. package/dist/config/defaults.js.map +1 -1
  80. package/dist/config/index.d.ts +1 -1
  81. package/dist/config/index.d.ts.map +1 -1
  82. package/dist/config/index.js +4 -0
  83. package/dist/config/index.js.map +1 -1
  84. package/dist/config/loader.d.ts.map +1 -1
  85. package/dist/config/loader.js +18 -1
  86. package/dist/config/loader.js.map +1 -1
  87. package/dist/config/schema.d.ts +976 -56
  88. package/dist/config/schema.d.ts.map +1 -1
  89. package/dist/config/schema.js +147 -0
  90. package/dist/config/schema.js.map +1 -1
  91. package/dist/graph/artifact-store.d.ts +14 -0
  92. package/dist/graph/artifact-store.d.ts.map +1 -0
  93. package/dist/graph/artifact-store.js +100 -0
  94. package/dist/graph/artifact-store.js.map +1 -0
  95. package/dist/graph/cli.d.ts +49 -0
  96. package/dist/graph/cli.d.ts.map +1 -0
  97. package/dist/graph/cli.js +140 -0
  98. package/dist/graph/cli.js.map +1 -0
  99. package/dist/graph/client.d.ts +64 -0
  100. package/dist/graph/client.d.ts.map +1 -0
  101. package/dist/graph/client.js +216 -0
  102. package/dist/graph/client.js.map +1 -0
  103. package/dist/graph/fallback.d.ts +13 -0
  104. package/dist/graph/fallback.d.ts.map +1 -0
  105. package/dist/graph/fallback.js +57 -0
  106. package/dist/graph/fallback.js.map +1 -0
  107. package/dist/graph/hook-handler.d.ts +50 -0
  108. package/dist/graph/hook-handler.d.ts.map +1 -0
  109. package/dist/graph/hook-handler.js +217 -0
  110. package/dist/graph/hook-handler.js.map +1 -0
  111. package/dist/graph/incidents.d.ts +59 -0
  112. package/dist/graph/incidents.d.ts.map +1 -0
  113. package/dist/graph/incidents.js +22 -0
  114. package/dist/graph/incidents.js.map +1 -0
  115. package/dist/graph/mcp-client.d.ts +51 -0
  116. package/dist/graph/mcp-client.d.ts.map +1 -0
  117. package/dist/graph/mcp-client.js +285 -0
  118. package/dist/graph/mcp-client.js.map +1 -0
  119. package/dist/graph/onboarding-composer.d.ts +30 -0
  120. package/dist/graph/onboarding-composer.d.ts.map +1 -0
  121. package/dist/graph/onboarding-composer.js +275 -0
  122. package/dist/graph/onboarding-composer.js.map +1 -0
  123. package/dist/graph/pipeline-lifecycle.d.ts +86 -0
  124. package/dist/graph/pipeline-lifecycle.d.ts.map +1 -0
  125. package/dist/graph/pipeline-lifecycle.js +329 -0
  126. package/dist/graph/pipeline-lifecycle.js.map +1 -0
  127. package/dist/graph/preflight-budgets.d.ts +52 -0
  128. package/dist/graph/preflight-budgets.d.ts.map +1 -0
  129. package/dist/graph/preflight-budgets.js +78 -0
  130. package/dist/graph/preflight-budgets.js.map +1 -0
  131. package/dist/graph/preflight-injector.d.ts +116 -0
  132. package/dist/graph/preflight-injector.d.ts.map +1 -0
  133. package/dist/graph/preflight-injector.js +538 -0
  134. package/dist/graph/preflight-injector.js.map +1 -0
  135. package/dist/graph/prereq.d.ts +12 -0
  136. package/dist/graph/prereq.d.ts.map +1 -0
  137. package/dist/graph/prereq.js +61 -0
  138. package/dist/graph/prereq.js.map +1 -0
  139. package/dist/graph/prompts.d.ts +42 -0
  140. package/dist/graph/prompts.d.ts.map +1 -0
  141. package/dist/graph/prompts.js +80 -0
  142. package/dist/graph/prompts.js.map +1 -0
  143. package/dist/graph/sandbox.d.ts +19 -0
  144. package/dist/graph/sandbox.d.ts.map +1 -0
  145. package/dist/graph/sandbox.js +25 -0
  146. package/dist/graph/sandbox.js.map +1 -0
  147. package/dist/graph/token-usage.d.ts +21 -0
  148. package/dist/graph/token-usage.d.ts.map +1 -0
  149. package/dist/graph/token-usage.js +22 -0
  150. package/dist/graph/token-usage.js.map +1 -0
  151. package/dist/graph/types.d.ts +129 -0
  152. package/dist/graph/types.d.ts.map +1 -0
  153. package/dist/graph/types.js +12 -0
  154. package/dist/graph/types.js.map +1 -0
  155. package/dist/incident/orchestrator.d.ts +168 -0
  156. package/dist/incident/orchestrator.d.ts.map +1 -0
  157. package/dist/incident/orchestrator.js +279 -0
  158. package/dist/incident/orchestrator.js.map +1 -0
  159. package/dist/incident/playbook-search.d.ts +67 -0
  160. package/dist/incident/playbook-search.d.ts.map +1 -0
  161. package/dist/incident/playbook-search.js +288 -0
  162. package/dist/incident/playbook-search.js.map +1 -0
  163. package/dist/incident/postmortem.d.ts +44 -0
  164. package/dist/incident/postmortem.d.ts.map +1 -0
  165. package/dist/incident/postmortem.js +486 -0
  166. package/dist/incident/postmortem.js.map +1 -0
  167. package/dist/incident/resolution-verify.d.ts +186 -0
  168. package/dist/incident/resolution-verify.d.ts.map +1 -0
  169. package/dist/incident/resolution-verify.js +210 -0
  170. package/dist/incident/resolution-verify.js.map +1 -0
  171. package/dist/incident/rollback.d.ts +137 -0
  172. package/dist/incident/rollback.d.ts.map +1 -0
  173. package/dist/incident/rollback.js +328 -0
  174. package/dist/incident/rollback.js.map +1 -0
  175. package/dist/incident/timeline.d.ts +147 -0
  176. package/dist/incident/timeline.d.ts.map +1 -0
  177. package/dist/incident/timeline.js +452 -0
  178. package/dist/incident/timeline.js.map +1 -0
  179. package/dist/incident/types.d.ts +335 -0
  180. package/dist/incident/types.d.ts.map +1 -0
  181. package/dist/incident/types.js +158 -0
  182. package/dist/incident/types.js.map +1 -0
  183. package/dist/index.d.ts +1 -1
  184. package/dist/index.d.ts.map +1 -1
  185. package/dist/index.js +1 -1
  186. package/dist/index.js.map +1 -1
  187. package/dist/mcp/event-stream.d.ts +46 -0
  188. package/dist/mcp/event-stream.d.ts.map +1 -0
  189. package/dist/mcp/event-stream.js +421 -0
  190. package/dist/mcp/event-stream.js.map +1 -0
  191. package/dist/mcp/external-client.d.ts +38 -0
  192. package/dist/mcp/external-client.d.ts.map +1 -0
  193. package/dist/mcp/external-client.js +121 -0
  194. package/dist/mcp/external-client.js.map +1 -0
  195. package/dist/mcp/run-manager.d.ts +74 -9
  196. package/dist/mcp/run-manager.d.ts.map +1 -1
  197. package/dist/mcp/run-manager.js +127 -31
  198. package/dist/mcp/run-manager.js.map +1 -1
  199. package/dist/mcp/server.d.ts.map +1 -1
  200. package/dist/mcp/server.js +56 -0
  201. package/dist/mcp/server.js.map +1 -1
  202. package/dist/mcp/tools/abort-run.d.ts +2 -0
  203. package/dist/mcp/tools/abort-run.d.ts.map +1 -0
  204. package/dist/mcp/tools/abort-run.js +62 -0
  205. package/dist/mcp/tools/abort-run.js.map +1 -0
  206. package/dist/mcp/tools/anchor.js +1 -1
  207. package/dist/mcp/tools/anchor.js.map +1 -1
  208. package/dist/mcp/tools/approve-checkpoint.d.ts +2 -0
  209. package/dist/mcp/tools/approve-checkpoint.d.ts.map +1 -0
  210. package/dist/mcp/tools/approve-checkpoint.js +70 -0
  211. package/dist/mcp/tools/approve-checkpoint.js.map +1 -0
  212. package/dist/mcp/tools/brownfield.js +1 -1
  213. package/dist/mcp/tools/brownfield.js.map +1 -1
  214. package/dist/mcp/tools/get-project-state.d.ts +2 -0
  215. package/dist/mcp/tools/get-project-state.d.ts.map +1 -0
  216. package/dist/mcp/tools/get-project-state.js +107 -0
  217. package/dist/mcp/tools/get-project-state.js.map +1 -0
  218. package/dist/mcp/tools/get-run-status.d.ts +2 -0
  219. package/dist/mcp/tools/get-run-status.d.ts.map +1 -0
  220. package/dist/mcp/tools/get-run-status.js +40 -0
  221. package/dist/mcp/tools/get-run-status.js.map +1 -0
  222. package/dist/mcp/tools/graph-schemas.d.ts +100 -0
  223. package/dist/mcp/tools/graph-schemas.d.ts.map +1 -0
  224. package/dist/mcp/tools/graph-schemas.js +39 -0
  225. package/dist/mcp/tools/graph-schemas.js.map +1 -0
  226. package/dist/mcp/tools/graph.d.ts +19 -0
  227. package/dist/mcp/tools/graph.d.ts.map +1 -0
  228. package/dist/mcp/tools/graph.js +263 -0
  229. package/dist/mcp/tools/graph.js.map +1 -0
  230. package/dist/mcp/tools/incident.d.ts +2 -0
  231. package/dist/mcp/tools/incident.d.ts.map +1 -0
  232. package/dist/mcp/tools/incident.js +246 -0
  233. package/dist/mcp/tools/incident.js.map +1 -0
  234. package/dist/mcp/tools/index.d.ts +38 -18
  235. package/dist/mcp/tools/index.d.ts.map +1 -1
  236. package/dist/mcp/tools/index.js +74 -18
  237. package/dist/mcp/tools/index.js.map +1 -1
  238. package/dist/mcp/tools/list-active-runs.d.ts +2 -0
  239. package/dist/mcp/tools/list-active-runs.d.ts.map +1 -0
  240. package/dist/mcp/tools/list-active-runs.js +35 -0
  241. package/dist/mcp/tools/list-active-runs.js.map +1 -0
  242. package/dist/mcp/tools/list-pending-approvals.d.ts +2 -0
  243. package/dist/mcp/tools/list-pending-approvals.d.ts.map +1 -0
  244. package/dist/mcp/tools/list-pending-approvals.js +40 -0
  245. package/dist/mcp/tools/list-pending-approvals.js.map +1 -0
  246. package/dist/mcp/tools/list-projects.d.ts +2 -0
  247. package/dist/mcp/tools/list-projects.d.ts.map +1 -0
  248. package/dist/mcp/tools/list-projects.js +101 -0
  249. package/dist/mcp/tools/list-projects.js.map +1 -0
  250. package/dist/mcp/tools/list-specs.d.ts +2 -0
  251. package/dist/mcp/tools/list-specs.d.ts.map +1 -0
  252. package/dist/mcp/tools/list-specs.js +48 -0
  253. package/dist/mcp/tools/list-specs.js.map +1 -0
  254. package/dist/mcp/tools/playbook.d.ts +2 -0
  255. package/dist/mcp/tools/playbook.d.ts.map +1 -0
  256. package/dist/mcp/tools/playbook.js +104 -0
  257. package/dist/mcp/tools/playbook.js.map +1 -0
  258. package/dist/mcp/tools/postmortem.d.ts +2 -0
  259. package/dist/mcp/tools/postmortem.d.ts.map +1 -0
  260. package/dist/mcp/tools/postmortem.js +75 -0
  261. package/dist/mcp/tools/postmortem.js.map +1 -0
  262. package/dist/mcp/tools/react.js +1 -1
  263. package/dist/mcp/tools/react.js.map +1 -1
  264. package/dist/mcp/tools/reject-checkpoint.d.ts +2 -0
  265. package/dist/mcp/tools/reject-checkpoint.d.ts.map +1 -0
  266. package/dist/mcp/tools/reject-checkpoint.js +79 -0
  267. package/dist/mcp/tools/reject-checkpoint.js.map +1 -0
  268. package/dist/mcp/tools/rollback.d.ts +2 -0
  269. package/dist/mcp/tools/rollback.d.ts.map +1 -0
  270. package/dist/mcp/tools/rollback.js +78 -0
  271. package/dist/mcp/tools/rollback.js.map +1 -0
  272. package/dist/mcp/tools/run-in-worktree.d.ts +2 -0
  273. package/dist/mcp/tools/run-in-worktree.d.ts.map +1 -0
  274. package/dist/mcp/tools/run-in-worktree.js +90 -0
  275. package/dist/mcp/tools/run-in-worktree.js.map +1 -0
  276. package/dist/mcp/tools/run.js +1 -1
  277. package/dist/mcp/tools/run.js.map +1 -1
  278. package/dist/mcp/tools/solidity.js +1 -1
  279. package/dist/mcp/tools/solidity.js.map +1 -1
  280. package/dist/mcp/tools/status.d.ts.map +1 -1
  281. package/dist/mcp/tools/status.js +11 -0
  282. package/dist/mcp/tools/status.js.map +1 -1
  283. package/dist/mcp/tools/subscribe-events.d.ts +2 -0
  284. package/dist/mcp/tools/subscribe-events.d.ts.map +1 -0
  285. package/dist/mcp/tools/subscribe-events.js +48 -0
  286. package/dist/mcp/tools/subscribe-events.js.map +1 -0
  287. package/dist/mcp/tools/unsubscribe-events.d.ts +2 -0
  288. package/dist/mcp/tools/unsubscribe-events.d.ts.map +1 -0
  289. package/dist/mcp/tools/unsubscribe-events.js +45 -0
  290. package/dist/mcp/tools/unsubscribe-events.js.map +1 -0
  291. package/dist/orchestrator/agent-loader.d.ts +16 -0
  292. package/dist/orchestrator/agent-loader.d.ts.map +1 -1
  293. package/dist/orchestrator/agent-loader.js +16 -0
  294. package/dist/orchestrator/agent-loader.js.map +1 -1
  295. package/dist/orchestrator/architect-agent.d.ts.map +1 -1
  296. package/dist/orchestrator/architect-agent.js +37 -8
  297. package/dist/orchestrator/architect-agent.js.map +1 -1
  298. package/dist/orchestrator/checkpoints/audit.d.ts +128 -0
  299. package/dist/orchestrator/checkpoints/audit.d.ts.map +1 -0
  300. package/dist/orchestrator/checkpoints/audit.js +272 -0
  301. package/dist/orchestrator/checkpoints/audit.js.map +1 -0
  302. package/dist/orchestrator/checkpoints/feedback-router.d.ts +213 -0
  303. package/dist/orchestrator/checkpoints/feedback-router.d.ts.map +1 -0
  304. package/dist/orchestrator/checkpoints/feedback-router.js +438 -0
  305. package/dist/orchestrator/checkpoints/feedback-router.js.map +1 -0
  306. package/dist/orchestrator/checkpoints/index.d.ts +11 -0
  307. package/dist/orchestrator/checkpoints/index.d.ts.map +1 -0
  308. package/dist/orchestrator/checkpoints/index.js +12 -0
  309. package/dist/orchestrator/checkpoints/index.js.map +1 -0
  310. package/dist/orchestrator/checkpoints/mechanisms/cli.d.ts +35 -0
  311. package/dist/orchestrator/checkpoints/mechanisms/cli.d.ts.map +1 -0
  312. package/dist/orchestrator/checkpoints/mechanisms/cli.js +153 -0
  313. package/dist/orchestrator/checkpoints/mechanisms/cli.js.map +1 -0
  314. package/dist/orchestrator/checkpoints/mechanisms/disk.d.ts +34 -0
  315. package/dist/orchestrator/checkpoints/mechanisms/disk.d.ts.map +1 -0
  316. package/dist/orchestrator/checkpoints/mechanisms/disk.js +139 -0
  317. package/dist/orchestrator/checkpoints/mechanisms/disk.js.map +1 -0
  318. package/dist/orchestrator/checkpoints/mechanisms/pr.d.ts +141 -0
  319. package/dist/orchestrator/checkpoints/mechanisms/pr.d.ts.map +1 -0
  320. package/dist/orchestrator/checkpoints/mechanisms/pr.js +445 -0
  321. package/dist/orchestrator/checkpoints/mechanisms/pr.js.map +1 -0
  322. package/dist/orchestrator/checkpoints/noop.d.ts +12 -0
  323. package/dist/orchestrator/checkpoints/noop.d.ts.map +1 -0
  324. package/dist/orchestrator/checkpoints/noop.js +13 -0
  325. package/dist/orchestrator/checkpoints/noop.js.map +1 -0
  326. package/dist/orchestrator/checkpoints/registry.d.ts +48 -0
  327. package/dist/orchestrator/checkpoints/registry.d.ts.map +1 -0
  328. package/dist/orchestrator/checkpoints/registry.js +89 -0
  329. package/dist/orchestrator/checkpoints/registry.js.map +1 -0
  330. package/dist/orchestrator/checkpoints/renderers/_util.d.ts +50 -0
  331. package/dist/orchestrator/checkpoints/renderers/_util.d.ts.map +1 -0
  332. package/dist/orchestrator/checkpoints/renderers/_util.js +137 -0
  333. package/dist/orchestrator/checkpoints/renderers/_util.js.map +1 -0
  334. package/dist/orchestrator/checkpoints/renderers/code-review.d.ts +15 -0
  335. package/dist/orchestrator/checkpoints/renderers/code-review.d.ts.map +1 -0
  336. package/dist/orchestrator/checkpoints/renderers/code-review.js +66 -0
  337. package/dist/orchestrator/checkpoints/renderers/code-review.js.map +1 -0
  338. package/dist/orchestrator/checkpoints/renderers/curator-briefing.d.ts +15 -0
  339. package/dist/orchestrator/checkpoints/renderers/curator-briefing.d.ts.map +1 -0
  340. package/dist/orchestrator/checkpoints/renderers/curator-briefing.js +40 -0
  341. package/dist/orchestrator/checkpoints/renderers/curator-briefing.js.map +1 -0
  342. package/dist/orchestrator/checkpoints/renderers/eval-result.d.ts +15 -0
  343. package/dist/orchestrator/checkpoints/renderers/eval-result.d.ts.map +1 -0
  344. package/dist/orchestrator/checkpoints/renderers/eval-result.js +54 -0
  345. package/dist/orchestrator/checkpoints/renderers/eval-result.js.map +1 -0
  346. package/dist/orchestrator/checkpoints/renderers/generator-diff.d.ts +49 -0
  347. package/dist/orchestrator/checkpoints/renderers/generator-diff.d.ts.map +1 -0
  348. package/dist/orchestrator/checkpoints/renderers/generator-diff.js +154 -0
  349. package/dist/orchestrator/checkpoints/renderers/generator-diff.js.map +1 -0
  350. package/dist/orchestrator/checkpoints/renderers/pipeline-summary.d.ts +15 -0
  351. package/dist/orchestrator/checkpoints/renderers/pipeline-summary.d.ts.map +1 -0
  352. package/dist/orchestrator/checkpoints/renderers/pipeline-summary.js +59 -0
  353. package/dist/orchestrator/checkpoints/renderers/pipeline-summary.js.map +1 -0
  354. package/dist/orchestrator/checkpoints/renderers/plan.d.ts +15 -0
  355. package/dist/orchestrator/checkpoints/renderers/plan.d.ts.map +1 -0
  356. package/dist/orchestrator/checkpoints/renderers/plan.js +34 -0
  357. package/dist/orchestrator/checkpoints/renderers/plan.js.map +1 -0
  358. package/dist/orchestrator/checkpoints/renderers/registry.d.ts +43 -0
  359. package/dist/orchestrator/checkpoints/renderers/registry.d.ts.map +1 -0
  360. package/dist/orchestrator/checkpoints/renderers/registry.js +83 -0
  361. package/dist/orchestrator/checkpoints/renderers/registry.js.map +1 -0
  362. package/dist/orchestrator/checkpoints/renderers/research.d.ts +15 -0
  363. package/dist/orchestrator/checkpoints/renderers/research.d.ts.map +1 -0
  364. package/dist/orchestrator/checkpoints/renderers/research.js +39 -0
  365. package/dist/orchestrator/checkpoints/renderers/research.js.map +1 -0
  366. package/dist/orchestrator/checkpoints/renderers/sprint-contract.d.ts +20 -0
  367. package/dist/orchestrator/checkpoints/renderers/sprint-contract.d.ts.map +1 -0
  368. package/dist/orchestrator/checkpoints/renderers/sprint-contract.js +57 -0
  369. package/dist/orchestrator/checkpoints/renderers/sprint-contract.js.map +1 -0
  370. package/dist/orchestrator/checkpoints/renderers/sprint-summary.d.ts +15 -0
  371. package/dist/orchestrator/checkpoints/renderers/sprint-summary.d.ts.map +1 -0
  372. package/dist/orchestrator/checkpoints/renderers/sprint-summary.js +38 -0
  373. package/dist/orchestrator/checkpoints/renderers/sprint-summary.js.map +1 -0
  374. package/dist/orchestrator/checkpoints/sites.d.ts +22 -0
  375. package/dist/orchestrator/checkpoints/sites.d.ts.map +1 -0
  376. package/dist/orchestrator/checkpoints/sites.js +57 -0
  377. package/dist/orchestrator/checkpoints/sites.js.map +1 -0
  378. package/dist/orchestrator/checkpoints/types.d.ts +51 -0
  379. package/dist/orchestrator/checkpoints/types.d.ts.map +1 -0
  380. package/dist/orchestrator/checkpoints/types.js +9 -0
  381. package/dist/orchestrator/checkpoints/types.js.map +1 -0
  382. package/dist/orchestrator/code-reviewer-agent.d.ts +50 -0
  383. package/dist/orchestrator/code-reviewer-agent.d.ts.map +1 -0
  384. package/dist/orchestrator/code-reviewer-agent.js +283 -0
  385. package/dist/orchestrator/code-reviewer-agent.js.map +1 -0
  386. package/dist/orchestrator/curator-agent.d.ts.map +1 -1
  387. package/dist/orchestrator/curator-agent.js +59 -8
  388. package/dist/orchestrator/curator-agent.js.map +1 -1
  389. package/dist/orchestrator/deploy/classify.d.ts +31 -0
  390. package/dist/orchestrator/deploy/classify.d.ts.map +1 -0
  391. package/dist/orchestrator/deploy/classify.js +109 -0
  392. package/dist/orchestrator/deploy/classify.js.map +1 -0
  393. package/dist/orchestrator/deploy/execute.d.ts +45 -0
  394. package/dist/orchestrator/deploy/execute.d.ts.map +1 -0
  395. package/dist/orchestrator/deploy/execute.js +146 -0
  396. package/dist/orchestrator/deploy/execute.js.map +1 -0
  397. package/dist/orchestrator/deploy/executor.d.ts +22 -0
  398. package/dist/orchestrator/deploy/executor.d.ts.map +1 -0
  399. package/dist/orchestrator/deploy/executor.js +31 -0
  400. package/dist/orchestrator/deploy/executor.js.map +1 -0
  401. package/dist/orchestrator/deploy/index.d.ts +21 -0
  402. package/dist/orchestrator/deploy/index.d.ts.map +1 -0
  403. package/dist/orchestrator/deploy/index.js +21 -0
  404. package/dist/orchestrator/deploy/index.js.map +1 -0
  405. package/dist/orchestrator/deploy/resolve.d.ts +51 -0
  406. package/dist/orchestrator/deploy/resolve.d.ts.map +1 -0
  407. package/dist/orchestrator/deploy/resolve.js +53 -0
  408. package/dist/orchestrator/deploy/resolve.js.map +1 -0
  409. package/dist/orchestrator/deploy/spawn.d.ts +60 -0
  410. package/dist/orchestrator/deploy/spawn.d.ts.map +1 -0
  411. package/dist/orchestrator/deploy/spawn.js +62 -0
  412. package/dist/orchestrator/deploy/spawn.js.map +1 -0
  413. package/dist/orchestrator/deploy/types.d.ts +98 -0
  414. package/dist/orchestrator/deploy/types.d.ts.map +1 -0
  415. package/dist/orchestrator/deploy/types.js +39 -0
  416. package/dist/orchestrator/deploy/types.js.map +1 -0
  417. package/dist/orchestrator/evaluator-agent.d.ts.map +1 -1
  418. package/dist/orchestrator/evaluator-agent.js +21 -8
  419. package/dist/orchestrator/evaluator-agent.js.map +1 -1
  420. package/dist/orchestrator/generator-agent.d.ts.map +1 -1
  421. package/dist/orchestrator/generator-agent.js +21 -8
  422. package/dist/orchestrator/generator-agent.js.map +1 -1
  423. package/dist/orchestrator/model-resolver.d.ts.map +1 -1
  424. package/dist/orchestrator/model-resolver.js +3 -1
  425. package/dist/orchestrator/model-resolver.js.map +1 -1
  426. package/dist/orchestrator/observability/index.d.ts +12 -0
  427. package/dist/orchestrator/observability/index.d.ts.map +1 -0
  428. package/dist/orchestrator/observability/index.js +12 -0
  429. package/dist/orchestrator/observability/index.js.map +1 -0
  430. package/dist/orchestrator/observability/merge.d.ts +73 -0
  431. package/dist/orchestrator/observability/merge.d.ts.map +1 -0
  432. package/dist/orchestrator/observability/merge.js +110 -0
  433. package/dist/orchestrator/observability/merge.js.map +1 -0
  434. package/dist/orchestrator/pipeline.d.ts +21 -0
  435. package/dist/orchestrator/pipeline.d.ts.map +1 -1
  436. package/dist/orchestrator/pipeline.js +156 -2
  437. package/dist/orchestrator/pipeline.js.map +1 -1
  438. package/dist/orchestrator/planner-agent.d.ts.map +1 -1
  439. package/dist/orchestrator/planner-agent.js +5 -4
  440. package/dist/orchestrator/planner-agent.js.map +1 -1
  441. package/dist/orchestrator/research-agent.d.ts.map +1 -1
  442. package/dist/orchestrator/research-agent.js +46 -9
  443. package/dist/orchestrator/research-agent.js.map +1 -1
  444. package/dist/orchestrator/tools/handlers.d.ts +2 -0
  445. package/dist/orchestrator/tools/handlers.d.ts.map +1 -1
  446. package/dist/orchestrator/tools/handlers.js +1 -1
  447. package/dist/orchestrator/tools/handlers.js.map +1 -1
  448. package/dist/orchestrator/tools/index.d.ts +84 -1
  449. package/dist/orchestrator/tools/index.d.ts.map +1 -1
  450. package/dist/orchestrator/tools/index.js +164 -1
  451. package/dist/orchestrator/tools/index.js.map +1 -1
  452. package/dist/orchestrator/worktree.d.ts +18 -0
  453. package/dist/orchestrator/worktree.d.ts.map +1 -0
  454. package/dist/orchestrator/worktree.js +129 -0
  455. package/dist/orchestrator/worktree.js.map +1 -0
  456. package/dist/providers/anthropic.d.ts +8 -1
  457. package/dist/providers/anthropic.d.ts.map +1 -1
  458. package/dist/providers/anthropic.js +86 -5
  459. package/dist/providers/anthropic.js.map +1 -1
  460. package/dist/providers/factory.d.ts.map +1 -1
  461. package/dist/providers/factory.js +35 -2
  462. package/dist/providers/factory.js.map +1 -1
  463. package/dist/providers/google.d.ts.map +1 -1
  464. package/dist/providers/google.js +5 -0
  465. package/dist/providers/google.js.map +1 -1
  466. package/dist/providers/index.d.ts +1 -1
  467. package/dist/providers/index.d.ts.map +1 -1
  468. package/dist/providers/index.js.map +1 -1
  469. package/dist/providers/openai.d.ts.map +1 -1
  470. package/dist/providers/openai.js +4 -0
  471. package/dist/providers/openai.js.map +1 -1
  472. package/dist/providers/types.d.ts +25 -2
  473. package/dist/providers/types.d.ts.map +1 -1
  474. package/dist/state/approval-state.d.ts +74 -0
  475. package/dist/state/approval-state.d.ts.map +1 -0
  476. package/dist/state/approval-state.js +127 -0
  477. package/dist/state/approval-state.js.map +1 -0
  478. package/dist/state/index.d.ts +3 -0
  479. package/dist/state/index.d.ts.map +1 -1
  480. package/dist/state/index.js +4 -1
  481. package/dist/state/index.js.map +1 -1
  482. package/dist/state/review-state.d.ts +15 -0
  483. package/dist/state/review-state.d.ts.map +1 -0
  484. package/dist/state/review-state.js +51 -0
  485. package/dist/state/review-state.js.map +1 -0
  486. package/dist/state/run-state.d.ts +39 -0
  487. package/dist/state/run-state.d.ts.map +1 -0
  488. package/dist/state/run-state.js +101 -0
  489. package/dist/state/run-state.js.map +1 -0
  490. package/dist/telemetry/emit.d.ts +41 -0
  491. package/dist/telemetry/emit.d.ts.map +1 -0
  492. package/dist/telemetry/emit.js +65 -0
  493. package/dist/telemetry/emit.js.map +1 -0
  494. package/dist/utils/git.d.ts +27 -0
  495. package/dist/utils/git.d.ts.map +1 -1
  496. package/dist/utils/git.js +50 -0
  497. package/dist/utils/git.js.map +1 -1
  498. package/hooks/hooks.json +17 -1
  499. package/hooks/session-start +42 -0
  500. package/package.json +5 -2
  501. package/scripts/check-prereqs.sh +12 -0
  502. package/scripts/e2e-graph-smoke.sh +167 -0
  503. package/scripts/graph-hook.mjs +151 -0
  504. package/scripts/run-kpi-gate.mjs +245 -0
  505. package/scripts/sync-skills.mjs +4 -1
  506. package/skills/bober.code-review/SKILL.md +186 -0
  507. package/skills/bober.debug/SKILL.md +300 -0
  508. package/skills/bober.deploy/SKILL.md +262 -0
  509. package/skills/bober.diagnose/SKILL.md +254 -0
  510. package/skills/bober.graph/SKILL.md +85 -0
  511. package/skills/bober.impact/SKILL.md +101 -0
  512. package/skills/bober.incident/SKILL.md +245 -0
  513. package/skills/bober.onboard/SKILL.md +84 -0
  514. package/skills/bober.plan/SKILL.md +10 -0
  515. package/skills/bober.postmortem/SKILL.md +231 -0
  516. package/skills/bober.runbook/SKILL.md +335 -0
  517. package/skills/bober.using-bober/SKILL.md +133 -0
  518. package/skills/bober.verify/SKILL.md +143 -0
@@ -0,0 +1,245 @@
1
+ ---
2
+ name: bober-incident
3
+ description: Use when responding to a production incident or system-level failure — kicks off the incident pipeline (diagnose → propose actions → deploy with gates → verify resolution → postmortem). The top-level entry that routes between bober-diagnoser, bober-deployer, and bober-postmortemer based on incident phase.
4
+ ---
5
+
6
+ # Top-Level Incident Response
7
+
8
+ ## Overview
9
+
10
+ This skill governs the **full incident lifecycle** — from the first symptom report through root-cause diagnosis, remediation execution, resolution verification, and postmortem synthesis. It is the entry point that routes between all Tier 3 sub-disciplines.
11
+
12
+ The lifecycle is **phased and deterministic**. Each phase transition is driven by the output of a sub-skill (diagnoser, deployer, verifier) and gated by the incident state machine. No phase can be skipped. No resolution can bypass verification. This is the architecture that prevents "I fixed it" from meaning "I changed something and it seems better now."
13
+
14
+ Key architectural invariants:
15
+ - Every incident has a timeline (`timeline.jsonl`) from creation to resolution.
16
+ - Every destructive action passes through a checkpoint gate before execution.
17
+ - Every resolution requires a verifiable artifact (metric evidence or an override token with an audit trail).
18
+ - Every resolved incident triggers a postmortem automatically.
19
+
20
+ This skill does **not** replace `bober.diagnose`, `bober.deploy`, `bober.runbook`, or `bober.postmortem`. It orchestrates them.
21
+
22
+ ## The Iron Law
23
+
24
+ ```
25
+ NO INCIDENT WITHOUT TIMELINE; NO RESOLUTION WITHOUT VERIFICATION
26
+ ```
27
+
28
+ Both clauses are unconditional. They do not have exceptions for urgency, familiarity, or pipeline mode.
29
+
30
+ ## When to Use
31
+
32
+ Use this skill when:
33
+ - A page fires (PagerDuty, OpsGenie, or any on-call alert)
34
+ - An SLO breach is detected (error rate, latency, availability below threshold)
35
+ - A user-reported outage is confirmed by at least one objective signal
36
+ - A deployment causes observable regression (rollout watchdog fires)
37
+ - Any system-level failure requires coordinated diagnosis + remediation
38
+
39
+ Do NOT use this skill for:
40
+ - Planned maintenance (no incident, no postmortem required)
41
+ - Feature work that happens to touch infrastructure
42
+ - Read-only investigation with no remediation intent (use `bober.diagnose` directly)
43
+
44
+ ## Workflow
45
+
46
+ Execute each phase in order. Do not skip phases. Phase transitions are guarded by the incident state machine.
47
+
48
+ ### Phase 1: Start the Incident
49
+
50
+ ```bash
51
+ bober incident start "<symptom>" [--severity S1|S2|S3|S4]
52
+ # Returns: incidentId
53
+ ```
54
+
55
+ This creates the incident artifact directory (`.bober/incidents/<id>/`) with all required files. The incident is immediately in status `investigating`. The incidentId anchors all subsequent artifacts.
56
+
57
+ Severity semantics (informational — does NOT affect routing):
58
+ - **S1** — Total outage; all users affected; no workaround.
59
+ - **S2** — Major degradation; significant user impact; partial workaround available.
60
+ - **S3** — Partial degradation; moderate impact; workaround available.
61
+ - **S4** — Minor issue; limited impact; no immediate user harm.
62
+
63
+ ### Phase 2: Diagnose
64
+
65
+ Invoke the `bober-diagnoser` agent with the incidentId and symptom. The diagnoser:
66
+ 1. Queries observability tools (`obs__*__*`).
67
+ 2. Writes a `diagnoses/<diagnosisId>.json` with hypotheses + nextActions.
68
+ 3. Each nextAction declares `blastRadius: safe | risky`.
69
+
70
+ The incident state machine reads `nextActions`:
71
+ - One or more `risky` actions → transition to `remediating`.
72
+ - No risky actions (or no actions at all) → stay at `investigating`. Operator ends the incident with `bober incident end`.
73
+
74
+ ### Phase 3: Remediate (if nextActions include risky steps)
75
+
76
+ Invoke the `bober-deployer` agent for each risky nextAction.
77
+
78
+ Each action passes through the Sprint 20 gate:
79
+ - Gate mechanism is resolved from `bober.config.json` → `pipeline.checkpointMechanism`.
80
+ - In `careful` mode: operator must explicitly approve each risky action before execution.
81
+ - In `autopilot` mode: gate fires and auto-approves but STILL writes an audit trail.
82
+
83
+ No action is executed without a `ChangeEntry` (with `inverse.description`) written first.
84
+
85
+ After execution, verify resolution:
86
+ ```bash
87
+ bober incident end --verified # if external verification confirms
88
+ bober incident end --override "Investigation concluded; no metric available" # operator override
89
+ ```
90
+
91
+ ### Phase 4: Verify Resolution
92
+
93
+ Resolution requires one of:
94
+ 1. `opts.verifyResult.verified === true` — metric confirmation from `verifyResolution()`.
95
+ 2. `opts.overrideToken = 'SKIP_METRIC_VERIFY: <reason>'` — operator asserts resolution with documented reason.
96
+
97
+ Neither path can be skipped. The gate is enforced in `setIncidentStatus` (Sprint 22).
98
+
99
+ ### Phase 5: Postmortem
100
+
101
+ On transition to `resolved`, Sprint 23's auto-trigger fires:
102
+ - `generatePostmortem(projectRoot, incidentId)` synthesizes `postmortem.md` from all artifacts.
103
+ - The postmortemPath is written to `incident.json`.
104
+
105
+ The postmortem is automatic. Operators can view or regenerate:
106
+ ```bash
107
+ bober postmortem show <incidentId>
108
+ bober postmortem generate <incidentId> # re-synthesize
109
+ ```
110
+
111
+ ## Slash Command Flow (/bober-incident)
112
+
113
+ When a user invokes `/bober-incident` from Claude Code:
114
+
115
+ 1. **If no symptom provided in the invocation:**
116
+ - Prompt: "What is the symptom or alert? (e.g., '500 errors on checkout endpoint', 'p99 latency >3s on API gateway')"
117
+ - Wait for a clear, specific symptom description before proceeding.
118
+ - Do NOT proceed with a vague symptom like "something is wrong".
119
+
120
+ 2. **If symptom is provided:**
121
+ - Run: `bober incident start "<symptom>" [--severity <S1|S2|S3|S4>]`
122
+ - Surface the incidentId to the user immediately.
123
+ - Transition to diagnosis phase.
124
+
125
+ 3. **At each phase transition:**
126
+ - Announce the transition clearly: "Phase transition: investigating → remediating"
127
+ - Display the incidentId so the operator can track state.
128
+ - Surface any gate approvals required before proceeding.
129
+
130
+ 4. **Output format:**
131
+ - Use markdown headers for phases.
132
+ - Use code blocks for commands.
133
+ - Use bold for incidentId and phase names.
134
+ - Show `bober incident status <id>` output at each transition.
135
+
136
+ Example invocation flow:
137
+ ```
138
+ /bober-incident 500 errors spiking on checkout endpoint
139
+
140
+ → Incident created: inc-20260524-500-errors-on
141
+ → Phase: investigating
142
+ → Severity: S2 (user-visible checkout failure)
143
+
144
+ [Diagnoser output: connection pool exhausted after migration 042]
145
+
146
+ → Phase transition: investigating → remediating
147
+ → Risky actions proposed: 2
148
+
149
+ 1. Scale deployment api 3→6 replicas (risky)
150
+ 2. Disable flag new_checkout_flow (risky)
151
+
152
+ [Gate approval required for each step]
153
+ ```
154
+
155
+ ## Phase Transition Diagram
156
+
157
+ ```
158
+ ┌──────────────────────────────────────────────────────┐
159
+ │ │
160
+ ▼ │
161
+ ┌───────────────┐ │
162
+ │ investigating │ │
163
+ └───────┬───────┘ │
164
+ │ │
165
+ diagnoser produces │
166
+ nextActions with │
167
+ ≥1 risky │
168
+ │ │
169
+ ▼ │
170
+ ┌───────────────┐ │
171
+ │ remediating │ │
172
+ └───────┬───────┘ │
173
+ │ │
174
+ all proposed actions executed │
175
+ + postcondition passed │
176
+ │ │
177
+ ▼ │
178
+ ┌───────────────┐ ──── verifyResolution fails ─────────────────┤
179
+ │ monitoring │ │
180
+ └───────┬───────┘ │
181
+ │ │
182
+ verifyResolution.verified=true │
183
+ for criteria.windowMinutes │
184
+ │ │
185
+ ▼ │
186
+ ┌───────────────┐ ──── user re-opens (reason REQUIRED) ────────┘
187
+ │ resolved │
188
+ └───────────────┘ (auto-postmortem triggered by setIncidentStatus)
189
+
190
+ At any phase: user issues `bober incident abort <id> --reason <text> [--confirm-rollback]`
191
+ ──────────────────────────────────────► aborted (terminal)
192
+ ```
193
+
194
+ State machine constraints enforced by `transitionPhase()` in `src/incident/orchestrator.ts`:
195
+ - `aborted` is **terminal**: no transitions out.
196
+ - `resolved → remediating` is **forbidden** (must re-open to `investigating` first).
197
+ - `resolved → investigating` requires an explicit `reason` (re-open path).
198
+ - All other transitions follow the table exactly; invalid transitions throw `InvalidTransitionError`.
199
+
200
+ ## Red Flags - STOP and Follow Process
201
+
202
+ Encountering any of these signals means the incident is being handled incorrectly. STOP the current action and follow the documented path.
203
+
204
+ - **About to mark resolved without a verifyResult or overrideToken.** Resolution without evidence is conjecture. Use `--verified` or `--override <reason>` — never skip the gate.
205
+ - **About to execute a rollback without `--confirm-rollback`.** Silent rollback is a footgun. Rollback changes system state; it must be explicit. If you want rollback, use `bober incident abort <id> --reason <text> --confirm-rollback`.
206
+ - **About to run a risky action directly in the shell, bypassing `executeAction`.** Any command that modifies system state MUST go through the deploy gate so an inverse is recorded. No exceptions for "trivial" changes.
207
+ - **About to batch-approve multiple risky actions in a single gate invocation.** Each risky action requires its own checkpoint approval. Per-step gates exist to prevent "approve all" disasters.
208
+ - **About to close an incident without a timeline event.** Every phase transition and every action MUST be recorded in `timeline.jsonl`. Closing an incident with an empty timeline means the postmortem will have no evidence to synthesize.
209
+ - **About to re-open a resolved incident without a reason.** The re-open path (`resolved → investigating`) requires an explicit reason. A reason-less re-open erases the audit trail of why the incident was re-opened.
210
+ - **About to skip the diagnoser and go straight to remediation.** "I know what's wrong" is the most dangerous statement in incident response. Run the diagnoser first to document hypotheses.
211
+
212
+ ## Common Rationalizations
213
+
214
+ | Rationalization | Why It's Wrong |
215
+ |----------------|---------------|
216
+ | "I know what's wrong — skipping diagnosis to save time." | Without documented hypotheses, the postmortem will have no root cause. Skipping diagnosis means you cannot verify the fix addressed the actual cause. |
217
+ | "The metric is unavailable but I know it's resolved." | Use `--override <reason>` with a documented reason. This creates an audit trail. Do NOT skip the gate entirely — the `resolved` gate exists to prevent wishful resolution. |
218
+ | "It's a tiny change — the gate is overkill." | The gate's cost is one approval. The cost of an ungated risky change to production is a potential second incident. Classify risky when in doubt. |
219
+ | "The rollback will fix the abort side-effects automatically." | Rollback must be explicitly confirmed with `--confirm-rollback`. Silent rollback could make the situation worse. Document the abort reason first; then decide on rollback separately. |
220
+ | "I'll write the postmortem later when I have more time." | The postmortem auto-triggers on `resolved`. If you are deferring it, you are either not marking the incident resolved or suppressing auto-generation. Both are process violations. |
221
+ | "We don't need a severity — it's obvious." | Severity is metadata that feeds into postmortem priority, SLO budgets, and escalation decisions. Set it at `bober incident start` so downstream tooling can use it. |
222
+
223
+ ## Quick Reference
224
+
225
+ | Question | Answer |
226
+ |---------|--------|
227
+ | How do I start a Severity 1 incident? | `bober incident start "<symptom>" --severity S1` |
228
+ | How do I check the current phase? | `bober incident status <id>` |
229
+ | How do I end an incident after external verification? | `bober incident end <id> --verified` |
230
+ | How do I end an incident when no metric is available? | `bober incident end <id> --override "reason here"` |
231
+ | How do I abort without rolling back? | `bober incident abort <id> --reason "<text>"` |
232
+ | How do I abort AND roll back? | `bober incident abort <id> --reason "<text>" --confirm-rollback` |
233
+ | How do I re-open a resolved incident? | `bober incident start "<symptom>"` (new incident) OR `transitionPhase(..., 'investigating', { reason })` programmatically |
234
+ | Where are the artifacts? | `.bober/incidents/<incidentId>/` |
235
+ | What gates a risky action? | `resolveRiskyActionMechanismName()` → disk/cli/pr/noop per `bober.config.json` |
236
+ | When is the postmortem generated? | Automatically when `setIncidentStatus(_, _, 'resolved', ...)` is called |
237
+
238
+ ## Related Skills
239
+
240
+ | Skill | Use when |
241
+ |-------|---------|
242
+ | [`bober.diagnose`](../bober.diagnose/SKILL.md) | Running the 4-phase root-cause investigation. Invoked by `/bober-incident` after `start`. |
243
+ | [`bober.deploy`](../bober.deploy/SKILL.md) | Executing a remediation action with gate discipline. Invoked for each risky nextAction. |
244
+ | [`bober.runbook`](../bober.runbook/SKILL.md) | Executing a known remediation procedure step-by-step. Runbook steps delegate to `bober.deploy` for risky steps. |
245
+ | [`bober.postmortem`](../bober.postmortem/SKILL.md) | Synthesizing the incident postmortem after resolution. Auto-triggered; also available manually via `bober postmortem generate <id>`. |
@@ -0,0 +1,84 @@
1
+ ---
2
+ name: bober.onboard
3
+ description: Generate onboarding documentation from the code graph — architecture overview, hotspots, knowledge gaps, and communities. Writes 5 markdown files to .bober/onboarding/.
4
+ handoffs:
5
+ - label: "Analyse Impact"
6
+ command: /bober-impact
7
+ prompt: "Analyse the impact radius of a hotspot symbol"
8
+ - label: "Plan Feature"
9
+ command: /bober-plan
10
+ prompt: "Plan a feature using onboarding context"
11
+ ---
12
+
13
+ # bober.onboard — Onboarding Documentation Skill
14
+
15
+ You are running the **bober.onboard** skill. Your job is to generate a complete set of onboarding documents for this codebase using the code graph.
16
+
17
+ ## What This Skill Produces
18
+
19
+ Five markdown files in `.bober/onboarding/`:
20
+
21
+ 1. **README.md** — entry point with links to all other documents
22
+ 2. **architecture-overview.md** — public API per module, sorted alphabetically
23
+ 3. **hotspots.md** — high-complexity symbols worth reviewing (table with score + reason)
24
+ 4. **knowledge-gaps.md** — potentially unused (dead code) + public APIs without internal callers
25
+ 5. **communities.md** — module groupings by community
26
+
27
+ ## Prerequisites
28
+
29
+ - `graph.enabled: true` in `bober.config.json`
30
+ - `tokensave` >= 6.0.0-beta.1 installed
31
+ - Graph must be initialised (`agent-bober graph init`)
32
+
33
+ ## Running via CLI
34
+
35
+ ```bash
36
+ agent-bober onboard
37
+ ```
38
+
39
+ This command:
40
+ 1. Starts a short-lived tokensave engine
41
+ 2. Queries the graph for status, hotspots, dead code, circular deps, module APIs, and file inventory
42
+ 3. Passes results to the OnboardingComposer renderer
43
+ 4. Writes all 5 files to `.bober/onboarding/`
44
+ 5. Prints a summary table with file paths and sizes
45
+
46
+ Expected output:
47
+ ```
48
+ Starting graph engine...
49
+ Querying code graph...
50
+ Writing artifacts to .bober/onboarding/...
51
+
52
+ Onboarding artifacts written:
53
+
54
+ .bober/onboarding/README.md <size> bytes
55
+ .bober/onboarding/architecture-overview.md <size> bytes
56
+ .bober/onboarding/hotspots.md <size> bytes
57
+ .bober/onboarding/knowledge-gaps.md <size> bytes
58
+ .bober/onboarding/communities.md <size> bytes
59
+
60
+ 5 files written (<total> bytes total)
61
+ ```
62
+
63
+ ## Running via MCP Tools (Alternative)
64
+
65
+ You can also produce equivalent onboarding content directly using the MCP tools:
66
+
67
+ 1. Get architecture overview: `get_architecture_overview`
68
+ 2. Find hotspots: `semantic_search_nodes` with query `"hotspots high complexity"`
69
+ 3. Find dead code: `semantic_search_nodes` with query `"dead code unused symbols"`
70
+ 4. Find communities: `list_communities` (if available) or `get_architecture_overview`
71
+
72
+ Format the results using the same structure as the generated documents and write to `.bober/onboarding/`.
73
+
74
+ ## Re-running
75
+
76
+ The command is safe to re-run. Files with the generation marker are updated in-place (preserving any content you wrote above the marker). Files without the marker are refused to prevent overwriting manual edits.
77
+
78
+ To force a fresh generation, delete the files in `.bober/onboarding/` and re-run.
79
+
80
+ ## Error Handling
81
+
82
+ - If graph.enabled=false: exits 1 with instructions to enable it
83
+ - If tokensave missing: exits 1 with install hint
84
+ - If a file lacks the generation marker: exits with an error explaining which file needs attention
@@ -152,6 +152,16 @@ After receiving the user's answers, generate a complete PlanSpec. Follow the sch
152
152
  7. **Non-functional requirements:** Performance, security, accessibility, reliability considerations
153
153
  8. **Tech notes:** Integration points, data model overview, security considerations
154
154
 
155
+ <HARD-GATE>
156
+ Do NOT write any .bober/contracts/*.json file until one of the following has happened:
157
+
158
+ 1. INTERACTIVE protocol — the user has explicitly approved the assumptions and outOfScope sections above. Record approval as a resolvedClarifications entry with questionId='gate-design-approval' and the user's verbatim approval in the answer field.
159
+
160
+ 2. AUTONOMOUS protocol — every assumption in the spec is backed by cited evidence (minimum: a file path; preferred: file:line). Record self-approval as resolvedClarifications entry with questionId='gate-design-approval', answer='Autonomous self-approval', resolvedBy='planner', and metadata.approvalEvidence field listing the cited file paths.
161
+
162
+ Violating this gate produces orphan contracts that diverge from the spec. Discovered violations result in contracts being deleted and spec status reverted to 'needs-clarification'.
163
+ </HARD-GATE>
164
+
155
165
  ## Step 6: Decompose into Sprint Contracts
156
166
 
157
167
  Decompose the PlanSpec into ordered sprints. This is the most critical step.
@@ -0,0 +1,231 @@
1
+ ---
2
+ name: bober-postmortem
3
+ description: Use after an incident is resolved to synthesize an evidence-cited postmortem from .bober/incidents/<id>/ artifacts — chronological timeline, 5-Whys from diagnoses, contributing factors from runbook execution, action items from gaps in process. Pure offline synthesis; no live observability access.
4
+ ---
5
+
6
+ # Postmortem Synthesis Discipline
7
+
8
+ ## Overview
9
+
10
+ A postmortem is a document of record. It is read by people who weren't in the room — sometimes months later, sometimes by auditors. Postmortems that contain opinion without evidence become political artifacts; postmortems that cite every claim become institutional memory.
11
+
12
+ **Core principle:** Every postmortem sentence traces to a specific artifact in `.bober/incidents/<id>/`. Citations are mandatory. Speculation is forbidden.
13
+
14
+ **Violating the letter of this discipline is violating the spirit of incident learning.**
15
+
16
+ ## The Iron Law
17
+
18
+ ```
19
+ NO POSTMORTEM SECTION WITHOUT EVIDENCE FROM INCIDENT ARTIFACTS
20
+ ```
21
+
22
+ Every non-template claim cites an artifact path (and line number where applicable). A section with no citations is a section that should not exist — or a section whose contents were fabricated. Either way: failure.
23
+
24
+ ## When to Use
25
+
26
+ Use this skill when:
27
+ - An incident transitions to `status: 'resolved'` (Sprint 22 gate)
28
+ - A human runs `bober postmortem generate <incidentId>` to (re)synthesize a postmortem
29
+ - An auditor needs to reconstruct the incident from artifact records
30
+
31
+ Do NOT use this skill for:
32
+ - Active incident response (use `bober.diagnose`)
33
+ - Remediation execution (use `bober.deploy`)
34
+ - Runbook authoring (use `bober.runbook`)
35
+
36
+ ## Synthesis Order
37
+
38
+ Read the following artifacts in EXACTLY this order. Earlier files seed later sections.
39
+
40
+ 1. **`incident.json`** — metadata: incidentId, symptom, createdAt, resolvedAt, status, resolutionCriteria, resolutionEvidence. The header block of the postmortem comes entirely from this file.
41
+ 2. **`timeline.jsonl`** — chronological master log. Walk linearly to construct the Timeline table. Each row carries `(timeline.jsonl#L<n>)` as its citation.
42
+ 3. **`observations.jsonl`** — verified facts. `phase: 1-2 + verified: true` rows seed the Impact section. `phase: 4` rows confirm Resolution.
43
+ 4. **`diagnoses/*.json`** — DiagnosisResult records (Sprint 15 schema). Sort by mtime descending; the most-recent diagnosis's highest-confidence hypothesis is the root-cause candidate for Why-2.
44
+ 5. **`changelog.jsonl`** — ChangeEntry records (with required inverse field, Sprint 21). Each entry within 30 minutes before incident `createdAt` is a Why-4/Why-5 candidate.
45
+ 6. **`runbook-execution.jsonl`** — RunbookExecutionEntry records. Failed steps populate Contributing Factors; successful steps populate What Went Well.
46
+ 7. **`actions.jsonl`** — ActionEntry records (safe + risky). Risky actions without preceding precondition pass become What Went Wrong entries.
47
+ 8. **`resolution-evidence/*.json`** — Sprint 22 metric verification samples. `allSamplesPassed: true` is the strongest possible Resolution citation.
48
+ 9. **`hypotheses.md`** — narrative. Lines starting "Disproved:" go to What Went Well; lines starting "Open:" go to Action Items.
49
+
50
+ Missing or empty artifacts are NOT failures of the synthesizer — they are facts about the incident. Cite the absence: `(diagnoses/ is empty)`.
51
+
52
+ ## 5-Whys Construction Heuristic
53
+
54
+ The 5-Whys section is the hardest part. The diagnoser's top hypothesis is usually Why-2 or Why-3, not Why-1. The synthesizer works backwards (symptom → root) AND forwards (changelog → symptom) to fill all five levels.
55
+
56
+ **Heuristic (deterministic; pseudocode for implementers):**
57
+
58
+ ```
59
+ why1 = "Why did <incident.symptom> happen?"
60
+ citation = "(incident.json)"
61
+
62
+ let diagnosis = mostRecentDiagnosis(diagnoses/)
63
+ let topHypothesis = diagnosis.hypotheses.sortBy(confidence: desc, supportingEvidence.length: desc)[0]
64
+ why2 = "Because " + topHypothesis.statement
65
+ citation = "(diagnoses/<diagnosisId>.json#" + topHypothesis.id + ")"
66
+
67
+ let strongestEvidence = topHypothesis.supportingEvidence.sortBy(specificity)[0]
68
+ why3 = "Because " + strongestEvidence.snippet
69
+ citation = "(" + strongestEvidence.path + ")"
70
+
71
+ let preIncidentChanges = changelog.jsonl.filter(c =>
72
+ c.executedAt < incident.createdAt &&
73
+ Date.parse(incident.createdAt) - Date.parse(c.executedAt) < 30 * 60 * 1000
74
+ ).sortBy(executedAt: desc)
75
+ why4 = preIncidentChanges[0]
76
+ ? "Because " + preIncidentChanges[0].description + " shipped " + minutesBetween + "m before symptom onset"
77
+ : null
78
+ citation = "(changelog.jsonl#L<n>)"
79
+
80
+ why5 = preIncidentChanges[1]
81
+ ? similar to why4 with the next-older change
82
+ : null
83
+
84
+ if (renderedWhys.length < 3) {
85
+ emitShallowWarning("5-Whys synthesis was shallow (only " + n + " level(s) derivable from artifacts). " +
86
+ "Missing evidence in <named-file>. Human review required to deepen this chain.")
87
+ }
88
+ ```
89
+
90
+ **Cite every level.** A 5-Whys section with 5 levels and 5 citations is the bar. 3 levels with citations + a shallow-warning is acceptable. Fewer than 3 with no warning is a synthesis failure.
91
+
92
+ ## Postmortem Template
93
+
94
+ Generated postmortems MUST match this structure. Section headings are template; everything else MUST cite.
95
+
96
+ ```markdown
97
+ # Postmortem: <incident.symptom truncated 80 chars>
98
+
99
+ **Incident ID:** <incidentId> (incident.json)
100
+ **Status:** Resolved
101
+ **Severity:** <S1|S2|S3|S4> *(derive from observation count + impact magnitude; default S3 if undeterminable)*
102
+ **Date:** <incident.createdAt> → <incident.resolvedAt> (incident.json)
103
+ **Duration:** <hh:mm computed from createdAt → resolvedAt>
104
+
105
+ ## TL;DR
106
+
107
+ <2-3 sentence summary: symptom from `incident.json.symptom` + root cause from top hypothesis + resolving action from changelog.jsonl last ChangeEntry.> Each clause carries an inline citation.
108
+
109
+ ## Impact
110
+
111
+ - <verified observation 1> (observations.jsonl#L<n>)
112
+ - <verified observation 2> (observations.jsonl#L<n>)
113
+ - Resolution sample: observed <resolution-evidence[*].observedValue> against threshold <criteria.threshold> (resolution-evidence/<file>.json)
114
+
115
+ ## Timeline
116
+
117
+ | Time (UTC) | Event | Source |
118
+ |------------|-------|--------|
119
+ | <hh:mm> | <event.summary truncated 80> | <event.source> (timeline.jsonl#L<n>) |
120
+ | <hh:mm> | … | … |
121
+
122
+ ## Root Cause (5-Whys)
123
+
124
+ 1. Why did <symptom> happen? (incident.json)
125
+ 2. Because <topHypothesis.statement>. (diagnoses/<diagnosisId>.json#<hyp-id>)
126
+ 3. Because <strongestEvidence.snippet>. (<evidence.path>)
127
+ 4. Because <preIncidentChange.description> shipped <m>m prior. (changelog.jsonl#L<n>)
128
+ 5. Because <olderPreIncidentChange.description>. (changelog.jsonl#L<n>)
129
+
130
+ *(If fewer than 3 Whys derivable: emit the shallow-warning paragraph below the partial chain.)*
131
+
132
+ ## Contributing Factors
133
+
134
+ - <runbook step failure 1>: <stepDescription> (runbook-execution.jsonl#L<n>)
135
+ - <unverified observation that nevertheless steered the response>: (observations.jsonl#L<n>)
136
+
137
+ ## What Went Well
138
+
139
+ - <successful runbook step or disproved hypothesis> (runbook-execution.jsonl#L<n>) or (hypotheses.md#L<n>)
140
+ - Resolution metric verified: <criteria.metricName> < <threshold> for <windowMinutes>m sustained (resolution-evidence/<file>.json)
141
+
142
+ ## What Went Wrong
143
+
144
+ - <runbook execution failure> (runbook-execution.jsonl#L<n>)
145
+ - <risky action without precondition pass> (actions.jsonl#L<n>)
146
+
147
+ ## Action Items
148
+
149
+ | Item | Owner | Due | Source |
150
+ |------|-------|-----|--------|
151
+ | <derived from a What Went Wrong row> | TBD | TBD | (<artifact>#L<n>) |
152
+ | Add monitoring for the root-cause signal (5-Whys Level 3) | TBD | TBD | (5-whys-3) |
153
+
154
+ ---
155
+ *<Redactions footer if applicable: "**Redactions:** N secret-like strings redacted from artifacts.">*
156
+ *Generated by `bober postmortem generate <incidentId>` (Sprint 23).*
157
+ ```
158
+
159
+ ## Citation Format
160
+
161
+ Citations are parenthesized inline references at the end of a sentence:
162
+
163
+ | Style | When to use | Example |
164
+ |-------|------------|---------|
165
+ | `(file)` | Single-record JSON files | `(incident.json)` |
166
+ | `(file#L<n>)` | JSONL files where line maps to record | `(timeline.jsonl#L7)` |
167
+ | `(file#<event-id>)` | Records with explicit ids | `(diagnoses/diagnosis-inc-x-2026-05-24T14:30:00Z.json#h1)` |
168
+ | `(file1#L<n>, file2#L<m>)` | Multi-source corroboration in one claim | `(observations.jsonl#L3, changelog.jsonl#L1)` |
169
+
170
+ Every Impact bullet, every Timeline row, every 5-Whys level, every Action Item — all cite. The synthesizer enforces a minimum-5-citation floor; below that, it emits a synthesis-failure warning.
171
+
172
+ ## Redaction Discipline
173
+
174
+ Postmortems are widely shared. Apply these regexes to EVERY quoted artifact snippet BEFORE composing the markdown:
175
+
176
+ ```regex
177
+ /AKIA[0-9A-Z]{16}/g
178
+ /aws_secret_access_key\s*[=:]\s*\S+/gi
179
+ /(?:Bearer|Token|token|apikey|api_key|api-key)[\s=:]+["']?[A-Za-z0-9._\-]{16,}["']?/gi
180
+ /sk-[A-Za-z0-9]{20,}/g
181
+ /sk_(?:live|test)_[A-Za-z0-9]{10,}/g
182
+ /ghp_[A-Za-z0-9]{20,}/g
183
+ /secret_[A-Za-z0-9_\-]+/gi
184
+ /password\s*[=:]\s*\S+/gi
185
+ /Authorization:\s*Bearer\s+\S+/gi
186
+ /-----BEGIN [A-Z ]+PRIVATE KEY-----[\s\S]+?-----END [A-Z ]+PRIVATE KEY-----/g
187
+ ```
188
+
189
+ Replace each match with `[REDACTED]`. Increment a counter. If counter > 0, append the footer "**Redactions:** <N> secret-like strings redacted from artifacts." The redaction patterns themselves are listed here in SKILL.md as the canonical reference — they must NOT be quoted differently by the implementation. The implementing TypeScript module (`src/incident/postmortem.ts`) must use these exact regexes.
190
+
191
+ ## Red Flags - STOP
192
+
193
+ - A postmortem with fewer than 5 inline citations
194
+ - A 5-Whys section with fewer than 3 levels and NO shallow-warning paragraph
195
+ - An Impact section that lists symptoms not present in observations.jsonl
196
+ - A Timeline row whose timestamp does not appear in timeline.jsonl
197
+ - A quoted artifact snippet containing what looks like an API key, token, or password
198
+ - "Action Items: None" — there is always at least the monitoring action item
199
+ - Section headings present but section bodies empty — empty sections must be explicit ("No <X> recorded for this incident — (artifact is empty).")
200
+
201
+ ## Common Rationalizations
202
+
203
+ | Excuse | Reality |
204
+ |--------|---------|
205
+ | "I'll skip the line number, the file is short" | Line numbers are how auditors reproduce the synthesis. Always include them for JSONL artifacts. |
206
+ | "The 5-Whys narrative reads better if I fill in Why-4 from intuition" | Intuition is fabrication. Either derive Why-4 from changelog.jsonl or stop at Why-3 with the shallow-warning. |
207
+ | "Generic 'TBD' owners are fine for Action Items, they're not actionable anyway" | Owner: TBD is explicit and acceptable. "Owner: the team" or "Owner: someone" is generic prose disguised as data. |
208
+ | "The secret is in a closed system, no redaction needed" | Redact ALL secret-pattern matches unconditionally. Closed today is open tomorrow. |
209
+ | "There were no contributing factors, the response was clean" | Every incident has factors visible in runbook-execution.jsonl or hypotheses.md. An empty section is failure. |
210
+ | "I'll add one citation per section to satisfy the floor" | Per-sentence citations, not per-section. The floor is 5 INLINE citations across the document. |
211
+
212
+ ## Quick Reference
213
+
214
+ | Section | Source | Citation format |
215
+ |---------|--------|-----------------|
216
+ | Header (ID/Status/Severity/Date/Duration) | `incident.json` | `(incident.json)` |
217
+ | TL;DR | symptom + top hypothesis + last change | 2-3 citations inline |
218
+ | Impact | `observations.jsonl` (`verified: true`) + `resolution-evidence/` | `(observations.jsonl#L<n>)` |
219
+ | Timeline | `timeline.jsonl` (every row) | `(timeline.jsonl#L<n>)` per row |
220
+ | Root Cause | `diagnoses/*.json` + `changelog.jsonl` | per-Why citation |
221
+ | Contributing Factors | `runbook-execution.jsonl` (failed steps) | `(runbook-execution.jsonl#L<n>)` |
222
+ | What Went Well | successful runbook + disproved hypotheses + verified resolution | mixed |
223
+ | What Went Wrong | failed runbook + risky actions without precondition | mixed |
224
+ | Action Items | derived from What Went Wrong + monitoring | one citation per row |
225
+
226
+ ## Related Skills
227
+
228
+ - **`bober.diagnose`** — Phase 4 resolution-criteria verification produces `resolution-evidence/*.json` that this skill's Impact and What-Went-Well sections cite.
229
+ - **`bober.deploy`** — every ChangeEntry in `changelog.jsonl` was written under bober.deploy with a required inverse. The postmortem cites these for Root Cause (Why-4/Why-5) and as Action Item source rows.
230
+ - **`bober.runbook`** — every `runbook-execution.jsonl` entry was written under bober.runbook; failed steps populate Contributing Factors.
231
+ - **`agents/bober-postmortemer.md`** — the (offline, read-only) agent prompt companion to this skill. The TypeScript implementation in `src/incident/postmortem.ts` synthesizes deterministically; the agent prompt documents the discipline that any human or future LLM author must follow.