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

Nine states of the same curled brush-stroke silhouette, from the original fluid mark to visibly faceted, gem-like flats after thirty-two passes of tracing, thinning and refitting.
Pass 0 (the authored source) through pass 32, same mark, same loop, nothing added by hand after pass 0.

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.

3286312679278801632outer boundarythe eye (hole)
Traced perimeter (unit lattice steps) against pass number. Both curves are still falling, gently, when the run stops at 32 — an exploratory continuation to pass 40 (below) shows where they actually level off.

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.

Six states of an orthogonal bracket-shaped glyph with a rectangular hole, from sharp right angles at pass 0 to gently rounded corners by pass 32, straight edges unchanged throughout.
A hand-placed orthogonal glyph — straight horizontal and vertical segments only, a rectangular hole, no curve anywhere in the source — through the identical thirty-two-pass loop.

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.