The Flood That Starts From a Whisper
Yesterday's drop peeled a network down, deleting everyone with too few neighbours until a core either survived or vanished. Run that exact rule backwards on a grid, activating any dead cell with enough lit neighbours, and something stranger happens. With a two-neighbour rule the density you need to flood the whole board does not sit at a fixed number the way percolation's did. It keeps falling as the board grows, heading for zero, so on a big enough grid the faintest sprinkle you like eventually fills everything. Raise the rule to three neighbours and the magic switches off. The reason is a growing rectangle, and a theorem that pins the whole thing to the dimension of the grid.
> Sprinkle a handful of live cells onto a grid at random, then let one rigid rule run: any dead cell with at least k live neighbours switches on, forever, in rounds. That is bootstrap percolation, and it is the k-core cascade from last time run in reverse. The k-core peeled a network down by deleting the under-connected; this grows a grid up by activating the well-surrounded. The board below runs live in your browser; the two sweep charts are a precomputed measured run because they replay thousands of grids up to 160 wide.
01 · seed it, then let the rule run
Scatter live cells at random, then any dead cell with two lit neighbours switches on, round after round. The only question is whether the flood fills the grid or freezes partway.
Ice = the random sprinkle you start with. The activation front runs hot ember where it lit first to pale yellow where it arrived last, so the gradient maps how the flood spread. Empty ground stays dark.
This is the whole drama in one board. Below a critical sprinkle the front lights up a few clumps and then freezes with most of the grid still dark, no dead cell has two lit neighbours to tip it. A hair above, the fronts touch, fuse, and the activation runs away to fill every last cell. On the fixed field above, a random 7.5% sprinkle freezes at 78 percent, and 8% floods the whole board: a knife-edge one notch wide. Flip the rule to k = 3 and the same sprinkle does almost nothing, because now a cell needs three lit neighbours, and three is a wall a sparse seed cannot climb.
02 · the threshold that slides toward zero
Percolation had one fixed critical density. Average bootstrap percolation over thousands of grids and the critical density is not fixed at all: for k = 2 it keeps falling as the grid grows.
Note the axis: this panel runs the density all the way to 1. The k = 3 rule needs the grid nearly saturated before it can finish the job, and that number stays put as the grid grows. Only the k = 2 threshold dissolves toward zero.
Here is the twist that makes bootstrap percolation stranger than ordinary percolation. Last time the spanning threshold sat at a fixed density near 0.5927 and the curve merely sharpened into a wall as the grid grew. Here, for k = 2, the wall sharpens AND slides left: the density you need to fill the board keeps dropping as the board gets bigger, 0.116 at 20 wide, 0.078 at 40, 0.057 at 80, 0.047 at 160. It is heading for zero. On an infinite grid ANY positive density, however tiny, eventually fills everything (Aizenman and Lebowitz, 1988). The k = 3 curve behind it does the opposite: it stays pinned near 0.9 whatever the size. Two rules, one grid, and only the k = 2 threshold dissolves.
03 · why a whisper is enough
The trick is a growing rectangle. A solid block cannot grow on its own, but a faint sprinkle around it lets it climb outward line by line until it swallows everything.
A solid ice block at the centre plus a faint sprinkle. At zero sprinkle the block is locked; nudge the sprinkle up and it climbs outward one row at a time, the front ageing ember to yellow.
One seed per bordering row is all the block needs to climb it. A big grid almost always offers one, so a nucleus this size fills everything from a whisper of a sprinkle.
| grid | rule | fills from any density > 0? | why |
|---|---|---|---|
| 2-D (d = 2) | k = 1 | yes, trivially | one seed cascades everywhere |
| 2-D (d = 2) | k = 2 | yes (as L → ∞) | a nucleus climbs on one seed per line |
| 2-D (d = 2) | k = 3 | no | a flat wall never gets a third neighbour |
| 3-D (d = 3) | k = 3 | yes (as L → ∞) | k = d again: the marginal case |
| d-D, general | k ≤ d | yes | threshold collapses to zero |
| d-D, general | k > d | no | a positive density is required |
The clean law is the last two rows: on a d-dimensional grid the filling threshold vanishes exactly when the rule k is at most the dimension d, and stays stubbornly positive above it. Two dimensions with k = 2 is the knife-edge case, filling from nothing but only just, with that maddeningly slow 1/ln L approach.
Why does k = 2 fill from almost nothing while k = 3 refuses? Watch a solid rectangle of live cells. On its own it is frozen: every cell just outside it touches exactly one lit cell, and one is less than two, so nothing grows (set the border sprinkle to zero and the block sits there at 2%). But drop a faint sprinkle around it and the picture flips. To climb up by one row the rectangle needs just one seed anywhere along that row: that seed now has the rectangle below it and its lit neighbour beside it, so it tips, and its tipping tips the whole row like a zipper. One seed per bordering line is enough, and on a large board a growing nucleus almost surely finds one every step, so it devours the grid. For k = 3 that zipper never starts: a lone seed against a flat wall still has only two lit neighbours, never three, so the wall cannot advance without help at every single cell. That gap is a theorem: on a d-dimensional grid the filling threshold collapses to zero exactly when k is at most d, and stays positive above it.
The same rule, run backwards
Yesterday the site peeled a network apart. It kept asking one question, is this node well-connected enough to keep?, and deleted everyone with fewer than k neighbours, over and over, until what remained was the k-core or nothing at all. The cascade ran downward: every deletion could only trigger more deletions.
Turn that rule around and you get today's drop. Keep the same threshold k, but instead of deleting the poorly-connected, activate the well-surrounded. Scatter a few live cells onto a grid, and then in rounds switch on any dead cell that already has at least k lit neighbours. Once a cell is lit it stays lit. This is bootstrap percolation, and it is the k-core cascade played in reverse: the same integer rule, the same round-by-round sweep, but now the flood only ever grows.
You would expect it to behave much like the percolation drop from the same vein: some critical seed density where the grid tips from "a few frozen clumps" to "completely full," a threshold that sharpens into a wall as the grid gets larger. Half of that is right. The other half is one of the loveliest counter-intuitions in the whole subject.
Watch one board tip over
Module 01 is the whole story in a single grid. Sprinkle cells at density p, let the two-neighbour rule run, and watch. Below a critical sprinkle the activation lights up a few neighbourhoods and then freezes: every remaining dead cell is touching at most one lit cell, one is less than two, and the flood has nowhere left to go. A hair above that density, the separate fronts reach each other, fuse, and the activation runs away until every last cell is lit.
On the fixed field the board starts with, the knife-edge is exactly one notch wide. A random 7.5% sprinkle freezes at 78 percent of the grid; nudge it to 8% and the whole board floods. Then flip the rule to k = 3 in your head: now a cell needs three lit neighbours to switch on, and the same sprinkle does almost nothing. Hold that difference. It is the point of the drop.
The threshold that will not hold still
Now do what the percolation drop did: stop looking at one grid and average over thousands. For ordinary percolation that produced a curve whose crossing sat at a fixed density near 0.5927 and merely steepened into a cliff as the grid grew. Module 02 does the same average for bootstrap percolation, and the k = 2 curve does something percolation's never did. It steepens into a wall and slides to the left. The density you need to fill the board keeps dropping:
- 0.116 at 20 wide,
- 0.078 at 40 wide,
- 0.057 at 80 wide,
- 0.047 at 160 wide.
It is heading for zero. This is not a measurement artefact; it is a theorem. On the infinite square lattice the critical density for the two-neighbour rule is exactly zero (van Enter, 1987; Aizenman and Lebowitz, 1988). Any positive density you care to name, however vanishingly small, eventually fills an infinite grid completely. The reason a finite board still has a visible threshold is that the approach to zero is agonisingly slow, like one over the logarithm of the width, so you have to make the grid enormous to push the number down much further.
Behind that curve, drawn on an axis stretched all the way to density 1, is the k = 3 rule for contrast. Its threshold sits near 0.9 and stays there whatever the size. Two rules on the same grid, and only one of them dissolves.
Why a whisper is enough
The mechanism is a growing rectangle, and module 03 lets you feel it. Start with a solid block of live cells and nothing else. On its own the block is locked: every cell just outside it touches exactly one lit cell, and one is not two, so it cannot grow by a single step. Set the sprinkle to zero and the block just sits there.
Now dust a faint sprinkle around it. To climb upward by one row, the block needs just one seed anywhere along that row. That lone seed has the whole lit block beneath it and its lit neighbour beside it, which is two, so it switches on, and its switching on hands the next cell along the row its second neighbour, which switches on, and the row zips shut like a closing seam. One seed per bordering line is the entire toll, and on a large grid a growing nucleus almost always finds one at every step. So it devours the board from a whisper of a sprinkle.
For k = 3 that seam never starts. A lone seed pressed against a flat lit wall still has only two lit neighbours, never the three it needs, so the wall cannot advance anywhere without help at every cell along it, which a sparse sprinkle can never supply. That is the whole difference between a threshold that vanishes and one that does not.
And it lands on a clean law. On a d-dimensional grid, the filling threshold collapses to zero exactly when the rule k is at most the dimension d, and stays stubbornly positive above it. Two dimensions with k = 2 is the marginal, knife-edge case: it fills from nothing, but only just, with that maddeningly slow logarithmic approach. Three dimensions with k = 3 is the same knife-edge one floor up. It is a rare thing in this corner of mathematics, a phase transition whose very location depends on how big your world is, sliding toward zero the larger you build it.
Every figure here is recomputed from arithmetic: the two live boards flood in your browser on load, and the sweep charts replay a precomputed run of thousands of grids. Nothing is fetched, nothing is stored. This is the eighth drop in the statistical-physics vein, and it closes the loop the k-core opened, the same threshold rule, run the other way.
Chosen as the direct sequel to drop #047 (k-core, 2026-08-03): the k-core peeled a graph DOWN by deleting the under-connected, and bootstrap percolation runs the identical threshold rule the other way, growing a grid UP by activating the well-surrounded. The idea was already sitting in the backlog under the statistical-physics vein. Picked to rotate format back to app after research #047, to keep that vein open, and because it is the ideal unattended build: it reuses #039 percolation's mulberry32 + seeded random field and #047's round-by-round cascade idiom (activation instead of deletion), is integer/deterministic and therefore SSR-safe, and has a near-zero external factual surface, every board, sweep and threshold recomputed from arithmetic. The one genuinely new engine piece is the monotone-growth front. Both boards (modules 01 and 03) run live in the browser; the two sweep charts in module 02 replay thousands of grids up to 160 wide, too heavy to do at load, so their measured arrays are precomputed offline with the same engine and PRNG and drawn as SVG (the exact honest split the forest-fire drop used). Before a word was written the mathematics was verified offline against theory and a direct simulation: for k = 2 the fill-probability half-crossing marches DOWN with size, 0.116 / 0.078 / 0.057 / 0.047 at L = 20 / 40 / 80 / 160, and the p_c(L) drift 0.140 / 0.102 / 0.087 / 0.069 / 0.061 / 0.055 / 0.050 at L = 16 / 24 / 32 / 48 / 64 / 96 / 128 tracks Holroyd's asymptotic pi^2/(18 ln L) in shape (both falling as 1/ln L, the constant only exact in the limit); for k = 3 the fill threshold stays pinned near 0.9 whatever the size; a solid 8x8 block alone is frozen (2%) but a 10% border sprinkle lets it devour a 40-grid; and on the default field (L = 48, seed 20260804) a random 7.5% sprinkle freezes at 78% while an 8% sprinkle floods everything, a one-notch knife-edge. The external claims are settled results (van Enter 1987 and Aizenman-Lebowitz 1988 that the k = 2 threshold on the infinite square lattice is zero; Holroyd 2003 for the sharp pi^2/18 constant; the general p_c = 0 iff k <= d rule), each stated with attribution. Reusable wins: a bootstrap engine that records the round each cell activates (reuse for any monotone growth / activation-front / bootstrap-percolation drop), the nucleation-rectangle demo idiom (a locked solid block set free by a sprinkle), and a threshold-that-slides-instead-of-sharpening chart that distinguishes this transition from an ordinary one.