Heesch numbers: method, results, and what is actually new

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.

Which definition of a layer

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.

Corrections, 25 September 2026

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.

The 62 strictly lower records
LatticeTileHCheck
deltille[@:BCCEBBCCAEBCC]3 → 2confirmed by enumeration
deltille[@:AACCCCDCEBE]2 → 1confirmed by enumeration
deltille[@:AAEBECDCCCC]2 → 1confirmed by enumeration
deltille[@:ACBECCDCCCC]2 → 1defect-clause search
deltille[@:ACCCCDCCEBC]2 → 1defect-clause search
deltille[@:ACCCCDEACEB]2 → 1confirmed by enumeration
deltille[@:ACDBADEBBBB]2 → 1confirmed by enumeration
deltille[@:AEDCCCCABEC]2 → 1confirmed by enumeration
deltille[@:BAADCDBEBBB]2 → 1confirmed by enumeration
deltille[@:BABBBBEBBDC]2 → 1defect-clause search
deltille[@:BABCDBBEBBB]2 → 1defect-clause search
deltille[@:BBBBEBDCDAA]2 → 1confirmed by enumeration
deltille[@:BBBBEDABDCA]2 → 1confirmed by enumeration
deltille[@:AACEDECDCEBE]2 → 1confirmed by enumeration
deltille[@:AAEBECDCEDEC]2 → 1confirmed by enumeration
deltille[@:ACACCBECBBEC]2 → 1confirmed by enumeration
deltille[@:AEAEDCEAC/^^^^^vvvv]1 → 0confirmed by enumeration
kisquadrille[@:AAIAIIGFM]2 → 1confirmed by enumeration
kisquadrille[@:AANEGIIAI]2 → 1confirmed by enumeration
kisquadrille[@:CIGGAGAAL]2 → 1confirmed by enumeration
kisquadrille[@:DKAAGAGGI]2 → 1confirmed by enumeration
kisquadrille[@:AAAIAIIGAFM]2 → 1confirmed by enumeration
kisquadrille[@:AAANEAGIIAI]2 → 1confirmed by enumeration
kisquadrille[@:AFMAGIAIIGI]2 → 1confirmed by enumeration
kisquadrille[@:AIGAGGIGADK]2 → 1confirmed by enumeration
kisquadrille[@:AIGANEAIGII]2 → 1confirmed by enumeration
kisquadrille[@:AIGGAGAAALC]2 → 1confirmed by enumeration
kisrhombille[@:AACYMCMY]2 → 1confirmed by enumeration
kisrhombille[@:JCJVAACV]2 → 1confirmed by enumeration
kisrhombille[@:0AOEJVAR]1 → 0confirmed by enumeration
kisrhombille[@:0JDNHAHR]1 → 0confirmed by enumeration
kisrhombille[@:AKO2MFQK]1 → 0confirmed by enumeration
kisrhombille[@:AKRGM1NK]1 → 0confirmed by enumeration
kisrhombille[@:ARGMYAO2]1 → 0confirmed by enumeration
quadrille[@:BABBCACABAABBACABAAA]2 → 1defect-clause search
quadrille[@:BBACAABCBBCBBACAABAA]2 → 1confirmed by enumeration
quadrille[@:BBCBBCCAABABBCAABAAA]2 → 1confirmed by enumeration
quadrille[@:BBCBCCBABBCBACBBACBA]2 → 1confirmed by enumeration
quadrille[@:BBCABBAABA/^^^vv=====]1 → 0confirmed by enumeration
quadrille[@:BCBABABACBBA/^^^^vvv=====]1 → 0confirmed by enumeration
quadrille[@:ACBABABAACBBAB/^^^^vvv=======]1 → 0confirmed by enumeration
quadrille[@:ACBABABACBABAB/^^^^vvv=======]1 → 0confirmed by enumeration
quadrille[@:ACBABABACBBCBB/^^^^vvv=======]1 → 0confirmed by enumeration
quadrille[@:ACBBAABBCAABBA/^^^^^^^vvvvvv=]1 → 0confirmed by enumeration
quadrille[@:BBCABABCBCBBABCCBA]1 → 0confirmed by enumeration
rhombille[@:ACACCBECBBEC]2 → 1confirmed by enumeration
rhombille[@:ACACEBBCEBCC]2 → 1confirmed by enumeration
rhombille[@:BABABBCDBCCD]2 → 1confirmed by enumeration
rhombille[@:BABABDCCBDCB]2 → 1confirmed by enumeration
rhombille[@:ACABCCCCABCBEC]2 → 1defect-clause search
rhombille[@:ACACCBEBECDBEC]2 → 1confirmed by enumeration
rhombille[@:ACACEBCBACCCCB]2 → 1defect-clause search
rhombille[@:ACACEBDCEBEBCC]2 → 1confirmed by enumeration
rhombille[@:ACBBBBACBCDBAB]2 → 1defect-clause search
rhombille[@:BBCBBDCABB/^^^^^vvvv=]1 → 0confirmed by enumeration
rhombille[@:BBACBBBBACBB/^^^^^^vvvvv=]1 → 0confirmed by enumeration
rhombille[@:BBCABBBBCABB/^^^vv=======]1 → 0confirmed by enumeration
rhombille[@:ACABCCEBCBCBEC]1 → 0confirmed by enumeration
snub quadrille[@:BBBFFECHD]1 → 0confirmed by enumeration
snub quadrille[@:BBDHCEFFB]1 → 0confirmed by enumeration
snub quadrille[@:BDGGCCCEI]1 → 0confirmed by enumeration
snub quadrille[@:BIECCCGGD]1 → 0confirmed 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).

Two consequences, both worth stating plainly.

A shape that tiles the plane can still be handed a finite number under this reading. Bojan Bašić's order-11 polyhex is exactly that, and Craig Kaplan reports the same on a 9-omino. Our solver did it too: screening found 170 plane tilers carrying finite values in the Inventory and a further 16 in the main gallery, because nothing in the pipeline asked whether the shape tiles. All are excluded; every result at H≥4 was unaffected. The screen looks for a cluster of up to three tiles whose outline tiles isohedrally, so an unmarked tile that passes it is a candidate non-tiler, not a proven one; a marked tile whose bumps and nicks cannot balance is proven.

It also means the most interesting open case is out of reach here. Kaplan has said what would be most valuable to find, and what would reveal errors in the published tables: a shape that does not tile, whose depth can only be achieved if a hole opens in layer n and is filled at layer n+1. This solver cannot find such a configuration — not for want of searching, but because of how it builds layers: it can leave a gap enclosed in the outermost layer, as above, but it builds the next layer along the outer outline only, so it never fills one. Looking for it needs a different construction, not a longer run.

Where this comes from

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.

Worth saying plainly, because it shapes what follows: the artistic work is the long-running project and this is a branch of it. The searches here are the sculpture machinery aimed at an open mathematical question, not a purpose-built prover.

The mechanism

This part is Craig S. Kaplan's, not ours. In Heesch Numbers of Unmarked Polyforms (§7) he shows that adding markings to a shape can only lower its Heesch number, never raise it. It follows that the productive candidates are plane tilers: a tiler has no finite number to lower, so marking one can descend to a large finite value, whereas marking a shape already sitting at H=2 can never exceed 2. Our most productive generator (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.

An earlier version of this page went further and said those 14 tile "only 2-anisohedrally", and claimed that as a refinement of Kaplan. That was a misreading of our own tool. The plane-tiling test begins its search at cluster size 2 and never tests 1, so 2 is the smallest value it can return and it says nothing about whether a one-orbit tiling exists. Tiles that are isohedral by construction also come back as "cluster 2" — 28 of 28 when checked. The anisohedral order of our base shapes is simply unknown, and the refinement is withdrawn.

Ours

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.

In the plane

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.

Htileswhat they are
61Bašić's published record tile — a control, not a discovery here
513marked polyiamonds, 18–33 edges, all on deltille — 6 constructions, see below
42marked polyiamonds
32unmarked — 13 edges, shape alone
28marked
112marked

What those counts actually count

"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.

familytiles at H=5edge counts
BB..BB / BBBB418, 18, 22, 26
DC..CDA / BBBB421, 25, 29, 33
BB..BB / BABD228, 32
BB..BB / DCD130
DC..CDA / BABD131
DC..CDA / DCD129

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.

The "14 distinct base shapes" figure is a sample, not a census. The families are infinite, and the gaps give it away — there is no shape at 19, 20, 23, 24 or 27 edges because nothing was ever run there. The next members of these same families are the runs still blocked on the solver's clause ceiling; had they landed, the number would read 15 or 16.

None of the verdicts change. Each of the thirteen is independently proven, corona by corona.

The measured law

Depth needs d = 1 — and among the markings actually tested, three runs of like markings beats four, decisively:

runsH=1H=2H=4H=5
360212
462800

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.

An earlier version of this page said "run counts to 8" and "at most 3 runs". Only 3 and 4 were ever tested — 192 rows across two sweeps, with nothing at 1, 2, or 5–8. So the comparison above is real, but it is a comparison of two values, not a bound over a range. Every deep tile we hold has exactly three runs, which was invisible while three was the smallest value tried.

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.

Ours

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.

In space — Mann's question

"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.

cellfacesclassesstatemax H
cube657complete2
hexagonal prism8666complete3
rhombic dodecahedron1222,815complete2
elongated dodecahedron1267,257complete1
truncated octahedron14200,961every d=1 decided4

All five are now done

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.

A hypothesis, tested and refuted

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.

That sample is not independent of how it was found. Three of the four complete sweeps produced no H≥3 marking at all; the 16 come from just two cells. Ten of them come from the truncated octahedron, whose sweep was deliberately ordered to search d=1 first and was then stopped once that class was exhausted — leaving 30,638 markings with d≥2 never searched. A search ordered by the property in question, halted when that property ran out, is a weak witness that the property matters. No proof is known, and the counting argument has been ruled out as the explanation. Calling this a law, as an earlier version of this page did, overstated it.
An earlier version of this page claimed the law held at H≥2 and had "never once been violated". That was wrong, and the counter-examples were in our own data before the claim was written.

And counting does not explain it

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.

The answer

All 22,815 rhombic-dodecahedron marking classes are decided. Split by the property Mann's bound depends on:

H=0H=1H=2reaches 8
unbalanced (d>0)19,10453812none
balanced (d=0)1,90680—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.

This settles the lattice-restricted form: every copy sits on a lattice site, which is exactly what makes 22,815 classes affordable. It does not settle the general question, where copies need not be lattice-aligned.

The truncated octahedron goes deeper

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.

Ours

What imbalance actually does

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:

dclasses decidedmax proven H
012,6211
123,5883
219,9422
314,6841
49,7521
55,5300
62,8440

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.

It is the imbalance, not the density of markings

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.

But not by running out of room

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.

Reading a program

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.

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.

4-fold pentille · 8 moves
turnstep 0.73step 1
0°AB
+60°CD
-60°EF
+90°G
-90°H
chamfered quadrille · 5 moves
turnstep 1
0°A
+45°B
-45°C
+90°D
-90°E
deltille · 5 moves
turnstep 1
0°A
+60°B
-60°C
+120°D
-120°E
kisquadrille · 14 moves
turnstep 1step 1.41
0°AB
+45°CD
-45°EF
+90°GH
-90°IJ
+135°KL
-135°MN
kisrhombille · 29 moves
turnstep 1step 1.73step 2
0°ABC
+30°DE
-30°FG
+60°HIJ
-60°KLM
+90°NOP
-90°QRS
+120°TUV
-120°WXY
+150°Z0
-150°12
quadrille · 3 moves
turnstep 1
0°A
+90°B
-90°C
rhombille · 5 moves
turnstep 1
0°A
+60°B
-60°C
+120°D
-120°E
snub quadrille · 9 moves
turnstep 1
0°A
+30°B
-30°C
+60°D
-60°E
+90°F
-90°G
+120°H
-120°I
tetrille · 12 moves
turnstep 1step 1.73
0°AB
+60°CD
-60°EF
+90°GH
-90°IJ
+120°K
-120°L
truncated quadrille · 5 moves
turnstep 1
0°A
+45°B
-45°C
+90°D
-90°E

How results are checked

Closures and refutations are different kinds of claim and are checked differently.

Proving a shape tiles, cheaply

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 questiontimeanswer
corona climb163s"almost certainly tiles"
torus filter0.00stiles — and here is the tiling

It is one-sided, and the directions are not equal

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.

Two things that caught us out

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.

That second one is why every screening result here carries the list of box sizes that were actually tried. A shape screened by one box has had far less scrutiny than one screened by six, and a bare "did not tile" hides the difference.

The 1.5-tile — depth without a marking

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:

resultshapes
Heesch number 24
Heesch number 194
Heesch number 0 — cannot be surrounded even once24
survived the screen but turned out to tile1

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 tax for leaving the imbalance behind

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.

Filtering by isohedral cluster, and what it misses

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.

What searching found, and what it did not

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.

Roughly three quarters of a million tiles, and no new deep one

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.

approachtilesdeepest
turn-angle constraints661,4864
wider markings and imbalances71,2073
grammar-generated structures30,0003
segment and its reverse16,7451
sampled larger tiles6,4201

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.

Depth belongs to the recipe, not to the size

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.

Two surprises worth keeping

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.

Negative results

Recorded because they cost real time and redirect the search.

questionanswer
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.

Engineering, and why it is part of the result

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.

changeclausestime
2D overlap: pairwise → ladder at-most-one98.3M → 38.8M96.5s → 38.4s
3D surround: product form → coverage variables2.60M → 0.50M15.7s → 1.9s
3D mating: forbidden pairs → support clauses420K → 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:

solverencodingseconds
CryptoMiniSatforbidden pairs32,532
CryptoMiniSatsupport22,571
CaDiCaLsupport3,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.

Ours

What is not claimed

Acknowledgements

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.

Colophon

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.