bullswarm 0.28.8 → 0.29.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 (74) hide show
  1. package/AGENTS.md +17 -9
  2. package/CHANGELOG.md +185 -20
  3. package/README.md +4 -1
  4. package/data/README.md +1 -1
  5. package/data/openrouter-benchmarks.json +12437 -11779
  6. package/docs/audits/2026-09-09-codebase-audit.md +6 -6
  7. package/docs/dynamic-workflow-handoff.md +3 -3
  8. package/docs/dynamic-workflow-qa.md +1 -1
  9. package/docs/dynamic-workflow-v2-execution-plan.md +7 -7
  10. package/docs/experiments/2026-08-29-dogfood-bullswarm-builds-bullswarm.md +13 -13
  11. package/docs/experiments/2026-08-31-v2-component-probes.md +7 -7
  12. package/docs/guide/dashboard.md +5 -1
  13. package/docs/guide/doctrine.md +6 -2
  14. package/docs/guide/getting-started.md +1 -0
  15. package/docs/guide/providers.md +227 -0
  16. package/docs/guide/routing.md +28 -0
  17. package/docs/guide/strategy.md +9 -7
  18. package/docs/guide/workflows.md +50 -11
  19. package/docs/handoff-2026-09-13-custom-provider-config.md +49 -0
  20. package/docs/index.md +1 -0
  21. package/docs/planner-prompt-audit-2026-08-29.md +1 -1
  22. package/package.json +3 -2
  23. package/providers/contrib/README.md +32 -0
  24. package/{connectors/command-code.json → providers/contrib/command-code/connector.json} +4 -1
  25. package/{src/meters/command-code.js → providers/contrib/command-code/provider.mjs} +27 -16
  26. package/{connectors/opencode2.json → providers/contrib/opencode2/connector.json} +4 -3
  27. package/providers/contrib/opencode2/provider.mjs +7 -0
  28. package/skill/SKILL.md +77 -8
  29. package/skill/references/operations.md +103 -7
  30. package/skill/references/providers.md +97 -0
  31. package/src/cli.js +37 -9
  32. package/src/help.js +254 -20
  33. package/src/lib/auth-signatures.js +79 -0
  34. package/src/lib/cli-flags.js +14 -1
  35. package/src/lib/config.js +54 -28
  36. package/src/lib/providers.js +353 -0
  37. package/src/lib/state.js +47 -0
  38. package/src/lib/strategy.js +10 -1
  39. package/src/lib/update.js +285 -0
  40. package/src/lib/watch.js +49 -0
  41. package/src/meters/framework.js +84 -5
  42. package/src/meters/registry.js +50 -56
  43. package/src/provider-cli.js +780 -0
  44. package/src/provider-kit.js +146 -0
  45. package/src/providers/_schema.json +181 -0
  46. package/src/providers/claude-code/provider.mjs +372 -0
  47. package/{connectors/codex.json → src/providers/codex/connector.json} +3 -1
  48. package/src/{meters/codex.js → providers/codex/provider.mjs} +18 -9
  49. package/{connectors/echo.json → src/providers/echo/connector.json} +1 -1
  50. package/src/{meters/grok.js → providers/grok/provider.mjs} +23 -14
  51. package/src/setup.js +129 -40
  52. package/src/strategy-cli.js +57 -28
  53. package/src/workflow/cli.js +264 -11
  54. package/src/workflow/dashboard.js +5 -3
  55. package/src/workflow/execution-policy.js +11 -0
  56. package/src/workflow/ledger.js +22 -0
  57. package/src/workflow/runs-cli.js +2 -1
  58. package/src/workflow/v2-dispatch.js +41 -15
  59. package/src/workflow/v2-outcome.js +5 -3
  60. package/src/workflow/v2-planner.js +16 -5
  61. package/src/workflow/v2-presentation.js +53 -1
  62. package/src/workflow/v2-revision.js +362 -0
  63. package/src/workflow/v2-runtime.js +395 -33
  64. package/src/workflow/v2-scheduler.js +3 -1
  65. package/src/workflow/v2-state.js +133 -10
  66. package/src/workflow/watch-cli.js +58 -1
  67. package/connectors/_schema.json +0 -96
  68. package/src/lib/claude-accounts.js +0 -202
  69. package/src/lib/opencode-kaihk.js +0 -177
  70. package/src/meters/claude.js +0 -135
  71. package/src/meters/kaihk.js +0 -97
  72. /package/{connectors/claude-code.json → src/providers/claude-code/connector.json} +0 -0
  73. /package/{connectors → src/providers/echo}/echo-worker.mjs +0 -0
  74. /package/{connectors/grok.json → src/providers/grok/connector.json} +0 -0
package/AGENTS.md CHANGED
@@ -14,7 +14,9 @@ content. Published as `bullswarm` on npm.
14
14
  2. Pace by meter surplus = elapsed% (from provider resets_at) − used%.
15
15
  Weekly/monthly windows pace; 5h windows are burst gates only (M1–M5 in
16
16
  `src/meters/framework.js`).
17
- 3. Connector quirks live in `connectors/*.json`, never in core logic.
17
+ 3. Provider quirks live in the provider's directory (`src/providers/<name>/`,
18
+ `providers/contrib/<name>/`, or `~/.bullswarm/providers/<name>/`), never in
19
+ core logic (see `docs/guide/providers.md`).
18
20
  4. Quarantine always auto-releases; recursion depth is core-owned via env
19
21
  (`BULLSWARM_DEPTH`).
20
22
  5. Workflow dispatches must honor the same guarantees as single runs:
@@ -61,7 +63,8 @@ author (`bullswarm workflow plan contract` returns the schema). There is no
61
63
  classifier or preview step. The skill is published alongside the package and
62
64
  is the canonical reference for the CLI surface.
63
65
 
64
- - Zero runtime dependencies. Node >= 18. Tests must never require network:
66
+ - Zero runtime dependencies. Node >= 22.12 (providers load synchronously
67
+ through `require` of ES modules). Tests must never require network:
65
68
  prime `~/.bullswarm/meters/*.json` caches with fresh timestamps if needed.
66
69
  - Every verb must work non-interactively (no TTY). The interactive wizard is
67
70
  a human convenience, never a requirement.
@@ -70,14 +73,19 @@ is the canonical reference for the CLI surface.
70
73
  `git push --tags`
71
74
  — CI publishes through npm trusted publishing (OIDC), no tokens.
72
75
 
73
- ## Adding a connector
76
+ ## Adding a provider
74
77
 
75
- Copy an existing file in `connectors/`, set: bin name, configDirs for
76
- discovery, spawn argv template (`{taskFile}` `{cwd}` `{bullswarmDir}`
77
- substitutions), authSignatures (output strings meaning auth/throttle
78
- failure), outputExtraction strategy, meter type, costRank, lanes. Add a
79
- meter reader in `src/meters/` only if the provider exposes a usage API —
80
- declared meters are the fallback, never the goal.
78
+ A provider is a directory holding `connector.json` (a pool template checked
79
+ against `src/providers/_schema.json`) and/or `provider.mjs`. First-class
80
+ providers live in `src/providers/<name>/`, contrib providers in
81
+ `providers/contrib/<name>/` (enabled per machine through
82
+ `~/.bullswarm/providers.json`), and a user's own in
83
+ `~/.bullswarm/providers/<name>/`. Start from
84
+ `bullswarm provider scaffold <name> [--from <template>]`, then
85
+ `bullswarm provider validate` and `bullswarm provider probe <pool>`. Write a
86
+ `readUsage` export only if the vendor exposes a usage API — declared meters
87
+ are the fallback, never the goal. The contract is `docs/guide/providers.md`;
88
+ the authoring method is `skill/references/providers.md`.
81
89
 
82
90
  ## Releasing
83
91
 
package/CHANGELOG.md CHANGED
@@ -1,5 +1,170 @@
1
1
  # bullswarm changelog
2
2
 
3
+ ## 0.29.1 — a revised cancelled run runs its cancelled steps again
4
+
5
+ - workflow: revising a cancelled run reopened it but left every step the
6
+ cancellation had stopped as `cancelled`, so the kernel finalized `partial`
7
+ in the same second and nothing ran. Found on a real claude-code run
8
+ (`pxkr7s`, revision 7). Reopening now returns those steps to pending, lists
9
+ them as `reopened.requeued` in the revise output and the `workflow.reopened`
10
+ event, and never counts their earlier attempts as completion. Failed steps
11
+ still wait for an explicit `--rerun`.
12
+ - watch: a run waiting for its caller planner now also prints the
13
+ `plan export` / `plan revise` commands next to `plan show`.
14
+ - workflow: an attempt stopped by a plan revision or a pause now records
15
+ `failureKind: superseded` or `paused` on the attempt and in
16
+ `attempt.finished`, the same kind `action.finished` already carried. It was
17
+ recorded as a plain `cancelled`, which made deliberate steering look like
18
+ worker failures.
19
+ - strategy: `strategy rungs` no longer counts a stopped dispatch against a
20
+ pool's "% ok". On 2026-09-14 all 11 claude-code dispatches recorded as not
21
+ ok were workflow cancellations, plan revisions or pauses, none a worker
22
+ failure. Dispatch records now carry `failureKind`. The share was display
23
+ only; routing never read it.
24
+
25
+ ## 0.29.0 — steer a running workflow, providers become directories, a declared reset date
26
+
27
+ - workflow: the plan of a caller-planned program run can be changed at any
28
+ time. `bullswarm workflow plan export <id>` writes the live plan as an
29
+ editable revision document, and `bullswarm workflow plan revise <id>
30
+ --program plan.json` replaces it: the kernel matches actions by id and
31
+ applies the difference within about a second while agents keep running. A
32
+ new id is added; an unchanged action keeps its result and its running agent;
33
+ a changed action is stopped if running and starts over with the new
34
+ definition; an id in `rerun` discards its result and runs again; a missing id
35
+ is removed (stopped, never run, reported as `removed` and not counted against
36
+ the result); and every step downstream of a changed or rerun step runs again.
37
+ Evidence from a removed or rerun check stops counting until judged again.
38
+ Revisions carry `baseRevision`, so a revision written against an outdated
39
+ export is rejected instead of silently undoing another change, and an
40
+ invalid revision changes nothing. Revising a finished run reopens it and
41
+ archives the earlier result as `result-before-revision-<n>.json`.
42
+ - workflow: `bullswarm workflow pause <id>` stops new work while running agents
43
+ finish (`--now` stops them too and requeues their steps). The kernel exits
44
+ with `outcome: paused`; revisions apply while paused, and `workflow resume`
45
+ is the only way to continue.
46
+ - workflow: steering a caller-planned program run no longer halts it at the
47
+ next boundary. Watchers print `steering received`, the export lists the
48
+ pending messages, and a revision delivers them; only a run about to finish
49
+ with steering still unread pauses for the caller.
50
+ - watch: new lines for `plan revised`, `plan revision rejected`, pause
51
+ requested/lifted, run reopened, steering received, and steps stopped by a
52
+ revision or a pause.
53
+ - skill: SKILL.md gains "Steer a running workflow" and treats every watch
54
+ wake-up as a point to decide whether the plan still fits; operations.md
55
+ documents revision semantics, pause and resume, and steering.
56
+
57
+ - providers: every coding-agent CLI is now a provider directory holding
58
+ `connector.json`, `provider.mjs`, or both, loaded by one synchronous loader
59
+ (`src/lib/providers.js`) from three tiers. First-class (`src/providers/`)
60
+ always loads and holds claude-code, codex, grok and echo. Contrib
61
+ (`providers/contrib/`) ships in the package but loads only where
62
+ `~/.bullswarm/providers.json` lists it, and holds command-code and the
63
+ generic opencode2 connector. Local (`~/.bullswarm/providers/`) is the
64
+ operator's own and never appears in this repository. A module exports at most
65
+ `name`, `displayName`, `connectors(ctx)`, `readUsage(pool, ctx)` and
66
+ `doctor(ctx)`; everything else stays the connector JSON four CLIs already
67
+ ran through. Echo ships JSON-only and grok keeps its OAuth-refreshing meter
68
+ as real code, so both paths stay exercised.
69
+ - providers: `bullswarm provider list|enable|disable|validate|scaffold|probe`.
70
+ `probe` spawns one pool through the dispatcher's own runner with a one-word
71
+ task and then reads its meter once, which is the only evidence that a new
72
+ provider's model flag, event parsing and meter all actually work.
73
+ - core: the per-vendor branching is gone. The meter registry resolves a pool's
74
+ reader through its owning provider instead of a name-prefix map, connector
75
+ loading is one call into the loader, setup discovery and the strategy labels
76
+ come from provider entries, and both hard-coded connector expanders are
77
+ deleted. `credentialGroup` is the honest name for `upstreamGroup`, which is
78
+ still read.
79
+ - requires Node >= 22.12: the loader reads `provider.mjs` through
80
+ `require(esm)` so `loadConnectors` and `buildPools` stay synchronous for
81
+ their twenty-odd call sites.
82
+ - providers: built-in support for one specific reseller was removed entirely.
83
+ It is expressible as a local provider with no repository changes at all,
84
+ which was the point of the tiers.
85
+ - setup: `BULLSWARM_NO_PACKAGED_PROVIDERS=1` forces the packaged tiers off, for
86
+ tests that spawn the real CLI against a fixture home and assert an exact pool
87
+ list. Never set it in production.
88
+ - workflow: evidence actions are routed like any other action. They used to be
89
+ steered away from the pools that did the work, which bought little
90
+ independence (the judging model is chosen by tier, not by pool) and overrode
91
+ pacing. The `avoidPools` dispatch option is gone.
92
+ - codex: the connector runs `codex exec -s danger-full-access`. Codex sandboxes
93
+ writes to its workspace, so a workflow evidence action could do the work and
94
+ still fail with EPERM writing its candidate file into the run's state
95
+ directory under the bullswarm home.
96
+ - command-code: the connector passes `--max-turns 10000`. command-code's print
97
+ mode stops after 100 turns by default and exits 8 mid-task, which bullswarm
98
+ could only report as a non-zero exit and retry from scratch on another pool.
99
+
100
+ - routing: an upstream auth failure reported inside a provider's event stream
101
+ is now the `auth` failure kind with a quarantine hint, and it benches every
102
+ pool that shares the same upstream credential. On 2026-09-11 the pooled Codex
103
+ OAuth account behind `https://relay.example` was invalidated at 12:24 UTC and
104
+ answered every request with
105
+ `{"error":{"message":"Encountered invalidated oauth token for user, failing
106
+ request","type":"authentication_error","code":"auth_unavailable"}}` (401) or
107
+ `auth_unavailable: no auth available (providers=codex, model=gpt-5.6-luna; …)`
108
+ (503); non-GPT models on the same host answered `No available channel for
109
+ model <name> under group default`. `src/lib/watch.js` turned any stream
110
+ `error` event into a bare `provider` verdict before the auth gate ran, so no
111
+ pool was ever benched: a failed action's retry walked
112
+ `opencode2:relay-3` → `opencode2:relay-2` → `opencode2` — three names for the
113
+ one dead credential — and runs m4xiva and ytdsii ended `partial` with their
114
+ integrate/verify actions blocked (failures at 12:24, 12:25, 12:52, 12:53,
115
+ 12:54; last good dispatch 11:22). Four upstream phrases now ship as
116
+ `DEFAULT_AUTH_SIGNATURES` (`src/lib/auth-signatures.js`), matched only on a
117
+ stream that already declared a failure and only on an error-shaped line or
118
+ the raw JSON error event itself, so an agent that merely reads auth code is
119
+ still never quarantined. Connectors may declare `upstreamGroup`;
120
+ `src/lib/opencode-relay.js` sets `relay:<host>` on every expanded Relay pool,
121
+ and an auth quarantine now spreads to that group on one shared 10-minute
122
+ deadline in both dispatch paths. Claude account pools get no group — separate
123
+ seats are separate credentials — and a `quota` quarantine never spreads,
124
+ because a sibling's own window still has work in it.
125
+
126
+ - cli: `bullswarm update [--check] [--json]` upgrades the installation in
127
+ place — the verb a teammate reached for and found missing (2026-09-11). It
128
+ reads the latest version from the npm registry, tells the install shape
129
+ from the running package's real path rather than from `which` or `npm root
130
+ -g` (which can name a different Node install), and acts accordingly: a
131
+ global install gets `npm install -g bullswarm@<latest> --prefix <its own
132
+ prefix>`; a source checkout, including a global `npm link` into one, gets
133
+ `git pull --ff-only` and is refused while it has local changes; anything
134
+ else prints the manual command and exits 1. Success is verified by
135
+ re-reading package.json on disk, never by npm's exit code, and a shell
136
+ whose `bullswarm` resolves elsewhere is called out. `--check` compares
137
+ without changing anything.
138
+ - routing: the reasoning level now reaches every model a Relay pool can run,
139
+ not only `gpt-5.6-luna`. opencode forwards `--variant <level>` only when its
140
+ config declares that variant for that exact model, and the config
141
+ `src/lib/opencode-relay.js` injects declared the five levels for luna alone,
142
+ so moving a tier onto `<id>/gpt-5.6-sol` (2026-09-12, when luna had no
143
+ upstream channel left but sol did) would have sent a `--variant medium` that
144
+ opencode silently dropped while `strategy rungs` kept reporting medium.
145
+ Discovery now records each provider's model list from opencode.json and the
146
+ variants are declared on all of them; a provider that lists none keeps the
147
+ luna default.
148
+ - meters: a Relay pool's used% is read against its own declared plan total
149
+ (`strategy set-subscription <pool> --included-usd <n>`) before the host-wide
150
+ `RELAY_PLAN_USD` and the $50 default. The wallets differ — relay-4 is a $20
151
+ newcomer plan — and one shared number would have shown a $10 spend on it as
152
+ 20% used.
153
+ - meters: a pool whose provider reports usage but no reset date can be paced
154
+ from a reset the operator declares —
155
+ `bullswarm strategy set-subscription <pool> --resets-at <iso|unknown>`.
156
+ The Relay token API stopped returning `expires_at` for the `1` and `Moham`
157
+ wallets on 2026-09-03 (the fleetlens log holds 28 dated snapshots between
158
+ 2026-08-31 and 2026-09-03, then only nulls), so `opencode2` and
159
+ `opencode2:relay-3` printed `unmetered` at 73.8% and 10.7% of their $50
160
+ wallets and ranked as neutral. With a declared reset the used% stays the
161
+ provider's, elapsed% runs to the declared date, the date rolls forward one
162
+ calendar month (or week) at a time once it passes, and `bullswarm pools`
163
+ labels the row `[live declared-reset]`; `pools --json` and
164
+ `strategy show` carry `resetSource` (`provider` | `declared`). A window
165
+ the provider does date is never overridden. Doctrine M2 in
166
+ `src/meters/framework.js` and the guide's rule 2 record the operator path.
167
+
3
168
  ## 0.28.8 — a README for visitors and a documentation site
4
169
 
5
170
  - docs: README rewritten for external visitors landing on the GitHub page —
@@ -212,7 +377,7 @@
212
377
  `elapsedPct`, `pace` and `paceResetsAt` off `reading.windows`, so cache,
213
378
  stale and live readings are paced identically; the pool view carries
214
379
  `pacingWindow`. The 5h gate is untouched: `command-code` still gates on 5h
215
- `25.2%`. Connectors already declared this — `command-code` and the kaihk
380
+ `25.2%`. Connectors already declared this — `command-code` and the relay
216
381
  pools `monthly`, `claude-code`/`codex`/`grok` `weekly`; nothing read it for
217
382
  pacing before.
218
383
  - The spend model follows the pacing window. `WINDOW_KEYS` (framework.js)
@@ -372,7 +537,7 @@
372
537
  no planner has to reason about. No shipped connector's routing changes
373
538
  either way — all six declare all three lanes.
374
539
 
375
- - The three KaiHK-backed OpenCode pools can now run gpt-5.6-luna at a
540
+ - The three Relay-backed OpenCode pools can now run gpt-5.6-luna at a
376
541
  chosen reasoning level. `connectors/opencode2.json` declares
377
542
  `reasoning: { flag: "--variant", levels: [low, medium, high, xhigh,
378
543
  max], defaults: { high: high, medium: medium, low: low } }` — the same
@@ -380,25 +545,25 @@
380
545
  backend — so rungs for these pools stop printing `— (unsupported)`.
381
546
  opencode only forwards a `--variant` its config declares for that
382
547
  model, so the flag alone would be silently dropped;
383
- `expandOpenCodeKaihkConnectors` (`src/lib/opencode-kaihk.js`) therefore
548
+ `expandOpenCodeRelayConnectors` (`src/lib/opencode-relay.js`) therefore
384
549
  sets `env.OPENCODE_CONFIG_CONTENT` on the base pool and on every clone
385
550
  to the variants for that pool's OWN provider id, via the new pure
386
- helper `kaihkVariantsConfig(providerId, model = KAIHK_OPENCODE_MODEL)`:
387
- `{"provider":{"kaihk-2":{"models":{"gpt-5.6-luna":{"variants":{"low":{"reasoningEffort":"low"},"medium":{"reasoningEffort":"medium"},"high":{"reasoningEffort":"high"},"xhigh":{"reasoningEffort":"xhigh"},"max":{"reasoningEffort":"max"}}}}}}}`.
551
+ helper `relayVariantsConfig(providerId, model = RELAY_OPENCODE_MODEL)`:
552
+ `{"provider":{"relay-2":{"models":{"gpt-5.6-luna":{"variants":{"low":{"reasoningEffort":"low"},"medium":{"reasoningEffort":"medium"},"high":{"reasoningEffort":"high"},"xhigh":{"reasoningEffort":"xhigh"},"max":{"reasoningEffort":"max"}}}}}}}`.
388
553
  opencode merges that JSON string over the config file, so the API key
389
554
  and everything else in `~/.config/opencode/opencode.json` stays in
390
555
  force. An `OPENCODE_CONFIG_CONTENT` the operator set by hand in the
391
556
  installed connector is never overwritten, on the base pool or on the
392
- clones. A medium/max dispatch on `opencode2:kaihk-2` composes
393
- `opencode run --auto --model kaihk-2/gpt-5.6-luna <taskFile> --variant
557
+ clones. A medium/max dispatch on `opencode2:relay-2` composes
558
+ `opencode run --auto --model relay-2/gpt-5.6-luna <taskFile> --variant
394
559
  max --format json`; a level already pinned in the template is replaced,
395
560
  not duplicated. Per pool:
396
- `bullswarm strategy set-rung opencode2 medium --model kaihk/gpt-5.6-luna --reasoning max`,
397
- `bullswarm strategy set-rung opencode2:kaihk-2 medium --model kaihk-2/gpt-5.6-luna --reasoning max`,
398
- `bullswarm strategy set-rung opencode2:kaihk-3 medium --model kaihk-3/gpt-5.6-luna --reasoning max`.
561
+ `bullswarm strategy set-rung opencode2 medium --model relay/gpt-5.6-luna --reasoning max`,
562
+ `bullswarm strategy set-rung opencode2:relay-2 medium --model relay-2/gpt-5.6-luna --reasoning max`,
563
+ `bullswarm strategy set-rung opencode2:relay-3 medium --model relay-3/gpt-5.6-luna --reasoning max`.
399
564
  Existing installations pick the block up through
400
565
  `upgradeConnectorMetadata` (`src/setup.js`), which backfills a missing
401
- `reasoning` block and leaves a customised one alone. Non-KaiHK opencode
566
+ `reasoning` block and leaves a customised one alone. Non-Relay opencode
402
567
  installations get no injected variants, so `--variant` is a no-op there
403
568
  rather than an error — recorded in the connector's
404
569
  `$comment-reasoning`.
@@ -1139,11 +1304,11 @@ behaviour, or pass the program you authored with `--program <file.json>`.
1139
1304
  automatic LLM classification.
1140
1305
 
1141
1306
  - OpenCode connector portability: `connectors/opencode2.json` no longer
1142
- hardcodes `--model kaihk/gpt-5.6-luna` in `spawn.cmd`. A plain OpenCode
1143
- install with no KaiHK provider configured now dispatches with OpenCode's
1144
- own default model instead of failing to resolve a KaiHK-only model.
1145
- `src/lib/opencode-kaihk.js` still injects the explicit
1146
- `--model <providerId>/gpt-5.6-luna` for each discovered KaiHK provider, so
1307
+ hardcodes `--model relay/gpt-5.6-luna` in `spawn.cmd`. A plain OpenCode
1308
+ install with no Relay provider configured now dispatches with OpenCode's
1309
+ own default model instead of failing to resolve a Relay-only model.
1310
+ `src/lib/opencode-relay.js` still injects the explicit
1311
+ `--model <providerId>/gpt-5.6-luna` for each discovered Relay provider, so
1147
1312
  the primary `opencode2` pool and any extra `opencode2:<id>` pools keep
1148
1313
  dispatching with their pinned per-provider model exactly as before.
1149
1314
 
@@ -1178,7 +1343,7 @@ behaviour, or pass the program you authored with `--program <file.json>`.
1178
1343
  - Historical workflow design documents now identify themselves as dated
1179
1344
  implementation records and list the current `verify`, `decide`, and
1180
1345
  `outputSchema` surfaces instead of presenting resolved gaps as current.
1181
- - Extra KaiHK providers in `~/.config/opencode/opencode.json` (`kaihk-2`, …)
1346
+ - Extra Relay providers in `~/.config/opencode/opencode.json` (`relay-2`, …)
1182
1347
  become `opencode2:<id>` pools, spawned with `--model <id>/gpt-5.6-luna`.
1183
1348
  Spend is read from `GET /api/usage/token` plus
1184
1349
  `/v1/dashboard/billing/usage` (USD = `total_usage / 100`). The HTML wallet
@@ -1303,7 +1468,7 @@ behaviour, or pass the program you authored with `--program <file.json>`.
1303
1468
  spent a 97 s correction turn on it).
1304
1469
  - Goal-4 rerun on `7724da1` (`8ebi8a`, rule 7 + PR #5): 42 min 03 s, three
1305
1470
  planner turns (775 s, 31 %), parallelism 1.34, 23 dispatches (20 on
1306
- `kaihk/gpt-5.6-luna`), three repair rounds each rejected on re-verify for
1471
+ `relay/gpt-5.6-luna`), three repair rounds each rejected on re-verify for
1307
1472
  reasons the prompts caused, tail of five actions blocked, recovery program
1308
1473
  auto-completed, 315/315, existing tests +179/−1. Goal-4 line:
1309
1474
  44 → 72 → 37 → 25 → 36 → 42 min.
@@ -1339,7 +1504,7 @@ behaviour, or pass the program you authored with `--program <file.json>`.
1339
1504
  re-verify rejected the mandated extension, and a planner turn recovered.
1340
1505
  - Goal-4 rerun on v0.16.0 (`euh622`): 36 min 00 s, four stage phases in the TUI
1341
1506
  (implement, tests, verify, report) instead of sixteen one-action rows, 22/24
1342
- dispatches on `kaihk/gpt-5.6-luna`, auto-completed, 319/319; two planner
1507
+ dispatches on `relay/gpt-5.6-luna`, auto-completed, 319/319; two planner
1343
1508
  turns because of the false rejection above (planner turn 2: "an append-only
1344
1509
  rule that the goal itself makes unsatisfiable").
1345
1510
 
@@ -1360,7 +1525,7 @@ behaviour, or pass the program you authored with `--program <file.json>`.
1360
1525
  wrote sixteen one-action phases — no scheduling cost (phases never gate;
1361
1526
  `dependsOn` does), but a TUI phase list carrying no information.
1362
1527
  - Goal-4 rerun on this release (`bizp4s`, runtime `9af8fdf`, workers on
1363
- `kaihk/gpt-5.6-luna`): **25 min 13 s** (attempt 3: 44 min; 0.15.0: 72 min;
1528
+ `relay/gpt-5.6-luna`): **25 min 13 s** (attempt 3: 44 min; 0.15.0: 72 min;
1364
1529
  audited contract alone: 37 min), one planner turn (247 s, 16 % of wall),
1365
1530
  parallelism 1.77, 3 repair rounds each fixing a real defect, 0 schema
1366
1531
  retries, 0 corrections, auto-completed, 319/319, existing tests +174/−0.
package/README.md CHANGED
@@ -38,7 +38,9 @@ npm i -g bullswarm
38
38
  bullswarm setup
39
39
  ```
40
40
 
41
- Requires Node.js 18 or later. `bullswarm setup` walks through detecting your
41
+ Later, `bullswarm update` upgrades that install to the latest published
42
+ version in place (`bullswarm update --check` only reports). Requires Node.js
43
+ 22.12 or later. `bullswarm setup` walks through detecting your
42
44
  installed agent CLIs, showing their quota state, and writing a routing
43
45
  configuration. See
44
46
  [Getting started](https://cowcow02.github.io/bullswarm/guide/getting-started/)
@@ -157,6 +159,7 @@ directly under [`docs/guide/`](docs/guide/) in this repository.
157
159
  | [Dashboard](https://cowcow02.github.io/bullswarm/guide/dashboard/) | `workflow watch`, the interactive TUI, terminal glyph fallback |
158
160
  | [Repository operations](https://cowcow02.github.io/bullswarm/guide/repository-operations/) | The issue-watcher launchd agent |
159
161
  | [Routing](https://cowcow02.github.io/bullswarm/guide/routing/) | How a pool is picked: pace, headroom, urgency, load, quarantine |
162
+ | [Providers](https://cowcow02.github.io/bullswarm/guide/providers/) | Adding your own agent CLI or reseller account as a provider plugin |
160
163
 
161
164
  ## License
162
165
 
package/data/README.md CHANGED
@@ -81,7 +81,7 @@ Schema `bullswarm.epoch.benchmarks.v1`:
81
81
  | Field | Meaning |
82
82
  | --- | --- |
83
83
  | `modelVersion` | Epoch "Model version" string, unmodified |
84
- | `model` | `normalizeModelId(modelVersion)`: lower-case, drop everything before the last `/`, strip a trailing effort token (`low\|medium\|high\|xhigh\|max\|minimal`) and surrounding punctuation, collapse whitespace to `-`. Connector ids such as `kaihk/gpt-5.6-luna` match `gpt-5.6-luna` through the same function. |
84
+ | `model` | `normalizeModelId(modelVersion)`: lower-case, drop everything before the last `/`, strip a trailing effort token (`low\|medium\|high\|xhigh\|max\|minimal`) and surrounding punctuation, collapse whitespace to `-`. Connector ids such as `relay/gpt-5.6-luna` match `gpt-5.6-luna` through the same function. |
85
85
  | `reasoningLevel` | Canonical `low\|medium\|high\|xhigh\|max\|minimal`, or `null`. Taken from an explicit "Reasoning level" / "Reasoning effort" column when present and non-empty (`Extra High` → `xhigh`), else from a parenthesised or `_`/`-` suffix on the model version, else `null`. |
86
86
  | `benchmark` | `cursorbench`, `deepswe`, `arc-agi-2`, or `critpt` |
87
87
  | `score` | The CSV's native score on the scale below |