0.7.0
Cut on 2026-09-16. Every component is tagged v0.7.0 in lockstep; coxswain-tools is published to
PyPI from that tag. Status: beta; nothing here breaks a 0.6.0 install. This release closes intake
groups G3 work shape, G4 validator reach and G6 release discipline, and lands the tools half of
G5 cost bounds and the cartridges half of G7 triage — the theme is that the loop stops throwing
approved work away, and the tools tell the truth about what a run cost. Versioning from here: cartridges,
graphs and tools stay in lockstep; crew keeps its own tag from the next release.
coxswain-graphs
- The sweep graph exists:
graphs/ops/sweep.pywithsweep_plan, harness-runsweep_applyand a no-modelsweep_verify(graphs #83), registered in_KNOWN_GRAPHSand the CLI (graphs #84), with itsSPEC, table rows and page (graphs #85); the docket markssweeprunnable when an idea is queued (graphs #86) and the dispatch schema carriesshapewith a requiredwhy(graphs #90). - The epic emits a
consolidateproposal on the finding class work-shape.md §4 names (graphs #92). - Every run removes its worktrees and prunes dead registrations on every exit path,
--keep-worktreesmoves them under_kept/<run>(graphs #78, #82). lint_ticketsruns at the end of decompose: reach and coupling refuse with corrections, grant and size attach aslint:advisories on the ticket (graphs #79); the reach rule now refuses corpus paths (graphs #93) and the trust runbook says what a seat can see (graphs #94).- An escalated, approved task reads
approvedin the work store, notdone— the disagreement between the store and git that stranded nine tasks on 09-09 is closed at the source (graphs #91). - The validator judges what the harness saw: every call record carries a
task_id, and a task's evidence array holds its trace-observed commands keyed by it instead of by which files it touched (graphs #96); the brief says so (graphs #95); a refusal must name a defect with a file, is retried once when malformed, and is recordedabstainedrather than discarding an approved patch (graphs #97). - An arm's
BudgetStopquarantines the task asinfrawith the patch kept and the run exits normally (graphs #88); a node failing mid-review writes the task record on the way out,infra, patch kept (graphs #89); a provider safeguard refusal is retried once on the tier's alternate model (graphs #81); a failed configured check reaches the task record and the fix-loop brief by name and output tail, never "see evidence" (graphs #87). - The coverage-floor trim runs
pytestthrough the current interpreter, so a land's fresh checkout no longer fails it (graphs #80).
coxswain-tools
cox dev releasebumps what it tags (branch, PR, wait, merge — reusing the land executor) (tools #137), waits on the workflows each tag starts and refuses to call the release done on any failure (tools #138), andrelease-checkgains aversionscheckgatenever allows by reason (tools #136).release-checkcompares the CLI surface against the docs generator's output rather than the tree (tools #135) and stops demanding a version string of component pages that never carry one (tools #139) — 48 false drifts on a clean tree become 7 (see known gaps).cox stats boundsreports, per (role, model), n, p50, p95, max, the declared ceiling, whether the distribution is censored by it, and the strict/moderate/liberal candidates;--writeproduces the bounds file the harness will read (tools #144, #145).cox stats spend-mixsplits cost by token class per model — output is 40–69% of spend, cache reads under a third (tools #146).- The operator's spend ceiling lives in the profile's
spend:block and reachesusage_window, soroute contextreports a measured window instead of "unmeasured" (tools #143). route lint's coupling rule is clean for a pair ordered byneeds, transitively (tools #149);route launch decomposewritesinitiative.mddeterministically before launching, ending the one file every decomposed initiative lacked (tools #151);runs usageon a live run answers from the trace instead of a traceback (tools #152);wait_workflowsrunsghfrom the component directory — the first cut under the new gate stopped on exactly that (tools #150).route.parse_frontmatterreads block-style lists (tools #140);route context/statusvalidate item states when they read them and showapprovedas awaiting merge (tools #142);cox runs notifyseeds its state from disk on first start instead of replaying 389 runs to the desktop (tools #141).
coxswain-cartridges
- The
ticket_amendwrite kind (risk low, ramp eligible) and atriagerole ceiling (cartridges #69). - Ledger rows may carry
model;SCOPE_KEYSgains it, so a streak earned under one binding does not transfer to another (cartridges #70).
coxswain
The nightly releasable workflow checks each component the way its own ci.yml does and installs the public substrate for graphs; it had failed every night since 09-09 on a guessed install step (#40, #41).
Known gaps
release-check still reports 7 false cli_surface drifts — the bare cox and the setup/dev groups read as commands to remove — so this release was cut with --allow-doc-drift; filed. The fix loop can still build a third time it never reviews; the ticket for it is at the attempt cap awaiting a person, as is the dispatcher counting itself as a slot. One route.py fix (land closes approved) and the graphs/cartridges halves of G5 and G7 are in flight for 0.8.0.
Components
coxswain-graphs, coxswain-tools, coxswain-cartridges and coxswain carry the changes above.
coxswain-crew is unchanged since v0.4.0 and is tagged in lockstep for the last time.