fix(迭代27收口补遗): 卡片核对缺口三项+resolver 幽灵通道断根

- V8 卫生 grep 断言落地 smoke(字符串 Callable 产品码零命中/FeatsEngine 退役/死代码抽查/GP 影子账零残留)
- 06 补登卡片两条义务(长函数余量 14 件+lambda 连接 76 处防回归)
- 漏网字符串 Callable×2 补装+validator 头注/main 死注记清理
- resolver 幽灵通道断根: reset_warn_dedup 门面参从未存在(字符串 Callable 零校验藏死引用,
  方法引用换装编译期暴露)——删参,注册表清空归 resolver 本类方法(门面 :115 直呼即正道)
- 实现报告补核对结案段

闸: 冒烟 1086/0(+V8×5)+类型闸归零
This commit is contained in:
DKChan committed 2026-10-15 03:03:29 +08:00
1 parent dd418e5d7d
commit 9a9fa7e8be
7 files changed
+54 -7

No files matched your search

+2 -2
View File
@@ -60,7 +60,7 @@ var _reload_gate := false # 数据配置 EC8——战斗结
func _init() -> void:
_resolver = ConfigDbResolver.new(Callable(self, "push_diag"), Callable(self, "reset_warn_dedup"),
_resolver = ConfigDbResolver.new(push_diag,
func() -> Variant: return board_gen.rows, func() -> Variant: return enemy.rows, func() -> Variant: return difficulty) # 协作类持门面引用(诊断/致命通道回呼)
@@ -90,7 +90,7 @@ func is_fatal() -> bool:
func reset_diagnostics() -> void:
_diagnostics.clear()
_resolver._reset_warn.call() # R1 告警去重注册表(协作类持钥——清空时点与拆分前一致;通道 Callable 化随 T6)
_resolver.reset_warn_dedup() # R1 告警去重注册表(协作类持钥——清空时点与拆分前一致)
func diagnostics() -> Array:
+1 -1
View File
@@ -3,7 +3,7 @@
# 职责单一化(Rule 6 校验双通道的跨表一侧):_cross_validate 全域(悬空引用/池护栏/节点精确行/
# 技能池构成)+ validate_skill_pool_links(冒烟直验独立入口)。ConfigDb autoload 门面保持——
# load_tables 调用点与冒烟直验经门面同名方法,公有签名零变化。
# 诊断通道注入:跨表校验的行级错误经 push_diag: Callable 外发(门面传 Callable(self, "push_diag"))——
# 诊断通道注入:跨表校验的行级错误经 push_diag: Callable 外发(门面传方法引用 push_diag——迭代 27 T6 Callable 换装)——
# 本类零 ConfigDb 依赖(无状态纯校验器,装载序上先于成员赋值执行的前提保持)。
# 迁移注记:validate_skill_pool_links 的 status_table 显式入参纪律照抄(装载通道传 loaded 表,
# 冒烟直验传门面 status_effects;null 时 side 守卫跳过)——返回错误列表不进诊断通道,消费面归调用方。
+1 -3
View File
@@ -12,17 +12,15 @@ class_name ConfigDbResolver
extends RefCounted
var _diag: Callable # 诊断/致命通道(迭代 27 T6——门面类型反持解耦,validator 先例:签名 (level, category, message))
var _reset_warn: Callable # 去重注册表清空通道(reset_diagnostics 时点由门面驱动)
var _board_gen_rows_get: Callable # () -> Array——board_gen 行集活读(数据面经 Callable 注入,ConfigDb 类型环断根)
var _enemy_rows_get: Callable # () -> Array——enemy 行集活读
var _difficulty_get: Callable # () -> DifficultyTable(可空——表缺省合法态)
var _warn_dedup: Dictionary[String, bool] = {} # R1 四元组去重注册表(自 ConfigDb 迁入)
func _init(diag_cb: Callable, reset_warn_cb: Callable, board_gen_rows_cb: Callable,
func _init(diag_cb: Callable, board_gen_rows_cb: Callable,
enemy_rows_cb: Callable, difficulty_cb: Callable) -> void:
_diag = diag_cb
_reset_warn = reset_warn_cb
_board_gen_rows_get = board_gen_rows_cb
_enemy_rows_get = enemy_rows_cb
_difficulty_get = difficulty_cb
+1 -1
View File
@@ -22,7 +22,7 @@
# T3 拆件批(2026-10-02,规范 1.1 单一职责):结算行排播泵迁 row_pacer.gd(本类只入队/排空/读队列,
# 探针/测试委托面 _row_queue/pace_delay_for/_flush_row_queue 原位保留);秘宝两步交互迁
# treasure_interact_controller.gd(本类只接线与转发意图,无目标使用显式化——哨兵坐标不出控制器);
# GP 冒险钱包影子账迁 gp_shadow_ledger.gd(本类留探针同名读写委托面)。模态开合全量走
# (GP 影子账已随迭代 27 T3 退役——summary gp_final 键取代)。模态开合全量走
# _open_modal/_close_modal 单口,输入锁=modal_stack.has_open_excluding(debug_overlay) 排除式
# 开态查询+三例外(迭代 18 卡⑦——浮窗开态不计入锁);battle 收尾反馈与
# 结算视觉 setter 收敛 hud_presenter 单通道(时序敏感演出触发留本类并注释);settlement 相位读取改经
+40
View File
@@ -83,6 +83,7 @@ func _split_tail() -> void:
await process_frame
var autoload_ok: bool = get_root().get_node_or_null("/root/ConfigDB") != null and get_root().get_node_or_null("/root/SaveManager") != null
_smoke_type_gate()
_smoke_hygiene_gates()
if autoload_ok:
await _smoke_scene_split() # 协程函数必须 await(无 await=发射后不管,首个 await 后即被 quit 截断)
await _smoke_run_lifecycle()
@@ -103,6 +104,45 @@ func _smoke_type_gate() -> void:
"V7 类型审计器闸机在位(static_scan S9 → tools/audit_type_hints.py)〔迭代27 T5〕")
# ---- 卫生件 grep 闸(迭代 27 T6 V8——死代码/字符串 Callable/影子账残留零命中;源码扫描面)----
func _smoke_hygiene_gates() -> void:
var callables := 0
for d in ["res://core", "res://presentation", "res://data"]:
var dir := DirAccess.open(d)
if dir == null:
continue
dir.list_dir_begin()
var f := dir.get_next()
while f != "":
if dir.current_is_dir() and not f.begins_with("."):
var sub := DirAccess.open(d + "/" + f)
if sub != null:
sub.list_dir_begin()
var g := sub.get_next()
while g != "":
if g.ends_with(".gd"):
var t: String = FileAccess.get_file_as_string(d + "/" + f + "/" + g)
callables += t.count("Callable(self, \"")
g = sub.get_next()
elif f.ends_with(".gd"):
var t2: String = FileAccess.get_file_as_string(d + "/" + f)
callables += t2.count("Callable(self, \"")
f = dir.get_next()
check(callables == 0,
"V8 字符串 Callable 产品码零命中(实测 %d——方法引用换装闸)〔迭代27 T6〕")
check(not FileAccess.file_exists("res://core/feats_engine.gd"),
"V8 FeatsEngine 整文件退役(class_name 注销=文件删除)〔迭代27 T6〕")
var bo: String = FileAccess.get_file_as_string("res://core/battle_orchestrator.gd")
check(not bo.contains("func _attune_row"),
"V8 死代码抽查·_attune_row 零残留〔迭代27 T6〕")
var sm: String = FileAccess.get_file_as_string("res://core/save_manager.gd")
check(not sm.contains("func attunement_counters"),
"V8 死代码抽查·attunement_counters 零残留〔迭代27 T6〕")
var mv: String = FileAccess.get_file_as_string("res://presentation/main.gd")
check(not mv.contains("gp_shadow_ledger") and not mv.contains("_gp_ledger"),
"V8 GP 影子账残留零命中(main 源码面——文件已删+委托缝已拆)〔迭代27 T3〕")
# ---- 三屏场景化断言(迭代 27 T1 V2——独立实例化+关键节点在位+组合根树序/z 序保序)----
func _smoke_scene_split() -> void:
print("--- 迭代27 T1 三屏场景化(V2:屏壳独立实例化+组合根装配保序)---")