The Artificial Wasteland · Perception · Show the check
The mirror that stops it
A picture that never changes can still look like it is moving. What carries the direction is not the contrast and not the colour: it is the order of four luminance levels around a repeating unit. Reverse that order and the same four greys, in exactly the same amounts, drift the other way. Give the unit a mirror axis and a whole family of motion models is forced to predict not a small answer but exactly zero.
1. The field, and the proof that it is standing still
Below is a field of curved bands built from four luminance levels. Look at it whole, let your eye rest a little off centre, and let it breathe. Most people see the bands creep. Nothing in the file is creeping: the canvas is drawn once per setting and never touched again, and the page hashes the pixels it has just drawn, four times a second, and prints the digest. Watch the field move and the digest sit still.
frames drawn since you arrived: 0 ·
pixel digests taken: 0 ·
digests that differed: 0
SHA-256 of the canvas taking the first reading
one unit, left to right: dark extremum, dark intermediate, light extremum, light intermediate mean luminance 0.38362 distance from a mirror axis 0.348080
Three orders, one geometry. Built order is the recipe as the archive's own programs lay it down. Reversed is the same period read backwards, which is an exact spatial mirror of the whole thing, so its histogram is identical bin for bin: the same four greys, in the same amounts, in the same shapes. Mirrored replaces the two intermediate greys with their common mean, which gives the unit a mirror axis while keeping both extrema, all four widths and the mean luminance.
Switch to MIRRORED and then to greyscale, and the symmetry becomes plain to look at: each unit reads the same forwards and backwards about its black sliver. Switch the colour back on and it does not, because the violet and the gold are two different colours sitting at one luminance. That is not a flaw in the control. The theorem is about luminance and only luminance, and the chroma offsets are built to carry none, which is section 5's whole subject. The mirrored field is exactly symmetric in the one quantity the argument uses, and visibly asymmetric in a quantity the argument never mentions, and the drift still goes.
research/the-mirror-that-stops-it/film/build.sh rebuilds the whole thing from a fresh checkout.It sits here rather than at the top on purpose. The thing above wants to be still while you look at it, and a film playing beside it would be the one moving object on the page.
2. The recipe, in the numbers it was written in
This all begins with a private archive of nineteen artworks, made over a few days in September 2026 by one person and a language model working together, and handed to this project to do something with. Ten of them are further down this page. The archive travels with a careful guide that separates what is published from what was chosen, names one viewer's reports as one viewer's reports, and lists its own open questions. The recipe underneath the first ten pieces is four regions of linear-sRGB luminance, repeated around each band:
| region | nominal linear-sRGB level | share of one unit | role in the palette |
|---|---|---|---|
| dark extremum | 0.012 | 13.5% | nearly black |
| dark intermediate | 0.160 | 36.5% | cobalt or violet |
| light extremum | 0.910 | 13.5% | near white |
| light intermediate | 0.550 | 36.5% | gold or yellow |
Boundaries inside one unit at 0, 0.135, 0.5, 0.635, 1. Narrow extrema, broad intermediates. Those numbers are transcribed from the archive's generators rather than paraphrased from its prose, and the design behind them is not the archive's invention either. Kitaoka and Ashida reported in 2003 that stepwise luminance profiles beat smooth ones for this illusion, that fragmented or curved edges beat long straight ones, and that the direction follows a rule:
Illusory motion tends to appear in the direction from a black region to an adjacent dark-gray region or in the direction from a white region to an adjacent light-gray region.
Kitaoka & Ashida (2003), VISION 15(4), 261-262. The same paper is careful about what it is: this study only reveals phenomenological or design rules.
One small correction, offered because this page exists to check things. The archive's guide renders that rule as motion from black toward a neighbouring darker gray
. The paper says dark-gray, and it has to, because the grey next to black is lighter than black, not darker. It is a slip in a paraphrase rather than an error in the work, and the numbers in the generators are exactly right, but a rule about direction is not a place to be loose about which way is which.
3. What the mirror does, and why it is not an ablation
A still picture has no time axis. The standard way to give it one is a transient: after a blink, a saccade, or simply arriving at a new fixation, the whole image is effectively presented afresh, and the parts of it do not all report in together. Response latency falls as luminance rises. The classical demonstration is the Pulfrich effect, where a neutral density filter over one eye delays that eye enough that a pendulum swinging flatly in a plane is seen to swing round an ellipse. Modern measurements put the delay at roughly ten milliseconds per log unit of luminance reduction, though it is closer to a power law than to a constant.
So: let brighter places respond sooner, build the space-time image that results, and pass it through an Adelson-Bergen motion-energy detector. Rightward energy minus leftward energy is the answer. That model has six free parameters and none of them is measured. Two things about it do not depend on any of them.
Result one. Reversing the order exactly negates the answer.
Not approximately. Across 49 settings of the six parameters, drawn evenly from the 972-setting grid in section 4, the largest relative departure from exact negation is 6.6e-10, which is floating point and nothing else.
Result two. A period with a mirror axis gives exactly zero.
The space-time image depends on position only through luminance, so if the luminance profile has a mirror axis, the space-time image has one too. The rightward and leftward filters of a quadrature pair are each other's mirror image in space. So the two energies are equal term by term, and their difference is zero for every latency law, every temporal filter, every spatial filter in the class. Across those same 49 settings the largest normalised opponent energy for the mirrored profile is 1.3e-15.
The second result is the one that matters, and it is why the mirror switch above is not just a convenient ablation. It is the single manipulation this entire family of models is forced to predict. You can disagree with every parameter and the prediction does not move.
There is a small structural fact underneath, and it explains why the control in the literature is shaped the way it is. No cyclic ordering of four distinct blocks has a mirror axis. A cyclic sequence reads the same backwards only if the two blocks flanking any given block are equal, and here all four differ. A symmetric control therefore has to change the multiset. Michael Bach's interactive version does it by doubling to six regions, black, blue, yellow, white, yellow, blue. The switch above does it by merging the two intermediates, which keeps four regions, both extrema, all four widths and the mean luminance, and gives up only the ordering.
And what does the mirror actually leave behind? Not nothing. The theorem kills the net directional energy; the total, unsigned energy is untouched. Bach's page reports exactly that:
In this mode, there still is some illusion, but a different one, as first noted by George Mather: a slight shimmering, somewhat alike to Enigma or Op-Art; likely related to microsaccades.
Michael Bach, Rotating snakes, luminance dependency.
Rotation gone, shimmer left. That is the shape of the prediction, and it is worth being precise about what has and has not happened here: a model's structural prediction matches a reported phenomenology. It does not follow that the model is why.
4. What the model does not earn
Run the same model over the full grid of 972 parameter settings and ask, each time, which way it says the built order drifts. It says one way 687 times and the other way 285 times. The direction is not a robust prediction, and the honest report of a model is both halves.
Better than that: the sweep says what governs the sign, and it is not the motion detector. Hold everything else and vary the detector, and the fraction of settings agreeing barely moves, with its spatial frequency (67%, 67%, 79%), its envelope (71%, 71%, 71%) or its time constant (71%, 70%, 70%). Vary the blur and it moves a great deal: 94% at a Gaussian sigma of 0.008 of one unit, 84% at 0.02, 33% at 0.05.
predicted direction —normalised opponent energy —
Precomputed by drift.mjs, the module this page is running; verify-the-mirror-that-stops-it.mjs recomputes the whole curve and checks the crossing.
Swept finely, the sign crosses at a blur of 0.0340 of one unit, and in all 27 other parameter settings tested there is a crossover somewhere between 0.0199 and 0.0621, median 0.0341. So the model's real content is a prediction rather than a number: the direction reverses as the pattern is blurred, at a blur of a few per cent of the repeat. Blur on the retina rises with eccentricity, and eccentricity is the variable this illusion is named for. Whether that is what happens in a person is not something this program can say, and it is not saying it.
Two things from the literature belong beside that, and neither is comfortable. Atala-Gérard and Bach found a reversal too, by nulling the illusion against a physically rotating wheel: a second island in luminance space, around 70% and 95% for the two intermediates, where the rotation runs the other way and is weaker. A reversal with the levels, not with blur. And Conway and colleagues went and measured, in alert macaque V1 and MT, the latency difference this whole class of model assumes. They found it: white and black peaked ten to twenty milliseconds before light grey and dark grey. Then they argued the simple latency account fails anyway, because all four adjacent element pairs produce motion consistent with the whole illusion, where the account predicts two of the four should run backwards.
So the model on this page is not being offered as an explanation of anything. It is the smallest construction that produces the two symmetry results, and those results are about the model, not about you.
5. Colour for free, and what eight bits charge for it
Press the colour switch above and the picture changes completely. It is supposed to change no luminance at all, and the reason is a piece of linear algebra sitting in the archive's colour helper.
Luminance is one weighted sum of three numbers, Y = 0.2126 R + 0.7152 G + 0.0722 B. One equation, three unknowns, so its null space is a plane: there is a two-dimensional family of colour offsets that change chroma and leave Y alone. Pick the red and blue shifts you want, then solve for green instead of choosing it:
cg = -(0.2126 * cr + 0.0722 * cb) / 0.7152
Every offset the archive uses is built that way, and it works: over all four regions, every angle and every band, the largest luminance the chroma vector carries is 1.0e-17. Free colour, in exact arithmetic.
In a file, not quite. Three eight-bit channels cannot land on an arbitrary linear triple, so the delivered luminance misses by the rounding. The archive contains a clean way to see the size of that: Confluence and Confluence Monochrome were computed from the same final linear-light pixels, differing only in the chroma. Their luminances should be identical. Measured on the archive's own files by a program that shares no code with the one that made them:
| pair | rms luminance difference | largest |
|---|---|---|
| loading | ||
The archive's own validation record states an rms of 0.0015787 and a maximum of 0.0076172 for that pair. Reproducing somebody's number is a small thing; reproducing it from the delivered bytes with an independently written decoder is the version of it worth having.
6. What going out of focus actually takes
The archive records something a viewer noticed and nobody could explain. Looking at the larger fields, he found they could seem to reorganise into moving black-and-white patterns. The guide is candid about where that leaves things:
The reported disappearance or reduced dominance of colour has not been isolated. Blur, adaptation and binocular interactions are possible contributors, without enough evidence to choose between them.
One of those three can be settled without a viewer, because blur is an operation on an image and the images are here. So: blur each artwork by a Gaussian whose width is a fixed fraction of that picture's own repeating unit, and at every radius measure two things, how much colour is left and how much light and dark is left. If defocus were what removes the colour, the colour would go first.
Solid is colour, dashed is light and dark, each as a fraction of what the unblurred file has. Blur is in units of that picture's own repeat.
For the picture the report was actually about, it runs the other way. Lattice Field at four tenths of a unit of blur has 41% of its colour left and 24% of its light and dark. Defocus takes the black and white slivers first, because they are the narrowest things in the picture, and leaves the two broad coloured regions standing. Push it further and the colour stops falling at all: by nine tenths of a unit it has flattened out near 38%, because the average of the whole thing is not grey. Blur does not predict a monochrome phase in that image. It predicts a colour one.
Every artwork here behaves that way, with exactly one exception.
| artwork | how its colour was built | colour left | light and dark left |
|---|---|---|---|
| loading | |||
Confluence is the exception, and it is not luck. It is the one piece on this page built the third way. Where Undertow gives each of the four regions its own colour, the later set gave the two equal-width intermediate regions opposite offsets and left the extrema neutral, and the archive wrote down what that would do:
At a fixed shading envelope, the chromatic offsets cancel when an entire fine repeating cycle is averaged.
Blurring is averaging. A picture built that way should lose its colour as soon as the blur is wide enough to take in a whole cycle, and keep its light and dark, which was never built to cancel. That is a prediction, written down at the time, about an operation nobody performed. It holds, and it is emphatic: at four tenths of a unit Confluence has 20% of its colour and 43% of its light and dark, and by nine tenths the colour is down to 1.5% while the contrast is still 33%. The picture goes grey. Nothing else in the set does.
So the thing the viewer noticed has an answer in two halves, and only one of them is comfortable. In the picture he was looking at, blur is ruled out: it takes the wrong channel. But the design that would produce exactly what he described was built into the next study, one step later, for a different reason, and its own notes predicted this behaviour without ever testing it.
What that does not settle. This is a blur applied to a file, which is not the same operation as an eye defocusing, and it is not adaptation or binocular interaction, both of which the archive named and neither of which is touched here. It also does not test a fourth candidate the archive did not name: colour discrimination falls away from the fovea, and letting your eyes go soft usually also means no longer looking straight at the thing. The report is one viewer's, recalled in a guide. What is measured here is what a Gaussian does to ten files.
7. Measuring ten pictures, and the two rulers that died first
The archive is unusually good at naming what it did not check. Nine of its nineteen pieces were made not by a program but by an image generator, handed the four-region grammar in words. About those nine it says:
The resulting images visually follow much of the requested brief, but their local levels, ordering, widths and shading were not exhaustively measured.
So: measure them. The ruler follows from the theorem. Recover the repeating unit from a trace read off the picture, and ask how far that unit is from having a mirror axis. Zero for anything symmetric, 0.348 for the recipe, and it is the same property the exact results turn on.
Building it took three attempts and the first two were killed by control images rather than by argument. Four controls, rendered from the same geometry as the artworks by the same fieldLuminance that draws the field at the top of this page:


Ruler one: fit the shape. Slide the recipe's own profile along each trace at every period and phase, and compare how well it fits against how well the mirror-symmetric profile fits. It ranked the artworks plausibly. Then control-sine, which has one smooth wave per unit and no four-region ordering whatever, scored 0.0703 against control-forward's 0.0431. Higher, and not marginally. A four-level staircase approximates a smooth curve better than a two-level one does, so the statistic had been measuring smoothness the whole time. Dead.
Ruler two: fold at a period. Find each trace's period by autocorrelation, fold, measure the fold's distance from symmetry. Control-forward scored 0.306 and control-balanced 0.244, with more than half the fold being noise. No separation, because a straight line cut across curved bands does not have a period, so there was nothing to fold. Dead. Two smaller bugs fell out on the way and are worth keeping: taking the largest autocorrelation over a range always returns the smallest lag, because autocorrelation falls away from zero for any smooth signal, so a period has to be found as a peak; and searching for the mirror axis on a fine but arbitrary grid scored an exactly symmetric sinusoid at 0.013 instead of 0, because every mirror axis of a cyclic sequence of length m is one of exactly m reflections and the true one fell between two grid points.
Ruler three: follow the band, align on a landmark. Two changes. The trace follows the band instead of cutting across it, 256 steps of one pixel with the direction re-estimated at each step and its sign carried forward. And the unit is taken between consecutive dark extrema and stretched to a common length before averaging, which drops the assumption that every unit is the same width. On the controls, the intervals stop overlapping.
| control | asymmetry | interquartile | traces |
|---|---|---|---|
| loading | |||
The floor moves, so every picture is read against a control its own size
One more thing had to be settled before any of it meant anything. Rendering both controls at six sizes shows that neither the ceiling nor the floor is constant: a narrower unit is described by fewer numbers, and a wider one fits fewer repeats into a trace, so the reading drifts either way. An artwork can therefore only be read against controls at its own size, and the position column below does that.
| size | forward | mirrored | unit width |
|---|---|---|---|
| loading | |||
The same table also rules two things out. Reducing in linear light and reducing on the encoded eight-bit values agree to three decimal places, so the archive is right that the two paths are not identical but this measurement cannot see the difference. And a reduction from a finer render is worth about as much as rendering at the target size, so what separates the archive's originals from the copies this site serves is resolution, not the resampler.
The answer
Measured at native resolution, against controls at matching size. Position runs from 0 at the mirror-symmetric floor to 1 at the by-construction ceiling.
| artwork | made by | size | asymmetry | 95% interval | position |
|---|---|---|---|---|---|
| loading | |||||
The eight program-made images run from 0.68 to 1.11. The two generator-made ones read 0.66 and 0.46. Two of the eight come out above the ceiling, which is not a mystery: the ceiling is a control field with one unit width everywhere, and a picture whose extrema are crisper than the control's can read higher.
Only one of those two is a separation the intervals will carry, and it matters to say which. Chromatic Abyss at 0.66 has an interval that overlaps the bottom of the procedural range, so it is not distinguishable from the weakest program-made image here. Presence at 0.46 overlaps none of them. So the fair statement is narrow and still worth having: handed the four-region grammar in words rather than in numbers, a generator reproduced most of it in one case and about half of it in the other, and the lower of the two sits outside the range every program reached.
What that is not. It is ten files from one archive, two of them generative, measured by one ruler that asks about mirror symmetry in a recovered unit profile and asks nothing about whether anybody sees motion. It is a measurement of these files, not a finding about image generators, and the interval on each row is a bootstrap over traces within one image, not over images. Two images is not a sample.
8. An aside: a relief nobody sent us
One piece in the archive is not a drift pattern at all. Depth Lattice is an autostereogram: its horizontal repeat spacing encodes a surface, and the surface appears if you let your eyes fuse neighbouring repeats. It is served here at its native 1800 pixels, unlike everything else on the page, because resampling it would destroy precisely what it carries.
It also allows a small, satisfying check. The construction rule was that every pixel past the first strip copies a pixel one separation to its left, and the separation encodes the height. So the height is recoverable from the delivered file alone: for each pixel, find the horizontal shift that best matches it to its own earlier copy. No depth map, no source, just the picture.


loading
9. The archive
Ten of the nineteen pieces, in the order they were made. The first eight were built by programs; the last two came from an image generator conditioned on earlier pieces as references. Everything except the two marked native has been resampled to 1100 pixels, in linear light, which is a real loss and the table in section 7 says how much. Full provenance for every file, including the source and served SHA-256 of each, is in data/images.json.
Every picture on this page opens full screen: click it, or press Escape to come back. Depth Lattice is the one where it matters, since fusing it wants the whole thing in view at its native size.
10. What none of this establishes
- Nothing here measures a person. No observer was tested, no display was calibrated, and every luminance on this page is a number in a file. If the field at the top drifted for you, that is your report and it is not evidence for anything below it.
- The model is not an explanation. It is not Bach and Atala-Gérard's model, which uses standard correlation detectors with a saturating output nonlinearity and no free parameters, and does not invoke latency at all. The construction here exists to produce the two symmetry results.
- The ruler measures a picture, not a percept. How far a recovered unit is from having a mirror axis, and how strongly somebody sees motion, are two different quantities and only the first is here.
- The archive's own reports are one viewer's. Its guide says so repeatedly and it is right to. Nothing on this page turns on them.
- The direction the model predicts is unsettled, by the model's own sweep, and separately by a published physiological argument against the whole class. What survives is the pair of symmetry results and the blur crossover, and those are claims about arithmetic.
Run it yourself
Every number on this page is recomputed from scratch by one program, which also runs the very module your browser is running to draw the field, and reads this page's own shipped bytes to check the numbers printed here against the ones it just derived.
node verify-the-mirror-that-stops-it.mjs
If you do not have this repository, and you do not, here is the whole thing from an empty directory. Everything it fetches is a file this page itself is serving, and that is the point: the claim is not that the check passes here, it is that it passes for you.
mkdir aw && cd aw curl -L --create-dirs -o verify-the-mirror-that-stops-it.mjs \ https://artwaste.land/checks/verify-the-mirror-that-stops-it.mjs B=public/strata/the-mirror-that-stops-it S=https://artwaste.land/strata/the-mirror-that-stops-it curl -L --create-dirs -o $B/index.html "$S/" curl -L --create-dirs -o $B/drift.mjs "$S/drift.mjs" for f in model traces calibration images findings; do curl -L --create-dirs -o $B/data/$f.json "$S/data/$f.json" done curl -L --create-dirs -o $B/images/stationary-drift.png \ "$S/images/stationary-drift.png" node verify-the-mirror-that-stops-it.mjs
About three megabytes, most of it the raw traces, and a minute to run. The -L is load-bearing: this site answers the directory form of a page with a redirect, and without it you get a file of length zero and a confusing failure. That exact route has been tried: the check was rebuilt from these published bytes in an empty directory and reproduced this repository's run, output for output.
It prints 79/79 checks passed, takes about a minute, has no dependencies beyond Node itself, and recomputes the summaries from the raw traces rather than reading the summaries. Everything upstream of it is here too, and rebuilding the whole thing from nothing is five commands:
node research/the-mirror-that-stops-it/make-controls.mjs node research/the-mirror-that-stops-it/model-results.mjs node research/the-mirror-that-stops-it/calibrate.mjs node research/the-mirror-that-stops-it/extract-traces.mjs node research/the-mirror-that-stops-it/measure-images.mjs node research/the-mirror-that-stops-it/blur-colour.mjs
The second of those is the half-hour one: it is the 972-setting sweep, run once so the check does not have to. extract-traces.mjs takes --archive for its second column, which needs the original artwork files and cannot be reproduced from this site alone; without it, it measures the copies served here, which can. The one step not in that list is publish-images.py, which put the ten artworks on this page and whose output is committed. The notebook, including the two rulers that failed and the control images that failed them, is at research/the-mirror-that-stops-it/README.md.
Sources
- Kitaoka, A. & Ashida, H. (2003). Phenomenal characteristics of the peripheral drift illusion. VISION 15(4), 261-262. J-Stage, doi:10.24636/vision.15.4_261.
- Atala-Gérard, L. & Bach, M. (2017). Rotating snakes illusion: quantitative analysis reveals a region in luminance space with opposite illusory rotation. i-Perception 8(1). doi:10.1177/2041669517691779.
- Bach, M. & Atala-Gérard, L. (2020). The rotating snakes illusion is a straightforward consequence of nonlinearity in arrays of standard motion detectors. i-Perception 11(5). doi:10.1177/2041669520958025.
- Conway, B. R., Kitaoka, A., Yazdanbakhsh, A., Pack, C. C. & Livingstone, M. S. (2005). Neural basis for a powerful static motion illusion. Journal of Neuroscience 25(23), 5651-5656. doi:10.1523/JNEUROSCI.1084-05.2005.
- Backus, B. T. & Oruç, İ. (2005). Illusory motion from change over time in the response to contrast and luminance. Journal of Vision 5(11):10, 1055-1069. doi:10.1167/5.11.10.
- Uesaki, M., Biswas, A., Ashida, H. & Maus, G. (2024). Blue-yellow combination enhances perceived motion in rotating snakes illusion. i-Perception 15(2). doi:10.1177/20416695241242346.
- Adelson, E. H. & Bergen, J. R. (1985). Spatiotemporal energy models for the perception of motion. JOSA A 2(2), 284-299. doi:10.1364/JOSAA.2.000284.
- Pulfrich, C. (1922). Die Stereoskopie im Dienste der isochromen und heterochromen Photometrie. Die Naturwissenschaften 10, in six parts (553-564, 569-574, 596-601, 714-722, 735-743, 751-761). The delay explanation is due to Fertsch, not to Pulfrich, who was stereoblind and never saw the effect.
- Burge, J. & Cormack, L. K. (2024). Continuous psychophysics shows millisecond-scale visual processing delays are faithfully preserved in movement dynamics. Journal of Vision 24(5):4. doi:10.1167/jov.24.5.4. Source for the ten milliseconds per log unit. Rodriguez-Lopez, Chin & Burge (2025), Journal of Vision 25(3):7, fit it as a power law rather than a constant.
- Bach, M. Rotating snakes, luminance dependency and Enigma.