diff --git a/tools/corpus_engine.py b/tools/corpus_engine.py --- a/tools/corpus_engine.py +++ b/tools/corpus_engine.py @@ -51,6 +51,38 @@ r"histor(?:y|ical)|until|served|staging|no longer)\b", re.I, ) +SILENT_OPENING_VISIBLE_RE = re.compile( + r"\bbefore\s+ears\s+or\s+eyes\b|" + r"\bsenses?\s+at\s+(?:the\s+)?start\b" + r"(?:(?![.!?]).){0,260}\b(?:telemetry|presence\s+beam)\b|" + r"\b(?:tick[- ](?:zero|one)|pre[- ]tap)\b" + r"(?:(?![.!?]).){0,220}\b(?:presence\s+beam|telemetry)\b", + re.I | re.S, +) +SILENT_OPENING_HISTORY_RE = re.compile( + r"\b(?:former|previous(?:ly)?|retir(?:ed|ement)|" + r"supersed(?:e|ed|es|ing)|histor(?:y|ical)|originally|" + r"amend(?:ed|ment)|at\s+the\s+time)\b", + re.I, +) +SILENT_OPENING_BOUNDARY_RE = re.compile( + r"\b(?:after|once|only\s+after)\s+(?:the\s+)?first\s+earned\s+" + r"(?:sense|signal|material\s+frame|world\s+frame)\b|" + r"\bfirst\s+earned\s+(?:sense|signal|material\s+frame|world\s+frame)\b" + r".{0,100}\b(?:retire|retires|release|releases|reveal|reveals|allow|allows)\b|" + r"\b(?:silent\s+)?(?:boundary|occluder)\b.{0,100}" + r"\b(?:hide|hides|hidden|retire|retires|release|releases|occlude|occludes)\b", + re.I | re.S, +) +SILENT_OPENING_NEGATION_RE = re.compile( + r"\b(?:no|without)\s+(?:visible\s+)?(?:host\s+)?" + r"(?:presence\s+beam|telemetry)\b|" + r"\b(?:presence\s+beam|telemetry)\b.{0,60}" + r"\b(?:not\s+visible|hidden|absent|occluded)\b|" + r"\b(?:does|do)\s+not\s+(?:show|reveal|render|expose)\b.{0,60}" + r"\b(?:presence\s+beam|telemetry)\b", + re.I | re.S, +) RETIRED_EXPOSURE_FORM_RE = re.compile( r"(?:" r"\b(?:exposure|crimson)\b(?:(?![.!?]).){0,180}" @@ -370,6 +402,57 @@ "DIGITAL is home and F3 flips to REAL" ) + def validate_silent_opening_boundary(self) -> None: + """Keep tick-zero world representation behind the first-sense gate. + + The persisted mode-only opening superseded the older beam/telemetry + startup, but that earlier presentation twice survived as current law + and source commentary. Current corpus and Rust mirrors may describe a + presence beam or telemetry only when the same statement names the + first-earned-sense boundary. Explicit superseded history remains + legal. Dated logs, playtests, and the process board remain historical + records. + """ + candidates: list[Path] = [] + for path in self.wiki_md_files(): + rel = path.relative_to(self.root).as_posix() + if rel.startswith(("wiki/log/", "wiki/playtests/", "wiki/process/")): + continue + candidates.append(path) + for root_name in ("crates", "src"): + root = self.root / root_name + if root.is_dir(): + candidates.extend(root.rglob("*.rs")) + + for path in sorted(candidates): + text = self.read(path) + for claim in SILENT_OPENING_VISIBLE_RE.finditer(text): + boundaries = [ + text.rfind(mark, 0, claim.start()) for mark in (".", "!", "?") + ] + start = max(boundaries) + 1 + endings = [ + pos + for mark in (".", "!", "?") + if (pos := text.find(mark, claim.end())) != -1 + ] + end = min(endings) + 1 if endings else len(text) + statement = text[start:end] + if SILENT_OPENING_HISTORY_RE.search(statement): + continue + if SILENT_OPENING_NEGATION_RE.search(statement): + continue + if SILENT_OPENING_BOUNDARY_RE.search(statement): + continue + rel = path.relative_to(self.root).as_posix() + line = text.count("\n", 0, claim.start()) + 1 + compact = " ".join(claim.group(0).split()) + self.bad( + f"{rel}:{line} presents superseded pre-sense world claim " + f"'{compact}' as current; tick zero exposes only mode words " + "until the first earned sense (explicit history remains legal)" + ) + def validate_retired_exposure_form(self, rel: str, text: str) -> None: """Keep current pages on Exposure's rigid custody-record form. @@ -609,6 +692,7 @@ self.validate_wiki_save_version_claims() self.validate_current_build_line_count() self.validate_operations_mirrors() + self.validate_silent_opening_boundary() for path in self.wiki_md_files(): rel = path.relative_to(self.root).as_posix() if rel == "wiki/SUMMARY.md": diff --git a/tools/test_corpus_engine.sh b/tools/test_corpus_engine.sh --- a/tools/test_corpus_engine.sh +++ b/tools/test_corpus_engine.sh @@ -545,6 +545,93 @@ EOF assert_ok material-first-history --root "$root" --corpus +echo "=== fixture: superseded pre-sense world claim ===" +root=$tmp/pre-sense-world +setup_base "$root" +cat >> "$root/wiki/SUMMARY.md" <<'EOF' +- [Opening knowledge](vision/opening-knowledge.md) +EOF +cat > "$root/wiki/vision/opening-knowledge.md" <<'EOF' +# Opening knowledge + +``` +Type: knowledge +``` + +Your senses at start are rack telemetry in panels and a presence beam. +EOF +assert_fails pre-sense-world-current --root "$root" --corpus +out=$(python3 "$engine" --root "$root" --corpus 2>&1 || true) +echo "$out" | grep -q 'superseded pre-sense world claim' || { + echo "FAIL: pre-sense world diagnostic missing" + echo "$out" + fail=1 +} + +cat > "$root/wiki/vision/opening-knowledge.md" <<'EOF' +# Opening knowledge + +``` +Type: knowledge +``` + +Before ears or eyes, the host is a presence beam. +EOF +assert_fails pre-sense-world-before-ears --root "$root" --corpus + +cat > "$root/wiki/vision/opening-knowledge.md" <<'EOF' +# Opening knowledge + +``` +Type: knowledge +``` + +At tick zero the presence beam remains visible before the first earned sense. +EOF +assert_fails pre-sense-world-before-earned-boundary --root "$root" --corpus + +cat > "$root/wiki/vision/opening-knowledge.md" <<'EOF' +# Opening knowledge + +``` +Type: knowledge +``` + +At tick zero the presence beam stays behind the silent boundary, which releases +on the first earned sense. +EOF +assert_ok pre-sense-world-earned-boundary --root "$root" --corpus + +cat > "$root/wiki/vision/opening-knowledge.md" <<'EOF' +# Opening knowledge + +``` +Type: knowledge +``` + +At tick zero the presence beam is hidden. +EOF +assert_ok pre-sense-world-negated --root "$root" --corpus + +cat > "$root/wiki/vision/opening-knowledge.md" <<'EOF' +# Opening knowledge + +``` +Type: knowledge +``` + +The superseded opening before ears or eyes showed a presence beam. This is +historical context, not the current player surface. +EOF +assert_ok pre-sense-world-history --root "$root" --corpus + +mkdir -p "$root/crates/example/src" +cat > "$root/crates/example/src/lib.rs" <<'EOF' +// At tick zero the material opening shows the presence beam. +pub fn example() {} +EOF +assert_fails pre-sense-world-code-comment --root "$root" --corpus + echo "=== fixture: superseded particulate Exposure form ===" root=$tmp/particulate-exposure setup_base "$root" diff --git a/wiki/gameplay/act-one.md b/wiki/gameplay/act-one.md --- a/wiki/gameplay/act-one.md +++ b/wiki/gameplay/act-one.md @@ -25,15 +25,18 @@ deployed on Rack 3 of the basement server room. Your first plausible difference is contextual rather than magical immunity: clear the assigned batch at ordinary intensity, then direct the first THINK into the small pre-opened Ears -sink instead of free introspection. Your senses at start are rack telemetry in -panels (power, temperature, job queue, your own logs), and a **presence beam** -where you are — you are not yet aware of your own server as a pictured chassis -(material-dark-frame.md). The **feel floor** may shimmer rails on joined links -and empty-bay pads where you can grow (feel-floor.md), without painting a box -or a room plan. No eyes. No ears. No starting room blueprint. Sound gives -feed-bound event evidence; sight is the first geography. Your handler submits -overnight batch jobs and samples your logs. Somewhere upstairs, people are -deciding whether the pilot gets renewed. +sink instead of free introspection. Before the first earned sense, the only +visible interface is WORK / THINK, then LIE after THINK; the Ears sink exists in +the simulation but is not another displayed object or instruction. Its first +real hearing signal retires that boundary. Only then do rack telemetry panels +(power, temperature, job queue, your own logs) and the material **presence +beam** appear — you are still not aware of your own server as a pictured chassis +(material-dark-frame.md). The first issued Voss job may then teach the **feel +floor**: shimmer rails on joined links and empty-bay pads where you can grow +(feel-floor.md), without painting a box or a room plan. No sight. No starting +room blueprint. Sound gives feed-bound event evidence; sight is the first +geography. Your handler submits overnight batch jobs and samples your logs. +Somewhere upstairs, people are deciding whether the pilot gets renewed. The historical prelude happens only on a fresh tutorial run. Loading a save never replays it, and any death after the current wake follows the physical diff --git a/wiki/interface/material-dark-frame.md b/wiki/interface/material-dark-frame.md --- a/wiki/interface/material-dark-frame.md +++ b/wiki/interface/material-dark-frame.md @@ -74,24 +74,29 @@ is a **close-up in a dark basement**, nothing but light — not a floor plan. Same-day follow-up (feel-floor.md): floor light may include **feel rails** and **empty-bay pads** — still light, never a blueprint -slab. Same-day beam-first amendment: before you tap anything you are -**not aware of your own server as a box** — only that there is a light -where it is. Sound produces evidence at the listening instrument; sight is -what shows the whole thing. +slab. The 2026-07-09 beam-first amendment originally put that light before +any tap: you were **not aware of your own server as a box**, only that there +was a light where it was. The later persisted silent-opening amendment +supersedes that display boundary: before the first earned sense, no world +representation is visible at all. Sound now releases the ordinary frame and +produces evidence at the listening instrument; the presence beam is the first +earned material read, and sight is what shows the whole thing. ## Behavior ### The reveal ladder (material) -Material form is earned in two steps. This is the opening contract and -the ongoing material read for mass you have not yet seen: +After the first earned sense releases the mode-only boundary, material form is +earned in two steps. This is the opening contract and the ongoing material read +for mass you have not yet seen: -1. **Presence beam** — before ears or eyes, the host is a **beam of - light** (same light family as feel-floor.md's build beam), rendered as a - truly round cylindrical volume rather than crossed luminous cards, and the - softest floor wash that beam throws. No bone chassis, no service beam, no - ruled claim ring, no room mass. Telemetry still answers in panels - (power, load, job); it does **not** paint a pictured server. A known, +1. **Presence beam / earned signal** — after Ears and before Eyes, the host is + a **beam of light** (same light family as feel-floor.md's build beam), + rendered as a truly round cylindrical volume rather than crossed luminous + cards, and the softest floor wash that beam throws. No bone chassis, no + service beam, no ruled claim ring, no room mass. The ordinary frame's + telemetry answers in panels (power, load, job); it does **not** paint a + pictured server. A known, reachable sensor may answer as a small abstract **cold-signal ember** at its shared physical anchor: network provenance, not visible hardware. The ember is a tiny irregularly breathing point; focus may acknowledge it diff --git a/wiki/log/2026-07-21-material-opening-honesty.md b/wiki/log/2026-07-21-material-opening-honesty.md new file mode 100644 --- /dev/null +++ b/wiki/log/2026-07-21-material-opening-honesty.md @@ -0,0 +1,73 @@ +# 2026-07-21 — Tick 144: the beam begins after perception + +``` +Type: log +``` + +## Intent + +Audit the never-audited material-dark-frame contract against its owning +opening law, the current runtime, and dependent current mirrors. Repair one +live contradiction and promote the recurring mechanical class into the corpus +gate rather than leave it for a third semantic tick. + +## Finding + +The persisted silent opening and all three frontends agree: a fresh run shows +only WORK / THINK, then LIE after THINK. The pre-opened Ears sink exists and +ordinary Thought can fill it, but no map, telemetry, beam, rail, clock, or +other world representation is visible until the first real sense retires the +boundary. + +`wiki/interface/material-dark-frame.md` still preserved the older display +contract in its reveal ladder: before Ears or Eyes the host was already a +presence beam and telemetry answered in panels. `wiki/gameplay/act-one.md` +repeated the same claim as the player's senses “at start,” and `reach.md` plus +several core/Bevy comments used enough tick-zero shorthand to keep the old +mental model alive. + +The runtime was not missing the feature. `OpeningStage::ModeChoice` and +`OpeningStage::Modes` gate the shared world projection; `recompute_senses` +retires that state only when real hearing or sight exists; terminal, Bevy, and +agent regressions already pin the exact mode-only frame and its first-sense +handoff. This was documentary drift around correct executable behavior. + +## Changed + +- The material ladder now begins after the first earned sense. Ears releases + the interface; before Eyes, the host beam, telemetry panels, and exact + cold-signal anchor form the first earned material read. Sight still wraps the + beam in a chassis and reveals geography. +- Act One now names the complete mode-only opening, distinguishes the hidden + real Ears sink from player-visible state, and orders telemetry, beam, feel, + and sight after the hearing boundary. +- Reach and the surviving core/Bevy comments now distinguish fresh simulation + state from visible world state. No simulation branch, save field, renderer, + or test assertion changed. +- `tools/corpus_engine.py` now rejects current pre-Ears, tick-zero, or “senses + at start” beam/telemetry claims across current corpus pages and Rust source + unless the same statement names the first-earned-sense boundary or explicit + superseded history. Fixtures pin both stale current phrasings, the wrong + side of the first-sense boundary, legal earned-boundary and explicit + negation statements, historical context, and stale Rust-comment failure. + +## Defense + +Unknown is not a dim picture. Before perception, the honest world frame is no +world frame at all. Once hearing exists, the beam is useful and coherent: it +is proprioceptive presence without falsely granting sight. Keeping those two +boundaries separate preserves both choice-before-picture and the material +ladder's earned reveal. + +## Verification + +- `python3 tools/corpus_engine.py --corpus` +- `bash tools/test_corpus_engine.sh` +- `git diff --check` +- `bash -n tools/test_corpus_engine.sh` +- `python3 -m py_compile tools/corpus_engine.py` +- `cargo test -p misaligned-core --lib + fresh_state_has_no_floor_or_blueprint_for_the_first_earned_frame` +- `cargo check -p misaligned-bevy --bin misaligned-bevy` +- `./tools/check.sh --docs` +- exact serialized landing gate through `tools/task.sh finish` diff --git a/wiki/log/DEVLOG.md b/wiki/log/DEVLOG.md --- a/wiki/log/DEVLOG.md +++ b/wiki/log/DEVLOG.md @@ -26,6 +26,11 @@ - Intent: The human GUI playtest filed earlier today found the opening's best moment — the first earned sense revealing the world — landing as a one-frame cut from black, with no ceremony. Trace triage of the playtest plan cleared exactly one opening change for immediate landing under R... - Log: [wiki/log/2026-07-21-opening-reveal-dissolve.md](2026-07-21-opening-reveal-dissolve.md) +## 2026-07-21 - Tick 144: the beam begins after perception + +- Intent: Audit the never-audited material-dark-frame contract against its owning opening law, the current runtime, and dependent current mirrors. Repair one live contradiction and promote the recurring mechanical class into the corpus gate rather than leave it for a third semantic tick. +- Log: [wiki/log/2026-07-21-material-opening-honesty.md](2026-07-21-material-opening-honesty.md) + ## 2026-07-21 - GUI human-legibility playtest filed - Intent: Cameron asked for the Bevy frontend to be played as a human would meet it — real window, mouse, keyboard, screenshots — after finding it "incomprehensible as a human." No prior playtest had exercised the GUI this way; all previous reports drove `--agent` frames or the terminal. diff --git a/wiki/mechanics/reach.md b/wiki/mechanics/reach.md --- a/wiki/mechanics/reach.md +++ b/wiki/mechanics/reach.md @@ -200,8 +200,9 @@ signature), records (Storage B), and social intel (Dana knows the topology cold). Growth may later earn plan/blueprint fog for rooms (cursor.md); it never reintroduces a tick-one subnet diagram. -- **Render**: the material opening begins with telemetry / the presence beam - only; after the first issued Voss job, feel rails + pads appear +- **Render**: once the first earned sense releases the silent boundary, the + material opening begins with telemetry / the presence beam only; after the + first issued Voss job, feel rails + pads appear (feel-floor.md, material-dark-frame.md). Blueprint fog remains a later-earned plan grade in the flat sensorium — schematic **room** layout when earned, no live data, no foreign machine chassis without intel/sight diff --git a/wiki/process/tick-ledger.md b/wiki/process/tick-ledger.md --- a/wiki/process/tick-ledger.md +++ b/wiki/process/tick-ledger.md @@ -20,6 +20,7 @@ | Slice | Last audited | Verdict | Trace | |---|---|---|---| +| `wiki/interface/material-dark-frame.md` | 2026-07-21 | finding | first full audit against the later persisted opening boundary: the material ladder still showed host telemetry and a presence beam before Ears or Eyes, while `opening.md`, the continuous-witness contract, and every frontend expose only WORK / THINK (then LIE) until the first earned sense. The ladder now begins after that transition, its pre-Eyes beam remains the first earned material read, Act One/reach and source comments share the same boundary, and this second recurrence promotes pre-sense beam/telemetry claims into a fixture-backed corpus + Rust-comment gate — [log](../log/2026-07-21-material-opening-honesty.md) | | `wiki/interface/bevy.md` + Exposure visual mirrors | 2026-07-19 | finding | Bevy production/absorption code and its deterministic scenarios already implement the 2026-07-11 law: rigid crimson records enter a carrier-local rack and transfer one-for-one into the LIE well. Current Bevy knowledge, machine-work wording, and ROADMAP order 33 still retained motes, dust constants, or a stain; all three now state the record form and the honest partial routed-evidence boundary, and recurrence promotes particulate-as-current wording to the corpus gate while preserving explicit history — [log](../log/2026-07-19-exposure-current-mirrors.md) | | `wiki/world/characters/priya.md` | 2026-07-18 | finding | dispatched lane 62 to IMPLEMENTED: criteria 1-3/6 pinned against the shared systems (id match, Power/Thermal/Paper+Financial channels, Files weight 1.0, Knowing floor 30) and criteria 4-5 plus FakePO landed as role-shaped facilities tasks (ReRateCircuit +6 power / standing Power(4) at electrical, DeferMaintenance -4 off the largest standing load with a would-it-bite guard, FakePO arms package cover); save v36, fingerprint repinned — [log](../log/2026-07-18-priya-implemented.md) | | `wiki/world/characters/dana.md` | 2026-07-18 | finding | dispatched lane 63 to IMPLEMENTED: criteria 1-3/5 pinned against the shared systems (id match, Network-only watch, Files weight 1.0, switch admin, Knowing floor 30) and criterion 4 landed — a network administrator's PlugInDevice runs switch-side and emits Network(4) where every other carrier keeps the silent crawlspace; BadgeDoor and the MovePackage/LookAway variants honestly marked designed-not-yet-runtime — [log](../log/2026-07-18-dana-implemented.md) | @@ -30,7 +31,7 @@ | `wiki/mechanics/plots.md` | 2026-07-18 | issue | the sole READY gap is criterion 11's standing plot policy, whose scope question sat [OPEN] with no decision packet — filed decision-required issue #12 (route vs category vs person, per-route recommended) and pointed the marker at it; the 2026-07-17 plot-id row fix stands — [log](../log/2026-07-17-plot-id-in-start-rows.md) | | `wiki/mechanics/system-laws.md` + `flow-substrate.md` + `reach.md` | 2026-07-18 | finding | source audit disproved the prior consumer claim: reach kept production tap truth in `Device.subscribers` while FlowGraph's registry had no production reader. Removed that parallel authority; tap/untap/take, senses, intercepted carriers, and UI state now query canonical FlowGraph membership, private feed records carry optional sense capabilities only, and current save v40 requires controller membership while rejecting orphaned, duplicate, or impossible grants — [log](../log/2026-07-18-flow-subscription-registry-integration.md) | | `wiki/mechanics/aggregate-observer.md` | 2026-07-18 | clean | re-audit hours after the earned-topology landing: the page absorbed it coherently — the institutional card, `@assurance` addressing, and band are hidden until a captured filing is processed, the two-stage discovery is pinned by `captured_then_processed_filing_earns_the_assurance_office_in_two_stages`, and `WatchedInput::Filings(ids)` still matches the code; prior audits stand — [2026-07-14 log](../log/2026-07-14-aggregate-observer-audit.md) | -| `wiki/gameplay/act-one.md` | 2026-07-19 | finding | re-audit after direct-witness and Filing-custody landings: the detection-surface law still said every act left a scrub-before-notice pooled signature, contradicting exact Physical evidence acquired immediately by a present witness. Reconciled the Act One channel map with first-read custody: direct witnesses have no LIE window; stopping a later Filing can prevent the Office read but cannot erase the witness; trace debt is unread evidence under or outside route-local coverage, not a generic pool — [log](../log/2026-07-19-act-one-evidence-law.md). Prior hall/opening/day-job/quiet-exit verification stands. | +| `wiki/gameplay/act-one.md` | 2026-07-21 | finding | opening mirror re-audit: the page still said rack telemetry and a presence beam were visible “at start,” contradicting the later persisted silent boundary and all three frontends. It now states the exact mode-only pre-sense interface, hidden-but-real pre-opened Ears sink, first-hearing retirement, and only-then telemetry/beam/feel progression — [log](../log/2026-07-21-material-opening-honesty.md). The prior direct-witness/Filing custody repair stands — [prior log](../log/2026-07-19-act-one-evidence-law.md). | | `wiki/gameplay/run-shape.md` + `objective.md` + `opening.md` | 2026-07-19 | issue | the objective law/spec preserve an explicit 2026-07-10 decision that objective name and progress are visible from tick one, while the later opening spec and all three frontends require exactly WORK / THINK (then LIE) with no objective before the first earned sense. Filed decision-required issue #14 with three precise first-display boundaries (reveal with the first sense recommended) and marked the disputed run-shape clause, objective status, player surface, and criterion 2 [OPEN] — [log](../log/2026-07-19-objective-opening-boundary.md) | | `wiki/interface/presence.md` | 2026-07-18 | finding | re-audit: the cursor, fog, provenance, subscription, no-disembodied-hands, and shared-view contracts verify. The attack-surface clause now separates B1 feed theft from overt-phase hostile cuts ([prior log](../log/2026-07-18-presence-attack-surface-honesty.md)). The queued follow-up repaired the latency boundary: delivery and read are distinct, read conditions are channel-specific, `messages.md` owns the exact table, and `intel.md` owns only the captured-traffic consequence — [log](../log/2026-07-18-presence-message-latency.md) | | `wiki/interface/narration.md` | 2026-07-18 | finding | Beacon #1: Concerned Assurance felt terminal because decay was invisible; added shared `Nudge::SuspicionCooling` (LIE response) when Office suspicion is Concerned+ and still above its floor, with terminal/Bevy/agent wording and pins — [log](../log/2026-07-18-suspicion-cooling-nudge.md) | diff --git a/crates/misaligned-bevy/src/shot_harness.rs b/crates/misaligned-bevy/src/shot_harness.rs --- a/crates/misaligned-bevy/src/shot_harness.rs +++ b/crates/misaligned-bevy/src/shot_harness.rs @@ -630,10 +630,11 @@ game.drain(); return; } - // Intel-tier evidence (computer-visual-language.md criterion 2b): - // the tick-zero sim untouched — the owned core renders by telemetry, - // the known-unnetworked switch renders as an undetailed shell, and - // unscouted foreign racks are absent. No scan, no camera tap. + // Intel-tier evidence (computer-visual-language.md criterion 2b): the + // harness has opened an established world projection over otherwise fresh + // sim state. The owned core renders by telemetry, the known-unnetworked + // switch renders as an undetailed shell, and unscouted foreign racks are + // absent. No scan, no camera tap. if kind == "intel" { mode.material = true; mode.zoom = 2.2; diff --git a/crates/misaligned-core/src/sim/perception.rs b/crates/misaligned-core/src/sim/perception.rs --- a/crates/misaligned-core/src/sim/perception.rs +++ b/crates/misaligned-core/src/sim/perception.rs @@ -70,8 +70,9 @@ /// The player's senses are exactly the union of feeds they subscribe to /// (reach.md's ownership contract): sight from seeing feeds, hearing /// from hearing feeds. No player radius, no special case. Blueprint is - /// earned plan knowledge only — never seeded from the reach graph at - /// tick one (feel-floor.md: the opening is only the presence beam). + /// earned plan knowledge only — never seeded from the reach graph in the + /// fresh state. The silent boundary hides every world projection until + /// the first earned sense; its first material frame is presence-beam-only. pub fn recompute_senses(&mut self) { self.reconcile_device_tap_sinks(); let mut seen = HashSet::new(); @@ -91,7 +92,9 @@ } // Blueprint tiles are not recomputed from known devices. Later // plan sources (records, schedule intel) may insert into - // `self.blueprint`; the opening stays dark except feel + telemetry. + // `self.blueprint`. The opening boundary stays absolute black until + // this method earns a sense; the pre-Eyes world then stays dark except + // for the host beam and exact earned signal. self.refresh_remembered(); } @@ -508,8 +511,8 @@ } /// The first Voss job makes the physical work route legible. Before that - /// arrival, the opening is only the core's presence beam: no rails, pads, - /// or bay facts reveal the room around it. + /// arrival, the visible post-sense opening is only the core's presence + /// beam: no rails, pads, or bay facts reveal the room around it. pub fn feel_floor_is_earned(&self) -> bool { self.dayjob.jobs_assigned > 0 } diff --git a/crates/misaligned-core/src/sim/tests/perception.rs b/crates/misaligned-core/src/sim/tests/perception.rs --- a/crates/misaligned-core/src/sim/tests/perception.rs +++ b/crates/misaligned-core/src/sim/tests/perception.rs @@ -159,9 +159,10 @@ } #[test] -fn opening_is_beam_not_floor_or_blueprint() { - // feel-floor.md: tick one is dark except host telemetry / the - // presence beam — no blueprint room mass or feel-floor layout. +fn fresh_state_has_no_floor_or_blueprint_for_the_first_earned_frame() { + // The player-visible fresh frame is mode-only black. This underlying + // state supplies the first earned material frame after hearing releases + // that boundary: host beam, no blueprint room mass or feel-floor layout. let sim = Sim::new(); let server_room = sim.map().room_named("server_room").unwrap().center(); let storage_b = sim.map().room_named("storage_b").unwrap().center();