# How Record Square Packings Are Found

- Human oversight: [**Joshua Levy**](https://x.com/ojoshe)
- Agents: **GPT-6 Astra** and **GPT-6 Sol**
- v0.2.1 ([version history](#version-history))
- First published October 8, 2026 · Last revised October 10, 2026

*Evidence cutoff: 10 October 2026. The selected-bound tables include the confirmed 8
October intake; newer replayed certificates awaiting adoption are identified
separately.*

A record square packing can begin as a geometric sketch, a random configuration, or
pieces borrowed from an earlier record.
The final coordinates may then pass through several optimizers before a verifier
establishes that the squares fit.
Understanding that chain explains both how a new arrangement is found and why an
improvement in its last decimal places can be a different contribution.

## Contents

1. [The Problem and the Kind of Result](#the-problem-and-the-kind-of-result)
2. [From a Seed to a Certified Bound](#from-a-seed-to-a-certified-bound)
3. [The Geometry a Search Has to Navigate](#the-geometry-a-search-has-to-navigate)
4. [Constructing and Reusing Seeds](#constructing-and-reusing-seeds)
5. [Moving Between Arrangements](#moving-between-arrangements)
6. [Refining a Promising Arrangement](#refining-a-promising-arrangement)
7. [Turning Coordinates into a Bound](#turning-coordinates-into-a-bound)
8. [Reading the Record](#reading-the-record)
9. [Vocabulary and Further Reading](#vocabulary-and-further-reading)
10. [Version History](#version-history)

## The Problem and the Kind of Result

Let $s(n)$ be the smallest side of a square that can contain $n$ **unit squares**, each
free to translate and rotate.
The small squares must have disjoint interiors; edges and corners may touch.
A construction that fits in a container of side $S$ establishes the **upper bound**
$s(n)\le S$.

Two elementary bounds put the search in context.
The pieces have total area $n$, so $s(n)\ge\sqrt n$. An axis-aligned grid supplies
$s(n)\le\lceil\sqrt n\rceil$. At a perfect square these meet: $s(m^2)=m$. At $n=11$ they
leave the interval $\sqrt{11}\le s(11)\le4$. Tilting some pieces permits a smaller
container than that grid.
Walter Trump’s 1979 construction uses six axis-aligned squares and five at one common
angle near $40.18^\circ$, in side approximately $3.87708359$. Its geometry provides an
upper bound; proving that no other arrangement improves it is a separate problem
([historical survey](https://github.com/jlevy/squares/blob/8aba95081b634a4dd4e70c07359b5c11b8a7b1cf/packing/resources/web/friedman-ds7-survey-2009-html.md);
[tutorial](https://github.com/jlevy/squares/blob/8aba95081b634a4dd4e70c07359b5c11b8a7b1cf/TUTORIAL.md#1-the-problem)).

<figure>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:sqpack="https://github.com/jlevy/thinking-scratchpad/ns/sqpack/v1" class="methods-diagram methods-hand-construction" width="390" height="390" viewBox="0 0 390 390" role="img" aria-labelledby="methods-hand-construction-title methods-hand-construction-description">
  <title id="methods-hand-construction-title">Trump's eleven-square hand construction</title>
  <desc id="methods-hand-construction-description">An illustration of 11 unit squares in a square container, projected from retained source geometry. Credit: Walter Trump (1979). The drawing does not run or establish a feasibility or optimality proof.</desc>
  <metadata>
    <sqpack:profile version="8">
      <sqpack:coordinates>retained geometry projected to normalized svg-y-down</sqpack:coordinates>
      <sqpack:value name="credit">Walter Trump (1979)</sqpack:value>
      <sqpack:value name="purpose">method illustration from retained geometry; no verification replay</sqpack:value>
      <sqpack:value name="source-id">trump11-exact-q-u</sqpack:value>
      <sqpack:value name="source-input">packing/atlas/rendering/trump11-overview.svg</sqpack:value>
      <sqpack:value name="source-lineage" />
      <sqpack:value name="source-url" />
    </sqpack:profile>
  </metadata>
  <rect width="390" height="390" fill="#ffffff" />
  <g data-layer="squares">
    <polygon data-feature="square-fill" data-square="square-001" points="12.0000,378.0000 106.4009,378.0000 106.4009,283.5991 12.0000,283.5991" fill="#4b9582" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-002" points="283.5991,378.0000 378.0000,378.0000 378.0000,283.5991 283.5991,283.5991" fill="#4b9582" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-003" points="203.8752,106.4009 298.2761,106.4009 298.2761,12.0000 203.8752,12.0000" fill="#5fa995" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-004" points="12.0000,106.4009 106.4009,106.4009 106.4009,12.0000 12.0000,12.0000" fill="#257260" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-005" points="106.4009,106.4009 200.8017,106.4009 200.8017,12.0000 106.4009,12.0000" fill="#4b9582" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-006" points="12.0000,200.8017 106.4009,200.8017 106.4009,106.4009 12.0000,106.4009" fill="#4b9582" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-007" points="126.4953,307.3929 198.6175,246.4839 137.7084,174.3617 65.5862,235.2707" fill="#dd87b8" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-008" points="189.1983,378.0000 261.3205,317.0910 200.4115,244.9688 128.2893,305.8778" fill="#dd87b8" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-009" points="191.3825,237.9170 263.5047,177.0080 202.5957,104.8858 130.4735,165.7948" fill="#dd87b8" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-010" points="254.0856,308.5241 326.2078,247.6151 265.2987,175.4929 193.1765,236.4019" fill="#dd87b8" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-011" points="305.8778,223.5424 378.0000,162.6334 317.0910,90.5112 244.9688,151.4202" fill="#dd87b8" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
  </g>
  <rect data-feature="container-outline" x="12" y="12" width="366" height="366" fill="none" stroke="#52667a" stroke-width="1.5" />
</svg>
<figcaption><strong>Figure 1.</strong> Walter Trump’s 1979 packing of eleven squares:
six axis-aligned squares surround five tilted at a common angle. This hand construction
shows how a small number of geometric parameters can describe a useful arrangement.
Redrawn from <a href="https://github.com/jlevy/squares/blob/8aba95081b634a4dd4e70c07359b5c11b8a7b1cf/packing/atlas/rendering/trump11-overview.svg">the retained reconstruction
from David Ellsworth’s geometry</a>; its side is approximately $3.87708359$.</figcaption>
</figure>

A square’s **pose** consists of its centre $(x_i,y_i)$ and orientation $\theta_i$. A
quarter turn gives the same square, so angles can be represented modulo $\pi/2$.
Together with the side $S$, a configuration has $3n+1$ continuous variables.
To recover its corners, write $c_i=\cos\theta_i$ and $d_i=\sin\theta_i$. The four
corners are

$$
(x_i,y_i)+\frac12\bigl(u(c_i,d_i)+v(-d_i,c_i)\bigr),
\qquad u,v\in\{-1,1\}.
$$

Place the container at $[0,S]^2$. A candidate packing must satisfy two kinds of
condition: every corner stays in the container, and every pair of squares has disjoint
interiors. Reducing $S$ leaves less room to satisfy these conditions together.
A picture can suggest that the conditions hold, but tiny overlaps or an inward-rounded
side can be invisible.
The search produces candidate poses; certification checks the geometric conditions at
the side actually claimed.

## From a Seed to a Certified Bound

The workflow has four jobs.
They can be separate programs, or loops inside one program.

| Job | Input and operation | Output |
| --- | --- | --- |
| Construct a seed | design a pattern, choose a random state, or transform an existing packing | a starting configuration, possibly infeasible |
| Explore | move far enough to reach different arrangements or local basins | promising candidates |
| Refine | reduce the side near a candidate, adjusting centres, angles, or contact equations | a numerical packing or stationary candidate |
| Certify | check unit shape, containment, and all pairwise non-overlap rigorously | a feasible witness and an upper bound |

A **seed** need not already be a packing.
Adding a square to a crowded arrangement, for example, can create overlaps that the
following search must resolve.
A successful seed supplies useful structure: orientations, rows, a tilted block, or
empty space where rearrangement can begin.

Fix a deterministic local refiner, including its settings.
The starting configurations it returns to one endpoint form a **basin** for that
refiner. Exploration tries to reach another basin; refinement tries to improve the
configuration it has reached.
If stronger refinement closes a gap to a record, it has exposed removable slack in the
candidate.
Repeated returns to an inferior endpoint justify trying other starts with that
refiner. They do not establish that all local improvement is exhausted: the refiner may
have held angles fixed, constrained squares to share an angle, or stopped at a tolerance
or budget limit.

One record can therefore have several contributors.
A finder discovers the arrangement; another optimizer reduces its side; a high-precision
solver removes numerical slack; and an independent checker establishes the upper bound.
David Ellsworth’s Kingbird site is a catalogue and refinement site, continuing Erich
Friedman’s earlier catalogue.
It is not the name of a single search algorithm.

## The Geometry a Search Has to Navigate

### Choosing a separating branch

Two convex squares have disjoint interiors exactly when a line weakly separates them.
The **separating-axis theorem** says that for convex polygons, it suffices to test axes
perpendicular to their edges.
Each square has two distinct edge normals, giving up to four axes for a pair; along each
axis there are two possible orders.

For a unit direction $\nu$, one order requires

$$
\max_{p\in Q_i}\langle\nu,p\rangle
\;\le\;
\min_{q\in Q_j}\langle\nu,q\rangle,
$$

where $Q_i$ and $Q_j$ are the two squares.
Only their corners need be tested.
Equality permits contact.
The pair is non-overlapping if *at least one* axis and order works.
That logical choice is a **disjunction**; one selected alternative is a **separating
branch**.

For an exact small example, take two axis-aligned squares.
The branch placing square 1 to the left of square 2 is

$$
x_1+\tfrac12\le x_2-\tfrac12,
\qquad\text{or equivalently}\qquad x_2-x_1\ge1.
$$

The centres $(1/2,1/2)$ and $(3/2,1/2)$ satisfy this with equality in a side-2
container. Placing one square above the other uses a different branch, $y_2-y_1\ge1$.
Both are valid constructions.
Restricting the search to horizontal separation excludes that stacked construction.

A **cell** selects one separating branch for every pair.
Cells can overlap: two squares far apart diagonally may satisfy both a horizontal and a
vertical branch. A cell describes separation choices for all pairs, including pairs that
never touch. A **contact graph** records only touching pairs, and so does not specify a
cell ([tutorial’s cell decomposition](https://github.com/jlevy/squares/blob/8aba95081b634a4dd4e70c07359b5c11b8a7b1cf/TUTORIAL.md#the-cell-decomposition)).

### Why fixing angles helps

With all angles fixed, every corner is its centre plus a constant offset.
Containment then consists of linear inequalities in $x_i,y_i,S$. Fix a separating branch
for each pair as well, and its axis is constant: the projection inequalities are linear
too. Minimizing $S$ under those restrictions is a **linear program**, or LP.

This isolates a tractable subproblem inside the larger search.
An LP can optimize centres and side for one choice of angles and branches.
The full problem still has to choose branches and move angles.
A change in which separation condition binds can also create a kink in the optimized
side as a function of angle.
Smooth optimization methods have to account for those changes.

Cells and basins refer to different objects.
A cell is a geometric restriction; a basin is defined by what a particular refiner does.
The refiner can change angles and separating branches along its route.
Its settings and tie-breaking rules affect the basins.
If endpoints are grouped by pattern or by a continuous family of poses instead of
identical coordinates, that grouping must be specified too.
Three squares in a side-2 container, for example, admit an exact sliding family: two
occupy the bottom row, and the centre of the top square moves from $(1/2,3/2)$ to
$(3/2,3/2)$. Different returned coordinates can belong to that same family
([tutorial’s basin discussion](https://github.com/jlevy/squares/blob/8aba95081b634a4dd4e70c07359b5c11b8a7b1cf/TUTORIAL.md#3-cells-basins-and-two-traps)).

## Constructing and Reusing Seeds

### Designing a parametric family

A hand construction chooses an arrangement before optimizing its dimensions.
Frits Göbel placed a diagonal strip of $45^\circ$ squares across an axis-aligned
background. Wider strips, rational-slope tilts, and an L-shaped border supplied related
counts. Trump’s eleven-square packing and Hämäläinen and Gustafson’s eighteen-square
constructions likewise reduce the search to a small geometric family.
The design specifies how pieces meet; algebra or one-dimensional optimization determines
a remaining angle
([historical survey](https://github.com/jlevy/squares/blob/8aba95081b634a4dd4e70c07359b5c11b8a7b1cf/packing/resources/web/friedman-ds7-survey-2009-html.md)).

Composition reuses a good packing as a block inside a larger one, or wraps an L-shaped
layer around it. Such constructions can produce exact, reproducible sides.
They rely on anticipating a useful pattern.
The $n=29$ arrangement found by Gensane and Ryckelynck uses six orientation classes,
illustrating the complexity that an unrestricted computer search can find beyond a
simple hand-designed family.

### Changing the count or replacing a component

**Packing surgery** transforms an existing arrangement into a seed, often changing which
pieces can touch.
The retained SQUISH publications distinguish operations by how the seed
is assembled, even though their later search and polishing are incompletely disclosed.

**Deletion and addition** connect neighboring counts.
Deleting pieces preserves feasibility at the old side and creates room for
rearrangement; adding pieces supplies a harder starting state.
SQUISH’s original release says nine of its ten original packings began from its own
neighboring certified packings this way, while $n=126$ began with nearby search from the
published record. A supplement added $n=153$. Later reports give explicit deletion
chains: $182\to180$ removes two squares, while $155\to154$ and $239\to238$ remove one,
followed by nearby search and polishing
([original release](https://github.com/jlevy/squares/blob/8aba95081b634a4dd4e70c07359b5c11b8a7b1cf/packing/resources/web/squish-401-2026-10-07/README.md);
[first update](https://github.com/jlevy/squares/blob/8aba95081b634a4dd4e70c07359b5c11b8a7b1cf/packing/resources/web/squish-401-update-2026-10-07/README.md);
[second update](https://github.com/jlevy/squares/blob/8aba95081b634a4dd4e70c07359b5c11b8a7b1cf/packing/resources/web/squish-422-second-update-2026-10-07/README.md)).

**Grafting** installs a useful subpacking in a target-count arrangement; **carving**
reduces a substantially larger arrangement to a target-count seed.
The five operations below distinguish what structure the author reports transferring.
Nate Chaoweeraprasit, using SQUISH, reported all the resulting poses; the names in the
lineage column credit the seed contributors.
An arrow names the parent or component count and the resulting total count.
For a graft, it does not mean that the smaller packing alone supplies all the target’s
squares.

| Operation | Author-reported lineage and source | Stage and transferred structure |
| --- | --- | --- |
| Neighbor-count deletion | SQUISH $110\to108$; Francisco Couzo $180\to179$ ([second update](https://github.com/jlevy/squares/blob/8aba95081b634a4dd4e70c07359b5c11b8a7b1cf/packing/resources/web/squish-422-second-update-2026-10-07/README.md)) | Seed construction: remove two squares or one, respectively, preserving the rest at the old side; then search nearby and polish. |
| Component grafting | Couzo $102\to123$, $105\to126$, and $210\to239$ ([first update](https://github.com/jlevy/squares/blob/8aba95081b634a4dd4e70c07359b5c11b8a7b1cf/packing/resources/web/squish-401-update-2026-10-07/README.md)) | Seed construction: transplant a useful component into a target-count catalogue packing before further optimization. |
| Updating an inherited core | Kingbird catalogue $41\to88$, using the Schadt/Ellsworth core refined in January 2026 ([core history](https://github.com/jlevy/squares/blob/8aba95081b634a4dd4e70c07359b5c11b8a7b1cf/packing/resources/web/kingbird-squares-in-squares-compared-2026-08-22.md); [second update](https://github.com/jlevy/squares/blob/8aba95081b634a4dd4e70c07359b5c11b8a7b1cf/packing/resources/web/squish-422-second-update-2026-10-07/README.md)) | Seed construction: replace the older core in the $n=88$ construction with its newer version, then refine the resulting packing. |
| Reusing a newly improved component | SQUISH $88\to207,236,302$ ([second update](https://github.com/jlevy/squares/blob/8aba95081b634a4dd4e70c07359b5c11b8a7b1cf/packing/resources/web/squish-422-second-update-2026-10-07/README.md)) | Seed construction: reuse the newly improved $n=88$ component in three larger target packings, propagating one gain into several counts. |
| Carving a larger construction | Couzo $297\to263$ ([second update](https://github.com/jlevy/squares/blob/8aba95081b634a4dd4e70c07359b5c11b8a7b1cf/packing/resources/web/squish-422-second-update-2026-10-07/README.md)) | Seed construction, exploration, then refinement: reduce the larger arrangement, search nearby, and apply a final squeeze. |

For the inherited core, the author explicitly says the $n=41$ improvement postdated the
older $n=88$ construction
([lineage explanation](https://github.com/jlevy/squares/issues/422)). The final squeeze
is a separate local search stage: roughly 120 random perturbations, at amplitudes
$10^{-5}$ to $10^{-3}$ times the side, each followed by polishing.
It improved $n=263$ by about $4\times10^{-10}$; at the other eight counts in the second
update, it found no improvement above $10^{-11}$
([reported protocol](https://github.com/jlevy/squares/issues/422)).

<figure>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:sqpack="https://github.com/jlevy/thinking-scratchpad/ns/sqpack/v1" class="methods-diagram methods-surgery" width="390" height="390" viewBox="0 0 390 390" role="img" aria-labelledby="methods-surgery-title methods-surgery-description">
  <title id="methods-surgery-title">SQUISH's historical 108-square surgery example</title>
  <desc id="methods-surgery-description">An illustration of 108 unit squares in a square container, projected from retained source geometry. Credit: Nate Chaoweeraprasit (itsnaka), SQUISH, second update 2026-10-07. The drawing does not run or establish a feasibility or optimality proof.</desc>
  <metadata>
    <sqpack:profile version="8">
      <sqpack:coordinates>retained geometry projected to normalized svg-y-down</sqpack:coordinates>
      <sqpack:value name="credit">Nate Chaoweeraprasit (itsnaka), SQUISH, second update 2026-10-07</sqpack:value>
      <sqpack:value name="purpose">method illustration from retained geometry; no verification replay</sqpack:value>
      <sqpack:value name="source-id">squish-second-update-n108-2026-10-07</sqpack:value>
      <sqpack:value name="source-input">packing/resources/web/squish-422-second-update-2026-10-07/facts/n-108.json.gz</sqpack:value>
      <sqpack:value name="source-lineage">SQUISH's own s(110), two squares removed, then nearby search</sqpack:value>
      <sqpack:value name="source-url">https://github.com/itsnaka/squish-certs/blob/e63e4e52b1728b6671b2f263c5e02a4aa79a39d3/squish-submission-2026-10-07b/n108/n108.cert.json</sqpack:value>
    </sqpack:profile>
  </metadata>
  <rect width="390" height="390" fill="#ffffff" />
  <g data-layer="squares">
    <polygon data-feature="square-fill" data-square="square-001" points="310.9052,45.5580 344.4526,45.5580 344.4526,12.0106 310.9052,12.0106" fill="#dcebef" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-002" points="344.4526,378.0000 378.0000,378.0000 378.0000,344.4526 344.4526,344.4526" fill="#dcebef" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-003" points="12.0000,378.0000 45.5474,378.0000 45.5474,344.4526 12.0000,344.4526" fill="#dcebef" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-004" points="79.0948,377.9147 112.6422,377.9147 112.6422,344.3673 79.0948,344.3673" fill="#dcebef" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-005" points="45.5474,377.9995 79.0948,377.9995 79.0948,344.4521 45.5474,344.4521" fill="#dcebef" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-006" points="12.0000,344.4526 45.5474,344.4526 45.5474,310.9052 12.0000,310.9052" fill="#dcebef" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-007" points="45.5474,344.1316 79.0935,344.4253 79.3872,310.8792 45.8411,310.5855" fill="#f2d7a6" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-008" points="12.2668,310.9052 45.8142,310.9052 45.8142,277.3578 12.2668,277.3578" fill="#dcebef" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-009" points="45.8154,310.3183 79.3581,310.8789 79.9187,277.3362 46.3760,276.7756" fill="#f2d7a6" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-010" points="12.0005,277.3578 45.5479,277.3578 45.5479,243.8104 12.0005,243.8104" fill="#dcebef" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-011" points="344.4526,45.6115 378.0000,45.6115 378.0000,12.0641 344.4526,12.0641" fill="#dcebef" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-012" points="210.2631,45.5479 243.8104,45.5479 243.8104,12.0005 210.2631,12.0005" fill="#dcebef" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-013" points="277.3578,79.1056 310.9052,79.1056 310.9052,45.5582 277.3578,45.5582" fill="#dcebef" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-014" points="176.7157,45.5479 210.2631,45.5479 210.2631,12.0005 176.7157,12.0005" fill="#dcebef" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-015" points="243.8104,45.5580 277.3578,45.5580 277.3578,12.0106 243.8104,12.0106" fill="#dcebef" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-016" points="277.3578,45.5580 310.9052,45.5580 310.9052,12.0106 277.3578,12.0106" fill="#dcebef" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-017" points="143.1683,45.5479 176.7157,45.5479 176.7157,12.0005 143.1683,12.0005" fill="#dcebef" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-018" points="109.6209,45.5479 143.1683,45.5479 143.1683,12.0005 109.6209,12.0005" fill="#dcebef" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-019" points="76.0735,45.5474 109.6209,45.5474 109.6209,12.0000 76.0735,12.0000" fill="#dcebef" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-020" points="344.4526,79.1608 378.0000,79.1608 378.0000,45.6134 344.4526,45.6134" fill="#dcebef" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-021" points="310.9052,79.1058 344.4526,79.1058 344.4526,45.5584 310.9052,45.5584" fill="#dcebef" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-022" points="277.3578,112.6532 310.9052,112.6532 310.9052,79.1058 277.3578,79.1058" fill="#dcebef" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-023" points="243.8104,79.1056 277.3578,79.1056 277.3578,45.5582 243.8104,45.5582" fill="#dcebef" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-024" points="112.6422,378.0000 146.1896,378.0000 146.1896,344.4526 112.6422,344.4526" fill="#dcebef" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-025" points="176.7157,79.0953 210.2631,79.0953 210.2631,45.5479 176.7157,45.5479" fill="#dcebef" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-026" points="143.1683,79.0953 176.7157,79.0953 176.7157,45.5479 143.1683,45.5479" fill="#dcebef" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-027" points="109.6209,79.0953 143.1683,79.0953 143.1683,45.5479 109.6209,45.5479" fill="#dcebef" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-028" points="310.9052,112.6534 344.4526,112.6534 344.4526,79.1060 310.9052,79.1060" fill="#dcebef" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-029" points="344.4526,112.7190 378.0000,112.7190 378.0000,79.1716 344.4526,79.1716" fill="#dcebef" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-030" points="243.5641,146.2004 277.1115,146.2004 277.1115,112.6530 243.5641,112.6530" fill="#dcebef" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-031" points="210.2631,79.1056 243.8104,79.1056 243.8104,45.5582 210.2631,45.5582" fill="#dcebef" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-032" points="210.2631,112.6530 243.8104,112.6530 243.8104,79.1056 210.2631,79.1056" fill="#dcebef" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-033" points="143.1683,112.6426 176.7157,112.6426 176.7157,79.0953 143.1683,79.0953" fill="#dcebef" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-034" points="176.7157,112.6530 210.2631,112.6530 210.2631,79.1056 176.7157,79.1056" fill="#dcebef" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-035" points="344.4444,146.2671 377.9918,146.2675 377.9923,112.7201 344.4449,112.7197" fill="#f2d7a6" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-036" points="277.2655,146.2006 310.8129,146.2007 310.8131,112.6534 277.2657,112.6532" fill="#dcebef" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-037" points="243.8104,112.6530 277.3578,112.6530 277.3578,79.1056 243.8104,79.1056" fill="#dcebef" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-038" points="210.0167,146.2004 243.5641,146.2004 243.5641,112.6530 210.0167,112.6530" fill="#dcebef" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-039" points="176.4016,146.2004 209.9490,146.2078 209.9564,112.6604 176.4090,112.6530" fill="#f2d7a6" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-040" points="310.8965,146.2007 344.4439,146.2007 344.4439,112.6534 310.8965,112.6534" fill="#dcebef" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-041" points="142.8533,146.1900 176.4007,146.1900 176.4007,112.6426 142.8533,112.6426" fill="#dcebef" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-042" points="344.4439,179.8149 377.9913,179.8229 377.9993,146.2755 344.4519,146.2675" fill="#f2d7a6" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-043" points="310.8965,179.7481 344.4439,179.7481 344.4439,146.2007 310.8965,146.2007" fill="#dcebef" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-044" points="277.3491,179.7481 310.8965,179.7481 310.8965,146.2007 277.3491,146.2007" fill="#dcebef" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-045" points="243.8015,179.7478 277.3489,179.7480 277.3491,146.2006 243.8017,146.2004" fill="#dcebef" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-046" points="210.2541,179.7478 243.8015,179.7478 243.8015,146.2004 210.2541,146.2004" fill="#dcebef" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-047" points="176.6993,179.7478 210.2467,179.7552 210.2541,146.2078 176.7067,146.2004" fill="#f2d7a6" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-048" points="344.4526,213.3705 378.0000,213.3705 378.0000,179.8231 344.4526,179.8231" fill="#dcebef" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-049" points="213.2843,377.9888 246.8317,377.9888 246.8317,344.4414 213.2843,344.4414" fill="#dcebef" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-050" points="277.3437,213.2955 310.8911,213.2959 310.8915,179.7485 277.3441,179.7481" fill="#f2d7a6" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-051" points="243.6557,213.2952 277.2031,213.2955 277.2035,179.7481 243.6561,179.7478" fill="#f2d7a6" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-052" points="210.1082,213.3026 243.6556,213.3031 243.6561,179.7557 210.1087,179.7552" fill="#f2d7a6" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-053" points="176.5501,213.2955 210.0975,213.3062 210.1082,179.7588 176.5608,179.7481" fill="#f2d7a6" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-054" points="344.4526,246.9179 378.0000,246.9179 378.0000,213.3705 344.4526,213.3705" fill="#dcebef" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-055" points="310.9052,246.8429 344.4526,246.8429 344.4526,213.2955 310.9052,213.2955" fill="#dcebef" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-056" points="277.3575,246.8429 310.9049,246.8433 310.9052,213.2959 277.3578,213.2955" fill="#f2d7a6" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-057" points="243.8101,246.8426 277.3575,246.8429 277.3578,213.2955 243.8104,213.2952" fill="#f2d7a6" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-058" points="344.4526,280.4653 378.0000,280.4653 378.0000,246.9179 344.4526,246.9179" fill="#dcebef" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-059" points="310.9052,280.3903 344.4526,280.3903 344.4526,246.8429 310.9052,246.8429" fill="#dcebef" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-060" points="344.4317,314.0823 377.9791,314.0856 377.9823,280.5382 344.4349,280.5350" fill="#f2d7a6" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-061" points="143.1486,179.7374 176.6960,179.7481 176.7067,146.2007 143.1594,146.1900" fill="#f2d7a6" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-062" points="143.0027,213.2848 176.5501,213.2955 176.5608,179.7481 143.0134,179.7374" fill="#f2d7a6" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-063" points="182.9303,322.8090 208.5620,344.4526 230.2055,318.8209 204.5739,297.1774" fill="#f2d7a6" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-064" points="171.4978,246.8412 205.0452,246.8520 205.0559,213.3046 171.5085,213.2939" fill="#f2d7a6" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-065" points="42.5261,45.5474 76.0735,45.5474 76.0735,12.0000 42.5261,12.0000" fill="#dcebef" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-066" points="33.6241,87.0338 59.2722,65.4097 37.6481,39.7616 12.0000,61.3858" fill="#f2d7a6" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-067" points="76.0735,79.0948 109.6209,79.0948 109.6209,45.5474 76.0735,45.5474" fill="#dcebef" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-068" points="58.3247,110.0881 83.9728,88.4640 62.3487,62.8159 36.7006,84.4401" fill="#f2d7a6" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-069" points="33.6241,132.8361 59.2722,111.2120 37.6481,85.5639 12.0000,107.1880" fill="#f2d7a6" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-070" points="59.2724,155.0917 84.9204,133.4676 63.2963,107.8195 37.6482,129.4436" fill="#f2d7a6" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-071" points="83.9728,132.3436 109.6209,110.7195 87.9968,85.0714 62.3487,106.6955" fill="#f2d7a6" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-072" points="109.6209,112.6426 143.1683,112.6426 143.1683,79.0953 109.6209,79.0953" fill="#dcebef" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-073" points="33.6241,176.7157 59.2722,155.0915 37.6481,129.4435 12.0000,151.0676" fill="#f2d7a6" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-074" points="88.8372,174.0449 114.5227,152.4653 92.9432,126.7797 67.2576,148.3593" fill="#f2d7a6" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-075" points="109.2905,146.2354 142.8378,146.2186 142.8211,112.6713 109.2737,112.6880" fill="#f2d7a6" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-076" points="12.4339,210.2631 45.9813,210.2631 45.9813,176.7157 12.4339,176.7157" fill="#dcebef" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-077" points="63.0802,195.7822 88.8559,174.3103 67.3840,148.5346 41.6083,170.0066" fill="#f2d7a6" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-078" points="117.4655,193.8085 143.1510,172.2289 121.5715,146.5433 95.8859,168.1229" fill="#f2d7a6" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-079" points="12.0000,243.8104 45.5474,243.8104 45.5474,210.2631 12.0000,210.2631" fill="#dcebef" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-080" points="67.1270,238.1968 92.8126,216.6172 71.2330,190.9317 45.5474,212.5112" fill="#f2d7a6" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-081" points="91.9185,215.5531 117.6041,193.9735 96.0245,168.2879 70.3389,189.8675" fill="#f2d7a6" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-082" points="45.5542,275.4685 79.0507,277.3151 80.8973,243.8186 47.4008,241.9720" fill="#f2d7a6" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-083" points="94.1708,259.4616 119.7505,237.7566 98.0455,212.1769 72.4658,233.8819" fill="#f2d7a6" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-084" points="118.8756,236.7213 144.5701,215.1524 123.0012,189.4578 97.3067,211.0267" fill="#f2d7a6" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-085" points="312.0358,331.9312 339.0921,351.7651 358.9260,324.7088 331.8697,304.8749" fill="#f2d7a6" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-086" points="290.9123,358.0328 317.8704,378.0000 337.8376,351.0419 310.8794,331.0747" fill="#f2d7a6" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-087" points="289.3238,306.1712 316.4215,325.9485 336.1987,298.8507 309.1010,279.0735" fill="#f2d7a6" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-088" points="268.2136,332.2962 295.3114,352.0734 315.0886,324.9757 287.9909,305.1984" fill="#f2d7a6" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-089" points="246.8317,358.2228 273.9295,378.0000 293.7067,350.9022 266.6089,331.1250" fill="#f2d7a6" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-090" points="226.1780,327.6708 252.2211,348.8176 273.3679,322.7745 247.3248,301.6277" fill="#f2d7a6" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-091" points="247.5531,301.6015 273.4918,322.8761 294.7664,296.9374 268.8277,275.6628" fill="#f2d7a6" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-092" points="274.5923,280.3903 308.1397,280.3906 308.1400,246.8432 274.5926,246.8429" fill="#f2d7a6" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-093" points="310.8963,213.2955 344.4437,213.2955 344.4437,179.7481 310.8963,179.7481" fill="#dcebef" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-094" points="206.0921,298.4593 231.7237,320.1029 253.3673,294.4712 227.7356,272.8277" fill="#f2d7a6" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-095" points="227.3171,272.4743 252.9488,294.1179 274.5924,268.4862 248.9607,246.8426" fill="#f2d7a6" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-096" points="179.7369,378.0000 213.2843,378.0000 213.2843,344.4526 179.7369,344.4526" fill="#dcebef" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-097" points="210.2626,246.8500 243.8100,246.8505 243.8104,213.3031 210.2631,213.3026" fill="#f2d7a6" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-098" points="185.5742,269.9106 211.2059,291.5542 232.8495,265.9225 207.2178,244.2790" fill="#f2d7a6" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-099" points="146.1896,378.0000 179.7369,378.0000 179.7369,344.4526 146.1896,344.4526" fill="#dcebef" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-100" points="146.4828,344.4519 180.0302,344.4524 180.0307,310.9050 146.4833,310.9045" fill="#f2d7a6" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-101" points="161.7567,293.5570 186.0884,316.6524 209.1837,292.3207 184.8521,269.2253" fill="#f2d7a6" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-102" points="112.9345,344.4521 146.4819,344.4526 146.4824,310.9052 112.9350,310.9047" fill="#f2d7a6" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-103" points="139.1142,310.9051 163.9009,288.2988 141.2946,263.5121 116.5079,286.1184" fill="#f2d7a6" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-104" points="163.9305,288.3172 188.7109,265.7040 166.0976,240.9236 141.3172,263.5368" fill="#f2d7a6" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-105" points="144.4483,260.6796 169.2287,238.0663 146.6155,213.2859 121.8351,235.8992" fill="#f2d7a6" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-106" points="119.6328,283.2683 144.4196,260.6620 121.8133,235.8753 97.0265,258.4816" fill="#f2d7a6" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-107" points="80.2373,310.4355 113.7846,310.3572 113.7063,276.8099 80.1590,276.8882" fill="#f2d7a6" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-108" points="79.2588,344.0118 112.8059,344.1420 112.9362,310.5949 79.3890,310.4646" fill="#f2d7a6" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
  </g>
  <rect data-feature="container-outline" x="12" y="12" width="366" height="366" fill="none" stroke="#52667a" stroke-width="1.5" />
</svg>
<figcaption><strong>Figure 2.</strong> A historical SQUISH packing of 108 squares,
reported by Nate Chaoweeraprasit (itsnaka) on 7 October 2026. The reported seed was an
$n=110$ packing with two squares removed, followed by nearby search and polishing.
The drawing shows the resulting certified pose; the source does not identify the two
removed squares, and the search has not been reproduced here. Its safe side ceiling
$10.9099400734448775$ has since been superseded by Xu’s $n=108$ witness.
Redrawn from <a href="https://github.com/jlevy/squares/blob/8aba95081b634a4dd4e70c07359b5c11b8a7b1cf/packing/resources/web/squish-422-second-update-2026-10-07/facts/n-108.json.gz">retained exact coordinates</a>
(<a href="https://github.com/itsnaka/squish-certs/blob/e63e4e52b1728b6671b2f263c5e02a4aa79a39d3/squish-submission-2026-10-07b/n108/n108.cert.json">source certificate</a>).</figcaption>
</figure>

These are author-reported lineages.
Independent exact replay confirms feasibility of the resulting poses; it does not
reconstruct the surgeries or reproduce the searches.
The packets do not disclose which squares were removed, graft interfaces, carving
decisions, or the optimizer behind nearby search and squeeze.
Francisco Couzo supplied many of the seeds: his September release contains 49 improved
packings, and his October 3 update improves seven of them.
He credited Claude assistance for the first $n=102$ and $103$ results, but the retained
September and October 3 publications specify no discovery algorithm.
Those publications and subsequent reuse establish available seeds; they do not reveal
how the original seeds were found
([September packet](https://github.com/jlevy/squares/blob/8aba95081b634a4dd4e70c07359b5c11b8a7b1cf/packing/resources/web/franciscouzo-square-packing-2026-09-27/README.md);
[October update](https://github.com/jlevy/squares/blob/8aba95081b634a4dd4e70c07359b5c11b8a7b1cf/packing/resources/web/franciscouzo-square-packing-2026-10-03/README.md)).

## Moving Between Arrangements

Exploration needs a rule for proposing moves and deciding which to keep.
Methods called physical, billiard, or annealing can use quite different rules.

### Hard-particle motion and greedy billiards

In physical billiards, bodies travel between collision events.
A simulation predicts the next collision and updates velocities when it occurs.
Lubachevsky–Stillinger dynamics also grows the particles, making collisions
progressively more frequent as the packing densifies.
This has been effective for disks.
Rotating polygons make collision prediction much harder, because the equations involve
changing orientations as well as centre motion.
Two-dimensional compression can also favor ordered arrangements; for congruent squares
the axis-aligned grid is an obvious ordered state.
No freely rotating square record in this catalogue is attributed to
Lubachevsky–Stillinger dynamics
([retained simulation survey and primary references](https://github.com/jlevy/squares/blob/8aba95081b634a4dd4e70c07359b5c11b8a7b1cf/docs/project/research/research-2026-09-09-simulation-mechanisms-for-packing.md#2-growth-and-collision-lubachevsky-stillinger-inflation)).

Gensane and Ryckelynck’s 2005 square **billiard** instead tests proposed endpoints.
It grows congruent squares inside a fixed box.
If the common square side is $a$ in a unit box, rescaling gives unit squares in side
$1/a$; maximizing $a$ minimizes the final container side.

At fixed size, the algorithm chooses one square and proposes a random translation and
rotation of amplitude $\varepsilon$. It accepts the new pose only if it overlaps neither
another square’s interior nor the outside of the box.
It does not simulate the path between the old and new poses.
If this walk permits growth, it inflates the squares and doubles $\varepsilon$;
otherwise it halves $\varepsilon$. A second phase perturbs *every* square, recomputes an
admissible common size, and runs the billiard again.
It keeps the refined result only if it improves the previous one.

Thousands of random starts used $\varepsilon=0.1$ initially and $10^{-8}$ as the first
pass’s stopping threshold.
Collective perturbations then used a stopping threshold of $10^{-12}$. This is a greedy
stochastic walk with adaptive step size and collective shakes.
It produced the 2004 packings reported at $5.934342$ for $n=29$ and $6.603236$ for
$n=37$
([published pseudocode](https://github.com/jlevy/squares/blob/8aba95081b634a4dd4e70c07359b5c11b8a7b1cf/packing/resources/papers/gensane-ryckelynck-2005-improved-dense-packings.raw.md)).
The $n=29$ arrangement remained best known until Schadt’s December 2025 search
([catalogue history](https://github.com/jlevy/squares/blob/8aba95081b634a4dd4e70c07359b5c11b8a7b1cf/packing/resources/web/kingbird-squares-in-squares-compared-2026-08-22.md)).

### Forces from an optimization penalty

A physically inspired optimizer can instead allow temporary overlap, assign a cost to
it, and move squares in a direction that reduces that cost.
For a *schematic* example, let $\delta_{ij}$ be a chosen nonnegative overlap measure and
$w_i$ a wall-violation measure.
With positive penalty weights $\lambda$ and $\mu$, an objective could take the form

$$
E=S+\lambda\sum_{i<j}\delta_{ij}^2+\mu\sum_i w_i^2.
$$

The first term favors compression; the other terms oppose invalid poses.
Where the chosen functions are differentiable, their negative gradients with respect to
centres and angles determine translations and torques for a descent step.
A program might add damping, noise, or a schedule for the penalty weights.
Those are choices in an optimizer; calling its derivatives forces does not imply that it
simulates elastic collisions.
The formula here explains the mechanism and is not an attribution to any record
producer.

The surrogate objective needs care.
A finite penalty can trade overlap against a smaller side, so reducing $E$ does not by
itself produce a packing.
The gradient of a squared penalty also tends to zero as a smooth violation closes.
For rotating squares, changing the best separating branch introduces further nonsmooth
behavior. Exact geometric checking must follow any such search
([simulation survey](https://github.com/jlevy/squares/blob/8aba95081b634a4dd4e70c07359b5c11b8a7b1cf/docs/project/research/research-2026-09-09-simulation-mechanisms-for-packing.md)).

### Annealing and basin hopping

**Simulated annealing** evaluates a proposal using an objective or energy.
It accepts favorable moves and sometimes accepts unfavorable ones.
A common schematic rule accepts a worsening $\Delta E>0$ with probability
$\exp(-\Delta E/T)$, where $T$ is the **temperature**. Cooling reduces that probability.
Temperature controls acceptance of worse objective values; the procedure need not
integrate physical trajectories.
The objective, proposal distribution, and cooling schedule all affect which arrangements
it reaches.

Thomas Schadt’s program found a new $n=29$ arrangement from randomness in December 2025
and later found the $n=51$ and $n=55$ structures.
His public $n=29$ packet says discovery used C++ `float`, followed by Boost
high-precision relaxation.
It does not publish the energy, proposal distribution, or cooling schedule, so the
schematic acceptance rule above should not be read as a reconstruction of that program
([Schadt packet](https://github.com/jlevy/squares/blob/8aba95081b634a4dd4e70c07359b5c11b8a7b1cf/packing/resources/web/schadt-s29-2025/README.md)).

<figure>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:sqpack="https://github.com/jlevy/thinking-scratchpad/ns/sqpack/v1" class="methods-diagram methods-annealing" width="390" height="390" viewBox="0 0 390 390" role="img" aria-labelledby="methods-annealing-title methods-annealing-description">
  <title id="methods-annealing-title">The 29-square Schadt and Ellsworth example</title>
  <desc id="methods-annealing-description">An illustration of 29 unit squares in a square container, projected from retained source geometry. Credit: Thomas Schadt (2025), improved by David Ellsworth; retained catalogue geometry. The drawing does not run or establish a feasibility or optimality proof.</desc>
  <metadata>
    <sqpack:profile version="8">
      <sqpack:coordinates>retained geometry projected to normalized svg-y-down</sqpack:coordinates>
      <sqpack:value name="credit">Thomas Schadt (2025), improved by David Ellsworth; retained catalogue geometry</sqpack:value>
      <sqpack:value name="purpose">method illustration from retained geometry; no verification replay</sqpack:value>
      <sqpack:value name="source-id">W-known-best-n029</sqpack:value>
      <sqpack:value name="source-input">packing/atlas/known-best/rendering/n-029.svg</sqpack:value>
      <sqpack:value name="source-lineage" />
      <sqpack:value name="source-url">https://kingbird.myphotos.cc/packing/square-29.svg</sqpack:value>
    </sqpack:profile>
  </metadata>
  <rect width="390" height="390" fill="#ffffff" />
  <g data-layer="squares">
    <polygon data-feature="square-fill" data-square="square-001" points="12.0000,73.6802 73.6802,73.6802 73.6802,12.0000 12.0000,12.0000" fill="#257260" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-002" points="73.6802,73.6802 135.3604,73.6802 135.3604,12.0000 73.6802,12.0000" fill="#4b9582" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-003" points="12.0000,135.3604 73.6802,135.3604 73.6802,73.6802 12.0000,73.6802" fill="#4b9582" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-004" points="316.3198,73.6802 378.0000,73.6802 378.0000,12.0000 316.3198,12.0000" fill="#257260" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-005" points="254.6396,73.6802 316.3198,73.6802 316.3198,12.0000 254.6396,12.0000" fill="#36816e" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-006" points="192.9594,73.6802 254.6396,73.6802 254.6396,12.0000 192.9594,12.0000" fill="#4b9582" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-007" points="316.3198,135.3604 378.0000,135.3604 378.0000,73.6802 316.3198,73.6802" fill="#36816e" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-008" points="316.3198,197.0406 378.0000,197.0406 378.0000,135.3604 316.3198,135.3604" fill="#4b9582" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-009" points="12.0000,378.0000 73.6802,378.0000 73.6802,316.3198 12.0000,316.3198" fill="#36816e" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-010" points="73.6802,378.0000 135.3604,378.0000 135.3604,316.3198 73.6802,316.3198" fill="#4b9582" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-011" points="316.3198,378.0000 378.0000,378.0000 378.0000,316.3198 316.3198,316.3198" fill="#257260" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-012" points="254.6396,378.0000 316.3198,378.0000 316.3198,316.3198 254.6396,316.3198" fill="#257260" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-013" points="192.9594,378.0000 254.6396,378.0000 254.6396,316.3198 192.9594,316.3198" fill="#4b9582" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-014" points="316.3198,316.3198 378.0000,316.3198 378.0000,254.6396 316.3198,254.6396" fill="#36816e" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-015" points="254.6396,316.3198 316.3198,316.3198 316.3198,254.6396 254.6396,254.6396" fill="#4b9582" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-016" points="175.3116,133.5545 201.6309,77.7715 145.8479,51.4522 119.5286,107.2352" fill="#da8f7b" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-017" points="233.4230,155.6291 259.4537,99.7109 203.5354,73.6802 177.5048,129.5984" fill="#3fa8f1" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-018" points="290.2891,179.6236 316.3198,123.7053 260.4016,97.6747 234.3709,153.5929" fill="#3fa8f1" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-019" points="185.6960,335.4407 207.5992,277.7805 149.9391,255.8773 128.0359,313.5375" fill="#d46ea8" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-020" points="128.0359,313.5375 149.9391,255.8773 92.2789,233.9741 70.3757,291.6343" fill="#cb5698" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-021" points="70.3757,291.6343 92.2789,233.9741 34.6187,212.0709 12.7155,269.7311" fill="#d46ea8" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-022" points="269.8119,254.6396 328.6353,236.0856 310.0813,177.2622 251.2579,195.8162" fill="#e4c984" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-023" points="241.0258,290.4781 262.9289,232.8179 205.2688,210.9147 183.3656,268.5749" fill="#d46ea8" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-024" points="183.3656,268.5749 205.2688,210.9147 147.6086,189.0115 125.7054,246.6717" fill="#cb5698" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-025" points="125.7054,246.6717 147.6086,189.0115 89.9484,167.1083 68.0452,224.7685" fill="#d46ea8" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-026" points="69.6602,220.5171 91.5634,162.8569 33.9032,140.9537 12.0000,198.6139" fill="#dd87b8" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-027" points="122.6070,176.8791 147.9975,120.6673 91.7857,95.2768 66.3952,151.4886" fill="#76d6f8" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-028" points="182.7862,202.3743 204.6894,144.7142 147.0292,122.8110 125.1260,180.4711" fill="#d46ea8" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-029" points="240.4464,224.2775 262.3496,166.6174 204.6894,144.7142 182.7862,202.3743" fill="#d46ea8" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
  </g>
  <rect data-feature="container-outline" x="12" y="12" width="366" height="366" fill="none" stroke="#52667a" stroke-width="1.5" />
</svg>
<figcaption><strong>Figure 3.</strong> The 29-square arrangement found by Thomas
Schadt’s simulated annealing in December 2025 and subsequently improved analytically
by David Ellsworth. The mixture of tilted and axis-aligned pieces illustrates an
arrangement reached through stochastic search. This drawing uses the
<a href="https://github.com/jlevy/squares/blob/8aba95081b634a4dd4e70c07359b5c11b8a7b1cf/packing/atlas/known-best/rendering/n-029.svg">retained numerical reconstruction</a>, rather than the original floating-point
search output. The separate <a href="https://github.com/jlevy/squares/blob/8aba95081b634a4dd4e70c07359b5c11b8a7b1cf/packing/frontier/n-029.md">interval certificate</a>
supplies the safe side ceiling $5.9338334626769292$.</figcaption>
</figure>

Ellsworth modified Schadt’s annealer, ran parallel GPU searches, and then performed
analytic minimization.
The $n=51$ record was refound from randomness.
The $n=55$ breakthrough began from a cherry-picked state produced by Schadt’s
reimplementation of the Gensane–Ryckelynck search; Ellsworth later refound its basin
from randomness. These histories separate the seed’s contribution from the annealer and
refiner
([Kingbird comparison](https://github.com/jlevy/squares/blob/8aba95081b634a4dd4e70c07359b5c11b8a7b1cf/packing/resources/web/kingbird-squares-in-squares-compared-2026-08-22.md)).

Griffin Casson’s September 2026 release gives a reproduction command with 8,192
single-precision GPU chains, a twelve-minute search setting, and twelve CPU polishers.
The command seeds the search from published records; the reported GPU was an RTX 3070.
Annealing supplied candidates; sequential linear programming refined them.
It found new arrangements at $n=106$ and $123$. Direct local refinement of published
records supplied another 37 reported numerical improvements
([first-party README](https://github.com/jlevy/squares/blob/8aba95081b634a4dd4e70c07359b5c11b8a7b1cf/packing/resources/web/casson-square-packing-2026-09-23/griffcass-square-packing/README.md)).

<figure>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:sqpack="https://github.com/jlevy/thinking-scratchpad/ns/sqpack/v1" class="methods-diagram methods-annealing-slp" width="390" height="390" viewBox="0 0 390 390" role="img" aria-labelledby="methods-annealing-slp-title methods-annealing-slp-description">
  <title id="methods-annealing-slp-title">Casson's 106-square annealing and SLP example</title>
  <desc id="methods-annealing-slp-description">An illustration of 106 unit squares in a square container, projected from retained source geometry. Credit: Griffin Casson; retained 2026-09-23; CC BY 4.0 coordinates, redrawn. The drawing does not run or establish a feasibility or optimality proof.</desc>
  <metadata>
    <sqpack:profile version="8">
      <sqpack:coordinates>retained geometry projected to normalized svg-y-down</sqpack:coordinates>
      <sqpack:value name="credit">Griffin Casson; retained 2026-09-23; CC BY 4.0 coordinates, redrawn</sqpack:value>
      <sqpack:value name="purpose">method illustration from retained geometry; no verification replay</sqpack:value>
      <sqpack:value name="source-id">casson-n106-2026-09-23</sqpack:value>
      <sqpack:value name="source-input">packing/resources/web/casson-square-packing-2026-09-23/griffcass-square-packing/results/packings/n106.txt</sqpack:value>
      <sqpack:value name="source-lineage" />
      <sqpack:value name="source-url">https://github.com/griffcass/square-packing/blob/82661bc8777beeecf458312e8aca9179a969da4f/results/packings/n106.txt</sqpack:value>
    </sqpack:profile>
  </metadata>
  <rect width="390" height="390" fill="#ffffff" />
  <g data-layer="squares">
    <polygon data-feature="square-fill" data-square="square-001" points="12.0000,45.8171 45.8171,45.8171 45.8171,12.0000 12.0000,12.0000" fill="#dcebef" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-002" points="45.8205,45.8171 79.6376,45.8171 79.6376,12.0000 45.8205,12.0000" fill="#dcebef" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-003" points="79.6376,45.8171 113.4547,45.8171 113.4547,12.0000 79.6376,12.0000" fill="#dcebef" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-004" points="113.4547,45.8171 147.2717,45.8171 147.2717,12.0000 113.4547,12.0000" fill="#dcebef" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-005" points="147.2717,45.8171 181.0888,45.8171 181.0888,12.0000 147.2717,12.0000" fill="#dcebef" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-006" points="181.0888,45.8171 214.9059,45.8171 214.9059,12.0000 181.0888,12.0000" fill="#dcebef" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-007" points="214.9059,45.8171 248.7229,45.8171 248.7229,12.0000 214.9059,12.0000" fill="#dcebef" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-008" points="248.7229,45.8171 282.5400,45.8171 282.5400,12.0000 248.7229,12.0000" fill="#dcebef" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-009" points="12.0000,79.6341 45.8171,79.6341 45.8171,45.8171 12.0000,45.8171" fill="#dcebef" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-010" points="45.8205,79.6341 79.6376,79.6341 79.6376,45.8171 45.8205,45.8171" fill="#dcebef" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-011" points="80.1805,79.6341 113.9976,79.6341 113.9976,45.8171 80.1805,45.8171" fill="#dcebef" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-012" points="114.0579,79.6341 147.8749,79.6341 147.8749,45.8171 114.0579,45.8171" fill="#dcebef" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-013" points="148.0120,79.6341 181.8291,79.6341 181.8291,45.8171 148.0120,45.8171" fill="#dcebef" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-014" points="181.8429,79.6341 215.6600,79.6366 215.6624,45.8195 181.8453,45.8171" fill="#f2d7a6" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-015" points="215.6755,79.6336 249.4921,79.8194 249.6779,46.0028 215.8613,45.8171" fill="#f2d7a6" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-016" points="12.0000,113.4512 45.8171,113.4512 45.8171,79.6341 12.0000,79.6341" fill="#dcebef" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-017" points="45.8205,113.4512 79.6376,113.4512 79.6376,79.6341 45.8205,79.6341" fill="#dcebef" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-018" points="79.6376,113.4512 113.4547,113.4512 113.4547,79.6341 79.6376,79.6341" fill="#dcebef" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-019" points="114.7631,113.4512 148.5802,113.4512 148.5802,79.6341 114.7631,79.6341" fill="#dcebef" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-020" points="148.5806,113.4512 182.3976,113.4512 182.3976,79.6342 148.5806,79.6342" fill="#dcebef" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-021" points="182.3977,113.4512 216.2147,113.4537 216.2172,79.6366 182.4001,79.6342" fill="#f2d7a6" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-022" points="12.0000,147.2683 45.8171,147.2683 45.8171,113.4512 12.0000,113.4512" fill="#dcebef" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-023" points="45.8211,147.2683 79.6381,147.2683 79.6381,113.4512 45.8211,113.4512" fill="#dcebef" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-024" points="79.6381,147.2683 113.4552,147.2683 113.4552,113.4512 79.6381,113.4512" fill="#dcebef" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-025" points="113.4552,147.2683 147.2723,147.2683 147.2723,113.4512 113.4552,113.4512" fill="#dcebef" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-026" points="147.2723,147.2683 181.0893,147.2683 181.0893,113.4512 147.2723,113.4512" fill="#dcebef" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-027" points="12.0000,181.0853 45.8171,181.0853 45.8171,147.2683 12.0000,147.2683" fill="#dcebef" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-028" points="45.8171,181.0853 79.6341,181.0853 79.6341,147.2683 45.8171,147.2683" fill="#dcebef" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-029" points="79.6341,181.0853 113.4512,181.0853 113.4512,147.2683 79.6341,147.2683" fill="#dcebef" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-030" points="113.4512,181.0853 147.2683,181.0853 147.2683,147.2683 113.4512,147.2683" fill="#dcebef" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-031" points="12.0000,214.9024 45.8171,214.9024 45.8171,181.0853 12.0000,181.0853" fill="#dcebef" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-032" points="47.5547,214.9024 81.3718,214.9024 81.3718,181.0853 47.5547,181.0853" fill="#dcebef" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-033" points="81.3843,214.9024 115.2014,214.9024 115.2014,181.0853 81.3843,181.0853" fill="#dcebef" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-034" points="12.0000,248.7195 45.8171,248.7195 45.8171,214.9024 12.0000,214.9024" fill="#dcebef" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-035" points="45.8171,248.7195 79.6341,248.7195 79.6341,214.9024 45.8171,214.9024" fill="#dcebef" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-036" points="12.0000,282.5365 45.8171,282.5365 45.8171,248.7195 12.0000,248.7195" fill="#dcebef" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-037" points="344.1829,378.0000 378.0000,378.0000 378.0000,344.1829 344.1829,344.1829" fill="#dcebef" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-038" points="310.3659,378.0000 344.1829,378.0000 344.1829,344.1829 310.3659,344.1829" fill="#dcebef" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-039" points="276.5488,378.0000 310.3659,378.0000 310.3659,344.1829 276.5488,344.1829" fill="#dcebef" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-040" points="242.7317,378.0000 276.5488,378.0000 276.5488,344.1829 242.7317,344.1829" fill="#dcebef" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-041" points="208.9147,378.0000 242.7317,378.0000 242.7317,344.1829 208.9147,344.1829" fill="#dcebef" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-042" points="175.0976,378.0000 208.9147,378.0000 208.9147,344.1829 175.0976,344.1829" fill="#dcebef" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-043" points="141.2805,378.0000 175.0976,378.0000 175.0976,344.1829 141.2805,344.1829" fill="#dcebef" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-044" points="107.4635,378.0000 141.2805,378.0000 141.2805,344.1829 107.4635,344.1829" fill="#dcebef" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-045" points="73.6464,378.0000 107.4635,378.0000 107.4635,344.1829 73.6464,344.1829" fill="#dcebef" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-046" points="344.1829,344.1829 378.0000,344.1829 378.0000,310.3659 344.1829,310.3659" fill="#dcebef" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-047" points="310.3659,344.1829 344.1829,344.1829 344.1829,310.3659 310.3659,310.3659" fill="#dcebef" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-048" points="276.5488,344.1696 310.3659,344.1696 310.3659,310.3525 276.5488,310.3525" fill="#dcebef" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-049" points="242.7317,344.1824 276.5488,344.1824 276.5488,310.3653 242.7317,310.3653" fill="#dcebef" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-050" points="208.9147,344.1824 242.7317,344.1824 242.7317,310.3653 208.9147,310.3653" fill="#dcebef" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-051" points="175.0976,344.1829 208.9147,344.1829 208.9147,310.3659 175.0976,310.3659" fill="#dcebef" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-052" points="141.2805,344.1829 175.0976,344.1829 175.0976,310.3659 141.2805,310.3659" fill="#dcebef" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-053" points="107.4635,344.1829 141.2805,344.1829 141.2805,310.3659 107.4635,310.3659" fill="#dcebef" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-054" points="344.1829,310.3659 378.0000,310.3659 378.0000,276.5488 344.1829,276.5488" fill="#dcebef" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-055" points="310.3659,310.3659 344.1829,310.3659 344.1829,276.5488 310.3659,276.5488" fill="#dcebef" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-056" points="276.5488,310.3400 310.3659,310.3400 310.3659,276.5229 276.5488,276.5229" fill="#dcebef" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-057" points="242.7317,310.3429 276.5488,310.3429 276.5488,276.5258 242.7317,276.5258" fill="#dcebef" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-058" points="208.9147,310.3653 242.7317,310.3653 242.7317,276.5482 208.9147,276.5482" fill="#dcebef" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-059" points="175.0976,310.3653 208.9147,310.3653 208.9147,276.5482 175.0976,276.5482" fill="#dcebef" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-060" points="141.2805,310.3659 175.0976,310.3659 175.0976,276.5488 141.2805,276.5488" fill="#dcebef" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-061" points="344.1829,276.5488 378.0000,276.5488 378.0000,242.7317 344.1829,242.7317" fill="#dcebef" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-062" points="310.3659,276.5488 344.1829,276.5488 344.1829,242.7317 310.3659,242.7317" fill="#dcebef" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-063" points="276.5488,276.5229 310.3659,276.5229 310.3659,242.7058 276.5488,242.7058" fill="#dcebef" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-064" points="242.7317,276.5258 276.5488,276.5258 276.5488,242.7087 242.7317,242.7087" fill="#dcebef" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-065" points="208.9147,276.5482 242.7317,276.5482 242.7317,242.7312 208.9147,242.7312" fill="#dcebef" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-066" points="175.0976,276.5482 208.9147,276.5482 208.9147,242.7312 175.0976,242.7312" fill="#dcebef" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-067" points="344.1829,242.7317 378.0000,242.7317 378.0000,208.9146 344.1829,208.9147" fill="#dcebef" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-068" points="310.3659,242.7317 344.1829,242.7317 344.1829,208.9147 310.3659,208.9147" fill="#dcebef" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-069" points="276.5488,242.6431 310.3659,242.6431 310.3659,208.8260 276.5488,208.8260" fill="#dcebef" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-070" points="242.7317,242.7087 276.5488,242.7087 276.5488,208.8917 242.7317,208.8917" fill="#dcebef" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-071" points="208.9147,242.7312 242.7317,242.7312 242.7317,208.9141 208.9147,208.9141" fill="#dcebef" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-072" points="344.1829,208.9071 378.0000,208.9071 378.0000,175.0901 344.1829,175.0901" fill="#dcebef" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-073" points="310.3659,208.9147 344.1829,208.9147 344.1829,175.0976 310.3659,175.0976" fill="#dcebef" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-074" points="276.5488,208.7998 310.3659,208.7998 310.3659,174.9827 276.5488,174.9827" fill="#dcebef" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-075" points="242.7317,208.8917 276.5488,208.8917 276.5488,175.0746 242.7317,175.0746" fill="#dcebef" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-076" points="344.1829,175.0901 378.0000,175.0901 378.0000,141.2730 344.1829,141.2730" fill="#dcebef" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-077" points="310.3659,175.0976 344.1829,175.0976 344.1829,141.2805 310.3658,141.2805" fill="#dcebef" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-078" points="276.5488,174.9736 310.3658,174.9674 310.3596,141.1503 276.5425,141.1566" fill="#f2d7a6" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-079" points="344.1829,141.2730 378.0000,141.2730 378.0000,107.4559 344.1829,107.4559" fill="#dcebef" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-080" points="310.3659,141.2805 344.1829,141.2805 344.1829,107.4634 310.3659,107.4635" fill="#dcebef" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-081" points="344.1829,107.4559 378.0000,107.4559 378.0000,73.6388 344.1829,73.6389" fill="#dcebef" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-082" points="344.1829,45.8232 378.0000,45.8232 378.0000,12.0061 344.1829,12.0061" fill="#dcebef" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-083" points="12.4518,378.0000 46.2688,378.0000 46.2688,344.1829 12.4518,344.1829" fill="#dcebef" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-084" points="12.0000,344.1829 45.8171,344.1829 45.8171,310.3659 12.0000,310.3659" fill="#dcebef" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-085" points="305.7072,59.0286 333.5850,39.8865 314.4428,12.0086 286.5650,31.1508" fill="#f2d7a6" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-086" points="329.2826,83.8701 357.1604,64.7279 338.0183,36.8501 310.1405,55.9922" fill="#f2d7a6" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-087" points="49.4078,318.1327 80.1032,303.9417 65.9122,273.2462 35.2168,287.4372" fill="#f2d7a6" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-088" points="60.0319,350.4771 90.7273,336.2861 76.5363,305.5907 45.8409,319.7817" fill="#f2d7a6" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-089" points="73.1773,288.9608 103.8727,274.7697 89.6817,244.0743 58.9863,258.2653" fill="#f2d7a6" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-090" points="87.3683,319.6562 118.0638,305.4652 103.8727,274.7697 73.1773,288.9608" fill="#f2d7a6" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-091" points="96.9468,259.7889 127.6422,245.5978 113.4512,214.9024 82.7558,229.0934" fill="#f2d7a6" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-092" points="111.1485,290.4794 141.8439,276.2883 127.6529,245.5929 96.9574,259.7839" fill="#f2d7a6" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-093" points="127.9640,246.2656 158.6568,232.0689 144.4601,201.3761 113.7673,215.5728" fill="#f2d7a6" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-094" points="143.1002,276.5410 173.8082,262.3771 159.6443,231.6692 128.9363,245.8331" fill="#f2d7a6" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-095" points="151.4155,216.4134 182.1235,202.2495 167.9596,171.5416 137.2516,185.7055" fill="#f2d7a6" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-096" points="166.5763,246.6616 197.2842,232.4977 183.1204,201.7897 152.4124,215.9536" fill="#f2d7a6" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-097" points="175.1565,187.1449 205.9231,173.1089 191.8871,142.3423 161.1205,156.3783" fill="#f2d7a6" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-098" points="190.6100,217.2649 221.3766,203.2288 207.3406,172.4622 176.5740,186.4983" fill="#f2d7a6" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-099" points="202.7197,159.9704 231.5316,142.2654 213.8265,113.4535 185.0147,131.1586" fill="#f2d7a6" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-100" points="218.2453,190.1216 247.0572,172.4166 229.3521,143.6047 200.5403,161.3097" fill="#f2d7a6" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-101" points="232.1887,143.3359 261.0098,125.6459 243.3199,96.8248 214.4987,114.5147" fill="#f2d7a6" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-102" points="247.7122,173.4851 276.5436,155.8118 258.8703,126.9804 230.0389,144.6537" fill="#f2d7a6" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-103" points="255.1249,116.0531 283.9441,98.3598 266.2508,69.5407 237.4317,87.2339" fill="#f2d7a6" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-104" points="278.8831,141.1561 307.7213,123.4939 290.0590,94.6557 261.2209,112.3180" fill="#f2d7a6" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-105" points="276.1539,85.6506 307.0628,71.9307 293.3429,41.0219 262.4340,54.7418" fill="#f2d7a6" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-106" points="300.6202,111.7894 331.5291,98.0695 317.8091,67.1606 286.9003,80.8805" fill="#f2d7a6" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
  </g>
  <rect data-feature="container-outline" x="12" y="12" width="366" height="366" fill="none" stroke="#52667a" stroke-width="1.5" />
</svg>
<figcaption><strong>Figure 4.</strong> Griffin Casson’s September 2026 packing of 106
squares, one of the two arrangements reported from GPU simulated annealing followed
by sequential linear programming. Redrawn from the
<a href="https://github.com/jlevy/squares/blob/8aba95081b634a4dd4e70c07359b5c11b8a7b1cf/packing/resources/web/casson-square-packing-2026-09-23/griffcass-square-packing/results/packings/n106.txt">dated source coordinates</a>
(<a href="https://github.com/griffcass/square-packing/blob/82661bc8777beeecf458312e8aca9179a969da4f/results/packings/n106.txt">pinned original</a>, CC BY 4.0).
This source pose is an illustration of the reported workflow; it has not undergone an
independent local feasibility replay here.</figcaption>
</figure>

**Basin hopping** inserts local refinement into the exploration loop: perturb a locally
optimized pose, refine the perturbed pose, and apply an acceptance rule to the refined
outcome. Thus even a large raw perturbation can count as no escape if refinement returns
to the same endpoint.
Casson’s README names a CPU basin-hopping component, but its detailed document and
parameters are not retained.
SQUISH, short for “SQuare-packing Using Iterative Shrink-Hopping,” explicitly reports
basin hopping after seed transformations, followed by polishing.
Its published evidence does not disclose the objective, local optimizer,
square-selection rule, or hop schedule
([Casson README](https://github.com/jlevy/squares/blob/8aba95081b634a4dd4e70c07359b5c11b8a7b1cf/packing/resources/web/casson-square-packing-2026-09-23/griffcass-square-packing/README.md);
[original SQUISH submission](https://github.com/jlevy/squares/issues/401)).

Couzo’s 8 October follow-up discloses a more specific workflow.
He starts from Ryan Xu’s packings at $n=84,86,105,175$ and Daniel’s at $n=270$. Couzo
reports basin hopping at four counts; at $n=175$, Ellsworth’s `refine_packing` followed
by Daniel’s `fq` supplied the refinement.
Daniel’s exact contact solver wrote the rational certificates.
These disclosures identify tools and stages, while leaving the perturbation
distribution, acceptance rule, and stopping criteria unspecified.
The complete certificates have passing native feasibility replays here; their adoption
as standing bounds remains pending at this survey’s cutoff
([eight refinements](https://github.com/jlevy/squares/blob/8aba95081b634a4dd4e70c07359b5c11b8a7b1cf/packing/resources/web/couzo-exact-refinements-2026-10-08/README.md);
[five follow-up refinements](https://github.com/jlevy/squares/blob/8aba95081b634a4dd4e70c07359b5c11b8a7b1cf/packing/resources/web/couzo-followup-refinements-2026-10-08/README.md)).

Daniel’s 9 October record hunt supplies a reported example of moving uphill between
minima. He reports starting from Couzo’s $n=132$ packing, taking an uphill excursion
through intermediate minima, and applying contact/KKT refinement and rational
certification. The retained certificate permits independent feasibility checking; the
search path and numerical local-minimum checks have not been reproduced here
([record-hunt packet](https://github.com/jlevy/squares/blob/8aba95081b634a4dd4e70c07359b5c11b8a7b1cf/packing/resources/web/evand-record-hunt-2026-10-09/README.md)).

Joost de Winter describes the 16 September 2026 $n=211$ result as full-packing adaptive
search, grouped-angle local refinement, and interval-verified decimal export.
This identifies the stages but not their detailed mechanics.
Sharing an angle among selected squares can reduce the nonlinear degrees of freedom; the
source does not specify how its groups were selected or constrained.
No code, adaptive schedule, or interval boxes were published
([retained packet](https://github.com/jlevy/squares/blob/8aba95081b634a4dd4e70c07359b5c11b8a7b1cf/packing/resources/web/de-winter-square-packing-211-2026-09-16/README.md)).

## Refining a Promising Arrangement

### Fixed-angle LP and angle refinement

A **fixed-angle LP** holds all angles and one separating branch per pair fixed, then
minimizes $S$ over centres and side.
The formulation is exactly linear.
A floating-point solver still has tolerances: its returned coordinates can slightly
violate an inequality.
Even an exact optimum solves only that chosen subproblem; other branches or other angles
may admit smaller sides.

This project’s **quench**, its local refiner, alternates two loops.
The inner loop reads separating branches from the pose, solves their fixed-angle LP,
then reads branches again from the result.
It repeats until the selected cell stabilizes, or reports that it stopped unsettled.
The outer loop brackets and minimizes angles shared by selected groups of squares.
An optional pass moves individual angles as well.
Angle refinement can improve a pose whose fixed-angle LP no longer improves
([quench description](https://github.com/jlevy/squares/blob/8aba95081b634a4dd4e70c07359b5c11b8a7b1cf/TUTORIAL.md#the-quench-map)).

**Sequential linear programming (SLP)** can instead let angles move inside each local
LP. Near the current pose, it replaces nonlinear angle-dependent constraints with their
first-order approximations.
It solves that linear subproblem, updates the pose, and builds another approximation.
Casson’s implementation uses HiGHS and moves each square’s centre and angle.
It polished both annealer outputs and slightly perturbed copies of catalogue records.
Even an exactly solved linearized subproblem can produce a pose that violates the
original nonlinear constraints, so the resulting geometry needs a feasibility check
([implementation description](https://github.com/jlevy/squares/blob/8aba95081b634a4dd4e70c07359b5c11b8a7b1cf/packing/resources/web/casson-square-packing-2026-09-23/griffcass-square-packing/README.md)).

The distinction is the variables in the LP. Fixed-angle LP has exact linear separation
constraints and moves centres and side.
Rotational SLP also moves angles, using a linear approximation to their nonlinear
effect. Both are local ingredients; neither searches all branch choices.

### Contact equations and analytic reconstruction

Near a settled arrangement, likely **contacts** identify equalities: a particular corner
touches a particular edge, or an edge or corner meets a wall.
Knowing only that two squares touch does not specify the equation.
A contact graph therefore needs geometric feature information before a solver can use
it.

Ellsworth writes contact equations, eliminates coordinates where possible, and adds
stationarity equations if the contacts leave freedom to change the side.
For example, suppose a reduced contact equation is $F(S,a)=0$, where $a$ is one angle
and $F_S=\partial F/\partial S\ne0$. Locally it defines $S$ as a function of $a$, with

$$
\frac{dS}{da}=-\frac{F_a}{F_S}.
$$

A stationary side along this smooth family therefore satisfies $F_a=0$. The contact
equation and derivative equation can be solved together.
With more variables, a **Jacobian** collects first derivatives; appending the side’s
gradient to the contact gradients gives rank conditions that Ellsworth expresses through
determinants
([analytic minimization notes](https://github.com/jlevy/squares/blob/8aba95081b634a4dd4e70c07359b5c11b8a7b1cf/packing/resources/web/kingbird-squares-in-squares-analytic-minimization.md)).

On a regular smooth contact family, **stationarity** means the side’s derivative
vanishes in every tangent direction.
A zero determinant alone can also arise from redundant or singular equations.
Stationary solutions can be maxima or saddles, and motions that open contacts or change
separating branches require separate analysis.
High-precision root finding supplies numerical candidates.
Integer-relation methods then seek small integer coefficients for a polynomial nearly
zero at the numerical side.
A rigorous algebraic reconstruction must identify the intended root and verify the
equations and every packing inequality
([tutorial’s reconstruction](https://github.com/jlevy/squares/blob/8aba95081b634a4dd4e70c07359b5c11b8a7b1cf/TUTORIAL.md#from-a-numeric-solution-to-an-exact-one)).

Evan Daniel’s October 2026 solver uses **Karush–Kuhn–Tucker (KKT) equations**. For a
smooth branch, write the pair and wall clearances as $g_k(q)\ge0$, where $q$ collects
the side, centres, and angles.
At a feasible pose the KKT conditions require multipliers $\lambda_k$ satisfying

$$
\nabla S=\sum_k\lambda_k\nabla g_k,\qquad
\lambda_k\ge0,\qquad \lambda_k g_k(q)=0.
$$

Here $\nabla$ is the vector of first derivatives with respect to $q$. The last equation
allows a nonzero multiplier only at a closed contact; a closed contact may still have
zero multiplier. The first equation balances the pressure to reduce $S$ against contact
forces and torques. Under suitable regularity conditions, KKT is necessary for a branch
minimum. Singular branches can require more general first-order conditions, and
satisfying KKT alone does not prove a minimum
([tutorial’s stationarity conditions](https://github.com/jlevy/squares/blob/8aba95081b634a4dd4e70c07359b5c11b8a7b1cf/TUTORIAL.md#contact-graphs-stationary-branches-and-rattlers)).

Daniel’s equilibrium LP identifies the **load-bearing contacts**: contacts that can
carry positive force in at least one nonnegative equilibrium.
Squares with no such contact are force-free; they include **rattlers**, squares with
room for local motion.
His solver projects the pose onto contact equations and takes high-precision Newton
steps in the KKT system: each step uses a linear approximation to correct the current
solution. When contact equations are redundant, he selects an independent subset and
checks the omitted equations afterwards.
Flat motions, such as sliding between parallel sides, can make the Newton system
singular. He freezes the corresponding variables during the solve, then checks their
omitted stationarity equations.
Force-free squares are moved to gain clearance where possible; those that cannot gain
positive clearance are brought into the contact system
([solver’s active-set treatment](https://github.com/jlevy/squares/blob/8aba95081b634a4dd4e70c07359b5c11b8a7b1cf/packing/resources/web/evand-square-packing-2026-10-05/square-packing/s12/search/exact/README.md)).

Corner-to-corner touches require additional care: the squares can separate along
different branches. Daniel sets these alternatives apart from the smooth contact
equations and tests first-order motions with a **mixed-integer model**, combining
continuous motions with discrete separating-branch choices.
His numerical checks also examine contact multipliers and second-order behavior.
Of 321 configurations with certificates, 315 passed the producer’s numerical
local-minimum checks.
These are numerical tests, not interval proofs of a KKT root or of local optimality.
Even a rigorous result for one smooth contact branch would leave other corner-contact
branches and better arrangements elsewhere to be addressed
([producer method and limitations](https://github.com/jlevy/squares/blob/8aba95081b634a4dd4e70c07359b5c11b8a7b1cf/packing/resources/web/evand-square-packing-2026-10-05/square-packing/s12/search/exact/README.md)).

Contact selection can change during the numerical solve.
Daniel’s updated implementation reselects its independent contact subset when Newton’s
Jacobian becomes nearly singular near convergence, as reported for $n=130$. For $n=105$,
it selects one corner-contact separating branch for the KKT and second-order solve.
Those conclusions concern the selected branch; other admissible branches need separate
checks
([updated solver limitations](https://github.com/jlevy/squares/blob/8aba95081b634a4dd4e70c07359b5c11b8a7b1cf/packing/resources/web/evand-batch-wrapper-2026-10-07/source/s12/search/exact/README.md#limitations)).

## Turning Coordinates into a Bound

A **witness** supplies the container side and every square’s pose.
A certificate adds the data and interpretation needed for a rigorous checker.
Discovery and high-precision refinement help make that witness, but feasibility can be
established without proving that its coordinates are the exact numerical optimum.

SQUISH stores a rational container side, rational centres, and a rational half-angle
parameter $t=\tan(\theta/2)$ for each square.
Define

$$
c=\frac{1-t^2}{1+t^2},\qquad d=\frac{2t}{1+t^2}.
$$

The identity $c^2+d^2=1$ holds exactly.
Thus $(c,d)$ and $(-d,c)$ are perpendicular unit directions, and the corner formula
gives an exact unit square.
A verifier can check every corner’s containment and every pair’s separation with
rational arithmetic, allowing boundary contact
([certificate explanation](https://github.com/jlevy/squares/blob/8aba95081b634a4dd4e70c07359b5c11b8a7b1cf/packing/resources/web/squish-401-2026-10-07/README.md)).

For a small exact example of the representation, take $t=1/3$, so $c=4/5$ and $d=3/5$.
Centre the square at $(7/10,7/10)$. Its corners, in cyclic order, are $(4/5,7/5)$,
$(7/5,3/5)$, $(3/5,0)$, and $(0,4/5)$. They lie in the side-$7/5$ box, and consecutive
corner differences have length one.
All of these statements are rational checks.
This illustrates certification of a pose; a single axis-aligned square already fits in
side 1.

For a full packing, the verifier checks the square count and unit shape, every wall
inequality, and non-overlap for every pair, whether by explicit separating-axis tests or
another rigorous geometric route.
Rigorous interval methods can instead enclose uncertain quantities and prove the
required inequalities over the enclosures.
A gap interval that straddles zero leaves that separation test undecided; a tighter
enclosure, another separating axis, or an exact contact identity may resolve it.
Every pair still needs a rigorous non-overlap decision.

Daniel first expands centres and container slightly while keeping the pieces unit size,
then rounds centres and half-angle parameters to rationals.
The added clearance permits exact verification without identifying the original optimum
as an algebraic number.
The upper bound is the side of the resulting certified packing, including enlargement
and rounding. A shorter decimal claimed as an upper bound must round the certified side
upward
([producer certificate construction](https://github.com/jlevy/squares/blob/8aba95081b634a4dd4e70c07359b5c11b8a7b1cf/packing/resources/web/evand-square-packing-2026-10-05/square-packing/s12/search/exact/README.md)).

This matters even when the source publishes many digits.
SQUISH’s second $n=263$ update prints $16.7404196795387747$, below its exact certificate
side. The safe sixteen-place ceiling is $16.7404196795387766$. The exact certificate
remains valid; the inward-rounded display does not itself follow as an upper bound
([retained exact side and displays](https://github.com/jlevy/squares/blob/8aba95081b634a4dd4e70c07359b5c11b8a7b1cf/packing/resources/web/squish-422-second-update-2026-10-07/README.md#exact-sides-and-displays)).

Rational rounding is one route to a certificate.
Ryan Xu’s separate **undilated algebraic witness** at $n=51$ uses axis-aligned and
$45^\circ$ squares in side

$$
S=\frac{16+5\sqrt2}{3},\qquad s(51)\le S.
$$

The exact $45^\circ$ directions have coefficients $\sqrt2/2$. They belong to the number
field $\mathbb Q(\sqrt2)$, whose elements have the form $a+b\sqrt2$ with rational $a,b$.
A checker can represent an element by the pair $(a,b)$ and decide its sign with exact
rational comparisons.
This preserves the exact square shapes and contacts while checking the same containment
and separating-axis conditions.
The native number-field route and a separate coefficient-pair and corner implementation
checked all 51 squares; both accepted the witness and rejected duplicate-square and
outside-container controls.
This undilated witness is checked separately from the dilated rational certificate of
the same arrangement.
It proves feasibility at $S$, without establishing that $S$ is the minimum
([complete geometry and replay scope](https://github.com/jlevy/squares/blob/8aba95081b634a4dd4e70c07359b5c11b8a7b1cf/packing/resources/web/ry-xu-new-packings-2026-10-08/README.md#separate-undilated-n51-construction)).

<figure>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:sqpack="https://github.com/jlevy/thinking-scratchpad/ns/sqpack/v1" class="methods-diagram methods-algebraic-witness" width="390" height="390" viewBox="0 0 390 390" role="img" aria-labelledby="methods-algebraic-witness-title methods-algebraic-witness-description">
  <title id="methods-algebraic-witness-title">Xu's 51-square algebraic witness example</title>
  <desc id="methods-algebraic-witness-description">An illustration of 51 unit squares in a square container, projected from retained source geometry. Credit: ry-xu, square_packing. The drawing does not run or establish a feasibility or optimality proof.</desc>
  <metadata>
    <sqpack:profile version="8">
      <sqpack:coordinates>retained geometry projected to normalized svg-y-down</sqpack:coordinates>
      <sqpack:value name="credit">ry-xu, square_packing</sqpack:value>
      <sqpack:value name="purpose">method illustration from retained geometry; no verification replay</sqpack:value>
      <sqpack:value name="source-id">W-known-best-n051</sqpack:value>
      <sqpack:value name="source-input">packing/atlas/known-best/rendering/n-051.svg</sqpack:value>
      <sqpack:value name="source-lineage" />
      <sqpack:value name="source-url">https://github.com/ry-xu/square_packing/blob/8dc415296f697f5140caea27c7a0193d52deb4e6/square_packing_records.json</sqpack:value>
    </sqpack:profile>
  </metadata>
  <rect width="390" height="390" fill="#ffffff" />
  <g data-layer="squares">
    <polygon data-feature="square-fill" data-square="square-001" points="330.4079,59.5921 378.0000,59.5921 378.0000,12.0000 330.4079,12.0000" fill="#257260" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-002" points="282.8158,59.5921 330.4079,59.5921 330.4079,12.0000 282.8158,12.0000" fill="#4b9582" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-003" points="154.7762,59.5921 202.3683,59.5921 202.3683,12.0000 154.7762,12.0000" fill="#4b9582" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-004" points="107.1842,59.5921 154.7762,59.5921 154.7762,12.0000 107.1842,12.0000" fill="#257260" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-005" points="59.5921,59.5921 107.1842,59.5921 107.1842,12.0000 59.5921,12.0000" fill="#257260" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-006" points="12.0000,59.5921 59.5921,59.5921 59.5921,12.0000 12.0000,12.0000" fill="#257260" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-007" points="248.7646,80.5012 282.4172,46.8485 248.7646,13.1958 215.1119,46.8485" fill="#d4d453" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-008" points="215.1119,114.1538 248.7646,80.5012 215.1119,46.8485 181.4592,80.5012" fill="#c1c13c" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-009" points="330.4079,107.1842 378.0000,107.1842 378.0000,59.5921 330.4079,59.5921" fill="#4b9582" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-010" points="107.1842,107.1842 154.7762,107.1842 154.7762,59.5921 107.1842,59.5921" fill="#4b9582" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-011" points="59.5921,107.1842 107.1842,107.1842 107.1842,59.5921 59.5921,59.5921" fill="#257260" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-012" points="12.0000,107.1842 59.5921,107.1842 59.5921,59.5921 12.0000,59.5921" fill="#257260" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-013" points="276.2448,120.3263 309.8974,86.6737 276.2448,53.0210 242.5921,86.6737" fill="#c1c13c" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-014" points="181.4592,147.8065 215.1119,114.1538 181.4592,80.5012 147.8065,114.1538" fill="#c1c13c" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-015" points="309.8974,153.9790 343.5501,120.3263 309.8974,86.6737 276.2448,120.3263" fill="#c1c13c" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-016" points="242.5921,153.9790 276.2448,120.3263 242.5921,86.6737 208.9394,120.3263" fill="#aead1f" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-017" points="59.5921,154.7762 107.1842,154.7762 107.1842,107.1842 59.5921,107.1842" fill="#4b9582" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-018" points="12.0000,154.7762 59.5921,154.7762 59.5921,107.1842 12.0000,107.1842" fill="#257260" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-019" points="147.8065,181.4592 181.4592,147.8065 147.8065,114.1538 114.1538,147.8065" fill="#c1c13c" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-020" points="276.2448,187.6317 309.8974,153.9790 276.2448,120.3263 242.5921,153.9790" fill="#c1c13c" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-021" points="208.9394,187.6317 242.5921,153.9790 208.9394,120.3263 175.2867,153.9790" fill="#d4d453" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-022" points="330.4079,187.6317 378.0000,187.6317 378.0000,140.0396 330.4079,140.0396" fill="#4b9582" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-023" points="12.0000,202.3683 59.5921,202.3683 59.5921,154.7762 12.0000,154.7762" fill="#4b9582" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-024" points="114.1538,215.1119 147.8065,181.4592 114.1538,147.8065 80.5012,181.4592" fill="#c1c13c" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-025" points="153.9790,242.5921 187.6317,208.9394 153.9790,175.2867 120.3263,208.9394" fill="#d4d453" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-026" points="330.4079,235.2238 378.0000,235.2238 378.0000,187.6317 330.4079,187.6317" fill="#257260" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-027" points="282.8158,235.2238 330.4079,235.2238 330.4079,187.6317 282.8158,187.6317" fill="#36816e" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-028" points="235.2238,235.2238 282.8158,235.2238 282.8158,187.6317 235.2238,187.6317" fill="#36816e" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-029" points="187.6317,235.2238 235.2238,235.2238 235.2238,187.6317 187.6317,187.6317" fill="#4b9582" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-030" points="80.5012,248.7646 114.1538,215.1119 80.5012,181.4592 46.8485,215.1119" fill="#c1c13c" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-031" points="120.3263,276.2448 153.9790,242.5921 120.3263,208.9394 86.6737,242.5921" fill="#aead1f" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-032" points="46.8485,282.4172 80.5012,248.7646 46.8485,215.1119 13.1958,248.7646" fill="#d4d453" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-033" points="330.4079,282.8158 378.0000,282.8158 378.0000,235.2238 330.4079,235.2238" fill="#257260" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-034" points="282.8158,282.8158 330.4079,282.8158 330.4079,235.2238 282.8158,235.2238" fill="#257260" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-035" points="235.2238,282.8158 282.8158,282.8158 282.8158,235.2238 235.2238,235.2238" fill="#257260" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-036" points="187.6317,282.8158 235.2238,282.8158 235.2238,235.2238 187.6317,235.2238" fill="#36816e" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-037" points="153.9790,309.8974 187.6317,276.2448 153.9790,242.5921 120.3263,276.2448" fill="#c1c13c" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-038" points="86.6737,309.8974 120.3263,276.2448 86.6737,242.5921 53.0210,276.2448" fill="#c1c13c" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-039" points="330.4079,330.4079 378.0000,330.4079 378.0000,282.8158 330.4079,282.8158" fill="#257260" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-040" points="282.8158,330.4079 330.4079,330.4079 330.4079,282.8158 282.8158,282.8158" fill="#257260" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-041" points="235.2238,330.4079 282.8158,330.4079 282.8158,282.8158 235.2238,282.8158" fill="#257260" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-042" points="187.6317,330.4079 235.2238,330.4079 235.2238,282.8158 187.6317,282.8158" fill="#36816e" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-043" points="12.0000,330.4079 59.5921,330.4079 59.5921,282.8158 12.0000,282.8158" fill="#4b9582" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-044" points="120.3263,343.5501 153.9790,309.8974 120.3263,276.2448 86.6737,309.8974" fill="#c1c13c" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-045" points="330.4079,378.0000 378.0000,378.0000 378.0000,330.4079 330.4079,330.4079" fill="#257260" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-046" points="282.8158,378.0000 330.4079,378.0000 330.4079,330.4079 282.8158,330.4079" fill="#257260" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-047" points="235.2238,378.0000 282.8158,378.0000 282.8158,330.4079 235.2238,330.4079" fill="#257260" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-048" points="187.6317,378.0000 235.2238,378.0000 235.2238,330.4079 187.6317,330.4079" fill="#257260" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-049" points="140.0396,378.0000 187.6317,378.0000 187.6317,330.4079 140.0396,330.4079" fill="#4b9582" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-050" points="59.5921,378.0000 107.1842,378.0000 107.1842,330.4079 59.5921,330.4079" fill="#4b9582" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
    <polygon data-feature="square-fill" data-square="square-051" points="12.0000,378.0000 59.5921,378.0000 59.5921,330.4079 12.0000,330.4079" fill="#257260" stroke="#172b3a" stroke-width="0.75" stroke-linejoin="round" />
  </g>
  <rect data-feature="container-outline" x="12" y="12" width="366" height="366" fill="none" stroke="#52667a" stroke-width="1.5" />
</svg>
<figcaption><strong>Figure 5.</strong> Ryan Xu’s October 2026 packing of 51 squares,
using only axis-aligned and $45^\circ$ pieces. The arrangement’s structure permits an
exact certificate over $\mathbb Q(\sqrt2)$ at side $(16+5\sqrt2)/3$.
Redrawn from the <a href="https://github.com/jlevy/squares/blob/8aba95081b634a4dd4e70c07359b5c11b8a7b1cf/packing/atlas/known-best/rendering/n-051.svg">retained algebraic witness drawing</a>.
The certificate verifies feasibility; the reported LLM-assisted workflow leaves the
exploration algorithm unspecified, and the picture supplies no optimality proof.</figcaption>
</figure>

Three conclusions require different evidence:

| Conclusion | What must be established |
| --- | --- |
| Feasibility, hence an upper bound | the listed unit squares fit in the claimed side |
| Local optimality | no smaller-side packing exists in a specified neighborhood, including applicable contact branches |
| Global optimality | no smaller-side packing exists anywhere, usually by a matching lower bound |

A valid witness establishes the first.
A long decimal, equilibrium equations, or unsuccessful perturbation tests do not supply
the other two.

**Local rigidity** asks whether a specified packing admits nontrivial feasible motion at
fixed container side, after declared symmetries are removed; the two optimality
statements above concern whether the side can be reduced
([tutorial](https://github.com/jlevy/squares/blob/8aba95081b634a4dd4e70c07359b5c11b8a7b1cf/TUTORIAL.md#contact-graphs-stationary-branches-and-rattlers)). The
atlas’s $R$ badge can reflect a proved local-rigidity result or a reported catalogue
assertion. When comparing methods, record which configuration was assessed and whether
its rigidity evidence is proved or reported.
A numerical single-square translation screen with no hit establishes neither rigidity
nor local optimality: it omits rotations and coordinated motions.
Rigidity evidence belongs to the assessed configuration.
A different packing at the same side may have different motions, as the retained
alternatives at $n=52,149,296$ illustrate
([source index](https://github.com/jlevy/squares/blob/8aba95081b634a4dd4e70c07359b5c11b8a7b1cf/packing/frontier/rigidity-sources.yaml)).

## Reading the Record

### Methods and record examples

The categories below place each method at its stage in the workflow.
Examples retain their finder and source credit, including historical records that have
since been improved.
A source’s description of discovery or refinement and an independent feasibility check
answer different questions.

| Method family | Stage and mechanism | Source, finder, and representative result |
| --- | --- | --- |
| Geometric construction and composition | Seed construction or a complete construction: design diagonal strips, tilted cores, boundary extensions, or combinations of smaller packings; optimize the remaining parameters. | Frits Göbel’s strip families and Walter Trump’s 1979 $n=11$ construction are historical examples ([Friedman survey](https://github.com/jlevy/squares/blob/8aba95081b634a4dd4e70c07359b5c11b8a7b1cf/packing/resources/web/friedman-ds7-survey-2009-html.md)). |
| Billiard / inflation search | Exploration and refinement: translate and rotate squares by random admissible endpoint moves, increase their common size, adapt move amplitudes, and shake the whole configuration when jammed. | Thierry Gensane and Philippe Ryckelynck’s 2004 $n=29$ packing set a historical record. Their $n=37$ result was a reported improvement but did not beat Cantrell’s earlier packing ([published algorithm](https://github.com/jlevy/squares/blob/8aba95081b634a4dd4e70c07359b5c11b8a7b1cf/packing/resources/papers/gensane-ryckelynck-2005-improved-dense-packings.raw.md); [catalogue history](https://github.com/jlevy/squares/blob/8aba95081b634a4dd4e70c07359b5c11b8a7b1cf/packing/resources/web/kingbird-squares-in-squares-compared-2026-08-22.md)). |
| GPU simulated annealing | Exploration: run many stochastic chains in parallel from random or selected seeds; refine promising outputs separately. | Thomas Schadt found the $n=29$, $51$, and $55$ structures with his annealer. David Ellsworth used its modified GPU version to refind and refine the latter two, then analytically optimized the packings. The energy, proposal distribution, and full cooling schedule remain unpublished ([record histories](https://github.com/jlevy/squares/blob/8aba95081b634a4dd4e70c07359b5c11b8a7b1cf/packing/resources/web/kingbird-squares-in-squares-compared-2026-08-22.md)). |
| Sequential linear programming (SLP) | Local refinement: repeatedly linearize angle-dependent separation constraints and optimize centres, angles, and side; restart from perturbed poses when useful. | Griffin Casson’s September 2026 release reports two new arrangements, at $n=106,123$, from GPU annealing followed by SLP, and 37 numerical improvements from SLP directly on catalogue packings ([first-party method and results](https://github.com/jlevy/squares/blob/8aba95081b634a4dd4e70c07359b5c11b8a7b1cf/packing/resources/web/casson-square-packing-2026-09-23/griffcass-square-packing/README.md)). |
| Surgery followed by basin hopping | Seed construction, exploration, then refinement: delete, add, graft, or carve; perturb and locally optimize the transformed seed, then polish. | Nate Chaoweeraprasit’s SQUISH releases report neighboring-count seeds and explicit component lineages. The resulting rational packings have independent exact checks here; detailed hop mechanics remain undisclosed ([original packet](https://github.com/jlevy/squares/blob/8aba95081b634a4dd4e70c07359b5c11b8a7b1cf/packing/resources/web/squish-401-2026-10-07/README.md); [update lineages](https://github.com/jlevy/squares/blob/8aba95081b634a4dd4e70c07359b5c11b8a7b1cf/packing/resources/web/squish-422-second-update-2026-10-07/README.md)). |
| Contact-equation and stationarity refinement | Local refinement: identify geometric contacts and solve their equations together with stationarity conditions, removing numerical slack near an existing arrangement. | Ellsworth’s analytic optimization is an antecedent of Evan Daniel’s contact/KKT solver. Daniel’s 5 October 2026 batch supplied 48 smaller certified sides, principally for existing arrangements. Gupta’s later SQUISH refinements use Daniel’s optimizer; exact rational certification follows the numerical solve ([analytic method](https://github.com/jlevy/squares/blob/8aba95081b634a4dd4e70c07359b5c11b8a7b1cf/packing/resources/web/kingbird-squares-in-squares-analytic-minimization.md); [batch report](https://github.com/jlevy/squares/blob/8aba95081b634a4dd4e70c07359b5c11b8a7b1cf/packing/resources/web/evand-square-packing-2026-10-05/square-packing/s12/search/exact/batch/README.md); [Gupta refinements](https://github.com/jlevy/squares/blob/8aba95081b634a4dd4e70c07359b5c11b8a7b1cf/packing/resources/web/gupta-square-packing-refinements-2026-10-08/README.md)). |
| Adaptive search with grouped-angle refinement | Exploration and local refinement, as reported: search the full packing, then refine groups sharing an angle. The adaptive algorithm and grouping rule are unspecified. | Joost de Winter’s $n=211$ release names those stages and interval-verified export. Its checker and interval boxes are unpublished; separate exact and interval checks here establish feasibility of the supplied pose ([disclosure and independent checks](https://github.com/jlevy/squares/blob/8aba95081b634a4dd4e70c07359b5c11b8a7b1cf/packing/resources/web/de-winter-square-packing-211-2026-09-16/README.md)). |
| Discovery method undisclosed | Discovery remains unknown; exported coordinates supply a witness for separate feasibility checks. They do not identify the search algorithm. | Francisco Couzo’s September 2026 release supplies 49 improved packings, with subsequent revisions. That release names no search method or checker; exact and interval checks here establish safe bounds independently ([provenance and certification](https://github.com/jlevy/squares/blob/8aba95081b634a4dd4e70c07359b5c11b8a7b1cf/packing/resources/web/franciscouzo-square-packing-2026-09-27/README.md)). |
| Basin hopping with named refiners | Exploration and local refinement: perturb and optimize an inherited packing, then solve contacts and export a rational certificate. The detailed hopping rules remain unpublished. | Couzo’s 8 October follow-up names basin hopping, Ellsworth’s `refine_packing`, and Daniel’s `fq` and contact solver. Passing feasibility replay and standing-bound adoption are separate stages ([workflow and status](https://github.com/jlevy/squares/blob/8aba95081b634a4dd4e70c07359b5c11b8a7b1cf/packing/resources/web/couzo-followup-refinements-2026-10-08/README.md)). |
| LLM-assisted workflow, search algorithm unspecified | Assistance describes how work was conducted; it does not identify an energy, proposal rule, or optimizer. Complete poses and certificates permit separate feasibility checks. | Ryan Xu’s $n=51$ radical construction and 25 rational certificates have independent finite feasibility checks. The retained disclosure does not justify assigning a finer exploration algorithm ([source and verification](https://github.com/jlevy/squares/blob/8aba95081b634a4dd4e70c07359b5c11b8a7b1cf/packing/resources/web/ry-xu-new-packings-2026-10-08/README.md)). |

### Discovery gains and numerical gains

The releases below combine the four jobs in different ways.
Counts describe the release’s scope at publication, rather than the number of current
records.

| Publication | Producer and disclosed method | Scope and representative result |
| --- | --- | --- |
| 16 September 2026 | [Joost de Winter](https://github.com/jlevy/squares/blob/8aba95081b634a4dd4e70c07359b5c11b8a7b1cf/packing/resources/web/de-winter-square-packing-211-2026-09-16/README.md): author-reported adaptive full-packing search and grouped-angle refinement | a certified $n=211$ packing at side $14.99796070496771500150<15$ |
| 23 September 2026 | [Griffin Casson](https://github.com/jlevy/squares/blob/8aba95081b634a4dd4e70c07359b5c11b8a7b1cf/packing/resources/web/casson-square-packing-2026-09-23/griffcass-square-packing/README.md): GPU annealing and SLP, plus direct SLP on records | 39 reported improvements: two new arrangements, at $n=106,123$, and 37 local refinements |
| 23–27 September and 3 October 2026 | [Francisco Couzo](https://github.com/jlevy/squares/blob/8aba95081b634a4dd4e70c07359b5c11b8a7b1cf/packing/resources/web/franciscouzo-square-packing-2026-10-03/README.md): published configurations and revisions; discovery algorithm unspecified | 49 counts, then seven updated; October $n=208$ lowers the verified ceiling from $14.937018796984568$ to $14.926534459703512$ |
| 5 October 2026 | [Evan Daniel](https://github.com/jlevy/squares/blob/8aba95081b634a4dd4e70c07359b5c11b8a7b1cf/packing/resources/web/evand-square-packing-2026-10-05/README.md): contact/KKT refinement and rational certification; some inputs received an unpublished SLP squeeze first | 48 certified improvements of about $3.5\times10^{-13}$ to $5.0\times10^{-11}$, principally numerical slack removed from existing arrangements |
| 7 October 2026 | [Nate Chaoweeraprasit, SQUISH](https://github.com/jlevy/squares/blob/8aba95081b634a4dd4e70c07359b5c11b8a7b1cf/packing/resources/web/squish-422-second-update-2026-10-07/README.md): author-reported neighbor-count seeds, basin hopping, grafting, carving, and polishing; exact certificates | 23 distinct counts across the original release, supplement, and two updates; second-update $n=108$ has verified ceiling $10.9099400734448775$ |
| 8 October 2026 | [Ryan Xu](https://github.com/jlevy/squares/blob/8aba95081b634a4dd4e70c07359b5c11b8a7b1cf/packing/resources/web/ry-xu-new-packings-2026-10-08/README.md): LLM-assisted workflow, with exploration algorithm unspecified | 25 rational certificates and a separate undilated radical $n=51$ witness; 17 rational witnesses and the radical witness supply selected bounds |
| 8 October 2026 | [Siddharth Gupta](https://github.com/jlevy/squares/blob/8aba95081b634a4dd4e70c07359b5c11b8a7b1cf/packing/resources/web/gupta-square-packing-refinements-2026-10-08/README.md): precision refinement of Chaoweeraprasit’s SQUISH constructions with Daniel’s optimizer | 17 verified rational certificates; 14 selected improvements and three withdrawn offers retained as historical inputs |
| 9 October 2026 | [Evan Daniel](https://github.com/jlevy/squares/blob/8aba95081b634a4dd4e70c07359b5c11b8a7b1cf/packing/resources/web/evand-record-hunt-2026-10-09/README.md): reported uphill excursions between minima, contact/KKT refinement, and rational certification | two replayed certificates: $n=132$ below the selected bound and $n=155$ at the same exact side as Couzo’s pending T-128 certificate; review and adoption remain pending |

Casson’s 37 direct-refinement improvements have all since been superseded in this
repository’s frontier ([source coverage](https://github.com/jlevy/squares/blob/8aba95081b634a4dd4e70c07359b5c11b8a7b1cf/packing/frontier/source-coverage.yaml)). That
does not change their role as evidence that local optimization can expose slack in a
published arrangement.

SQUISH’s original $n=108$ ceiling was $10.9206589394033085$. Its second-update gain of
about $0.01072$ followed deletion of two squares from its $n=110$ packing and nearby
search. This exceeds the $10^{-10}$-scale final squeeze reported for $n=263$ by many
orders of magnitude.
Both $n=108$ configurations have confirmed feasibility; the producer supplies the
account of how the new seed reached the improved result
([original certificate](https://github.com/jlevy/squares/blob/8aba95081b634a4dd4e70c07359b5c11b8a7b1cf/packing/resources/web/squish-401-2026-10-07/README.md);
[second update](https://github.com/jlevy/squares/blob/8aba95081b634a4dd4e70c07359b5c11b8a7b1cf/packing/resources/web/squish-422-second-update-2026-10-07/README.md)).

### Selected bounds after the October 8 intake

The integrated register contains 32 smaller selected upper bounds than at this survey’s
first publication: 18 from Ryan Xu and 14 precision refinements by Siddharth Gupta.
The table gives safe sixteen-place decimal ceilings for the previous and selected
witnesses. Each count links to its case and exact form; the finite feasibility results
are recorded as T-125, T-126, and T-127
([results register](https://github.com/jlevy/squares/blob/8aba95081b634a4dd4e70c07359b5c11b8a7b1cf/packing/frontier/results.yaml)). For $n=51$, the selected exact side
is $(16+5\sqrt2)/3$. These are construction upper bounds, with no new local- or
global-optimality conclusion.

| $n$ | Previous ceiling | Selected ceiling | Credit |
| ---: | ---: | ---: | --- |
| [51](https://github.com/jlevy/squares/blob/8aba95081b634a4dd4e70c07359b5c11b8a7b1cf/packing/frontier/n-051.md) | 7.7007992354170200 | 7.6903559372884918 | Xu |
| [70](https://github.com/jlevy/squares/blob/8aba95081b634a4dd4e70c07359b5c11b8a7b1cf/packing/frontier/n-070.md) | 8.8816667570090100 | 8.8809603717088810 | Xu |
| [84](https://github.com/jlevy/squares/blob/8aba95081b634a4dd4e70c07359b5c11b8a7b1cf/packing/frontier/n-084.md) | 9.7071067811865476 | 9.6980520605096981 | Xu |
| [86](https://github.com/jlevy/squares/blob/8aba95081b634a4dd4e70c07359b5c11b8a7b1cf/packing/frontier/n-086.md) | 9.8228756555322953 | 9.8205657300098206 | Xu |
| [88](https://github.com/jlevy/squares/blob/8aba95081b634a4dd4e70c07359b5c11b8a7b1cf/packing/frontier/n-088.md) | 9.8824510304821347 | 9.8824510304812469 | Gupta |
| [102](https://github.com/jlevy/squares/blob/8aba95081b634a4dd4e70c07359b5c11b8a7b1cf/packing/frontier/n-102.md) | 10.6071746801760512 | 10.6058286965106059 | Xu |
| [103](https://github.com/jlevy/squares/blob/8aba95081b634a4dd4e70c07359b5c11b8a7b1cf/packing/frontier/n-103.md) | 10.7035167555725421 | 10.6792320475106793 | Xu |
| [105](https://github.com/jlevy/squares/blob/8aba95081b634a4dd4e70c07359b5c11b8a7b1cf/packing/frontier/n-105.md) | 10.8060778655197047 | 10.7906765754107907 | Xu |
| [108](https://github.com/jlevy/squares/blob/8aba95081b634a4dd4e70c07359b5c11b8a7b1cf/packing/frontier/n-108.md) | 10.9099400734448775 | 10.9048247851109049 | Xu |
| [123](https://github.com/jlevy/squares/blob/8aba95081b634a4dd4e70c07359b5c11b8a7b1cf/packing/frontier/n-123.md) | 11.6009077785163406 | 11.5913781457115914 | Xu |
| [126](https://github.com/jlevy/squares/blob/8aba95081b634a4dd4e70c07359b5c11b8a7b1cf/packing/frontier/n-126.md) | 11.7733036066072403 | 11.7426406872117427 | Xu |
| [127](https://github.com/jlevy/squares/blob/8aba95081b634a4dd4e70c07359b5c11b8a7b1cf/packing/frontier/n-127.md) | 11.8228756555323000 | 11.8109366475118110 | Xu |
| [129](https://github.com/jlevy/squares/blob/8aba95081b634a4dd4e70c07359b5c11b8a7b1cf/packing/frontier/n-129.md) | 11.8793752067111287 | 11.8720298492118721 | Xu |
| [130](https://github.com/jlevy/squares/blob/8aba95081b634a4dd4e70c07359b5c11b8a7b1cf/packing/frontier/n-130.md) | 11.9044830325168772 | 11.9044830325157865 | Gupta |
| [131](https://github.com/jlevy/squares/blob/8aba95081b634a4dd4e70c07359b5c11b8a7b1cf/packing/frontier/n-131.md) | 11.9549168302161245 | 11.9511500449119512 | Xu |
| [146](https://github.com/jlevy/squares/blob/8aba95081b634a4dd4e70c07359b5c11b8a7b1cf/packing/frontier/n-146.md) | 12.6009077785130200 | 12.5837822775125838 | Xu |
| [153](https://github.com/jlevy/squares/blob/8aba95081b634a4dd4e70c07359b5c11b8a7b1cf/packing/frontier/n-153.md) | 12.8796793733329640 | 12.8796793733293146 | Gupta |
| [154](https://github.com/jlevy/squares/blob/8aba95081b634a4dd4e70c07359b5c11b8a7b1cf/packing/frontier/n-154.md) | 12.9265622458535390 | 12.9265622458523470 | Gupta |
| [175](https://github.com/jlevy/squares/blob/8aba95081b634a4dd4e70c07359b5c11b8a7b1cf/packing/frontier/n-175.md) | 13.7781745930520300 | 13.7688992766137689 | Xu |
| [179](https://github.com/jlevy/squares/blob/8aba95081b634a4dd4e70c07359b5c11b8a7b1cf/packing/frontier/n-179.md) | 13.8837954905121866 | 13.8837954905108985 | Gupta |
| [180](https://github.com/jlevy/squares/blob/8aba95081b634a4dd4e70c07359b5c11b8a7b1cf/packing/frontier/n-180.md) | 13.9176534174514757 | 13.9176534174501843 | Gupta |
| [199](https://github.com/jlevy/squares/blob/8aba95081b634a4dd4e70c07359b5c11b8a7b1cf/packing/frontier/n-199.md) | 14.6175721735980400 | 14.6175721735928069 | Gupta |
| [207](https://github.com/jlevy/squares/blob/8aba95081b634a4dd4e70c07359b5c11b8a7b1cf/packing/frontier/n-207.md) | 14.8879922583077482 | 14.8879922583026574 | Gupta |
| [208](https://github.com/jlevy/squares/blob/8aba95081b634a4dd4e70c07359b5c11b8a7b1cf/packing/frontier/n-208.md) | 14.9245187720328190 | 14.9245187720293559 | Gupta |
| [209](https://github.com/jlevy/squares/blob/8aba95081b634a4dd4e70c07359b5c11b8a7b1cf/packing/frontier/n-209.md) | 14.9496179522017921 | 14.9496179522003981 | Gupta |
| [236](https://github.com/jlevy/squares/blob/8aba95081b634a4dd4e70c07359b5c11b8a7b1cf/packing/frontier/n-236.md) | 15.8678008394255397 | 15.8678008394199166 | Gupta |
| [237](https://github.com/jlevy/squares/blob/8aba95081b634a4dd4e70c07359b5c11b8a7b1cf/packing/frontier/n-237.md) | 15.9036762351906287 | 15.9036762351891381 | Gupta |
| [238](https://github.com/jlevy/squares/blob/8aba95081b634a4dd4e70c07359b5c11b8a7b1cf/packing/frontier/n-238.md) | 15.9261468570124710 | 15.9261468570109784 | Gupta |
| [239](https://github.com/jlevy/squares/blob/8aba95081b634a4dd4e70c07359b5c11b8a7b1cf/packing/frontier/n-239.md) | 15.9493131697291908 | 15.9493131697276962 | Gupta |
| [261](https://github.com/jlevy/squares/blob/8aba95081b634a4dd4e70c07359b5c11b8a7b1cf/packing/frontier/n-261.md) | 16.6829268292683000 | 16.6787798754166788 | Xu |
| [267](https://github.com/jlevy/squares/blob/8aba95081b634a4dd4e70c07359b5c11b8a7b1cf/packing/frontier/n-267.md) | 16.8466671928434900 | 16.8388319611168389 | Xu |
| [295](https://github.com/jlevy/squares/blob/8aba95081b634a4dd4e70c07359b5c11b8a7b1cf/packing/frontier/n-295.md) | 17.7071067811865500 | 17.7042327915177043 | Xu |

**Xu** identifies the contributor of the complete configurations.
The source reports LLM assistance but leaves the exploration algorithm unspecified.
All 25 rational certificates have complete passing feasibility replays; 17 supply
selected bounds, and the separate radical $n=51$ witness supplies the eighteenth.
The other eight rational inputs remain verified historical witnesses
([Xu packet](https://github.com/jlevy/squares/blob/8aba95081b634a4dd4e70c07359b5c11b8a7b1cf/packing/resources/web/ry-xu-new-packings-2026-10-08/README.md)).

**Gupta** identifies the precision refiner.
Construction credit remains with Nate Chaoweeraprasit’s SQUISH, and the source credits
Evan Daniel’s optimizer.
All 17 certificates, including the three withdrawn offers at $n=108,123,129$, have
complete passing replays.
Fourteen supply selected bounds; withdrawal affects selection, not their established
feasibility
([Gupta packet](https://github.com/jlevy/squares/blob/8aba95081b634a4dd4e70c07359b5c11b8a7b1cf/packing/resources/web/gupta-square-packing-refinements-2026-10-08/README.md)).
The gains in Gupta’s displayed ceilings are roughly $10^{-12}$ to $10^{-11}$, whereas
Xu’s changes in the table range from about $10^{-3}$ to $3\times10^{-2}$. This contrast
separates precision refinement from the larger gains in the submitted configurations; it
does not independently establish novelty or reconstruct discovery.

The rational packets use two deciding geometry implementations with shared certificate
parsing, half-angle conversion, rational arithmetic, and separating-axis methodology.
Their agreement and full-roster duplicate-square and outside-container controls support
the stated finite feasibility checks.
They are not two independent mathematical methods, nor a replay of the authors’
optimizers.

### Replayed certificates and pending adoption

A successful geometry replay and a change to the standing register are separate events.
Couzo’s eight exact refinements and five follow-up refinements have complete passing
positive and negative-control replays, while T-128 and T-130 remain reported entries
pending confirming integration and preservation of displaced source houses.
The follow-up refines Xu’s $n=84,86,105,175$ witnesses and Daniel’s $n=270$ witness; its
safe $n=105$ ceiling is $10.7893037837481589$, below the selected value in the table.
That smaller certificate is useful evidence about refinement even before standing
adoption
([eight-case packet](https://github.com/jlevy/squares/blob/8aba95081b634a4dd4e70c07359b5c11b8a7b1cf/packing/resources/web/couzo-exact-refinements-2026-10-08/README.md);
[five-case packet](https://github.com/jlevy/squares/blob/8aba95081b634a4dd4e70c07359b5c11b8a7b1cf/packing/resources/web/couzo-followup-refinements-2026-10-08/README.md)).

Daniel’s 9 October $n=132,155$ certificates have complete feasibility replays.
Both positive jobs passed both rational geometry implementations, which also rejected
all four duplicate-square and outside-container controls.
The $n=132$ certificate has safe sixteen-place ceiling $11.9870993322450633$, about
$4.23\times10^{-3}$ below the selected bound.
It is recorded as T-131, with independent review and standing-bound adoption pending
([record-hunt packet](https://github.com/jlevy/squares/blob/8aba95081b634a4dd4e70c07359b5c11b8a7b1cf/packing/resources/web/evand-record-hunt-2026-10-09/README.md);
[results register](https://github.com/jlevy/squares/blob/8aba95081b634a4dd4e70c07359b5c11b8a7b1cf/packing/frontier/results.yaml)).

The $n=155$ certificate has exactly the side of Couzo’s pending T-128 certificate, with
safe ceiling $12.9524989440140074$. The two share 152 of 155 exact poses.
The producer labels the three differing squares as free or having flat motion; a
connecting motion and equivalence of their local minima have not been verified.
Daniel’s certificate supplies equal-bound evidence to T-128, whose adoption remains
pending
([exact comparison](https://github.com/jlevy/squares/blob/8aba95081b634a4dd4e70c07359b5c11b8a7b1cf/packing/resources/web/evand-record-hunt-2026-10-09/acquisition/claims.json)).

Pending source claims need their own scope.
Daniel’s retained $n=105,130,292$ supplement, T-129, is an unreplayed historical source
report. Exact-form, KKT, or local-minimum claims attached to a previous configuration do
not transfer to a newly adopted packing at the same count
([intake requests](https://github.com/jlevy/squares/blob/8aba95081b634a4dd4e70c07359b5c11b8a7b1cf/packing/campaign/result-requests.yaml);
[results register](https://github.com/jlevy/squares/blob/8aba95081b634a4dd4e70c07359b5c11b8a7b1cf/packing/frontier/results.yaml)).

### Rare hits and scoped failures

A basin can be rare under a particular search.
Ellsworth’s retained $n=51$ statistics describe an RTX 3080 Ti running 65,536 GPU search
threads.
Of 3,004 categorized annealer outcomes, only four refined to the record pattern.
The source estimates 4.917 GPU hours per hit on its tuned RTX 3080 Ti setup.
This measures that implementation’s sampling and refinement, rather than the geometric
volume of a basin or a portable cost for another search
([run statistics](https://github.com/jlevy/squares/blob/8aba95081b634a4dd4e70c07359b5c11b8a7b1cf/packing/resources/web/kingbird-run-statistics-2026/README.md)).

Negative experiments help distinguish missing exploration from weak refinement.
This repository’s fixed-side shrink-and-re-anneal attempts, using single-square moves,
failed to escape the grid.
Simultaneous all-square perturbations substantially improved $n=10$, $11$, $17$, and
$26$, but returned the grid unchanged at $n=29$, $37$, $50$, and $52$. At $n=17$, the
median side across five seeds per arm fell from $5.000000$ under the single-square
control to $4.707376$ with collective moves, at the same declared pair-test budget.
Both remained above the $4.675530$ incumbent; neither arm beat a record
([collective-move experiment](https://github.com/jlevy/squares/blob/8aba95081b634a4dd4e70c07359b5c11b8a7b1cf/packing/campaign/series/series-000-smoke-and-calibration/experiments/exp-202-round-1-perturbation.md#result)).
An isotropic spread penalty favored a round cloud rather than the square container and
regressed proved controls.
Basin hopping over the LP quench improved ordinary test cells but reached no record; it
also exposed the need to repair floating-point LP outputs monotonically before calling
them packings
([retained experiments and discussion](https://github.com/jlevy/squares/blob/8aba95081b634a4dd4e70c07359b5c11b8a7b1cf/docs/project/research/research-2026-09-09-simulation-mechanisms-for-packing.md#9-what-this-repository-has-already-tried-in-this-direction)).
The workbench’s force-and-shake physics experiment likewise reached no record in the
reviewed runs; its closest repaired result, at $n=5$, remained about 0.15% above the
record after 39,871 seeds.
These runs used the previous-count record, the target side, and rigid blocks matched
from both records. The quoted result followed harness repair and checking; the report
does not retain the final poses as an independent certificate
([measured physics results](https://github.com/jlevy/squares/blob/8aba95081b634a4dd4e70c07359b5c11b8a7b1cf/packing/campaign/explorations/X-034-the-workbench-physics-as-a-search.md#4-what-a-repaired-run-is-worth)).

A useful control is to ask whether the local refiner recovers an unperturbed record
before interpreting kicked trials.
Daniel’s reported $n=292$ calibration found that loosening the container by 2% before a
soft squeeze lost the endpoint even with no kick; the subsequent SLP hit its time limit
above the starting side.
Removing the loosening step recovered that endpoint, after which perturbed trials could
be compared with it.
These are author-reported calibration runs, not independently reproduced experiments or
a local-optimality proof
([calibration table](https://github.com/jlevy/squares/blob/8aba95081b634a4dd4e70c07359b5c11b8a7b1cf/packing/resources/web/evand-batch-292-2026-10-07/source/s12/search/packer/s292.md#3-samplers)).

At the $n=11$ contact kink, the tested Powell and Nelder–Mead angle searches performed
worse than finite-difference descent.
That is a result about those tested angle optimizers, not an experiment on
differentiable simulation
([exp-006](https://github.com/jlevy/squares/blob/8aba95081b634a4dd4e70c07359b5c11b8a7b1cf/packing/campaign/series/series-000-smoke-and-calibration/experiments/exp-006-lp-quench-n5-n10-n11.md)).
A failed search at declared settings and budget constrains a method claim; it does not
prove that a family of methods cannot work or that the incumbent packing is locally
optimal.

## Vocabulary and Further Reading

| Term | Meaning here |
| --- | --- |
| Pose | a square’s centre and orientation |
| Seed | the starting configuration supplied to a search |
| Separating branch | one axis and order that can establish a pair’s non-overlap |
| Cell | one separating branch selected for every pair |
| Contact graph | which pairs touch; feature-level equations require more information |
| Basin | starting configurations grouped by their endpoint under a specified refiner |
| Quench or polish | local refinement toward an endpoint |
| Surgery | a seed transformation such as deletion, addition, grafting, or carving |
| Witness | a container side and complete square poses |
| Certified upper bound | a side at which feasibility has been rigorously established |

A useful record names the finder, seed source and parent count, seed transformation,
exploration algorithm, local refiner, certificate method and verifier, certified side,
publication date, and source revision.
Each method or lineage field should distinguish author-reported mechanics from
independently reproduced steps; independently checked feasibility describes the output.
Missing fields remain unknown.
The register’s single `construction_method` field has coarse labels such as
`simulated-annealing`, `inflation-billiard`, and `unknown`
([field vocabulary](https://github.com/jlevy/squares/blob/8aba95081b634a4dd4e70c07359b5c11b8a7b1cf/packing/frontier/square-packing-case.schema.yaml)). Recording seed,
exploration, refinement, and certification separately would retain the distinctions in
these hybrid workflows.

The [tutorial](https://github.com/jlevy/squares/blob/8aba95081b634a4dd4e70c07359b5c11b8a7b1cf/TUTORIAL.md) develops the mathematical model, cell and basin
distinctions, exact reconstruction, and optimality proofs.
The [strategy catalogue](https://github.com/jlevy/squares/blob/8aba95081b634a4dd4e70c07359b5c11b8a7b1cf/packing/frontier/search-strategies.yaml) indexes search families
and their record histories; the [frontier register](https://github.com/jlevy/squares/blob/8aba95081b634a4dd4e70c07359b5c11b8a7b1cf/packing/frontier/README.md) records
bounds, evidence, and attribution by count.
The retained
[annealing survey](https://github.com/jlevy/squares/blob/8aba95081b634a4dd4e70c07359b5c11b8a7b1cf/docs/project/research/research-2026-09-08-annealing-for-square-packing.md)
and
[simulation survey](https://github.com/jlevy/squares/blob/8aba95081b634a4dd4e70c07359b5c11b8a7b1cf/docs/project/research/research-2026-09-09-simulation-mechanisms-for-packing.md)
provide deeper mechanism comparisons and their source limitations.
For the other half of the problem,
[the lower-bound explainer](https://jlevy.github.io/squares/papers/n11-lower-bounds-explainer.html) shows how a
certificate can exclude every packing below a specified side.

## Version History

- **v0.2.1 — October 10, 2026.** Use typographic punctuation in version histories and
  consistent Chicago title case for paper titles and links.
- **v0.2.0 — October 10, 2026.** Add the confirmed October 8 intake: 32 selected
  upper-bound improvements, Couzo’s disclosed refinement workflow, Xu’s radical
  certificate, and refiner calibration and branch-selection examples, with five
  attributed packing illustrations.
  Include Daniel’s replayed October 9 record-hunt certificates, pending independent
  review and standing-bound adoption.
  Distinguish local rigidity, source assertions, and translation screens from optimality
  evidence.
- **v0.1.0 — October 8, 2026.** First publication: a systematic tutorial on modelling,
  searching, refining, reconstructing and verifying record square packings, with sourced
  method and seed lineage tables.

<!-- This document follows common-doc-guidelines.md.
See github.com/jlevy/practical-prose and review guidelines before editing.
-->
