0.13.0
Cut on 2026-09-24. coxswain-cartridges, coxswain-graphs and coxswain-tools are tagged v0.13.0 in
lockstep; coxswain-crew is unchanged and stays pinned at v0.12.0; coxswain-tools is published to PyPI
from its tag. Status: beta; nothing here breaks a 0.12.1 install. Every graph call used to name its
model tier in code. It now names a role and optional hints, and the tier comes from the provider profile's
per-role defaults. Those defaults were set to the tiers the call sites used before, so no role's tier changes
in this release. The cartridges side of the model router lands complete. The work store gains a one-way
mirror onto a GitHub Projects board, the landing loop gains gate levels, and the operator surfaces planned
since 0.12.0 are finished.
coxswain-cartridges
- The cartridges model router lands as pure parts: the chair's bounds as one typed record (cartridges #83),
the budget rule (cartridges #84), the model catalog and its loader (cartridges #85), the tier rules
(cartridges #86), and
core.router.decide, which composes them into a model, effort and budget triple clipped to the chair's bounds and names each bound that clipped it (cartridges #87). The pacing states it accepts are the ones the tools pacing check actually returns:go,go_degradedandstop. - Every provider profile's
defaults:block names a tier for every role the graphs call, each at the tier its call site named before, so the graphs change below leaves every role where it was (cartridges #124).
coxswain-graphs
- The graphs runners record a
CallDecisionfor every call: the requested and chosen tier, the model, the reason, and for Claude Code the CLI version from the stream's init event (graphs #145, #146, #147). - The graphs tier resolver picks a call's tier from overrides, then the tier the caller named, then the profile's per-role default, then the floor, and both runners resolve through it (graphs #148, #149, #150). Graphs never import the cartridges router: a runner records a model, effort and budget it is given, and never computes or clips one.
- The graphs call sites in ops triage, phase validation, initiative decompose and the lifecycle graph name
a role and hints instead of a literal tier (graphs #267, #268, #269, #270). Decompose's adversary keeps
its literal
deep, so it stays a tier above the lifecycle adversary. - The graphs build step can no longer write outside its scratch checkout into the phase branch (graphs #142),
may run
python -m pytestandpython -m ruff(graphs #144), and a check that fails after approval goes back into the fix loop instead of ending the task (graphs #143). - A ticket may list
verify:commands, and the graphs harness runs them itself, so a reviewer no longer asks the builder for output it is not allowed to produce. They run in the build's own scratch checkout after the patch; handoff and both reviewers see their output, marked as harness-run, and so do validation and the phase check. A failing verify command is evidence, never a quarantine (graphs #151, #271). - The graphs
CallDecisiongains six optional system-one fields, backend, mode, answer, confidence, threshold and agreement, for the Jev deciders' shadow mode; old rows load with them unset (graphs #273).
coxswain-tools
cox route syncin tools mirrors the work store onto a GitHub Projects board, one way: an issue per item in the item's own repository, a State, Phase, Run, Cost and Gate field per board item, and the issue number written back to the item. It plans every step with a pure function, prints the plan under--dry-run, and refuses an item whose state has no column or whose repository no longer resolves (tools #240, #244, #432). Every land now syncs the one item it touched, and its pull request closes that item's issue (tools #434).- The tools landing loop gains gate levels,
ticket,phase,epicandfull, read fromruns/policy.gate.json, defaulting toticketand tightening only. A land the gate stops short of its merge prints where it stopped and which pull request it left open, and exits 3 (tools #239). cox install --edgein tools installs every component from its branch tip instead of its tag (tools #241), andcox dev releaseopens the Homebrew tap's formula bump from the sdist PyPI lists (tools #242).cox runs recoverin tools resolves a real task record, reading the phase from the record's path and the initiative from the work store (tools #235).cox runs cleankeeps the right branch for a refused task (tools #234).cox homein tools gains the regatta lane and a panel layout that can be reordered, hidden and resized from the keyboard and is remembered between sessions (tools #237, #238).- The release planner in tools updates the component tags in the manifest's inline tables (tools #231), waits when GitHub has not yet scheduled a pull request's checks instead of failing (tools #232), and checks how the notes cite a version already cut (tools #233). The home screen's slow-reader test no longer depends on wall-clock time (tools #236).
cox dev commands renderin tools writes the README's Commands section from the command table, and reproduces the committed text byte for byte (tools #435).
Known gaps
The cartridges work store drops a ticket's verify: list when it reads the ticket, so the graphs
verify step above has nothing to run yet; the fix is first in 0.13.1. The graphs model router's shadow mode and CLI version pin are held until they are rescoped around the rule
that graphs never import the cartridges router. The epic driver runs a task whose state is blocked, and cannot
follow a dependency into another initiative. cox runs land refuses a stacked task after its parent lands,
and does not resume when its pull-request branch already exists. All are filed. The Jev system-one deciders,
the intake sources and the rest of the command-table migration are ahead.
Components
coxswain-graphs and coxswain-tools carry most of the changes above; coxswain-cartridges carries the
router and the provider defaults; coxswain-crew is unchanged and stays pinned at v0.12.0.