chore(meta): changelog + pql — T-1197 done (PR #217 merged, araminta re-accepted)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
@@ -3157,3 +3157,57 @@ INSERT INTO ticket_history (ticket_record_id, field, old_value, new_value, chang
|
||||
|
||||
FIXED (2026-07-26, direct on main): the test already used median-of-5 (T-1092''s earlier mitigation) and still flaked three times in one day (0.549/0.503/0.638) when concurrent cargo builds inflated all five samples together. Superseded with MINIMUM-of-7: the assertion asks whether the CODE meets the D-059 budget, and load can only inflate wall time, never deflate it — the minimum is the least-noise estimator of code capability while a real regression shifts the minimum too. Budget unchanged at 0.5ms (regression-catching power preserved). Verified 46/46. Closing.', NULL, '2026-07-26 13:17:28', '2026-07-26 13:17:28.575', '2026-07-26 13:17:28.575', NULL, '130fa8e2d5fc4d4925eb0911c0dd8c21', 2) ON CONFLICT(hash) DO NOTHING;
|
||||
INSERT INTO ticket_history (ticket_record_id, field, old_value, new_value, changed_by, changed_at, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FSWYQA1XKYKEQ114CZKEDAFW', 'status', 'backlog', 'done', NULL, '2026-07-26 13:17:35', '2026-07-26 13:17:35.790', '2026-07-26 13:17:35.790', NULL, '4320a9e32c27bc27bb28a71b3bf909ce', 2) ON CONFLICT(hash) DO NOTHING;
|
||||
INSERT INTO ticket_history (ticket_record_id, field, old_value, new_value, changed_by, changed_at, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FSWCYA60VHFK44J09WW78FY0', 'description', 'Found during the PR #215 review fix round (T-1116, Tyre finding 3 follow-through): attractor_matching.rs::synthetic_attractor (the D-211 Phase-4 overflow path, PlainCenter at min-spacing) takes no heightmap/TerrainAnalysis argument — it derives positions by pure grid arithmetic (grid_h/2, grid_w/4, spacing-walk) with zero ocean_mask check. Every EXTRACTED attractor type is land-guaranteed (features.rs::extract_attractors filters !ocean_mask, D-209), but a synthetic-overflow settlement can be placed in open water — visible as an ocean-stranded settlement marker on the Atlas. T-1116''s routing relaxation degrades this case gracefully (surrogate anchor within ring 3, else an isolated unrouted node — never a panic or a water road), but the placement guarantee itself is the gap. Documented in road_graph.rs''s anchor comment and the D-210 amendment (PR #215). Fix shape: thread the ocean mask (or TerrainAnalysis) into synthetic_attractor and nudge/reject water candidates deterministically — mind D-211''s seed-derived-position promise (any nudge must be a pure function of seed + terrain, no RNG state change). Verify by hunting a real body whose synthetic overflow currently lands in water (none observed yet — GJ251c/GJ380c placements are all extracted attractors) or a synthetic fixture.', 'Found during the PR #215 review fix round (T-1116, Tyre finding 3 follow-through): attractor_matching.rs::synthetic_attractor (the D-211 Phase-4 overflow path, PlainCenter at min-spacing) takes no heightmap/TerrainAnalysis argument — it derives positions by pure grid arithmetic (grid_h/2, grid_w/4, spacing-walk) with zero ocean_mask check. Every EXTRACTED attractor type is land-guaranteed (features.rs::extract_attractors filters !ocean_mask, D-209), but a synthetic-overflow settlement can be placed in open water — visible as an ocean-stranded settlement marker on the Atlas. T-1116''s routing relaxation degrades this case gracefully (surrogate anchor within ring 3, else an isolated unrouted node — never a panic or a water road), but the placement guarantee itself is the gap. Documented in road_graph.rs''s anchor comment and the D-210 amendment (PR #215). Fix shape: thread the ocean mask (or TerrainAnalysis) into synthetic_attractor and nudge/reject water candidates deterministically — mind D-211''s seed-derived-position promise (any nudge must be a pure function of seed + terrain, no RNG state change). Verify by hunting a real body whose synthetic overflow currently lands in water (none observed yet — GJ251c/GJ380c placements are all extracted attractors) or a synthetic fixture.
|
||||
|
||||
Implementation complete on branch ocean-guard-synthetic (worktree .worktrees/ocean-guard-synthetic).
|
||||
|
||||
COMPATIBILITY ANSWER (requirement 1): confirmed via a live scan of every real
|
||||
body with a heightmap (267 bodies, world seeds 42 and "yolo") plus a targeted
|
||||
before/after comparison — the guard does NOT move any currently-land synthetic
|
||||
placement. Direct evidence: 63 real land-arithmetic synthetic placements
|
||||
checked across all bodies, 63 unmoved (byte-identical position). Full
|
||||
`cargo test` also confirms every existing golden/determinism fixture
|
||||
(cascade_golden, golden_seed_determinism_regression, believability_determinism_and_golden,
|
||||
window_derivation_golden_regression) still passes unchanged.
|
||||
|
||||
FIX SHAPE: synthetic_attractor(placed, grid_w, grid_h, terrain: Option<&TerrainAnalysis>)
|
||||
-> Option<GeographicAttractor>. terrain=None reproduces the exact pre-T-1206
|
||||
behavior (existing callers/tests untouched). When Some: land-passthrough (an
|
||||
already-land arithmetic position returns unchanged), water-only-correction via
|
||||
a new nearest_land_cell() ring-walk (T-1116 nearest_passable_cell pattern at
|
||||
native resolution, row-major tie-break, column wrap / row clamp matching every
|
||||
other grid walk in the cascade), bounded by MAX_LAND_SEARCH_RING = 128 cells
|
||||
(sized empirically from the scan: real bodies'' nearest land to the arithmetic
|
||||
(0,0) default was as far as 125 cells away due to polar/high-latitude ocean
|
||||
bands — grid_h/2 = 128 is the natural ceiling).
|
||||
|
||||
DEGRADATION RULING (requirement 2): no land within MAX_LAND_SEARCH_RING ->
|
||||
skip the synthetic attractor entirely (match_cities'' Phase 4 loop does not
|
||||
push a placement for that city). Reported via the EXISTING Phase-5
|
||||
name-fulfillment warning ("atlas city was not placed") -- no new error path,
|
||||
never a panic, never a fabricated water position. At MAX_LAND_SEARCH_RING=128
|
||||
this degradation path does not trigger on any of the 267 scanned real bodies
|
||||
at either seed tested; it is exercised only in unit tests (tiny all-ocean
|
||||
grids).
|
||||
|
||||
VERIFICATION (requirement 3): wrote a scratch scan (deleted after use, tree
|
||||
clean) that ran the real cascade for all 267 bodies with a heightmap. Found a
|
||||
REAL, reproducible repro: 46 of 109 synthetic-overflow placements landed in
|
||||
open water pre-fix (world seed 42), e.g. GJ903c city_id=24375 at (0,0) which
|
||||
is ocean. Post-fix: 0 in water, 109 total synthetic placements preserved
|
||||
(same count as before -- no unexplained drops), confirmed at a second seed
|
||||
("yolo") too.
|
||||
|
||||
Files changed: server/src/atlas/attractor_matching.rs (synthetic_attractor +
|
||||
nearest_land_cell + match_cities signature + 9 new unit tests),
|
||||
server/src/atlas/cascade.rs (thread terrain_analysis through run_layer3),
|
||||
server/src/atlas/road_graph.rs (anchor comment updated to CLOSED),
|
||||
governance/decisions/architecture.md (D-210 amendment addendum, dated
|
||||
2026-07-26, validated via pql decisions validate --vault).
|
||||
|
||||
Full cargo test: 2221 passed, 0 failed (one gen_queue.rs worker-pool timing
|
||||
test flaked once under full-suite parallel load, confirmed unrelated and
|
||||
non-reproducible in isolation / module-scoped / --lib-only runs, and absent on
|
||||
a clean full-suite rerun). No golden fixtures changed.', NULL, '2026-07-26 13:23:55', '2026-07-26 13:23:55.540', '2026-07-26 13:23:55.540', NULL, '8af7979612b90a17bce6b8bafca84fb4', 2) ON CONFLICT(hash) DO NOTHING;
|
||||
INSERT INTO ticket_history (ticket_record_id, field, old_value, new_value, changed_by, changed_at, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FSWCYA60VHFK44J09WW78FY0', 'status', 'in_progress', 'review', NULL, '2026-07-26 13:23:59', '2026-07-26 13:23:59.369', '2026-07-26 13:23:59.369', NULL, 'ed0a9656e3b0ada543a2f58e17eda9f5', 2) ON CONFLICT(hash) DO NOTHING;
|
||||
INSERT INTO ticket_history (ticket_record_id, field, old_value, new_value, changed_by, changed_at, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FSP3GEJYTA966BSSR9354YC4', 'status', 'review', 'done', NULL, '2026-07-26 13:24:15', '2026-07-26 13:24:15.122', '2026-07-26 13:24:15.122', NULL, '37112750b5d1aeec9384cb9a1f5544ae', 2) ON CONFLICT(hash) DO NOTHING;
|
||||
|
||||
@@ -5345,3 +5345,108 @@ FIXED (2026-07-26, direct on main): the test already used median-of-5 (T-1092''s
|
||||
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FSWYQA1XKYKEQ114CZKEDAFW', 'task', '06FBPPMZNNEV052DBYYY3A897C', 'Fog visibility-texture perf test flakes under machine load — 0.5ms budget has no headroom', 'test_fog_shader.gd::test_visibility_texture_update_performance asserts <0.5ms wall-clock and flaked TWICE on 2026-07-26 gate runs on the shared dev box (0.549ms during a heavily contended run racing live captures; 0.503ms — a 0.6% miss — during a lightly loaded run), passing 46/46 solo immediately after both times. A wall-clock assertion with sub-1% headroom cannot be trusted on a machine that runs cargo builds, godot imports, and live capture servers alongside gates — each flake costs a full gate re-run (~3-4 min plus diagnosis). Fix options, pick at pickup: (a) median-of-N (e.g. best-of-5 or median-of-9) sampling inside the test so a single scheduler hiccup cannot fail it — preferred, keeps the budget honest; (b) a modest budget raise with a comment recording the two incidents; (c) an environment-aware multiplier (worst option — hides regressions). Whatever lands must keep the test able to catch a REAL 2x regression. The companion test_full_fog_update_under_1ms has 2x the headroom and has never flaked — evidence the budget, not the code, is the problem. Gate logs: /tmp/sr-run-godot.638004.log (0.549), /tmp/sr-run-godot.1028571.log (0.503).
|
||||
|
||||
FIXED (2026-07-26, direct on main): the test already used median-of-5 (T-1092''s earlier mitigation) and still flaked three times in one day (0.549/0.503/0.638) when concurrent cargo builds inflated all five samples together. Superseded with MINIMUM-of-7: the assertion asks whether the CODE meets the D-059 budget, and load can only inflate wall time, never deflate it — the minimum is the least-noise estimator of code capability while a real regression shifts the minimum too. Budget unchanged at 0.5ms (regression-catching power preserved). Verified 46/46. Closing.', 'done', 'medium', NULL, 'client', NULL, '2026-07-26 12:51:23.279', '2026-07-26 13:17:35.789', NULL, '3f5c596053a4f615e65b192cb0887a3a', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
|
||||
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FSWCYA60VHFK44J09WW78FY0', 'bug', '06FB0TNSRZXCHGS16BFHSSGSV4', 'Synthetic-overflow settlement placement has no ocean-mask guard — can land in open water', 'Found during the PR #215 review fix round (T-1116, Tyre finding 3 follow-through): attractor_matching.rs::synthetic_attractor (the D-211 Phase-4 overflow path, PlainCenter at min-spacing) takes no heightmap/TerrainAnalysis argument — it derives positions by pure grid arithmetic (grid_h/2, grid_w/4, spacing-walk) with zero ocean_mask check. Every EXTRACTED attractor type is land-guaranteed (features.rs::extract_attractors filters !ocean_mask, D-209), but a synthetic-overflow settlement can be placed in open water — visible as an ocean-stranded settlement marker on the Atlas. T-1116''s routing relaxation degrades this case gracefully (surrogate anchor within ring 3, else an isolated unrouted node — never a panic or a water road), but the placement guarantee itself is the gap. Documented in road_graph.rs''s anchor comment and the D-210 amendment (PR #215). Fix shape: thread the ocean mask (or TerrainAnalysis) into synthetic_attractor and nudge/reject water candidates deterministically — mind D-211''s seed-derived-position promise (any nudge must be a pure function of seed + terrain, no RNG state change). Verify by hunting a real body whose synthetic overflow currently lands in water (none observed yet — GJ251c/GJ380c placements are all extracted attractors) or a synthetic fixture.
|
||||
|
||||
Implementation complete on branch ocean-guard-synthetic (worktree .worktrees/ocean-guard-synthetic).
|
||||
|
||||
COMPATIBILITY ANSWER (requirement 1): confirmed via a live scan of every real
|
||||
body with a heightmap (267 bodies, world seeds 42 and "yolo") plus a targeted
|
||||
before/after comparison — the guard does NOT move any currently-land synthetic
|
||||
placement. Direct evidence: 63 real land-arithmetic synthetic placements
|
||||
checked across all bodies, 63 unmoved (byte-identical position). Full
|
||||
`cargo test` also confirms every existing golden/determinism fixture
|
||||
(cascade_golden, golden_seed_determinism_regression, believability_determinism_and_golden,
|
||||
window_derivation_golden_regression) still passes unchanged.
|
||||
|
||||
FIX SHAPE: synthetic_attractor(placed, grid_w, grid_h, terrain: Option<&TerrainAnalysis>)
|
||||
-> Option<GeographicAttractor>. terrain=None reproduces the exact pre-T-1206
|
||||
behavior (existing callers/tests untouched). When Some: land-passthrough (an
|
||||
already-land arithmetic position returns unchanged), water-only-correction via
|
||||
a new nearest_land_cell() ring-walk (T-1116 nearest_passable_cell pattern at
|
||||
native resolution, row-major tie-break, column wrap / row clamp matching every
|
||||
other grid walk in the cascade), bounded by MAX_LAND_SEARCH_RING = 128 cells
|
||||
(sized empirically from the scan: real bodies'' nearest land to the arithmetic
|
||||
(0,0) default was as far as 125 cells away due to polar/high-latitude ocean
|
||||
bands — grid_h/2 = 128 is the natural ceiling).
|
||||
|
||||
DEGRADATION RULING (requirement 2): no land within MAX_LAND_SEARCH_RING ->
|
||||
skip the synthetic attractor entirely (match_cities'' Phase 4 loop does not
|
||||
push a placement for that city). Reported via the EXISTING Phase-5
|
||||
name-fulfillment warning ("atlas city was not placed") -- no new error path,
|
||||
never a panic, never a fabricated water position. At MAX_LAND_SEARCH_RING=128
|
||||
this degradation path does not trigger on any of the 267 scanned real bodies
|
||||
at either seed tested; it is exercised only in unit tests (tiny all-ocean
|
||||
grids).
|
||||
|
||||
VERIFICATION (requirement 3): wrote a scratch scan (deleted after use, tree
|
||||
clean) that ran the real cascade for all 267 bodies with a heightmap. Found a
|
||||
REAL, reproducible repro: 46 of 109 synthetic-overflow placements landed in
|
||||
open water pre-fix (world seed 42), e.g. GJ903c city_id=24375 at (0,0) which
|
||||
is ocean. Post-fix: 0 in water, 109 total synthetic placements preserved
|
||||
(same count as before -- no unexplained drops), confirmed at a second seed
|
||||
("yolo") too.
|
||||
|
||||
Files changed: server/src/atlas/attractor_matching.rs (synthetic_attractor +
|
||||
nearest_land_cell + match_cities signature + 9 new unit tests),
|
||||
server/src/atlas/cascade.rs (thread terrain_analysis through run_layer3),
|
||||
server/src/atlas/road_graph.rs (anchor comment updated to CLOSED),
|
||||
governance/decisions/architecture.md (D-210 amendment addendum, dated
|
||||
2026-07-26, validated via pql decisions validate --vault).
|
||||
|
||||
Full cargo test: 2221 passed, 0 failed (one gen_queue.rs worker-pool timing
|
||||
test flaked once under full-suite parallel load, confirmed unrelated and
|
||||
non-reproducible in isolation / module-scoped / --lib-only runs, and absent on
|
||||
a clean full-suite rerun). No golden fixtures changed.', 'in_progress', 'medium', 'dudley', 'server', NULL, '2026-07-26 11:33:42.064', '2026-07-26 13:23:55.539', NULL, '714a3e42c0b30bad10bb62c7b3416992', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
|
||||
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FSWCYA60VHFK44J09WW78FY0', 'bug', '06FB0TNSRZXCHGS16BFHSSGSV4', 'Synthetic-overflow settlement placement has no ocean-mask guard — can land in open water', 'Found during the PR #215 review fix round (T-1116, Tyre finding 3 follow-through): attractor_matching.rs::synthetic_attractor (the D-211 Phase-4 overflow path, PlainCenter at min-spacing) takes no heightmap/TerrainAnalysis argument — it derives positions by pure grid arithmetic (grid_h/2, grid_w/4, spacing-walk) with zero ocean_mask check. Every EXTRACTED attractor type is land-guaranteed (features.rs::extract_attractors filters !ocean_mask, D-209), but a synthetic-overflow settlement can be placed in open water — visible as an ocean-stranded settlement marker on the Atlas. T-1116''s routing relaxation degrades this case gracefully (surrogate anchor within ring 3, else an isolated unrouted node — never a panic or a water road), but the placement guarantee itself is the gap. Documented in road_graph.rs''s anchor comment and the D-210 amendment (PR #215). Fix shape: thread the ocean mask (or TerrainAnalysis) into synthetic_attractor and nudge/reject water candidates deterministically — mind D-211''s seed-derived-position promise (any nudge must be a pure function of seed + terrain, no RNG state change). Verify by hunting a real body whose synthetic overflow currently lands in water (none observed yet — GJ251c/GJ380c placements are all extracted attractors) or a synthetic fixture.
|
||||
|
||||
Implementation complete on branch ocean-guard-synthetic (worktree .worktrees/ocean-guard-synthetic).
|
||||
|
||||
COMPATIBILITY ANSWER (requirement 1): confirmed via a live scan of every real
|
||||
body with a heightmap (267 bodies, world seeds 42 and "yolo") plus a targeted
|
||||
before/after comparison — the guard does NOT move any currently-land synthetic
|
||||
placement. Direct evidence: 63 real land-arithmetic synthetic placements
|
||||
checked across all bodies, 63 unmoved (byte-identical position). Full
|
||||
`cargo test` also confirms every existing golden/determinism fixture
|
||||
(cascade_golden, golden_seed_determinism_regression, believability_determinism_and_golden,
|
||||
window_derivation_golden_regression) still passes unchanged.
|
||||
|
||||
FIX SHAPE: synthetic_attractor(placed, grid_w, grid_h, terrain: Option<&TerrainAnalysis>)
|
||||
-> Option<GeographicAttractor>. terrain=None reproduces the exact pre-T-1206
|
||||
behavior (existing callers/tests untouched). When Some: land-passthrough (an
|
||||
already-land arithmetic position returns unchanged), water-only-correction via
|
||||
a new nearest_land_cell() ring-walk (T-1116 nearest_passable_cell pattern at
|
||||
native resolution, row-major tie-break, column wrap / row clamp matching every
|
||||
other grid walk in the cascade), bounded by MAX_LAND_SEARCH_RING = 128 cells
|
||||
(sized empirically from the scan: real bodies'' nearest land to the arithmetic
|
||||
(0,0) default was as far as 125 cells away due to polar/high-latitude ocean
|
||||
bands — grid_h/2 = 128 is the natural ceiling).
|
||||
|
||||
DEGRADATION RULING (requirement 2): no land within MAX_LAND_SEARCH_RING ->
|
||||
skip the synthetic attractor entirely (match_cities'' Phase 4 loop does not
|
||||
push a placement for that city). Reported via the EXISTING Phase-5
|
||||
name-fulfillment warning ("atlas city was not placed") -- no new error path,
|
||||
never a panic, never a fabricated water position. At MAX_LAND_SEARCH_RING=128
|
||||
this degradation path does not trigger on any of the 267 scanned real bodies
|
||||
at either seed tested; it is exercised only in unit tests (tiny all-ocean
|
||||
grids).
|
||||
|
||||
VERIFICATION (requirement 3): wrote a scratch scan (deleted after use, tree
|
||||
clean) that ran the real cascade for all 267 bodies with a heightmap. Found a
|
||||
REAL, reproducible repro: 46 of 109 synthetic-overflow placements landed in
|
||||
open water pre-fix (world seed 42), e.g. GJ903c city_id=24375 at (0,0) which
|
||||
is ocean. Post-fix: 0 in water, 109 total synthetic placements preserved
|
||||
(same count as before -- no unexplained drops), confirmed at a second seed
|
||||
("yolo") too.
|
||||
|
||||
Files changed: server/src/atlas/attractor_matching.rs (synthetic_attractor +
|
||||
nearest_land_cell + match_cities signature + 9 new unit tests),
|
||||
server/src/atlas/cascade.rs (thread terrain_analysis through run_layer3),
|
||||
server/src/atlas/road_graph.rs (anchor comment updated to CLOSED),
|
||||
governance/decisions/architecture.md (D-210 amendment addendum, dated
|
||||
2026-07-26, validated via pql decisions validate --vault).
|
||||
|
||||
Full cargo test: 2221 passed, 0 failed (one gen_queue.rs worker-pool timing
|
||||
test flaked once under full-suite parallel load, confirmed unrelated and
|
||||
non-reproducible in isolation / module-scoped / --lib-only runs, and absent on
|
||||
a clean full-suite rerun). No golden fixtures changed.', 'review', 'medium', 'dudley', 'server', NULL, '2026-07-26 11:33:42.064', '2026-07-26 13:23:59.368', NULL, 'd6affd4f4bef642ca148ee93e6a80a84', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
|
||||
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FSP3GEJYTA966BSSR9354YC4', 'task', '06FBPPMZNNEV052DBYYY3A897C', 'Atlas header readout ghosted in Quarter capture — rung-transition alpha artifact', 'Araminta''s T-1196 secondary observation (first GJ1002b captures, 2026-07-25): the ''ATLAS - CAPARICA / QUARTER'' header readout above the legend rendered faded/ghosted in the Quarter frame (scratchpad t1196/gj1002b_quarter.png), while the District and Region frames from the same session and capture path rendered it fully legible. Suspect a z-order or alpha transition state caught mid-render on rung change (the capture settles on StepCanvasRequest.is_pending() then waits 2 frames — a header fade animation may outlast the data settle). Reproduce with a T-1157-harness jump_to capture at any Quarter rung and inspect header alpha across post-settle frames; if it is a fade animation racing the capture, decide whether the fix is harness-side (settle until animations idle) or UI-side (no fade on rung change). Likely cosmetic; the only frame of the three with a legibility defect.', 'done', 'low', 'stig', 'client', NULL, '2026-07-25 20:53:37.559', '2026-07-26 13:24:15.122', NULL, 'babf8069d36e51be946855ab64334042', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
|
||||
|
||||
@@ -19,6 +19,7 @@ Format based on [Keep a Changelog](https://keepachangelog.com/).
|
||||
- **Internal: legacy map-window field retired** (T-1159) — the obsolete duplicate zoom-granularity field was removed from the map wire protocol and caches; no player-visible change
|
||||
|
||||
### Fixed
|
||||
- **The Atlas header is legible on any terrain** (T-1197) — the map screen's title readout was the one piece of implant chrome drawn without its backing panel, so its light text vanished against pale terrain (the ghosting spotted in the first Caparica captures). It now sits on the standard implant panel like everything else, and the legend below it positions itself from the header's real measured height instead of a hardcoded offset — with structural tests pinning the relationship so the panels can never silently overlap again
|
||||
- **The ground between buildings now has a defined character** (T-1098) — every tile in a built block that isn't a building or a street-margin now resolves to a real ground type (court, garden, plaza, open lawn, industrial operations surface, or genuine void) driven by how densely the block is built — previously that space carried no data at all. A conflict rule is enforced in code (building footprints always win), and a latent bug where certain degenerate lots vanished from the world data entirely is fixed. Data-only until Phase 5 draws the world; this is the second of the two walkability gaps closed this weekend
|
||||
- **Road networks now form on water-heavy worlds** (T-1116, D-210 amendment) — island and coastal bodies were generating settlements but zero roads: a coastal town's map cell could count as majority-water at routing resolution, and the pathfinder refused to start there at all. Routes now anchor to the nearest passable land cell at a small, honestly-priced access cost — never crossing water — so island worlds get their road networks back in the world data. Not yet visible on the Atlas: road drawing belongs to the deferred civilizational overlay wave (nature layer first, T-1207), and the map will show these roads when that wave lands
|
||||
- **The Atlas golden-capture harness works again** (T-1157) — the curated map-screenshot suite, dead since the stepped-Atlas rework, is rebuilt on the real navigation path (the same code a player's click runs): 13 golden shots across 7 bodies now cover every zoom rung, captured live and proven stable — byte-identical across consecutive runs and regardless of map-cache temperature. Every capture logs its full view transform so a future pixel mismatch is diagnosable instead of mysterious
|
||||
|
||||
Reference in New Issue
Block a user