Commit Graph
2729 Commits
Author SHA1 Message Date
jpmschweitzerandClaude Fable 5 b62c252ebb chore(meta): T-1170 mouth-semantics follow-up — inland-reading mouths + pole-edge drains (Jeroen's capture question)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-23 12:14:36 +02:00
jpmschweitzerandClaude Fable 5 64928cd579 chore(meta): close T-1172 — PR #196 merged (waterline clip; rivers no longer draw over drawn ocean)
Hoshe APPROVE zero findings (incl. a 500k-case randomized proof of the
fixture-limit honesty note and his own wrap-direction revert-test);
Araminta APPROVED all points (pixel-scanned the ocean basin: zero
river-teal hits; land read pixel-identical; mouth suppression accepted
on visual merits). Design was Tyre's pre-implementation ruling (rung-
indexed coast -> presentation-frame clip; D-226 two-waterline note).
Cold re-verified on MERGED main (.cache/screenshots/waterline-main/).
Clip retires into T-1170. Gate trap discovered en route ticketed as
T-1173 (orphan-leaking binary-gated skips on client-only branches).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-23 11:52:45 +02:00
jpmschweitzer 0a394bde52 Merge remote-tracking branch 'origin/waterline-clip' 2026-07-23 11:51:29 +02:00
jpmschweitzerandClaude Fable 5 d30c8b72ca chore(meta): T-1172 to review — PR #196 up (waterline-clip)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-23 11:42:21 +02:00
jpmschweitzerandClaude Fable 5 94a2577456 chore(meta): T-1173 filed — client-only branches bounce off the gate via orphan-leaking binary-gated skips
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-23 11:40:45 +02:00
jpmschweitzerandClaude Fable 5 0b14cdb21d fix(ui): T-1172 round 2 — tile wrap resolution mirrored to the painter's own direction
Live round: the first clip removed only 133 pixels. Root cause (dossier-
traced): resolve_morphology_zone wrapped the QUERY toward a tile's raw
canonical center — the inverse of the painter's draw_col =
nearest_wrap_image(tile_center, held_center) — so seam tiles tested
containment against the wrong wrap-image and read real-but-wrong-
location land cells. Fix mirrors the painter exactly: wrap the tile's
own center toward held_center, test the (already held-wrapped) query
against that. Index math itself was confirmed correct end-to-end and
is now factored into shared AtlasWindowGeometry.cell_index_for_local_
offset() (full painter unification not applicable — the painter only
iterates forward, never reverse-looks-up; documented). Post-fix: 1082
traced positions cross-checked against actual painted pixels, 0 real
mismatches; regenerated captures show every dot/mouth on land. The one
pre-existing test encoding the buggy direction as correct was replaced
by positive+negative wrap-semantics tests (the negative one is the
reliable revert discriminator) plus a wire-accurate seam-tile fixture
with an honestly-documented proof limit (a single-tile fixture cannot
distinguish the wrap directions; the multi-tile scan tests can).
Also: two harness traps found and fixed in the lead's drive scratch —
canvas_items stretch factor (root.size now matches the 1920x1080 base
viewport) and mid-arrival snapshots (explicit is_fully_arrived wait;
the round-1 faint result was partly a 4-of-6-tiles capture). 46/46 +
50/50 + five sibling suites regression-free; gdlint clean.

Tickets: T-1172

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-23 11:33:31 +02:00
jpmschweitzerandClaude Fable 5 9914dc0d91 fix(ui): T-1172 — clip river dots/confluences/mouths against the drawn waterline
Jeroen's hands-on report: rivers continuing under the ocean. Tyre's
ruling implemented: the skeleton is rung-independent, the drawn coast
is rung-indexed (warp cutoff admits more octaves per rung), so
reconciliation is a presentation-frame operation — a draw-time clip
against the SAME per-cell morphology verdict the terrain painter used,
at the rung on screen. New pure module atlas_window_water_clip.gd:
cell resolution across both paths (single-window direct; tile mode
selects the containing tile by each tile's OWN echoed n with nearest-
wrap re-expression against that tile's canonical center — response-is-
source-of-truth + wrap discipline reused, not reinvented). Strict drop
(no snap); offshore mouths suppressed (return with real termini in
T-1170 — retirement markers at the clip sites); basins untouched;
fail-open wherever no composite data has arrived (the clip refines
presentation, never gates data). The _pos split feeds the SAME wrap-
resolved district to both draw position and clip test so they can
never disagree about the wrap image. 49 new tests incl. antimeridian
and mid-progressive-arrival fail-open; revert-verified with precise
attribution (breaking water detection fails exactly the 3 water tests,
fail-open/land tests stay green); smoke-suite stub crash under a real
driver caught and fixed (headless skip-gating masked it). 7 suites
regression-free; gdlint clean.

Tickets: T-1172

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-23 10:37:56 +02:00
jpmschweitzerandClaude Fable 5 7c5dc35b38 docs(meta): D-226 two-waterline note (T-1172 — Tyre's rung-indexed-coast ruling)
The drawn coastline is a family of curves indexed by rung (warp cutoff
admits more octaves at finer rungs), so no single authoritative server-
side waterline exists — reconciliation is a presentation-frame
operation at the draw site; the skeleton stays rung-independent. Clip
retires into T-1170's coast-terminating courses.

Tickets: T-1172

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-23 10:19:08 +02:00
jpmschweitzerandClaude Fable 5 93779b12cd chore(meta): activate T-1172 waterline clip — Tyre's rung-indexed-coast ruling recorded, T-1170 retirement dependency noted
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-23 10:17:56 +02:00
jpmschweitzerandClaude Fable 5 48340cb6f6 chore(meta): T-1172 filed — river skeleton draws over drawn ocean (two-waterline disagreement, Jeroen's hands-on report)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-23 10:14:07 +02:00
jpmschweitzerandClaude Fable 5 ee5ed4e08a chore(meta): close T-1156 wave 1 — PR #195 merged (rivers/basins/attractors on the ladder, triple review)
Tyre APPROVE after one fix round (attractor stroke-width compensation,
D-226 visibility-direction capture); Hoshe APPROVE after one fix round
(named default-visibility pins; execution-grade verification incl. own
golden structural diff and independent revert-tests; full gate
3770/3770 at final tip); Araminta APPROVED all four captures after her
District trunk-dot objection was fixed to her exact ask. Cold
re-verified on MERGED main (.cache/screenshots/rivers-main/). Wave 2
(civilizational overlays) stays deferred on the re-scoped T-1156...
wave-2 notes ride the ticket. Unblocked: T-1168 riparian contract,
T-1170 course invention.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-23 09:35:46 +02:00
jpmschweitzer e8149d011e Merge remote-tracking branch 'origin/rivers-ladder' 2026-07-23 09:33:53 +02:00
jpmschweitzerandClaude Fable 5 c1cae7c9b5 test(ui): named default-visibility pins for nature overlays (PR #195 Hoshe finding)
RVR-on-by-default is the single most player-visible behavior wave 1
ships (rivers appear with no toggle hunt) and was only exercised by
live captures; gen_basins' default was pinned incidentally inside the
toggle-redraw spy test and gen_attractors not at all. One named test
now asserts all three fresh-construction defaults per Araminta's
ruling (RVR on, BAS off, ATR off). Revert-verified: flipping the
gen_rivers init line fails exactly this test by name (1 failure total
in the 78-test suite). Suite 78/78; gdlint clean.

Tickets: T-1156

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-23 09:26:55 +02:00
jpmschweitzerandClaude Fable 5 273a1634be chore(meta): PR #195 review captures — T-1171 pole-entry wobble filed; T-1170 per-basin note; T-1156 wave-2 sibling-layer note
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-23 09:16:25 +02:00
jpmschweitzerandClaude Fable 5 8a747e332c fix(ui): PR #195 review round — attractor stroke widths zoom-compensated (Tyre I1/I2/I3)
I1: _draw_attractor_shape's three stroke-width args (Confluence arc,
Coastal/NaturalHarbor arc, Oasis spokes) were raw screen-space literals
— Godot multiplies stroke widths by canvas scale exactly like radii, so
at the Region orbital fit zoom the outlines rasterized at ~0.01px, the
identical sub-pixel class the dot/ring compensation fixed, missed on
glyph internals (and attractors are Region-only — precisely where it
bites). Widths now arrive pre-compensated via a px_w param, keeping the
primitive pure. Regression pin: a source-scan test asserting no
draw_arc/draw_line in the function carries a bare numeric width (the
draw-smoke suite documents its own vacuous-pass mode, so source-scan is
the environment-independent gate); revert-verified by name. I2: D-226
visibility-direction sentence — Araminta's fade-down inversion recorded
as pre-T-1170 with its single revisit point named. I3: class-header
call-site claim corrected (enter() funnels through _enter_at_rung).

Tickets: T-1156

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-23 09:14:47 +02:00
jpmschweitzerandClaude Fable 5 0366e8286f fix(ui): District trunk dot 2.0px/80% — Araminta's PR #195 capture objection
At 1.6px/60% the trunk dot under the mouth ring read as 'mouth glyph
over plain terrain' — invisible without knowing where to look,
underselling the ruling's own 'a major river crosses near here'
intent. 2.0px/80% preserves the fade-down ladder vs Region's
2.2px/100% without reading as accidentally-erased. Doc comment
records the revision provenance.

Tickets: T-1156

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-23 09:06:38 +02:00
jpmschweitzerandClaude Fable 5 f4711d631d chore(meta): T-1156 wave 1 to review — PR #195 up (rivers-ladder)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-23 09:03:15 +02:00
jpmschweitzerandClaude Fable 5 5a382c2e56 style(simulation): cargo fmt — assert message wrap in drainage tests
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-23 08:59:48 +02:00
jpmschweitzerandClaude Fable 5 60faf667a5 fix(ui): T-1156 live rounds — zoom-compensated marker sizes; toggle-redraw regression pin
Live round 2 (the real bug): every nature-overlay marker size was a raw
screen-space constant drawn inside _canvas, whose scale IS view_zoom —
at Lendel's orbital fit zoom (0.0063) a 2.2px trunk dot rendered at
~0.014px, invisible; the same code at District's 3.75 zoom produced the
correctly-visible mouth ring, which is why one capture worked and the
headline rung didn't. Fixed via AtlasWindowGeometry.zoom_compensated_
size() (pure, floor-guarded) wired through every radius/line-width;
basin FILL points are positions and correctly stay unscaled. Suspect
tile-mode-rung-detection was ruled out live (granularity_v2=Region
confirmed in tile mode) but pinned with a named regression test anyway.
+8 pure-function tests incl. a numeric pin of the pre-fix magnitude
(<0.02px at orbital zoom); revert-verified by name. Draw-smoke suite
documented as supplementary (the shared SubViewport background harness
can pass vacuously under X11 BadMatch — the pure suite is the gate).

Live round 3 (drive-script bug, no product change): the lead's scratch
drive passed the button LABEL to set_overlay_visible() and the unknown-
id guard silently no-op'd — but the chase banked a real pin:
test_set_overlay_visible_gen_basins_flips_gate_and_redraws_nature_
overlay (draw-counting spy per the cold-start precedent; is_queued_for_
redraw does not exist in this build). Revert-verified.

Basins verified live: 7 Lendel watershed boundaries render at the
ruling's alphas. Suites: viewer 76/76, geometry-nature 42/42, nature-
overlay 22/22, zoom-ladder 50/50, no regressions across the cluster.

Tickets: T-1156

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-23 08:55:29 +02:00
jpmschweitzerandClaude Fable 5 0d22e50e66 feat(ui): T-1156 — rivers/basins/attractors re-hosted onto the zoom ladder (nature overlay node)
New AtlasWindowNatureOverlay (Node2D on the viewer canvas, above
terrain): self-connects to the shared atlas_layers_received broadcast
(the established one-signal-N-consumers shape) and consumes the whole-
body layer1 skeleton per Tyre's carrier ruling — no windowed wire
touched. Coordinate chain layer1_pixel_to_world_m -> world_m_to_
district -> canvas-local lives in atlas_window_geometry as pure tested
functions; vertical convention (row 0 = North pole, wy increases
south) verified against the server's own pixel_to_world_m, pinned by
pole tests and revert-verified (sign flip fails them by name).
Araminta's per-rung presentation table implemented exactly: Region
full skeleton (radii 0.9/1.4/2.2, confluence 3.5, mouth double-ring),
District trunk-only 1.6px at 60% with mouths at full landmark styling,
Quarter off until T-1170 course invention; retired palette reused
verbatim; RVR on / BAS off / ATR off defaults; missing river_class
falls back to trunk. 58 new tests (34 geometry, 22 lifecycle, 2 real-
driver draw smoke actually rendered); 11 existing atlas suites
regression-free. atlas_window_viewer.gd runs 16 lines past the
advisory 1000-line cap on trivial wiring — accepted, rides T-1158's
decomposition.

Tickets: T-1156

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-23 08:23:59 +02:00
jpmschweitzerandClaude Fable 5 ff98a10d42 feat(simulation): T-1156 — quantized river_class on RiverNetwork (trunk/tributary/stream)
The one additive server change of wave 1 per Tyre's carrier ruling:
river_class: Vec<u8> parallel to river_cells, serde-default-safe, no
new wire field. Log-scaled binning between RIVER_THRESHOLD and the
RIVER-RESTRICTED max accumulation (max over cells passing the is_river
elevation filter — NOT the grid-wide max, which peaks past the
coastline on wet large-ocean bodies and would starve the trunk class
exactly where Araminta's District-shows-trunk-only table needs it;
caught in lead review of round 1, fixed round 2). Log not linear
because accumulation grows combinatorially downstream. By construction
every body with rivers has trunk cells — pinned by a non-synthetic
regression on the committed GJ1c heightmap at the golden's exact
downsample. cascade_layer1.json regenerated: every pre-existing field
byte-identical (python-verified), only the new river_class arrays
added — GJ1c distribution stream 72 / tributary 18 / trunk 3.
drainage 16/16 (+10), layer1 3/3, layer_proxy 50/50, build --tests
clean; revert-verified (non-monotonic binning fails the monotonicity
test by name).

Tickets: T-1156

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-23 08:10:00 +02:00
jpmschweitzerandClaude Fable 5 365b044e79 docs(meta): D-226 wave-1 nature-overlay carrier note (T-1156 — Tyre's ruling)
Rivers/basins/attractors ride the existing whole-body layer1 field —
neither AtlasLayerResponse ceiling touched, no tagged-envelope
migration. Per-rung refinement is client-side class filtering on the
additive river_class (distinct from T-1162's server-side Nyquist
cutoff: a fixed finite graph has nothing to truncate). General rule:
discrete map features ride the whole-body overlay family filtered
client-side; continuous per-metre fields ride the windowed per-cell
arrays — wave 2's roads/settlements inherit this unchanged. Riparian
vegetation response is the named T-1168 forward contract, deferred.

Tickets: T-1156

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-23 08:04:12 +02:00
jpmschweitzerandClaude Fable 5 5155474d14 chore(meta): T-1156 wave-1 design pass captured — T-1168 riparian forward contract, T-1169 labels split-out, T-1170 river-course invention (all gated behind wave 1)
Tyre's carrier ruling: rivers ride the EXISTING whole-body layer1 field
(no new wire field, neither ceiling touched); per-rung refinement is
client-side class filtering (river_class quantized from flow
accumulation — the one additive server change); discrete-geometry-vs-
continuous-field carrier rule established for wave 2. D-226 note added
on the rivers-ladder branch. Si's audit: skeleton is 512x256 heightmap-
resolution dot data (~76 km/cell) — planetary courses real now, sub-
heightmap course geometry named as T-1170, labels split to T-1169
(three dormant pieces, not free).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-23 07:54:41 +02:00
jpmschweitzerandClaude Fable 5 64a65f52e1 chore(meta): activate T-1156 wave 1 — rivers/basins onto the ladder (rivers-ladder worktree)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-23 07:49:17 +02:00
jpmschweitzerandClaude Fable 5 825ea9749f chore(meta): close nature-first batch — T-1162/T-1161 done (PR #194 merged, triple review), T-1155 cancelled as superseded
Tyre APPROVE after one fix round (I1 rung-floor dependency direction
implemented as his stronger ask + drift guard; I2 comment cites; I3
governance captures in his exact text; I4 golden body coverage; all
non-blocking follow-ups swept, none parked). Hoshe APPROVE (empirical
revert checks; his one nit refuted with the diff hunk and formally
retracted). Araminta APPROVED the T-1161 acceptance captures. Cold
eyeball re-verified on MERGED main (.cache/screenshots/nature-octaves-
main/): Region NEAREST crisp, Quarter coast crinkle intact, filters
runtime-verified. T-1155 cancelled: superseded by T-1161's two-axes
outcome per Tyre's Q4 ruling.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-22 23:39:37 +02:00
jpmschweitzer 153b4113b5 Merge remote-tracking branch 'origin/nature-octaves' 2026-07-22 23:37:30 +02:00
jpmschweitzerandClaude Fable 5 972842c320 style(simulation): cargo fmt — const assert line wrap
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-22 23:36:11 +02:00
jpmschweitzerandClaude Fable 5 e5a68f4445 docs(simulation): sweep the last pre-I1 floor-framing comment (Tyre's non-blocking follow-up)
DISTRICT_MIN_WL_M's doc in window_derivation_golden.rs still carried
the 'NOT 2×DISTRICT_M by coincidence alone' framing the I1 fix
inverted everywhere else — now states the rung authors the floor and
the terrain-octave coincidence is guard-pinned, matching the rewritten
MIN_WL_BANDS_M and coast_invention docs.

Tickets: T-1162

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-22 23:34:53 +02:00
jpmschweitzerandClaude Fable 5 f50c93b2c8 docs(meta): PR #194 I3 — §8 step 6 erratum + D-226 filter-axis note (T-1161 two-axes supersedes COMPOSITE_SMOOTH retirement)
Tyre's exact capture: the design pass's 'retire COMPOSITE_SMOOTH /
crisp draw_rect as the only path' is superseded — the const survives
as the compile-time pipeline axis, the crisp path stays as debug/
compare, and crispness-at-sparse-rungs is delivered by the per-rung
sampling-filter policy instead. T-1155's retirement framing is
cancelled (ticket closes on merge). Also records the R2 softening:
the T-1162 relief band adds sub-district elevation variance at
Quarter cutoff, so temperature no longer steps strictly at the
district there — intended, noted so nobody is surprised later.

Tickets: T-1161, T-1162

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-22 23:31:31 +02:00
jpmschweitzerandClaude Fable 5 3368891976 fix(simulation): PR #194 review round — rung-floor dependency direction, golden body coverage, doc honesty
Tyre's I1 (his ruling: the cutoff's job is Nyquist, a property of the
RUNG): MIN_WL_BANDS_M's District band now derives from 2*DISTRICT_M
directly, decoupled from OCTAVE_WAVELENGTHS_M[3] — a detail_scatter
retune can no longer silently redefine the Atlas rung floor. Direction-
agnostic const assert pins the coincidence so drift on either side
breaks the build for a deliberate human decision; golden_cutoffs_match_
the_scale_ladder now pins the District coupling too. I2: D-226
paraphrase replaced with cites to the T-1150 wire-contract note +
T-1162 refinement resolution (2), plus a self-found stale 2048m claim
fixed in the same comments. I4: golden extended with airless/dry
(ceiling_q==0 short-circuit) and volcanic-coast (ridged warp) body
rows via body_sweep_samples() — fixture regen verified 510 insertions,
0 deletions (existing rows byte-identical, purely appended). Q2 nit:
vegetation_invention module doc now states majority-preservation as
the coherence guarantee, not per-cell class stability (a boundary
cell's flip IS the clearing mechanism). Forward-contract for T-1156:
0x5EED_C0DE promoted to named WINDOW_RELIEF_SALT const. 158 focused
tests green; cargo check --tests clean.

Tickets: T-1162, T-1161

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-22 23:31:14 +02:00
jpmschweitzerandClaude Fable 5 918855c878 chore(meta): T-1162/T-1161 to review — PR #194 up (nature-octaves); T-1167 gdlint-debt ticket filed
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-22 23:13:04 +02:00
jpmschweitzerandClaude Fable 5 a5b9c28e74 style(simulation): cargo fmt — gate bounce on T-1162 files
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-22 23:09:48 +02:00
jpmschweitzerandClaude Fable 5 d33256a8ba test(simulation): regenerate believability golden — deliberate T-1162 output change
The octave extension changes derived window output by design (coast
crinkle below 16384m, voxel relief at Quarter, vegetation moisture
perturbation) — this regen records the sanctioned new baseline per the
ticket's part (d) discipline. The pre-existing BELIEVABILITY_STRICT=1
'vegetation present' advisory failure predates this change (Q-123-
tracked debt) and is unaffected.

Tickets: T-1162

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-22 22:56:48 +02:00
jpmschweitzerandClaude Fable 5 5cb63b6867 feat(simulation): T-1162 — invention octaves into the Atlas window path (coast crinkle, quarter relief, vegetation patchiness)
Coast: WARP_OCTAVE_WAVELENGTHS_M 5->9 entries (262144m down to 1024m,
Quarter's Nyquist floor) with new min_wavelength_m cutoff plumbing in
coast_warp_px/warp_fbm (the warp previously had no cutoff at all).
Relief: invent_primitives feeds the VOXEL band (1024-128m, salted) into
elev_q/slope_q under the same envelope/cutoff discipline. Vegetation:
new vegetation_invention module — two-tier (BodyParams+latitude envelope
ceiling; single blended fBm field, never-gated 100-400km massif tier at
70% + cutoff-gated district/voxel texture at 30%) perturbing moisture_q
OUTPUT so precipitation/glaciation/vegetation shift as one world-fact;
wire format unchanged. MIN_WL_BANDS_M 5->6 (adds 1024m band).

Mid-implementation correction caught by tests: District's quantized
floor is 4096m (OCTAVE_WAVELENGTHS_M[3]), not 2x DISTRICT_M — the 8192m
and 4096m coast octaves are legitimately District-admitted enrichment;
only 2048/1024m coast + the voxel band are Quarter-exclusive. Docs and
golden cutoffs corrected to match.

New golden: tests/window_derivation_golden.rs + fixture (derivation_
harness pattern, UPDATE_GOLDEN=1 regen) with structural guards pinning
Quarter/District divergence. Bench (zoom_ladder_bench, release): no
regression — all rungs at or below baseline (District c0 3.54->~3.0
us/cell, Quarter 2.10->1.77, orbital 1.48->1.42, n=6400 window
0.86->0.59 ms). Revert-verified voxel_relief cutoff exclusion. Server
lib 1840 passed; new module 11 tests; district_profile 84 (+6, 1
noise-fragile pre-existing test properly fixed via 8-district
latitude-band averaging).

Tickets: T-1162

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-22 22:56:34 +02:00
jpmschweitzerandClaude Fable 5 c9028af77e feat(ui): T-1161 — per-rung composite filter policy (Region NEAREST, District/Quarter LINEAR)
Araminta's ruling (PR #192 follow-up): filter keyed on rung IDENTITY via
the window's own echoed granularity_v2 — Region (incl. the orbital tile
mosaic, whose tiles are all Region-rung requests) samples NEAREST because
GPU bilinear at 204.8 km/cell reads as smoothing-over-absence; District/
Quarter keep LINEAR where cell density earns the blend. One shared helper
(_filter_for_granularity_v2) at both draw call sites; unknown/missing
wire tags fall back to LINEAR (never trusted into NEAREST). COMPOSITE_
SMOOTH survives as the independent compile-time pipeline axis — the
two-axes split is documented in the file header. Washes/border fades
untouched per the ruling. Focused suite 44/44; revert-verified (helper
hardcoded LINEAR -> exactly the three Region-NEAREST tests fail).

Tickets: T-1161

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-22 22:36:05 +02:00
jpmschweitzerandClaude Fable 5 ffc24b7312 chore(meta): T-1162 refinement resolutions — bench-baseline-first, window-derivation golden as explicit scope, vegetation invention net-new mirroring coast_invention
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-22 22:28:01 +02:00
jpmschweitzerandClaude Fable 5 e41a8dcc8d chore(meta): activate nature-first batch — T-1162 + T-1161 in progress (nature-octaves worktree)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-22 22:25:39 +02:00
jpmschweitzerandClaude Fable 5 bbe9099e22 chore(meta): close T-1163 — PR #193 merged (cold-launch starvation fix); review captures T-1164/T-1165/T-1166 filed
Tyre + Hoshe both APPROVE at 8bb09abad (one Hoshe fix round: wrong-body
Pending regression + comment dedupe, both revert-verified independently).
Cold acceptance re-verified on MERGED main: fresh release server, first
connection, Lendel converged mosaic inside 2s, stable while unattended,
legend one-legend-tall (.cache/screenshots/cold-start-main/). Review
tickets: T-1164 tiled terminal-recovery, T-1165 repaint-edge root-cause,
T-1166 scripted cold-launch test tier (both under T-1037 where noted).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-22 21:30:03 +02:00
jpmschweitzer 6d80936b65 Merge remote-tracking branch 'origin/ladder-cold-start' 2026-07-22 21:22:34 +02:00
jpmschweitzerandClaude Fable 5 8bb09abad0 test(ui): wrong-body Pending must not touch retry state (PR #193 Hoshe finding 1)
Pins on_response()'s guard ordering: body_id check BEFORE the status
branch, so another body's cold Pending can never burn one of our 30
retries or reschedule our timer (multi-body browsing / shared-broadcast
tile fan-out). Revert-verified: reordering the guards makes this test
fail; final own-body Ready assertion proves the request is genuinely
untouched, not just un-retried. 44/44 in the file.

Tickets: T-1163

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-22 21:15:47 +02:00
jpmschweitzerandClaude Fable 5 4c34327b41 docs(ui): PR #193 review capture — D-226 pending-shape protocol note + stagger comment dedupe
Tyre's APPROVE items (T-1163): record the two-legal-wire-shapes-for-one-
logical-state protocol invariant (whole-response Pending AND Ready+null
district_window both mean 're-poll'; only NotFound/Error are terminal) as
a D-226 note under the T-1124 §4 amendment area, so a future server
refactor of the asymmetry must migrate every consumer in the same change.
Drop the duplicated 5-line stagger comment in atlas_window_tile_set.gd.

Follow-up tickets filed on main: T-1164 (tiled terminal-recovery),
T-1165 (queue_redraw edge root-cause), T-1166 (cold-launch test tier).

Tickets: T-1163

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-22 21:11:22 +02:00
jpmschweitzer cf1733cdd6 chore(meta): T-1163 — cold-launch starvation bug (ladder-cold-start branch, in review) 2026-07-22 20:59:22 +02:00
jpmschweitzer 3891c83206 fix(client): cold-body Pending responses reach the retry path — the launch-shape starvation root cause
The true cause of the black first launch, server-confirmed after four
disproven theories: a stone-cold body answers the FIRST window request
with a whole-response status 'Pending' (only the whole-body cache-hit
branch sets Ready), and on_response()'s very first check — status !=
Ready -> return — swallowed it before the retry machinery could run.
retries stayed 0 forever; the DERIVING state never resolved. Second
connections worked by luck (the first request warms the whole-body
cache, so they read Ready and take the healthy path). Both tile fan-out
AND single-window first-descents were affected — one shared function,
one fix: branch on the outer status first (the atlas_generation_proxy
reference shape): Pending -> retry, Ready -> existing null-window retry,
NotFound/Error -> give up immediately (the principled give-up policy,
replacing the elapsed-retries ceiling).

Hardening in the same round: deterministic exponential backoff (0.5s
doubling, 4s cap) + per-tile stagger (0.1s * index — six tiles retry at
0.5/0.6/0.7/0.8/0.9/1.0s, strictly-increasing asserted, not jittered);
MAX_RETRIES 20->30 (~110s horizon under backoff).

Regressions are wire-accurate by construction: whole-response Pending
(body_id only, no center/n/granularity — verified against the server's
own response construction) delivered through the REAL fan-out
(tile_set._on_atlas_layers_received, never tile.on_response directly),
mirrored at single-window level. Two first-draft tests that passed with
the bug reverted were caught and strengthened before reporting; every
fix and hardening piece revert-verified independently (7+1 failing
tests without them).
2026-07-22 20:56:46 +02:00
jpmschweitzer ddc4483462 test(simulation): connection-zero district_window delivery regression (bridge_tcp)
Dudley's audit of the suspected ConnectionId(0) starvation: exhaustive
trace of the delivery path (bridge/mod.rs insert/lookup/send paths,
atlas plugin serve/drain, gen_queue coalescing) found NO sentinel or
default-value collision — ConnectionId doesn't even derive Default, and
every id path is a plain monotonic allocation with linear lookup. The
real gap was coverage: every existing window test used ConnectionId(1).

New connection_zero_window_delivery module replicates main.rs's actual
bootstrap (blocking first-accept -> BridgeResource -> accept loop) and
pins: the first-ever connection receives a district window; the exact
six-tile entry shape delivers all six to connection 0; connection 1
keeps working. 5/5 repeated runs, single- and parallel-threaded.

The live 'starvation' itself was client-side (pending responses never
re-requested on the tile path — separate fix in flight); these tests
stay as the server half's permanent pin.
2026-07-22 20:32:09 +02:00
jpmschweitzer dd13760d62 fix(client): cold-start round 2 — DERIVING TERRAIN state, legend re-fit, release server for make atlas
Item 1: while zero tiles have arrived, the viewer draws a centered
screen-space 'DERIVING TERRAIN…' label (text_dim role, no new hue),
dropping the instant the first tile lands — a cold wait now reads as
loading, not broken. New has_any_tile_arrived() predicate (distinct
from has_pending_tiles(): both true mid-arrival, tested exactly there).

Item 2: legend re-fit root-caused empirically, two plausible fixes
disproven by trace before the real one: a manually-positioned Control's
size NEVER tracks a shrinking minimum in this parenting shape, and
RichTextLabel.fit_content reports degenerate minimums until laid out at
real width once — so reset must be DEFERRED and run after refill, not
inside clear(). ImplantPanel.reset_to_content_size() (call_deferred),
wired into both legend refresh()es. The load-bearing test compares
size.y to get_minimum_size().y — a size-to-size comparison passed
trivially with both numbers equally stuck (caught on first draft).

Item 3: make atlas now builds the RELEASE server and passes
SR_SERVER_BIN (a cold DEBUG server delivers zero tiles for >10s on a
new body — live-measured — vs 210ms warm; release serves cold in well
under a second). atlas_standalone._server_binary_path() honors the env
override per the SR_PORT two-tier precedent, debug path unchanged
when unset.

All fixes revert-verified; nine suites green collateral-checked;
gdlint clean.
2026-07-22 19:51:12 +02:00
jpmschweitzer d4526e51ff fix(client): cold-start black screen — self-healing tile repaint, legend re-entry root cause, pending-tile wash
Jeroen hit a black mosaic zooming into a body from a fresh make-atlas
spawn. Live diagnosis showed all six tiles held with colored textures
and no repaint; the original line-specific diagnosis (unpaired
queue_redraw in _on_tile_ready) turned out WRONG — the pairing already
existed (lead's truncated grep misread the function; Stig verified via
git log -p before acting). Rather than chase the exact dropped signal
edge, _process() now self-heals: both viewer and overlay redraw every
frame while the tile set has pending tiles (has_pending_tiles(), new) —
a strict superset that closes the black regardless of which edge drops,
pinned by a _draw()-counting real-subclass spy test.

Legend stacking root cause found by trace, not guess: ImplantApp.
_on_screen_changed() re-runs enter() unconditionally on repeat
same-screen pushes — each re-entry tore down and rebuilt all six tile
requests (the round-6 orphaning fingerprint via a new trigger) and
stacked another legend (~10 deep, full-height dark panel). Fixed both
ends: ImplantPanel.clear() frees immediately (same-frame re-entrant
refresh can never observe stale children — protects every implant app),
and RegionalScreen.enter() no-ops for the same body (different body
still re-enters fresh). The load-bearing regression asserts an ARRIVED
TILE'S DATA survives a repeat push — node identity would not catch the
teardown (the tile-set Node is a fixed field; only its internals reset).

Cold-start UX: pending tiles now draw the single-window path's
COLOR_BORDER_FADE wash instead of raw background — a deriving mosaic
reads as loading, not broken.

Suites green (zoom_ladder 48, viewer 74, tile_set 20, overlay 30,
overlays 46 + 2 new files), gdlint clean, revert-verified throughout.
2026-07-22 19:05:15 +02:00
jpmschweitzer 74662470c6 chore(meta): nature-layer scope ruling — T-1162 gains vegetation patchiness, T-1156 split into nature-first waves (cities uncolored for now, per Jeroen + D-166 outside-in) 2026-07-22 18:33:11 +02:00
jpmschweitzer 0a69710ca5 chore(meta): T-1162 — extend invention octaves into the window path (Jeroen's flatness/coastline feedback; content floor 4km/16km vs 512m transport) 2026-07-22 18:30:52 +02:00
jpmschweitzer 41017166aa chore(meta): zoom ladder shipped — T-1152/T-1153 closed (PR #192 merged, triple review, six live rounds, eight integration bugs pinned) 2026-07-22 17:40:55 +02:00
jpmschweitzer 919660c5ae Merge remote-tracking branch 'origin/zoom-ladder-continuous' 2026-07-22 17:40:20 +02:00