Skip to content

0.20.0

Cut on 2026-09-26. coxswain-cartridges, coxswain-graphs and coxswain-tools are tagged v0.20.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 itself. cox chair run is the chair's mechanical loop. Each tick (default 60 seconds) it beats the chair lease, reads the 5-hour window and the weekly spend, lands every approved task one repository at a time, relaunches an initiative once its ready tasks' dependencies have landed, retries or rescues a quarantine caused by the harness, fills free lanes up to the team cartridge's policy.dispatch.max_in_flight from the work store first, and prints one status line.

Past the weekly hard stop it lands, but launches nothing. Every action it takes carries the lease epoch, so when an interactive session takes the chair with cox route chair take --steal, the loop stops acting until the chair is released. cox chair run --once --dry-run plans one tick and changes nothing. It never cuts a release, merges a Homebrew tap PR, pushes the workspace, or changes a profile or tier. The Autonomous chair docs page describes it (coxswain #146).

Rescue. A build quarantined for a harness reason that kept its patch no longer needs a person to finish it. The graphs rescue graph re-applies the patch in a fresh worktree, runs the configured checks in the harness itself, and runs the review round. On approve, the task lands as usual. A rescue runs at most once per version of the ticket, and a failed rescue does not count as a build attempt. cox route launch rescue runs it, and cox chair run plans it in place of a rebuild.

Upgrading from 0.19.0. Nothing to change. The chair loop is opt-in: start cox chair run when you want it. Attempts now record the ticket text they were made against, so after a ticket is rewritten the attempt cap counts only attempts on the new text.

coxswain-cartridges

  • record_attempt stamps each attempt with the ticket text's body_sha, and attempts_on_current_body returns the attempts made on the current text (cartridges #170).

coxswain-graphs

  • The rescue graph: which quarantined tasks are eligible, the checks re-run in the harness, a review-only graph, the driver step, the rescue command, and a failed rescue that does not count as a build attempt (graphs #549, #551, #553, #555, #557, #559).
  • The attempt cap counts only attempts made against the ticket's current text (graphs #547). A rescue reads an attempt's cause from the store (graphs #563), and store_cli lease acquire --steal takes a held lease at the next epoch (graphs #565). A rescue verifies the kept patch on the default branch, not on a stale phase branch (graphs #567), and an approved rescue leaves one commit on a branch that cox runs land finds (graphs #569).
  • Decompose prefixes a task id with the initiative id only once (graphs #543), and writes the initiative's title and other scalars as valid YAML (graphs #561).
  • Builds run with SHELL set to bash, so a builder's shell commands behave the same on every machine (graphs #545).

coxswain-tools

  • cox chair run: the command, and its readers for the lease, docket, approved tasks, quarantines, stranded work, attempts, live initiatives, intake, run ids and the action log, wired together and proven complete (tools #816, #820, #822, #824, #826, #828, #830, #832, #834, #836, #838, #840, #842). The lane cap comes from the team cartridge, and the status line shows the 5-hour window (tools #844, #846).
  • Rescue: cox route launch rescue, the rescue action, the kept-patch reader, the quarantine facts, the launch cap and the planner rule (tools #848, #850, #852, #854, #856, #858, #860).
  • The chair loop in use, from the end-to-end gate in a test workspace: a land uses the run that holds the approved record (tools #862), launches name work/<id> from the workspace and the loop starts an initiative that has not begun (tools #864, #866), and a quarantine is an attempt on the ticket's current text with its cause from the store (tools #868).
  • cox route chair take --steal takes the store lease too (tools #871). Every performed action is recorded, the status line names launches, rescues and failures (tools #873), and --dry-run names what each tick would do (tools #875).
  • A failed rescue recorded in the store hands the task to the chair instead of rescuing it again each tick (tools #877).
  • cox runs land stages regenerated files without the exclude pathspec that git 2.55 refuses (tools #814).
  • cox runs fetch reports a lane that another machine already landed as landed elsewhere, instead of failing (tools #818).

Components

coxswain-tools carries the chair loop and the rescue action. coxswain-graphs carries the rescue graph and the attempt cap. coxswain-cartridges carries the ticket-version stamp. The umbrella carries the docs. coxswain-crew is unchanged.