feat(ui): the Atlas ladder bottoms out at Quarter (D-255, T-1213)

Quarter becomes the deepest navigable rung. Block and Chunk leave the ladder.

The rule, from the amendment: the deepest Atlas rung is the one at which a
screen pixel shows one subtile. At the uniform 2x2 px display ratio a
3440x1440 window gives 540 gridunits on the short axis, so Quarter's 512 m
extent draws 0.948 m per gridunit -- about one voxel per gridunit and one
0.5 m subtile per pixel. Block (0.237) and Chunk (0.119) magnify beneath the
finest datum that can exist, and measured as exactly that on Ferrath: one
morphology zone, one vegetation class, an unbroken colour field. They were not
missing a feature; there was nothing left to show them.

CHUNK ITSELF IS UNTOUCHED. It remains D-243's 64 m stream/derive unit and is
where Phase 5 derives first-person walkable content -- D-012's
load-around-the-player is expressed in chunks. Block remains the 128 m
generator planning unit. Both keep their enum variants, their extent_m answers
and their wire vocabulary. What was retired is the claim that a MAP of one is
worth looking at.

DEEP_RUNGS moved with the floor, and this is the part worth reading twice. It
is a mandatory D-255(d) hardening: a per-body retention cap bounding how much
ground an exhaustive pan can hold resident at fine spacing. Left as
[Block, Chunk] it would have guarded rungs no client can request -- dead code
-- while the accumulation gap silently re-opened under Quarter, now the finest
navigable rung at ~0.95 m per gridunit. It is now [District, Quarter]. A
control that names its targets by rung has to follow the ladder when the
ladder moves.

Six tests pinned the old floor and were updated rather than deleted, since
each was protecting a real property: the clamp tests now clamp at Quarter, and
the disk-cache tests use Region for "shallow" (District is capped now) and
Quarter for "deep". One new test pins the distinction the change turns on --
the retired rungs are absent from RUNG_LADDER but still present in
RUNG_EXTENT_M, because viewability was retired, not vocabulary.

Also removes the four capture scenarios for the retired rungs, including the
two blank goldens that had been passing against blank captures.

1838 client tests, 0 failed. Server clippy clean, step_canvas suite green.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-08-07 14:38:47 +02:00
co-authored by Claude Opus 5
parent b429f633e6
commit 8eb5cb9ff7
10 changed files with 212 additions and 86 deletions
@@ -58,8 +58,9 @@ extends RefCounted
## existing `put(sim_ttl_sec)` parameter — tracked in T-1190.
##
## **HARDENING (D-255(d), both mandatory):**
## (i) Per-body deep-rung retention cap — DEEP_RUNGS (Block, Chunk; the
## two finest, matching troblum-round2.md S3's specific pan-assembly
## (i) Per-body deep-rung retention cap — DEEP_RUNGS (District, Quarter as
## of the 2026-08-07 ladder-floor amendment; the two finest, matching
## troblum-round2.md S3's specific pan-assembly
## concern) are capped at MAX_DEEP_RUNG_ENTRIES_PER_BODY resident
## entries, independent of the Global floor and independent of the
## general Tier-2 byte budget — closes the D-226(d) accumulation gap
@@ -120,7 +121,15 @@ const SUB_GLOBAL_BYTE_BUDGET: int = 256 * 1024 * 1024
## bytes — capping entry count directly bounds how much ground a client can
## have simultaneously resident at fine spacing, which is the D-226(d)
## purpose (information content), not a byte-budget proxy for it.
const DEEP_RUNGS: Array = ["Block", "Chunk"]
## Re-pointed 2026-08-07 (D-255 ladder-floor amendment): was ["Block",
## "Chunk"]. Those two left the navigable ladder — a screen pixel there shows
## less than one subtile, so they magnify rather than inform — which would have
## left this cap guarding rungs no client can request, i.e. dead code, while the
## accumulation gap it exists to close re-opened silently under the new finest
## rungs. The control follows the ladder: District and Quarter are now the two
## finest, and Quarter at ~0.95 m per gridunit is exactly the fine-spacing
## exhaustive-pan case S3 raised.
const DEEP_RUNGS: Array = ["District", "Quarter"]
const MAX_DEEP_RUNG_ENTRIES_PER_BODY: int = 512
## (ii) Schema/version tag source: the game's `project.yaml` `version:`
@@ -20,14 +20,27 @@ const RUNG_QUARTER: String = "Quarter"
const RUNG_BLOCK: String = "Block"
const RUNG_CHUNK: String = "Chunk"
## Coarsest (0) to deepest (5) — the SIX levels D-255(a) names, index IS the
## rung. scroll_step()/rung_at_index() below are the only places this table
## is walked; every other consumer works in terms of the rung NAME (matching
## the wire's own bare-string vocabulary, never a raw integer sent over the
## bridge).
const RUNG_LADDER: Array = [
RUNG_GLOBAL, RUNG_REGION, RUNG_DISTRICT, RUNG_QUARTER, RUNG_BLOCK, RUNG_CHUNK
]
## Coarsest (0) to deepest (3) — the navigable ladder, index IS the rung.
## scroll_step()/rung_at_index() below are the only places this table is
## walked; every other consumer works in terms of the rung NAME (matching the
## wire's own bare-string vocabulary, never a raw integer sent over the bridge).
##
## BLOCK AND CHUNK ARE DELIBERATELY ABSENT (D-255 amendment 2026-08-07). The
## deepest Atlas rung is the one at which a screen pixel shows one subtile;
## below that a rung magnifies rather than informs. At the uniform 2x2 px
## display ratio a 3440x1440 window gives 540 gridunits on the short axis, so
## Quarter's 512 m extent is 0.948 m per gridunit — about one voxel per
## gridunit and one 0.5 m subtile per pixel. Block (0.237 m/gridunit) and Chunk
## (0.119) magnify beneath the finest datum that can exist, and measured as
## exactly that: one morphology zone and one vegetation class, an unbroken
## colour field.
##
## They remain valid WIRE vocabulary (RUNG_EXTENT_M and the server enum still
## carry them) — this is the list the user can scroll through, not the set of
## rungs that can be named. And the 64 m chunk itself is untouched as the
## generator's stream/derive unit: it is what Phase 5 builds first-person
## walkable content on. Only the map stops there.
const RUNG_LADDER: Array = [RUNG_GLOBAL, RUNG_REGION, RUNG_DISTRICT, RUNG_QUARTER]
## D-243 world-metre CELL SIZE for every FIXED rung — mirrors
## server/src/atlas/scale.rs's own constants exactly (REGION_M/DISTRICT_M/