agent-bober 0.1.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 (212) hide show
  1. package/.claude-plugin/plugin.json +9 -0
  2. package/LICENSE +21 -0
  3. package/README.md +495 -0
  4. package/agents/bober-evaluator.md +323 -0
  5. package/agents/bober-generator.md +245 -0
  6. package/agents/bober-planner.md +248 -0
  7. package/dist/cli/commands/eval.d.ts +6 -0
  8. package/dist/cli/commands/eval.d.ts.map +1 -0
  9. package/dist/cli/commands/eval.js +129 -0
  10. package/dist/cli/commands/eval.js.map +1 -0
  11. package/dist/cli/commands/init.d.ts +5 -0
  12. package/dist/cli/commands/init.d.ts.map +1 -0
  13. package/dist/cli/commands/init.js +547 -0
  14. package/dist/cli/commands/init.js.map +1 -0
  15. package/dist/cli/commands/plan.d.ts +5 -0
  16. package/dist/cli/commands/plan.d.ts.map +1 -0
  17. package/dist/cli/commands/plan.js +87 -0
  18. package/dist/cli/commands/plan.js.map +1 -0
  19. package/dist/cli/commands/run.d.ts +5 -0
  20. package/dist/cli/commands/run.d.ts.map +1 -0
  21. package/dist/cli/commands/run.js +120 -0
  22. package/dist/cli/commands/run.js.map +1 -0
  23. package/dist/cli/commands/sprint.d.ts +6 -0
  24. package/dist/cli/commands/sprint.d.ts.map +1 -0
  25. package/dist/cli/commands/sprint.js +206 -0
  26. package/dist/cli/commands/sprint.js.map +1 -0
  27. package/dist/cli/index.d.ts +3 -0
  28. package/dist/cli/index.d.ts.map +1 -0
  29. package/dist/cli/index.js +124 -0
  30. package/dist/cli/index.js.map +1 -0
  31. package/dist/config/defaults.d.ts +15 -0
  32. package/dist/config/defaults.d.ts.map +1 -0
  33. package/dist/config/defaults.js +226 -0
  34. package/dist/config/defaults.js.map +1 -0
  35. package/dist/config/index.d.ts +4 -0
  36. package/dist/config/index.d.ts.map +1 -0
  37. package/dist/config/index.js +8 -0
  38. package/dist/config/index.js.map +1 -0
  39. package/dist/config/loader.d.ts +18 -0
  40. package/dist/config/loader.d.ts.map +1 -0
  41. package/dist/config/loader.js +189 -0
  42. package/dist/config/loader.js.map +1 -0
  43. package/dist/config/schema.d.ts +904 -0
  44. package/dist/config/schema.d.ts.map +1 -0
  45. package/dist/config/schema.js +181 -0
  46. package/dist/config/schema.js.map +1 -0
  47. package/dist/contracts/eval-result.d.ts +205 -0
  48. package/dist/contracts/eval-result.d.ts.map +1 -0
  49. package/dist/contracts/eval-result.js +87 -0
  50. package/dist/contracts/eval-result.js.map +1 -0
  51. package/dist/contracts/index.d.ts +4 -0
  52. package/dist/contracts/index.d.ts.map +1 -0
  53. package/dist/contracts/index.js +16 -0
  54. package/dist/contracts/index.js.map +1 -0
  55. package/dist/contracts/spec.d.ts +101 -0
  56. package/dist/contracts/spec.d.ts.map +1 -0
  57. package/dist/contracts/spec.js +51 -0
  58. package/dist/contracts/spec.js.map +1 -0
  59. package/dist/contracts/sprint-contract.d.ts +141 -0
  60. package/dist/contracts/sprint-contract.d.ts.map +1 -0
  61. package/dist/contracts/sprint-contract.js +80 -0
  62. package/dist/contracts/sprint-contract.js.map +1 -0
  63. package/dist/evaluators/builtin/api-check.d.ts +13 -0
  64. package/dist/evaluators/builtin/api-check.d.ts.map +1 -0
  65. package/dist/evaluators/builtin/api-check.js +152 -0
  66. package/dist/evaluators/builtin/api-check.js.map +1 -0
  67. package/dist/evaluators/builtin/build-check.d.ts +17 -0
  68. package/dist/evaluators/builtin/build-check.d.ts.map +1 -0
  69. package/dist/evaluators/builtin/build-check.js +155 -0
  70. package/dist/evaluators/builtin/build-check.js.map +1 -0
  71. package/dist/evaluators/builtin/command-runner.d.ts +26 -0
  72. package/dist/evaluators/builtin/command-runner.d.ts.map +1 -0
  73. package/dist/evaluators/builtin/command-runner.js +114 -0
  74. package/dist/evaluators/builtin/command-runner.js.map +1 -0
  75. package/dist/evaluators/builtin/lint.d.ts +17 -0
  76. package/dist/evaluators/builtin/lint.d.ts.map +1 -0
  77. package/dist/evaluators/builtin/lint.js +264 -0
  78. package/dist/evaluators/builtin/lint.js.map +1 -0
  79. package/dist/evaluators/builtin/playwright.d.ts +16 -0
  80. package/dist/evaluators/builtin/playwright.d.ts.map +1 -0
  81. package/dist/evaluators/builtin/playwright.js +238 -0
  82. package/dist/evaluators/builtin/playwright.js.map +1 -0
  83. package/dist/evaluators/builtin/typescript-check.d.ts +12 -0
  84. package/dist/evaluators/builtin/typescript-check.d.ts.map +1 -0
  85. package/dist/evaluators/builtin/typescript-check.js +155 -0
  86. package/dist/evaluators/builtin/typescript-check.js.map +1 -0
  87. package/dist/evaluators/builtin/unit-test.d.ts +18 -0
  88. package/dist/evaluators/builtin/unit-test.d.ts.map +1 -0
  89. package/dist/evaluators/builtin/unit-test.js +279 -0
  90. package/dist/evaluators/builtin/unit-test.js.map +1 -0
  91. package/dist/evaluators/index.d.ts +11 -0
  92. package/dist/evaluators/index.d.ts.map +1 -0
  93. package/dist/evaluators/index.js +13 -0
  94. package/dist/evaluators/index.js.map +1 -0
  95. package/dist/evaluators/plugin-interface.d.ts +50 -0
  96. package/dist/evaluators/plugin-interface.d.ts.map +1 -0
  97. package/dist/evaluators/plugin-interface.js +2 -0
  98. package/dist/evaluators/plugin-interface.js.map +1 -0
  99. package/dist/evaluators/plugin-loader.d.ts +18 -0
  100. package/dist/evaluators/plugin-loader.d.ts.map +1 -0
  101. package/dist/evaluators/plugin-loader.js +107 -0
  102. package/dist/evaluators/plugin-loader.js.map +1 -0
  103. package/dist/evaluators/registry.d.ts +78 -0
  104. package/dist/evaluators/registry.d.ts.map +1 -0
  105. package/dist/evaluators/registry.js +238 -0
  106. package/dist/evaluators/registry.js.map +1 -0
  107. package/dist/index.d.ts +17 -0
  108. package/dist/index.d.ts.map +1 -0
  109. package/dist/index.js +22 -0
  110. package/dist/index.js.map +1 -0
  111. package/dist/orchestrator/context-handoff.d.ts +543 -0
  112. package/dist/orchestrator/context-handoff.d.ts.map +1 -0
  113. package/dist/orchestrator/context-handoff.js +133 -0
  114. package/dist/orchestrator/context-handoff.js.map +1 -0
  115. package/dist/orchestrator/evaluator-agent.d.ts +15 -0
  116. package/dist/orchestrator/evaluator-agent.d.ts.map +1 -0
  117. package/dist/orchestrator/evaluator-agent.js +233 -0
  118. package/dist/orchestrator/evaluator-agent.js.map +1 -0
  119. package/dist/orchestrator/generator-agent.d.ts +16 -0
  120. package/dist/orchestrator/generator-agent.d.ts.map +1 -0
  121. package/dist/orchestrator/generator-agent.js +147 -0
  122. package/dist/orchestrator/generator-agent.js.map +1 -0
  123. package/dist/orchestrator/pipeline.d.ts +24 -0
  124. package/dist/orchestrator/pipeline.d.ts.map +1 -0
  125. package/dist/orchestrator/pipeline.js +290 -0
  126. package/dist/orchestrator/pipeline.js.map +1 -0
  127. package/dist/orchestrator/planner-agent.d.ts +10 -0
  128. package/dist/orchestrator/planner-agent.d.ts.map +1 -0
  129. package/dist/orchestrator/planner-agent.js +187 -0
  130. package/dist/orchestrator/planner-agent.js.map +1 -0
  131. package/dist/state/helpers.d.ts +5 -0
  132. package/dist/state/helpers.d.ts.map +1 -0
  133. package/dist/state/helpers.js +8 -0
  134. package/dist/state/helpers.js.map +1 -0
  135. package/dist/state/history.d.ts +39 -0
  136. package/dist/state/history.d.ts.map +1 -0
  137. package/dist/state/history.js +162 -0
  138. package/dist/state/history.js.map +1 -0
  139. package/dist/state/index.d.ts +8 -0
  140. package/dist/state/index.d.ts.map +1 -0
  141. package/dist/state/index.js +22 -0
  142. package/dist/state/index.js.map +1 -0
  143. package/dist/state/plan-state.d.ts +21 -0
  144. package/dist/state/plan-state.d.ts.map +1 -0
  145. package/dist/state/plan-state.js +108 -0
  146. package/dist/state/plan-state.js.map +1 -0
  147. package/dist/state/sprint-state.d.ts +20 -0
  148. package/dist/state/sprint-state.d.ts.map +1 -0
  149. package/dist/state/sprint-state.js +98 -0
  150. package/dist/state/sprint-state.js.map +1 -0
  151. package/dist/utils/fs.d.ts +31 -0
  152. package/dist/utils/fs.d.ts.map +1 -0
  153. package/dist/utils/fs.js +67 -0
  154. package/dist/utils/fs.js.map +1 -0
  155. package/dist/utils/git.d.ts +35 -0
  156. package/dist/utils/git.d.ts.map +1 -0
  157. package/dist/utils/git.js +84 -0
  158. package/dist/utils/git.js.map +1 -0
  159. package/dist/utils/index.d.ts +4 -0
  160. package/dist/utils/index.d.ts.map +1 -0
  161. package/dist/utils/index.js +4 -0
  162. package/dist/utils/index.js.map +1 -0
  163. package/dist/utils/logger.d.ts +45 -0
  164. package/dist/utils/logger.d.ts.map +1 -0
  165. package/dist/utils/logger.js +73 -0
  166. package/dist/utils/logger.js.map +1 -0
  167. package/hooks/hooks.json +10 -0
  168. package/package.json +67 -0
  169. package/scripts/detect-stack.sh +287 -0
  170. package/scripts/init-project.sh +206 -0
  171. package/scripts/run-eval.sh +175 -0
  172. package/skills/bober.anchor/SKILL.md +365 -0
  173. package/skills/bober.anchor/references/anchor-guide.md +567 -0
  174. package/skills/bober.brownfield/SKILL.md +422 -0
  175. package/skills/bober.brownfield/references/codebase-analysis.md +304 -0
  176. package/skills/bober.eval/SKILL.md +235 -0
  177. package/skills/bober.eval/references/eval-strategies.md +407 -0
  178. package/skills/bober.eval/references/feedback-format.md +182 -0
  179. package/skills/bober.plan/SKILL.md +244 -0
  180. package/skills/bober.plan/references/clarification-guide.md +124 -0
  181. package/skills/bober.plan/references/spec-schema.md +253 -0
  182. package/skills/bober.react/SKILL.md +330 -0
  183. package/skills/bober.react/references/react-scaffold.md +344 -0
  184. package/skills/bober.run/SKILL.md +303 -0
  185. package/skills/bober.solidity/SKILL.md +416 -0
  186. package/skills/bober.solidity/references/solidity-guide.md +487 -0
  187. package/skills/bober.sprint/SKILL.md +280 -0
  188. package/skills/bober.sprint/references/contract-schema.md +251 -0
  189. package/templates/base/CLAUDE.md +20 -0
  190. package/templates/base/bober.config.json +35 -0
  191. package/templates/brownfield/CLAUDE.md +34 -0
  192. package/templates/brownfield/bober.config.json +37 -0
  193. package/templates/presets/anchor/CLAUDE.md +163 -0
  194. package/templates/presets/anchor/bober.config.json +9 -0
  195. package/templates/presets/api-node/CLAUDE.md +153 -0
  196. package/templates/presets/api-node/bober.config.json +10 -0
  197. package/templates/presets/nextjs/CLAUDE.md +82 -0
  198. package/templates/presets/nextjs/bober.config.json +14 -0
  199. package/templates/presets/python-api/CLAUDE.md +202 -0
  200. package/templates/presets/python-api/bober.config.json +9 -0
  201. package/templates/presets/react-vite/CLAUDE.md +71 -0
  202. package/templates/presets/react-vite/bober.config.json +53 -0
  203. package/templates/presets/react-vite/scaffold/package.json +45 -0
  204. package/templates/presets/react-vite/scaffold/server/index.ts +38 -0
  205. package/templates/presets/react-vite/scaffold/server/tsconfig.json +24 -0
  206. package/templates/presets/react-vite/scaffold/src/App.tsx +37 -0
  207. package/templates/presets/react-vite/scaffold/src/index.html +12 -0
  208. package/templates/presets/react-vite/scaffold/src/main.tsx +12 -0
  209. package/templates/presets/react-vite/scaffold/tsconfig.json +27 -0
  210. package/templates/presets/react-vite/scaffold/vite.config.ts +34 -0
  211. package/templates/presets/solidity/CLAUDE.md +106 -0
  212. package/templates/presets/solidity/bober.config.json +9 -0
@@ -0,0 +1,303 @@
1
+ ---
2
+ name: bober.run
3
+ description: Full autonomous pipeline — plan a feature, execute all sprints, evaluate each one, and iterate until complete or stuck.
4
+ argument-hint: <task-description>
5
+ ---
6
+
7
+ # bober.run — Full Pipeline Orchestrator
8
+
9
+ You are running the **bober.run** skill. This is the top-level orchestrator that runs the entire Generator-Evaluator pipeline from start to finish: planning, sprint execution, evaluation, and iteration. The user provides a task description and you deliver a working implementation.
10
+
11
+ ## Overview
12
+
13
+ The pipeline follows this flow:
14
+
15
+ ```
16
+ User Task Description
17
+ |
18
+ v
19
+ [1. PLAN] -----> PlanSpec + Sprint Contracts
20
+ |
21
+ v
22
+ [2. SPRINT LOOP]
23
+ |
24
+ +----> [2a. Generate] ---> Code changes
25
+ | |
26
+ | v
27
+ | [2b. Evaluate] ---> Pass/Fail
28
+ | |
29
+ | fail + retries left?
30
+ | |
31
+ | yes: feedback --> [2a. Generate]
32
+ | no: escalate
33
+ |
34
+ | pass: next sprint
35
+ |
36
+ v
37
+ [3. COMPLETE] ---> All sprints done
38
+ ```
39
+
40
+ ## Step 1: Initialize and Plan
41
+
42
+ ### 1a. Check Project State
43
+
44
+ Read `bober.config.json`. If it does not exist:
45
+ - Ask the user the minimal initialization questions: project name, mode (greenfield vs brownfield), and what they are building
46
+ - Determine the appropriate `mode` and `preset` (if any) from the user's description
47
+ - Create `bober.config.json` with appropriate defaults
48
+ - Create the `.bober/` directory structure
49
+
50
+ If `bober.config.json` exists, read the configuration.
51
+
52
+ ### 1b. Check for Existing Plans
53
+
54
+ Read `.bober/specs/` and `.bober/progress.md`. If there is an existing plan with incomplete sprints:
55
+
56
+ Ask the user:
57
+ ```
58
+ I found an existing plan: "<plan title>" with <N> sprints (<M> completed, <K> remaining).
59
+
60
+ A) Continue with the existing plan (resume from sprint <next>)
61
+ B) Create a new plan for your task (the existing plan stays but won't be executed)
62
+ C) Archive the existing plan and start fresh
63
+ ```
64
+
65
+ ### 1c. Run the Planning Phase
66
+
67
+ If creating a new plan, execute the bober.plan workflow:
68
+
69
+ 1. Gather codebase context (read key files, survey structure)
70
+ 2. Ask 3-5 clarifying questions about the task
71
+ 3. Wait for user responses
72
+ 4. Generate the PlanSpec with sprint decomposition
73
+ 5. Save everything to `.bober/`
74
+
75
+ **Configuration values that matter:**
76
+ - `planner.maxClarifications`: Max questions to ask
77
+ - `sprint.maxSprints`: Maximum number of sprints in the plan
78
+ - `sprint.sprintSize`: Size calibration for sprint decomposition
79
+
80
+ Report the plan summary to the user and proceed.
81
+
82
+ ## Step 2: Sprint Execution Loop
83
+
84
+ Load the sprint contracts from `.bober/contracts/` in order. For each sprint with status `proposed` or `needs-rework`:
85
+
86
+ ### 2a. Pre-Sprint Checks
87
+
88
+ 1. **Verify dependencies:** All sprints in `dependsOn` must have status `completed`
89
+ 2. **Verify build state:** The project must build before starting a new sprint
90
+ ```bash
91
+ # Run configured build/compile command (varies by stack)
92
+ # e.g., npm run build, anchor build, forge build, cargo build
93
+ ```
94
+ If the build is broken BEFORE the sprint starts, stop and report this to the user. Do not start a sprint on a broken codebase.
95
+ 3. **Verify git state:** Ensure we are on the correct feature branch
96
+ ```bash
97
+ git branch --show-current
98
+ ```
99
+ 4. **Check iteration budget:** Read `pipeline.maxIterations` from config. Track total iterations across all sprints. If the budget is exhausted, stop.
100
+
101
+ ### 2b. Contract Negotiation
102
+
103
+ If the sprint status is `proposed`:
104
+ - Review success criteria for executability
105
+ - Verify evaluation strategies are available
106
+ - Adjust criteria if needed
107
+ - Update status to `in-progress`
108
+
109
+ ### 2c. Generate
110
+
111
+ Create a ContextHandoff for the Generator:
112
+ - Include the contract, project context, config, and any evaluator feedback (for retries)
113
+ - Include summaries of completed sprints
114
+ - Include relevant file paths
115
+
116
+ Spawn the `bober-generator` subagent.
117
+
118
+ After generation:
119
+ - Read the Generator's completion report
120
+ - Verify commits were made
121
+ - Proceed to evaluation
122
+
123
+ ### 2d. Evaluate
124
+
125
+ Create a ContextHandoff for the Evaluator:
126
+ - Include the contract, Generator's report, config
127
+
128
+ Spawn the `bober-evaluator` subagent.
129
+
130
+ After evaluation:
131
+ - Read the EvalResult
132
+ - Save it to `.bober/eval-results/`
133
+ - Determine pass/fail
134
+
135
+ ### 2e. Process Result
136
+
137
+ **On PASS:**
138
+ 1. Update contract status to `completed`
139
+ 2. Update `.bober/progress.md`
140
+ 3. Log to `.bober/history.jsonl`
141
+ 4. Report milestone to user:
142
+ ```
143
+ Sprint <N>/<total> PASSED: <title>
144
+ Progress: [=====> ] <N>/<total> sprints complete
145
+ Next: <next sprint title>
146
+ ```
147
+ 5. Move to next sprint
148
+
149
+ **On FAIL with retries remaining:**
150
+ 1. Check if iteration count < `evaluator.maxIterations` (default: 3)
151
+ 2. Feed evaluator feedback back to Generator (go to 2c)
152
+ 3. Report retry:
153
+ ```
154
+ Sprint <N> iteration <M> failed. Retrying with evaluator feedback...
155
+ Failed: <brief failure summary>
156
+ ```
157
+
158
+ **On FAIL with no retries:**
159
+ 1. Update contract status to `needs-rework`
160
+ 2. Decide whether to continue or stop based on severity:
161
+ - If the failure is in a non-blocking sprint (nothing depends on it), skip and continue
162
+ - If the failure blocks subsequent sprints, stop the pipeline
163
+ 3. Report to user with full context
164
+
165
+ ### 2f. Context Reset
166
+
167
+ After each sprint completes (pass or fail), check `pipeline.contextReset`:
168
+ - `always`: Fresh context for the next sprint. The next sprint's Generator receives only its handoff document.
169
+ - `on-threshold`: Continue with current context unless it is getting large. If context exceeds a reasonable threshold (use your judgment), reset.
170
+ - `never`: Carry all context forward (not recommended for long pipelines).
171
+
172
+ ### 2g. Iteration Budget
173
+
174
+ Track total Generator-Evaluator iterations across all sprints:
175
+ - Each Generator+Evaluator cycle counts as 1 iteration
176
+ - When total iterations reach `pipeline.maxIterations` (default: 20), stop the pipeline regardless of sprint status
177
+ - Report the budget status:
178
+ ```
179
+ Iteration budget: <used>/<max>
180
+ ```
181
+
182
+ ## Step 3: Completion
183
+
184
+ When all sprints are complete (or the pipeline stops):
185
+
186
+ ### All Sprints Passed
187
+
188
+ ```
189
+ ## Pipeline Complete
190
+
191
+ All <N> sprints passed successfully.
192
+
193
+ ### Results
194
+ 1. [PASS] Sprint 1: <title>
195
+ 2. [PASS] Sprint 2: <title>
196
+ ...
197
+
198
+ ### Statistics
199
+ - Total iterations: <N>
200
+ - Sprints: <N>/<N> passed
201
+ - Time: <start> to <end>
202
+
203
+ ### What Was Built
204
+ <Brief summary of the complete feature>
205
+
206
+ ### Next Steps
207
+ - Review the code on branch: bober/<feature-slug>
208
+ - Run the test suite: npm test
209
+ - Merge to main when ready: git merge bober/<feature-slug>
210
+ ```
211
+
212
+ ### Pipeline Stopped (failures or budget exhausted)
213
+
214
+ ```
215
+ ## Pipeline Stopped
216
+
217
+ Completed <M> of <N> sprints. Stopped because: <reason>
218
+
219
+ ### Results
220
+ 1. [PASS] Sprint 1: <title>
221
+ 2. [PASS] Sprint 2: <title>
222
+ 3. [FAIL] Sprint 3: <title> -- <failure reason>
223
+ 4. [PENDING] Sprint 4: <title>
224
+
225
+ ### Failed Sprint Details
226
+ Sprint 3: <title>
227
+ - Failed criteria: <list>
228
+ - Last evaluator feedback: <summary>
229
+ - Iterations used: <N>/<max>
230
+
231
+ ### Recommended Actions
232
+ - Review evaluator feedback for Sprint 3
233
+ - Consider simplifying the sprint scope
234
+ - Run /bober.sprint 3 to retry Sprint 3 individually
235
+ - Run /bober.plan to revise the plan
236
+ ```
237
+
238
+ ## Human Escalation Protocol
239
+
240
+ Escalate to the user (pause and ask) when:
241
+
242
+ 1. **Approval required:** If `pipeline.requireApproval` is `true` in config, pause before each sprint and show the contract summary. Wait for user approval before proceeding.
243
+
244
+ 2. **Sprint failed after max iterations:** Report the full failure context and ask the user how to proceed:
245
+ - A) Retry the sprint with revised instructions
246
+ - B) Skip this sprint and continue with the next
247
+ - C) Revise the plan
248
+ - D) Stop the pipeline
249
+
250
+ 3. **Ambiguous situation:** If the codebase state is unclear, the build is broken from external causes, or there is a conflict with existing code, escalate rather than guessing.
251
+
252
+ 4. **Halfway checkpoint:** For plans with 5+ sprints, pause after completing half the sprints to report progress and ask if the user wants to continue, adjust, or stop.
253
+
254
+ ## Progress Tracking
255
+
256
+ Throughout the pipeline, keep `.bober/progress.md` updated:
257
+
258
+ ```markdown
259
+ # Bober Progress
260
+
261
+ Project: <name>
262
+ Mode: <mode>
263
+ Preset: <preset or "custom">
264
+ Initialized: <date>
265
+ Last updated: <timestamp>
266
+
267
+ ---
268
+
269
+ ## Plan: <title>
270
+ - Spec: <specId>
271
+ - Created: <date>
272
+ - Status: in-progress
273
+
274
+ ### Sprint Breakdown
275
+ 1. [completed] Sprint 1: <title> -- Passed on iteration 1
276
+ 2. [completed] Sprint 2: <title> -- Passed on iteration 2
277
+ 3. [in-progress] Sprint 3: <title> -- Iteration 1 in progress
278
+ 4. [proposed] Sprint 4: <title>
279
+ 5. [proposed] Sprint 5: <title>
280
+
281
+ ### Pipeline Statistics
282
+ - Total iterations used: 4 / 20
283
+ - Sprints completed: 2 / 5
284
+ ```
285
+
286
+ And keep `.bober/history.jsonl` updated with events:
287
+ - `pipeline-started`
288
+ - `sprint-started`
289
+ - `sprint-iteration-started`
290
+ - `sprint-iteration-completed` (with pass/fail)
291
+ - `sprint-completed`
292
+ - `sprint-failed`
293
+ - `pipeline-completed`
294
+ - `pipeline-stopped`
295
+ - `human-escalation`
296
+
297
+ ## Error Recovery
298
+
299
+ - **Git conflicts:** Pause and report to user. Do not auto-resolve.
300
+ - **npm install failures:** Try once. If it fails, report to user.
301
+ - **Dev server won't start:** Needed for API checks and Playwright. Report as a configuration issue.
302
+ - **Out of context window:** If the conversation is getting extremely long, proactively reset context by summarizing progress and starting a fresh handoff.
303
+ - **Previous sprint broke something:** If a completed sprint's code is causing issues in a later sprint, note this but do not go back and modify completed sprints. Instead, have the current sprint fix the issue within its scope.