test(client): retire the top-down visual suite, aim the Atlas ladder at land

The visual gate had stopped measuring anything: 30 of 32 scenarios
failed, and the two that passed were the worst result of the lot.

Deleted the 15 top-down scenarios (fog, HUD, dialogue, NPC, minimap,
cursor) and their goldens. They all failed at a near-uniform ~12%, and
that uniformity across unrelated scenes is one global cause -- the
ultrawide UI stretch moved every element. They cover the renderer the
cascade freezes until Phase 5, which will need its own tests anyway, so
re-baselining would only have blessed a deprecated layer nobody is
reviewing. Jeroen's call.

The remaining problem was the goldens that PASSED. atlas_GJ338Bd_Block
and atlas_GJ445c-m1_Chunk matched at 0.0% because capture and golden
were both blank -- the same "goldens have been measuring nothing" trap
e024cfb3f caught at Global, still live at the bottom of the ladder. The
cause is that every below-Global golden descends at jump_to(ZERO), and
world-metre zero is merely the origin of the region grid, not anywhere
chosen. So _setup_atlas_golden_shot now takes an optional world_center
(default ZERO -- existing goldens are untouched), and a new
atlas_GJ820Bc_land_* set walks Region through Chunk at ONE land point,
so the rungs can be read as a descent instead of five unrelated frames.

aliveness_probe prints the placement's world metres alongside its pixel
and survey cell, since that is the coordinate the Atlas actually
navigates in.

Recorded because it will be asked again: the ladder is anchored via a
CityPlacement, but that is a match record -- a pixel, an archetype, an
orientation -- not built geography. No settlement exists anywhere yet
and none is due before T-1207, so the empty deep rungs are the expected
state. What the ladder judges is the nature layer.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-08-06 16:33:57 +02:00
co-authored by Claude Opus 5
parent 4e503c3565
commit c91096a3c9
36 changed files with 126 additions and 782 deletions
+1 -1
View File
@@ -64,7 +64,7 @@ help:
@echo " make checklist-generate Validate checklists + print condition summary"
@echo " make perf-baseline Run performance benchmarks and save baseline"
@echo ""
@echo " make screenshot Ad-hoc visual capture (SCENARIO=name, default: fog_3state)"
@echo " make screenshot Ad-hoc visual capture (SCENARIO=name, default: atlas_GJ820Bc_Global)"
@echo " make visual-movie Flow capture with contact sheet (FLOW=name)"
@echo " make test-visual Run visual golden regression tests"
@echo " make visual-update Regenerate visual goldens and stage for commit"
Binary file not shown.

Before

Width:  |  Height:  |  Size: 50 KiB

@@ -1,40 +0,0 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://qlxaaip3fqic"
path="res://.godot/imported/cursor_menu.png-03cbe8a063e08efcd4283ce76f668ea1.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://tests/golden/visual/cursor_menu.png"
dest_files=["res://.godot/imported/cursor_menu.png-03cbe8a063e08efcd4283ce76f668ea1.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1
Binary file not shown.

Before

Width:  |  Height:  |  Size: 50 KiB

@@ -1,40 +0,0 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://oqbx8gwq1xta"
path="res://.godot/imported/dialogue_open.png-2e5a2dd99abe2817e4bb7ede8f83b0bf.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://tests/golden/visual/dialogue_open.png"
dest_files=["res://.godot/imported/dialogue_open.png-2e5a2dd99abe2817e4bb7ede8f83b0bf.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1
Binary file not shown.

Before

Width:  |  Height:  |  Size: 50 KiB

@@ -1,40 +0,0 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://b2hctv70ar7al"
path="res://.godot/imported/dialogue_with_monologue.png-5193b3824e2195b1c7ca00bc005f9026.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://tests/golden/visual/dialogue_with_monologue.png"
dest_files=["res://.godot/imported/dialogue_with_monologue.png-5193b3824e2195b1c7ca00bc005f9026.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1
Binary file not shown.

Before

Width:  |  Height:  |  Size: 42 KiB

@@ -1,40 +0,0 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://bw4kxsno66sv3"
path="res://.godot/imported/fog_3state.png-b0193a736de6756c27053a3db24f9a12.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://tests/golden/visual/fog_3state.png"
dest_files=["res://.godot/imported/fog_3state.png-b0193a736de6756c27053a3db24f9a12.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1
Binary file not shown.

Before

Width:  |  Height:  |  Size: 46 KiB

@@ -1,40 +0,0 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://7ol3rcrpienc"
path="res://.godot/imported/fog_boundary.png-7da06d227319f9c43ef7017ee082732a.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://tests/golden/visual/fog_boundary.png"
dest_files=["res://.godot/imported/fog_boundary.png-7da06d227319f9c43ef7017ee082732a.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1
Binary file not shown.

Before

Width:  |  Height:  |  Size: 42 KiB

@@ -1,40 +0,0 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://fpncie7mnyay"
path="res://.godot/imported/fog_boundary_replay.png-3e1acf3ef35450d1df230400b3003250.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://tests/golden/visual/fog_boundary_replay.png"
dest_files=["res://.godot/imported/fog_boundary_replay.png-3e1acf3ef35450d1df230400b3003250.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1
Binary file not shown.

Before

Width:  |  Height:  |  Size: 100 KiB

@@ -1,40 +0,0 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://71e1yuyjdxn7"
path="res://.godot/imported/fog_debug.png-7d563b17499f08fbb82ec57bcdcc0e68.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://tests/golden/visual/fog_debug.png"
dest_files=["res://.godot/imported/fog_debug.png-7d563b17499f08fbb82ec57bcdcc0e68.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1
Binary file not shown.

Before

Width:  |  Height:  |  Size: 42 KiB

@@ -1,40 +0,0 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://2owpogcjnewr"
path="res://.godot/imported/fog_diagonal.png-06416ee4adae921b884280dc73761ed3.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://tests/golden/visual/fog_diagonal.png"
dest_files=["res://.godot/imported/fog_diagonal.png-06416ee4adae921b884280dc73761ed3.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1
Binary file not shown.

Before

Width:  |  Height:  |  Size: 34 KiB

@@ -1,40 +0,0 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://dufvsap028rfw"
path="res://.godot/imported/fog_live_hub.png-a2756ff6cb45af238cc0a32ba70a705a.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://tests/golden/visual/fog_live_hub.png"
dest_files=["res://.godot/imported/fog_live_hub.png-a2756ff6cb45af238cc0a32ba70a705a.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1
Binary file not shown.

Before

Width:  |  Height:  |  Size: 42 KiB

@@ -1,40 +0,0 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://dmqmnfrjrk1u"
path="res://.godot/imported/fog_live_replay.png-4604646d390fbfac6491f513f667c5c6.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://tests/golden/visual/fog_live_replay.png"
dest_files=["res://.godot/imported/fog_live_replay.png-4604646d390fbfac6491f513f667c5c6.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1
Binary file not shown.

Before

Width:  |  Height:  |  Size: 42 KiB

@@ -1,40 +0,0 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://dgdt2rmql6hbb"
path="res://.godot/imported/fog_theater_replay.png-ef10fe62d9da045193422127e48853ba.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://tests/golden/visual/fog_theater_replay.png"
dest_files=["res://.godot/imported/fog_theater_replay.png-ef10fe62d9da045193422127e48853ba.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1
Binary file not shown.

Before

Width:  |  Height:  |  Size: 42 KiB

@@ -1,40 +0,0 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://b8weq3wp6tybx"
path="res://.godot/imported/fog_zone_tint.png-5a5cd0f27eaf991e1b39709de687dcf4.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://tests/golden/visual/fog_zone_tint.png"
dest_files=["res://.godot/imported/fog_zone_tint.png-5a5cd0f27eaf991e1b39709de687dcf4.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1
Binary file not shown.

Before

Width:  |  Height:  |  Size: 42 KiB

@@ -1,40 +0,0 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://c5r4tk4yafj2r"
path="res://.godot/imported/hud_default.png-d3286d0b35f8bfaeab8436d9645c0c0d.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://tests/golden/visual/hud_default.png"
dest_files=["res://.godot/imported/hud_default.png-d3286d0b35f8bfaeab8436d9645c0c0d.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1
Binary file not shown.

Before

Width:  |  Height:  |  Size: 42 KiB

@@ -1,40 +0,0 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://0pym2n4nq12a"
path="res://.godot/imported/minimap_stance.png-abbfd0259479cd17651bee48cdc7f7b8.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://tests/golden/visual/minimap_stance.png"
dest_files=["res://.godot/imported/minimap_stance.png-abbfd0259479cd17651bee48cdc7f7b8.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1
Binary file not shown.

Before

Width:  |  Height:  |  Size: 42 KiB

@@ -1,40 +0,0 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://cc5nmdpumq6t"
path="res://.godot/imported/npc_in_fog.png-e8a24e029e5c640a7daee7d3f2838bdc.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://tests/golden/visual/npc_in_fog.png"
dest_files=["res://.godot/imported/npc_in_fog.png-e8a24e029e5c640a7daee7d3f2838bdc.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1
+1 -1
View File
@@ -5,7 +5,7 @@
## Usage:
## godot --rendering-driver opengl3 --fixed-fps 60 --resolution 960x540 \
## --path client -s res://tests/visual_capture.gd -- \
## --scenario fog_3state --output /abs/path
## --scenario atlas_GJ820Bc_Global --output /abs/path
##
## godot ... -- --flow flow_dialogue --output /abs/path --interval 3
## godot ... -- --list
+84 -114
View File
@@ -9,91 +9,35 @@ extends RefCounted
## look up autoloads via get_node("/root/...").
## Ferrath and its system, shared by the descent-ladder cases below (the older
## per-rung cases still inline their own copies — left alone rather than
## churned, since touching them would move goldens for no reason).
const _FERRATH := {
"body_id": "GJ820Bc",
"body_radius_km": 6062.0,
"proper_name": "Ferrath",
"terrain_reference": "wiki/star-systems/GJ-820B/bodies/GJ820Bc/heightmap.png",
}
const _CYGNI_B := {"system_id": "GJ 820B", "proper_name": "Cygni B"}
## A known-good LAND point on Ferrath, in world metres. Sourced from the
## cascade's highest-scoring city placement (city 24386 @ heightmap pixel
## (52, 395), survey cell (49, 6), score 7200 — printed by `cargo run --bin
## aliveness_probe -- --body GJ820Bc`), but read it as "somewhere the
## generator considers good ground", NOT as a settlement to look at: a
## CityPlacement is a match record — a pixel, an archetype, a founding
## orientation — and no streets, footprints or buildings exist anywhere yet.
## Drawing settlements is T-1207 (wave 2), deliberately deferred.
##
## Re-run the probe if the cascade seed or placement rules change: a stale
## value here silently reframes the ladder rather than failing.
const _FERRATH_LAND := Vector2(29422009.0, -5675959.0)
## Apply scenario-specific setup before tick advancement.
## Returns true if the scenario is recognized, false otherwise.
func apply_setup(scenario_name: String, tree_root: Node) -> bool:
var sim_bridge := tree_root.get_node("/root/SimBridge")
var fog_state := tree_root.get_node("/root/FogState")
var game_state := tree_root.get_node("/root/GameState")
match scenario_name:
"fog_3state":
# Default TestHarness state — player at (10,10), 8x8 room.
# All 3 fog states naturally visible: clear (cone), explored (out of cone), unexplored.
pass
"fog_diagonal":
# Diagonal LOS boundary — staircase regression target.
# Default room works: the diamond-shaped visibility radius creates diagonal edges.
# 10 ticks builds enough explored tiles to show the boundary.
pass
"fog_boundary":
# Explored/unexplored transition centered.
# Move player south so the northern explored boundary is center-frame.
if sim_bridge.harness:
sim_bridge.harness.player_pos = Vector2i(10, 12)
"fog_zone_tint":
# Bar zone warm amber tint (D-046).
# Inject zone_id into visible_tiles so fog_state.gd writes bar tint.
# TestHarness tiles don't include zone_id by default — patch them.
if sim_bridge.harness:
sim_bridge.harness.player_pos = Vector2i(10, 10)
# Zone tint is written from visible_tiles with zone_id field.
# We patch GameState.visible_tiles after the first snapshot in post_setup().
"fog_debug":
# Raw exploration overlay (green/blue/red).
fog_state.debug_exploration = true
"npc_in_fog":
# NPC sprite visible above fog (D-033).
# Position player so NPC at (12,9) is at the fog edge.
if sim_bridge.harness:
sim_bridge.harness.player_pos = Vector2i(10, 10)
"hud_default":
# Full HUD: time, Careful stance, minimap, monologue.
# Tick 1 triggers monologue from TestHarness.
# Inject Careful stance for visible green indicator.
game_state.player_stance = "Careful"
"dialogue_open":
# Dialogue box + interaction prompt + key bar.
# Move adjacent to NPC and interact.
if sim_bridge.harness:
sim_bridge.harness.player_pos = Vector2i(11, 9)
sim_bridge.harness.process_input("Interact")
"dialogue_with_monologue":
# Confrontation beat: dialogue + monologue overlap.
if sim_bridge.harness:
sim_bridge.harness.player_pos = Vector2i(11, 9)
sim_bridge.harness.process_input("Interact")
# Monologue will be injected in post_setup after dialogue is active.
"minimap_stance":
# Minimap + Sprint stance indicator overlap (top-right).
game_state.player_stance = "Sprint"
"cursor_menu":
# Cursor rendering over dialogue option area.
if sim_bridge.harness:
sim_bridge.harness.player_pos = Vector2i(11, 9)
sim_bridge.harness.process_input("Interact")
"fog_live_replay", "fog_theater_replay", "fog_boundary_replay":
# Replay real server snapshots via MessagePack → Protocol.decode_snapshot().
# Setup handled by visual_capture.gd (reads replay_snapshot from config).
pass
"fog_live_hub":
# Live server connection — Hub spawn position.
# No setup needed: server starts in --test-mode with Gauntlet,
# player spawns at Hub (50,58). Captures real fog pipeline output.
pass
"implant_pending":
# #960: overlay the diegetic Layer-1 "generating" indicator for
# visual sign-off. Loaded via load() — class_name isn't available
@@ -277,6 +221,42 @@ func apply_setup(scenario_name: String, tree_root: Node) -> bool:
["gen_dw_temp"]
)
# The descent ladder (2026-08-06): the SAME body at the SAME world point,
# once per rung, so the rungs read as a sequence rather than as unrelated
# frames. Anchored on land (see _FERRATH_LAND) instead of world-metre
# ZERO, which is just the origin of the region grid and lands wherever it
# happens to land.
#
# What this ladder is for: whether the NATURE layer stays legible as you
# descend — relief, coast, watercourses, biome character. It is NOT
# waiting for cities to appear; nothing civilizational is generated yet
# and none is due before T-1207. No overlays, deliberately: a colour ramp
# on top would mask the very thing being judged.
"atlas_GJ820Bc_land_Region":
_setup_atlas_golden_shot(
tree_root, _FERRATH, _CYGNI_B, "Region", [], _FERRATH_LAND
)
"atlas_GJ820Bc_land_District":
_setup_atlas_golden_shot(
tree_root, _FERRATH, _CYGNI_B, "District", [], _FERRATH_LAND
)
"atlas_GJ820Bc_land_Quarter":
_setup_atlas_golden_shot(
tree_root, _FERRATH, _CYGNI_B, "Quarter", [], _FERRATH_LAND
)
"atlas_GJ820Bc_land_Block":
_setup_atlas_golden_shot(
tree_root, _FERRATH, _CYGNI_B, "Block", [], _FERRATH_LAND
)
"atlas_GJ820Bc_land_Chunk":
_setup_atlas_golden_shot(
tree_root, _FERRATH, _CYGNI_B, "Chunk", [], _FERRATH_LAND
)
"atlas_GJ251c_Global":
_setup_atlas_golden_shot(
tree_root,
@@ -337,37 +317,14 @@ func apply_setup(scenario_name: String, tree_root: Node) -> bool:
## Post-tick setup — called after N ticks have been advanced.
## Use for state that depends on tick processing (e.g. zone tint patching).
func post_setup(scenario_name: String, tree_root: Node) -> void:
var fog_state := tree_root.get_node("/root/FogState")
var game_state := tree_root.get_node("/root/GameState")
match scenario_name:
"fog_zone_tint":
# Patch visible_tiles with zone_id for fog_state.gd zone tint pipeline.
var patched: Array = []
for tile in game_state.visible_tiles:
if tile is Dictionary:
var t: Dictionary = tile.duplicate()
t["zone_id"] = "bar"
patched.append(t)
game_state.visible_tiles = patched
# Force fog_state to re-process with zone tint data
fog_state.update_from_state()
"dialogue_with_monologue":
# Inject monologue to create the overlap condition.
game_state.current_monologue = {
"id": "test_confrontation",
"text": "Something about that answer doesn't add up.",
"duration_seconds": 5.0,
"priority": "high",
"is_urgent": true,
}
"hud_default":
# Ensure stance is still Careful after ticks (TestHarness may override).
game_state.player_stance = "Careful"
## Use for state that depends on tick processing.
##
## Currently a no-op: every scenario that needed it was a top-down/fog/dialogue
## case, deleted 2026-08-06 (Jeroen's call) along with the rest of the legacy
## suite. The hook stays because visual_capture.gd calls it unconditionally and
## the stepped-Atlas scenarios may yet need a post-tick step.
func post_setup(_scenario_name: String, _tree_root: Node) -> void:
pass
## Apply flow action — called for each step in a movie flow.
@@ -408,8 +365,21 @@ func apply_flow_action(action: String, tree_root: Node) -> void:
## and this extends RefCounted, different -s mode load contexts, and the
## duplication is small and stable: both read the same public StepCanvasViewer
## surface, jump_to()/get_overlay_defs()/set_overlay_visible()/get_request()).
## `world_center` defaults to ZERO — the original fixed-center revisit point,
## which every pre-2026-08-06 golden uses. But world-metre zero is just the
## origin of the body's region grid, and on a real body that is almost never
## anywhere interesting: on Ferrath the principal settlement sits at
## (29 422 009, -5 675 959) m. So every deep-rung golden captured at ZERO was
## framing an arbitrary patch — which is why Block and Chunk "passed" while
## showing flat water. Pass a real coordinate (aliveness_probe prints the
## principal settlement's world metres) to descend somewhere that has content.
func _setup_atlas_golden_shot(
tree_root: Node, body: Dictionary, system: Dictionary, rung: String, overlay_ids: Array
tree_root: Node,
body: Dictionary,
system: Dictionary,
rung: String,
overlay_ids: Array,
world_center: Vector2 = Vector2.ZERO
) -> void:
var hud_groups: Node = tree_root.get_node("/root/HudGroups")
var registry: Node = tree_root.get_node("/root/ImplantRegistry")
@@ -436,4 +406,4 @@ func _setup_atlas_golden_shot(
# jump_to() is the fixed-center revisit intent that descends to any
# other rung at a literal, reproducible world_center (D-255(a): every
# body's region grid is centered on world-metre ZERO).
viewer.jump_to(Vector2.ZERO, rung)
viewer.jump_to(world_center, rung)
+13 -1
View File
@@ -121,8 +121,20 @@ fn main() {
// HEIGHTMAP_CELLS_PER_DISTRICT working pixels), never true DISTRICT_M.
let anchor_cell = bws.placements.iter().max_by_key(|p| p.score).map(|p| {
let cell = scale::heightmap_pixel_to_survey_cell(p.position);
// World metres too, not just pixel/cell: this is the coordinate the
// Atlas navigates in (StepCanvasViewer.jump_to takes world_center), so
// printing it is what lets a capture descend the rung ladder ON a
// settlement instead of at world-metre zero.
let (sx, sy) = district_profile::survey_cell_centre_world_m(
cell,
scale::HEIGHTMAP_CELLS_PER_DISTRICT,
bws.heightmap_width as usize,
bws.heightmap_height as usize,
body_params.body_radius_km,
);
println!(
"\nprincipal settlement: city {} @ pixel {:?} → survey cell {:?} (placement score {})",
"\nprincipal settlement: city {} @ pixel {:?} → survey cell {:?} \
→ world ({sx:.0}, {sy:.0}) m (placement score {})",
p.city_id, p.position, cell, p.score
);
// 150 chunks (9 600 m) ÷ one survey cell's ACTUAL metric width at this
+1 -1
View File
@@ -37,7 +37,7 @@ trap '[[ -n "${SERVER_PID:-}" ]] && kill "$SERVER_PID" 2>/dev/null; wait "$SERVE
while [[ $# -gt 0 ]]; do
case "$1" in
--screenshot) MODE="screenshot"; TARGET="${2:-fog_3state}"; shift 2 ;;
--screenshot) MODE="screenshot"; TARGET="${2:-atlas_GJ820Bc_Global}"; shift 2 ;;
--movie) MODE="movie"; TARGET="${2:-flow_dialogue}"; shift 2 ;;
--update) MODE="update"; shift ;;
--filter) shift 2 ;; # Accept and ignore (run-all compat)
+26 -64
View File
@@ -6,70 +6,6 @@
"golden_dir": "client/tests/golden/visual",
"_comment_atlas_goldens": "T-1157 (D-255 rewrite of the T-1120 matrix, PR #180 provenance carried forward, Tyre): the atlas_* golden scenarios below key on (body, rung) per the stepped Atlas ladder, captured AND verified (exact pixel match) on danoontje's Mesa/AMD stack. T-1121 documents that goldens do NOT port across boxes at the current tolerance (the 19 pre-existing goldens fail 12-14% on this same box) — an atlas_* golden failing on a DIFFERENT machine is expected baseline drift, not a regression, until T-1121 resolves the canonical-capture-box question.",
"scenarios": {
"fog_3state": {
"ticks": 5,
"description": "All 3 fog states — clear/explored/unexplored"
},
"fog_diagonal": {
"ticks": 10,
"description": "Diagonal LOS boundary (staircase regression target)"
},
"fog_boundary": {
"ticks": 8,
"description": "Explored/unexplored transition centered in frame"
},
"fog_zone_tint": {
"ticks": 5,
"description": "Bar zone warm amber tint in explored fog (D-046)"
},
"fog_debug": {
"ticks": 5,
"description": "Raw exploration overlay (green/blue/red)"
},
"npc_in_fog": {
"ticks": 5,
"description": "NPC sprite visible above fog overlay (D-033)"
},
"hud_default": {
"ticks": 1,
"description": "Full HUD: time, Careful stance (green), minimap, monologue"
},
"dialogue_open": {
"ticks": 3,
"description": "Dialogue box + interaction prompt + key bar positioning"
},
"dialogue_with_monologue": {
"ticks": 4,
"description": "Confrontation beat: dialogue + monologue simultaneously"
},
"minimap_stance": {
"ticks": 2,
"description": "Minimap + Sprint stance indicator overlap (top-right)"
},
"cursor_menu": {
"ticks": 3,
"description": "Cursor rendering over dialogue option"
},
"fog_live_replay": {
"ticks": 1,
"description": "Replay real server hub snapshot — full pipeline fog test",
"replay_snapshot": "tests/fixtures/gauntlet/hub_spawn.msgpack"
},
"fog_theater_replay": {
"ticks": 1,
"description": "Replay Fog Theater — large room with NPCs at varying distances",
"replay_snapshot": "tests/fixtures/gauntlet/fog_theater.msgpack"
},
"fog_boundary_replay": {
"ticks": 1,
"description": "Replay hub after movement — explored/visible tile boundary",
"replay_snapshot": "tests/fixtures/gauntlet/hub_after_movement.msgpack"
},
"fog_live_hub": {
"ticks": 10,
"live": true,
"description": "Live server: Hub spawn fog — real pipeline regression test"
},
"implant_pending": {
"ticks": 1,
"description": "ImplantPending — diegetic Layer-1 generating indicator (#960)"
@@ -136,6 +72,32 @@
"live": true,
"description": "T-1157 curated Atlas golden (D-255): Ferrath (GJ820Bc), District rung, temperature overlay"
},
"_comment_descent_ladder": "The atlas_GJ820Bc_land_* set is one body at ONE world point, once per rung, so the ladder reads as a descent. Anchored on land rather than world-metre zero. It judges the NATURE layer (relief, coast, watercourses, biome character) — nothing civilizational is generated yet and none is due before T-1207, so an absence of settlements is the expected state, not a finding.",
"atlas_GJ820Bc_land_Region": {
"ticks": 240,
"live": true,
"description": "Descent ladder (2026-08-06): Ferrath (GJ820Bc), Region rung, land-anchored, no overlay"
},
"atlas_GJ820Bc_land_District": {
"ticks": 240,
"live": true,
"description": "Descent ladder: Ferrath (GJ820Bc), District rung, land-anchored, no overlay"
},
"atlas_GJ820Bc_land_Quarter": {
"ticks": 240,
"live": true,
"description": "Descent ladder: Ferrath (GJ820Bc), Quarter rung, land-anchored, no overlay"
},
"atlas_GJ820Bc_land_Block": {
"ticks": 240,
"live": true,
"description": "Descent ladder: Ferrath (GJ820Bc), Block rung, land-anchored, no overlay"
},
"atlas_GJ820Bc_land_Chunk": {
"ticks": 240,
"live": true,
"description": "Descent ladder: Ferrath (GJ820Bc), Chunk rung (deepest), land-anchored, no overlay"
},
"atlas_GJ251c_Global": {
"ticks": 240,
"live": true,