Files
settled-reach/docs/workshops/body-map-viewer/prep-grounding.md
T
jpmschweitzerandClaude Fable 5 77531a0eab docs(meta): body-map-viewer workshop brief signed off — T-1176 prep session
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>
2026-07-23 18:29:21 +02:00

164 lines
10 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
title: "Body Map Viewer — Prep Grounding"
description: "Pre-read for the T-1176 prep session (Jeroen + lead + Tyre) and later the workshop: current mechanism, error-class evidence, delivered ladder design, binding constraints, candidate directions"
type: workshop
status: active
workshop: body-map-viewer
created: 2026-07-25
decision_refs: [D-166, D-226, D-227, D-243]
---
# Body Map Viewer — Prep Grounding
Prepared by the lead for the three-way prep session (Jeroen, lead, Tyre) that writes
the workshop brief. Working name `body-map-viewer` (Jeroen's phrase) — rename with the
brief if a better one emerges. Everything here is *input*, not position: Jeroen's
outline of his own design opens the session and nothing below pre-empts it.
## 1. Why this exists
Jeroen, 2026-07-23 (T-1176): *"I want to discuss and maybe revise the pixel
scan/output mechanism for drawing the map. I feel we can be smarter about this and
bypass an entire class of errors we are seeing as well as probably improve
performance."* Follow-up 2026-07-25: he, the lead, and Tyre write a plan to start a
wider-team workshop on the new map handler; Jeroen will outline how he would build
**the body map viewer with zoom to ground level** and **how the deterministic
generation cascade connects into it**.
## 2. The error-class evidence (PRs #195#197, recorded in D-226 implementation notes)
All rendering-layer bugs of the river arc descend from one architectural choice:
**immediate-mode `draw_*` calls issued by children of a zoom-scaled canvas**
(`_canvas.scale = _view_zoom`), which makes every on-screen size a canvas-local value
divided by zoom:
- **Per-call-site compensation fragility** — every radius/stroke needs `_zs`/`_zs_stroke`/
`_zs_ring_radius` wrapping (atlas_window_geometry_nature.gd); a missed site degrades
silently. Happened twice (PR #195 attractor strokes, PR #197 course widths).
- **Godot line-rasterizer stroke floor** — widths below ~1.0 canvas units collapse to a
1 px hairline (bracketed live: 0.6 → hairline, 1.1 → visible). Consequence on record:
per-class course *width* grading is inert at every shipping fit zoom; classes
distinguish by opacity alone until T-1175.
- **`draw_arc` blob regime** — ring radius below stroke width renders a filled blob
(bracketed: 1×stroke = blob, 1.5× = recovers, 2× = clean; floored at 2×).
- **Wrap-image resolution family** — seam tiles must mirror the painter's
`nearest_wrap_image(tile_center, held_center, cols)` exactly (T-1172 round 2 inverted
it); shared index math now lives in `cell_index_for_local_offset`.
- **Auditability** — the mechanism defeated visual verification three times in one
batch (lead capture misreads corrected only by wire data). A mechanism whose
correctness can't be eyeballed is itself a finding.
## 3. The current mechanism (the thing being revised)
**Client** (`client/ui/implant/apps/atlas/`): `AtlasWindowViewer` (~1017 ln) owns a
`_canvas` Node2D; pan/zoom = `_canvas.position/_canvas.scale` (`_apply_transform`).
Terrain: `atlas_window_overlay.gd` builds one Image texel per derived cell →
ImageTexture → `draw_texture_rect` (COMPOSITE_SMOOTH pipeline axis; rebuilt only on
window change — pan/zoom is free), per-rung sampling filter `_filter_for_granularity_v2`
(Region/orbital-mosaic → NEAREST, District/Quarter → LINEAR; T-1161 two-axes outcome).
Nature features (`atlas_window_nature_overlay.gd`): `draw_polyline`/`draw_circle`/
`draw_arc` inside the scaled canvas with the §2 compensation family. Orbital rest
state: whole-body mosaic of capped Region tiles (per-tile ImageTextures,
`AtlasWindowTileSet`). Rung selection: coverage-ceiling walk (`select_rung()`,
MAX_COVERAGE_M — Quarter ≈ 32.8 km, District ≈ 131 km, Region ≈ 13,107 km, beyond →
tile mode). CELL_PIXEL_SIZE = 16 px at zoom 1.0. Redraws on pan/zoom/rung-cross/
arrival, not per-frame.
**Server** (`server/src/atlas/`): windowed derives on the Rayon background queue,
never inline (D-226 T-1124 §1 [HARD]); one windowed payload (`DistrictWindowLayer`:
per-cell u8 arrays + `courses: Vec<RiverCourse>`), echo/cache keyed on
`(body, center, n, granularity)`; wire clamp `window_n² × granularity² ≤
WIRE_CAP_CELLS (4096)`; whole-body Layer1 family (512×256: heightmap analysis, D8
drainage/rivers) rung-independent. Measured (zoom_ladder_bench, release, 16 cores):
District derive 3.0 µs/cell uncut, 1.785 µs @2048 m cutoff; Quarter 1.823 µs @512 m;
orbital 1.454 µs; served Region window (4096 cells) **0.617 ms/call**.
## 4. The delivered ladder design and what it already settles
`docs/architecture/atlas-zoom-ladder-t1143.md` (9-agent pass, 2026-07-21) + Jeroen's
three rulings (recorded as D-226 amendment):
1. **Floor OPENED***"we set a new BHAG so old restrictions are up for debate."*
The D-226(d) ceiling is opened for the Atlas ladder; "down to tile scale" reads
literally. Below-quarter rungs (block/tile) are **implementation-gated on T-1154**
(below-quarter measurement pass — backlog, now unblocked: the octave-cutoff
plumbing it was blocked on has existed since T-1162). Chunk/tile output still never
appears as a *whole-body planetary layer* — windowed viewport only.
2. **Planetary carrier** — progressive capped-density tiling on the generalized
`district_window` carrier (shipped as the orbital mosaic).
3. **Entry seam** — continuous cursor-anchored zoom, full-zoom-out resets to the
canonical planetary frame (shipped, T-1153).
Standing risks from that doc that touch this workshop: **R1** planetary/canvas-fill
cost story (full-canvas sample still extrapolated, ~524 ms @2 px/cell parallel-
estimated); **R2** temperature steps at district boundaries by construction at every
rung (never continuous); **R3** average-back unverified for categorical morphology
gates; **R6** border-fade referent must repoint when the heightmap-texture path
retires.
## 5. Binding governance (verified verbatim)
- **D-166 amendment + corollary (2026-07-21):** continuous zoom ladder planetary→tile,
every level *"deterministically calculated information at that level's native
granularity … never magnified interpolation of a coarser composite"*; display
*"samples the derivation at canvas resolution (the ladder is a continuous field, not
a stack of fixed display rasters)"*; heightmap PNGs are invisible derivation input.
Hard Phase-4 exit bar (T-750).
- **D-226(d)** as amended by ruling 1 above: the old hard ceiling is opened for the
windowed viewport; the whole-body-planetary-layer prohibition stands.
- **D-227:** derive-don't-store — `subtile(x,y,z) = derive(seed, atlas, position)`,
transient evictable caches only; coast crinkle + river courses are rung-indexed
invention.
- **D-243:** the containment ladder (voxel 1 m … region 204.8 km, one elastic
planetary seam); climate edge-fuzzed (*"climate does not change on a line"*),
morphology seams sharp-but-organic.
- **Carrier three-way rule** (docs/architecture/river-courses-t1170.md, binding):
(i) rung-independent discrete features → whole-body family, filtered client-side;
(ii) continuous per-metre fields → windowed per-cell arrays; (iii) rung-indexed
invented detail → windowed payload regardless of geometric kind.
- **Windowed-family ceiling** (D-226 T-1124 §2 [HARD]): exactly one windowed-query
field on `AtlasLayerResponse`; a second forces the tagged-envelope migration.
## 6. T-1176 candidate directions (sparring material, not positions)
- **(a) Unscaled screen-space sibling layer** — annotation/feature drawing moves to an
unscaled sibling of the canvas; positions transformed to screen space, sizes literal
px. Kills the whole §2 compensation class for vector features. (Tyre's earlier note,
T-1156 wave 2 / T-1158-adjacent.)
- **(b) Render-to-texture per window/tile** — features rendered at native resolution
into textures; zoom becomes pure texture transform; sizes texel-exact. Must be
argued against D-166's "canvas resolution / continuous field, not fixed display
rasters" sentence. Prior art in-tree (Tyre): the orbital tile-mode mosaic already
composites per-tile ImageTextures (`_tile_texture_cache`, `compute_tile_grid()`
Lendel 3×2, verified this session) — the terrain path is halfway to this model.
- **(c) Shader-side composition** — morphology/courses as data textures, coloring +
feature rendering in fragment shader; per-vertex width/tapering (T-1175) comes free;
likely the performance route for canvas-resolution sampling at planetary scale (R1).
- **(d) Hybrid** — e.g. terrain via (c), vector annotations via (a).
## 7. Adjacent work that intersects
| Item | Status | Intersection |
|---|---|---|
| T-1154 below-quarter measurement pass | backlog, unblocked | the gate for "zoom to groundlevel"; block/tile rung costs + wire |
| T-1158 viewer decomposition | backlog | any new mechanism restructures the same file |
| T-1175 polish collector | backlog | tapering/width grammar wants Polygon2D strips or shaders — mechanism-dependent |
| T-1157 capture harness redesign | backlog | §2's auditability finding — verification story for whatever ships |
| T-1174 batch/window sampling divergence | backlog | pre-existing sampling debt |
| D-239 tile-derivation contract | **verified in-session**: confirmed/active, "coarse→fine refinement chain (resolves Q-101)", 2026-06-07 | the derivation side of "connect the cascade" is settled governance |
| Phase-5 boundary (D-166 generation-before-player) | standing | ground-level *rendering* is Phase 5; the Atlas ladder maps derived layers — where Jeroen's viewer sits relative to this line is his to outline |
Prior workshop art: `atlas-derivation-model.md` (brief-only, data side),
`generation-cascade/` (atlas UI coords vs sim coords), `world-generation/` (atlas as
annotated information layer), `map-authoring-pipeline/` (brief-only, predates the
no-hand-made-test-map rule — historical only).
## 8. What the prep session must produce
1. Jeroen's design outline, captured faithfully (the session's round 1).
2. Every point sorted: **settled by the three of us** vs **genuinely open → workshop
question** vs **already ruled** (cite the record).
3. The workshop brief (`body-map-viewer-workshop-brief.md`): question, locked/open
context, roster, per-agent questions, format, input docs, expected outputs
(D-record(s), ticket plan).