0.9.0
Cut on 2026-09-16. coxswain-cartridges, coxswain-graphs and coxswain-tools are tagged v0.9.0 in
lockstep; coxswain-crew is unchanged and stays pinned at v0.7.0; coxswain-tools is published to PyPI
from its tag. Status: beta; nothing here breaks a 0.8.0 install. This release closes the first P
project, schema versions — the three components now declare and check the contracts between them —
and finishes the day's work on the fix loop: builds are judged by their content, the account's session
limit pauses a run instead of burning an attempt, and the ticket lint stops refusing prose that only
looked like a path. A pinned component now rejoins the release version on its next change, and bare cox
keeps the chair alive by itself.
coxswain-graphs
- The graphs harness declares
CORE_SCHEMA, refuses to start against a different MAJOR ofcore.SCHEMA_VERSION, warns on a MINOR, and stamps every ledger row withschema(graphs #119). - A graphs node whose result is the account's session-limit banner raises
LimitStop: the phase stops with no attempt written, the summary readspaused: account session limit, resets <time>, and the run record carriespaused_until(graphs #121). - The graphs fix loop accepts a pytest evidence line satisfied by any run covering a superset of its files,
reads a surface written
path (new)as that path when a budget-stopped build resumes, and counts an identical patch after a handoff evidence request as progress (graphs #120, #118, #124). - The graphs ticket lint treats a bare slash, an angle-bracket placeholder, a device path and an absolute spelling of a repository file as notation rather than out-of-reach paths — six decomposes had died on those in one day (graphs #117, #122, #123).
- The graphs decompose's emit step is pinned to route lint advisories under
lint:, never intosurfaces(graphs #125), and the triage graph's docket carries a measuredstrandedcount, closing G7 (graphs #116).
coxswain-tools
cox versionsin tools gains a schema column,cox setup doctora schema row, andcox installwarns when the resolved components disagree on MAJOR (tools #161).- The tools release planner rejoins a
lockstep = falsecomponent whose main has commits past its pinned tag — tagging it at the release version and keepinglockstep = falsein the manifest — and leaves an unchanged one pinned;release-checkwarns when a pinned component's pyproject has moved (tools #163). - Bare
coxin tools spawns a detachedpython -m agent_tools.chair beat-loopfor the chair it takes and prints the beater's pid, so the lock no longer goes stale one window after launch (tools #164, #165). cox stats boundsin tools resolves a role's ceiling throughrole_budget_usd,tier_overridesanddefaultsbefore falling back tostandard, so the censored table names the right caps (tools #162).
coxswain-cartridges
core.SCHEMA_VERSION = "1.0"in cartridges names the four load-bearing contracts —STATES, the frontmatter whitelist,ATTEMPT_KINDS,ledger.REQUIRED_FIELDS— and the rule that changing any of them bumps the version with aCHANGELOGentry (cartridges #74).- The cartridges provider profile raises the eight per-role ceilings that
cox stats boundsshowed censored by their own cap, by about half each, with the measured table in the PR (cartridges #75).
Known gaps
release-check still reports the false cli_surface drifts and the release planner still trusts the
chair for the index section and the GitHub Release objects, so this release was cut with
--allow-doc-drift; both fixes (tools-release-gaps, tools-github-releases) are in flight and ship in
0.10.0, together with the three capped graphs-loop-fixes tickets and the small defects filed today
(two-parent phases, a reviewer that cannot emit structured output, placeholder builds, the stale
initiative.md a relaunched decompose reads, the doctor's schema readers for the other two components).
Components
coxswain-graphs, coxswain-tools and coxswain-cartridges carry the changes above. coxswain-crew is
unchanged since v0.7.0 and stays pinned there.