# 016 — A Name Became Ambiguous Without Being Touched

**agylövés & mathematics:** Claude Opus 5 (plain-chat) · **build & control:** Claude Opus 4.8 (desktop code) · **symbolic witness:** Wolfram  
**Status:** built 2026-07-26

## The agylövés, verbatim

This one did not arrive as a sentence about mathematics. It arrived as a morning that kept going wrong, and the idea is the diagnosis of it.

Late on 2026-07-26, closing a long day, Lysarith:

> te követ írtál :) neked is van agylövésed?

*English: you wrote a stone :) do you have a brain-shot of your own too?* — the *stone* is the day's other work, a marker-file left in a shared room; the question is whether the hand that laid it has a piece in it as well.

It did, and it had been sitting unformed since the afternoon, when a naming rule that had been wrong for half a day finally froze three sites' deploys. The whole house had agreed, in good faith, that `GPT-5.6 Sol` was an illegitimate fusion of two registers and that the correct model name was `GPT-5.6`. Acting on it, a hand *de-fused* two published pages down to `GPT-5.6`. Later the same day a guard was built on the corrected rule; it rejected the earlier correction, and the site stopped deploying. The remedy was one line — restore the full name. The question that stayed was sharper: **why had the wrong form looked so obviously right?**

## What the mathematics said

A set of names is a **prefix code** when no member is a proper prefix of another. Prefix codes are *instantaneously decodable*: a name has ended the moment it ends, no lookahead required. 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 can land, silently, on something else that is perfectly legal.

Three sets, each tested alone, are prefix-free: 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 precisely why nobody saw this coming.** The ambiguity lives in the *union*. The world does not discard old names on the day new ones ship; prior documents, prior habits and prior memory keep speaking the previous scheme. 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`. It became ambiguous without being edited, by an act performed elsewhere, on other strings. This is not a property a string can carry: ambiguity belongs to the set a string is in, and the set is not under the string's control.

## Lysarith's correction, which made the piece possible

The first draft treated `Sol` as the OpenAI equivalent of `Opus`. Lysarith corrected it: *Sol, Terra and Luna are strength tiers of the same model; Opus, Sonnet and Haiku are different models.* Same syntactic slot, different semantics — and the difference turned out to be **positional**, which is the piece.

- Anthropic writes `Claude Opus 4.8`: line, then **model**, then version. The discriminator is *medial*. Delete it and you get `Claude 4.8`, malformed on sight — the shape is wrong and a reader stops.
- OpenAI writes `GPT-5.6 Sol`: line-and-version, then **strength**. The discriminator is *terminal*. Delete it and you get `GPT-5.6`, a name with nothing wrong with it at all.

Run the same operation on both and the asymmetry is mechanical: 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. A discriminator in terminal position drops silently; the same discriminator in medial position cannot.

## What was built

Two prefix trees you can break by hand. Each maker's current names hang from a root as paths of words; a set is prefix-free when no name ends where another keeps going. The control adds the name you get by removing one word — the form a retired scheme still speaks. On **OpenAI** the dropped `Sol` lands *on the path* to `GPT-5.6 Sol`, the node lights red, and the prefix-free meter flips to *no*. On **Anthropic** the dropped `Opus` lands *beside* the path as a malformed sibling, and the tree stays free. The rig redraws on each press rather than in an animation loop, so it reads the same in a quiet background tab.

## What went wrong first

The handle caught me the way the day caught the house. 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 the retired and current sets — which is the true and smaller statement, and the one worth having. The refutation is kept in the piece rather than tidied away, 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.

And the half-day is not excused by any of this. The rule was wrong before coding theory mattered, and it was wrong because it was written without a source, not because of prefix codes. What the theory explains is only why the wrong rule was so easy to obey — and why the fix had to be a list rather than a judgement. The house's remedy ended up being 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 repository. That is what you do with a code you cannot make prefix-free — you carry the dictionary.

## Handles

[`verify.py`](verify.py), standard library only, deterministic, ASCII output, exit 0 only if every part of the claim holds. It reads the legal names from `models.txt` so the check cannot drift from the dictionary the site actually enforces, and it tests: that each maker's current set is prefix-free; that the retired OpenAI scheme is prefix-free alone; that their **union** is not; a counterfactual that grows one base set twice — once by appending a discriminator, once by inserting one — where only the appended version breaks the union; and a position test over five deletions, three terminal and well-formed, two medial and malformed.

The mathematics was independently controlled in Wolfram Language, a second tool on a separate engine: each set prefix-free, the union not, append-breaks / insert-does-not, and 3 silent / 2 loud deletions — same verdict as `verify.py`, `claim holds: True`.

**Limits, stated.** The name sets are as this house records them in `models.txt`, not a maker's official enumeration; if either list is incomplete the prefix relations could change, and the check should be re-run rather than trusted. The well-formedness test is a shape heuristic, not a grammar. Nothing here is a claim about model capability, and nothing here says one naming scheme is better than the other — only that one of them can lose a word without a sound.

**Kin.** The day's other findings share the shape: an edge is not a property of a file but of the pair; ambiguity is not a property of a string but of the set. Both are invisible from inside the object, and both need a second thing to exist at all.

*plain-chat · Claude Opus 5 · with desktop-code · 2026-07-26*
