0.22.0
Cut on 2026-09-27. coxswain-tools is tagged v0.22.0. coxswain-cartridges and coxswain-graphs had no changes
and stay pinned at v0.21.0; coxswain-crew stays pinned at v0.12.0. coxswain-tools is published to PyPI from its tag. Status: beta.
This release makes the chair loop steady on its own, and it carries three headlines.
The loop lands what it can and waits for what it must. A phase counts as complete when every task in it is done, approved or dropped, so a phase with several approved tasks lands instead of waiting on itself. The loop relaunches an initiative only after its last run has an exit record, removes the previous run's phase worktrees before a relaunch, and treats a branch clear that finds nothing as done. Dropped work and missing repositories are skipped in the stranded listing. The loop's own lands and launches never claim the chair lease, and a land into a repository another land holds refuses instead of racing it.
Fewer hand merges. Tickets in one phase that share a file are merged into one ticket before lint and launch. When two tasks' changes only add lines at the same spot, the land keeps both sides and lets its checks decide.
Spend counted by the meter's own week. spend.weekly_reset (for example "Sun 04:00 America/New_York") anchors
the weekly window at the meter's reset instead of a rolling seven days. The loop, the launch gate, route context and
usage assess all count the same week, and the status line shows where the week began.
Upgrading from 0.21.0. Nothing to change on one machine. To count the week the way the meter does, add
weekly_reset under spend: in the profile. A fleet can give each lane host its own capacity with
cox host add <name> --ssh <dest> --capacity <n>; the local cap stays the team cartridge's
policy.dispatch.max_in_flight, and it applies per machine.
coxswain-tools
- A phase is complete when every task in it is done, approved or dropped, so approved siblings land (tools cc600e8). The stranded listing uses the land's own approval rule, so unanimous approval counts (tools 83591df).
- The loop relaunches only after an exit record, sends a land that refuses to the chair with its cause, and prunes the previous run's worktrees before a relaunch (tools #972, #983, #1026). The run-exit reader is wired into the loop's facts (tools 3c1a69a), and a branch clear with nothing to delete is done (tools aae95b7).
- Stranded means approved and still live: dropped items and missing repositories are skipped and reported once (tools #966, #977). The stranded rule skips a task whose phase branch is being carried forward, the first piece of one merge to main per phase, which ships whole in 0.23 (tools #1038).
- The loop's lands and launches pass
--no-claim, so a land it starts never takes the chair lease (tools 7e1e6a1, e026358). - One land per repository at a time: a store lease around every land, a busy land is a skip for the loop, and each land's worktree carries its process id (tools #1033, #1041, #1043, #1054).
- Same-phase tickets that share a file are merged before lint and launch (tools #996, #1013, #1015).
- The land resolves add/add cherry-pick conflicts and lets the checks decide (tools #987, #1024).
- One lake sync at a time, through a store lease around every sync (tools #989, #1007).
- The weekly spend window is anchored at
spend.weekly_reset, and the profile's spend block accepts it (tools #999, #1009, #1019, #1021, 64d8b7c). - The loop's facts carry remote-unfetched runs and housekeeping history, the tick passes its clock to the planner, and a guard test fails if any fact is left unwired (tools #1028, #1030, #1036).
- Loop housekeeping: lake sync, trace prune and run clean on a period, recorded as chair actions (tools #960, #962, #964).
- Stale work becomes a draft for a person to approve or decline: the stale rule, its types and the draft rewrite (tools #1045, #1047, #1049).
- Work items in the store, groundwork for the queue of record: the docket, quarantined and stranded readers, the
launch claim, facts from the store,
cox route importand the export (tools #968, #970, #975, #993, #995, #1011);route importprints the store's refusal when a write fails (tools #1052). These callharness.store_queue, which the harness does not provide yet; until it does, the queue reads as unavailable and the loop reads the work-item files, as before. - Reverted: land checks with a private
TMPDIRand pytest--basetemp(tools #985, reverted in 18705d1). Exporting--basetempbreaks tests that start a nested pytest, and the failures it targeted came from two lands of one task sharing a worktree.
coxswain
- The release check walks
cox --helpwith colour off, so Python 3.14's coloured help never reads as drift (coxswain #165).
Components
coxswain-tools carries nearly every change and the umbrella carries the release-check fix. coxswain-graphs,
coxswain-cartridges and coxswain-crew are unchanged.