--- title: "Body Map Viewer — Tyre's Implications Pass" description: "Tyre's five-section implications analysis of Jeroen's clarified outline (T-1176 prep session): governance delta, candidate re-ranking, measurements, workshop shape, red flags" type: workshop status: active workshop: body-map-viewer created: 2026-07-25 --- # Tyre's Implications Pass (prep session, verbatim) Delivered after the clarification rounds ([clarifications.md](clarifications.md)), before the brief was drafted. Jeroen's prep rulings on its proposals are recorded in the brief. Unedited below. --- ## 1. GOVERNANCE DELTA **AMENDS / SUPERSEDES:** - **D-166 corollary (2026-07-21)** — sentence at stake: *"Display at every rung samples the derivation at canvas resolution (the ladder is a continuous field, not a stack of fixed display rasters)."* The stepped model is exactly "a stack of fixed display rasters" — one server-generated data canvas per zoom step. **Amendment direction:** the corollary's *intent* survives (no magnified interpolation of a coarser composite; each step's data is derived at that step's native gridunit spacing), but "continuous field, not fixed display rasters" is narrowed to "each *step* is a derivation sampled at gridunit resolution; display between steps holds that step's canvas." The anti-oversample/anti-undersample guarantee is re-expressed as a *per-step* property (a gridunit is never smaller than one screen px times the tunable, never coarser than the source-raster floor). Do NOT delete the corollary — repoint it. - **T-1143 ruling 3 (entry seam, continuous cursor-anchored zoom)** — **Superseded** for the zoom-transport mechanism: scroll steps through discrete levels. What SURVIVES: cursor-anchored centering, edge-scroll pan, and the "full zoom-out resets to the canonical planetary frame" HARD condition (orthogonal to stepped-vs-continuous). The client-side morph/tween is an *investigation item*, not a reinstatement of continuous derivation. - **T-1143 §2–§5 rung model / `select_rung` coverage-ceiling walk** — the shipped Quarter/District/Region "rung" selector keyed on `MAX_COVERAGE_M` is superseded by the *stepped gridunit ladder* (global → step1 n×n → … → 10px/1m-tile). Rungs-as-derivation-granularity survives conceptually, but the selector is no longer a coverage-ceiling walk — it's a discrete step index. The workshop's step-count decision defines the new ladder; `select_rung` is replaced, not patched. - **D-243 spatial ladder** — **additive, not superseded.** "tile = 1×1 m" is CONFIRMED (matches D-243's voxel row — Jeroen repaired his own misuse *toward* D-243). "gridunit (at zoom level)" is a NEW vocabulary term for the per-step data cell and must be added to the locked vocabulary block. **Critical open point:** a gridunit is a *display-derived* spacing (viewport px ÷ tunable) which floats with monitor and step — D-243 rungs are *absolute metres*, fixed on every body. The brief must state whether gridunit spacing SNAPS to D-243 rung spacings or floats freely. The single most load-bearing vocabulary reconciliation — surface as a workshop question, don't pre-decide. - **D-226 T-1124 §2 windowed-family ceiling [HARD]** — sentence at stake: *"exactly one windowed-query field on `AtlasLayerResponse`; a second forces the tagged-envelope migration."* Server-side per-step content determination with a richer payload likely EXCEEDS what one additive field can hold cleanly. This is where the tagged-envelope migration D-225 deferred probably lands. The brief should NOT assume it's avoidable this time. Named-feature encoding IS the decision that determines whether the ceiling breaks. The ceiling's *purpose* (prevent uncorrelated concurrent windowed queries) survives; the tagged envelope is the sanctioned way past it. - **river-courses-t1170.md carrier three-way rule** — rule (iii) *"rung-indexed invented detail rides the windowed payload"* SURVIVES structurally: courses are still invention, still step-indexed, still server-side. "The windowed payload" becomes "the per-step data canvas payload" (same idea, new carrier name). Rules (i) and (ii) survive too. **This ruling is robust to the pivot** — it was cut on the axis (skeleton vs continuous vs invention) that the server relocation doesn't touch. **SURVIVES UNTOUCHED (state explicitly to prevent over-rewrite):** - **D-227 derive-don't-store** — fully intact. The TTL cache is a *concrete eviction policy layered on* "transient evictable caches only." Nothing persisted as source-of-truth. (Workshop must confirm any disk-persisted-global-tier option stays consistent with D-227 — the one place it could drift.) - **D-010 four principles** — the server relocation *reinforces* principle 4 (server owns simulation state). Client art-function is pure presentation. The determinism boundary moves *toward* the server. - **D-166 cascade + phase gating** — unchanged; still Phase-4 Atlas work. - **D-226(d) whole-body prohibition** — survives, stress-tested by the deepest step (Red Flag 3). Chunk/tile output still never becomes a whole-body planetary layer. - **D-169/D-170 implant UI** — the map component lives inside the implant Atlas app, occludes gameplay, uses HudGroups. Unchanged. --- ## 2. CANDIDATE DIRECTIONS UNDER THE NEW PREMISES The new premises *pre-decide most of T-1176*: server owns content determination → the client no longer does immediate-mode `draw_*` of derived data. The entire error class (zoom-scaled-canvas compensation, `_zs`/`_zs_stroke`/`_zs_ring_radius`, the line-rasterizer floor) exists because the client draws derived features inside a `_canvas.scale = _view_zoom` node. **Stepped zoom + server-resolved per-step canvas kills the root cause, not the symptoms.** **Baseline (recommended, not the workshop's to relitigate):** - **(b) render-to-texture per step, for the terrain/classification raster.** Each step's data canvas → one ImageTexture → drawn 1:1 (or at the tunable px ratio). Sizes are texel-exact by construction — the rasterizer floor and per-call compensation *cannot occur*. Already half-built: `_tile_texture_cache` + `_rebuild_texture_if_needed` + `_filter_for_granularity_v2` are a render-to-texture path today; the stepped model makes RTT the *primary* path. - **(a) unscaled screen-space sibling layer, for vector annotations** (labels, settlement glyphs, POI markers, mouth rings). Screen-space at literal px sizes — no zoom compensation. Positions transform world→screen; sizes are constants. **Genuinely open for the workshop:** - **(c1) shader colorize/style of the classification raster** vs CPU `set_pixel` — perf/quality call; where T-1175's per-vertex river tapering "comes free." - **(c2) GPU-side derivation — almost certainly NO** (determinism, the two-language-mirror liability rejected for T-1170 applies doubly to GLSL). Pre-empt in the brief: **derivation stays CPU/Rust server-side; GPU is presentation only.** - **Client-side morph between steps** — a *presentation tween* of the held texture, NOT re-derivation. Open, low-risk, scoped as "cosmetic interpolation while the next step's canvas is in flight." (d) hybrid isn't a separate option; (b)+(a)+optional-(c1) IS the hybrid. --- ## 3. PRE-WORKSHOP MEASUREMENTS The T-1143 lesson: the planetary rung died of stacked extrapolation. Priority order: 1. **Equilibrium hydrology solver cost** — highest priority, biggest unknown, critical path for "settled hydrology" feasibility. Lake-fill + overflow re-routing + gorge carving as single-pass priority-flood (Barnes/Planchon-Darboux class). Measure at 512×256 AND 4K-class (~330K–8.3M cells). Effort: 1–2 days (the overflow+carve variant needs prototyping, not just benchmarking). Who: Dudley. Could *invalidate* per-body-open settled hydrology if it's seconds not milliseconds. **Should also output the cliff representation, not just the cost** (Red Flag 4). 2. **Per-gridunit derive cost at 1×1 vs 5×5, at real canvas sizes** — known: 1.785 µs/cell (District cutoff), 1.454 µs/cell (orbital), 0.617 ms per 4,096-cell served window. Scale math: 330K gridunits × ~1.5 µs ≈ ~0.5 s single-thread, ~35–50 ms across 14 workers *if par_iter chunking holds at that scale* (measured at 4,096 cells only). 8.3M × 1.5 µs ≈ ~12 s single-thread, ~0.9 s parallel — the "computer catches fire" case. Effort: 0.5 day — run `zoom_ladder_bench` at 330K and 8.3M cells on the production path; don't extrapolate. Who: Dudley. **Closes the exact gap that killed the T-1143 planetary story.** 3. **Wire-size table for candidate encodings** — 330K-gridunit canvas: dense classification ≈ 4–5 bytes/gridunit ≈ 1.3–1.6 MB/step raw, before MessagePack overhead and named-feature lists. Compare raw dense vs bit-packed vs run-length vs PNG-encoded. Effort: 0.5 day. Who: Araminta with a number from Dudley. Feeds named-feature encoding + the tagged-envelope call. 4. **T-1154 block/tile rung numbers (now unblocked)** — deepest steps derive at metre spacing over a viewport canvas; never benchmarked. Effort: 0.5 day (cutoff plumbing exists since T-1162). Who: Dudley. Prices the bottom of the ladder. 5. **Godot ImageTexture upload cost per step** — `create_from_image` for a 330K–8.3M px image on step-cross; could stutter. Effort: 0.25 day. Who: Stig. Interactive-latency input, not a blocker. **Discipline line: items 1, 2, 4 must be MEASURED and in the brief's appendix before round 1.** Cite the T-1143 planetary rung by name as the cautionary tale. --- ## 4. WORKSHOP SHAPE **Roster (small as honesty allows):** Dudley — CORE (server owns content determination; hydrology, per-gridunit derive, step-canvas generation, compute-chunk partitioning). Araminta — CORE (the map-art function AND named-feature encoding). Stig — CORE (the client component: RTT + screen-space rebuild; owns the atlas/ cluster). Tyre — architecture/feasibility, governance delta, determinism boundary, tagged-envelope call. Troblum — adversarial/perf, **round-2 reviewer, not round-1 designer** (stress the cost story and memory budget; the extrapolation-hunting from PR #185). **Gestalt — NO**: deterministic geology, not systems design; seating him drags toward live-sim scope the clarifications parked. Pull in async for the one map-time question if it grows sim coupling. Five seats. **Format:** 2-round + lead interview (tile-derivation-contract precedent). Round 1: per-seat positions against pre-measured numbers. Round 2: synthesis + cross-cutting decisions (tagged-envelope yes/no, gridunit↔D-243, canonical-vs-viewport). Lead interviews Jeroen each round. **Gate round 1 on the §3 measurements landing.** **Question list per participant:** (folded into the brief's Questions section.) --- ## 5. RED FLAGS (for the brief to state honestly) 1. **Stepped zoom vs D-166's "no over/undersampling" — the between-steps gap.** Between two steps the held texture is scaled by the display transform: at the moment before a step-cross you ARE magnifying step-N's canvas — the exact thing D-166 was written against, for the width of one step interval. Step count + px-per-gridunit tunable jointly bound how bad this gets; they are the knobs that keep between-step magnification below perceptibility. The D-166 corollary amendment must own this honestly. 2. **Global-tier "always keep" across ~273 inhabited bodies.** ~330K gridunits × ~5 bytes ≈ 1.6 MB/body ≈ **~440 MB resident** at 5×5 if never-evict and all-bodies; ~13 GB at 1×1 — infeasible. Force the question: "always keep" = always-derivable-fast (cache is a bonus) or a permanent resident allocation (needs a budget and probably a disk tier, which stress-tests D-227). The cache deliverable must produce a number, not a vibe. 3. **Deepest step (10 px/1 m tile) vs D-226(d).** At 10 px/tile on a 2160 px axis: ~216 m across — a viewport-scale window of metre-resolution derivation. *Within* the opened windowed-viewport carve-out (gated on T-1154 numbers) — allowed. But: **if the workshop picks "canonical fixed canvas for all steps," the deepest step's canonical canvas at 1 m spacing IS a near-whole-body metre-resolution derivation, which violates the surviving D-226(d) prohibition. Canonical-vs-viewport is not just a cache tradeoff — at the deep end it's a governance boundary.** The sharpest thing in the whole design. 4. **Cliff/multi-height data-model gap.** Settled hydrology *produces* gorges; a gorge is two heights in one gridunit; the sketched payload carries one. Either the gridunit payload gains a vertical-structure field (min/max height + cliff-edge flag) at Phase-4 Atlas scope, or cliffs are declared Phase-5 in-world geometry and the Atlas shows dominant height + a "steep" classification. Hydrology can't be "settled as producing gorges" while the data model can't represent one. 5. **The tagged-envelope migration is probably now unavoidable — and that's fine, but it's work.** Present it as *expected scope*, not a risk to avoid; under-scoping repeats the T-1143 §8-step-4 mistake. Honest tier: challenging but doable — the envelope framing already exists in D-225's deferral; we're executing a planned migration, not inventing one. --- **Meta-note:** this pivot is *architecturally cleaner than what ships today*, not messier. Server-owns-content + client-art-function + RTT+screen-space-vectors eliminates the entire error class at the root, makes the render auditable (the data canvas is inspectable server-side, decoupled from draw), and the one hard part I'd have feared — reconciling derived geometry with a zoom-scaled canvas — stops existing because there's no zoom-scaled canvas anymore. The T-1170 carrier rule survives the pivot untouched because it was cut on the right axis. The genuine risks are the four measured-cost questions and the two governance boundaries (D-226(d) canonical-canvas coupling, D-166 between-step magnification) — all nameable, none fatal. Feasible. Challenging but doable.