A computational search in the plane and in space. Every figure below comes from a file in the repository and is reproducible from it; where something is unproven or borrowed, it says so.
A tile's Heesch number is the maximum number of complete layers of copies that can surround it, for a tile that cannot tile the whole plane (in 2D) or the whole of space (in 3D). Maximum matters: H = k asserts both that k layers exist and that k+1 is impossible, and those halves are established differently — see how results are checked. A shape that does tile has no Heesch number at all, so every result here rests on first proving a shape cannot tile, and only then measuring how deep it goes.
What counts as a complete layer is not settled, and the answer changes the number. Grünbaum and Shephard define coronas through patches: each corona, together with everything inside it, must form a closed topological disk. A looser reading — argued for on the tiling list by Casey Mann and others — permits a hole to open in layer n provided layer n+1 fills it.
Every number on this site is meant in the strict reading. A layer may not enclose a hole, and its outer boundary may not touch itself at a single pinch point: in both cases the patch is not a disk. The solver itself allows holes in the outermost layer, so every witness is checked afterwards, corona by corona, for holes, pinch points and overlaps.
A witness with a hole or pinch point does not by itself lower a tile, because another closure of the same corona might be a clean disk. Until now there was no way to ask. We re-audited the 128 published records of up to 60 edges whose witness had a hole or pinch point, searching at each claimed corona for a closure that is a disk at every prefix. The search forbids each defect it meets as a pattern and asks the solver again. On the 40 tiles (of 50 tried) where exhaustive enumeration of every closure reached a verdict, the two agreed every time; on the other 10, enumeration did not finish.
| Lattice | Tile | H | Check |
|---|---|---|---|
| deltille | [@:BCCEBBCCAEBCC] | 3 → 2 | confirmed by enumeration |
| deltille | [@:AACCCCDCEBE] | 2 → 1 | confirmed by enumeration |
| deltille | [@:AAEBECDCCCC] | 2 → 1 | confirmed by enumeration |
| deltille | [@:ACBECCDCCCC] | 2 → 1 | defect-clause search |
| deltille | [@:ACCCCDCCEBC] | 2 → 1 | defect-clause search |
| deltille | [@:ACCCCDEACEB] | 2 → 1 | confirmed by enumeration |
| deltille | [@:ACDBADEBBBB] | 2 → 1 | confirmed by enumeration |
| deltille | [@:AEDCCCCABEC] | 2 → 1 | confirmed by enumeration |
| deltille | [@:BAADCDBEBBB] | 2 → 1 | confirmed by enumeration |
| deltille | [@:BABBBBEBBDC] | 2 → 1 | defect-clause search |
| deltille | [@:BABCDBBEBBB] | 2 → 1 | defect-clause search |
| deltille | [@:BBBBEBDCDAA] | 2 → 1 | confirmed by enumeration |
| deltille | [@:BBBBEDABDCA] | 2 → 1 | confirmed by enumeration |
| deltille | [@:AACEDECDCEBE] | 2 → 1 | confirmed by enumeration |
| deltille | [@:AAEBECDCEDEC] | 2 → 1 | confirmed by enumeration |
| deltille | [@:ACACCBECBBEC] | 2 → 1 | confirmed by enumeration |
| deltille | [@:AEAEDCEAC/^^^^^vvvv] | 1 → 0 | confirmed by enumeration |
| kisquadrille | [@:AAIAIIGFM] | 2 → 1 | confirmed by enumeration |
| kisquadrille | [@:AANEGIIAI] | 2 → 1 | confirmed by enumeration |
| kisquadrille | [@:CIGGAGAAL] | 2 → 1 | confirmed by enumeration |
| kisquadrille | [@:DKAAGAGGI] | 2 → 1 | confirmed by enumeration |
| kisquadrille | [@:AAAIAIIGAFM] | 2 → 1 | confirmed by enumeration |
| kisquadrille | [@:AAANEAGIIAI] | 2 → 1 | confirmed by enumeration |
| kisquadrille | [@:AFMAGIAIIGI] | 2 → 1 | confirmed by enumeration |
| kisquadrille | [@:AIGAGGIGADK] | 2 → 1 | confirmed by enumeration |
| kisquadrille | [@:AIGANEAIGII] | 2 → 1 | confirmed by enumeration |
| kisquadrille | [@:AIGGAGAAALC] | 2 → 1 | confirmed by enumeration |
| kisrhombille | [@:AACYMCMY] | 2 → 1 | confirmed by enumeration |
| kisrhombille | [@:JCJVAACV] | 2 → 1 | confirmed by enumeration |
| kisrhombille | [@:0AOEJVAR] | 1 → 0 | confirmed by enumeration |
| kisrhombille | [@:0JDNHAHR] | 1 → 0 | confirmed by enumeration |
| kisrhombille | [@:AKO2MFQK] | 1 → 0 | confirmed by enumeration |
| kisrhombille | [@:AKRGM1NK] | 1 → 0 | confirmed by enumeration |
| kisrhombille | [@:ARGMYAO2] | 1 → 0 | confirmed by enumeration |
| quadrille | [@:BABBCACABAABBACABAAA] | 2 → 1 | defect-clause search |
| quadrille | [@:BBACAABCBBCBBACAABAA] | 2 → 1 | confirmed by enumeration |
| quadrille | [@:BBCBBCCAABABBCAABAAA] | 2 → 1 | confirmed by enumeration |
| quadrille | [@:BBCBCCBABBCBACBBACBA] | 2 → 1 | confirmed by enumeration |
| quadrille | [@:BBCABBAABA/^^^vv=====] | 1 → 0 | confirmed by enumeration |
| quadrille | [@:BCBABABACBBA/^^^^vvv=====] | 1 → 0 | confirmed by enumeration |
| quadrille | [@:ACBABABAACBBAB/^^^^vvv=======] | 1 → 0 | confirmed by enumeration |
| quadrille | [@:ACBABABACBABAB/^^^^vvv=======] | 1 → 0 | confirmed by enumeration |
| quadrille | [@:ACBABABACBBCBB/^^^^vvv=======] | 1 → 0 | confirmed by enumeration |
| quadrille | [@:ACBBAABBCAABBA/^^^^^^^vvvvvv=] | 1 → 0 | confirmed by enumeration |
| quadrille | [@:BBCABABCBCBBABCCBA] | 1 → 0 | confirmed by enumeration |
| rhombille | [@:ACACCBECBBEC] | 2 → 1 | confirmed by enumeration |
| rhombille | [@:ACACEBBCEBCC] | 2 → 1 | confirmed by enumeration |
| rhombille | [@:BABABBCDBCCD] | 2 → 1 | confirmed by enumeration |
| rhombille | [@:BABABDCCBDCB] | 2 → 1 | confirmed by enumeration |
| rhombille | [@:ACABCCCCABCBEC] | 2 → 1 | defect-clause search |
| rhombille | [@:ACACCBEBECDBEC] | 2 → 1 | confirmed by enumeration |
| rhombille | [@:ACACEBCBACCCCB] | 2 → 1 | defect-clause search |
| rhombille | [@:ACACEBDCEBEBCC] | 2 → 1 | confirmed by enumeration |
| rhombille | [@:ACBBBBACBCDBAB] | 2 → 1 | defect-clause search |
| rhombille | [@:BBCBBDCABB/^^^^^vvvv=] | 1 → 0 | confirmed by enumeration |
| rhombille | [@:BBACBBBBACBB/^^^^^^vvvvv=] | 1 → 0 | confirmed by enumeration |
| rhombille | [@:BBCABBBBCABB/^^^vv=======] | 1 → 0 | confirmed by enumeration |
| rhombille | [@:ACABCCEBCBCBEC] | 1 → 0 | confirmed by enumeration |
| snub quadrille | [@:BBBFFECHD] | 1 → 0 | confirmed by enumeration |
| snub quadrille | [@:BBDHCEFFB] | 1 → 0 | confirmed by enumeration |
| snub quadrille | [@:BDGGCCCEI] | 1 → 0 | confirmed by enumeration |
| snub quadrille | [@:BIECCCGGD] | 1 → 0 | confirmed by enumeration |
Tools: the searches and audits use the flattice engine with the CaDiCaL SAT solver; the audit and search scripts were written with the help of Claude (Anthropic).
This began as sculpture, and still is. For more than forty years the author has worked on lattice path-finding — walks through three-dimensional lattices as the generative basis for sculptural form — in a long collaboration with Tom Verhoeff. Over that time the path-finding grew into a grammar: a small language whose words describe a walk, so that a family of forms can be written down rather than enumerated by hand.
A path through a lattice can be constrained to lie in a plane. A closed planar path is a polygon; a polygon that repeats is a tiling. So the machinery built for sculpture, turned sideways, is already a machinery for tiles — which is why the grammar that generates the tiles on this site is the same idea as the one that generates sculptural paths, and why the 3D lattices it knows about are the ones the sculpture work uses.
Doris Schattschneider taught the author about tiling, and about the Heesch types in particular. From there the question of how many complete layers can surround a shape that cannot tile — its Heesch number — was one the existing tools could be pointed at. That is the whole origin of this project: not a tiling program that grew a sculpture side, but a sculpture program that turned out to be able to ask a tiling question.
family_HK) is built on that principle and emits plane tilers by
construction.
What the corpus confirms is that this is exactly what our own tiles do. Every marked tile here with a finite Heesch number is built on one of 14 distinct base shapes (35 marked tiles, since several shapes carry more than one marking). Strip the markings off and all 14 tile the plane — precisely the population Kaplan's result identifies as productive.
Measured, not assumed: all 14 base shapes were re-tested with the plane-tiling oracle and all 14 are tilers. The only tiles in the corpus whose base shape is not a tiler are the two that carry no markings at all, where the geometry does the work instead.
Tiles are generated by a grammar whose words walk lattice edges and close into a polyform. Edges carry a bump, a matching nick, or a flat; a bump may only ever meet a nick. That single rule is what makes a shape refuse to tile while still surrounding itself many layers deep.
| H | tiles | what they are |
|---|---|---|
| 6 | 1 | Bašić's published record tile — a control, not a discovery here |
| 5 | 13 | marked polyiamonds, 18–33 edges, all on deltille — 6 constructions, see below |
| 4 | 2 | marked polyiamonds |
| 3 | 2 | unmarked — 13 edges, shape alone |
| 2 | 8 | marked |
| 1 | 12 | marked |
"13 tiles at H=5" invites the reading that thirteen separate objects were
found. They are not. Every base shape here has the same construction — a cap,
then (BC)k, a small core, (CB)k,
a closing cap — and growing k gives the next member.
| family | tiles at H=5 | edge counts |
|---|---|---|
| BB..BB / BBBB | 4 | 18, 18, 22, 26 |
| DC..CDA / BBBB | 4 | 21, 25, 29, 33 |
| BB..BB / BABD | 2 | 28, 32 |
| BB..BB / DCD | 1 | 30 |
| DC..CDA / BABD | 1 | 31 |
| DC..CDA / DCD | 1 | 29 |
So the defensible statement is that six constructions reach H=5, and two of them keep doing so as they grow. That second half is the more interesting claim and is invisible in the raw count: depth is something the family retains across sizes, not a coincidence at one size.
None of the verdicts change. Each of the thirteen is independently proven, corona by corona.
Depth needs d = 1 — and among the markings actually tested,
three runs of like markings beats four, decisively:
| runs | H=1 | H=2 | H=4 | H=5 |
|---|---|---|---|---|
| 3 | 6 | 0 | 2 | 12 |
| 4 | 62 | 8 | 0 | 0 |
14 of 20 markings at three runs reach H≥4; none of the 70
at four runs exceeds H=2. What makes d a constraint rather than a
trend is that d=2 and d=3 tiles are equally
provable non-tilers and are uniformly shallow — failing to tile is not what
produces depth, failing by the smallest possible margin is.
That leaves a concrete gap. A marking can carry d = 1 in
two runs — a block of bumps against a block of nicks, no flats.
If fewer runs really is deeper, that is where the next result would be, and it
has never been tried.
The counting bound d·T(k) ≤ B(k) is not binding
here — the measured ratio is about 0.2. What limits these families is local
matching, not global counting.
The d=1, ≤3-runs law, and its consequence: stated
constructively rather than as a filter, it leaves O(E) markings for a
tile of E edges instead of 3E. At 75 edges that is 75
candidate markings against 375 ≈ 6×1035.
Also: depth is deltille-only. Seven of the eight distinct lattices in the engine were swept without producing anything at H≥5.
"if a rhombic dodecahedron is marked with conical bumps and nicks on its faces so as to be combinatorially unbalanced, a simple counting argument reveals that the maximum possible Heesch number is 8. However, it is unknown whether or not eight coronas of such a tile can be realized." … "these tiles have defied exhaustive computer checks because of the vast number of combinatorial possibilities."
— Casey Mann, Heesch's Tiling Problem, Amer. Math. Monthly 111
The tile is taken to be the Voronoi cell of its own lattice. Every copy then sits on a lattice site, so there is no placement search and overlap is impossible by construction; the only unknown is which orientation each site's marking takes. Whether corona k exists becomes a SAT problem — one variable per site and orientation, mating constraints across every shared face, all layers in one formula. A satisfying assignment is the patch; unsatisfiable is a proof that no such layer exists.
| cell | faces | classes | state | max H |
|---|---|---|---|---|
| cube | 6 | 57 | complete | 2 |
| hexagonal prism | 8 | 666 | complete | 3 |
| rhombic dodecahedron | 12 | 22,815 | complete | 2 |
| elongated dodecahedron | 12 | 67,257 | complete | 1 |
| truncated octahedron | 14 | 200,961 | every d=1 decided | 4 |
There are exactly five convex polyhedra that tile space by translation, and every one has been searched with markings. The deepest marked space-filling cell in 3D has Heesch number 4, on the truncated octahedron, reached independently by two markings. The direction is closed.
The truncated octahedron is listed as "every d=1 decided" rather than complete: 48,984 of its classes carry d=1 and all are done, while 93,719 remain at d>1 or d=0. Since every marking with a proven H≥2 on any of the five cells has d=1, what remains is census completeness rather than discovery.
The hexagonal prism has eight faces and reaches 3, beating the rhombic dodecahedron's twelve — and it was the only cell tested that is not face-transitive. That suggested face-type asymmetry might matter more than face count.
The elongated dodecahedron is the clean test: the same twelve faces as the rhombic dodecahedron, also not face-transitive. If asymmetry carried depth it should have beaten 2. It reaches 1. The two non-face-transitive cells land at 3 and 1 — the extremes of the table. The hypothesis is dead, and nothing else obvious replaces it: face count is not monotonic (6→2, 8→3, 12→2, 12→1, 14→4), and the cell that goes deepest has the fewest contacts.
What survives is a regularity, not a law — and the distinction matters. Of the 58 markings reaching H≥2 across all five cells, six have d=2, all on the rhombic dodecahedron. Of the 16 that reach H≥3, every one has d=1.
The obvious candidate proof is the counting bound, which at depth 2 reads
(1 + n1 + n2)·d ≤ n2·F.
Evaluated on each cell it is slack by a factor of 2.4 to 5.4 at d=2, and only
forbids anything from d≥5 upward — d≥11 on the truncated octahedron.
102,314 markings with d≥2 have been decided and none reached H≥3, while the argument supposed to constrain them permits d=2 several times over. So the obstruction is local matching, not global counting. That is a measured result, and it says where a proof of the d=1 law will not be found.
All 22,815 rhombic-dodecahedron marking classes are decided. Split by the property Mann's bound depends on:
| H=0 | H=1 | H=2 | reaches 8 | |
|---|---|---|---|---|
| unbalanced (d>0) | 19,104 | 538 | 12 | none |
| balanced (d=0) | 1,906 | 80 | — | 1,175 |
The deepest unbalanced rhombic dodecahedron has Heesch number 2. Eight is not realised, and the counting bound of 8 is nowhere near tight.
The 1,175 that do reach eight layers are balanced, so his bound never applied to them; each was climbed to corona 8 and closed it, which is what a space-filler does. The two populations never meet: no balanced marking is refuted above 1, and no unbalanced marking survives past 2. Reading "1,175 tiles reach 8" as a yes would inverted what it shows.
On a lattice Mann's paper does not discuss, two independent markings reach
H = 4 — ^====^^vv===== and
^====^v=v====v, both with d = 1. For each: coronas 1–4
close and the patch is verified face by face (369 cells, 4,192 shared faces, no
mismatch), and corona 5 is refuted by two solvers on two encodings.
d > 0 with no wild faces proves a tile cannot fill space, so its Heesch number is finite. It runs before any solver and costs nothing.d>0 tile, a sweep that closes every corona asked is a proven H ≥ cap, not an inconclusive result. The first H=4 was found exactly this way, sitting among 148 balanced CAP rows that looked identical.d = 1. That class — d=1 with at most 7 marked faces — is 9.5% of the space, holds 90% of all known depth, and is now completely swept.Kaplan's result says markings can only lower a Heesch number. The
natural next question is whether lowering it more — a larger bump/nick
imbalance d — lowers it further. It does, and the effect is the
clearest thing in the 3D data.
Measured only on the four cells swept exhaustively, so no search order can be responsible:
| d | classes decided | max proven H |
|---|---|---|
| 0 | 12,621 | 1 |
| 1 | 23,588 | 3 |
| 2 | 19,942 | 2 |
| 3 | 14,684 | 1 |
| 4 | 9,752 | 1 |
| 5 | 5,530 | 0 |
| 6 | 2,844 | 0 |
90,795 markings, monotone decay. The truncated octahedron is deliberately
excluded: its sweep was ordered by d and stopped early, so it
cannot testify about d.
A confound had to be cleared: larger d requires more
marked faces, so "high d is shallow" and "densely marked is shallow" could be
the same fact. Holding the marked-face count fixed and varying d
separates them — depth collapses from 2–3 to zero every time, while holding
d fixed and varying density gives a weak, non-monotonic effect.
The imbalance is the operative variable.
The obvious mechanism is accumulation: a surplus of T(k)·d
must be absorbed by a boundary growing only as the surface, so it should fail
sooner for larger d. If that were the binding constraint, tiles
would stop where the surplus approaches capacity. Measured at each cell's own
ceiling, the ratio is 0.089 to 0.213 — and still under 0.27 one
corona past where they actually fail.
So the quantity is right and the accounting is not. A proven non-tiler must
have d ≥ 1, and every increase in d costs depth:
the same quantity is both required and penalising. But the cost is not paid
through a global shortage — it is paid locally, at each contact,
where the constraint does not relax as the patch grows. That is where a proof
would have to come from, and it is untested.
Every tile on this site is published with the program the solver was run on,
so any result can be re-run rather than taken on trust. A program looks like
[@:BBCBCBCBBBBCBCBCBB/^^^^^^^^vvvvvvvvv=] on deltille, and has two
fields.
^ is a bump, v a nick and
= flat. Two tiles may share an edge only bump against nick or flat
against flat. The solver also accepts ., a wildcard compatible with
anything; that is a removed constraint rather than an edge shape, and no tile on
this site carries one.Where the walk starts and which way it first faces do not matter: the solver tries every placement and orientation the lattice allows, and mirror images count as copies of the same tile. Lengths below are rounded, and the solver itself works on exact lattice points. On lattices with more than one kind of vertex, a move is only available from vertices that have it, so not every string of letters traces a tile.
The tables are generated from the solver itself, not typed in. Every one of the 651 programs published on this site was traced from them by the rule above and matches its drawn tile exactly, marks included; the page is not rebuilt if any does not.
| turn | step 0.73 | step 1 |
|---|---|---|
| 0° | A | B |
| +60° | C | D |
| -60° | E | F |
| +90° | G | |
| -90° | H |
| turn | step 1 |
|---|---|
| 0° | A |
| +45° | B |
| -45° | C |
| +90° | D |
| -90° | E |
| turn | step 1 |
|---|---|
| 0° | A |
| +60° | B |
| -60° | C |
| +120° | D |
| -120° | E |
| turn | step 1 | step 1.41 |
|---|---|---|
| 0° | A | B |
| +45° | C | D |
| -45° | E | F |
| +90° | G | H |
| -90° | I | J |
| +135° | K | L |
| -135° | M | N |
| turn | step 1 | step 1.73 | step 2 |
|---|---|---|---|
| 0° | A | B | C |
| +30° | D | E | |
| -30° | F | G | |
| +60° | H | I | J |
| -60° | K | L | M |
| +90° | N | O | P |
| -90° | Q | R | S |
| +120° | T | U | V |
| -120° | W | X | Y |
| +150° | Z | 0 | |
| -150° | 1 | 2 |
| turn | step 1 |
|---|---|
| 0° | A |
| +90° | B |
| -90° | C |
| turn | step 1 |
|---|---|
| 0° | A |
| +60° | B |
| -60° | C |
| +120° | D |
| -120° | E |
| turn | step 1 |
|---|---|
| 0° | A |
| +30° | B |
| -30° | C |
| +60° | D |
| -60° | E |
| +90° | F |
| -90° | G |
| +120° | H |
| -120° | I |
| turn | step 1 | step 1.73 |
|---|---|---|
| 0° | A | B |
| +60° | C | D |
| -60° | E | F |
| +90° | G | H |
| -90° | I | J |
| +120° | K | |
| -120° | L |
| turn | step 1 |
|---|---|
| 0° | A |
| +45° | B |
| -45° | C |
| +90° | D |
| -90° | E |
Closures and refutations are different kinds of claim and are checked differently.
Every result here needs a shape proved not to tile before its Heesch number means anything. The obvious way to discover that a shape does tile is to keep wrapping layers around it and watch them never fail — which is slow and never actually concludes. One 6-cell shape cost 163 seconds across three coronas to earn the verdict "closed everything we asked; almost certainly tiles". Expensive, and still a shrug.
So we ask a different question: can copies fill one small box that wraps around on itself? Fly off the right edge and you reappear on the left, off the top and you are back at the bottom — a cube with opposite faces glued is a torus.
The move that makes it work: if copies fill that wrapped box exactly, every cell covered and none twice, then stacking the box endlessly in every direction tiles all of space. Filling the torus does not suggest a tiling. It builds one. And it is a small finite puzzle rather than an unbounded search:
| same shape, same question | time | answer |
|---|---|---|
| corona climb | 163s | "almost certainly tiles" |
| torus filter | 0.00s | tiles — and here is the tiling |
So the filter may skip work and may never decide. It removes the boring majority so that the expensive corona search only ever runs on genuine candidates — and the corona search remains the sole arbiter.
A bigger box is not a better test. A box of size m only detects patterns repeating every m. One shape tiled with period 4 and correctly failed on the 6-box, because 4 does not divide 6. The filter must therefore try a set of sizes rather than climb to a bound — the first version tried only 1, 2 and 3, and let a tiler through into a full corona climb that concluded nothing.
A shape can be screened by nothing at all. The box only works when the shape's size divides the number of cells in it. Five 13-cell shapes had no usable box in the range being tried, so they were tested by nothing — and four then closed three coronas and looked exactly like depth. On the 13-box, all five turned out to tile. The tool now reports which boxes it actually used, and hunts for a usable one rather than silently screening nothing.
Every marked tile on this page pays a hidden tax. A bump has to find a nick, so the count of unmatched marks — the imbalance — is a resource, and it runs out. Across five three-dimensional cells and 253,250 marked classes, sixteen markings reach a Heesch number of 3 or more and every one of them has an imbalance of exactly one; none of the 180,678 with an imbalance of two or more gets there. The marking is what makes a tile fail to tile at all, and it is also what caps how far it can go.
So Anton Bakker proposed a shape that fails to tile with no markings at all. Take a tile that already tiles the plane many ways. Split a copy of it, and graft that half onto the whole. The result covers one and a half tiles, so two of them make three — nothing is left over. The grafted half can only ever meet another grafted half: it is a shape looking for a copy of itself, not a bump looking for a nick. There is no imbalance, because there is nothing to balance.
Run on the square grid from thirty-five six-cell bases, every one of them a tiler, the construction produced 1,016 nine-cell candidates. 861 were proved to tile and thrown away, 32 had a hole or a pinch point and could not be written as a boundary word, and 123 survived. Climbing all 123 took 82 seconds:
| result | shapes |
|---|---|
| Heesch number 2 | 4 |
| Heesch number 1 | 94 |
| Heesch number 0 — cannot be surrounded even once | 24 |
| survived the screen but turned out to tile | 1 |
122 of the 123 are proved non-tilers, carrying no markings whatsoever. Their Heesch numbers come from shape alone.
Depth reached: two. Against a marked corpus that reaches five that is not yet interesting, and it should not be dressed up as though it were. What it does establish is narrower and worth having — the population exists, and it can be found at a useful rate. Nine cells is simply small.
The imbalance is not only a ceiling; it is also the proof. A tile whose marks cannot balance is proved a non-tiler by counting alone, for free, which is why 200,961 markings can be swept in an afternoon. A shape with no markings has no such certificate, so every single candidate has to be screened and then climbed. This direction is far more expensive per shape, not less, and the open problem it creates is what certifies non-tiling once counting is gone.
Screening is what makes the construction affordable, and it works by asking a question about clusters. A tile may not tile the plane by itself in a single repeating role, yet two copies stuck together might form a super-tile that does, or three might, or four. Those are the 2-, 3- and 4-anisohedral cases. The filter builds one layer around the candidate, forms every pair and every triple of touching tiles, computes the outline of each little group, and asks whether that outline tiles by itself. If any of them does, the candidate tiles the plane and is discarded.
The test only ever runs in one direction. Finding such a cluster proves the shape tiles. Failing to find one proves nothing at all — so survivors are candidates, never results, and the corona climb stays the only arbiter.
That distinction earned its keep. One survivor closed four layers without failing, which looks exactly like depth. Asked whether it might be aperiodic — a shape that tiles only in non-repeating patterns, which would be a significant result — the answer came back mundane: the screen had been testing clusters of two and three, and the shape tiles perfectly well with a fundamental domain of four. It closed a seventh layer too, as a tiler will forever. Had survivors been treated as established non-tilers rather than as candidates, a tiler would now be sitting in this table wearing a Heesch number.
The cost of each stage is why they are ordered as they are. On twelve-cell shapes a small-torus test costs about a second, the 2-cluster test about three, and the 3-cluster test about fifty. Running the expensive one on everything is several hundred hours for a single size; running it only on what survives the cheap ones is a night.
A tile that fails to tile does so because its markings cannot all find partners. The count of unmatched marks — the imbalance — is the thing that runs out, and it can be measured. Across five three-dimensional cells and 253,250 marked classes, sixteen markings reach a Heesch number of 3 or more. Every one of them has an imbalance of exactly one. None of the 180,678 with an imbalance of two or more gets there; the expected number, if imbalance did not matter, is 37.
That was measured on solid cells. It has since been tested in the plane independently, on 71,207 tiles: an imbalance of two caps out at 2, an imbalance of three does not reach 1 at all. Two rules the search had been carrying on faith — imbalance one, and markings arranged in at most three blocks — turn out to be right, and now they are right for a reason rather than by habit.
Five separate ways of generating candidates were swept out: constraining the turn angle of each edge, building a boundary from a segment and its own reverse, widening the markings, relaxing single edges to wildcards, and carrying whole architectures from one lattice to another.
| approach | tiles | deepest |
|---|---|---|
| turn-angle constraints | 661,486 | 4 |
| wider markings and imbalances | 71,207 | 3 |
| grammar-generated structures | 30,000 | 3 |
| segment and its reverse | 16,745 | 1 |
| sampled larger tiles | 6,420 | 1 |
None of it produced a tile at 5. Every tile we have at that depth came instead from a construction — a recipe written down and then run at different sizes. Searching has been very good at mapping the shallow ground, and has never once reached the deep.
Each construction turns out to have a ceiling it reaches at its smallest member and then holds. One family sits at 5 from eighteen edges to thirty-four; another at 3 from fourteen to thirty-two; a third at 3 across twelve consecutive sizes. Making a tile bigger does not make it deeper. The sole exception in the whole corpus is Basic's record tile, where the fifth repeat of a unit reaches 6 while the fourth reaches only 5 — the one place where depth moves with a parameter, and the one mechanism still unexplained.
The corpus looked for a long time like two architectures. Classified properly it was one family plus Basic — the seventeen tiles at depth 5 or more are that single recipe at different sizes. The apparent scarcity was a fact about where we had looked, not about tilings: the first search to enumerate structures away from the known family found a new one immediately.
And a marking need not be fully specified. Leaving one edge free — able to meet anything — took two tiles from 3 to 4. Leaving three free turned the same tile into an ordinary tiler that fills the plane. Depth is lost by relaxing too much and gained by relaxing just enough, which is a narrow window nobody had looked into because a fully specified marking is what makes the counting argument work.
Recorded because they cost real time and redirect the search.
| question | answer |
|---|---|
| Can an unbalanced rhombic dodecahedron reach 8? | No — the ceiling is 2, across all 22,815 classes |
| Do minimal shape perturbations give depth? | No — 46 one-cell perturbations of space fillers, max H=2 |
| Do small unmarked polyorthoschemes? | N=4 max H=0; N=5 max H=2, over all 42 shapes |
| Is a finer cell cheaper to search? | No — 3× more cells at equal corona depth |
The perturbation result is the sharpest of these. If depth came from minimal
non-tiling in general, a shape one cell away from a space filler should
reach comparable depth. It does not: 23 of 46 cannot close a single corona.
Removing a cell opens a concavity nothing can wrap, while a d=1
marking leaves the geometry intact and breaks only the matching rule. So it is
the markings, and that is a result about mechanism rather than a convenience.
Every open question in the plane is blocked by the same thing: CryptoMiniSat addresses its clause arena with 32-bit offsets, so the database caps near 230 regardless of machine memory. A failed run peaked at 45.6 GB on a 128 GB box. The wall is a clause count, so the formulas were measured.
| change | clauses | time |
|---|---|---|
| 2D overlap: pairwise → ladder at-most-one | 98.3M → 38.8M | 96.5s → 38.4s |
| 3D surround: product form → coverage variables | 2.60M → 0.50M | 15.7s → 1.9s |
| 3D mating: forbidden pairs → support clauses | 420K → 153K | — |
One line of the 2D encoder was 83.9% of the entire formula — every pair of placements sharing a sector got its own clause, an at-most-one written longhand as P²/2. Each re-encoding was verified against every recorded verdict before use (24/24 in 2D; 1,251/1,251 and 16/16 in 3D), because a re-encoding that quietly changed an answer would not look like a bug, it would look like a discovery.
Solver choice was measured rather than assumed, on one hard instance:
| solver | encoding | seconds |
|---|---|---|
| CryptoMiniSat | forbidden pairs | 32,532 |
| CryptoMiniSat | support | 22,571 |
| CaDiCaL | support | 3,066 |
The solver is worth 7.4× and the encoding 1.44× — the reverse of what the clause counts suggest. But CaDiCaL loses on easy instances, and a sweep is overwhelmingly easy instances, so the climb now routes by depth rather than switching wholesale.
d=1 law: 9× enrichment for depth.Tom Verhoeff — for more than forty years of collaboration on the lattice path-finding this is all built on, and on the grammar it grew into. None of the machinery here exists without that work; the tiling questions are a late branch of it.
Doris Schattschneider — who taught the author about tiling and about the Heesch types, and so is the reason this question was asked at all.
Casey Mann — for the 3D question this work answers, and for the H=5 "pillar" polyforms that were the previously known record in the plane.
Craig S. Kaplan — for the result that adding markings can only lower a Heesch number, which is why the productive candidates are plane tilers, and for the published census of unmarked polyforms used here as a reference and a negative control.
The H=6 tile is Bojan Bašić's.
Naming them is a thank-you, not a claim of endorsement: none of these results have been reviewed by them, and any errors are the author's.
The searches, solvers and verification harnesses behind these results were written with Claude Opus 5 (Anthropic), working from the author's direction on what to search and which results to trust. The code was machine-written; the research direction and the judgement about which claims were worth making were not.
It is recorded because it bears on how the results should be weighed. Machine-written search code fails in a specific way — it produces plausible numbers — and in this project it did so repeatedly:
None announced themselves. Each was caught by a control that re-derived a known answer. That is why every lattice here is re-derived and checked against its published description before use, why refutations are confirmed on two solvers and two encodings, why closures are rebuilt and re-checked face by face independently of the solver that found them, and why CLOSED / REFUTED / INCONCLUSIVE are never collapsed into one another.
The results stand on those checks, not on the provenance of the code. The underlying data files are in the repository and every figure here is reproducible from them.