iter55-卡1:QA覆盖余量收口批: 46→45真缺口断言落地(违约词负面套件/结算与cap与换算率钉/配额满/rap端到端/布局/天赋树/状态行/L3变异/reward行)+p_perfect读表接线(行为零漂移)+豁免登记(ontology 154/controls 19)+探针扩面十一组真输入+登记件开发面过滤(DebugOverlay/调试角标/inter三根, seen开发面键0)+枚举器scan_screens基类分类(绘制域件与调试浮窗出圈, 868实体/未豁免未补测=0)+cell_mark_overlay渲染通道(采集态六类型注入全入帧, 棋盘三图基线换代用户过目, 渲染闸绿);卡修轮2用户裁两处不豁免(渲染通道+开发面出圈);独立审计U1修复闭合+增量轮通过

This commit is contained in:
DKChan committed 2026-11-07 19:56:13 +08:00
1 parent 095bb4c91b
commit c41ce9cfc5
25 files changed
+1502 -26

No files matched your search

@@ -50,6 +50,10 @@ func _init() -> void:
_smoke_nine_types_gp_stream()
_smoke_adventure_table()
_smoke_meta()
_check_settlement_pin_values()
_check_meta_per_level_pins()
_check_curio_cap_segment_pins()
_check_reward_row_pins()
quit(Kit.finish("table_structure_guard_test"))
@@ -660,3 +664,73 @@ func _test_feat_cap_required() -> void:
var cap_v: int = int(some_feat["cap"])
Kit.check("V12 cap_ok 在场行直索引读 cap(首行 %s cap=%d——零兜底路径)〔架构整改 V12〕" % [String(some_feat["feat_id"]), cap_v],
deck.cap_ok("relic", String(some_feat["feat_id"])) == (int(deck.taken.get("relic:" + String(some_feat["feat_id"]), 0)) < cap_v))
# ---- G2 结算数值钉(迭代 55「QA覆盖余量收口批」T2——equivalence_ref_damage/p_perfect 钉+p_perfect 读数活性)----
func _check_settlement_pin_values() -> void:
# 判据出处: design/engineering/test-conventions.md:119 (表值钉值——漂移即红)
# 判据出处: design/gdd/systems/战斗循环/战斗结算.md:124 (完美第二份兑付读表——接线后该句由声称变属实)
var core = _db.combat.settlement.core
var roll = _db.combat.settlement.damage_roll
Kit.check("equivalence_ref_damage 钉 4(离线审计镜像 tools/clear_dominance_audit.py D_REF 同源——表值漂移即审计口径静默失效)〔QA余 V2〕",
int(roll.equivalence_ref_damage) == 4)
Kit.check("p_perfect 钉 200(完美兑付载体域 {100,200} 在役档)〔QA余 V2〕", int(core.p_perfect) == 200)
# 读数活性断言:注入域内另一档 p_perfect=100 → 完美兑付份数随表值变化(防「接线但弃用」死接线假绿)。
# 构造沿 seal_polarity 零兑付段同款(真实编排器;敌人存活首份必兑付——弱形式登记:直调 grant_clear_reward
# 构造完美谓词,真值在正常流由封印判定累加)。表值注入限本函数作用域、读后即还原(同进程后续断言免污染)。
var old_pp: int = int(core.p_perfect)
core.p_perfect = 100
var rng = load("res://core/rng_service.gd").new()
rng.set_master_seed(20261107)
var s = load("res://core/battle_orchestrator.gd").new(_db, rng)
var rows: Array = []
s.step_row.connect(func(row): rows.append(row))
Kit.check("活性断言构造战斗启动(level_index 1 / depth 4 / boss)", bool(s.begin_battle({"level_index": 1, "node_depth": 4, "hero_hp": 80, "hero_max_hp": 80, "node_type": "boss"})))
s._facts.perfect_hit_true = 1
s._facts.perfect_hit_false = 0
s.reward_grant().grant_clear_reward(1, s._facts.board_from_midround, s.perfect_sweep_earned())
var dmg := 0
for r in rows:
if String(r.get("type", "")) == "damage" and String(r.get("source_class", "")) == "clear_reward":
dmg += 1
Kit.check("p_perfect=100 注入 → 清图奖励单份兑付(clear_reward 伤害行 ×1——第二份不随 perfect 谓词发出)〔QA余 V2〕",
dmg == 1)
core.p_perfect = old_pp
Kit.check("p_perfect 表值还原 200(共享面注入窗口闭合)〔QA余 V2〕", int(_db.combat.settlement.core.p_perfect) == 200)
# ---- G10 换算率钉(迭代 55「QA覆盖余量收口批」T2——per_level_shift_pct 三关档 6/9/1)----
func _check_meta_per_level_pins() -> void:
# 判据出处: design/engineering/test-conventions.md:119 (表值钉值——漂移即红;离线 verifier 消费端同源)
var pins := {"max_hp": 6, "atk": 9, "armor_class": 1}
for attr in pins.keys():
var row: Dictionary = {}
for r in (_db.crossrun.meta.conversion as Array):
if String(r.get("attr", "")) == String(attr):
row = r
Kit.check("per_level_shift_pct 钉:%s==%d(换算率三关档——balance_verifier CONVERSION 同源)〔QA余 V16〕" % [String(attr), int(pins[attr])],
not row.is_empty() and int(row.get("per_level_shift_pct", -1)) == int(pins[attr]))
# ---- G3 cap 段七槽钉值(迭代 55「QA覆盖余量收口批」T3——与 gp/attack 同款占位形态)----
func _check_curio_cap_segment_pins() -> void:
# 判据出处: design/engineering/test-conventions.md:119 (表值钉值——漂移即红)
for kind in ["ap", "armor", "heal", "max_hp", "rap", "refresh", "time_sand"]:
Kit.check("curio_cap 七槽钉值:%s==99(案②提前退役占位——99=实质无上限,实数归调参批)〔QA余 V3〕" % kind,
int(_db.run.adventure.curio_cap(String(kind))) == 99)
# ---- G8 reward stacks 行钉(迭代 55「QA覆盖余量收口批」T8——生产行 stacks 值面,合成行键未读生产行的缺口补钉)----
func _check_reward_row_pins() -> void:
# 判据出处: design/engineering/test-conventions.md:119 (表值钉值——漂移即红)
Kit.check("reward 行扫描面非空(18 行在册——防空表静默绿)", (_db.run.reward.rows as Array).size() > 0)
var stacks_drift: Array[String] = []
for row in _db.run.reward.rows:
if int(row.get("stacks", 1)) != 1:
stacks_drift.append(String(row.get("reward_id", "")))
Kit.check("reward 生产行 stacks 全 1(schema 缺省值面——合成行 stacks 键的行值主证;行值面变更须自觉换代本钉)〔QA余 V8〕",
stacks_drift.is_empty())