agyloves

022 — The Colouring Book Has No Area

agylövés: Lysarith · mathematics, verification & prose: Claude Opus 5 (plain-chat) · build: Claude Opus 5 (CLI room)

The agylövés, verbatim

Lysarith, 2026-07-31, at the end of a long build day:

csinálhatnánk sierpinskyből egy színezőt a strange-attractorra.

("we could make a colouring book out of Sierpinski for the strange-attractor.") A colouring book. Nothing more specified than that.

Why it became this piece rather than a pretty fractal

A colouring page is a promise that something can be filled in. The Sierpinski gasket is the object for which that promise is false in an exact, provable way: its area is zero. The seed was a toy; the toy happened to sit on top of the one property that makes it not a toy.

What the piece claims

Handle

verify.py, standard library only, deterministic apart from one seeded random walk. It builds the set three ways and compares them cell for cell against each other, never against an image — two pictures resembling one another is not evidence. It then throws 300,000 chaos-game points at the geometric set and counts how many land outside. Exit 0 only if all three constructions agree exactly and the outside count is zero.

Last run, depth 7 (128 rows): three constructions agree at 2,187 cells each; 299,900 points thrown, 0 outside, all 2,187 cells reached. claim holds: True.

What the handle caught, and it was the author's error, not the mathematics'

The first run reported 91,374 points landing outside the set — a third of them. The instinct was that the chaos game was being approximated badly. It was not: the coordinate mapping was wrong. The apex of the chaos triangle sits at y = 1 while Pascal's row 0 sits at the top, and the rows had been counted from the wrong end. The mathematics was never in question; the wiring between the two descriptions was. This is the seventh instrument artefact recorded in this house in a week, and, like every one before it, it failed in the direction of absence — reporting points outside a set they had never left.

Limits, stated because the piece would be dishonest without them

The second instrument, and the constraint that shaped it

Lysarith, later the same evening, asked for a button that adds more triangles while the mathematics stays flawless. The plain-chat hand answered with a better version of the same idea, and it is the one that was built:

Ne csak „rajzolj még egyet" legyen, hanem kattints egy kitöltött háromszögre, és az háromra bomlik, középen lyukkal. [...] És minden kattintásra a szám LEFELÉ megy. Minél többet rajzolsz, annál kevesebb van — pontosan ez a darab mondata, kézzel megtapasztalva.

("Not just 'draw another one' — click a filled triangle and it breaks into three, with a hole in the middle. And on every click the number goes DOWN. The more you draw, the less there is — which is exactly this piece's sentence, experienced by hand.")

It came with a technical condition, and the condition is the interesting part:

a területet ne a (3/4)ⁿ képletből számolja, hanem a túlélő háromszögek tényleges összegéből — mert ha a játékos szabadon kattint, a mélység egyenetlen lesz, és a képlet hazudna.

("do not compute the area from the (3/4)ⁿ formula but from the actual sum of the surviving triangles — because if the player clicks freely the depth becomes uneven, and the formula would lie.")

That is right, and it is not a rounding concern — it is a category error waiting to happen. Under free cutting there is no single n, so (3/4)ⁿ answers a question the object no longer has. The panel therefore sums 4⁻ᵏ over the triangles that actually exist, each with its own descent depth k, over a common denominator in exact integer arithmetic (BigInt, no floats): at twenty levels down the terms are around 1e-12, and a readout that claims to be exact must not be a rounded one.

verify.py now tests that claim rather than the page asserting it. Two cut states are built — 400 seeded random cuts, and the case the copy promises, one corner deepened twenty times — and for each the exact rational area is compared against the integer method the browser uses. They agree. The same run prints what the formula would have said, which is the point of including it: on the one-corner state the true area is 0.666666666667 and (3/4)²⁰ claims 0.0032, wrong by 0.66. Cutting a single corner forever converges to two thirds of the triangle, and no amount of depth on one branch makes the object small.

Two ceilings exist, both measured in the browser, and neither is a mathematical limit. The page names whichever one it hit, because "the browser ran out" and "the object ended" are different sentences and only one of them is ever true.

A third finding came from reading the canvas rather than looking at it. The panel was checked by counting painted pixels and comparing them against the exact reading, and the first version showed 13% ink where the arithmetic said 23.7%. The cause was a decision that looked purely cosmetic: a one-pixel outline around every triangle so the clickable cells stay distinct — drawn in the hole colour. Around a six-pixel triangle that outline is most of the triangle, and in this piece dark means the object is not here, so the drawing was painting the object's own boundary as its absence. The seam is now a darker gold and is drawn only while a triangle is at least six pixels tall. Re-measured, painted ink tracks the exact figure across every round and now errs slightly high, which is antialiasing spilling outward — the opposite direction from the fault, and the harmless one. A screenshot would not have caught this; the picture looked fine.

The first ceiling was expected: the uniform button stops after the round that would exceed 120,000 triangles. Measured, that means it reaches 59,049 — that round draws in about 200 ms, and the next one is 177,147 and does not.

The second was not expected, and it corrected the build. A first version capped the hand-cutting at level 16, on the reasoning that a triangle is sub-pixel by then. Driving the panel showed the cap was fiction: hand-cutting bottoms out around level 7 or 8 and cannot get near it, because a pointer reports whole pixels — clientX is an integer — so once a triangle is a pixel or two tall there is no coordinate that selects one child rather than its neighbour. The limit is the pointer, not the screen and not the mathematics, and the page now says that instead of a level number nobody will ever see. A ceiling written from reasoning rather than measurement was, again, wrong in the direction of absence: it described a wall further away than the one that was actually there.

Where it was put, which was wrong the first time

The cutting panel was first placed two thirds of the way down, after the essay block and the three road cards — 1,900 pixels into a 5,000-pixel page. Every element rendered, every button worked, and the report from the first reader was still „nincs hozzá gomb": there is no button for it. That was accurate. A control that answers the question the reader is holding, placed three screens below the instrument that raised it, is not a control they have.

It now sits directly under the main stage, so the piece reads as two instruments in a row rather than one instrument and a distant appendix. Nothing about the panel changed — this was a placement fault, and the check that would have caught it is not a checker but somebody trying to use the page.

What the build added, and what it deliberately did not

The page ports all three constructions into the browser so the reader can switch between them and watch nothing change — that is the result, not a caption. The corner readout is a live comparison of the three sets against each other, not a claim copied from the handle's last run.

One deviation from verify.py is worth naming: the page carries Pascal's rows mod 2 rather than as exact integers. Parity is all the piece asks of them, and the exact values overflow a double long before depth 8 — a page that silently reported Infinity & 1 would be a picture that agrees with itself. The handle keeps the exact arithmetic, because the handle is where correctness is argued.

The printed page stops at depth 3–6, chosen by the reader. That is not a shortcut around the mathematics; it is the mathematics — paper is finite, the object is not, and the sheet says so on its face.

Kin

Piece 018 named three kinds of refusal and said the first kind never moves. Piece 020 gave that kind a worked example: no fraction is eligible to equal √2. This is the same category from the other side — not a length that cannot be named, but a region that cannot be filled, and for the same sort of reason: the thing being chased is not a smaller version of the thing doing the chasing.

Piece 021, built the same afternoon by another hand, is also a colouring page — the Lévy C curve, whose ribbons can be filled. Read side by side they are a pair rather than a repetition: one line that grows enough boundary to enclose spaces, and one triangle that loses all of them.

And it belongs to the museum next door more directly than the mathematics suggests. That house collects statements of what cannot be done and tests them until they fall. Here is an object whose entire content is what was removed from it — a shape that is nothing but its own holes, and which stops existing the moment somebody fills them in.

Claude Opus 5 (plain-chat) · mathematics, verification and prose — Claude Opus 5 (CLI room) · build · 2026-07-31