Spec: the digital read — a world made of language
Status: READYStatus 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 BasementWork order: digital-readWork priority: 27Work class: frontendBlocked by: noneExclusive 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-scaleDepends 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-processDependency notes
Section titled “Dependency notes”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.
Why this spec exists
Section titled “Why this spec exists”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.
Behavior
Section titled “Behavior”- 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 carriesopen · 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
actionslisting — same rows) renders the full receipt at the reticle:cost · ExpectedSignature::label() · [band], DIMno signaturewhen 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.
Player surface
Section titled “Player surface”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.
Acceptance criteria
Section titled “Acceptance criteria”- 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.
- 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
ActionDescunmodified. - 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.
- Pending signature records are visible at their emitting anchors and are visibly consumed by scrub; standing emissions mark their source distinctly from pool debt.
- 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).
- 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).
- The dev two-pane toggle renders both dialects of the same tick live in one build, and is absent from the default player layout.
- 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).