The drifts did not start as a request for “something cool.” That prompt is too unconstrained: it produces novelty without a standard for keeping or rejecting the result. I wanted a visual system that felt drawn rather than rendered, held together as a family, and could survive being looked at for a long time.
Prompting as specification
I use the model to widen the candidate set, not to make the final aesthetic decision. A useful prompt names the material, the geometry, the motion, the rendering budget, and the things that are forbidden. “Black particles on paper” is a material constraint. “A recognizable silhouette with depth” is an evaluation criterion. “No gradients, no decorative color, no stored meshes” removes easy but uninteresting escapes.
The prompt is closer to a lab protocol than a mood board. I ask for families of mechanisms and parameters, then ask the model to explain what each parameter changes. That explanation matters because it turns an attractive accident into something I can reproduce, perturb, and reject.
The loop
Each pass follows the same sequence: propose a small set of candidate forms, implement the simplest version, render it under the same camera and density limits, then compare it against the brief. The next prompt contains the failure, not just the success: too much symmetry, no readable depth, a silhouette that collapses at small size, or motion that looks like noise.
This is the part of the method that compounds. A rejected candidate becomes a sharper constraint for the next generation. The model is useful for remembering the search space and suggesting variations; the acceptance boundary stays human and explicit.
One executable framework
Every drift is a function evaluated from a point index in the vertex shader. There are no stored meshes. The shared renderer is called by the lab, the hyper review, this note, and the museum, so a study selected in one surface is the same study elsewhere. The renderer supplies a stable coordinate system; prompting supplies candidate equations and families.
That division keeps the method honest. If a form only works because of a special screenshot, it does not belong in the collection. If a parameter cannot be described clearly enough to change, it is not yet part of the framework.
What survives
The retained forms tend to have three properties: a legible silhouette, enough asymmetry to avoid looking like a logo, and a depth cue that remains visible when the field is reduced. Inflating vesicles and dividing amoebas were useful failures because they made the rejection criteria concrete. The archive can be broad; the museum should be selective.
Motion is another constraint
Scroll selects a new study and the shader blends the old and new positions instead of cutting between them. Pointer input adds a local tangential force inside the canvas bounds. The renderer pauses when the page is hidden, limits pixel density, and respects reduced-motion preferences. These are not polish added after the fact; they determine which forms are acceptable in the first place.
Inspiration and distance
The broader idea of treating an AI system as a research loop rather than a one-shot generator sits in the same lineage as Andrej Karpathy’s autoresearch post on X ↗. I took the transferable idea to be procedural: define a constrained objective, run many cheap attempts, preserve the record, and let evaluation decide what earns another iteration. The visual criteria and implementation here are my own.
The current state is therefore a result of curation as much as generation. Prompting expands the space, code makes the space executable, and repeated comparison makes the space smaller. The final drift is the residue of those three decisions.