feat(ui): cap rung extents to the body + fit/center the Global canvas (T-1189, T-1192) #205

Closed
jpmschweitzer wants to merge 0 commits from atlas-rung-presentation into main
Owner

Summary

The two client fixes for the Atlas frames Jeroen flagged as looking broken (T-1183 eyeball captures).

T-1189 — Region rung no longer requests more planet than exists. StepCanvasTransport.cap_extent_to_body() caps the viewport-fit extent at the body's own region grid, sourced from the Global rung's echoed canvas size (server-side global_cell_counts() IS the region grid — cols=regions_per_equator, rows=cols/2, no unit conversion). Matched by gridunit SPACING, not rung name (shape-generic — any future rung sharing Global's spacing is covered; finer rungs are no-ops by construction). Applied in _request_extent() before the request/cache key is built, so key discipline from T-1182/T-1183 holds. Cold-start (scroll-to-Region before the first Global echo): request uncapped, server clamps — documented, chosen over fetch-Global-first to avoid blocking the scroll gesture. Kills both the side-by-side continent repeat and the past-the-pole stripe smear.

T-1192 — Global opener fit-scales and centers. One shared letterbox mechanism (center_offset / integer_fit_scale / fit_scale with a 75%-coverage integer-vs-fractional decision) used by BOTH the Global fit and the Region cap's letterbox remainder. Integer scale preferred per D-255 texel-exactness; fractional fallback is legal because orbital rungs already force NEAREST filtering. Legend column reserved before fitting (constant pinned to the legend's own width by a cross-file test) — legend never overlaps the canvas. GJ1c at 1920x1080 → ~1.84x fractional fill; at 4K → integer 4x.

Also fixes a latent crash: NOTIFICATION_RESIZED fires mid-_ready() before children exist — null guard added.

Verification

Touched suites: transport 80/80, viewer 72/72, legend 12/12, annotation-layer 10/10; gdlint clean on all touched files. Full gate: 3,504/3,504 including the SR_LIVE e2e suites (server binary present this run). Reviews next; the before/after eyeball re-capture of the flagged frames runs on the final tip — merge waits on it.

🤖 Generated with Claude Code

## Summary The two client fixes for the Atlas frames Jeroen flagged as looking broken (T-1183 eyeball captures). **T-1189 — Region rung no longer requests more planet than exists.** `StepCanvasTransport.cap_extent_to_body()` caps the viewport-fit extent at the body's own region grid, sourced from the Global rung's echoed canvas size (server-side `global_cell_counts()` IS the region grid — cols=regions_per_equator, rows=cols/2, no unit conversion). Matched by gridunit SPACING, not rung name (shape-generic — any future rung sharing Global's spacing is covered; finer rungs are no-ops by construction). Applied in `_request_extent()` before the request/cache key is built, so key discipline from T-1182/T-1183 holds. Cold-start (scroll-to-Region before the first Global echo): request uncapped, server clamps — documented, chosen over fetch-Global-first to avoid blocking the scroll gesture. Kills both the side-by-side continent repeat and the past-the-pole stripe smear. **T-1192 — Global opener fit-scales and centers.** One shared letterbox mechanism (`center_offset` / `integer_fit_scale` / `fit_scale` with a 75%-coverage integer-vs-fractional decision) used by BOTH the Global fit and the Region cap's letterbox remainder. Integer scale preferred per D-255 texel-exactness; fractional fallback is legal because orbital rungs already force NEAREST filtering. Legend column reserved before fitting (constant pinned to the legend's own width by a cross-file test) — legend never overlaps the canvas. GJ1c at 1920x1080 → ~1.84x fractional fill; at 4K → integer 4x. **Also fixes a latent crash:** NOTIFICATION_RESIZED fires mid-_ready() before children exist — null guard added. ## Verification Touched suites: transport 80/80, viewer 72/72, legend 12/12, annotation-layer 10/10; gdlint clean on all touched files. Full gate: 3,504/3,504 including the SR_LIVE e2e suites (server binary present this run). Reviews next; the before/after eyeball re-capture of the flagged frames runs on the final tip — merge waits on it. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
jpmschweitzer added 2 commits 2026-07-25 12:58:26 +02:00
The two client fixes for the Atlas frames Jeroen flagged. Region rung no
longer requests more planet than exists: cap_extent_to_body() caps the
viewport-fit extent at the body's own region grid (the Global canvas
extent echo — cols=regions_per_equator, rows=cols/2), matched by gridunit
SPACING not rung name, applied before the request/cache key is built;
cold-start scroll-before-Global-echo requests uncapped and lets the
server clamp (documented). Kills both the side-by-side continent repeat
and the past-the-pole stripe smear.

Global opener now fit-scales and centers through one shared letterbox
mechanism (center_offset/integer_fit_scale/fit_scale, 75%-coverage
integer-vs-fractional decision, NEAREST already forced on orbital rungs
per D-255's escape hatch) also used for the Region cap's letterbox
remainder. Legend column reserved before fitting — pinned to the legend's
own width by a cross-constant test, never overlapping the canvas.

Also fixes a latent crash: NOTIFICATION_RESIZED fires mid-_ready() before
children exist; null guard in the resize path.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
jpmschweitzer added 2 commits 2026-07-25 13:16:31 +02:00
The fractional fit branch is deleted, resolving both review findings at
the root: tyre showed its comments cited D-255 for an exception the
record does not contain (the language came from the lead's ticket text,
not governance), and hoshe showed it returned sub-1x for a canvas
exceeding the viewport on one axis. Replacement: fit_scale_ratio()
chooses the largest integer pixels-per-gridunit R fitting both
legend-reserved axes, floored at 1 (over-viewport draws native and
crops like every fixed rung) — the fine-grained integer lattice (GJ1c
1080p -> 9px/gu = 1593x792, ~98% width; 4K -> 20) that makes the
fractional hatch unnecessary. center_offset() floors to whole pixels
(half-pixel centering would blur the texel grid). Doc comments cite the
real sanction (D-255 amendment 2026-07-25, this branch). Legend column
constant is now canonical in transport, read directly by the legend
(was an independently-typed literal); its test asserts real geometry.
New regression test proves _global_body_extent clears on body switch
and never caps another body's requests.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Records the T-1192 presentation ruling: the Global opener's display
ratio is viewport-fitted per body to the largest integer px/gridunit
that fits the legend-reserved viewport (floored at 1x1, letterbox
centred), texel-exact by construction; fixed rungs keep their tuned
constants. Explicitly notes that non-integer resting-state scaling
remains unsanctioned and that a PR #205 review finding removed a
fractional-fit branch which had cited this record for an exception it
does not contain — the mis-citation episode is part of the record so it
cannot recur silently.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Author
Owner

Review: atlas-rung-presentation -> main (type: code)

Reviewers: Hoshe (code quality) + Tyre (architecture). Both REQUEST_CHANGES; all findings verified and addressed in 374b19559 + 4c44786f9.

Tyre (architecture): REQUEST_CHANGES

# File Issue Resolution
1 step_canvas_transport.gd (fit family docs) The fractional-fit escape hatch was justified as "D-255's own phrase/exception" — language that does not exist anywhere in the record, whose actual mandate is unqualified texel-exact. A governance-citation fabrication attached to a real interpretation call never put to the record. (Fractional+NEAREST avoids blur but is not texel-exact: uneven 1px/2px texel duplication.) Fixed at the root — the fractional branch is deleted entirely, replaced by fine-grained integer px-per-gridunit fitting (largest integer R fitting both legend-reserved axes; GJ1c@1080p → 9px/gu = 1593×792, ~98% width — the coarse footprint-multiple lattice was what made fractional look necessary). Texel-exact preserved by construction. The interpretation call that remains (rung-0's display ratio is viewport-fitted per body rather than a fixed tunable) is now recorded as a real D-255 amendment (2026-07-25) in this branch, which also names the mis-citation episode explicitly. Attribution note: the fabricated phrasing originated in the lead's ticket text — the mis-attribution is a shared failure, now structurally recorded.
2 CHANGELOG.md The pre-existing T-1182 "texel-exact / no client-side scaling" claim would be false under the fractional path Resolved by #1 — with fractional gone the claim stays true; the new entry states the Global view fills the frame at an integer texel scale
3 step_canvas_transport.gd:95 / step_canvas_legend.gd LEGEND_COLUMN_PX hand-duplicated as an independently-typed literal on the legend side Fixed — transport is canonical; the legend's RESERVED_COLUMN_PX is a direct read of StepCanvasTransport.LEGEND_COLUMN_PX; the redundant cross-pin test replaced with a real-geometry assertion (legend's actual right edge inside the reserved column)

Hoshe (code quality): REQUEST_CHANGES

# File Issue Resolution
1 step_canvas_transport.gd fit_scale Fractional branch returns sub-1x for a canvas exceeding the viewport on one axis (GJ1c 885px footprint in 348px available → 0.39x), violating the documented never-below-native invariant; reachable at ordinary window widths, untested Fixed by the same root change — fit_scale_ratio() floors at 1 (native + crop/pan, matching every fixed rung); hoshe's exact repro is now a test (348px case → R=1)
2 test_step_canvas_viewer.gd No test proves _global_body_extent resets on body switch — the exact stale-cap failure mode the mechanism must prevent Fixed — new test lands a Global extent for body A, enters body B, asserts the cap source reads ZERO and the next Region request goes out uncapped

Hoshe's verified-clean list (cache-key threading end-to-end, resize null-guard timing, degenerate-request analysis, cold-start fallback) is on record in the review transcript.

Additional in the fix round

  • center_offset() now floors to whole pixels — an odd letterbox remainder was landing the canvas on a .5px boundary, a fractional-pixel blur edge on the rung the mechanism exists to keep sharp.
  • D-255 citation sweep across all four touched sources: every remaining citation verified as a genuine quote against the record body.

Verification (fix round)

transport 92/92, viewer 76/76, legend 12/12, annotation-layer 10/10; gdlint zero warnings on all touched files; full gate re-run green on push. The before/after eyeball re-capture of the originally-flagged frames runs on this tip — merge follows it.

Verdict: CHANGES REQUESTED -> addressed in 374b19559 + 4c44786f9; merge follows the eyeball.

# Review: atlas-rung-presentation -> main (type: code) Reviewers: Hoshe (code quality) + Tyre (architecture). Both REQUEST_CHANGES; all findings verified and addressed in `374b19559` + `4c44786f9`. ### Tyre (architecture): REQUEST_CHANGES | # | File | Issue | Resolution | |---|------|-------|------------| | 1 | step_canvas_transport.gd (fit family docs) | The fractional-fit escape hatch was justified as "D-255's own phrase/exception" — language that does not exist anywhere in the record, whose actual mandate is unqualified texel-exact. A governance-citation fabrication attached to a real interpretation call never put to the record. (Fractional+NEAREST avoids blur but is not texel-exact: uneven 1px/2px texel duplication.) | **Fixed at the root** — the fractional branch is deleted entirely, replaced by fine-grained integer px-per-gridunit fitting (largest integer R fitting both legend-reserved axes; GJ1c@1080p → 9px/gu = 1593×792, ~98% width — the coarse footprint-multiple lattice was what made fractional look necessary). Texel-exact preserved by construction. The interpretation call that remains (rung-0's display ratio is viewport-fitted per body rather than a fixed tunable) is now **recorded as a real D-255 amendment (2026-07-25)** in this branch, which also names the mis-citation episode explicitly. Attribution note: the fabricated phrasing originated in the lead's ticket text — the mis-attribution is a shared failure, now structurally recorded. | | 2 | CHANGELOG.md | The pre-existing T-1182 "texel-exact / no client-side scaling" claim would be false under the fractional path | **Resolved by #1** — with fractional gone the claim stays true; the new entry states the Global view fills the frame at an integer texel scale | | 3 | step_canvas_transport.gd:95 / step_canvas_legend.gd | LEGEND_COLUMN_PX hand-duplicated as an independently-typed literal on the legend side | **Fixed** — transport is canonical; the legend's RESERVED_COLUMN_PX is a direct read of StepCanvasTransport.LEGEND_COLUMN_PX; the redundant cross-pin test replaced with a real-geometry assertion (legend's actual right edge inside the reserved column) | ### Hoshe (code quality): REQUEST_CHANGES | # | File | Issue | Resolution | |---|------|-------|------------| | 1 | step_canvas_transport.gd fit_scale | Fractional branch returns sub-1x for a canvas exceeding the viewport on one axis (GJ1c 885px footprint in 348px available → 0.39x), violating the documented never-below-native invariant; reachable at ordinary window widths, untested | **Fixed by the same root change** — fit_scale_ratio() floors at 1 (native + crop/pan, matching every fixed rung); hoshe's exact repro is now a test (348px case → R=1) | | 2 | test_step_canvas_viewer.gd | No test proves _global_body_extent resets on body switch — the exact stale-cap failure mode the mechanism must prevent | **Fixed** — new test lands a Global extent for body A, enters body B, asserts the cap source reads ZERO and the next Region request goes out uncapped | Hoshe's verified-clean list (cache-key threading end-to-end, resize null-guard timing, degenerate-request analysis, cold-start fallback) is on record in the review transcript. ### Additional in the fix round - `center_offset()` now floors to whole pixels — an odd letterbox remainder was landing the canvas on a .5px boundary, a fractional-pixel blur edge on the rung the mechanism exists to keep sharp. - D-255 citation sweep across all four touched sources: every remaining citation verified as a genuine quote against the record body. ### Verification (fix round) transport 92/92, viewer 76/76, legend 12/12, annotation-layer 10/10; gdlint zero warnings on all touched files; full gate re-run green on push. The before/after eyeball re-capture of the originally-flagged frames runs on this tip — merge follows it. ### Verdict: CHANGES REQUESTED -> addressed in `374b19559` + `4c44786f9`; merge follows the eyeball.
Author
Owner

Presentation eyeball — PASS (merge gate)

Live run on the fixed tip 4c44786f9, real client + live server, judged against the known-bad T-1183 baseline frames.

  • Global: centered 1593×792 canvas (symmetric canvas_position=(309,144)), letterboxed, uniform 9×9 texel blocks, legend fully beside the map — vs the old ~885×440 top-left sliver with legend overlap. Integer fit re-confirmed adapting at 1280×720 (~6px/texel, still centered).
  • Region: planet exactly once, no side-by-side repeat, no pole-smear stripes; held_extent=(177,88) confirms the body-grid cap (old shape was 384×216).
  • District: no regression (unaffected by this PR; its content fixes ride the server branch).
  • Cache-key discipline proven live: the old uncapped Region entry (…384,216:0) sits untouched with last_read_at unrefreshed; the new capped request wrote a fresh …177,88:0 entry (genuine miss); Global was a legitimate hit (content identical, layout client-side).
  • Zero anomalies: no errors, no nav pops, InputSwallower had nothing to intercept.

Captures: .cache/screenshots/t1189-92-eyeball/ vs baseline .cache/screenshots/t1183-eyeball-run2/. Merging.

# Presentation eyeball — PASS (merge gate) Live run on the fixed tip `4c44786f9`, real client + live server, judged against the known-bad T-1183 baseline frames. - **Global:** centered 1593×792 canvas (symmetric `canvas_position=(309,144)`), letterboxed, uniform 9×9 texel blocks, legend fully beside the map — vs the old ~885×440 top-left sliver with legend overlap. Integer fit re-confirmed adapting at 1280×720 (~6px/texel, still centered). - **Region:** planet exactly once, no side-by-side repeat, no pole-smear stripes; `held_extent=(177,88)` confirms the body-grid cap (old shape was 384×216). - **District:** no regression (unaffected by this PR; its content fixes ride the server branch). - **Cache-key discipline proven live:** the old uncapped Region entry (`…384,216:0`) sits untouched with `last_read_at` unrefreshed; the new capped request wrote a fresh `…177,88:0` entry (genuine miss); Global was a legitimate hit (content identical, layout client-side). - Zero anomalies: no errors, no nav pops, InputSwallower had nothing to intercept. Captures: `.cache/screenshots/t1189-92-eyeball/` vs baseline `.cache/screenshots/t1183-eyeball-run2/`. Merging.
jpmschweitzer closed this pull request 2026-07-25 13:29:11 +02:00

Pull request closed

This pull request cannot be reopened because the branch was deleted.
Sign in to join this conversation.
No Reviewers
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: jpmschweitzer/settled-reach#205