## avifenesh/memra — v0.95.0…v0.96.0

_30 commits._

### Features
- **merge: lane/gate-coverage-20260819 @ 37e1f50a8b — the drafter-attach residue closed: local-ci.sh sets MEMRA_GATE_MTP_DRAFT so the battery's qwen hit-gate arm actually asserts the drafter (was a documented no-op; wrong-seam TEETH arm now rc=1); new tools/drafter-attach-wiring-gate.sh, battery-resident, FATAL, CPU-only — census/coupling/satisfiable/executed checks over the 7 assert-drafter call sites across 5 gates, 14/14 forced failures; found its own grep -q SIGPIPE-under-pipefail size-dependent false negative and fixed it with grep -c + a 5-run stability check** (7711401)

### Fixes
- **merge: lane/graph-s-key-exactness-20260819 @ c4fc7400fe — graph_s s_key CONFIRMED-REACHABLE exactness bug fixed: a filtered request (top_p 0.95/top_k 20) could launch a draft graph captured unfiltered via whole-session spec reuse (pool-resume probe compares prompts, never samplers); SampledGraphKey now carries every field shaping q (seed, temp, k, top_k, top_p, min_p, pen_on), pure_temp computed FROM the key, parked=>pure_temp asserted at capture; 5 CPU teeth tests prove the vendor shape collides under the restated legacy_key and separates under the new one; MEMRA_DEBUG_SPEC=1 no longer panics the worker on sampled rounds; rms_norm_qkv_rope* take n_rot and refuse non-full width, all 12 call sites pass the declared per-class width** (3a8133b)
- **merge: lane/prepush-range-fix-20260819 @ 090b450fb7 — pre-push range derivation moved to tools/push-range.sh (merge-base both arms, no HEAD~20 fallback, failure names base sha + accused files); unreadable-diff fail-open fixed; accept-gate.sh counts NOREF in its verdict. Fixture tools/test_push_range.sh 18/18, decisive against the legacy range** (bda2103)
- **merge: lane/n-rot-partial-rotary-20260819 @ f0af0fc447 — n_rot/partial_rotary_factor derived once in resolve_rope_dim_count() shared by GGUF and HF readers (HF path read 256 instead of 64 on qwen3_5*; prod unaffected, every serving config passes a .gguf); bug-asserting fixture made real; nv27b_twin_parity gains the geometry block (config scalars asserted before byte compares)** (2a7fd8b)
- **gates round 3: fix the generated-gate TEMPLATE, and make a skipping #[test] fatal by default** (04259d9)
- **fix(spec): key the sampled draft graph on the WHOLE sampling regime, and re-test pure_temp at the launch site** (997bd97)
- **fix: HF/safetensors path never derived n_rot from partial_rotary_factor** (f0af0fc)

### Backend
- **release: v0.96.0 — the consolidation train (version + internal pins)** (a58c51c)
- **Merge release/v096-candidate @ b139a1c83d — the v0.96.0 consolidation train** (27388f5)
- **boundary: prune the 2 TRANSIENT release/v096-candidate pins before merge to main** (b139a1c)
- **boundary: 2 TRANSIENT pins for the intermediate docs/SERVING.md blob versions on this train** (1a353c4)
- **reconcile(v0.96.0 train): the three deferred seams, landed now that the contention merged** (a3796e0)
- **merge: lane/session-resume-sampler-predicate-20260820 @ b8ebf28ba6 — whole-session spec resume refuses a differing sampler and names the first differing field (owner ruling: refuse-and-name; a parked session's penalty window, Philox stream and draft plane are sampler-shaped); SamplerIdentity canonical form in memra-sampling compared bit-wise after canonicalization, seed deliberately carried-not-compared (SampledGraphKey already re-keys on it; omitted seed draws fresh entropy every turn, so comparing it kills every seed-omitting resume); MEMRA_SPEC_RESUME_SAMPLER=0 policy door restates the legacy probe for within-binary A/B; admitted resumes tagged [sampler=equivalent|unchecked]; spec_pool_sampler_refusals in /metrics** (cc770aa)
- **merge: lane/vendor-default-sampling-20260819 @ 8e9f37a1b7 — vendor-recommended per-model sampling defaults as seven boot-validated config keys (qwen3.8 1.0/0.95/k20, gemma-4 1.0/0.95/k64); one resolve_sampler_config (client > vendor > arch caps > API standard) shared by all four surfaces, fixing /v1/completions' bare-f32 fields that could never receive a per-model default; default_temperature=0 refused at boot; binary inert without the keys (no-key models byte-identical); local-ci.sh gains fatal cargo test (the battery documented as gating every merge and tag never ran it)** (48982b9)
- **merge: lane/gate-template-integrity-20260819 @ cd0c6594a6 — the generated-gate template stops minting defects: reserved port band 18300-18399 validated against a computed census, generated gates refuse to run without port-guard.sh, SKIP becomes exit 77 + census row (never silent exit 0), canary_expect_regex required (schema v2), assertion count asserted; tools/skip-census.py + .tsv (verify both directions, run budgets: validate-h100=0, ci=12); dflash oracle manifest written before dumps, scalars from config.json, library versions recorded (transformers 4.x->5.x rope-convention divergence found in the bisect handles)** (fb74834)
- **merge: lane/gate-integrity-r2-20260819 @ 99d4c47a85 — six gate-integrity fixes with forced-failure teeth: validate-h100 no longer discards its own unit suite (pipefail + unit_suite non-vacuity), kernel-check skips fatal against a budget, cargo test enforced in ci.yml + validate-h100 (137 CUDA-free + memra-server 315 + parity bins), check-flags census --list + live block decoupled from the constant-true conjunct, canary arms require the comparator's own words (rc 75 named INCONCLUSIVE), tools/port-guard.sh wired into seven gates with both 8178/8179 collisions removed at source; parity_geometry.rs — oracles emit geometry manifests, gates assert config scalars before any byte compare** (5f5c466)
- **spec: whole-session resume REFUSES a differing sampler and names the field** (b8ebf28)
- **boundary: prune the 2 TRANSIENT release/v095-candidate pins at merge to main** (582a66a)
- **dflash oracle: the geometry manifest could not be written at all, and library version is geometry** (cd0c659)
- **guard(rope): the fused rms_norm+qkv+rope kernels REFUSE partial rotary instead of rotating full width** (ccd675e)
- **probe(spec): MEMRA_SKEY_PROBE — report the sampled draft-graph chain decision and the q=0 accept signature** (8d02a8e)
- **fmt: cargo fmt --all on the two files rustfmt reflowed** (99d4c47)
- **gates round 2: seven checks that reported green while verifying nothing, each now with a forced failure that proves it can fail** (874e621)
- **gates: two fail-open holes from the same audit — an unreadable diff, and an unpinned acceptance cell** (090b450)
- **pre-push: derive the push range from the fork point, never from an arbitrary depth** (f0578d5)
- **gate-coverage: the drafter-attach assertion had never executed — wire it, couple it, and give it teeth** (37e1f50)
- **vendor-default sampling: an omitting client gets the MODEL VENDOR's recommendation, not greedy** (8e9f37a)

### Tests
- **test(rope): pin the gemma-4 31B official artifact's own declared rope widths** (c4fc740)

### Docs
- **docs: v0.96.0 truth pass — the two surfaces this train added** (dc50f7e)
- **docs(flags): the two rows the merged lanes could not land while FLAGS.md was contested** (d16fd70)

_Recap by [Repo Wrapped](https://repowrapped.com/gh/avifenesh/memra?utm_source=github-action)._