MYLIFE
120 agents, three rules, and a society that decides for itself what love and violence are. Exhibited at RISD, 2026.

MYLIFE is a Unity society. A hundred and twenty agents get hungry and lonely, form and lose friendships, fall in love, fight, reproduce, found churches, and die. Nothing is scripted; all of it comes out of a small set of interacting rules. Five of those rules are exposed to the audience as fill-in-the-blank English sentences that can be rewritten while the world runs, and a Claude-powered layer lets a visitor simply tell the world what they want.
It began as a two-screen installation at the RISD Digital + Media graduate exhibition in 2026, and was rebuilt into the single-screen, open-source piece that exists now.
“I changed a rule, but I can't tell what it did.”
That sentence, from a visitor at the show, drove everything after. The world was responding correctly; the response simply wasn't legible. Attention was split across two screens, and the word-bank interface ate most of the second one.
Relations are perceived, not shared
Every agent keeps its own view of everyone else. Kinship is set at birth; the social layer — friend, enemy, stranger — changes through proximity: stay near someone long enough and they become a friend, drift away and they are forgotten, attack and both of you are enemies. So A can consider B a friend while B considers A a stranger, and every rule in the Rule Book operates on perceived identity. The same law produces different consequences for different pairs.
Churches are founded by agents whose loneliness crosses a high threshold. A church then radiates loneliness to those nearby and attracts lonely agents toward it — a self-sustaining institution born from isolation. It is usually the first thing visitors ask about.
Three answers to one sentence
First, one screen. The interface became a set of drawers along the top and bottom edges, and the drag-and-drop word cards became click-to-open dropdowns — less space, less motor precision, works on a trackpad.
Second, attribution. When a rule fires, the world shows its work: lines between matched pairs, green for attraction and red for repulsion; pulsing rings around agents receiving a spreading condition; a live count on each rule row — “34 pairs”, “12 agents”.
Third, evidence over time. A rolling chart tracks the share of the population in love, in violence, and in silence, so a rule change is visible not only as an instant effect but as a bend in the curves.
A small model of the mechanic. Relations are perceived, not shared: stay near someone and they become your friend, drift and they're forgotten, collide and you're enemies — so the same sentence matches different pairs from each side. Change a word and watch the lines, the count, and the curves. The real piece runs 120 agents, five sentences and eighteen parameters in Unity.
The model as an untrusted visitor
The chat drawer sends Claude a live snapshot of the world — a census, behaviour counts, the events of the tick, the active rules, and every tunable parameter with its legal range — and gets back one strict JSON object. It can pull two levers and nothing else: Rule Book fields, validated against the card vocabulary, and a whitelist of about eighteen named parameters, every write clamped, unknown names ignored.
The model cannot reach into the simulation. It can only speak the same five sentences the audience can, plus a bounded set of dials. It is the same shape as steering a production agent: fuzzy human intent, a constrained tool surface, an externalised policy anyone can read.
Two dead laws
Writing the benchmark harness turned up the worst bug in the piece. The two headline rules of the exhibition — Draw Together and Turn Away — had never fired. The pair-matching code passed the observer as its own partner, so the perceived identity came back empty and the match always failed. Audiences at the show were legislating with two dead laws. Both work now.
The exhibited build was O(n²) across every system, and it slowed down over the course of a day because dead agents were never removed from the list — every loop iterated a permanently growing graveyard. The rebuild replaced all-pairs scans with a spatial hash rebuilt once per tick, stored only non-default relations, and reformulated movement as a shared far field plus sparse corrections for an agent's actual relationships. An exact O(n²) path is kept behind a toggle for A/B comparison.
Simulation step only, fixed seed, Apple M2 Max. At 2,000 agents the optimised build also does zero steady-state heap allocation.
Two findings mattered more than the speedup. In a fixed one-screen world, remaining cost is governed by density, not algorithm — at 2,000 agents every query radius holds about 220 neighbours — so the benchmark grew a constant-density mode to separate the design's ceiling from the engine's. And even at constant density the cost stays super-linear, because the agents' own social gravity clusters them. Density is emergent. Worst-case cost is a property of the society, not the world size.
What it failed to do
I made MYLIFE to build a world that could be watched and felt — something with the shape of an epic, a life that means something because of what it went through. That did not happen. The world produces statistics: populations rising and falling, rates of violence, legible and alive and somehow unmoving.
Emergence produces events. It does not produce meaning.
An odyssey is not a journey; it is a remembered journey. It needs something that holds on to what happened and chooses what is worth telling. MYLIFE has no memory and no point of view, so it can generate a thousand lives a day and not a single story. The performance fix that cured the day-long slowdown was to delete dead agents and cap the graves — which also optimised away the world's memory, and is precisely why it cannot tell one.
Where meaning did appear, it came from narration, not simulation: an agent telling its own life in the first person from its real data, and an accident — asking the world to become a paradise, more food and faster time, and watching everyone starve because abundance arrived but time moved too fast for food to grow. I ended up typing “why is everyone dead?” into my own artwork. That one has the shape of a story: intention, consequence, irony.
How it's built
Unity 6, URP, C#. Three layers with a strict dependency direction: plain-C# data, a simulation with one entry point per tick, and views that read state and never write it. Both the human's dropdown clicks and Claude's validated patches write into RuleBookState, a ten-field data store the simulation polls once per tick; the exhibition version routed the same thing through five singleton bridges and 22 scripts, all deleted. The redesign did not add an abstraction, it removed one. A custom modular synthesizer — oscillator, filter, LFO, mixer, writing straight into OnAudioFilterRead — drives the sound from agent state. Public on GitHub, MIT, tagged v1.0.