Skip to content

aprender v0.69.1

Choose a tag to compare

@noahgift noahgift released this 23 Sep 21:51
· 474 commits to main since this release

[0.69.1] - 2026-09-23

0.69.1 is the stoppers train for 0.69.0 (#3080), and it grew into the release that makes
every Qwen model the fleet holds run on CUDA, or refuse by name. It was assembled as
integration batches: 629 commits since v0.69.0, frozen at c619dddd4, and released as
d8a6df53a (rc/0.69.1-x). That is the freeze plus two post-freeze folds: the Qwen3.5-0.8B
load warning (#4032) and #4022. It was certified under a reduced, operator-declared
scope
(see Certification below).

It has two themes. The first is gates that could not fail. 0.69.0 shipped a model
that emitted empty output on CUDA as a note rather than a failure, because one contract
key said the rung was optional. The second is one path per capability. Several verbs
had quietly grown their own copy of a template, a tokenizer or a dispatch. Each copy
drifted, and each drift was a user-visible defect: the prompt was templated twice, a MoE
model was routed to a dense forward, a Qwen3.5 model got a 503 on five serve routes, and
characters were split into U+FFFD on a stream.

Four release gates in this tree turned out to be one defect wearing four faces
(contracts, pv lint, check_model_ladder, and the clean-room contract test), all
resolving to a single missing green witness. That is the good case: one cause, one fix.
The bad cases are below, and they are the ones worth reading, because each was green
while being wrong
.

Mixture-of-experts on CUDA (operator ruling: MoE folded into 0.69.1)

  • qwen3moe runs on the GPU. Qwen3-30B-A3B-Instruct-2507 and
    Qwen3-Coder-30B-A3B-Instruct (Q4_K_M) have a CUDA forward that proves itself against
    the CPU forward on the real prompt first. apr parity measures both files at 92/92
    positions, cosine 1.000000, on lambda and gx10. (#3714: 6f6fa9a83, 341c958af)
  • Every verb reaches that forward through ONE dispatch. run and qa reached it first.
    chat, serve and code had their own routes to the dense model, which answered rc 8,
    501/500 and rc 1. They now go through run_qwen3_moe_generate_dispatch, and serve
    reports used_gpu per response. serve's stream=true arm was still on the CPU-only
    generator, and it now dispatches too. (#3987: e29c55a7e, a00d29f9b, a29989039)
  • The dense CUDA constructors refuse an MoE model by name, before CUDA init. A guard
    derives every dense construction site from the tree, so a new one cannot bypass the
    refusal. (#3992: 4ca778172, b8c73cbe0)
  • Qwen3.5-MoE (the hybrid SSM + experts architecture) still refuses on CUDA, by name. That
    refusal is not a fallback.

Quant types: every held Qwen file runs on CUDA, or refuses by name

Each type below got a GEMV kernel measured on the device against a CPU decoder that had
first been proven against gguf-py on real tensors. Each was admitted to the GPU whitelist
only after that device A/B came back exact.

  • IQ4_NL (#3869: 9ba76969a, 10532e06e), IQ3_S (#3884: ac968613a), BF16 (#3908:
    6883ff1bf, d0e92124c), Q5_1 (#3885: a8d63e09d).
  • IQ2_S, IQ3_XXS and Q2_K were admitted in ONE edit, each on its own measured kernel
    (#3953, #3963, #3960: 6bde9a279).
  • IQ4_XS is A/B-tested at every shape Qwen3.5-0.8B uses, including the non-power-of-two
    ffn_down row (14 super-blocks), with a negative control. (#3951: 22658163d)
  • The whitelist was recorded in six places, and they disagreed with each other in both
    directions. It now has one source. (#3884, #3931: b9435c6b6, 58c88e20e)
  • apr run prints the quant type of the model body, not the tied lm_head's. (#4006:
    36efbb152)

One template, one tokenizer

  • The model's OWN chat template is rendered on every path (run, chat, serve, code and
    the golden gate), replacing the hand-coded no-think scaffold. Qwen2.5 had been losing
    its default system prompt: 26 tokens against llama.cpp's 47. (#3990, #3755: 5991a588f,
    c08437cdd)
  • apr serve no longer takes the template from the client's model string. An unknown
    name used to get a plain prompt, and the reply ran on into "Human:". (#4007:
    baef5e961)
  • --thinking on|off on run, chat and code. Previously every Qwen3/3.5 model was
    hard-routed to the no-think template. (#3723: 70d20d44c, 889d49a0f)
  • Non-ASCII token ids equal llama-tokenize on every tokenizer path apr ships. Every
    non-ASCII byte had been mapped to id 0. (#3726, #4005: 9684a7a41)
  • SPM encode splits control tokens by token_type: TinyLlama's </s> no longer tokenizes
    as three pieces. (#3993: b29ed7202)
  • apr chat reads the tokenizer the .apr carries. (#3903, #3911: 769a4298d)

apr serve: every advertised route works, and every stream is well-formed

  • Qwen3.5 answered 503 on /v1/completions (#3874/#3875: 24f9bb212) and on the five
    realizar raw routes: /generate, /batch/generate, /stream/generate,
    /realize/generate and /realize/batch. Each now has a Qwen3.5 arm, tested against
    apr run's answer on the same rendered prompt (b7de8be40, 062de0d97).
  • The live SSE path and the raw /stream/generate path decoded one token at a time, so a
    character split across two byte tokens streamed as two U+FFFD. Both now hold a partial
    character back until it completes. (a29989039, c619dddd4)
  • Every router advertises exactly what it mounts, and every stream ends with its wire's
    terminal event. (#3979: b8101dc28, 7a21e13a5)
  • apr run -v no longer panics on a non-ASCII prompt. (#4018: 8df47be4f)

Proving the measurement

  • A GPU receipt proves the card was exclusive, or it is refused. An Ollama daemon could
    load onto the GPU mid-measurement without taking the fleet lock. (#3964: 204abee3c,
    75626eab9)
  • The F2 GPU check is tri-state. It returned "assume the GPU is fine" when the CPU
    reference was unavailable. It now reports NotMeasured{reason}, never PASSED. (#3973:
    06f32ce73)
  • apr qa --json no longer reports a skipped gate as passed: true. (#3965:
    2b75f932c)
  • The golden thinking-ON leg renders the model's own template, and no longer passes an
    empty <think></think> as reasoning. (#3948: 0c4c5c133)
  • The ladder judges the model, not the terminal (#3925), counts the serve probe in a
    row's verdict (#3886), and decides serve teardown from the process rather than the port
    (#3943). Diagnostics are no longer cut mid-number (#3872, #3904).
  • The CRUX v2 differential: per-verb prompt sets, the code verb, hf/vLLM
    ground-truth rows, prompt certification, and sha-bound receipts. Each apr serve route is
    judged against the comparator route that asks the same question in the same
    representation. (#3962, #3957)
  • The publish cascade can finish. It used to give up after one retry round, which
    would have left 49 crates on crates.io and not aprender itself. (#3892: e6a799609,
    bc2e61e71)
  • Coverage is measured, not assumed: failing tests are listed, and "did not measure" is
    never a verdict. Floor 88%. (#3839: 2fe5858be; the value is 90.99% (861,156 / 946,437 lines at the freeze 4f81bde; floor 88))

Gates that could not fail

  • A Q4_K rung can no longer be optional. qwen3-8b-q4km was required: false, which
    is exactly how 0.69.0 shipped an empty-output CUDA model as a note. No Q4_K model is
    optional (#3712); the key is now refused rather than tolerated, and arming it surfaced
    the defect it had been masking since 0.69.0.
  • The golden-output gate scored degenerate output as correct. The greeting case
    accepted a bare "!" by substring match — and "!" is token id 0 in the Qwen vocab,
    i.e. precisely what a model with dead logits emits. Measured on the pre-fix gate,
    "!"-repeated passed at lengths 1..=11 and was caught only at 12+, because the
    existing guard tested bytes.len() >= 12. So the gate was blind exactly where the real
    failure lives: short degenerate output. A new gibberish_dominant_character check (8+
    non-space characters, 90%+ identical) now runs before the answer check, so it covers
    cases added later, and it reuses CRUX's own threshold so the two judges cannot disagree
    about what "degenerate" means. (#3782, #3774)
  • make contracts printed its verdict and did not enforce it. The command was
    "$PV" lint contracts/ | tail -5, so the recipe took tail's exit status. The
    armed-meet verdict was displayed on every run and could never fail the build. (#2336,
    #2360 are the same idiom shipping twice before; this is the third.)
  • The release ladder measured one verb while the contract declared four. The release
    matrix claims {run, chat, serve, code}; the ladder proved run. The receipt now
    carries a verbs object, serve is probed against routes derived from the router's
    own source literals
    rather than a hand-written list, and the judge refuses by name a
    receipt that omits a verb, reports no routes, or probes serve without /api/chat.
    The anti-shrink floor also gained a way to admit a reasoned removal instead of only
    refusing every shrink. (#3828)
  • A NO-GO release run destroyed the evidence it cited. The dogfood worklog was removed
    unconditionally, so the one verdict whose reasoning you need was the one with no
    artifact left. It is now kept on any non-GO.
  • Pre-publish dogfood could never reach GO. Its declared gates resolved a stale debug
    binary and refused, before anything built target/release/apr.
  • A gate reported RED about a rung that passes every one of its gates. On
    qwen35-27b-q4km — a required rung — apr qa exited 0 with "passed": true,
    capability_match PASS and golden_output PASS ("3 golden test cases passed …
    served by GPU"), and the ladder marked the rung red because its own row builder
    crashed on a malformed field. Every other defect in this release hunts a false
    GREEN; this is the inverse, and it is the one that would have made us hold a good
    release
    and go looking for a fault in a model that did not have one. The field is
    now validated where it is assembled, with the backend still in scope. (#3849)
  • apr qa --json could exit having written zero bytes. run_qa(…)? returned past
    the if json block, so any error produced no document at all. Measured on gx10: 78
    seconds of GPU work, its own stderr recording F2 guard: passed in 78442 ms on 20 positions, and then nothing on stdout. The ladder appended the empty result as an
    empty line, the receipt assembler dropped it, and a red required rung vanished from
    its own receipt
    while a separate counter still reported it — red: 3 with two reds
    in the rows. A second zero-byte path sat beside it: unwrap_or_default() turned a
    serialization failure into an empty string, which is worse, because it looks like
    output. The document is now emitted on both paths and the error still returned, so
    exit codes are unchanged. The coverage that existed drove this exact path and asserted
    only result.is_err() — the test named for the output never looked at the
    output
    . (#3842)
  • The code verb had never been measured. 48 of 48 cells, both hosts. The ladder
    hard-coded one backend flag and passed it to all four verbs, whose CLI surfaces
    differ: apr code has no backend selector, so clap exited 2 on a usage error and the
    receipt recorded ran: false — a harness defect wearing the costume of a model
    result
    , indistinguishable from a model that genuinely failed. Its siblings in the
    same run returned meaningful codes (12 NotImplemented, 14 BackendUnavailable); 2 is
    clap. The flag is now derived from apr <verb> --help rather than a table, which
    immediately caught a second case: the flags live on the subcommand, so
    apr serve --help lists none while apr serve run --help does. code is measured
    once per rung and labelled backend: "inherited-from-spawned-serve", because it
    spawns its own server and "code on cpu" is not expressible today (#3845). (#3843)
  • The ladder's serve probe hung forever on teardown. kill "$pid" targeted the
    flock/choom wrapper, not apr serve, which survived, kept its port and was
    re-parented away. Every bound the probe declared was holding — the 90 s health wait,
    all six curl --max-time 60; the unbounded step was the one assumed instantaneous.
    Rung 1 of 8 hung 13+ minutes on both hosts. Teardown now resolves the listener by
    port, proves /proc/PID/cwd is this tree before signalling, and records
    teardown: clean|escalated|failed in the cell. Measured across a full run:
    48 escalated, 0 clean — the wrapper kill has never once worked. (#3828, #3838)
  • The model universe was a glob, so 10 of 28 held models were invisible.
    *q4_k*.gguf and friends missed Q4_0, IQ2_XXS, IQ3_M, IQ4_XS, f16 and two
    .apr files by filename — including a 35B Qwen3.5 MoE no gate had ever loaded. #3712
    replaced a hand-picked list with a glob, which has the same omission property: a
    decision moved from a human to a string match nobody reviews. Widened to every Qwen
    2.5/3.5 file the host holds, regardless of quant. (#3846)

Qwen on CUDA — correctness

  • APR Q4_K GPU serve no longer emits garbage. (#3791, with #3571 units 1–2 and #3595)
  • One template detector. apr chat stopped routing Qwen3 through ChatML; apr code's
    embedded fallback now takes the production detector instead of guessing from a filename.
    (#3801)
  • The three spellings of a chat prompt now reach realizar identically. A pre-templated
    prompt was templated a second time, and sanitize_special_tokens inserted U+200B,
    producing <unk> tokens and a token count that disagreed with llama.cpp's. (#3743)
  • The golden gate asks the model the way production asks it. It previously sent ChatML
    to every architecture, which left qwen3 in thinking mode — a mode no production path
    uses — and on one host its greedy reasoning for "2+2" overran the token budget, so the
    gate reported "Empty output" for a model that answers correctly through apr serve.
    The GPU leg is now typed and can say Errored, Unclosed and NotRun distinctly.
    (#3724)
  • The ollama wire's delegation is asserted, not assumed. (#3715, reported by Alfredo)
  • FP8 prefill scaled per tensor, so one outlier collapsed a whole projection.
    E4M3 batched prefill used a per-tensor absmax (448/absmax), so a single outlier
    in ffn_down drove the rest of the tensor toward zero — near-orthogonal output, not
    precision drift. Now scaled per token and per channel. Measured after the fix on
    lambda (sm_89, FP8 still ON): qwen2.5-coder-0.5b answers correctly on both
    apr run --gpu and apr qa's golden GPU leg, and qwen2.5-coder-7b no longer needs
    its FP16 retry. (#3804)

CLI honesty

  • apr chat --no-gpu no longer uploads the model to CUDA, and --json names the backend
    it actually used. (#3794)
  • A bare apr run no longer pays 1.7 GB to initialise a backend it then rejects. (#3757)
  • apr code --output-format json writes exactly one JSON document on every exit path,
    including failures. (#3775)
  • A sampling flag given alone now samples, instead of being silently ignored because the
    other half of the pair was absent (DEFAULT_TOP_K). (#3754)
  • Seeded sampling is honoured on run over SafeTensors (#3760) and on serve for APR
    Q4_K GPU chat (#3786).

Documentation accuracy

  • The README claimed 110 CLI commands and cited apr --help as its source of truth —
    a command that prints 112, because it lists help itself. The registry says 111
    and grep -c '^ - name:' says 117. Three mechanisms answer the question and the
    published number matched none of them. Now 111, sourced from the registry, with both
    wrong counts named inline. The guard had been passing while printing this finding,
    which is why nobody had to act on it.
  • Contract census regenerated: 1830.

The comparators, and what a CRUX cell now has to say

  • A CRUX cell states its own coverage. A verdict read weeks later collapses to a
    colour, so each cell now carries quorum (how many engines answered, and which), a
    version per engine, and a subject record naming the model and apr version under
    test. A cell where only apr answered is UNJUDGED and can never be GREEN. The floor is
    deliberately asymmetric: RED needs one comparator, because "a comparator answered
    correctly and apr did not" is a complete claim and every way apr fails to answer is by
    construction a one-engine cell. A symmetric floor was tried first and suppressed
    seven legitimate REDs, among them "a missing apr row where llama.cpp is right is
    RED" — the rule CRUX exists to enforce — and "apr's degenerate !!!! is no answer:
    RED where llama.cpp answered", which is the same dead-logit output #3782 taught the
    golden gate to stop scoring as correct. The two fixes are one story: a model emitting
    ! must fail the gate that reads it and must not be excused by the gate that
    compares it. The fixtures caught the floor in one run; the rule was fixed, not the
    fixtures. (#3832, #3782)

  • "Not found" was two different facts wearing one string. An engine that did not run
    now records a classified reason, and not_on_PATH is distinct from
    binary_not_found_at_path. The live case: ssh lambda-labs llama-cli --version reports
    command not found while ~/.local/bin/llama-cli --version prints the pinned
    0.4.1-dev (build 10987, commit d1d3c3396) — lambda's non-interactive PATH has no
    ~/.local/bin and gx10's does. CRUX runs cross-host over ssh, so one string for both
    blames the comparator for the harness's mistake. Enforced by a mutant that collapses
    the two reasons and is detected.

    The classifier's own case table then caught a guard that could not fail, inside the
    guard written to catch guards that cannot fail
    : two of its patterns shipped with
    PATH capitalised while the haystack is lowercased, so they could never match. No
    reading would have found it; running the table found it on the first run. That is the
    release's theme in miniature — re-run the table, do not re-read the pattern.
    (#3832, #3831)

  • The comparator was four releases behind, and its version gate could not fail.
    ollama moved 0.33.2 → 0.34.2 on both hosts (paiml/infra#911). This is not hygiene:
    0.34.1 changed GGUF creation from safetensors, which is exactly the
    Modelfile FROM <path> mechanism CRUX uses to feed every engine the same file.
    Moving the pin exposed two gates that could not fail — one inverted, where
    ollama --version reports the daemon and names the client only in a mismatch
    warning, so grepping the output for the pin was satisfied by the upgrade being
    incomplete; and one blind, where the service check discarded /api/version's body,
    so the pin could never make the daemon drift. Verified after: ollama 0.34.2 imports and
    generates qwen3 and qwen35 GGUFs. (#3833, #3739)

  • llama.cpp was never broken on either host. A dead symlink into an unpinned
    checkout shadowed a working pinned build on lambda, and gx10's pinned build was
    reported "in progress" when it had been built and working the whole time. Both
    readings came from a PATH lookup mistaken for an install. (#3831)

Known issues

  • Qwen3.5-0.8B (Q4_K_M), thinking ON, greedy: the think block never closes on apr. A
    greedy near-tie path, with no localized defect found. It ships as a known RED, and
    apr now warns at load that this model is not CRUX-certified (#4032: d8a6df53a).
    Tracked in #4030 (0.71).
  • Qwen3.5-0.8B-UD-IQ2_XXS answers "2+2" wrong on BOTH apr and llama.cpp, using the
    official template. It is a RED-MODEL candidate (quantization damage), pending the
    logit-margin measurement. (#4004)
  • #4022 landed after the freeze, by operator override. aprender-mcp serves a
    caller-supplied ToolIndex, and the apr tools sit behind the default apr-tools feature
    (PMAT-3954: 3805a3371, 1eb1fe808). Its Cargo.lock delta is one dependency edge:
    aprender-mcp no longer depends on anyhow. It was not part of the frozen tree the sweep
    measured.
  • IQ3_S and IQ2_S CUDA GEMV kernels fail to load on compute capability ≥ 12 (GB10 sm_121,
    RTX 50xx sm_120), from a PTX patch-pass bug. apr fails closed: it runs on the CPU and says
    so in its provenance (fell_back: true), and a forced --gpu exits 14. No output is wrong,
    and no CRUX-certified model uses these types. The fix targets 0.70. (#4096)
  • apr code --thinking on refuses: apr serve has no thinking-ON path yet. (#3723)
  • Known gap: the apr capability verb has no book page in 0.69.1. apr capability --help
    and --json document it. The book's CLI parity check reads 112/113
    (FALSIFY-BOOK-CLI-PARITY-001: book/src/cli/capability.md does not exist). The chapter, its
    page contract and the SUMMARY entry land in the post-release follow-up (d5cecdee6).
  • apr serve's Ollama /api/generate accepts no context, so a multi-turn conversation
    cannot continue on that wire. /api/chat and /v1/chat/completions carry history.
    (#4025, 0.70)

Certification — operator emergency scope

This release was NOT gated by the full model ladder. By operator emergency scope, the
release gate is a CRUX smoke on both GPU hosts (lambda: RTX 4090, sm_89; gx10: GB10,
sm_121). The full model ladder moves to the nightly run and is not a precondition of
this tag. A model that is not in the list below has no release-time certification in
0.69.1.

Every number here comes from the release's own receipts for d8a6df53a.

  • CRUX smoke (apr vs llama.cpp, ollama, vLLM, hf; run / chat / serve / code;
    thinking off and on), lambda: 134/134 GREEN (lambda-gpu.json sha256 e803ffb9…). gx10: 134/134 GREEN (gx10-gpu.json sha256 95764d1f…).
    • Qwen3.5-2B-Q4_K_M: off 32/32 per host (thinking-on not admitted)
    • Qwen3.5-4B-Q4_K_M: off 32/32 + on 19/19 per host
    • Qwen3.5-4B-UD-Q4_K_XL: off 32/32 + on 19/19 per host
  • MoE: lambda 92/92 positions, cosine 1.000000; gx10 92/92 positions, cosine 1.000000 (plus 3/3 resident-MoE GPU parity tests at the #4046 head).
  • Full model ladder: nightly, after the tag. the full ladder moves to the nightly (aprender#4040); not run for this tag.

Closed by this release (32, from the #3988 triage, each on release/0.69.1-batch-2)

Issue Commit(s) What
#3571 2de6eabb1, 4e4fe772a, 6f2817ffe apr serve cannot load Qwen3.5 at all — 'Architecture qwen35 … runs through Qwen35Model'; goal A's floor and…
#3723 70d20d44c, 889d49a0f, 5991a588f apr has NO thinking toggle: realizar hard-routes every Qwen3/Qwen3.5 to the no-think template (chat_templat…
#3724 b4701dcd9 qwen3-8b-q4km golden_output 'Empty output' on lambda: the gate ran Qwen3 in thinking mode no production pat…
#3726 9684a7a41, 43f25da06 apr's byte-level BPE tokenizer is non-canonical: every non-ASCII byte → id 0, ASCII segmented unlike llama.…
#3742 9684a7a41 tokenizer parity: the APR/HF encode paths are sibling copies #3726 did not touch — aprender-core BpeTokeniz…
#3743 3fe9a6cff apr run --prompt P --chat templates the prompt TWICE: the CLI wraps it in ChatML, then realizar applies the…
#3750 efe74818d, 01989323d apr qa's capability predicates std::fs::read the WHOLE model (twice, plus a to_vec copy) — RSS swings past…
#3754 9f8836c71 apr run --temperature T is silently GREEDY: --top-k defaults to 1, so a sampling flag given alone has no ef…
#3755 5991a588f Qwen3/3.5 no-think prompts are built from a HAND-CODED scaffold that differs from the model's own template…
#3757 d50655504 Published apr 0.68.2: default apr run picks wgpu, dequantizes 1.7 GB to F32, then REJECTS its own result…
#3760 8b06a012f SafeTensors run and every AprTransformer caller never sample: run .safetensors is hard-greedy (CPU) / takes…
#3769 a3a9b9965, ee080029c, ff4bf8e0f post-release ALWAYS updates README.md and apr-cookbook with SHACL-validated recipes — rendered from the rel…
#3775 defe10bbf, 4ca7fdcc9 apr code -p --output-format json prints NO JSON envelope on a driver error (rc 1, stderr only) — a machine…
#3782 f7a8e65ac apr qa golden_output: the greeting case's "!" pattern scores degenerate output ("!!!!", token id 0) as correct
#3785 0c85942dd, 2b64c7f0e FP8 batched prefill diverges on sm_121 (GB10): qwen2.5-coder-7b BATCHED_PREFILL=1 fails F2 at pos 1 (cos 0.…
#3786 d9ba90cff serve APR Q4K GPU chat samples with a wall-clock-hash RNG: seed does nothing, sampled output is unreprodu…
#3791 a6b69411f, 6f2817ffe APR Q4K GPU serve path (ALB-095) emits garbage: 'HHHH…' for every seed at T=0.8, Invalid token ID 151935 (v…
#3794 9ee0888b7 apr chat --no-gpu still uploads the GGUF to CUDA (VRAM held outside the GPU lock), and apr chat reports no…
#3801 24ffd4552 Thinking ON under greedy decoding never closes on Qwen3.5 0.8B/2B (and 4B in apr code): think-budget guard…
#3804 2b64c7f0e qwen2.5-coder-0.5b-instruct Q4_K_M: CUDA golden output is gibberish (CPU passes) — on main, found by the #3…
#3807 2b64c7f0e, 0c85942dd FP8 prefill recipe zeroes activations (per-batch E4M3 scale × subnormal flush-to-zero): qwen2.5-coder-7b `a…
#3815 3a5bc6d3e DecisionTreeClassifier split-finding is O(n² × features) per node — blocks training past ~100k rows
#3816 3a5bc6d3e RandomForestClassifier::fit/predict fixes (sequential training, O(n² × trees) predict) are written but unco…
#3817 a5024aa72 apr run --gpu on qwen3moe Q4_K_M silently falls back to CPU (rc 14) instead of refusing by name — 0.69.1 mu…
#3828 16ca36fc6, 5823012a7 P0: the release gate's verb dimension computes over ONE verb — the ladder never runs serve, chat or code, a…
#3842 610942945, b026cdc03 A ladder receipt that cannot name its own red: gx10 says red=3 with 2 reds in rows, and the failed REQUIRED…
#3843 b026cdc03 The code verb has never been measured by the ladder — 48/48 cells rc=2, a clap usage error recorded as a…
#3849 5593c2037 FALSE RED: qwen35-27b-q4km passes every gate and the ladder reports it red — the row builder crashes on a…
#3875 24f9bb212 /v1/completions returned 503 for the ENTIRE Qwen3.5 architecture — the completions chain had no arm for it
#3880 530e69e19 WITHDRAWN: cop ruling on five non-Q4_K ladder rows — refuted; the deferral mechanism has no cause key (what…
#3881 b73b49d73 apr chat requires an external .tokenizer.json that apr run does not — and reports its absence as Inva…
#3885 a8d63e09d, 0a7067391 apr serve admits a non-Q4K .apr into the Q4K pool path and fails at prefill — the load-time rejection its f…

Release-night gate record (cop, 2026-09-23)

  • Gate scope: OPERATOR EMERGENCY SCOPE, CRUX smoke only. The operator's words: "for this particular release we need emergency surgery. after a binary is build we really only care about CRUX on gx10 and lambda (but "smoke test") style. anything huge, must be nightly only". Judge rc 0, crux-smoke-judge.out sha256 c72932f9…
  • Pre-publish dogfood: NO-GO on exactly 4 known-red rows, adjudicated (receipt-…-ADJUDICATED.json, verdict_basis "NOT a green dogfood"):
    • #4086 ladder scope and #4085 claim literals: operator selection "Ship now as known failures";
    • #4101 pmat-comply CB-200: operator's words "bypass pmat comply and push to .7";
    • #4099 bashrs SEC001/SEC010 ×8 in scripts/: a cop ruling extending that selection; the same findings are suppressed with reasons on main via #4046.
  • Publish preflight seams:
    • R4 via ancestry of the release-to-main PR head (the release was published before that PR merged, operator: "move this release to crates.io");
    • R5 via the adjudicated receipt;
    • R7 via r7_scope_judge-v2.sh (sha256 d09ccd10…).
  • Known issues:
    • #4030 Qwen3.5-0.8B thinking-on (a load warning ships, #4032);
    • #4004 IQ2_XXS 0.8B (RED-MODEL);
    • #4096 IQ2-S/IQ3-S CUDA kernels fail closed on compute capability ≥12 (no certified model affected);
    • the book lacks an apr capability chapter (follow-up PR).