Local LLM / Benchmarks

Lab Notes: the basin was a bug

We published a basin. The serving binary was the hole. After the c7d8722 revert: 6/6 HIT at 198k. n=1 map of the fixed build.

By Simon Gonzalez de Cruz (follow the build in public on X @KyaniteLabs_). Night 3 inversion, 2026-08-20. The first version of this note is still the URL. The map was wrong.

The number first: 6/6 exact needle retrieval at ~198k after we reverted llama.cpp c7d8722. Same seed. Byte-identical planted codes. Every cell finish_reason=stop. Zero attractor outputs. The “degenerate basin” we shipped on 2026-08-19 was substantially a host-buffer bug on this integrated GPU, not a depth law of Qwen3.8-27B.

Anchor pair, token-identical prompts, server prompt_tokens=198,228 both nights: pre-revert miss (ok) → post-revert exact HIT. Only delta = the revert. Raw: needle-format-2026-08-19/README.md · depth-remap-results.log.

What that first night printed (contaminated instrument)

On a haystack the server counted at 198,227 tokens I asked for a planted access code at five depths. At 25% it handed back the exact code and stopped clean. We no longer treat that hit as a position window. At 35% and 75% it wrote the opening of a code-review report it was never given:

- **Risk**: Low; 67 medium/low

Same opening. Twice. Temperature 0. That night also died at 98C on the next prefill. Those facts are still true as a log of the old binary. They are not a model-level basin.

What actually ran

One seed. One haystack class. Champion config: Qwen3.8-27B Q4_K_XL, K+V q4_0, 262,144-token window, on a $1,400 GMKtec EVO-X2. Depths are fractions of the server's token count. My generator said 262k. The server said 198,227. We label the instrument from the counter now.

DepthPre-revert (08-18)Post-revert remap (08-19/20)
10%fail okHIT, stop
25%HIT, stopHIT, stop
35%fail, Risk report, lengthHIT, stop
50%fail ok (ptok 198,228)HIT, stop (same ptok)
75%fail, Risk report, lengthHIT, stop
90%sweep diedHIT, stop

6/6 on the fixed build. n=1 per cell. Treat this as a map, not a measurement. I am not quoting the planted codes.

Then the box cut power (still true)

During the next long prefill the EC tripped at 16:45:42Z. Journal line: temp=98C -> fan=100%. No panic, no amdgpu, no OOM. Highest temp this chassis has logged here. The fans were already doing their job. The load was the bug: back-to-back half-hour prefills, about 6C above the 90-92C bursty envelope we treat as normal. That crash is not the basin and is not walked back.

The architecture still stands. The basin story does not.

Qwen3.8-27B is a hybrid: 64 layers, and only 16 of them do full attention. The other 48 are Gated DeltaNet — linear attention that keeps a fixed-size running state. That is how 262k context fits on a $1,400 mini-PC (17.2GB of attention KV at f16, not ~60GB). The KV cache only exists in the 16 attention layers — 4KB per token per layer, 64KB per token total, 17.2GB at f16 across a full 262k window. At q4_0 that is ~4.8GB. At q8_0, ~9.1GB. The 4-bit flip saved ~4.3GB of GTT. Real margin. The paired GSM8K promotion still stands on its own evidence.

We thought the basin was that decay gate. A 50k-token haystack on the pre-revert binary missed at 15%, 50%, and 85% — all the same ok attractor. That is why this page once said the decay-horizon prediction failed. Those 50k cells are now suspect: same contaminated serving stack. We have not re-run 50k on the fixed build. I will not keep “this model cannot retrieve at any length” as a current claim.

The warm-prefix quote still stands as product shape. On the same $1,400 mini-PC we loaded a 198k-token prefix once: 1818s cold (~30 min). Four follow-ups against that cached prefix, all finish_reason=stop: retrieve the planted code; quote the sentence (16s); yes/no that a code exists (9s); summarize (27s). Retrieval is selective. Loading is expensive; maintaining is cheap. Raw: results/quote-probe-2026-08-19/quote-results.log.

What I got wrong about our own stack

I blamed “the fork.” Then I blamed GDN. The hole we could name was llama.cpp c7d8722 (host-buffer incoherence on this iGPU). The same revert that restored vision restored deep-context IDs. Issue tracker first, then another map. That is the bug-hunt. I almost filed an upstream ngram-cap issue; the gauntlet killed it. --spec-draft-n-max does not cap ngram-mod. --spec-ngram-mod-n-max does, and we never set it. Our config. Their flag.

I will not write “no quality loss at 200k-class context” from n=1 cells. We have earned “exact retrieval at six depths on this fixed binary, this seed, this format.” That is all.

Tonight

The first title stays in the URL so the correction is findable. The live claim is the inversion: the basin was a bug. Vision note: we already reverted c7d8722 in public. This is the text/retrieval half of the same commit. Update: the inversion now replicates cross-seed — second seed 6/6, 13/13 cells post-revert at 198k (canon 66afc21).

Raw logs: results/needle-format-2026-08-19 (remap) and results/deep-context-2026-08-18 (contaminated night) in qwen38-27b-strix-halo.

Conditions: GMKtec EVO-X2 (Ryzen AI Max+ 395, 96GB unified), Qwen3.8-27B Q4_K_XL, llama.cpp ROCm post-c7d8722 revert, 262,144-token window, K+V q4_0, temperature 0, prompt_tokens ~198,227 server-reported, n=1 per depth, seed s4419. One curve. A map. Not a law.

Work with Kyanite

Want this working in your environment?

If this post describes a Kyanite tool or result you need, implementation help can cover setup, advising, docs, examples, checks, and a usable handoff.

Fit boundary

Kyanite offers help grounded in its tools, products, and build practice. Broader consulting routes through PuenteWorks.

Keep following the system.

The Delegation Card: we asked a $1,400 mini-PC to take our jobs

Not is-it-smart but can-you-hand-it-work-and-walk-away. 495 trials, certified floors.

Qwen 3.8 27B on Strix Halo: the complete measured story

Every dial measured, every number public: the frozen optimal config for a 27B on a $1,400 mini-PC.

Lab Notes: the measured-knees method for reasoning effort

A methods note on reasoning-effort calibration. Thinking rescued 15/40 hards vs 4/40 off. On easy tasks it bought nothing. Publish the knee.

Lab Notes: 67% LiveCodeBench-30 on a $1,400 rig

20/30 = 67% LiveCodeBench-30 on a $1,400 mini-PC. Wilson 95% CI 49-81%. Easy 10/10, medium 8/10, hard 2/10. n=30 public subset. Not the card.

Lab Notes: we reverted a llama.cpp regression

We found a llama.cpp regression and reverted it. n=6 battery on a $1,400 rig: 0/6 slashes before, 5/6 after. Same Q4_K_XL. Not a quant story.

Lab Notes: 93% HumanEval on a $1,400 rig

28/30 = 93% HumanEval on a $1,400 mini-PC. Qwen3.8-27B Q4_K_XL. Temp 0, thinking off. Failures: 50 and 145. Raw log linked.

Lab Notes: the model that can't forget but can't remember

The number first: this model is 75% not a transformer. 48 of 64 layers keep a running state. On a $1,400 rig, load 198k once (1818s), then query in 9-27s.

Lab Notes: the KV verdict

The q8-to-q4 KV question from night 1 got its paired answer: same accuracy, zero tripwires, half the cache. Plus the label we had to correct in public when the server's counter beat our estimate.

Lab Notes: verdict night

A $1,400 mini-PC serving a 27B at 262k context asks one question: does capping thinking cost accuracy? The paired answer, the invalid first attempt it survived, and the doctrine that followed.

One mini-PC, one night, and the numbers that argued with themselves: tuning Qwen3.8-27B on Strix Halo

A fully measured night-and-evening of tuning a 27B dense model on a Strix Halo mini-PC: the honest bands, the reversal, the crash doctrine, and the EC detective story.

GPT-5.6 Sol vs. Terra vs. Luna: an evidence-based routing policy for coding agents

The practical GPT-5.6 split is Sol for discovery, Terra for bounded execution, and Luna for repeatable processing - with a different verification contract for each.

Agents need verifiable tools, not better prompt theater

The useful agent pattern is not a prettier prompt. It is a tool surface the agent can call, inspect, verify, and revise.

Repo history is a product signal

A repo is not just storage. It is evidence of decisions, repairs, release behavior, naming drift, test gaps, and what the builder actually knows how to finish.

Implementation help is part of the product surface

A useful open-source tool still needs a path from public repo to working environment. That path is product work, not an afterthought.

Why Kinocut matters

Kinocut gives AI agents callable handles on timelines, effects, Hyperframes, and finished media at kinocut.dev.

Infinite monkeys, LLMs, and the room around the machine

The argument behind the video: output quality is not just probability. It is architecture, filters, and human taste.

What a working AI tool needs before people can use it

A practical checklist for turning a working tool, workflow, or rough app into something other people can understand, install, and use.

MCP server implementation checklist

The checklist Kyanite uses to decide whether an MCP server is a toy, a usable tool, or something worth implementing.

Repo archaeology turns history into proof

Why commit history is one of the strongest proof sources for learning diagnostics, implementation help, and engineering trust.

AI discovery needs more than a sitemap

What Kyanite adds so search engines and AI assistants can understand the tools, products, proof, and support path.