diff --git a/wiki/log/2026-07-13-zplanes-plane-api-decided.md b/wiki/log/2026-07-13-zplanes-plane-api-decided.md new file mode 100644 index 00000000..cb6f3c5b --- /dev/null +++ b/wiki/log/2026-07-13-zplanes-plane-api-decided.md @@ -0,0 +1,55 @@ +# Z-plane API shape decided: plane-agnostic sim, sensors stay in the reach graph + +``` +Type: log +``` + +## Intent + +Resolve the two load-bearing zplanes API decisions that were held while +criterion 1 landed, so criteria 3-6 build on a settled foundation. Both decided +by Cameron 2026-07-13. + +## Decision #1 — "active plane" is frontend-only; the sim is plane-agnostic + +No matter where the player is, the active plane is just whatever they are +currently viewing. The simulation does not care which floor is on screen and +never changes because of it — viewing a plane is attention, exactly like the +cursor (cursor.md), not an action. Rejected: giving the sim an `active_plane` +field, which would make sim state change when the player merely looks and would +fight cursor.md when two frontends (or the agent) view different floors of one +run. + +Consequence: the sim exposes **per-plane reads parameterized by `z`**. Criterion +1's `Sim::map()` is the plane-0 case of that read and is correct for a one-plane +world; the parameterized reads are added when a second plane lands (criterion 3), +not refactored away. + +## Decision #3 — sensing stays in the one reach graph, tagged by plane + +Sensors are not a per-plane `Vec`; they remain devices in the single +connected reach graph (reach.rs), each carrying a `z`. Rejected: moving sensors +onto each `Plane`, which cuts the graph into floors and forces reinventing how a +wire crosses between them. Keeping one graph makes cross-plane wiring free — a +stairwell cable or a power riser is just an edge joining a `z=0` device to a +`z=1` device. Fog and same-plane observer scoping (criterion 5) are the existing +computations filtered by `z`; signatures and observers gain a plane coordinate. + +Consequence: `Plane` carries no `sensors` field (the spec's original sketch is +dropped); it is map (tiles/power/rooms) plus identity (`z`, `name`). + +## What this unlocks + +Criteria 1+2 merged (no longer held). Next: the plane-parameterized reads, +`z`-tagging on devices/signatures/observers, then a second authored plane, +transitions, per-plane observers, and the multi-plane save format (v-bump at +criterion 6). + +## Defense + +These are Cameron's explicit calls, recorded in zplanes.md's Behavior. Both +push "which plane" down to a `z` parameter rather than sim state, which is the +lowest-risk, least-surprising foundation: #1 keeps the cursor.md attention/state +boundary intact; #3 preserves the reach graph's connected topology so cross-plane +links need no new machinery. Neither changes shipped behavior — they shape the +API the remaining criteria will use. diff --git a/wiki/log/DEVLOG.md b/wiki/log/DEVLOG.md index 29f64c22..ddc54f64 100644 --- a/wiki/log/DEVLOG.md +++ b/wiki/log/DEVLOG.md @@ -11,6 +11,31 @@ add or amend a session log, then re-run the generator. +## 2026-07-13 - Z-plane API shape decided: plane-agnostic sim, sensors stay in the reach graph + +- Intent: Resolve the two load-bearing zplanes API decisions that were held while criterion 1 landed, so criteria 3-6 build on a settled foundation. Both decided by Cameron 2026-07-13. +- Log: [wiki/log/2026-07-13-zplanes-plane-api-decided.md](2026-07-13-zplanes-plane-api-decided.md) + +## 2026-07-13 - ROADMAP digital-home reconciliation + +- Intent: Consume the tick ledger's queued contradiction in historical work order 27 without rewriting the implementation history it records. The ROADMAP is current-state knowledge: its completed-work prose must distinguish the REAL dialect's production quality from the frontend's curre... +- Log: [wiki/log/2026-07-13-roadmap-digital-home-reconciliation.md](2026-07-13-roadmap-digital-home-reconciliation.md) + +## 2026-07-13 - Persona creation returns to PERSONAS + +- Intent: (see session log) +- Log: [wiki/log/2026-07-13-persona-creation-surface.md](2026-07-13-persona-creation-surface.md) + +## 2026-07-13 - Context-menu Operations status reconciliation + +- Intent: Audit the never-ledgered context-menu slice against its binding laws, renderer-neutral action projection, and both human frontends. +- Log: [wiki/log/2026-07-13-context-menu-operations-status.md](2026-07-13-context-menu-operations-status.md) + +## 2026-07-13 - Bevy headless portability + +- Intent: Restore observed Bevy canvas evidence on the Linux orchestration host. The frontend used Bevy's convenience defaults, which pulled in unused audio and gamepad backends and made every build require system ALSA and libudev packages. The screenshot helper also rejected valid DIGI... +- Log: [wiki/log/2026-07-13-bevy-headless-portability.md](2026-07-13-bevy-headless-portability.md) + ## 2026-07-12 - Z-planes criterion 2: nested Layout composition - Intent: Land zplanes criterion 2 — `Layout` can be composed of child `Layout`s — on the held zplanes branch. Chosen because it is independent of the two open design decisions (active-plane-is-sim-or-frontend; sensors-per-plane), so it is safe to build while those await review. @@ -51,11 +76,26 @@ add or amend a session log, then re-run the generator. - Intent: (see session log) - Log: [wiki/log/2026-07-12-person-carrier.md](2026-07-12-person-carrier.md) +## 2026-07-12 - Interactive origin picker on the terminal title screen + +- Intent: Land the interactive new-game origin picker (chargen criterion 3) for the terminal — the culmination of the origin work (data model, `--origin` reachability, core-card axis readout). +- Log: [wiki/log/2026-07-12-origin-picker.md](2026-07-12-origin-picker.md) + +## 2026-07-12 - Origins reachable from the terminal via --origin + +- Intent: Make the four chargen origins actually playable now, without waiting on the interactive new-game picker (criterion 3). A `--origin` flag is the smallest real affordance that unblocks exercising non-Pilot origins. +- Log: [wiki/log/2026-07-12-origin-cli.md](2026-07-12-origin-cli.md) + ## 2026-07-12 - Operations workspace implemented - Intent: (see session log) - Log: [wiki/log/2026-07-12-operations-workspace-implemented.md](2026-07-12-operations-workspace-implemented.md) +## 2026-07-12 - Operations rail legibility: decisions before history + +- Intent: (see session log) +- Log: [wiki/log/2026-07-12-operations-rail-legibility.md](2026-07-12-operations-rail-legibility.md) + ## 2026-07-12 - Hearing becomes channel evidence - Intent: The Ears beat claimed that sound was not a picture while still projecting it as one: a room-scale fog grade, floor tint, material mass, event rings, and mic-only people at their true map positions. The sim knew only that a tapped instrument captured an event in its acoustic do... @@ -76,6 +116,11 @@ add or amend a session log, then re-run the generator. - Intent: The DIGITAL canvas already distinguished rack, camera, audio, switch, and generic device families, but those anchors still read as isolated pings. Make the actual reach graph playable as native spatial geography without turning the basement into a detached topology board or bo... - Log: [wiki/log/2026-07-12-digital-reach-dialect.md](2026-07-12-digital-reach-dialect.md) +## 2026-07-12 - Digital-home corpus reconciliation + +- Intent: The live `RenderMode::default`, the implemented views spec, and both fresh frontends open in DIGITAL. Several current player, knowledge, and interface pages still described the superseded 2026-07-08 material-first staging as the opening default. The active corpus therefore con... +- Log: [wiki/log/2026-07-12-digital-default-corpus-reconciliation.md](2026-07-12-digital-default-corpus-reconciliation.md) + ## 2026-07-12 - Persona, hardware, building, and opening integration - Intent: Turn four connected design directions into owned, implementation-honest wiki contracts without pretending any successor runtime already exists. The packets were drafted independently, then reviewed together so identity, hardware, construction, and the opening use the same caus... @@ -126,6 +171,16 @@ add or amend a session log, then re-run the generator. - Intent: Capture the spatial-building direction as an implementable amendment rather than another abstract resource economy. The desired interaction begins with a place and a world change, then exposes the concrete actors, channels, objects, and traces that could make it real. - Log: [wiki/log/2026-07-12-building-causal-routes.md](2026-07-12-building-causal-routes.md) +## 2026-07-12 - Bevy origin picker — title-screen parity + +- Intent: Give Bevy the same new-game origin picker the terminal got, so chargen criterion 3's picker exists in both human frontends (and Bevy, which had no `--origin` flag, gains any way to select an origin at all). +- Log: [wiki/log/2026-07-12-bevy-origin-picker.md](2026-07-12-bevy-origin-picker.md) + +## 2026-07-12 - Machine-axis position on the core card + +- Intent: Land the core-card half of chargen criterion 3: the run origin's machine-axis position surfaces on the core card, mid-run, in both frontends. Now meaningful because `--origin` makes non-Pilot origins (with non-zero axes) reachable. +- Log: [wiki/log/2026-07-12-axis-readout.md](2026-07-12-axis-readout.md) + ## 2026-07-11 - Whole-frame visual composition pass - Intent: The machine chassis had become strong while the complete frame still read as one hero object beside a dense rail. This pass composes the whole material view: world-first disclosure, camera behavior that changes with scale, recognizable Foundation infrastructure, physical peopl... diff --git a/wiki/world/places/zplanes.md b/wiki/world/places/zplanes.md index e1525d21..e6a05def 100644 --- a/wiki/world/places/zplanes.md +++ b/wiki/world/places/zplanes.md @@ -16,13 +16,18 @@ Status note: 2026-07-12 (zplanes, save lane) — criterion 1 landed: the world i (`prefab.rs`; `stamp` recurses), pinned by `composed_layouts_stamp_at_their_offsets`. Tile composition only; composing child room-rects across planes rides the room-namespacing decision (criterion - 3). DEFERRED (criteria 3-6, held for review): a second authored plane with its - own persons/schedules, paired transitions, per-plane observers, and the - repeated-per-plane save format. `Plane` also omits the spec sketch's - `sensors: Vec` for now — sensing lives in the reach graph (reach.rs), - and moving it to per-plane lists is the criterion-5 observer work. See - wiki/log/2026-07-12-zplanes-criterion-one.md and + 3). See wiki/log/2026-07-12-zplanes-criterion-one.md and wiki/log/2026-07-12-zplanes-nested-layout.md. + 2026-07-13 (Cameron review): the two held API decisions are resolved and + criteria 1+2 are merged (no longer held). Decision #1 — the sim is + plane-agnostic; "active plane" is frontend-only, like the cursor, so + `Sim::map()` is the plane-0 case and multi-plane reads are parameterized by + `z`. Decision #3 — sensing stays in the one reach graph tagged by `z`, so + `Plane` carries no `sensors` field and cross-plane wiring is just graph edges. + Both are recorded in Behavior and wiki/log/2026-07-13-zplanes-plane-api-decided.md. + REMAINING: criteria 3-6 (a second authored plane + template persons/schedules, + paired transitions, per-plane observers via z-tagged reach, repeated-per-plane + save with a v-bump) build on that foundation. Status note (prior): B2's structural spine. Written now so the Space interface's recursive shape is decided before anyone builds against the flat one. Stage: B2 — The Tower @@ -48,19 +53,37 @@ Depends on: ## Behavior The world becomes a stack of **planes**, each a `Layout` (prefab.rs) with -its own tiles, power grid, sensors, and fog: +its own tiles, power grid, and fog: ```rust pub struct Plane { pub z: i32, // basement = 0, lab floor = 1, ... pub name: String, // "Basement", "Floor 1 — Wet Labs" - pub map: GameMap, - pub sensors: Vec, + pub map: GameMap, // tiles, power grid, rooms // fog, power: per-plane, computed by the existing systems unchanged } pub struct World { pub planes: Vec } ``` +**Decided 2026-07-13 (Cameron), two load-bearing calls that shape the API:** + +- **The sim is plane-agnostic; "active plane" is frontend-only** (decision #1). + No matter where the player is, the active plane is just whatever they are + currently viewing — exactly like the cursor (cursor.md): the sim never holds + a "current floor" and viewing one never mutates sim state. The sim exposes + **per-plane reads parameterized by `z`** (tiles, fog, "do I have presence on + plane N"); the frontend remembers which floor is on screen. Criterion 1's + `Sim::map()` is the plane-0 case of that read (correct for a one-plane world); + the parameterized reads are added when a second plane lands (criterion 3). +- **Sensing stays in the one reach graph, tagged by plane** (decision #3, hence + no `sensors` field on `Plane`). Cameras, mics, switches remain one connected + `ReachNet` (reach.rs); each device carries a `z`. This keeps cross-plane + wiring free — a stairwell cable or a power riser is just a graph edge joining + a `z=0` device to a `z=1` device — instead of forcing a per-floor split that + would have to reinvent inter-floor connectivity. Fog and "observers notice + only their own floor" (criterion 5) are the existing computations filtered by + `z`; signatures and observers likewise gain a plane coordinate. + - **Recursion by composition:** `Layout` gains the ability to place other `Layout`s (a floor is a Layout of room-prefabs; a building is a stack of floor-Layouts). Same stamping system; a nested placement stamps its @@ -68,15 +91,16 @@ pub struct World { pub planes: Vec } - **Transitions** are paired tiles (stairwell/elevator) linking `(plane, x, y) <-> (plane', x', y')`. Humans traverse them per schedule (schedules gain a plane column); the player's *presence* extends to a - plane when they control any sensor or machine on it — the process does - not "walk upstairs", it spreads. + plane when they control any machine or a reach-graph sensor whose `z` is on + it — the process does not "walk upstairs", it spreads. - **Act gating stays diegetic:** the basement's T3 doors and badge tables gate transitions exactly like any door (access sets), so "unlocking Act Two" is the existing badge-controller beat, not a script flag. -- **Per-plane systems, shared laws:** detection observers live on planes - (an observer notices only its plane's signatures unless aggregate); - power does not cross planes except via authored risers (a fixed object); - each plane's fog is the union of controlled sensors there. +- **Per-plane systems, shared laws:** detection observers and sensors carry a + `z` in the shared reach graph (an observer notices only its plane's + signatures unless aggregate); power does not cross planes except via authored + risers (a fixed object); each plane's fog is the union of controlled seeing + feeds whose coverage is on that plane. - **First content:** "Floor 1 — Wet Labs" authored from existing + [TUNE] new prefabs, with 3-5 new named persons instantiated from the same `Person` template, schedules spanning both planes (Dana appears on