bullswarm 0.28.8 → 0.29.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 (74) hide show
  1. package/AGENTS.md +17 -9
  2. package/CHANGELOG.md +163 -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 +75 -8
  29. package/skill/references/operations.md +101 -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 +5 -0
  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 +2 -2
  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 +40 -14
  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 +374 -30
  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 +56 -0
  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,148 @@
1
1
  # bullswarm changelog
2
2
 
3
+ ## 0.29.0 — steer a running workflow, providers become directories, a declared reset date
4
+
5
+ - workflow: the plan of a caller-planned program run can be changed at any
6
+ time. `bullswarm workflow plan export <id>` writes the live plan as an
7
+ editable revision document, and `bullswarm workflow plan revise <id>
8
+ --program plan.json` replaces it: the kernel matches actions by id and
9
+ applies the difference within about a second while agents keep running. A
10
+ new id is added; an unchanged action keeps its result and its running agent;
11
+ a changed action is stopped if running and starts over with the new
12
+ definition; an id in `rerun` discards its result and runs again; a missing id
13
+ is removed (stopped, never run, reported as `removed` and not counted against
14
+ the result); and every step downstream of a changed or rerun step runs again.
15
+ Evidence from a removed or rerun check stops counting until judged again.
16
+ Revisions carry `baseRevision`, so a revision written against an outdated
17
+ export is rejected instead of silently undoing another change, and an
18
+ invalid revision changes nothing. Revising a finished run reopens it and
19
+ archives the earlier result as `result-before-revision-<n>.json`.
20
+ - workflow: `bullswarm workflow pause <id>` stops new work while running agents
21
+ finish (`--now` stops them too and requeues their steps). The kernel exits
22
+ with `outcome: paused`; revisions apply while paused, and `workflow resume`
23
+ is the only way to continue.
24
+ - workflow: steering a caller-planned program run no longer halts it at the
25
+ next boundary. Watchers print `steering received`, the export lists the
26
+ pending messages, and a revision delivers them; only a run about to finish
27
+ with steering still unread pauses for the caller.
28
+ - watch: new lines for `plan revised`, `plan revision rejected`, pause
29
+ requested/lifted, run reopened, steering received, and steps stopped by a
30
+ revision or a pause.
31
+ - skill: SKILL.md gains "Steer a running workflow" and treats every watch
32
+ wake-up as a point to decide whether the plan still fits; operations.md
33
+ documents revision semantics, pause and resume, and steering.
34
+
35
+ - providers: every coding-agent CLI is now a provider directory holding
36
+ `connector.json`, `provider.mjs`, or both, loaded by one synchronous loader
37
+ (`src/lib/providers.js`) from three tiers. First-class (`src/providers/`)
38
+ always loads and holds claude-code, codex, grok and echo. Contrib
39
+ (`providers/contrib/`) ships in the package but loads only where
40
+ `~/.bullswarm/providers.json` lists it, and holds command-code and the
41
+ generic opencode2 connector. Local (`~/.bullswarm/providers/`) is the
42
+ operator's own and never appears in this repository. A module exports at most
43
+ `name`, `displayName`, `connectors(ctx)`, `readUsage(pool, ctx)` and
44
+ `doctor(ctx)`; everything else stays the connector JSON four CLIs already
45
+ ran through. Echo ships JSON-only and grok keeps its OAuth-refreshing meter
46
+ as real code, so both paths stay exercised.
47
+ - providers: `bullswarm provider list|enable|disable|validate|scaffold|probe`.
48
+ `probe` spawns one pool through the dispatcher's own runner with a one-word
49
+ task and then reads its meter once, which is the only evidence that a new
50
+ provider's model flag, event parsing and meter all actually work.
51
+ - core: the per-vendor branching is gone. The meter registry resolves a pool's
52
+ reader through its owning provider instead of a name-prefix map, connector
53
+ loading is one call into the loader, setup discovery and the strategy labels
54
+ come from provider entries, and both hard-coded connector expanders are
55
+ deleted. `credentialGroup` is the honest name for `upstreamGroup`, which is
56
+ still read.
57
+ - requires Node >= 22.12: the loader reads `provider.mjs` through
58
+ `require(esm)` so `loadConnectors` and `buildPools` stay synchronous for
59
+ their twenty-odd call sites.
60
+ - providers: built-in support for one specific reseller was removed entirely.
61
+ It is expressible as a local provider with no repository changes at all,
62
+ which was the point of the tiers.
63
+ - setup: `BULLSWARM_NO_PACKAGED_PROVIDERS=1` forces the packaged tiers off, for
64
+ tests that spawn the real CLI against a fixture home and assert an exact pool
65
+ list. Never set it in production.
66
+ - workflow: evidence actions are routed like any other action. They used to be
67
+ steered away from the pools that did the work, which bought little
68
+ independence (the judging model is chosen by tier, not by pool) and overrode
69
+ pacing. The `avoidPools` dispatch option is gone.
70
+ - codex: the connector runs `codex exec -s danger-full-access`. Codex sandboxes
71
+ writes to its workspace, so a workflow evidence action could do the work and
72
+ still fail with EPERM writing its candidate file into the run's state
73
+ directory under the bullswarm home.
74
+ - command-code: the connector passes `--max-turns 10000`. command-code's print
75
+ mode stops after 100 turns by default and exits 8 mid-task, which bullswarm
76
+ could only report as a non-zero exit and retry from scratch on another pool.
77
+
78
+ - routing: an upstream auth failure reported inside a provider's event stream
79
+ is now the `auth` failure kind with a quarantine hint, and it benches every
80
+ pool that shares the same upstream credential. On 2026-09-11 the pooled Codex
81
+ OAuth account behind `https://relay.example` was invalidated at 12:24 UTC and
82
+ answered every request with
83
+ `{"error":{"message":"Encountered invalidated oauth token for user, failing
84
+ request","type":"authentication_error","code":"auth_unavailable"}}` (401) or
85
+ `auth_unavailable: no auth available (providers=codex, model=gpt-5.6-luna; …)`
86
+ (503); non-GPT models on the same host answered `No available channel for
87
+ model <name> under group default`. `src/lib/watch.js` turned any stream
88
+ `error` event into a bare `provider` verdict before the auth gate ran, so no
89
+ pool was ever benched: a failed action's retry walked
90
+ `opencode2:relay-3` → `opencode2:relay-2` → `opencode2` — three names for the
91
+ one dead credential — and runs m4xiva and ytdsii ended `partial` with their
92
+ integrate/verify actions blocked (failures at 12:24, 12:25, 12:52, 12:53,
93
+ 12:54; last good dispatch 11:22). Four upstream phrases now ship as
94
+ `DEFAULT_AUTH_SIGNATURES` (`src/lib/auth-signatures.js`), matched only on a
95
+ stream that already declared a failure and only on an error-shaped line or
96
+ the raw JSON error event itself, so an agent that merely reads auth code is
97
+ still never quarantined. Connectors may declare `upstreamGroup`;
98
+ `src/lib/opencode-relay.js` sets `relay:<host>` on every expanded Relay pool,
99
+ and an auth quarantine now spreads to that group on one shared 10-minute
100
+ deadline in both dispatch paths. Claude account pools get no group — separate
101
+ seats are separate credentials — and a `quota` quarantine never spreads,
102
+ because a sibling's own window still has work in it.
103
+
104
+ - cli: `bullswarm update [--check] [--json]` upgrades the installation in
105
+ place — the verb a teammate reached for and found missing (2026-09-11). It
106
+ reads the latest version from the npm registry, tells the install shape
107
+ from the running package's real path rather than from `which` or `npm root
108
+ -g` (which can name a different Node install), and acts accordingly: a
109
+ global install gets `npm install -g bullswarm@<latest> --prefix <its own
110
+ prefix>`; a source checkout, including a global `npm link` into one, gets
111
+ `git pull --ff-only` and is refused while it has local changes; anything
112
+ else prints the manual command and exits 1. Success is verified by
113
+ re-reading package.json on disk, never by npm's exit code, and a shell
114
+ whose `bullswarm` resolves elsewhere is called out. `--check` compares
115
+ without changing anything.
116
+ - routing: the reasoning level now reaches every model a Relay pool can run,
117
+ not only `gpt-5.6-luna`. opencode forwards `--variant <level>` only when its
118
+ config declares that variant for that exact model, and the config
119
+ `src/lib/opencode-relay.js` injects declared the five levels for luna alone,
120
+ so moving a tier onto `<id>/gpt-5.6-sol` (2026-09-12, when luna had no
121
+ upstream channel left but sol did) would have sent a `--variant medium` that
122
+ opencode silently dropped while `strategy rungs` kept reporting medium.
123
+ Discovery now records each provider's model list from opencode.json and the
124
+ variants are declared on all of them; a provider that lists none keeps the
125
+ luna default.
126
+ - meters: a Relay pool's used% is read against its own declared plan total
127
+ (`strategy set-subscription <pool> --included-usd <n>`) before the host-wide
128
+ `RELAY_PLAN_USD` and the $50 default. The wallets differ — relay-4 is a $20
129
+ newcomer plan — and one shared number would have shown a $10 spend on it as
130
+ 20% used.
131
+ - meters: a pool whose provider reports usage but no reset date can be paced
132
+ from a reset the operator declares —
133
+ `bullswarm strategy set-subscription <pool> --resets-at <iso|unknown>`.
134
+ The Relay token API stopped returning `expires_at` for the `1` and `Moham`
135
+ wallets on 2026-09-03 (the fleetlens log holds 28 dated snapshots between
136
+ 2026-08-31 and 2026-09-03, then only nulls), so `opencode2` and
137
+ `opencode2:relay-3` printed `unmetered` at 73.8% and 10.7% of their $50
138
+ wallets and ranked as neutral. With a declared reset the used% stays the
139
+ provider's, elapsed% runs to the declared date, the date rolls forward one
140
+ calendar month (or week) at a time once it passes, and `bullswarm pools`
141
+ labels the row `[live declared-reset]`; `pools --json` and
142
+ `strategy show` carry `resetSource` (`provider` | `declared`). A window
143
+ the provider does date is never overridden. Doctrine M2 in
144
+ `src/meters/framework.js` and the guide's rule 2 record the operator path.
145
+
3
146
  ## 0.28.8 — a README for visitors and a documentation site
4
147
 
5
148
  - docs: README rewritten for external visitors landing on the GitHub page —
@@ -212,7 +355,7 @@
212
355
  `elapsedPct`, `pace` and `paceResetsAt` off `reading.windows`, so cache,
213
356
  stale and live readings are paced identically; the pool view carries
214
357
  `pacingWindow`. The 5h gate is untouched: `command-code` still gates on 5h
215
- `25.2%`. Connectors already declared this — `command-code` and the kaihk
358
+ `25.2%`. Connectors already declared this — `command-code` and the relay
216
359
  pools `monthly`, `claude-code`/`codex`/`grok` `weekly`; nothing read it for
217
360
  pacing before.
218
361
  - The spend model follows the pacing window. `WINDOW_KEYS` (framework.js)
@@ -372,7 +515,7 @@
372
515
  no planner has to reason about. No shipped connector's routing changes
373
516
  either way — all six declare all three lanes.
374
517
 
375
- - The three KaiHK-backed OpenCode pools can now run gpt-5.6-luna at a
518
+ - The three Relay-backed OpenCode pools can now run gpt-5.6-luna at a
376
519
  chosen reasoning level. `connectors/opencode2.json` declares
377
520
  `reasoning: { flag: "--variant", levels: [low, medium, high, xhigh,
378
521
  max], defaults: { high: high, medium: medium, low: low } }` — the same
@@ -380,25 +523,25 @@
380
523
  backend — so rungs for these pools stop printing `— (unsupported)`.
381
524
  opencode only forwards a `--variant` its config declares for that
382
525
  model, so the flag alone would be silently dropped;
383
- `expandOpenCodeKaihkConnectors` (`src/lib/opencode-kaihk.js`) therefore
526
+ `expandOpenCodeRelayConnectors` (`src/lib/opencode-relay.js`) therefore
384
527
  sets `env.OPENCODE_CONFIG_CONTENT` on the base pool and on every clone
385
528
  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"}}}}}}}`.
529
+ helper `relayVariantsConfig(providerId, model = RELAY_OPENCODE_MODEL)`:
530
+ `{"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
531
  opencode merges that JSON string over the config file, so the API key
389
532
  and everything else in `~/.config/opencode/opencode.json` stays in
390
533
  force. An `OPENCODE_CONFIG_CONTENT` the operator set by hand in the
391
534
  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
535
+ clones. A medium/max dispatch on `opencode2:relay-2` composes
536
+ `opencode run --auto --model relay-2/gpt-5.6-luna <taskFile> --variant
394
537
  max --format json`; a level already pinned in the template is replaced,
395
538
  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`.
539
+ `bullswarm strategy set-rung opencode2 medium --model relay/gpt-5.6-luna --reasoning max`,
540
+ `bullswarm strategy set-rung opencode2:relay-2 medium --model relay-2/gpt-5.6-luna --reasoning max`,
541
+ `bullswarm strategy set-rung opencode2:relay-3 medium --model relay-3/gpt-5.6-luna --reasoning max`.
399
542
  Existing installations pick the block up through
400
543
  `upgradeConnectorMetadata` (`src/setup.js`), which backfills a missing
401
- `reasoning` block and leaves a customised one alone. Non-KaiHK opencode
544
+ `reasoning` block and leaves a customised one alone. Non-Relay opencode
402
545
  installations get no injected variants, so `--variant` is a no-op there
403
546
  rather than an error — recorded in the connector's
404
547
  `$comment-reasoning`.
@@ -1139,11 +1282,11 @@ behaviour, or pass the program you authored with `--program <file.json>`.
1139
1282
  automatic LLM classification.
1140
1283
 
1141
1284
  - 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
1285
+ hardcodes `--model relay/gpt-5.6-luna` in `spawn.cmd`. A plain OpenCode
1286
+ install with no Relay provider configured now dispatches with OpenCode's
1287
+ own default model instead of failing to resolve a Relay-only model.
1288
+ `src/lib/opencode-relay.js` still injects the explicit
1289
+ `--model <providerId>/gpt-5.6-luna` for each discovered Relay provider, so
1147
1290
  the primary `opencode2` pool and any extra `opencode2:<id>` pools keep
1148
1291
  dispatching with their pinned per-provider model exactly as before.
1149
1292
 
@@ -1178,7 +1321,7 @@ behaviour, or pass the program you authored with `--program <file.json>`.
1178
1321
  - Historical workflow design documents now identify themselves as dated
1179
1322
  implementation records and list the current `verify`, `decide`, and
1180
1323
  `outputSchema` surfaces instead of presenting resolved gaps as current.
1181
- - Extra KaiHK providers in `~/.config/opencode/opencode.json` (`kaihk-2`, …)
1324
+ - Extra Relay providers in `~/.config/opencode/opencode.json` (`relay-2`, …)
1182
1325
  become `opencode2:<id>` pools, spawned with `--model <id>/gpt-5.6-luna`.
1183
1326
  Spend is read from `GET /api/usage/token` plus
1184
1327
  `/v1/dashboard/billing/usage` (USD = `total_usage / 100`). The HTML wallet
@@ -1303,7 +1446,7 @@ behaviour, or pass the program you authored with `--program <file.json>`.
1303
1446
  spent a 97 s correction turn on it).
1304
1447
  - Goal-4 rerun on `7724da1` (`8ebi8a`, rule 7 + PR #5): 42 min 03 s, three
1305
1448
  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
1449
+ `relay/gpt-5.6-luna`), three repair rounds each rejected on re-verify for
1307
1450
  reasons the prompts caused, tail of five actions blocked, recovery program
1308
1451
  auto-completed, 315/315, existing tests +179/−1. Goal-4 line:
1309
1452
  44 → 72 → 37 → 25 → 36 → 42 min.
@@ -1339,7 +1482,7 @@ behaviour, or pass the program you authored with `--program <file.json>`.
1339
1482
  re-verify rejected the mandated extension, and a planner turn recovered.
1340
1483
  - Goal-4 rerun on v0.16.0 (`euh622`): 36 min 00 s, four stage phases in the TUI
1341
1484
  (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
1485
+ dispatches on `relay/gpt-5.6-luna`, auto-completed, 319/319; two planner
1343
1486
  turns because of the false rejection above (planner turn 2: "an append-only
1344
1487
  rule that the goal itself makes unsatisfiable").
1345
1488
 
@@ -1360,7 +1503,7 @@ behaviour, or pass the program you authored with `--program <file.json>`.
1360
1503
  wrote sixteen one-action phases — no scheduling cost (phases never gate;
1361
1504
  `dependsOn` does), but a TUI phase list carrying no information.
1362
1505
  - 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;
1506
+ `relay/gpt-5.6-luna`): **25 min 13 s** (attempt 3: 44 min; 0.15.0: 72 min;
1364
1507
  audited contract alone: 37 min), one planner turn (247 s, 16 % of wall),
1365
1508
  parallelism 1.77, 3 repair rounds each fixing a real defect, 0 schema
1366
1509
  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 |