v0.61.0 — release integrity
The release-integrity release. Every change fixes something that was either silently broken or silently false.
Cut after a 22-agent adversarial show-stopper hunt across the publish, packaging, CLI, tensor-layout, build and inference surfaces. Every finding was independently refuted before acceptance; exactly one release blocker survived, and it is fixed here.
Fixed
Publish cascade stranded 2 of 70 crates (#2308) — scripts/cascade-publish.sh omitted apr-format and aprender-rag-cli from its TIERS[]. apr-format is a hard dependency of aprender-core, so the cascade would abort at Tier 2 and leave ~20 downstream crates unpublished on an append-only registry. Now 70/70, verified by set-difference. This also explains why aprender-rag-cli was stranded at 0.1.5 — it was never tiered.
guard-runner-labels could not self-heal, taking main red (#2311) — it was the only clean-room job lacking the "Pre-checkout ownership restore (EACCES self-heal)" step that workspace-test and mutants both carry. A hard-killed docker job leaves root-owned target/.rustc_info.json, so the next run's git clean -ffdx fails with EACCES before any step runs. Since gate hard-requires this job, that blocked every merge until a runner was cleaned by hand.
RUSTSEC-2026-0204 — crossbeam-epoch 0.9.18 → 0.9.20 (#2312) — an invalid pointer dereference in the fmt::Pointer impl for Atomic/Shared. It reached main because the last CI run predated the advisory and a --failed-only rerun never re-executed ci / security.
Declared MSRV was false — rust-version = "1.89" while the lockfile pins pmcp 2.9.0 and wasmtime 43.0.2, both requiring 1.91.0. cargo install aprender could not succeed on the toolchain we advertised. Corrected to 1.91.
cargo set-version --workspace aborted mid-bump — the non-exact version = ">=0.29" requirement aborted after 7 manifests had been rewritten, leaving a half-bumped tree.
Added
README contract count is now CI-enforced against the live tree (#2304, FALSIFY-README-007) — the claim had drifted from a real count of 1766 through three published figures (1331, 1134/1148, 1460). The test computes it from contracts/**/*.yaml at test time, so it cannot be pinned wrong again. Mutation-verified.
scripts/cascade-drain.sh (#2308) — the multi-pass drain previously lived outside the repo with TARGET=0.60.0 hardcoded; run against a later release it would report DRAIN COMPLETE and publish nothing. Now in-tree, defaulting to the workspace version.
Known issues — deferred, not fixed here
top_k=0(the value Ollama and llama.cpp use for "disabled") makes the dense sampler emit token 0 forevertop_p/ nucleus sampling is a silent no-op on the dense CPU decode pathcargo install aprender --features fulldoes not compileapr convert --quantizeskipsenforce_import_contract- README claims 103 CLI commands;
aprships 104
Note on claims
These notes state only what a workflow turns red on. Deliberately excluded as unenforced: coverage %, the headline test count (workspace-test is --lib only), "L5 = 6" (requires a special pv flag), and the 1.371× Ollama decode beat (appears in zero workflows).