Living Holograms · Proof 1
Mote is a small hologram: a creature with a position, a mood, energy and a short memory.
You are the caller. You see each lens only as its descriptions, you choose parameters, and a
deterministic perform() writes the next tile. Every tile is hashed with SHA-256 and
chained to the one before it. Between passes, a reflex compiled from the present runs at 20 Hz.
slush_in.derived_from, the lens particle, params_hash and the caller.slush_in. Replay checks that byte for byte.The routine below was compiled from the present object. It runs every 50 ms with a step budget. Poke the field: the creature flees for a moment, and the poke is logged. Nothing the reflex does persists until a pass records it.
from_tile is the data_slush the last lens emitted. reflex is the live reflex log. env is a host fact. The pass stores all of it as slush_in.
This is everything a caller sees of a lens: its description and its parameter descriptions. perform() is hidden from the caller. Its source is in this page if you want to read it.
Auto uses a scripted caller (auto-caller, kind process). It reads the present and the slush, then picks a lens and parameters. It is not a model.
Values are serialized as canonical JSON: object keys sorted by UTF-16 code unit, no whitespace, strings escaped as in JSON, integers only. A hash is H(tag, value) = SHA-256(tag + "\n" + canonical(value)), written as hex. The payload's particle is H("rapp/1:particle", payload). The frame hash is H("rapp/1:wave", {kind, seq, prev, particle}). A lens particle is H("rapp/1:particle", {source}) over its declared metadata and its perform source. params_hash is H("rapp/1:particle", params). Hashing uses the browser's WebCrypto.