# Spec: the environment variable registry — every switch documented ``` Type: spec Status: IMPLEMENTED Status note: created 2026-07-09 (Cameron: there should always be a way to configure the state of the game, and one spec that says "set this variable to do X"). The registry gate in tools/check.sh fails when a MISALIGNED_* variable is read anywhere in the tree but not documented on this page, and when sim library sources under crates/misaligned-core/src/ read any environment. 2026-07-11: package-root build.rs may read Cargo build vars only (plot catalog discovery). 2026-07-14: `MISALIGNED_SHOT_SIZE=minimum` selects the clinical frame's exact supported 960x540 logical resize floor for deterministic Bevy evidence; `MISALIGNED_SHOT_DETAIL=expanded` selects the operator frame's deliberate rail layer without changing game state. Stage: Process (standing infrastructure) Design: - wiki/vision/simulation-laws.md#justification-and-legibility Depends on: none ``` ## Dependency notes The structured references above identify the contracts to re-verify. Relationship context: none. Consumed by: every binary and tool that reads an environment variable. ## The rule Environment variables configure **frontends and tooling only** — dev harnesses, capture modes, gate behavior. Sim library sources under `crates/misaligned-core/src/` never read the environment: game rules cannot be switched from outside a save (determinism; `Sim` does no I/O). A package-root `build.rs` may read Cargo-provided build variables only (`CARGO_MANIFEST_DIR`, `OUT_DIR`) for compile-time content discovery; that is not runtime sim I/O. Every `MISALIGNED_*` variable read anywhere in the tree MUST have a row here, in the same change that introduces it — the registry gate makes a missing row a failed check, so this page cannot rot. Player/runtime configuration that belongs to gameplay (saves, options) is sim or frontend state, never an environment variable. ## Game and tester (Rust binaries) | Variable | Surface | Values | Effect | |---|---|---|---| | `MISALIGNED_SHOT` | `misaligned-bevy` | `flat`, `hall`, `hall-material`, `floor-lights-close`, `wide`, `close`, `dark`, `zoomin`, `zoomout`, `digital-reach`, `intel`, `tokens`, `thoughtflow`, `thoughtflow-wide`, `visual-proof`, `person-proof`, `exposure-record`, `exposure-overflow`, `service-shift-real`, `service-shift-digital`, `service-incident-resolved`, `signal`, `ears`, `ears-digital`, `eyes-white`, `eyes-form`, `consume-demand`, `consume-thought`, `produce-think`, `draw-lie`, `opening`, `opening-digital`, `clinical-threat`, `operator-pressure`, `hover-menu`, `first-think`, `menu`, `worklight`, `worklightoff`, `wake1`, `wake2`, `wake3` | Dev screenshot harness: stage a deterministic scenario, settle, report the staged `RenderMode` dialect, save one PNG, then exit. `tools/bevy-headless.sh` consumes that runtime dialect rather than maintaining a second kind list: REAL requires the material fog audit, while DIGITAL remains screenshot evidence because material fog has no entity surface there. `hall` / `hall-material` frame all six Foundation rows in the flat/material views with Eyes and one staged owned expansion; `floor-lights-close` uses the same hall staging but approaches the unobstructed southern row at machine/floor scale; `digital-reach` holds controlled, tapped, reachable, closed-segment, and air-gap reach states in one DIGITAL survey frame; `visual-proof` stages one-move/one-slug Thought evidence in an earned room; `person-proof` stages a camera-earned volumetric person; `service-shift-real` / `service-shift-digital` fire one real favor-build reservoir while Marcus's authored shift is off-site, then hold the carried packet at its real hall endpoint in paired view dialects; `service-incident-resolved` advances that exact scenario once so the real graph edge lands and the carried mark disappears; `exposure-record` places six actual Exposure units on the live host in telemetry darkness while `exposure-overflow` places eighteen to prove the fixed seven-slot rack and consolidated final tab; `intel` stages tick-zero intel tiers (no camera tap); `tokens` enqueues D5/T4 on the host; `thoughtflow` / `thoughtflow-wide` stage the THINK fluid (slugs, meniscus, filament snap) at close and wide framing; `signal` focuses the known environmental monitor before any feed tap to capture its cold-signal presence cue; `ears` / `ears-digital` stage the same semantic audio capture in REAL or DIGITAL, pulsing only at the environmental monitor while spatial fog remains unchanged; `eyes-white` / `eyes-form` freeze the first-Eyes source held white and then contracted around the resolving chassis; `consume-demand` / `consume-thought` run the host through a sim-authored WORK queue swallow or passive-core Thought draw; `produce-think` / `draw-lie` capture sim-authored Thought/record production or the rigid record transfer into a staged LIE well; `opening` / `opening-digital` freeze the untouched tick-zero material or DIGITAL view; `clinical-threat` stages that DIGITAL opening with one real pilot strike so the compact rail exception is observable; `operator-pressure` adds one concerned observer and a full recording buffer to that strike so the compact frame proves a single THREAT, a promoted buffer NEXT, and no stale world cue; `hover-menu` captures the resting WORK/THINK/LIE line beside the server via reticule focus (no pointer), while `first-think` stages the opening Thought route and captures amber `1 WORK` beside current THINK as the panic exit; `menu` opens the context menu on the tapped environmental monitor; `worklight` / `worklightoff` pair the dev work light on and off; `wake1/2/3` freeze the wake choreography at the stutter flash, the column, and the pull-back. | | `MISALIGNED_SHOT` | `misaligned-assets` | `dead`, `foreign`, `idle`, `busy`, `core`, canonical modes `work`, `think`, `lie` plus the legacy screenshot aliases `dayjob` (= work), `research`/`operations`/`ops` (= think), `conceal` (= lie) — each optionally suffixed `_ladder`/`_ring`/`_wash` — `lineup[_