Skip to content

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_tasks returns only tasks in state ready whose needs are done; todo, blocked, approved and in_progress are held (cartridges #173).

coxswain-graphs

  • The chair_actions table (migration 0007) and store_cli record-action (graphs #573); the hosts table (migration 0008) and store_cli host upsert|beat|set-state|list (graphs #581).
  • store_copy upserts 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 ready for a task that waits on its needs (graphs #571).
  • python -m harness.store_backfill_traces prune deletes archived trace JSONL whose Parquet file re-verifies per call, with --dry-run and --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 approve and decline (tools #904); cox steward draft (tools #908); the drafts count in cox chair run and the list in cox route status (tools #915).
  • cox chair service --install|--status (tools #913). A takeover carries until; 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's hosts table (tools #919).
  • Parquet traces on an S3-compatible server are read through the profile's object_store block, and the doctor names the endpoint (tools #911).
  • Fixes found on the way: take --steal retakes this session's own stale store lease (tools #882); an intake file that an initiative names in its intake field is decomposed or landed, not queued (tools #880); the schema tests no longer depend on whether harness imports (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_items become 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_branches removes the previous run's phase worktrees before a relaunch (tools #950).
  • Toward loop housekeeping: the plan rule that emits one housekeeping action 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 --help under 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.