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.
- package/AGENTS.md +17 -9
- package/CHANGELOG.md +185 -20
- package/README.md +4 -1
- package/data/README.md +1 -1
- package/data/openrouter-benchmarks.json +12437 -11779
- package/docs/audits/2026-09-09-codebase-audit.md +6 -6
- package/docs/dynamic-workflow-handoff.md +3 -3
- package/docs/dynamic-workflow-qa.md +1 -1
- package/docs/dynamic-workflow-v2-execution-plan.md +7 -7
- package/docs/experiments/2026-08-29-dogfood-bullswarm-builds-bullswarm.md +13 -13
- package/docs/experiments/2026-08-31-v2-component-probes.md +7 -7
- package/docs/guide/dashboard.md +5 -1
- package/docs/guide/doctrine.md +6 -2
- package/docs/guide/getting-started.md +1 -0
- package/docs/guide/providers.md +227 -0
- package/docs/guide/routing.md +28 -0
- package/docs/guide/strategy.md +9 -7
- package/docs/guide/workflows.md +50 -11
- package/docs/handoff-2026-09-13-custom-provider-config.md +49 -0
- package/docs/index.md +1 -0
- package/docs/planner-prompt-audit-2026-08-29.md +1 -1
- package/package.json +3 -2
- package/providers/contrib/README.md +32 -0
- package/{connectors/command-code.json → providers/contrib/command-code/connector.json} +4 -1
- package/{src/meters/command-code.js → providers/contrib/command-code/provider.mjs} +27 -16
- package/{connectors/opencode2.json → providers/contrib/opencode2/connector.json} +4 -3
- package/providers/contrib/opencode2/provider.mjs +7 -0
- package/skill/SKILL.md +77 -8
- package/skill/references/operations.md +103 -7
- package/skill/references/providers.md +97 -0
- package/src/cli.js +37 -9
- package/src/help.js +254 -20
- package/src/lib/auth-signatures.js +79 -0
- package/src/lib/cli-flags.js +14 -1
- package/src/lib/config.js +54 -28
- package/src/lib/providers.js +353 -0
- package/src/lib/state.js +47 -0
- package/src/lib/strategy.js +10 -1
- package/src/lib/update.js +285 -0
- package/src/lib/watch.js +49 -0
- package/src/meters/framework.js +84 -5
- package/src/meters/registry.js +50 -56
- package/src/provider-cli.js +780 -0
- package/src/provider-kit.js +146 -0
- package/src/providers/_schema.json +181 -0
- package/src/providers/claude-code/provider.mjs +372 -0
- package/{connectors/codex.json → src/providers/codex/connector.json} +3 -1
- package/src/{meters/codex.js → providers/codex/provider.mjs} +18 -9
- package/{connectors/echo.json → src/providers/echo/connector.json} +1 -1
- package/src/{meters/grok.js → providers/grok/provider.mjs} +23 -14
- package/src/setup.js +129 -40
- package/src/strategy-cli.js +57 -28
- package/src/workflow/cli.js +264 -11
- package/src/workflow/dashboard.js +5 -3
- package/src/workflow/execution-policy.js +11 -0
- package/src/workflow/ledger.js +22 -0
- package/src/workflow/runs-cli.js +2 -1
- package/src/workflow/v2-dispatch.js +41 -15
- package/src/workflow/v2-outcome.js +5 -3
- package/src/workflow/v2-planner.js +16 -5
- package/src/workflow/v2-presentation.js +53 -1
- package/src/workflow/v2-revision.js +362 -0
- package/src/workflow/v2-runtime.js +395 -33
- package/src/workflow/v2-scheduler.js +3 -1
- package/src/workflow/v2-state.js +133 -10
- package/src/workflow/watch-cli.js +58 -1
- package/connectors/_schema.json +0 -96
- package/src/lib/claude-accounts.js +0 -202
- package/src/lib/opencode-kaihk.js +0 -177
- package/src/meters/claude.js +0 -135
- package/src/meters/kaihk.js +0 -97
- /package/{connectors/claude-code.json → src/providers/claude-code/connector.json} +0 -0
- /package/{connectors → src/providers/echo}/echo-worker.mjs +0 -0
- /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.
|
|
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 >=
|
|
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
|
|
76
|
+
## Adding a provider
|
|
74
77
|
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
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
|
|
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
|
|
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
|
-
`
|
|
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 `
|
|
387
|
-
`{"provider":{"
|
|
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:
|
|
393
|
-
`opencode run --auto --model
|
|
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
|
|
397
|
-
`bullswarm strategy set-rung opencode2:
|
|
398
|
-
`bullswarm strategy set-rung opencode2:
|
|
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-
|
|
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
|
|
1143
|
-
install with no
|
|
1144
|
-
own default model instead of failing to resolve a
|
|
1145
|
-
`src/lib/opencode-
|
|
1146
|
-
`--model <providerId>/gpt-5.6-luna` for each discovered
|
|
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
|
|
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
|
-
`
|
|
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 `
|
|
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
|
-
`
|
|
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
|
-
|
|
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 `
|
|
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 |
|