0.39.0
Cut on 2026-10-13. Status: beta. This release hardens the chair loop after a night of hand-finished lands. A land
that stops records why, a land retries a pull request branch that fell behind main, reuses an empty leftover branch,
and lands a one-task run task by task. Export holds are scoped to their own initiative and measured against this
workspace's own baseline. Route lint checks that a ticket's surfaces exist, and cox route file resolves a bare
repository name. A standby chair pulls the workspace before it takes the lease, the chair paces its lanes against the
weekly meter, and a launch skips a lane host whose checkout environment is stale. In the harness, an epic never marks
a task approved when its work is on no surviving branch, earned-autonomy streaks come from the store, and an intake can
allow a deploy path past the reach lint. The install proof's negative control now installs the real sdist and must
fail at its version check, so a green control shows the checks run (coxswain #293).
Lands that say why they stopped. A stopped phase land records its reason, a squash conflict goes to a rebase, and a green pull request a stopped land left behind is adopted. A land updates a behind branch and retries the merge, and an approved task whose run left no phase record lands task by task instead of being refused every tick.
Holds that block only their own initiative. The export guard lists each held file with its initiative, compares a ticket against this workspace's last export and its committed blob rather than the shared store's hash, and baselines the files other harness writers produce. A hold reaches the chair once, and a quarantine in the store always surfaces.
A chair that keeps pace. The chair scales its lane cap by the weekly pace ladder: the weekly spend is compared with a target that grows across the week, and lanes drop to a half, a quarter or none as the spend runs ahead of it.
Deferred to 0.40.0. Home-relative repository paths in work records.
Upgrading from 0.38.0. The store schema is unchanged. Three defaults change. The weekly pace ladder is on: by
default the target is 90% of the weekly meter by the week's end, and runs/policy.pacing.json takes
weekly_target_fraction and weekly_pace_lanes to tune it. A launch skips a lane host whose checkout environment does
not match that repository's uv.lock; run uv sync --frozen --all-extras in that checkout, and the next beat records
it. cox setup doctor's chair unit PATH row now also requires claude and uv. cox route file --repo takes a bare
repository name or an absolute path and refuses anything else, such as an owner/name. The 0.38.0 manifest kept
coxswain-cartridges and coxswain-graphs pinned at v0.37.0 although both were tagged v0.38.0, so an install from the
0.38.0 manifest receives their 0.38.0 and 0.39.0 changes together with this release.
coxswain-cartridges
decompose-initiative: a ticket's checks name only the build grant (pytest,git status,git diff), and a file in another repository is that repository's task, linked withblocked_on(cartridges #206).
coxswain-graphs
- An intake or an idea can carry
reach_allow, a list of path prefixes such as a deploy path that the reach lint accepts outside the repository, and decompose runs the reach lint on the idea before its first model call (graphs #761, graphs #771). - An epic never marks a task approved when its work is on no surviving branch: the move to approved needs a kept branch, and an end-of-run audit checks every approved task (graphs #767, graphs #773).
- Earned-autonomy streaks come from the store, not a per-host file, and epic and single-graph runs pass the store to the policy split (graphs #765, graphs #774).
- A run that dies on a lane host releases its stale worktree holder, and an epic clears a dead run's phase worktree before it reopens the phase, recording what it cleared (graphs #766, graphs #775).
- A test that polls
/proccounts an entry reaped between open and read as gone, which fixes an intermittent CI failure (graphs #770).
coxswain-tools
- A stopped phase land records why in its needs-chair row, routes a squash conflict to a rebase instead of a retry, and adopts a green pull request the stopped land left open (tools #1599, tools #1611, tools #1616).
- A land whose pull request branch is behind main updates the branch and retries the merge instead of stopping (tools #1609).
- A land reuses an empty leftover pull request branch instead of refusing, and recreates a leftover branch whose cherry-picked tree cannot be computed when it holds no commits that are not on main (tools #1604, tools #1618).
- An approved task whose run left no phase record, as a one-task run does, lands task by task (tools #1621).
- A partial land keeps an approved task's run while a newer run of the initiative is live or unfetched, and a cherry-pick conflict stops the task land once with a needs-chair row naming the conflicting paths (tools #1576).
- A landed task's open review pull requests are closed after the task is marked done, naming the landing commit or pull request, and their branches are deleted (tools #1574).
- Export holds are scoped and baselined: the guard returns every held file with its initiative from the writer's own predicate (tools #1580); the hand-edit guard compares against this workspace's committed blob and its own export record, never the store's hash (tools #1573); files other harness writers produce are baselined, a hold reaches the chair once, and a store quarantine always surfaces (tools #1622). A ticket's priority stays an integer through the export (tools #1575).
- A failed route launch records cox's refusal ahead of its stderr warnings (tools #1619).
- Route lint checks that each surface a ticket names exists in the repository's checkout, and that a surface marked
(new)does not exist yet (tools #1589, tools #1598, tools #1610). cox route file --reporesolves a bare repository name to its checkout beside the workspace, keeps an absolute path, and refuses anything else (tools #1577).- A standby chair pulls the workspace before it takes the lease, and a live chair run pulls each tick and pushes after an export commit (tools #1582, tools #1590).
- The weekly pace ladder: a pure verdict compares the weekly spend with a target that grows across the week (tools #1584), the chair's limits scale the launch cap by it (tools #1587), and the feed and the status line carry the target and the verdict (tools #1592, tools #1594, tools #1602).
- The chair launches an initiative only when it has a runnable task: ready tasks carry their phase, a blocked initiative is withheld, and the status line shows a waiting initiative with its blocking phase (tools #1585, tools #1588, tools #1567, tools #1595).
- The lane-host environment check: the beat records each checkout's environment against its
uv.lock,cox host doctorshows a row per repository with the sync command, and a launch skips a host whose checkout is stale or never synced for that repository and tells the chair once (tools #1603, tools #1605, tools #1607, tools #1615, tools #1617). cox setup doctor's chair unit PATH row checks forclaudeanduvas well ascoxandpytest(tools #1613).- A run with an expired lease, no end time and no live process is reported lost (tools #1565).
- Run rows in the dashboard feed carry how each run ended (tools #1579, tools #1583).
cox stats chair,cox stats rolesandcox stats efficiencycount lands from the store, and efficiency prints where its lands came from (tools #1563, tools #1564, tools #1571). On a Postgres store the gate and efficiency reports read the analytics snapshot (tools #1572).cox --versionand the host beat read a checkout-aware version, so an editable install reports its checkout (tools #1566, tools #1570).- The parquet doctor tests no longer read the host's chair unit, and
uv.lockis relocked for the 0.38.0 version (tools #1596, tools #1608).
Components
coxswain-cartridges, coxswain-graphs and coxswain-tools change. coxswain-crew and coxswain-dash are unchanged since v0.38.0 and stay pinned there.