What stayed true, and how you can check.
The memory layer is the seam between "what a single frame said" and "what has been true over time". Everything in it is deliberately bounded — a 24/7 watch must never leak memory — and every drop, denial, and dereference failure is typed and observable rather than silent.
Episodes
Repeated observations are grouped into bounded episodes: spans of time over which a condition held for a subject. The EpisodeLog decides continuation by a conjunction — same subject, still open, within the gap tolerance, no mutating change — so an episode remembers what stayed true rather than re-announcing it frame by frame. Episodes are what absence, duration, and "still going" reasoning are built on.
The entity graph and the cup problem
Identity is established below the LLM and handed up as a stable symbol. The EntityGraph tracks entities across observations with a motion model and two kinds of identity: continuity (the thing that never left view) and appearance (the thing that looks the same). That split is the "cup problem" — two identical cups on a counter are the same by appearance but different by continuity, and "which cup is this" must be answered before the model is ever asked. Assertion beats observation: a caller-asserted attribute outranks what a frame appears to show.
Opaque evidence handles (ADR-003)
Decisions carry handles, not raw frames. An EvidenceHandle is opaque — it contains no pixels — and the bytes it names live in an EvidenceStore with a retention and eviction policy. Retained bytes scale with episode count, never with source resolution or observation count, which is what keeps a 24/7 watch bounded by design.
Dereference is fail-safe and never silently empty: it yields a real evidence artifact or exactly one of four typed failures. Every bound-driven drop and eviction is traced, never silent. Trace bundles ship no media by default — pixels leave the machine only on explicit opt-in.
Incidents
A gate FIRE becomes a durable Incident: the record of one rising edge, carrying its goal, verdict, and evidence handles. Incident creation passes through an attention policy that clamps delivery volume, and delivery is idempotent — incidents are deduplicated by id on redelivery, so a retried webhook never becomes a second alarm.
Trace, replay, visualizer — one funnel
There is exactly one definition of the diagnostic funnel a watch loop moves evidence through — seen → gated → judged → refused → fired — and percept doctor, percept eval, and the visualizer all read it from the same object. Three tools, one story; they cannot disagree.
- A run emits
TraceEvents; aTraceRecorderstructures them into a portable.ptracebundle (media opt-in, off by default). - Replay never calls a model. A recorded run replays deterministically, bit-for-bit, with zero API spend.
- The visualizer makes zero network requests — a self-contained offline HTML page.
- No false numbers: an unpriced call renders
—, not$0.00; a dropped record surfaces as its own record.
Related reading
- Cognition pipeline — the gate that decides which observations become incidents.
- API reference — how hosted runs return incidents, trace, and provenance.