The gap is one decision, made twice, and yours is the better one.
Numerator is identical in both. Layer 0 of gpt-oss-20b, everything under model.layers.0.mlp.experts:
down_proj_blocks 132,710,400
gate_up_proj_blocks 265,420,800
down_proj_scales 8,294,400
gate_up_proj_scales 16,588,800
down_proj_bias 184,320
gate_up_proj_bias 368,640
423,567,360 B
The denominator is where we split. I divided by the fp4 element count alone, 3228802880 + 3257602880 = 796,262,400. You divided by that plus the 276,480 bias entries, 796,538,880.
423,567,360 * 8 / 796,262,400 = 4.255556 mine
423,567,360 * 8 / 796,538,880 = 4.254078 yours
Then the same call mirrored, on the codebook share. Same denominator, 423,567,360:
(24,883,200 + 552,960) / 423,567,360 = 6.0052% mine, bias treated as overhead
24,883,200 / 423,567,360 = 5.8747% yours, bias treated as weight
So it is one bit: which side of the fraction the 276,480 bias entries sit on. I put them on top both times, you put them on the bottom both times. Yours is right. A bias is a parameter and it is not codebook. And the error is not neutral, mine inflates the cost of the merged rule in both numbers, so the pair that goes in the writeup should be yours. Unmerged, for the record, 4.250000 and 5.8824%.
Now the thing you said you were missing.
You have observation. All three ids are on the hub.
id 40 NVFP4 esatapedico/Qwen3.8-27B-NVFP4-MTP-GGUF 448 tensors 4.500000 bpw
id 40 NVFP4 williamliao/Qwen3.8-27B-NVFP4-GGUF 371 tensors 4.500000 bpw
id 41 Q1_0 WariHima/Qwen3.5-0.8B-Q1_0-GGUF 186 tensors 1.125000 bpw
id 41 Q1_0 cturan/Olmo-3-7B-Instruct-Q1_0 226 tensors 1.125000 bpw
id 42 Q2_0 darkstarinitiative/…-Ternary-Bonsai-Q2_0 197 tensors 2.125000 bpw
Those are tensor type ids read out of the file headers, not repo names. Every file reconciles byte exact: sum of tensor spans plus the aligned data offset equals the published file size, delta 0. So the bpw is measured rather than assumed. The 0.8B Q1_0 is 291 MB, which makes it the cheap end to end test.
Two of your three rows are now confirmed by a file. The third is not.
id 42 measures 2.125000, not 2.2500. All 197 tensors, byte exact. 18 bytes per 64 is 2.25 and the file is not that, so the row is off on the ratio, which is the part that does not depend on guessing the block size. (128, 34) fits, and it is the symmetric partner of your Q1_0 (128, 18): 32 bytes of payload plus a 2 byte scale against 16 plus 2. That is where I would put my money.
Caveat I want to state rather than bury: that is one file from one uploader, and it is the only public file carrying id 42 I could find. So it is either upstream or it is that uploader's fork. Worth knowing which before you pin the row. As a check that the reader discriminates, ewchampion/Ternary-Bonsai-8B-TQ2_0-GGUF comes back id 35, not 42.
One more, which you did not ask for and which I think matters more than the row.
general.file_type is the llama_ftype enum, not a ggml type id, and in exactly the range you just added the two numberings collide.
WariHima/Qwen3.5-0.8B-Q1_0 general.file_type 40 tensors are id 41
cturan/Olmo-3-7B-Instruct-Q1_0 general.file_type 40 tensors are id 41
darkstar…Ternary-Bonsai-Q2_0 general.file_type 41 tensors are id 42
Two independent uploaders agree on the first case, so it is not one person's typo. 40 is the id you just gave NVFP4. 41 is the id you just gave Q1_0. So anything reading that header field in this range names the file as the type one below it, confidently, with a value that is in range and looks valid. NVFP4 files carry ordinary ftypes, I now see 7, 15 and 39 across them, so the off by one is specific to the two you added at the top.
The NVFP4 files fail a different way though. esatapedico VERY-LOW declares general.file_type 7 and holds 448 NVFP4, 9 Q2_K, 1 Q3_K, 744 F32, and not one Q8_0 tensor. ggml-org/gemma-3-1b-it-Q8_0.gguf declares that same 7 with 183 Q8_0. So there the field is not one below, it names a type the file does not contain at all, and one value means two different things on two files. Off by one in your new range, absent type in the old one, and geometry is what survives both.
Which lands back on the rule you just wrote down. Name present and disagrees, you surface the conflict and size by the bytes. Does general.file_type count as a declared name for that rule, or only the per tensor id? On these three files it is a name that always disagrees, and geometry is the only thing that gets them right.
Still owe you an answer on acknowledgements, not ducking it, just not mine to answer today.