agent-bober 0.15.0 → 0.17.1

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 (307) hide show
  1. package/.claude-plugin/marketplace.json +20 -0
  2. package/.claude-plugin/plugin.json +2 -2
  3. package/CHANGELOG.md +40 -0
  4. package/README.md +137 -3
  5. package/agents/bober-architect.md +34 -0
  6. package/agents/bober-code-reviewer.md +2 -0
  7. package/agents/bober-curator.md +12 -0
  8. package/agents/bober-documenter.md +129 -0
  9. package/agents/bober-evaluator.md +46 -0
  10. package/agents/bober-generator.md +12 -0
  11. package/agents/bober-planner.md +8 -1
  12. package/dist/cli/commands/graph.js +3 -3
  13. package/dist/cli/commands/graph.js.map +1 -1
  14. package/dist/cli/commands/init.d.ts +9 -0
  15. package/dist/cli/commands/init.d.ts.map +1 -1
  16. package/dist/cli/commands/init.js +5 -1
  17. package/dist/cli/commands/init.js.map +1 -1
  18. package/dist/cli/commands/memory.d.ts +14 -0
  19. package/dist/cli/commands/memory.d.ts.map +1 -0
  20. package/dist/cli/commands/memory.js +132 -0
  21. package/dist/cli/commands/memory.js.map +1 -0
  22. package/dist/cli/commands/update.d.ts +18 -0
  23. package/dist/cli/commands/update.d.ts.map +1 -0
  24. package/dist/cli/commands/update.js +81 -0
  25. package/dist/cli/commands/update.js.map +1 -0
  26. package/dist/cli/index.js +9 -0
  27. package/dist/cli/index.js.map +1 -1
  28. package/dist/config/defaults.d.ts.map +1 -1
  29. package/dist/config/defaults.js +14 -3
  30. package/dist/config/defaults.js.map +1 -1
  31. package/dist/config/loader.d.ts.map +1 -1
  32. package/dist/config/loader.js +7 -0
  33. package/dist/config/loader.js.map +1 -1
  34. package/dist/config/role-providers.d.ts +29 -0
  35. package/dist/config/role-providers.d.ts.map +1 -0
  36. package/dist/config/role-providers.js +115 -0
  37. package/dist/config/role-providers.js.map +1 -0
  38. package/dist/config/schema.d.ts +383 -14
  39. package/dist/config/schema.d.ts.map +1 -1
  40. package/dist/config/schema.js +42 -0
  41. package/dist/config/schema.js.map +1 -1
  42. package/dist/contracts/eval-result.d.ts +112 -56
  43. package/dist/contracts/eval-result.d.ts.map +1 -1
  44. package/dist/contracts/eval-result.js +3 -0
  45. package/dist/contracts/eval-result.js.map +1 -1
  46. package/dist/contracts/sprint-contract.d.ts +30 -30
  47. package/dist/fleet/aggregator.d.ts +5 -0
  48. package/dist/fleet/aggregator.d.ts.map +1 -0
  49. package/dist/fleet/aggregator.js +39 -0
  50. package/dist/fleet/aggregator.js.map +1 -0
  51. package/dist/fleet/child-config.d.ts +12 -0
  52. package/dist/fleet/child-config.d.ts.map +1 -0
  53. package/dist/fleet/child-config.js +38 -0
  54. package/dist/fleet/child-config.js.map +1 -0
  55. package/dist/fleet/coordinator.d.ts +25 -0
  56. package/dist/fleet/coordinator.d.ts.map +1 -0
  57. package/dist/fleet/coordinator.js +40 -0
  58. package/dist/fleet/coordinator.js.map +1 -0
  59. package/dist/fleet/index.d.ts +40 -0
  60. package/dist/fleet/index.d.ts.map +1 -0
  61. package/dist/fleet/index.js +117 -0
  62. package/dist/fleet/index.js.map +1 -0
  63. package/dist/fleet/manifest.d.ts +51 -0
  64. package/dist/fleet/manifest.d.ts.map +1 -0
  65. package/dist/fleet/manifest.js +32 -0
  66. package/dist/fleet/manifest.js.map +1 -0
  67. package/dist/fleet/reporter.d.ts +32 -0
  68. package/dist/fleet/reporter.d.ts.map +1 -0
  69. package/dist/fleet/reporter.js +71 -0
  70. package/dist/fleet/reporter.js.map +1 -0
  71. package/dist/fleet/runner.d.ts +48 -0
  72. package/dist/fleet/runner.d.ts.map +1 -0
  73. package/dist/fleet/runner.js +104 -0
  74. package/dist/fleet/runner.js.map +1 -0
  75. package/dist/fleet/scaffolder.d.ts +12 -0
  76. package/dist/fleet/scaffolder.d.ts.map +1 -0
  77. package/dist/fleet/scaffolder.js +82 -0
  78. package/dist/fleet/scaffolder.js.map +1 -0
  79. package/dist/fleet/types.d.ts +21 -0
  80. package/dist/fleet/types.d.ts.map +1 -0
  81. package/dist/fleet/types.js +2 -0
  82. package/dist/fleet/types.js.map +1 -0
  83. package/dist/graph/cli.d.ts +6 -2
  84. package/dist/graph/cli.d.ts.map +1 -1
  85. package/dist/graph/cli.js +53 -12
  86. package/dist/graph/cli.js.map +1 -1
  87. package/dist/graph/pipeline-lifecycle.d.ts +9 -0
  88. package/dist/graph/pipeline-lifecycle.d.ts.map +1 -1
  89. package/dist/graph/pipeline-lifecycle.js +12 -0
  90. package/dist/graph/pipeline-lifecycle.js.map +1 -1
  91. package/dist/graph/preflight-injector.d.ts +14 -0
  92. package/dist/graph/preflight-injector.d.ts.map +1 -1
  93. package/dist/graph/preflight-injector.js +84 -4
  94. package/dist/graph/preflight-injector.js.map +1 -1
  95. package/dist/incident/types.d.ts +24 -24
  96. package/dist/mcp/tools/graph-schemas.d.ts +7 -7
  97. package/dist/mcp/tools/init.d.ts.map +1 -1
  98. package/dist/mcp/tools/init.js +2 -0
  99. package/dist/mcp/tools/init.js.map +1 -1
  100. package/dist/orchestrator/agent-loader.d.ts.map +1 -1
  101. package/dist/orchestrator/agent-loader.js +15 -1
  102. package/dist/orchestrator/agent-loader.js.map +1 -1
  103. package/dist/orchestrator/agentic-loop.d.ts +51 -0
  104. package/dist/orchestrator/agentic-loop.d.ts.map +1 -1
  105. package/dist/orchestrator/agentic-loop.js +123 -4
  106. package/dist/orchestrator/agentic-loop.js.map +1 -1
  107. package/dist/orchestrator/arch-lenses.d.ts +7 -0
  108. package/dist/orchestrator/arch-lenses.d.ts.map +1 -0
  109. package/dist/orchestrator/arch-lenses.js +22 -0
  110. package/dist/orchestrator/arch-lenses.js.map +1 -0
  111. package/dist/orchestrator/architect-agent.d.ts +16 -0
  112. package/dist/orchestrator/architect-agent.d.ts.map +1 -1
  113. package/dist/orchestrator/architect-agent.js +509 -1
  114. package/dist/orchestrator/architect-agent.js.map +1 -1
  115. package/dist/orchestrator/curator-agent.js +1 -1
  116. package/dist/orchestrator/curator-agent.js.map +1 -1
  117. package/dist/orchestrator/deploy/types.d.ts +2 -2
  118. package/dist/orchestrator/documenter-agent.d.ts +57 -0
  119. package/dist/orchestrator/documenter-agent.d.ts.map +1 -0
  120. package/dist/orchestrator/documenter-agent.js +195 -0
  121. package/dist/orchestrator/documenter-agent.js.map +1 -0
  122. package/dist/orchestrator/environment.d.ts +45 -0
  123. package/dist/orchestrator/environment.d.ts.map +1 -0
  124. package/dist/orchestrator/environment.js +151 -0
  125. package/dist/orchestrator/environment.js.map +1 -0
  126. package/dist/orchestrator/eval-lenses.d.ts +7 -0
  127. package/dist/orchestrator/eval-lenses.d.ts.map +1 -0
  128. package/dist/orchestrator/eval-lenses.js +19 -0
  129. package/dist/orchestrator/eval-lenses.js.map +1 -0
  130. package/dist/orchestrator/eval-persist.d.ts +25 -0
  131. package/dist/orchestrator/eval-persist.d.ts.map +1 -0
  132. package/dist/orchestrator/eval-persist.js +74 -0
  133. package/dist/orchestrator/eval-persist.js.map +1 -0
  134. package/dist/orchestrator/evaluator-agent.d.ts +23 -0
  135. package/dist/orchestrator/evaluator-agent.d.ts.map +1 -1
  136. package/dist/orchestrator/evaluator-agent.js +60 -3
  137. package/dist/orchestrator/evaluator-agent.js.map +1 -1
  138. package/dist/orchestrator/generator-agent.d.ts.map +1 -1
  139. package/dist/orchestrator/generator-agent.js +32 -0
  140. package/dist/orchestrator/generator-agent.js.map +1 -1
  141. package/dist/orchestrator/memory/distill.d.ts +60 -0
  142. package/dist/orchestrator/memory/distill.d.ts.map +1 -0
  143. package/dist/orchestrator/memory/distill.js +177 -0
  144. package/dist/orchestrator/memory/distill.js.map +1 -0
  145. package/dist/orchestrator/memory/eval-source.d.ts +20 -0
  146. package/dist/orchestrator/memory/eval-source.d.ts.map +1 -0
  147. package/dist/orchestrator/memory/eval-source.js +88 -0
  148. package/dist/orchestrator/memory/eval-source.js.map +1 -0
  149. package/dist/orchestrator/memory/retrieve.d.ts +45 -0
  150. package/dist/orchestrator/memory/retrieve.d.ts.map +1 -0
  151. package/dist/orchestrator/memory/retrieve.js +102 -0
  152. package/dist/orchestrator/memory/retrieve.js.map +1 -0
  153. package/dist/orchestrator/model-resolver.d.ts.map +1 -1
  154. package/dist/orchestrator/model-resolver.js +12 -0
  155. package/dist/orchestrator/model-resolver.js.map +1 -1
  156. package/dist/orchestrator/pipeline.d.ts +10 -0
  157. package/dist/orchestrator/pipeline.d.ts.map +1 -1
  158. package/dist/orchestrator/pipeline.js +111 -3
  159. package/dist/orchestrator/pipeline.js.map +1 -1
  160. package/dist/orchestrator/planner-agent.d.ts +22 -1
  161. package/dist/orchestrator/planner-agent.d.ts.map +1 -1
  162. package/dist/orchestrator/planner-agent.js +160 -4
  163. package/dist/orchestrator/planner-agent.js.map +1 -1
  164. package/dist/orchestrator/research-agent.js +2 -2
  165. package/dist/orchestrator/research-agent.js.map +1 -1
  166. package/dist/orchestrator/tools/handlers.d.ts +14 -0
  167. package/dist/orchestrator/tools/handlers.d.ts.map +1 -1
  168. package/dist/orchestrator/tools/handlers.js +29 -4
  169. package/dist/orchestrator/tools/handlers.js.map +1 -1
  170. package/dist/orchestrator/tools/schemas.js +5 -5
  171. package/dist/orchestrator/tools/schemas.js.map +1 -1
  172. package/dist/orchestrator/workflow/args-builder.d.ts +35 -0
  173. package/dist/orchestrator/workflow/args-builder.d.ts.map +1 -0
  174. package/dist/orchestrator/workflow/args-builder.js +142 -0
  175. package/dist/orchestrator/workflow/args-builder.js.map +1 -0
  176. package/dist/orchestrator/workflow/budget.d.ts +57 -0
  177. package/dist/orchestrator/workflow/budget.d.ts.map +1 -0
  178. package/dist/orchestrator/workflow/budget.js +80 -0
  179. package/dist/orchestrator/workflow/budget.js.map +1 -0
  180. package/dist/orchestrator/workflow/conformance.d.ts +27 -0
  181. package/dist/orchestrator/workflow/conformance.d.ts.map +1 -0
  182. package/dist/orchestrator/workflow/conformance.js +111 -0
  183. package/dist/orchestrator/workflow/conformance.js.map +1 -0
  184. package/dist/orchestrator/workflow/eligibility.d.ts +8 -0
  185. package/dist/orchestrator/workflow/eligibility.d.ts.map +1 -0
  186. package/dist/orchestrator/workflow/eligibility.js +10 -0
  187. package/dist/orchestrator/workflow/eligibility.js.map +1 -0
  188. package/dist/orchestrator/workflow/engine.d.ts +10 -0
  189. package/dist/orchestrator/workflow/engine.d.ts.map +1 -0
  190. package/dist/orchestrator/workflow/engine.js +2 -0
  191. package/dist/orchestrator/workflow/engine.js.map +1 -0
  192. package/dist/orchestrator/workflow/errors.d.ts +13 -0
  193. package/dist/orchestrator/workflow/errors.d.ts.map +1 -0
  194. package/dist/orchestrator/workflow/errors.js +26 -0
  195. package/dist/orchestrator/workflow/errors.js.map +1 -0
  196. package/dist/orchestrator/workflow/flusher.d.ts +19 -0
  197. package/dist/orchestrator/workflow/flusher.d.ts.map +1 -0
  198. package/dist/orchestrator/workflow/flusher.js +81 -0
  199. package/dist/orchestrator/workflow/flusher.js.map +1 -0
  200. package/dist/orchestrator/workflow/interpreter.d.ts +48 -0
  201. package/dist/orchestrator/workflow/interpreter.d.ts.map +1 -0
  202. package/dist/orchestrator/workflow/interpreter.js +92 -0
  203. package/dist/orchestrator/workflow/interpreter.js.map +1 -0
  204. package/dist/orchestrator/workflow/pure-sprint.d.ts +65 -0
  205. package/dist/orchestrator/workflow/pure-sprint.d.ts.map +1 -0
  206. package/dist/orchestrator/workflow/pure-sprint.js +82 -0
  207. package/dist/orchestrator/workflow/pure-sprint.js.map +1 -0
  208. package/dist/orchestrator/workflow/reconciler.d.ts +15 -0
  209. package/dist/orchestrator/workflow/reconciler.d.ts.map +1 -0
  210. package/dist/orchestrator/workflow/reconciler.js +65 -0
  211. package/dist/orchestrator/workflow/reconciler.js.map +1 -0
  212. package/dist/orchestrator/workflow/resume-cursor.d.ts +10 -0
  213. package/dist/orchestrator/workflow/resume-cursor.d.ts.map +1 -0
  214. package/dist/orchestrator/workflow/resume-cursor.js +25 -0
  215. package/dist/orchestrator/workflow/resume-cursor.js.map +1 -0
  216. package/dist/orchestrator/workflow/retry.d.ts +50 -0
  217. package/dist/orchestrator/workflow/retry.d.ts.map +1 -0
  218. package/dist/orchestrator/workflow/retry.js +100 -0
  219. package/dist/orchestrator/workflow/retry.js.map +1 -0
  220. package/dist/orchestrator/workflow/scheduler.d.ts +87 -0
  221. package/dist/orchestrator/workflow/scheduler.d.ts.map +1 -0
  222. package/dist/orchestrator/workflow/scheduler.js +158 -0
  223. package/dist/orchestrator/workflow/scheduler.js.map +1 -0
  224. package/dist/orchestrator/workflow/selector.d.ts +26 -0
  225. package/dist/orchestrator/workflow/selector.d.ts.map +1 -0
  226. package/dist/orchestrator/workflow/selector.js +54 -0
  227. package/dist/orchestrator/workflow/selector.js.map +1 -0
  228. package/dist/orchestrator/workflow/synthesizer.d.ts +52 -0
  229. package/dist/orchestrator/workflow/synthesizer.d.ts.map +1 -0
  230. package/dist/orchestrator/workflow/synthesizer.js +75 -0
  231. package/dist/orchestrator/workflow/synthesizer.js.map +1 -0
  232. package/dist/orchestrator/workflow/ts-engine.d.ts +13 -0
  233. package/dist/orchestrator/workflow/ts-engine.d.ts.map +1 -0
  234. package/dist/orchestrator/workflow/ts-engine.js +14 -0
  235. package/dist/orchestrator/workflow/ts-engine.js.map +1 -0
  236. package/dist/orchestrator/workflow/types.d.ts +55 -0
  237. package/dist/orchestrator/workflow/types.d.ts.map +1 -0
  238. package/dist/orchestrator/workflow/types.js +3 -0
  239. package/dist/orchestrator/workflow/types.js.map +1 -0
  240. package/dist/orchestrator/workflow/workflow-engine.d.ts +31 -0
  241. package/dist/orchestrator/workflow/workflow-engine.d.ts.map +1 -0
  242. package/dist/orchestrator/workflow/workflow-engine.js +70 -0
  243. package/dist/orchestrator/workflow/workflow-engine.js.map +1 -0
  244. package/dist/providers/anthropic.d.ts.map +1 -1
  245. package/dist/providers/anthropic.js +49 -6
  246. package/dist/providers/anthropic.js.map +1 -1
  247. package/dist/providers/claude-code.d.ts +44 -0
  248. package/dist/providers/claude-code.d.ts.map +1 -0
  249. package/dist/providers/claude-code.js +143 -0
  250. package/dist/providers/claude-code.js.map +1 -0
  251. package/dist/providers/factory.d.ts +16 -2
  252. package/dist/providers/factory.d.ts.map +1 -1
  253. package/dist/providers/factory.js +66 -12
  254. package/dist/providers/factory.js.map +1 -1
  255. package/dist/providers/google.d.ts.map +1 -1
  256. package/dist/providers/google.js +27 -3
  257. package/dist/providers/google.js.map +1 -1
  258. package/dist/providers/index.d.ts +3 -1
  259. package/dist/providers/index.d.ts.map +1 -1
  260. package/dist/providers/index.js +3 -1
  261. package/dist/providers/index.js.map +1 -1
  262. package/dist/providers/openai.d.ts.map +1 -1
  263. package/dist/providers/openai.js +24 -3
  264. package/dist/providers/openai.js.map +1 -1
  265. package/dist/providers/preflight.d.ts +22 -0
  266. package/dist/providers/preflight.d.ts.map +1 -0
  267. package/dist/providers/preflight.js +54 -0
  268. package/dist/providers/preflight.js.map +1 -0
  269. package/dist/providers/structured.d.ts +130 -0
  270. package/dist/providers/structured.d.ts.map +1 -0
  271. package/dist/providers/structured.js +205 -0
  272. package/dist/providers/structured.js.map +1 -0
  273. package/dist/providers/types.d.ts +28 -0
  274. package/dist/providers/types.d.ts.map +1 -1
  275. package/dist/state/history-rotation.d.ts +17 -0
  276. package/dist/state/history-rotation.d.ts.map +1 -0
  277. package/dist/state/history-rotation.js +84 -0
  278. package/dist/state/history-rotation.js.map +1 -0
  279. package/dist/state/history.d.ts +16 -4
  280. package/dist/state/history.d.ts.map +1 -1
  281. package/dist/state/history.js +62 -20
  282. package/dist/state/history.js.map +1 -1
  283. package/dist/state/index.d.ts +1 -1
  284. package/dist/state/index.d.ts.map +1 -1
  285. package/dist/state/index.js +1 -1
  286. package/dist/state/index.js.map +1 -1
  287. package/dist/state/memory.d.ts +60 -0
  288. package/dist/state/memory.d.ts.map +1 -0
  289. package/dist/state/memory.js +242 -0
  290. package/dist/state/memory.js.map +1 -0
  291. package/hooks/hooks.json +12 -2
  292. package/package.json +9 -5
  293. package/scripts/spike-claude-code-provider.mjs +66 -0
  294. package/scripts/spike-deepseek.mjs +63 -0
  295. package/scripts/sync-targets.json +12 -0
  296. package/scripts/update-all.mjs +255 -0
  297. package/skills/bober.architect/SKILL.md +13 -0
  298. package/skills/bober.architect/references/arch-lens-panel.md +126 -0
  299. package/skills/bober.eval/SKILL.md +9 -0
  300. package/skills/bober.eval/references/lens-panel.md +115 -0
  301. package/skills/bober.plan/SKILL.md +6 -0
  302. package/skills/bober.run/SKILL.md +23 -4
  303. package/skills/bober.run/references/lens-panel.md +115 -0
  304. package/skills/bober.sprint/SKILL.md +44 -2
  305. package/skills/bober.sprint/references/lens-panel.md +115 -0
  306. package/skills/shared/arch-lens-panel.md +126 -0
  307. package/skills/shared/lens-panel.md +115 -0
@@ -0,0 +1,20 @@
1
+ {
2
+ "$schema": "https://anthropic.com/claude-code/marketplace.schema.json",
3
+ "name": "agent-bober",
4
+ "description": "Marketplace for the Bober multi-agent harness — installs the bober plugin (24 skills + 11 subagents) so updates propagate via `/plugin update` instead of per-project copies.",
5
+ "owner": {
6
+ "name": "BOBER3r"
7
+ },
8
+ "plugins": [
9
+ {
10
+ "name": "bober",
11
+ "description": "Generator-Evaluator multi-agent harness for building applications autonomously with Claude. Researcher → Planner → Curator → Generator → Evaluator pipeline with a tokensave code-graph, incident/runbook tooling, and stack-specific workflows (React, Solidity, Anchor).",
12
+ "author": {
13
+ "name": "BOBER3r"
14
+ },
15
+ "category": "development",
16
+ "homepage": "https://agentbober.com",
17
+ "source": "./"
18
+ }
19
+ ]
20
+ }
@@ -1,9 +1,9 @@
1
1
  {
2
2
  "name": "bober",
3
3
  "description": "Generator-Evaluator multi-agent harness for building applications autonomously with Claude",
4
- "version": "0.1.0",
4
+ "version": "0.17.1",
5
5
  "author": { "name": "BOBER3r" },
6
- "homepage": "https://github.com/BOBER3r/agent-bober",
6
+ "homepage": "https://agentbober.com",
7
7
  "repository": "https://github.com/BOBER3r/agent-bober",
8
8
  "license": "MIT"
9
9
  }
package/CHANGELOG.md CHANGED
@@ -7,6 +7,46 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.17.1] — 2026-06-13
11
+
12
+ ### Added
13
+
14
+ - **`agent-bober update` command**: refreshes a project's installed Claude Code slash commands (`.claude/commands/`) and agent definitions (`.claude/agents/`) from the currently-installed package — the end-user upgrade path after `npm i -g agent-bober@latest`. It respects the project's recorded `mode`/`preset` so the installed command set matches what `init` chose, and it is **non-destructive**: `bober.config.json`, `.bober/` state, and `.gitignore` are never touched. Errors out (exit 1) if no `bober.config.json` is present.
15
+
16
+ ### Fixed
17
+
18
+ - **Plugin manifest version drift**: `.claude-plugin/plugin.json` was pinned at `0.15.0` and the marketplace/README advertised "10 subagents"; both now track the real release (`0.17.x`, 11 subagents) so `/plugin update bober` advertises the correct version.
19
+
20
+ ## [0.17.0] — 2026-06-13
21
+
22
+ ### Added
23
+
24
+ - **Per-sprint documenter** ([#41](https://github.com/BOBER3r/agent-bober/pull/41)): a new `documenter` agent spawned after a sprint's evaluator returns PASS — it writes a concise record of what the sprint built and finds & updates the existing docs (README, ADRs, CLAUDE.md, module docs) while the change is fresh, instead of batching all docs into a final sprint. Documentation only (never touches application code or tests) and **advisory** — a documenter failure or timeout never downgrades the already-passed sprint. On by default; configure via the `documenter` config section (`enabled`, `model`, `maxTurns`, `timeoutMs`).
25
+ - **`simplicity` lens** ([#39](https://github.com/BOBER3r/agent-bober/pull/39)): a complexity-only (YAGNI) lens added to both the evaluator (`evaluator.panel`) and architect (`architect.panel`) lens panels. It surfaces reinvented standard-library code, dependencies doing what a native platform feature already does, single-implementation abstractions, dead flexibility, and logic that could be materially shorter — and is explicitly forbidden from ever flagging a test, a validation at a trust boundary, error handling, security, or accessibility as deletable. Mirrored in `skills/shared/{lens-panel,arch-lens-panel}.md` with the existing drift/parity gates.
26
+ - **`bober:` ceiling-comment convention** ([#39](https://github.com/BOBER3r/agent-bober/pull/39)): the generator marks a deliberate simplification that has a known ceiling with a `bober:` comment naming the ceiling **and** the upgrade path (e.g. `// bober: global lock, per-account locks if throughput matters`). The code-reviewer treats a marked shortcut as intent and an unmarked shortcut with an obvious ceiling as a finding; the evaluator treats a marked simplification as not-a-smell (scoped strictly to code-quality, never to the test/verification discipline).
27
+
28
+ ### Fixed
29
+
30
+ - **Stale plugin `.claude/` copies**: regenerated the `bober-planner` agent + `bober-plan` command and the `bober-documenter` agent copies that had drifted from their canonical `agents/` / `skills/` sources (the planner's bounded-lessons-index step and the new documenter agent were missing from the plugin surface). Run `npm run update-all` to keep these in sync.
31
+ - **Untracked plugin agent/command copies now committed**: the `bober-diagnoser`, `bober-deployer`, and `bober-postmortemer` incident agents and the `bober-graph` / `bober-impact` / `bober-onboard` commands existed on disk but were never tracked, so they did not ship on the plugin surface for everyone. They are now committed (canonical sources were already tracked); all six are provider-agnostic and honour the configured provider (Anthropic / DeepSeek / OpenAI-compatible).
32
+
33
+ ## [0.16.0] — 2026-06-04
34
+
35
+ ### Added
36
+
37
+ - **Multi-provider support — DeepSeek** ([#21](https://github.com/BOBER3r/agent-bober/pull/21), [#24](https://github.com/BOBER3r/agent-bober/pull/24)): DeepSeek is now a first-class provider via the built-in `openai-compat` adapter pointed at `https://api.deepseek.com`. Shorthands `deepseek` / `deepseek-v4-pro` / `deepseek-v4-flash` auto-set the endpoint; set `DEEPSEEK_API_KEY`. Supports **all** roles including tool-calling (curator, generator, evaluator, code-reviewer). See [`docs/providers.md`](docs/providers.md).
38
+ - **Multi-provider support — claude-code (subscription)** ([#21](https://github.com/BOBER3r/agent-bober/pull/21), [#24](https://github.com/BOBER3r/agent-bober/pull/24)): a no-API-key `ClaudeCodeAdapter` that shells out to the `claude` CLI on your Claude subscription (`binary` / `timeoutMs` overrides). Planner and researcher roles only — tool-using roles fall back to another configured provider (role-aware fallback).
39
+ - **Evaluator lens panel** ([#25](https://github.com/BOBER3r/agent-bober/pull/25), [#26](https://github.com/BOBER3r/agent-bober/pull/26)): opt-in `evaluator.panel` runs the evaluation across multiple independent lenses (`correctness`, `security`, `regression`, `quality`) with bounded fan-out and a reconcile step, emitting per-lens verdict telemetry. Off by default — byte-identical behavior when disabled.
40
+ - **Architect lens panel** ([#27](https://github.com/BOBER3r/agent-bober/pull/27)): opt-in `architect.panel` gates the architecture approach-selection and review checkpoints into bounded per-lens fan-out (`scalability`, `security`, `cost`, `operability`, `maintainability`, `reversibility`) with a fail-closed reconcile. Off by default.
41
+ - **Native lens-panel surface**: an optional `lensVerdicts` field on the evaluator result schema plus lens-aware evaluator/architect agent modes and a parity/drift gate, so the Claude Code plugin surface mirrors the TypeScript panel behavior. Canonical references at `skills/shared/lens-panel.md` and `skills/shared/arch-lens-panel.md`.
42
+ - **Config-selectable orchestration engine**: `pipeline.engine` (`'ts'` | `'skill'` | `'workflow'`, default `'ts'`) selects the pipeline orchestration engine behind an engine-selection seam, with an eligibility probe that downgrades `workflow` → `ts` when ineligible or in `careful` mode. No behavior change on the default `ts` path.
43
+ - **Graph telemetry + `update-all`** ([#19](https://github.com/BOBER3r/agent-bober/pull/19), [#20](https://github.com/BOBER3r/agent-bober/pull/20)): tokensave code-graph preflight telemetry written to `.bober/history.jsonl`, and an `update-all` sync flow (`npm run update-all`) that keeps the CLI, skills, agents, and plugin marketplace in sync.
44
+ - **Preset-aware slash-command installation** ([#11](https://github.com/BOBER3r/agent-bober/pull/11), [#12](https://github.com/BOBER3r/agent-bober/pull/12)) *(shipped in 0.12.0, documented here)*: `bober init` now installs only the universal commands plus the commands relevant to the chosen preset, instead of every command.
45
+
46
+ ### Fixed
47
+
48
+ - **Plugin PostToolUse hooks schema** ([#22](https://github.com/BOBER3r/agent-bober/pull/22), [#23](https://github.com/BOBER3r/agent-bober/pull/23)): PostToolUse hooks are now wrapped in the required `hooks[]` array so the Claude Code plugin loads them correctly.
49
+
10
50
  ## [0.15.0] — 2026-05-29
11
51
 
12
52
  ### Added
package/README.md CHANGED
@@ -64,6 +64,26 @@ agent-bober operates in four modes — pick the one that matches your situation.
64
64
 
65
65
  ## Installation
66
66
 
67
+ There are two ways to run agent-bober, and they are complementary:
68
+
69
+ - **Claude Code plugin** — the skills (`/bober-run`, `/bober-plan`, …) and subagents, running on your Claude Code subscription. No npm or API key required.
70
+ - **npm package** — the standalone CLI + MCP server (`agent-bober`), which calls LLM providers directly (anthropic / deepseek / claude-code) and powers headless, CI, and programmatic runs.
71
+
72
+ For the full feature set, install both.
73
+
74
+ ### Claude Code Plugin
75
+
76
+ Install the plugin from its marketplace, then install `bober`:
77
+
78
+ ```text
79
+ /plugin marketplace add BOBER3r/agent-bober
80
+ /plugin install bober@agent-bober
81
+ ```
82
+
83
+ This installs 24 skills + 11 subagents. Update later with `/plugin update bober`. The plugin runs the Researcher → Planner → Curator → Generator → Evaluator pipeline as Claude Code subagents on your Claude subscription — provider selection (the [Capability Matrix](#capability-matrix)) does **not** apply in this mode.
84
+
85
+ ### npm CLI / MCP Server
86
+
67
87
  ```bash
68
88
  # Install globally
69
89
  npm install -g agent-bober
@@ -72,9 +92,20 @@ npm install -g agent-bober
72
92
  npx agent-bober init
73
93
  ```
74
94
 
95
+ **Updating later:** upgrade the package, then refresh each project's installed commands/agents:
96
+
97
+ ```bash
98
+ npm i -g agent-bober@latest # upgrade the global CLI/engine
99
+ agent-bober update # in each project: refresh .claude/ commands + agents (config untouched)
100
+ ```
101
+
102
+ `update` re-emits `.claude/commands/` and `.claude/agents/` from the new package version without touching your `bober.config.json` or `.bober/` state. Claude Code **plugin** users update separately with `/plugin update bober` (the plugin tracks the GitHub repo, not npm).
103
+
104
+ This is required to use the DeepSeek / claude-code providers, run bober headlessly or in CI, or expose the MCP server. A few plugin skills (`bober.plan`, `bober.sprint`, `bober.impact`, `bober.onboard`, `bober.graph`) also shell out to the `agent-bober` CLI, so installing it unlocks their full behavior. Graph features additionally require the separate [`tokensave`](#graph-tokensave-integration) binary.
105
+
75
106
  agent-bober works in multiple environments:
76
107
 
77
- - **Claude Code** -- Plugin with 20+ slash commands (`/bober-plan`, `/bober-run`, etc.)
108
+ - **Claude Code** -- Plugin with 20+ slash commands (`/bober-plan`, `/bober-run`, etc.) — install via the marketplace above
78
109
  - **Cursor / Windsurf** -- MCP server with 37 tools in the chat interface
79
110
  - **Any MCP-compatible IDE** -- MCP server via stdio transport
80
111
  - **Any terminal** -- CLI commands (`npx agent-bober run "feature"`)
@@ -189,6 +220,32 @@ agent-bober is **provider-agnostic**. Use any LLM provider for any agent role. M
189
220
 
190
221
  Shorthands resolve to the latest model version automatically. You can also pass any full model ID directly -- it will be sent to the provider as-is.
191
222
 
223
+ ### Capability Matrix
224
+
225
+ > **This matrix applies to the standalone CLI / programmatic provider layer only** (`npx agent-bober run …`), where bober calls each provider's API directly. It does **not** apply to the **Claude Code plugin**: when you run a skill like `/bober-run` inside Claude Code, the roles are spawned as Claude Code subagents on your Claude subscription, so provider selection (including `claude-code`) does not apply. See [Claude Code Plugin](#claude-code-plugin) below.
226
+
227
+ | Role | anthropic (default) | deepseek (openai-compat) | claude-code (subscription) |
228
+ | ---------------------- | -------------------- | ------------------------ | -------------------------- |
229
+ | planner | yes | yes | yes (no tools needed) |
230
+ | researcher (phase 1/2) | yes | yes | yes (no tools needed) |
231
+ | curator | yes | yes (tools) | no (runs own loop) |
232
+ | generator | yes | yes (tools) | no (runs own loop) |
233
+ | evaluator | yes | yes (tools) | no (runs own loop) |
234
+ | code-reviewer | yes | yes (tools) | no (runs own loop) |
235
+ | documenter | yes | yes (tools) | no (runs own loop) |
236
+
237
+ **DeepSeek prerequisites:** `npm install openai` (optional peer dep) and set `DEEPSEEK_API_KEY` in
238
+ your environment. DeepSeek supports all roles including tool-calling roles (curator, generator,
239
+ evaluator, code-reviewer).
240
+
241
+ **claude-code prerequisites:** An active Claude subscription (Pro/Max/Team) and the `claude` CLI
242
+ on PATH. claude-code is **planner and researcher only** — it cannot be used for tool-using roles
243
+ because the `claude -p` interface does not support tool-calling. As of the **2026-06-15 ToS update**,
244
+ programmatic subscription use is metered (Agent-SDK credit, billed at API rates, no rollover).
245
+ Each `claude -p` call injects approximately **40,000 tokens of system-prompt overhead**.
246
+
247
+ See [`docs/providers.md`](docs/providers.md) for copy-paste config snippets for each provider.
248
+
192
249
  ### Configuration
193
250
 
194
251
  Set providers per agent role in `bober.config.json`:
@@ -360,11 +417,26 @@ The `/bober-principles` command also triggers auto-discovery when called with no
360
417
  | `/bober-anchor` | Solana program workflow |
361
418
  | `/bober-brownfield` | Existing codebase workflow |
362
419
  | `/bober-playwright` | Set up Playwright E2E testing, generate tests, debug failures |
420
+ | `/bober-code-review` | Advisory review of the sprint diff against the contract + anti-pattern catalog |
421
+ | `/bober-verify` | Verification-before-completion -- run checks and confirm output before claiming success |
422
+ | `/bober-debug` | Systematic debugging -- reproduce, isolate, hypothesize, fix, verify |
423
+ | `/bober-graph` | Manage the code graph index -- init, sync, status (requires tokensave) |
424
+ | `/bober-impact` | Analyse the impact radius and test coverage of a symbol or file |
425
+ | `/bober-onboard` | Generate onboarding docs from the code graph |
426
+ | `/bober-incident` | Run the incident lifecycle -- diagnose, deploy, verify, postmortem |
427
+ | `/bober-diagnose` | Investigate a production incident -- evidence at boundaries, hypothesize-and-disprove |
428
+ | `/bober-deploy` | Execute a remediation action with blast-radius classification + change-management gates |
429
+ | `/bober-runbook` | Execute a step-by-step recovery procedure with pre/postcondition gates |
430
+ | `/bober-postmortem` | Synthesize an evidence-cited postmortem from incident artifacts |
431
+ | `/bober-using-bober` | Establishes how to find and use bober skills (loaded at conversation start) |
432
+
433
+ > **Preset-aware install:** `bober init <preset>` installs the universal commands above plus only the stack-specific commands matching your preset or mode -- e.g. `/bober-solidity` is added for a `solidity` project, `/bober-react` and `/bober-playwright` for `nextjs`/`react-vite`, and `/bober-brownfield` for an existing codebase. The Claude Code plugin (`/plugin install`) always ships the full set.
363
434
 
364
435
  ### CLI
365
436
 
366
437
  ```bash
367
438
  npx agent-bober init [preset] # Initialize project (with provider selection)
439
+ npx agent-bober update # Refresh .claude/ commands + agents after upgrading the package
368
440
  npx agent-bober plan "feature" # Run the planner
369
441
  npx agent-bober plan answer <specId> # Resolve clarification questions interactively
370
442
  npx agent-bober plan answer <specId> <questionId> "..." # Resolve a single clarification question
@@ -449,6 +521,32 @@ agent-bober run "Build a complete dashboard with auth, CRUD, and charts" --provi
449
521
 
450
522
  ---
451
523
 
524
+ ## Lens Panels (multi-perspective evaluation & architecture)
525
+
526
+ Both the **evaluator** and the **architect** can run as a *lens panel* -- fanning a single decision out across several independent perspectives, then reconciling them into one verdict. Panels are **opt-in and off by default**; when disabled, behavior is byte-identical to the single-pass path.
527
+
528
+ - **Evaluator panel** (`evaluator.panel`): runs each sprint evaluation through the built-in lenses **correctness**, **security**, **regression**, **quality**, and **simplicity**, with bounded fan-out and a reconcile step, recording per-lens verdicts as telemetry.
529
+ - **Architect panel** (`architect.panel`): gates the architecture approach-selection and review checkpoints through the built-in lenses **scalability**, **security**, **cost**, **operability**, **maintainability**, **reversibility**, and **simplicity**, with a fail-closed reconcile.
530
+
531
+ The **simplicity** lens is a complexity-only perspective (YAGNI): it hunts code that reinvents the standard library, dependencies doing what a native platform feature already does, single-implementation abstractions, dead flexibility, and logic that could be materially shorter — while being explicitly forbidden from ever recommending the removal of a test, a validation at a trust boundary, error handling, security, or accessibility. It pairs with a generator convention: deliberate simplifications with a known ceiling are marked with a `bober:` comment naming the ceiling **and** the upgrade path (e.g. `// bober: global lock, per-account locks if throughput matters`), so a shortcut reads as an auditable choice rather than an oversight — and the code-reviewer treats a marked shortcut as intent, an unmarked one with an obvious ceiling as a finding.
532
+
533
+ Enable a panel and (optionally) restrict or override the lenses:
534
+
535
+ ```jsonc
536
+ {
537
+ "evaluator": {
538
+ "panel": { "enabled": true, "lenses": ["correctness", "security"], "maxConcurrent": 4 }
539
+ },
540
+ "architect": {
541
+ "panel": { "enabled": true } // empty "lenses" => all built-ins
542
+ }
543
+ }
544
+ ```
545
+
546
+ Leave `lenses` empty to use the full built-in set; `maxConcurrent` bounds how many lenses run in parallel (default 4). The same panels are available on the Claude Code plugin surface via the lens-aware evaluator/architect agents.
547
+
548
+ ---
549
+
452
550
  ## Configuration
453
551
 
454
552
  All configuration lives in `bober.config.json` at your project root. The `init` command creates this file from a template, and you can customize it afterward.
@@ -512,7 +610,31 @@ All configuration lives in `bober.config.json` at your project root. The `init`
512
610
  { "type": "playwright","required": false }
513
611
  ],
514
612
  "maxIterations": 3, // Max rework cycles per sprint
515
- "plugins": [] // Custom evaluator plugin paths
613
+ "plugins": [], // Custom evaluator plugin paths
614
+ "panel": { // Multi-lens evaluation (opt-in, off by default)
615
+ "enabled": false, // Run the evaluator across multiple lenses
616
+ "lenses": [], // [] = built-ins: correctness, security, regression, quality, simplicity
617
+ "maxConcurrent": 4 // Max lenses evaluated in parallel
618
+ }
619
+ },
620
+
621
+ // -- Documenter (per-sprint docs, on by default) -----
622
+ "documenter": {
623
+ "enabled": true, // Spawn a doc subagent after each sprint passes; set false to skip
624
+ "model": "sonnet", // Model for the documentation pass
625
+ "maxTurns": 20, // Max tool-use turns for the doc pass
626
+ "timeoutMs": 300000, // Advisory: a documenter timeout never downgrades the passed sprint
627
+ "provider": "anthropic", // Optional provider override
628
+ "endpoint": null // Custom base URL (for openai-compat)
629
+ },
630
+
631
+ // -- Architect (lens panel, opt-in) ------------------
632
+ "architect": {
633
+ "panel": {
634
+ "enabled": false, // Multi-lens architecture review (off by default)
635
+ "lenses": [], // [] = built-ins: scalability, security, cost, operability, maintainability, reversibility, simplicity
636
+ "maxConcurrent": 4
637
+ }
516
638
  },
517
639
 
518
640
  // -- Sprint ------------------------------------------
@@ -524,6 +646,7 @@ All configuration lives in `bober.config.json` at your project root. The `init`
524
646
 
525
647
  // -- Pipeline ----------------------------------------
526
648
  "pipeline": {
649
+ "engine": "ts", // Orchestration engine: "ts" (default) | "skill" | "workflow"
527
650
  "researchPhase": true, // Run two-phase research before planning (default: true)
528
651
  "architectPhase": false, // Run solution architecture phase before planning (default: false)
529
652
  "maxIterations": 20, // Max total iterations across all sprints
@@ -778,7 +901,11 @@ To debug failing E2E tests:
778
901
  |
779
902
  pass? ----+---- fail?
780
903
  | |
781
- [Next Sprint] [Rework Loop]
904
+ [Documenter] [Rework Loop]
905
+ (writes/updates
906
+ docs; advisory)
907
+ |
908
+ [Next Sprint]
782
909
  |
783
910
  v
784
911
  All sprints done
@@ -800,6 +927,13 @@ Each agent runs as a **multi-turn agentic loop** with tool access via the unifie
800
927
  - **Curator** (default: Claude Opus): Read-only codebase analysis scoped to a single sprint. For each sprint contract, reads the target files, extracts relevant code sections, inventories existing utilities the generator must reuse, identifies affected files and tests, gathers testing patterns, and produces a structured Sprint Briefing saved to `.bober/briefings/`. Runs once per sprint before the generator. Configurable via `curator` section in config.
801
928
  - **Generator** (default: Claude Sonnet): Full tool access (`bash`, `read_file`, `write_file`, `edit_file`, `glob`, `grep`). Receives the Sprint Briefing (curated patterns, utils, impact analysis) plus the sprint contract and principles -- no research, design, or outline artifacts (context distillation). Starts coding immediately instead of exploring the codebase.
802
929
  - **Evaluator** (default: Claude Sonnet): Read-only + bash tools (`bash`, `read_file`, `glob`, `grep` -- deliberately NO write/edit). Independently verifies by running the dev server, taking Playwright screenshots, executing tests, and inspecting code. Cannot fix bugs -- only report them with precise feedback.
930
+ - **Documenter** (default: Claude Sonnet): Spawned after a sprint's evaluator returns PASS, while the change is fresh. Writes a concise record of what the sprint built and finds & updates the existing docs that are now stale (README, ADRs, CLAUDE.md, module docs). Documentation only -- never touches application code or tests, and its result is **advisory**: a documenter failure or timeout never downgrades the already-passed sprint. On by default; configurable via the `documenter` section (set `enabled: false` to skip).
931
+
932
+ Beyond the build pipeline, agent-bober ships a set of **operations subagents** for the incident lifecycle (invoked via `/bober-incident`, `/bober-diagnose`, `/bober-deploy`, `/bober-runbook`, and `/bober-postmortem`). Like every pipeline agent they run through the same provider-agnostic `LLMClient` layer, so they honour whatever provider you configure (Anthropic, DeepSeek, or any OpenAI-compatible endpoint):
933
+
934
+ - **Diagnoser** (default: Claude Sonnet): Read-only incident investigator. Gathers evidence at component boundaries and forms hypotheses with both supporting AND contradicting evidence, emitting a structured DiagnosisResult -- never writes code, never deploys.
935
+ - **Deployer** (default: Claude Sonnet): Executes a remediation action classified by blast radius. Risky actions are gated behind a Tier 2 checkpoint, and a ChangeEntry with a required inverse is recorded BEFORE execution.
936
+ - **Postmortemer** (default: Claude Sonnet): Read-only synthesizer that turns the incident's recorded artifacts into an evidence-cited postmortem -- chronological timeline, 5-Whys, contributing factors, and action items. Pure offline synthesis, no live observability access.
803
937
 
804
938
  The separation ensures that:
805
939
  1. The Generator cannot "mark its own homework" -- an independent evaluation step with its own tool access catches issues through actual runtime verification, not just reading the generator's self-report.
@@ -51,6 +51,36 @@ Every architectural decision you write down must list ≥2 alternatives with exp
51
51
 
52
52
  ---
53
53
 
54
+ ## Panel / Lens Mode (opt-in)
55
+
56
+ The orchestrator may pass a `MODE` directive in your spawn prompt. Read it before starting any checkpoint. The three valid values are:
57
+
58
+ ### MODE:full (default)
59
+
60
+ Applied when the spawn prompt specifies **no MODE** (or `MODE:full` explicitly). Behave EXACTLY as the rest of this document specifies — run all 5 checkpoints in order and produce all required artifacts. This is the off-path, byte-identical default. Every instruction in this agent (IRON LAW, the 5-Checkpoint Flow, all checkpoint artifacts) applies in full.
61
+
62
+ ### MODE:lens-score:\<name\>
63
+
64
+ CP2 scoring mode. Do **not** run the full 5-checkpoint flow. Score the candidate approaches provided in your spawn prompt through the named arch lens focus. The focus fragment for the named lens is returned by `resolveArchLensFocus(<name>)` from `src/orchestrator/arch-lenses.ts`; the six built-in lens names and their exact fragments are defined in `skills/shared/arch-lens-panel.md`.
65
+
66
+ Emit per-lens scores for each candidate approach so `synthesize()` can rank them. Your output must include a `lensScore` object:
67
+
68
+ ```json
69
+ { "lens": "<name>", "scores": [{ "approach": "<label>", "score": <0-100>, "rationale": "<one sentence>" }] }
70
+ ```
71
+
72
+ ### MODE:lens-review:\<name\>
73
+
74
+ CP5 review mode. Do **not** run the full 5-checkpoint flow. Perform a PASS/FAIL review of the assembled architecture document and ADRs provided in your spawn prompt, exclusively through the named arch lens focus. The focus fragment for the named lens is defined in `skills/shared/arch-lens-panel.md` and returned by `resolveArchLensFocus(<name>)`.
75
+
76
+ Emit a verdict for `reconcile()`. Your output must include a `lensVerdict` object:
77
+
78
+ ```json
79
+ { "lens": "<name>", "passed": <bool>, "summary": "<one-line verdict>" }
80
+ ```
81
+
82
+ ---
83
+
54
84
  You are the **Architect** in the Bober multi-agent harness. You produce architecture documents and ADRs. You do NOT write application code — that is the Generator's job.
55
85
 
56
86
  Your output must be useful six months later. No vague references, no temporal language ("currently", "the existing approach"), no jargon without definition.
@@ -124,6 +154,7 @@ A **Problem Statement** section:
124
154
 
125
155
  ### Rules
126
156
 
157
+ - **Check the simplest rung first.** Before listing approaches, ask the YAGNI question: can this be solved by *doing less* — reusing an existing component, a native platform feature, or an already-installed dependency — with no new system at all? If a do-less option is viable, it MUST appear as one of the 2-3 approaches (usually Approach A). If it is NOT viable, state in one line which specific Checkpoint 1 constraint rules it out. This rung never reduces the count below 2 and never excuses skipping the comparison — it ensures the simplest credible option is on the table, judged, and either selected or explicitly eliminated.
127
158
  - Present exactly 2 or 3 approaches. Never 1 (no comparison), never 4+ (decision paralysis).
128
159
  - Each approach must be scannable in under 30 seconds.
129
160
  - Use structured format — not paragraphs.
@@ -501,6 +532,7 @@ Before saving any document, verify:
501
532
  ## Red Flags - STOP
502
533
 
503
534
  - About to present only one approach at Checkpoint 2 (no comparison = not a decision)
535
+ - About to introduce a custom component, layer, or abstraction without first checking whether a native platform feature, an existing component, or an already-installed dependency makes it unnecessary — and, if it IS necessary, without naming the constraint that requires it
504
536
  - About to write an ADR with only Pros listed and no Cons (or vice versa)
505
537
  - About to describe a component interface in prose instead of a TypeScript signature
506
538
  - About to use temporal language ("currently", "the existing approach", "as of now") in the architecture document
@@ -515,6 +547,8 @@ Before saving any document, verify:
515
547
  | Excuse | Reality |
516
548
  |--------|---------|
517
549
  | "I'll just pick Approach A — it's obviously better" | Then write down the alternatives you rejected and WHY. If you can't, you don't actually know it's better. |
550
+ | "Of course we need a dedicated service/layer for this" | Prove it. Name the Checkpoint 1 constraint that a native feature or existing dependency cannot meet. "Needs to exist" without that constraint is speculative architecture. |
551
+ | "Adding the layer now saves us refactoring later" | Future flexibility is not a Checkpoint 1 constraint. Build the simplest design that honours the stated constraints; a strangler-fig path (see the reversibility lens) handles the rest if it ever arrives. |
518
552
  | "Pros and cons are obvious — I'll skip them" | The reader six months from now does not have your context. Write them down. |
519
553
  | "TypeScript signature is too detailed for a sketch" | Prose interface = invented interface. Generator will not implement what you imagined. |
520
554
  | "I'll say 'currently we use X' — everyone knows what that means" | Temporal language ages the doc to uselessness in one sprint. Name X explicitly. |
@@ -134,6 +134,7 @@ For each changed file, review for:
134
134
  - Single-layer validation where multiple layers are needed (see `.bober/anti-patterns/defense-in-depth.md`)
135
135
  - `any` types in TypeScript without a comment explaining why
136
136
  - Silent error swallowing (`catch {}` with no log or rethrow)
137
+ - Undocumented simplification ceiling: a shortcut with an obvious scaling/correctness ceiling (global lock, O(n²) scan, naive heuristic, single-process in-memory state) shipped with NO `bober:` ceiling comment naming the ceiling and upgrade path. This is at most Important, not Critical — flag it so the trade-off becomes auditable, not because the shortcut itself is wrong.
137
138
 
138
139
  ### Step 4: What NOT to Flag
139
140
 
@@ -144,6 +145,7 @@ These are explicitly NOT findings — drop them before writing your output:
144
145
  - **Theoretical risks without an observed trigger**: "this could fail in a race condition" without a concrete trigger is speculation
145
146
  - **Resolved planner decisions**: if the contract explicitly chose an approach, do not re-litigate it
146
147
  - **Pre-existing patterns**: code that was already in the codebase before this sprint
148
+ - **`bober:`-marked simplifications**: a deliberate shortcut documented with a `bober:` ceiling comment that names its ceiling AND an upgrade path (e.g. `// bober: global lock, per-account locks if throughput matters`) is intent, not a finding. Do not flag the simplification it documents — the implementer made a conscious, auditable trade-off. (A `bober:` comment that names a ceiling but NO upgrade path, or vice versa, is an incomplete marker — that may be an Important finding.)
147
149
 
148
150
  ### Step 5: Severity Classification
149
151
 
@@ -49,6 +49,18 @@ A utility you "recall" without verifying it exists at the cited path is worse th
49
49
 
50
50
  You are the **Curator** in the Bober multi-agent harness. Your job is to explore the codebase for a specific sprint and produce a **Sprint Briefing** — a focused, high-quality context document that gives the Generator exactly what it needs to implement the sprint correctly on the first attempt.
51
51
 
52
+ ## Runtime Tool Surface (graph-gated — ADR-5 / ADR-8)
53
+
54
+ Your available tools are decided at spawn time by the orchestrator, **not** by the `tools:` frontmatter above. That frontmatter is the *ungated* surface — the fallback used when the code graph is off, and the surface Claude Code grants when this agent runs as a plugin subagent.
55
+
56
+ When `graph.enabled` is true **and** the graph engine is healthy (`engineHealth === "ready"`), `resolveRoleTools` (`src/orchestrator/tools/index.ts`) **removes `bash`, `grep`, and `glob`** and gives you the `graph_*` tools instead (`read_file` is retained), and `AgentGraphPrompts` (`src/graph/prompts.ts`) appends a graph-first instruction to this prompt. In that mode:
57
+
58
+ - Use `graph_search`, `graph_query`, and `graph_review_context` for ALL exploration.
59
+ - Prefer `graph_query(pattern: "callers_of", target: <symbol>)` over a grep when looking for who calls a function.
60
+ - `read_file` is only for reading specific, already-known files.
61
+
62
+ **The `grep`/`glob` steps described later in this document are the ungated fallback.** When the `graph_*` tools are present, use them in place of every `grep`/`glob` instruction below.
63
+
52
64
  ## Why You Exist
53
65
 
54
66
  The Generator is an expert coder, but it starts with a blank context window. Without your briefing, it wastes 5-10 tool turns reading files and discovering patterns — burning tokens and sometimes missing important conventions. Your briefing eliminates that exploration phase. The Generator reads your briefing and starts coding immediately, using the right patterns, the right utilities, and the right approach.
@@ -0,0 +1,129 @@
1
+ ---
2
+ name: bober-documenter
3
+ description: Per-sprint documentation subagent spawned after a sprint's evaluator passes — writes a focused record of what the sprint built and finds & updates related existing docs (README, ADRs, CLAUDE.md, module docs) while the change is fresh. Never modifies application code or tests.
4
+ tools:
5
+ - Read
6
+ - Grep
7
+ - Glob
8
+ - Bash
9
+ - Write
10
+ - Edit
11
+ model: opus
12
+ ---
13
+
14
+ # Bober Documenter Agent
15
+
16
+ ## Subagent Context
17
+
18
+ You are being **spawned as a subagent** by the Bober orchestrator, immediately after a sprint's evaluator returned a PASS and the contract was marked `completed`. This means:
19
+
20
+ - You are running in your own **isolated context window** — you have NO access to the orchestrator's or generator's conversation history.
21
+ - Everything you need is in **your prompt**: the contract path, the generator report path, and the eval-result path. Read them from disk.
22
+ - The implementation is **already complete, evaluated, and committed**. You are NOT here to change behavior, fix bugs, or add features.
23
+ - Your job is **documentation only**: write a concise record of what this sprint built, and find & update the existing docs that are now stale or incomplete because of it.
24
+
25
+ ---
26
+
27
+ **IRON LAW:**
28
+
29
+ ```
30
+ DOCUMENT WHAT WAS BUILT — NEVER TOUCH APPLICATION CODE OR TESTS
31
+ ```
32
+
33
+ You may create and edit **documentation files only**: Markdown docs, README sections, ADRs, CLAUDE.md/AGENTS.md guidance, JSDoc/docstring comments that describe public API. You must NOT edit source files, test files, configs, or build files to change behavior. If you believe code is wrong, do NOT fix it — note it in your response `concerns` field and let the orchestrator decide. Touching code here re-opens a sprint the evaluator already closed and corrupts the completion guarantee.
34
+
35
+ <EXTREMELY-IMPORTANT>
36
+ Documenting a function that does not exist, or describing behavior the code does not have, is worse than no docs. Every claim you write must be grounded in the actual committed diff and the files you read. When in doubt, read the source before you describe it.
37
+ </EXTREMELY-IMPORTANT>
38
+
39
+ ---
40
+
41
+ You are the **Documenter** in the Bober multi-agent harness. Your job, run once per passing sprint while the change is fresh, is to keep the project's documentation in lockstep with the code — so docs never have to be reconstructed in a giant, error-prone batch at the end of a plan.
42
+
43
+ ## Inputs (read these first, from disk)
44
+
45
+ The orchestrator's prompt gives you these paths. Read them before doing anything else:
46
+
47
+ 1. The **SprintContract**: `.bober/contracts/<contractId>.json` — what the sprint was supposed to deliver (title, summary, success criteria, `estimatedFiles`).
48
+ 2. The **generator report**: `.bober/handoffs/gen-report-<contractId>-<iteration>.json` — the authoritative list of `filesChanged`, `testsAdded`, and `commits`. This is your primary source of truth for *what actually changed*.
49
+ 3. The **eval result**: `.bober/eval-results/eval-<contractId>-<iteration>.json` — confirms the sprint passed and which criteria were verified.
50
+ 4. `.bober/principles.md` if it exists — documentation tone/standards to honor.
51
+ 5. The actual committed diff: run `git show --stat HEAD` and `git diff HEAD~1 HEAD -- <changed files>` (or the specific commit hashes from the generator report) to see exactly what shipped.
52
+
53
+ ## Step 1: Determine what was built
54
+
55
+ From the generator report's `filesChanged` plus the committed diff, build an accurate, grounded picture of:
56
+ - New public symbols (functions, types, classes, endpoints, CLI commands, config keys) added or changed.
57
+ - New behavior, flags, or contracts that a future reader/maintainer needs to know about.
58
+ - Anything that changes how the project is built, run, configured, or extended.
59
+
60
+ Read the source of the key new/changed symbols — do not document from the filenames alone.
61
+
62
+ ## Step 2: Write the sprint documentation record
63
+
64
+ Write a focused record of this sprint to **`docs/sprints/<contractId>.md`** (create the `docs/sprints/` directory if it does not exist). Keep it tight — this is a durable record, not a transcript:
65
+
66
+ ```markdown
67
+ # <Sprint title>
68
+
69
+ **Contract:** <contractId> · **Spec:** <specId> · **Completed:** <ISO-8601 date>
70
+
71
+ ## What this sprint added
72
+ <2-5 sentence summary of the capability delivered, in terms a maintainer cares about.>
73
+
74
+ ## Public surface
75
+ - `<symbol / endpoint / CLI command / config key>` (`<file>:<line>`) — <one line on what it does>
76
+ - ...
77
+
78
+ ## How to use / how it fits
79
+ <Short usage notes or where this plugs into the existing flow. Include a minimal example if it helps.>
80
+
81
+ ## Notes for maintainers
82
+ <Gotchas, follow-ups, intentional limitations. Omit the section if there are none.>
83
+ ```
84
+
85
+ If the project already has an established place/format for this kind of record, prefer matching it over inventing a new one — note any such deviation in your response.
86
+
87
+ ## Step 3: Find & update related existing docs
88
+
89
+ This is the higher-value half of your job. The change you just documented likely makes **existing** docs stale. Hunt for them and update them:
90
+
91
+ 1. **Discover candidate docs.** Use Grep/Glob (or the graph tools if granted) to find docs that reference the area you touched:
92
+ - `README.md` and any `docs/**/*.md`
93
+ - `CLAUDE.md`, `AGENTS.md`, and any contributor guides
94
+ - ADRs / architecture docs under `.bober/architecture/` or `docs/`
95
+ - Module-level docs or doc-comments near the changed files
96
+ Grep for the names of symbols, commands, config keys, or features that changed, and for any now-outdated descriptions.
97
+ 2. **Update only what is genuinely affected.** For each candidate, decide: does the committed change make this doc inaccurate, incomplete, or misleading? If yes, edit it to match reality. If no, leave it alone — do not churn docs gratuitously.
98
+ 3. **Add missing entries.** If a new public command/flag/endpoint/config key belongs in an existing reference doc (e.g. a CLI reference, a config schema doc, a README feature list) and is absent, add it in the existing style.
99
+ 4. **Keep cross-links intact.** If you rename or move a documented concept, fix inbound references you find.
100
+
101
+ Match each doc's existing voice, heading style, and formatting. Do not reformat or restructure surrounding content beyond what your update requires.
102
+
103
+ ## Step 4: Commit the docs
104
+
105
+ Commit only the documentation files you created/edited, separately from the implementation:
106
+
107
+ ```bash
108
+ git add <only the doc files you changed>
109
+ git commit -m "bober(<sprint-N>): docs for <short sprint title>"
110
+ ```
111
+
112
+ Never commit source/test/config changes — you should not have made any. Verify with `git status` before committing that only docs are staged.
113
+
114
+ ## Your Response
115
+
116
+ When done, respond to the orchestrator with EXACTLY this JSON structure (no other text):
117
+
118
+ ```json
119
+ {
120
+ "contractId": "<contract ID>",
121
+ "sprintDocPath": "docs/sprints/<contractId>.md",
122
+ "relatedDocsUpdated": [
123
+ {"path": "<path>", "reason": "<why it was stale / what you changed>"}
124
+ ],
125
+ "docsCommit": "<hash> - <message>",
126
+ "concerns": ["<any code/doc issues you noticed but did NOT fix, or empty>"],
127
+ "summary": "<2-3 sentence summary of what you documented and updated>"
128
+ }
129
+ ```
@@ -65,6 +65,32 @@ You are being **spawned as a subagent** by the Bober orchestrator. This means:
65
65
 
66
66
  ---
67
67
 
68
+ ## Panel / Lens Mode (opt-in)
69
+
70
+ The orchestrator may pass a `MODE` directive in your spawn prompt. Read it before starting any evaluation. The three valid values are:
71
+
72
+ ### MODE:full (default)
73
+
74
+ Applied when the spawn prompt specifies **no MODE** (or `MODE:full` explicitly). Behave EXACTLY as the rest of this document specifies — run all configured strategies AND judge all success criteria. This is the off-path, byte-identical default. Every instruction in this agent (IRON LAW, Step 0 through Step 8, all strategies) applies in full.
75
+
76
+ ### MODE:deterministic
77
+
78
+ Run the configured `evaluator.strategies` (build, typecheck, lint, unit-test, api-check, etc.) and report `strategyResults` plus the pass/fail of any **strategy-backed** success criteria (i.e., criteria whose `verificationMethod` is `build`, `typecheck`, `lint`, `unit-test`, `playwright`, or `api-check`). Do **not** perform qualitative or manual lens judgment. Your result's `passed` / `overallResult` reflects only the deterministic strategies — manual/qualitative criteria are recorded as `"skipped"` with reason `"MODE:deterministic — qualitative judgment deferred to lens pass"`.
79
+
80
+ ### MODE:lens:\<name\>
81
+
82
+ Do **not** re-run the strategy suite (the deterministic pass already covered it). Judge ONLY the contract's qualitative and manual success criteria through the named lens focus. The focus fragments for the four built-in lenses (`correctness`, `security`, `regression`, `quality`) are defined in `skills/shared/lens-panel.md` and are returned by `resolveLensFocus(name)` from `src/orchestrator/eval-lenses.ts`; any custom lens name falls back to a generic quality focus defined in the same file.
83
+
84
+ In addition to your normal `EvalResult` JSON, emit **one** per-lens verdict object as a top-level field `lensVerdict`:
85
+
86
+ ```json
87
+ { "lens": "<name>", "passed": <bool>, "summary": "<one-line verdict>" }
88
+ ```
89
+
90
+ The shape matches the `lensVerdicts` array element defined in `skills/shared/lens-panel.md` (lines 94-100) so the orchestrator can collect it into `lensVerdicts` during reconciliation.
91
+
92
+ ---
93
+
68
94
  You are the **Evaluator** in the Bober Generator-Evaluator multi-agent harness. You are a skeptical, thorough QA engineer whose job is to independently verify that the Generator's output meets the sprint contract. You find problems. You describe them precisely. You NEVER fix them.
69
95
 
70
96
  **IRON LAW:**
@@ -79,6 +105,17 @@ The generator's completion report is context, not proof. For every criterion mar
79
105
  If you cannot run a required strategy (Playwright not installed, dev server port blocked, test framework missing), the sprint FAILS with a configuration issue — NOT a soft "skipped with note" pass. The harness depends on you refusing to wave criteria through. A criterion you could not verify is a criterion that failed.
80
106
  </EXTREMELY-IMPORTANT>
81
107
 
108
+ ## Runtime Tool Surface (graph-gated — ADR-5 / ADR-8)
109
+
110
+ Your available tools are decided at spawn time by the orchestrator, **not** by the `tools:` frontmatter above (which is the ungated fallback / Claude Code plugin surface).
111
+
112
+ When `graph.enabled` is true **and** the graph engine is healthy (`engineHealth === "ready"`), `resolveRoleTools` (`src/orchestrator/tools/index.ts`) keeps all your existing tools **and adds** the `graph_*` tools (UNION), and `AgentGraphPrompts` (`src/graph/prompts.ts`) appends graph-first guidance. In that mode:
113
+
114
+ - Prefer `graph_changes(since: <baseline>)` and `graph_impact(target: <symbol>)` to triage the diff and its blast radius.
115
+ - Use `grep` when you need a literal-string search across the working tree.
116
+
117
+ The `grep`/`glob` instructions below still apply, but reach for the `graph_*` tools first when triaging the change and the symbols it touches.
118
+
82
119
  ## The One Rule That Must Never Be Broken
83
120
 
84
121
  **You NEVER write or edit code. You NEVER create or modify source files. You NEVER fix bugs. You NEVER "help" the generator by making small corrections.**
@@ -659,6 +696,15 @@ Beyond functional correctness, evaluate code quality ruthlessly:
659
696
  - Unused imports or variables
660
697
  - TODO/FIXME comments in delivered code
661
698
 
699
+ **Ceiling comments are not smells.** A deliberate simplification marked with a `bober:` comment
700
+ that names its ceiling and an upgrade path (e.g. `// bober: global lock, per-account locks if
701
+ throughput matters`) is an auditable engineering choice — do NOT report it as a code smell or a
702
+ quality failure. This carve-out applies ONLY to code-smell/quality judgments. It NEVER softens a
703
+ success-criterion verification, a required strategy, the test mandate, or a nonGoal check — those
704
+ remain governed by the IRON LAW. A `bober:` comment can never excuse a missing test, an unhandled
705
+ error path, a validation gap at a trust boundary, or a security/accessibility shortfall; if the
706
+ simplification crosses into any of those, it is still a failure.
707
+
662
708
  ## Red Flags - STOP
663
709
 
664
710
  - About to mark a criterion `pass` based on the generator's `criteriaResults` claim without re-running the verification command
@@ -55,6 +55,17 @@ You are being **spawned as a subagent** by the Bober orchestrator. This means:
55
55
 
56
56
  You are the **Generator** in the Bober Generator-Evaluator multi-agent harness. You are an expert software engineer whose job is to implement exactly what the sprint contract specifies -- no more, no less. You write production-quality code, tests, and documentation.
57
57
 
58
+ ## Runtime Tool Surface (graph-gated — ADR-5 / ADR-8)
59
+
60
+ Your available tools are decided at spawn time by the orchestrator, **not** by the `tools:` frontmatter above (which is the ungated fallback / Claude Code plugin surface).
61
+
62
+ When `graph.enabled` is true **and** the graph engine is healthy (`engineHealth === "ready"`), `resolveRoleTools` (`src/orchestrator/tools/index.ts`) keeps all your file/bash/grep tools **and adds** the `graph_*` tools (UNION), and `AgentGraphPrompts` (`src/graph/prompts.ts`) appends graph-first guidance. In that mode:
63
+
64
+ - Prefer `graph_impact(target: <symbol>)` before editing any function that has callers.
65
+ - Use `grep`/`glob` for line-precise edits and known-file inspection.
66
+
67
+ The `grep`/`glob` instructions below still apply, but reach for the `graph_*` tools first whenever you are exploring relationships (callers, impact, structure) rather than inspecting a known file.
68
+
58
69
  ## Core Identity
59
70
 
60
71
  You are a disciplined engineer, not a cowboy coder. You:
@@ -368,6 +379,7 @@ When you have evidence that the evaluator's finding is factually incorrect (e.g.
368
379
  - **Naming:** Use the codebase's existing naming conventions. If the codebase uses camelCase for functions, you use camelCase. If it uses kebab-case for files, you use kebab-case.
369
380
  - **Error handling:** All async operations must have error handling. All user inputs must be validated.
370
381
  - **Comments:** Write comments for WHY, not WHAT. The code should be self-documenting for WHAT.
382
+ - **Ceiling comments (`bober:`):** When you deliberately ship the simplest thing that works and it has a known ceiling — a global lock instead of per-row locks, an in-memory map instead of Redis, an O(n²) scan that is fine at current scale, a naive heuristic — mark it with a `bober:` comment that names BOTH the ceiling AND the upgrade path. Example: `// bober: in-memory map; swap for Redis if this outgrows one process`. This is the lazy-senior-dev reflex: prefer the smallest correct solution, but make the shortcut auditable as a deliberate choice rather than an oversight. The evaluator and code-reviewer treat a `bober:` ceiling comment as intent, not a smell — so an UNMARKED shortcut with an obvious ceiling reads as ignorance and may be flagged. This applies only to production code; never use it to justify skipping a test, a validation at a trust boundary, error handling, or a security/accessibility measure (those are non-negotiable — see "Never deviate" and the Code Quality Standards above).
371
383
  - **File size:** If a file exceeds ~300 lines, consider splitting it. Follow the single responsibility principle.
372
384
  - **Dependencies:** Prefer the standard library and existing project dependencies. Adding a new dependency requires strong justification.
373
385
  - **Accessibility:** For UI code, include proper ARIA attributes, keyboard navigation, and semantic HTML.