Three-way prep session (Jeroen + lead + Tyre) for the map-handler revision: Jeroen's design outline captured verbatim, two clarification rounds, Tyre's governance-delta/implications pass, brief co-written and ratified (zero misrepresentations, zero blocking gaps), signed off by Jeroen with three edit rounds (vocabulary repair tile->gridunit, client cache-store question with SQLite fact base, explicit DQR/ticket deprecation sweep as gated deliverable). Workshop: 5 seats (Dudley/Araminta/Stig/Tyre + Troblum r2), 2 rounds + lead interview extendable at Jeroen's call, round 1 gated on measurements T-1177/T-1178/T-1154/T-1179 (T-1180 non-gating). T-1176 in_progress with gate blocker edges; T-1154 repurposed as measurement (3) and set ready. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
95 lines
14 KiB
Markdown
95 lines
14 KiB
Markdown
---
|
||
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.
|