test(验证): 批 B 按条变异验证引擎交付——单进程内存内变异(table 表改写/inject 源码注入编译路径接管/state 状态篡改+树形模板)三武器 189 条全跑:验红 131/异常 58(异常全数归因入账:磁盘读取面 2/schema 常量面 4/幂等等值面 2/预算收刀与改坏面缺形 50/基线未复绿 1 套如实亮灯);复验单轮中位 122ms;--adhoc 零配置宿主/--excl-func/--excl-line 毒候选隔离阀/--snap 快照物化/--ledger 台账机生成;seal 提交快照留底 .gates/mut_snapshots 供 --snap 物化;统一台账落 reports/批B-变异统一台账.md(主会话统一验证用 --adhoc 跑剩余未提交宿主)

This commit is contained in:
DKChan committed 2026-10-23 13:35:49 +08:00
1 parent 5ed1ec99af
commit 8fbd2dd875
4 files changed
+2697

No files matched your search

@@ -0,0 +1,74 @@
# tests/unit/battle_settlement/seal_polarity_test.gd — 封印与极性单元测试宿主
# 断言面 = 八套(批 B 断言迁移自 smoke_all.gd,G5 施工组;八套按源编排序分八笔原子提交迁入):
# 末点 AP 封印轮末结算(playtest 缺陷②回归——action_economy 末点花费与轮终结)
# 封印不可逆四情况(禁撤封印 + 挖封印格兑付改判——minesweeper_rules 拒绝面)
# 清图奖励双份兑付链(真实流完美封印——orchestrator grant_clear 身份兑付)
# 清图奖励弱形式分支(零兑付 / 高光守卫 / 第二份拒——直调编排私有面构造)
# 轮内刷新 provenance 守卫(刷新图清图不发清图奖励)
# 极性路由 + 封印溢价 125%(挖安全格正向 / 挖危险格负向 / 标中标空兑付极性)
# 负向字典逐型直验(效果行 / heal 直伤 / blast 警觉 / action 行动点排队)
# 格面资源资格面(揭示事件 resource 标记 + 封锁格身份查询)
# 协议照单元侧惯例:extends SceneTree+Kit.check 主通道;--script 模式无 autoload,
# ConfigDB 显式实例化构造注入(各套自建 RngService——源套掷点隔离形态,宿主不持统一流);
# 表加载失败不中止(沿被迁断言面的源语义——诊断在此展开,表值变异的红由具体断言落,承 G2/G3/G4 同款)。
# 运行:godot --headless --path game --script res://tests/unit/battle_settlement/seal_polarity_test.gd
extends SceneTree
const Kit := preload("res://tests/unit/test_kit.gd")
const ConfigDBScript := preload("res://core/config_db.gd")
const AutoPlayer := preload("res://smoke/auto_player.gd") # 自动玩家策略单一实现(迁移期按现路径 preload——账本 §五夹具前提)
var _db
func _init() -> void:
_db = ConfigDBScript.new()
# 表加载失败不中止(承 G2/G3/G4 同款:表损坏的红落在具体断言上——
# 诊断在此展开,后续断言按坏表实况逐条验红;collect_only=true 下成员照常赋值可评)
var load_ok: bool = _db.load_tables("res://data/tables", true)
if not load_ok:
push_error("[seal_polarity_test] 表加载返回失败——诊断如下(红由具体断言落)")
for d in _db.diagnostics():
if d.severity == "error" or d.severity == "fatal":
push_error(" [%s] %s: %s" % [d.severity, d.category, d.message])
# 套执行序沿源编排序
_smoke_seal_ap_exhausted()
quit(Kit.finish("seal_polarity_test"))
# ---- 末点 AP 封印轮末结算(playtest 缺陷②回归:末点 AP 花在封印必须终结轮次进入下一轮)----
func _smoke_seal_ap_exhausted() -> void:
print("--- 排雷玩法·封印动作耗尽末点 AP 回归 ---")
var rng = load("res://core/rng_service.gd").new()
rng.set_master_seed(20260911)
var settlement = load("res://core/battle_orchestrator.gd").new(_db, rng)
var rounds: Array = []
settlement.round_started.connect(func(ri): rounds.append(ri))
Kit.check("回归战斗启动(Boss 行——D0 20HP 级会被盲挖粉尘秒杀,无法承载封印回归场景)",
settlement.begin_battle({"level_index": 1, "node_depth": 4, "hero_hp": int(_db.hero.max_hp), "node_type": "boss"}))
var minesweeper = settlement.minesweeper
# 恰花 (AP-1) 点挖掘,留末点给封印(表驱动——AP 从表读不写死)
var ap_total: int = int(_db.action_economy.ap_per_round)
for i in range(ap_total - 1):
if settlement.action_economy.phase != "Active" or settlement.action_economy.ap == 0:
break
var plan = AutoPlayer.choose_dig(minesweeper)
if plan.is_empty():
break
if plan.hero_cell != minesweeper.hero_pos():
minesweeper.settle_batch([{"action": "move", "cell": plan.hero_cell}])
minesweeper.settle_batch([{"action": "dig", "cell": plan.dig_cell}])
Kit.check("%d 次挖掘后恰剩 1 AP(phase=%s ap=%d)" % [ap_total - 1, str(settlement.action_economy.phase), settlement.action_economy.ap],
settlement.action_economy.phase == "Active" and settlement.action_economy.ap == 1)
# 末点 AP 花在封印——轮次必须终结并结算进入第 2 轮
# 封印目标 = 挖掘策略的下一目标格(构造保证:未开、与小人邻接——先把小人移到其邻接已开格)
var plan2 = AutoPlayer.choose_dig(minesweeper)
Kit.check("仍存在可挖目标(封印目标来源)", not plan2.is_empty())
var out: Array = []
if not plan2.is_empty():
if plan2.hero_cell != minesweeper.hero_pos():
minesweeper.settle_batch([{"action": "move", "cell": plan2.hero_cell}])
out = minesweeper.settle_batch([{"action": "seal_place", "cell": plan2.dig_cell}])
Kit.check("末点 AP 封印被受理", not out.is_empty() and bool(out[0].accepted))
Kit.check("封印动作耗尽 AP 触发轮末结算并进入第 2 轮(rounds=%s)" % str(rounds), rounds.size() >= 2)
File diff suppressed because it is too large. Load diff
+159
View File
@@ -0,0 +1,159 @@
# tests/mutation/mutation_plan.gd — 变异验证引擎的计划配置(数据件,无逻辑)
# 宿主×套×变异策略一览:套→守的生产模块(账本 §二末列)+武器优先序+运行参数。
# src 指「被变换编译的宿主源码」:稳定宿主直接读工作区文件;迁移中的宿主(如 seal)
# 用驱动命令物化的快照(user:// 下,仓库外)——物化命令见套配置旁注与台账头部。
# 武器代号:table=表/资源改写(内存字段写读还原)· inject=注入编译(生产源码内存变换
# reload 原地替换·零触盘)· state=状态篡改(静态变量/成员初值/autoload 实例与树状态)。
# budget=每套改坏点试跑上限(轮)· cap_ms=每套墙钟上限 · count=静态断言点数(对账用)。
extends RefCounted
const GLOBAL_WATCHDOG_MS := 14400000 # 引擎全局看门狗(防挂死占闸;外层 bash 超时为最终兜底——4h,慢套全程靠它)
const SUITE_CAP_MS_DEFAULT := 600000 # 单套墙钟上限缺省(宿主级 cap_ms 可覆盖)
const BUDGET_DEFAULT := 160 # 单套试跑轮数缺省
static func hosts() -> Array:
return [
{
"id": "system_test",
"src": "res://tests/system_test.gd",
"channel": "self", # 断言通道 = 宿主自有 check(cond, label)
"async": true, # 套函数为协程(await process_frame)
"budget": 240,
"cap_ms": 2400000, # 慢套墙钟上限(boot 链/活战斗驱动单轮 20–60s)
"state_autoloads": ["ConfigDB", "SaveManager"],
"suites": {
"_split_tail": {"count": 1, "weapons": ["state"], "modules": [], "tables": [],
"strip_siblings": true, "funcs": {}},
"_smoke_scene_split": {"count": 11, "weapons": ["inject", "state"], "tables": [],
"modules": ["res://presentation/scenes/menu_screen.gd", "res://presentation/scenes/camp_screen.gd",
"res://presentation/scenes/adventure_screen.gd", "res://presentation/main.gd"],
"funcs": {"menu_screen.gd": ["_ready", "_build_ui"], "camp_screen.gd": ["_ready", "_build_ui"],
"adventure_screen.gd": ["_ready", "_build_ui"], "main.gd": ["_apply_layer_contract", "_build_ui", "_ready"]}},
"_smoke_boot_chain": {"count": 15, "weapons": ["inject", "state"], "tables": [],
"modules": ["res://presentation/settings_store.gd", "res://core/save_manager.gd",
"res://presentation/main.gd", "res://presentation/views/ui_kit.gd", "res://core/config_db.gd"],
"funcs": {"settings_store.gd": ["*"], "save_manager.gd": ["active_slot", "keystone_balance",
"write_to_disk", "has_breakpoint", "set_breakpoint", "clear_breakpoint", "slot_path", "adventure_total", "has_write_target"],
"main.gd": ["_ready", "_build_ui", "_refresh_resume_button", "_begin_session"]}},
"_smoke_run_lifecycle": {"count": 11, "weapons": ["inject", "state"], "tables": [],
"modules": ["res://presentation/run_scope.gd", "res://presentation/views/battle_end_overlay.gd",
"res://presentation/main.gd", "res://core/adventure_runner.gd"],
"funcs": {"run_scope.gd": ["*"], "battle_end_overlay.gd": ["is_open", "open", "close"],
"main.gd": ["_start_adventure_from_menu", "_begin_session", "_on_battle_end_continue", "_refresh_resume_button"],
"adventure_runner.gd": ["abandon", "clear_breakpoint"]}},
"_smoke_lifecycle_matrix": {"count": 10, "weapons": ["inject", "state"], "tables": [],
"modules": ["res://presentation/scenes/menu_screen.gd", "res://core/battle_orchestrator.gd",
"res://presentation/views/battle_end_overlay.gd", "res://presentation/main.gd", "res://core/adventure_runner.gd"],
"funcs": {"menu_screen.gd": ["_build_ui"], "battle_orchestrator.gd": ["is_battle_live", "begin_battle"],
"battle_end_overlay.gd": ["is_open"], "main.gd": ["_begin_session", "_on_battle_end_continue",
"_resume_from_menu", "_open_settings", "_open_career", "_show_debug_overlay"],
"adventure_runner.gd": ["abandon", "clear_breakpoint"]}},
"_stage_faces": {"count": 1, "run_fn": "_smoke_lifecycle_matrix", "weapons": ["inject", "state"],
"tables": [], "modules": ["res://presentation/modal_flow.gd", "res://presentation/main.gd"],
"funcs": {"modal_flow.gd": ["*"], "main.gd": ["_setup_modal_flow", "_build_ui"]}},
},
},
{
"id": "table_structure_guard",
"src": "res://tests/unit/data_config/table_structure_guard_test.gd",
"channel": "kit",
"async": false,
"budget": 3000,
"cap_ms": 1200000,
"state_autoloads": [],
"suites": {
"_smoke_ac_swap_guard": {"count": 12, "weapons": ["table", "inject"],
"tables": ["enemy", "status_effects", "reward", "settlement", "hero"],
"modules": ["res://core/unit_container.gd", "res://core/config_db_resolver.gd"], "funcs": {}},
"_smoke_enemy_bands": {"count": 4, "weapons": ["table", "inject"],
"tables": ["enemy"], "modules": ["res://core/config_db_resolver.gd"], "funcs": {}},
"_smoke_variation_framework": {"count": 9, "weapons": ["table", "inject"],
"tables": ["variation"], "modules": ["res://data/schemas/variation_table.gd"], "funcs": {}},
"_smoke_difficulty_table": {"count": 8, "weapons": ["table", "inject"],
"tables": ["difficulty"], "modules": ["res://core/unit_container.gd", "res://core/config_db_resolver.gd"], "funcs": {}},
"_smoke_nine_types_gp_stream": {"count": 6, "weapons": ["table", "inject"],
"tables": ["reward"], "modules": ["res://data/schemas/reward_table.gd", "res://core/rng_service.gd"], "funcs": {}},
"_smoke_adventure_table": {"count": 17, "weapons": ["table", "inject"],
"tables": ["adventure", "treasure_items", "meta"],
"modules": ["res://data/schemas/adventure_table.gd", "res://core/attunement.gd",
"res://data/schemas/treasure_item_table.gd", "res://core/battle_orchestrator.gd", "res://core/meta_progression.gd",
"res://core/config_db.gd"], "funcs": {}},
"_smoke_meta": {"count": 4, "weapons": ["table", "inject"],
"tables": ["meta"], "modules": ["res://core/meta_progression.gd"], "funcs": {}},
},
},
{
"id": "board_gen_reward",
"src": "res://tests/unit/core/board_gen_reward_test.gd",
"channel": "kit",
"async": false,
"budget": 800,
"state_autoloads": [],
"suites": {
"_smoke_layout_cell_formula": {"count": 2, "weapons": ["inject", "state"], "tables": [],
"modules": ["res://presentation/views/board_view.gd"], "funcs": {}},
"_smoke_reward_identity_unit": {"count": 10, "weapons": ["inject", "state"], "tables": [],
"modules": ["res://core/reward_economy.gd"], "funcs": {}},
"_smoke_board_generator": {"count": 22, "weapons": ["inject", "table"],
"tables": ["board_gen"],
"modules": ["res://core/board_generator.gd", "res://core/config_db_resolver.gd"], "funcs": {}},
"_smoke_power_interval": {"count": 5, "weapons": ["table", "inject"], "tables": ["reward"],
"modules": ["res://core/reward_economy.gd"], "funcs": {}},
},
},
{
"id": "roll_multiplier",
"src": "res://tests/unit/battle_settlement/roll_multiplier_test.gd",
"channel": "kit",
"async": false,
"budget": 400,
"cap_ms": 1800000,
"state_autoloads": [],
"suites": {
"_smoke_enemy_attack_type": {"count": 4, "weapons": ["table", "inject"],
"tables": ["enemy"], "modules": ["res://core/unit_container.gd", "res://core/damage_controller.gd"], "funcs": {}},
"_smoke_armor_roll": {"count": 15, "weapons": ["table", "inject"], "tables": ["settlement"],
"modules": ["res://core/damage_math.gd", "res://core/damage_controller.gd", "res://core/status_container.gd"], "funcs": {}},
"_smoke_pool_wiring": {"count": 4, "weapons": ["table", "inject"], "tables": ["status_effects"],
"modules": ["res://core/damage_controller.gd"], "funcs": {}},
"_smoke_damage_types": {"count": 10, "weapons": ["table", "inject"], "tables": ["enemy", "settlement"],
"modules": ["res://core/settlement/grant_segment.gd", "res://core/damage_controller.gd"], "funcs": {}},
"_smoke_attack_chain_fresh_pool": {"count": 3, "weapons": ["inject", "state"], "tables": [],
"modules": ["res://core/battle_orchestrator.gd", "res://core/damage_controller.gd"], "funcs": {}},
},
},
{
"id": "seal_polarity",
# 迁移中宿主:读驱动命令物化的提交快照(5ed1ec99 版=套1 五条在册形态),不读 WIP 工作区
"src": "user://mutation_work/seal_polarity_test.gd",
"channel": "kit",
"async": false,
"budget": 600,
"state_autoloads": [],
"suites": {
"_smoke_seal_ap_exhausted": {"count": 5, "weapons": ["state", "table", "inject"],
"tables": ["action_economy"],
"modules": ["res://core/battle_orchestrator.gd", "res://core/action_economy.gd", "res://core/minesweeper_rules.gd"],
# funcs 提示=账本 §九 G5 套1 旧法变异点所在函数(只作试跑排序,不作唯一改坏面)
"funcs": {"battle_orchestrator.gd": ["begin_battle"],
"minesweeper_rules.gd": ["revealed_cells", "settle_batch"],
"action_economy.gd": ["_cost", "try_spend", "_spend_cost_and_arbitrate", "_spend_and_arbitrate"]}},
},
},
]
static func host_by_id(id: String) -> Dictionary:
for h in hosts():
if h["id"] == id:
return h
return {}
static func total_static_checks() -> int:
var n := 0
for h in hosts():
for s in h["suites"].values():
n += int(s["count"])
return n
+291
View File
@@ -0,0 +1,291 @@
# 批 B 变异统一台账(机器生成)
> 生成命令:`godot --headless --path game --script res://tests/mutation/mutation_engine.gd -- --all --snap=seal_polarity=res://tests/.gates/mut_snapshots/seal_polarity_test.gd(23 套分批跑齐:system/TSG/board/roll/seal;board_generator 与 roll 尾套带 --excl-func/--excl-line 毒候选隔离与 --budget 收刀,各批命令见实现报告)`
> 生成时间:2026-10-23T13:33:47 · 引擎:游戏环境启动一次,逐条执行「内存内改坏 → 重跑该断言所在套函数 → 验 FAIL → 撤销 → 记录」,全程不改任何文件。
> 三武器:table=已加载 Resource 内存字段改写 · inject=生产脚本源码内存变换+reload 原地重编译(零触盘)· state=对象状态篡改(长活成员/静态与初值/autoload 树状态)。
> 中间结果 JSON 在 `user://mutation_work/results/`(仓库外);本文件为唯一持久产出。
## 一、逐条记录
| 宿主 | 套 | # | 标签 | 武器 | 改坏点 | 结果 | 复验轮耗时 | 连带红 |
|---|---|---|---|---|---|---|---|---|
| system_test | split_tail | 0 | false | state | ConfigDB:-1 tree_rename / [状态·树] autoload 节点 /root/ConfigDB 改名(装配链就绪护栏击穿) | 验红 | 13ms | 0 |
| system_test | smoke_scene_split | 1 | menu.start_overlay != null and menu.lvbtn != null and menu.resumebtn != null and menu.campbtn !=… | | | 异常 | — | — |
| system_test | smoke_scene_split | 2 | menu.start_overlay.visible | | | 异常 | — | — |
| system_test | smoke_scene_split | 3 | menu.mouse_filter == Control.MOUSE_FILTER_IGNORE | | | 异常 | — | — |
| system_test | smoke_scene_split | 4 | camp.camp_overlay != null | | | 异常 | — | — |
| system_test | smoke_scene_split | 5 | not camp.camp_overlay.visible | | | 异常 | — | — |
| system_test | smoke_scene_split | 6 | adv.battle_root != null and adv.stage != null and adv.board_zone != null and adv.board_view != n… | | | 异常 | — | — |
| system_test | smoke_scene_split | 7 | top == main._start_overlay | inject | main.gd:198 bool true→false / main.gd:199 bool true→false [_start_overlay.visible = true → _star… | 验红 | 221ms | 0 |
| system_test | smoke_scene_split | 8 | main._menu_screen.get_index() > main._adventure_screen.get_index() | inject | main.gd:467 num 1→0 / main.gd:468 num 1→0 [slot += 1 → slot += 0] | 验红 | 204ms | 2 |
| system_test | smoke_scene_split | 9 | chain_ok | inject | main.gd:222 asgn 置null / main.gd:223 asgn 置null [info_panel = _adventure_screen.info_panel → inf… | 验红 | 224ms | 0 |
| system_test | smoke_scene_split | 10 | main._start_overlay == main._menu_screen.start_overlay and main.camp_overlay == main._camp_scree… | inject | main.gd:218 asgn 置null / main.gd:219 asgn 置null [_start_overlay = _menu_screen.start_overlay → _… | 验红 | 221ms | 1 |
| system_test | smoke_scene_split | 11 | main.run_scope != null and not main.run_scope.is_adventure | inject | main.gd:196 bool false→true / main.gd:197 bool false→true [_begin_session(false) # 闲时会话(gp_led… | 验红 | 214ms | 0 |
| system_test | smoke_boot_chain | 12 | db.is_ready and db.hero != null | | | 异常 | — | — |
| system_test | smoke_boot_chain | 13 | AudioServer.is_bus_mute(master) == (ss.volume_linear <= 0.001) and is_equal_approx(AudioServer.g… | | | 异常 | — | — |
| system_test | smoke_boot_chain | 14 | ui_kit.motion_scale == (0.5 if ss.reduced_motion else 1.0) | | | 异常 | — | — |
| system_test | smoke_boot_chain | 15 | main._start_overlay.visible | inject | main.gd:198 bool true→false / main.gd:199 bool true→false [_start_overlay.visible = true → _star… | 验红 | 121ms | 2 |
| system_test | smoke_boot_chain | 16 | not sm.has_breakpoint() and not main._resume_btn.visible | | | 异常 | — | — |
| system_test | smoke_boot_chain | 17 | sm.active_slot() == 0 and not sm.has_write_target() | inject | save_manager.gd:358 bool false→true / save_manager.gd:359 bool false→true [return false → return… | 验红 | 133ms | 1 |
| system_test | smoke_boot_chain | 18 | sm.keystone_balance() == 0 and not sm.has_breakpoint() and sm.adventure_total() == 0 | | | 异常 | — | — |
| system_test | smoke_boot_chain | 19 | not sm.write_to_disk() | inject | save_manager.gd:358 bool false→true / save_manager.gd:359 bool false→true [return false → return… | 验红 | 131ms | 1 |
| system_test | smoke_boot_chain | 20 | not (FileAccess.file_exists("user://save.json") and not FileAccess.file_exists(sm.slot_path(1))) | | | 异常 | — | — |
| system_test | smoke_boot_chain | 21 | not sm.has_breakpoint() and not main._resume_btn.visible | | | 异常 | — | — |
| system_test | smoke_boot_chain | 22 | sm.has_breakpoint() and main._resume_btn.visible | inject | main.gd:533 op ==→!= / main.gd:534 op ==→!= [if _resume_btn == null: → if _resume_btn != null:] | 验红 | 122ms | 2 |
| system_test | smoke_boot_chain | 23 | not main._resume_btn.visible | | | 异常 | — | — |
| system_test | smoke_boot_chain | 24 | main.run_scope != null and not main.run_scope.is_adventure and main.run_scope.is_inside_tree() | inject | main.gd:171 op !=→== / main.gd:172 op !=→== [if run_scope != null: → if run_scope == null:] | 验红 | 138ms | 2 |
| system_test | smoke_boot_chain | 25 | not main.debug_overlay.visible | | | 异常 | — | — |
| system_test | smoke_boot_chain | 26 | main.debug_badge != null and main.debug_badge.visible | inject | main.gd:199 bool true→false / main.gd:200 bool true→false [_debug_entry = true # 调试入口门控写死=true… | 验红 | 122ms | 2 |
| system_test | smoke_run_lifecycle | 27 | main.run_scope != null and main.run_scope.is_adventure and main.run_scope.adventure != null | inject | main.gd:492 if 取反 / main.gd:493 if 取反 [if save_manager.has_breakpoint(): → if not (save_manager.… | 验红 | 138ms | 0 |
| system_test | smoke_run_lifecycle | 28 | main.run_scope.hints_shown.is_empty() | | | 异常 | — | — |
| system_test | smoke_run_lifecycle | 29 | main.run_scope.adventure.abandon() | | | 异常 | — | — |
| system_test | smoke_run_lifecycle | 30 | finished.done | inject | main.gd:11 key 错位:"/root/RngService" / main.gd:12 key 错位:"/root/RngService" [const AUTOLOAD_PATH… | 验红 | 331ms | 3 |
| system_test | smoke_run_lifecycle | 31 | main._end_overlay.is_open() | inject | main.gd:11 key 错位:"/root/RngService" / main.gd:12 key 错位:"/root/RngService" [const AUTOLOAD_PATH… | 验红 | 333ms | 3 |
| system_test | smoke_run_lifecycle | 32 | not main.run_scope.is_adventure and main.run_scope.adventure == null and main.run_scope.runner =… | inject | main.gd:726 bool false→true / main.gd:727 bool false→true [_begin_session(false) → _begin_sessio… | 验红 | 141ms | 1 |
| system_test | smoke_run_lifecycle | 33 | main.run_scope.hints_shown.is_empty() and not main.run_scope.boss_active and main.run_scope.last… | inject | main.gd:712 if 取反 / main.gd:713 if 取反 [if _bonus.resume_if_pending(): # 三选一停点在途恢复入口… → if not … | 验红 | 141ms | 2 |
| system_test | smoke_run_lifecycle | 34 | main._start_overlay.visible | inject | main.gd:728 bool true→false / main.gd:729 bool true→false [_start_overlay.visible = true → _star… | 验红 | 153ms | 1 |
| system_test | smoke_run_lifecycle | 35 | not sm.has_breakpoint() | | | 异常 | — | — |
| system_test | smoke_run_lifecycle | 36 | main.run_scope.is_adventure and main.run_scope.adventure != null and main.run_scope.hints_shown.… | inject | main.gd:174 asgn 置null / main.gd:175 asgn 置null [run_scope.is_adventure = adventure_session → ru… | 验红 | 212ms | 2 |
| system_test | smoke_run_lifecycle | 37 | not main._start_overlay.visible | inject | main.gd:498 bool false→true / main.gd:499 bool false→true [_start_overlay.visible = false → _sta… | 验红 | 141ms | 1 |
| system_test | smoke_lifecycle_matrix | 39 | main.run_scope.settlement == null or not main.run_scope.settlement.is_battle_live() | | | 异常 | — | — |
| system_test | smoke_lifecycle_matrix | 40 | main.run_scope.adventure.abandon() | | | 异常 | — | — |
| system_test | smoke_lifecycle_matrix | 41 | finished.done and main._end_overlay.is_open() | | | 异常 | — | — |
| system_test | smoke_lifecycle_matrix | 42 | main.run_scope != old_scope and main.run_scope.is_inside_tree() | inject | main.gd:716 bool false→true / main.gd:717 bool false→true [_settlement_stop_pending = false → _s… | 验红 | 6481ms | 2 |
| system_test | smoke_lifecycle_matrix | 43 | not is_instance_valid(old_scope) | inject | main.gd:716 bool false→true / main.gd:717 bool false→true [_settlement_stop_pending = false → _s… | 验红 | 6341ms | 2 |
| system_test | smoke_lifecycle_matrix | 44 | false | | | 异常 | — | — |
| system_test | smoke_lifecycle_matrix | 45 | main.run_scope.adventure != null and main.run_scope.adventure != first_adv | | | 异常 | — | — |
| system_test | smoke_lifecycle_matrix | 46 | main.run_scope.adventure.abandon() | | | 异常 | — | — |
| system_test | smoke_lifecycle_matrix | 47 | main._resume_btn.visible | inject | main.gd:533 op ==→!= / main.gd:534 op ==→!= [if _resume_btn == null: → if _resume_btn != null:] | 验红 | 4864ms | 0 |
| system_test | smoke_lifecycle_matrix | 48 | main.run_scope != idle_scope and main.run_scope.is_inside_tree() | inject | main.gd:544 if 去not / main.gd:545 if 去not [if not save_manager.has_breakpoint(): → if save_manag… | 验红 | 2963ms | 1 |
| system_test | stage_faces | 38 | bad.is_empty() | inject | main.gd:218 asgn 置null / main.gd:219 asgn 置null [_start_overlay = _menu_screen.start_overlay → _… | 验红 | 307ms | 0 |
| table_structure_guard | smoke_ac_swap_guard | 21 | "状态表 defense_up 行已退役(无双轨)" | table | status_effects.rows.effect_id=defense_up:-1 table 字面量插行 / 表插行 status_effects.rows:effect_id=defe… | 验红 | 5ms | 0 |
| table_structure_guard | smoke_ac_swap_guard | 22 | "ac_up 行在位(hero · +1 ac · 只续时不叠层——2026-09-20 主角增益续时批)" | table | status_effects.rows[1].effect_id:-1 table 删键 / 表行删键 status_effects.rows[1].effect_id | 验红 | 5ms | 0 |
| table_structure_guard | smoke_ac_swap_guard | 23 | "奖励表 defense 正向行 effect_id = ac_up(显示名盾牌加护,权重/tier 不变)" | table | reward.rows[1].cell_type:-1 table 删键 / 表行删键 reward.rows[1].cell_type | 验红 | 5ms | 0 |
| table_structure_guard | smoke_ac_swap_guard | 24 | "effect_pool_map 无 defense_up/ac_up 键(减伤不入池——AC 不经乘区)" | table | settlement.effect_pool_map.defense_up:-1 table 字典加键 / 字典加键 settlement.effect_pool_map:defense_up… | 验红 | 5ms | 0 |
| table_structure_guard | smoke_ac_swap_guard | 25 | "hero_defense 池 percent 行叠满不可触池底(墙最深%s > clamp_lo %d——单效果归零结构性不可达)" % [ wall_detail if wall_deta… | | | 异常 | — | — |
| table_structure_guard | smoke_ac_swap_guard | 26 | "主角 armor_class 在域内(%d——暂定基准随表走)" % int(_db.hero.armor_class) | table | hero.armor_class:-1 table_set / 表改写 hero.armor_class: 10 → 100 | 验红 | 5ms | 0 |
| table_structure_guard | smoke_ac_swap_guard | 27 | "敌方 AC 行值在已裁带宽内(杂鱼 0~5·重击手/重装手 8~9·Boss 8~12——迭代 5 返工批 v1 重投,越带行%s)" % [ ac_detail if ac_detail … | table | enemy.rows[4].enemy_id:-1 table_set / 表行改写 enemy.rows[4].enemy_id: ogre_chief → ogre_chief_x | 验红 | 5ms | 0 |
| table_structure_guard | smoke_ac_swap_guard | 28 | "Boss AC 关卡台阶严格递增(%d < %d < %d)" % [int(boss_ac.get(1, 0)), int(boss_ac.get(2, 0)), int(boss_ac.… | table | enemy.rows[12].level_index:-1 table 删键 / 表行删键 enemy.rows[12].level_index | 验红 | 5ms | 0 |
| table_structure_guard | smoke_ac_swap_guard | 29 | "熊地精首遇带(1,battle,%d)降档锚定(hp 22 · ac 2 · 池 attack6/charge2/heavy2 零改动——迭代 24 N1;首遇带数据驱动定位)〔fv21〕"… | table | enemy.rows[2].level_index:-1 table 删键 / 表行删键 enemy.rows[2].level_index | 验红 | 5ms | 1 |
| table_structure_guard | smoke_ac_swap_guard | 30 | "第一关相邻深度带总量比 ≤ 2.5(12/10/22/35/72——迭代 24 N1 曲线护栏,带键升序;越带%s)" % [ curve_detail if curve_detail !=… | table | enemy.rows[2].level_index:-1 table 删键 / 表行删键 enemy.rows[2].level_index | 验红 | 5ms | 1 |
| table_structure_guard | smoke_ac_swap_guard | 31 | "掷点参数拍板值在位(d20 / nat20 暴击 ×200%% / 下限 1 / attack_bonus 0 / armor_roll 流)" | table | settlement.roll_faces:-1 table_set / 表改写 settlement.roll_faces: 20 → 21 | 验红 | 5ms | 0 |
| table_structure_guard | smoke_ac_swap_guard | 32 | "档位表拍板值在位(缺口 1-3 → ×0.75 · 4-7 → ×0.5 · 8+ → ×0.25——无零档)" | table | settlement.roll_tier_bounds:-1 table 删行 / 表删行 settlement.roll_tier_bounds[0] | 验红 | 5ms | 0 |
| table_structure_guard | smoke_enemy_bands | 17 | "敌人表 20 行且键序 = 迁移表序((L,row_kind,depth_band,enemy_id) 逐行比对——文件行序不变)〔fv11〕" | table | enemy.rows[0].depth_band:-1 table 删键 / 表行删键 enemy.rows[0].depth_band | 验红 | 5ms | 0 |
| table_structure_guard | smoke_enemy_bands | 18 | "hobgoblin 行在 (1,battle,3) 留任随迁(缺口行不删不补——补齐归敌种内容批)〔fv12〕〔fv25〕" | table | enemy.rows[3].depth_band:-1 table 删键 / 表行删键 enemy.rows[3].depth_band | 验红 | 5ms | 1 |
| table_structure_guard | smoke_enemy_bands | 19 | "hobgoblin 缺口登记随行(表文件注释在位——缺口不静默)〔fv25〕" | | | 异常 | — | — |
| table_structure_guard | smoke_enemy_bands | 20 | "三关 Boss 行各恰一行且 row_kind=boss、band=图 Boss 节点深度(%d/%d/%d%s)〔fv13〕" % [ _boss_depth(1), _boss_dept… | table | enemy.rows[4].depth_band:-1 table 删键 / 表行删键 enemy.rows[4].depth_band | 验红 | 5ms | 1 |
| table_structure_guard | smoke_variation_framework | 33 | "变异清单 6 行(荆棘丛/藤蔓缠绕/岩浆/烬覆 + 落石/矿尘——首批类型定稿批 + 第三关内容批;贫矿脉 2026-10-16 用户令屏蔽删行)" | table | variation.rows:-1 table 复插行 / 表复插行 variation.rows[0] → 表首 | 验红 | 5ms | 3 |
| table_structure_guard | smoke_variation_framework | 34 | "变异表校验零错误(6 行全过域与跨字段互锁——含 scope=global 三互锁负样本)" | table | variation.rows[0].variant_id:-1 table 删键 / 表行删键 variation.rows[0].variant_id | 验红 | 21ms | 0 |
| table_structure_guard | smoke_variation_framework | 35 | "L1 dungeon 候选池 = 荆棘丛+藤蔓缠绕(unlock + board_types 双闸)" | table | variation.rows:-1 table 复插行 / 表复插行 variation.rows[0] → 表首 | 验红 | 5ms | 3 |
| table_structure_guard | smoke_variation_framework | 36 | "L2 underdark 候选池 = 岩浆+烬覆(第二关解锁)" | table | variation.rows:-1 table 复插行 / 表复插行 variation.rows[2] → 表首 | 验红 | 5ms | 2 |
| table_structure_guard | smoke_variation_framework | 37 | "unlock 门控:L1 不进 underdark 行(岩浆/烬覆第二关解锁)" | table | variation.rows[2].unlock_level:-1 table_set / 表行改写 variation.rows[2].unlock_level: 2 → 1 | 验红 | 5ms | 0 |
| table_structure_guard | smoke_variation_framework | 38 | "board_types 门控:L2 dungeon 板池 = 荆棘丛+藤蔓缠绕(解锁累积;岩浆/烬覆被 board_types ∅ 交集排除)" | table | variation.rows:-1 table 复插行 / 表复插行 variation.rows[0] → 表首 | 验红 | 5ms | 3 |
| table_structure_guard | smoke_variation_framework | 39 | "清单外 variant_id 返回空(读取通道在位)" | table | variation.rows.variant_id=nonexistent:-1 table 字面量插行 / 表插行 variation.rows:variant_id=nonexistent… | 验红 | 5ms | 3 |
| table_structure_guard | smoke_variation_framework | 40 | "跨字段互锁负样本①:flat_damage + placement=any 被拒(只出现在未打开的格子)" | inject | variation_table.gd:28 key 错位:"variant_id" / variation_table.gd:29 key 错位:"variant_id" [var vid: … | 验红 | 5ms | 1 |
| table_structure_guard | smoke_variation_framework | 41 | "跨字段互锁负样本②:hide_number + trigger≠on_number_shown 被拒" | inject | variation_table.gd:28 key 错位:"variant_id" / variation_table.gd:29 key 错位:"variant_id" [var vid: … | 验红 | 5ms | 1 |
| table_structure_guard | smoke_difficulty_table | 42 | "DifficultyTable MVP 空表加载(结构位)" | table | difficulty.rows:-1 table 空表插行 / 空表插行 difficulty.rows(合成行灭 is_empty) | 验红 | 5ms | 0 |
| table_structure_guard | smoke_difficulty_table | 43 | "spawn 受理" | inject | unit_container.gd:37 key 错位:"battle" / unit_container.gd:38 key 错位:"battle" [hero_attack_type: S… | 验红 | 69ms | 0 |
| table_structure_guard | smoke_difficulty_table | 44 | "空表零修饰(hp=%d atk=%d = 行值 %d/%d)" % [int(unit.hp), int(unit.atk), int(d0.hp), int(d0.atk)] | inject | unit_container.gd:57 num 1.0→2.0 / unit_container.gd:58 num 1.0→2.0 [var hp_mult: float = float(… | 验红 | 5ms | 0 |
| table_structure_guard | smoke_difficulty_table | 45 | "修饰后 spawn 受理" | inject | unit_container.gd:116 bool true→false / unit_container.gd:117 bool true→false [return true → ret… | 验红 | 5ms | 2 |
| table_structure_guard | smoke_difficulty_table | 46 | "hp 修饰 ×1.5(%d→%d,max_hp 同步)" % [int(d0.hp), int(g2.hp)] | inject | unit_container.gd:57 key 错位:"hp_mult" / unit_container.gd:58 key 错位:"hp_mult" [var hp_mult: floa… | 验红 | 5ms | 1 |
| table_structure_guard | smoke_difficulty_table | 47 | "atk 修饰 ×2.0(%d→%d)" % [int(d0.atk), int(g2.atk)] | inject | unit_container.gd:58 key 错位:"atk_mult" / unit_container.gd:59 key 错位:"atk_mult" [var atk_mult: f… | 验红 | 5ms | 0 |
| table_structure_guard | smoke_difficulty_table | 48 | "越域修饰 spawn 受理" | inject | unit_container.gd:116 bool true→false / unit_container.gd:117 bool true→false [return true → ret… | 验红 | 5ms | 2 |
| table_structure_guard | smoke_difficulty_table | 49 | "越域乘数 clamp 至 10(%d→%d)" % [int(d0.hp), int(enemy_system_c.all_enemies()[0].hp)] | inject | unit_container.gd:57 key 错位:"hp_mult" / unit_container.gd:58 key 错位:"hp_mult" [var hp_mult: floa… | 验红 | 5ms | 1 |
| table_structure_guard | smoke_nine_types_gp_stream | 50 | "格面资源十型封闭(第九型 gp 九型批 2026-09-20 / 第十型 treasure_item 秘宝内容批 2026-09-29——词表 v1.2)" | | | 异常 | — | — |
| table_structure_guard | smoke_nine_types_gp_stream | 51 | "奖励字典 18 行(九型×正负 18 格——aux 挖格投放四行已退役 2026-10-01 用户拍板甲:战斗/挖格不掉道具,秘宝唯一来路=三选一共享池〔节点/通关〕;清图槽独立批尾不计)" | table | reward.rows:-1 table 复插行 / 表复插行 reward.rows[0] → 表首 | 验红 | 5ms | 0 |
| table_structure_guard | smoke_nine_types_gp_stream | 52 | "危险格负向直伤 %s power=%d(卡⑧投值)" % [rid, int(mine_power[rid])] | table | reward.rows[7].power:-1 table_set / 表行改写 reward.rows[7].power: 6 → 5 | 验红 | 5ms | 0 |
| table_structure_guard | smoke_nine_types_gp_stream | 53 | "正向 cell 行权重 ≥1 全在池 / 负向行权重恒 0 不入池(正向合计 %d——配置推导)" % pos_weight | table | reward.rows[0].weight:-1 table_set / 表行改写 reward.rows[0].weight: 14 → 0 | 验红 | 5ms | 0 |
| table_structure_guard | smoke_nine_types_gp_stream | 54 | "gp 型两行(GP 袋 gp_gain 正向 weight 2 / 破财 gp_loss 负向 weight 0 不入池)" | table | reward.rows:-1 table 删行 / 表删行 reward.rows[18] | 验红 | 5ms | 1 |
| table_structure_guard | smoke_nine_types_gp_stream | 55 | "derive_at 纯函数不推计数器(统一流全局计数器恒 0——并流后纯函数语义不变,gp_drop 专用向量随分盐作废、统一向量中央断言)" | inject | rng_service.gd:103 return 取反 / rng_service.gd:104 return 取反 [return _counter → return not (_coun… | 验红 | 5ms | 0 |
| table_structure_guard | smoke_adventure_table | 0 | "db.adventure 已加载(adventure.tres 入 manifest)" | | | 异常 | — | — |
| table_structure_guard | smoke_adventure_table | 1 | "AdventureTable.validate() 零违例(全键域检+档位配额结构锚在案)" | table | adventure.clear_heal_pct:-1 table_set / 表改写 adventure.clear_heal_pct: 20 → 200 | 验红 | 117ms | 1 |
| table_structure_guard | smoke_adventure_table | 2 | "clear_heal_pct ∈ [0,100](%d——通关部分回血比例)" % int(_db.adventure.clear_heal_pct) | table | adventure.clear_heal_pct:-1 table_set / 表改写 adventure.clear_heal_pct: 20 → 200 | 验红 | 125ms | 1 |
| table_structure_guard | smoke_adventure_table | 3 | "档位配额结构锚(四级 70/25/7/0——迭代 31 卡② 净删两件投放):%s = %d 张" % [tier, int(_db.adventure.TIER_QUOTAS[tier])… | table | adventure.curio_quota_attack_common:-1 table_set / 表改写 adventure.curio_quota_attack_common: 18 →… | 验红 | 125ms | 2 |
| table_structure_guard | smoke_adventure_table | 4 | "令牌池总量 = 102 张(四级 普通 70/优秀 25/稀有 7/传说 0——迭代 31 卡② 净删两件投放 104→102)〔凭证裁削批 V5〕" | table | adventure.curio_quota_attack_common:-1 table_set / 表改写 adventure.curio_quota_attack_common: 18 →… | 验红 | 124ms | 2 |
| table_structure_guard | smoke_adventure_table | 5 | "数值对(四级换代承袭):小GP 20/大GP 50 · 小增伤 +1/大 +2 · 小生命 +5/大 +10 · 小护甲 +1/大 +2" | table | adventure.curio_value_attack_common:-1 table_set / 表改写 adventure.curio_value_attack_common: 1 → … | 验红 | 126ms | 0 |
| table_structure_guard | smoke_adventure_table | 6 | "恢复件 +6 当即回血(优秀档承袭)· AP +1(稀有档承袭)〔专长批 V14 换代〕" | | | 异常 | — | — |
| table_structure_guard | smoke_adventure_table | 7 | "cap 占位在域(案②提前退役——99=实质无上限,实数归调参批)〔专长批 V8 形态面〕" | | | 异常 | — | — |
| table_structure_guard | smoke_adventure_table | 8 | "同调位读数源=树同调位节点点亮数(迭代 21 T4 槽位收编——null 档求值 0;谓词表已退役)〔天赋树批 V14〕" | | | 异常 | — | — |
| table_structure_guard | smoke_adventure_table | 9 | "新目录 12 件全量落表(旧 12 行删除;装配词表=活行 12 件零重复)〔秘宝批 V1〕" | table | treasure_items.rows:-1 table 复插行 / 表复插行 treasure_items.rows[0] → 表首 | 验红 | 119ms | 2 |
| table_structure_guard | smoke_adventure_table | 10 | "命名锁定:12 件 item_id 与 display_name 逐件=正式名(C2 代号即名)〔秘宝批 V2 初筛〕" | table | treasure_items.rows[0].item_id:-1 table 删键 / 表行删键 treasure_items.rows[0].item_id | 验红 | 125ms | 1 |
| table_structure_guard | smoke_adventure_table | 11 | "逐行解锁方式与契约 8 分配一致(钥石 8 件带价格、条件 4 件带谓词行互斥)+三档 7/3/2〔秘宝批 V1〕" | table | treasure_items.rows[0].item_id:-1 table 删键 / 表行删键 treasure_items.rows[0].item_id | 验红 | 117ms | 1 |
| table_structure_guard | smoke_adventure_table | 12 | "装配→战斗贯通:enc.attunement=[morning_order] 起战 attune_has=true(注入面+只读出口)〔秘宝批换主语〕" | inject | battle_orchestrator.gd:198 return 取反 / battle_orchestrator.gd:199 return 取反 [return _attune_has(… | 验红 | 320ms | 1 |
| table_structure_guard | smoke_adventure_table | 13 | "空装配基线:不带 attunement 起战 attune_has=false(off 态零扰动)〔秘宝批换主语〕" | inject | battle_orchestrator.gd:198 return 取反 / battle_orchestrator.gd:199 return 取反 [return _attune_has(… | 验红 | 309ms | 1 |
| table_structure_guard | smoke_adventure_table | 14 | "新 12 行效果词零棋盘改写类(危险格/安全格分布同池冻结——真视/开格动作外无写面)〔秘宝批 V9〕" | | | 异常 | — | — |
| table_structure_guard | smoke_adventure_table | 15 | "效果三方向覆盖在册(信息/行动资源/操作能力=plan·抉择刷新——12 件目录结构对齐设计权威)〔秘宝批 V10 覆盖半〕" | | | 异常 | — | — |
| table_structure_guard | smoke_adventure_table | 16 | "装配面空目录合法态:白板档 12 件全未解锁且 mode 分派正确(空目录=合法可玩态)〔秘宝批 V18〕" | table | treasure_items.rows:-1 table 复插行 / 表复插行 treasure_items.rows[0] → 表首 | 验红 | 119ms | 2 |
| table_structure_guard | smoke_meta | 56 | "MetaTable 非空 + validate 零错(三行族词表封闭/唯一/连续/域界/first≥repeat/ratio 全过)" | table | meta.boss_keystone[0].repeat_kill:-1 table 删键 / 表行删键 meta.boss_keystone[0].repeat_kill | 验红 | 5ms | 0 |
| table_structure_guard | smoke_meta | 57 | "MetaTable 行族规模 3/3/2(Boss/换算恰三/Y 升级两档——forge_products 迭代 21 退役、workshop_items 迭代 22 退役)" | table | meta.boss_keystone:-1 table 复插行 / 表复插行 meta.boss_keystone[0] → 表首 | 验红 | 5ms | 1 |
| table_structure_guard | smoke_meta | 58 | "conversion attr 词表封闭恰全(三属性轴——meta_* 访问器可达)" | table | meta.conversion[0].attr:-1 table 删键 / 表行删键 meta.conversion[0].attr | 验红 | 5ms | 1 |
| table_structure_guard | smoke_meta | 59 | "boss_keystone L1–L3 行连续可达且 first_kill ≥ repeat_kill 全行(首杀全量/重复小额)" | table | meta.boss_keystone[0].level_index:-1 table 删键 / 表行删键 meta.boss_keystone[0].level_index | 验红 | 5ms | 1 |
| board_gen_reward | smoke_layout_cell_formula | 0 | "L%d %dx%d 板网格高 %d ≤ 可用高 %d − 预留 24(格边 %dpx——下缘不贴边不裁切)" % [L, b.width, b.height, grid_h, int(ava… | inject | board_view.gd:226 op ==→!= / board_view.gd:227 op ==→!= [if _board == null or _board.width == 0:… | 验红 | 214ms | 0 |
| board_gen_reward | smoke_layout_cell_formula | 1 | "L%d 格边在 26–46 档内(%dpx)" % [L, int(cell)] | inject | board_view.gd:233 num 46→23(折半) / board_view.gd:234 num 46→23(折半) [_cell = float(clampi(cell, 26… | 验红 | 294ms | 0 |
| board_gen_reward | smoke_reward_identity_unit | 2 | "roll_board 受理" | inject | reward_economy.gd:41 if 取反 / reward_economy.gd:42 if 取反 [if eligible.is_empty(): → if not (eligi… | 验红 | 101ms | 0 |
| board_gen_reward | smoke_reward_identity_unit | 3 | "重复 roll_board 被拒(恰一次——double-roll 守卫)" | inject | reward_economy.gd:40 bool false→true / reward_economy.gd:41 bool false→true [return false → retu… | 验红 | 106ms | 0 |
| board_gen_reward | smoke_reward_identity_unit | 4 | "query_identity 投影 = {reward_id, cell_type, tier} 且五型封闭(样本 %s)" % str(types_seen.keys()) | inject | reward_economy.gd:112 key 错位:"reward_id" / reward_economy.gd:113 key 错位:"reward_id" [return {"re… | 验红 | 101ms | 0 |
| board_gen_reward | smoke_reward_identity_unit | 5 | "清单外坐标查询 = null(封锁格无身份同口径)" | inject | reward_economy.gd:110 return 取反 / reward_economy.gd:111 return 取反 [return null → return not (nul… | 验红 | 101ms | 0 |
| board_gen_reward | smoke_reward_identity_unit | 6 | "同格重复 grant 幂等(同一快照——受理恰一次)" | | | 异常 | — | — |
| board_gen_reward | smoke_reward_identity_unit | 7 | "清单外 grant 拒绝" | inject | reward_economy.gd:136 return 取反 / reward_economy.gd:137 return 取反 [return null → return not (nul… | 验红 | 100ms | 0 |
| board_gen_reward | smoke_reward_identity_unit | 8 | "清图批尾身份 = clear_blast(clear_default 唯一活行)" | inject | reward_economy.gd:342 op ==→!= / reward_economy.gd:343 op ==→!= [if row.reward_id == rid: → if r… | 验红 | 100ms | 1 |
| board_gen_reward | smoke_reward_identity_unit | 9 | "清图奖励 power ∈ 表区间 [%d, %d](roll 值 %d——配置推导)" % [cb_range[0], cb_range[1], int(cs1.power)] | inject | reward_economy.gd:342 op ==→!= / reward_economy.gd:343 op ==→!= [if row.reward_id == rid: → if r… | 验红 | 101ms | 1 |
| board_gen_reward | smoke_reward_identity_unit | 10 | "grant_clear 同批次重调幂等" | | | 异常 | — | — |
| board_gen_reward | smoke_reward_identity_unit | 11 | "映射退役后 grant 拒绝(生命周期闭合)" | inject | reward_economy.gd:133 return 取反 / reward_economy.gd:134 return 取反 [return null → return not (nul… | 验红 | 100ms | 0 |
| board_gen_reward | smoke_board_generator | 12 | "BoardGen 行解析 (%d,0)" % L | | | 异常 | — | — |
| board_gen_reward | smoke_board_generator | 13 | "R1 ceil 解析 (2,3)→(2,4)(向上取整偏难)" | | | 异常 | — | — |
| board_gen_reward | smoke_board_generator | 14 | "L%d 生成产物非空" % L | inject | board_generator.gd:206 key 错位:"inferability" / board_generator.gd:207 key 错位:"inferability" ["in… | 验红 | 85ms | 0 |
| board_gen_reward | smoke_board_generator | 15 | "L%d clearable(安全格 8 邻连通)" % L | inject | board_generator.gd:268 if 去not / board_generator.gd:269 if 去not [if not safe_set.has(c): → if sa… | 验红 | 1013ms | 4 |
| board_gen_reward | smoke_board_generator | 16 | "L%d legality 全过" % L | inject | board_generator.gd:282 return 取反 / board_generator.gd:283 return 取反 [return reasons.is_empty() →… | 验红 | 509ms | 2 |
| board_gen_reward | smoke_board_generator | 17 | "L%d inferability %.3f %s target %.2f(accept_mode=%s)" % [L, inf, "≥" if inf >= float(row.infera… | | | 异常 | — | — |
| board_gen_reward | smoke_board_generator | 18 | "L%d 生成器产物零变体格(变异布置归战斗初始化第 4 步——生成器管线不布置,2026-09-19 用户拍板棋盘设置顺序)" % L | | | 异常 | — | — |
| board_gen_reward | smoke_board_generator | 19 | "L%d 指标集输出降级标记与目标雷数(三分出口表)" % L | inject | board_generator.gd:341 key 错位:"target_mines" / board_generator.gd:342 key 错位:"target_mines" ["ta… | 验红 | 67ms | 0 |
| board_gen_reward | smoke_board_generator | 20 | "L%d 降级产物标记 = (accept_mode==accept_best)(%s→%s)" % [L, mode, str(b1.degraded_product)] | inject | board_generator.gd:353 op ==→!= / board_generator.gd:354 op ==→!= [b.degraded_product = accept_m… | 验红 | 1237ms | 0 |
| board_gen_reward | smoke_board_generator | 21 | "L%d 非法产物标记 = (accept_mode==accept_worst)(%s→%s)" % [L, mode, str(b1.illegal_product)] | inject | board_generator.gd:352 op ==→!= / board_generator.gd:353 op ==→!= [b.illegal_product = accept_mo… | 验红 | 1141ms | 2 |
| board_gen_reward | smoke_board_generator | 22 | "L%d 降级/非法产物标记互斥(两出口不可同真)" % L | | | 异常 | — | — |
| board_gen_reward | smoke_board_generator | 23 | "L%d 产物断言:实际雷数 %d ≤ 目标雷数 N=%d(先布后删只减不增)" % [L, int(b1.metrics.actual_mines), int(b1.metrics.targ… | | | 异常 | — | — |
| board_gen_reward | smoke_board_generator | 24 | "L%d attempts_used ∈ [1,%d]" % [L, int(row.max_gen_attempts)] | inject | board_generator.gd:343 key 错位:"attempts_used" / board_generator.gd:344 key 错位:"attempts_used" ["… | 验红 | 1149ms | 0 |
| board_gen_reward | smoke_board_generator | 25 | "L%d 非法产物标记 = false" % L | inject | board_generator.gd:282 return 置假 / board_generator.gd:283 return 置假 [return reasons.is_empty() →… | 验红 | 1123ms | 2 |
| board_gen_reward | smoke_board_generator | 26 | "L%d 同种子两次生成逐格相同" % L | | | 异常 | — | — |
| board_gen_reward | smoke_board_generator | 27 | "L%d 异种子产物不同(退化护栏)" % L | | | 异常 | — | — |
| board_gen_reward | smoke_board_generator | 28 | "L%d r0_max_cap 正式行投值在位(%d ≥ 出生保障面 9——板面 30%% 锚)" % [L, cap_val] | | | 异常 | — | — |
| board_gen_reward | smoke_board_generator | 29 | "L%d 结构断言 R₀=%d ≤ cap=%d(R₀≤cap 重掷闸承载)" % [L, int(b1.metrics.r0_count), cap_val] | inject | board_generator.gd:282 return 取反 / board_generator.gd:283 return 取反 [return reasons.is_empty() →… | 验红 | 511ms | 2 |
| board_gen_reward | smoke_board_generator | 30 | "L%d r0_cap_rejected 尝试事实指标在位(本图 %d 次触发)" % [L, int(b1.metrics.get("r0_cap_rejected", -1))] | inject | board_generator.gd:350 key 错位:"r0_cap_rejected" / board_generator.gd:351 key 错位:"r0_cap_rejected… | 验红 | 1278ms | 0 |
| board_gen_reward | smoke_board_generator | 31 | "L%d ring_removed=%d ≤ 剃雷域候选危险格数((3+2r)²−9——全域剃雷退役)" % [L, int(b1.metrics.get("ring_removed", 99… | inject | board_generator.gd:347 key 错位:"ring_removed" / board_generator.gd:348 key 错位:"ring_removed" ["ri… | 验红 | 1220ms | 0 |
| board_gen_reward | smoke_board_generator | 32 | "L1 cap 压线 9:出图 R₀=%d %s(三分出口诚实降级——超阈即 accept_worst 非法标记,玩家永不卡死)" % [int(b9.metrics.r0_count), "… | inject | board_generator.gd:282 return 取反 / board_generator.gd:283 return 取反 [return reasons.is_empty() →… | 验红 | 490ms | 2 |
| board_gen_reward | smoke_board_generator | 33 | "L1 cap 压线出图指标集完整(accept_mode=%s / 闸触发 %d 次)" % [String(b9.metrics.get("accept_mode", "")), int(… | inject | board_generator.gd:344 key 错位:"accept_mode" / board_generator.gd:345 key 错位:"accept_mode" ["acce… | 验红 | 1292ms | 2 |
| board_gen_reward | smoke_power_interval | 34 | "区间行配对齐全且 power = floor 中点(配置推导 %d 行:%s)" % [interval_rows.size(), str(interval_rows.keys())] | table | reward.rows[3].power:-1 table_set / 表行改写 reward.rows[3].power: 2 → 1 | 验红 | 8ms | 0 |
| board_gen_reward | smoke_power_interval | 35 | "24 板全区间行快照 power ∈ [power_min, power_max](含清图槽)" | table | reward.rows[3].power_max:-1 table_set / 表行改写 reward.rows[3].power_max: 2 → 1 | 验红 | 8ms | 1 |
| board_gen_reward | smoke_power_interval | 36 | "定值行快照 power 恒等表值——区间批零外溢" | inject | reward_economy.gd:125 num 1→0 / reward_economy.gd:126 num 1→0 [return _snapshot(_row_by_id(rid),… | 验红 | 8ms | 0 |
| board_gen_reward | smoke_power_interval | 37 | "区间行上下阶实际流动(≥2 样本的区间行须 ≥2 个不同 roll 值)" | | | 异常 | — | — |
| board_gen_reward | smoke_power_interval | 38 | "定值行(lo=hi)roll 恒等表值" | | | 异常 | — | — |
| roll_multiplier | smoke_enemy_attack_type | 0 | "敌方 %d 行 attack_type 全填 normal(迭代 24 N3 轴开列,越轨行%s)" % [ _db.enemy.rows.size(), at_detail if at_d… | table | enemy.rows[0].attack_type:-1 table_set / 表行改写 enemy.rows[0].attack_type: normal → normal_x | 验红 | 185ms | 0 |
| roll_multiplier | smoke_enemy_attack_type | 1 | "敌方单位快照 attack_type 非空(spawn 注入面——迭代 24 N3)" | | | 异常 | — | — |
| roll_multiplier | smoke_enemy_attack_type | 2 | "克制矩阵命中证词:同种子三甲型实测 heavy %d == light %d − 1 · ward %d == light %d + 1(迭代 24 N3 全局平移 −1/0/+1)" % … | table | enemy.rows[5].level_index:-1 table_set / 表行改写 enemy.rows[5].level_index: 2 → 3 | 验红 | 1673ms | 0 |
| roll_multiplier | smoke_enemy_attack_type | 3 | "敌方伤害技单据载荷 attack_type 非空(= %s——第 9 参传值面,迭代 24 N3)" % payload_at | table | enemy.rows[13].unit_count:-1 table_set / 表行改写 enemy.rows[13].unit_count: 1 → 0 | 验红 | 5850ms | 1 |
| roll_multiplier | smoke_armor_roll | 4 | "查档 AC%d 全掷点域分布(100/75/50/25 = %s)" % [cfg.ac, str([dist[100], dist[75], dist[50], dist[25]])] | table | settlement.roll_tier_bounds:-1 table 删行 / 表删行 settlement.roll_tier_bounds[0] | 验红 | 1135ms | 1 |
| roll_multiplier | smoke_armor_roll | 5 | "AC10 EV 锚:期望系数合计 %d/2000 = 期望减免 21.25%%(nat20 恒全额含内)" % ev_sum | table | settlement.roll_tier_bounds:-1 table 删行 / 表删行 settlement.roll_tier_bounds[0] | 验红 | 1131ms | 1 |
| roll_multiplier | smoke_armor_roll | 6 | "nat20 种子可达(seed=%d——主角先手首掷命中 %d)" % [crit_seed, int(_db.settlement.crit_roll)] | table | settlement.roll_faces:-1 table_set / 表改写 settlement.roll_faces: 20 → 19 | 验红 | 50384ms | 2 |
| roll_multiplier | smoke_armor_roll | 7 | "nat20 → 行留档 roll=20 + crit 标记(主角先手普通分量)" | table | settlement.roll_faces:-1 table_set / 表改写 settlement.roll_faces: 20 → 19 | 验红 | 50180ms | 2 |
| roll_multiplier | smoke_armor_roll | 8 | "nat20 → 普通分量 ×2(%d = 2×%d,暴击倍率只乘该分量,穿刺/魔法不吃)" % [int(crit_rows.get("normal", -1)), int(_db.hero… | table | settlement.roll_faces:-1 table_set / 表改写 settlement.roll_faces: 20 → 19 | 验红 | 50107ms | 2 |
| roll_multiplier | smoke_armor_roll | 9 | "削弱重复授予 → 层数保持 1、剩余结算数重置 2(续时语义——结构性消饱和)" | | | 异常 | — | — |
| roll_multiplier | smoke_armor_roll | 10 | "削弱单层池读数 = 行值(enemy_output 池单层贡献——×2 叠满触底 ×0 不可达,免伤轮根治)" | table | settlement.effect_pool_map.weaken:-1 table_set / 表行改写 settlement.effect_pool_map.weaken: enemy_o… | 验红 | 1139ms | 0 |
| roll_multiplier | smoke_armor_roll | 11 | "AC11 攻击拍逐拍判定(×%d 拍全部落档域 {100,75,50,25})" % tiers.size() | table | settlement.roll_faces:-1 table_set / 表改写 settlement.roll_faces: 20 → 0 | 验红 | 51284ms | 4 |
| roll_multiplier | smoke_armor_roll | 12 | "折扣档实际流动(AC11 实测档位 %s——≥2 档可见)" % str(tier_distinct.keys()) | table | settlement.roll_faces:-1 table_set / 表改写 settlement.roll_faces: 20 → 0 | 验红 | 51319ms | 4 |
| roll_multiplier | smoke_armor_roll | 13 | "全战斗流零 v=0 伤害行(伤害下限全局生效)" | | | 异常 | — | — |
| roll_multiplier | smoke_armor_roll | 14 | "hero_attack/enemy_action 伤害行掷点读数+档位随行留档(P2 归因)" | | | 异常 | — | — |
| roll_multiplier | smoke_armor_roll | 15 | "棋盘来源伤害行零掷点字段(爆裂/直伤/清障炸药/奖励即时必中全额)" | | | 异常 | — | — |
| roll_multiplier | smoke_armor_roll | 16 | "棋盘克制直伤贴底 → 下限 1(点数 2 vs 不利修正 −1)" | table | settlement.damage_floor:-1 table_set / 表改写 settlement.damage_floor: 1 → 2 | 验红 | 1152ms | 1 |
| roll_multiplier | smoke_armor_roll | 17 | "克制修正触底穿透 → 下限 1(点数 1 vs 修正 −3)" | table | settlement.damage_floor:-1 table_set / 表改写 settlement.damage_floor: 1 → 2 | 验红 | 1123ms | 1 |
| roll_multiplier | smoke_armor_roll | 18 | "空桶不吃修正恒 0(零点数分量无伤害可落地——边界不变不受下限影响)" | | | 异常 | — | — |
| roll_multiplier | smoke_pool_wiring | 19 | "单分量基线在位(normal 分量 = 落地值、基线 %d——充能退役批)" % base_v | | | 异常 | — | — |
| roll_multiplier | smoke_pool_wiring | 20 | "增伤经乘区加成合计(%d → %d = ×1.5——attack_up 直乘旁路退役,覆盖面=攻击合计)" % [base_v, int(up_row.get("value", -1))] | table | status_effects.rows[0].effect_id:-1 table 删键 / 表行删键 status_effects.rows[0].effect_id | 验红 | 194ms | 0 |
| roll_multiplier | smoke_pool_wiring | 21 | "乏力经乘区削减合计(%d → %d = ×0.75)" % [base_v, int(sapped_row.get("value", -1))] | table | status_effects.rows[5].effect_id:-1 table 删键 / 表行删键 status_effects.rows[5].effect_id | 验红 | 194ms | 0 |
| roll_multiplier | smoke_pool_wiring | 22 | "硬化折半方向(%d → %d = ×0.5 且 < 基线——敌方防御池负值减伤,翻倍 bug 退役)" % [base_v, int(fortify_row.get("value", -1)… | table | status_effects.rows[7].effect_id:-1 table 删键 / 表行删键 status_effects.rows[7].effect_id | 验红 | 203ms | 0 |
| roll_multiplier | smoke_damage_types | 23 | "goblin 护甲 = light(轻甲——教学位)" | table | enemy.rows[0].unit_count:-1 table_set / 表行改写 enemy.rows[0].unit_count: 1 → 0 | 验红 | 412ms | 0 |
| roll_multiplier | smoke_damage_types | 24 | "bugbear 护甲 = light(护甲类型重配批 2026-09-18:关卡 1 全轻甲)" | table | enemy.rows[2].unit_count:-1 table_set / 表行改写 enemy.rows[2].unit_count: 1 → 0 | 验红 | 400ms | 0 |
| roll_multiplier | smoke_damage_types | 25 | "ogre_chief 护甲 = light(Boss 行集——护甲类型重配批 2026-09-18:关卡 1 全轻甲)" | table | enemy.rows[3].armor_type:-1 table_set / 表行改写 enemy.rows[3].armor_type: light → light_x | 验红 | 397ms | 0 |
| roll_multiplier | smoke_damage_types | 26 | "普通行:轻甲 0 / 魔法护甲 +1 / 重甲 −1(加法核)" | | | 异常 | — | — |
| roll_multiplier | smoke_damage_types | 27 | "穿刺行:轻甲 −1 / 魔法护甲 +1 / 重甲 0 中性(用户拍板)" | | | 异常 | — | — |
| roll_multiplier | smoke_damage_types | 28 | "魔法行:轻甲 0 / 魔法护甲 −1 / 重甲 +1(加法核)" | | | 异常 | — | — |
| roll_multiplier | smoke_damage_types | 29 | "标错封印产生 seal_miss 归因行(×%d)" % miss_rows | table | enemy.rows[4].level_index:-1 table 删键 / 表行删键 enemy.rows[4].level_index | 验红 | 68ms | 2 |
| roll_multiplier | smoke_damage_types | 30 | "标错封印兑付该安全格资源的负向字典行(×%d——attack/defense/weaken 效果行或 heal 直伤行)" % negative_rows | table | enemy.rows[4].level_index:-1 table 删键 / 表行删键 enemy.rows[4].level_index | 验红 | 72ms | 2 |
| roll_multiplier | smoke_damage_types | 31 | "封印命中兑付该危险格资源的正向字典行(×%d——充能退役后无魔法分量,正向=格面资源)" % hit_rows | table | enemy.rows[4].level_index:-1 table 删键 / 表行删键 enemy.rows[4].level_index | 验红 | 67ms | 2 |
| roll_multiplier | smoke_damage_types | 32 | "标错惩罚轮回放断言:同种子步骤流逐行相同(类型化负向兑付确定性)" | | | 异常 | — | — |
| roll_multiplier | smoke_attack_chain_fresh_pool | 33 | "fresh 池回归战斗启动(Boss 行)" | inject | battle_orchestrator.gd:380 asgn 置null / battle_orchestrator.gd:381 asgn 置null [_ledger = ledger_… | 验红 | 249ms | 1 |
| roll_multiplier | smoke_attack_chain_fresh_pool | 34 | "非施放攻击拍采样充足(%d 拍——增益施放行零兑付为设计语义不计)" % ticks.size() | inject | battle_orchestrator.gd:304 key 错位:"[战斗结算] begin_battle " / battle_orchestrator.gd:305 key 错位:"[战… | 验红 | 324ms | 0 |
| roll_multiplier | smoke_attack_chain_fresh_pool | 35 | "fresh 池非蓄力拍 d_tick = max(1, 掷点档位基线)(Boss 攻击链健康——Bug#2 回归断言)" | | | 异常 | — | — |
| seal_polarity | smoke_seal_ap_exhausted | 0 | "回归战斗启动(Boss 行——D0 20HP 级会被盲挖粉尘秒杀,无法承载封印回归场景)" | state | battle_orchestrator.gd:43 num 0→1 / [状态·初值] battle_orchestrator.gd:44 num 0→1 [var round_index :… | 验红 | 113ms | 4 |
| seal_polarity | smoke_seal_ap_exhausted | 1 | "%d 次挖掘后恰剩 1 AP(phase=%s ap=%d)" % [ap_total - 1, str(settlement.action_economy.phase), settleme… | state | battle_orchestrator.gd:43 num 0→1 / [状态·初值] battle_orchestrator.gd:44 num 0→1 [var round_index :… | 验红 | 131ms | 4 |
| seal_polarity | smoke_seal_ap_exhausted | 2 | "仍存在可挖目标(封印目标来源)" | state | battle_orchestrator.gd:43 num 0→1 / [状态·初值] battle_orchestrator.gd:44 num 0→1 [var round_index :… | 验红 | 114ms | 4 |
| seal_polarity | smoke_seal_ap_exhausted | 3 | "末点 AP 封印被受理" | state | battle_orchestrator.gd:43 num 0→1 / [状态·初值] battle_orchestrator.gd:44 num 0→1 [var round_index :… | 验红 | 113ms | 4 |
| seal_polarity | smoke_seal_ap_exhausted | 4 | "封印动作耗尽 AP 触发轮末结算并进入第 2 轮(rounds=%s)" % str(rounds) | state | battle_orchestrator.gd:20 key 错位:"decay" / [状态·初值] battle_orchestrator.gd:21 key 错位:"decay" [con… | 验红 | 362ms | 0 |
## 二、异常清单(打不红的条+原因)
- system_test:smoke_scene_split #1「menu.start_overlay != null and menu.lvbtn != null and menu.resumebtn != null and menu.campbtn !=…」——预算内未找到能翻红的改坏(试跑 600 轮,武器=inject, state)——死断言候选或改坏面缺形
- system_test:smoke_scene_split #2「menu.start_overlay.visible」——预算内未找到能翻红的改坏(试跑 600 轮,武器=inject, state)——死断言候选或改坏面缺形;断言表达式读 schema 常量(大写成员,宿主 preload 编译期绑定原件)——…
- system_test:smoke_scene_split #3「menu.mouse_filter == Control.MOUSE_FILTER_IGNORE」——预算内未找到能翻红的改坏(试跑 600 轮,武器=inject, state)——死断言候选或改坏面缺形;断言表达式读 schema 常量(大写成员,宿主 preload 编译期绑定原件)——…
- system_test:smoke_scene_split #4「camp.camp_overlay != null」——预算内未找到能翻红的改坏(试跑 600 轮,武器=inject, state)——死断言候选或改坏面缺形
- system_test:smoke_scene_split #5「not camp.camp_overlay.visible」——预算内未找到能翻红的改坏(试跑 600 轮,武器=inject, state)——死断言候选或改坏面缺形
- system_test:smoke_scene_split #6「adv.battle_root != null and adv.stage != null and adv.board_zone != null and adv.board_view != n…」——预算内未找到能翻红的改坏(试跑 600 轮,武器=inject, state)——死断言候选或改坏面缺形
- system_test:smoke_boot_chain #12「db.is_ready and db.hero != null」——预算内未找到能翻红的改坏(试跑 600 轮,武器=inject, state)——死断言候选或改坏面缺形
- system_test:smoke_boot_chain #13「AudioServer.is_bus_mute(master) == (ss.volume_linear <= 0.001) and is_equal_approx(AudioServer.g…」——预算内未找到能翻红的改坏(试跑 600 轮,武器=inject, state)——死断言候选或改坏面缺形
- system_test:smoke_boot_chain #14「ui_kit.motion_scale == (0.5 if ss.reduced_motion else 1.0)」——预算内未找到能翻红的改坏(试跑 600 轮,武器=inject, state)——死断言候选或改坏面缺形
- system_test:smoke_boot_chain #16「not sm.has_breakpoint() and not main._resume_btn.visible」——预算内未找到能翻红的改坏(试跑 600 轮,武器=inject, state)——死断言候选或改坏面缺形
- system_test:smoke_boot_chain #18「sm.keystone_balance() == 0 and not sm.has_breakpoint() and sm.adventure_total() == 0」——预算内未找到能翻红的改坏(试跑 600 轮,武器=inject, state)——死断言候选或改坏面缺形
- system_test:smoke_boot_chain #20「not (FileAccess.file_exists("user://save.json") and not FileAccess.file_exists(sm.slot_path(1)))」——预算内未找到能翻红的改坏(试跑 600 轮,武器=inject, state)——死断言候选或改坏面缺形;断言表达式含磁盘读取(FileAccess/DirAccess)——内存内改坏不可达,…
- system_test:smoke_boot_chain #21「not sm.has_breakpoint() and not main._resume_btn.visible」——预算内未找到能翻红的改坏(试跑 600 轮,武器=inject, state)——死断言候选或改坏面缺形
- system_test:smoke_boot_chain #23「not main._resume_btn.visible」——预算内未找到能翻红的改坏(试跑 600 轮,武器=inject, state)——死断言候选或改坏面缺形
- system_test:smoke_boot_chain #25「not main.debug_overlay.visible」——预算内未找到能翻红的改坏(试跑 600 轮,武器=inject, state)——死断言候选或改坏面缺形
- system_test:smoke_boot_chain #—「」——跑后基线未复绿——存在跨试跑状态残留,须人工排查
- system_test:smoke_run_lifecycle #28「main.run_scope.hints_shown.is_empty()」——预算内未找到能翻红的改坏(试跑 600 轮,武器=inject, state)——死断言候选或改坏面缺形
- system_test:smoke_run_lifecycle #29「main.run_scope.adventure.abandon()」——复验未红(改坏候选 1 个均不复现——疑似非确定断言)
- system_test:smoke_run_lifecycle #35「not sm.has_breakpoint()」——预算内未找到能翻红的改坏(试跑 600 轮,武器=inject, state)——死断言候选或改坏面缺形
- system_test:smoke_lifecycle_matrix #39「main.run_scope.settlement == null or not main.run_scope.settlement.is_battle_live()」——预算内未找到能翻红的改坏(试跑 600 轮,武器=inject, state)——死断言候选或改坏面缺形
- system_test:smoke_lifecycle_matrix #40「main.run_scope.adventure.abandon()」——复验未红(改坏候选 1 个均不复现——疑似非确定断言)
- system_test:smoke_lifecycle_matrix #41「finished.done and main._end_overlay.is_open()」——预算内未找到能翻红的改坏(试跑 600 轮,武器=inject, state)——死断言候选或改坏面缺形
- system_test:smoke_lifecycle_matrix #44「false」——预算内未找到能翻红的改坏(试跑 600 轮,武器=inject, state)——死断言候选或改坏面缺形
- system_test:smoke_lifecycle_matrix #45「main.run_scope.adventure != null and main.run_scope.adventure != first_adv」——预算内未找到能翻红的改坏(试跑 600 轮,武器=inject, state)——死断言候选或改坏面缺形
- system_test:smoke_lifecycle_matrix #46「main.run_scope.adventure.abandon()」——复验未红(改坏候选 1 个均不复现——疑似非确定断言)
- table_structure_guard:smoke_ac_swap_guard #25「"hero_defense 池 percent 行叠满不可触池底(墙最深%s > clamp_lo %d——单效果归零结构性不可达)" % [ wall_detail if wall_deta…」——预算内未找到能翻红的改坏(试跑 1608 轮,武器=table, inject)——死断言候选或改坏面缺形
- table_structure_guard:smoke_enemy_bands #19「"hobgoblin 缺口登记随行(表文件注释在位——缺口不静默)〔fv25〕"」——预算内未找到能翻红的改坏(试跑 708 轮,武器=table, inject)——死断言候选或改坏面缺形;断言表达式含磁盘读取(FileAccess/DirAccess)——内存内改坏不可达,…
- table_structure_guard:smoke_nine_types_gp_stream #50「"格面资源十型封闭(第九型 gp 九型批 2026-09-20 / 第十型 treasure_item 秘宝内容批 2026-09-29——词表 v1.2)"」——预算内未找到能翻红的改坏(试跑 639 轮,武器=table, inject)——死断言候选或改坏面缺形;断言表达式读 schema 常量(大写成员,宿主 preload 编译期绑定原件)——…
- table_structure_guard:smoke_adventure_table #0「"db.adventure 已加载(adventure.tres 入 manifest)"」——预算内未找到能翻红的改坏(试跑 3000 轮,武器=table, inject)——死断言候选或改坏面缺形
- table_structure_guard:smoke_adventure_table #6「"恢复件 +6 当即回血(优秀档承袭)· AP +1(稀有档承袭)〔专长批 V14 换代〕"」——预算内未找到能翻红的改坏(试跑 3000 轮,武器=table, inject)——死断言候选或改坏面缺形
- table_structure_guard:smoke_adventure_table #7「"cap 占位在域(案②提前退役——99=实质无上限,实数归调参批)〔专长批 V8 形态面〕"」——预算内未找到能翻红的改坏(试跑 3000 轮,武器=table, inject)——死断言候选或改坏面缺形
- table_structure_guard:smoke_adventure_table #8「"同调位读数源=树同调位节点点亮数(迭代 21 T4 槽位收编——null 档求值 0;谓词表已退役)〔天赋树批 V14〕"」——预算内未找到能翻红的改坏(试跑 3000 轮,武器=table, inject)——死断言候选或改坏面缺形
- table_structure_guard:smoke_adventure_table #14「"新 12 行效果词零棋盘改写类(危险格/安全格分布同池冻结——真视/开格动作外无写面)〔秘宝批 V9〕"」——预算内未找到能翻红的改坏(试跑 3000 轮,武器=table, inject)——死断言候选或改坏面缺形
- table_structure_guard:smoke_adventure_table #15「"效果三方向覆盖在册(信息/行动资源/操作能力=plan·抉择刷新——12 件目录结构对齐设计权威)〔秘宝批 V10 覆盖半〕"」——预算内未找到能翻红的改坏(试跑 3000 轮,武器=table, inject)——死断言候选或改坏面缺形
- board_gen_reward:smoke_reward_identity_unit #6「"同格重复 grant 幂等(同一快照——受理恰一次)"」——预算内未找到能翻红的改坏(试跑 339 轮,武器=inject, state)——死断言候选或改坏面缺形;标签含幂等语义——确定性快照的内容等值在单行确定性变异下难破,疑似结构性打不红,须人工…
- board_gen_reward:smoke_reward_identity_unit #10「"grant_clear 同批次重调幂等"」——预算内未找到能翻红的改坏(试跑 339 轮,武器=inject, state)——死断言候选或改坏面缺形;标签含幂等语义——确定性快照的内容等值在单行确定性变异下难破,疑似结构性打不红,须人工…
- board_gen_reward:smoke_board_generator #12「"BoardGen 行解析 (%d,0)" % L」——预算内未找到能翻红的改坏(试跑 60 轮,武器=inject, table)——死断言候选或改坏面缺形
- board_gen_reward:smoke_board_generator #13「"R1 ceil 解析 (2,3)→(2,4)(向上取整偏难)"」——预算内未找到能翻红的改坏(试跑 60 轮,武器=inject, table)——死断言候选或改坏面缺形
- board_gen_reward:smoke_board_generator #17「"L%d inferability %.3f %s target %.2f(accept_mode=%s)" % [L, inf, "≥" if inf >= float(row.infera…」——复验未红(改坏候选 1 个均不复现——疑似非确定断言)
- board_gen_reward:smoke_board_generator #18「"L%d 生成器产物零变体格(变异布置归战斗初始化第 4 步——生成器管线不布置,2026-09-19 用户拍板棋盘设置顺序)" % L」——预算内未找到能翻红的改坏(试跑 60 轮,武器=inject, table)——死断言候选或改坏面缺形
- board_gen_reward:smoke_board_generator #22「"L%d 降级/非法产物标记互斥(两出口不可同真)" % L」——复验未红(改坏候选 1 个均不复现——疑似非确定断言)
- board_gen_reward:smoke_board_generator #23「"L%d 产物断言:实际雷数 %d ≤ 目标雷数 N=%d(先布后删只减不增)" % [L, int(b1.metrics.actual_mines), int(b1.metrics.targ…」——预算内未找到能翻红的改坏(试跑 60 轮,武器=inject, table)——死断言候选或改坏面缺形
- board_gen_reward:smoke_board_generator #26「"L%d 同种子两次生成逐格相同" % L」——预算内未找到能翻红的改坏(试跑 60 轮,武器=inject, table)——死断言候选或改坏面缺形
- board_gen_reward:smoke_board_generator #27「"L%d 异种子产物不同(退化护栏)" % L」——预算内未找到能翻红的改坏(试跑 60 轮,武器=inject, table)——死断言候选或改坏面缺形
- board_gen_reward:smoke_board_generator #28「"L%d r0_max_cap 正式行投值在位(%d ≥ 出生保障面 9——板面 30%% 锚)" % [L, cap_val]」——预算内未找到能翻红的改坏(试跑 60 轮,武器=inject, table)——死断言候选或改坏面缺形;断言表达式读 schema 常量(大写成员,宿主 preload 编译期绑定原件)——路…
- board_gen_reward:smoke_power_interval #37「"区间行上下阶实际流动(≥2 样本的区间行须 ≥2 个不同 roll 值)"」——预算内未找到能翻红的改坏(试跑 596 轮,武器=table, inject)——死断言候选或改坏面缺形
- board_gen_reward:smoke_power_interval #38「"定值行(lo=hi)roll 恒等表值"」——预算内未找到能翻红的改坏(试跑 596 轮,武器=table, inject)——死断言候选或改坏面缺形
- roll_multiplier:smoke_enemy_attack_type #1「"敌方单位快照 attack_type 非空(spawn 注入面——迭代 24 N3)"」——预算内未找到能翻红的改坏(试跑 600 轮,武器=table, inject)——死断言候选或改坏面缺形
- roll_multiplier:smoke_armor_roll #9「"削弱重复授予 → 层数保持 1、剩余结算数重置 2(续时语义——结构性消饱和)"」——预算内未找到能翻红的改坏(试跑 600 轮,武器=table, inject)——死断言候选或改坏面缺形
- roll_multiplier:smoke_armor_roll #13「"全战斗流零 v=0 伤害行(伤害下限全局生效)"」——预算内未找到能翻红的改坏(试跑 600 轮,武器=table, inject)——死断言候选或改坏面缺形
- roll_multiplier:smoke_armor_roll #14「"hero_attack/enemy_action 伤害行掷点读数+档位随行留档(P2 归因)"」——预算内未找到能翻红的改坏(试跑 600 轮,武器=table, inject)——死断言候选或改坏面缺形
- roll_multiplier:smoke_armor_roll #15「"棋盘来源伤害行零掷点字段(爆裂/直伤/清障炸药/奖励即时必中全额)"」——预算内未找到能翻红的改坏(试跑 600 轮,武器=table, inject)——死断言候选或改坏面缺形
- roll_multiplier:smoke_armor_roll #18「"空桶不吃修正恒 0(零点数分量无伤害可落地——边界不变不受下限影响)"」——预算内未找到能翻红的改坏(试跑 600 轮,武器=table, inject)——死断言候选或改坏面缺形
- roll_multiplier:smoke_pool_wiring #19「"单分量基线在位(normal 分量 = 落地值、基线 %d——充能退役批)" % base_v」——预算内未找到能翻红的改坏(试跑 500 轮,武器=table, inject)——死断言候选或改坏面缺形
- roll_multiplier:smoke_damage_types #26「"普通行:轻甲 0 / 魔法护甲 +1 / 重甲 −1(加法核)"」——预算内未找到能翻红的改坏(试跑 500 轮,武器=table, inject)——死断言候选或改坏面缺形
- roll_multiplier:smoke_damage_types #27「"穿刺行:轻甲 −1 / 魔法护甲 +1 / 重甲 0 中性(用户拍板)"」——预算内未找到能翻红的改坏(试跑 500 轮,武器=table, inject)——死断言候选或改坏面缺形
- roll_multiplier:smoke_damage_types #28「"魔法行:轻甲 0 / 魔法护甲 −1 / 重甲 +1(加法核)"」——预算内未找到能翻红的改坏(试跑 500 轮,武器=table, inject)——死断言候选或改坏面缺形
- roll_multiplier:smoke_damage_types #32「"标错惩罚轮回放断言:同种子步骤流逐行相同(类型化负向兑付确定性)"」——预算内未找到能翻红的改坏(试跑 500 轮,武器=table, inject)——死断言候选或改坏面缺形
- roll_multiplier:smoke_attack_chain_fresh_pool #35「"fresh 池非蓄力拍 d_tick = max(1, 掷点档位基线)(Boss 攻击链健康——Bug#2 回归断言)"」——预算内未找到能翻红的改坏(试跑 500 轮,武器=inject, state)——死断言候选或改坏面缺形
- system_test:smoke_boot_chain——跑后基线未复绿(存在跨试跑状态残留)
## 三、汇总
- system_test:split_tail——1 条(验红 1 / 异常 0)· 改坏试跑 1 轮 · 跑后基线复绿
- system_test:smoke_scene_split——11 条(验红 5 / 异常 6)· 改坏试跑 600 轮 · 跑后基线复绿
- system_test:smoke_boot_chain——15 条(验红 6 / 异常 9)· 改坏试跑 600 轮 · 跑后基线**未复绿**
- system_test:smoke_run_lifecycle——11 条(验红 8 / 异常 3)· 改坏试跑 600 轮 · 跑后基线复绿
- system_test:smoke_lifecycle_matrix——10 条(验红 4 / 异常 6)· 改坏试跑 600 轮 · 跑后基线复绿
- system_test:stage_faces——1 条(验红 1 / 异常 0)· 改坏试跑 10 轮 · 跑后基线复绿
- table_structure_guard:smoke_ac_swap_guard——12 条(验红 11 / 异常 1)· 改坏试跑 1608 轮 · 跑后基线复绿
- table_structure_guard:smoke_enemy_bands——4 条(验红 3 / 异常 1)· 改坏试跑 708 轮 · 跑后基线复绿
- table_structure_guard:smoke_variation_framework——9 条(验红 9 / 异常 0)· 改坏试跑 103 轮 · 跑后基线复绿
- table_structure_guard:smoke_difficulty_table——8 条(验红 8 / 异常 0)· 改坏试跑 131 轮 · 跑后基线复绿
- table_structure_guard:smoke_nine_types_gp_stream——6 条(验红 5 / 异常 1)· 改坏试跑 639 轮 · 跑后基线复绿
- table_structure_guard:smoke_adventure_table——17 条(验红 11 / 异常 6)· 改坏试跑 3000 轮 · 跑后基线复绿
- table_structure_guard:smoke_meta——4 条(验红 4 / 异常 0)· 改坏试跑 41 轮 · 跑后基线复绿
- board_gen_reward:smoke_layout_cell_formula——2 条(验红 2 / 异常 0)· 改坏试跑 14 轮 · 跑后基线复绿
- board_gen_reward:smoke_reward_identity_unit——10 条(验红 8 / 异常 2)· 改坏试跑 339 轮 · 跑后基线复绿
- board_gen_reward:smoke_board_generator——22 条(验红 13 / 异常 9)· 改坏试跑 60 轮 · 跑后基线复绿
- board_gen_reward:smoke_power_interval——5 条(验红 3 / 异常 2)· 改坏试跑 596 轮 · 跑后基线复绿
- roll_multiplier:smoke_enemy_attack_type——4 条(验红 3 / 异常 1)· 改坏试跑 600 轮 · 跑后基线复绿
- roll_multiplier:smoke_armor_roll——15 条(验红 10 / 异常 5)· 改坏试跑 600 轮 · 跑后基线复绿
- roll_multiplier:smoke_pool_wiring——4 条(验红 3 / 异常 1)· 改坏试跑 500 轮 · 跑后基线复绿
- roll_multiplier:smoke_damage_types——10 条(验红 6 / 异常 4)· 改坏试跑 500 轮 · 跑后基线复绿
- roll_multiplier:smoke_attack_chain_fresh_pool——3 条(验红 2 / 异常 1)· 改坏试跑 500 轮 · 跑后基线复绿
- seal_polarity:smoke_seal_ap_exhausted——5 条(验红 5 / 异常 0)· 改坏试跑 9 轮 · 跑后基线复绿
合计 189 条:验红 131 / 异常 58。