0.21.0
Cut on 2026-09-27. coxswain-cartridges, coxswain-graphs and coxswain-tools are
tagged v0.21.0. coxswain-crew stays pinned at v0.12.0. coxswain-tools is published to PyPI from its tag.
Status: beta. This release carries two headlines.
The chair runs a fleet. cox chair run fills the local lanes first, then each lane_hosts entry up to the same
cap, launching a remote lane with cox route launch epic --on <host>, and it fetches a remote lane's records and
branches before it lands the lane's approved task. A host whose Claude login has lapsed is refused before any lane
starts, and cox setup doctor --host says so. The loop's weekly spend comes from the store's node_calls, so a loop
on one machine sees the whole account's spend. Every action the loop performs is recorded in the store's
chair_actions table as well as the JSONL file, so any machine on the shared store can see what the loop did.
cox chair service --install writes the user unit that keeps the loop running on a resident machine. A human takeover
carries an expiry (cox route chair take --hours, extend), and the loop takes the chair back when it passes. The
store gains a hosts table for the fleet's machines, written by store_cli host upsert|beat|set-state, and
cox host add|list|drain|activate|beat|doctor|sync manage it; the planner reads capacity from the table when it has
rows.
Drafts. A draft is an initiative whose tasks are todo and whose initiative.md says draft: true and who proposed
it. cox steward draft turns the steward's grounded proposals into drafts and lists the ones it cannot ground.
cox route approve <initiative> moves a draft's tasks to ready; cox route decline drops them with a reason. The
loop never launches a draft; its status line counts them (drafts N) and cox route status lists them with proposer
and age. todo is held everywhere now: ready plus a needs edge is the only gate, and the graphs driver fixtures
say so.
Upgrading from 0.20.0. Nothing to change on one machine. For a fleet: put the S3 key names and the AWS SDK
checksum settings in one env file sourced by the login shell on every machine (the Several machines page has the
lines), run cox host add for each lane host once the table exists, and run cox host sync after a graphs release
lands so no host is behind the store's schema version. Two new migrations (chair_actions, hosts) apply on the
first open.
coxswain-cartridges
ready_tasksreturns only tasks in statereadywhose needs are done;todo,blocked,approvedandin_progressare held (cartridges #173).
coxswain-graphs
- The
chair_actionstable (migration 0007) andstore_cli record-action(graphs #573); thehoststable (migration 0008) andstore_cli host upsert|beat|set-state|list(graphs #581). store_copyupserts the tables whose rows change after insert and reports the rows it refreshed (graphs #577).- An authentication failure in the runner is a harness cause (graphs #575), and a phase whose runner cannot authenticate stops the run after its record instead of quarantining every later task (graphs #579).
- The driver fixtures say
readyfor a task that waits on its needs (graphs #571). python -m harness.store_backfill_traces prunedeletes archived trace JSONL whose Parquet file re-verifies per call, with--dry-runand--older-than(graphs #584, #586); it resolves each source to the call id the repack wrote, so a run with UUID call ids prunes instead of being kept (graphs #589).
coxswain-tools
- The chair loop fills lane hosts, local first (tools #886, #888), fetches a remote lane before it lands it (tools #896), reads its weekly spend from the store (tools #902), and records every action in the store too (tools #900).
- A lane host's login is checked by the doctor and before a launch (tools #884).
- Drafts: the draft state rewrites, the draft renderer, the draft list, the drafts count on the status line (tools
#890, #892, #894, #898);
cox route approveanddecline(tools #904);cox steward draft(tools #908); the drafts count incox chair runand the list incox route status(tools #915). cox chair service --install|--status(tools #913). A takeover carriesuntil;cox route chair extend; the loop retakes an expired chair (tools #917).cox host add|list|drain|activate|beat|doctor|sync, and the planner's lane hosts from the store'shoststable (tools #919).- Parquet traces on an S3-compatible server are read through the profile's
object_storeblock, and the doctor names the endpoint (tools #911). - Fixes found on the way:
take --stealretakes this session's own stale store lease (tools #882); an intake file that an initiative names in itsintakefield is decomposed or landed, not queued (tools #880); the schema tests no longer depend on whetherharnessimports (tools #910); the loop's beat moves the chair record file too, so status and the home screen see a live loop (tools #927); the chair exec's ids are shell-safe and a failed action reports its tail (tools #925); only queued intake is decomposed (tools #923). - Stranded means approved and still live: the stranded listing and the loop's needs-chair facts skip dropped items and report a missing repository once (tools #936, #938).
- Work items in the store: the store seam and the row codec that let
work_itemsbecome the queue of record (tools #940, #942). - A remote lane's outcome reaches the chair on exit: the plan rule that fetches an unfetched remote run before any relaunch (tools #934), the exec that performs the fetch (tools #952), the status line that names it (tools #954) and the facts reader that finds unfetched remote runs (tools #956).
- Toward the stall fixes: the facts say whether an initiative's newest run has an exit record (tools #948), and
clear_branchesremoves the previous run's phase worktrees before a relaunch (tools #950). - Toward loop housekeeping: the plan rule that emits one
housekeepingaction per period (tools #946) and the step runner core for lake sync, trace prune and run clean (tools #944).
coxswain
- Docs: Lane hosts and Drafts on the Autonomous chair page, the login check and the loop's fetch on Several machines (coxswain #150); a Garage server, the SDK checksum settings and the env file (coxswain #153); duckdb in the dev group so the Superset SQL tests run (coxswain #151).
- The release check's help walk strips argparse colour, so
cox --helpunder Python 3.14 reads the same piped or not (coxswain #158); the Chair dashboard datasets, with SQL that returns naive timestamps so DuckDB needs no pytz (coxswain #160).
Components
coxswain-tools carries the fleet loop, drafts, the service unit and the host commands. coxswain-graphs carries
the two migrations, the store CLI writes and the auth-failure rule. coxswain-cartridges carries the held todo. The
umbrella carries the docs. coxswain-crew is unchanged.