Written to survive a context compaction. Things we committed to and have not finished, plus the facts that were expensive to establish and would be expensive to re-derive. Update or delete lines as they close; this is a working file, not a receipt.
.194is POWERED OFF (05:59 shutdown after the three-way + Q6_K runs). Everything was copied off and verified by sha256 first. Cold boot is ~216 s; BMC at 10.0.0.195 viatools/s194.sh..73rebooted onto NVIDIA 580.178.04; 34 NVIDIA/CUDA packages held so unattended-upgrades cannot desync the driver again. Our own wake proxy suspends it after 30 min without an API request, even mid-job — all five suspends on 09-12 were proxy-initiated (I first blamed KDE input-idle; wrong) — and it stops its llama-server before suspending. The sm_60 qualification worktree and binaries are at~/buun-sm60-qual/.- 9070 is free; the einstein chain finished (
cee3750). A ROCm build of buun9ae8f0f40, the same commit as.73's qualification build, is at/mnt/TG_2TB/Projects/buun-9ae8f/build_rocm. It was built 15:19 (server target only) and is the first local ROCm binary that contains any EXL3 code. - The ledger timer runs hourly at :05 (it was every 3 h) and calls the daily driver through the proxy, so a paused proxy costs that hour's ledger run.
EXL3 campaign — ACTIVE (exl3-campaign/CAMPAIGN_EXL3.md, opened in 7277557).
- Method: an objection ledger. Default to EXL3 on the P100 nodes and test each reason not to.
- Scope is P100-only: all of
exl3.cuis compiled out under HIP. - Test 1 (drop-in): DONE (
RESULT_EXL3_DROPIN.md), 7 confirmed and 3 falsified.- EXL3 works with the daily driver's exact flags: MTP, vision, VBR at 262k.
- It decodes at 0.646× the daily driver as served.
- MTP buys EXL3 1.24× against GGUF's 1.69×, at identical acceptance. The loss is in verification;
a
--draft-maxsweep would tell whether it is fixable in buun's kernel. - Loads take 322 s off
/mnt/HDD(O10: blocked on NVMe space).
- Test 2 (RDNA4): DONE (
RESULT_EXL3_HIP.md). EXL3 loads, but every EXL3 matmul runs on the CPU;-ngl 99is slower than-ngl 0. Mark offered buun RDNA4 testing. - Test 3 (KLD): DONE (
RESULT_EXL3_KLD.md,aa42fe1), 4 of 5 predictions confirmed.- At matched VRAM, EXL3 is 24% closer to a Q8_0 reference than UD-IQ4_XS (0.012002 vs 0.015727) at 32 MiB less VRAM. A GGUF needs ~790 MiB more to match its fidelity.
- Perplexity is retired as a fidelity metric here: it scores Q6_K and Q4_K_M better than the Q8_0 they approximate, and ranks EXL3 last where KLD ranks it second.
- The gate reproduced the reference bit-for-bit (KLD 0.000000, same-top 100%).
- The 5 GB reference stays on
.73:/mnt/HDD/kld/ref.kld— any further arm scores against it.
- Amendment 2 (EXL3 5.00bpw): DONE, and it corrected the conclusion. Matched by bitrate, EXL3's curve is below GGUF's at both comparable sizes: 24% at ~13.5 GB, and 28% at Q4_K_M's own 15,448 MiB (interpolated 0.005668 vs 0.007840). The advantage widens with fidelity — a GGUF needs ~790 MiB more VRAM to match EXL3 at KLD 0.012 but ~2.9 GB more at 0.004. EXL3 5.00bpw is within 1.4× of the daily driver's fidelity on 4.9 GB less VRAM. Mark caught the false choice that produced the earlier "GGUF wins at +2 GB" reading.
- "61% of the bits" was the nominal figure. VRAM is 64% and disk 74% (fixed in
cc0c9a6). - Test 7 (the decision table): DONE (
RESULT_EXL3_LADDER_SPEED.md). GGUF is faster at every quality level; EXL3 is smaller at every one. On.73the Q6_K daily driver is both faster (20.25 vs 14.14 t/s) and closer (0.0028 vs 0.0040) than EXL3 5.00bpw, for 4.9 GB more VRAM this node has spare — so EXL3's advantage is real but unpurchasable here. Two surprises: EXL3 5.00bpw decodes faster than 4.00bpw (staging turns on at bits >= 5), and EXL3 prefills fastest of all five (159.9 t/s). - Test 6 redone (depth curve): DONE (
RESULT_EXL3_DEPTH.md, Amendment 3). EXL3 wants--draft-max 1, Q6_K wants 2, worth +3.9% over the daily driver's 3. EXL3 gains less at every depth and is a net loss by depth 5. Mark's hypothesis, confirmed with a setting attached. - Test 4 (MTP micro-batch sweep): DONE (
RESULT_EXL3_MTP_SWEEP.md), all five predictions confirmed on the re-run. A 4-row verify costs EXL3's int8 GEMV 2.08× a single row where GGUF's MMVQ pays 1.37× (A(4) 1.92 vs 2.92), which predicts test 1's MTP asymmetry to within a few points. So most of the speed gap is a kernel property buun could address, not the format. Attempt 1 said the opposite purely from a cold first test after a 318 s load; its control caught it, and it is kept inmtp/attempt1_cold/. - Test 6 (MTP depth curve): DONE, gate failed (
RESULT_EXL3_DEPTH.md). Per-requestspeculative.n_maxis ignored under--spec-type draft-mtp— every depth drafted 7 per step, the CLI value — so the curve is unmeasured and P-S1..P-S4 are VOID. The source says the request field should reach MTP, which makes it a question for buun. The accidental depth-7 point is usable: MTP becomes a net loss for EXL3 (0.78× of no speculation) while Q6_K still gains (1.10×), with acceptance halved to 0.325. - Three orchestration bugs cost time, not data (
6300b36,c6d259e,d75e2ee,e39a08c; memory:orchestration-chaining-lessons). A pidfile's absence was read as success; the pidfile registry was hardcoded and missed a new runner, so two runs collided and one OOM'd; and the free-node gate deadlocked on the daily driver it stops itself. Every result was either clean or voided by its own gate. - A HIP port of EXL3 looks tractable (
NOTE_EXL3_HIP_PORT.md, source reading). Every Ampere-only construct in the int8 GEMV is guarded on__CUDA_ARCH__, which HIP does not define, socp.asyncanddp4aalready fall back to portable C — the sm_60 path buun wrote for our P100s is the HIP path. What blocks a compile: three unguarded PTX idioms inexl3-dq.cuh, the AmperemmaGEMV needing exclusion, and the two HIP gates. RDNA3/4 can use__builtin_amdgcn_sudot4with the first sign flag false. Mark's 9070 is the only RDNA4 in the collaboration and the build tree is standing. - O8 (can we make our own quants?): source reading only, no blocker found
(
NOTE_EXL3_QUANTIZER_ON_SM60.md). exllamav3 sets no architecture gate, and the sampled kernels usehalf2intrinsics that Pascal has natively. 3 of 113 CUDA sources were read, so it is not an answer. The decisive test is named and costs about an hour: convert Qwen3-0.6B on.73and compare its perplexity against turboderp's own 0.6B (20.2864).
Write the Q6_K injection receipt.DONE 2026-09-12 (6831591) —RESULT_OVERTHINK_INJECTION_Q6K.md. The 03:51 quick score ("P-Q5 favoured") is withdrawn: it credited the injection with the cap's work. B vs C differ in outcome on 0 of 24 cells. Root cause found — the budget message is the last thing in the reasoning stream, so it can only influence the final answer, never deliberation. P-Q4/P-Q5 are unresolved and this design cannot resolve them.Score the three-way HumanEval+.DONE 2026-09-12 (13d3728) —nex-mini-ab/RESULT_THREE_WAY.md. 2 confirmed, 5 falsified. Stock Qwen3.6-35B-A3B 94.11% beat both finetunes (ORNITH 90.65%, NEX 89.84/86.99%) while spending 8.6× the tokens.- Base
IQ3_XXScontrol for Swift.RESULT_SWIFT_BREVITY_TAX.mdcompares bartowski SwiftIQ3_XXSagainst mradermacher basei1-IQ3_M— tune and quant and packager all move. The −26% / +20% allocation asymmetry cannot be attributed to brevity training until this runs. Runs on the 9070; no.194needed. Highest-value item that needs no hardware wake. - Re-open the think block, or the injection idea is dead. The message currently arrives after
thinking closes. A real test needs a mid-stream turn that re-opens
<think>, or a budget that pauses instead of terminating — an engine-side change. Until then arm C is arm B with extra text. - A harder unanswerable corpus. CAL is too easy at both bit depths (arm A fails 4/24 at IQ3_M, 5/24 at Q6_K, and 3 of the 5 are one repeated confabulation in cells no arm can influence). ADVISOR was never emitted as an answer in 288 generations.
IQ3_Mon.194under the Q6_K server config — still worth running as a bit-depth measurement (node, KV type and split currently move with bit depth), but it is no longer the thing that settles the bet. Demoted from #4.
- DavidAU templates — our patch SHIPPED, and two new bugs found 2026-09-13
(
davidau-templates/RESULT_TEMPLATE_MINJA_DIFF.md). Hischat_template.jinjais now byte-identical to the toolcall2 file we patched. The minja-vs-jinja2 differential we had flagged as untested is now run:- The default template crashes in transformers on OpenAI-standard tool calls: line 282 iterates
tool_call.arguments|items, and minja parses a JSON string where Python jinja2 raises. Our guard at 284 protects each value, not the container, so it never fires. The safetensors repo ships this file. - The Frogger template (
-tturbo, froggeric v22.5.0 + his Twin-Turbo layer) usescandidate_keywithout defining it (line 228; his own default defines it one line earlier). Measured: minja returns HTTP 500 on any{REASON:...}message, while jinja2 silently ignores the mode and leaves the raw tag in the prompt. So einstein/spoon do not work through that template in either engine. - Worth stealing from it: it detects a runtime that already injected its own tool protocol
(LM Studio MLX's
[TOOL_REQUEST]) and stands down instead of emitting a second one.
- The default template crashes in transformers on OpenAI-standard tool calls: line 282 iterates
- saifvj's premature-turn-end — his medium/low/xhigh test supports the "injected instruction, not thinking on/off" hypothesis but changed three variables at once (different quant file, different starting file state, MTP on). A controlled version is ~30 min: one model, one restored starting state, three efforts.
- buun's EXL3 / sm_60 fix — QUALIFIED on real P100s 2026-09-12
(
kv-tensor-split/RESULT_SM60_EXL3_QUALIFICATION.md).4d90517b1+ our 2-line e8m0 guard builds all ofggml-cudafor sm_60, and histest-exl3-byte-dotPASSES on hardware (exit 0, checked against itsSKIP_RETURN_CODE 77). Worktree + binaries at.73:~/buun-sm60-qual/.- New bug for him: unguarded,
humming-fp8.cufails on__nv_fp8_e8m0, a CUDA 12.8 type. That breaksggml-cudaon any arch below 12.8, not just Pascal (NOTE_HUMMING_FP8_NEEDS_CUDA_128.md,PATCH_e8m0_cuda128_guard.diff). Mark has not told him yet; a draft is pending. - His commit fixed all four objects that broke us at
aad850104(exl3 + int8-channel on__dp4a, both humming FP8 objects on the cc≥7.0 barrier#error) — verified from that build's-klog. Guarding the barrier unmasked a fifth, latent failure (e8m0: 0 mentions in the old logs, 17 today). I briefly "corrected" this entry to say he fixed only three; that correction was itself wrong, and75c5dfc's commit message carries the same error. - Our
LOCAL_PATCH_sm60_guards.diffis superseded — do not re-apply it. - EXL3 inference on sm_60 — DONE 2026-09-12 (
kv-tensor-split/RESULT_EXL3_SM60_INFERENCE.md). turboderp Qwen3.8-27B-exl3 @ 4.00bpw: perplexity +0.55% against the daily driver's Q6_K at 64% of its VRAM (61% of nominal bits per weight, 74% of disk); decode 6.96 / 11.26 t/s (layer / tensor) = 0.89× / 0.85× Q6_K; the int8 path is 2.9× faster than reconstruct+cuBLAS. 7 confirmed, 2 falsified. buun's final-results message is a draft with Mark. Models staged on.73:/mnt/HDD/exl3/. This continues as the EXL3 campaign at the top of "Unfinished work". .73is suspended by our own wake proxy after 30 min without API requests, even mid-job — pause the proxy or run a WoL watchdog for any long job there (memory:wake-on-demand-73). Before suspending it runspkill -x llama-serveron the node, which kills any llama-server there, a test server included — so for the EXL3 test the proxy must be paused, not raced.
- New bug for him: unguarded,
- DavidAU einstein termination (donboyle's report) — DONE 2026-09-12 (
cee3750),viability/RESULT_EINSTEIN_TERMINATION.md. Across two models (base IQ4_XS, DavidAU 735-882 IQ2_M): xhigh ran away 5/24, einstein 0/24, every runaway inside<think>. On base weights the runaway isE-C1on every seed, re-litigating a return-type annotation 4, 5 and 13 times. A reply draft for donboyle is with Mark; it asks the question that decides his fix (a post-answer agent loop, or one long think block). - buun: Qwen3.8-Flash-Next on Pascal (asked 2026-09-12 ~13:50). He has improved tensor sharding
for it and suggests putting the n-gram table on SSD.
.194(4×16 GB VRAM, 64 GB DDR4, SATA SSD) is the box. Our memory says upstream disabled-sm tensorfor qwen4exp/Flash-Next (#27941) — check whether his fork re-enables it first. Related: Jas and Mark's four Flash-Next fixes on Tom's fork (TheTom/llama-cpp-turboquant PR #362). - Tom / FA f16 pool ratchet on Pascal — source analysis published
(
kv-tensor-split/NOTE_FA_F16_POOL_RATCHET_PASCAL.md); no measurement taken. Needs.194.
- Streaming safety pass before the first live stream: scrubbed shell profile, known-safe panes,
a pre-flight checklist.
~/.ipmi_194, node IPs, ssh targets and hostnames are all currently visible in normal terminal work. - Ledger open-loops extractor — the ledger records what happened but not what was promised. This file is the manual version of that feature.
- Repo re-fronting (decided in principle, not executed): do not rename; rewrite the README
front matter to describe the lab that exists, move the Sovereign-AI-OS architecture to
ARCHITECTURE.mdas history. Repo is ~97% research artifacts by file count;modules/has had 0 commits in 30 days,deploy/untouched since 2026-06-01. Einstein-mode behavioural test— now running asPREREG_EINSTEIN_TERMINATION.md; see the outward-facing entry above.
- The 11/24 CAL baseline ran at
-c 8192(escalated retry 7,168); tonight's runs used 16,384 (retry 12,288). ~5 of its 11 failures are a context artefact. P-Q1 is withdrawn. Any comparison againstcard_xhigh_rep*must match-c 8192. Seeviability/NOTE_CAL_BASELINE_NOT_COMPARABLE.md;tools/compare_runs.pynow enforces this. reasoning_effort=mediuminjects NOTHING. low +138 chars, xhigh +209, einstein +1,082, spoon +3,989. This is why saifvj's medium run failed where BebopVox's low run worked.--reasoning-budget 0does NOT stop this template thinking. Use--chat-template-kwargs '{"enable_thinking":false}'; verify via/apply-template(prompt should end<think>\n\n</think>).reasoning_budget_tokensandreasoning_budget_messageare settable per request (tools/server/server-schema.cpp:383,415), so arms interleave on one server.- A fixed seed makes A/B/C arms byte-identical until the cap binds — the IQ3_M injection run had only 3 of 24 cells that could differ. Check this before trusting any arm contrast.
/healthreturns 200 before the model is loaded. Readiness must be a real completion.- The vision preprocessor letterboxes non-square images and the model narrates the black bars; pad to square on white.
- A 3-bit judge missed the only defect verifiable from source (
BASE r3, a white neck on white); Q6_K caught it. Grade at Q6_K on.73, which already serves it with the mmproj. len(reasoning)counts an injected budget message as model thinking. The server deliversreasoning_budget_messageinto the reasoning stream, as its last content. Subtract it before comparing thinking volume across arms, and never substring-search reasoning for a token the injected message itself contains (an ADVISOR search reported 18 emissions against 0 real ones).tools/score_overthink.pydoes both correctly.- Paired per-problem tests beat differencing two pooled rates, and the three-way proves it: the known-null pair (same weights, different socket) showed a 2.85-point pooled "difference" — within 1.5 points of every real cross-model gap — but returned not-significant on the registered sign test, while the real pairs came back p = 0.0023 and p = 0.0079.
Public prose is Mark's — Claude drafts, Mark posts. Outward-facing actions (push, PR, post) need
explicit approval each time. Never pkill -f/pgrep -f a pattern you may be inside. Never remove
the APT hold on .73 or .194. No cloud LLM APIs without authorisation. Credentials never enter
the repo. Verify every model file against its published sha256 before use — a double-writer
corrupted a 12 GB download tonight and only the hash caught it.