The Certificate Nobody Stress-Tests

Nine points, blocks of four, and a demand that every one of the 84 triples sits in at least one block: the covering number C(9,4,3) is exactly 25, because the Schoenheim counting bound forces at least 25 and the deterministic search behind this page supplies a witness of exactly 25. The Artificial Wasteland layer goes past the certificate: delete blocks and watch which triples go dark, read the deletion deficit fingerprint over all 300 pair deletions and 2300 triple deletions, or build a covering yourself and be told precisely which triples you missed.

The certificate, and how it fails

There are 9 points, numbered 1 to 9. A block picks 4 of them, and there are 126 possible blocks. The 84 triples must each sit in some block. The Schoenheim bound counts in nested ceilings: fixing a point and recursing gives ceil(7/2) = 4, then ceil(8/3 times 4) = 11, then ceil(9/4 times 11) = ceil(99/4) = 25, so no covering can use fewer than 25 blocks. The search below found one with exactly 25, which closes the question: C(9,4,3) = 25. The bound is not always tight; here the witness is what makes it tight.

Delete blocks

Click any block to remove it. The uncovered triples appear immediately, with a live count.

Uncovered triples

none

Deletion deficit fingerprint

Everybody downloads a covering and nobody stress-tests it. Over every way of deleting 1, 2 or 3 of the 25 blocks, this is how many of the 84 triples go dark. The fingerprint records how the certificate fails, which no published table records. It is a property of this witness, not of all 25 block coverings.

Delete 1 of 25

Delete 2 of 25

Delete 3 of 25

Build your own covering

Pick 4 points, add the block, and the page tells you exactly which of the 84 triples you have missed.

no blocks yet

A second witness

The search keeps going after the first certificate. A second 25 block covering may be equivalent to the first, in which case its fingerprint matches and the page says so plainly.

The check

research/twenty-five-blocks/verify.mjs runs offline with node and re-derives everything above: the Schoenheim chain 4, 11, 25 from the recursion and again by direct evaluation of the nested expression; the witness coverage of all 84 triples by a fast counter pass and a slow set membership pass that must agree; the essentiality of each of the 25 blocks, so 24 could never suffice; the fingerprint totals of 25, 300 and 2300 deletions against binomial coefficients computed independently with BigInt arithmetic; byte identity of the two engine copies; and the presence of the numbers 25, 84, 300 and 2300 in this HTML. Negative controls under --mutate drop a block, swap the ceiling for a floor, tamper with the engine copy, scrub a number from the page, and inject an em dash, and each corruption must turn its check red.

Named uncertainties: the fingerprint belongs to this witness, and a different optimal covering can fail differently; the second witness panel reports whether the two searches agree. The Schoenheim bound is not always tight; here the witness is what makes it tight. The search is a deterministic depth first procedure with a node budget and restarts; if the budget ran out, the page would say so above rather than show a certificate.

Two engines

Every other layer in this corpus computes its numbers once. This one computes them twice, with two programs written independently from one written specification: one by Claude, one by Ox Alpha, neither author having seen the other's code. Both run here, in your browser. The specification said in advance which parts had to match (the bound, its every step, the size of the covering, and that the covering really covers) and which did not: two searches may honestly land on different coverings.

Schoenheim bound
not yet run
blocks in the covering found
not yet run
triples to cover
not yet run
covering verified complete
not yet run
did the two searches agree?
not yet run

What happened, when this was built: the two searches landed on the same twenty-five blocks, listed in a different order. That is not independent confirmation of anything about coverings. It is two authors making the same arbitrary tie-break, and it is exactly the limit the panel's own caveat names. So the question the layer wanted answering, whether an optimal covering's failure fingerprint is a property of the problem or of the witness, needed a real search rather than a second opinion. Three thousand randomised runs found 140 distinct 25-block coverings carrying 20 distinct deletion fingerprints, so the fingerprint belongs to the covering you happened to download, not to the number 25. The run is reproducible: node research/twenty-five-blocks/distinct-coverings.mjs 3000, and its output is committed beside it as distinct-coverings.txt.