VA.2026.006 · Floor 0 · service · hall 12
“a life, simulated five minutes at a time — planned once, ticked all day, never teleported.”
VA-Sim simulates a single subject — identity withheld by curatorial order — living between home and a third place. Each day is a timeline from 00:00 to 24:00, cut into routine slots and executed in 288 ticks of five simulated minutes. A plan cron fires at 00:05 local time; a tick cron fires every five minutes after. One tick equals five minutes of lived time, one to one.
The architecture is three layers with a single law: the model proposes, the simulation disposes. Layer 1 plans once per day — a rule draft enriched by an external chat model that may swap micro-activities but may never move the slot hours. Layer 2 ticks deterministically with zero LLM calls: desires, micro sessions, multi-tick travel bridges, safety-net constraints. Layer 3 interprets after the fact — every feeling traceable to a chain of activity, bars, and emotion scores. Since Rev. B the engine and prompts are free of hardcoded identity: a character registry supplies the subject, and an emotion engine plus inner-state behavior (fourteen labels, urgency and relief, soft-max desire) turn inner pressure into outward routine.
Phase 09 gave the subject things to own. A handful of everyday objects are seeded — tools that drain, consumables that replenish, and a rotating favourite — each carrying its own state: charge, place, fullness, affection. Tools with a dead battery are excluded from the micro-activities that need them, and the exclusion is remembered in the narrative rather than raised as an error. Charge drains while the subject works, and a companion's needs rise when the subject tends to it, feeding a new desire. Phase 09b then removed the kindness the simulation had been granting for free: no more charging merely because the subject is home. Charging became a micro-activity with a place, a duration, and a cost in the day. Phase 09c gave the subject foresight — below thirty percent, plugging in starts pulling at the subject's attention, and a dead-end latch makes sure a dying device sends the subject home once rather than twice.
Phase 10 brought other people into the room without letting them become state. A roster of five relations — family, friend, colleague, acquaintance, client — is seeded in code, each with a closeness score, traits, and the hours they tend to be free. Presence is probabilistic and deterministic: closeness times habit match times a day-variant roll, capped at three, with one micro reserved for reaching out to someone. A per-day ledger blocks double-booking — if the subject is already out with someone, the subject cannot also be elsewhere with someone else, though reaching out costs nothing in location. Nothing new was persisted: a social beat is a line folded into the tick's own narrative, and the AI may only schedule people who are actually on the roster.
The evidence lives in the archive. An accelerated simulator replays fourteen days at ten ticks a second — 4,032 ticks, nine days planned by the model and five by fallback, twenty enrichment attempts vetoed, not one behavioural loop surviving to the end. Those runs are what exposed the last three repairs: one routine could interrupt another, a tired subject would rather linger than travel home, and after two visits a place closed for the rest of the day. The subject's identity is redacted everywhere — profiles, tables, session ids — because the simulation is about the shape of a day, not who lives it.
From Phase 11 the simulation has somewhere to go. A relationship layer turns first contact into a roster entry; a standalone world map routes the subject over a seeded road network, with travel cost shaped by daylight, weather, and landmarks; Phase 13 lets people actually be met there — at a landmark, on the way home, or remotely. The tick still owns the truth: a meet is a commitment, not a conversation, and the map only lengthens a day in the places it can afford.
VA.2026.006
VA-Sim
Realtime Simulation · Cron-Driven Ticks · Deterministic Day Plans · Inventory & Social Presence · Elysia + Bun
Frozen profile, four routine templates (weekday, weekend, deadline, idle), micro taxonomy with per-tick bar deltas, deterministic seeded PRNG.
Day-plan draft plus guarded enrichment, then the tick stepper: planned micro or desire fallback, travel bridges, constraints, idempotent tickIndex.
Two cron jobs (plan 00:05, tick every 5 min) behind a separate cron secret; read APIs for plan, session state, and history. No websockets — polling only.
VA-ORM persistence for sessions, ticks, day plans, tasks; seven-day offline replay verifying zero teleports, real meals, sleep at night, stamina above zero.
Auto day-variant selection (deadline over idle over weekend over weekday) and a task module with live estimates, auto-pull, drift, and forgetfulness — work with meaning.
Task prompt context, fourteen-label emotion engine, and inner-state to behavior mapping — urgency, relief, and soft-max desire stop the flat-day repetition. Shipped on dev.
A few seeded objects with their own state: tools drain, consumables fill, a companion's needs and a favourite-of-the-day rotation. A micro-activity that needs a dead battery is excluded, and the story remembers why.
Auto-charge deleted — being home is not the same as plugging in. Charging became a micro-activity with its own place and duration; then foresight: below thirty percent, plugging in starts to pull at the subject's attention, and a dying device latches the day shut instead of trapping the subject there.
Five rostered people, deterministic presence drawn from closeness and habit, capped at three, with a daily ledger preventing double-booking. Zero new tables: a beat is a sentence in the tick's own narrative, and the model may not invent strangers.
Per-micro caps, meal variety, scroll winddown limits, ping-pong excludes retired, force-sleep removed — plus a live accelerated simulator for multi-day verification.
4,032 ticks replayed at ten per second — nine model-planned days, five fallbacks, twenty vetoes, no surviving loop. The evidence that turned three more bugs into rules: no meal before grooming is finished, a tired subject lingers rather than travels, and a second visit closes the slot.
A migration script moved persistence from a direct connection to the HTTP gateway, and a reconcile script now replays ticks across two separate databases after a failover — the simulation can be interrupted without losing the day.
The tick cron learnt to fill slots it missed instead of quietly moving five minutes backwards, and a half-hourly recovery cron re-plans a day whose enrichment failed — with the token ceiling raised after the draft fallback was traced to a truncated reply.
A relationship layer: family is default, while friends and clients enter an internal roster after first contact instead of being invented ad hoc.
A standalone internal graph — multi-modal shortest paths over a seeded road network, travel cost scaled by daylight, weather, and landmarks, with tick clamping so nobody teleports. Deliberately not wired to the shared graph library yet.
The synthetic map is replaced by a real road-network seed with a dynamic place-mapping fallback; a weekday third-place slot is injected probabilistically, with transit micro-activities excluded and a daily cap.
People are met on the map rather than merely scheduled: meetings at landmarks, remote contact with family, and an explicit meet commitment that survives ticks.
The task module learns direction — what a task is for, not only that it exists.
The single module divides into domain folders, the step store becomes a general simulation store, and an HTTP database driver joins the direct one — with the tick path optimised and a fourteen-day harness kept as evidence.
Collective items, a task economy from pricebook to wallet, then the memory era: general memory, maps, social memory, economic memory, cross-memory, and its closing guardrails.
Persona seeds migrate to an external identity registry, chat wires live definitions, aliases resolve with typo tolerance, warm caches refresh every minute. Then no accounts, no passwords: memory itself is the identity, and unfinished topics resurface weeks later like a person would.
concepts — kept & discarded
kept — 288 idempotent ticks per day, deterministic on the stored plan
kept — constraints that tell a story; a refusal the subject can narrate beats an error
rejected — per-tick LLM and websockets; cost and fragility with no human gain
rejected — auto-charging; convenience quietly deletes the behaviour you built the system to model
held — withheld identity; the exhibit studies days, not the person living them
archive ref — VA.2026.006/CON
cross ref — timeline fig. 01
curator annotations
the model may suggest the day, but only the simulation may live it.
no teleporting between home and the third place — every move crosses transit, tick by tick.
never run end-to-end against prod — memory for tests, or the archive fills with ghosts.
auto-charging was kinder and worse. deleting it made the battery a decision instead of a background process.
other people are drawn, not stored. a roster in code, a ledger for one day, and nothing to migrate when the subject changes.
| materials | Bun runtime · Elysia HTTP · VA-ORM persistence · PostgreSQL / Neon · cron-job.org triggers · local business clock · static Bearer auth · OData envelope · character registry · emotion engine · inner-state behavior · inventory with drained batteries · social roster + presence ledger · internal world map · social life on the map · multi-store persistence | dimensions | ticks per day — 288 · tick length — 5 min sim · day coverage — 0–1440, no gaps · cron jobs — 2 · LLM per tick — 0 · phases shipped — 01–13 (+08b–08e, 09b, 09c, 12b, 12c) · live archive — 4032 ticks · 14 days · roadmap — 14–50 planned |
|---|---|---|---|
| condition | dev branch · cron live · 4032-tick live archive · world map live · social presence · catch-up + recovery crons | acquired | 2026 |
| revision | Rev. E | archive location | DWG-006 · floor Floor 0 · service |
| internal reference | VA.2026.006/M | origin | duplicated from a larger engine, kept only the foundation, 2026 |
failed experiments
e2e ran without the memory override and wrote synthetic sessions and far-future tasks to prod. rule since: STEP_STORE=memory for every e2e run.
realtime sockets designed, then deleted — polling covers the viewer with none of the serverless pain.
early stepper repeated one micro for hours. fixed with session holds, anti-mono guards, and deliberate short-micro alternation as texture.
the subject bounced between two places tick after tick. fixed with location-group resolution, multi-tick travel bridges, and a visit latch.
enrichment returned free-form prose the guards could not veto. fixed with sanitized structured swaps and per-swap stamina vetoes.
charging happened automatically whenever the subject was home, including asleep — so the constraint the whole inventory phase existed to create never actually bit. phase 09b deleted it: a full session at the socket, or no charge at all.
a dead device sent the subject home to charge, and the return trip was judged affordable — so the subject went back and died again. two hours of ping-pong per visit. the charge session is now uninterruptible and a second visit closes the slot.
draft concepts
research notes
— locking slot hours while freeing micro-activities is what keeps enrichment creative but honest.
— a local-date helper beats timezone discipline — business dates must never come from raw UTC strings.
— async polling outlives websockets on serverless; the viewer waits, the simulation never blocks.
— a character registry beats hardcoded identity — the engine stays the same while the subject changes.
— a flat battery turns an abstract constraint into a story: the simulation explains itself instead of throwing.
— behavioural loops are only visible at speed — 4,032 ticks found three faults that a single day never could.
— model vetoes are a feature: twenty rejected enrichments in fourteen days is evidence the guardrails are load-bearing.
Enrichment may rewrite the texture of the day but never its skeleton. Every swap passes stamina vetoes, location groups, roster membership, and slot guards — or the draft stands.
Seeded randomness, minute-absolute time, idempotent ticks. The same seed and plan must replay the same day — otherwise the archive cannot testify, and nothing in fourteen days of runs would be evidence of anything.
The subject's name is withheld from every label, table, and route in this hall. What remains — hunger at noon, a flat battery away from home, a friend free on Saturday afternoon — belongs to anyone.
within the collection
future vision
Phases 14 through 20 give the world its economy — collective items, a pricebook, income, a wallet, rent, and the first real scarcity. Then the memory era runs to fifty, ending with no accounts and no passwords, where the subject recognizes a visitor by what the subject remembers of them. Until then VA-Sim ticks on: a plan at dawn, 288 small lives per day, and a viewer polling quietly to watch the subject — whoever they are — live another five minutes.