0.40.0
Cut on 2026-10-16. Status: beta. The first part of the 0.40 line makes the pieces a second machine depends on work
as one system. Work records name their repository relative to the home directory, so a record means the same thing on
every host. cox setup --store shared offers a Postgres run store with Garage traces, and cox setup store switch
moves between that and files. A chair session attaches to a live loop instead of taking the chair, and project cards
link to store rows by key. The towpath view of the chair's background agents follows in 0.41.0, and a dedicated home
directory for the install in 0.42.0.
Records that mean the same on every machine. A work record carries a home-relative repository path. The harness
expands a tilde-prefixed repository and decompose writes the tilde form, the remote fetch and launch map it for each
host, and route lint and the stranded reader expand it. cox route paths lists the stored absolute paths that can be
rewritten and --apply rewrites them.
A store shared between machines. cox setup --store shared writes a shared-store.yaml profile that keeps run
records in Postgres and traces in an S3-compatible object store such as Garage, and cox setup store switch copies the
existing store and traces to the other backend in either direction, leaving the source in place. The setup doctor
checks the chosen store. The switch reads the store copier's real per-table output, so a completed copy is not
reported as unverified.
Cards that follow the store. A project card links to a work item by key, and the card's status follows the store.
cox route file refuses a title that duplicates an open issue unless --force is given, and board items become intake
candidates. An initiative can build on one card branch and open one pull request per repository.
The model clamp. A chair records its model, the launcher passes it to the harness, and the runner lowers a seat that would run above it. The clamp is off by default.
coxswain-cartridges
- The
decompose-initiativeskill writes the tilde form of a repository path, states the contract fixture path rule, and tells builds to use neutral names in test data so the clean check passes (cartridges #209, cartridges #214, cartridges #217). - The Claude Code provider profile pins the
buildrole to the standard tier (cartridges #210).
coxswain-dash
- The queue priority is signed, so a negative row parses and draws instead of failing the feed (dash #129).
- The repository's clean-check script passes
ruff check ., so a build in this repository stays inside its own surfaces (dash #130).
coxswain-graphs
- The harness expands a tilde-prefixed repository, and decompose writes the tilde form (graphs #778).
- A decompose retries a refused contract task once with the refusal (graphs #781).
- Work items gain
issue_number,project_item_idandparent_itemcolumns with a backfill, and an epic run writescard_branchon a fresh launch (graphs #783, graphs #786, graphs #789). - The runner clamps a resolved tier to the chair's model, named in the environment value
COXSWAIN_CHAIR_MODEL, and logschair_ceiling; roles listed inchair_ceiling_exemptkeep their tier (graphs #790, graphs #791, graphs #792). - The OpenAI-compatible runner gains a tool-loop adapter, so it builds through the vendor-neutral tool loop, and a spent thread fails before any request (graphs #793).
coxswain-tools
- Work records carry a home-relative repository path: a helper, the remote fetch and launch maps, route lint, the stranded reader, the chair readers, the command edges and the chair exec all expand it (tools #1640, tools #1646, tools #1650, tools #1651, tools #1652, tools #1656, tools #1661, tools #1672).
cox route pathslists stored absolute repository paths and--applyrewrites them to the home-relative form (tools #1662, tools #1677).cox setup --storeoffers the shared store (Postgres run records, S3-compatible traces) andcox setup store switchmoves between files and shared: the choice core and profile writer, the setup flag, doctor rows, and a switch verb in each direction (tools #1659, tools #1667, tools #1671, tools #1674, tools #1684). The switch engine reads the copier's real output (tools #1687).cox chair attachsays whether a live loop holds the lease and exits 0 if so, and barecoxattaches to a live loop and leaves the lease alone (tools #1670, tools #1678, tools #1689).- A chair record carries an optional model, set by
cox route chair take --model, and the launcher exports it asCOXSWAIN_CHAIR_MODEL(tools #1683, tools #1685, tools #1690). - Project cards link to work items by key: a codec and a contract fixture, route pull dedupes, route sync sets a card's
status from the store,
cox route filerefuses a duplicate title, and board items become intake candidates (tools #1655, tools #1680, tools #1686, tools #1692, tools #1693). - An initiative builds on one card branch and opens one pull request per repository (tools #1653, tools #1657, tools #1666, tools #1676).
cox upgrademoves crew, dash and the umbrella checkout along with the other components, andcox versionswords why components can look drifted and when a pin cannot be met (tools #1645, tools #1660, tools #1663).- The workspace pull carries the loop's own unstaged files through with
--autostash, so a live chair's pull no longer fails every tick (tools #1682). - Route lint resolves an initiative id, and route sync reads the active GitHub login and accepts an issue number a land wrote quoted (tools #1654, tools #1679, tools #1691).
- The lane-host login check sees a token-authenticated host, and the Claude auth status parse tolerates login-shell startup noise (tools #1648, tools #1668, tools #1675).
- The PR footer drops the coxswain version, and the setup doctor's model-freshness check no longer crashes (tools #1641, tools #1658).
Known gaps
The store switch is tested against an injected copier and the copier's real output shapes, but it has not been run against a production store. The towpath activity fixture (tools #1694) is groundwork for 0.41.0 and has no reader yet.
Components
coxswain-cartridges, coxswain-dash, coxswain-graphs and coxswain-tools change. coxswain-crew is unchanged since v0.38.0 and stays pinned there.
Upgrading from 0.39.1. Nothing to migrate for most installs. The model clamp does nothing by default: it is on
only when the chair takes the lease with --model, and each lane host's provider profile needs chair_ceiling_exempt
(for example the judge roles validate_phase, arbitrate and review_adversary) before you turn it on, because a
lane host reads its own profile. To move an existing install to a shared store, run cox setup store switch shared;
cox setup store switch files moves back. cox route paths lists stored absolute repository paths and --apply
rewrites them. The Claude Code provider profile now pins the build role to the standard tier.