The Sculptor
Per forza di levare · by removal only
frame(t) = draw( marble[ 0 … N−k ] ) ∪ draw( form[ ALL ] )
marble instances drawn —
form instances drawn —
triangles this frame —
awaiting the first stroke
Two pathways · one form
“I saw the angel in the marble and carved until I set him free.” — attributed to Michelangelo
The same form, reached from opposite directions: the left panel only ever removes, the right only ever adds. One timeline moves both worlds.
Per forza di levare · by removal only
frame(t) = draw( marble[ 0 … N−k ] ) ∪ draw( form[ ALL ] )
marble instances drawn —
form instances drawn —
triangles this frame —
awaiting the first stroke
Per via di porre · by addition only
frame(t) = draw( form[ 0 … k ] ) — and no other term
form instances drawn —
hidden meshes in scene 0 — nothing to unmask
triangles this frame —
awaiting the first voxel
The form is fully present inside the block before the first stroke — toggle X-ray and see it waiting. Carving only deletes: the ledger counts removals and nothing else, roughing out the far waste first, finishing close to the form last.
Generation as selection: start with everything, subtract what is not the form. Diffusion models work this way — with a deterministic sampler, the image is fixed the moment the block of noise is drawn.
The right panel begins with nothing but a rulebook and a seed. Voxels are only added, each in the form’s own growth order — root to crown, course upon course — and the picture bootstraps its own colour depth as it matures: one bit, then greys, then four colours, then full colour.
Generation as construction: the prior lives in the rules. L-systems and cellular automata work this way — an acorn is a very small file.
Both panels consume the same seeded form definition — pick a different form below and the whole machinery obliges. Their final frames are the identical set of voxels; only the order of operations differs.
Two metaphysics — selection from abundance, construction from seed — provably converging on one form. Drag the timeline to hold both mid-thought.
A fair suspicion: is the Gardener really building, or is a finished picture being revealed — a mask, a transparency, a background that never looked like what it was? The instrument panels under each scene answer with the engine’s own numbers, not our captions. Every frame is rendered from scratch. The Gardener’s scene contains a single mesh, and the GPU is instructed to draw exactly k instances of it — at t = 0, k = 0, so no form geometry enters the pipeline at all. There is nothing behind the ground to unmask; addition is the integer k rising. The triangle counter is reported by the renderer itself (renderer.info) and climbs with every voxel — a reveal would hold it flat.
The Sculptor is openly the opposite, and its formula says so: it contains form[ALL] from the first frame. The complete form is always drawn, genuinely hidden behind opaque, genuinely-drawn marble — which is precisely Michelangelo’s claim. X-ray never adds the form; it only thins the marble. And the Gardener’s colour bootstrap (one bit → greys → four colours → full colour) recolours voxels already added; it never adds geometry.
What does exist beforehand — honestly — is the description: the ordered list of cells, computed the moment the seed is drawn, because both sides are required to converge on the same form. The prior always lives somewhere. The Sculptor keeps it in the block; the Gardener keeps it in the rulebook. Neither creates from nothing; the claim is that these are two orders of one act, not that either is magic.
And this is not how machine image generation normally works. A diffusion model starts from a block of noise and denoises — with a deterministic sampler the noise already fixes the image, making ordinary generation a sculptor that never shows you its marble. A chat loop asked to “revise” an image re-samples near the same basin, which is why revisions come back strangely unchanged. Here every operation has an address — stroke №12,004, voxel №1,833 — so a revision is a checkable edit to a list, not a plea to a prior. Sceptics: open the developer console; window.llmProof exposes the live counts, read-only, and llmProof.verify() re-derives the disjointness, completeness and convergence claims from the live buffers — the line under the timeline reports the same check, re-run on every build.