diff --git a/crates/misaligned-bevy/src/main.rs b/crates/misaligned-bevy/src/main.rs index 709bacc4..ba9b05cd 100644 --- a/crates/misaligned-bevy/src/main.rs +++ b/crates/misaligned-bevy/src/main.rs @@ -7824,8 +7824,11 @@ fn render_held_choice( else { return; }; - // Operations owns its own held surface; do not double-draw the card. - let card = (game.ops.is_none()) + // The read is DIGITAL's treatment; REAL stays deferred (digital-read.md). + // A REAL player still answers a held choice through Operations, as before + // the drill-tier card existed. Operations also owns its own held surface, + // so do not double-draw there either. + let card = (!mode.material && game.ops.is_none()) .then(|| game.sim.held_choice_cards().into_iter().next()) .flatten(); let Some(card) = card else { @@ -9025,10 +9028,12 @@ fn render_hover_verb_bar( .unwrap_or_default(); // The pre-commit receipt for the leading device verb: cost + expected // signature + observer + band from ActionDesc unmodified - // (digital-read.md criterion 2); emission-free verbs say so. + // (digital-read.md criterion 2); emission-free verbs say so. The read is + // DIGITAL's treatment; REAL stays deferred, so the receipt is blank there. if let Ok(mut receipt_text) = receipt.single_mut() { - receipt_text.0 = target - .device + receipt_text.0 = (!mode.material) + .then_some(target.device) + .flatten() .and_then(|id| { game.sim .available_actions(Anchor::Device(id)) diff --git a/wiki/interface/digital-read.md b/wiki/interface/digital-read.md index bab248e3..07e79128 100644 --- a/wiki/interface/digital-read.md +++ b/wiki/interface/digital-read.md @@ -95,6 +95,17 @@ Status note: adopted 2026-07-15 from the Fable playtest debrief (report: criterion. **The only item before IMPLEMENTED is decision #9** (criterion 6, intel levels — small-model / pre-authored / leveled-plot summary source); criteria 1-5, 7, and 8 are landed and visually validated. + 2026-07-15 D7 (correctness pass on the REAL-deferred clause): the held + drill-tier card and the reticle receipt now render in DIGITAL only — a + REAL player answers a held choice through Operations, as before the + card existed; world-space sentences were already DIGITAL-only via their + `Flat2dRoot` parent. Interpretation made explicit: the rail READ block + remains in both dialects because the instrument rail is shared chrome + under the clinical-frame rail contract, and the deferred clause bars + standing anchor sentences *in the material world*, not rail lines. The + dev two-pane (F8) stays available in both dialects by design (a debug + instrument, not a player surface). REAL frame re-captured and reviewed: + dial, rail, and Operations unchanged, no receipt leak. Stage: B1 — The Basement Work order: digital-read Work priority: 27 diff --git a/wiki/log/2026-07-15-digital-read-d7-real-gate.md b/wiki/log/2026-07-15-digital-read-d7-real-gate.md new file mode 100644 index 00000000..a7c8b650 --- /dev/null +++ b/wiki/log/2026-07-15-digital-read-d7-real-gate.md @@ -0,0 +1,29 @@ +# digital-read D7: honoring the REAL-deferred clause + +``` +Type: log +``` + +A correctness pass on my own D2-D3 work. The spec's "REAL stays +deferred" clause bars the read from the material dialect, but the held +drill-tier card, its dim overlay, and the reticle receipt row were +top-level UI with no dialect gate — they leaked into REAL. Both now +render in DIGITAL only: a REAL player answers a held choice through +Operations exactly as before the card existed, and the receipt row is +blank in REAL. World-space sentences were never affected (their +Flat2dRoot parent already hides them in the material dialect). + +Two interpretations made explicit in the status note rather than left as +drift: the rail READ block remains in both dialects, because the +instrument rail is shared chrome under the clinical-frame rail contract +and the deferred clause bars standing anchor sentences in the material +*world*, not rail lines; and the dev two-pane (F8) stays available in +both dialects by design — it is a debug instrument outside the player +surface. + +Verified by a re-captured REAL frame (hover-menu harness): dial, rail, +and Operations unchanged, no receipt line. Frontend gate green. + +Defense: wiki/interface/digital-read.md "REAL stays deferred" — the code +violated the clause this spec itself binds; the fix restores it and the +note records the two boundary interpretations so they are decisions. diff --git a/wiki/log/DEVLOG.md b/wiki/log/DEVLOG.md index 94d3e9e9..42d9976e 100644 --- a/wiki/log/DEVLOG.md +++ b/wiki/log/DEVLOG.md @@ -26,6 +26,11 @@ add or amend a session log, then re-run the generator. - Intent: (see session log) - Log: [wiki/log/2026-07-15-digital-read-design-session.md](2026-07-15-digital-read-design-session.md) +## 2026-07-15 - digital-read D7: honoring the REAL-deferred clause + +- Intent: (see session log) +- Log: [wiki/log/2026-07-15-digital-read-d7-real-gate.md](2026-07-15-digital-read-d7-real-gate.md) + ## 2026-07-15 - digital-read D6: the warmed standing emission, captured - Intent: (see session log)