diff --git a/governance/decisions/architecture.md b/governance/decisions/architecture.md index a98c2740d..3725dd796 100644 --- a/governance/decisions/architecture.md +++ b/governance/decisions/architecture.md @@ -2286,6 +2286,18 @@ Technical foundation decisions that constrain implementation: engine, client-ser - **Dissent:** None. - **Amendment (2026-07-25, T-1192 / PR #205 — rung-0 integer viewport-fit display ratio):** Premise (2)'s "texel-exact, drawn at the display ratio" is **clarified for rung 0**: the Global opener's display ratio is **viewport-fitted per body** — the largest integer screen-px per gridunit that fits the legend-reserved viewport on both axes, floored at 1×1 (an over-viewport canvas draws at native ratio and crops/pans like every fixed rung) — rather than a fixed tunable. Texel-exactness is preserved by construction (every gridunit an exact integer pixel square); the letterbox remainder centres the canvas; fixed rungs keep their tuned constant display ratios. **Non-integer resting-state scaling remains unsanctioned** — a PR #205 review finding (Tyre) removed an implemented fractional-fit branch whose comments cited this record for an exception it does not contain; the [D-227](#d-227) 2026-07-23 corollary's "only sanctioned display-time scaling" (the transient between-step magnification) is joined only by this integer viewport fit, nothing else. +- **Amendment (2026-07-26, pair session with Jeroen — THE EXTENT INVERSION; premise (3) and §(a)/(b)/(d) corrected):** Shipped and eyeball-confirmed the same day. Premise (3)'s "discrete gridunit-**spacing** levels" is **inverted**: a rung fixes the canvas **EXTENT**, and the gridunit spacing falls out of the canvas size. + + 1. **The shorter viewport axis spans exactly one cell of the rung's level** (Jeroen: *"the smallest viewport axis locks the area for calculation, since that is most widescreen friendly"*); the long axis shows proportionally more ground. So `spacing = rung cell size ÷ shorter axis in cells`. §(a)'s "**every fixed rung's gridunit spacing is one of D-243's absolute-metre rungs, never viewport-derived**" is exactly reversed — the D-243 constant is now the rung's **cell size**, and spacing **is** viewport-derived. **Why it had to change:** at `REGION_M` *spacing*, a viewport-sized canvas spanned ~251,658 km — six times around a rocky body — so the Region rung capped to the body and redrew the Global picture pixel-for-pixel. Jeroen's *"the global and region maps need to look the same as the smaller level maps"* was this relation stated in metres, not a rendering defect. A consequence worth keeping: the canvas cell count is now viewport-driven and **identical at every rung**, so derive cost no longer varies with depth and a window resize refits for free. + 2. **Global is viewport-sized, not the body's region grid.** §(a)'s "one gridunit per region, so its canvas *is* the body's region grid — variable per body (~19K gridunits on an Earth-class body)" and §(b)'s "body-surface region-grid canvas" are **retired**. Global now fits the largest **2:1** canvas inside the requested extent (equirectangular whole body — 360° of longitude by 180° of latitude; the aspect cannot follow the viewport or cells stop being square and the map shears), with `spacing = 2πR ÷ width` and the existing letterbox absorbing the remainder. On Lendel that is 960×480 at ~40.8 km/gridunit, replacing 191×95 at 204.8 km. The old shape discarded roughly **seven times** the cells the 512×256 working heightmap already holds, and *shrank as `REGION_M` grew* — so tuning the scale ladder silently degraded the opener, which is why the top of the ladder got worse as the ladder itself was refined. + 3. **Region left the orbital derive set.** It was envelope-only (no courses, no fine detail) because nothing finer made sense at 251,658 km; at 262×466 km it is a genuine provincial map and takes the full courses-aware derive like every fixed rung. **Region carrying no rivers at all was much of why the top of the ladder read flat.** Confirmed by eyeball 2026-07-26: *"Region works."* + 4. **The display-ratio band is uniform at 2×2.** §(a)'s "1×1 ideal → ≥5×5 acceptable" and its "deepest bottom-out rule: 1 screen px per 64 m gridunit" are superseded — every rung reads at 2 screen px per gridunit. Deep-rung derive cost fell ~4× (a 1920×1080 window: ~2.07M cells → ~518K); Global *gains* resolution rather than losing it, since 5 px/gridunit asked for 384 cells across a body whose heightmap stores 512×256. The 2026-07-25 integer viewport-fit amendment above still stands and still governs the letterbox scaling. + 5. **§(b)'s D-226(d) legality argument is now false, though its conclusion holds.** Global was justified as "*coarser* than the region grid"; it is now **finer** (~40.8 km vs 204.8 km). The conclusion is unchanged — [D-226](#d-226)(d) prohibits **tile-level** Atlas maps and caps granularity at settlement/quarter, and 40.8 km is twenty times coarser than a district — but the stated premise must not be relied on by anything downstream. + 6. **§(d)'s always-keep cost model is invalidated and must be re-measured.** The "~8.85 MB PNG across the entire real ~267-body population, trivially process-resident" figure assumed ~18,073 cells/body. A viewport-sized Global is **460,800** cells on a 1080p display — **25×** — putting the tier near **226 MB**, roughly **900 MB** on a 4K display, with per-body derive rising from ~16–21 ms to roughly half a second. **An always-keep tier whose size scales with the user's monitor is the wrong shape.** This is an independent argument for [D-258](#d-258): rung 0.5 is fixed-resolution and baked once per body, and Global becomes a *view* of it rather than a derived-and-retained canvas in its own right. Re-measure against rung 0.5, not against this record. + 7. **Two mechanisms retired.** The S2 **station-spacing floor** (`COURSE_STATION_SPACING_FLOOR_M`) is deleted, not retuned: it guarded an `O(1/spacing)` blowup that a constant per-rung cell count makes structurally impossible, and post-inversion it would have done active harm in the opposite direction — a 2,048 m station pitch across a ~3.6 km District canvas places two stations and draws every river as a straight line. **`cap_extent_to_body`** is superseded by **rung liveness**: a canvas can no longer over-request a body by construction, and the residual question — whether a rung's cell exceeds the whole body — is answered by *omitting* the rung rather than squashing the canvas (it never fires on in-scope content; the only sub-region bodies in `systems.db` are Phobos and Deimos, and Sol is out of generator bounds). + + **Status, honestly:** Region is confirmed working. **Global still reads wrong and this amendment does not fix it** — it is correctly *sized* now but still rides the orbital derive, so it carries no hydrology. Its repair is [D-258](#d-258)'s rung 0.5, not further work on this record. + --- ### D-256: Canonical sampling convention — one absolute-metre derive core; the batch layer is a survey raster