bullswarm 0.34.0 → 0.35.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 (194) hide show
  1. package/CHANGELOG.md +143 -0
  2. package/data/openrouter-benchmarks.json +8875 -8902
  3. package/docs/design/dashboard-prototype.html +9 -2
  4. package/docs/design/dashboard-split/README.md +402 -0
  5. package/docs/design/step-page-0.35.0/README.md +394 -0
  6. package/docs/design/step-page-0.35.0/frames/failed-120.txt +19 -0
  7. package/docs/design/step-page-0.35.0/frames/failed-200.txt +19 -0
  8. package/docs/design/step-page-0.35.0/frames/failed-55.txt +18 -0
  9. package/docs/design/step-page-0.35.0/frames/finished-120.txt +19 -0
  10. package/docs/design/step-page-0.35.0/frames/finished-200.txt +17 -0
  11. package/docs/design/step-page-0.35.0/frames/finished-55.txt +20 -0
  12. package/docs/design/step-page-0.35.0/frames/real-failed-120.txt +60 -0
  13. package/docs/design/step-page-0.35.0/frames/real-failed-200.txt +60 -0
  14. package/docs/design/step-page-0.35.0/frames/real-failed-55.txt +60 -0
  15. package/docs/design/step-page-0.35.0/frames/real-finished-120.txt +60 -0
  16. package/docs/design/step-page-0.35.0/frames/real-finished-200.txt +60 -0
  17. package/docs/design/step-page-0.35.0/frames/real-finished-55.txt +60 -0
  18. package/docs/design/step-page-0.35.0/frames/real-running-120.txt +60 -0
  19. package/docs/design/step-page-0.35.0/frames/real-running-200.txt +60 -0
  20. package/docs/design/step-page-0.35.0/frames/real-running-55.txt +60 -0
  21. package/docs/design/step-page-0.35.0/frames/rendered-failed-120.txt +30 -0
  22. package/docs/design/step-page-0.35.0/frames/rendered-failed-200.txt +28 -0
  23. package/docs/design/step-page-0.35.0/frames/rendered-failed-55.txt +30 -0
  24. package/docs/design/step-page-0.35.0/frames/rendered-finished-120.txt +30 -0
  25. package/docs/design/step-page-0.35.0/frames/rendered-finished-200.txt +28 -0
  26. package/docs/design/step-page-0.35.0/frames/rendered-finished-55.txt +30 -0
  27. package/docs/design/step-page-0.35.0/frames/rendered-running-120.txt +30 -0
  28. package/docs/design/step-page-0.35.0/frames/rendered-running-200.txt +28 -0
  29. package/docs/design/step-page-0.35.0/frames/rendered-running-55.txt +30 -0
  30. package/docs/design/step-page-0.35.0/frames/running-120.txt +24 -0
  31. package/docs/design/step-page-0.35.0/frames/running-200.txt +21 -0
  32. package/docs/design/step-page-0.35.0/frames/running-55.txt +21 -0
  33. package/docs/design/tidy-0.35.1/README.md +296 -0
  34. package/docs/design/tidy-0.35.1/frames/colour/real-home-200.txt +60 -0
  35. package/docs/design/tidy-0.35.1/frames/colour/real-home-55.txt +60 -0
  36. package/docs/design/tidy-0.35.1/frames/colour/real-run-finished-200.txt +60 -0
  37. package/docs/design/tidy-0.35.1/frames/colour/real-run-finished-55.txt +60 -0
  38. package/docs/design/tidy-0.35.1/frames/colour/real-run-running-200.txt +60 -0
  39. package/docs/design/tidy-0.35.1/frames/colour/real-run-running-55.txt +60 -0
  40. package/docs/design/tidy-0.35.1/frames/colour/real-step-detail-finished-200.txt +60 -0
  41. package/docs/design/tidy-0.35.1/frames/colour/real-step-detail-finished-55.txt +60 -0
  42. package/docs/design/tidy-0.35.1/frames/colour/real-step-overview-finished-200.txt +60 -0
  43. package/docs/design/tidy-0.35.1/frames/colour/real-step-overview-finished-55.txt +60 -0
  44. package/docs/design/tidy-0.35.1/frames/colour/real-step-overview-running-200.txt +60 -0
  45. package/docs/design/tidy-0.35.1/frames/colour/real-step-overview-running-55.txt +60 -0
  46. package/docs/design/tidy-0.35.1/frames/colour/real-task-200.txt +60 -0
  47. package/docs/design/tidy-0.35.1/frames/colour/real-task-55.txt +60 -0
  48. package/docs/design/tidy-0.35.1/frames/home-120.txt +16 -0
  49. package/docs/design/tidy-0.35.1/frames/home-200.txt +21 -0
  50. package/docs/design/tidy-0.35.1/frames/home-55.txt +26 -0
  51. package/docs/design/tidy-0.35.1/frames/real-home-120.txt +60 -0
  52. package/docs/design/tidy-0.35.1/frames/real-home-200.txt +60 -0
  53. package/docs/design/tidy-0.35.1/frames/real-home-55.txt +60 -0
  54. package/docs/design/tidy-0.35.1/frames/real-run-finished-120.txt +60 -0
  55. package/docs/design/tidy-0.35.1/frames/real-run-finished-200.txt +60 -0
  56. package/docs/design/tidy-0.35.1/frames/real-run-finished-55.txt +60 -0
  57. package/docs/design/tidy-0.35.1/frames/real-run-running-120.txt +60 -0
  58. package/docs/design/tidy-0.35.1/frames/real-run-running-200.txt +60 -0
  59. package/docs/design/tidy-0.35.1/frames/real-run-running-55.txt +60 -0
  60. package/docs/design/tidy-0.35.1/frames/real-stats-model-120.txt +60 -0
  61. package/docs/design/tidy-0.35.1/frames/real-stats-model-200.txt +60 -0
  62. package/docs/design/tidy-0.35.1/frames/real-stats-model-55.txt +60 -0
  63. package/docs/design/tidy-0.35.1/frames/real-stats-spending-120.txt +60 -0
  64. package/docs/design/tidy-0.35.1/frames/real-stats-spending-200.txt +60 -0
  65. package/docs/design/tidy-0.35.1/frames/real-stats-spending-55.txt +60 -0
  66. package/docs/design/tidy-0.35.1/frames/real-step-detail-failed-120.txt +60 -0
  67. package/docs/design/tidy-0.35.1/frames/real-step-detail-failed-200.txt +60 -0
  68. package/docs/design/tidy-0.35.1/frames/real-step-detail-failed-55.txt +60 -0
  69. package/docs/design/tidy-0.35.1/frames/real-step-detail-finished-120.txt +60 -0
  70. package/docs/design/tidy-0.35.1/frames/real-step-detail-finished-200.txt +60 -0
  71. package/docs/design/tidy-0.35.1/frames/real-step-detail-finished-55.txt +60 -0
  72. package/docs/design/tidy-0.35.1/frames/real-step-detail-running-120.txt +60 -0
  73. package/docs/design/tidy-0.35.1/frames/real-step-detail-running-200.txt +60 -0
  74. package/docs/design/tidy-0.35.1/frames/real-step-detail-running-55.txt +60 -0
  75. package/docs/design/tidy-0.35.1/frames/real-step-overview-failed-120.txt +60 -0
  76. package/docs/design/tidy-0.35.1/frames/real-step-overview-failed-200.txt +60 -0
  77. package/docs/design/tidy-0.35.1/frames/real-step-overview-failed-55.txt +60 -0
  78. package/docs/design/tidy-0.35.1/frames/real-step-overview-finished-120.txt +60 -0
  79. package/docs/design/tidy-0.35.1/frames/real-step-overview-finished-200.txt +60 -0
  80. package/docs/design/tidy-0.35.1/frames/real-step-overview-finished-55.txt +60 -0
  81. package/docs/design/tidy-0.35.1/frames/real-step-overview-running-120.txt +60 -0
  82. package/docs/design/tidy-0.35.1/frames/real-step-overview-running-200.txt +60 -0
  83. package/docs/design/tidy-0.35.1/frames/real-step-overview-running-55.txt +60 -0
  84. package/docs/design/tidy-0.35.1/frames/real-task-120.txt +60 -0
  85. package/docs/design/tidy-0.35.1/frames/real-task-200.txt +60 -0
  86. package/docs/design/tidy-0.35.1/frames/real-task-55.txt +60 -0
  87. package/docs/design/tidy-0.35.1/frames/rendered-failed-120.txt +30 -0
  88. package/docs/design/tidy-0.35.1/frames/rendered-failed-200.txt +28 -0
  89. package/docs/design/tidy-0.35.1/frames/rendered-failed-55.txt +30 -0
  90. package/docs/design/tidy-0.35.1/frames/rendered-finished-120.txt +30 -0
  91. package/docs/design/tidy-0.35.1/frames/rendered-finished-200.txt +28 -0
  92. package/docs/design/tidy-0.35.1/frames/rendered-finished-55.txt +30 -0
  93. package/docs/design/tidy-0.35.1/frames/rendered-running-120.txt +30 -0
  94. package/docs/design/tidy-0.35.1/frames/rendered-running-200.txt +28 -0
  95. package/docs/design/tidy-0.35.1/frames/rendered-running-55.txt +30 -0
  96. package/docs/design/tidy-0.35.1/frames/run-120.txt +13 -0
  97. package/docs/design/tidy-0.35.1/frames/run-200.txt +16 -0
  98. package/docs/design/tidy-0.35.1/frames/run-55.txt +21 -0
  99. package/docs/design/tidy-0.35.1/frames/step-detail-120.txt +30 -0
  100. package/docs/design/tidy-0.35.1/frames/step-detail-200.txt +29 -0
  101. package/docs/design/tidy-0.35.1/frames/step-detail-55.txt +46 -0
  102. package/docs/design/tidy-0.35.1/frames/step-overview-120.txt +28 -0
  103. package/docs/design/tidy-0.35.1/frames/step-overview-200.txt +29 -0
  104. package/docs/design/tidy-0.35.1/frames/step-overview-55.txt +30 -0
  105. package/docs/design/tidy-0.35.1/frames/task-120.txt +20 -0
  106. package/docs/design/tidy-0.35.1/frames/task-200.txt +21 -0
  107. package/docs/design/tidy-0.35.1/frames/task-55.txt +22 -0
  108. package/docs/design/tidy-0.35.1/run-v2/README.md +58 -0
  109. package/docs/design/tidy-0.35.1/run-v2/after-200.txt +38 -0
  110. package/docs/design/tidy-0.35.1/run-v2/after-55.txt +49 -0
  111. package/docs/design/tidy-0.35.1/run-v2/before-200.txt +50 -0
  112. package/docs/design/tidy-0.35.1/run-v2/before-55.txt +60 -0
  113. package/docs/design/tidy-0.35.1/step-v2/README.md +71 -0
  114. package/docs/design/tidy-0.35.1/step-v2/desktop-detail.txt +44 -0
  115. package/docs/design/tidy-0.35.1/step-v2/desktop-finished.txt +38 -0
  116. package/docs/design/tidy-0.35.1/step-v2/desktop-running.txt +24 -0
  117. package/docs/design/tidy-0.35.1/step-v2/phone-detail.txt +81 -0
  118. package/docs/design/tidy-0.35.1/step-v2/phone-finished.txt +71 -0
  119. package/docs/design/tidy-0.35.1/step-v2/phone-running.txt +46 -0
  120. package/docs/guide/cost.md +63 -0
  121. package/docs/guide/observing.md +251 -32
  122. package/docs/plans/dashboard-split.goal.txt +5 -0
  123. package/docs/plans/dashboard-split.program.json +94 -0
  124. package/docs/plans/meter-ledger.goal.txt +6 -0
  125. package/docs/plans/meter-ledger.program.json +8 -10
  126. package/docs/plans/step-page-0.35.0-build.goal.txt +8 -0
  127. package/docs/plans/step-page-0.35.0-build.program.json +164 -0
  128. package/docs/plans/step-page-0.35.0-design.goal.txt +6 -0
  129. package/docs/plans/step-page-0.35.0-design.program.json +49 -0
  130. package/docs/plans/step-page-0.35.0.program.json +98 -0
  131. package/docs/plans/tidy-0.35.1-colour.goal.txt +8 -0
  132. package/docs/plans/tidy-0.35.1-colour.program.json +88 -0
  133. package/docs/plans/tidy-0.35.1.goal.txt +11 -0
  134. package/docs/plans/tidy-0.35.1.program.json +302 -0
  135. package/docs/reference/cli.md +39 -2
  136. package/docs/reference/providers.md +64 -1
  137. package/mods/bullswarm/README.md +1 -1
  138. package/mods/bullswarm/hooks/pane.tsx +64 -69
  139. package/mods/bullswarm/hooks/runs.ts +17 -1
  140. package/mods/bullswarm/hooks/step.ts +474 -0
  141. package/package.json +1 -1
  142. package/src/cli.js +61 -11
  143. package/src/help.js +56 -0
  144. package/src/home-cli.js +392 -0
  145. package/src/lib/agent-events.js +144 -0
  146. package/src/lib/assignments.js +5 -1
  147. package/src/lib/attempt-stream.js +11 -1
  148. package/src/lib/cli-flags.js +2 -0
  149. package/src/lib/config.js +46 -4
  150. package/src/lib/quota-snapshot.js +50 -1
  151. package/src/lib/strategy.js +2 -1
  152. package/src/lib/subscription-cost.js +376 -8
  153. package/src/lib/tasks.js +11 -2
  154. package/src/lib/transcripts/claude-code.js +7 -3
  155. package/src/lib/transcripts/codex.js +7 -3
  156. package/src/lib/transcripts/grok.js +11 -3
  157. package/src/lib/transcripts/index.js +1 -0
  158. package/src/lib/usage-basis.js +132 -16
  159. package/src/lib/watch.js +388 -10
  160. package/src/meters/framework.js +94 -0
  161. package/src/meters/registry.js +368 -15
  162. package/src/provider-cli.js +23 -0
  163. package/src/providers/_schema.json +62 -0
  164. package/src/providers/claude-code/connector.json +71 -3
  165. package/src/providers/codex/connector.json +83 -2
  166. package/src/providers/grok/connector.json +57 -0
  167. package/src/strategy-cli.js +3 -2
  168. package/src/strategy-dashboard.js +2 -1
  169. package/src/workflow/budget-model.js +13 -0
  170. package/src/workflow/budget-view.js +27 -4
  171. package/src/workflow/cli.js +18 -1
  172. package/src/workflow/dash-kit.js +51 -35
  173. package/src/workflow/dashboard.js +614 -2836
  174. package/src/workflow/history-view.js +20 -13
  175. package/src/workflow/history.js +7 -0
  176. package/src/workflow/home-model.js +692 -0
  177. package/src/workflow/home-view.js +1076 -0
  178. package/src/workflow/reprice.js +260 -47
  179. package/src/workflow/rollup.js +121 -18
  180. package/src/workflow/run-model.js +989 -0
  181. package/src/workflow/run-view.js +1980 -0
  182. package/src/workflow/runs-cli.js +3 -4
  183. package/src/workflow/runs-view.js +205 -0
  184. package/src/workflow/stat-kit.js +250 -20
  185. package/src/workflow/stats-model.js +119 -25
  186. package/src/workflow/stats-view.js +241 -37
  187. package/src/workflow/step-model.js +2567 -0
  188. package/src/workflow/step-view.js +950 -0
  189. package/src/workflow/task-step.js +346 -0
  190. package/src/workflow/usage-view.js +16 -0
  191. package/src/workflow/v2-dispatch.js +8 -0
  192. package/src/workflow/v2-outcome.js +2 -1
  193. package/src/workflow/v2-runtime.js +262 -13
  194. package/src/workflow/v2-state.js +57 -9
package/CHANGELOG.md CHANGED
@@ -1,5 +1,148 @@
1
1
  # bullswarm changelog
2
2
 
3
+ ## 0.35.1 — a calmer dashboard with honest active time
4
+
5
+ - durations: Home, Runs, Run, Step, and Stats use the union-based
6
+ `minutes.active` duration; `minutes.span` remains secondary, worker-minutes
7
+ still sum attempt clocks, and `workflow reprice` corrects stored terminal
8
+ minute fields.
9
+ - home: today leads with up to three active-or-most-recent run cards, while the
10
+ licence block uses one plain-word `pool · worker-minutes · weekly share · API
11
+ · subscription` row per pool and keeps Running and Budget visible.
12
+ - home: from 120 columns the three cards sit side by side, with the licence
13
+ block beneath them up to 159 columns and to their right from 160; below 120
14
+ they stack full width with the licence block beneath.
15
+ - home: the last-7-days band and the five-row recent list are back below
16
+ `budget · this week`, with the `Last 30 days`/`All time` toggle, the spend
17
+ chart, the by-pool/by-model/by-project lists, and the summary lines; the full
18
+ run list still lives only on Runs.
19
+ - run: the Run page now follows the Step grammar — `done of total` with running
20
+ and waiting ids, active-of-span clocks, a per-pool attempt mix, a phone glyph
21
+ strip (`p` opens phase boxes), and a live block backed by the selected
22
+ attempt's latest stream turn.
23
+ - run: spend is an honest partial subtotal (`at least` when attempts are still
24
+ running or unmeasured, `≈` for estimates) with measured/estimated/running/
25
+ unmeasured coverage and per-pool API splits; the timeline keeps phase rules
26
+ and one routed attempt row per worker, folds middle phases, and removes
27
+ licence bars, `so far`, ETA, and started/completed filler rows.
28
+ - money: a run, day, pool or period whose attempts were only partly priced now
29
+ shows the recorded subtotal marked `≈` with its coverage instead of reading
30
+ as unrecorded; strict totals stay strict and a subtotal is never summed into
31
+ one.
32
+ - stats: `Median run` and `Longest run` fall back per record to the recorded
33
+ span and say so, and the Spending chart fills its panel on the desktop grid
34
+ instead of drawing six narrow bars beside it.
35
+ - charts: a column chart sizes its tick gutter to the widest label the axis
36
+ will actually print, so a money axis reads `≈$160.00` rather than `≈$160.…`.
37
+ - step: the page is one header and four blocks — turns, result, task, cost. The
38
+ header says the verdict, the purpose, `pool · model · effort · reasoning`, one
39
+ clock (span only when it differs) and the route sentence once; the overview
40
+ prints one row per turn with only its non-zero counts (`35 commands`, `no
41
+ tools`), the counts at the end of the response on the desk and on their own
42
+ row on the phone, `Enter` expands a turn's full response and its tool rows
43
+ with each clock and measured duration, and the last turn points at the report
44
+ with `→ the report, shown under result`.
45
+ - step: the result card reads the report itself — its first lines, the diff's
46
+ changed paths, the step's `Shared-file requests` when its report has that
47
+ heading, and only the artifacts it left (`files` names the run directory once,
48
+ then `task · out · stream (N events) · diff`); the task card shows the
49
+ author's own prompt with `owns`/`after`/`affects` and the kernel wrapper's
50
+ size (`Enter on task: full text 2.4 KB · kernel wrapper 5.1 KB`); cost is two
51
+ plain-word rows (API rate and `<pool> plan`) with token classes under the
52
+ amount, `≈` for estimates, `—` with its reason for unknowns, and a closing
53
+ `measured from the … transcript` line.
54
+ - step: at 160 columns the activity takes the left column and result, task and
55
+ cost stack on the right so a finished step fits one screen; 120 narrows the
56
+ right column to 40; below that the page stacks result → activity → task →
57
+ cost, with `now` leading while the step runs. The footer carries the keys
58
+ once (`v detail (every event)`, `t filter`), and a live attempt says when its
59
+ cost will be measured instead of printing a guess.
60
+ - tasks: a single `bullswarm run` task uses the same Step model and view through
61
+ an adapter, preserving recorded fields and leaving unavailable effort,
62
+ verification, usage, money, and activity unavailable.
63
+ - step: an expanded turn shows its newest three tool rows with a
64
+ `↑ N earlier commands · Space page up` fold; `Space`, `PageUp` and `PageDown`
65
+ walk that window back through the older rows, and opening, collapsing or
66
+ changing the turn resets it.
67
+ - step: a tool that is still running keeps a spinner and its elapsed time, stays
68
+ the last expanded row and is counted in the collapsed turn's counts; a
69
+ sub-second tool prints no duration rather than `0s`, and a capture with no
70
+ summary falls back to its event kind instead of `summary unavailable`.
71
+ - step: the activity reader reads a capture's `.tail` file as well as its head,
72
+ merges the truncation marker and drops the overlap, so a long attempt's newest
73
+ events are visible instead of ending at the head cap.
74
+ - step: `t` cycles the activity lens turns → tools → errors → all and `f`
75
+ follows the tail on this page; Fleet keeps `f` everywhere else.
76
+ - codex: a `file_change` item keeps its path and its raw `changes` array, so the
77
+ Step page can name the kind and path of each change (capped at three) instead
78
+ of printing an empty summary.
79
+ - durations: every clock is h/m/s — a step or phase past an hour reads `2h04m`,
80
+ not `124m09s`, on the Run page, the Step page and the timeline alike.
81
+ - run: the `live` and `spend` columns are one aligned band at 120 columns and
82
+ wider; the running phase is never folded into the `↑ phases a–b` summary; and
83
+ the page keys and the wheel scroll the page body, so a timeline longer than
84
+ the terminal can be read.
85
+ - run: a paused run's live block still says `bullswarm workflow resume <id>
86
+ continues it` rather than leaving `last finished` to read as "any moment now".
87
+ - mod: `workflow tui --overview` keeps the goal preview and draws its milestone
88
+ rows flush to the pane border, the two shapes the Claude mod's pane parses.
89
+ - colour: the Step page, the Run page and the single-task page paint one meaning
90
+ per colour — green for work that went well (`✓`, `succeeded`, `verified`),
91
+ amber for work running now (`▶`, `●`, the spinner, `following ●`), red for
92
+ failures (`✗`, `failed`, an error count above zero), dim for the supporting
93
+ detail (clocks, counts, row labels, basis phrases, block rule dashes, footer
94
+ hints, pending marks), bold for identity and every money amount, and each pool
95
+ in the colour its bar has on Home. Response, task, report and command text
96
+ stay plain, the selected row is inverse, and in ASCII mode only bold, dim and
97
+ inverse remain.
98
+ - colour: the frames the records are reviewed against are rendered twice —
99
+ `docs/design/tidy-0.35.1/frames/real-*.txt` as text and
100
+ `docs/design/tidy-0.35.1/frames/colour/` with the escape codes kept, from the
101
+ one snapshot render (`scripts/render-tidy-0.35.1-frames.mjs --colour`), so a
102
+ reviewer can grep for a colour instead of trusting a screenshot.
103
+ - tasks: the single-task page names the task the way the Runs list does —
104
+ `<lane> task · <8-char id>` (`analyze task · 3155fb3c`) — instead of the full
105
+ UUID or a six-character prefix.
106
+ - home: a card's durations use the same h/m/s clock as the Step and Run pages
107
+ (`58m37s active of 58m38s`, `1h38m active of 1h39m`), never decimal minutes
108
+ like `active 725.95m`.
109
+ - runs: the page opens with the cursor on its first row — the first active run
110
+ when one is running — drawn inverse, so `Enter` opens the highlighted row, and
111
+ `Up` on the first row stays there.
112
+ - tests: the real-data tests and the frame script now run from a scrubbed
113
+ in-repo fixture, `tests/fixtures/home-351` (2.8 MB), built by
114
+ `scripts/build-test-home.mjs`: every id, time, status, pool, model, token
115
+ count, cost and event kind is as recorded, while goals, prompts, reports,
116
+ responses, commands and paths are marked placeholder text and project names
117
+ are aliases, so the suite needs no copy of anyone's home.
118
+
119
+ ## 0.35.0 — the Step page tells the whole story
120
+
121
+ - step: the Step page leads with identity and verdict, the selected attempt,
122
+ retry history, route, money pair, activity, outcome, prompt, and artifacts.
123
+ - verification: execution success stays separate from the workflow's durable
124
+ `verified` result, so a successful action is not mistaken for accepted work.
125
+ - activity: the page follows a bounded per-attempt stream with capture-order
126
+ minimap, selection, filters, and explicit unavailable states instead of
127
+ inferring turns, tools, timing, usage, or subagents from prose.
128
+ - usage: API-rate and subscription figures remain a labeled pair; token source,
129
+ unknown values, pending live usage, and estimated bases stay visible across
130
+ retries rather than becoming zero or a bare dollar amount.
131
+ - providers: the guide and provider reference now list the optional normalized
132
+ stream fields each shipped capture can actually supply.
133
+ - watch: a truncated delegate response now gets one connector-declared recovery turn or a derived workspace/test report, with the recovery source persisted on the attempt.
134
+ - meters: a quota refusal forces a fresh meter read and marks the pool blocked until it clears, with the refusal age shown in Pools, Budget, and Usage.
135
+ - stats: single `bullswarm run` records retain their working directory so Stats and history derive the project while truly legacy records remain unknown.
136
+ - dashboard: the navigation footer keeps active run names visible and adds `+N more` when the terminal is too narrow.
137
+ - stats: model labels preserve provider/model identity at narrow widths instead of collapsing to a bare version.
138
+ - reprice: transcript matches can back-fill missing cwd and project fields for workflow attempts and single tasks, reporting the project changes.
139
+ - money: sub-cent API, subscription, budget, and strategy amounts keep three significant digits instead of rounding to `$0.00`.
140
+ - meters: a continuous, window-specific ledger records resolution and source, names each interval, attributes positive quota deltas to each attempt, shares overlaps by API cost, and reconciles same-pool totals at run finish.
141
+ - home: `home snapshot` creates a selective dashboard-readable copy of routing, meters, providers, task records, and chosen workflow runs without modifying the source.
142
+ - dashboard: the Home, Runs, Run and Step pages now live in their own model and
143
+ view modules; dashboard.js shrinks from 5,996 to 3,494 lines with every saved
144
+ frame rendering identically.
145
+
3
146
  ## 0.34.0 — every dollar says how it was measured
4
147
 
5
148
  - usage: Claude, Codex, and Grok attempts now retain provider-reported or transcript-summed token classes, with the byte estimate and unknown kept as explicit fallbacks.