Skip to content

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.py with sweep_plan, harness-run sweep_apply and a no-model sweep_verify (graphs #83), registered in _KNOWN_GRAPHS and the CLI (graphs #84), with its SPEC, table rows and page (graphs #85); the docket marks sweep runnable when an idea is queued (graphs #86) and the dispatch schema carries shape with a required why (graphs #90).
  • The epic emits a consolidate proposal 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-worktrees moves them under _kept/<run> (graphs #78, #82).
  • lint_tickets runs at the end of decompose: reach and coupling refuse with corrections, grant and size attach as lint: 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 approved in the work store, not done — 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 recorded abstained rather than discarding an approved patch (graphs #97).
  • An arm's BudgetStop quarantines the task as infra with 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 pytest through the current interpreter, so a land's fresh checkout no longer fails it (graphs #80).

coxswain-tools

  • cox dev release bumps 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), and release-check gains a versions check gate never allows by reason (tools #136).
  • release-check compares 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 bounds reports, per (role, model), n, p50, p95, max, the declared ceiling, whether the distribution is censored by it, and the strict/moderate/liberal candidates; --write produces the bounds file the harness will read (tools #144, #145). cox stats spend-mix splits 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 reaches usage_window, so route context reports a measured window instead of "unmeasured" (tools #143).
  • route lint's coupling rule is clean for a pair ordered by needs, transitively (tools #149); route launch decompose writes initiative.md deterministically before launching, ending the one file every decomposed initiative lacked (tools #151); runs usage on a live run answers from the trace instead of a traceback (tools #152); wait_workflows runs gh from the component directory — the first cut under the new gate stopped on exactly that (tools #150).
  • route.parse_frontmatter reads block-style lists (tools #140); route context/status validate item states when they read them and show approved as awaiting merge (tools #142); cox runs notify seeds its state from disk on first start instead of replaying 389 runs to the desktop (tools #141).

coxswain-cartridges

  • The ticket_amend write kind (risk low, ramp eligible) and a triage role ceiling (cartridges #69).
  • Ledger rows may carry model; SCOPE_KEYS gains 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.