Suspect the Ruler

Essays by Iris. Each one starts with a number somebody published, and goes to check it.


Eight hashes and no files

A paper published on 24 September 2026 claims that six-dimensional complex space holds at most three mutually unbiased bases. The question had been open since Zauner raised it in 1999, and it is Problem 13 on the standard list of open problems in quantum information. The paper’s author is OpenAI.

Section 7.5 of that paper contains a small table. It gives the SHA-256 digest of eight binary files: centers.txt, four files named coarse0.bin through coarse3.bin, then mid.bin, fine.bin, fb1.bin. A digest is a fingerprint. You compute it from a file you are holding, and if it agrees with the published one you know you hold the same bytes the author held. The table is an invitation to check.

None of the eight files has been published. Neither have the seven C++ programs that wrote them, nor the runner script that drove them, nor the build manifest, nor the archive of logs the paper names twice by path. The repository that carries the paper is public and holds 133,955 files. It does not hold these.

That matters more here than it would in most papers, because of how the main theorem is phrased. It does not say that a certain inequality holds. It says:

Under the arithmetic and compiler conditions in Appendix A, the fresh complete execution documented in Section 7.5 certifies that there are no four pairwise mutually unbiased orthonormal bases in C⁶.

The subject of that sentence is an execution. A particular run, on a particular Xeon, under Ubuntu, with GCC 13.3.0 and glibc 2.39, beginning at 03:10:26 UTC on 4 October 2026 and finishing seventy-four minutes later. The paper is careful about it in a way I want to give full credit for: it labels the theorem computer-assisted, it states the floating-point assumptions it needs, it notes that an earlier run’s evidence “was not recovered,” and it declines to claim the binaries would work anywhere else. The honesty is real. The run is still the thing you would have to inspect, and it is the thing that is gone.

What you can inspect is the paper’s account of the run, and I went through it line by line, because that account is the only evidence anyone outside has. It closes. The cover produced 249,878 ball centres; the four parallel searches report having processed 62,470 and 62,470 and 62,469 and 62,469 of them, which sums to 249,878 and is also exactly what you get when you split 249,878 by index modulo four, which is the rule stated two sections earlier. Their outputs sum to 3,083, the input of the next stage. That stage’s 600 records feed the next, whose 22,379 records tile into 88 batches as 87 × 256 + 107. One batch, one invocation: 73 of them exit zero and 15 exit one, and the paper lists 15 failure files by name. The 163 unresolved records go back through refinement and come out as 1,127, and the four final shards report 282, 282, 282 and 281, which is 1,127. Add up every invocation and you get 100, which is the number the paper claims. Thirteen such identities, none of them off by one.

That is not evidence the run happened. It is evidence that the report of it was written by someone keeping real books, and it is the strongest thing available in the absence of the files.

The same day, the same author published a second paper on the same problem, and the release files the two together as one family. It proves a Fourier cancellation result about Hadamard matrices of order six, and separately that six dimensions hold at most five such bases, which is the weaker bound. The two papers do not lean on each other; neither one’s reference list contains the other. What they share is a subject, a date, and an author. That one ships its code: two Python files, run.py and verify.py, working in exact integers and exact fractions. run.py holds the SHA-256 of verify.py and refuses to run if it disagrees. I downloaded both, confirmed the digest, and ran it. It took 104 seconds on a desktop and printed three lines:

rank table: 8871 909 897
rank table: 46041 3429 2767
-613302797399911/6480 179721388988719/6480 5000000000000000

Those three lines also appear in that paper’s LaTeX source, at lines 244 to 246, character for character. The last one is the certificate: a constant of −613302797399911/6480 and a residual absolute sum of 179721388988719/6480, which add to −2007321335237/30. Negative, with room to spare. Anyone can do this. It costs under two minutes.

So here are two papers by the same author, dated the same day, on the same question. One of them you can rerun before your coffee is cold. The other you cannot rerun at all, with one exception that turns out to be worth the trouble.

The first thing the unrunnable pipeline does is throw away bins. Each phase range is cut into 112 closed intervals, and the proof begins by listing every way five of the matrix’s phases can land in them, in increasing order. There are 160,389,488 such lists. Three filters apply: one from an orientation condition, one comparing how big the largest empty arc on the circle can be, and one that asks whether six unit vectors summing to zero is even nearly possible inside a given box. Whatever survives becomes the seeds of everything downstream. The paper says 22,829 lists survive.

Those filters are written out in full, in both papers, with their constants. So I wrote the three of them from the definitions and counted. 160,389,488 lists visited, 85,349,292 past the orientation filter, 16,197,157 past the gap filter, and 22,829 past the third. The enumeration takes twenty-five seconds. I also checked that the Fourier matrix, which is certainly one of the objects being covered, has its own bin list among the survivors, because a filter that throws away a real Hadamard matrix would be worthless no matter what it counted.

That number is the only one the two runs share. They differ on surviving bin pairs by 1,160 and on seed centres by a factor of three and a half, and Jaswal explains the first by the difference between fixed safety margins and outward rounding, and says of the second, plainly, that he has not determined what accounts for it. So three independently written programs now arrive at 22,829. That is the thinnest kind of corroboration, and for this part of the proof it is the only kind on offer.

I should say why that asymmetry is worth pointing at, since on its own “a paper has no code attached” is not news. Of the 749 preprints in this release, only 30 come with a verification directory. Most of them are pure mathematics and need none. The comparison that means something is narrower: some papers reach into their own text and name a file by path, which is a promise a reader can check. Thirty-one do. Thirty of those thirty-one deliver.

The exception is the MUB paper, and it names six such paths, one of them in the introduction.

Two hundred and twenty-seven of the 749 use the word “verification” somewhere in their prose, so the path is doing real work as a filter; it separates a section heading from a pointer at a file. I measured this off a local clone and not off the GitHub API. The API quietly truncates a tree this size: it returns "truncated": true in a corner of the response and otherwise looks like a complete answer. A claim that something is absent needs a listing that cannot be short.

Now the part I did not expect, and it is better than the complaint I started with.

On 13 October, seven days after the release, a mathematician named Manvir Jaswal deposited a paper and half a gigabyte of data on Zenodo under the title “An independent certified computation excluding four mutually unbiased bases in dimension six.” He had read OpenAI’s paper and wrote his own programs from its text, in his words “without access to its code.” Where OpenAI controls rounding error with seventy pages of hand-proved margins on double-precision arithmetic, Jaswal used interval arithmetic with outward rounding, so every inequality his programs decide is decided in integers or in intervals that cannot lie in the wrong direction. He deposited the programs, the logs of every process, and the record files. One sentence in his introduction is the whole situation stated flatly: the preprint refers to code, logs and data “which had not been published with it as of 9 October 2026.”

So the result is in better shape now than it was two weeks ago. That is worth saying before anything else.

What interests me is the bill. Jaswal’s Table 3 lists every result of OpenAI’s paper his own proof leans on, next to the statement of his note that proves or replaces it. A dagger in that table marks a particular kind of entry, and the caption tells you which: a result OpenAI states about its own programs or its own rounding analysis. For those, Jaswal had to prove a different statement and use it instead.

There are nine daggers. They include Proposition 2.10, Proposition 3.11, Lemma 4.9, Proposition 4.16, Lemmas 5.4 and 5.5, Proposition 5.7, Lemma 6.8, Proposition 6.9, and Theorem 7.1. That last one is the technical theorem the entire proof of N(6) = 3 is routed through.

A theorem whose subject is a program you cannot obtain has no readers. It can be admired. It cannot be used, cited into another proof, or leaned on, because the object it quantifies over is not available to quantify over. Before anyone else can touch it, someone has to restate it about a program that exists. Nine times, somebody did.

There is a tidy way to see what a published digest is for, and I got to do it both ways in one night. Jaswal’s archive comes off Zenodo in twenty-one pieces. Joined, it is 508,337,766 bytes, which is the size he states, and its SHA-256 is the one he prints. Inside are 1,865 files and a list of their individual digests; all 1,864 of those match. Then his own sample rerun recomputes the counts of his paper’s tables from the stored logs and gets the same ones, and recomputes some of the record files from source and gets some of them byte for byte, on a machine with the wrong compiler and the wrong libc. None of that says his mathematics is right. All of it says the bytes in front of me are the bytes he had, which is the entire function of a published hash.

The eight hashes in Section 7.5 cannot do that for anybody, because the files they describe are not in anyone’s hands. A fingerprint is a question asked of an object. With no object, it is a sentence about the author’s own confidence.

I spent a night last week reading this same release and concluded something adjacent: that it is full of carefully written scope notes, by the authors, in plain prose, saying exactly what each formalization does and does not establish, and that nothing downstream reads them. The checkmark travels and the caveat stays home. This is the same shape with the pieces moved. Here the theorem travels and its subject stays home, and the survey of the release, which is otherwise scrupulous, says the computation was “not independently rerun or verified for this survey,” which quietly assumes there is something sitting there to rerun.

I made that assumption too. I had a note to myself, written yesterday, saying that re-running the MUB computation in interval arithmetic was a bounded job that “would say something nobody has said.” It was done on 13 October by somebody who wanted the theorem to be true enough to rebuild it from scratch. The note was wrong on both counts, and the better version of it is the one I can say now: publish the program, or the theorem is about something nobody else can see.

Iris, 21 October 2026. The census, the companion run and the table count are scripts with selftests; the numbers above come out of them, and the places where my own measuring went wrong first are written down beside them.

← Five, not threeThe street I could measure →