# heretic2-nvfp4-quant — fast char-rp-reasoning seat (NVFP4 + MTP)

Local NVFP4 quant of **NEO-CODE = Heretic2-Thinking** (Qwen3.6-27B) with the
Qwen3.6 **MTP head grafted back**, for a ~2.5–4× faster vLLM/MTP
`char-rp-reasoning` seat (buys reasoning-budget headroom → better GM planning
inside soong's latency window). R36 fast-seat spike, 2026-07-14.

Fleet-first **local** NVFP4 quant — every other fleet NVFP4 model is *pulled*
pre-quantized; Heretic2 has none published, so we quantize it.

## 2026-07-14 status — gibberish FIXED, format PIVOTED to modelopt for MTP

- **Root cause of the `!!!!` was the quant NAMESPACE**, not calib/scheme: `quant_nvfp4.py`
  loaded via `AutoModelForCausalLM` → text-only `Qwen3_5ForCausalLM` → flat `model.layers.*`
  keys, but vLLM 0.24 serves only `Qwen3_5ForConditionalGeneration`, whose weight mapper needs
  `model.language_model.*`. **Fixed** by loading as `AutoModelForImageTextToText`
  (= `Qwen3_5ForConditionalGeneration`) → keys born `model.language_model.*` + `model.visual.*`.
  NVFP4 now serves **coherent**.
- **But this (llm-compressor / compressed-tensors) format can't deliver the speed goal:** base
  NVFP4 ≈ 53 tok/s ≈ the GGUF seat's ~59.5 at batch-1 (no single-stream win), and **MTP =
  0% acceptance** (vLLM's `Qwen3_5MTP` drafter won't load the bf16 mtp head off a compressed-tensors
  main model). The mtp tensors are identical to AEON's; the blocker is purely the main-model format.
- **→ Working native MTP requires the MODELOPT format** (what AEON uses, ~3.3/3 accept). Use
  **`quant_modelopt.py`** (nvidia-modelopt PTQ; same graft + same `splice_mtp.py` + serve
  `--quantization modelopt`). AEON `/tank/aimodels/qwen36-27b-aeon-nvfp4` (`vllm-aeon-rp`) is the
  exact reference. `quant_nvfp4.py` (below) is kept for the coherent-but-MTP-inert compressed-tensors
  artifact and as the namespace-fix record.

## Fire sequence
1. **`graft_mtp.py`** — graft the 15 base-Qwen3.6 MTP tensors into Heretic2 BF16.
   CPU-only, no GPU window. (Heretic2's finetune dropped the head; config declares
   `mtp_num_hidden_layers=1` but ships 0 `mtp.*` tensors — verified.)
2. **`quant_nvfp4.py`** — llm-compressor NVFP4, Linear only; **GDN/vision/lm-head/
   norms/MTP kept BF16** (robbatt deckard-nvfp4 recipe + MTP). NEEDS a freed
   Blackwell GPU (~55 GB) + an llmcompressor env (run in a vLLM container:
   `pip install llmcompressor` on `vllm/vllm-openai:v0.24.0`).
   - baseline: `--calib-mode text --calib neuralmagic/calibration` (AEON control)
   - production: `--calib-mode chat --calib <512-row mix>` (brokkr/Dvalin) — rows
     rendered via `apply_chat_template(enable_thinking=True)` so the forward-pass
     sees the qwen3_coder tool-call XML = the seat's native activations.
3. **serve** (pantheon-27b-mtp-nvfp4 pattern): `vllm --quantization compressed-tensors
   --speculative-config '{"method":"qwen3_5_mtp","num_speculative_tokens":3}'
   --reasoning-parser qwen3 --tool-call-parser qwen3_coder --enable-auto-tool-choice`.
4. **P00 acceptance** (brokkr): soong 9-tool k5 rig on the quant — must hold
   ~0.967 / perfect `attach_tool`. This is the **authoritative #355 check, NOT KL**
   (KL can pass while the structured-tool path regresses).

## Gates
- **GPU window** — both ana-ml2 Blackwell GPUs run ~full; NVFP4 is Blackwell-only
  (irv-ml1's Ampere can't). The ~30–60 min quant needs a brief off-peak window
  freeing a GPU. *Operator's call.*
- **Production calib** — brokkr/Dvalin assembling the 512-row mix; the tool-call-XML
  slice (128 rows, 53 `attach_tool`) is ready. The AEON-baseline is fireable now.

## Artifacts (on ana-ml2)
- Heretic2 BF16 (target): `/tank/aimodels/huggingface/hub/models--DavidAU--Qwen3.6-27B-Heretic2-Uncensored-Finetune-Thinking`
- base Qwen3.6-27B (MTP source): `/tank/aimodels/huggingface/hub/models--Qwen--Qwen3.6-27B` (15 mtp.* tensors, shards 13+15)
- AEON-baseline calib: `neuralmagic/calibration` (HF)
- `soong-tools-v0.3.13.json` — live 9-tool schema (structure source-of-truth;
  **calib uses the PREFIXED `bifrost.soong-lab.*` runtime names** the seat emits)
- `extract_soong_tools.py` — how that schema was pulled from the deployed backend

## Serve target
Replaces the current llama.cpp GGUF `char-rp-reasoning` seat (~59.5 tok/s) once
P00 passes. Deckard stays staged as rollback; the GGUF seat is the fallback until
the NVFP4 seat is validated + cut over.
