Repository navigation
coxswain 0.38.0
0.38.0
Cut on 2026-10-12. Status: beta. Coxswain now ships with no personal references: no person's name, host,
home path or private address in any shipped repository, and the release refuses a component whose tree names one.
Personal setup lives in two places outside the shipped code: a team cartridge, kept in a repository of its own,
and the provider profile. The human that the courier and decisions address is now a profile setting, operator,
not a name compiled into cox. The release also unsticks the loop: a phase with a quarantined task still lands
its approved tasks, a hand edit to a ticket reaches the store instead of being reverted by the next export, and
the loop's store calls cannot hang a tick.
Nothing personal ships. The release runs the clean check, .github/check_clean.py, on every tree it would
tag, a pinned component at its tag, and refuses before it cuts. The check refuses home paths, .lan hosts,
tailnet and 192.168 addresses, and tracker and platform vendors, and it reads the names to refuse from the
COXSWAIN_CLEAN_DENY secret, so the names themselves are never committed. The install guide has a section on
where personal setup goes, and the providers page describes the operator.
Lands that keep moving. The chair lands the approved tasks of a phase that also holds a quarantined task, one
task at a time, keeps the sibling branches each land would remove, and skips a task another machine has already
landed. A land renews its repository lease while it waits on checks. A store-mode fetch of a run with nothing
approved succeeds.
The queue says what it means. Route priority can put an initiative on top of or below every other open
initiative, measured against open work only. A ticket edited by hand is not overwritten by the export, and
cox route edit writes a task ticket to the store first.
A tick that cannot hang. The loop's store connections carry connect, keepalive and statement timeouts. The
facts stage has a wall-clock bound; a tick that overruns it is abandoned, and cox chair run exits for its
supervisor after three overruns in a row.
A red main from a job that never started is rerun. When main goes red because a CI job never started, the
loop reruns it instead of reverting the land that preceded it; a real test failure is still reverted.
Deferred to 0.39.0. The reach allow-list, home-relative repository paths, and an epic land that closes its
tasks' review pull requests (the forge call and the selection core land here; the land does not call them yet).
Upgrading from 0.37.0. The store schema is unchanged. Courier rows and decisions are addressed to the
profile's operator, which defaults to operator. An install whose courier rows were addressed to a person's
name sets operator: <name> in its provider profile, then restarts the chair loop. cox settings get --json
reports operator_only and, for this release only, the old pat_only field with the same value; the dashboard
reads either. A fork that runs the clean check in CI sets its own COXSWAIN_CLEAN_DENY secret; without it the
names rule is skipped and the other rules still run. coxswain-crew rejoins lockstep and is tagged v0.38.0.
coxswain-cartridges
- The
localcartridge lists no inline repositories; a team cartridge lists its own. Skills, provider profiles
and design docs say "the operator" instead of a name (cartridges #204). docs/PROVENANCE.mdis removed (cartridges #203).
coxswain-crew
- liam, alice and the model steward address the operator, not a name, and alice names the role, not a host
(crew #13). - CI runs the canonical clean check from the tools repository, with names from the
COXSWAIN_CLEAN_DENYsecret
(crew #14); the ruff comment keeps its reason without a name or date (crew #12).
coxswain-dash
- The settings frame marks a setting "operator-only" and reads
operator_onlyfromcox settings get --json,
falling back topat_only(dash #126, dash #127). - Actions, forms, inline tests and fixtures use neutral host and repository names (dash #125, dash #127).
- The runs view selects the line it draws, so a selected run far down a long list stays in view (dash #124).
coxswain-graphs
- No operator, host or personal path ships: comments keep their reason without a name or date, design docs name
the approver by role, and examples and fixtures use neutral hosts and paths (graphs #759). The README drops
the link to the removed provenance page (graphs #758). store_cli host loginrecords a host's login state without touching its beat time (graphs #750, graphs #752).- The claude runner kills its whole process group on a timeout (graphs #753).
- Every quarantine records its cause, and a crash in a later phase keeps the earlier phases' approvals
(graphs #755). - Decompose names the build grant and the repository bound in its prompt and never writes a ticket that route
lint refuses (graphs #756, graphs #757).
coxswain-tools
- The provider profile's
operatorkey, defaultoperator, names the human the courier and decisions address.
cox settings get --jsonreportsoperator_onlyin place ofpat_only, and keepspat_onlyas an alias for
one release (tools #1558). - Tests and fixtures use neutral names, and
.github/check_clean.pyrefuses home paths,.lanhosts, tailnet
and 192.168 addresses, vendors, and the names in theCOXSWAIN_CLEAN_DENYsecret (tools #1554). It takes
--skip RULEand never scanstarget/(tools #1557). - A phase with a quarantined task still lands its approved tasks: the chair plans a partial land, lands each
approved task in order while it backs up and restores the sibling branches, and the status line names it as
partial-land (tools #1529, tools #1543, tools #1544, tools #1545). A task land adopts an open pull request
(tools #1545), and a partial land skips a task another machine already landed (tools #1556). - The loop's store calls cannot hang a tick: its store connections carry connect, keepalive and statement
timeouts (tools #1549), the facts stage has a wall-clock bound (tools #1546), andcox chair runexits 3
after--max-overrunsoverruns in a row, three by default (tools #1551). - Ticket edits reach the store: the export refuses to overwrite a hand-edited ticket, the status line has an item
for a ticket file ahead of the store, andcox route editaccepts a task ticket id (tools #1522, tools #1523,
tools #1540). cox route priority --topand--bottomplace an initiative one above or one below every other open
initiative, measured against open work only, and a queued intake takes a priority as well (tools #1524,
tools #1527, tools #1531). Decomposed tasks inherit their intake's priority (tools #1547).- A red main from a CI job that never started is rerun instead of reverted: the job classifier, the rules, a
per-commit read of main's CI, the green-since reader, the facts, the executor's rerun port, and a revert that
replaces its own leftover branch (tools #1520, tools #1521, tools #1534, tools #1538, tools #1539, tools #1541,
tools #1542). The loop wires the green-since reader and the rerun port, and a pending watch resolves once main
goes green at or after its commit (tools #1559); an end-to-end test covers the rerun, the revert and no
walk-back (tools #1560). - Clearing branches before a relaunch ignores another initiative's lands in the same repository, so a relaunch
is not starved by them (tools #1561). - The forge can close pull requests, and a pure core picks an epic land's task review pull requests to close
(tools #1548). - A land renews its repository lease while it waits on checks (tools #1535).
- A store-mode fetch of a run with nothing approved succeeds, and a failed fetch keeps cox's verdict ahead of
git's output in the reason (tools #1532). - The login check reads
claude auth statusfrom stdout only, renews an expired access token once before it
counts a failure, and blocks a host only on its second failure in a row;cox host doctorruns directly on the
loop's own host (tools #1528, tools #1530). cox setup doctorchecks the chair service unit's PATH: every entry absolute, andcoxandpytestreachable
(tools #1526). It warns when a model tier is not its family's newest, or the vendor has a newer model than the
catalog (tools #1552).- Route lint's grant rule flags only the commands a ticket asks the seat to run (tools #1553).
- The verdict the chair's launch gate will use to launch an initiative only when it has a runnable task
(tools #1533). - Read-only store connections autocommit, so a read never holds a transaction open, and the notifier backs off and
reconnects after a store error instead of exiting (tools #1525). - The lake doctor reports a dangling metadata pointer, and housekeeping skips the prune when traces live in object
storage and keeps a failed step's last exception line (tools #1536, tools #1537, tools #1555). - The load-sensitive CLI startup tests run only when
COX_RUN_LOAD_TESTS=1, so a busy host no longer fails a
land at random (tools #1550).
coxswain (umbrella)
- The release refuses a component whose tree names a person, host or home path: it runs coxswain's
.github/check_clean.pyon each tree it would tag, a pinned component at its manifest tag, and never prints
the matched text (coxswain #287). The umbrella's tests drop their last personal names (coxswain #289). - The docs use neutral names (coxswain #283, coxswain #284, coxswain #285, coxswain #286). The install guide has
a section on where personal setup goes, a team cartridge or the provider profile (coxswain #282), and
docs/customize/providers.mdhas a section on the operator (coxswain #288). - The release fetches before it tags and refuses a checkout that is not at origin (coxswain #276), and checks
each component in a fresh virtual environment (coxswain #277). - The install proof's Linux job installs a python3 for its checker, and its negative control goes green when
both platforms fail as expected (coxswain #275, coxswain #278). - A release drafts its own notes:
python -m devtools notes-draft <version>writes the page from the pull
requests merged since each bumped component's last tag and registers it in the index and nav, and
--cheap-openerfills the opener with a short model draft (coxswain #279, coxswain #281).
Components
coxswain-cartridges, coxswain-crew, coxswain-dash, coxswain-graphs and coxswain-tools all change; coxswain-crew
rejoins lockstep from v0.32.0.