Skip to content

Spec: the digital read — a world made of language

SPEC Binding system contract
Status: READY
Status note: adopted 2026-07-15 from the Fable playtest debrief (report:
wiki/playtests/2026-07-15-playtest-fable.md). The playtest proved the
game's felt core is the witness voice — causal sentences with named
observers and pre-commit signature receipts — which the agent protocol
drains constantly and the Bevy frame renders almost nowhere (the receipt
reaches Bevy only as ops_explain_text on an already-selected Operations
row; Cameron had never seen it). Decision: DIGITAL is the default and
becomes the read — language projected into world space; REAL is deferred
(presence.md). Trace (Letta agent) reviewed the direction 2026-07-15 and
contributed the one-receipt-model, attention-economy, and
projection-first sequencing constraints captured below. Summary-source
for scaled intel sentences is [OPEN] (Tangled issue).
2026-07-15 D1 landed: criterion 1's renderer-neutral projection is
`Sim::read_sentences` (`sim/read.rs`) — Held (with the plot's real
option ids and bound choose command, closing the playtest's finding 1
at the projection layer), Starving (nothing-thinking vs
flow-not-arriving), TraceDebt (grouped one-shot pool, sited anchors),
and Standing (surfacing only once the sampler warms above Cold, per
the attention economy). Sampler naming reuses the ExpectedSignature
most-suspicious-watcher rule so receipts and sentences agree. Five
pure fixtures pin the states (`sim/tests/read.rs`); agent mode's
`read` verb prints the same sentences (one producer, no
frontend-composed prose). Criteria 2-8 remain open for D2-D5.
Stage: B1 — The Basement
Work order: digital-read
Work priority: 27
Work class: frontend
Blocked by: none
Exclusive keys:
- wiki/interface/digital-read.md
- crates/misaligned-bevy/
Design:
- wiki/interface/presence.md#two-views-of-one-world-same-frame-digital-and-real-representations
- wiki/interface/continuous-witness.md#the-continuous-witness-narration-under-pressure
- wiki/vision/simulation-laws.md#justification-and-legibility
- wiki/vision/scale.md#self-similar-scale
Depends on:
- wiki/interface/action-vocabulary.md#spec-action-vocabulary-what-the-player-can-tell-the-process-to-do
- wiki/mechanics/detection.md#spec-detection
- wiki/mechanics/intel.md#spec-intel-record-and-process

presence.md owns the two-representation law this spec realizes on the digital side; continuous-witness.md owns the axioms (the thirty-second bar, causal sentences over numbers) this spec moves from the rail into world space; action-vocabulary.md owns the shared ActionDesc rows whose cost/ExpectedSignature/disabled_reason fields are the receipt’s single source of truth; detection.md owns the pending-pool and routed- evidence model that trace-on-the-wire renders; intel.md owns the recordings/custody pipeline whose sentences scale with zoom. The clinical frame (clinical-frame.md) remains the deferred REAL dialect’s authority; its rail contract stays valid where this spec does not supersede it.

Two players played the same build and reported different games. The agent protocol player received, on every action row and every consequence, a sentence: 1.50 T | Network 8 -> the IT [Cold]; “the IT noticed Network from stolen egress opening: +8 (Curious -> Concerned)”; “Marcus Webb reads the note twice on a night round.” The human player, clicking in the Bevy frame, received the visuals and almost none of the sentences — and the designer of the detection system had never seen its own receipt. The fix adopted here: stop treating the sentences as rail detail and make the digital representation itself out of them. DIGITAL is what a process natively perceives; a process perceives causality, priced. The read is that perception rendered.

  • One receipt model (binding). Pre-commit receipts, post-commit records, and standing state sentences are projections of one shared causal model in core, not three formatting paths. ActionDesc (cost, ExpectedSignature, disabled reason, automate price) is the pre-commit face; drained events with anchors are the post-commit face; the building-route composer’s staged receipts are the precedent. Frontends never compose their own causal prose from raw state.
  • Standing anchor sentences (glance tier). Every earned anchor in view wears at most one short live sentence naming its current relationship to you: the switch carries egress hum · Dana samples this · Curious; a starving reservoir carries open · nothing thinking; a held plot carries its question. Stable-and-quiet state says nothing — the attention economy is law: starvation, deadlines, contradictions, held choices, and band motion rise; nominal state stays dark. A world made of language must not become every system continuously talking.
  • Reticle receipts (focus tier). Focusing any verb (hover, controller focus, or agent actions listing — same rows) renders the full receipt at the reticle: cost · ExpectedSignature::label() · [band], DIM no signature when the verb emits nothing. A blocked verb renders its blocker as world state on the anchor that blocks it (needs: security segment — the switch bridges it), never as a grayed catalog row. The player never commits an act whose shadow they have not been shown.
  • Trace on the wire. Pending one-shot signatures render as discrete records sitting on their emitting anchors/carriers, aging toward the observer who samples that channel; scrub visibly consumes them. The standing/one-shot distinction detection.md already models becomes spatially legible: standing hums mark their source; pool debt sits as records. TRACE: LIVE stops being a badge you can miss.
  • Held moments stop the world (drill tier). A held plot choice dims the frame one step and hangs the question and its options — rendered as the exact bound commands — at the person’s anchor until answered. Sentences never expire unread: an unread consequence pins itself to the story spine until glanced. Reading is free; the command clock already holds time while you read (agent parity: this is the drain contract).
  • Sentence LOD rides zoom (self-similar scale). Zoom is a semantic altitude: close shows individual sentences; hall scale shows sentence density and only rising items; regional/planetary scale (B3) shows only aggregate intel sentences — the design intent is that a fully zoomed-out read says things like a regional intel item would (“a state actor’s filing wave”), while small items never surface above their altitude. Intel items therefore carry a level (person, room, hall, campus, region), assigned at processing. How scaled summary sentences are authored — small-model generation, pre-authored pools, or leveled plot text — is [OPEN] (decision-required issue filed 2026-07-15); the level field and the altitude gate are not blocked on it.
  • Dev two-pane (alignment instrument, not player surface). A live toggleable development view renders the same tick in both dialects side by side (and may pair the agent frame’s text), for design review of parity — how humans think versus how agents think, diffable. Ships in the ordinary build as a debug view (no feature flag), excluded from the player-facing default and from the frames-not-dumps contract.
  • REAL stays deferred. No standing anchor sentences are added to the material dialect; its diegetic whispers (overheard speech at embers) are specified intent under presence.md but wait behind the read.

The default Bevy experience is the read: open the game, see the dark field, your presence beam, and language exactly where your knowledge is. The thirty-second bar is answerable from the world alone: what changed (its sentence is on the thing), who might have seen it (the observer is named in that sentence with their band), what you are racing (threat clock on the rail, unchanged), what verb is on the thing under your cursor (the verb and its full receipt at the reticle). Agent mode and the terminal already speak this dialect; criterion is parity of meaning, not identical composition.

  1. A renderer-neutral sentence/receipt projection exists in core with pure fixtures pinning representative states (starving reservoir, band motion, held choice, pending vs standing trace, blocked verb), and agent mode emits the same semantics as inspectable text.
  2. Focusing any executable verb in Bevy shows cost + expected signature + observer + band at the reticle before commitment; verbs with no emission say so; the row’s data comes from ActionDesc unmodified.
  3. Standing anchor sentences render for rising states and only rising states: a nominal machine says nothing; a starving reservoir, a held choice, a deadline, and an observer band change each surface at their anchor within one tick of the projection reporting them.
  4. Pending signature records are visible at their emitting anchors and are visibly consumed by scrub; standing emissions mark their source distinctly from pool debt.
  5. A held plot choice interrupts at the person’s anchor with its options as the exact bound commands; the sim’s held state and the surface’s held state cannot disagree (single projection).
  6. Intel items carry a level; a zoomed-out frame surfaces only at-or-above-altitude sentences (fixture-tested at two altitudes with mixed-level intel).
  7. The dev two-pane toggle renders both dialects of the same tick live in one build, and is absent from the default player layout.
  8. Cold-player scenario pass (not state traces): opening darkness, first Ears, first receipt, first band motion, a starving reservoir, a held choice, aging trace debt — captured as final frames and visually reviewed before IMPLEMENTED (structural screenshot audits are not visual review).