修卡(架构审查3.1+3.2整改批·godot-master终审折入): v1.1→v1.2——阻断三处(B10/B11 测试适配面改闭合判据:meta_progression_forge 17触点+feat_vouchers 3处+adventure_feats rebuild 30处全列,削弱申报追加第9条,B12 全卡签名统一参数化泛型 Dictionary[Variant, Variant]/Array[Variant]防S9 R1A/R3,新增红线条款)+建议一处(S11 .uid收口步入T10); 验修19条销号全过+三份grep对账闭合+工程五点三过一风险一缺口已修; 闸PASS
This commit is contained in:
1 parent
a05fd7b8aa
commit
2f43b81ddc
1 file changed
+18
-14
@@ -1,7 +1,7 @@
|
||||
# 需求卡片:架构审查 3.1+3.2 整改批(2026-11-02)
|
||||
|
||||
来源:待办清单「架构审查优化讨论——全库架构审计读数的逐条裁决与整改分批(2026-10-29 登记,来源=审计发现)」条目 3.1+3.2 部分(**唯一事实源**:reports/处置-架构审查3.1+3.2整改-2026-11-02.md 总判据六条+裁决台账+设计方案甲~庚+取证事实 18 处现址表;设计闭合凭据=该处置记录+五份已落文 GDD,worktree 提交 15352170,文档域闸全绿 cb92ab10)。
|
||||
状态:已写卡(v1.1,2026-11-03 成文;v1.1=grilling 对抗复核 9 阻断+10 建议全采纳修订)。改动面:游戏代码+工具代码(sim 面随批,用户裁完整性优先)。
|
||||
状态:已写卡(v1.2,2026-11-03 成文;v1.1=grilling 对抗复核 9 阻断+10 建议全采纳修订;v1.2=终审核 3 阻断+1 建议折入——测试适配面闭合判据+S9 参数化泛型形态)。改动面:游戏代码+工具代码(sim 面随批,用户裁完整性优先)。
|
||||
|
||||
## 1. 目标与完成定义
|
||||
|
||||
@@ -78,6 +78,7 @@
|
||||
- 🔴 **行为零变化面逐位同**:甲/乙/丙/丁/戊/庚六案的现行值迁移(150/1/50/2/0.35/0.5/4/9/3/2/1/80/3/8/2/1.5)与己案的 preview 口径,除己案 auto_player 算子补齐(预期漂移、第 5 节申报)外,全部同种子逐位回归——冒烟与既有测试套零非预期转红;MC 旧锚不重跑(第 5 节)。
|
||||
- 🔴 **Core 零 UI 依赖不破**:minesweeper_rules.preview_reveal 为纯查询口(零状态写入、零事件发射);所有改动件保持 `--headless --script` 可跑通。
|
||||
- 🔴 **fail-fast**:数据校验错误一律致命中止,无软回退;新增校验全落 schema validate()(加载期)。
|
||||
- 🔴 **S9 参数化形态**(终审 B12):本批全部新增/改型注解一律参数化泛型(`Dictionary[Variant, Variant]`/`Array[Variant]`,code-conventions §4.12 现行口径)——裸 `Dictionary`/`Array` 注解=S9 R1A 红;参数禁缺类型(R3,`_init` 豁免除外);db 参鸭子型沿 board_generator.gd:24 先例(sim 面不在 S9 扫描面)。
|
||||
- 🔴 **拆分边界纪律**(结构类卡必填,判据权威=code-conventions §1.1):
|
||||
- 本批收敛类改动两处,逐件职责语句:①`BattleDriver.drive_round` 通用签名——职责语句「单轮挖掘动作循环的唯一实现:按调用方策略取动作、按统一规则提交、按统一口径记日志与拒绝计数」;单一变化原因=驱动循环语义变化;集体身份=战斗驱动循环单点(battle_driver.gd 文件头自陈身份随之更新)。②节点图域校验并单点——职责语句「参数档合法性判定唯一在 LevelGenParams.validate(加载期)+生成器只留可行性判定 _cp_structural(schema 无此判定的生成器职责)」;单一变化原因=参数域变化;集体身份=参数档校验面(schema 域校验+生成器可行性两级各管一段,禁第三份)。
|
||||
- 「过阈值」不构成任何一件的拆分或收拢动机;按纪律拆不出内聚单元 → 停卡呈报走豁免/还债通道,禁硬拆凑绿(写进第 9 节 L3)。
|
||||
@@ -172,15 +173,15 @@ sim 层
|
||||
|
||||
测试件(随逻辑写/改)
|
||||
tests/unit/core/tree_rules_v11_test.gd 【行为 R1】夹具参数化++_test_rule_key_params 检查段
|
||||
tests/unit/core/meta_progression_forge_test.gd 【行为 R1】:312 tree_rules() 适配+:737 键数组注入改字典+:739-740 期望算式改 discount_pct 推导(申报 8)
|
||||
tests/unit/core/feat_vouchers_test.gd 【行为 R1】:168 键数组 → 参数字典
|
||||
tests/unit/core/meta_progression_forge_test.gd 【行为 R1】全文件触点 17 处适配::312 tree_rules()、:322/:330/:340/:342 resume 断言、:608-611 tree_rule_keys() 三行、:632/:644/:661 rebuild 第三参、:695/:725/:755 begin_battle 键数组、:749/:758 encounter 直改、:671/:746 空形态、:737 键数组注入改字典、:739-740 期望算式改 discount_pct 推导(申报 8)
|
||||
tests/unit/core/feat_vouchers_test.gd 【行为 R1】:168 键数组 → 参数字典+:218/:243/:270 空数组 stale → {}
|
||||
tests/unit/battle_settlement/refresh_feats_test.gd 【非行为】tree_rules: [] → {}
|
||||
tests/unit/core/treasure_effects_test.gd 【非行为】:321 tree_rules: [] → {}
|
||||
tests/unit/battle_settlement/round_flow_skill_pool_test.gd 【非行为 R3】[]→{} ×3+:442 排除表 fx_streak_segments 成员删+:423/:448 注释订正
|
||||
tests/unit/battle_settlement/effect_port_test.gd 【非行为】[] → {}
|
||||
tests/unit/battle_settlement/trigger_cond_test.gd 【非行为】[] → {}
|
||||
tests/unit/core/effect_words_t1_test.gd 【非行为】rebuild 第三参 [] → {} ×4(:62/:76/:111/:129)
|
||||
tests/unit/core/adventure_feats_test.gd 【行为 R3】:743 载荷键 overflow 删(断言内容不动)
|
||||
tests/unit/core/adventure_feats_test.gd 【行为 R3】:743 载荷键 overflow 删(断言内容不动)+rebuild 第三参 [] → {} 共 30 处(:592-761 grep 定位逐处)〔形态迁移·申报 9〕
|
||||
tests/unit/core/node_map_generator_test.gd 【行为 R7】+_test_gen_params_table_driven 检查段
|
||||
tests/unit/core/node_map_growth_test.gd 【非行为】手搭夹具补三新键(结构拦截断言不动)
|
||||
tests/unit/core/board_generator_test.gd 【行为 R8】+_test_spawn_edge_from_table 段+:71 公式对账改 spawn_edge²
|
||||
@@ -224,17 +225,18 @@ sim 层
|
||||
- (语义注记:mult_pct=150 与现码 1.5 同值、halve_pct=50 与现码 50 同值、discount_pct=80 与 shop 表 0.8 同值——全部行为零变化)
|
||||
- [ ] meta_tree_table.gd 新增常量与校验——精确签名:
|
||||
- `const RULE_KEY_PARAMS := {"posture_first_strike": {"ap_bonus": [1, 4]}, "posture_bulwark": {"shield": [1, 9]}, "sense_sharp": {"halve_pct": [1, 99], "cap_per_level": [1, 9]}, "sense_guard": {"ap_refund": [1, 4], "cap_per_level": [1, 9]}, "economy_hoard": {"mult_pct": [101, 300]}, "economy_spend": {"discount_pct": [1, 99]}}`(键集与取值域逐字=天赋树.md v0.12 规则键参数表)
|
||||
- 新私有校验段 `_validate_rule_key_params(row, nid) -> Array[Variant]`:effects/effects_a/effects_b 中凡 RULE_KEYS 成员的值,必须是 Dictionary、键集恰等 RULE_KEY_PARAMS[键] 的键集(缺参数/多参数即拒)、每值 int 且在闭域内——违例 message 带「缺参数/多参数/越域」判别词
|
||||
- [ ] effect_engine.gd:`rebuild(feat_ids, item_ids, tree_rules: Dictionary = {})`;`_push_tree_rules(tree_rules: Dictionary)` 逐键调 `_push_tree_rule(rk, params: Dictionary)`;四分支参数化——posture_first_strike `value: int(params["ap_bonus"])`、posture_bulwark `value: int(params["shield"])`、sense_sharp 两行 when `value: int(params["cap_per_level"])`+do `value: int(params["halve_pct"])`、sense_guard 两行 when `value: int(params["cap_per_level"])`+do `value: int(params["ap_refund"])`(economy 两键零合成行不入 match,维持)——效果引擎零字面量
|
||||
- [ ] battle_fx_host.gd:182 `rebuild_subscriptions(feats: Array, attunement: Array, tree_rules: Dictionary) -> void` 第三参类型改(漏改即每次 begin_battle 运行期崩——B1)
|
||||
- [ ] battle_orchestrator.gd:351-353 收 `Dictionary`;:654-656 改 `var hoard: Dictionary = (_facts.encounter.get("tree_rules", {}) as Dictionary).get("economy_hoard", {})` 命中即 `drop = int(round(float(drop) * float(hoard["mult_pct"]) / 100.0))`(直索引缺键即崩=fail-fast,schema 已保证在键);注释「乘数 provisional 150%」改「乘数读规则键参数 mult_pct」
|
||||
- [ ] shop_session.gd:`_rules() -> Dictionary`;`_spend_discounted` 改 `maxi(1, int(floor(float(price) * float(_rules()["economy_spend"]["discount_pct"]) / 100.0)))`(has 判定保留);:50/:56 注释同步
|
||||
- 新私有校验段 `_validate_rule_key_params(row: Dictionary[Variant, Variant], nid: String) -> Array[Variant]`:effects/effects_a/effects_b 中凡 RULE_KEYS 成员的值,必须是 Dictionary、键集恰等 RULE_KEY_PARAMS[键] 的键集(缺参数/多参数即拒)、每值 int 且在闭域内——违例 message 带「缺参数/多参数/越域」判别词
|
||||
- [ ] effect_engine.gd:`rebuild(feat_ids, item_ids, tree_rules: Dictionary[Variant, Variant] = {})`;`_push_tree_rules(tree_rules: Dictionary[Variant, Variant])` 逐键调 `_push_tree_rule(rk: String, params: Dictionary[Variant, Variant])`;四分支参数化——posture_first_strike `value: int(params["ap_bonus"])`、posture_bulwark `value: int(params["shield"])`、sense_sharp 两行 when `value: int(params["cap_per_level"])`+do `value: int(params["halve_pct"])`、sense_guard 两行 when `value: int(params["cap_per_level"])`+do `value: int(params["ap_refund"])`(economy 两键零合成行不入 match,维持)——效果引擎零字面量
|
||||
- [ ] battle_fx_host.gd:182 `rebuild_subscriptions(feats: Array, attunement: Array, tree_rules: Dictionary[Variant, Variant]) -> void` 第三参类型改(漏改即每次 begin_battle 运行期崩——B1)
|
||||
- [ ] battle_orchestrator.gd:351-353 收 `Dictionary[Variant, Variant]`;:654-656 改 `var hoard: Dictionary[Variant, Variant] = (_facts.encounter.get("tree_rules", {}) as Dictionary).get("economy_hoard", {})` 命中即 `drop = int(round(float(drop) * float(hoard["mult_pct"]) / 100.0))`(直索引缺键即崩=fail-fast,schema 已保证在键);注释「乘数 provisional 150%」改「乘数读规则键参数 mult_pct」
|
||||
- [ ] shop_session.gd:`_rules() -> Dictionary[Variant, Variant]`;`_spend_discounted` 改 `maxi(1, int(floor(float(price) * float(_rules()["economy_spend"]["discount_pct"]) / 100.0)))`(has 判定保留);:50/:56 注释同步
|
||||
- [ ] shop_table.gd 删 `spend_discount` 字段+validate :134 域校验;shop.tres 删 :96 行
|
||||
- [ ] adventure_runner.gd:39/:126/:166(守卫 `is Dictionary`)/:361+:39 注释同步(树 rule 键集→键集参数字典);level_runner.gd:94/:664-665(类型换 Dictionary)/:542/:733+:69/:664 注释同步(tree_rules:Array → Dictionary);main.gd:198 改 `meta_ref.tree_rules()`(:185 注释同步)
|
||||
- [ ] meta_progression.gd:388-401:`tree_rule_keys()` 改名 `tree_rules() -> Dictionary`(键=规则键,值=激活侧 effects_* 参数字典原样透传,首遇优先去重语义保持)
|
||||
- [ ] sim 连带:adventure_monte_carlo.gd——db 加载段(:67-70)前移至 feat_profile 构造之前,新增 `static func _tree_rule_dict(db, keys: Array) -> Dictionary`(扫 meta_tree Fork 行 effects_a/b,命中 keys 集的键取其参数字典),三档注入改 `{"mode": "off", "tree_rules": _tree_rule_dict(db, [...])}`;level_autoplay.gd:162-163 透传守卫改 `is Dictionary`(类型适配·非行为——透传语义经 T10 MC 冒烟确认读数核)
|
||||
- [ ] adventure_runner.gd:39/:126/:166(守卫 `is Dictionary`)/:361+:39 注释同步(树 rule 键集→键集参数字典);level_runner.gd:94/:664-665(类型换 `Dictionary[Variant, Variant]`)/:542/:733+:69/:664 注释同步(tree_rules:Array → 参数字典);main.gd:198 改 `meta_ref.tree_rules()`(:185 注释同步)
|
||||
- [ ] meta_progression.gd:388-401:`tree_rule_keys()` 改名 `tree_rules() -> Dictionary[Variant, Variant]`(键=规则键,值=激活侧 effects_* 参数字典原样透传,首遇优先去重语义保持)
|
||||
- [ ] sim 连带:adventure_monte_carlo.gd——db 加载段(:67-70)前移至 feat_profile 构造之前,新增 `static func _tree_rule_dict(db, keys: Array[Variant]) -> Dictionary[Variant, Variant]`(db 参鸭子型沿 board_generator:24 先例——sim 面不在 S9 扫描面;扫 meta_tree Fork 行 effects_a/b,命中 keys 集的键取其参数字典),三档注入改 `{"mode": "off", "tree_rules": _tree_rule_dict(db, [...])}`;level_autoplay.gd:162-163 透传守卫改 `is Dictionary`(类型适配·非行为——透传语义经 T10 MC 冒烟确认读数核)
|
||||
- [ ] 测试适配一(键注入面与消费面四件):meta_progression_forge_test.gd:312 改 `tree_rules()`+:737 `["economy_spend"]` 改 `{"economy_spend": {"discount_pct": 80}}`+:739-740 期望算式 `float(_db.run.shop.spend_discount)` 改 `float(params 字典 discount_pct) / 100.0` 推导(申报 8——断言强度不减,折后价逐位同值);feat_vouchers_test.gd:168 改 `{"sense_guard": {"ap_refund": 1, "cap_per_level": 2}}`;tree_rules_v11_test.gd 夹具从参数字典构造期望合成行+rebuild 第三参传字典
|
||||
- [ ] 测试适配二(空形态与 rebuild 第三参面 11 处):refresh_feats_test.gd:65/round_flow_skill_pool_test.gd:997/1016/1055/effect_port_test.gd:36/trigger_cond_test.gd:116/treasure_effects_test.gd:321/effect_words_t1_test.gd:62/76/111/129 的 `tree_rules` 空数组或 rebuild 第三参改空字典 `{}`
|
||||
- [ ] 测试适配三(闭合判据=按文件 grep 全量触点,B10/B11):meta_progression_forge_test.gd 全文件 `tree_rules|tree_rule_keys` 触点 17 处(:312/:322/:330/:340/:342/:608/:609/:611/:632/:644/:661/:695/:725/:755/:749/:758/:671/:746/:737 逐一入上两步);adventure_feats_test.gd rebuild 第三参 `[]` → `{}` 共 30 处(:592-761 区间 grep 定位逐处改,断言内容零改动——申报 9);feat_vouchers_test.gd:218/:243/:270 空数组 stale 改 `{}`;收尾核:`grep -c "tree_rule_keys" game/` 全库零命中+`grep -n "tree_rules" game/tests --include="*.gd"` 逐件过目零键数组残留
|
||||
- [ ] tree_rules_v11_test.gd 新增 `_test_rule_key_params` 检查段:六键参数域正例全过/缺参数拒/多参数拒/越域拒/非字典拒;并增检 `_tree_rule_dict(db, ["posture_first_strike"])` 返回 `{"posture_first_strike": {"ap_bonus": 1}}`(R1 对照表落点——sim 注入构造面最小断言,B9)
|
||||
- [ ] 孤立验证新增段 → 出红只跑红件最小单元 → 并入全套(回归措辞:里程碑卡出口跑一次全套闸;卡内修复只做出红最小单元的最窄确认)
|
||||
|
||||
@@ -348,6 +350,7 @@ sim 层
|
||||
- [ ] **实现报告** `reports/iter<N>-实现报告-<日期>.md`:各卡状态+实机目检总清单+遗留读数义务+实现决定记录(代拍板白名单逐条回填)+S13 键改前改后对账表(T0 现场基线 25 件逐件核——baseline 既有登记 2 件照登,第 14 节承诺逐件核)
|
||||
- [ ] **反哺点清单** `reports/iter<N>-反哺点-<日期>.md`:第 6 节同步面表逐条落点(architecture.md 件表行内容、奇物.md cap 句订正、五份 GDD 零反哺确认行、术语零新增确认行)
|
||||
- [ ] 批末核对:game/tests/README.md 能力行与实际落地名实一致(改名则回表);独立验收审计(见第 8 节末)未过不合并
|
||||
- [ ] .uid 收口(终审 S11):`--editor --quit` 一次后确认 4 件新测试件 .uid 已生成随批提交(仓库 .uid 全量入库先例——防合回主区长期 untracked);删除件 experiment_density.gd.uid 确已随 T9 移除
|
||||
|
||||
---
|
||||
|
||||
@@ -391,9 +394,10 @@ T0 0.25–0.5|T1 1–1.5|T2 0.5–0.75|T3 0.5–1|T4 0.5–1|T5 0.75
|
||||
6. node_map_growth_test.gd 手搭夹具补三新键——结构拦截与 fatal 断言零松动(R7)。
|
||||
7. level_shop_economy_test.gd:264 `spend_discount == 0.8` 迁移断言行删除——字段随 R2 退役后无可断言对象;表值迁移断言的历史使命终结,等价判据(折价 80% 行为)由新增 `_test_spend_discount_from_rule_key`〔V2〕承接,验收强度不减(R2)。
|
||||
8. meta_progression_forge_test.gd:739-740 期望值算式 `float(_db.run.shop.spend_discount)` 改经规则键参数 `discount_pct / 100.0` 推导——断言对象从表字段换规则键参数,折后价期望逐位同值,断言强度不减(R1)。
|
||||
以上 8 条均为「随被测改动同步的夹具/引用形态迁移」,无一条删除断言或放宽阈值(第 7 条删的是断言对象已消失的迁移断言,行为判据由同值新断言承接)。
|
||||
9. adventure_feats_test.gd:592-761 rebuild 第三参 `[]` → `{}` 共 30 处+meta_progression_forge_test.gd:632/:644/:661 同款 3 处——typed 形参迁移的形态适配,断言内容与期望值零改动(R1)。
|
||||
以上 9 条均为「随被测改动同步的夹具/引用形态迁移」,无一条删除断言或放宽阈值(第 7 条删的是断言对象已消失的迁移断言,行为判据由同值新断言承接)。
|
||||
|
||||
**独立验收审计**:入口=批末 T10 后、合并前;报告=`reports/iter<N>-验收审计-<日期>.md`;由没参与实现的会话或子代理执行,核对:对照表逐行断言真实存在且在当轮跑批通过、测试削弱申报 6 条之外零删改、第 13 节无效成员零残留、S13 键只降不升对账。未过不合并。
|
||||
**独立验收审计**:入口=批末 T10 后、合并前;报告=`reports/iter<N>-验收审计-<日期>.md`;由没参与实现的会话或子代理执行,核对:对照表逐行断言真实存在且在当轮跑批通过、测试削弱申报 9 条之外零删改、第 13 节无效成员零残留、S13 键只降不升对账。未过不合并。
|
||||
|
||||
## 9. 异常分级
|
||||
|
||||
|
||||
Reference in new issue
Block a user