bullswarm 0.26.0 → 0.27.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 +12 -18
- package/CHANGELOG.md +178 -0
- package/GOAL.md +3 -1
- package/README.md +34 -139
- package/data/README.md +8 -3
- package/docs/audits/2026-09-09-codebase-audit.md +1718 -0
- package/docs/claude-dynamic-workflow-mechanics.md +9 -5
- package/docs/design/2026-09-06-caller-first-cli.md +2 -0
- package/docs/dynamic-workflow-qa.md +2 -0
- package/docs/dynamic-workflow-v2-execution-plan.md +2 -0
- package/docs/experiments/2026-08-28-trending-ai-autonomy.md +2 -0
- package/docs/experiments/2026-08-29-dogfood-bullswarm-builds-bullswarm.md +2 -0
- package/docs/experiments/2026-08-29-ultracode-vs-bullswarm.md +2 -0
- package/docs/experiments/2026-08-31-v2-component-probes.md +2 -0
- package/docs/experiments/2026-09-06-caller-planner-evaluation.md +2 -0
- package/docs/integration-audit-2026-08-31.md +2 -0
- package/docs/planner-prompt-audit-2026-08-29.md +2 -0
- package/docs/workflow-agent-usability-audit-2026-08-27.md +2 -0
- package/docs/workflow-design.md +5 -1
- package/fixtures/failures/late-failure.json +6 -0
- package/fixtures/failures/structured-error.json +6 -0
- package/package.json +1 -2
- package/skill/SKILL.md +7 -2
- package/skill/references/operations.md +25 -14
- package/src/cli.js +149 -53
- package/src/help.js +73 -425
- package/src/lib/agent-events.js +0 -56
- package/src/lib/assignments.js +1 -1
- package/src/lib/cli-flags.js +212 -0
- package/src/lib/config.js +24 -9
- package/src/lib/epoch-benchmarks.js +5 -6
- package/src/{workflow → lib}/fsjson.js +5 -0
- package/src/lib/num.js +31 -0
- package/src/lib/openrouter-models.js +17 -13
- package/src/lib/quota.js +28 -25
- package/src/lib/route.js +46 -28
- package/src/lib/spend.js +12 -9
- package/src/lib/state.js +98 -3
- package/src/lib/strategy.js +71 -10
- package/src/lib/usage.js +0 -50
- package/src/lib/verify.js +39 -11
- package/src/lib/watch.js +93 -20
- package/src/meters/framework.js +4 -7
- package/src/setup.js +76 -55
- package/src/strategy-cli.js +232 -164
- package/src/strategy-dashboard.js +35 -28
- package/src/workflow/cli.js +98 -297
- package/src/workflow/dashboard.js +158 -969
- package/src/workflow/evidence-output.js +0 -21
- package/src/workflow/goal.js +0 -36
- package/src/workflow/ownership.js +0 -2
- package/src/workflow/runs-cli.js +155 -146
- package/src/workflow/short-id.js +101 -128
- package/src/workflow/steering.js +6 -8
- package/src/workflow/v2-cancellation.js +6 -1
- package/src/workflow/v2-dispatch.js +30 -14
- package/src/workflow/v2-runtime.js +2 -6
- package/src/workflow/v2-scheduler.js +0 -4
- package/src/workflow/v2-state.js +0 -4
- package/src/workflow/watch-cli.js +91 -135
- package/bin/check-output-schema.js +0 -30
- package/src/workflow/decision.js +0 -357
- package/src/workflow/draft-cli.js +0 -434
- package/src/workflow/draft.js +0 -268
- package/src/workflow/result.js +0 -239
- package/src/workflow/runner.js +0 -1304
- package/src/workflow/runtime.js +0 -1902
- package/src/workflow/schema.js +0 -81
- package/src/workflow/semaphore.js +0 -56
- package/src/workflow/template.js +0 -146
- package/src/workflow/tui.js +0 -297
- package/src/workflow/validate.js +0 -366
- package/workflows/adaptive-code-review.json +0 -45
- package/workflows/agent-model-comparison.json +0 -49
- package/workflows/connector-audit.json +0 -60
- package/workflows/smoke-two-step.json +0 -41
- package/workflows/verify-and-cap.json +0 -62
package/AGENTS.md
CHANGED
|
@@ -20,37 +20,31 @@ content. Published as `bullswarm` on npm.
|
|
|
20
20
|
5. Workflow dispatches must honor the same guarantees as single runs:
|
|
21
21
|
`BULLSWARM_DEPTH` is propagated, burst-gated pools are excluded, and
|
|
22
22
|
auth verdicts quarantine the pool + append to the shared decision log
|
|
23
|
-
(R6/R7/R8 in `src/workflow/
|
|
24
|
-
6. Adversarial verification is a first-class primitive:
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
stored under `~/.bullswarm/drafts/<name>/` and are runnable by name
|
|
30
|
-
without an upfront JSON. JSON is still the durable artifact — drafts
|
|
31
|
-
are JSON documents, just built one mutation at a time.
|
|
32
|
-
8. New goal workflows are caller-planned programs in a shared workspace.
|
|
23
|
+
(R6/R7/R8 in `src/workflow/v2-dispatch.js`).
|
|
24
|
+
6. Adversarial verification is a first-class primitive: an action naming
|
|
25
|
+
requirements in `evidenceFor` is dispatched under an evidence contract and
|
|
26
|
+
judges them from the durable artifact, so a requirement is only verified by
|
|
27
|
+
work someone else inspected (R-skeptic).
|
|
28
|
+
7. New goal workflows are caller-planned programs in a shared workspace.
|
|
33
29
|
`bullswarm workflow goal --program` executes the graph; `--orchestrator`
|
|
34
30
|
explicitly delegates planning. File territories are advisory scheduling
|
|
35
31
|
hints, and the graph finishes without automatic gap rounds. `verified`
|
|
36
32
|
separately records requirement evidence. `--isolation` opts into strict
|
|
37
33
|
per-worker worktrees. Saved V2 runs preserve their original semantics.
|
|
34
|
+
8. Historical authored-graph runs remain visible as read-only `legacy` rows.
|
|
35
|
+
Their executor was removed in 0.27.0; driving commands fail closed before
|
|
36
|
+
dispatch and historical run directories remain untouched.
|
|
38
37
|
|
|
39
38
|
## Development
|
|
40
39
|
|
|
41
40
|
```bash
|
|
42
41
|
npm test # full suite, no network needed (meters read from cache)
|
|
43
42
|
node bin/bullswarm.js doctor --json # readiness report
|
|
44
|
-
node bin/bullswarm.js workflow
|
|
43
|
+
node bin/bullswarm.js workflow goal "Fix the failing tests" --program plan.json
|
|
45
44
|
node bin/bullswarm.js workflow runs # ongoing workflow instances
|
|
46
45
|
node bin/bullswarm.js workflow runs --all # including historical
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
# Build a workflow from the shell:
|
|
50
|
-
bullswarm workflow draft create my-audit
|
|
51
|
-
bullswarm workflow draft phase add my-audit discover
|
|
52
|
-
bullswarm workflow draft step add my-audit discover list-files --type run --prompt 'List files'
|
|
53
|
-
bullswarm workflow draft run my-audit
|
|
46
|
+
# Validate a caller-authored program before launch:
|
|
47
|
+
bullswarm workflow plan validate "Fix the failing tests" --program plan.json
|
|
54
48
|
# Operate on a run by shortId (6 chars) or full runId (`wf-...`):
|
|
55
49
|
bullswarm workflow runs show <shortId>
|
|
56
50
|
bullswarm workflow runs delete <shortId> --yes
|
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,183 @@
|
|
|
1
1
|
# bullswarm changelog
|
|
2
2
|
|
|
3
|
+
## 0.27.1 — audit cleanup
|
|
4
|
+
|
|
5
|
+
- Deleted the remaining dead symbols the 2026-09-09 audit listed as Tier A:
|
|
6
|
+
`recordAgentAction` and `classifyAgentProgress`, `aggregateUsage`,
|
|
7
|
+
`parseEvidenceOutput`, `fiveHourTier`, `REASONING_DEFAULT_TIERS`, the twelve
|
|
8
|
+
alias re-exports around `runAutonomousV2` /
|
|
9
|
+
`assertV2ResumeCompatible` / `validateEvidenceEnvelope`, and
|
|
10
|
+
`integrationBlock`. `'workflow-v1'` is no longer an assignment source.
|
|
11
|
+
`currentUsedPct` no longer reads a `weeklyUsedPct` field no producer writes,
|
|
12
|
+
and the identical `--json` ternary in `strategy-cli` collapsed to one
|
|
13
|
+
`JSON.stringify`. `fixtures/openrouter/` stays; a new
|
|
14
|
+
`tests/refresh-openrouter-benchmarks.test.js` runs the refresh script against
|
|
15
|
+
those fixtures instead of deleting them.
|
|
16
|
+
|
|
17
|
+
- `state.json` is no longer last-writer-wins (D5). EVERY state writer goes
|
|
18
|
+
through one locked read-modify-write — take `state.lock`, reload FRESH,
|
|
19
|
+
mutate, atomically replace the file, release. That is `run`, `pools`,
|
|
20
|
+
`health` and the fixture migration plus the twenty-two remaining
|
|
21
|
+
load-mutate-save sites: fifteen in `strategy-cli` (set-rung, set-model,
|
|
22
|
+
reset-tier, set/reset-reasoning, configure, apply, auto off, assign,
|
|
23
|
+
clear-assignment, exclude/include-model, set-subscription and the persisted
|
|
24
|
+
refresh report), three in the strategy TUI, and four in `setup`
|
|
25
|
+
(`setup --yes`, both writing steps of the wizard, and the reasoning step).
|
|
26
|
+
`grep -n 'saveState(' src/` now finds only `src/lib/state.js`, which defines
|
|
27
|
+
it and calls it once, inside `updateState`. Waiters retry for 10 s and a lock
|
|
28
|
+
older than 30 s is taken over so a killed process cannot bench the file
|
|
29
|
+
forever. `run --dry-run` no longer refreshes strategy or hits the network
|
|
30
|
+
(D3). The fixture migration no longer force-disables a pool the operator
|
|
31
|
+
explicitly enabled (D1). Disabled pools are no longer polled (D6). When every
|
|
32
|
+
lane-capable pool was dropped by an empty tier allow-list, the routing reason
|
|
33
|
+
now says so instead of blaming missing capabilities (D7). `pools`, `health`
|
|
34
|
+
and `run --dry-run` leave `state.json` byte-for-byte alone when they have
|
|
35
|
+
nothing to change. `src/workflow/fsjson.js` — the re-export shim that carried
|
|
36
|
+
the workflow importers through the move of the atomic writer into
|
|
37
|
+
`src/lib/fsjson.js` — is deleted; both layers import `src/lib/fsjson.js`
|
|
38
|
+
directly.
|
|
39
|
+
|
|
40
|
+
- The content gate no longer treats an error-shaped JSON object as an answer,
|
|
41
|
+
and long outputs are scanned at both the head and the tail for failure
|
|
42
|
+
patterns.
|
|
43
|
+
|
|
44
|
+
- An unrecognized `--flag` is a usage error on every command: Bullswarm prints
|
|
45
|
+
`unknown flag --name` plus that command's synopsis and exits 2, before
|
|
46
|
+
self-initializing, routing, or spawning anything. `--lane` is required on
|
|
47
|
+
`run` (omitting it, or passing anything else, exits 2). `--limit` on
|
|
48
|
+
`workflow runs` must be a positive integer. `health --json` now selects the
|
|
49
|
+
machine-readable report; the default is a human summary of the same facts.
|
|
50
|
+
Help for `run --no-caller`, the always-JSON verbs, and the plan-contract /
|
|
51
|
+
plan-validate worker flags matches what the parsers actually accept.
|
|
52
|
+
|
|
53
|
+
- A dead kernel is visible: `watch`, `runs show`, `runs result --json`, and the
|
|
54
|
+
TUI surface the last 20 lines of `stderr.log` instead of a silent stall.
|
|
55
|
+
|
|
56
|
+
- Four small refactors from the audit's C1–C4 list: `TIER_LANES` is derived
|
|
57
|
+
from the 0.26 kind/effort tables so the strategy preview cannot disagree with
|
|
58
|
+
the validator; `clearTierAssignment` is the one writer of a cleared tier pin;
|
|
59
|
+
`finiteOrNull` is the one numeric coercion (blank/null prices and scores stay
|
|
60
|
+
unmeasured instead of becoming 0); quota signatures live in one table.
|
|
61
|
+
|
|
62
|
+
- The OpenRouter datapack no longer pretends to have a bundled last-resort
|
|
63
|
+
file. Loaders try `~/.bullswarm/cache/` then the rolling GitHub Release; a
|
|
64
|
+
cache miss with no network yields an empty catalog. Epoch still ships
|
|
65
|
+
`data/epoch-benchmarks.json`.
|
|
66
|
+
|
|
67
|
+
- Documentation made true: README no longer lists `runs cleanup`; bare
|
|
68
|
+
`bullswarm` is a TTY wizard and non-TTY callers self-initialize; the
|
|
69
|
+
OpenRouter/Epoch datapack fallback is described as it actually works; the
|
|
70
|
+
duplicated planning-targets paragraph appears once; `--name` is an exact
|
|
71
|
+
goal/name filter; `--classic` is V2-only and legacy watch exits 2;
|
|
72
|
+
`workflow-v1` is gone from the skill; `workflow goal` is no longer described
|
|
73
|
+
as an LLM-at-every-checkpoint loop; `delegate` is marked historical in the
|
|
74
|
+
2026-09-06 design note; GOAL.md and the ten dated `docs/` files that needed
|
|
75
|
+
a banner carry one.
|
|
76
|
+
|
|
77
|
+
- Tests: 661 -> 713, 0 failures. Eight new files carry the new behaviour:
|
|
78
|
+
`unknown-flags` (11 — one bogus flag per parser, the two typed inputs, and a
|
|
79
|
+
drift guard that re-extracts every documented command form), `cli-run` (6 —
|
|
80
|
+
the D3/D1/D7 CLI contracts), `config` (5 — D6), `num` (4 — strict
|
|
81
|
+
`finiteOrNull`), `workflow-dead-kernel` (4), `state-race` (1 — an operator
|
|
82
|
+
write during a live run), `state-lock-sites` (3 — two real `strategy`
|
|
83
|
+
processes racing one home, four issued at once, and a `configure` document
|
|
84
|
+
that throws mid-mutation, writing nothing and freeing the lock) and
|
|
85
|
+
`refresh-openrouter-benchmarks` (1 — the refresh script against
|
|
86
|
+
`fixtures/openrouter/`). Existing files lost the
|
|
87
|
+
cases that only covered deleted symbols (`agent-events` 19 -> 13, and the
|
|
88
|
+
`fiveHourTier` case in `route`, which kept its
|
|
89
|
+
`FIVE_HOUR_NEAR_LIMIT_PCT === 75` assertion) and gained coverage for the
|
|
90
|
+
locked state writers, the fixture-migration rule, and the content gate.
|
|
91
|
+
|
|
92
|
+
## 0.27.0 — one workflow engine
|
|
93
|
+
|
|
94
|
+
- Fixed: a worker that floods its stdout could kill the kernel. Every chunk of a
|
|
95
|
+
worker's stdout and stderr was appended to one string; a command-code worker
|
|
96
|
+
whose transcript outgrew Node's maximum string length threw
|
|
97
|
+
`RangeError: Invalid string length` inside the stream handler, the kernel died
|
|
98
|
+
as an uncaught exception, and every worker it supervised died with it (seen
|
|
99
|
+
twice on the same action in one day; the trace is in
|
|
100
|
+
`~/.bullswarm/goals/<runId>/stderr.log`). Streams are now captured through a
|
|
101
|
+
bounded buffer that keeps the first and last 16 MiB of each stream, counts what
|
|
102
|
+
it dropped (`captureTruncated` on the attempt observation), and any exception
|
|
103
|
+
raised while reading a worker now fails that attempt instead of the kernel.
|
|
104
|
+
Fatal-signature matching already looked only at the last 4,000 characters, so
|
|
105
|
+
quota and auth detection are unchanged.
|
|
106
|
+
|
|
107
|
+
- There is now one workflow engine. The authored-graph verbs `workflow run`,
|
|
108
|
+
`validate`, `list`, `draft`, `inspect` and `approval` are gone — each falls to
|
|
109
|
+
the workflow-level unknown-verb message, exits 2 and spawns nothing — and with
|
|
110
|
+
them the eleven V1 modules they drove: `runtime.js` (1,902 lines),
|
|
111
|
+
`runner.js` (1,304), `draft-cli.js` (434), `validate.js` (366),
|
|
112
|
+
`decision.js` (357), `tui.js` (297), `draft.js` (268), `result.js` (239),
|
|
113
|
+
`template.js` (146), `schema.js` (81) and `semaphore.js` (56). The V1 panel
|
|
114
|
+
model, timeline and orchestrator-detail twins came out of `dashboard.js`
|
|
115
|
+
(−965), the V1 branches out of `cli.js` (−291), `runs-cli.js` (−141),
|
|
116
|
+
`short-id.js` (−127) and `watch-cli.js` (−132). `src/workflow/*.js` goes from
|
|
117
|
+
16,941 lines to 10,257. Also deleted: the five saved definitions
|
|
118
|
+
`workflows/adaptive-code-review.json`, `agent-model-comparison.json`,
|
|
119
|
+
`connector-audit.json`, `smoke-two-step.json` and `verify-and-cap.json`
|
|
120
|
+
(257 lines) together with the `workflows/` entry in package.json `files`;
|
|
121
|
+
`scripts/sanity-multi-claude.mjs` (131), which only exercised `runWorkflow`;
|
|
122
|
+
and two more tools that could only reach deleted modules —
|
|
123
|
+
`bin/check-output-schema.js` (30, the V1 `outputSchema` worker preflight) and
|
|
124
|
+
`scripts/planner-contract-probe.mjs` (175, a probe for the V1 `decide`
|
|
125
|
+
planner). `workflow capabilities` now reports `engines.authoredGraphs` as
|
|
126
|
+
`{ retired: '0.27.0', command: null }` instead of advertising a verb that
|
|
127
|
+
exits 2. `bullswarm workflow --help` describes one engine.
|
|
128
|
+
|
|
129
|
+
- `newRunId` moved from `runner.js` into `src/workflow/short-id.js`, same
|
|
130
|
+
behaviour, exported; `v2-runtime.js` imports it from there.
|
|
131
|
+
|
|
132
|
+
- Removed the last V1 remnants that no gate caught because they named no
|
|
133
|
+
deleted symbol: the dead authored-graph planner prompt in
|
|
134
|
+
`src/workflow/goal.js` (`AUTONOMOUS_ORCHESTRATOR_PROMPT`,
|
|
135
|
+
`PLANNER_RULES_SECTION`, `PLANNER_EXAMPLES_SECTION` — 36 lines whose only
|
|
136
|
+
consumer was the deleted `runtime.js`, and which still taught `type`,
|
|
137
|
+
`stepTemplate`, `itemsFrom`, `outputSchema`, `covers` and `completion.when`
|
|
138
|
+
to a planner the V2 validator would reject), and the permanently-zero
|
|
139
|
+
`fanout: { total, ok, failed }` counter that `dashboard.js` still put on every
|
|
140
|
+
row and rendered behind an unreachable branch. `outputSchema`, `itemsFrom` and
|
|
141
|
+
`stepTemplate` now appear nowhere in `src/`. The `skill/references/operations.md`
|
|
142
|
+
"Adversarial verification" section described the removed `{ok, concerns,
|
|
143
|
+
summary}` verify verdict; it now documents the `bullswarm.workflow.evidence.v2`
|
|
144
|
+
envelope the kernel actually enforces. `AGENTS.md` doctrine item 5 pointed at
|
|
145
|
+
the deleted `runtime.js` and now points at `v2-dispatch.js`.
|
|
146
|
+
|
|
147
|
+
- Historical authored-graph runs stay readable, read-only, and nothing tries to
|
|
148
|
+
drive them. A run directory whose `state.json` lacks
|
|
149
|
+
`schemaVersion: 'bullswarm.workflow.state.v2'` is a legacy run: `workflow runs`
|
|
150
|
+
(with `--all` and `--json`) lists it as one row — short id, run id, name or
|
|
151
|
+
goal, status, age — marked `legacy`, reading only those five fields and never
|
|
152
|
+
throwing on a missing one, and the workflow home lists the same row. Every
|
|
153
|
+
driving command — `runs show`, `runs result`, `watch`, `cancel`, `resume`,
|
|
154
|
+
`steer`, `action show`, `tui <runId>` — prints exactly one line, `legacy
|
|
155
|
+
authored-graph run <shortId>: its executor was removed in 0.27.0; files remain
|
|
156
|
+
under <dir>`, and exits 2 before touching anything — including on the older
|
|
157
|
+
directories that hold only a `workflow.json` and never had a `state.json` at
|
|
158
|
+
all; the workflow home shows
|
|
159
|
+
that same line in its detail pane. `events <runId>` still replays the durable
|
|
160
|
+
JSONL and `runs delete <id> --yes` still removes the directory. Historical
|
|
161
|
+
directories are never modified. The stale-owner reconciliation that used to
|
|
162
|
+
run before every dispatch is gone with the V1 liveness model it served.
|
|
163
|
+
|
|
164
|
+
- Tests: 818 -> 661. Six V1-only files were deleted
|
|
165
|
+
(`workflow-adaptive`, `workflow-gaps`, `workflow-draft`, `workflow-schema`,
|
|
166
|
+
`workflow-validate`, `workflow-run` — 151 tests); `workflow-runs`,
|
|
167
|
+
`workflow-watch`, `assignments`, `workflow-interruption`, `workflow-steering`
|
|
168
|
+
and `workflow-goal` were rewritten onto the V2 kernel keeping every assertion
|
|
169
|
+
about shared behaviour; `workflow-dashboard` went from 48 cases to 35 — 21
|
|
170
|
+
V1-only cases removed and 2 added with the rewrite, then 6 re-added against V2
|
|
171
|
+
fixtures for the rendering behaviours the removal had dropped (blocked-action
|
|
172
|
+
naming, one segment header per phase or dependency level, the mid-segment
|
|
173
|
+
continuation header, parallel levels grouped in declared order, the narrow
|
|
174
|
+
layout, and auto-follow); and a new `workflow-legacy-runs` (11 tests) proves
|
|
175
|
+
the legacy contract against a synthetic legacy `state.json`.
|
|
176
|
+
`tests/manual-dynamic-real.mjs` (330 lines), a
|
|
177
|
+
manual real-provider matrix for authored `run`/`decide` graphs, went with the
|
|
178
|
+
executor; it was never part of the suite count. No test dispatches a real
|
|
179
|
+
provider.
|
|
180
|
+
|
|
3
181
|
## 0.26.0 — two entry points, kinds and rungs
|
|
4
182
|
|
|
5
183
|
- There are now exactly two ways to start work, and `bullswarm delegate` is
|
package/GOAL.md
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
# bullswarm — Goal Statement
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
> Historical (2026-08-21): accurate when written; see CHANGELOG for what changed since.
|
|
4
|
+
|
|
5
|
+
**Status:** HISTORICAL PROTOTYPE CHARTER · **Owner:** cowcow02 · **Created:** 2026-08-21
|
|
4
6
|
|
|
5
7
|
## One sentence
|
|
6
8
|
|
package/README.md
CHANGED
|
@@ -30,8 +30,8 @@ without initializing state or executing the command:
|
|
|
30
30
|
|
|
31
31
|
```bash
|
|
32
32
|
bullswarm --help
|
|
33
|
-
bullswarm workflow
|
|
34
|
-
bullswarm workflow
|
|
33
|
+
bullswarm workflow goal --help
|
|
34
|
+
bullswarm workflow runs show --help
|
|
35
35
|
```
|
|
36
36
|
|
|
37
37
|
`workflow goal` launches a durable background runner, prints operating commands,
|
|
@@ -88,7 +88,7 @@ re-delegating and creating recursive swarms.
|
|
|
88
88
|
## Quick start
|
|
89
89
|
|
|
90
90
|
```bash
|
|
91
|
-
bullswarm # first run: interactive setup wizard
|
|
91
|
+
bullswarm # first run: interactive setup wizard on a TTY; non-TTY callers self-initialize
|
|
92
92
|
bullswarm setup # interactive provider/model configuration
|
|
93
93
|
bullswarm setup --wizard # broader worktree + integration questionnaire
|
|
94
94
|
bullswarm pools # meter state, pace position, quarantine status
|
|
@@ -98,7 +98,7 @@ bullswarm run --lane analyze --add-dir ~/some-repo --prompt "Inspect the parser"
|
|
|
98
98
|
bullswarm workflow plan contract "Fix the failing tests and verify the change" --cwd ~/some-repo --json # you are the planner
|
|
99
99
|
bullswarm workflow goal "Fix the failing tests and verify the change" --cwd ~/some-repo --program plan.json
|
|
100
100
|
bullswarm workflow goal "Fix the failing tests and verify the change" --cwd ~/some-repo --orchestrator auto # dispatch a planner agent
|
|
101
|
-
bullswarm health # re-judge saved outputs; catch gate failures
|
|
101
|
+
bullswarm health --json # re-judge saved outputs; catch gate failures (omit --json for a human summary)
|
|
102
102
|
```
|
|
103
103
|
|
|
104
104
|
## Verbs
|
|
@@ -112,19 +112,11 @@ bullswarm health # re-judge saved outputs; catch gate failures
|
|
|
112
112
|
| `pools` | Show each pool's meter state, pace position, 5-hour utilization (`5h=<n>%`, flagged `NEAR-5H-LIMIT` at or above 75%), quarantine status |
|
|
113
113
|
| `strategy` | Interactive provider/model control center with live high/medium/low route previews and an agent-facing JSON API |
|
|
114
114
|
| `doctor` | Machine-readable readiness report; self-heals on first call |
|
|
115
|
-
| `workflow` |
|
|
116
|
-
| `runs` | Short alias for `workflow runs`, including list, show, result,
|
|
115
|
+
| `workflow` | Plan, execute, observe, and operate one autonomous workflow engine and its live instances. |
|
|
116
|
+
| `runs` | Short alias for `workflow runs`, including list, show, result, and delete operations. |
|
|
117
117
|
| `version` / `--version` | Print the installed Bullswarm version. |
|
|
118
118
|
| `release` | Run the guarded local version-bump, commit, and tag workflow used before CI publishes to npm. |
|
|
119
119
|
|
|
120
|
-
Discover and validate workflow definitions without executing them:
|
|
121
|
-
|
|
122
|
-
```bash
|
|
123
|
-
bullswarm workflow list
|
|
124
|
-
bullswarm workflow list --json
|
|
125
|
-
bullswarm workflow validate workflows/my-workflow.json
|
|
126
|
-
```
|
|
127
|
-
|
|
128
120
|
`workflow goal --request <path>` and `--run-id <id>` are internal detached-runner
|
|
129
121
|
resume plumbing. Normal callers should provide a goal or use `--resume <shortId|runId>`.
|
|
130
122
|
|
|
@@ -141,7 +133,7 @@ bullswarm strategy routes --json # compact effective choices
|
|
|
141
133
|
bullswarm strategy set-provider codex off --yes
|
|
142
134
|
bullswarm strategy set-model opencode2 kaihk/gpt-5.6-luna \
|
|
143
135
|
--tiers high,medium,low --yes
|
|
144
|
-
bullswarm strategy configure --file strategy.json --yes # atomic agent-
|
|
136
|
+
bullswarm strategy configure --file strategy.json --yes # atomic agent-created policy
|
|
145
137
|
bullswarm strategy reset-tier low --yes # restore one tier to automatic
|
|
146
138
|
bullswarm strategy set-reasoning --tier high --level xhigh --yes
|
|
147
139
|
bullswarm strategy set-reasoning --tier high --level high --pool codex --yes
|
|
@@ -202,8 +194,8 @@ any routing change. Press `Y` to apply them or `N` to retain the current policy.
|
|
|
202
194
|
The analysis selects at most one default model for each provider and effort
|
|
203
195
|
tier. It uses OpenRouter's agentic, coding, and intelligence indices as quality
|
|
204
196
|
signals and API-equivalent pricing as the budget signal. A repository-owned
|
|
205
|
-
|
|
206
|
-
|
|
197
|
+
benchmark refresh job refreshes two public assets on the rolling
|
|
198
|
+
`benchmark-data-latest` GitHub Release:
|
|
207
199
|
`openrouter-benchmarks.json` from the authenticated OpenRouter APIs, and
|
|
208
200
|
`epoch-benchmarks.json` from Epoch AI's CC BY 4.0 benchmark export, which is
|
|
209
201
|
what `strategy rungs` reads for per-model-per-reasoning-level evidence.
|
|
@@ -211,9 +203,12 @@ Installed CLIs download only those public files and never need or receive an
|
|
|
211
203
|
OpenRouter key.
|
|
212
204
|
The sources are OpenRouter's [benchmarks API](https://openrouter.ai/docs/api/api-reference/benchmarks/list-benchmarks)
|
|
213
205
|
and [models API](https://openrouter.ai/docs/api/api-reference/models/list-all-models-and-their-properties).
|
|
214
|
-
The CLI caches
|
|
215
|
-
|
|
216
|
-
|
|
206
|
+
The CLI caches each datapack under `~/.bullswarm/cache/`. OpenRouter is
|
|
207
|
+
cache-or-network only: a fresh cache is used as-is, otherwise the rolling
|
|
208
|
+
release is fetched, and a cache miss with no network yields an empty catalog
|
|
209
|
+
plus connector metadata — there is no bundled `data/openrouter-benchmarks.json`.
|
|
210
|
+
Epoch keeps `data/epoch-benchmarks.json` as a bundled last-resort, so a missing
|
|
211
|
+
network never blocks setup when that file exists.
|
|
217
212
|
|
|
218
213
|
The TUI lists every detected provider/account separately so its toggle matches
|
|
219
214
|
its own quota meter. Enter drills into that provider's detected models. In the
|
|
@@ -321,7 +316,7 @@ phase/step/attempt tree.
|
|
|
321
316
|
|
|
322
317
|
## One-command autonomous goals
|
|
323
318
|
|
|
324
|
-
For normal multi-step work, give Bullswarm the goal and the program you
|
|
319
|
+
For normal multi-step work, give Bullswarm the goal and the program you author
|
|
325
320
|
for it—not a JSON graph of phases:
|
|
326
321
|
|
|
327
322
|
```bash
|
|
@@ -351,7 +346,9 @@ caller asks for it by name.
|
|
|
351
346
|
planning targets. They encourage the Workflow Planner to consolidate optional
|
|
352
347
|
work, but the kernel never stops or rejects essential work merely because a
|
|
353
348
|
target was reached. `--concurrency` still bounds simultaneous dispatches so
|
|
354
|
-
the scheduler can batch a wider useful program safely.
|
|
349
|
+
the scheduler can batch a wider useful program safely. There is no default
|
|
350
|
+
wall-clock timeout: fresh semantic/transport heartbeats allow a useful worker
|
|
351
|
+
to continue, while silence is inspected rather than blindly killed.
|
|
355
352
|
|
|
356
353
|
The caller authors a complete program, or explicitly asks for a dispatched
|
|
357
354
|
planner. The kernel validates the graph, executes it, and returns every action
|
|
@@ -433,9 +430,7 @@ The planner does not author phases or declare success/failure. The kernel
|
|
|
433
430
|
derives stable presentation stages for the TUI and computes the final V2
|
|
434
431
|
result. Saved V2 runs retain their original execution and workspace policy on
|
|
435
432
|
resume. V1 autonomous run directories are not migrated or resumed;
|
|
436
|
-
explicitly naming one fails before any paid dispatch.
|
|
437
|
-
drafts remain a separate authored-graph feature with their existing step
|
|
438
|
-
types.
|
|
433
|
+
explicitly naming one fails before any paid dispatch.
|
|
439
434
|
|
|
440
435
|
The detached response includes a short ID and exact observation commands:
|
|
441
436
|
|
|
@@ -512,12 +507,6 @@ per provider — the first as the primary `opencode2` pool, each additional one
|
|
|
512
507
|
as its own `opencode2:<id>` pool — which is what the `--worker-model
|
|
513
508
|
kaihk/gpt-5.6-luna` example above locks onto.
|
|
514
509
|
|
|
515
|
-
`--max-agents`, `--max-actions`, and `--max-expansion-rounds` are soft V2
|
|
516
|
-
planning targets: they guide the planner toward a small program but do not
|
|
517
|
-
hard-stop useful work. `--concurrency` is the actual bound on simultaneous
|
|
518
|
-
dependency-ready dispatches. There is no default wall-clock timeout: fresh
|
|
519
|
-
semantic/transport heartbeats allow a useful worker to continue, while silence
|
|
520
|
-
is inspected rather than blindly killed.
|
|
521
510
|
New goal runs use the shared workspace regardless of the older setup
|
|
522
511
|
worktree-isolation preference. Add `--isolation` to `workflow goal` when you
|
|
523
512
|
explicitly want per-worker worktrees and strict ownership before integration.
|
|
@@ -570,33 +559,6 @@ runs still support their original gap boundaries and `--exhausted` submissions.
|
|
|
570
559
|
the caller plans against a real survey; scout units are advisory for a caller
|
|
571
560
|
planner.
|
|
572
561
|
|
|
573
|
-
Use an explicit draft when the graph itself is a durable contract and should
|
|
574
|
-
not be planner-defined. `bullswarm workflow draft ...` lets you assemble it one
|
|
575
|
-
mutation at a time. No upfront JSON required. Drafts persist under
|
|
576
|
-
`~/.bullswarm/drafts/<name>/` and become first-class workflows
|
|
577
|
-
(discoverable, runnable by name) the moment they exist.
|
|
578
|
-
|
|
579
|
-
```bash
|
|
580
|
-
bullswarm workflow draft create audit-code \
|
|
581
|
-
--description "Audit the source code" --input targetDir=.
|
|
582
|
-
bullswarm workflow draft phase add audit-code discover
|
|
583
|
-
bullswarm workflow draft phase add audit-code review
|
|
584
|
-
bullswarm workflow draft step add audit-code discover list-files \
|
|
585
|
-
--type run --lane chore --prompt "List every .js file in src/" \
|
|
586
|
-
--add-dir '{{inputs.targetDir}}'
|
|
587
|
-
bullswarm workflow draft step add audit-code review per-file \
|
|
588
|
-
--type fanout --items-from 'outputs.list-files.outFile' \
|
|
589
|
-
--lane analyze --concurrency 2 \
|
|
590
|
-
--step-template '{"lane":"analyze","addDir":"{{inputs.targetDir}}","prompt":"Review {{item}}"}'
|
|
591
|
-
bullswarm workflow draft show audit-code # inspect the JSON
|
|
592
|
-
bullswarm workflow draft run audit-code # execute it
|
|
593
|
-
bullswarm workflow draft export audit-code workflows/audit-code.json # promote to file
|
|
594
|
-
```
|
|
595
|
-
|
|
596
|
-
`step add` re-validates after every mutation; partial drafts (zero
|
|
597
|
-
phases, etc.) are treated as building, not invalid. `set` and
|
|
598
|
-
`step set` patch fields in place. `delete` requires `--yes`.
|
|
599
|
-
|
|
600
562
|
## Operating on workflow runs
|
|
601
563
|
|
|
602
564
|
Every run gets a 6-character shortId (Crockford-style alphabet,
|
|
@@ -606,7 +568,7 @@ no `0/1/i/l/o`). The full `wf-...` runId stays the durable handle.
|
|
|
606
568
|
bullswarm workflow runs # ongoing only (default)
|
|
607
569
|
bullswarm workflow runs --all # ongoing + historical
|
|
608
570
|
bullswarm workflow runs --historical # only historical
|
|
609
|
-
bullswarm workflow runs --name audit-code # filter by
|
|
571
|
+
bullswarm workflow runs --name audit-code # filter by exact goal/name
|
|
610
572
|
bullswarm workflow runs --all --since 7d # initiated in the last 7 days
|
|
611
573
|
bullswarm workflow runs --historical --since yesterday --until today
|
|
612
574
|
bullswarm workflow runs --all --from 2026-08-20 --to 2026-08-27
|
|
@@ -615,11 +577,13 @@ bullswarm workflow runs show <shortId> # state + report + summary
|
|
|
615
577
|
bullswarm workflow runs result <shortId> --json # stable result for the calling agent
|
|
616
578
|
bullswarm runs show <shortId> # top-level shorthand
|
|
617
579
|
bullswarm workflow runs delete <shortId> --yes # remove the run dir
|
|
618
|
-
|
|
619
|
-
# Resume by shortId — runs the same logic as the full runId
|
|
620
|
-
bullswarm workflow run audit-code --resume <shortId>
|
|
621
580
|
```
|
|
622
581
|
|
|
582
|
+
Legacy authored-graph runs are listed as read-only rows marked `legacy`. Every
|
|
583
|
+
driving command prints `legacy authored-graph run <shortId>: its executor was
|
|
584
|
+
removed in 0.27.0; files remain under <dir>` and exits 2; historical directories
|
|
585
|
+
are untouched.
|
|
586
|
+
|
|
623
587
|
Run-history time filters always compare when the workflow was initiated
|
|
624
588
|
(`startedAt`), never when it finished. `--since` is inclusive and `--until` is
|
|
625
589
|
exclusive; `--started-after`/`--from` and `--started-before`/`--to` are aliases.
|
|
@@ -635,8 +599,7 @@ usage, and verification qualification. New programs include `executionMode:
|
|
|
635
599
|
"program"` and a `workspace` report with `changedFiles`, `baselineChangedFiles`,
|
|
636
600
|
and warnings. This is a Git status inventory, not attribution to individual
|
|
637
601
|
workers; files stay in the target directory. A completed program may be
|
|
638
|
-
unverified and contain negative evidence.
|
|
639
|
-
result envelope. `runs show` remains the low-level debugging surface.
|
|
602
|
+
unverified and contain negative evidence. `runs show` remains the low-level debugging surface.
|
|
640
603
|
Goal launch output includes an `instructions` handoff with four named paths:
|
|
641
604
|
`agentInspect` for a machine-readable snapshot, `watch` for low-noise progress,
|
|
642
605
|
`humanTui` for the interactive browser, and `result` for the terminal delivery.
|
|
@@ -661,10 +624,9 @@ periodic heartbeat is off unless you pass `--heartbeat <seconds>`;
|
|
|
661
624
|
`--stall-after <seconds>` (default 300) reports a running agent that has
|
|
662
625
|
gone silent. Pass `--classic` to force the older heartbeat-based watcher
|
|
663
626
|
instead (the transition-on-change snapshot stream plus a periodic
|
|
664
|
-
heartbeat, every 60 seconds unless `--heartbeat <seconds>` is given)
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
mode. `--next` prints no attach line and
|
|
627
|
+
heartbeat, every 60 seconds unless `--heartbeat <seconds>` is given).
|
|
628
|
+
`--classic` applies only to V2 runs and cannot combine with `--next`, which
|
|
629
|
+
exists only for event mode. `--next` prints no attach line and
|
|
668
630
|
exits after the first notable event so a background terminal can wake the
|
|
669
631
|
caller; relaunch until the outcome line reports a pause or a terminal
|
|
670
632
|
status (exit 0 while the run continues or delivered, 1 when it ended
|
|
@@ -684,9 +646,9 @@ prints). `--jsonl` emits one JSON object per notable event with a stable
|
|
|
684
646
|
`interrupted`, and with `--verbose` `action.started`, `attempt.retrying`,
|
|
685
647
|
`steering.delivered`); in that mode the relaunch line is not printed and
|
|
686
648
|
every object instead carries the `sequence` it was emitted at, which is the
|
|
687
|
-
value to pass as `--after`. `--once` still prints one current snapshot.
|
|
688
|
-
(
|
|
689
|
-
the
|
|
649
|
+
value to pass as `--after`. `--once` still prints one current snapshot. A legacy
|
|
650
|
+
(pre-0.27.0 authored-graph) run cannot be watched at all: the watcher prints
|
|
651
|
+
the legacy line and exits 2 before it polls anything.
|
|
690
652
|
|
|
691
653
|
```bash
|
|
692
654
|
bullswarm workflow watch <shortId>
|
|
@@ -736,16 +698,14 @@ bullswarm workflow tui --json --all # ongoing + historical runs
|
|
|
736
698
|
bullswarm workflow tui --json <shortId> # inspect one run
|
|
737
699
|
bullswarm workflow tui --json --cancel <id> # request cooperative stop
|
|
738
700
|
bullswarm workflow capabilities --json # pools, lanes, models, meters, limits
|
|
739
|
-
bullswarm workflow inspect <file-or-name> # workflow shape and semantics
|
|
740
701
|
bullswarm workflow events --json <id> --after 20
|
|
741
702
|
bullswarm workflow steer <id> --message "Prefer focused tests before another full suite"
|
|
742
703
|
bullswarm workflow action show --json <id> <actionId>
|
|
743
|
-
bullswarm workflow approval approve --json <id> # then resume the run
|
|
744
704
|
```
|
|
745
705
|
|
|
746
706
|
Cancellation stops active delegates and commits `cancelled`. V2 goal workflows
|
|
747
707
|
keep the operator request in a separate durable file so kernel progress cannot
|
|
748
|
-
overwrite it
|
|
708
|
+
overwrite it.
|
|
749
709
|
`SIGTERM` and `SIGINT` stop delegate process groups and commit a resumable
|
|
750
710
|
`interrupted` state. A V2 resume holds an exclusive kernel lease, stops recorded
|
|
751
711
|
surviving delegates from the previous kernel, and finishes post-processing from
|
|
@@ -817,71 +777,6 @@ runtime value and uses its matching connector rate metadata for the attempt's
|
|
|
817
777
|
cost estimate. Unknown or provider-hidden model identity remains explicitly
|
|
818
778
|
unknown.
|
|
819
779
|
|
|
820
|
-
### Authored adaptive graphs
|
|
821
|
-
|
|
822
|
-
This is part of the separately authored fixed-graph engine, not the autonomous
|
|
823
|
-
V2 `workflow goal` path. A graph may add an explicit `decide` step, advisory
|
|
824
|
-
resource targets, and structural expansion limits:
|
|
825
|
-
|
|
826
|
-
```json
|
|
827
|
-
{
|
|
828
|
-
"mode": "adaptive",
|
|
829
|
-
"settings": {
|
|
830
|
-
"maxAgents": 12,
|
|
831
|
-
"maxExpansionRounds": 3,
|
|
832
|
-
"maxActions": 20,
|
|
833
|
-
"maxItemsPerExpansion": 8,
|
|
834
|
-
"maxWorkflowSeconds": 1800
|
|
835
|
-
},
|
|
836
|
-
"phases": [{
|
|
837
|
-
"name": "review",
|
|
838
|
-
"steps": [
|
|
839
|
-
{ "id": "initial", "type": "run", "prompt": "Inspect the code." },
|
|
840
|
-
{
|
|
841
|
-
"id": "planner",
|
|
842
|
-
"type": "decide",
|
|
843
|
-
"requiresCapabilities": ["workflow-planning", "strong-analysis"],
|
|
844
|
-
"prompt": "Judge sufficiency and propose only bounded missing work."
|
|
845
|
-
}
|
|
846
|
-
]
|
|
847
|
-
}]
|
|
848
|
-
}
|
|
849
|
-
```
|
|
850
|
-
|
|
851
|
-
For an authored adaptive graph, `maxAgents`, `maxWorkflowSeconds`, and
|
|
852
|
-
`maxExpansionRounds` are advisory inputs to its decide step. Approaching them
|
|
853
|
-
strongly biases that step toward
|
|
854
|
-
consolidating existing artifacts and returning the best useful outcome;
|
|
855
|
-
crossing them is recorded but never stops a worker, skips verification, or
|
|
856
|
-
fails a run. `maxActions` and `maxItemsPerExpansion` remain hard structural
|
|
857
|
-
safeguards. Reaching one returns a qualified outcome when useful work exists,
|
|
858
|
-
rather than discarding the run as a blanket failure. Delegates have no
|
|
859
|
-
implicit wall-clock timeout; set a step's `timeoutSec` (or direct-run
|
|
860
|
-
`--timeout`) only when an operator explicitly wants a hard termination timer.
|
|
861
|
-
|
|
862
|
-
Within this authored-graph engine, `complete` remains strictly verified. A
|
|
863
|
-
decide-step `stop` still
|
|
864
|
-
delivers a completed outcome when a useful delivery exists: unresolved
|
|
865
|
-
verification concerns and the stopping reason ride along as `outcome.concerns`
|
|
866
|
-
and `outcome.reason`, attributes of that completed outcome rather than a
|
|
867
|
-
separate terminal status. `stop` produces `blocked` only when no useful
|
|
868
|
-
delivery exists. `workflow runs result` treats the completed outcome as ready
|
|
869
|
-
while reporting `verified:false`. The status value `completed_with_concerns`
|
|
870
|
-
still appears on some runs — including legacy ones recorded before this
|
|
871
|
-
framing — and every consumer reads it exactly like `completed`: a delivered
|
|
872
|
-
result with concerns to review, never a failure.
|
|
873
|
-
|
|
874
|
-
The planner returns versioned JSON. It may propose `needs_more_work` with
|
|
875
|
-
bounded `run`, inline-`fanout`, or `verify` actions. The deterministic runtime
|
|
876
|
-
validates IDs, dependencies, operation types, capabilities, and budgets before
|
|
877
|
-
appending anything. It executes ready actions, observes their durable results,
|
|
878
|
-
and calls the planner again. `events.jsonl`, `state.json`, the TUI, and JSON
|
|
879
|
-
inspection expose the same plan, actions, attempts, decisions, budgets, and
|
|
880
|
-
artifacts. See `workflows/adaptive-code-review.json` for a complete example.
|
|
881
|
-
Planner actions cannot set `pool`, `model`, `addDir`, or `taskFile`. If those need to be
|
|
882
|
-
fixed by the initiator, declare them under the `decide` step's `actionDefaults`;
|
|
883
|
-
otherwise eligible capable pools are ranked by live quota surplus.
|
|
884
|
-
|
|
885
780
|
## The verdict
|
|
886
781
|
|
|
887
782
|
```json
|
package/data/README.md
CHANGED
|
@@ -7,9 +7,14 @@ secrets and are never written here or shipped with the CLI.
|
|
|
7
7
|
Both datapacks are published as replaceable assets on the
|
|
8
8
|
`benchmark-data-latest` GitHub Release by
|
|
9
9
|
`.github/workflows/refresh-benchmarks.yml`. Installed CLIs try
|
|
10
|
-
`~/.bullswarm/cache/` first, then
|
|
11
|
-
|
|
12
|
-
|
|
10
|
+
`~/.bullswarm/cache/` first, then that release URL.
|
|
11
|
+
|
|
12
|
+
OpenRouter is cache-or-network only: there is no bundled
|
|
13
|
+
`data/openrouter-benchmarks.json`. A cache miss with no network yields an
|
|
14
|
+
empty catalog (and connector metadata), and never blocks setup.
|
|
15
|
+
|
|
16
|
+
Epoch keeps `data/epoch-benchmarks.json` as a bundled last-resort, so a
|
|
17
|
+
missing network never blocks setup when that file exists.
|
|
13
18
|
|
|
14
19
|
## `openrouter-benchmarks.json`
|
|
15
20
|
|