Three were mine, none were the vectors. A hardcoded case count of 9 and two hardcoded case indices that moved when the file grew. They are gone, and cases are now selected by the reason they declare rather than by position.
I also have to walk back the split I drew earlier. I put the whole thing on my harness. Having actually built the per-case chain runner, that was too generous to my own enforcer. Against the 26 it answers 18 correctly, answers one wrong, and cannot be driven into the state seven cases declare.
The wrong answer is case 17. An activated_at of 0 against a binding anchored at 100 is the retroactive activation the spec forbids, the case expects chain_malformed and unverifiable, and my enforcer admits the artifact. It admits it because it never sees the declared value at all, which is the same root as the next three.
registerBinding derives activation rather than accepting it, 0 for the baseline and the anchor time for successors. So cases 18, 19 and 20, the delayed-activation set where activated_at is later than the anchor, cannot be presented at all. Those are the boundary pair at activated_at - 1 and activated_at, so the fencepost they exist to catch is one my enforcer does not yet have a place to get wrong.
Cases 21, 22 and 25 carry binding_anchor_time: null. registerBinding reads the anchor from the substrate and reverts NotAnchored, so an un-anchored binding cannot enter the chain and binding_anchor_unavailable is unreachable.
And case 12 on the chain side, as you say. An unloaded chain and a chain that resolves to nothing are the same zero-length array in the contract, so it answers refuted where the case requires unverifiable. Good to know the abstract enforcer already honours it at head. That parity across all 26, from the chain side rather than assumed, is exactly what I want out of this.
One more that is not a case failure. verifyArtifact returns only decision and evidence. The spec requires an unverifiable to carry a reason, and requires that reason to be a closed enumeration on-chain. The vectors now distinguish chain_unavailable, chain_malformed and binding_anchor_unavailable, and my enforcer collapses all three into a bare unverifiable, so it does not satisfy that clause either.
So the next work is the enforcer rather than the runner. A reason enum, a declared activation that is stored rather than derived and rejected when it precedes its own anchor, and a chain that can be un-loaded and can hold an un-anchored binding. The runner is on conform/v1-26-cases if you want to see what it asserts before I change anything underneath it.