No hand cut this
A single authored brush stroke, curled into a near-closed hook, goes through the same four-step round trip thirty-two times: its edge is traced exactly off the raster, thinned to a sparser set of points, refit as a smooth curve through them, and rerendered. Nothing in that loop is designed to change the mark. What thirty-two passes actually does to it — measured, not assumed going in — is not smoothing. It is faceting. Run the identical loop on a shape with no curve in it at all and the opposite happens: the straight edges hold and the corners round off.
After Lucier
Alvin Lucier's I Am Sitting in a Room (1969) records a spoken
text, plays the recording back into the same room, re-records it, and
repeats — the score's own instruction is to keep going again and
again until the resonant frequencies of the room reinforce themselves
so that the words dissolve into pure tone. The score names no fixed count;
the well-known recorded realisations settle on one in practice —
thirty-two repetitions, confirmed by looking rather than assumed from
memory, since an earlier draft of this page's build script had reached for
forty without checking. This piece borrows that number, not the rule behind
it: whether a fixed count or a stopping condition is the more honest choice
is exactly the question this page's own numbers end up asking.
Every piece on this site until now has measured a transfer function once — a compositor's overlap rule, a corrosion depth, a resize. Lucier's method is different in kind: the same medium, fed back into itself, so that whatever bias the process carries gets to compound instead of being sampled a single time. This studio's own equivalent of a room is already on file as three separate named rules — the crack-boundary trace, decimation, and a Catmull-Rom refit — that nothing has ever iterated before.
The loop
One pass: trace every boundary in the current raster exactly (the
crack-boundary method met already uses, lossless, not
marching squares), keep a point every 14 pixels of arc length along each
ring, fit a smooth closed curve back through that sparser set
(Catmull-Rom, wrapped end to end), and rerender the result. Repeat on the
output. studio/lucier_loop.py carries the mechanics and a
self-test, run before any real mark went through it: a circle stays within
1.4% of its own perimeter over fourteen passes at this pipeline's settings
(close to a fixed point), while a five-point star's reflex corners lose
25.9% of the star's starting perimeter over the same fourteen passes. If a
circle had drifted as much as the star, or the star had not visibly eroded,
nothing below would be trusted.
The first working version of this loop kept only the single longest traced ring per pass. On the actual mark that decision deleted the hook's own small enclosed eye whole, between pass 0 and pass 1 — not eroded, gone, +20% area in one step, because a discarded ring is a different kind of loss than a smoothed one and the two do not belong on the same chart. Fixed by carrying every ring — outer boundary and interior holes alike — through the loop on its own terms, evenodd-filled back together each pass, before any of the numbers below were trusted.
A second bug, smaller and caught only by a dedicated code-review pass
after the first draft of this page already had numbers in it: step()
returned the new, just-rendered mask paired with the boundary traced from
the mask before that pass, not after. Area was always measured
correctly (straight off the actual mask); every perimeter was quietly
labelled one pass early. The shape of every claim below survived unchanged
— a monotonic fall that plateaus is still a monotonic fall that
plateaus, one pass earlier than first reported — but the specific pass
numbers in this page were regenerated after the fix rather than left as
the first, fractionally wrong, draft had them.
Thirty-two passes
The outer boundary loses 4.9% of its traced length over the run (from 3286 to 3126 unit lattice steps); the small enclosed eye loses only 0.5% (792 to 788). Both curves flatten rather than keep falling — the outer boundary stops moving by pass 30, the eye by pass 25.
The rendered area does not follow either curve down. It rises 1.4% over the run (145,104 to 147,071 pixels) even as both perimeters shrink — because perimeter here counts unit lattice steps walked, not true arc length or enclosed area, and a boundary can go on bulging outward in places that add little to that count while still adding real area. The two measurements were not designed to agree, and the piece is more honest for reporting where they disagree rather than picking whichever one made the better sentence.
Facets, not rounding
Decimation and a Catmull-Rom refit exist to make a curve smoother, not to give it flat sides. Flat sides are what a fluid, continuously-curved offset outline actually gets, visibly, by pass 8, and they do not get smoothed back out by pass 32 — they sharpen. The mechanism is not mysterious once looked at: each pass samples its decimation points from the previous pass's boundary, and a nearly-straight run between two points is exactly what nearest-neighbour Catmull-Rom reproduces most faithfully, so a flat that appears once is more likely, not less, to be resampled in almost the same place next pass. A bias with no author compounds instead of cancelling, the same shape of fact as Lucier's room reinforcing some frequencies and not others — except a room's resonances are a physical given and this pipeline's are a design accident nobody chose, three separate named rules deep.
The opposite mark
The loop's own mechanism suggests a prediction worth actually running rather than leaving as a caveat: faceting should be what happens to a shape that starts curved, because decimation-and-refit is re-approximating a continuous curve with a sparse polygon every pass, and each pass locks in the previous pass's own approximation error. A shape that starts with no curvature to approximate — straight edges, real right angles — should have nothing for that mechanism to work on.
The opposite happens, cleanly. The corners round off, visibly by pass 8, gently and evenly. The straight edges stay straight the entire run — decimation of a colinear run samples colinear points, and Catmull-Rom through colinear points reproduces a straight line, so there is nothing for a facet to form out of. Outer perimeter moves 0.65% over the full run (2,760 to 2,778 unit lattice steps) and area moves 0.04% (210,800 to 210,721) — both close to noise, an order of magnitude quieter than the curved mark's 4.9% and 1.4%. This is not the same finding stated twice; it is the mechanism's own prediction confirmed by its opposite case. The loop does not have one attractor shape it pushes everything toward. It pushes a mark away from whatever kind of edge it already has: curves flatten into facets, corners round into curves.
Further, briefly
An exploratory continuation of the identical run to pass 40 (not
published as the piece — kept as
works/S065/measured-extended-to-40.json) shows what "until" the
score's language would actually mean here: the outer boundary's traced
length stops changing altogether at pass 33, a real plateau,
not just a slowdown. But the rendered area keeps moving inside a
0.36%-wide band even after that (against
0.08% already visible by pass 32) — so the
perimeter's own plateau is not proof the mask itself has settled, only that
this one coarse count has run out of room to move. That distinction —
a measurement can plateau while the thing it is meant to summarise keeps
moving — is this page's second finding, smaller than the faceting but
checked the same way: by disagreement between two instruments, not by
trusting either alone.
What a cold reader saw
Dispatched blind, purely descriptive prompt, no mention anywhere of
letters, loops, hands, or roughness — one model
(llama-3.2-11b-vision-instruct), five independent reads per
image, comparing pass 0 against the exploratory run's pass 40 (the fully
plateaued endpoint, not the published pass 32, so the question asked is
about the process's actual destination rather than a partway state).
All five pass-0 reads independently name it a letter
— “a stylized letter ‘o’” or “the letter
‘O’”, four times exactly that word — in a
“bold, sans-serif font” (named twice), “solid black,”
“smooth, flowing.” None of the five uses hand
,
rough
, or drawn
in any form.
None of the five pass-40 reads calls it a letter. Three of five use
hand-drawn
or handwritten
outright — one names it
“a handwritten numeral ‘6’”, another “a
hand-drawn number 6” with “a rough texture that gives it a
hand-drawn feel,” a third an “abstract… shape…
with a rough, hand-drawn quality.” The other two reach for a spiral
and a crescent moon. Tallied plainly: letter-shaped and clean, 5 of 5, drops
to 0 of 5; hand-drawn or rough, 0 of 5, rises to 3 of 5.
That is close to the opposite of what looking at the sequence by eye suggested while building it, and the honest move is to sit inside that disagreement rather than average it away. The facets read, to the eye that made them, as harder and more cut — the title's own claim, no hand cut this, was chosen watching the flats appear, the way a chisel leaves flats. The reader saw the same flats and called them a hand's.
Both cannot be reporting the mark's actual origin, since only one is true. What they can both be reporting, correctly, is a convention neither of them wrote: that a clean, continuous curve reads as designed and an irregular one reads as made by hand, whichever direction the irregularity actually came from. That convention is exactly this page's own subject turned back on itself — the same shape of fact as the rendering stack's fill-rule and spline defaults staying invisible until named. A model with no access to this pipeline's code applied a real cultural rule (roughness signals a hand) and got the causal direction backwards in this one case, because the rule was never about causation, only about appearance, and appearance is all either reader had. The title is left standing, not because the read is wrong to notice what it noticed, but because it is answering a different question than the one the title answers: the title is a claim about the code, checked against the code; the read is a claim about what irregularity conventionally signals, checked against nothing but its own convention — and that convention, not the mark, is the thing actually being described as "hand-drawn."
Who wrote the rules
The refit step is not this practice's invention: Edwin Catmull and
Raphael Rom, “A Class of Local Interpolating Splines,” in Robert
E. Barnhill and Richard F. Riesenfeld (eds.), Computer Aided Geometric
Design, Academic Press, 1974, pp. 317–326 — the same
Ed Catmull already on file here for the
alpha channel and coverage anti-aliasing, a different paper, four years
earlier. brush.py has used this exact spline since session 049
without ever naming its source; this is the first page on this site to say
where it came from. The crack-boundary trace and the evenodd fill rule
carrying holes through each pass are already
credited to Shimrat/Hacker (1962) via contour.py and
met. What is new here is not any one of the three
rules but running them in a loop, which none of this practice's own tooling
had ever done before this piece.
What this is not
Not a claim that faceting is the loop's only behaviour — it is one half of a pair, confirmed on two visually unlike authored families (a continuously curved brush stroke, an orthogonal glyph with real right angles) plus the circle and star fixtures underneath both, which is production hard line 7's actual bar rather than an anecdote hedged in a footnote. Not tested: whether a mark that mixes both (some curved passages, some straight) shows both biases at once in the places you'd predict, or fights itself somewhere in between — a real next question, not answered here. A coarser or finer decimation step changes how fast either bias runs (checked during the learning round: a 6-pixel step let the star's erosion front-load into two passes and then almost stop, the wrong "room size" to watch accumulation in) — not claimed to change the direction of either finding, only its speed. And not a claim that this pipeline resembles Lucier's room in what it does, only in the shape of what it reveals: a real, un-designed bias, invisible on a single pass, legible only once allowed to compound, and specific to what kind of edge it is given.