Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
621 commits
Select commit Hold shift + click to select a range
c8afe2b
Merge remote-tracking branch 'origin/feat/3950-iq2xxs-gemv-admission'…
noahgift Sep 23, 2026
65ab14c
fix(serve): cuda builds refused ignore_eos for EVERY model; trace-com…
noahgift Sep 23, 2026
0d000a7
feat(gpu): prove a GPU receipt had the card to itself, or refuse it (…
noahgift Sep 23, 2026
4610756
feat(cuda): IQ2_S (ggml 22) GEMV, exact on every real shape — NOT whi…
noahgift Sep 23, 2026
171d25f
docs(#3953): IQ2_S GEMV implementation receipt
noahgift Sep 23, 2026
f987298
PMAT-3952: batch mode — one engine load per gen-batch call in both so…
noahgift Sep 23, 2026
3abc848
Merge remote-tracking branch 'origin/fix/3956-cuda-feature-tests' int…
noahgift Sep 23, 2026
204abee
feat(gpu): prove a GPU receipt had the card to itself, or refuse it (…
noahgift Sep 23, 2026
3e58940
fold(#3714): qwen3moe CUDA forward into 0.69.1 — conflicts resolved k…
noahgift Sep 23, 2026
4cb1cc1
fix(qa,ship-006): apr qa publishes its gate REGISTRY; SHIP-006 judges…
noahgift Sep 23, 2026
3c72e94
Merge remote-tracking branch 'origin/fold/3714-moe-into-0.69.1' into …
noahgift Sep 23, 2026
3cc4c3c
fix(coverage): skip by EXACT test path from a reasoned list, not 19 s…
noahgift Sep 23, 2026
b3e0f64
fix(crux): a cell is GREEN only under a correct oracle -- no UNJUDGED…
noahgift Sep 23, 2026
1f27365
fix(crux): budgets 1024 off / 4096 on — at 128 the 2B wrote right ans…
noahgift Sep 23, 2026
65baa3e
Merge remote-tracking branch 'origin/d8/qa-skip-not-pass-3965' into r…
noahgift Sep 23, 2026
237508b
feat(crux): hf/vllm certification legs use gen-batch — one engine loa…
noahgift Sep 23, 2026
8469827
feat(crux): v2 drift check vs golden_output.rs; admissions keyed by q…
noahgift Sep 23, 2026
f3f00af
Merge fix/3957-gate-hardening (F6) into PMAT-3952-crux-vllm-judge — t…
noahgift Sep 23, 2026
2c49324
fix(crux): the runner exits through finally on SIGTERM, so a stopped …
noahgift Sep 23, 2026
02cf5df
feat(crux): serve over EVERY route apr mounts + the code verb, with m…
noahgift Sep 23, 2026
a2833e4
fix(coverage): never mv ~/.cargo/config.toml; exact-skip the zram tim…
noahgift Sep 23, 2026
fde9718
Merge branch 'release/0.69.1-batch-2' of github.com:paiml/aprender in…
noahgift Sep 23, 2026
958c680
PMAT-3952: `serve stream` verb in both source-weight drivers — a stre…
noahgift Sep 23, 2026
9ce6080
test(cuda): must-RED for #3975 — every gemm caller pinned at m=1 and …
noahgift Sep 23, 2026
192898d
feat(crux): default to prompt-set v2 when present; hand the judge its…
noahgift Sep 23, 2026
7b8aa7e
chore(roadmap): PMAT-3957 entry, so the quorum can read the ticket (#…
noahgift Sep 23, 2026
8174986
Merge remote-tracking branch 'origin/PMAT-3952-crux-vllm' into PMAT-3…
noahgift Sep 23, 2026
9ad12b3
Merge remote-tracking branch 'origin/fix/3957-gate-hardening' into PM…
noahgift Sep 23, 2026
e085b22
roadmap: PMAT-3952 fragment for the fold, and roadmap.yaml regenerate…
noahgift Sep 23, 2026
6e294e1
feat(crux): plugins answer 'serve stream' too, so every apr stream ce…
noahgift Sep 23, 2026
18af204
WIP(#3970): guards iterate all 26 Q4_K/Q6_K strategy GEMV kernels; ex…
noahgift Sep 23, 2026
9746f9f
fix(#3948): the thinking-ON judge passed an EMPTY think block — it co…
noahgift Sep 23, 2026
a40ba9f
Merge remote-tracking branch 'origin/fix/3957-gate-hardening' into re…
noahgift Sep 23, 2026
fec2da7
fix(crux): an unclosed think on hf/vLLM reads as unclosed; receipt re…
noahgift Sep 23, 2026
41ec7e1
feat(ladder): RED-MODEL and RED-UNSUPPORTED verdicts, admitted only w…
noahgift Sep 23, 2026
5f9d213
fix(apr code): pass the serve backend through, add --max-tokens and -…
noahgift Sep 23, 2026
915b8e9
fix(qa): the thinking-ON leg judges its OWN backend, needs real reaso…
noahgift Sep 23, 2026
60cdcdd
Merge remote-tracking branch 'origin/feat/3962-crux-prompt-certificat…
noahgift Sep 23, 2026
0595bc7
fix(ladder): F10 judges GENERATED bytes, not stdout -- the live refus…
noahgift Sep 23, 2026
2892217
fix(cuda): #3976 — delete the unwired FusedKVHwDp4aQ4KGemv launcher; …
noahgift Sep 23, 2026
c4d8b28
Merge remote-tracking branch 'origin/fix/3976-q4k-gemv-kernel-defects…
noahgift Sep 23, 2026
64af683
test(#3953): IQ2_S decoder proven against gguf-py on every real type-…
noahgift Sep 23, 2026
ea60d1a
PMAT-3952: quorum receipt for fold2@e085b2211 — 3/3 PASS, partial (la…
noahgift Sep 23, 2026
0ea3616
Merge remote-tracking branch 'origin/PMAT-3952-crux-fold2' into relea…
noahgift Sep 23, 2026
9118964
fix(apr code): name the thinking flag --thinking on|off, as apr run/c…
noahgift Sep 23, 2026
75626ea
fix(gpu): gpu_exclusive_run honours a lock its ANCESTOR holds — wrapp…
noahgift Sep 23, 2026
3f39651
fix(cuda): gemm takes its weight layout explicitly — `gemm` is [k,n] …
noahgift Sep 23, 2026
d984982
fix(crux): judge joins for the #3962 producers -- per-route cells, na…
noahgift Sep 23, 2026
66c9113
Merge remote-tracking branch 'origin/fix/3964-exclusive-run-honours-a…
noahgift Sep 23, 2026
9c689c4
chore(cuda): delete orphan cuda/generate.rs; repoint FUSION-006/007/0…
noahgift Sep 23, 2026
b319aeb
Merge remote-tracking branch 'origin/release/0.69.1-batch-2' into fix…
noahgift Sep 23, 2026
06f32ce
WIP fix(f2): F2 is tri-state — Validated / Mismatch / NotMeasured{rea…
noahgift Sep 23, 2026
a9d395c
Merge remote-tracking branch 'origin/d8/f2-tri-state-3973' into fix/3…
noahgift Sep 23, 2026
1feda2a
test(cuda): GemmBtTiled PTX names its entry and assembles under ptxas…
noahgift Sep 23, 2026
70d20d4
feat(cli): `apr run/chat --thinking on|off` -- a thinking-ON greedy r…
noahgift Sep 23, 2026
6e1c078
#3964: the lock check also proves every ollama load carries keep_aliv…
noahgift Sep 23, 2026
ce1c52e
#3957 F9: CRUX greedy rows — apr and llama.cpp greedy ids on the iden…
noahgift Sep 23, 2026
4aa06f1
test(crux): the greedy receipt carries raw ids keyed by thinking, and…
noahgift Sep 23, 2026
15e8b0d
feat(cuda): IQ3_XXS GEMV kernel + real-bytes evidence at every shape,…
noahgift Sep 23, 2026
9734142
#3957 F9: apr ON greedy when apr has `run --thinking`, and llama.cpp …
noahgift Sep 23, 2026
a8621db
feat(crux): --cap-on N caps thinking-ON budgets uniformly across engi…
noahgift Sep 23, 2026
95900a2
feat(ladder): a RED-MODEL key may scope its claim to named prompts (#…
noahgift Sep 23, 2026
cd5e502
merge feat/3953-iq2s-gpu-gemv (f5) into the combined admission fold (…
noahgift Sep 23, 2026
7cfef06
fix(chat): #3955 — the APR CUDA banner names the loaded qtypes and th…
noahgift Sep 23, 2026
09c7451
merge feat/3963-iq3xxs-gpu-gemv into the combined admission fold (#3963)
noahgift Sep 23, 2026
546af34
test(qa): pin that an UNCLOSED think block is never reported "closed …
noahgift Sep 23, 2026
d1d229c
fix(gpu): AprF32ToGpuAdapter and batch.rs follow the LmHeadWeight new…
noahgift Sep 23, 2026
053e53e
fix(crux): a cell proves its servers are gone, from ps AND nvidia-smi…
noahgift Sep 23, 2026
54132a0
evidence(crux): #3962 producer receipt — code 4/4 executed; serve ove…
noahgift Sep 23, 2026
42ecf1e
test(#3960): the Q2_K CPU decoder, proven against gguf-py before it m…
noahgift Sep 23, 2026
5383a09
feat(cuda): Q2_K (ggml 10) GEMV, on every real shape — NOT whiteliste…
noahgift Sep 23, 2026
668346f
docs(#3960): Q2_K GEMV implementation receipt
noahgift Sep 23, 2026
d273c78
#3957 F9: apr's `-v` stdout has `verbose:` lines before its JSON — th…
noahgift Sep 23, 2026
b8101dc
fix(serve): every router advertises exactly what it mounts, and every…
noahgift Sep 23, 2026
2fe5858
fix(coverage): --ignore-run-fail, failing tests LISTED, and "did not …
noahgift Sep 23, 2026
3d16c4c
docs(roadmap): PMAT-3839 entry for the quorum
noahgift Sep 23, 2026
82fe6a7
docs(readme): regenerate the release matrix from the committed ladder…
noahgift Sep 23, 2026
2636c4a
Merge remote-tracking branch 'origin/d8/serve-index-terminal-3979' in…
noahgift Sep 23, 2026
62ca0bd
Merge remote-tracking branch 'origin/fix/3978-apr-code-backend-flags'…
noahgift Sep 23, 2026
b76994f
Merge remote-tracking branch 'origin/chore/delete-orphan-cuda-generat…
noahgift Sep 23, 2026
dab83d1
feat(crux): a non-ASCII certified prompt (water -> 水) so the prompt s…
noahgift Sep 23, 2026
47fc13b
wip(#3990): official renderer + llama.cpp oracle tests — restore point
noahgift Sep 23, 2026
c4f092a
feat(ladder): F9 demands the defect on the model's OFFICIAL template,…
noahgift Sep 23, 2026
286d799
#3957 F9: two llama.cpp rows per (prompt, thinking) — engine parity o…
noahgift Sep 23, 2026
0a64637
check_crux_greedy_rows: two strings read as a bare apr invocation ('|…
noahgift Sep 23, 2026
e29c55a
fix(#3987): qwen3moe chat/serve/code on CUDA go through the ONE dispa…
noahgift Sep 23, 2026
36e7e65
fix(guard): validate the self-test temp dir before rm -rf (bashrs SEC…
noahgift Sep 23, 2026
836956b
receipt(f2): #3973 tri-state verified on device; the full-sweep failu…
noahgift Sep 23, 2026
2ac0f18
#3957 F9: greedy raw records prompt_opens_think — Qwen3.5's official …
noahgift Sep 23, 2026
8d7cb1c
contracts(thinking-budgets): the 0.8B-Q4_K_M empty think block is NOT…
noahgift Sep 23, 2026
d9110ca
CRUX drivers: Qwen3.5's official ON template prefills <think> — hf/vl…
noahgift Sep 23, 2026
28b0874
test(qa): serialize the thinking-budget tests on the process-global e…
noahgift Sep 23, 2026
7423f55
Merge remote-tracking branch 'origin/fix/3975-qkv-divergence' into re…
noahgift Sep 23, 2026
be60095
Merge remote-tracking branch 'origin/d8/f2-tri-state-3973' into relea…
noahgift Sep 23, 2026
4e85376
Merge remote-tracking branch 'origin/fix/3955-chat-banner-derived' in…
noahgift Sep 23, 2026
b044400
Merge remote-tracking branch 'origin/fix/3957-f9-f10' into fix/3957-g…
noahgift Sep 23, 2026
5aca571
test(3990): TinyLlama oracle cells make trim/lstrip_blocks + eos load…
noahgift Sep 23, 2026
7a21e13
fix(serve): the APR-GPU router advertises exactly what it mounts (#3979)
noahgift Sep 23, 2026
4ce169a
Merge remote-tracking branch 'origin/d8/serve-index-terminal-3979' in…
noahgift Sep 23, 2026
5a0b91f
merge feat/3960-q2k-gpu-gemv (f5) into the combined admission fold (#…
noahgift Sep 23, 2026
ddd398d
fix(crux): refuse pre-#3990 thinking-ON hf/vLLM rows; read raw_text w…
noahgift Sep 23, 2026
6bde9a2
feat(gguf): admit IQ2_S (22), IQ3_XXS (18) and Q2_K (10) to the GPU w…
noahgift Sep 23, 2026
85bbf00
wip(#3990): official renderer + llama.cpp oracle tests — restore point
noahgift Sep 23, 2026
e8570f6
test(3990): TinyLlama oracle cells make trim/lstrip_blocks + eos load…
noahgift Sep 23, 2026
846fbfd
Merge remote-tracking branch 'origin/release/0.69.1-batch-2' into fea…
noahgift Sep 23, 2026
8fd9f97
fix(guard): the lifted row builder takes the producer's 9th argument …
noahgift Sep 23, 2026
a00d29f
fix(#3987): read the architecture through the public config() accessor
noahgift Sep 23, 2026
ec41178
fix(serve): #3991 — every generation route GET / lists must generate;…
noahgift Sep 23, 2026
253bf1f
merge release/0.69.1-batch-2 (4ce169a4d) into #3949: a failed serve p…
noahgift Sep 23, 2026
186e569
Merge remote-tracking branch 'origin/fix/3943-serve-probe-carries-its…
noahgift Sep 23, 2026
6093c54
feat(3990): serve renders the GGUF's own chat_template (openai, cuda …
noahgift Sep 23, 2026
9f14dce
chore(3990): Cargo.lock for minijinja's json feature
noahgift Sep 23, 2026
e352aea
CRUX drivers: a stopped driver takes its engine with it — SIGTERM lef…
noahgift Sep 23, 2026
93a8388
Merge branch 'release/0.69.1-batch-2' of github.com:paiml/aprender in…
noahgift Sep 23, 2026
3092069
Merge remote-tracking branch 'origin/fix/3957-gate-hardening' into re…
noahgift Sep 23, 2026
76a73bd
Merge remote-tracking branch 'origin/fix/3990-chat-template-fidelity'…
noahgift Sep 23, 2026
a783015
#3957 F9: greedy rows for 4 Qwen3.5 models, lambda GPU — on the offic…
noahgift Sep 23, 2026
b29ed72
fix(tokenizer): SPM encode splits specials by tokenizer.ggml.token_ty…
noahgift Sep 23, 2026
3803d55
Merge branch 'fix/3993-spm-control-tokens' into fix/3993-unpin-3990-o…
noahgift Sep 23, 2026
c6b27cf
Merge remote-tracking branch 'origin/release/0.69.1-batch-2' into fix…
noahgift Sep 23, 2026
7d2bd60
test(3990): unpin TinyLlama, #3993 makes its 4 id cells EQUAL llama.cpp
noahgift Sep 23, 2026
4a1e7a1
Merge remote-tracking branch 'origin/PMAT-3839-coverage-skip-substrin…
noahgift Sep 23, 2026
a9a59be
feat(3990): apr code renders the GGUF's own chat_template; default th…
noahgift Sep 23, 2026
126b72e
chore(3990): Cargo.lock for minijinja's json feature
noahgift Sep 23, 2026
5991a58
feat(run,chat): render the model's OWN chat template on every path, d…
noahgift Sep 23, 2026
82e4a22
test(cuda): GemmBtTiled ptxas check falls back past archs this ptxas …
noahgift Sep 23, 2026
0c4c5c1
fix(qa): the golden thinking-ON leg renders the model's OWN template,…
noahgift Sep 23, 2026
a76a890
style(serve): rustfmt the three files 6093c5416 (#3990) left unformatted
noahgift Sep 23, 2026
07d4f5b
Merge branch 'release/0.69.1-batch-2' of github.com:paiml/aprender in…
noahgift Sep 23, 2026
dd0ac48
Merge remote-tracking branch 'origin/fix/3991-serve-dead-gguf-routes'…
noahgift Sep 23, 2026
e1f29b9
feat(3990): apr qa golden default leg asks in the GGUF's own chat_tem…
noahgift Sep 23, 2026
165578f
style: cargo fmt (#3990)
noahgift Sep 23, 2026
5bb81ae
Merge remote-tracking branch 'origin/fix/3975-ptxas-target-portable' …
noahgift Sep 23, 2026
c614792
test(contracts): #3985 — every ACTIVE kernel-fusion call_site must be…
noahgift Sep 23, 2026
5bd4bd2
PMAT-3952/PMAT-3957: take the quorum's three technical findings on gr…
noahgift Sep 23, 2026
5bb3d5e
Merge remote-tracking branch 'origin/fix/3985-fusion-call-site-guard'…
noahgift Sep 23, 2026
0b32c36
feat(3990): SafeTensors tokenizer_config.json renderer; qa golden Saf…
noahgift Sep 23, 2026
4f7a1c9
test(cuda): every_emitted_kernel_assembles falls back past archs ptxa…
noahgift Sep 23, 2026
0a537d2
Merge commit '4ce169a4d' into fix/3990-chat-template-fidelity
noahgift Sep 23, 2026
e2dd77e
contracts(fusion): repoint FUSION-006/007/009/010 call_sites after to…
noahgift Sep 23, 2026
3efe6ef
Merge remote-tracking branch 'origin/fix/3957-gate-hardening' into re…
noahgift Sep 23, 2026
c57d07a
test(3990): the OpenAI chat handler tokenizes the GGUF's own template…
noahgift Sep 23, 2026
8694e6b
Merge remote-tracking branch 'origin/fix/3477-ptxas-target-portable' …
noahgift Sep 23, 2026
04d3d7d
fix(run): tok_per_sec is a GENERATION rate; setup (upload + F2) is re…
noahgift Sep 23, 2026
2523b0f
Merge remote-tracking branch 'origin/d8/tok-per-sec-3981' into releas…
noahgift Sep 23, 2026
0abb348
PMAT-3952/PMAT-3957: quorum round 2 on greedy2 — the TEST HARNESS its…
noahgift Sep 23, 2026
578a305
docs(3990): receipt — 16-cell llama.cpp oracle, entry points, mutants…
noahgift Sep 23, 2026
df79132
feat(ladder): F9 `wrong_answer` model-defect class -- a near-tie dive…
noahgift Sep 23, 2026
91ee66b
Merge commit '578a30580' into fold/3990-template-chain
noahgift Sep 23, 2026
4dccb11
Merge commit '165578f17' into fold/3990-template-chain
noahgift Sep 23, 2026
324c3ca
Merge commit '7d2bd60bb' into fold/3990-template-chain
noahgift Sep 23, 2026
3325f0f
contract(ladder): IQ2_XXS wrong_answer red_model key, inert until a s…
noahgift Sep 23, 2026
889d49a
fix(3990): apr run's GGUF prompt honours --thinking via official_or_l…
noahgift Sep 23, 2026
cfab6b6
Merge commit '3325f0f40' into fold/3990-template-chain
noahgift Sep 23, 2026
40ae453
feat(ladder): F9 wrong_answer parity is CALIBRATED per sweep against …
noahgift Sep 23, 2026
da04c6c
Merge commit '40ae453c7' into fold/3990-template-chain
noahgift Sep 23, 2026
292645e
feat(crux): admitted_by_sha_thinking — admission per thinking mode, s…
noahgift Sep 23, 2026
5b140e8
Merge remote-tracking branch 'origin/fix/3987-moe-chat-serve-cuda' in…
noahgift Sep 23, 2026
4ca7781
fix(cuda): #3992 — the dense CUDA constructors refuse a Mixture-of-Ex…
noahgift Sep 23, 2026
70ac6b2
fix(ladder): an apr GPU-lane greedy row must prove it RAN on the GPU …
noahgift Sep 23, 2026
460dd06
Merge remote-tracking branch 'origin/fix/3992-moe-dense-cuda-refusal'…
noahgift Sep 23, 2026
9550076
feat(ladder): F9 wrong_answer calibrates apr's CPU/GPU split against …
noahgift Sep 23, 2026
710affc
Merge commit '95500761e' into fold/3990-template-chain
noahgift Sep 23, 2026
1807ca9
Merge commit '460dd0613' into fold/3990-template-chain
noahgift Sep 23, 2026
80bd6a1
PMAT-3957 F9: an apr row that did not run on its lane is refused, and…
noahgift Sep 23, 2026
baef5e9
fix(4007): serve's template never comes from the client's "model" string
noahgift Sep 23, 2026
36efbb1
fix(run): #4006 — `quant=` names the GGUF body's qtypes (from the hea…
noahgift Sep 23, 2026
19ba9e8
Merge remote-tracking branch 'origin/fix/4006-quant-label-body' into …
noahgift Sep 23, 2026
b8c73cb
chore(guard): the 17 known-unrouted dense sites are AUDITED now that …
noahgift Sep 23, 2026
9684a7a
test(tokenizer): non-ASCII ids equal llama-tokenize on every tokenize…
noahgift Sep 23, 2026
e4fe720
Merge remote-tracking branch 'origin/chore/3992-moe-guard-audited' in…
noahgift Sep 23, 2026
43f25da
Merge remote-tracking branch 'origin/fix/4005-tokenizer-nonascii-pari…
noahgift Sep 23, 2026
29d67da
Merge remote-tracking branch 'origin/fold/3990-template-chain' into r…
noahgift Sep 23, 2026
34a1e07
Merge remote-tracking branch 'origin/crux-3962-code-serve-producer' i…
noahgift Sep 23, 2026
c69856c
Merge remote-tracking branch 'origin/PMAT-3952-crux-greedy2' into PMA…
noahgift Sep 23, 2026
c08437c
refactor(infer): SafeTensors renders through the ONE tokenizer_config…
noahgift Sep 23, 2026
d19cde0
fix(crux): admission is per THINKING MODE when the certification says…
noahgift Sep 23, 2026
8bf749b
fix(run): #4006 follow-up — the three hardcoded GPU/APR `quant=` labe…
noahgift Sep 23, 2026
13a108e
fix(crux): a lane needs ONE certified control per (thinking, verb); c…
noahgift Sep 23, 2026
7b62f2b
Merge remote-tracking branch 'origin/fold/3990-template-chain' into r…
noahgift Sep 23, 2026
dac4d9a
Merge remote-tracking branch 'origin/fix/3957-admission-per-thinking'…
noahgift Sep 23, 2026
c4029e2
Merge remote-tracking branch 'origin/fix/4006b-gpu-quant-labels' into…
noahgift Sep 23, 2026
feb5ac9
evidence(crux): 0.69.1 prompt certification receipt, interim, with th…
noahgift Sep 23, 2026
8624882
#3962 G2: the CRUX dogfood judges every verb in each thinking mode — …
noahgift Sep 23, 2026
342c311
merge release/0.69.1-batch-2 (c4029e29b) into the #3962 producer — ke…
noahgift Sep 23, 2026
325e818
fix(guard): check_dogfood_no_defer is cargo-free, so CI's guard_tree …
noahgift Sep 23, 2026
b1d0f53
Merge remote-tracking branch 'origin/fix/4005-wire-guard' into releas…
noahgift Sep 23, 2026
9beedec
#3962: --only-prompts runs a subset FROM the certified prompt file — …
noahgift Sep 23, 2026
5cfa966
fix(guard): a gate declared in [package.metadata.dogfood] is wired by…
noahgift Sep 23, 2026
9b2fddc
PMAT-3952/PMAT-3957: quorum round 4 on greedy2 — the evidence predate…
noahgift Sep 23, 2026
486cc9d
Merge remote-tracking branch 'origin/PMAT-3952-crux-greedy2' into PMA…
noahgift Sep 23, 2026
ebf1756
Merge remote-tracking branch 'origin/fix/4005-dogfood-gates-wired' in…
noahgift Sep 23, 2026
2cb1d31
fix(crux): the chat pty helper applies backspaces, so llama.cpp's spi…
noahgift Sep 23, 2026
e8685f4
fix(crux): thinking-ON reasoning is never judged as the answer -- re-…
noahgift Sep 23, 2026
1094412
Merge remote-tracking branch 'origin/fix/crux-b2-thinking-on-parse' i…
noahgift Sep 23, 2026
e166a91
Merge remote-tracking branch 'origin/crux-3962-code-serve-producer' i…
noahgift Sep 23, 2026
f7614b2
fix(gguf): uncached batch_matmul_gpu reads the dequantized [out,in] w…
noahgift Sep 23, 2026
a299890
fix(serve): qwen3moe stream=true streamed on the CPU, and the live st…
noahgift Sep 23, 2026
738d247
Merge remote-tracking branch 'origin/fix/3975-uncached-batch-matmul-l…
noahgift Sep 23, 2026
365b04c
fix(3990): apr chat's banner names the template actually rendered and…
noahgift Sep 23, 2026
66c0b38
crux(B1): pin a bf16 source for every GGUF the ladder holds on lambda…
noahgift Sep 23, 2026
230b96a
Merge remote-tracking branch 'origin/fold/3990-template-chain' into r…
noahgift Sep 23, 2026
580040f
evidence(crux): 0.69.1 prompt certification receipt, FINAL for the fr…
noahgift Sep 23, 2026
295d000
Merge remote-tracking branch 'origin/feat/3962-crux-prompt-certificat…
noahgift Sep 23, 2026
13e6304
Merge remote-tracking branch 'origin/feat/3962-crux-prompt-certificat…
noahgift Sep 23, 2026
5354179
Merge remote-tracking branch 'origin/crux/b1-hf-sources' into PMAT-39…
noahgift Sep 23, 2026
f53d219
fix(crux): B2 measures the RAW byte length of apr's logged prompt, no…
noahgift Sep 23, 2026
5da9173
contract(ladder): #4004 key claims the certified v2 control ctl-2plus…
noahgift Sep 23, 2026
f4afb16
Merge commit '5da9173f5' into fold/3990-template-chain
noahgift Sep 23, 2026
5077ee3
Merge remote-tracking branch 'origin/fix/crux-b2-thinking-on-parse' i…
noahgift Sep 23, 2026
94c3a8b
Merge remote-tracking branch 'origin/fold/3990-template-chain' into r…
noahgift Sep 23, 2026
53d6833
Merge remote-tracking branch 'origin/fix/3987b-moe-stream-dispatch' i…
noahgift Sep 23, 2026
5593511
Merge remote-tracking branch 'origin/PMAT-3962-crux-v2-sweep' into re…
noahgift Sep 23, 2026
3d41a98
fix(crux): B2 treats a logged prompt within 3 bytes of the 200-byte c…
noahgift Sep 23, 2026
a311a1c
Merge remote-tracking branch 'origin/fix/crux-b2-thinking-on-parse' i…
noahgift Sep 23, 2026
059a887
Merge remote-tracking branch 'origin/fix/crux-b2-thinking-on-parse' i…
noahgift Sep 23, 2026
ea70c7a
CRUX hf driver: `transformers serve` needs torchvision + pillow for a…
noahgift Sep 23, 2026
d89f4d9
crux(B4): each apr serve route is judged against the comparator route…
noahgift Sep 23, 2026
be8ab41
#3962 final sweep: crux_sweep_shards.sh — one command per host, each …
noahgift Sep 23, 2026
2017726
Merge remote-tracking branch 'origin/PMAT-3962-crux-v2-sweep' into re…
noahgift Sep 23, 2026
90e0989
crux(B4): plugin serve-stream rows control apr's stream route cells; …
noahgift Sep 23, 2026
cdd98aa
Merge remote-tracking branch 'origin/fix/b4-crux-route-oracle-map' in…
noahgift Sep 23, 2026
8df47be
fix(serve,cli): log lines cut text at a CHAR BOUNDARY -- `apr run -v`…
noahgift Sep 23, 2026
17e5c88
Merge remote-tracking branch 'origin/fix/4018-char-boundary-slices' i…
noahgift Sep 23, 2026
b7de8be
fix(serve): the 5 realizar raw routes answered 503 on every Qwen3.5 m…
noahgift Sep 23, 2026
013bd11
#4004/#3962: crux_sweep_shards --greedy-only — the CPU-lane F9 refere…
noahgift Sep 23, 2026
7168e4b
Merge remote-tracking branch 'origin/PMAT-3962-crux-greedy-only' into…
noahgift Sep 23, 2026
09ea084
feat(ladder): a GREEDY-ONLY CRUX receipt is F9 evidence, not a lane v…
noahgift Sep 23, 2026
5c18bb1
Merge commit '09ea08424' into fold/3990-template-chain
noahgift Sep 23, 2026
c6c69bc
Merge remote-tracking branch 'origin/fix/3957-f9-f10' into release/0.…
noahgift Sep 23, 2026
062de0d
test(serve): every Qwen3.5 raw route answers what apr run answers; no…
noahgift Sep 23, 2026
40bd06c
#4004: a --greedy-only receipt is marked `greedy_only: true`, has no …
noahgift Sep 23, 2026
6a2925b
Merge remote-tracking branch 'origin/fix/qwen35-raw-routes' into rele…
noahgift Sep 23, 2026
6614861
Merge remote-tracking branch 'origin/PMAT-3962-crux-greedy-only-2' in…
noahgift Sep 23, 2026
b315189
Merge remote-tracking branch 'origin/fold/3990-template-chain' into r…
noahgift Sep 23, 2026
c619ddd
fix(serve): /stream/generate and /realize/generate split multi-byte c…
noahgift Sep 23, 2026
a05ebc7
fix(chat): whitespace is content -- apr chat no longer collapses inde…
noahgift Sep 23, 2026
04655b8
fix(crux): the code cell's llama/ollama rows are serve JSON, not llam…
noahgift Sep 23, 2026
1d99184
feat(3723): apr serve takes a per-request thinking toggle (chat_templ…
noahgift Sep 23, 2026
70bac4c
fix(crux): a multi-turn prompt is never driven on /api/generate, whic…
noahgift Sep 23, 2026
1513967
Merge remote-tracking branch 'origin/fix/crux-code-comparator-parse' …
noahgift Sep 23, 2026
92fa12c
feat(3723): apr code --thinking on passes through to apr serve instea…
noahgift Sep 23, 2026
3e0a349
fix(chat): model output is printed VERBATIM -- no punctuation rewrite…
noahgift Sep 23, 2026
e64b44e
fix(3723): apr-cli dispatch sets ServeLaunchOptions.think
noahgift Sep 23, 2026
2d78852
Merge remote-tracking branch 'origin/fix/chat-whitespace-sweep' into …
noahgift Sep 23, 2026
130cb7a
fix(ladder): a write the ladder cannot make is a DECLINE (rc 2, no re…
noahgift Sep 23, 2026
de869ba
#3962 final sweep: the merged receipt's meta is the UNION of every sh…
noahgift Sep 23, 2026
aef640e
Merge remote-tracking branch 'origin/d8/ladder-write-errors-fail' int…
noahgift Sep 23, 2026
de18a1b
Merge remote-tracking branch 'origin/fix/3723-serve-thinking-toggle' …
noahgift Sep 23, 2026
4f81bde
Merge remote-tracking branch 'origin/fix/crux-sweep-merge-meta' into …
noahgift Sep 23, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
23 changes: 23 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2342,6 +2342,29 @@ jobs:
# found by a Dependabot alert on a DOWNSTREAM repo. Text-only, no build.
- name: No GHSA-only vulnerable crate in Cargo.lock
run: bash scripts/check_no_ghsa_banned_crates.sh
# WIRED HERE, not in guard-tree, for the reason the nextest note below
# states: check_cascade_converges.sh calls `cargo metadata` (its own
# source, line 58), so guard_tree.sh's cargo_only_universe classification
# puts it OUTSIDE the --no-cargo population the dispatcher runs -- and
# guard-tree's contract (BSE-02) is that no step in that job runs cargo.
# A cargo-using guard therefore needs an explicit step, and until this one
# existed the guard was dark: check_guards_are_wired.sh reported "unwired
# guards grew 5 -> 6, NEW: check_cascade_converges.sh" and its baseline is
# shrink-only against origin/main, so the guard could not be ledgered
# either. It arrived with bc2e61e71 (#3892) and nothing named it.
#
# What it buys, and why it belongs on the PR rather than at release time:
# #3892 replaced the retry round with a drain loop that has no round cap,
# so the surviving failure is a `STUCK` exit AFTER the successful part of
# the cascade has already uploaded. crates.io is append-only, so a graph
# that cannot converge costs a HALF-PUBLISHED release, discovered at
# publish time by construction. This proves the cascade can finish before
# anything is uploaded. Measured on this tree: all 74 crates publish, the
# drain terminates in 6 passes.
- name: "The crates.io cascade can FINISH, proven before anything uploads (#3892)"
run: |
bash scripts/check_cascade_converges.sh --self-test
bash scripts/check_cascade_converges.sh
- name: "GHSA guard must still turn RED (case table)"
run: bash scripts/check_no_ghsa_banned_crates.sh --self-test
# MOVED from guard-tree to guard-cargo (BSE-02, PMAT-1064): the guard
Expand Down
188 changes: 188 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,194 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

## [Unreleased]

## [0.69.1] - 2026-09-22

0.69.1 is the stoppers train for 0.69.0 (#3080), assembled as one integration batch:
87 commits, one CI run, one queue slot. Its theme is not a feature. It is **gates that
could not fail** — and the reason that is the theme is that 0.69.0 shipped a model
emitting empty output on CUDA as a *note* rather than a failure, because one contract
key said the rung was optional.

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**.

### 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 limitation, stated by name
- **`qwen3moe` is not supported on CUDA.** `apr run --gpu` on a mixture-of-experts
Q4_K_M model (`Qwen3-30B-A3B-Instruct-2507`, `Qwen3-Coder-30B-A3B-Instruct`)
now **refuses before loading**, names the architecture, cites #3714 and exits 12.
It previously loaded 18 GB, generated on the CPU and exited 14 after the fact,
which told a user who asked for the GPU the wrong thing about their hardware.
`apr run` without `--gpu` is unchanged and still runs these models on the CPU.
`apr qa` on such a file now emits its gates with reasons instead of exiting 5
with an empty JSON document. The MoE GPU forward is #3714, in 0.70.0. (#3817)

## [0.69.0] - 2026-09-21

0.69.0 folds every remaining 0.68.x row into one train (EPIC #3080). The headline goal is Qwen models usable on pure CUDA. This release makes the CUDA path honest and routable:
Expand Down
Loading
Loading