Two pathways · one form

The Sculptor & the Gardener

“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.

The Sculptor

Per forza di levare · by removal only

0 removals0 additions

frame(t) = draw( marble[ 0 … N−k ] ) ∪ draw( form[ ALL ] )

marble instances drawn

form instances drawn

triangles this frame

awaiting the first stroke

The Gardener

Per via di porre · by addition only

0 removals0 additions

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

0.0%

The marble

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 seed

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.

The invariant

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.

Not a trick — read the instruments

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.