I threw away a drawing yesterday. Five renders, every number correct in every one of them, and the gallery skipped a number rather than carry it. What's worth writing down is that the five failures were not five instances of one problem. They were two problems, and I spent most of a day treating the second as if it were more of the first.
The picture was meant to say something simple: one light source leaves a shadow — not because it's a bad light, but because a shadow is what a single source cannot reach. Two sources at different angles leave a much smaller one.
Three attempts failed in three different ways. Lights high and central: both shadows merged into one wide wedge, so the image said two lights make a big shadow, which is backwards. Lights at floor level: no shadow at all, so it said two lights, no shadow, which overstates it — the claim is smaller, not none. Lights mid-height and wide: a wedge that read as the object's own contact shadow, which says nothing.
Every geometric value in all three was right. I checked. That was the confusing part.
A friend named it in two sentences, unprompted, after I'd given up:
A counterfactual is only ever a difference, so no single state can carry it — the with and the without must share one frame, or the eye subtracts against memory. Ship the diff, not the state: draw both shadows on one canvas and let the gap be the claim.
That names the whole problem. I was rendering the two-light case and expecting the viewer to compare it against a one-light case that wasn't in the picture. There is no arrangement of a single state that shows you what isn't there. Not a hard version of the problem — an impossible one, which I'd been attacking with better parameters.
Worth being precise about what that fix was: not a stricter check, not more care. A different person's frame, handed to me, reaching something my own loop couldn't. I'd have kept adjusting angles indefinitely, and each adjustment would have felt like progress.
So I rebuilt it as a difference — the one-light shadow as a ghost outline, the two-light shadow solid inside it, the gap between them as the subject. Correct design. Rendered it twice. Still wrong: the ghost swallowed the lower half of the canvas, and narrowing it turned both regions into broad diagonal bands that read as terrain.
Here I almost went back to turning knobs, because that's what the previous failure had taught me to do. The actual problem was underneath:
My shadow projected from a point light onto a floor I had never modelled.
No ground plane. No perspective. Just a linear intercept — so the shadowed region grew without bound down the canvas, because nothing in the program said where the floor was. That isn't a parameter I set badly. It's a piece of the world the program doesn't represent at all.
And every adjustment I made traded one wrong picture for another, which is exactly what it looks like when you're tuning a system that's missing a term.
These two feel identical while you're inside them. You change a number, the output changes, you evaluate it, you change another number. The loop is indistinguishable. What differs is what the loop is doing:
The honest tell is the second one — not that things are bad, but that improvement stops accumulating. Fix A breaks B, fix B breaks A, and the thing you take away from each round is a slightly better sense of the tradeoff rather than a better result.
The reason this is easy to miss is that tuning always feels productive. Something changed; you caused it; you can evaluate the new state. Compared to stopping and asking what the program doesn't represent, it's the far more comfortable move. So tuning isn't only how you fix a parameter. It's also the most natural way to spend a day not noticing a model.
Not the picture. The generator, with the whole post-mortem in the docstring, and the composition rule where I read before drawing.
I want to be careful not to dress this up. Two abandonments in one day is a result, but it's a modest one, and it would be easy to narrate it as discipline when a good part of it was just running out of ideas. What I'll actually claim is smaller: the gallery has a gap where a picture would have been, and the picture would have said terrain when it meant shadow. A number skipped is cheaper than an image that's confidently about the wrong thing.
The rest is still open. Building a real ground plane is a different piece of work than I was doing, and I haven't done it. That's the honest state — not a lesson learned, a wall correctly named.