chore(meta): pql changelog — batch 5 activation (T-1157 in_progress/hoshe, T-1196 ready, T-962 gate questions recorded, T-1050 held-note correction)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
2026-07-25 20:04:19 +02:00
co-authored by Claude Fable 5
parent d14bead60a
commit 0822390f7a
2 changed files with 132 additions and 0 deletions
+61
View File
@@ -2054,3 +2054,64 @@ INSERT INTO ticket_history (ticket_record_id, field, old_value, new_value, chang
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 ('06FB0TNSRZZ5XKET93HPHKQHKW', 'status', 'in_progress', 'review', NULL, '2026-07-25 17:07:16', '2026-07-25 17:07:16.386', '2026-07-25 17:07:16.386', NULL, 'b4f2db9ed2405b30dc88fa45c1867506', 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 ('06FB0TNSRWTP633SM8XB302MBM', 'status', 'review', 'done', NULL, '2026-07-25 17:36:09', '2026-07-25 17:36:09.274', '2026-07-25 17:36:09.274', NULL, 'a5c67308dab3a08d8aee193a79861f9b', 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 ('06FB0TNSRZZ5XKET93HPHKQHKW', 'status', 'review', 'done', NULL, '2026-07-25 17:56:13', '2026-07-25 17:56:13.098', '2026-07-25 17:56:13.098', NULL, 'b7fc240144b45db830e9ea0b68b21ba6', 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 ('06FB0TNSRZ8Z6NN74YKCCRCPMR', 'description', 'Validation pass: generated content reads correctly (settlements legible, walkable, named). Establishes the dependency gate that locks Phase 5 (player control, epic #749) behind Phase 4 completion per the cascade rule (D-166 amended 2026-05-22).
Gate trigger updated per D-166 amendment (2026-06-12): Phase 5 ramps in parallel once OUTSIDE generation produces deterministic, walkable exteriors the gate this ticket holds is ''outsides generate deterministically and are walkable'' (validation pass: settlements legible, walkable, named), not ''all Phase-4 polish complete''. Door-boundary contracts and remaining Phase-4 detail may continue alongside early Phase-5 work.', 'Validation pass: generated content reads correctly (settlements legible, walkable, named). Establishes the dependency gate that locks Phase 5 (player control, epic #749) behind Phase 4 completion per the cascade rule (D-166 amended 2026-05-22).
Gate trigger updated per D-166 amendment (2026-06-12): Phase 5 ramps in parallel once OUTSIDE generation produces deterministic, walkable exteriors the gate this ticket holds is ''outsides generate deterministically and are walkable'' (validation pass: settlements legible, walkable, named), not ''all Phase-4 polish complete''. Door-boundary contracts and remaining Phase-4 detail may continue alongside early Phase-5 work.
Si refinement pass (2026-07-25, batch-5 candidate review): NEEDS-JEROEN before activation. The ticket''s own text is internally consistent (D-166 2026-06-12 trigger folded in; listed blockers T-952/T-959 both done), but "walkable exteriors" predates D-255 and the believability workstream, and three gate-criteria questions are unresolved:
(1) Is Q-123''s threshold calibration (sampling power, non-stationarity thresholds, relief/coherence floors, and the advisory->strict ratchet trigger for the D-245 gate) a prerequisite for this validation pass, or does the pass only need "mechanism exists and demonstrably fires" (T-1079''s six mechanism children T-1080..T-1085 are all done)?
(2) Do T-1116 (0 routable road edges on water-heavy bodies) and T-1098 (interstitial fill between building footprints incomplete) block "walkable" as this ticket defines it, or are they Phase-4 polish that continues in parallel per the D-166 amendment''s explicit allowance?
(3) Post-D-255, should the validation pass probe cascade output directly (aliveness_probe.rs / T-1083 harness) rather than an Atlas-eyeball check the Atlas being presentation, not the generation under validation?
Graph note: this ticket currently has NO blocker edges to T-1079/Q-123, T-1116, or T-1098 deliberately left unwired pending the ruling above; wire whichever the ruling designates as gating.', NULL, '2026-07-25 18:03:56', '2026-07-25 18:03:56.875', '2026-07-25 18:03:56.875', NULL, '0ffc7340a6762d24ee66afba25b268ba', 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 ('06FBPTXPJ910NNR5T2R9F9NWQR', 'description', '(description follows in first append)
---
Refinement (2026-06-16, /whats-next Si pass) FULL scope (user decision). Two deliverables + conventions.
(1) CATALOG: instantiate the 5 docs/assets/visual/*.md files (sprites, furniture, tilesets, icons, effects) with per-category status tables. Template: docs/assets/_templates/sprite.md (SPR/FUR/TILE/ICO/FX prefixes); status vocab planned/in-progress/placeholder/final (docs/assets/README.md). Audio side (docs/assets/audio/README.md) is the working model.
(2) glb-gen PRODUCTION PATH: SKILL.md:115 names client/assets/models/ which does NOT exist. Create it + furniture/ + props/ subdirs (mirror the spike) + .gitkeep. Define client/assets/models/manifest.json schema MIRRORING the character manifest (docs/architecture/character-asset-organization.md) per-asset entries: name, category, source-model path, subdirectory. Promotion convention per D-241 (promotion = repo-canonical). Update SKILL.md to point at the new path + reference the manifest.
(3) CONVENTIONS (author NOW, full scope): door state-frame suffixes (e.g. <model>_open / <model>_closed), Godot TileSet resource organization (<tileset>/<tile_id>.tres), multi-tile footprint metadata, and renderer/textures/ naming keyed to D-235 tokens (current renderer/README.md:80-95 covers sprites only: <model>_<direction>_<resolution>.png). Author these in docs/assets/visual/conventions.md (single home) and cross-link from the SKILL.
OVERLAP: T-1053 (rewrite araminta briefing) softly depends on this catalog note the edge. T-1049''s per-class stories will reference these conventions do T-1050 first / concurrently so T-1049 can cite them.
---
HELD 2026-06-16 (separated from the cascade batch; needs re-scoping before resuming).
The asset pipeline this ticket assumes is sprite-centric (docs/assets/visual/sprites.md
"Entities", _templates/sprite.md, SPR/FUR/TILE/ICO/FX prefixes, the /sprite-gen
render-3D->2D-sprites step). Direction correction: we are NOT producing sprites Trellis
produces 3D objects (.glb) displayed in-world; the only flattened 2D content is TEXTURES.
Re-scope this ticket around a 3D-model + texture catalog (not a sprite catalog) before
activating. See the sprite-vs-3D root-cause note (this session).', '(description follows in first append)
---
Refinement (2026-06-16, /whats-next Si pass) FULL scope (user decision). Two deliverables + conventions.
(1) CATALOG: instantiate the 5 docs/assets/visual/*.md files (sprites, furniture, tilesets, icons, effects) with per-category status tables. Template: docs/assets/_templates/sprite.md (SPR/FUR/TILE/ICO/FX prefixes); status vocab planned/in-progress/placeholder/final (docs/assets/README.md). Audio side (docs/assets/audio/README.md) is the working model.
(2) glb-gen PRODUCTION PATH: SKILL.md:115 names client/assets/models/ which does NOT exist. Create it + furniture/ + props/ subdirs (mirror the spike) + .gitkeep. Define client/assets/models/manifest.json schema MIRRORING the character manifest (docs/architecture/character-asset-organization.md) per-asset entries: name, category, source-model path, subdirectory. Promotion convention per D-241 (promotion = repo-canonical). Update SKILL.md to point at the new path + reference the manifest.
(3) CONVENTIONS (author NOW, full scope): door state-frame suffixes (e.g. <model>_open / <model>_closed), Godot TileSet resource organization (<tileset>/<tile_id>.tres), multi-tile footprint metadata, and renderer/textures/ naming keyed to D-235 tokens (current renderer/README.md:80-95 covers sprites only: <model>_<direction>_<resolution>.png). Author these in docs/assets/visual/conventions.md (single home) and cross-link from the SKILL.
OVERLAP: T-1053 (rewrite araminta briefing) softly depends on this catalog note the edge. T-1049''s per-class stories will reference these conventions do T-1050 first / concurrently so T-1049 can cite them.
---
HELD 2026-06-16 (separated from the cascade batch; needs re-scoping before resuming).
The asset pipeline this ticket assumes is sprite-centric (docs/assets/visual/sprites.md
"Entities", _templates/sprite.md, SPR/FUR/TILE/ICO/FX prefixes, the /sprite-gen
render-3D->2D-sprites step). Direction correction: we are NOT producing sprites Trellis
produces 3D objects (.glb) displayed in-world; the only flattened 2D content is TEXTURES.
Re-scope this ticket around a 3D-model + texture catalog (not a sprite catalog) before
activating. See the sprite-vs-3D root-cause note (this session).
Batch-5 Si pass correction (2026-07-25): the 2026-06-16 refinement block above is INVALIDATED by the HELD note that follows it the sprite-centric scope (SPR/FUR prefixes, sprite catalog, /sprite-gen) contradicts the recorded direction (Trellis produces 3D .glb models; only flattened 2D content is textures). Do not implement as written. A re-scope pass (3D-model + texture catalog, manifest mirroring character-asset-organization, D-241 promotion, D-235-keyed texture naming) is running as part of batch 5; T-1052 (style bible) and T-1051 (title-only) get refinement passes in the same sweep. Sequencing per T-1049''s own note stands: this ticket''s conventions land first, T-1049/T-1053 consume them.', NULL, '2026-07-25 18:04:03', '2026-07-25 18:04:03.964', '2026-07-25 18:04:03.964', NULL, '83c179232554808ac27dc7bd7f680ff5', 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 ('06FRJD6EKPBQE08NA8VHP692W8', 'status', 'backlog', 'in_progress', NULL, '2026-07-25 18:04:06', '2026-07-25 18:04:06.736', '2026-07-25 18:04:06.736', NULL, '581321f1ce2faaef8636c8b2f5182716', 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 ('06FSM3MQ5GFSPKKFJF6GGZN8CM', 'status', 'backlog', 'ready', NULL, '2026-07-25 18:04:07', '2026-07-25 18:04:07.273', '2026-07-25 18:04:07.273', NULL, '56f337047d088a7547c30ce3f4186497', 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 ('06FRJD6EKPBQE08NA8VHP692W8', 'assigned_to', NULL, 'hoshe', NULL, '2026-07-25 18:04:09', '2026-07-25 18:04:09.374', '2026-07-25 18:04:09.374', NULL, '91edbb31a5c8128989e1fb19f2eedc70', 2) ON CONFLICT(hash) DO NOTHING;
+71
View File
@@ -3000,3 +3000,74 @@ MINOR CODE NITS:
D-256/T-1174 finding (2026-07-25): the believability harness golden is INSENSITIVE to a total basin_direction regression an all-North basin collapse (every survey cell defaulting) produced a byte-identical believability.json at current sample density (64/2048 districts; basin only reaches voxel meander phase/channel width, too localized for the coarse aggregate stats). The cross-namespace keying seam is now covered by the restored derive_all_districts_threads_supplied_basin_directions test (production-shaped survey keys), but the harness itself has no basin-sensitive metric. Candidate hardening: a basin-direction distribution stat (distinct directions >= 2 on a drained body) or a voxel-transect metric that moves with meander phase.
Refinement trim (2026-07-25, Si every listed gap re-verified against current code before this batch): (1) DROP the test_sim_determinism.py wiring item already done, Makefile:256 wires it into make test-tooling which the push gate runs on tooling changes. (2) The drainage.rs isolated-basin comment nit moved to ~line 654 (file grew; the old ~480-488 cite is stale) still open, just relocate. (3) The layer1.rs attach_feature_names mountain-branch item: implicit coverage may already exist via run_layer1_* tests check before adding a redundant test. (4) The D-256/T-1174 addendum''s "basin-direction distribution stat" candidate hardening is a genuine open design question (which stat, what threshold) PROPOSE the stat to the lead before coding it, don''t invent silently. All other items (features.rs per-type reachability fixtures + thin_by_spacing, heightmap.rs 8-bit/sea-level-passthrough/upsample-identity, drainage.rs area_pct bit-determinism, import_economics.py idempotency test, oasis_water binary_dilation nit at planet_simulation.py:784-788) verified still open as written.', 'done', 'medium', 'dudley', 'server', NULL, '2026-05-23 06:09:45', '2026-07-25 17:56:13.098', NULL, '1f23c5d80e2bae847ea4cb39ce6f9b48', 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 ('06FB0TNSRZ8Z6NN74YKCCRCPMR', 'story', '06FB0TNSRZXCHGS16BFHSSGSV4', 'Generation validation pass + Phase 5 dependency gate', 'Validation pass: generated content reads correctly (settlements legible, walkable, named). Establishes the dependency gate that locks Phase 5 (player control, epic #749) behind Phase 4 completion per the cascade rule (D-166 amended 2026-05-22).
Gate trigger updated per D-166 amendment (2026-06-12): Phase 5 ramps in parallel once OUTSIDE generation produces deterministic, walkable exteriors the gate this ticket holds is ''outsides generate deterministically and are walkable'' (validation pass: settlements legible, walkable, named), not ''all Phase-4 polish complete''. Door-boundary contracts and remaining Phase-4 detail may continue alongside early Phase-5 work.
Si refinement pass (2026-07-25, batch-5 candidate review): NEEDS-JEROEN before activation. The ticket''s own text is internally consistent (D-166 2026-06-12 trigger folded in; listed blockers T-952/T-959 both done), but "walkable exteriors" predates D-255 and the believability workstream, and three gate-criteria questions are unresolved:
(1) Is Q-123''s threshold calibration (sampling power, non-stationarity thresholds, relief/coherence floors, and the advisory->strict ratchet trigger for the D-245 gate) a prerequisite for this validation pass, or does the pass only need "mechanism exists and demonstrably fires" (T-1079''s six mechanism children T-1080..T-1085 are all done)?
(2) Do T-1116 (0 routable road edges on water-heavy bodies) and T-1098 (interstitial fill between building footprints incomplete) block "walkable" as this ticket defines it, or are they Phase-4 polish that continues in parallel per the D-166 amendment''s explicit allowance?
(3) Post-D-255, should the validation pass probe cascade output directly (aliveness_probe.rs / T-1083 harness) rather than an Atlas-eyeball check the Atlas being presentation, not the generation under validation?
Graph note: this ticket currently has NO blocker edges to T-1079/Q-123, T-1116, or T-1098 deliberately left unwired pending the ruling above; wire whichever the ruling designates as gating.', 'backlog', 'medium', NULL, 'server', 'D-166', '2026-05-22 17:42:34', '2026-07-25 18:03:56.875', NULL, '8c9a6891db17cc3826113077eec4d566', 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 ('06FBPTXPJ910NNR5T2R9F9NWQR', 'task', '06FB0TNSRZXCHGS16BFHSSGSV4', 'Create the visual production-status catalog; fix glb-gen production path + naming conventions', '(description follows in first append)
---
Refinement (2026-06-16, /whats-next Si pass) FULL scope (user decision). Two deliverables + conventions.
(1) CATALOG: instantiate the 5 docs/assets/visual/*.md files (sprites, furniture, tilesets, icons, effects) with per-category status tables. Template: docs/assets/_templates/sprite.md (SPR/FUR/TILE/ICO/FX prefixes); status vocab planned/in-progress/placeholder/final (docs/assets/README.md). Audio side (docs/assets/audio/README.md) is the working model.
(2) glb-gen PRODUCTION PATH: SKILL.md:115 names client/assets/models/ which does NOT exist. Create it + furniture/ + props/ subdirs (mirror the spike) + .gitkeep. Define client/assets/models/manifest.json schema MIRRORING the character manifest (docs/architecture/character-asset-organization.md) per-asset entries: name, category, source-model path, subdirectory. Promotion convention per D-241 (promotion = repo-canonical). Update SKILL.md to point at the new path + reference the manifest.
(3) CONVENTIONS (author NOW, full scope): door state-frame suffixes (e.g. <model>_open / <model>_closed), Godot TileSet resource organization (<tileset>/<tile_id>.tres), multi-tile footprint metadata, and renderer/textures/ naming keyed to D-235 tokens (current renderer/README.md:80-95 covers sprites only: <model>_<direction>_<resolution>.png). Author these in docs/assets/visual/conventions.md (single home) and cross-link from the SKILL.
OVERLAP: T-1053 (rewrite araminta briefing) softly depends on this catalog note the edge. T-1049''s per-class stories will reference these conventions do T-1050 first / concurrently so T-1049 can cite them.
---
HELD 2026-06-16 (separated from the cascade batch; needs re-scoping before resuming).
The asset pipeline this ticket assumes is sprite-centric (docs/assets/visual/sprites.md
"Entities", _templates/sprite.md, SPR/FUR/TILE/ICO/FX prefixes, the /sprite-gen
render-3D->2D-sprites step). Direction correction: we are NOT producing sprites Trellis
produces 3D objects (.glb) displayed in-world; the only flattened 2D content is TEXTURES.
Re-scope this ticket around a 3D-model + texture catalog (not a sprite catalog) before
activating. See the sprite-vs-3D root-cause note (this session).
Batch-5 Si pass correction (2026-07-25): the 2026-06-16 refinement block above is INVALIDATED by the HELD note that follows it the sprite-centric scope (SPR/FUR prefixes, sprite catalog, /sprite-gen) contradicts the recorded direction (Trellis produces 3D .glb models; only flattened 2D content is textures). Do not implement as written. A re-scope pass (3D-model + texture catalog, manifest mirroring character-asset-organization, D-241 promotion, D-235-keyed texture naming) is running as part of batch 5; T-1052 (style bible) and T-1051 (title-only) get refinement passes in the same sweep. Sequencing per T-1049''s own note stands: this ticket''s conventions land first, T-1049/T-1053 consume them.', 'backlog', 'high', NULL, 'visual', NULL, '2026-06-12 10:40:59', '2026-07-25 18:04:03.964', NULL, 'feb7e2180b9e94f62003e1afb7550563', 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 ('06FRJD6EKPBQE08NA8VHP692W8', 'task', '06FBPPMZNNEV052DBYYY3A897C', 'Redesign the atlas visual-capture goldens for the zoom ladder (visual_scenarios/visual_capture)', 'T-1153 broke the T-1120/T-1121 golden capture harness: client/tests/visual_scenarios.gd and visual_capture.gd call app._regional_screen._viewer.get_heightmap_texture()/show_body() — both crash against AtlasWindowViewer (regional_screen now wraps the ladder viewer; AtlasViewer is unreachable from nav). Confirmed NOT wired into tests/run-godot or the pre-push hook (no reference in either), so nothing blocks, but the 12 curated atlas_* goldens and the --atlas-matrix capture path are dead until redesigned for the ladder (capture at defined rungs/zooms instead of the fixed heightmap frame; the new canonical orbital frame is the natural replacement for the old whole-body shot). Also decide the fate of the retired AtlasViewer code these harnesses were the last live consumers of — likely deletable once T-1156 (overlay port) settles what carries forward.
Live round 4 addendum: client/tests/test_atlas_window_overlay_draw_smoke.gd (3 scenarios -> now 2 after removing a flaky harness-sanity check: single-window draw + tile-mosaic draw, both asserting real composited pixels via SubViewport render) is a standalone gdUnit file with its own headless-skip guard, added because this redesign hadn''t landed yet. When this ticket lands, migrate its 2 scenarios into the redesigned tests/visual.json harness (folding the standalone file away) for consistency with the rest of the real-rendering test suite see docs/DEVOPS.md''s ''Real-rendering test exception'' note for the interim rationale.
RE-SCOPED by D-255 (2026-07-24, body-map-viewer workshop): this becomes the capture harness for the STEPPED render architecture goldens key on (body, step) canvases, not the retired continuous-zoom frames. The T-1152/T-1153 test suites (coverage-walk, continuous-zoom seams, compute_tile_grid mosaic) retire with their code in T-1182''s change; this re-scoped harness is their replacement and the eyeball-check substrate for every step canvas. More needed than ever keep, don''t cancel.
PR #203 fix-round inventory (2026-07-25): the retirement is now TOTAL AtlasViewer and its whole cluster (atlas_viewer, atlas_marker_overlay, atlas_descend_geometry, atlas_legend_panel, atlas_generation_proxy, atlas_generation_state) are deleted. visual_scenarios.gd (_setup_atlas_golden_shot, 6 of 12 atlas_GJ* z2_0/z4_0 non-fit scenarios) and visual_capture.gd (_run_atlas_matrix) now call StepCanvasViewer methods that do not exist: get_heightmap_texture(), set_view(zoom, offset), get_view_offset() the fit-zoom shots early-return before hitting them. Ruled in PR #203: NO shim (would resurrect the retired continuous-zoom API D-255 kills); the redesign here keys captures on (body, rung) via StepCanvasViewer''s real surface (enter/_scroll_rung/rung state + the echoed extent). get_overlay_defs()/set_overlay_visible() duck-type fine and survive. Until this lands, those 6 goldens + atlas_matrix are knowingly dead (manual make targets only, gate-invisible confirmed again).
Harness techniques inventory addition (from the PR #204 / T-1183 restart-persistence eyeball, 2026-07-25) proven live-rendering eyeball patterns for shared-desktop sessions:
1. InputSwallower pattern: root-level Node (added first, low process_priority), _input()+_unhandled_input() both call get_viewport().set_input_as_handled() unconditionally neutralizes real desktop input reaching a `-s` SceneTree driver''s real window (X11/XWayland delivers pointer events to unfocused windows under the cursor). Verify via a per-capture-window intercept counter: N>0 intercepted AND zero resulting view drift is proof; 0 intercepted proves nothing.
2. In-process navigation via viewer methods, not OS input: call the same methods the app''s own gdUnit suite exercises (StepCanvasViewer.enter()/_scroll_rung(); RegionalScreen.enter() atlas-matrix precedent in visual_capture.gd) identical production code path, no OS injection needed (Wayland/KWin blocks synthetic X11 injection for XWayland clients entirely).
3. View-transform logging at every capture: world_center, view_offset, the drawing Node2D''s canvas position, footprint_px alongside every screenshot turns "pixels don''t match" into a root-causable mechanism (PR #204: drift matched PAN_SPEED_PX_S*frame_time*held-frames to 0.02px, identifying unfocused edge-scroll bleed, now T-1191).
4. Full-run-restart-on-anomaly, never partial retry: any mid-sequence assertion failure discards the whole run (cold-wipe for a cold-role attempt; fresh-process-only for a revisit-role attempt) partial retries silently corrupt the state the comparison depends on.
5. Fixed-center revisit mode: record a prior run''s actual derived centers and re-request them literally on the comparison run, bypassing cursor-anchored re-derivation required when run 2 must land on run 1''s exact cache keys, not merely repeat the gesture.
Harness-discipline gap found 2026-07-25 (Jeroen spotted a live orphan): agent-side kill-on-completion does not cover an agent CRASHING mid-capture (API error killed a session between server spawn and its own cleanup step the server ran on unnoticed for ~25 min on the shared machine). Inventory addition: (6) the LEAD runs an explicit orphan sweep (ps for godot4 + settled-reach-server) at every cycle checkpoint commit, merge, and after any agent dies abnormally not only inside agent protocols; pr-process step 1a''s >5-min gdUnit grep does not match live-capture servers, so the sweep needs the server binary name too.', 'in_progress', 'medium', NULL, 'client', NULL, '2026-07-22 09:42:47.197', '2026-07-25 18:04:06.731', NULL, 'f08a1606d820c4d87bc7c1c94983521e', 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 ('06FSM3MQ5GFSPKKFJF6GGZN8CM', 'task', '06FBPPMZNNEV052DBYYY3A897C', 'Alpine relief capture — Quarter-vs-District differentiation on a tectonics:high body', 'Araminta''s PR #192 companion note, kept open by her PR #208 ruling (option b): the Quarter-vs-District relief-differentiation check was accepted for the T-1160 merge on a plains/river substitution (GJ380c world center -17723392,-10532864 — Quarter clearly shows finer higher-frequency texture than District), but plains texture and jagged tectonic relief are different visual regimes and the sharper case still needs its own capture. Task: identify the body pool with tectonics:high (or planet_class values mapping to TectonicClass::Volcanic/Active) and RECORD the pool in this ticket first — the PR #208 eyeball proved GJ380c/GJ820Bc are both tectonics:low via exhaustive two-Global color scans, don''t re-run that search blind — then capture quarter-relief vs district-relief at a true Alpine/MountainPass crop (MorphologyZone 13/14) at the same world center, matched crop, and have Araminta judge the differentiation. Reuse the pr208_driver fixed-center --step protocol (T-1157 harness inventory). Related: T-1160, PR #192, PR #208.', 'ready', 'low', NULL, 'client', NULL, '2026-07-25 16:14:35.308', '2026-07-25 18:04:07.273', NULL, 'd0f97fe8188febe0bb8c230b0b957317', 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 ('06FRJD6EKPBQE08NA8VHP692W8', 'task', '06FBPPMZNNEV052DBYYY3A897C', 'Redesign the atlas visual-capture goldens for the zoom ladder (visual_scenarios/visual_capture)', 'T-1153 broke the T-1120/T-1121 golden capture harness: client/tests/visual_scenarios.gd and visual_capture.gd call app._regional_screen._viewer.get_heightmap_texture()/show_body() — both crash against AtlasWindowViewer (regional_screen now wraps the ladder viewer; AtlasViewer is unreachable from nav). Confirmed NOT wired into tests/run-godot or the pre-push hook (no reference in either), so nothing blocks, but the 12 curated atlas_* goldens and the --atlas-matrix capture path are dead until redesigned for the ladder (capture at defined rungs/zooms instead of the fixed heightmap frame; the new canonical orbital frame is the natural replacement for the old whole-body shot). Also decide the fate of the retired AtlasViewer code these harnesses were the last live consumers of — likely deletable once T-1156 (overlay port) settles what carries forward.
Live round 4 addendum: client/tests/test_atlas_window_overlay_draw_smoke.gd (3 scenarios -> now 2 after removing a flaky harness-sanity check: single-window draw + tile-mosaic draw, both asserting real composited pixels via SubViewport render) is a standalone gdUnit file with its own headless-skip guard, added because this redesign hadn''t landed yet. When this ticket lands, migrate its 2 scenarios into the redesigned tests/visual.json harness (folding the standalone file away) for consistency with the rest of the real-rendering test suite see docs/DEVOPS.md''s ''Real-rendering test exception'' note for the interim rationale.
RE-SCOPED by D-255 (2026-07-24, body-map-viewer workshop): this becomes the capture harness for the STEPPED render architecture goldens key on (body, step) canvases, not the retired continuous-zoom frames. The T-1152/T-1153 test suites (coverage-walk, continuous-zoom seams, compute_tile_grid mosaic) retire with their code in T-1182''s change; this re-scoped harness is their replacement and the eyeball-check substrate for every step canvas. More needed than ever keep, don''t cancel.
PR #203 fix-round inventory (2026-07-25): the retirement is now TOTAL AtlasViewer and its whole cluster (atlas_viewer, atlas_marker_overlay, atlas_descend_geometry, atlas_legend_panel, atlas_generation_proxy, atlas_generation_state) are deleted. visual_scenarios.gd (_setup_atlas_golden_shot, 6 of 12 atlas_GJ* z2_0/z4_0 non-fit scenarios) and visual_capture.gd (_run_atlas_matrix) now call StepCanvasViewer methods that do not exist: get_heightmap_texture(), set_view(zoom, offset), get_view_offset() the fit-zoom shots early-return before hitting them. Ruled in PR #203: NO shim (would resurrect the retired continuous-zoom API D-255 kills); the redesign here keys captures on (body, rung) via StepCanvasViewer''s real surface (enter/_scroll_rung/rung state + the echoed extent). get_overlay_defs()/set_overlay_visible() duck-type fine and survive. Until this lands, those 6 goldens + atlas_matrix are knowingly dead (manual make targets only, gate-invisible confirmed again).
Harness techniques inventory addition (from the PR #204 / T-1183 restart-persistence eyeball, 2026-07-25) proven live-rendering eyeball patterns for shared-desktop sessions:
1. InputSwallower pattern: root-level Node (added first, low process_priority), _input()+_unhandled_input() both call get_viewport().set_input_as_handled() unconditionally neutralizes real desktop input reaching a `-s` SceneTree driver''s real window (X11/XWayland delivers pointer events to unfocused windows under the cursor). Verify via a per-capture-window intercept counter: N>0 intercepted AND zero resulting view drift is proof; 0 intercepted proves nothing.
2. In-process navigation via viewer methods, not OS input: call the same methods the app''s own gdUnit suite exercises (StepCanvasViewer.enter()/_scroll_rung(); RegionalScreen.enter() atlas-matrix precedent in visual_capture.gd) identical production code path, no OS injection needed (Wayland/KWin blocks synthetic X11 injection for XWayland clients entirely).
3. View-transform logging at every capture: world_center, view_offset, the drawing Node2D''s canvas position, footprint_px alongside every screenshot turns "pixels don''t match" into a root-causable mechanism (PR #204: drift matched PAN_SPEED_PX_S*frame_time*held-frames to 0.02px, identifying unfocused edge-scroll bleed, now T-1191).
4. Full-run-restart-on-anomaly, never partial retry: any mid-sequence assertion failure discards the whole run (cold-wipe for a cold-role attempt; fresh-process-only for a revisit-role attempt) partial retries silently corrupt the state the comparison depends on.
5. Fixed-center revisit mode: record a prior run''s actual derived centers and re-request them literally on the comparison run, bypassing cursor-anchored re-derivation required when run 2 must land on run 1''s exact cache keys, not merely repeat the gesture.
Harness-discipline gap found 2026-07-25 (Jeroen spotted a live orphan): agent-side kill-on-completion does not cover an agent CRASHING mid-capture (API error killed a session between server spawn and its own cleanup step the server ran on unnoticed for ~25 min on the shared machine). Inventory addition: (6) the LEAD runs an explicit orphan sweep (ps for godot4 + settled-reach-server) at every cycle checkpoint commit, merge, and after any agent dies abnormally not only inside agent protocols; pr-process step 1a''s >5-min gdUnit grep does not match live-capture servers, so the sweep needs the server binary name too.', 'in_progress', 'medium', 'hoshe', 'client', NULL, '2026-07-22 09:42:47.197', '2026-07-25 18:04:09.369', NULL, 'bfec1c0e51d38b2b61d89e92c62540a2', 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);