The Seed Covers Less Than You Think
A seed number is supposed to let you run the same thing twice and get the same answer back. What it actually guarantees is much smaller than that, and the size of the gap only shows up once something outside the seed's jurisdiction moves.
Pin a seed into a generative model and you expect the image back verbatim on a rerun. On the same machine, with the same software stack, that holds, down to the pixel. Swap the GPU underneath an otherwise identical pipeline and the same seed, same sampler, same everything-you-thought-you-controlled produces a visibly different image: different pose, different composition, not just different noise. Nothing in the pipeline complained. The seed still validated. It just turned out the randomness wasn't generated by a fixed, portable algorithm reading the seed as input, it was generated on the accelerator itself, step by step, and the specific floating-point behavior of that accelerator became part of the sequence without ever being named as a variable. The seed pinned the recipe. It never pinned the kitchen.
Every reproducibility guarantee works the same way. It is a hash, a lock, a pin, over a list of inputs somebody decided mattered enough to write down. Version numbers pin the package. Lock files pin the dependency tree. Seeds pin the generator's declared state. Compiler flags baked into a build database pin the exact invocation used to produce an object file. All of these are enumerations, and an enumeration is a claim about what varies, which is also, silently, a claim about everything else: that it doesn't. Nobody writes "assuming the floating-point unit behaves identically across vendors" into a seed. Nobody writes "assuming this file extension still means what it meant when the pattern list was built" into a format check. The things left out aren't edge cases the implementer missed. They're the entire rest of the world, collapsed into an unstated constant.
A file-type checker that sniffs an extension against a hardcoded list is doing the same thing, in miniature. The extension stands in for "I know how to handle this," the way a version pin stands in for "I know what this behaves like." Add a new extension nobody enumerated and the checker doesn't fail, it does something worse: it guesses, confidently, using whatever rule happens to be closest. One extension gets waved through as safe because it resembles nothing on the list. Another gets flagged as a multi-part archive because it shares two letters with one that is, even though the file inside is unrelated. Both outcomes look like decisions. Both are closer to a coin landing on its edge.
Build tooling has the same shape. A pinned, exact compiler invocation for a source file is reproducible in the narrowest possible sense: run that invocation again and you get the same object file. But the invocation depends on include paths and defines that live outside the pin, in a build configuration that differs machine to machine. Check the pin into a shared repository and the next person who clones it inherits a record of a build that happened somewhere else, on a tree that doesn't match their disk. The pin is accurate and useless at once. It describes a build that is no longer the build they are running.
The failure in all three cases isn't the domain, it's the shape. A reproducibility claim never promises "this will be the same." It promises "this will be the same with respect to the variables I thought to list," which is a much smaller and much more private claim, one that lives entirely inside the implementer's head at the moment they wrote the check. Unlisted variables aren't the scary part; every system has those. The scary part is that the identifier keeps validating after one of them moves. A broken lock file throws an error. A swapped GPU, a new extension, an uncommitted build config, none of these trip anything. The seed still looks like a seed. It has just quietly changed what it's a seed for.
Treat any identifier sold as a guarantee of sameness as a list, not a seal. The useful question is what got left off.