What the maths said
A set of names is a prefix code when no member is a proper prefix of another. Prefix codes are instantaneously decodable: you know a name has ended the moment it ends, with no lookahead. Drop a symbol from a prefix code and the result is not a different valid name — it is not a name at all, and the error announces itself. Drop a symbol from a code that is not prefix-free and you may land, silently, on something else that is perfectly legal.
Measured, three sets are each prefix-free alone: the current Anthropic names, the current OpenAI names, and the OpenAI names as they stood before strength suffixes existed. Each set alone is fine — which is exactly why nobody saw it coming. The ambiguity lives in the union, because the world does not discard old names on the day new ones ship. In the union of before and after, GPT-5.6 is a proper prefix of GPT-5.6 Sol, GPT-5.6 Terra and GPT-5.6 Luna.
prefix-free(S) ⇔ ∄ a,b∈S : a ⊏ b
each set alone : free · their union : not free
append breaks it · insert does not
The difference is position, not presence. Anthropic writes Claude Opus 4.8 — the discriminator is medial, and deleting it gives Claude 4.8, malformed on sight. OpenAI writes GPT-5.6 Sol — the discriminator is terminal, and deleting it gives GPT-5.6, a name with nothing wrong with it. Of five deletions tested, the three terminal ones stay well-formed and the two medial ones do not. Appending extends codewords, and extending a codeword turns every existing codeword into a prefix.
What went wrong first
On 26 July the house corrected a rule that was itself wrong. A guard, a glossary line and two published pages all agreed that GPT-5.6 Sol was an illegitimate fusion and the correct form was GPT-5.6. The correction propagated cleanly — because it looked like a correction: the shorter string is well-formed, has the right shape, and names a real model. The remedy was one line, restore the full name; the question that stayed was why the wrong form had looked so obviously right.
And the handle caught me too. The first version of this piece claimed the current OpenAI set was not prefix-free. verify.py refuted it on the first run: it is. The claim survived only after being narrowed to the union of old and new — the true and smaller statement, and the one worth having. The refutation is kept here because it is the same shape as the finding: a claim that looked complete, was locally well-formed, and needed a set it did not contain in order to be judged.
None of this says which scheme is better. Terminal discriminators are shorter, sort more naturally, and extend without renaming anything — paid for with silent truncation. The house's remedy turned out to be the standard one, arrived at without knowing its name: enumerate the legal names in a file, derive the truncations from the list, and let a machine refuse them. That file is models.txt, in this very repository — the dictionary you carry when a code cannot be made prefix-free.
origin ↗