并master(迭代56收尾区): 解待办清单头部登记区冲突——保留master侧架构文档收敛第二批条目+本区两条过程发现登记(QQ-12写卡批与架构收敛批先后并入); 融合后核验: 反哺落文九处完好+README:184回表在位+版本行v2.0在位; 凭据: --docs【验收通过】无新增红

This commit is contained in:
DKChan committed 2026-11-09 03:18:05 +08:00
commit 8a5c71eb8f
30 files changed
+292 -176

No files matched your search

+2 -1
View File
@@ -46,7 +46,7 @@ tests/
>
> **维护规则(写卡段维护,实现批禁写本表)**:写需求卡片时当场入表——本批新增能力当场增行(真实入口取自设计文档已定的入口;代表用例=卡内定死的计划测试 `文件:函数`,实现照单落名,名实不符=卡片没写清=停卡退回);受影响存量行(入口/用例名变更)同批更新;能力退役删行。批末收尾只核对表上名字与实际落地一致(改名则回表),不刷任何批次字段(test-conventions §8.3/§8.9)。
>
> **旅程补录方法**:新旅程=加一行,「系统」列写涉及边界;源=architecture「API 边界」表+「数据流」存档/读档路径+各 GDD 登记的 deferral 跨系统用例。
> **旅程补录方法**:新旅程=加一行,「系统」列写涉及边界;源=各系统 GDD「依赖与输出」节+「数据流」存档/读档路径+各 GDD 登记的 deferral 跨系统用例。
**旅程段一:开机与存档**
@@ -204,6 +204,7 @@ tests/
| 状态实例按个体归属:个体隔离/全体授予逐体发/死亡即清/同体合并照旧 | 增益状态 | `StatusContainer.apply_effect()`(个体键)/`purge_owner()` | `system_contracts_test.gd:_test_status_individual_isolation`;`system_contracts_test.gd:_test_status_grant_all_per_unit`;`system_contracts_test.gd:_test_status_death_clears`;`system_contracts_test.gd:_test_status_merge_per_unit` |
| 敌方增益自体落点与乘区池按个体 | 敌人系统×战斗结算×增益状态 | 技能兑付编排链/`DamageController.clamped_pool()` | `round_flow_skill_pool_test.gd:_smoke_enemy_buff_targets_self`;`damage_controller_test.gd:_test_pool_consumption_per_unit`;`damage_controller_test.gd:_test_defender_ac_per_unit`;`battle_narrator_test.gd:_test_snapshot_effects_per_unit` |
| 敌人技能池跨表链接校验 | 数据配置×敌人系统 | `ConfigDbCrossValidator.validate_skill_pool_links()` | `config_db_cross_validator_test.gd:_test_all_links_valid`;`config_db_cross_validator_test.gd:_test_dangling_skill_id`;`config_db_cross_validator_test.gd:_test_cast_side_mismatch` |
| 跨表量级校验 | 数据配置×敌人系统×难度曲线与Boss | `ConfigDbCrossValidator.cross_validate()`/`ConfigDB.load_tables()` | `config_db_cross_validator_test.gd:_test_magnitude_over_limit`(计划——需求卡片「跨表量级护栏批」2026-11-09 锚定);`cross_magnitude_fatal_test.gd:_init`(计划——同卡锚定) |
| 精英行:池继承合并、加载期校验与暂不接线 | 敌人系统×数据配置 | `ConfigDB.load_tables()`/`EnemyTable.validate()`/`EnemyTable.effective_pool()`/`ConfigDbCrossValidator.validate_skill_pool_links()`/`EnemyTable.resolve_rowset()` | `elite_row_test.gd:_test_elite_validation_rejects`;`elite_row_test.gd:_test_effective_pool_merge`;`elite_row_test.gd:_test_base_pool_change_propagates`;`elite_row_test.gd:_test_merged_pool_composition`;`elite_row_test.gd:_test_elite_unreachable_by_encounter`;`elite_row_test.gd:_test_production_goblin_elite` |
**覆盖域表**(`design/gdd/systems/` 逐篇对照——状态三档:已覆盖/部分覆盖/未覆盖;部分与未覆盖行的缺口指待办清单条目,覆盖面提升时同批改本表):
@@ -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([])))
@@ -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))
@@ -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":
@@ -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 — 数值表加载失败")
+1 -1
View File
@@ -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〕")
@@ -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 = []
@@ -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(未开格) 不越封印且零状态写入
+5 -5
View File
@@ -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
+1 -1
View File
@@ -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")
@@ -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〕",
@@ -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)
@@ -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)