fix(iter37①): T3 验收面收口——golden 判失效换代+新码类型标注对齐现行规约

golden 换代触发原因(强制记载):棋盘三图换代面实测 changed=0.13%/0.11%/0.10%,
差异像素全落 900×760 裁剪区内(裁剪区外 0),按 README 加严口径判失效;成因定位为
2f3a87e9(魔法道具 HUD)注入 REWARD_BADGE 预读格字形,晚于 2026-10-08 建基,与本批零因果。
呈报后用户裁「重制三张基线」,经 tools/golden_baseline_refresh.sh 换代;复闸 changed 全 0.00%、
菜单 0.00% 未动。README 判定记录同步加注一条。

同批:modal_stack 合并账本改 Array[Control](类型闸 R1);新增/触碰的测试件按 test-conventions §6
补齐类型标注(FakeStage/FakeFx calls: Array[Array]、damage_controller_test 两处 db: ConfigDb),
pacing_queue_test 三条 d12 断言补〔wd12〕尾缀。直跑:standee_fx_sweep/damage_controller/
pacing_queue 三套全绿+error_scan 0;audit_type_hints PASS。
This commit is contained in:
DKChan committed 2026-10-25 05:03:03 +08:00
1 parent 353c1c6bb2
commit 7389618fd1
8 files changed
+19 -10

No files matched your search

+4 -1
View File
@@ -31,7 +31,10 @@ func open(m: Control) -> void:
hidden.append(higher)
# 遮挡账合并非覆盖:同层重复 open 时上方已隐、hidden 为空,旧账须保留
# (空表覆盖会让先前被隐层在本层 close 后永不恢复)
var merged: Array = _occluded.get(m, []).duplicate()
var merged: Array[Control] = []
for h in _occluded.get(m, []):
if not merged.has(h):
merged.append(h)
for h in hidden:
if not merged.has(h):
merged.append(h)
+6
View File
@@ -21,3 +21,9 @@
- 2026-10-16(迭代 29 T7):**判有效**。三代换代面(棋盘三图 + 启动态菜单)实测
changed = 0.00% / 0.00% / 0.00% / 0.15%,均远低于 2% 阈值 ⇒ 基线留在位,不重制。
(本批零视觉改动,判定属常规复核。)
- 2026-10-25(迭代 37 卡① T3):**判失效 → 显式重制 + 复闸**。实测棋盘三图
changed = 0.13% / 0.11% / 0.10%,差异像素全落 900×760 棋盘裁剪区内、裁剪区外 0,
按加严口径不判有效;成因定位为 `2f3a87e9`(魔法道具 HUD)注入 `REWARD_BADGE` 预读格
字形——晚于 2026-10-08 建基提交,与本批零因果。呈报后用户裁「重制三张基线」,
经 `tools/golden_baseline_refresh.sh` 换代;复闸 changed = 0.00% / 0.00% / 0.00%,
启动态菜单 0.00%(未重制)。
Binary file not shown.

Before

Width:  |  Height:  |  Size: 98 KiB

After

Width:  |  Height:  |  Size: 99 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 115 KiB

After

Width:  |  Height:  |  Size: 115 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 109 KiB

After

Width:  |  Height:  |  Size: 109 KiB

@@ -227,7 +227,7 @@ func _unit_fixture() -> Dictionary:
}
func _test_identical_content_dual_enemy(db) -> void:
func _test_identical_content_dual_enemy(db: ConfigDb) -> void:
var a := _unit_fixture()
var b := _unit_fixture()
Kit.check("前置:双敌字典内容全同且非同一实例", a == b and not is_same(a, b))
@@ -256,7 +256,7 @@ func _test_identical_content_dual_enemy(db) -> void:
# ---- requires 前置门:前置单未实际有效兑付 → 后继单静默作废;无存活敌 blast = 合法零兑付 ----
# d12 产发端增键:目标身份随行/随载荷下发(同名敌按 id 精确解析的产发半)
func _test_target_id_payload(db) -> void:
func _test_target_id_payload(db: ConfigDb) -> void:
_rows = []
var h = _harness(db)
if not h.spawn_ok:
@@ -14,7 +14,7 @@ var _problems: Array = []
# 记参假站桩(d12 排播半):继承真类以过类型面,只记解析入参
class FakeStage extends BattleStageView:
var calls: Array = []
var calls: Array[Array] = []
func enemy_standee_center(target_id: String, display_name: String) -> Variant:
calls.append([target_id, display_name])
@@ -23,7 +23,7 @@ class FakeStage extends BattleStageView:
# 记参假演出层(同上——play_* 全部只记不演)
class FakeFx extends SettlementFxView:
var calls: Array = []
var calls: Array[Array] = []
func play_projectile(_from: Vector2, _to: Vector2, _glyph: String, _col: Color, _crit: bool = false) -> void:
calls.append(["projectile", _to])
@@ -133,11 +133,11 @@ func _init() -> void:
rp.settlement_fx = ffx
rp._play_settlement_mark({"type": "damage", "target": "哥布林", "target_id": "goblin_b", "value": 3})
check(fstage.calls.size() == 1 and fstage.calls[0] == ["goblin_b", "哥布林"],
"结算标出按行 target_id 解析站桩(id 与名同传——d12)")
"结算标出按行 target_id 解析站桩(id 与名同传——d12)〔wd12〕")
rp._play_cross_zone_fx({"type": "damage", "target": "哥布林", "target_id": "goblin_b", "value": 3})
check(fstage.calls.size() == 2 and fstage.calls[1] == ["goblin_b", "哥布林"],
"跨区弹道按行 target_id 解析站桩(id 与名同传——d12)")
check(ffx.calls.size() == 2, "两路解析成功后演出层各接一拍(记参面非空)")
"跨区弹道按行 target_id 解析站桩(id 与名同传——d12)〔wd12〕")
check(ffx.calls.size() == 2, "两路解析成功后演出层各接一拍(记参面非空)〔wd12〕")
rp.free()
_finish()
@@ -43,10 +43,10 @@ class FakePanel extends Node:
# 假自动策略(run_level 签名同 level_autoplay——回调内读控制器运行态)
class FakeDriver extends RefCounted:
var ctrl
var seen: Array = []
var seen: Array[bool] = []
var calls := 0
func run_level(_db, _seed: int, _level: int, _atk: int, _hp: int, _other: bool, _logger):
func run_level(_db: Variant, _seed: int, _level: int, _atk: int, _hp: int, _other: bool, _logger: Variant) -> Dictionary:
calls += 1
seen.append(ctrl.is_running())
if calls == 1: