Skip to content

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_state key, the authority rules, compare-and-set set_state, store_cli set-state --expect (exit 3 on a mismatch), the driver reading the store, store-first state moves, and store_cli regenerate-states (graphs #510, #512, #518, #522, #524, #530).
  • s3:// traces use the provider profile's object_store block (graphs #514). Other schemes resolve through the coxswain.storage entry-point group (graphs #520).
  • A resumed call records its own cost, and store_backfill --recost-resumed corrects 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 ruff and git -C on their own scratch checkout (graphs #534).
  • Scope no longer proposes item_create for 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: false without 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_store block (tools #772).
  • cox runs fetch records a run as fetched only after its branches arrive (tools #760), and cox route launch --on --dry-run prints the rsync and ssh it would run (tools #762). cox runs detail reads a remote lane's liveness from its lease (tools #770).
  • cox stats chair prices 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 run command 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.