0.19.0
Cut on 2026-09-26. coxswain-graphs and coxswain-tools are tagged v0.19.0. coxswain-cartridges is unchanged
and stays at v0.18.0, and coxswain-crew stays pinned at v0.12.0. coxswain-tools is published to PyPI from its
tag. Status: beta. This release carries two headlines.
Any machine can land (opt-in). Set work_state: store in the provider profile on every machine, and the shared
store becomes the source of truth for task state. The harness reads a task's state from the store, where the row wins
over its ticket file. It writes a state move to the store first, as a compare-and-set, then repairs the file.
cox runs land on any machine checks that the task is approved in the store and holds a land:<task> lease around
the merge. It marks the task done with a compare-and-set, so a second machine's land of the same task stops before it
merges. The ticket files become a cache that python -m harness.store_cli regenerate-states rebuilds. cox runs
fetch brings only branches when the store already holds the lane's records. The default stays work_state: files,
and nothing changes without the key. Verified end to end with a Docker container as the lane machine: it landed its
own lane, and the chair's land of the same task stopped with "another machine landed it". The Several machines docs
page explains the setup (coxswain #142).
Storage beyond one machine, local-first. Traces and the Iceberg lake reach a self-hosted S3-compatible server,
such as Garage, through an object_store block in the provider profile. The block holds the endpoint, the region, the
names of the environment variables with the key and secret, and path-style addressing. Credentials come only from the
environment. Any other URL scheme comes from a plugin in the new coxswain.storage entry-point group, so core names no
cloud vendor. The docs cover a plain shared path first, then object storage (coxswain #140).
Upgrading from 0.18.0. Nothing to change. work_state and object_store are optional. Recorded costs are now
each call's own spend: a resumed call used to record the session's running total. python -m harness.store_backfill
--recost-resumed corrects the history (the reference workspace's recorded harness spend fell by $502, about 15%).
coxswain-graphs
- Work state in the store: the
work_statekey, the authority rules, compare-and-setset_state,store_cli set-state --expect(exit 3 on a mismatch), the driver reading the store, store-first state moves, andstore_cli regenerate-states(graphs #510, #512, #518, #522, #524, #530). s3://traces use the provider profile'sobject_storeblock (graphs #514). Other schemes resolve through thecoxswain.storageentry-point group (graphs #520).- A resumed call records its own cost, and
store_backfill --recost-resumedcorrects recorded history (graphs #516, #526). - The handoff sees the commands the builder's session could run, and discharges a demand for any other command
instead of sending the build back (graphs #508, #528). Builds may also run
uv run pytest,uv run ruffandgit -Con their own scratch checkout (graphs #534). - Scope no longer proposes
item_createfor a ticket that is already a work item, so no model call is spent on a write that changes nothing (graphs #532). - Phase validation runs only once a phase is finished. A partial phase records
goal_met: falsewithout a model call (graphs #538). - Every handoff and review round is kept in the task record's
fix_loop.rounds(graphs #540). - Under
work_state: store, a store-first move writes the ticket's state line in code, so the file and the store agree (graphs #536).
coxswain-tools
- Under
work_state: store: the mode key, the store CLI's--expect, the store's task state, the land rules and lease, the land wired to the store, fetch with branches only, and the docket's state from the store (tools #764, #766, #768, #774, #778, #780, #792, #794, #796). A renewed land lease is read as held (tools #804). The chair lands a remote lane from the store's record when no record file came home (tools #808). A task another machine already landed is reported as such before any fetch is asked for (tools #810). - The Iceberg lake uses the provider profile's
object_storeblock (tools #772). cox runs fetchrecords a run as fetched only after its branches arrive (tools #760), andcox route launch --on --dry-runprints the rsync and ssh it would run (tools #762).cox runs detailreads a remote lane's liveness from its lease (tools #770).cox stats chairprices the chair's own session: the right session variable, the catalog beside the provider profile, list-shaped catalogs, and each message counted once (tools #782, #790).
Groundwork for 0.20.0 (in the tags, not yet wired)
- The autonomous chair: tick facts and actions, the land, fill and recover rules, the tick composer, the action
executor, the facts edge (a live run is never retried or relaunched), the status line and the tick loop (tools #776,
#784, #786, #788, #798, #800, #802, #806, #812). The
cox chair runcommand is not wired yet.
Components
coxswain-graphs carries work state in the store, object storage, the storage plugin group, true call costs and the
handoff fixes. coxswain-tools carries the store-backed land and the chair's cost report. The umbrella carries the
docs. coxswain-cartridges and coxswain-crew are unchanged.