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.
Files changed (77) hide show
  1. package/AGENTS.md +12 -18
  2. package/CHANGELOG.md +178 -0
  3. package/GOAL.md +3 -1
  4. package/README.md +34 -139
  5. package/data/README.md +8 -3
  6. package/docs/audits/2026-09-09-codebase-audit.md +1718 -0
  7. package/docs/claude-dynamic-workflow-mechanics.md +9 -5
  8. package/docs/design/2026-09-06-caller-first-cli.md +2 -0
  9. package/docs/dynamic-workflow-qa.md +2 -0
  10. package/docs/dynamic-workflow-v2-execution-plan.md +2 -0
  11. package/docs/experiments/2026-08-28-trending-ai-autonomy.md +2 -0
  12. package/docs/experiments/2026-08-29-dogfood-bullswarm-builds-bullswarm.md +2 -0
  13. package/docs/experiments/2026-08-29-ultracode-vs-bullswarm.md +2 -0
  14. package/docs/experiments/2026-08-31-v2-component-probes.md +2 -0
  15. package/docs/experiments/2026-09-06-caller-planner-evaluation.md +2 -0
  16. package/docs/integration-audit-2026-08-31.md +2 -0
  17. package/docs/planner-prompt-audit-2026-08-29.md +2 -0
  18. package/docs/workflow-agent-usability-audit-2026-08-27.md +2 -0
  19. package/docs/workflow-design.md +5 -1
  20. package/fixtures/failures/late-failure.json +6 -0
  21. package/fixtures/failures/structured-error.json +6 -0
  22. package/package.json +1 -2
  23. package/skill/SKILL.md +7 -2
  24. package/skill/references/operations.md +25 -14
  25. package/src/cli.js +149 -53
  26. package/src/help.js +73 -425
  27. package/src/lib/agent-events.js +0 -56
  28. package/src/lib/assignments.js +1 -1
  29. package/src/lib/cli-flags.js +212 -0
  30. package/src/lib/config.js +24 -9
  31. package/src/lib/epoch-benchmarks.js +5 -6
  32. package/src/{workflow → lib}/fsjson.js +5 -0
  33. package/src/lib/num.js +31 -0
  34. package/src/lib/openrouter-models.js +17 -13
  35. package/src/lib/quota.js +28 -25
  36. package/src/lib/route.js +46 -28
  37. package/src/lib/spend.js +12 -9
  38. package/src/lib/state.js +98 -3
  39. package/src/lib/strategy.js +71 -10
  40. package/src/lib/usage.js +0 -50
  41. package/src/lib/verify.js +39 -11
  42. package/src/lib/watch.js +93 -20
  43. package/src/meters/framework.js +4 -7
  44. package/src/setup.js +76 -55
  45. package/src/strategy-cli.js +232 -164
  46. package/src/strategy-dashboard.js +35 -28
  47. package/src/workflow/cli.js +98 -297
  48. package/src/workflow/dashboard.js +158 -969
  49. package/src/workflow/evidence-output.js +0 -21
  50. package/src/workflow/goal.js +0 -36
  51. package/src/workflow/ownership.js +0 -2
  52. package/src/workflow/runs-cli.js +155 -146
  53. package/src/workflow/short-id.js +101 -128
  54. package/src/workflow/steering.js +6 -8
  55. package/src/workflow/v2-cancellation.js +6 -1
  56. package/src/workflow/v2-dispatch.js +30 -14
  57. package/src/workflow/v2-runtime.js +2 -6
  58. package/src/workflow/v2-scheduler.js +0 -4
  59. package/src/workflow/v2-state.js +0 -4
  60. package/src/workflow/watch-cli.js +91 -135
  61. package/bin/check-output-schema.js +0 -30
  62. package/src/workflow/decision.js +0 -357
  63. package/src/workflow/draft-cli.js +0 -434
  64. package/src/workflow/draft.js +0 -268
  65. package/src/workflow/result.js +0 -239
  66. package/src/workflow/runner.js +0 -1304
  67. package/src/workflow/runtime.js +0 -1902
  68. package/src/workflow/schema.js +0 -81
  69. package/src/workflow/semaphore.js +0 -56
  70. package/src/workflow/template.js +0 -146
  71. package/src/workflow/tui.js +0 -297
  72. package/src/workflow/validate.js +0 -366
  73. package/workflows/adaptive-code-review.json +0 -45
  74. package/workflows/agent-model-comparison.json +0 -49
  75. package/workflows/connector-audit.json +0 -60
  76. package/workflows/smoke-two-step.json +0 -41
  77. 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/runtime.js`).
24
- 6. Adversarial verification is a first-class primitive: a `verify` step
25
- reads a prior outFile and demands a JSON `{ok, concerns, summary}`
26
- verdict before downstream steps can trust the work (R-skeptic).
27
- 7. Workflows can be built incrementally from the shell
28
- (`bullswarm workflow draft create/phase/step/set/...`). Drafts are
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 list # discover workflows
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
- node bin/bullswarm.js workflow validate <file> # dry-run
48
- BULLSWARM_HOME=/tmp/bs node bin/bullswarm.js workflow run <file> # sandboxed run
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
- **Status:** PROTOTYPE · **Owner:** cowcow02 · **Created:** 2026-08-21
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 run --help
34
- bullswarm workflow draft step add --help
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` | Start an autonomous goal, or run / validate / draft / inspect explicit workflows and their live instances. |
116
- | `runs` | Short alias for `workflow runs`, including list, show, result, delete, and cleanup operations. |
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-authored policy
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
- GitHub Actions job (`.github/workflows/refresh-benchmarks.yml`) refreshes two
206
- public assets on the rolling `benchmark-data-latest` GitHub Release:
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 the datapack under `~/.bullswarm/cache/`; network failure falls
215
- back to a stale or bundled datapack, then connector metadata, without blocking
216
- setup.
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 authored
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. Fixed JSON workflows and
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 workflow
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. Fixed authored workflows retain their existing
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
- legacy (non-V2) runs already behave this way and `--classic` is a no-op for
666
- them; `--classic` cannot combine with `--next`, which exists only for event
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. Legacy
688
- (non-V2) runs keep the compact transition-plus-heartbeat stream unchanged,
689
- the same stream `--classic` opts a V2 run into.
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; authored V1 graphs additionally expose a `cancelling` state.
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 the copy bundled in this directory, then
11
- that release URL. A missing network never blocks setup when a bundled file
12
- exists.
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