0.36.0
Cut on 2026-10-07. Status: beta. The operations release, and the start of the feature freeze before 1.0: from
here on only defects, hardening and docs. The store is backed up daily to Garage and a monthly drill proves a restore,
the notifier pushes needs-you events and milestones to a phone, brew install brings towpath along with cox, the
model tiers follow the newest model in each family, and the chair stops relaunching work it cannot build.
Operations. A daily job dumps the store, uploads the dump to the Garage bucket the lake already uses and keeps 14
days; a monthly drill restores the newest dump into a scratch database and compares row counts with the live store.
The notifier's chair wiring is in, so a configured notify: channel (ntfy) receives needs-you events and milestones.
The Forgejo forge is wired: a repository whose origin is on the configured Forgejo host lands through it. The tap step
writes the towpath download into the formula, so the next brew upgrade cox installs towpath and coxtop too
(coxswain #256).
Models. The provider tiers name model families (haiku, sonnet, opus) and the loader resolves each to the
newest catalog row in its family, so a new model needs one catalog row and no tier edit. A refresh lists the vendor's
models and reports one newer than the catalog. The standard tier moved to Sonnet 5.5.
A chair that does not spin. An initiative whose repository has a land in flight is not launched, a land the forge
refuses backs off instead of being re-planned every tick, and an initiative is capped at a few launches an hour, with
one note when a relaunch keeps ending the same way. An epic run reports paused and awaiting_land through its exit
code instead of quarantining, a session limit inside any node pauses the run, and an OAuth refresh race between two
runs on one machine is retried as a harness fault. A dry-run tick takes about 25 s instead of about 108 s.
Upgrading from 0.35.0. Nothing migrates and the store schema is unchanged. Restart the chair loop. An unknown key in
the profile now warns instead of stopping the loop. To arm the backup on the store host, run
ops/store-backup/install.sh from coxswain-tools. If you installed towpath with cargo, the brew copy lands in
Homebrew's bin; keep whichever comes first on your PATH.
coxswain-cartridges
- The tiers resolve the newest model in a family, a refresh reports newer vendor models, and a freshness check names a stale tier (cartridges #189, cartridges #191, cartridges #192, cartridges #193, cartridges #194).
- The standard tier is Sonnet 5.5 (cartridges #186); the local cartridge's tests check carries a 1500 s timeout (cartridges #187).
- An unknown work-item state is read as an opaque state instead of making an initiative unreadable, and a quarantined task may move back to ready (cartridges #188, cartridges #190).
coxswain-dash
- The runs pane's history and queue columns line up under their headers (dash #100, dash #101).
- A feed that dies or stops parsing shows an error instead of freezing the board (dash #103).
- The chair panel says how to focus, close and resize it, and its terminal is sized to the panel (dash #104, dash #105, dash #112).
- A panic restores the terminal, towpath without a terminal exits cleanly, and a failed spawn is a status-line error (dash #106, dash #107, dash #108).
- Clock times follow the current local offset, and a naive timestamp keeps its column (dash #109, dash #110).
- Command results pair with the command that ran them (dash #111).
coxswain-graphs
- An epic run reports paused and awaiting-land through its exit code (graphs #712, graphs #716); a session limit inside any node pauses the run (graphs #723).
- An OAuth refresh collision is a transient harness fault, retried with jitter (graphs #714, graphs #721).
- A timed-out node records its spend and a timed-out check keeps its output (graphs #709, graphs #711).
- A postgresql+psycopg store URL opens and its errors never print the password (graphs #719).
- A ticket whose surfaces are not in its repository is refused before any model call (graphs #725).
coxswain-tools
- The store is backed up daily to Garage and a monthly drill proves a restore (tools #1466, tools #1471, tools #1473).
- The notifier's chair wiring (tools #1460), the Forgejo forge wiring (tools #1465) and the chair's ticket widening (tools #1463).
- An initiative with a land in flight is held, a refused land backs off, and launches are capped per initiative (tools #1469, tools #1478, tools #1479).
- A leftover pr branch with a remote copy, or after main moved, is rebuilt (tools #1462, tools #1470, tools #1472).
- A dry-run tick finishes inside the smoke timeout and reads chair_actions once (tools #1467, tools #1468, tools #1475, tools #1476).
- Same-host launches in one tick start apart (tools #1474); calls on the tick path have timeouts (tools #1483).
- An unknown profile key warns, and the loop keeps its last good profile (tools #1480, tools #1482).
- A decompose refused by the lint counts toward the empty-decompose streak (tools #1477).
- Analytics reports can read a local DuckDB snapshot of the store (tools #1481).
coxswain (umbrella)
- The install proof runs clean on Linux and after an upgrade (coxswain #255).
- The tap step writes the towpath download into the formula (coxswain #256).
- A failed tap step restores its branch, notifies, and can run alone with
--tap-only(coxswain #258, coxswain #260). - A release's wait for checks says why it timed out (coxswain #257, coxswain #259).
- release-check reads a bullet's component from its section heading (coxswain #261).