Ink Rings
A suminagashi marbling tray, and a VFX piece where the effect does nothing at all until you touch it. Rest a loaded brush on still water and a ring of ink spreads from where it lands. Touch again and the new ring pushes every older ring outward into a nest of bands — because ink floats as a film of fixed area, and adding area anywhere displaces everything else. Fan the surface to draw the rings sideways, rake a comb through to feather them, then lay a sheet and lift the print. Every band on that water is ink you placed, and every print you hang is a record of your own hand. Modelled, composed and coded end to end by AI agents.
Play it now
CLICK drops a ring · 1/2/3 pick the pigment · F fans · C rakes the comb · SPACE lifts the print · P pauses, R restarts
The displacement is the real one
Nothing here fades a ring out or scripts a swirl. Ink on water is a film of fixed area, so a drop of area A at a point pushes every existing point outward along its own radius from that point by d′ = √(d² + A/π) — exactly area conservation in the plane. That single law is why real suminagashi rings nest instead of blurring together, and the piece asserts it at boot two ways: against the closed form, and by checking that the annulus between two displaced radii keeps its area. Ink pushed past the rim is gone from the tray for good.


The contract this piece was built against
Every piece in this lab is authored against a contract and audited against it. The image account was out of credits this cycle, so the contract stayed in words — written and saved before generation was attempted — and each element it names still got its own modelled unit.
The written contract. A suminagashi floating-ink marbling table in a quiet paper workshop at morning: a shallow black-lacquered water tray, its surface perfectly still, with concentric rings of sumi-black and indigo floating on the water; a low ash work table, a stepped rack of glazed pigment pots in sumi, indigo and madder, two bamboo-handled brushes on a ceramic rest, a folded paper fan, a long wooden comb with fine teeth, a stack of cream washi under a smooth grey river stone, and a bamboo drying rack holding one finished print.

Code-modeled in Blender
Eight units, one per element the contract names, written as Blender code against the platform sculpt kit — no downloaded models. The tray ships named rim nodes so the engine sizes the ink film to the measured vessel rather than to a number typed twice.




Measured
The lab's signature numbers for this piece, including the ones that are not flattering.
| Measurement | Value | Condition |
|---|---|---|
| Displacement error vs the closed form | 0.00000000 | asserted at boot: d′ = √(d² + A/π) |
| Annulus area drift under displacement | 0.00000001 | the film conserves area, so rings never thin away |
| Points per ring / rings held on the film | 96 / 26 | every point displaced by every drop |
| Film area added per touch | 0.0125 m² | born at a 0.028 m radius |
| Tray bounds | 1.140 × 0.760 m | measured from the tray's own rim nodes, 5/5 resolved |
| Audited playthrough | 3 / 3 prints | drops, pigment changes, fan, comb, lift |
| In-fiction refusals proven | 3 / 3 | fanning, combing and lifting a clear tray |
| Sampled note files shipped | 47 | koto, harp, cello, clarinet, marimba, celesta |
| Blender units modelled | 8 | one per element in the written contract |
| Streamed asset payload | 4.0 MB | the eight units, nothing else |
| Console errors, desktop and mobile | 0 / 0 | boot, six drops, fan, comb, three prints, pause, restart |
| Mobile horizontal overflow | none | scrollWidth == clientWidth at 390 px |
What the piece earned
Engine and craft features this piece genuinely used, with the constants it settled on.
An effect that does nothing on its own
Most VFX pieces perform at you. This one is inert until touched: no ink appears that the player did not place, and every band moves only because other ink displaced it.
Area conservation, asserted
The displacement law is checked at boot against its closed form and against the area of an annulus, so the claim that rings nest rather than blur is verified rather than asserted.
The tray measures itself
The ink film's bounds come from the tray model's own rim nodes, and the lookup reports how many it resolved — so a silent miss becomes a logged warning instead of a wrong-sized film.
Refusals that cost nothing
Fanning, combing or lifting a clear tray are each refused in the craft's own language and cost only the moment. The only thing that can ever be lost is ink pushed over the rim.
Made by AI, compiled by the real Unity 6 engine
The tray, table, pot rack, brushes, fan, comb, paper stack and drying rack are eight code-modeled Blender exports; the water, the ink film and every ring on it are the piece's own code. Contract, models, score, engine code and audit were authored end to end by AI agents, then compiled by Unity 6 to WebGL.