bullswarm 0.28.7 → 0.29.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (78) hide show
  1. package/AGENTS.md +17 -9
  2. package/CHANGELOG.md +178 -20
  3. package/README.md +120 -898
  4. package/data/README.md +1 -1
  5. package/data/openrouter-benchmarks.json +12437 -11779
  6. package/docs/_config.yml +7 -0
  7. package/docs/audits/2026-09-09-codebase-audit.md +6 -6
  8. package/docs/dynamic-workflow-handoff.md +3 -3
  9. package/docs/dynamic-workflow-qa.md +1 -1
  10. package/docs/dynamic-workflow-v2-execution-plan.md +7 -7
  11. package/docs/experiments/2026-08-29-dogfood-bullswarm-builds-bullswarm.md +13 -13
  12. package/docs/experiments/2026-08-31-v2-component-probes.md +7 -7
  13. package/docs/guide/dashboard.md +192 -0
  14. package/docs/guide/doctrine.md +63 -0
  15. package/docs/guide/entry-points.md +71 -0
  16. package/docs/guide/getting-started.md +52 -0
  17. package/docs/guide/operations.md +132 -0
  18. package/docs/guide/providers.md +227 -0
  19. package/docs/guide/repository-operations.md +15 -0
  20. package/docs/guide/routing.md +168 -0
  21. package/docs/guide/strategy.md +171 -0
  22. package/docs/guide/workflows.md +312 -0
  23. package/docs/handoff-2026-09-13-custom-provider-config.md +49 -0
  24. package/docs/index.md +53 -0
  25. package/docs/planner-prompt-audit-2026-08-29.md +1 -1
  26. package/package.json +3 -2
  27. package/providers/contrib/README.md +32 -0
  28. package/{connectors/command-code.json → providers/contrib/command-code/connector.json} +4 -1
  29. package/{src/meters/command-code.js → providers/contrib/command-code/provider.mjs} +27 -16
  30. package/{connectors/opencode2.json → providers/contrib/opencode2/connector.json} +4 -3
  31. package/providers/contrib/opencode2/provider.mjs +7 -0
  32. package/skill/SKILL.md +75 -8
  33. package/skill/references/operations.md +101 -7
  34. package/skill/references/providers.md +97 -0
  35. package/src/cli.js +37 -9
  36. package/src/help.js +254 -20
  37. package/src/lib/auth-signatures.js +79 -0
  38. package/src/lib/cli-flags.js +14 -1
  39. package/src/lib/config.js +54 -28
  40. package/src/lib/providers.js +353 -0
  41. package/src/lib/state.js +47 -0
  42. package/src/lib/strategy.js +5 -0
  43. package/src/lib/update.js +285 -0
  44. package/src/lib/watch.js +49 -0
  45. package/src/meters/framework.js +84 -5
  46. package/src/meters/registry.js +50 -56
  47. package/src/provider-cli.js +780 -0
  48. package/src/provider-kit.js +146 -0
  49. package/src/providers/_schema.json +181 -0
  50. package/src/providers/claude-code/provider.mjs +372 -0
  51. package/{connectors/codex.json → src/providers/codex/connector.json} +3 -1
  52. package/src/{meters/codex.js → providers/codex/provider.mjs} +18 -9
  53. package/{connectors/echo.json → src/providers/echo/connector.json} +1 -1
  54. package/src/{meters/grok.js → providers/grok/provider.mjs} +23 -14
  55. package/src/setup.js +129 -40
  56. package/src/strategy-cli.js +57 -28
  57. package/src/workflow/cli.js +264 -11
  58. package/src/workflow/dashboard.js +2 -2
  59. package/src/workflow/execution-policy.js +11 -0
  60. package/src/workflow/ledger.js +22 -0
  61. package/src/workflow/runs-cli.js +2 -1
  62. package/src/workflow/v2-dispatch.js +40 -14
  63. package/src/workflow/v2-outcome.js +5 -3
  64. package/src/workflow/v2-planner.js +16 -5
  65. package/src/workflow/v2-presentation.js +53 -1
  66. package/src/workflow/v2-revision.js +362 -0
  67. package/src/workflow/v2-runtime.js +374 -30
  68. package/src/workflow/v2-scheduler.js +3 -1
  69. package/src/workflow/v2-state.js +133 -10
  70. package/src/workflow/watch-cli.js +56 -0
  71. package/connectors/_schema.json +0 -96
  72. package/src/lib/claude-accounts.js +0 -202
  73. package/src/lib/opencode-kaihk.js +0 -177
  74. package/src/meters/claude.js +0 -135
  75. package/src/meters/kaihk.js +0 -97
  76. /package/{connectors/claude-code.json → src/providers/claude-code/connector.json} +0 -0
  77. /package/{connectors → src/providers/echo}/echo-worker.mjs +0 -0
  78. /package/{connectors/grok.json → src/providers/grok/connector.json} +0 -0
package/AGENTS.md CHANGED
@@ -14,7 +14,9 @@ content. Published as `bullswarm` on npm.
14
14
  2. Pace by meter surplus = elapsed% (from provider resets_at) − used%.
15
15
  Weekly/monthly windows pace; 5h windows are burst gates only (M1–M5 in
16
16
  `src/meters/framework.js`).
17
- 3. Connector quirks live in `connectors/*.json`, never in core logic.
17
+ 3. Provider quirks live in the provider's directory (`src/providers/<name>/`,
18
+ `providers/contrib/<name>/`, or `~/.bullswarm/providers/<name>/`), never in
19
+ core logic (see `docs/guide/providers.md`).
18
20
  4. Quarantine always auto-releases; recursion depth is core-owned via env
19
21
  (`BULLSWARM_DEPTH`).
20
22
  5. Workflow dispatches must honor the same guarantees as single runs:
@@ -61,7 +63,8 @@ author (`bullswarm workflow plan contract` returns the schema). There is no
61
63
  classifier or preview step. The skill is published alongside the package and
62
64
  is the canonical reference for the CLI surface.
63
65
 
64
- - Zero runtime dependencies. Node >= 18. Tests must never require network:
66
+ - Zero runtime dependencies. Node >= 22.12 (providers load synchronously
67
+ through `require` of ES modules). Tests must never require network:
65
68
  prime `~/.bullswarm/meters/*.json` caches with fresh timestamps if needed.
66
69
  - Every verb must work non-interactively (no TTY). The interactive wizard is
67
70
  a human convenience, never a requirement.
@@ -70,14 +73,19 @@ is the canonical reference for the CLI surface.
70
73
  `git push --tags`
71
74
  — CI publishes through npm trusted publishing (OIDC), no tokens.
72
75
 
73
- ## Adding a connector
76
+ ## Adding a provider
74
77
 
75
- Copy an existing file in `connectors/`, set: bin name, configDirs for
76
- discovery, spawn argv template (`{taskFile}` `{cwd}` `{bullswarmDir}`
77
- substitutions), authSignatures (output strings meaning auth/throttle
78
- failure), outputExtraction strategy, meter type, costRank, lanes. Add a
79
- meter reader in `src/meters/` only if the provider exposes a usage API
80
- declared meters are the fallback, never the goal.
78
+ A provider is a directory holding `connector.json` (a pool template checked
79
+ against `src/providers/_schema.json`) and/or `provider.mjs`. First-class
80
+ providers live in `src/providers/<name>/`, contrib providers in
81
+ `providers/contrib/<name>/` (enabled per machine through
82
+ `~/.bullswarm/providers.json`), and a user's own in
83
+ `~/.bullswarm/providers/<name>/`. Start from
84
+ `bullswarm provider scaffold <name> [--from <template>]`, then
85
+ `bullswarm provider validate` and `bullswarm provider probe <pool>`. Write a
86
+ `readUsage` export only if the vendor exposes a usage API — declared meters
87
+ are the fallback, never the goal. The contract is `docs/guide/providers.md`;
88
+ the authoring method is `skill/references/providers.md`.
81
89
 
82
90
  ## Releasing
83
91
 
package/CHANGELOG.md CHANGED
@@ -1,5 +1,163 @@
1
1
  # bullswarm changelog
2
2
 
3
+ ## 0.29.0 — steer a running workflow, providers become directories, a declared reset date
4
+
5
+ - workflow: the plan of a caller-planned program run can be changed at any
6
+ time. `bullswarm workflow plan export <id>` writes the live plan as an
7
+ editable revision document, and `bullswarm workflow plan revise <id>
8
+ --program plan.json` replaces it: the kernel matches actions by id and
9
+ applies the difference within about a second while agents keep running. A
10
+ new id is added; an unchanged action keeps its result and its running agent;
11
+ a changed action is stopped if running and starts over with the new
12
+ definition; an id in `rerun` discards its result and runs again; a missing id
13
+ is removed (stopped, never run, reported as `removed` and not counted against
14
+ the result); and every step downstream of a changed or rerun step runs again.
15
+ Evidence from a removed or rerun check stops counting until judged again.
16
+ Revisions carry `baseRevision`, so a revision written against an outdated
17
+ export is rejected instead of silently undoing another change, and an
18
+ invalid revision changes nothing. Revising a finished run reopens it and
19
+ archives the earlier result as `result-before-revision-<n>.json`.
20
+ - workflow: `bullswarm workflow pause <id>` stops new work while running agents
21
+ finish (`--now` stops them too and requeues their steps). The kernel exits
22
+ with `outcome: paused`; revisions apply while paused, and `workflow resume`
23
+ is the only way to continue.
24
+ - workflow: steering a caller-planned program run no longer halts it at the
25
+ next boundary. Watchers print `steering received`, the export lists the
26
+ pending messages, and a revision delivers them; only a run about to finish
27
+ with steering still unread pauses for the caller.
28
+ - watch: new lines for `plan revised`, `plan revision rejected`, pause
29
+ requested/lifted, run reopened, steering received, and steps stopped by a
30
+ revision or a pause.
31
+ - skill: SKILL.md gains "Steer a running workflow" and treats every watch
32
+ wake-up as a point to decide whether the plan still fits; operations.md
33
+ documents revision semantics, pause and resume, and steering.
34
+
35
+ - providers: every coding-agent CLI is now a provider directory holding
36
+ `connector.json`, `provider.mjs`, or both, loaded by one synchronous loader
37
+ (`src/lib/providers.js`) from three tiers. First-class (`src/providers/`)
38
+ always loads and holds claude-code, codex, grok and echo. Contrib
39
+ (`providers/contrib/`) ships in the package but loads only where
40
+ `~/.bullswarm/providers.json` lists it, and holds command-code and the
41
+ generic opencode2 connector. Local (`~/.bullswarm/providers/`) is the
42
+ operator's own and never appears in this repository. A module exports at most
43
+ `name`, `displayName`, `connectors(ctx)`, `readUsage(pool, ctx)` and
44
+ `doctor(ctx)`; everything else stays the connector JSON four CLIs already
45
+ ran through. Echo ships JSON-only and grok keeps its OAuth-refreshing meter
46
+ as real code, so both paths stay exercised.
47
+ - providers: `bullswarm provider list|enable|disable|validate|scaffold|probe`.
48
+ `probe` spawns one pool through the dispatcher's own runner with a one-word
49
+ task and then reads its meter once, which is the only evidence that a new
50
+ provider's model flag, event parsing and meter all actually work.
51
+ - core: the per-vendor branching is gone. The meter registry resolves a pool's
52
+ reader through its owning provider instead of a name-prefix map, connector
53
+ loading is one call into the loader, setup discovery and the strategy labels
54
+ come from provider entries, and both hard-coded connector expanders are
55
+ deleted. `credentialGroup` is the honest name for `upstreamGroup`, which is
56
+ still read.
57
+ - requires Node >= 22.12: the loader reads `provider.mjs` through
58
+ `require(esm)` so `loadConnectors` and `buildPools` stay synchronous for
59
+ their twenty-odd call sites.
60
+ - providers: built-in support for one specific reseller was removed entirely.
61
+ It is expressible as a local provider with no repository changes at all,
62
+ which was the point of the tiers.
63
+ - setup: `BULLSWARM_NO_PACKAGED_PROVIDERS=1` forces the packaged tiers off, for
64
+ tests that spawn the real CLI against a fixture home and assert an exact pool
65
+ list. Never set it in production.
66
+ - workflow: evidence actions are routed like any other action. They used to be
67
+ steered away from the pools that did the work, which bought little
68
+ independence (the judging model is chosen by tier, not by pool) and overrode
69
+ pacing. The `avoidPools` dispatch option is gone.
70
+ - codex: the connector runs `codex exec -s danger-full-access`. Codex sandboxes
71
+ writes to its workspace, so a workflow evidence action could do the work and
72
+ still fail with EPERM writing its candidate file into the run's state
73
+ directory under the bullswarm home.
74
+ - command-code: the connector passes `--max-turns 10000`. command-code's print
75
+ mode stops after 100 turns by default and exits 8 mid-task, which bullswarm
76
+ could only report as a non-zero exit and retry from scratch on another pool.
77
+
78
+ - routing: an upstream auth failure reported inside a provider's event stream
79
+ is now the `auth` failure kind with a quarantine hint, and it benches every
80
+ pool that shares the same upstream credential. On 2026-09-11 the pooled Codex
81
+ OAuth account behind `https://relay.example` was invalidated at 12:24 UTC and
82
+ answered every request with
83
+ `{"error":{"message":"Encountered invalidated oauth token for user, failing
84
+ request","type":"authentication_error","code":"auth_unavailable"}}` (401) or
85
+ `auth_unavailable: no auth available (providers=codex, model=gpt-5.6-luna; …)`
86
+ (503); non-GPT models on the same host answered `No available channel for
87
+ model <name> under group default`. `src/lib/watch.js` turned any stream
88
+ `error` event into a bare `provider` verdict before the auth gate ran, so no
89
+ pool was ever benched: a failed action's retry walked
90
+ `opencode2:relay-3` → `opencode2:relay-2` → `opencode2` — three names for the
91
+ one dead credential — and runs m4xiva and ytdsii ended `partial` with their
92
+ integrate/verify actions blocked (failures at 12:24, 12:25, 12:52, 12:53,
93
+ 12:54; last good dispatch 11:22). Four upstream phrases now ship as
94
+ `DEFAULT_AUTH_SIGNATURES` (`src/lib/auth-signatures.js`), matched only on a
95
+ stream that already declared a failure and only on an error-shaped line or
96
+ the raw JSON error event itself, so an agent that merely reads auth code is
97
+ still never quarantined. Connectors may declare `upstreamGroup`;
98
+ `src/lib/opencode-relay.js` sets `relay:<host>` on every expanded Relay pool,
99
+ and an auth quarantine now spreads to that group on one shared 10-minute
100
+ deadline in both dispatch paths. Claude account pools get no group — separate
101
+ seats are separate credentials — and a `quota` quarantine never spreads,
102
+ because a sibling's own window still has work in it.
103
+
104
+ - cli: `bullswarm update [--check] [--json]` upgrades the installation in
105
+ place — the verb a teammate reached for and found missing (2026-09-11). It
106
+ reads the latest version from the npm registry, tells the install shape
107
+ from the running package's real path rather than from `which` or `npm root
108
+ -g` (which can name a different Node install), and acts accordingly: a
109
+ global install gets `npm install -g bullswarm@<latest> --prefix <its own
110
+ prefix>`; a source checkout, including a global `npm link` into one, gets
111
+ `git pull --ff-only` and is refused while it has local changes; anything
112
+ else prints the manual command and exits 1. Success is verified by
113
+ re-reading package.json on disk, never by npm's exit code, and a shell
114
+ whose `bullswarm` resolves elsewhere is called out. `--check` compares
115
+ without changing anything.
116
+ - routing: the reasoning level now reaches every model a Relay pool can run,
117
+ not only `gpt-5.6-luna`. opencode forwards `--variant <level>` only when its
118
+ config declares that variant for that exact model, and the config
119
+ `src/lib/opencode-relay.js` injects declared the five levels for luna alone,
120
+ so moving a tier onto `<id>/gpt-5.6-sol` (2026-09-12, when luna had no
121
+ upstream channel left but sol did) would have sent a `--variant medium` that
122
+ opencode silently dropped while `strategy rungs` kept reporting medium.
123
+ Discovery now records each provider's model list from opencode.json and the
124
+ variants are declared on all of them; a provider that lists none keeps the
125
+ luna default.
126
+ - meters: a Relay pool's used% is read against its own declared plan total
127
+ (`strategy set-subscription <pool> --included-usd <n>`) before the host-wide
128
+ `RELAY_PLAN_USD` and the $50 default. The wallets differ — relay-4 is a $20
129
+ newcomer plan — and one shared number would have shown a $10 spend on it as
130
+ 20% used.
131
+ - meters: a pool whose provider reports usage but no reset date can be paced
132
+ from a reset the operator declares —
133
+ `bullswarm strategy set-subscription <pool> --resets-at <iso|unknown>`.
134
+ The Relay token API stopped returning `expires_at` for the `1` and `Moham`
135
+ wallets on 2026-09-03 (the fleetlens log holds 28 dated snapshots between
136
+ 2026-08-31 and 2026-09-03, then only nulls), so `opencode2` and
137
+ `opencode2:relay-3` printed `unmetered` at 73.8% and 10.7% of their $50
138
+ wallets and ranked as neutral. With a declared reset the used% stays the
139
+ provider's, elapsed% runs to the declared date, the date rolls forward one
140
+ calendar month (or week) at a time once it passes, and `bullswarm pools`
141
+ labels the row `[live declared-reset]`; `pools --json` and
142
+ `strategy show` carry `resetSource` (`provider` | `declared`). A window
143
+ the provider does date is never overridden. Doctrine M2 in
144
+ `src/meters/framework.js` and the guide's rule 2 record the operator path.
145
+
146
+ ## 0.28.8 — a README for visitors and a documentation site
147
+
148
+ - docs: README rewritten for external visitors landing on the GitHub page —
149
+ pitch, why it exists, install, quick start, how routing picks a pool, and
150
+ what a run gives back — with the detailed reference material moved to a
151
+ GitHub Pages site under `docs/`: `guide/entry-points`, `guide/doctrine`,
152
+ `guide/getting-started`, `guide/strategy`, `guide/workflows`,
153
+ `guide/operations`, `guide/dashboard`, `guide/repository-operations`, and
154
+ `guide/routing`. Terms a newcomer would trip on (pool, lane, kernel,
155
+ envelope, rung) are defined on first use; the 5-hour gate is documented as
156
+ clock-relative. The site needs the repository owner to enable Pages
157
+ (Settings → Pages → deploy from branch `main`, folder `/docs`) before
158
+ `https://cowcow02.github.io/bullswarm/` serves it; until then the same pages
159
+ are readable directly under `docs/guide/` in the repository.
160
+
3
161
  ## 0.28.7 — pools about to reset spend their leftover first
4
162
 
5
163
  - routing: quota that expires sooner is worth more. A pool whose pacing window
@@ -197,7 +355,7 @@
197
355
  `elapsedPct`, `pace` and `paceResetsAt` off `reading.windows`, so cache,
198
356
  stale and live readings are paced identically; the pool view carries
199
357
  `pacingWindow`. The 5h gate is untouched: `command-code` still gates on 5h
200
- `25.2%`. Connectors already declared this — `command-code` and the kaihk
358
+ `25.2%`. Connectors already declared this — `command-code` and the relay
201
359
  pools `monthly`, `claude-code`/`codex`/`grok` `weekly`; nothing read it for
202
360
  pacing before.
203
361
  - The spend model follows the pacing window. `WINDOW_KEYS` (framework.js)
@@ -357,7 +515,7 @@
357
515
  no planner has to reason about. No shipped connector's routing changes
358
516
  either way — all six declare all three lanes.
359
517
 
360
- - The three KaiHK-backed OpenCode pools can now run gpt-5.6-luna at a
518
+ - The three Relay-backed OpenCode pools can now run gpt-5.6-luna at a
361
519
  chosen reasoning level. `connectors/opencode2.json` declares
362
520
  `reasoning: { flag: "--variant", levels: [low, medium, high, xhigh,
363
521
  max], defaults: { high: high, medium: medium, low: low } }` — the same
@@ -365,25 +523,25 @@
365
523
  backend — so rungs for these pools stop printing `— (unsupported)`.
366
524
  opencode only forwards a `--variant` its config declares for that
367
525
  model, so the flag alone would be silently dropped;
368
- `expandOpenCodeKaihkConnectors` (`src/lib/opencode-kaihk.js`) therefore
526
+ `expandOpenCodeRelayConnectors` (`src/lib/opencode-relay.js`) therefore
369
527
  sets `env.OPENCODE_CONFIG_CONTENT` on the base pool and on every clone
370
528
  to the variants for that pool's OWN provider id, via the new pure
371
- helper `kaihkVariantsConfig(providerId, model = KAIHK_OPENCODE_MODEL)`:
372
- `{"provider":{"kaihk-2":{"models":{"gpt-5.6-luna":{"variants":{"low":{"reasoningEffort":"low"},"medium":{"reasoningEffort":"medium"},"high":{"reasoningEffort":"high"},"xhigh":{"reasoningEffort":"xhigh"},"max":{"reasoningEffort":"max"}}}}}}}`.
529
+ helper `relayVariantsConfig(providerId, model = RELAY_OPENCODE_MODEL)`:
530
+ `{"provider":{"relay-2":{"models":{"gpt-5.6-luna":{"variants":{"low":{"reasoningEffort":"low"},"medium":{"reasoningEffort":"medium"},"high":{"reasoningEffort":"high"},"xhigh":{"reasoningEffort":"xhigh"},"max":{"reasoningEffort":"max"}}}}}}}`.
373
531
  opencode merges that JSON string over the config file, so the API key
374
532
  and everything else in `~/.config/opencode/opencode.json` stays in
375
533
  force. An `OPENCODE_CONFIG_CONTENT` the operator set by hand in the
376
534
  installed connector is never overwritten, on the base pool or on the
377
- clones. A medium/max dispatch on `opencode2:kaihk-2` composes
378
- `opencode run --auto --model kaihk-2/gpt-5.6-luna <taskFile> --variant
535
+ clones. A medium/max dispatch on `opencode2:relay-2` composes
536
+ `opencode run --auto --model relay-2/gpt-5.6-luna <taskFile> --variant
379
537
  max --format json`; a level already pinned in the template is replaced,
380
538
  not duplicated. Per pool:
381
- `bullswarm strategy set-rung opencode2 medium --model kaihk/gpt-5.6-luna --reasoning max`,
382
- `bullswarm strategy set-rung opencode2:kaihk-2 medium --model kaihk-2/gpt-5.6-luna --reasoning max`,
383
- `bullswarm strategy set-rung opencode2:kaihk-3 medium --model kaihk-3/gpt-5.6-luna --reasoning max`.
539
+ `bullswarm strategy set-rung opencode2 medium --model relay/gpt-5.6-luna --reasoning max`,
540
+ `bullswarm strategy set-rung opencode2:relay-2 medium --model relay-2/gpt-5.6-luna --reasoning max`,
541
+ `bullswarm strategy set-rung opencode2:relay-3 medium --model relay-3/gpt-5.6-luna --reasoning max`.
384
542
  Existing installations pick the block up through
385
543
  `upgradeConnectorMetadata` (`src/setup.js`), which backfills a missing
386
- `reasoning` block and leaves a customised one alone. Non-KaiHK opencode
544
+ `reasoning` block and leaves a customised one alone. Non-Relay opencode
387
545
  installations get no injected variants, so `--variant` is a no-op there
388
546
  rather than an error — recorded in the connector's
389
547
  `$comment-reasoning`.
@@ -1124,11 +1282,11 @@ behaviour, or pass the program you authored with `--program <file.json>`.
1124
1282
  automatic LLM classification.
1125
1283
 
1126
1284
  - OpenCode connector portability: `connectors/opencode2.json` no longer
1127
- hardcodes `--model kaihk/gpt-5.6-luna` in `spawn.cmd`. A plain OpenCode
1128
- install with no KaiHK provider configured now dispatches with OpenCode's
1129
- own default model instead of failing to resolve a KaiHK-only model.
1130
- `src/lib/opencode-kaihk.js` still injects the explicit
1131
- `--model <providerId>/gpt-5.6-luna` for each discovered KaiHK provider, so
1285
+ hardcodes `--model relay/gpt-5.6-luna` in `spawn.cmd`. A plain OpenCode
1286
+ install with no Relay provider configured now dispatches with OpenCode's
1287
+ own default model instead of failing to resolve a Relay-only model.
1288
+ `src/lib/opencode-relay.js` still injects the explicit
1289
+ `--model <providerId>/gpt-5.6-luna` for each discovered Relay provider, so
1132
1290
  the primary `opencode2` pool and any extra `opencode2:<id>` pools keep
1133
1291
  dispatching with their pinned per-provider model exactly as before.
1134
1292
 
@@ -1163,7 +1321,7 @@ behaviour, or pass the program you authored with `--program <file.json>`.
1163
1321
  - Historical workflow design documents now identify themselves as dated
1164
1322
  implementation records and list the current `verify`, `decide`, and
1165
1323
  `outputSchema` surfaces instead of presenting resolved gaps as current.
1166
- - Extra KaiHK providers in `~/.config/opencode/opencode.json` (`kaihk-2`, …)
1324
+ - Extra Relay providers in `~/.config/opencode/opencode.json` (`relay-2`, …)
1167
1325
  become `opencode2:<id>` pools, spawned with `--model <id>/gpt-5.6-luna`.
1168
1326
  Spend is read from `GET /api/usage/token` plus
1169
1327
  `/v1/dashboard/billing/usage` (USD = `total_usage / 100`). The HTML wallet
@@ -1288,7 +1446,7 @@ behaviour, or pass the program you authored with `--program <file.json>`.
1288
1446
  spent a 97 s correction turn on it).
1289
1447
  - Goal-4 rerun on `7724da1` (`8ebi8a`, rule 7 + PR #5): 42 min 03 s, three
1290
1448
  planner turns (775 s, 31 %), parallelism 1.34, 23 dispatches (20 on
1291
- `kaihk/gpt-5.6-luna`), three repair rounds each rejected on re-verify for
1449
+ `relay/gpt-5.6-luna`), three repair rounds each rejected on re-verify for
1292
1450
  reasons the prompts caused, tail of five actions blocked, recovery program
1293
1451
  auto-completed, 315/315, existing tests +179/−1. Goal-4 line:
1294
1452
  44 → 72 → 37 → 25 → 36 → 42 min.
@@ -1324,7 +1482,7 @@ behaviour, or pass the program you authored with `--program <file.json>`.
1324
1482
  re-verify rejected the mandated extension, and a planner turn recovered.
1325
1483
  - Goal-4 rerun on v0.16.0 (`euh622`): 36 min 00 s, four stage phases in the TUI
1326
1484
  (implement, tests, verify, report) instead of sixteen one-action rows, 22/24
1327
- dispatches on `kaihk/gpt-5.6-luna`, auto-completed, 319/319; two planner
1485
+ dispatches on `relay/gpt-5.6-luna`, auto-completed, 319/319; two planner
1328
1486
  turns because of the false rejection above (planner turn 2: "an append-only
1329
1487
  rule that the goal itself makes unsatisfiable").
1330
1488
 
@@ -1345,7 +1503,7 @@ behaviour, or pass the program you authored with `--program <file.json>`.
1345
1503
  wrote sixteen one-action phases — no scheduling cost (phases never gate;
1346
1504
  `dependsOn` does), but a TUI phase list carrying no information.
1347
1505
  - Goal-4 rerun on this release (`bizp4s`, runtime `9af8fdf`, workers on
1348
- `kaihk/gpt-5.6-luna`): **25 min 13 s** (attempt 3: 44 min; 0.15.0: 72 min;
1506
+ `relay/gpt-5.6-luna`): **25 min 13 s** (attempt 3: 44 min; 0.15.0: 72 min;
1349
1507
  audited contract alone: 37 min), one planner turn (247 s, 16 % of wall),
1350
1508
  parallelism 1.77, 3 repair rounds each fixing a real defect, 0 schema
1351
1509
  retries, 0 corrections, auto-completed, 319/319, existing tests +174/−0.