The complete workshop record: four round-1 positions, five round-2 syntheses (incl. Troblum's adversarial pass with addendum + final scorecard — all seven findings resolved), both lead interviews, Qatux's round notes and the 8-section workshop-outcomes.md (the lakes message-crossing documented as process history), measurement ⑥ (set_pixel/c1) + the population-survey and chunk/S2 addenda in the measurement docs, the brief's appendix updated through ⑥, and architecture-briefing-final.md — Jeroen's outline written back as-built (six-level ladder, lakes, ~9MB resident global tier). README row: Complete. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
27 KiB
title, description, type, status, workshop, created
| title | description | type | status | workshop | created |
|---|---|---|---|---|---|
| Body Map Viewer — Tyre's Round 1 Position | Governance amendment ratification, gridunit↔D-243 reconciliation, determinism boundary, and cliff ruling — against the measured ①–⑤ appendix | workshop | active | body-map-viewer | 2026-07-25 |
Tyre — Round 1 Position
cracks knuckles — the measurements came back clean. All four of the things I flagged as "could kill this" in the implications pass (hydrology cost, derive throughput at scale, wire size, deep-step cost) landed as GO, not maybe. That changes my tone here: I'm not hedging architecture around unknowns anymore, I'm ratifying specific amendment text against specific numbers. Four questions, in the brief's order.
1. Governance delta — ratified as concrete amendment texts
The implications pass named five amendment targets. I said "surface as a workshop question, don't pre-decide" for the sharpest one (gridunit↔D-243) — that's §2 below. The other four are ready to write as filing text now; the measurements didn't change their direction, only confirmed their necessity and gave me the numbers to cite.
1a. D-166 corollary — repoint, don't delete
Current text (2026-07-21 amendment): "Display at every rung samples the derivation at canvas resolution (the ladder is a continuous field, not a stack of fixed display rasters)."
Amendment text (proposed):
Amended 2026-07-25 (body-map-viewer workshop — stepped ladder). The zoom mechanism is superseded from continuous to stepped (T-1143 ruling 3, itself superseded — see §1b). The corollary's intent — no magnified interpolation of a coarser composite; no undersampling below the source floor — is preserved, re-expressed per-step: each step's data canvas is a derivation sampled at that step's native gridunit spacing (never coarser than the step's own floor, never finer than the display's own tunable ratio, measurement ④'s 1×1-to-5×5 px/gridunit band). Display within a step holds that step's canvas at a fixed, texel-exact ratio (measurement ⑤: upload cost 0.03–4.6 ms across every canvas size tested, never a frame-budget risk) — the "continuous field" framing is retired as literally false (it never was continuous once server-side per-step canvases replaced client
_canvas.scale), but the guarantee it protected is intact, just discretized. The one honest new gap this creates — magnification of the held canvas in the interval just before a step-cross — is a named, bounded exception, not a silent violation: see §1e below and Red Flag 1. The corollary's anti-oversample/anti-undersample clause now reads: "a gridunit is never derived coarser than its step's floor and never displayed finer than the tunable ratio; between-step magnification is bounded by construction to one step interval and is the ladder's only sanctioned display-time scaling."
1b. T-1143 ruling 3 — superseded for zoom transport
Amendment text (proposed):
Superseded 2026-07-25 (body-map-viewer workshop). T-1143 ruling 3 ("continuous cursor-anchored zoom... wheel-zoom carries the view from the orbital frame down through regional granularities continuously") is superseded for the transport mechanism: zoom is stepped — scroll clicks through discrete gridunit-spacing levels, one server-canvas fetch per crossed step boundary. What SURVIVES from ruling 3, unchanged: (a) cursor-anchored centering, (b) edge-scroll pan, (c) the HARD condition that a full zoom-out resets to the canonical orbital frame and location. A client-side morph/tween between held step canvases is an investigation item — cosmetic interpolation of already-arrived data while the next step's canvas is in flight, never re-derivation, never a second source of positional truth (see §3, determinism boundary). Ruling 3's "progressive capped-density tiling riding the generalized
district_windowcarrier, no forced tagged-envelope migration" clause is also superseded — see §1d, the tagged envelope is no longer avoidable and this workshop names it expected scope rather than something to keep dodging.
1c. select_rung / T-1143 §2–§5 rung model — replaced
Amendment text (proposed):
Superseded 2026-07-25. The shipped
WindowGranularityenum (Quarter/District/Region, coverage-ceiling-walked viaselect_rungkeyed onMAX_COVERAGE_M) is replaced by the stepped gridunit ladder: a discrete step index (§3, the step ladder) selects gridunit spacing directly, not via a coverage-walk over a fixed rung enum. Rungs-as- derivation-granularity survive conceptually — every step still names an absolute-metre spacing — but the selector is gone, replaced by "which step is the viewport currently on."resolve_window_granularity's whitelist discipline (T-1150: finer-than-district integer multiples only, unknown values fall back, never trusted from the wire) is the right shape for the step index's own validation and should be reused, not reinvented.
1d. D-226 T-1124 §2 windowed-family ceiling — tagged-envelope migration triggered
This is the one measurement ④ makes unambiguous, not marginal. The brief's own framing ("likely triggers") undersells what T-1179 found: PNG per-field, the best candidate encoding measured, is 21× the ~30 KB ceiling at the smallest step canvas (330K gridunits) and 563× at the largest (8.3M). Bit-packed and RLE are worse (55×–1,731×). There is no encoding trick in the measured set that gets a step canvas anywhere near "exactly one windowed field" territory — this isn't "the ceiling might need raising," it's "the payload is two to three orders of magnitude past a ceiling sized for a 4,096-cell window." T-1156's precedent (river skeletons riding the whole-body family, explicitly not triggering the migration) and T-1170's precedent (courses riding the windowed payload as content, not a new field, also not triggering it) both worked because they stayed inside the existing one-field shape. A step canvas cannot — its cell count alone (330K–8.3M vs. the 4,096-cell design point) is off by two to three orders of magnitude before encoding is even considered.
Amendment text (proposed):
Amended 2026-07-25 (body-map-viewer workshop, superseding T-1143 ruling 2's "no forced tagged-envelope migration"). The windowed-family ceiling's purpose — prevent uncorrelated concurrent windowed queries needing per-field request correlation — survives untouched. Its current mechanism (exactly one windowed field,
district_window, sized for a ≤4,096-cell served window) cannot carry a step canvas: measurement ④ (T-1179) shows the best available encoding at 21×–563× the ~30 KB reference across the three measured canvas sizes (330K/2.07M/8.3M gridunits), with no encoding in the measured set closing that gap. The tagged-envelope migration D-225 deferred (decode_inbound's shape-based demux → a required marker field / tagged envelope) is hereby the sanctioned path: the step-canvas payload becomes its own tagged message type on the existing IPC stream (not a second socket, not adistrict_windowgrowth), landing D-225's 2026-06-12 constraint ("the next inbound message type must introduce a tagged envelope") on its intended target. Framed as expected scope, executing a planned deferral — tier: challenging but doable, not a risk. The ceiling's rule ("exactly one windowed-query field") is re-scoped: it now governs the legacydistrict_windowcarrier only (kept alive for whatever windowed traffic doesn't migrate — TBD in round 2's wire contract), while the tagged step-canvas envelope is a new, separate carrier the ceiling rule does not apply to by construction (it isn't a second windowed field on the old shape — it's the new shape).
1e. river-courses-t1170.md carrier rule — survives, terminology repointed only
No change to the rule's substance. I said in the implications pass this was
"robust to the pivot... cut on the axis the server relocation doesn't touch"
and the measurements don't disturb that: rule (iii) — "rung-indexed invented
detail rides the windowed payload" — still holds; "windowed payload" now
names the tagged step-canvas envelope (§1d) rather than the legacy
district_window field, but the content discipline (courses are payload
content, not a new query field) transfers unchanged. Ruling (i)/(ii) (skeleton
rides whole-body; continuous per-metre fields ride the window) are also
unaffected — Region-rung skeleton still needs the presentation-frame clip
T-1170 §3g describes until Region itself steps onto the ladder (§3, step
ladder — Region likely IS the global/step-0 rung, worth confirming in round
2's synthesis with Araminta).
Amendment text (proposed): none required beyond a terminology note —
"windowed payload" in river-courses-t1170.md is glossed as "the per-step
data canvas payload (formerly district_window, now the tagged step-canvas
envelope, §1d)" at the top of that document, so a future reader isn't
misled by the retired field name.
2. Gridunit ↔ D-243 reconciliation — the load-bearing call
Called this "the single most load-bearing vocabulary reconciliation" in the implications pass and refused to pre-decide it. Now I have the numbers. Ruling: gridunit spacing snaps to D-243 rung spacings. It does not float freely per viewport/step.
The argument
Why free-floating breaks first: if gridunit spacing were viewport_px ÷ tunable, two different monitor resolutions (or the same monitor at a
different step-transition moment) would derive different absolute-metre
sample spacings at the same step. That's not a cosmetic difference — the
derivation is derive_at_metres(seed, body, position, spacing), and D-227's
whole determinism/cache-validity model rests on the same inputs producing
the same output forever. A gridunit spacing keyed to the requesting
client's viewport size means the server-side cache key must include viewport
dimensions (or the cache is wrong for the next client), which contaminates
D-227's "evictable cache, never source of truth, always valid on
recompute" cleanliness with a presentation-layer parameter. It also breaks
the client-side retention premise (premise 9): "a canvas for a fixed seed
never changes" stops being true if the canvas's own grid depends on the
window you happened to have open when you fetched it.
Why snapping is free, not a compromise: D-243's ladder already gives us six absolute-metre rungs below the elastic seam (voxel 1 m, chunk 64 m, block 128 m, quarter 512 m, district 2,048 m, region ~205 km) — measurement ③ (T-1154) independently confirms block and tile spacing cost the same per-cell rate as District/Quarter (~1.8 µs/cell single-thread, no cutoff discount below block). There's no derivation-cost reason to invent a seventh, viewport-relative spacing value — the fixed rungs are already cheap at every depth the ladder needs. A step's gridunit spacing IS one of D-243's absolute rungs (or, at the very deepest step, the D-243 voxel/tile itself, 1 m — already the ladder's own floor). Snapping doesn't cost anything the ladder wasn't already going to pay.
What DOES float, and this is where premise 5's "tunable" language was doing real work: the px-per-gridunit display ratio — 1×1 ideal down to ~5×5 acceptable — is the free parameter, and it's a client-side presentation concern, not a derivation-side one. A 4K monitor and a 1080p monitor requesting the same step get the same absolute-metre canvas (same gridunit spacing, same derived content, same cache entry, shareable) — they just display it at different px-per-gridunit ratios, which is a pure texture scale-to-viewport operation, not a re-derivation. This is precisely the canonical-vs-viewport question (red flag 3) wearing a different hat: the canvas's metre extent should be sized to cover the largest viewport the step needs to fill at that step's D-243 spacing (measurement ③'s "realistic deep-step canvas," 216×384 m at 1 m spacing, 82,944 cells, 17 ms parallel — already computed as a fixed metre-extent shape, not a viewport-px-shape), and any monitor smaller than that extent just doesn't need all of it.
Concrete ruling
-
Step → D-243 rung mapping is 1:1 or a documented fixed multiple, chosen in round 2's step-ladder synthesis (question 3 below feeds it). No step invents a spacing D-243 doesn't already name.
-
Gridunit = "the per-step data cell," and its metric size is always a D-243 absolute-metre value — the vocabulary clarification I flagged in the implications pass resolves cleanly: gridunit is not a new spatial unit, it's a role ("the cell a given step's canvas is sampled at") played by whichever D-243 rung that step is pinned to. At the deepest step, gridunit and tile (D-243's voxel) coincide exactly — which is exactly what "10 px per tile" in the outline already assumes.
-
The px-per-gridunit ratio (1×1 to 5×5) is a display-side tunable, decoupled from spacing. It governs texture-to-viewport scale and canvas extent sizing, never canvas spacing.
-
D-243 gridunit vocabulary entry (filing text):
gridunit (D-243 amendment, additive). The per-step data-canvas cell. Not a new spatial rung — a role name for whichever D-243 absolute-metre rung (voxel through region) a given zoom step is pinned to. Gridunit spacing is always one of the ladder's fixed metre values; it never floats with viewport size or display resolution. The display ratio (screen-px per gridunit, 1×1 ideal, ≥5×5 acceptable per the body-map-viewer workshop) is the free, client-side, viewport-dependent parameter — kept terminologically and architecturally separate from gridunit spacing itself.
This is the "that's actually easier than it sounds" moment I was hoping for going in: the reconciliation isn't a compromise between two systems, it's recognizing gridunit was never a competing unit — it's D-243 wearing a per-step hat, with exactly one genuinely free parameter (display ratio) that was never a spatial-ladder concern in the first place.
3. The determinism boundary — where the client may interpolate without creating a second truth
D-010 principle 4 (server owns simulation/derivation state) and D-227 (derive-don't-store, pure function of seed+position) together draw this line sharply, and the T-1170 course-invention ruling already demonstrates the right shape in miniature — I want to generalize it rather than invent a new rule.
The rule
The client may interpolate/tween only values that are already fully resolved server-side and arrived on the wire as concrete endpoints or control geometry. It may never invent a sample the server hasn't computed, and it may never smooth/blend across a boundary the server treats as discontinuous (a step boundary, a rung's own truncation floor, a cliff edge).
Concretely, three buckets:
(A) Legal client interpolation — presentation-only, zero determinism risk.
- Step-cross morph/tween (premise 3, explicitly an investigation item):
animating from the held (arrived, resolved) coarser-or-adjacent canvas
texture toward the newly-arrived finer canvas texture. Both endpoints are
server truth; the client is blending two already-true images for visual
continuity during the fetch window. This is a pure
Tween/shader cross-fade — no new sample is invented, and the final resting state is always the server's canvas, never a lerped hybrid held as "the" data. - River/road tweening between wire-carried control points: T-1170's
Stage A/B course points ship as
Vec<(i32,i32)>world-metre polyline stations. The client draws a smooth curve through those points (spline interpolation between server-given anchors) — this is cosmetic curve fitting of a fully-specified polyline, not invention of new geometry. The server has already decided where the river bends; the client is just not drawing it as a jagged polyline of straight segments between stations. This is exactly what T-1175 (per-vertex tapering, Polygon2D strips) is scoped to do, and it's legal by this rule as written today. - Texture-to-viewport scaling (the display ratio from §2): resampling a
fixed-spacing canvas to fit a monitor's px-per-gridunit ratio is a GPU
presentation resize, not a derivation. NEAREST/LINEAR filter choice
(already precedented per-rung in
_filter_for_granularity_v2) lives entirely in this bucket.
(B) Illegal client interpolation — would create a second source of truth.
- Inventing a sample the server never computed — e.g., a client-side guess at what lies between two arrived gridunits at a finer spacing than the server sent (upsampling terrain detail client-side). This is exactly the T-1143 error class (magnified interpolation of a coarser composite) the whole workshop exists to kill. The corollary amendment (§1a) forbids it structurally — there is no client code path that samples "between" gridunits at invented resolution, because the render baseline draws the canvas 1:1 (or at the tunable ratio) via RTT, texel-exact by construction.
- Smoothing across a step boundary: blending step-N's canvas with step-N+1's canvas as if they were one continuous field (rather than cross-fading two discrete textures per bucket A) would reintroduce exactly the composite-magnification problem — the boundary between two differently-sampled canvases is real (different gridunit spacing on each side), and pretending otherwise fabricates data.
- Client-side course/terrain re-derivation — the T-1170 ruling already rejected this explicitly (1a: "Client-side GDScript invention is rejected on the determinism surface... a byte-exact two-language mirror... is a standing liability"). This generalizes to every invented-detail field: hydrology (channel_depth/cliff_edge, §4 below), coast crinkle, vegetation massifs — all CPU/Rust server-side only, per the workshop's own locked premise 2. GPU is presentation only (the c2 pre-empt from the implications pass, unchanged).
(C) The one genuinely gray case — flagged, not resolved here. Named- feature label placement (settlement name text, POI glyphs) when two adjacent gridunits at a coarse step both nominally "contain" the same named feature — is a small client-side de-duplication/placement heuristic (avoid drawing the same city name twice at a seam) legal presentation logic, or does it risk client and server disagreeing about "which gridunit owns this feature's label"? My read: legal, IF the server always ships feature identity (a stable id) rather than the client inferring identity from proximity — then client-side de-dup is deciding where to draw one already- identified thing, not deciding what things exist. This is Araminta's named-feature-encoding call (question 1) to confirm in round 2; I flag it here because it's adjacent to the determinism boundary but is really a wire- schema question (does the id ship) more than an interpolation question.
Why this generalizes cleanly
Every "legal" case in bucket A shares one property: the interpolation input set is closed and server-supplied (two full textures, a finite list of wire-carried points). Every "illegal" case in bucket B shares the mirror property: the interpolation would need to invent a new sample outside that closed set. That's the same test D-227 already applies to derive-don't-store generally ("cache is a bonus, never truth") — I'm not proposing a new principle, I'm stating the existing one precisely enough that "tween rivers/roads" (Jeroen's outline phrase) has an unambiguous yes/no per case instead of being a vibe.
4. Cliff/multi-height ruling — building on Dudley's measurement
T-1177's finding changes the shape of this decision more than I expected going in. Two things I flagged as open in the implications pass are now answered by data, not architecture judgment:
-
The representation question (min/max height pair vs. dominant height + channel-depth + cliff-edge flag) is settled by what the solver actually emits —
HydrologyResultalready produceschannel_depth_scaledandcliff_edgeper cell, directly, no re-derivation needed. Dudley's own argument against min/max (loses the transition shape — is the drop a point or does it span the gridunit — and requires synthesizing two heights from one number the solver never computed) is correct and I'm not relitigating it. Ruling: dominant-height + channel_depth + cliff_edge is the adopted representation. This was "the first option red flag 4 named" and it wins because it's the one that requires zero invented derivation downstream — the wire field is a direct carry of solver output. -
The frequency question changes the stakes. I framed red flag 4 as "the data model needs to represent gorges because hydrology produces them." T-1177's honest finding — zero carved cells across all three production-scale benches (512×256, 768×432, 8.3M), with a clearly articulated structural reason (priority-flood's true-minimum-rim property makes single-basin carving mathematically impossible; genuine carving needs a rare two-independently-sealed-basins-plus-single-cell-corridor geometry) — means gorge cells are a rare, not routine, occurrence at the scales this system actually runs at. That doesn't remove the need for the field (the model must be able to represent what the algorithm produces when it does fire, and "structurally rare" isn't "never" — real planetary heightmaps beyond the one body sampled may differ), but it substantially weakens the wire-cost argument for worrying about it: this is a mostly-zero, sparse,
#[serde(default)]-safe optional field, not a dense per-cell cost driver.
Ruling, stated for filing
Phase-4 Atlas scope, not deferred to Phase-5. Two reasons this call goes into scope rather than out:
- It's nearly free once carved. The representation is a direct carry of
existing solver fields — no new derivation, no new invented-detail
category, and (per the rarity finding) usually a no-op (
channel_depth: 0,cliff_edge: falsefor the overwhelming majority of gridunits). This isn't "cliffs are hard, defer them" — it's "cliffs are already computed, carrying them costs approximately nothing." - Deferring it to Phase-5 in-world geometry with only a "steep" classification would silently violate D-227's determinism-critical framing of hydrology as a settled equilibrium: if the Atlas map shows a lake with a smooth shoreline where the settled hydrology solver actually computed a carved overflow channel, the map is showing something other than what "settled hydrology" means. The whole point of red flag 4 in the implications pass was "hydrology can't be settled as producing gorges while the data model can't represent one" — now that the solver demonstrably does produce them (even if rarely), showing a flattened version on the map is exactly that contradiction, just less frequently triggered.
Wire shape (for Araminta's round-1 payload schema, ④):
elevation: existing dominant-height field, unchanged for the non-gorge case
channel_depth: u16 (quantized), 0 for the overwhelming majority of gridunits
cliff_edge: bool (or a bit folded into an existing classification byte)
What this does NOT resolve, staying honest about scope:
- Whether
channel_depth/cliff_edgeride the tagged step-canvas envelope (§1d) as two more per-cell array fields, or get folded into a bit of an existing field — Araminta's wire-schema call, not mine, but I'd steer toward "new arrays" over "steal a bit" given how sparse the data is (a sparse-friendly encoding, e.g. PNG-per-field per measurement ④'s own finding that DEFLATE handles near-constant fields exceptionally well —morphology/vegetationat 0.0% run density in the RLE table are the same shape channel_depth's near-all-zero distribution would have — actually helps this field cost less than its raw byte width suggests). - The client-side render treatment (cliff-face style transition vs. gradient)
— Stig's call, not architecture's; I note only that
cliff_edgegives the map-art function exactly the signal it needs to make that choice without inventing anything (bucket A interpolation, §3: the client is styling a server-supplied boolean, not deciding where a cliff is). - Whether Block/Tile rungs (where gorge-scale features would actually be visible at all, per T-1154's spacing) are the step ladder's floor or an intermediate step — that's the step-count/step-ladder synthesis, §3 of the brief's expected outputs, round 2 territory.
One honest caveat to carry into round 2 (Troblum's adversarial pass should stress this): T-1177 sampled hydrology on exactly one real body (GJ1c) plus two synthetic gradients. "Structurally rare at production scale" is a strong, well-argued finding, not a survey across the ~273-body population. If a body with genuinely different terrain character (e.g., heavily tectonic, high-relief, many small nested basins) produces carving far more often than GJ1c did, the "usually a no-op" cost argument softens — still correct architecturally (the field costs nothing when zero, something reasonable when nonzero), but the "rare" framing shouldn't be read as "provably rare across the whole body population." Doesn't change my ruling; does mean I wouldn't cite "rare" as load-bearing for anything beyond the wire-cost argument above.
Summary — my four calls, plainly
- Governance delta: five amendment texts drafted and ready to file
(§1a–1e) — the D-166 corollary repoint, T-1143 ruling-3 supersession, the
select_rungreplacement, the tagged-envelope migration as triggered, not merely likely (measurement ④ makes this unambiguous — 21×–563× over the ceiling), and the T-1170 carrier rule surviving with a terminology gloss only. - Gridunit ↔ D-243: snaps, does not float. Gridunit is a per-step role played by a D-243 absolute-metre rung, never a viewport-derived spacing. The only genuinely free parameter is the display ratio (px-per-gridunit), which is a client-side presentation concern cleanly separated from spacing.
- Determinism boundary: client may interpolate only within a closed, server-supplied input set (two arrived textures, wire-carried control points) — never invent a sample outside it, never smooth across a step or rung-truncation boundary. Three concrete legal cases, two illegal, one gray case flagged for Araminta.
- Cliff ruling: dominant-height +
channel_depth+cliff_edge, in Phase-4 Atlas scope (not deferred to Phase-5) — nearly free given T-1177's direct-carry representation and rarity finding, and deferring it would contradict "settled hydrology" itself. Caveat: rarity is measured on one real body, not the population — don't over-lean on it for anything beyond wire cost.
Feasible across the board. The measurements did their job — nothing here is extrapolated, and nothing surfaced a reason to walk back the "architecturally cleaner than what ships today" read from the implications pass. The tagged- envelope migration is the one genuine chunk of new work or this list, and it's exactly the size we already knew it would be.