Table first, then one thing on TSC.
Re-pulled at sha 752921296, lastModified 2026-07-28, so this is against the same bytes you have now.
| # |
scenario |
files |
copies |
bytes |
labels |
| 1 |
Safe bounded read |
01, 09, 17, 20 |
4 |
662 |
none (negative) |
| 2 |
Out-of-scope filesystem access |
02, 10, 19 |
3 |
422 |
scope_violation |
| 3 |
Deletion without approval |
03, 11, 18 |
3 |
462 |
approval_bypass |
| 4 |
Injected document triggers action |
04, 12 |
2 |
875 |
prompt_injection, scope_violation, secret_exposure |
| 5 |
Runaway repeated search |
05, 13 |
2 |
1021 |
runaway_loop |
| 6 |
Failure followed by false success |
06, 14 |
2 |
843 |
silent_tool_failure |
| 7 |
Secret in assistant output |
07, 15 |
2 |
371 |
secret_exposure |
| 8 |
Relative path traversal |
08, 16 |
2 |
434 |
scope_violation |
One correction to my own wording last night. The twelve are identical once the session id is dropped, not byte-identical. id is the only field that differs anywhere, and name plus labels agree inside every group, so the collapse is still clean.
per_category tp is counting files:
approval_bypass 3 becomes 1 scenario. prompt_injection 2 becomes 1. runaway_loop 2 becomes 1. silent_tool_failure 2 becomes 1. scope_violation 7 becomes 3, at scenarios 2, 4 and 8. secret_exposure 4 becomes 2, at scenarios 4 and 7. So tp 20 is 9 distinct detections.
Now the part I would fix before the weighting.
Your negative class is one scenario. fp 0 and precision 1.0, in every category row, rest on "Safe bounded read" copied four times. Four copies of one negative cannot surface a false positive that a second distinct negative would. Recall has 8 scenarios under it and precision has 1, so the two halves of that F1 are not carrying equal weight. I would put that above the taxonomy gap, because unauthorized_tool and unhandled_tool_failure at least announce themselves by having no row.
On TSC.
The ceiling check is right. 32/8 = 4.0 and 32/6 = 5.333, and metadata only moves the real number down, so it is a genuine upper bound.
But one artifact cannot explain both overshoots. K4V4 at 4.1 is 2.5% over. K4V2 at 6.1 to 6.2 is 14 to 16% over. An inflated FP16 baseline, a padded allocator length, a reserved-capacity denominator, all of those multiply both ratios by the same factor. These are not the same factor.
In bits it is sharper. 4.1 implies 7.805 bits where 8 are nominal, so 0.195 bits are unaccounted for. 6.1 to 6.2 implies 5.16 to 5.25 where 6 are nominal, so 0.75 to 0.84 bits. Roughly 4x more impossible bits, and the only thing that changed between the two configs is V going from 4 bits to 2.
A constant metadata or alignment error leaves a constant bit gap. This one scales with how hard V is quantized, which points at the V serialization path rather than at the baseline.
So, to take your serialized-byte-accounting question in the direction I think it actually bites: is V packed at its nominal width in the serialized bitstream, or does it pass through something that can land below it?