工程(注释标记词换代·oracle→判据出处): 用户 2026-11-07 令——判据出处注记的标记词改用项目已有中文名,避免 Oracle 被读成数据库。注释格式句、机检正则、标识符、卡片与登记同步换代;零行为改动。

改动面 112 文件 572+/572-:game/tests/** 与 game/probe/** 共 106 件 545 行 `# oracle:`→`# 判据出处:`;tools/capability_audit.py 正则字面量换中文+ORACLE_*→CRITERION_*/check_oracle_markers→check_criterion_markers/oracle_marked(flagged)→criterion_* 共 11 行;test-conventions.md:119 格式句+:155 措辞;待办清单与需求卡片-QA覆盖余量收口批各 1 处字面量;coverage_enum.py:21 与 camp_scene_layout_test.gd:101 旁支措辞;ui_click_probe.gd 对拍局部变量 oracle→expected 7 处;auto_player.gd 三处 safe_set 真值措辞。不动:历史审计报告两份、test-oracle-anchor 分支名、git 史、生成日志;指针格式/扫描面/判红条件/验收义务全不变。

读数(区内实跑):改前 capability_audit --strict「417 注记函数·红项 0」→改后「417 判据出处注记函数·红项 0」exit=0;新标记 545 行/106 文件,现行义务面 oracle 残留 0(在册沿革除外);diff 自检 game/ 非注释新增行仅 6 行且全在 ui_click_probe.gd 的 expected 变量段;112 改动文件 CRLF=0;py_compile tools/capability_audit.py OK;--docs exit=0【验收通过】无新增红;--gates exit=0(静态扫描绿、闸壳 bash -n ×13 失败 0)。
This commit is contained in:
DKChan committed 2026-11-07 07:11:15 +08:00
1 parent 166114e094
commit 9f21236f80
112 files changed
+572 -572

No files matched your search

@@ -12,7 +12,7 @@ var _db
func _init() -> void:
# oracle: design/gdd/systems/表现与支撑/数据配置.md:200 致命真的会死:正式通道加载进程非 0 退出(装载前提组)
# 判据出处: design/gdd/systems/表现与支撑/数据配置.md:200 致命真的会死:正式通道加载进程非 0 退出(装载前提组)
_db = ConfigDBScript.new()
var load_ok: bool = _db.load_tables("res://data/tables", true)
if not load_ok:
@@ -24,7 +24,7 @@ func _init() -> void:
func _trigger_oob() -> void:
# oracle: design/gdd/systems/表现与支撑/数据配置.md:204 越域请求在进入解析前致命中止(Fatal 级诊断+进程非 0,无兜底)(越域组)
# 判据出处: design/gdd/systems/表现与支撑/数据配置.md:204 越域请求在进入解析前致命中止(Fatal 级诊断+进程非 0,无兜底)(越域组)
# 共享 .tres 上的 resolver 归最后装载的实例——autoload ConfigDB 的 _ready 在测试 _init 之后
# 二次注入覆盖私有实例,故触发前把解析通道归还被测实例(诊断落 _db,退出码判据才成立)
_db.combat.board_gen._resolver = _db._resolver
@@ -9,7 +9,7 @@ const Kit := preload("res://tests/unit/test_kit.gd") # T6 收口:_check/汇
func _init() -> void:
# oracle: design/gdd/systems/表现与支撑/数据配置.md:198 干净检出:表清单内全部表加载成功、就绪态断言(装载组)
# 判据出处: design/gdd/systems/表现与支撑/数据配置.md:198 干净检出:表清单内全部表加载成功、就绪态断言(装载组)
var db = ConfigDBScript.new()
var load_ok: bool = db.load_tables("res://data/tables", true)
Kit.check("全部表加载 + 校验通过(含跨表护栏零 error 诊断)〔fv6〕", load_ok and db.diagnostics_count("error") == 0)
@@ -31,7 +31,7 @@ func _init() -> void:
# ---- 进度坐标 ceil 解析(R1:向上下取整保证偏难;越最大行 clamp 取最大值 + 警告去重)----
func _test_progress_resolution(db) -> void:
# oracle: design/gdd/systems/表现与支撑/数据配置.md:203 向上取整解析:请求无精确行返回不低于请求坐标的最近行(进度查行组)
# 判据出处: design/gdd/systems/表现与支撑/数据配置.md:203 向上取整解析:请求无精确行返回不低于请求坐标的最近行(进度查行组)
var bg_rows: Array = db.combat.board_gen.rows
# 行键全集自表推导(禁写死关卡/深度数值)
var level_keys: Array = []
@@ -88,7 +88,7 @@ func _test_progress_resolution(db) -> void:
# ---- 变异池门控(unlock_level 闸 + ∅ board_types 通配 + 节点身份第三维)----
func _test_variant_pool_gate(db) -> void:
# oracle: design/gdd/systems/排雷循环/地形变异.md:153 候选池空合法:门控筛空时静默零布置(变异门控组)
# 判据出处: design/gdd/systems/排雷循环/地形变异.md:153 候选池空合法:门控筛空时静默零布置(变异门控组)
var rows: Array = db.combat.variation.rows
var gated_row := {}
var wildcard_row := {}
@@ -131,7 +131,7 @@ func _rows_contain(pool: Array, row: Dictionary) -> bool:
# ---- ShopTable 消费面(行集解析单点——runner/编排禁自扫表的契约消费侧验证)----
func _test_shop_accessors(db) -> void:
# oracle: design/gdd/systems/表现与支撑/数据配置.md:199 校验类别全覆盖:行结构与引用闭合(商店访问器行结构组)
# 判据出处: design/gdd/systems/表现与支撑/数据配置.md:199 校验类别全覆盖:行结构与引用闭合(商店访问器行结构组)
var products: Array = db.run.shop.product_rows()
if products.is_empty():
Kit.check("ShopTable products 行族非空(表已已入库前提)", false)
@@ -159,7 +159,7 @@ func _test_shop_accessors(db) -> void:
# ---- MetaTable 消费面 ----
func _test_meta_accessors(db) -> void:
# oracle: design/gdd/systems/表现与支撑/数据配置.md:199 校验类别全覆盖:行结构与引用闭合(元进度访问器行结构组)
# 判据出处: design/gdd/systems/表现与支撑/数据配置.md:199 校验类别全覆盖:行结构与引用闭合(元进度访问器行结构组)
# 无 forge_products 行族断言(行族/访问器不在表,V20 清单)
var key_rows: Array = db.crossrun.meta.boss_keystone
if not key_rows.is_empty():
@@ -179,7 +179,7 @@ func _test_meta_accessors(db) -> void:
# ---- TABLE_MANIFEST ↔ data/tables 目录同步(各系统→D2 单点契约的登记面)----
func _test_manifest_dir_sync(db) -> void:
# oracle: design/gdd/systems/表现与支撑/数据配置.md:198 表目录无清单外文件(清单对账组)
# 判据出处: design/gdd/systems/表现与支撑/数据配置.md:198 表目录无清单外文件(清单对账组)
var manifest: Dictionary = db.TABLE_MANIFEST
var dir := DirAccess.open("res://data/tables")
var disk_files: Array = []
@@ -204,7 +204,7 @@ func _test_manifest_dir_sync(db) -> void:
# (rowset_rule——行序即契约,R6 加载期兜底)③行集实例总数 ≤4(骰后值运行面,spawn 守卫——冒烟侧验证)。
func _test_rowset_discipline() -> void:
# oracle: design/gdd/systems/表现与支撑/数据配置.md:199 校验类别:重复键与缺锚行逐类断言(行集纪律组)
# 判据出处: design/gdd/systems/表现与支撑/数据配置.md:199 校验类别:重复键与缺锚行逐类断言(行集纪律组)
# 行集用 rows.assign([...]) 而非直接赋值:rows 是 Array[Dictionary] 定型属性,直接赋 untyped
# 数组字面量会触发「Invalid assignment」脚本错误——该错误不改退出码,却会**中断本函数剩余断言**
#(本函数五条纪律断言曾因此全部静默不跑,套件仍报 all green,是零覆盖假象)。
@@ -20,7 +20,7 @@ const PROBE_REF := ' {\n "feat_id": "ref_probe",\n "display_name": "引用探
func _inject(dir: String, probe: String) -> bool:
# oracle: design/gdd/systems/表现与支撑/数据配置.md:199 校验类别全覆盖:前缀违规夹具注入(前缀夹具组)
# 判据出处: design/gdd/systems/表现与支撑/数据配置.md:199 校验类别全覆盖:前缀违规夹具注入(前缀夹具组)
var path := dir + "/feats.tres"
var f := FileAccess.open(path, FileAccess.READ)
if f == null:
@@ -45,7 +45,7 @@ func _inject(dir: String, probe: String) -> bool:
func _assert_rejected(bad_dir: String, probe: String, label: String) -> bool:
# oracle: design/gdd/systems/表现与支撑/数据配置.md:200 致命真的会死:违规表拒绝且进程非 0(拒绝判定组)
# 判据出处: design/gdd/systems/表现与支撑/数据配置.md:200 致命真的会死:违规表拒绝且进程非 0(拒绝判定组)
# 返回 true=正确拒绝;false=放行或夹具失败(调用方据此退出 2)
if not Kit.copy_tables(SRC_DIR, bad_dir) or not _inject(bad_dir, probe):
push_error("[%s] 夹具目录准备失败" % label)
@@ -39,7 +39,7 @@ const PROBE_TRADE_KEY := ' {
func _inject(dir: String, probe: String) -> bool:
# oracle: design/gdd/systems/表现与支撑/数据配置.md:199 校验类别全覆盖:退役词夹具注入(退役词夹具组)
# 判据出处: design/gdd/systems/表现与支撑/数据配置.md:199 校验类别全覆盖:退役词夹具注入(退役词夹具组)
var path := dir + "/feats.tres"
var f := FileAccess.open(path, FileAccess.READ)
if f == null:
@@ -64,7 +64,7 @@ func _inject(dir: String, probe: String) -> bool:
func _assert_rejected(bad_dir: String, probe: String, label: String) -> bool:
# oracle: design/gdd/systems/表现与支撑/数据配置.md:200 致命真的会死:退役词加载致命中止(拒绝判定组)
# 判据出处: design/gdd/systems/表现与支撑/数据配置.md:200 致命真的会死:退役词加载致命中止(拒绝判定组)
# 返回 true=正确拒绝;false=放行或夹具失败(调用方据此退出 2)
if not Kit.copy_tables(SRC_DIR, bad_dir) or not _inject(bad_dir, probe):
push_error("[%s] 夹具目录准备失败" % label)
@@ -58,7 +58,7 @@ func _count_cat(errs: Array, cat: String) -> int:
# ---- R1:elite 行类合法与字段互锁、引用校验(合法零错+十一违例各自「含」预期类别)----
func _test_elite_validation_rejects() -> void:
# oracle: design/gdd/systems/战斗循环/敌人系统.md:325 elite 行字段互锁与基础引用违例加载期返回错误
# 判据出处: design/gdd/systems/战斗循环/敌人系统.md:325 elite 行字段互锁与基础引用违例加载期返回错误
var t_ok = EnemyTableScript.new()
t_ok.rows.assign(_legal_rows())
var errs: Array = t_ok.validate()
@@ -130,7 +130,7 @@ func _validate_rows(rows: Array) -> Array:
# ---- R2:有效池=基础池+附加技,基础池取深度带最小行(深带行在前防取首行假绿)----
func _test_effective_pool_merge() -> void:
# oracle: design/gdd/systems/战斗循环/敌人系统.md:149 精英有效池=同关战斗行类基础敌种深度带最小行的池+附加技
# 判据出处: design/gdd/systems/战斗循环/敌人系统.md:149 精英有效池=同关战斗行类基础敌种深度带最小行的池+附加技
var rows := [
_mk_row(1, "battle", 3, "goblin"), # 深带行在前(取首行的错误实现必红)
_mk_row(1, "battle", 0, "goblin"),
@@ -155,7 +155,7 @@ func _test_effective_pool_merge() -> void:
# ---- R3:继承不复制——基础池改表传到精英、改写返回数组不回灌 ----
func _test_base_pool_change_propagates() -> void:
# oracle: design/gdd/systems/战斗循环/敌人系统.md:149 继承不复制——基础池调参自动传到精英
# 判据出处: design/gdd/systems/战斗循环/敌人系统.md:149 继承不复制——基础池调参自动传到精英
var rows := [
_mk_row(1, "battle", 3, "goblin"),
_mk_row(1, "battle", 0, "goblin"),
@@ -181,7 +181,7 @@ func _test_base_pool_change_propagates() -> void:
# ---- R4:合并池过池构成纪律(跨表件校验对象=合并后的池)----
func _test_merged_pool_composition() -> void:
# oracle: design/gdd/systems/战斗循环/敌人系统.md:150 池构成纪律校验对象是合并后的池
# 判据出处: design/gdd/systems/战斗循环/敌人系统.md:150 池构成纪律校验对象是合并后的池
var skills := SkillTableScript.new()
skills.rows.assign([
{"skill_id": "attack", "type": "basic"},
@@ -239,7 +239,7 @@ func _msgs(errs: Array) -> Array[String]:
# ---- R5:暂不接线——表里有 elite 行时寻址拿不到它(行类门改动特有判据)----
func _test_elite_unreachable_by_encounter() -> void:
# oracle: design/gdd/systems/战斗循环/敌人系统.md:151 精英行接线前不会被任何节点读到
# 判据出处: design/gdd/systems/战斗循环/敌人系统.md:151 精英行接线前不会被任何节点读到
_diags.clear()
var resolver = ResolverScript.new(
func(level, category, message) -> void:
@@ -272,7 +272,7 @@ func _test_elite_unreachable_by_encounter() -> void:
# ---- R6:生产表地精精英落表(真实加载零错+行值逐位+有效池字典)----
func _test_production_goblin_elite() -> void:
# oracle: design/gdd/systems/战斗循环/敌人系统.md:147 精英=敌人表行类为 elite 的独立一行
# 判据出处: design/gdd/systems/战斗循环/敌人系统.md:147 精英=敌人表行类为 elite 的独立一行
var db = load("res://core/config_db.gd").new()
var ok: bool = db.load_tables("res://data/tables", true)
Kit.check("生产表 ConfigDB.load_tables 装载(is_ready=%s)〔精英批 V6〕" % str(db.is_ready), ok and db.is_ready)
@@ -12,7 +12,7 @@ const Kit := preload("res://tests/unit/test_kit.gd")
func _init() -> void:
# oracle: design/gdd/systems/表现与支撑/数据配置.md:198 锻造表装载与就绪态(装载组)
# 判据出处: design/gdd/systems/表现与支撑/数据配置.md:198 锻造表装载与就绪态(装载组)
var db = ConfigDBScript.new()
var load_ok: bool = db.load_tables("res://data/tables", true)
Kit.check("生产 forge.tres 随全表加载 + validate 零违例〔锻造工坊批 V1〕", load_ok and db.diagnostics_count("error") == 0)
@@ -27,7 +27,7 @@ func _init() -> void:
# ---- 生产表六行正向(V1 生产面 + V11 行字段闭集)----
func _test_production_rows(db) -> void:
# oracle: design/gdd/systems/表现与支撑/数据配置.md:199 校验类别全覆盖:行 schema 正反逐类断言(生产行结构组)
# 判据出处: design/gdd/systems/表现与支撑/数据配置.md:199 校验类别全覆盖:行 schema 正反逐类断言(生产行结构组)
var rows: Array = db.crossrun.forge.route_rows()
Kit.check("六路线行族规模恰 6(三武器+三甲)〔锻造工坊批 V1〕", rows.size() == 6)
var ids := []
@@ -91,7 +91,7 @@ func _test_production_rows(db) -> void:
# ---- 几何价格梯(V2 价格面单测半边——购买写在 T3 冒烟)----
func _test_price_ladder(db) -> void:
# oracle: design/gdd/systems/跨局循环/锻造工坊.md:220 定价结构:每级价格随已购级数几何递增、基价与公比读表单点(价格梯组)
# 判据出处: design/gdd/systems/跨局循环/锻造工坊.md:220 定价结构:每级价格随已购级数几何递增、基价与公比读表单点(价格梯组)
var row: Dictionary = db.crossrun.forge.route("sword")
var prices := []
for owned in range(5):
@@ -150,7 +150,7 @@ func _mut_spear_initial(t) -> void:
func _test_negative_cases() -> void:
# oracle: design/gdd/systems/表现与支撑/数据配置.md:199 校验类别全覆盖(负向 schema 组)
# 判据出处: design/gdd/systems/表现与支撑/数据配置.md:199 校验类别全覆盖(负向 schema 组)
# 夹具本身须零违例(否则负向判读失效)
var t_ok = ForgeTableScript.new()
t_ok.routes = _base_rows()
@@ -219,7 +219,7 @@ func _test_negative_cases() -> void:
# 32→31:改写族清退批摘 spike(CI run 87 追绿——词表合法收窄的断言随动)。
func _test_effect_kinds_closed() -> void:
# oracle: design/engineering/architecture/architecture.md:89 事件/事实/效果类型/算子四词表封闭(特效闭集组)
# 判据出处: design/engineering/architecture/architecture.md:89 事件/事实/效果类型/算子四词表封闭(特效闭集组)
Kit.check("效果引擎效果类型闭集 31 种(甲案词表退役 overflow/attack_segments+改写族清退摘 spike)〔锻造工坊批 V11〕",
EffectEngineScript.EFFECT_KINDS.size() == 31)
Kit.check("效果引擎事件词表在册 21 种(charge_full 位摘名——蓄力层删键批)〔锻造工坊批 V11〕",
@@ -11,7 +11,7 @@ const Kit := preload("res://tests/unit/test_kit.gd")
func _init() -> void:
# oracle: design/gdd/systems/表现与支撑/数据配置.md:198 参数档表装载与就绪态(装载组)
# 判据出处: design/gdd/systems/表现与支撑/数据配置.md:198 参数档表装载与就绪态(装载组)
var db = ConfigDBScript.new()
var load_ok: bool = db.load_tables("res://data/tables", true)
Kit.check("生产 level_gen_params.tres 随全表加载 + validate 零违例〔fv2〕",
@@ -43,7 +43,7 @@ func _table(rows: Array) -> Variant:
# ---- 生产三行正向(V2)----
func _test_production(db) -> void:
# oracle: design/gdd/systems/冒险循环/关卡节点图生成.md:127 产出合格:任意参数档产出的图必过产出约束(生产档组)
# 判据出处: design/gdd/systems/冒险循环/关卡节点图生成.md:127 产出合格:任意参数档产出的图必过产出约束(生产档组)
var r1: Dictionary = db.run.level_gen_params.row_by_level_index(1)
var r2: Dictionary = db.run.level_gen_params.row_by_level_index(2)
var r3: Dictionary = db.run.level_gen_params.row_by_level_index(3)
@@ -61,7 +61,7 @@ func _test_production(db) -> void:
# ---- 访问器缺行防御 ----
func _test_accessor() -> void:
# oracle: design/gdd/systems/冒险循环/关卡节点图生成.md:127 参数档访问器读回与产出约束(访问器组)
# 判据出处: design/gdd/systems/冒险循环/关卡节点图生成.md:127 参数档访问器读回与产出约束(访问器组)
var t = _table([_row(1, 6, 0.3, [0.5, 0.2, 0.2, 0.1], 1, 1, 4)])
Kit.check("row_by_level_index 缺行返回空字典〔fv2〕", t.row_by_level_index(9).is_empty())
@@ -69,7 +69,7 @@ func _test_accessor() -> void:
# ---- 域校验逐类负向(V2)----
func _test_negative() -> void:
# oracle: design/gdd/systems/表现与支撑/数据配置.md:199 校验类别全覆盖:参数档 schema 拒绝(负向组)
# 判据出处: design/gdd/systems/表现与支撑/数据配置.md:199 校验类别全覆盖:参数档 schema 拒绝(负向组)
# 合法基线三行
var base := [_row(1, 6, 0.3, [0.5, 0.2, 0.2, 0.1], 1, 1, 4),
_row(2, 9, 0.5, [0.5, 0.2, 0.15, 0.15], 2, 2, 6),
@@ -14,7 +14,7 @@ const BAD_DIR := "user://treasure_fixture_dangling"
func _inject_violation() -> bool:
# oracle: design/gdd/systems/表现与支撑/数据配置.md:199 校验类别:悬空引用夹具(悬空引用组)
# 判据出处: design/gdd/systems/表现与支撑/数据配置.md:199 校验类别:悬空引用夹具(悬空引用组)
var path := BAD_DIR + "/reward.tres"
var f := FileAccess.open(path, FileAccess.READ)
if f == null:
@@ -37,7 +37,7 @@ func _inject_violation() -> bool:
func _init() -> void:
# oracle: design/gdd/systems/表现与支撑/数据配置.md:200 致命真的会死:悬空引用被拒绝、进程非 0(拒绝组)
# 判据出处: design/gdd/systems/表现与支撑/数据配置.md:200 致命真的会死:悬空引用被拒绝、进程非 0(拒绝组)
if not Kit.copy_tables(SRC_DIR, BAD_DIR) or not _inject_violation():
push_error("[reward_dangling_treasure_test] 夹具目录准备失败")
quit(2)
@@ -12,7 +12,7 @@ const TEST_SEED := 20260928 # 夹具种子(任意固定值;语义 = 可复
func _init() -> void:
# oracle: design/gdd/systems/表现与支撑/数据配置.md:201 黄金向量:登记向量逐个复算(装载组)
# 判据出处: design/gdd/systems/表现与支撑/数据配置.md:201 黄金向量:登记向量逐个复算(装载组)
_test_derive_determinism()
_test_counter_ledger()
_test_stream_draw_determinism()
@@ -28,7 +28,7 @@ func _fresh_service():
# 单盐派生纯函数:两全新实例同种子逐位一致(derive_at 不推计数器——纯函数契约)
func _test_derive_determinism() -> void:
# oracle: design/gdd/systems/表现与支撑/数据配置.md:201 黄金向量:随机派生纯函数对登记向量逐个复算相等、同输入恒同输出(派生确定性组)
# 判据出处: design/gdd/systems/表现与支撑/数据配置.md:201 黄金向量:随机派生纯函数对登记向量逐个复算相等、同输入恒同输出(派生确定性组)
var a = _fresh_service()
var b = _fresh_service()
var same := true
@@ -44,7 +44,7 @@ func _test_derive_determinism() -> void:
# 全局取数计数器:唯一账本——open_stream 逐次 +1(scope 单调)
func _test_counter_ledger() -> void:
# oracle: design/gdd/systems/表现与支撑/数据配置.md:202 计数器纪律:连续取号跨模拟关卡切换单调不重置(计数账本组)
# 判据出处: design/gdd/systems/表现与支撑/数据配置.md:202 计数器纪律:连续取号跨模拟关卡切换单调不重置(计数账本组)
var rng = _fresh_service()
var c0: int = rng.counter()
rng.open_stream("armor_roll")
@@ -62,7 +62,7 @@ func _test_counter_ledger() -> void:
# 同种子两实例同标签流的实际取数序列逐位一致(回放确定性契约——存档快照=主种子+计数器的前提)
func _test_stream_draw_determinism() -> void:
# oracle: design/gdd/systems/表现与支撑/数据配置.md:201 同输入恒同输出:流取号确定性(流取号组)
# 判据出处: design/gdd/systems/表现与支撑/数据配置.md:201 同输入恒同输出:流取号确定性(流取号组)
var faces := 20 # d20 探针面数(夹具值,非玩法表值——只用于产生可比较序列)
var a = _fresh_service()
var b = _fresh_service()
@@ -77,7 +77,7 @@ func _test_stream_draw_determinism() -> void:
# 负输入 abs 归一化(警告通道)——|−s| 与 s 同派生
func _test_negative_seed_normalization() -> void:
# oracle: design/engineering/architecture/architecture.md:90 RngService:master_seed 与各流 scope 计数器单点(种子规约组)
# 判据出处: design/engineering/architecture/architecture.md:90 RngService:master_seed 与各流 scope 计数器单点(种子规约组)
var pos = _fresh_service()
var neg = RngServiceScript.new()
neg.set_master_seed(-TEST_SEED)
@@ -22,7 +22,7 @@ func _init() -> void:
# 单元宿主改由 `_init` 显式调用,断言逐字未动;源 :70 事件日志落盘条经主会话裁决一
# 改判跨系统闭环套件——不随本宿主,见迁移账本转办清单)----
func _smoke_initialize() -> void:
# oracle: design/engineering/architecture/architecture.md:90 RngService autoload:open_stream 有状态门面与启动初始化(启动流组)
# 判据出处: design/engineering/architecture/architecture.md:90 RngService autoload:open_stream 有状态门面与启动初始化(启动流组)
print("=== Dungeon Sweeper 垂直切片冒烟 ===")
var db = ConfigDBScript.new()
var load_ok: bool = db.load_tables("res://data/tables", true)
@@ -29,7 +29,7 @@ var _db
func _init() -> void:
# oracle: design/gdd/systems/表现与支撑/数据配置.md:198 表结构守卫装载与就绪态(装载组)
# 判据出处: design/gdd/systems/表现与支撑/数据配置.md:198 表结构守卫装载与就绪态(装载组)
_db = ConfigDBScript.new()
# 表加载失败不中止(沿被迁断言面的源语义:表损坏的红落在具体断言上——
# 诊断在此展开,后续断言按坏表实况逐条验红;collect_only=true 下成员照常赋值可评)
@@ -92,7 +92,7 @@ func _first_encounter_band(level_index: int, enemy_id: String) -> int:
# ① 冒险表(单行全局 Rule 4 豁免——建表与接线闸;TP0 令牌池:配额结构/件值对/池总量域检)
func _smoke_adventure_table() -> void:
# oracle: design/gdd/systems/冒险循环/冒险结构.md:281 冒险结构表校验(冒险表组)
# 判据出处: design/gdd/systems/冒险循环/冒险结构.md:281 冒险结构表校验(冒险表组)
print("--- 冒险表(AdventureTable——令牌池行值单点:回血/配额/件值对/同调位)---")
Kit.check("db.adventure 已加载(adventure.tres 入 manifest)", _db.run.adventure != null)
if _db.run.adventure == null:
@@ -211,7 +211,7 @@ func _smoke_adventure_table() -> void:
# ---- 敌人表深度带键结构(迭代 34 建·L1 混编批换代:30 行键序=覆盖表序·(1,3) 混编行集·Boss 行集带键清单·精英行)----
func _smoke_enemy_bands() -> void:
# oracle: design/gdd/systems/冒险循环/难度曲线与Boss.md:316 难度与敌人带校验(敌人带组)
# 判据出处: design/gdd/systems/冒险循环/难度曲线与Boss.md:316 难度与敌人带校验(敌人带组)
print("--- 敌人表深度带键结构(30 行键序 · (1,3) 混编 · Boss 带键覆盖表 · 精英行)---")
# ① 30 行计数 + 键序 = 覆盖表序(文件行序不变——行序即契约;(1,3) 两行相邻、熊地精在前;精英行随精英专属池批)
# 迭代 35 生成图深度扩面覆盖批随动:战斗带顶扩到各关最大生成深度(L1→6/L2→9/L3→13)、
@@ -300,7 +300,7 @@ func _smoke_enemy_bands() -> void:
# ④ 掷点参数域:档位边界升序/档位值降序无零档/骰面与暴击参数在域(加载校验双保险)。
func _smoke_ac_swap_guard() -> void:
# oracle: design/gdd/systems/跨局循环/锻造工坊.md:219 切换语义:一次冒险=一个武器类型+一个甲型,冒险开始后锁死(AC 换装守卫组)
# 判据出处: design/gdd/systems/跨局循环/锻造工坊.md:219 切换语义:一次冒险=一个武器类型+一个甲型,冒险开始后锁死(AC 换装守卫组)
print("--- 护甲等级掷点批·换装护栏 ---")
# ① 三处无双轨
Kit.check("状态表 defense_up 行已退役(无双轨)", _db.combat.status_effects.row_by_id("defense_up").is_empty())
@@ -421,7 +421,7 @@ func _smoke_ac_swap_guard() -> void:
# ---- 地形变异 框架面(四行两轴×两关 + 门控 + 跨字段互锁)----
func _smoke_variation_framework() -> void:
# oracle: design/gdd/systems/排雷循环/地形变异.md:153 候选池门控与静默零布置(变异框架组)
# 判据出处: design/gdd/systems/排雷循环/地形变异.md:153 候选池门控与静默零布置(变异框架组)
print("--- 地形变异 框架面(首批四类型 + 候选池门控 + 跨字段互锁)---")
Kit.check("变异清单 6 行(荆棘丛/藤蔓缠绕/岩浆/烬覆 + 落石/矿尘——首批类型定稿批 + 第三关内容批;贫矿脉 2026-10-16 用户令屏蔽删行)",
_db.combat.variation.rows.size() == 6)
@@ -457,7 +457,7 @@ func _smoke_variation_framework() -> void:
# ---- 难度曲线与Boss DifficultyTable 结构位冒烟(AC-10:空表零行为 + 套乘点 = 行值快照前)----
func _smoke_difficulty_table() -> void:
# oracle: design/gdd/systems/冒险循环/难度曲线与Boss.md:316 难度修饰套乘(难度表组)
# 判据出处: design/gdd/systems/冒险循环/难度曲线与Boss.md:316 难度修饰套乘(难度表组)
print("--- 难度曲线与Boss·DifficultyTable 结构位 ---")
Kit.check("DifficultyTable MVP 空表加载(结构位)", _db.run.difficulty != null and _db.run.difficulty.rows.is_empty())
# ① 空表零行为:敌人系统.spawn 敌值 = EnemyTable 行值原样
@@ -488,7 +488,7 @@ func _smoke_difficulty_table() -> void:
# ---- ⑤ 格面资源九型 + gp_drop 流(黄金向量)----
func _smoke_nine_types_gp_stream() -> void:
# oracle: design/gdd/systems/表现与支撑/数据配置.md:199 校验类别全覆盖:九型 GP 流校验(九型流组)
# 判据出处: design/gdd/systems/表现与支撑/数据配置.md:199 校验类别全覆盖:九型 GP 流校验(九型流组)
print("--- 格面资源九型 + gp_drop 流(奖励字典 18 格 + 黄金向量)---")
Kit.check("格面资源十型封闭(第九型 gp 九型批 2026-09-20 / 第十型 treasure_item 秘宝内容批 2026-09-29——词表 v1.2)",
RewardTable.CELL_TYPES.size() == 10 and RewardTable.CELL_TYPES.has("gp") and RewardTable.CELL_TYPES.has("treasure_item"))
@@ -538,7 +538,7 @@ func _smoke_nine_types_gp_stream() -> void:
# ---- 元进度·MetaTable 表结构(行值全 provisional 归元进度设计文档配读数;
# conversion 覆盖恰三,Boss 两档 first ≥ repeat)----
func _smoke_meta() -> void:
# oracle: design/gdd/systems/跨局循环/元进度.md:148 元进度行族校验(meta 行族组)
# 判据出处: design/gdd/systems/跨局循环/元进度.md:148 元进度行族校验(meta 行族组)
print("--- 元进度·MetaTable 表结构 ---")
var meta_tbl = _db.crossrun.meta
Kit.check("MetaTable 非空 + validate 零错(三行族词表封闭/唯一/连续/域界/first≥repeat/ratio 全过)",
@@ -578,7 +578,7 @@ func _conversion_row_of(rows: Array, attr: String) -> Dictionary:
# ---- V7 节点图三新键域校验(架构整改——缺新键行拒/width_max 越域拒/两 pct 越域拒/表值全过)----
func _test_level_gen_new_fields() -> void:
# oracle: design/engineering/test-conventions.md:56 (判定上报通道——验证函数组)
# 判据出处: design/engineering/test-conventions.md:56 (判定上报通道——验证函数组)
var tbl = _db.run.level_gen_params
var mk := func(mod: Dictionary) -> Dictionary:
var row := {"level_index": 1, "layers": 6, "branch_density": 0.3, "battle_ratio": 0.5, "reward_ratio": 0.2,
@@ -615,7 +615,7 @@ func _test_level_gen_new_fields() -> void:
# ---- 变异表头域校验 / feat cap 必填(架构整改——丁案三件的数据面守卫)----
func _test_variation_header_domains() -> void:
# oracle: design/engineering/test-conventions.md:56 (判定上报通道——验证函数组)
# 判据出处: design/engineering/test-conventions.md:56 (判定上报通道——验证函数组)
var inst = load("res://data/schemas/variation_table.gd").new()
inst.percent_of_cells = 5
inst.per_level_bonus = 0
@@ -633,7 +633,7 @@ func _test_variation_header_domains() -> void:
func _test_feat_cap_required() -> void:
# oracle: design/engineering/test-conventions.md:56 (判定上报通道——验证函数组)
# 判据出处: design/engineering/test-conventions.md:56 (判定上报通道——验证函数组)
var inst = load("res://data/schemas/feat_table.gd").new()
# 生产表全行 cap 在场(加载期已验——此处显式复核 37 行)
var all_cap := true
@@ -15,7 +15,7 @@ const BAD_DIR := "user://treasure_fixture_target_violation"
func _inject_violation() -> bool:
# oracle: design/gdd/systems/表现与支撑/数据配置.md:199 校验类别全覆盖:违规夹具逐类注入(真视窄域夹具组)
# 判据出处: design/gdd/systems/表现与支撑/数据配置.md:199 校验类别全覆盖:违规夹具逐类注入(真视窄域夹具组)
var path := BAD_DIR + "/treasure_items.tres"
var f := FileAccess.open(path, FileAccess.READ)
if f == null:
@@ -40,7 +40,7 @@ func _inject_violation() -> bool:
func _init() -> void:
# oracle: design/gdd/systems/表现与支撑/数据配置.md:200 致命真的会死:违规表被拒绝、进程非 0(违规拒绝组)
# 判据出处: design/gdd/systems/表现与支撑/数据配置.md:200 致命真的会死:违规表被拒绝、进程非 0(违规拒绝组)
if not Kit.copy_tables(SRC_DIR, BAD_DIR) or not _inject_violation():
push_error("[treasure_target_violation_test] 夹具目录准备失败")
quit(2)