What this repository is
- The canonical
Qwen/Qwen3.8-27B checkpoint, with every tensor copied through byte-for-byte except the attention weights of the 16 trunk full-attention blocks, which are replaced by their converted form.
- A modeling file so the converted blocks actually run (see Loading; without it the same weights quietly instantiate as a broken stock model).
- The measurement record for this exact conversion:
stage2_converted_manifest.json (per-layer residuals of the fit) and stage2_gate2_results.json (the frozen evaluation that was run before this upload), plus stage2_provenance.json with hashes of everything they came from.
No repair, healing, distillation, or fine-tuning has been applied. Those ship later as separate artifacts layered on top of this base, never baked into it, so this checkpoint stays a stable starting point for anyone who wants to redo or improve the repair themselves.
What actually changed
The conversion projects the per-layer attention keys and values through a shared compressed latent, in the style of DeepSeek's multi-head latent attention, so that a serving runtime can keep one latent per token instead of a full key/value set per head. Rank 512 (the sweep over 128 to 512 found no knee, and 512 is what was measured), profile normalized.
Table with columns: item, value| item | value |
|---|
| Converted layers | 16 of 64 trunk full-attention blocks: 3, 7, 11, 15, 19, 23, 27, 31, 35, 39, 43, 47, 51, 55, 59, 63 |
| Retired tensors in those layers | self_attn.k_proj.weight, self_attn.v_proj.weight, self_attn.k_norm.weight |
| Added tensors in those layers | self_attn.kv_a_proj_with_mqa.weight ([768, 5120] = 512 latent + 256 rotary), self_attn.kv_a_norm.weight ([512]), self_attn.k_b_proj.weight ([768, 512]), self_attn.v_b_proj.weight ([1024, 512]) |
| Untouched | every other tensor in the checkpoint, byte-identical, including the query and output-gate path, all Gated DeltaNet layers, M-RoPE, the vision tower and the MLPs |
Two keys were added to config.json and nothing else there was altered: text_config.kv_lora_rank, which tells the modeling file the latent width, and auto_map, which points at modeling_qwen3_5_mla.py. The architectures field is deliberately left as Qwen3_5ForConditionalGeneration so existing conversion tools still recognize the model type.
Measured record
Gate 2 was frozen (bands and decision rules written down) before any number was produced, then run on 2026-09-29 against stock on the same hardware, same windows, same needles, with projection.stage2_gate2; the full result file is in this repository as stage2_gate2_results.json.
Table with columns: row, perplexity, delta vs stock, needle probes, verdict| row | perplexity | delta vs stock | needle probes | verdict |
|---|
| stock | 2167.4082 | reference | reference | reference |
| this base (normalized) | 2180.4975 | +0.60% | 8/8 (100.0% retention) | PASS, well inside the 10% / 90% bands |
- It also produced 0 non-finite logits and a maximum absolute logit of 22.2, staying in stock's logit-scale band. No catastrophic override fired.
- On the eight completed needle probes (1,024 to 65,536 tokens, two depths each) this base and stock argmax'd the identical answer token every time.
- The two 131,072-token probes failed identically in all three rows, stock included, on allocation size. That is a harness and hardware limit, evidence spans 1024 to 65,536, and there is no length where stock passes and this fails.
- The perplexity value is a comparator inside one fixed setup: 16 non-overlapping 4,096-token windows of
wikitext-2-raw test, gold-token teacher forcing. 2180.4975 is not a benchmark number and must not be quoted as one; only the three-way comparison within that setup is evidenced.
- This evidence measures the conversion as built. It is unhealed. Stage-3 layer-local reconstruction is the repair that lands on top of this base, and its published deltas will say how much of +0.60% comes back.
Loading
trust_remote_code=True is required. The file modeling_qwen3_5_mla.py in this repository contains the converted attention blocks and is referenced from auto_map in config.json:
from transformers import AutoModelForCausalLM model = AutoModelForCausalLM.from_pretrained( "lyssieth/Qwen-3.8-27B-Mulched-Lithium-Arsenide", trust_remote_code=True, dtype="bfloat16",)
The modeling file was written and verified against transformers 5.17.0 on torch 2.14.0, which is the stack this repository pins: a transformers release without qwen3_5 support cannot load these weights at all, and loaders outside that pair are untested here.
If you load this with the stock classes, or with trust_remote_code=False, you get a stock-shaped model without the converted tensors and with already-initialized stand-ins for the retired ones: transformers will warn about a couple of dozen missing and unexpected weights and the forward pass will still return text. That model is not this model. Anything downstream should treat that warning as a hard failure rather than as a log line.
kv_a_norm semantics (read this before touching the latent)
The stored kv_a_norm weight is the effective multiplier, using the ggml LLM_NORM_RMS reading:
latent = rms(latent) * kv_a_norm
It is 1.0 in every converted layer of this profile (1.0 stored as gguf_w = 1.0), so the block as shipped applies a plain RMS normalization. transformers' own Qwen3_5RMSNorm reads a stored weight in a different convention, rms(x) * (1 + weight), so the same tensor means qwen3_5_w = 0.0 on that convention: reusing that class here, or reading this tensor as if that class would read it, doubles every latent and destroys the model. The other profile of the same conversion, bypass, stores the raw latent with a plain gain where 1.0 is the identity; it is not what this weight set is. The profile is part of the artifact's identity rather than something a loader should infer.
What this is for
- Healing from a known baseline. The base is deliberately the raw surgery, in its trainable
safetensors form, so a repair stage can ship per-layer replacement tensors or LoRA adapters independently of it and a consumer can take a partial repair.
- Measuring repairs. Any claimed improvement is measured against exactly these bytes, which is why they are published rather than re-derived.
- Serving artifacts do not live here. The
qwen35-mla GGUFs go to a separate companion repository; quantized serving weights must never be what a healer has to start from.
Do not use this as a chat model, as a judge or reference model for evaluations, or as an unrecorded base for further tuning: it is a conversion baseline whose quality is described only by the measurements above. Use it to repair, to measure against, or to build the serving path on top of.
Assembled and checked by projection.stage2_publish from this project's repository, out of the same bytes that were evaluated (no local machine here can hold a 55 GB forward pass, so nothing above was re-run at upload time):
- Every tensor outside the 16 converted blocks compared bit-for-bit against the upstream
Qwen/Qwen3.8-27B shard it came from.
- All 64 converted tensors compared bit-for-bit against the bundle the gate-2 evaluation consumed.
- The index reconciled against the shard headers (
total_size, names, shapes, dtypes) and against a model built from this very config.json on the meta device, so the published auto_map path constructs every tensor the index advertises, with none missing and none left over (the 15 mtp.* tensors are the same exception stock carries: no transformers class builds that block, and the loader ignores it by design while the GGUF path still reads it).
- The attention forward in the shipped modeling file compared bit-for-bit against the harness implementation that was measured against stock, on real layer-3 weights.
- A small randomly initialized model of the same shape contracts run through
generate locally.
Sources and history
Conversion, measurement and verification tooling, the design documents, and the dated findings behind every claim here live in the project repository: https://git.cutie.zone/lyssieth/projection. Stage-2 findings are findings/stage2/ there, dated 2026-09-29: extraction, factorization and rank sweep, kv_a_norm semantics, the converted-tensor build, and this gate. The upstream weights are Qwen/Qwen3.8-27B; this repository is a fork of its behavior rather than of its files.
Licensed under Apache-2.0, inherited from the upstream model, along with its base-model properties (notably, static YaRN beyond 262K degrades short inputs; this base does not improve that).