diff --git a/design/engineering/test-conventions.md b/design/engineering/test-conventions.md index f3b8e568..e58baf52 100644 --- a/design/engineering/test-conventions.md +++ b/design/engineering/test-conventions.md @@ -117,7 +117,7 @@ **判据出处行锚(2026-11-05 立,自 2026-11-05 起对文件名日期不早于该日的需求卡片生效;旧卡不回头改,被编入迭代开工前由写卡段按本粒度补挂)**:对照表「需求点」列每行必须带**判据出处行锚**——该行验收判据所依据的现行文档句子,格式「`<文档相对路径>:<行号>`」。现行文档=`design/` 全域现行文档(含 `ux/` 交互规格与 art-bible 的判据行);已退役的需求卡片不是现行文档,不得充当判据出处。作用=断言预期值从规格句抄出,不从实现反推:实现行为与规格句冲突时断言红;规格缺席的行写不出锚,即停卡退回写卡段(那是需求澄清缺口,不是测试缺口)。机检=`tools/pipeline_gate.py` 判据 C5(锚格式与指向存在性,按卡文件名日期分流)+`tools/capability_audit.py` 链式锚检查(断言→套件→能力行→系统文档,见 §8.9)。 -**测试函数的判据出处注记(2026-11-06 立)**:`game/tests/**` 与 `game/probe/**` 内每个**验证函数**(函数体含 `check(`/`check_quiet(`/`_problems.append(`/`push_error(` 判定调用的函数——定义行与 `_check(` 前缀不作判定计)必须带至少一条**判据出处注记**,格式「`# 判据出处: :<行号> <判据一句>`」——指针在前、判据摘要句在后;锚形态两档:行号锚(默认)与节锚(`「节名」<行关键词>`)——所指文档整节重排时同批把行号锚重锚为节锚,免行号漂移(2026-11-07 架构收窄批立),断言预期值的出处随断言走:断言红时读注记即达出处文档句,零查表。指针空间=`design/` 全域现行文档(行为测试锚 owner 系统文档「验收标准」句或 `ux/` 规格句;惯例类测试〔封装扫描、判定通道纪律、驱动契约〕锚规约条款行);`game/sim/` 不进扫描面(测量面直构惯例)。与链式锚的分工:链式锚(断言→套件→能力行→系统文档)不变、属义务清单层;本注记属执行证据层、写在断言文件内,非独立账本(§8.9 法则 4 不变)。写新测试函数时当场挂注记;被指规格句改行号时随批维护指针——死指针即红。局限如实声明:注记是被动文本,句内容改而行数不变时机检抓不到(与卡片判据 C5 同限)。机检=`tools/capability_audit.py` 判据出处注记道(覆盖检查+指针存在性;扫描面零文件自检红)。规格缺席写不出锚=发现规格缺口:记发现不造锚、收尾呈报,禁锚到非现行文档凑数。 +**测试函数的判据出处注记(2026-11-06 立)**:`game/tests/**` 与 `game/probe/**` 内每个**验证函数**(函数体含 `check(`/`check_quiet(`/`_problems.append(`/`push_error(` 判定调用的函数——定义行与 `_check(` 前缀不作判定计)必须带至少一条**判据出处注记**,格式「`# 判据出处: :<行号> <判据一句>`」——指针在前、判据摘要句在后;锚形态两档:行号锚(默认)与节锚(`「节名」<行关键词>`)——所指文档整节重排时同批把行号锚重锚为节锚,免行号漂移(2026-11-07 架构收窄批立),断言预期值的出处随断言走:断言红时读注记即达出处文档句,零查表。指针空间=`design/` 全域现行文档(行为测试锚 owner 系统文档「验收标准」句或 `ux/` 规格句;惯例类测试〔封装扫描、判定通道纪律、驱动契约〕锚规约条款行;测量面驱动契约锚 `game/sim/` 实现件文件头注——规范句在哪锚哪,2026-11-09 架构收敛批立);`game/sim/` 不进扫描面(测量面直构惯例)。与链式锚的分工:链式锚(断言→套件→能力行→系统文档)不变、属义务清单层;本注记属执行证据层、写在断言文件内,非独立账本(§8.9 法则 4 不变)。写新测试函数时当场挂注记;被指规格句改行号时随批维护指针——死指针即红。局限如实声明:注记是被动文本,句内容改而行数不变时机检抓不到(与卡片判据 C5 同限)。机检=`tools/capability_audit.py` 判据出处注记道(覆盖检查+指针存在性;扫描面零文件自检红)。规格缺席写不出锚=发现规格缺口:记发现不造锚、收尾呈报,禁锚到非现行文档凑数。 **验收档申报(2026-11-04 立,自 2026-11-05 起对文件名日期不早于该日的需求卡片生效;旧卡不回头改)**:每张需求卡片在头部信息区(与设计事实源声明同区)申报一个验收档,三档:高/中/低。判据=失败代价单维——这条改动做错了,后果随存档或结算传播的(存档写读与迁移、RNG 流、战斗结算公式与乘区、经济入账、数值表结构校验)=高;后果玩家可见但不损持久状态的(常规玩法逻辑、门控、交互逻辑、呈现数据面)=中;后果即看即知且无状态残留的(文案、纯呈现样式、布局微调)=低。一张卡触多档按最高档申报;申报由写卡段落笔,用户批卡(U0)时确认或改判。档位只调节 §8.7 审计深度——闸机与 CI 的域划分、选闸算法、全量强制档一概不因档位变化,真实入口、判据绑定面、禁削弱等验收闭合判据全部照旧。未申报档位的卡一律按高档全量审计。机检=`tools/pipeline_gate.py` 判据 C4:卡内须含「验收档:高/中/低」申报行。 diff --git a/design/gdd/systems/冒险循环/冒险结构.md b/design/gdd/systems/冒险循环/冒险结构.md index e4a48f49..af0dd5d8 100644 --- a/design/gdd/systems/冒险循环/冒险结构.md +++ b/design/gdd/systems/冒险循环/冒险结构.md @@ -184,7 +184,7 @@ GP(显示名「GP」)是冒险内的一次性属性提升货币:战斗胜 主动放弃按与失败同型结算:已兑付的三选一件与回血不追回、已到手的保留,摘要标记未打穿。放弃请求只在非战斗期受理,战斗进行中一律拒绝(战斗域单事务执行期间)。放弃的界面入口挂在[关卡节点地图](关卡节点地图.md)的选路覆盖层上——选路停点天然是非战斗期,按钮只在冒险模式开放(选路覆盖层只在冒险模式出现);战斗进行中没有选路停点,入口因此天然不可达,拒绝分支仅作防御兜底。 -主种子(本文含义:冒险开始时注入的一个随机种子,本局全部随机性都派生自它)在冒险开始时注入恰一次。冒险内的雷图生成、奖励抽取、遭遇掷骰与 GP 掉落掷定(消费 gp_drop 封闭流)全部派生自它,冒险内不重置、不逐关播种。冒险的可复现域 = 主种子 + 全局取数计数器(统一随机流口径,语义权威归[数据配置](../表现与支撑/数据配置.md)),供复盘与快照(见[存档序列化](../表现与支撑/存档序列化.md))。重开抽到的种子与上一局相同是允许的(随机源范围小,撞种子不算错误),但生成新种子禁止复用玩法里的随机数。 +主种子(本文含义:冒险开始时注入的一个随机种子,本局全部随机性都派生自它)在冒险开始时注入恰一次。冒险内的雷图生成、奖励抽取、遭遇掷骰与 GP 掉落掷定(消费 gp_drop 封闭流)全部派生自它,冒险内不重置、不逐关播种。冒险的可复现域 = 主种子 + 全局取数计数器(统一随机流口径,语义权威归[数据配置](../表现与支撑/数据配置.md)),供复盘与快照(见[存档序列化](../表现与支撑/存档序列化.md))。重开抽到的种子与上一局相同是允许的(随机源范围小,撞种子不算错误),但生成新种子禁止复用玩法里的随机数。调试种子入口的三分判定:显式输入的合法整数优先;首局(无存档在档)空框恒用固定教学种子;非首局空框用引擎熵随机生成(不进玩法封闭流)。 ### 冒险断点:中断可续玩的停点快照 diff --git a/design/gdd/systems/战斗循环/战斗结算.md b/design/gdd/systems/战斗循环/战斗结算.md index 9289d8d1..5c928746 100644 --- a/design/gdd/systems/战斗循环/战斗结算.md +++ b/design/gdd/systems/战斗循环/战斗结算.md @@ -102,6 +102,8 @@ 扩展行与基础行共用同一套行协议:公共字段、来源归因、两层豁免、无来源即炸,全部照常生效。发射时点由段序骨架的挂点决定(时序与挂点施加面、效果身份清单与各发射点归代码文件头注承载),本节只管这行是什么、带什么字段。扩展行携带效果身份(effect_id 载荷)。 +效果引擎的装载与订阅面(表装载、rebuild、树规则挂接)与端口装配明细归实现件文件头注承载。两业务类(伤害管线/行动经济)持同一个效果端口件实例,命中批经端口路由全处理。伤害域传给效果引擎的事实面为封闭集合:载荷携带的事实键可达、宿主链事实不外溢——事实面增删走实现件修订,禁静默扩面。 + 举证:本节为行协议约定,无计算。 ### 收益对照表:所有收益共用同一把尺子 diff --git a/design/gdd/systems/排雷循环/排雷玩法.md b/design/gdd/systems/排雷循环/排雷玩法.md index 423df1d7..e1d3fa4d 100644 --- a/design/gdd/systems/排雷循环/排雷玩法.md +++ b/design/gdd/systems/排雷循环/排雷玩法.md @@ -232,6 +232,7 @@ - 清图口径:清图 = 全部安全格完成——挖开或封印都算完成;封到安全格计入清图进度,封印可以完成清图。 - 已引爆危险格可通行:挖雷后轮次不结束,小人可站、可经已开区穿行续挖;危险格不计清图、不可再挖再封印。 - 移动合法且预览同源:目标未开或无已开区连通路径时拒绝;路径预览与实际执行逐格相同;移动免费、零事件。 +- 揭示预览口:预览口按实挖同口径返回揭示闭包——零状态写入、零事件外发、封印格不外扩(只读查询面,供测量与呈现旁路取数)。 - 批次仲裁与到达序无关:同一批意图按任意顺序提交,结束路径与结算结果一致;赢家定出后其余意图丢弃——零棋盘效果、零扣费、零事件,且丢弃区别于拒绝。 - 收轮事件序:先报完全部封印判定,再报轮次结束;轮次结束每轮恰一条,停手路径由行动经济直发、本系统不双发。 - 拒绝三源可辨:棋盘面非法、资源不足、相位不对三类原因互异可判定;任何拒绝零副作用。 diff --git a/game/probe/ui_struct_probe.gd b/game/probe/ui_struct_probe.gd index 2b64d816..b217fe37 100644 --- a/game/probe/ui_struct_probe.gd +++ b/game/probe/ui_struct_probe.gd @@ -743,7 +743,7 @@ func _in_scroll(c: Control) -> bool: func _audit(screen: String, roots: Array) -> void: - # 判据出处: design/engineering/architecture/architecture.md「模块归属·呈现层」D1 行(组合根交接面) 组合根交接面与呈现装配——屏结构审计宿主面(结构审计组) + # 判据出处: design/engineering/architecture/architecture.md「三屏壳与组合根」(组合根交接面) 组合根交接面与呈现装配——屏结构审计宿主面(结构审计组) for r in roots: if r != null and is_instance_valid(r): _force_layout(r) diff --git a/game/probe/ui_tune_probe.gd b/game/probe/ui_tune_probe.gd index b19ff1fb..178da270 100644 --- a/game/probe/ui_tune_probe.gd +++ b/game/probe/ui_tune_probe.gd @@ -199,7 +199,7 @@ func _ready() -> void: _overlay_zero_motion_contract(main, problems) # ⑩ 种子三分单点断言(18卡⑦ C1——判定只落 _seed_value() 单点;对局态不影响本判定面): # 显式合法整数全场景优先(含首局)→ 首局(存档布尔 false)恒 42 → 非首局空框引擎熵连抽不全等 42 - # 判据出处: design/engineering/architecture/architecture.md「模块归属·呈现层」D1 行(组合根交接面) seed_value=组合根公开服务面(⑩种子三分判定单点组) + # 判据出处: design/gdd/systems/冒险循环/冒险结构.md「主种子」(组合根交接面) seed_value=组合根公开服务面(⑩种子三分判定单点组) main.ui.modals.menu.debug_overlay.seed_edit.text = "777" if main.seed_value() != 777: problems.append("显式种子输入未优先(_seed_value != 777——C1 ①失守)") diff --git a/game/tests/unit/battle_settlement/effect_port_test.gd b/game/tests/unit/battle_settlement/effect_port_test.gd index 7c967e4b..03a562f7 100644 --- a/game/tests/unit/battle_settlement/effect_port_test.gd +++ b/game/tests/unit/battle_settlement/effect_port_test.gd @@ -19,7 +19,7 @@ var _db func _init() -> void: -# 判据出处: design/engineering/architecture/architecture.md「模块归属·功能层」battle_orchestrator 行(域文件集含 EffectPort) (效果端口宿主——装载组) +# 判据出处: design/gdd/systems/战斗循环/战斗结算.md「扩展行:专长插入的结算效果」 (效果端口宿主——装载组) _db = ConfigDBScript.new() var load_ok: bool = _db.load_tables("res://data/tables", true) Kit.check("前置:表加载零 error", load_ok and _db.diagnostics_count("error") == 0) @@ -54,7 +54,7 @@ func _hero_attack_value(rows: Array) -> int: # ---- V1 端口单实例与真实发射路由 ---- func _smoke_effect_port_wiring() -> void: -# 判据出处: design/engineering/architecture/architecture.md「模块归属·功能层」battle_orchestrator 行(域文件集含 EffectPort) (端口单实例与六 Callable 路由组) +# 判据出处: design/gdd/systems/战斗循环/战斗结算.md「扩展行:专长插入的结算效果」 (端口单实例与六 Callable 路由组) print("--- 效果端口:装配链单实例+真实发射路由 ---") # 充能跑(蓄力周转 charge_rotation 在册——attack_commit 订阅行 attack_bonus per 蓄力周转计数器) var orch_c = _orch(TEST_SEED) @@ -88,7 +88,7 @@ func _smoke_effect_port_wiring() -> void: # ---- V2 业务类零引擎直连(源码契约锚——theme_projection_test 源码锚惯例)---- func _test_business_classes_engine_free() -> void: -# 判据出处: design/engineering/architecture/architecture.md「模块归属·功能层」battle_orchestrator 行(域文件集含 EffectPort) (业务类零引擎直连组) +# 判据出处: design/gdd/术语表.md「效果端口件」 (业务类零引擎直连组) print("--- 效果端口:业务类零引擎直连源码锚 ---") for path in ["res://core/damage_controller.gd", "res://core/action_economy.gd"]: var src := FileAccess.get_file_as_string(path) @@ -100,7 +100,7 @@ func _test_business_classes_engine_free() -> void: # ---- V3 伤害域事实面闭集(合成行两对照——damage_taken 真实单据流)---- func _test_biz_fact_face_closed() -> void: -# 判据出处: design/engineering/architecture/architecture.md「模块归属·功能层」battle_orchestrator 行(域文件集含 EffectPort) (闭面四键 biz_fact 组) +# 判据出处: design/gdd/systems/战斗循环/战斗结算.md「扩展行:专长插入的结算效果」 (闭面四键 biz_fact 组) print("--- 效果端口:业务发射事实面闭集 ---") var orch = _orch(TEST_SEED) Kit.check("V3 begin_battle 受理", orch.begin_battle(_enc([]))) diff --git a/game/tests/unit/contracts/system_contracts_test.gd b/game/tests/unit/contracts/system_contracts_test.gd index 22055953..c987c6c9 100644 --- a/game/tests/unit/contracts/system_contracts_test.gd +++ b/game/tests/unit/contracts/system_contracts_test.gd @@ -41,8 +41,8 @@ func _init() -> void: # ---- B1 兑付配方词表:五配方/三目标规则/双结账政策——常量非空且互异(封闭枚举负空间) ---- func _test_damage_controller_vocabularies() -> void: -# 判据出处: design/engineering/architecture/architecture.md「模块归属·基础层」effect_engine 行 (事件/事实/效果类型/算子四词表封闭——契约词表组) -# 判据出处: design/engineering/architecture/architecture.md「模块归属·基础层」effect_engine 行 (事件/事实/效果类型/算子四词表封闭——契约词表组) +# 判据出处: design/gdd/systems/战斗循环/战斗结算.md「伤害单据与伤害控制器」 (事件/事实/效果类型/算子四词表封闭——契约词表组) +# 判据出处: design/gdd/systems/战斗循环/战斗结算.md「伤害单据与伤害控制器」 (事件/事实/效果类型/算子四词表封闭——契约词表组) var kinds: Array = [ DamageControllerScript.KIND_HERO_ATTACK, DamageControllerScript.KIND_ENEMY_SKILL, DamageControllerScript.KIND_BOARD_TYPED, DamageControllerScript.KIND_BOARD_BLAST, @@ -72,8 +72,8 @@ func _test_damage_controller_vocabularies() -> void: # ---- D2↔B1:掷点用途标签 ∈ RngService 封闭词表(EC12——跨系统字面量契约的成员性断言) ---- func _test_rng_tag_closure(db) -> void: -# 判据出处: design/engineering/architecture/architecture.md「模块归属·基础层」RngService 行 (流 scope 封闭词表组) -# 判据出处: design/engineering/architecture/architecture.md「模块归属·基础层」RngService 行 (流 scope 封闭词表组) +# 判据出处: design/gdd/systems/表现与支撑/数据配置.md「统一随机流」 (流 scope 封闭词表组) +# 判据出处: design/gdd/systems/表现与支撑/数据配置.md「统一随机流」 (流 scope 封闭词表组) var stream_label: String = String(db.combat.settlement.damage_roll.armor_roll_stream) Kit.check("settlement.armor_roll_stream ∈ RngService 封闭标签词表(EC12)", RngServiceScript.PURPOSE_TAGS.has(stream_label)) diff --git a/game/tests/unit/core/battle_driver_drive_test.gd b/game/tests/unit/core/battle_driver_drive_test.gd index f101b115..afe78b31 100644 --- a/game/tests/unit/core/battle_driver_drive_test.gd +++ b/game/tests/unit/core/battle_driver_drive_test.gd @@ -55,7 +55,7 @@ func _init() -> void: # ① 缺省两参(真编排器):同种子两跑整轮驱动逐位(确定性自证——动作序列快照经 cell_revealed 事件流) func _smoke_drive_round_contract() -> void: -# 判据出处: design/engineering/architecture/architecture.md「模块归属·功能层」battle_orchestrator 行(域文件集含 EffectPort) (效果端口件:收事件交结算取回命中批——驱动循环契约组) +# 判据出处: design/gdd/术语表.md「效果端口件」 (效果端口件:收事件交结算取回命中批——驱动循环契约组) var db = load("res://core/config_db.gd").new() var load_ok: bool = db.load_tables("res://data/tables", true) and db.diagnostics_count("error") == 0 Kit.check("前置:表加载零 error", load_ok) @@ -81,7 +81,7 @@ func _smoke_drive_round_contract() -> void: # ② provider 形态:策略回调产出 dig/seal_place/refresh 各一——提交与日志回调四元组在案 func _provider_shapes() -> void: -# 判据出处: design/engineering/architecture/architecture.md「模块归属·功能层」battle_orchestrator 行(域文件集含 EffectPort) (端口应答束形状组) +# 判据出处: game/sim/battle_driver.gd「战斗驱动循环单点」 (端口应答束形状组) var st := _StubSettlement.new() var script := [ {"kind": "dig", "cell": Vector2i(1, 1)}, {"kind": "seal", "cell": Vector2i(2, 2)}, {"kind": "refresh"}, {"kind": "stop"} ] var logs: Array = [] @@ -102,7 +102,7 @@ func _provider_shapes() -> void: # ③ max_rejects:策略恒返被拒动作——第 3 拒后停手出环(循环次数=3) func _max_rejects() -> void: -# 判据出处: design/engineering/architecture/architecture.md「模块归属·功能层」battle_orchestrator 行(域文件集含 EffectPort) (拒绝通道组) +# 判据出处: game/sim/battle_driver.gd「战斗驱动循环单点」 (拒绝通道组) var st := _StubSettlement.new() st.minesweeper.accept = false st.minesweeper.reject_cells = {Vector2i(9, 9): true} @@ -122,7 +122,7 @@ func _max_rejects() -> void: # ④ 合步 next:move 后相位变更即断弃 dig(桩 on_submit 钩子把 phase 推离 Active) func _combined_step_next() -> void: -# 判据出处: design/engineering/architecture/architecture.md「模块归属·功能层」battle_orchestrator 行(域文件集含 EffectPort) (合并步进组) +# 判据出处: game/sim/battle_driver.gd「战斗驱动循环单点」 (合并步进组) var st := _StubSettlement.new() st.minesweeper.on_submit = func(action: String) -> void: if action == "move": diff --git a/game/tests/unit/core/curio_refresh_paid_test.gd b/game/tests/unit/core/curio_refresh_paid_test.gd index 0599e6ac..597cf8e6 100644 --- a/game/tests/unit/core/curio_refresh_paid_test.gd +++ b/game/tests/unit/core/curio_refresh_paid_test.gd @@ -8,7 +8,7 @@ const Kit := preload("res://tests/unit/test_kit.gd") func _init() -> void: -# 判据出处: design/engineering/architecture/architecture.md「模块归属·核心层」CurioDeck 行 (CurioDeck:三选一/商店共享池、抽签、cap 库存——刷新付费组) +# 判据出处: design/gdd/systems/跨局循环/秘宝.md「定位与形态」 (CurioDeck:三选一/商店共享池、抽签、cap 库存——刷新付费组) var db = load("res://core/config_db.gd").new() if not db.load_tables("res://data/tables", false): print("[curio_refresh_paid_test] FAIL — 数值表加载失败") diff --git a/game/tests/unit/core/effect_words_t1_test.gd b/game/tests/unit/core/effect_words_t1_test.gd index e736c362..cba1c806 100644 --- a/game/tests/unit/core/effect_words_t1_test.gd +++ b/game/tests/unit/core/effect_words_t1_test.gd @@ -11,7 +11,7 @@ const EffectEngineScript = preload("res://core/effect_engine.gd") func _init() -> void: -# 判据出处: design/engineering/architecture/architecture.md「模块归属·基础层」effect_engine 行 (效果词表封闭——扩签封闭性组) +# 判据出处: design/gdd/systems/冒险循环/奇物.md「扩签登记」 (效果词表封闭——扩签封闭性组) # ① 词表在册断言(扩签面:2 事件+8 事实+7 效果类型+1 算子) Kit.check_quiet(EffectEngineScript.EVENTS.has("dig_stop") and EffectEngineScript.EVENTS.has("battle_won"), "新事件在册:dig_stop/battle_won〔专长批 V1〕") diff --git a/game/tests/unit/core/level_shop_economy_test.gd b/game/tests/unit/core/level_shop_economy_test.gd index a54569ad..9b2576d7 100644 --- a/game/tests/unit/core/level_shop_economy_test.gd +++ b/game/tests/unit/core/level_shop_economy_test.gd @@ -1254,7 +1254,7 @@ func _paths_all_one_shop(nodes: Array) -> bool: # ---- ⑤ 商店共享池(三选一同构/乘法价/跨渠道共账/切边/断点扩键)---- func _smoke_shop_pool() -> void: -# 判据出处: design/engineering/architecture/architecture.md「模块归属·核心层」CurioDeck 行 (商店共享池组) +# 判据出处: design/gdd/systems/冒险循环/冒险结构.md「共享池账本」 (商店共享池组) print("--- 商店共享池(抽3买1全重抽 · 乘法定价 ceil · 池空硬闸 · 切边零入店)---") var autoplay = load("res://sim/level_autoplay.gd") var shelf_kinds: Array = [] diff --git a/game/tests/unit/core/minesweeper_rules_test.gd b/game/tests/unit/core/minesweeper_rules_test.gd index 55f9a740..59947414 100644 --- a/game/tests/unit/core/minesweeper_rules_test.gd +++ b/game/tests/unit/core/minesweeper_rules_test.gd @@ -126,7 +126,7 @@ func _test_reject_out_of_catalog() -> void: # ---- V14 棋盘揭示预览只读口(架构整改——preview_reveal 与实挖揭示集同口径、零状态写入零事件)---- func _test_preview_reveal_readonly() -> void: -# 判据出处: design/engineering/architecture/architecture.md「模块归属·核心层」minesweeper_rules 行 (preview_reveal 只读预览口——零写入零事件组) +# 判据出处: design/gdd/systems/排雷循环/排雷玩法.md「核心规则」 (preview_reveal 只读预览口——零写入零事件组) var events := 0 _rules.cell_revealed.connect(func(_evt): events += 1) # 零发射哨兵(preview 全程不触发揭示事件) # 形态 A:封印在场——preview(未开格) 不越封印且零状态写入 diff --git a/game/tests/unit/core/pool_case_d_test.gd b/game/tests/unit/core/pool_case_d_test.gd index 6b2e014a..8c14cc8c 100644 --- a/game/tests/unit/core/pool_case_d_test.gd +++ b/game/tests/unit/core/pool_case_d_test.gd @@ -9,7 +9,7 @@ const Kit := preload("res://tests/unit/test_kit.gd") func _init() -> void: -# 判据出处: design/engineering/architecture/architecture.md「模块归属·核心层」CurioDeck 行 (池结构案 D:候选抽取与池纪律组) +# 判据出处: design/gdd/systems/冒险循环/奇物.md「池结构与抽取(重设计 v1)」 (池结构案 D:候选抽取与池纪律组) var db = load("res://core/config_db.gd").new() if not db.load_tables("res://data/tables", false): print("[pool_case_d_test] FAIL — 数值表加载失败") @@ -66,7 +66,7 @@ func _tiers_of(cands: Array) -> Array: func check_v7(a, db) -> void: -# 判据出处: design/engineering/architecture/architecture.md「模块归属·核心层」CurioDeck 行 (池案 D V7 组) +# 判据出处: design/gdd/systems/冒险循环/奇物.md「池结构与抽取(重设计 v1)」 (池案 D V7 组) if not a.start_adventure(201): Kit.check_quiet(false, "V7 前置:冒险启动") return @@ -112,7 +112,7 @@ func check_v7(a, db) -> void: func check_v6(b, db) -> void: -# 判据出处: design/engineering/architecture/architecture.md「模块归属·核心层」CurioDeck 行 (池案 D V6 组) +# 判据出处: design/gdd/systems/冒险循环/奇物.md「池结构与抽取(重设计 v1)」 (池案 D V6 组) if not b.start_adventure(202): Kit.check_quiet(false, "V6 前置:冒险启动") return @@ -142,7 +142,7 @@ func check_v6(b, db) -> void: func check_v12(m, db) -> void: -# 判据出处: design/engineering/architecture/architecture.md「模块归属·核心层」CurioDeck 行 (池案 D V12 组) +# 判据出处: design/gdd/systems/冒险循环/奇物.md「池结构与抽取(重设计 v1)」 (池案 D V12 组) if not m.start_adventure(401): Kit.check_quiet(false, "V12 前置:冒险启动") return @@ -161,7 +161,7 @@ func check_v12(m, db) -> void: func check_v8(c, db) -> void: -# 判据出处: design/engineering/architecture/architecture.md「模块归属·核心层」CurioDeck 行 (池案 D V8 组) +# 判据出处: design/gdd/systems/冒险循环/奇物.md「池结构与抽取(重设计 v1)」 (池案 D V8 组) if not c.start_adventure(203): Kit.check_quiet(false, "V8 前置:冒险启动") return diff --git a/game/tests/unit/cross_system_flow_test.gd b/game/tests/unit/cross_system_flow_test.gd index 07c9aa2c..780090fd 100644 --- a/game/tests/unit/cross_system_flow_test.gd +++ b/game/tests/unit/cross_system_flow_test.gd @@ -47,7 +47,7 @@ func _fresh_rng(seed_val: int): # ---- ① RNG 事件日志会话落盘(源 `_initialize` :70,主会话裁决一改判跨系统闭环承载—— # 驱动沿源 :60–70 取号序列自持:master 种子 42 → 前置取号 → new_adventure 开日志会话 → 会话内取号)---- func _rng_event_log_session() -> void: -# 判据出处: design/engineering/architecture/architecture.md「模块归属·基础层」RngService 行 (事件日志落盘会话组) +# 判据出处: design/gdd/systems/表现与支撑/数据配置.md「统一随机流」 (事件日志落盘会话组) var rng = load("res://core/rng_service.gd").new() rng.set_master_seed(42) rng.open_stream("board_gen") diff --git a/game/tests/unit/data_config/forge_table_test.gd b/game/tests/unit/data_config/forge_table_test.gd index 6875947f..0cb38087 100644 --- a/game/tests/unit/data_config/forge_table_test.gd +++ b/game/tests/unit/data_config/forge_table_test.gd @@ -218,7 +218,7 @@ func _test_negative_cases() -> void: # 现行 30;本套件零扩签,钉现行数(将来任何加词即转红提示复核)。 func _test_effect_kinds_closed() -> void: -# 判据出处: design/engineering/architecture/architecture.md「模块归属·基础层」effect_engine 行 事件/事实/效果类型/算子四词表封闭(特效闭集组) +# 判据出处: design/gdd/systems/跨局循环/锻造工坊.md「满级特效扩展位」 事件/事实/效果类型/算子四词表封闭(特效闭集组) Kit.check("效果引擎效果类型闭集 30 种〔锻造工坊批 V11〕", EffectEngineScript.EFFECT_KINDS.size() == 30) Kit.check("效果引擎事件词表在册 21 种(charge_full 位摘名——蓄力层删键批)〔锻造工坊批 V11〕", diff --git a/game/tests/unit/data_config/rng_service_test.gd b/game/tests/unit/data_config/rng_service_test.gd index 96717ead..8f7fd66e 100644 --- a/game/tests/unit/data_config/rng_service_test.gd +++ b/game/tests/unit/data_config/rng_service_test.gd @@ -77,7 +77,7 @@ func _test_stream_draw_determinism() -> void: # 负输入 abs 归一化(警告通道)——|−s| 与 s 同派生 func _test_negative_seed_normalization() -> void: -# 判据出处: design/engineering/architecture/architecture.md「模块归属·基础层」RngService 行 RngService:master_seed 与各流 scope 计数器单点(种子规约组) +# 判据出处: design/gdd/systems/表现与支撑/数据配置.md「统一随机流」 RngService:master_seed 与各流 scope 计数器单点(种子规约组) var pos = _fresh_service() var neg = RngServiceScript.new() neg.set_master_seed(-TEST_SEED) diff --git a/game/tests/unit/data_config/rng_stream_boot_test.gd b/game/tests/unit/data_config/rng_stream_boot_test.gd index 53d22f97..d942dc5b 100644 --- a/game/tests/unit/data_config/rng_stream_boot_test.gd +++ b/game/tests/unit/data_config/rng_stream_boot_test.gd @@ -22,7 +22,7 @@ func _init() -> void: # 单元宿主改由 `_init` 显式调用,断言逐字未动;源 :70 事件日志落盘条经主会话裁决一 # 改判跨系统闭环套件——不随本宿主,见迁移账本转办清单)---- func _smoke_initialize() -> void: -# 判据出处: design/engineering/architecture/architecture.md「模块归属·基础层」RngService 行 RngService autoload:open_stream 有状态门面与启动初始化(启动流组) +# 判据出处: design/gdd/systems/表现与支撑/数据配置.md「统一随机流」 RngService autoload:open_stream 有状态门面与启动初始化(启动流组) print("=== Dungeon Sweeper 垂直切片冒烟 ===") var db = ConfigDBScript.new() var load_ok: bool = db.load_tables("res://data/tables", true) diff --git a/tools/capability_audit.py b/tools/capability_audit.py index 1bd52723..e23acc20 100644 --- a/tools/capability_audit.py +++ b/tools/capability_audit.py @@ -339,7 +339,7 @@ def check_coverage(cov_tables, names): red(README.relative_to(REPO), 1, "覆盖域表", "%s 未在覆盖域表登记" % doc) -CRITERION_RE = re.compile(r"^#\s*判据出处:\s*(\S+?\.md)(?::(\d+)|「([^」]+)」)\s*\S") +CRITERION_RE = re.compile(r"^#\s*判据出处:\s*(\S+?\.(?:md|gd))(?::(\d+)|「([^」]+)」)\s*\S") VERDICT_RE = re.compile(r"(?