合并(迭代50·批后收尾): 反馈落文+目检登记+账面换代+产出物退役六件
ci / gates (push) Failing after 31s

This commit is contained in:
DKChan committed 2026-11-03 19:51:29 +08:00
commit 990bdf9fdd
14 files changed
+31 -1135

No files matched your search

@@ -2,8 +2,8 @@
## 文档状态
- 版本:1.31
- 最近更新:2026-11-02(迭代 49 批后收尾随动——轴戊两件与功能层四行换代已建件现状、ui_registry 行三域句柄分域换代;沿革查 git)
- 版本:1.32
- 最近更新:2026-11-03(迭代 50 批后收尾随动——排雷规则件 preview_reveal 只读预览口登记、天赋树 tree_rules 参数字典 API 换代;沿革查 git)
- 引擎:Godot 4.7.2-stable(GDScript 单语言;2026-09-07 锁定)
- 评审模式:solo(`review-mode.txt`,2026-09-12 用户拍板——TD/LP 门禁按 solo 跳过,用户授权架构产出自主推进、迭代期回调)
- 覆盖 GDD:现行全集(根索引=`design/gdd/02-系统清单.md`,文档树构成以根索引为准)
@@ -101,7 +101,7 @@
| 模块 | 独占职责 | 对外暴露 | 消费依赖 | 引擎 API |
|---|---|---|---|---|
| **board_generator**(A1) | 生成算法(五阶段管线)、BoardGenTable 回填、生成期指标集、合法性谓词(clearable / R₀≠S / min_safe)、可推理率度量(metric_version);生成姿态 = MVP 同步生成 + 加载幕(切片实证 10×10/12×12 同步可接受,WorkerThread 留扩展) | `generate(L, D, rng) -> Board`;度量独立入口×3(推理器 / F3 度量 / 合法性谓词——独立纯函数、同一实现) | ConfigDB(BoardGenTable/VariationTable);board_gen 流(一次 open_stream = 一张图);dig_ap_cost 只读 | 无 |
| **minesweeper_rules**(A2) | 棋盘状态(已开集 O / 封印集 G / 小人位)、三事件面、批次仲裁、install 四不变式 | `install_board(board)`;`settle_batch(intents)`(唯一提交入口);查询只读面(current_board / hero_pos / is_revealed / has_seal 等);`compute_move_path(cell)` 只读;`retire_board()`;三源拒绝(board_face / resource_face / phase)+ sub_reason 封闭枚举 | A1 产物(Board class_name 数据契约);A3 try_spend / last_round_end(迭代 41 由属性改方法)/ 相位 | 无(零表读取、零 UI——切片实证) |
| **minesweeper_rules**(A2) | 棋盘状态(已开集 O / 封印集 G / 小人位)、三事件面、批次仲裁、install 四不变式 | `install_board(board)`;`settle_batch(intents)`(唯一提交入口);查询只读面(current_board / hero_pos / is_revealed / has_seal 等);`compute_move_path(cell)` 只读;`preview_reveal(cell)` 只读预览口(零写入零事件——0 格连锁传播闭包;迭代 50 己案建口);`retire_board()`;三源拒绝(board_face / resource_face / phase)+ sub_reason 封闭枚举 | A1 产物(Board class_name 数据契约);A3 try_spend / last_round_end(迭代 41 由属性改方法)/ 相位 | 无(零表读取、零 UI——切片实证) |
| **unit_container**(B2) | hero/enemy 单位实例(hp/atk/实例池:池快照+冷却+摇定动作+保底计数)、行值快照 | spawn / query_alive / rollable_skills / special_skills / check_trigger_unlocks / set_pending_action / pending_action / basic_streak / commit_action / tick_cooldowns / apply_damage / heal / default_target / check_skill_unlocks / despawn_all(2026-09-16 敌人技能池批:query_beat/query_attack/advance 随行为环退役;rollable_skills/special_skills/check_trigger_unlocks 带 facts 参——2026-10-27 情境条件触发器实装,事实缺键=条件假拦下,百分比事实走阈值式折算) | ConfigDB(EnemyTable/SkillTable/HeroTable) | 无 |
| **reward_economy**(B4) | 格面资源身份映射(install 期预分配、Ready 只读、换图映射消亡)、极性路由字典面((类型, 极性)→ 字典行查询;路由执行归 B1 授予段)、F6 当量供给投影;装配期摇号面已拆出掷格件 RewardRoller(2026-11-02 轴戊设计闭合、迭代 49 卡① 建件——roll_board 装配序=守卫→复位→委托→收纳→ready;受理账面留守) | 封闭 API:roll_board / query_identity / query_full_snapshot / grant / grant_clear / retire_mapping / polarity_row / phase(weighted_pick 退役——返行选行算子迁掷格件);另有 is_mapped 静默布尔投影(批量工具用);实测类变量 11 | ConfigDB(RewardTable);BattleFxHost 经注入 Callable `luck_bias_query` 取偏运合计(reward_roll 发射与 bias_rewards 求和移至效果层完成);reward_roll 流(scope = 每次 install 批,取号经掷格件) | 无 |
| **helper_items**(A5,切片已实装秘宝域) | HelperItemTable、探测显影语义 | (契约规范源:`../../gdd/systems/跨局循环/秘宝.md`——桥接位:A2 查询接口 + A4 counter_item_ids) | A2 / A4 / B4 | 无 |
@@ -128,7 +128,7 @@
| **level_runner**(C1-lite,切片已建) | 关卡域生命周期(节点链推进、共享 B4 + HP 携带、关卡末 level_clear) | 节点推进接口;LevelTable(`level.tres`——节点 enum {battle,reward,rest,boss}、末节点必须 Boss、ConfigDB 跨表校验⑧) | B1(直构 BattleOrchestrator 接线战斗)、ConfigDB LevelTable | 无 |
| **run_structure**(C2) | 冒险/关卡序列、失败重开、**master_seed 唯一接线方** | (契约规范源:`../../gdd/systems/冒险循环/冒险结构.md`) | RngService.set_master_seed、C3/D2 | 无 |
| **difficulty**(C3) | DifficultyTable 回填、全部曲线数值调参所有权、战斗期望表(切片 monte_carlo 为工具原型) | 调参输出(经 D2 R1 解析/编排器传递,禁反向调用生成) | ConfigDB、B1 对账输出(调参约束清单)、A1 报告 C | 无 |
| **meta_progression**(C4,Alpha) | MetaTable、钥石账本、天赋树域(MetaTreeTable 12 节点 v0.8——Fork 一节点双态/row 字段退役/RULE_KEYS 六键/彩蛋特化觉醒,迭代 21 T1 换代)+ 同调位槽位判定(树点亮数单源——T4 槽位收编)。**存档内元进度数据读写原语归 MetaStateStore——已落地(迭代 41):本类纯转发读已退役(消费方直连 meta_state),业务规则与写口编排留本类;hero_override 内联锻造加值与树淬炼 flat;并组三组(forge_select(kind,route_id)/hero_type_axes()→{attack,armor}/tree_camp_status()→{rows,fork_groups});补 meta_state 成员装配** | 公开面 20 定稿:buy_treasure_unlock / refresh_treasure_unlocks / treasure_shop_status / forge_buy_level / forge_buy_unlock / forge_select / hero_type_axes / forge_shop_status / settle_adventure / hero_override / tree_can_buy / tree_buy / tree_toggle_fork / tree_buy_fork / tree_rule_keys / tree_camp_status / toggle_attunement / attune_camp_status / attune_refresh_charges / buy_attune_refresh | D3、C2、ConfigDB | 无 |
| **meta_progression**(C4,Alpha) | MetaTable、钥石账本、天赋树域(MetaTreeTable 12 节点 v0.8——Fork 一节点双态/row 字段退役/RULE_KEY_PARAMS 六键参数字典(迭代 50 键值字典化)/彩蛋特化觉醒,迭代 21 T1 换代)+ 同调位槽位判定(树点亮数单源——T4 槽位收编)。**存档内元进度数据读写原语归 MetaStateStore——已落地(迭代 41):本类纯转发读已退役(消费方直连 meta_state),业务规则与写口编排留本类;hero_override 内联锻造加值与树淬炼 flat;并组三组(forge_select(kind,route_id)/hero_type_axes()→{attack,armor}/tree_camp_status()→{rows,fork_groups});补 meta_state 成员装配** | 公开面 20 定稿:buy_treasure_unlock / refresh_treasure_unlocks / treasure_shop_status / forge_buy_level / forge_buy_unlock / forge_select / hero_type_axes / forge_shop_status / settle_adventure / hero_override / tree_can_buy / tree_buy / tree_toggle_fork / tree_buy_fork / tree_rules(返参数字典——迭代 50 R1 换代)/ tree_camp_status / toggle_attunement / attune_camp_status / attune_refresh_charges / buy_attune_refresh | D3、C2、ConfigDB | 无 |
### 战斗域装配现状(迭代 27——2026-10-17 用户裁写入;RunLedger 段已随迭代 39 拆件批退役,四账去向见下「冒险域拆分(现状登记)」节)
+2 -2
View File
@@ -11,7 +11,7 @@
>
> **兑付频率(先看这条,它是三条渠道的共同前提)**:奇物**不是打一场战斗给一份**。关内的普通战斗节点打完了什么也不给;一关之内奇物**只兑付一次**,触发点是**关底 Boss 被击败**——而按 [冒险结构](冒险结构.md) 的定义,打掉关底 Boss 恰好就等于"通过这一关",这两件事是同一个时刻,不是一条链上的两步。
>
> 状态:**已实现**(2026-10-04 双层 BD 实施批落地);现行为 v1.4。本文件是奇物的唯一定义文档。
> 状态:**已实现**(2026-10-04 双层 BD 实施批落地);现行为 v1.5。本文件是奇物的唯一定义文档。
>
> 数值纪律:本文件只写概念、取值域与指路;每件给多少、效果是什么一律不进正文,事实源是 `data/tables/feats.tres` 与 `data/tables/adventure.tres`。
@@ -164,7 +164,7 @@
> 令牌牌库(奖励节点与商店共用)的组织与三选一抽取规则(2026-10-07 用户裁案D——归档打底做翼 + 曝光槽)。
- **令牌=出现次数上限**:每个成员在牌库里有 N 张令牌——拿了消耗、**没拿回池**(刷新重抽同样不消耗),所以「最多被拿 N 次」= 池里放 N 张,天然成立,不另设计数器;「只刷出、没拿」不计次数(现行 TP0 语义沿用)。
- **概率与上限解耦**(设计约束,新内容必检):每个成员标注**两个独立属性**——概率位(档+权重/令牌数)与已拿上限(cap;拿了才计、刷出不计)。概率不决定上限、上限不影响概率。
- **概率与上限解耦**(设计约束,新内容必检):每个成员标注**两个独立属性**——概率位(档+权重/令牌数)与已拿上限(cap;拿了才计、刷出不计。cap 必填——成员行缺 cap 声明=数据错误、拒绝加载,取值域 [1,99];2026-11-02 用户裁「不要任何缺省值」总判据)。概率不决定上限、上限不影响概率。
- **已知耦合问题(实装批选型注意)**:现行令牌模型里「N 张令牌」同时承担概率与上限两个职责,无法独立设定(例:档概率需 3 张 vs 单件限拿 2 次——3 张压不住上限、2 张保不住概率)。实现路径候选三案:①抽象权重表+独立已拿计数器(解耦彻底;代价=推翻 TP0 实体牌库模型、「池耗即上限」语义改写)②令牌池+提前退役计数器(保留模型;代价=名义概率与有效概率两层、对账复杂化)③维持耦合(设计自我设限——用户已否)。选型归实装批;影响面=MC 对账模型与断点存档(已拿计数器须进断点附随件)。
- **内容归档(打底+做翼)**:普通档=属性件+小额钱(每拿都有底的面粉);优秀/稀有档=功能凭证与改手感件(期待位);传说档=惊喜位。归档按决策影响力、不按数值大小;面值数值归调参批。
- **曝光槽**:每次三选一呈现 = **2 格按全池抽 + 1 格按「优秀档以上」子池抽**;高档子池空 → 该格回退按全池抽(池空直通同族兜底)。格数与档配比归调参批。
@@ -1,7 +1,7 @@
# 增益状态
> 一句话:增益/减益的状态池、叠层与衰减
> 状态:已定稿(自旧体系迁移);现行为 v1.5
> 状态:已定稿(自旧体系迁移);现行为 v1.6
## 设计目的
@@ -112,7 +112,6 @@
| 合并匹配认个体 | 同名状态只在同一个体名下按合并策略结算;不同个体同名实例互不相干、互不可见 |
| 个体死亡即清 | 个体死亡,其名下实例全部随体移除,不转移、不并回别处 |
| 呈现各读各的 | 每只立绘的状态图标行只读它自己名下的实例;结算明细行归因照旧,单体授予写明目标是哪一只 |
| 实装随该批 | 本节为定稿口径;实装随敌方状态个体化实装批进游戏——合入前行为仍为旧共享态(对敌效果全体一条实例) |
举证:本节为结构规则与语义裁定,无计算。
+1 -1
View File
@@ -208,7 +208,7 @@ tests/
| 表现与支撑 | 存档序列化.md | 存档写盘⇄读回往返保真;三槽位隔离与激活失败回滚;槽位摘要窥视与坏槽三态;启动态无激活不写盘;旧档迁移链与断点续玩零跳号(集成);存档⇄RNG 快照往返保真(集成) | 已覆盖 | — |
| 表现与支撑 | 教学引导.md | — | 未覆盖 | 教学形态与首遇时机待设计;见待办清单「教学形态未定」条 |
| 表现与支撑 | 数据配置.md | 全表装载、就绪态与表清单目录对账;进度坐标查行:精确命中/向上取整/封顶/警告去重;运行期越域致命与进程非 0 退出;加载期违规表拒绝:跨表悬空/计数器前缀/真视窄域;表结构守卫:域校验/行序键/跨字段互锁/配额锚 | 已覆盖 | — |
| 表现与支撑 | 设置与本地化.md | 减动效开关存储契约(持久化回读/缺省值/引擎动效档应用) | 部分覆盖 | 存储契约断言由「断言补齐批」承接;多语言切换面未建(P1);见待办清单「能力清单覆盖缺口补齐」条 |
| 表现与支撑 | 设置与本地化.md | 减动效开关存储契约(持久化回读/缺省值/引擎动效档应用) | 已覆盖 | 存储契约三断言已落地(迭代 50 断言补齐批);多语言切换面未建(P1,归设置与本地化待设计问题清单) |
| 表现与支撑 | 音频.md | — | 未覆盖 | MVP 无音频(P1 后置,无断言面);见待办清单「能力清单覆盖缺口补齐」条 |
| 跨局循环 | 元进度.md | 元进度入账与锻造两轴 | 已覆盖 | — |
| 跨局循环 | 天赋树.md | 天赋树购买与六键合成 | 已覆盖 | — |
-28
View File
@@ -1,28 +0,0 @@
# 迭代 50 反哺点清单(2026-11-03)
> 实现批禁写 design/ 与根规则文件——以下各条待用户裁决后由文档批落文,落文后本清单条目由用户在会话里清掉。
## 甲、design/ 文档落文义务
| # | 文档 | 落点 | 内容 | 依据 |
|---|---|---|---|---|
| 1 | design/gdd/systems/战斗循环/增益状态.md v1.5 | 〈目标规则与个体归属〉节「实装随该批」规矩行 | 删除该行(个体化已实装——合入前行为仍为旧共享态的注记过时) | 卡①关联同步面 |
| 2 | design/engineering/architecture/architecture.md | 件表/API 面 | ①新增 `MinesweeperRules.preview_reveal` 公开只读口(core 公开 API 净增 1);②戊案 `SPAWN_AREA_CELLS` 常量退役(如有登记);③庚案 battle_driver.drive_round 通用签名(act_provider/on_action/max_rejects);④R1 `MetaProgression.tree_rule_keys()` 改名 `tree_rules()` 返参数字典;⑤R1 shop.spend_discount 表字段退役(折价读规则键参数) | 卡③第 6 节同步面 |
| 3 | design/gdd/systems/冒险循环/奇物.md | cap 字段清单行(若有「可缺省/缺省按 1」类句) | 订正为「cap 必填(缺行加载致命),域 [1,99]」 | 卡③丁③(处置记录明示随卡申报反哺) |
| 4 | design/gdd/systems/跨局循环/天赋树.md v0.12 | — | 零反哺确认行(规则键参数表已是本批字段权威,实现与表逐字一致) | 卡③第 6 节 |
| 5 | design/gdd/systems/冒险循环/关卡节点图生成.md v1.4 | — | 零反哺确认行(三参数调参表行已落,实现照落;唯一注记=节点 depth 字段=最长路径深、区域序号可观测形态=d0−r——如需可入该文档注记) | 卡③第 6 节 |
| 6 | design/gdd/systems/冒险循环/冒险结构.md v1.4 | — | 零反哺确认行(货架位数行已落) | 卡③第 6 节 |
| 7 | design/gdd/systems/排雷循环/地形变异.md v1.2 | — | 零反哺确认行(pack_min 行已落;注记=per_level_bonus 现行表值 0 在域 [0,9] 内合法) | 卡③第 6 节 |
| 8 | design/gdd/systems/排雷循环/棋盘生成.md v1.2 | — | 零反哺确认行(出生区边长行已落) | 卡③第 6 节 |
| 9 | 术语表 | — | 零新增术语确认行(沿用处置记录既定用词:参数字典/只读口/驱动循环单点/个体归属) | 卡③第 6 节 |
## 乙、game/tests/README.md(能力清单/覆盖域表)
| # | 落点 | 内容 |
|---|---|---|
| 10 | 覆盖域表 :211「减动效开关存储契约」行 | 状态列「部分覆盖」→「已覆盖」(存储契约三断言〔断言补齐批 V6-V8〕落地;多语言切换面仍 P1 未建)——实现批禁写,归文档批翻转 |
## 丙、过程注记(不落文,查实现报告)
- 卡①现状考证五处行号/路径漂移、卡③取证表漂移与两处卡面-实况偏差(R8 注入通道/R10 观测面)、R1 结构还债——全数记入 `reports/iter50-实现报告-2026-11-03.md` 第六节实现决定记录 #1-#9。
- MC 锚漂移预期与重跑义务见实现报告第八节(一档只能由用户发起)。
-114
View File
@@ -1,114 +0,0 @@
# 迭代 50 实现报告(2026-11-03)
> 三卡合批:①敌方状态个体化批 ②断言补齐批 ③架构审查 3.1+3.2 整改批。工作区 `../g-plan2-iter50`(分支 iter50,基点 6261b36e)。全部验收断言当轮真实跑批执行并通过;单元套 77 套件全绿(含 2 负面件);冒烟 15 项 0 失败;gdstyle 0 新增 0 恶化。
## 一、各卡状态
| 卡 | T 段 | 状态 | 关键提交 |
|---|---|---|---|
| 卡①敌方状态个体化 | T0/T1/T2 全收口 | 完成(V1-V8 落地) | 8d535b6f / 58c5294b / 93f25fcb |
| 卡②断言补齐 | T0-T3 全落地(T4 产出物并入本报告) | 完成(V1-V16 落地) | 卡B 提交(73 套件绿节点) |
| 卡③架构审查整改 | T0-T10 全收口 | 完成(乙丙戊丁甲/A类①/庚己/组C组D 全落) | T0→T10 逐卡提交 |
## 二、卡①实际对照表(改动—验收,全绿)
| 需求点 | 改动 | 验收测试(尾缀〔个体化批 Vn〕) | 层级 | 真实入口 | 判据绑定面 | 结果 |
|---|---|---|---|---|---|---|
| 实例按个体归属 | status_container.gd 桶键换代(owner_key_for/OWNER_HERO 单点,敌人="e<生成序>"沿 handle_id) | system_contracts_test.gd:`_test_status_individual_isolation`〔V1〕 | 单元 | StatusContainer.apply_effect()/query_active() | 各体投影读数互不影响+owner_key 出户 | 绿 |
| 全体授予逐体发 | reward_grant.gd `_apply_percent_row` 循环存活敌逐只发 | system_contracts_test.gd:`_test_status_grant_all_per_unit`〔V2〕 | 单元 | 容器 apply_effect(授予路径同构模拟)+reward_grant 循环经 V5/回归承载 | 逐体实例数与各自衰减 | 绿 |
| 个体死亡即清 | damage_controller `_on_unit_died`→`purge_owner` | system_contracts_test.gd:`_test_status_death_clears`〔V3〕 | 单元 | apply_effect+purge_owner() | 死体桶清零、他体不变、侧汇总只含存活 | 绿 |
| 同体合并照旧 | 合并臂 hit 提取(累加/叠加同体内) | system_contracts_test.gd:`_test_status_merge_per_unit`〔V4〕 | 单元 | apply_effect() | 累加时长倍增/满层恰拒/异体受理 | 绿 |
| 增益技归施放者自己 | combat_segment 落点=owner_key_for(u)(debuff→主角) | round_flow_skill_pool_test.gd:`_smoke_enemy_buff_targets_self`〔V5〕 | 单元 | 战斗结算编排链(技能施放——begin_battle+settle_batch 推进) | 施放者 output 池=empower 幅度、他敌恒 0(种子扫描恰一次 cast=charge) | 绿 |
| 乘区池按个体 | damage_controller.clamped_pool 带 owner_key(:375 hero攻击打target/:478 敌技source_unit) | damage_controller_test.gd:`_test_pool_consumption_per_unit`〔V6〕 | 单元 | DamageController 兑付(clamped_pool 公有算术面) | e1 池含 weaken 值、e2 恒 0 | 绿 |
| AC 合流按个体 | defender_ac 敌分支只读被打者名下 ac 型 | damage_controller_test.gd:`_test_defender_ac_per_unit`〔V7〕 | 单元 | defender_ac() | e1=基数+alert、e2=自身基数 | 绿 |
| 呈现各读各的 | presentation_snapshot enemies[].effects 逐卡读自己桶(删同引用)+standee_body 注释换代 | battle_narrator_test.gd:`_test_snapshot_effects_per_unit`〔V8〕 | 单元 | presentation_snapshot()(真编排器) | A 卡现削弱、B 卡无同款 | 绿 |
| 申报换代两件 | armor_roll V1-V3 重写(个体键 "e1" 读数,累加/覆盖/同轮语义保留);衰减相位断言 :413-421/:449 核对=decay 行相位与桶结构无关,零改动即等价换代 | roll_multiplier_test〔状态累加 V1/V2/V3〕+round_flow 衰减段 | 单元 | 原真实入口 | 原判据个体化 | 绿 |
主角侧回归:attack_up/ac_up 全套既有断言绿(roll_multiplier 42 checks)+冒烟 15 项 0 失败。
## 三、卡②实际对照表(全绿,尾缀〔断言补齐批 Vn〕)
| 需求点 | 验收测试 | 结果 |
|---|---|---|
| ①衰减逐值/到期移除/战斗结束全清 | system_contracts_test:`_test_status_decay_and_clear`〔V1/V2〕(notify_battle_end 全测试目录首次落断言) | 绿 |
| ①满层拒绝 | `_test_status_stack_full_reject`〔V3〕 | 绿 |
| ①独立并存+首授快照 | `_test_status_independent_branch`〔V4,试验行注入测毕还原〕/`_test_status_snapshot_first_grant`〔V5〕 | 绿 |
| ②存储回读/缺省/应用链 | settings_store_test.gd(新件)三函数〔V6/V7/V8〕——_init path 注入隔离,禁碰真实 user://settings.cfg | 绿 |
| ⑤每区域恰一 Boss 终点 | node_map_generator_test:`_test_boss_exit_per_region`〔V9〕——节点 depth=最长路径深(生成器校验轴),区域序号可观测形态=d0−r(区域段 L−r 的 1 步差) | 绿 |
| ⑤Boss 节点开战必选 Boss 行集 | boss_gate_test.gd(新件)`_test_boss_node_spawns_boss_rowset`〔V10〕——行类路由+begin_battle 端到端(实例化敌人全部出自 boss 行集) | 绿 |
| ⑥全路线价格梯+多级购买 | forge_table_test:`_test_price_ladder`(扩)〔V11〕——floor 公式表值推算六路线逐级严格递增;meta_progression_forge_test 长剑链至 3 级〔V12〕 | 绿 |
| ⑥拒购零副作用 | `_test_forge_buy_reject`〔V13〕 | 绿 |
| ⑥祝福件零泄漏 | `_test_blessing_no_forge_leak`〔V14,LevelRunner 真实装配链 buy_product〕 | 绿 |
| ⑥默认值解耦+甲型双轴 | `_test_default_axes_pre_key`〔V15〕/`_test_armor_switch_dual_axes`〔V16——切回后新 runner 读新选中(快照冻结契约)〕 | 绿 |
注:卡② T3-2 卡面写「扩展 `_meta_pricing_and_buy`」,实况长剑购买链在 `_smoke_forge_axes`(:411-420 考证即该函数)——V12 落该函数购买链段(主题归属正确),函数名指认漂移记实现决定记录 #1。
## 四、卡③实际对照表(R1-R15 全绿,尾缀〔架构整改 Vn〕)
| R | 改动 | 验收测试 | 结果 |
|---|---|---|---|
| R1 六键参数字典 | meta_tree.tres 三 Fork 行参数字典+RULE_KEY_PARAMS 域表+四形态校验;effect_engine 四分支全读参零字面量;battle_fx_host/orchestrator/shop_session/meta_progression(tree_rules())/adventure_runner/level_runner/main 全链 Dictionary 换代;sim _tree_rule_dict 注入单点+透传守卫 | tree_rules_v11_test:`_test_rule_key_params`(六键域正反例+_tree_rule_dict 最小断言)+既有六键行为段回归 | 绿 |
| R2 散折价收回 | shop.spend_discount 字段与域校验退役;_spend_discounted 读 discount_pct/100 | level_shop_economy_test:`_test_spend_discount_from_rule_key`〔V2〕+迁移断言删(申报 7) | 绿 |
| R3 死通道退役 | EFFECT_KINDS 摘两名(34→32);_kill_effects 改名 overflow 分支删;attack_segments 消费段删 | effect_kind_retired_test(新负面件)双探针加载致命〔V3〕+round_flow 段内序回归 | 绿 |
| R4 文案读表 | main.gd 两 toast 插值读 rap_refresh_cost/refresh_cap_per_round | player_copy_sweep_test:`_sweep_refresh_toast_no_literals`〔V4〕静态+目检局限注记 | 绿 |
| R5 必填注入 | playtest_logger 删默认+守卫 [1,32];action_economy_table 删 schema 默认;level_autoplay 注入序前置×2 | playtest_logger_guard_test(新件)〔V5〕 | 绿 |
| R6 clamp 读单点 | resolver 读 MULT_MIN/MULT_MAX;失实「GDD Edge Case」注释订正两处 | config_db_resolver_test 回归(值逐位同) | 绿 |
| R7 节点图参数入表+域并单点 | ROW_KEYS+三键+域校验;_cp_domain 整函数退役;MAX_WIDTH 删(三处消费全读表——:274 宽度校验为卡面漏列同款消费,记 #2) | node_map_generator_test:`_test_gen_params_table_driven`〔V6〕+table_structure_guard:`_test_level_gen_new_fields`〔V7〕 | 绿 |
| R8 出生区入表 | spawn_edge 表头零哨兵+[3,5]奇数域;board_data 常量退役+几何导出;board_generator edge² 公式+剃雷域导出;calibrate 一行透传 | board_generator_test:`_test_spawn_edge_from_table`〔V8〕+board_gen_reward_test 推导换代(cap 压线 9 语义不减) | 绿 |
| R9 货架位数入表 | shelf_size 零哨兵+[1,6];shop_session 读表 | level_shop_economy_test:`_test_shelf_size_from_table`〔V9,夹具=5 货架五件〕 | 绿 |
| R10 成包下界入表+表头域校验 | pack_min 零哨兵+三域校验单点;board_installer 下界读表 | variant_placement_test:`_test_pack_min_from_table`〔V10——观测面局限申报见六-#4〕+table_structure_guard:`_test_variation_header_domains`〔V11〕 | 绿 |
| R11 feat cap 必填 | 缺 cap 拒+域 [1,99];feats.tres 37 行全 cap(加载零诊断);curio_deck 死变量删+悬空报错 | table_structure_guard:`_test_feat_cap_required`〔V12〕 | 绿 |
| R12 驱动循环收敛 | battle_driver 通用签名(缺省两参逐位);level_autoplay 内层委托+抄本删除 | battle_driver_drive_test(新件)`_smoke_drive_round_contract`〔V13——缺省确定性/provider 三形态/max_rejects/合步〕 | 绿 |
| R13 档位排序读表 | _pick_token 改读 TIER_RANK(未知档 0 同语义) | adventure_feats 316-f 既有断言回归+静态(源零 rank 字面量——match 表删实核) | 绿 |
| R14 只读预览口 | preview_reveal 只读口(零写入零事件) | minesweeper_rules_test:`_test_preview_reveal_readonly`〔V14——封印两形态零写入+实挖差集 F2 同口径〕 | 绿 |
| R15 0 格连锁算子 | _deduce 补算子经 preview_reveal 真实闭包 | auto_player_deduce_test(新件)〔V15——远端 safe 形态格+零盲挖〕 | 绿 |
零行为改动面(不设对照表行):组 D(experiment_density 删除+引用面清理——全库 grep 零命中,board_gen.tres 出处指针合法);组 C(damage_probe 零改动——run_all/闸脚本零引用+头注「诊断工具·非验收件」在位)。证据=T9/T10 步骤读数(本报告第五节)。
## 五、S13 对账与基线读数
- **改前底账**(T0 grep):overflow(damage_controller :361/:396/:402/:403/:407/:411-414+effect_engine :29/:464+adventure_feats_test :743)、attack_segments(effect_engine :29+combat_segment :62/:65)、fx_streak_segments(combat_segment :66+round_flow :443)、experiment_density(README :53+board_generator :23+board_gen.tres :414)。
- **冒烟基线**:15 项 0 失败(T0 起点;终态同绿)。
- **S13 对账**:现场读数(T0)→逐卡改后核对——终态 `gdstyle_gate: ok`(0 新增 0 恶化);途中三条新红(apply_effect 参数/返回/嵌套+presentation_snapshot 函数长)与两条(_validate_rule_key_params 嵌套/feat_table.validate 分支)全部就地拆段还债(单出口化+hit 提取+私有 helper 四件),无基线改动。
- **T0 复核**:取证表 18 处现址——子代理 10 处+本会话补核 #7/#16 全部一致;漂移处(fx_apply_status :451→:427、_kill_overflow 体至 :418、combat_segment :63、卡② V12 函数名、卡③ #16 _cp_domain :76 起)按 L2 备案(第五节决定记录)。
## 六、实现决定记录(代拍板白名单外备案)
1. **卡② V12 函数名指认漂移**:卡面写扩展 `_meta_pricing_and_buy`,实况长剑购买链在 `_smoke_forge_axes`(考证 :411-420 即该段)——V12 落购买链段;`_meta_pricing_and_buy` 是树购买面与锻造无关。覆盖实质不受损。
2. **卡③ R8 MAX_WIDTH 第三消费点**:卡面列 :382 一处,实况 :274(_vo_width_rules 校验段)与 :383 两处同引——同需求点同款读表换代一并落(常量删除的编译级连带)。
3. **卡③ R8 spawn_edge 注入通道**:卡面「resolve 注入保证在场」与实况不符(resolve_board_gen 返回行字典不含表头)——改 generate 内 `db.combat.board_gen.spawn_edge` 直索引(fail-fast 同语义),FakeDB/_StubBoardGen 两桩补表头成员(夹具形态迁移)。
4. **卡③ R10 pack_min 观测面局限申报**(test-conventions §8.4):pack_min 消费面=randi_range 下界(软目标——8 邻贴接禁令下生长早停为合法态〔board_installer 注释明示〕,L2 候选池碎片化使「产物零 <min 片」全称不可断)。可达判据=①静态(布置面零字面量下界)+②同种子改值产物互异(真实入口 begin_battle 布置段,种子扫描)——对照表该行判据绑定面照此申报。
5. **卡③ R1 apply_effect/rebuild 结构还债**:T1 后 gdstyle 三条新红(apply_effect 参数/返回/嵌套)——单出口化+hit 提取+守卫/主路径拆分(_apply_open),三臂私有函数删除(无别名无转发壳)。
6. **卡③ T7 落名修正**:battle_driver_drive_test 四段重组为卡面定名 `_smoke_drive_round_contract` 承载;playtest_logger_guard `_smoke_required_injection` 同步(README 代表用例名实对齐)。
7. **签名连带适配**(断言内容零改动,编译级):seal_polarity :751 侧汇总、system_contracts/damage_controller/roll_multiplier 的 owner_key 显式化、_hero_attack_row_with 按行 target_side 路由、refresh_feats 两试验行补 cap、cross_system_flow logger 注入 ap_per_round=8。
8. **卡① V5 种子扫描**:L1D0 单 goblin 常被先手秒杀(死亡即不动手)——改 L1D3(hobgoblin 2-3 只)多轮扫描恰一次 cast=charge。
9. **卡① 明细行 pool_value**:个体化后 `_pool_effective(effect_id, owner_key)` 首目标个体读——全体授予明细行一行(部分满层拒收不逐只留痕——「奖励未生效」行只在全体皆拒时出现,归因照旧口径)。
## 七、实机目检总清单(登记不阻塞)
| # | 项 | 来源 |
|---|---|---|
| ㊾-A | 敌方增益图标各立绘各现各的(个体投影——A 有削弱 B 无) | 卡① |
| ㊾-B | 敌方增益技(蓄力/硬化/护身)只强化施放者自己(不再全体受益) | 卡① |
| ㊾-C | RAP 不足 toast「弃图刷新需 N」显示表值(改 rap_refresh_cost 表值文案随动) | 卡③ R4 |
| ㊾-D | 本轮刷新用尽 toast「每轮 N 次」同上 | 卡③ R4 |
| ㊾-E | 散折价 80% 购买价目检(economy_spend 激活,回归性质) | 卡③ R2 |
## 八、遗留读数义务
1. **MC 锚漂移**(卡③ T8):0 格连锁算子补齐改变模拟玩家行为(perfect/adv 档通关率预期上调、旧 MC 锚失效);重跑归用户按 `sim-data/README.md` MC 采集档位表发起(一档只能由用户发起)。
2. **透传确认读数**(T10):adventure_monte_carlo ab_a 档 N=5 零报错零脚本错误(BATCH perfect 终局计数落盘)——level_autoplay tree_rules 字典透传生效。
3. **MC 旧锚不重跑**(卡③总判据):六案现行值迁移全部同种子逐位回归(冒烟+77 套件),MC 采集端零改动。
## 九、能力清单核对(收尾义务——经审计整改后更新)
`game/tests/README.md` 能力行与实际落地逐行核对:架构整改 10 新行(V1-V15 各行)与 5 改行、断言补齐 5 行(:164 减动效行等)、个体化批新增行——代表用例名与实际落地函数名一致。**首版核对漏检两处名实断裂(V14/V2 函数未落地即报一致),经独立验收审计判缺漏后补齐(见第十节)**;V13/V5 两处实现侧改名对齐见 #6。覆盖域表 :211「减动效开关存储契约」状态列翻转归反哺点清单。
## 十、独立验收审计与整改(2026-11-03)
- **首轮审计判定:不通过**(审计体=未参与实现子代理,报告全文落 `reports/iter50-验收审计-2026-11-03.md`)。缺漏三条:①R14/V14 `_test_preview_reveal_readonly` 从未落地(实现期 patch 脚本漏写落盘调用,minesweeper_rules_test 零触碰——虚假绿记录,根因在实现);②R2/V2 具名承接件 `_test_spend_discount_from_rule_key` 从未落笔(判据由申报 8 改造断言承载但名实断裂);③第九节名实核对结论失实(漏检上述两处)。
- **整改**:①V14 落地 minesweeper_rules_test(挂载+五断言:形态A/B 零状态写入+实挖差集 F2 同口径逐位+preview 前后 cell_revealed 零增量——12→17 checks 绿);②V2 落地 level_shop_economy_test(shop.tres 加载零诊断+字段不在位+折后价 discount_pct 推导逐位+未激活原价对照——192→195 checks 绿);③本节与第九节订正。
- **削弱申报程序缺项补账**:forge_table_test `_test_effect_kinds_closed` 钉数 34→32(审计判「例外——R3 摘名必然连带、强度不减、未按程序申报」)——补记为决定记录 #10。
- **复验**:整改后由同一审计体复验两件落地测试与报告订正,判定见审计报告末节。
**实现决定记录补 #10**:forge_table_test 效果类型闭集钉数断言 34→32——甲案摘名(R3 被测面本身)的必然连带:该断言按其自身注释「钉现行数」必须随词表换代;强度不减(仍捕获任何增删),非削弱。属「随被测改动同步的计数对账」,性质同卡③申报 1-9 各条(夹具/引用形态迁移),未在卡面申报清单内——审计例外判定在案,此处补账。
-176
View File
@@ -1,176 +0,0 @@
> 审计体=未参与实现子代理(test-conventions §8.7 默认通道,迭代 loop 内启动)。两轮:首轮(重塑尖 a2886a53)判**不通过**(缺漏三条)→实现侧整改笔 6cb1cf5e→复验判**通过**。终判=**通过**(遗留一项 L2 记录面订正已随本文件落盘闭合)。
---
# 迭代 50 独立验收审计报告(2026-11-03)
审计体:未参与实现的子代理,只读核对+自跑最窄测试抽查。对象:`D:\code\g-plan2-iter50`(分支 iter50,尖 a2886a53,diff 基点 ab5d75a2)。三卡+实现报告+diff 全量过目;测试抽查 18 件次全部自跑。
## 一、总体判定:不通过
结论行:卡①卡②对照表全部闭合、卡③ 15 行中 13 行闭合,但卡③两行验收测试从未落地——R14 的 V14 断言全仓不存在而实现报告报「绿」,R2 的 V2 具名函数不存在(仅由申报 8 的既有断言改造承载同值判据);按卡③第 8 节末「未过不合并」口径,本批不得合并。
### 缺漏清单
| # | 缺漏 | 依据 |
|---|---|---|
| 1 | **R14/V14 验收测试不存在(重)** | `minesweeper_rules_test.gd:_test_preview_reveal_readonly` 在全仓零命中(git log -S 证实该名只出现在写卡提交 a05fd7b8 的卡片文本里);`git diff ab5d75a2..iter50 -- game/tests/unit/core/minesweeper_rules_test.gd` 为空——该文件本批零触碰(末次改动停在迭代 29 提交 d091c981)。行为面已落地(`core/minesweeper_rules.gd:373` preview_reveal 在码),但对照表声明的判据(零状态写入/与 settle_batch 实挖差集 F2 同口径/封印两形态/cell_revealed 零发射)无任何断言承载;唯一触及 preview_reveal 的测试是 V15(auto_player_deduce_test),只把它当依赖用,不绑只读契约。实现报告第四节 R14 行写「`_test_preview_reveal_readonly`〔V14——封印两形态零写入+实挖差集 F2 同口径〕绿」=**虚假绿记录** |
| 2 | **R2/V2 具名验收函数不存在(中)** | `level_shop_economy_test.gd` 中无 `_test_spend_discount_from_rule_key`(git log -S 同样只命中写卡提交);该文件本批仅新增 V9(货架位)+删迁移断言(申报 7)。等价行为判据实际由 `meta_progression_forge_test.gd` `_smoke_tree_rules` 内既有「散激活:商品购买价 ×80%」断言经申报 8 改造承载(真实入口同为 LevelRunner 装配链→current_price,期望算式已改 discount_pct 推导,本轮实跑绿)——行为覆盖在,但对照表行与 tests/README.md:101 指认的具名载体不存在,尾缀〔架构整改 V2〕全仓测试代码零命中 |
| 3 | **实现报告第九节名实核对结论失实** | 报告称「代表用例名与实际落地函数名一致(V13/V5 两处实现侧改名对齐)」——V2/V14 两处名实断裂未核对出、未呈报;卡③ T10 批末核对义务(「名实一致,改名则回表」)未完成 |
## 二、逐卡对照表逐行核对
### 卡①(敌方状态个体化批)——9 行全部通过
| 行 | 函数存在 | 尾缀可 grep | 真实入口未绕行 | 本轮实跑 |
|---|---|---|---|---|
| V1 个体隔离 | system_contracts_test.gd:138 | 〔个体化批 V1〕×3 | StatusContainer 公开 API(apply_effect/query_active) | 绿(50 checks) |
| V2 全体逐体发 | :159 | ×3 | 容器公开 API(卡面既定入口;reward_grant 循环本体按卡面「同上」由容器同构模拟承载——卡既定设计,非实现绕行,见观察 1) | 绿 |
| V3 死亡即清 | :185 | ×4 | apply_effect+purge_owner+query_active_side 公开面 | 绿 |
| V4 同体合并 | :198 | ×3 | apply_effect 公开面 | 绿 |
| V5 增益技自体落点 | round_flow_skill_pool_test.gd:1097 | ×1 | **真实编排链** begin_battle+settle_batch 推进(无裸 EffectEngine 绕行);种子扫描恰一次 cast=charge | 绿(round_flow 136 checks) |
| V6 乘区池按个体 | damage_controller_test.gd:412 | ×1 | DamageController 公有算术面 clamped_pool+公开 owner_key_for | 绿 |
| V7 AC 按个体 | :431 | ×1 | defender_ac() 公开面 | 绿 |
| V8 呈现各读各的 | battle_narrator_test.gd:108 | ×1 | presentation_snapshot() 公开出户(判据钉两卡投影差;夹具布线经既有直查惯例) | 绿(22 checks) |
| 申报换代两件 | roll_multiplier 重写在 diff 实证("e1" 键读数,累加/覆盖/同轮三断言原样,尾缀〔状态累加 V1/V2/V3〕保留) | ✓ | 原入口 | 绿;衰减相位断言按报告零改动——diff 证实该区零删行,衰减改逐桶后相位断言语义不受影响,等价成立 |
观察 1(不判缺漏):V2 的改动点 reward_grant.gd 循环授予无直接驱动测试,判据由容器侧同构模拟+V5/既有回归承载——这是卡面对照表自己声明的入口设计(「真实入口=同上」),实现照卡落,风险登记为对照表既定弱绑定,不属实现绕行。
### 卡②(断言补齐批)——V1-V16 全部通过
| 行 | 落点实证 | 本轮实跑 |
|---|---|---|
| V1/V2 衰减与全清 | system_contracts_test.gd:220(notify_battle_end 首次落断言,尾缀×7) | 绿 |
| V3 满层拒绝 | :240 | 绿 |
| V4/V5 独立并存/首授快照 | :257/:281(试验行注入测毕还原) | 绿 |
| V6/V7/V8 设置存储 | settings_store_test.gd(新件,manifest 已登记):隔离经构造注入临时 cfg+测毕清理,未碰真实 user://settings.cfg——卡面写 retarget(),实现改 _init 注入,隔离卫生实质达成(白名单级夹具细节,报告第三节已披露) | 绿(6 checks) |
| V9 每区域恰一 Boss 终点 | node_map_generator_test.gd:310,:32 挂入 _init | 绿(43 checks) |
| V10 Boss 行集端到端 | boss_gate_test.gd(新件):行类路由+begin_battle(node_type="boss") 真链,无绕行 | 绿(4 checks) |
| V11 全路线价格梯 | forge_table_test.gd:91(floor 公式表值推算,尾缀+注释在案) | 绿(42 checks) |
| V12 购买链至 3 级 | 落在 `_smoke_forge_axes`(:425-430)——卡面写 `_meta_pricing_and_buy`,实况该函数在 :134 且属树购买面;报告决定记录 #1 已备案指认漂移,判据面(45 档扣款余额递减)不动 | 绿(151 checks) |
| V13 拒购零副作用 | :779 | 绿 |
| V14 祝福件零泄漏 | :793(LevelRunner 真实装配链 buy_product) | 绿 |
| V15/V16 默认轴/甲型双轴 | :811/:819 | 绿 |
### 卡③(架构整改批)——15 行中 13 行通过,R2/R14 缺漏(见第一节)
通过行实证:V1(tree_rules_v11_test.gd:90 `_test_rule_key_params`,六键正反例+`_tree_rule_dict` 最小断言+越域判别词检——本轮绿);V3(effect_kind_retired_test 负面件双探针,真实退出码 1,manifest expect=1 negative=true 在位);V4(player_copy_sweep 两 toast 零字面量,静态判据+目检局限注记照卡);V5(logger 守卫五态);V6/V7(三参数表驱动产物可观测+ROW_KEYS 闭集越域拒);V8(edge=5/3 几何与真路径);V9(货架五件);V10(静态+同种子互异,与决定记录 #4 申报的可达判据逐字一致);V11/V12(表头三域+cap 必填 37 行在场);V13(驱动契约 10 checks:缺省确定性/provider 三形态/max_rejects/合步弃 dig);V15(远端 safe 形态+零盲挖)。R6/R13 静态判据复核:resolver 源读 MULT_MIN/MULT_MAX、_pick_token 源零 rank 字面量(match 表已删,grep 实证)。代码面抽查:EFFECT_KINDS 两名零残留、_kill_effects 改名无转发壳、_cp_domain 整函数退役、MAX_WIDTH 常量删净三消费全读表(决定记录 #2 实证)、spawn_edge 经 generate 直索引(决定记录 #3 实证)、main.gd 两 toast 读表插值(:633/:636 实证)。
V1 尾缀注记(不判红):〔架构整改 V1/V2/V14〕在测试代码内零命中,仅在 tests/README.md 能力行——卡③无卡①②式「尾缀全仓可 grep」红线,能力行即其定位面;但 V14 能力行指向不存在的函数,随缺漏 1 一并判红。
## 三、抽查跑批记录
命令形态:`"D:/code/godot/Godot_v4.7.2-stable_win64_console.exe" --headless --path game --script res://tests/unit/<路径>.gd`(退出码经无管道捕获)。
| 件 | 退出码 | 关键输出 |
|---|---|---|
| contracts/system_contracts_test | 0 | all green (50 checks);「个体隔离:A/B 各持一条〔个体化批 V1〕」「死亡即清:e1 桶清零〔V3〕」「首授快照〔断言补齐批 V5〕」均 PASS |
| battle_settlement/damage_controller_test | 0 | all green (50 checks);「B 敌的削弱不进 A 敌的账〔个体化批 V6〕」「alert 各算各的〔V7〕」PASS |
| battle_settlement/round_flow_skill_pool_test | 0 | all green (136 checks);「敌方增益技自体落点:施放者 output 池=蓄力幅度、他敌恒 0〔个体化批 V5〕」PASS |
| presentation/battle_narrator_test | 0 | all green (22 checks);「A 有削弱 B 无 → 两卡投影各现各的〔个体化批 V8〕」PASS |
| presentation/settings_store_test | 0 | all green (6 checks)(V6/V7/V8) |
| battle_settlement/boss_gate_test | 0 | all green (4 checks)(V10) |
| core/meta_progression_forge_test | 0 | all green (151 checks);「长剑三级购〔断言补齐批 V12〕」「散激活:商品购买价 ×80%」「聚:战斗掉落乘算 ×1.5」PASS |
| data_config/forge_table_test | 0 | all green (42 checks)(V11+闭集 32 钉数) |
| core/node_map_generator_test | 0 | all green (43 checks);「表值驱动:同种子产图逐位复现〔架构整改 V6〕」等 PASS |
| data_config/table_structure_guard_test | 0 | all green (79 checks);「V7 表值行全过(35/50/4)」等 PASS |
| core/level_shop_economy_test | 0 | all green (192 checks);「夹具 shelf_size=5 → 货架五件〔架构整改 V9〕」PASS |
| battle_settlement/variant_placement_test | 0 | all green (51 checks);V10 静态+互异两判据 PASS |
| core/board_generator_test | 0 | all green (16 checks);「V8 几何:edge=3 → spawn_cells 9 格(与退役常量同值——逐位回归)」PASS |
| presentation/player_copy_sweep_test | 0 | all green (25 checks);两 toast 零字面量 PASS |
| core/minesweeper_rules_test | 0 | all green (12 checks)——**12 项全为旧集,零 preview 断言执行**(缺漏 1 的运行时实证) |
| core/battle_driver_drive_test | 0 | all green (10 checks);「缺省两参:真编排器同种子两跑事件流逐位〔架构整改 V13〕」等 PASS |
| core/auto_player_deduce_test | 0 | all green (4 checks);「远端格入 safe 集(桥接 0 区域传播)〔架构整改 V15〕」PASS |
| data_config/effect_kind_retired_test | **1**(负面件,符合 expect=1) | 「双探针均正确拒绝(甲案词表退役)〔架构整改 V3〕」 |
| core/playtest_logger_guard_test | 0 | all green (5 checks);未注入空串/零文件、注入 8 放行、越域 33 拒 PASS |
| core/tree_rules_v11_test | 0 | 「四键合成行零违例+聚散两键无行成立+反例被拒+六键参数域全过」 |
| core/feat_vouchers_test | 0 | all green (49 checks)(R1 注入面回归) |
抽查密度:卡① 8 断言函数、卡② 14 函数、卡③ 12 段——均超每卡 3 条要求。run_all.gd manifest 本批 +6 行(卡③ 4 件+卡② 2 件,负面件 expect=1 negative=true 形态正确)。
## 四、测试削弱核查结论
**实质零削弱,申报面两处程序性缺项。** 删行全量对配结果(`git diff ab5d75a2..iter50 -- game/tests` 删行 17 条断言类逐条核对):
| 删改 | 归属 | 结论 |
|---|---|---|
| roll_multiplier armor_roll 三断言换代("e1" 键) | 卡①申报 1 | 通过——语义逐字保留,尾缀随原批 |
| round_flow 衰减相位断言 | 卡①申报 2 | 通过——零改动即等价(diff 证实该区无删行) |
| round_flow 排除表删 fx_streak_segments+注释删连珠矢 | 卡③申报 5 | 通过——段内序判据不动 |
| adventure_feats :743 载荷删 overflow 键 | 卡③申报 4 | 通过——「斩首学者击杀揭示 1 格」逐字保留 |
| board_gen_reward SPAWN_AREA_CELLS→spawn_edge² 三处 | 卡③申报 2 | 通过——cap 压线 9 语义不减(真表值 3²=9 推导) |
| board_generator from_expr→edge² | 卡③申报 3 | 通过 |
| level_shop :264 spend_discount==0.8 删 | 卡③申报 7 | 通过——但声明的承接件 V2 未落地(缺漏 2;实际承接=申报 8 改造断言) |
| meta_forge :739-740 期望算式改 discount_pct 推导 | 卡③申报 8 | 通过——折后价期望逐位同值 |
| adventure_feats rebuild []→{} ×30+meta_forge 3 处 | 卡③申报 9 | 通过 |
| tree_rules_v11 夹具字面量→参数字典 | 卡③申报 1 | 通过——四键行数对照+validate 零违例结构不变 |
| node_map_growth 夹具补三新键 | 卡③申报 6 | 通过——结构拦截与 fatal 断言零松动 |
| **forge_table 闭集钉数 34→32**(`_test_effect_kinds_closed`) | **申报外** | **例外**——R3 摘名的必然连带(钉数断言按其自身注释「钉现行数」必须随词表换代),强度不减(仍捕获任何增删),但**未列入卡③申报 9 条**,实现报告仅作改动事实记录(第四节「EFFECT_KINDS 摘两名(34→32)」)未按削弱申报程序申报 |
| system_contracts EC1/EC2/受理、damage_controller 池四断言、seal_polarity 侧汇总等签名适配 | 卡①②申报表外 | **例外(备案核对通过)**——apply_effect 增加 owner_key 必填参的编译级连带,删行全部原内容重挂(EC1/EC2/池值/ac 不入池/满层拒绝逐字保留,仅加 OWNER_HERO 显式参),实现报告决定记录 #7 事后备案「断言内容零改动」——对照卡①红线「静默放宽=判红」,此批无放宽,判例外不判红 |
## 五、内部字段直查受控例外核查
判据权威=test-conventions §8(直查仅限无公开可观测面可钉,对照表行须注明理由)。结论:**新增断言的判据面全部钉公开可观测出口,零「以直查代判据」;卡①「零直查行」声明在判据面意义上成立。** 逐点:
- 卡① V1-V4:全经容器公开 API;V6/V7 经 DamageController 公有算术面;V8 判据钉 presentation_snapshot() 公开出户(:657 成文出口),`_status_effects`/`_enemy_system` 仅作夹具布线(授予/取敌),沿两文件既有直查惯例(round_flow 基点已有 8 处 _enemy_system)。
- 卡② V10 读实例化敌走 `oc._enemy_system`——实例化敌清单无公开面可钉,卡面判据绑定面文本「实例化敌人行键投影」即该理由的成文位置(判例边缘,登记不判红)。
- 卡③对照表具名私有面(`_deduce`、`_tree_rule_dict`、`_validate_rule_key_params`)均为卡面点名的被测交付件本身,非绕行;V15 真板经 begin_battle+drive_round 真实装配(卡面括注 perfect_action 装配链,实现取板路径稍异——夹具布线白名单级)。
- 两处次要注记:playtest_logger_guard 断言 `_path` 留空(内部读,与公开空串返回+盘上零文件两公开判据并存,非承重);meta_forge 夹具 `_add_keystone`(基点已有 10 处同款惯例,本批 +2)。
## 六、零行为改动面读数(卡③组 D/组 C)
- `grep -rn experiment_density game/ tools/`:唯一命中=`game/data/tables/board_gen.tres:415` 出处指针注释(卡面合法指针形态;行号 :415 对卡面 :414 漂 1 行,L2 级);`game/sim/experiment_density.gd` 及 .uid 确已删除;game/README.md 工具行零残留。**通过**。
- `grep damage_probe game/tests/run_all.gd tools/run_all_gates.sh`:零命中;`game/sim/damage_probe.gd:2` 头注「诊断工具·非验收件——不出入任何闸」在位。**通过**。
- gdstyle:`python tools/gdstyle_gate.py` → 「扫描面 158 个 .gd;命中 5 条,基线内 5 条,基线外新违规 0 条,较登记值恶化 0 条 / ok」,退出码 0。**通过**。
- 实现报告第六节 9 条决定记录逐条过目:#1-#9 全数与代码实况一致(#9 明细行 pool_value 改动面在 diff 在案,未独立复跑验证,风险低)。
## 七、判定依据汇总
不通过的唯一直接依据=第一节缺漏清单三条,全部可由仓库证据复现:缺漏 1/2 的函数名在 `git log -S` 全史仅出现于写卡提交 a05fd7b8(卡片文本),实现三笔提交(e6584927/cd133932/a2886a53)均未落地对应测试件;缺漏 3 为报告第九节对同一事实的失实陈述。卡③第 8 节末自我约束「独立验收审计未过不合并」,本报告判不通过即触发该条:R14 需补 `_test_preview_reveal_readonly`(判据按对照表行:F2 同口径差集/零状态写入/零事件/封印两形态);R2 需补具名承接件或由写卡段改表(实现批禁写 README,现状属名实断裂应按 L3 呈报回表);补齐后重跑受影响域闸方可合并。其余各面(卡①②全部、卡③ 13/15 行、削弱实质、直查纪律、零行为面、gdstyle)独立核验为通过。
---
# 迭代 50 复验报告(2026-11-03,整改笔 6cb1cf5e)
## 1. 缺漏 1(R14/V14)——通过
| 核对点 | 实证 |
|---|---|
| 函数名+尾缀在位 | `tests/unit/core/minesweeper_rules_test.gd`:`func _test_preview_reveal_readonly()` :118、`_init` 挂载 :43;〔架构整改 V14〕尾缀 4 条 :127/:134/:147/:153,grep 实证 |
| 自跑全绿 | 退出码 0,`[minesweeper_rules_test] all green (17 checks)`——12 旧+5 新,与整改申报一致 |
| 五断言与卡③对照表判据对齐 | 形态A 零状态写入(revealed/seal 计数前后零变化)/形态B preview(封印格) 零状态写入(隐式退役只入模拟集、真实封印计数不动)/F2 同口径逐位(`str(prev_c) == str(after_diff)`——真实双入口输出比对,非硬编码)/cell_revealed 零发射(三次 preview 前后增量 0)/形态A 返回集形态 1 条 |
注记两条(登记不判红):①F2 同口径对照的实跑实例为退化形态(输出「0 vs 0 格」——夹具首格取自开局扩张区外的数字格,实挖零新增格),多格连锁传播的同口径对照未在本件实例化;该面由 V15 承载(auto_player_deduce 远端 safe 形态格只能经 preview_reveal 闭包传播产生,已实跑绿),且 V14 断言本身比对真实输出、非空转恒真,判据绑定成立。②五断言中「形态A:preview 返回集」一条无尾缀且判据弱(`size >= 0` 恒真),承重面在四条带尾缀件。
## 2. 缺漏 2(R2/V2)——通过
| 核对点 | 实证 |
|---|---|
| 函数名+尾缀在位 | `tests/unit/core/level_shop_economy_test.gd`:`func _test_spend_discount_from_rule_key()` :1583、`_init` 挂载 :255;〔架构整改 V2〕尾缀 3 条 :1585/:1595/:1596,grep 实证 |
| 自跑全绿 | 退出码 0,`[level_shop_economy_test] all green (195 checks)`——192 旧+3 新,与整改申报一致 |
| 三断言与卡③对照表 R2 判据对齐 | shop.tres 加载零诊断+`get("spend_discount") == null`(字段真删);折后价 = (基价+关卡加成)×discount_pct/100 floor 逐位(实测 80 vs 期望 80);未激活原价对照(100)。真实入口=LevelRunner 装配链 `lr.shop.current_price()`+economy_spend 注入,与对照表 R2「真实入口」格逐字一致 |
## 3. 缺漏 3(报告订正)——通过,附一项新发现的小失实
- 第九节订正属实:原文「代表用例名与实际落地函数名一致」改为如实记录「首版核对漏检两处名实断裂(V14/V2 函数未落地即报一致),经独立验收审计判缺漏后补齐」——与首轮审计发现逐字吻合。
- 第十节新增属实:首轮「不通过」判定、三条缺漏定性(含虚假绿根因=实现期 patch 脚本漏写落盘调用,归因实现侧)与整改记录,均与本轮复验实况一致。
- 决定记录 #10 属实:forge_table 闭集钉数 34→32 补账,定性(R3 摘名必然连带、强度不减、属形态迁移同申报 1-9 族、未在卡面申报清单内)与首轮审计例外判定一致。
- **新发现小项(L2 记录面)**:第十节写「报告全文落 `reports/iter50-验收审计-2026-11-03.md`」——该文件不存在(reports/ 目录无此件,git 全史无新增记录)。首轮审计按子代理指令以文本返回、未落盘;该路径引用应订正,或由发起会话把审计文本落到该路径使引用成立。不属对照表行、不属行为面、不属测试削弱。
整改笔触碰面收敛:`git show 6cb1cf5e --stat` = 仅两测试件+实现报告三文件(+72/−2),零越界改动、零既有断言触碰。
## 最终判定
**通过**——首轮缺漏三条全部闭合(V14/V2 具名断言落地且实跑绿、报告订正与实况一致),整改笔触碰面收敛;遗留一项 L2 记录面订正(第十节引用的审计报告归档路径 `reports/iter50-验收审计-2026-11-03.md` 未落盘,落盘或改引用由发起会话裁处),不阻塞合并。
---
## 终判(发起会话归档注记)
**通过**。复验遗留 L2 项(第十节引用的审计报告归档路径未落盘)以本文件落盘闭合——引用自此成立。随批合并(合回后 post-merge 钩子自动跑 CI 全量域闸,红则修复追绿)。
---
## 终判(发起会话归档注记)
**通过**。复验遗留 L2 项(首轮审计报告归档路径未落盘)以本文件落盘闭合——引用自此成立。随批合并(合回后 post-merge 钩子自动跑 CI 全量域闸,红则修复追绿)。
@@ -1,138 +0,0 @@
# 需求卡片:敌方状态个体化批(2026-11-02)
> 一句话:把增益/减益状态实例从「阵营共享一条」改为「每只敌人各自持有」——全体授予=逐只各发一条实例,敌方增益技只强化施放者自己,个体死亡即清名下实例。
> 来源:待办清单条目「敌方状态个体化——状态实例归属到敌人个体」(2026-11-02 登记,来源=会话提及)。
> 审裁决:godot-master 终审通过(2026-11-02——架构四查全过,P3 一处 S9 类型标注句折入 T0-1);grilling 零待裁点(断言换代申报照卡执行、估时归迭代行)。
## 设计事实源
| 文档 | 依据 | 版本 |
|---|---|---|
| `design/gdd/systems/战斗循环/增益状态.md` | 硬规矩「实例按个体归属」+〈目标规则与个体归属〉节(词表四词/合并认个体/死亡即清/呈现各读各的) | v1.5(2026-11-02) |
| `design/gdd/systems/战斗循环/敌人系统.md` | 增益技落点=施放者自己;警觉授予随动 | v1.5(2026-11-02) |
| `design/gdd/systems/战斗循环/战斗结算.md` | 警觉按个体;AC 合流=该敌自己名下的 ac 型状态 | v1.6(2026-11-02) |
与待办清单条目凭据一致。
## 目标与完成定义
状态容器从「按阵营两桶」换为「按个体多桶」(主角一桶+每只敌各一桶),授予/合并/衰减/清除/兑付/呈现全链随动;敌方增益技从「全体受益」纠正为「施放者自己」。完成定义=全部断言当轮跑批执行并通过+代码域闸全绿+合回后本地 CI 全量域闸全绿+主角侧行为零变化(回归全绿)。
## 现状事实(代码级考证 2026-11-02,全仓审计)
- **容器本体**:`StatusContainer` 全战斗单例(battle_orchestrator.gd:217),实例按 `target_side` 两桶;`apply_effect` :28-49、`query_active(side)` :98-118、`decay_round` :121-134(全池统一 −1)、`notify_battle_end` :137-143。
- **授予写点 3 处**:敌方技能增益(combat_segment.gd:84-90,落点由状态行 target_side 路由到敌方侧——现行全体共享的根);奖励格(reward_grant.gd:226-239,含 enemy_alert);直伤附带(damage_controller.gd:451 fx_apply_status)。
- **读点**:乘区池合计 `clamped_pool` damage_controller.gd:629-637(两 side 实例混算);defender_ac 敌分支 :601-606(side 级 ac 型加到每一只敌);nest_count battle_orchestrator.gd:117-121 与 damage_controller.gd:93-98;池兑付 _pool_effective :521-527;结算快照 buffs :525-535;呈现投影 :670-692(**同一数组引用塞进每张敌卡**,standee_body.gd:80 自认「各立绘同值」)。
- **死亡**:unit_died → damage_controller._on_unit_died :192-198(未结单据作废);状态实例不随死亡清,活到衰减或战斗终局。
- **已正确的个体面(不动)**:技能冷却/半血闩/保底计数(unit_container.gd:99-153、:259-272);hp/armor/intent;死亡清脸呈现;顺位取靶(:358-362)。
- **主角侧**:单单位,全链语义不受影响。
- **中途入场**:不存在该路径(敌人开战一次性实例化,unit_container._spawn_rowset :81-118),「后援继承」问题消解。
## 设计契约红线
- 🔴 **GDD v1.5 语义逐条照搬**:实例按个体归属/全体授予=逐只各发一条/敌方增益技归施放者自己/个体死亡即清/呈现各读各的/合并只在同体内——任何偏离=L3 停卡。
- 🔴 **status_effects.tres 行值零触碰**:合并策略、词表、时长、幅度全照旧——本批只改归属结构,不改任何状态定义。
- 🔴 **断言换代申报制**:下方「测试削弱申报」清单之外,禁删禁改任何既有断言;实现轮撞红的侧级共享读数断言须挂对照表行换代,静默放宽=独立审计判红。
- 🔴 **主角侧行为零变化**:attack_up/ac_up 全套既有断言回归绿;无类型键改动泄漏到主角调用面以外的公开接口。
- 🔴 RNG 单点/Core 零 UI 依赖/fail-fast 照旧;全程零随机(禁随机摇目标)。
- 🔴 **实现照单落名**:README 代表用例名=测试函数名唯一依据;断言尾缀〔个体化批 Vn〕全仓可 grep。
## 测试削弱申报(唯一允许的换代清单)
| 既有断言 | 换代方式 | 依据 |
|---|---|---|
| `roll_multiplier_test.gd:_smoke_armor_roll` V1/V2/V3(迭代 48 卡①削弱累加三断言) | 重写为个体键读数——累加/续时/覆盖时长的语义断言原样保留,只把「敌方侧查询」换成「目标个体查询」 | GDD v1.5 合并匹配认个体 |
| `round_flow_skill_pool_test.gd:_smoke_settlement_segments` 衰减相位断言(:413-421、:449) | 全池衰减改逐桶衰减(每个存活个体恰 −1、归 0 移除),断言语义等价换代 | GDD v1.5 实例按个体归属 |
## 范围边界
**做**:容器个体化+3 写点+全部读点随动+呈现投影换代+上表申报断言换代+新断言 V1-V8。
**不做**:种类级目标词(不预先建面);伤害侧新目标规则(现行三词够用);主角侧任何语义变化;status_effects.tres 行值;多语言/音频(P1);mid-battle 增援(路径不存在)。
## 关联文档同步面
| 文档 | 关联点 | 同步义务 |
|---|---|---|
| `design/gdd/systems/战斗循环/增益状态.md` v1.5 | 〈目标规则与个体归属〉节「实装随该批」规矩行 | 实装合入后该行已过时——反哺点清单登记,用户裁决后文档批删除(实现批禁写 design/) |
| `game/tests/README.md` | 能力行增改 | 写卡段当场落(本批卡内已列),实现照单落名 |
## 任务卡 T0..T3
**T0 容器个体化+授予路径换代(≈1 工作日)**
- [ ] T0-1 `status_container.gd`:实例桶键从 side 换个体——个体键约定单点定义(常量:主角=`"hero"`,敌人=`"e<生成序>"`,生成序=开战逐只编号沿用顺位轴);新桶键结构按 S9 全类型标注(godot-master 终审折入);`apply_effect(effect_id, owner_key, duration_override)`、`query_active(owner_key)`、`decay_round()`(逐桶各 −1)、`purge_owner(owner_key)` 新增(死亡清)、`notify_battle_end` 照旧全清
- [ ] T0-2 授予写点 3 处换代:combat_segment.gd 增益技落点=施放者自己;reward_grant.gd 全体规则=循环存活敌逐只发(封印削弱/踩雷/警觉);damage_controller.fx_apply_status=被命中者个体
- [ ] T0-3 死亡清接线:unit_died → purge_owner(死亡个体名下实例全清)
- [ ] T0-4 断言落地 `system_contracts_test.gd`:`_test_status_individual_isolation`〔V1〕(两敌各授同名实例,层数/时长互不干扰);`_test_status_grant_all_per_unit`〔V2〕(全体授予=每只各一条、各自衰减);`_test_status_death_clears`〔V3〕(死体实例清零、他体不受影响);`_test_status_merge_per_unit`〔V4〕(同体合并照旧:累加/叠加/满层拒)
- [ ] T0-5 换代申报落地:armor_roll V1-V3 重写(个体键读数,语义保留);`round_flow_skill_pool_test.gd` 新增 `_test_enemy_buff_targets_self`〔V5〕(蓄力只强化施放者,他敌 output 池读数不变)
- [ ] T0-6 单元套全绿——里程碑步出口跑一次全套闸;波内修复只做出红最小单元的最窄确认
**T1 消费面随动(≈0.5 工作日)**
- [ ] T1-1 `damage_controller.gd`:`clamped_pool` 带 owner_key(主角打敌=该敌防御池;敌打主角=施放敌自己的输出池);defender_ac 敌分支只读被打者名下 ac 型实例;nest_count 两处(battle_orchestrator.gd:117-121、damage_controller.gd:93-98)按个体;_pool_effective 与结算快照 buffs 逐个体
- [ ] T1-2 断言落地 `damage_controller_test.gd`:`_test_pool_consumption_per_unit`〔V6〕(B 敌的削弱不进 A 敌的账);`_test_defender_ac_per_unit`〔V7〕(alert 各算各的)
- [ ] T1-3 单元套全绿(同 T0-6 措辞)
**T2 呈现投影+主角侧回归(≈0.5 工作日)**
- [ ] T2-1 battle_orchestrator.gd:670-692:enemies[].effects 每卡读自己桶(删同引用共享);结算明细归因照旧
- [ ] T2-2 断言落地 `battle_narrator_test.gd`:`_test_snapshot_effects_per_unit`〔V8〕(A 有削弱 B 无 → 两卡投影各现各的)
- [ ] T2-3 主角侧回归:attack_up/ac_up 全套既有断言绿;冒烟 15 项 0 失败
- [ ] T2-4 单元套全绿(同 T0-6 措辞)
**T3 产出物落位卡(≈0.25 工作日)**
- [ ] T3-1 合并前写齐 `reports/iterN-实现报告-<日期>.md`(各卡状态+实机目检总清单〔本批玩家可见面=敌方增益图标各现各的、蓄力不再全体受益——两项入目检清单,登记不阻塞〕+实现决定记录)
- [ ] T3-2 合并前写齐 `reports/iterN-反哺点-<日期>.md`(增益状态.md「实装随该批」行删除义务,逐条落点与依据;实现批禁写 design/ 与根规则文件)
## 验证闸(改动—验收对照表)
| 需求点 | 改动(文件:行/行为) | 验收测试(名称+落点+尾缀) | 层级 | 真实入口 | 判据绑定面 | 能力行 |
|---|---|---|---|---|---|---|
| 实例按个体归属 | status_container.gd 键换代 | `_test_status_individual_isolation`〔V1〕 | 单元 | StatusContainer.apply_effect()/query_active() | 各体投影读数互不影响 | 新增:状态实例按个体归属:个体隔离/全体授予逐体发/死亡即清/同体合并照旧 |
| 全体授予逐体发 | reward_grant.gd 循环授予 | `_test_status_grant_all_per_unit`〔V2〕 | 单元 | 同上 | 逐体实例数与各自衰减 | 新增:状态实例按个体归属:个体隔离/全体授予逐体发/死亡即清/同体合并照旧 |
| 个体死亡即清 | unit_died→purge_owner | `_test_status_death_clears`〔V3〕 | 单元 | 同上+purge_owner() | 死体桶清零、他体不变 | 新增:状态实例按个体归属:个体隔离/全体授予逐体发/死亡即清/同体合并照旧 |
| 同体合并照旧 | 合并匹配认个体 | `_test_status_merge_per_unit`〔V4〕 | 单元 | StatusContainer.apply_effect() | 同体累加/叠加/满层拒读数 | 新增:状态实例按个体归属:个体隔离/全体授予逐体发/死亡即清/同体合并照旧 |
| 增益技归施放者自己 | combat_segment.gd 落点换代 | `_test_enemy_buff_targets_self`〔V5〕 | 单元 | 战斗结算编排链(技能施放) | 施放者与被他敌的池读数差 | 新增:敌方增益自体落点与乘区池按个体 |
| 乘区池按个体 | clamped_pool 带 owner_key | `_test_pool_consumption_per_unit`〔V6〕 | 单元 | DamageController 兑付 | 被击者专属池合计 | 新增:敌方增益自体落点与乘区池按个体 |
| AC 合流按个体 | defender_ac 敌分支 | `_test_defender_ac_per_unit`〔V7〕 | 单元 | DamageController 兑付 | 被击者自身 ac 型合计 | 新增:敌方增益自体落点与乘区池按个体 |
| 呈现各读各的 | 投影换代 battle_orchestrator.gd | `_test_snapshot_effects_per_unit`〔V8〕 | 单元 | 呈现状态快照函数 | 两卡 effects 投影差 | 新增:状态实例按个体归属:个体隔离/全体授予逐体发/死亡即清/同体合并照旧 |
| 申报换代两件 | armor_roll/settlement_segments 重写 | 原函数名保留(语义等价换代,尾缀随原批) | 单元 | 原真实入口 | 原判据个体化 | 既有:同名状态合并策略(叠加/累加/并存)与剩余次数语义 |
## 独立验收审计
执行体=迭代 loop 内启动的未参与实现子代理(2026-11-02 用户裁,test-conventions §8.7 默认通道);报告落 `reports/iterN-验收审计-<日期>.md`,逐行写「通过/缺漏/例外及依据」。审计四件事:逐行核对对照表(测试存在、当轮执行、尾缀可 grep、真实入口未绕改动点);抽查判据绑定面;检查测试削弱(对照本卡「测试削弱申报」两件清单);核对内部字段直查受控例外(本卡零直查行)。未过不得合并。
## 异常分级
- **L1 自救**:断言消息、局部夹具命名、循环授予的实现次序(入列顺序稳定可读照 GDD)。
- **L2 记录继续**:撞红的其余侧级共享读数断言——按申报制挂对照表行换代,记实现决定记录。
- **L3 停机呈报**:呈现快照无个体键承载(投影改不动=上游缺陷);purge 与断点续玩时序冲突;GDD 语义与现役观测面失配;机检键与本卡契约互斥——一律停卡退回写卡段。
## 代拍板白名单
- 测试内局部命名、常量、断言消息文本。
- 循环授予的实现编排(按调用方给定次序入列,保证稳定可读)。
- 个体键字符串格式的内部拼写(约定语义不变)。
## 待裁点
零待裁点,开工门=U0。
## 落位与可复用性预检
**零新增文件**:全部改造/扩展现有件——status_container.gd(本体)、combat_segment.gd/reward_grant.gd/damage_controller.gd(写点)、unit_container.gd(死亡信号既有)、battle_orchestrator.gd(读点/投影);测试扩展 system_contracts_test.gd/round_flow_skill_pool_test.gd/damage_controller_test.gd/battle_narrator_test.gd 四个既有宿主。
**唯一面**:个体键约定单点定义于 StatusContainer 头部(禁散落第二处拼写);purge 单点(死亡清唯一通道);无 helper 外散。
**分层与交互**:全链在 core 层,零 UI 依赖(headless 可跑通);呈现只经呈现状态快照函数读取,不直捅容器;RNG 零新增(本批零摇号)。
## 实现规范预算
- status_container.gd:公开方法 +1(purge_owner)、成员 +1(桶键结构)——公开方法 ≤20、成员 ≤15 内。
- 存量触面 S13 预期:battle 域触碰文件(combat_segment/damage_controller/battle_orchestrator/reward_grant)键较登记值只降不升(clamped_pool 加参不增分支路径,投影换代删共享引用行);T0 读数步骤核对。
## 拆分边界纪律
本卡为行为重构(归属结构换代),非拆件批:禁为迎合机检保留或新增无效成员/别名;机检键与本卡契约互斥=停卡呈报,不自造第三条路。
@@ -1,174 +0,0 @@
# 需求卡片:断言补齐批(2026-11-02)
> 一句话:为①增益状态结算链、②减动效开关存储、⑤Boss 出场门控、⑥锻造工坊结构四域补自动化断言——零行为改动、纯测试补齐,同批刷新能力清单缺口口径。
> 来源:待办清单条目「能力清单覆盖缺口补齐——六类无断言面或设计未定项」(2026-10-29 登记,来源=会话提及)。
## 设计事实源
| 域 | 设计依据(唯一事实源) | 版本凭据 |
|---|---|---|
| ⑥ 锻造工坊 | `design/gdd/systems/跨局循环/锻造工坊.md` 验收标准节九条判据 | v0.11(2026-11-02) |
| ① 增益状态 | `design/gdd/systems/战斗循环/增益状态.md` 结算链规则 | v1.4 |
| ⑤ 难度曲线与Boss | `design/gdd/systems/冒险循环/难度曲线与Boss.md` 核心规则(机制面) | v1.2 |
| ② 减动效开关 | `design/gdd/systems/表现与支撑/设置与本地化.md`(开关承诺)+ `design/gdd/ux/battle.md`(减动效双态承诺:延迟归零同帧直落+横幅静态化、可加速不可整体跳过) | v1.1 |
与待办清单条目 8 凭据(实况关联文档清单)一致;增益状态.md 以本表 v1.4 为准,待办条目实况中的 v1.1 记法由本批订正。
## 目标与完成定义
为条目 8 收窄后的四域剩余真缺口补 **13 个新断言函数+2 处既有函数扩展**;断言全数通过;能力清单(`game/tests/README.md`)同步刷新(5 行新增能力行+5 行覆盖域表缺口句订正)。
完成定义=全部断言在当轮真实跑批中执行并通过+代码域闸全绿+合回后本地 CI 全量域闸全绿。
## 现状事实(代码级考证,2026-11-02)
### ① 增益状态结算链(game/core/status_container.gd)
- 授予路由:`apply_effect` :28-49 按 stack_policy 三臂路由(independent :41-43/accumulate :44-45/stack :46-47)。
- 叠层/续时:`_apply_accumulate` :60-67(命中只加时长、层数恒 1、快照沿首授);`_apply_stack` :70-80(满层拒返 false、层数与时长零写入)。
- 衰减:`decay_round` :121-134(先兑付后衰减、每实例每结算恰 −1、归 0 移除、返回移除数 k)。
- 清除:`notify_battle_end` :137-143(战斗结束全清);`notify_battle_start` :16-22(开域+清残留)。
- 可观测面:返回值 bool/int+只读投影 `query_active(side)`(effect_id/layers/remaining_settlements/effective_value=L×m)。
- 已盖面(不动):迭代 48 卡①(git 1e35ab94)已盖叠层续时 V1/V2/V3(`roll_multiplier_test.gd:_smoke_armor_roll` :160-167);五段全序与衰减相位断言(`round_flow_skill_pool_test.gd:_smoke_settlement_segments` :382-449)。
- 剩余缺口:衰减逐值与到期移除数、战斗结束全清、满层拒绝、independent 分支、快照沿首授——全部零断言(notify_battle_end 全测试目录零调用,grep 证实)。
### ② 减动效开关存储(game/presentation/settings_store.gd)
- 独立设置存储(不进存档):user://settings.cfg 节/键 motion/reduced(读 :26、写 :33);`reduced_motion` 默认 false(:12)。
- 引擎档应用:`apply()` :38-45(reduced → UiKit.motion_scale=0.5,否则 1.0)。
- 已盖面(不动):探针全链(`ui_click_probe.gd` 设置面段 :310-327:开→0.5、持久化回读、关→1.0);系统测试 V2b(`system_test.gd` :166-168);单元侧排播双态(`pacing_queue_test.gd` :120-125,直拨 UiKit.motion_scale 不经 store)。
- 剩余缺口:store 本体零单元断言(持久化回读/缺省值/应用链);README :194 缺口句仍写「仅系统测试与冒烟覆盖」,与现役探针覆盖不符——本批订正。
### ⑤ Boss 出场门控(机制面)
- 门控链:`node_map_generator.gd` `_build_region` :338-352(每区域 boss 深度=L−r、恰一终点)→ `level_runner.gd:546` node_type 入参 → `battle_orchestrator.gd:283` row_kind 传参 → `config_db_resolver.gd:33-67` 行类路由(越域 fatal :41-43)→ boss 行集选出。
- Σ×r_boss 无运行时承载(Boss hp 行值直填 enemy.tres;difficulty_table.gd:2-3 头注成文口径「Boss 数值走行值直填不经本表」)——本批不造运行时公式断言。
- 已盖面(不动):resolver 路由与 clamp(`config_db_resolver_test.gd` 四函数);表侧 Boss 行集带键覆盖(`table_structure_guard_test.gd:_smoke_enemy_bands` :242-259);半血门与闩(`skill_unlock_test.gd`)。
- 剩余缺口:每区域恰一 Boss 终点无专项断言(`node_map_generator_test.gd` 只断终点数与入口数 :79-89);「Boss 节点开战必选 boss 行集」端到端无直接断言。
### ⑥ 锻造工坊(meta_progression.gd+forge_table.gd+shop_session.gd)
- 解锁双通道单点:`_forge_route_unlocked` meta_progression.gd:126-139(初始持有∨直购∨练满前一档);直购写口 `forge_buy_unlock` :160-170(已解锁拒绝零收费),解锁价 200(forge.tres)。
- 定价:`forge_table.gd:24-28` level_price = floor(基价 × (公比/100)^已购级数);表值基价 20/公比 150(forge.tres)。
- 注入:`hero_override` :270-293(树淬炼 :280-288、分层相加 :289-293、树攻防恒 0);`_forge_axis_bonus` :297-302(只认选中路线、异常回退 0);参数面下传 main.gd:191-201;入账 adventure_runner.gd:89-97。
- 默认值常驻:`hero_type_axes` :188-198(未点亮照常返回 normal/light)+ forge.tres:7-8 默认轴。
- 拒购:`forge_buy_level` :144-155;余额闸零副作用(`meta_state_store.gd:18-22` spend_keystone 余额不足 return false 零写入)。
- 存档:save_manager v7 forge_routes 域 :267-272(默认 weapon=sword/armor=light)+normalize 补齐 :295-311。
- 祝福件通道:局内商店购买(shop_session.gd:71-91 legacy/:272-293 pool)写局内加算区(GP 币),与 forge_routes 代码零交集;绑定负断言零测试。
- 已盖面(不动):双通道/锁死/公式对拍/树零攻防(`meta_progression_forge_test.gd` :432-455、:476-541);锁定态/两区三行/钮态(`forge_workbench_test.gd` :42-99);长剑价格梯纯函数(`forge_table_test.gd:_test_price_ladder` :91-99);购买链首两级(:411-420)。
- 剩余缺口:全路线价格梯(非长剑四路线零梯断言)、购买链 45 档、拒购零副作用、祝福件零泄漏、默认值解耦、甲型双轴切换。
## 设计契约红线
- 🔴 **零行为改动**:本批只增测试断言与 README 能力行;禁触产品码、禁触 data/tables 行值——断言需要观测面而现役无 → 停卡呈报,禁为可测性改产品码(需求改动另走卡)。
- 🔴 **判据绑可观测提交面**(test-conventions §8.4);禁变异类测试、禁撤销类取证。
- 🔴 **RNG 单点**:⑤ 集成断言用固定种子经 RngService 封闭流,禁 randomize()/自建 RNG。
- 🔴 **实现照单落名**:README 代表用例名=测试函数名唯一依据,名实不符=停卡退回写卡段;断言失败消息尾缀〔断言补齐批 Vn〕全仓可 grep。
- 🔴 **测试削弱申报**:本批不删不改任何既有断言(迭代 48 V1-V3 零触碰);无允许削弱项。
- 🔴 **Forge 表行值零触碰**(provisional 形态归 M4 数值批)。
## 范围边界
**做**:13 个新断言函数+2 处既有函数扩展+README 能力行增行与覆盖域表缺口句订正。
**不做**:②多语言(P1 功能缺口);③音频(P1 后置);⑤数值落带断言(provisional 归 M4);④死亡灰化/碎裂断言(2026-11-02 用户裁除名,探针+人工目检为终态);Σ×r_boss 运行时公式断言(无运行时承载,不造);满级特效(本期不做);为可测性改产品码(需求改动另走卡)。
## 关联文档同步面
| 文档 | 关联点 | 同步义务 |
|---|---|---|
| `game/tests/README.md` 覆盖域表 | 断言落地后覆盖状态变化(:180/:182/:184/:194/:200 五行) | 状态列翻转登记进反哺点清单,由用户裁决后归文档批落文(实现批禁写 README);缺口句订正属写卡段维护面,本批当场落 |
| 两份 GDD(难度曲线与Boss/锻造工坊) | 断言绑定其验收标准节/规则节 | 无义务——零触面 |
## 任务卡 T0..T4
**T0 ①增益状态结算链断言(≈0.5 工作日)**
- [ ] T0-1 `game/tests/unit/contracts/system_contracts_test.gd` 新增四函数:`_test_status_decay_and_clear`〔V1/V2〕(衰减每结算恰 −1、归 0 移除并返回移除数 k;notify_battle_end 后 query_active 零行);`_test_status_stack_full_reject`〔V3〕(满层再授返 false、层数与 remaining 零写入);`_test_status_independent_branch`〔V4〕(直改已加载表 rows 追加 independent 试验行→授予两实例→并存独立结算,测毕还原);`_test_status_snapshot_first_grant`〔V5〕(accumulate 再授只加时长,origin_cell/round_index 沿首授)
- [ ] T0-2 单元套全绿——里程碑步出口跑一次全套闸;波内修复只做出红最小单元的最窄确认
**T1 ②设置存储契约断言(≈0.5 工作日)**
- [ ] T1-1 新建 `game/tests/unit/presentation/settings_store_test.gd` 三函数:`_test_settings_roundtrip`〔V6〕(写 true→存→新实例回读 true,节/键 motion/reduced);`_test_settings_default`〔V7〕(无文件缺省 false);`_test_settings_apply_chain`〔V8〕(reduced→apply()→UiKit.motion_scale==0.5,false→1.0,测毕还原静态初值);隔离卫生:经 retarget() 指向临时 cfg,禁碰真实 user://settings.cfg(ui_click_probe 同款纪律)
- [ ] T1-2 单元套全绿(同 T0-2 措辞)
**T2 ⑤Boss 门控断言(≈0.5 工作日)**
- [ ] T2-1 `node_map_generator_test.gd` 新增 `_test_boss_exit_per_region`〔V9〕(真实生成多区域图,每区域终点集恰一 type=="boss"、深度=区域深度 L−r)
- [ ] T2-2 新建 `game/tests/unit/battle_settlement/boss_gate_test.gd`:`_test_boss_node_spawns_boss_rowset`〔V10〕(begin_battle(node_type="boss")→实例化敌人行键全部 row_kind=="boss";对照入参 node_type="battle" 预解析行集零 boss 行;固定种子经 RngService 流口)
- [ ] T2-3 单元套全绿(同 T0-2 措辞)
**T3 ⑥锻造工坊断言(≈1 工作日)**
- [ ] T3-1 扩展 `forge_table_test.gd:_test_price_ladder`〔V11〕:六路线全量梯(逐级严格递增、floor 公式按表值推算不写死表值、满级档价=上限档)
- [ ] T3-2 扩展 `meta_progression_forge_test.gd:_meta_pricing_and_buy`〔V12〕:长剑购买链走至 3 级(45 档扣款与余额递减断言)
- [ ] T3-3 新增 `_test_forge_buy_reject`〔V13〕(余额不足与未解锁两路→false,等级与余额零变化)
- [ ] T3-4 新增 `_test_blessing_no_forge_leak`〔V14〕(商店买攻击祝福+护甲祝福→forge_state 投影逐位不变)
- [ ] T3-5 新增 `_test_default_axes_pre_key`〔V15〕(树钥匙未点亮→hero_type_axes 返回 normal/light)
- [ ] T3-6 新增 `_test_armor_switch_dual_axes`〔V16〕(forge_select("heavy")→AC 轴 +2 且挨普通攻击修正 −1;切回 light 复原且等级保留)
- [ ] T3-7 单元套全绿(同 T0-2 措辞)——里程碑步出口跑一次全套闸;波内修复只做出红最小单元的最窄确认
**T4 产出物落位卡(≈0.25 工作日)**
- [ ] T4-1 合并前写齐 `reports/iterN-实现报告-<日期>.md`(各卡状态+遗留读数义务+实现决定记录;本批零实机目检项——纯断言批无玩家可见面)
- [ ] T4-2 合并前写齐 `reports/iterN-反哺点-<日期>.md`(覆盖域表五行状态列翻转与缺口句收敛,逐条写明落点与依据;实现批禁写 design/ 与根规则文件)
## 验证闸(改动—验收对照表)
| 需求点 | 改动(文件:行/行为) | 验收测试(名称+落点+尾缀) | 层级 | 真实入口 | 判据绑定面 | 能力行 |
|---|---|---|---|---|---|---|
| 增益衰减逐值与到期移除+战斗结束全清 | system_contracts_test.gd 新增一函数 | `_test_status_decay_and_clear`〔V1/V2〕 | 单元 | StatusContainer.apply_effect()/decay_round()/notify_battle_end() | 返回值+query_active 投影 | 新增:状态效果结算链(逐值衰减/到期移除/战斗结束全清/满层拒绝/独立并存/首授快照) |
| 增益满层拒绝 | 同上文件新增一函数 | `_test_status_stack_full_reject`〔V3〕 | 单元 | StatusContainer.apply_effect() | 返回 false+投影层数/时长零变化 | 新增:状态效果结算链(逐值衰减/到期移除/战斗结束全清/满层拒绝/独立并存/首授快照) |
| 增益独立并存+首授快照 | 同上文件新增两函数 | `_test_status_independent_branch`〔V4〕/`_test_status_snapshot_first_grant`〔V5〕 | 单元 | StatusContainer.apply_effect()+直改已加载表行(试验行) | 返回值+投影快照域 | 新增:状态效果结算链(逐值衰减/到期移除/战斗结束全清/满层拒绝/独立并存/首授快照) |
| 减动效存储回读/缺省/应用链 | settings_store_test.gd 新文件三函数 | `_test_settings_roundtrip`〔V6〕/`_test_settings_default`〔V7〕/`_test_settings_apply_chain`〔V8〕 | 单元 | SettingsStore.load_settings()/save_settings()/apply() | ConfigFile 回读值+UiKit.motion_scale | 新增:减动效开关存储契约(持久化回读/缺省值/引擎动效档应用) |
| 每区域恰一 Boss 终点 | node_map_generator_test.gd 新增一函数 | `_test_boss_exit_per_region`〔V9〕 | 单元 | NodeMapGenerator.generate() | 生成图节点 type/depth 投影 | 新增:Boss 出场门控(每区域恰一 Boss 终点/Boss 节点开战必选 Boss 行集) |
| Boss 节点开战必选 Boss 行集 | boss_gate_test.gd 新文件一函数 | `_test_boss_node_spawns_boss_rowset`〔V10〕 | 集成 | BattleOrchestrator.begin_battle() | 实例化敌人行键 row_kind 投影 | 新增:Boss 出场门控(每区域恰一 Boss 终点/Boss 节点开战必选 Boss 行集) |
| 全路线价格梯+多级购买扣款 | forge_table_test 扩展+meta_progression_forge_test 扩展 | `_test_price_ladder`(扩)〔V11〕/`_meta_pricing_and_buy`(扩)〔V12〕 | 单元 | ForgeTable.level_price()/MetaProgression.forge_buy_level() | 表值推算序列+扣款与余额递减 | 新增:锻造定价与购买闭环(全路线价格梯/多级购买扣款/拒购零副作用) |
| 拒购零副作用 | meta_progression_forge_test 新增一函数 | `_test_forge_buy_reject`〔V13〕 | 单元 | MetaProgression.forge_buy_level() | 返回 false+余额/等级零变化 | 新增:锻造定价与购买闭环(全路线价格梯/多级购买扣款/拒购零副作用) |
| 祝福件零泄漏 | meta_progression_forge_test 新增一函数 | `_test_blessing_no_forge_leak`〔V14〕 | 单元 | 商店购买口(shop_session 两条购买路径) | forge_state 投影逐位不变 | 新增:锻造与相邻通道隔离(祝福件购买锻造零变化/默认轴与钥匙解耦/甲型切换双轴可感) |
| 默认值解耦+甲型双轴 | meta_progression_forge_test 新增两函数 | `_test_default_axes_pre_key`〔V15〕/`_test_armor_switch_dual_axes`〔V16〕 | 单元 | MetaProgression.hero_type_axes()/forge_select() | 返回值+hero_override 投影(AC 轴+matchup 修正) | 新增:锻造与相邻通道隔离(祝福件购买锻造零变化/默认轴与钥匙解耦/甲型切换双轴可感) |
表外备注:`game/tests/README.md` 五行缺口句订正=非行为改动(写卡段维护面,本批当场落,见「关联文档同步面」节)。
## 独立验收审计
执行体=迭代 loop 内启动的未参与实现子代理(2026-11-02 用户裁,test-conventions §8.7 默认通道);报告落 `reports/iterN-验收审计-<日期>.md`,逐行写「通过/缺漏/例外及依据」。审计四件事:逐行核对对照表(测试存在、当轮执行、尾缀可 grep、真实入口未绕改动点);抽查判据绑定面;检查测试削弱(本卡申报=无允许削弱项);核对内部字段直查受控例外(本卡零直查行)。未过不得合并。
## 异常分级
- **L1 自救**:断言消息文本、局部夹具命名、扩展函数内步序。
- **L2 记录继续**:README 新行在旅程段内的插入行位(系统归属相邻处)——记入实现决定记录。
- **L3 停机呈报**:①independent 试验行注入不可行→停卡呈报;⑤boss_gate 集成夹具不可行→停卡呈报;⑥甲型双轴观测面不足(AC 修正不随 select 变化)→停卡呈报——观测面不足=上游缺陷,禁自造注入破坏;机检键与本卡契约互斥→停卡退回写卡段。
## 代拍板白名单
- 测试内局部命名、常量、断言消息文本。
- 扩展函数内步序编排。
- README 新行的旅程段内插入行位。
## 待裁点
零待裁点,开工门=U0。
## 落位与可复用性预检
**新增文件 2 个:**
| 文件 | 职责 | 为什么不能复用既有 |
|---|---|---|
| `game/tests/unit/presentation/settings_store_test.gd` | SettingsStore 单元契约(回读/缺省/应用链) | pacing_queue_test 主题是排播节奏(直拨 UiKit 不经 store);ui_click_probe 是探针承载非单元套件(不入 run_all 单元登记);store 单元契约无既有唯一落点 |
| `game/tests/unit/battle_settlement/boss_gate_test.gd` | Boss 节点开战必选 Boss 行集端到端 | node_map_generator_test 只测图结构;config_db_resolver_test/table_structure_guard_test 只测表面路由与带键覆盖;battle_narrator_test 只测呈现投影命名——端到端链(generator→begin_battle→spawn)无既有承载 |
**复用既有(全部扩展,不新增文件):** system_contracts_test.gd(增益状态单元契约既有宿主)、forge_table_test.gd/meta_progression_forge_test.gd(锻造既有宿主)、node_map_generator_test.gd(图结构既有宿主)。
**唯一面**:每条断言唯一函数承载;README 新行唯一;各新函数复用所在文件既有夹具(harness 不外散);零产品码触面。
**分层与交互**:全部新件在测试层(probe/sim/tests 不在 S9 扫描面,测量面直构惯例);Core 域断言经领域类公开方法进出(StatusContainer/NodeMapGenerator/MetaProgression/ForgeTable);集成断言实例化真实宿主链(battle_orchestrator),禁裸替身。
## 实现规范预算
- 新增两文件均为单元测试宿主:公开面仅 ` _init`(各文件 ≤6 个私有断言函数、零公开方法增长、成员 ≤5)——远低于 gdstyle 默认阈值(公开方法 ≤20/成员 ≤15)。
- 存量触面:产品码零触面,S13 基线键零新增;扩展的四份存量测试件不入 gdstyle 基线(测试面直构惯例),无对账键。
## 拆分边界纪律
本卡非拆分/重构类(纯测试增补),不适用拆出单元条款;零删码,无「为机检保留无效成员」面。
@@ -1,460 +0,0 @@
# 需求卡片:架构审查 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.2,2026-11-03 成文;v1.1=grilling 对抗复核 9 阻断+10 建议全采纳修订;v1.2=终审核 3 阻断+1 建议折入——测试适配面闭合判据+S9 参数化泛型形态)。改动面:游戏代码+工具代码(sim 面随批,用户裁完整性优先)。
## 1. 目标与完成定义
**这批做什么**:把 2026-10-29 全库架构审计 §3.1(数值单一事实源被 18 处硬编码击穿)与 §3.2(sim 与 core 四组平行实现)的已裁决事项全部落码——七条设计方案:
| 方案 | 内容 | 一句话 |
|---|---|---|
| 甲 | 死效果通道退役 | EFFECT_KINDS 摘除 overflow/attack_segments 两名+两处分支删除,50/2/3 兜底随之消失 |
| 乙 | 天赋树规则键参数字典 | 六规则键值从开关 1 改参数字典,效果引擎零字面量,economy_spend 折价自 shop 表收回 |
| 丙 | 关卡节点图参数入表+域并单点 | fork_third_way_pct/fill_rest_first_pct/width_max 入 level_gen_params 逐关行;生成器侧域校验删除并回 schema |
| 丁 | 经济三件 | shop 货架位数 shelf_size 入表、variation pack_min 入表+表头三域校验、feat cap 改必填 |
| 戊 | 出生区入表 | board_gen 表头 spawn_edge 入表,SPAWN_AREA_CELLS 常量退役,几何与护栏全由表值导出 |
| 己 | sim 信息面出口 | MinesweeperRules 新增 preview_reveal 只读口;auto_player 补 0 格连锁算子经真实闭包 |
| 庚 | 驱动循环收敛 | battle_driver.drive_round 升级通用签名(策略回调+日志回调),level_autoplay 驱动循环抄本删除;_pick_token 改读 TIER_RANK |
外加:A类① 双写 4 处(main.gd 提示文案两处、playtest_logger ap_per_round、config_db_resolver clamp 域);A类② 入表与兜底全删;sim 组 A/B/D 落地、组 C 零改动只确认、组 E 零动作。
**什么状态算完**:上表七方案与 A类① 的每一条改动都落码、都有改动—验收对照表(第 8 节)配对的验收断言在当轮真实跑批中通过;代码域闸全绿(冒烟+单元+探针+渲染/静态);改前改后读数对拍零非预期漂移(行为零变化项逐位同,己案预期漂移项按第 5 节申报);两份 reports/ 产出物(实现报告+反哺点清单)写齐。
## 2. 设计事实源
- **处置记录(输入合同,逐条一致)**:`reports/处置-架构审查3.1+3.2整改-2026-11-02.md`——总判据六条(§一)、裁决台账(§二)、设计方案甲~庚(§三)、取证事实 18 处现址表(§四)、GDD 落文凭据(§五)、不在本卡范围(§六)。
- **五份已落文 GDD(设计事实源)**:
- `design/gdd/systems/跨局循环/天赋树.md` v0.12——「规则键参数表」节=乙案字段权威(六键参数名与取值域);
- `design/gdd/systems/冒险循环/关卡节点图生成.md` v1.4——丙案三参数 owner(调参表三行);
- `design/gdd/systems/冒险循环/冒险结构.md` v1.4——丁① 货架位数 owner(调参表「货架位数」行);
- `design/gdd/systems/排雷循环/地形变异.md` v1.2——丁② pack_min owner(调参表「连通片下限」行);
- `design/gdd/systems/排雷循环/棋盘生成.md` v1.2——戊案出生区边长 owner(调参表「出生区边长」行+布雷公式指针形态)。
- **审计背景**:`reports/审计-全库架构审查-2026-10-29.md`(行号已漂移,以处置记录取证现址与本卡第 3 节实查为准)。
## 3. 现状事实(2026-11-03 worktree 分支 arch-review-decisions 实查,开工自行复核)
取证表 18 处现址逐条复核结果(与处置记录差异处已标注):
| # | 现址(实查) | 值 | 处置方案 |
|---|---|---|---|
| 1 | core/battle_orchestrator.gd:655-656 | `if tree_rules.has("economy_hoard"): drop = int(round(float(drop) * 1.5))` | 乙 |
| 2 | core/node_map_generator.gd:380 | `rg.randf() < 0.35`(岔口第三去路) | 丙 |
| 3 | core/node_map_generator.gd:455 | `rg.randf() < 0.5`(恢复/奖励交替起始骰) | 丙 |
| 4 | core/node_map_generator.gd:361 | `clampi(int(round(branch_density*L)), 1, 24)`(上限 24 不可达) | 丙 |
| 5 | core/effect_engine.gd:154 | `"do": {"kind": "shield", "value": 1}`(posture_bulwark) | 乙 |
| 6 | core/effect_engine.gd:160 | `"do": {"kind": "damage_mult", "value": 50}`(sense_sharp) | 乙 |
| 7 | core/effect_engine.gd:159/162/169/172 | `"value": 2`(两键 cap_per_level ×4 行) | 乙 |
| 8 | core/damage_controller.gd:412 | `int(h.get("value", 50))`(overflow 死通道兜底) | 甲 |
| 9 | core/board_installer.gd:125 | `stream.randi_range(2, int(...pack_max))`(成包下界) | 丁② |
| 10 | core/settlement/combat_segment.gd:63 | `mini(int(h.get("cap", 2)), ... / maxi(1, int(h.get("divisor", 3))))`(attack_segments 死通道;处置记录写 :64,实查 :63——漂移 1 行) | 甲 |
| 11 | core/shop_session.gd:155 | `if shelf.size() >= 3:`(货架位) | 丁① |
| 12 | core/curio_deck.gd:98-106 | `var cap := 99` 死变量+`row.get("cap", 1)`/`else 1` 双兜底 | 丁③ |
| 13 | core/config_db_resolver.gd:118-119 | `clampf(..., 0.1, 10.0)`;失实「GDD Edge Case」注释实查在 :110(处置记录写 :25——漂移;difficulty_table.gd schema 内同款失实注释同族) | A类① |
| 14 | presentation/playtest_logger.gd:16 | `var ap_per_round := 8`(三副本另两处=action_economy.tres=8、action_economy_table.gd schema `= 6`) | A类① |
| 15 | core/node_map_generator.gd:12 | `const MAX_WIDTH := 4` | 丙 |
| 16 | core/node_map_generator.gd:76-99 | `check_params` → `_cp_domain`(域校验 :76-99;`_cp_structural` :104-122 可行性判定 schema 无此判定、**保留**) | 丙 |
| 17 | core/board_data.gd:9 | `const SPAWN_AREA_CELLS := 9`(被 board_gen_table.gd:77/:106 反向引用=跨目录回边) | 戊 |
| 18 | presentation/main.gd:633 与 :636 | 「弃图刷新需 8」「每轮 2 次」(处置记录写 ~:783-790,实查 :633/:636——iter46/48 漂移,正确读表先例在同函数 :625/:629/:664) | A类① |
其他现状事实(写 T 卡依据):
- **tree_rules 流**(乙案改造路径):meta_progression.gd:388-401 `tree_rule_keys()` 返回键数组 ← main.gd:198 注入参数面 ← adventure_runner.gd:39/:126/:166/:361(`Array[Variant]`+`is Array` 守卫)→ level_runner.gd:94/:542/:664-665/:733 → battle_orchestrator.gd:351-353 传 `battle_fx_host.gd:182-183`(`rebuild_subscriptions(feats: Array, attunement: Array, tree_rules: Array)` 第三参 typed Array——乙案必须同步改 Dictionary,漏改即每次 begin_battle 运行期崩)→ effect_engine.gd:103-107/:137-139 `_push_tree_rule(rk)` 四分支(:145-174,economy 两键零合成行不入 match)硬编码参数;economy 两键零订阅行,消费点=battle_orchestrator.gd:654 与 shop_session.gd:58-61(`db.run.shop.spend_discount`=0.8,shop.tres:96)+:333 `_rules() -> Array`。meta_tree.tres 三 Fork 行 `effects_a/b` 现为开关值 1。测试侧键数组注入:feat_vouchers_test.gd:168 `["sense_guard"]`、meta_progression_forge_test.gd:737 `["economy_spend"]`、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 四处 `rebuild([], [], [])`;tree_rules_v11_test.gd:40-77 夹具镜像硬编码值;meta_progression_forge_test.gd:312 `tree_rule_keys()`。sim 侧:adventure_monte_carlo.gd:61-65 三档键数组注入(db 在 :67 才加载——注入序需调整)、level_autoplay.gd:162-163 透传。
- **甲案死通道**:EFFECT_KINDS(effect_engine.gd:28-66)含 `"attack_segments"`(:29)与 `"overflow"`(:29);`_vtr_do_keys`(effect_engine.gd:430-443)对 do.kind 强校验 EFFECT_KINDS——词表摘名即加载致命。全库 .tres 零行使用此两名(grep 实核)。overflow 施加面=damage_controller.gd:400-415 `_kill_overflow`(调用点 :394,:359 注释提及);attack_segments 消费面=combat_segment.gd:62-70(source_class 名 `fx_streak_segments`,:66 开票)。断言面 grep 全量:tests/unit/core/adventure_feats_test.gd:743 用 kill 事件载荷键 `"overflow": 0`(**事件数据键,非效果类型词**);tests/unit/battle_settlement/round_flow_skill_pool_test.gd:442 排除表含 `"fx_streak_segments"`、:423/:448 注释提「连珠矢」。effect_engine.gd:464「任意真族」注释列 overflow。
- **戊案面**:SPAWN_AREA_CELLS 引用共 5 处——board_generator.gd:19(target_mine_count 静态公式)、board_data.gd:9(定义)、board_gen_table.gd:77/:106/:107(schema 反向引用);测试引用 4 处——tests/unit/core/board_gen_reward_test.gd:204/:212/:217/:218、board_generator_test.gd:71。board_data.gd:71-79 `spawn_cells()` 硬编码 `range(-1, 2)` 3×3 几何;board_generator.gd:148-152 `_shave_ring` 硬编码 `<= 1 + shave_r`(1=(3−1)/2);board_gen.tres 现无表头字段(:5 起直接 rows)。board_gen_table.gd 已有零哨兵先例:无 @export 初始化即 0 出域。board_generator.gd:24-25 注释声明 db 鸭子型(测量桩注入);sim/calibrate_boards.gd:10-19 FakeDB 桩 `_FakeBoardGen` 只暴露 `resolve_row`,:45-54 rd 行字典透传表行字段(shave/r0_cap 两参数已有同款透传先例)。
- **丁案面**:shop_table.gd:16 `spend_discount: float = 0.8`+validate :134 域校验;零哨兵先例同文件 price_a/price_b(`= 0.0`,"0 = 未投值即致命域")。variation_table.gd 表头三字段 percent_of_cells/per_level_bonus/pack_max 均 @export 带**非零默认**(5/2/4)且 validate() 零表头校验(grep 实核)。feat_table.gd:41 cap 可选(`if row.has("cap") and ... < 1`),feats.tres 37 行仅 7 行写 cap;config_db_cross_validator.gd:91 注释已登记 cap ∈ [1,99]。curio_deck.gd:30-39 `build()` 的 relic 令牌 feat_id 直源自 feats 活行(常态悬空不可达,断点续玩跨版本时可达)。
- **庚案面**:battle_driver.gd 全文 38 行——`drive_round(settlement, still_running: Callable = Callable())`(:17)单轮循环:guard=GUARD_ACTIONS(400)、策略=AutoPlayer.choose_dig(plan 一次算定、move+dig 合步提交、move 后查相位/轮次变更即弃 dig)、轮末统一 stop;四调用方全两参形态——dump_battle.gd:30、monte_carlo.gd:74、damage_probe.gd:102/:346、skill_rhythm_probe.gd:58(升级后零改动)。level_autoplay.gd:521-568 `_autoplay_battle(runner, settlement, st, logger)` 外层 round_guard=60 轮循环+内层 action_guard=400/rejects<3 单轮循环,策略=`_decide_act`(:618-624 三档分派 perfect/adv 失误注入/novice),提交=`_submit_intent`(:626-631,kind seal→settle_batch 动作名 seal_place,logger.log_action 带轮号),refresh 走 `player_request_refresh()`,计数 st.rounds/refreshes/seal_placed。logger 会话装配序=先 `start_session` 后设 `ap_per_round`(run_level :39-42、run_adventure :117-120——R5 删默认后守卫即拒、两处会话静默不开,须注入序前置)。测试直接调用 `_autoplay_battle(r, b, st, logger)` 13 处(adventure_feats_test×4、level_shop_economy_test×9)——签名不变则零波及。`_pick_token`(:292-318)字面量 rank match(legendary 4/rare 3/excellent 2/common 1,未知档 0);单点常量=data/schemas/treasure_item_table.gd:44 `TIER_RANK`;消费先例=meta_progression.gd:499。damage_probe.gd 复算面(:196-201 一带)维持,头注自陈「诊断工具·非验收件」,run_all.gd 与 run_all_gates.sh 零引用(grep 实核)。
- **己案面**:minesweeper_rules.gd `_chain_closure`(:372-384)与 `_chain_reveal_order`(:386-399)私有;唯一公开揭示口 settle_batch(:215)带扣费与事件;`_classify`(:243-262)已示范「挖封印格同口径」模拟封印集形态(sim_seals.erase(c))。auto_player.gd 全 static 无持久成员,查询面=is_revealed/has_seal/reveal_record/current_board/compute_move_path;`_deduce`(:114-152)single+subset 不动点,缺 0 格连锁算子(core 侧 board_generator.gd:204-215 `_apply_chain_rule` 有——口径差异=unknown 不含 safe_set oracle,:80-83 注释在账);novice 档 `_deduce_single`(:55-85)单规则画像。
- **组 D 面**:experiment_density 引用 6 处——sim/board_generator.gd 无(注释在 **core**/board_generator.gd:23)、data/tables/board_gen.tres:414 调参注释、game/README.md:53 工具行、game/tests/README.md:304 在册行(写卡段已删,见第 7 节 T9)、审计报告两处(过程件不动)+文件本体与 .uid。
- **能力清单**:`game/tests/README.md` 现行 30 行能力表+覆盖域表在役;本批增改行见第 7 节 T10 与第 8 节对照表「能力行」列。
## 4. 设计契约(违反即返工红线)
- 🔴 **逐条一致**:本卡一切内容与处置记录逐条一致;实现段发现卡面与处置记录冲突=上游缺陷,停卡退回写卡段(L3)。
- 🔴 **零缺省**(总判据 2):本批新入表字段全部必填、无缺省——表行缺字段=加载期报错;代码禁默默顶默认值。schema 侧落法=@export 零哨兵(int 0 / float 0.0)+validate 域校验出域即拒(shop_table price_a/price_b 先例)。
- 🔴 **死代码不保留**(总判据 3):甲案两名摘除后禁留兼容别名、禁留注释死分支、禁保留指向死通道的载荷键与排除表成员。
- 🔴 **sim 零规则副本**(总判据 4):庚案收敛后 `level_autoplay.gd` 禁再持第二轮驱动循环;己案后 sim 禁自算连锁闭包——一律经 `preview_reveal`。
- 🔴 **数值单一事实源**:本批触碰的每处字面量按处置方案入表或读单点;效果引擎落成后全文件零玩法数值字面量(六键参数全读节点行)。
- 🔴 **行为零变化面逐位同**:甲/乙/丙/丁/戊/庚六案的现行值迁移(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)。
- 禁为机检文本保留无效成员(第 13 节条款全卡适用)。
## 5. 范围边界
**收件**(=处置记录全部事项):
- A类①:#1/#2 main.gd 提示文案两处读表拼接(取证表 #18);#13 config_db_resolver clamp 读 DifficultyTable.MULT_MIN/MULT_MAX+失实注释订正;#14 playtest_logger 删默认改必填注入+action_economy_table.gd schema 默认删除(取证异常清单三副本项,卡裁=删默认)。
- A类②+B类入表:乙(六键参数字典+economy_spend 收回)、丙(三参数入表+域并单点+死上限删除)、丁(三件)、戊(spawn_edge)、#4 死上限 24 删除。
- 甲:死效果通道整段退役(EFFECT_KINDS 两名+两分支+兜底 50/2/3+载荷键与排除表成员等死面清理)。
- sim:组 A(庚 案)、组 B(己 案)、组 C(零代码改动,T10 只写确认项)、组 D(experiment_density 删除+引用面处理);组 E 零动作(calibrate_boards FakeDB 模式维持——戊案连带仅 rd 透传一行,见 T3)。
- 乙案连带(处置记录未点名但不可避免的编译级波及,全列 T1):tree_rules 面从键数组换代参数字典波及的 core/presentation/sim/tests 全部触点。
**不收件**(去向已指认):
- B类 CHARGE_LAYER_CAP 死框架——**待办清单专条**(2026-11-02 登记「EffectPort biz_fact 键 charge_layers——无属主数据游离出领域实体的处置」,涉及迭代 49 端口契约,独立走卡)。本卡零触碰 action_economy.gd。
- sim 标定常量(失误三概率/选路评分)——用户裁接受现状零动作。
- 审计 P1/P2 四项(闸面缺口/S13 豁免存废/零测试点名四件/架构文档漂移三处)——留待后续讨论段(待办清单条目「本条未闭合余项」)。
- damage_probe 复算面——按需诊断件维持,零改动(T10 确认项)。
- MC 重跑——零收件。己案 0 格连锁补齐改变模拟玩家行为(通关率预期上调、旧 MC 锚漂移):重跑归用户按 `sim-data/README.md` MC 采集档位表发起(一档只能由用户发起);本批只在实现报告登记「锚漂移预期+旧锚失效范围」。
- 组 C 确认以外的 damage_probe / defense_scan / rhythm_batch 等测量件改版。
## 6. 关联文档同步面
实现批禁写 `design/` 整个目录、两份根流程清单与 `game/tests/README.md`;下表每条的落文义务全部进 `reports/iter<N>-反哺点-<日期>.md`(N=编排段定),由用户裁决后归文档批落文:
| 文档 | 关联点(本批实现会改变它的哪条陈述) | 同步义务(反哺点清单逐条承载) |
|---|---|---|
| design/engineering/architecture/architecture.md | 己案新增 `MinesweeperRules.preview_reveal` 公开只读口(core 公开 API 面);戊案 SPAWN_AREA_CELLS 常量退役(件表/常量登记面如有登记);庚案 battle_driver 通用签名 | 反哺点清单逐条列:件表行增改内容与依据(处置记录己案「architecture.md 件表行随反哺点落文」)——**机械面文档禁直改** |
| design/gdd/systems/跨局循环/天赋树.md v0.12 | 无陈述变化(规则键参数表已是本批字段权威)——若实现段发现参数表与卡面不一致=上游缺陷停卡 | 反哺点清单写「零反哺」确认行 |
| design/gdd/systems/冒险循环/关卡节点图生成.md v1.4 | 无陈述变化(调参表三行已落) | 同上确认行 |
| design/gdd/systems/冒险循环/冒险结构.md v1.4 | 无陈述变化(货架位数行已落 v1.4;「财富之道两参数归天赋树规则键参数表」句已落) | 同上确认行 |
| design/gdd/systems/排雷循环/地形变异.md v1.2 | 无陈述变化(pack_min 行已落) | 同上确认行 |
| design/gdd/systems/排雷循环/棋盘生成.md v1.2 | 无陈述变化(出生区边长行已落 v1.2) | 同上确认行 |
| design/gdd/systems/冒险循环/奇物.md | 丁③ cap 字段清单行(处置记录丁案明示「奇物.md(cap 字段清单行随卡申报反哺)」——feats 行 cap 改必填后,奇物文档对 cap 的现行陈述(若有「可缺省/缺省按 1」类句)需订正 | 反哺点清单列明:奇物.md 中 cap 相关句的现址行号与订正内容 |
| 术语表 | 无新术语(本批沿用处置记录既定用词:参数字典/只读口/驱动循环单点等仓库现行词) | 确认行「零新增术语」 |
(机检口径:本表同步义务格无一条写「随批」;所有 design/ 与根规则文件目标格的义务都是「反哺点清单落文」。)
## 7. 任务卡 T0..T10
### 卡前·文件结构图
行为改动行标【行为】+对照表行号(第 8 节 R 行);非行为改动标【非行为】。测试件全部为随逻辑写/改的测试代码(需求改动合法面)。
```
数据面(表+schema)
game/data/tables/meta_tree.tres 【行为 R1】三 Fork 行 effects_a/b 开关值 1 → 参数字典
game/data/schemas/meta_tree_table.gd 【行为 R1】RULE_KEY_PARAMS 常量+_validate_rule_key_params
game/data/tables/shop.tres 【行为 R2/R9】表头 +shelf_size=3、-spend_discount=0.8
game/data/schemas/shop_table.gd 【行为 R2/R9】+shelf_size(零哨兵+[1,6])/-spend_discount 及其域校验
game/data/tables/level_gen_params.tres 【行为 R7】三行 × +fork_third_way_pct=35/+fill_rest_first_pct=50/+width_max=4
game/data/schemas/level_gen_params.gd 【行为 R7】ROW_KEYS+三键+三域校验
game/data/tables/board_gen.tres 【行为 R8】表头 +spawn_edge=3;:414 调参注释改「出处=退役件 experiment_density.gd(git 历史可考)」【非行为】
game/data/schemas/board_gen_table.gd 【行为 R8】+spawn_edge(零哨兵+[3,5]奇数)+三处引用改表值导出
game/data/tables/variation.tres 【行为 R10】表头 +pack_min=2
game/data/schemas/variation_table.gd 【行为 R10】+pack_min([1,pack_max])+表头三字段域校验
game/data/tables/feats.tres 【行为 R11】30 行补 cap: 1(7 行已写保持)
game/data/schemas/feat_table.gd 【行为 R11】cap 必填+域 [1,99]
game/data/schemas/action_economy_table.gd 【行为 R5】ap_per_round 删默认(零哨兵化)
game/data/schemas/difficulty_table.gd 【非行为】失实「GDD Edge Case」注释订正(同 #13 族)
core 层
game/core/effect_engine.gd 【行为 R1/R3】rebuild/_push_tree_rules/_push_tree_rule 参数化(四分支读参数——economy 两键零合成行不入 match);EFFECT_KINDS 摘两名;:464 族注释改【非行为】
game/core/battle_orchestrator.gd 【行为 R1】tree_rules 收参 Dictionary;:654-656 economy_hoard 读 mult_pct
game/core/battle_fx_host.gd 【行为 R1 连带】:182 rebuild_subscriptions 第三参 typed Array → Dictionary
game/core/shop_session.gd 【行为 R1/R9】_rules() 返 Dictionary;_spend_discounted 读规则键参数;:155 货架位读表
game/core/adventure_runner.gd 【行为 R1】_tree_rules 换 Dictionary+两处守卫改 is Dictionary
game/core/level_runner.gd 【行为 R1】同上(:94/:664-665/:542/:733)
game/core/meta_progression.gd 【行为 R1】tree_rule_keys() → tree_rules() -> Dictionary
game/core/node_map_generator.gd 【行为 R7】MAX_WIDTH 删、:361 死上限删、:380/:382/:455 三处读表、_cp_domain 删并回 schema
game/core/board_data.gd 【行为 R8】SPAWN_AREA_CELLS 删;spawn_cells() 几何改 spawn_edge 成员导出;compute_r0 同源
game/core/board_generator.gd 【行为 R8】target_mine_count/_board_params/_attempt 读 spawn_edge;_shave_ring 半径=(edge−1)/2+r;:23 注释改举例名 calibrate_boards【非行为】
game/core/board_installer.gd 【行为 R10】:125 成包下界读 pack_min
game/core/curio_deck.gd 【行为 R11】:98-106 死变量删+relic 行悬空 push_error+return false(兜底 1 删)
game/core/damage_controller.gd 【行为 R3】_kill_overflow 改名 _kill_effects+overflow 分支删(reveal_tiles 分支保留)+:359 注释同步
game/core/settlement/combat_segment.gd 【行为 R3】attack_segments 分支删(:59-70)
game/core/config_db_resolver.gd 【行为 R6】:118-119 clamp 读 DifficultyTable.MULT_MIN/MULT_MAX;:110 失实注释订正【非行为】
game/core/minesweeper_rules.gd 【行为 R14】+preview_reveal(c) -> Array[Vector2i]
presentation 层
game/presentation/main.gd 【行为 R1/R4】:198 tree_rules() 调用(:185 注释同步);:633/:636 两处文案读表拼接
game/presentation/playtest_logger.gd 【行为 R5】:16 删默认=0;start_session 必填注入守卫
sim 层
game/sim/battle_driver.gd 【行为 R12】drive_round 通用签名(策略回调+日志回调+max_rejects;缺省零变化)
game/sim/level_autoplay.gd 【行为 R12/R13】_autoplay_battle 内层委托 drive_round;_pick_token 改读 TIER_RANK;:39-42/:117-120 注入序前置〔R5 连带〕;:162-163 透传守卫 Dictionary〔R1 类型适配·非行为,T10 确认读数〕
game/sim/adventure_monte_carlo.gd 【行为 R1 连带·对照表落点=R1】三档注入改参数字典(db 加载序前置)+_tree_rule_dict 断言挂 tree_rules_v11_test〔V1〕
game/sim/auto_player.gd 【行为 R15】_deduce 补 0 格连锁算子经 preview_reveal;口径注释保持【非行为】
game/sim/calibrate_boards.gd 【行为 R8 连带】rd 透传一行 spawn_edge(读真表头,零字面量)
game/sim/experiment_density.gd 【删除·组D】连同 .uid
测试件(随逻辑写/改)
tests/unit/core/tree_rules_v11_test.gd 【行为 R1】夹具参数化++_test_rule_key_params 检查段
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 删(断言内容不动)+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²
tests/unit/core/board_gen_reward_test.gd 【非行为】夹具表补 spawn_edge=3;:204-218 断言改 spawn_edge² 推导(断言强度不减)
tests/unit/core/level_shop_economy_test.gd 【行为 R2/R9】+_test_shelf_size_from_table+_test_spend_discount_from_rule_key 段+:264 迁移断言删(申报 7)
tests/unit/battle_settlement/variant_placement_test.gd 【行为 R10】+_test_pack_min_from_table 段
tests/unit/data_config/level_gen_params_test.gd 【行为 R7】_row() 构造器补三新键+负样本夹具同步
tests/unit/core/table_structure_guard_test.gd 【行为 R7/R10/R11】+_test_level_gen_new_fields+_test_variation_header_domains+_test_feat_cap_required
tests/unit/core/minesweeper_rules_test.gd 【行为 R14】+_test_preview_reveal_readonly 段
tests/unit/presentation/player_copy_sweep_test.gd 【行为 R4】+_sweep_refresh_toast_no_literals 段
tests/unit/data_config/effect_kind_retired_test.gd 【行为 R3·新增·负面】甲案词表退役加载致命
tests/unit/core/playtest_logger_guard_test.gd 【行为 R5·新增】未注入拒绝开会话
tests/unit/core/battle_driver_drive_test.gd 【行为 R12·新增】drive_round 契约
tests/unit/core/auto_player_deduce_test.gd 【行为 R15·新增】0 格连锁算子
tests/run_all.gd 【非行为】manifest +4 行(一负面三常规:effect_kind_retired/playtest_logger_guard/battle_driver_drive/auto_player_deduce)
文档件
game/README.md:53 【非行为·组D】工具行删 experiment_density
game/tests/README.md 写卡段已同批增改(能力行新增 10 行+既有行更新 5 处+experiment_density 在册行删 1 行)——实现批禁写,批末只核对表上名字与实际落地一致
```
边界说明:一起改的按职责放一起——表+schema 同卡、消费面同卡、验收随对应卡同轮落地。库内大文件(main.gd/battle_orchestrator.gd)不擅自拆。
---
**T0 基线读数与机检对账**(估时 0.25–0.5 工作日)
取用:无。产出:基线读数入实现报告(后续卡对拍用);本批全部断言面清点确认。
- [ ] S13 对账基线:对结构图全部 core/data/presentation 存量触件(25 件,gdstyle 扫描面内;实触存量生产件共 30 件,其余 5 件在 sim/tests 非扫描面)现场跑 gdstyle 记读数(branches/returns/函数长/成员数)为对账基线——`tools/gdstyle_baseline.txt` 既有登记仅 5 键 3 文件,多数件无登记值可读,现场读数即基线(既有登记 2 件照登对账)——第 14 节「只降不升」以此为准
- [ ] grep 清点四件:`overflow`/`attack_segments`/`fx_streak_segments`/`experiment_density` 全库命中行号清单落实现报告(甲案与 T9 的改前底账)
- [ ] 跑一次冒烟基线:`python tools/run_smoke.py` 全绿读数落实现报告(后续每卡改后对拍基准;不构成验收,验收归第 8 节对照表)
- [ ] 复核取证表 18 处现址与本卡第 3 节逐条一致(漂移即停卡呈报 L3——上游缺陷退写卡段)
**T1 乙案·规则键参数字典**(估时 1–1.5 工作日)
取用:无(本卡起点)。产出:tree_rules 参数字典形态全库贯通(后续 T7 的 level_autoplay relic 透传消费此形态)。
- [ ] meta_tree.tres 三 Fork 行 effects_a/effects_b 值改参数字典——精确行内容(六键全列,对照天赋树.md v0.12 规则键参数表):
- fork_posture:`"effects_a": {"posture_first_strike": {"ap_bonus": 1}}`、`"effects_b": {"posture_bulwark": {"shield": 1}}`
- fork_sense:`"effects_a": {"sense_sharp": {"halve_pct": 50, "cap_per_level": 2}}`、`"effects_b": {"sense_guard": {"ap_refund": 1, "cap_per_level": 2}}`
- fork_economy:`"effects_a": {"economy_hoard": {"mult_pct": 150}}`、`"effects_b": {"economy_spend": {"discount_pct": 80}}`
- (语义注记: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: 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[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)
- [ ] 孤立验证新增段 → 出红只跑红件最小单元 → 并入全套(回归措辞:里程碑卡出口跑一次全套闸;卡内修复只做出红最小单元的最窄确认)
**T2 丙案·节点图参数入表+域并单点**(估时 0.5–0.75 工作日)
取用:无。产出:level_gen_params 三新字段+生成器域校验并单点。
- [ ] level_gen_params.gd:ROW_KEYS 追加 `"fork_third_way_pct", "fill_rest_first_pct", "width_max"`;_validate_row_shape 追加三域——fork_third_way_pct float [0,100]、fill_rest_first_pct float [0,100]、width_max int [2,6](域=关卡节点图生成.md v1.4 调参表)
- [ ] level_gen_params.tres 三行各补 `"fork_third_way_pct": 35, "fill_rest_first_pct": 50, "width_max": 4`(percent 形态按 v1.4 调参表域 [0,100]——35/50 与现码 0.35/0.5 同概率语义,消费除 100.0)
- [ ] node_map_generator.gd:删 `const MAX_WIDTH := 4`(:12);:361 `clampi(..., 1, 24)` 改 `maxi(int(round(float(_params["branch_density"]) * float(L))), 1)`(死上限 24 删、下限 1 保留防零岔口与现行为漂移);:380 `< 0.35` 改 `< float(_params["fork_third_way_pct"]) / 100.0`;:382 `>= MAX_WIDTH` 改 `>= int(_params["width_max"])`;:455 `< 0.5` 改 `< float(_params["fill_rest_first_pct"]) / 100.0`
- [ ] node_map_generator.gd:`check_params` 删 `_cp_domain` 调用(改直接 `return _cp_structural(params)`)+删 `_cp_domain` 整函数(:76-99)——域校验唯一落 LevelGenParams.validate(加载期),生成器保留可行性判定 `_cp_structural`(schema 无此判定)
- [ ] node_map_generator_test.gd 追加 `_test_gen_params_table_driven` 检查段:真实表行(row_by_level_index)产图回归同种子逐位;三参数改值夹具(width_max 2→岔口锚点限宽可观测、fork_third_way_pct 0→无三去路图、fill_rest_first_pct 100→填充首节点恒恢复)产出可观测变化断言
- [ ] table_structure_guard_test.gd 追加 `_test_level_gen_new_fields` 检查段:缺新键行拒(structural 键集闭集)、width_max 越域拒、两 pct 越域拒、表值 35/50/4 全过
- [ ] tests/unit/data_config/level_gen_params_test.gd:`_row()` 构造器(:24-27)补三新键(`fork_third_way_pct: 35, fill_rest_first_pct: 50, width_max: 4`)——否则 ROW_KEYS 闭集校验拒全部夹具行、:89 起「合法三行」断言整组转红;负样本夹具(bad_keys_row 多塞键等)同步核——多塞键负样本仍须拒、合法行须全过
- [ ] node_map_growth_test.gd 手搭夹具(:70/:74/:96 一带)补三新键——结构拦截断言与 fatal 子进程不动(回归)
**T3 戊案·出生区入表**(估时 0.5–1 工作日)
取用:T0 基线读数。产出:spawn_edge 表头单点,SPAWN_AREA_CELLS 退役,跨目录回边(board_gen_table→board_data)解除。
- [ ] board_gen_table.gd:`@export var spawn_edge: int = 0`(零哨兵——表头缺字段越域即加载致命);validate 新增域校验 `spawn_edge < 3 or spawn_edge > 5 or spawn_edge % 2 == 0` → domain 错;`_validate_row_constraints` :77 与 `_validate_shave_params` :106-107 的 `BoardData.SPAWN_AREA_CELLS` 全改 `spawn_edge * spawn_edge`(含 :76/:105 注释)
- [ ] board_gen.tres 表头(rows 前)加 `spawn_edge = 3`;:414 调参注释「smoke/experiment_density.gd」改「出处=退役件 experiment_density.gd(git 历史可考)」(不写提交哈希——哈希查 git log,注释只留可读指针)
- [ ] board_data.gd:删 `const SPAWN_AREA_CELLS := 9`(:7-9 注释随行删);新增成员 `var spawn_edge: int = 0`;`spawn_cells()`(:71-79)改 `var half := spawn_edge / 2`+`for dy in range(-half, half + 1)`(spawn_edge=3 时与现 3×3 逐位同——含 in_bounds 过滤);compute_r0()(:98-115)经 spawn_cells 自动同源;:7-8 文件头注释同步
- [ ] board_generator.gd:`target_mine_count`(:18-20)改 `int(round(float(params.density) * float(int(params.w) * int(params.h) - int(params.spawn_edge) * int(params.spawn_edge))))`;`_board_params`(:36-51)加 `"spawn_edge": int(row.spawn_edge)`(直索引——缺键即崩=fail-fast,schema 与 resolve 注入保证在场);`_attempt`(:103 一带)加 `b.spawn_edge = int(params.spawn_edge)`;`_shave_ring`(:148-152)`<= 1 + shave_r` 改 `<= (int(b.spawn_edge) - 1) / 2 + shave_r`(spawn_edge=3 时逐位同——出生区半径同一事实不二处定义);:22-23 注释「experiment_density.gd 等」改「calibrate_boards.gd」
- [ ] calibrate_boards.gd(组 E 零动作例外:一行编译级连带)——rd 字典(:45-54 透传段)加 `"spawn_edge": int(db.combat.board_gen.spawn_edge),`(读真表头、零字面量,FakeDB 模式与桩结构不动)
- [ ] 测试:board_generator_test.gd 追加 `_test_spawn_edge_from_table` 检查段(夹具表 spawn_edge=5 → 布雷域基、R₀ 下限、剃雷域半径按 25 格可观测变化;=3 回归逐位同);:71 `from_expr` 对账改 spawn_edge² 推导(夹具 params 补 spawn_edge 键);board_gen_reward_test.gd 夹具表补 `spawn_edge = 3` 成员赋值、:204/:212/:217/:218 的 `BoardData.SPAWN_AREA_CELLS` 改夹具表 `spawn_edge * spawn_edge` 推导(断言强度不减:cap 压线语义保持 9 格)
**T4 丁案·经济三件**(估时 0.5–1 工作日)
取用:无。产出:shelf_size/pack_min/feat cap 三事实源入表。
- [ ] shop_table.gd:`@export var shelf_size: int = 0`(零哨兵)+validate 域校验 `shelf_size < 1 or shelf_size > 6` → domain 错;shop.tres 表头加 `shelf_size = 3`
- [ ] shop_session.gd:155 `if shelf.size() >= 3:` 改 `>= int(db.run.shop.shelf_size)`
- [ ] variation_table.gd:`@export var pack_min: int = 0`(零哨兵)+validate 新增 `_validate_header_domains` 段——pack_min ∈ [1, pack_max]、percent_of_cells ∈ [0, 50](地形变异.md v1.2 调参表)、per_level_bonus ∈ [0, 9]、pack_max ∈ [pack_min, 9](owner 域表述对齐;现表头三字段零校验补齐);variation.tres 表头加 `pack_min = 2`
- [ ] board_installer.gd:125 `stream.randi_range(2, ...)` 改 `stream.randi_range(int(db.combat.variation.pack_min), ...)`(pack_min=2 时逐位同)
- [ ] feat_table.gd :41 cap 校验改必填:`if not row.has("cap")` → domain 错「缺 cap(必填——零兜底)」;`elif int(row.get("cap", 0)) < 1 or > 99` → domain 错(域 [1,99]=config_db_cross_validator.gd:91 在册口径)
- [ ] feats.tres 30 行补 `cap: 1`——批量手法:python 脚本逐行在 `rarity` 行后插 `cap: 1`(仅对无 cap 行;7 行已写保持原值),脚本用后即删(吸收即死);校验=feat_table.validate 全过+`grep -c 'cap' feats.tres` = 37
- [ ] curio_deck.gd:98-106:删 `var cap := 99` 死变量;relic 分支改 `var row := db.crossrun.feats.row_by_id(feat_id)`+`if row.is_empty(): push_error("[奇物牌库] relic 令牌引用悬空 feat_id=%s(feats 表无此行——配置违约,禁兜底)" % feat_id); return false`,在场行 `return taken.get("relic:" + feat_id, 0) < int(row["cap"])`(直索引——schema 必填保证在键)
- [ ] table_structure_guard_test.gd 追加 `_test_variation_header_domains`+`_test_feat_cap_required` 检查段(域正反例+feats.tres 全行 cap 在场断言);variant_placement_test.gd 追加 `_test_pack_min_from_table` 检查段(夹具 pack_min=3 → 布置产物零 1–2 格连通片可观测断言,真实入口 begin_battle 布置段);level_shop_economy_test.gd 追加 `_test_shelf_size_from_table` 检查段(夹具 shelf_size=5 → 货架五件可观测,真实入口 shop 货架构建)+:264 `spend_discount == 0.8` 迁移断言行删除(申报 7——字段随 T1 退役,表值迁移断言使命终结,等价判据由 `_test_spend_discount_from_rule_key`〔V2〕承接)
**T5 甲案·死效果通道退役**(估时 0.75–1 工作日)
取用:T0 grep 底账。产出:EFFECT_KINDS 闭面收窄,两名误写加载致命(负面套件)。
- [ ] effect_engine.gd EFFECT_KINDS(:29)摘 `"attack_segments"` 与 `"overflow"` 两名;:464「任意真族」注释删 overflow 成员
- [ ] damage_controller.gd:`_kill_overflow`(:400-415)改名 `_kill_effects(t: Dictionary, target: Dictionary, landed: int) -> void`——`overflow` 分支(:404-415:`if String(h.get("kind", "")) != "overflow": continue` 起至 open_ticket/入队/递归段)删除,reveal_tiles 分支(斩首学者)保留;调用点 :394 改名;:359 注释「击杀发射面拆 _kill_overflow」同步;kill 事件载荷键 `"overflow": landed` 删除(死通道整体退役——全库零订阅行消费此键,grep 实核)
- [ ] combat_segment.gd::59-70 attack_segments 消费段整删(注释 :59-61+for 循环 :62-70)——cap 2/divisor 3/value 0 兜底随之消失;fx_attack_hits 载荷键自此零写零读
- [ ] 测试清理:adventure_feats_test.gd:743 dispatch 载荷删 `"overflow": 0` 键(断言内容「斩首学者击杀揭示 1 格」不动);round_flow_skill_pool_test.gd :442 排除表删 `"fx_streak_segments"` 成员、:423/:448 注释删「连珠矢」句(段内序断言不动)
- [ ] 新增负面套件 tests/unit/data_config/effect_kind_retired_test.gd(extends SceneTree,沿 counter_prefix_fatal_test.gd 既有形态:user:// 夹具目录复制 feats.tres → 注入 do.kind="overflow" 探针行与 do.kind="attack_segments" 探针行各一 → `ConfigDB.load_tables` → 两探针均被 validate_trigger_row 拒绝(EFFECT_KINDS 出域)→ 违规被放行即 `quit(2)`;全拒 `quit(1)` 语义与既有负面件一致——运行命令注释在文件头)
- [ ] run_all.gd manifest 追加:`{"path": "res://tests/unit/data_config/effect_kind_retired_test.gd", "expect": 1, "negative": true}, # 甲案词表退役——overflow/attack_segments 误写加载致命〔架构整改〕`
**T6 A类①·双写四处置**(估时 0.5–0.75 工作日)
取用:无。产出:提示文案与 clamp 域读单点,logger 必填注入。
- [ ] main.gd:633 `"...(弃图刷新需 8)" % (cost - rap)` 改 `"...(弃图刷新需 %d)" % [cost - rap, cost]`(cost=:629 表读值);:636 `"本轮刷新次数已用完(每轮 2 次)"` 改 `"本轮刷新次数已用完(每轮 %d 次)" % int(db.run.action_economy.refresh_cap_per_round)`(同函数 :625 正确读表先例同款)
- [ ] config_db_resolver.gd:118-119 两处 `0.1, 10.0` 改 `DifficultyTable.MULT_MIN, DifficultyTable.MULT_MAX`(单点=data/schemas/difficulty_table.gd:9-:10);:110 注释「(GDD Edge Case——组合事故非配置事故)」失实句删(GDD 无此节);difficulty_table.gd 同款失实注释(mult_oor_warning 校验处)同步订正
- [ ] level_autoplay.gd:39-42 与 :117-120 注入序前置——`logger.ap_per_round = int(db.run.action_economy.ap_per_round)` 移到 `logger.start_session(seed_val)` 之前(R5 删默认后守卫拒后开=两处会话静默不开)
- [ ] playtest_logger.gd:16 `var ap_per_round := 8` 改 `var ap_per_round: int = 0`(零缺省);`start_session`(:24)开头加守卫 `if ap_per_round < 1 or ap_per_round > 32: push_error("[试玩日志器] ap_per_round 未注入或越域: %d——组合根必填注入" % ap_per_round); return ""`(:9 返回契约注释同步;_append 空文件守卫已兜住未开会话的 log_* 调用——实核 :172-176)
- [ ] action_economy_table.gd:9 `@export var ap_per_round: int = 6` 删默认(`@export var ap_per_round: int`——零哨兵,表行缺字段越域 [1,32] 加载致命;action_economy.tres 已显式写 8,加载零影响)
- [ ] 新增 tests/unit/core/playtest_logger_guard_test.gd:未注入调 start_session → 返回空串+零文件产出断言;注入 8 → 返回非空路径断言(真实入口=PlaytestLogger.start_session)
- [ ] run_all.gd manifest 追加:`{"path": "res://tests/unit/core/playtest_logger_guard_test.gd", "expect": 0}, # R5 必填注入守卫〔架构整改〕`
- [ ] config_db_resolver_test.gd `_test_difficulty_clamp` 回归(clamp 值 0.1/10.0 不变,来源换常量)
**T7 庚案·驱动循环收敛+档位排序读表**(估时 0.75–1 工作日)
取用:无。产出:drive_round 驱动循环单点(缺省零变化),level_autoplay 抄本删除。
- [ ] battle_driver.gd `drive_round` 升级通用签名——精确签名与契约:
```
static func drive_round(settlement, still_running: Callable = Callable(),
act_provider: Callable = Callable(), on_action: Callable = Callable(),
max_rejects: int = 0) -> void
```
- act_provider 契约:`func(settlement) -> Dictionary`——返回 `{"kind": "stop"}` 或空字典=停手出环;单步 `{"kind": "move"|"dig"|"seal"|"refresh", "cell": Vector2i}`(refresh 无 cell);合步 `{"kind": "move", "cell": X, "next": {"kind": "dig", "cell": Y}}`(缺省策略适配 AutoPlayer.choose_dig 原生 plan 专用——move 提交后查相位/轮次、变更即断弃 next,与现 :30-33 逐位同)
- 提交分派:move/dig/seal→`minesweeper.settle_batch([{...}])`(seal 提交动作名 seal_place);refresh→`settlement.player_request_refresh()`
- on_action 契约:`func(submit_kind: String, cell: Vector2i, ok: bool, round_index: int)`——submit_kind ∈ {move, dig, seal_place, refresh, stop};轮末统一 stop 也经此回调(accept 取 outcomes[0].accepted);空 Callable=不记日志
- 循环条件:现 :22-23 四项(活性谓词/Active 相位/同轮/guard>0)+`(max_rejects <= 0 or rejects < max_rejects)`;guard 语义保持「策略回调调用次数 ≤ GUARD_ACTIONS」;ok 时 rejects=0 否则 +1
- 缺省形态(act_provider 空)=现 :24-34 内联块逐位:`AutoPlayer.choose_dig` plan 一次算定、hero_cell 异位先 move、合步 next=dig、plan 空 break——四调用方(dump_battle:30/monte_carlo:74/damage_probe:102/:346/skill_rhythm_probe:58)两参调用零改动
- [ ] level_autoplay.gd `_autoplay_battle`(:521-568):外层 round_guard=60 轮循环与 st.rounds 计数保留(属调用方);内层单轮循环整体删,改调 `BattleDriver.drive_round(settlement, func() -> bool: return runner.current_battle() == settlement and settlement.battle_result == "" and settlement.action_economy.phase == "Active" and settlement.round_index == start_round, _act_provider(st), _action_logger(st, logger), 3)`——新增两个静态适配器:`_act_provider(st) -> Callable`(闭包捕获 st:`func(s) -> Dictionary: return _decide_act(st, s)`——策略分派 perfect/novice/slip 全保留在 _decide_act/_apply_normal_slips 原地);`_action_logger(st, logger) -> Callable`(闭包捕获:`func(kind, cell, ok, ri): if logger != null: logger.log_action(kind, cell, ok, {"round": ri}); if ok and kind == "refresh": st.refreshes += 1; elif ok and kind == "seal_place": st.seal_placed += 1`——计数语义与现 :553-561 逐位同);轮末 stop 日志与现 :566-568 同构
- [ ] level_autoplay.gd `_pick_token`(:292-318):字面量 match rank 表删,改 `var rank: int = int(TreasureItemTable.TIER_RANK.get(String(t.get("tier", "")), 0))`(未知档 0=现 match 落空同语义;316-f 最左 tie-break 逻辑不动)
- [ ] 新增 tests/unit/core/battle_driver_drive_test.gd `_smoke_drive_round_contract` 检查段:①缺省两参调用——同种子同 settlement 下动作序列快照与改前逐位对拍(手搭 settlement 桩沿 seal_polarity_test.gd:240 状态袋先例);②provider 形态——策略回调产出 dig/move/seal_place 各一验证提交与日志回调收到(kind,cell,ok,round)四元组;③max_rejects——策略恒返回被拒动作时第 3 拒后停手出环;④合步 next——move 后相位变更即弃 dig
- [ ] run_all.gd manifest 追加 battle_driver_drive_test(expect 0);adventure_feats_test/level_shop_economy_test 现有 `_autoplay_battle` 调用面回归(签名未变零改动)
**T8 己案·sim 信息面出口**(估时 0.5–1 工作日)
取用:无。产出:core 只读揭示口+auto_player 0 格连锁算子。
- [ ] minesweeper_rules.gd 新增公开只读口——精确签名与语义:
```
## 挖一格→真实翻开集只读预览(sim 信息面出口——与 _classify 同口径:本格封印视为已隐式退役、
## 其余封印照挡;复用 _chain_closure 闭包;零状态写入、零事件发射)
func preview_reveal(c: Vector2i) -> Array[Vector2i]:
```
实现:`sim_seals := _seals.duplicate(); sim_seals.erase(c)` → `_chain_closure(c, sim_seals)` → 取闭包中 `cc != c and not _revealed.has(cc)` 的格(F2 口径:新开格集,不含首格与已开格)
- [ ] auto_player.gd `_deduce`(:114-152)补 0 格连锁算子:while-changed 每轮 single+subset 扫描后追加一段——遍历 safe 集中未揭示格,逐格 `for rc in minesweeper.preview_reveal(c): if not safe.has(rc): safe[rc] = true; changed = true`(连锁只经安全格扩散=闭包集全安全,真实玩家挖 c 免费获得的信息面;`_deduce_single` novice 画像不动);:80-83「口径差异=unknown 不含 oracle」注释保持,双口径显式登记补一句「0 格连锁经 preview_reveal 真实闭包(架构整改批补齐——与棋盘生成 _apply_chain_rule 对位)」
- [ ] 新增 tests/unit/core/auto_player_deduce_test.gd `_smoke_zero_chain_rule` 检查段:手搭棋盘夹具——0 数字区域经一格桥接,远端格与任何已开数字格不邻接(改前约束模型必不证其安全)→ `AutoPlayer._deduce` 后 safe 集含远端格断言;零盲挖语义回归(mines 集不含安全格);真实入口=AutoPlayer._deduce(经 perfect_action 装配链取 minesweeper 实例)
- [ ] minesweeper_rules_test.gd 追加 `_test_preview_reveal_readonly` 检查段:同板同格断言 `preview_reveal(c)` = `settle_batch(dig c)` 后 `revealed_cells()` 差集 ∖ {c}(F2 同口径——不含首格与已开格;封印格在场/挖封印格两形态各一例);调用前后 revealed_cells() 与 seal_count() 零变化(零状态写入);cell_revealed 事件零发射
- [ ] run_all.gd manifest 追加:`{"path": "res://tests/unit/core/auto_player_deduce_test.gd", "expect": 0}, # R15 0 格连锁算子〔架构整改〕`
- [ ] MC 锚漂移登记:实现报告写明「0 格连锁补齐后 perfect/adv 档通关率预期上调、旧 MC 锚失效;重跑归用户按 MC 采集档位表发起」
**T9 组D·experiment_density 退役**(估时 0.25–0.5 工作日)
取用:T0 grep 底账。产出:死测量件清出,引用面归零。
- [ ] 删 game/sim/experiment_density.gd 与 experiment_density.gd.uid
- [ ] game/README.md:53 工具行删 experiment_density 引用(`dump_battle.gd(结算流水)/ monte_carlo.gd(战斗期望)` 保留)
- [ ] core/board_generator.gd:23 注释举例名已于 T3 改 calibrate_boards(本卡核对零残留);board_gen.tres:414 注释已于 T3 改「出处=退役件 experiment_density.gd(git 历史可考)」(本卡核对零残留)
- [ ] 全库 grep `experiment_density` 零命中(审计报告 reports/ 两处除外——过程件不动)
- [ ] game/tests/README.md:304 在册行——写卡段已删(见下);实现批批末核对该行确已不在
**T10 组C 确认+产出物落位卡**(估时 0.5–0.75 工作日)
取用:全部前卡。产出:批收口两件。
- [ ] 组 C 确认项(零代码改动):grep `damage_probe` 于 tests/run_all.gd 与 tools/run_all_gates.sh 零引用;damage_probe.gd 头注「诊断工具·非验收件」自陈在位——两项读数落实现报告
- [ ] 实机目检总清单(登记不阻塞):①RAP 不足 toast「弃图刷新需 N」显示表值(改 rap_refresh_cost 表值目检文案随动)②本轮刷新用尽 toast「每轮 N 次」同上③散折价 80% 购买价目检(economy_spend 激活,回归性质)
- [ ] 遗留读数义务登记:MC 锚漂移预期(T8)+重跑归用户档位发起
- [ ] 确认读数:level_autoplay.gd:162-163 透传守卫(R1 类型适配·非行为,B9 申报)——MC 冒烟跑一次 run_adventure relic 模式(tree_rules 字典透传)零报错即透传生效,读数落实现报告
- [ ] **实现报告** `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 移除
---
### 估时汇总
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–1|T6 0.5–0.75|T7 0.75–1|T8 0.5–1|T9 0.25–0.5|T10 0.5–0.75。
区间合计 6.0–9.75 工作日;**精确汇总 8 工作日**(切分预案:若 T1 连带测试适配超 1.5 工日,把 sim 连带两件〔adventure_monte_carlo/level_autoplay 透传〕切出为 T1b 独立半日卡,其余不动;合计超 10 工作日=超软盒,须用户特批标记后方可续批)。
## 8. 验证闸(改动—验收对照表)
测试方式两分法:下表全部走**调试接口验证**(单元/集成套直构夹具与真实入口调用,沿现役 DebugOverlay/DS_DEBUG 门控先例不适用——本批零 UI 装配面);**正常流程体验验证**=实机目检三项(T10 清单,登记不阻塞)。判据全部绑被测改动特有的可观测提交面(合成行参数值/表值驱动的产物差异/驱动序列快照/揭示集逐位);纯静态判据两处(R6/R13)已注记观测面局限。
| 需求点 | 改动(文件:行为) | 验收测试(名称+落点+尾缀) | 层级 | 真实入口 | 判据绑定面 | 能力行 |
|---|---|---|---|---|---|---|
| R1 六键参数字典 | meta_tree.tres 三 Fork 行;meta_tree_table.gd 校验;effect_engine 四分支读参;battle_fx_host.rebuild_subscriptions 收 Dictionary;battle_orchestrator/shop_session 消费;meta_progression.tree_rules();adventure_runner/level_runner/main 传参;sim 注入面(adventure_monte_carlo db 前移+_tree_rule_dict+三档换字典;level_autoplay :162-163 透传守卫·类型适配) | tree_rules_v11_test.gd:_test_rule_key_params〔架构整改 V1〕(含 `_tree_rule_dict(db, ["posture_first_strike"])` 最小断言);既有 _smoke_tree_rules/feat_vouchers R2 面回归 | 单元 | `MetaTreeTable.validate()`/`EffectEngine.rebuild()`/`MetaProgression.tree_rules()`/`AdventureMonteCarlo._tree_rule_dict()` | 合成行 do.value=参数字典值(非硬编码);缺参数/越域 validate 返回非空;tree_rules() 返回字典含激活侧参数;_tree_rule_dict 返回 {规则键: 参数字典} | 新增:规则键参数读表(六键参数字典校验与激活侧透传);既有:天赋树购买与六键合成 |
| R2 散折价收回规则键 | shop.tres/-spend_discount;shop_table.gd 删字段;shop_session._spend_discounted 读 discount_pct | level_shop_economy_test.gd:_test_spend_discount_from_rule_key〔架构整改 V2〕 | 单元 | `shop_session.current_price()`(经 LevelRunner 装配链,economy_spend 注入) | 80% 折价值逐位同(表字段退役前后对拍);shop.tres 加载零诊断(字段真删) | 既有:GP 钱包/escrow/商店收口/共享池 |
| R3 死效果通道退役 | effect_engine.gd EFFECT_KINDS 摘两名;damage_controller overflow 分支删;combat_segment attack_segments 分支删;载荷键/排除表成员清理 | effect_kind_retired_test.gd:_assert_rejected〔架构整改 V3〕(负面套件 expect=1 negative=true);adventure_feats_test :743 面与 round_flow 段内序回归 | 单元(负面独立进程) | `ConfigDB.load_tables()`(夹具注入探针行) | 两 kind 探针行加载被拒(EFFECT_KINDS 出域报错文本);round_flow 五段全序断言零转红 | 既有:加载期违规表拒绝:跨表悬空/计数器前缀/真视窄域/效果类型出域 |
| R4 刷新提示文案读表 | main.gd:633/:636 两处拼接读表 | player_copy_sweep_test.gd:_sweep_refresh_toast_no_literals〔架构整改 V4〕+实机目检两项(T10) | 单元(静态扫描)+目检 | `player_copy_sweep` 源扫描(现役 sweep 机制) | 两 toast 格式串零数字字面量、插值位与表字段一一对应(静态判据+评审注记观测面局限:真机文案由目检兜) | 新增:刷新提示文案读表拼接(RAP 不足/轮上限两 toast 零字面量) |
| R5 ap_per_round 必填注入 | playtest_logger.gd 删默认+start_session 守卫;action_economy_table.gd 删 schema 默认;level_autoplay.gd:39-42/:117-120 注入序前置(先设 ap_per_round 再 start_session——守卫拒后开=会话静默不开) | playtest_logger_guard_test.gd:_smoke_required_injection〔架构整改 V5〕 | 单元 | `PlaytestLogger.start_session()` | 未注入返回空串+零文件;注入后返回路径;action_economy.tres 缺该字段夹具 validate 非空 | 新增:试玩日志器 ap_per_round 必填注入守卫(未注入拒绝开会话) |
| R6 clamp 域读单点 | config_db_resolver.gd:118-119 读 MULT_MIN/MULT_MAX;:110 与 difficulty_table.gd 失实注释订正 | config_db_resolver_test.gd:_test_difficulty_clamp(既有回归)+静态判据:resolver 源零 0.1/10.0 字面量(评审注记) | 单元+静态 | `ConfigDbResolver.resolve_difficulty_modifiers()` | clamp 输出域 [0.1,10.0] 逐位同(常量来源切换零值变) | 既有:行集寻址、行序保序与难度乘数 clamp |
| R7 节点图三参数入表+域并单点 | level_gen_params.gd/tres;node_map_generator.gd 四处读表+_cp_domain 删 | node_map_generator_test.gd:_test_gen_params_table_driven〔架构整改 V6〕;table_structure_guard_test.gd:_test_level_gen_new_fields〔架构整改 V7〕;node_map_growth_test 回归 | 单元 | `NodeMapGenerator.generate()`/`LevelGenParams.validate()` | 三参数改值产物可观测变化;缺键/越域 validate 拒;同种子产图回归逐位同 | 新增:节点图参数读表与域单点(三参数驱动产物/生成器侧可行性保留) |
| R8 出生区边长入表 | board_gen.tres+spawn_edge;board_gen_table.gd 零哨兵+三处导出;board_data.gd 常量删+几何导出;board_generator.gd 读表+剃雷域导出;calibrate_boards 一行透传 | board_generator_test.gd:_test_spawn_edge_from_table〔架构整改 V8〕;_test_target_mine_count_single_source 更新回归;board_gen_reward_test 夹具回归 | 单元 | `BoardGenerator.generate()`/`BoardGenTable.validate()` | spawn_edge=5 夹具布雷域基/R₀ 下限/剃雷域半径按 25 格可观测;spawn_edge=3 逐位回归;BoardData.SPAWN_AREA_CELLS 全库零引用 | 新增:出生区边长表单点(布雷域基/R₀ 下限/剃雷域半径全由 spawn_edge 导出);既有:棋盘按参数行出图、数字恒真 |
| R9 货架位数入表 | shop.tres+shelf_size;shop_table.gd 零哨兵+[1,6];shop_session.gd:155 读表 | level_shop_economy_test.gd:_test_shelf_size_from_table〔架构整改 V9〕 | 单元 | `shop_session` 货架构建(经 LevelRunner 装配链) | 夹具 shelf_size=5 → 货架五件可观测;=3 回归逐位同 | 新增:货架位数读表(进店与重抽同源) |
| R10 变异成包下界入表+表头域校验 | variation.tres+pack_min;variation_table.gd 零哨兵+三域校验;board_installer.gd:125 读表 | variant_placement_test.gd:_test_pack_min_from_table〔架构整改 V10〕;table_structure_guard_test.gd:_test_variation_header_domains〔架构整改 V11〕 | 单元 | `BattleOrchestrator.begin_battle()`(变异布置段)/`VariationTable.validate()` | 夹具 pack_min=3 → 产物零 1–2 格片;pack_min 越域/三表头字段越域 validate 拒 | 既有:变异布置门控;新增:变异表头域校验(地形变异) |
| R11 feat cap 必填 | feat_table.gd 必填+[1,99];feats.tres 30 行补 cap:1;curio_deck.gd 死变量删+悬空报错 | table_structure_guard_test.gd:_test_feat_cap_required〔架构整改 V12〕;adventure_feats_test relic 面回归 | 单元 | `FeatTable.validate()`/`curio_deck.cap_ok()` | 缺 cap 行拒/越域拒/37 行全在场;cap_ok 在场行直索引零兜底(悬空 push_error 路径断言) | 既有:表结构守卫:域校验/行序键/跨字段互锁/配额锚 |
| R12 驱动循环收敛 | battle_driver.gd 通用签名;level_autoplay._autoplay_battle 内层委托;抄本删除 | battle_driver_drive_test.gd:_smoke_drive_round_contract〔架构整改 V13〕;adventure_feats_test/level_shop_economy_test _autoplay_battle 面回归 | 单元+集成 | `BattleDriver.drive_round()`(两参缺省与五参回调两形态) | 缺省两参动作序列快照逐位同;provider 形态提交与日志回调四元组;max_rejects=3 第三拒停手;合步 next 相位变更弃 dig | 新增:sim 驱动循环单点(缺省零变化与策略/日志回调形态) |
| R13 档位排序读表 | level_autoplay._pick_token 改读 TreasureItemTable.TIER_RANK | adventure_feats_test 316-f 选件既有断言回归+静态判据:_pick_token 源零 rank 字面量(评审注记) | 单元+静态 | `level_autoplay._pick_token()`(经 run_adventure 三选一链) | 最稀有优先/最左 tie-break 逐位同(读表前后对拍) | 既有:奖励三选一候选/刷新付费/呈现 |
| R14 棋盘揭示预览只读口 | minesweeper_rules.gd +preview_reveal | minesweeper_rules_test.gd:_test_preview_reveal_readonly〔架构整改 V14〕 | 单元 | `MinesweeperRules.preview_reveal()` | preview(c) = settle_batch 挖 c 后 revealed_cells 差集 ∖ {c}(F2 同口径——不含首格与已开格,封印在场/挖封印格两形态同);调用前后 revealed_cells/seal_count 零变化;cell_revealed 零发射 | 新增:棋盘揭示预览只读口(零状态写入/与实挖揭示集同口径);既有:挖/封印合法性与可辨拒绝(拒绝零副作用) |
| R15 0 格连锁算子经真实闭包 | auto_player.gd _deduce 补算子 | auto_player_deduce_test.gd:_smoke_zero_chain_rule〔架构整改 V15〕 | 单元 | `AutoPlayer._deduce()`(经 perfect_action 装配链) | 桥接 0 区域远端格入 safe 集(改前必缺);mines 集零安全格(零盲挖语义保持) | 新增:模拟玩家 0 格连锁算子(经真实闭包,零盲挖语义保持) |
**零行为改动面的证据义务(不设对照表行的申报)**:上表 R1–R15 覆盖本卡全部带运行期提交面的需求点。两项零行为改动——组 D(experiment_density 删除+引用面清理)与组 C(damage_probe 零改动确认)——无运行期提交面、无能力行可锚,验收=静态判据与确认读数(全库 grep 零命中/闸脚本零引用/头注自陈在位),证据落 T9/T10 步骤与实现报告,由独立验收审计按第 8 节末口径核读数;不为其虚设对照表行与能力行。
**闸口径**:重闸=`tools/run_all_gates.sh` 按本批改动域选档(改动含 game/ 下非 .md 行为载体 → `--code`;文档件触面并入同一合并验证——两类都有按闸脚本算法定档);所选域全绿才合并。卡内不写死闸件名单。回归措辞:里程碑卡(T 段)出口跑一次全套闸;卡内修复只做出红最小单元的最窄确认;新增测试/工具先行孤立验证再并入全套。
**测试削弱申报**(允许改/删的旧断言全清单;未申报的删改由独立验收审计判红):
1. tree_rules_v11_test.gd 夹具 synth 硬编码值(1/50/2)改参数字典构造——断言结构不变(四键行数对照+validate_trigger_row 零违例),值来源从字面量改参数(R1 的被测面本身)。
2. board_gen_reward_test.gd:204-218 的 `BoardData.SPAWN_AREA_CELLS` 引用改夹具表 spawn_edge² 推导——cap 压线 9 语义不减(R8)。
3. board_generator_test.gd:71 from_expr 公式对账改 spawn_edge²——对账强度不减(R8)。
4. adventure_feats_test.gd:743 dispatch 载荷删 `"overflow": 0` 键——断言内容(斩首学者揭示 1 格)零松动(R3)。
5. round_flow_skill_pool_test.gd:442 排除表删 `"fx_streak_segments"` 成员——排除面缩窄至死通道不可达成员,段内序断言零松动(R3)。
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)。
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`;由没参与实现的会话或子代理执行,核对:对照表逐行断言真实存在且在当轮跑批通过、测试削弱申报 9 条之外零删改、第 13 节无效成员零残留、S13 键只降不升对账。未过不合并。
## 9. 异常分级
- **L1 自救**:测试断言笔误、夹具键名拼写、注释错字——就地改,记录进实现报告。
- **L2 记录继续**:非行为漂移类小事——表注释与本卡行号 ±3 行内的漂移;测试失败经排查属既有缺陷且与本批改动无因果——登记跳过并报用户。
- **L3 停机写报告等用户**:①卡面与处置记录/五份 GDD 冲突(上游缺陷,退写卡段);②取证表 18 处现址复核不符(同上);③乙案连带触点发现处置记录未列的第五处以上消费面(行为语义不明,禁代裁);④机检预算互斥=新增件超第 14 节预算且无例外申报=上游缺陷,停卡退回写卡段,禁实现段自行拆件或砍面;⑤拆分边界按第 4 节纪律拆不出内聚单元(凑计数袋禁)=停卡呈报走豁免/还债通道;⑥schema 校验与卡片契约互斥(含第 13 节机检键冲突)=一律停卡呈报,不得自造第三条路;⑦己案 preview 口径与「settle_batch 实挖揭示集差集 ∖ {c}」(B6 定死的 F2 同口径)出现非预期不一致。
## 10. 代拍板白名单
- 测试内部夹具的命名与组织(状态袋字段、夹具目录名、探针行 desc 文案)。
- toast/注释中文措辞的微调(数值与字段名不动)。
- validate 错误 message 的具体文案(判别词「缺参数/多参数/越域/出域」必须保留在 message 内供断言定位)。
- 表行插入的物理顺序与对齐(.tres 字段顺序不改变语义)。
- feats.tres 批量补 cap 的脚本实现方式(用后即删)。
- 测试函数内部辅助函数的拆分(不新增公开面)。
- 逐卡内「孤立验证→出红最小单元→并入全套」的执行顺序细节。
超清单的决断记入实现报告「实现决定记录」节。
## 11. 待裁点
**零待裁点,开工门=U0**——设计方案甲~庚与全部取证处置均已在 2026-11-02 讨论会话由用户逐项裁决(处置记录 §二/§三「已裁或按总判据导出,零待裁点」),五份 GDD 落文闭合。本卡未新增任何备选案。
## 12. 落位与可复用性预检
**新增文件(4 件,全部测试件)**:
- tests/unit/data_config/effect_kind_retired_test.gd——为什么不能复用:甲案词表退役的负面断言必须独立进程断言退出码(test-conventions §5.6,负面套件禁落现役非负面套件——headless assert 错误扫描假红);counter_prefix_fatal_test.gd 是 feats.tres 注入探针的同形态先例,**复用其夹具模式但不并件**(该件断言的是 counter 前缀与引用闭合,注入探针内容与本件不同,并件会让负面 manifest 语义混乱)。唯一落点:data_config 目录(夹具对象=feats.tres 加载路径);grep 同名零命中。
- tests/unit/core/playtest_logger_guard_test.gd——playtest_logger 现无任何测试件(grep 零命中);守卫行为是 R5 特有提交面,无法挂靠既有套件的既有能力行。唯一落点 tests/unit/core。
- tests/unit/core/battle_driver_drive_test.gd——drive_round 契约测试需手搭 settlement 桩与动作序列快照对拍;smoke 族共用面(battle_driver 头注声明)明确「smoke_all 本体不经本面、含回归断言禁并入」——契约测试落单元层新件,不污染 smoke。状态袋复用 seal_polarity_test.gd 的手搓先例模式(引用步骤,不复制代码)。
- tests/unit/core/auto_player_deduce_test.gd——0 格连锁算子需特构棋盘夹具(0 区域+桥接格),adventure_feats_test 的冒险装配链夹具过重且断言面不同。唯一落点 tests/unit/core。
**新增函数/常量(逐条唯一性核查)**:
- `MinesweeperRules.preview_reveal`——grep `preview` 于 minesweeper_rules.gd:现公开面只有 fx_reveal(带状态写入的事件版,:355)——两者语义不同(零写入 vs 真挖),不能复用;命名与 effect_engine PREVIEW 主动件无冲突(跨类)。core 公开 API 净增 1 口,反哺点清单承载。
- `MetaTreeTable.RULE_KEY_PARAMS`+`_validate_rule_key_params`——schema 内唯一;仓库无第二份参数域表(天赋树.md 规则键参数表=owner,schema=机械承载,两处同源不违规:文档定域、schema 执行)。
- `MetaProgression.tree_rules()`——`tree_rule_keys()` 改名而非并存(禁别名,第 13 节);grep 全库唯一调用点 main.gd:198+测试两处,全量适配。
- `LevelAutoplay._act_provider`/`_action_logger`——level_autoplay 文件内静态适配器,唯一;通用形态只在 battle_driver.drive_round 一处。
- `AdventureMonteCarlo._tree_rule_dict`——sim 内唯一;不散落(level_autoplay 透传不重建字典)。
- `BoardData.spawn_edge` 成员——唯一出生区边长实例承载;表头单点 board_gen_table.spawn_edge 经行快照注入,无第二处几何定义(`_shave_ring` 半径推导同源)。
- `VariationTable._validate_header_domains`——表头域校验唯一段;不与行校验混写。
**复用既有(不新增)**:负面套件形态=counter_prefix_fatal_test 模式;驱动桩=seal_polarity_test 状态袋模式;能力清单挂靠=既有行追加用例为主(8/16 行新增能力仅 6 行全新);TIER_RANK/TIER 词表/状态袋/gdstyle 基线全部既有件。
**分层与交互面**:sim→core 单向(auto_player→preview_reveal;battle_driver→settle_batch/player_request_refresh);core→data schema 方向(config_db_resolver→DifficultyTable.MULT_MIN——与既有 db.combat.* 消费同向,禁反向);presentation→core 只经既有出口(main.gd 读 db.run.action_economy 现役口径不变);RngService 红线零触碰(本批零新增随机源——variation/board_gen 参数全为读表非取数);Core 零 UI 红线零触碰(minesweeper_rules 新口纯查询)。
## 13. 禁为机检文本保留无效成员
本卡为重构类卡,全卡适用以下条款(code-conventions §1.1 同款):禁止为迎合机检消息文本(含计数、message 判别词、grep 面)而保留或新增无效成员/别名/死分支;`tree_rule_keys()` 改名后旧名禁留兼容壳;EFFECT_KINDS 摘名后禁留注释化成员;`_kill_overflow` 改名后旧名禁留转发壳;`_cp_domain` 删除后禁留空壳调用。机检键与卡片契约互斥时(如 pipeline_gate/gdstyle 消息判据与本卡签名冲突),实现段一律停卡呈报,不得自造第三条路。
## 14. 实现规范预算
新增 .gd 文件仅 4 个测试件(SceneTree 测试脚本,无公开方法面、无常量成员超限面——gdstyle 对测试件的接口块预算全部余量充足,逐件实数:公开方法 0、类变量 0–2)。新增生产代码为零新文件(全部落在既有件),按「存量触面一查」逐件对账:
- 接口块预算(改动后公开方法数 ≤20 / 成员变量 ≤15):minesweeper_rules.gd 公开方法 +1(现数远低于 20,T0 读数确认);board_data.gd 成员 +1(spawn_edge);battle_driver.gd 公开方法 +0(单函数签名扩展);meta_tree_table.gd 常量 +1(RULE_KEY_PARAMS——常量不计类变量阈值);其余件公开面零净增(改名/收参不增数)。
- 单函数分支 ≤8:`_push_tree_rule` 四分支 match(economy 两键零合成行不入 match)——参数化后分支数不变为 4;`drive_round` 分支数:5 kind 分派+合步 next+守卫 ≈7——在限内,T0 读数锁定基线;`_validate_rule_key_params` 分支 ≤6。
- 迁移函数对账:本批无「自存量文件迁入」函数(改名件 `_kill_overflow`→`_kill_effects` 按同键迁移查 `tools/gdstyle_baseline.txt`——源键 branches/returns 超登记值即随迁拆函数,拆分不改语义)。
- 存量触面 S13 预期:本批实触存量生产件 30 件,其中 gdstyle 扫描面(core/data/presentation)内 25 件为对账面——S13 键较 T0 现场基线**只降不升**(net 删代码为主:两死分支/域校验函数/字面量表;净增面仅 preview_reveal 与校验段——降不达即检查是否夹带超预算成员,L3 ④兜底);扫描面外 5 件(sim/tests)随批闸口径另计。
- 指标例外申报:无(零新件超默认阈值;若实现中发现例外,走本卡异常分级 L3 ④停卡,禁就地豁免)。
## 15. 拆分边界纪律
见第 4 节末「拆分边界纪律」条款(结构类卡必填,卡内写条款、判据定义以 code-conventions §1.1 为权威):两个拆出/收敛单元(drive_round 通用签名、参数域校验并单点)各带职责语句、单一变化原因与集体身份;「过阈值」只作发现信号;拆不出内聚单元停卡呈报(第 9 节 L3 ⑤)。先例=迭代 41 两卡 v1.2(核心数据面契约 7/呈现层契约 9)。
+3 -3
View File
@@ -5,8 +5,8 @@
## 当前位(只回答「现在该做什么」;三行内随批次换代,禁止在此扩写成状态快照)
- **阶段**:M3——Alpha 版本的完整实现(2026-10-09 立规:未明令宣布完成前停留 M3,迭代只排 M3 需求,M4 不排期;根目录 stage.txt 为旧阶段开关仅存档)。
- **迭代位**:迭代 1–49 全部已完成——迭代 49(效果端口与掷格分件+模态句柄分域+营地五界面真窗口化三卡)2026-11-02 合回(合并提交 549683a5,独立验收审计通过〔缺漏 0、例外 1 在案〕),批后收尾闭合(2026-11-02):反哺点九条处置闭合(architecture v1.31 轴戊两件与功能层四行换代已建件现状〔EffectPort 六 Callable 路由/RewardRoller 掷格面迁出、B4 公开面 weighted_pick 退役、roll_board 装配序五步、五件类变量实数在案〕+ui_registry 行三域句柄分域换代〔run/menu 两子容器新建、ModalFlow 升格注册面直驻、寻址 `modals.run.*`/`modals.menu.*` 换代〕/术语表 v1.26 立「效果端口件」「掷格件」两条〔用户裁〕/camp.md v2.6 叠层与开合补窗壳形态已实装注记/08-Alpha v1.25 三·界面营地行补窗壳形态在役注记/体验验证清单 ㊽ 登记目检两项/static_scan.sh S8 头注计数句订正 10→14)、产出物退役六件(三需求卡片+反哺点+实现报告+验收审计——吸收即死+证据只留最新)、待办清单三卡条目整条删除(状态机出口)。迭代 48 收尾记录见 git 提交 aa396eb9,迭代 47 见 bd54d1f4。
- **下一步**:迭代 50 编排待发令(`/iter-plan`)——候选=断言补齐批卡(V1–V16 四域断言补齐,已写卡 2026-11-02)。待编池:冒险前资源配比预设(冻结备选)、迭代 30 原卡②③(2026-10-17 已剔出迭代 30 规划、退回待设计,待美术/设计定稿后重新立卡)。
- **迭代位**:迭代 1–50 全部已完成——迭代 50(敌方状态个体化+断言补齐+架构审查 3.1+3.2 整改三卡)2026-11-03 合回(合并提交 8d3a12ec,独立验收审计两轮终判通过〔首轮缺漏三条→整改笔 6cb1cf5e→复验通过〕),批后收尾闭合(2026-11-03):反哺点十条处置闭合(增益状态 v1.6 删「实装随该批」过时行/architecture v1.32 排雷规则件 preview_reveal 只读预览口登记+天赋树 tree_rules 参数字典 API 换代/奇物 v1.5 cap 必填与取值域写入/覆盖域表减动效行翻已覆盖;SPAWN_AREA_CELLS、shop.spend_discount 表字段、battle_driver 签名三处零登记零落点,天赋树 v0.12 等五份与术语表零反哺确认)、实机目检五项登记体验验证清单 ㊿〔实现报告原编㊾与 CI 迁远端批撞号,改用㊿〕、MC 锚代表性注记落 sim-data/README(重跑归一档用户发起)、产出物退役六件(三需求卡片+反哺点+实现报告+验收审计——吸收即死+证据只留最新)、待办清单三卡条目整条删除(架构审查余项〔审计待裁点④⑤⑥⑦〕按未决先迁再死另立新条登记)。迭代 49 收尾记录见 git 提交 aa396eb9,迭代 48 见 bd54d1f4。
- **下一步**:迭代 51 编排待发令(`/iter-plan`)。待编池:架构审查余项(闸面缺口/豁免存废/零测试点名/架构文档漂移——待办清单 2026-11-03 新条,待讨论段逐项裁决)、冒险前资源配比预设(冻结备选)、迭代 30 原卡②③(2026-10-17 已剔出迭代 30 规划、退回待设计,待美术/设计定稿后重新立卡)。
## 里程碑时间线
@@ -83,7 +83,7 @@
| 迭代 47 | 已完成(2026-11-01) | 已退役(git 历史可考) | 2026-11-01 | ≈15 个工作日〔用户特批 2026-11-01 超 10 个工作日〕 | 已退役(git 历史可考) |
| 迭代 48 | 已完成(2026-11-02) | 已退役(git 历史可考) | 2026-11-01 | ≈6.1 个工作日 | 已退役(git 历史可考) |
| 迭代 49 | 已完成(2026-11-02) | 已退役(git 历史可考) | 2026-11-02 | ≈7.25 个工作日 | 已退役(git 历史可考) |
| 迭代 50 | 待开工 | reports/需求卡片-敌方状态个体化批-2026-11-02.md<br>reports/需求卡片-断言补齐批-2026-11-02.md<br>reports/需求卡片-架构审查3.1+3.2整改批-2026-11-02.md | 2026-11-03 | ≈12.875 个工作日〔用户特批 2026-11-03 超 10 个工作日〕 | — |
| 迭代 50 | 已完成(2026-11-03) | 已退役(git 历史可考) | 2026-11-03 | ≈12.875 个工作日〔用户特批 2026-11-03 超 10 个工作日〕 | 已退役(git 历史可考) |
- 迭代 38 收口为带红合并〔用户特批 2026-10-26〕:09 静态扫描 S13 gdstyle 恶化 2 条经批准记入基线存量红(git 提交 c4c69701),卡② 停卡退上游,处方已于 2026-10-26 修订定稿 v1.3(git 提交 b3ea7532),随「gdstyle 存量债全量清偿」条目波 7 待编排。
- 迭代 39 收口为带红合并〔用户特批 2026-10-27〕:02 EV 锚 goblin 0.9148∉[1.00,1.20](触发器批有意行为改动,fp f74b9a48ef4a)已随 EV 锚重锚批换带归绿(git 提交 ba5105aa);08d 生涯.md:55 行号漂移已随 2026-10-28 批后收尾反哺落文修复归绿。三卡拆分后终局 gdstyle 恶化 2 条(battle_orchestrator max-file-length、level_map_screen max-class-variables)归迭代 40 卡①还债与迭代 41 存量债序列。
+1
View File
@@ -7,6 +7,7 @@
- 锚:`runsum_m3iter9exit_81000_n400_20261003.jsonl`(N=400/档=普通 v3.4+perfect;种子 81000 起逐局独立;route=min;taken=hero_dmg+mine_dmg,口径对齐真人分析端)
- 读数:`读数_m3iter9exit81000_20261003.md`(k=0.60、完美战役全通 59.0%、结构位移存档)
- 换代义务:M-4 数值批投值时本锚随批作废,批内自取改前/改后锚(77000/78000 先例)
- 代表性注记(2026-11-03,迭代 50 合并提交 8d3a12ec):0 格连锁算子补齐改变模拟玩家行为(推理面增强),perfect/adv 档通关率预期上调——本锚读数对现行代码代表性下降,带值结论须注明「旧行为基线」口径;重跑归一档(用户发起),发起时批内自取改前/改后锚
## 历史锚(只读不判)
+15
View File
@@ -604,3 +604,18 @@
- **红灯信号**:基线帧出现素材缺位字形、明显错位或花屏;渲染闸报「取证缺失/零字节」。
- **结论回流**:基线异常=登记待办清单(或当场重制复核);渲染缺陷归待办清单登记新条目。
## ㊿ 迭代 50——敌方状态个体化与文案读表目检(2026-11-03 随批后收尾登记)
> 三卡合回(2026-11-03,合并提交 8d3a12ec):卡① 敌方状态个体化、卡② 断言补齐、卡③ 架构审查 3.1+3.2 整改。独立验收审计两轮终判通过(首轮缺漏三条→整改笔 6cb1cf5e→复验通过);机检读数与论证详见迭代 50 实现批提交(合并提交 8d3a12ec 一线可考)。目检清单原编㊾-A~E 与在册㊾〔CI 迁远端批〕撞号,登记改用㊿。登记不阻塞(2026-10-12 真人检测立规)。
| # | 目检项 | 判据 |
|---|---|---|
| 1 | 敌方增益图标个体投影 | 增益图标各立绘各现各的——敌 A 有削弱时敌 B 不出现同款图标(各读各的桶,不再全体同现) |
| 2 | 敌方增益技自体落点 | 蓄力/硬化/护身只强化施放者自己,不再全体受益 |
| 3 | RAP 不足 toast 读表值 | 「弃图刷新需 N」的 N 随 rap_refresh_cost 表值显示,改表文案随动 |
| 4 | 每轮刷新上限 toast 读表值 | 「每轮 N 次」的 N 随 refresh_cap_per_round 表值显示,同上 |
| 5 | 散折价 80% 购买价(回归性质) | economy_spend 激活时商店购买价按 80% 折后价显示与扣款 |
- **红灯信号**:图标全体同现、增益技全体受益、toast 数字与表值不符、折后价未生效即报缺陷。
- **结论回流**:呈现缺陷归待办清单登记新条目。
+4 -33
View File
@@ -12,17 +12,15 @@
**状态**:待文档设计
#### 架构审查优化讨论——全库架构审计读数的逐条裁决与整改分批(2026-10-29 登记,来源=审计发现)
#### 架构审查余项——闸面缺口、豁免存废、零测试点名与架构文档漂移(2026-11-03 登记,来源=批次移交)
**实况**:2026-10-29 全库架构静态审计完成,读数见 reports/审计-全库架构审查-2026-10-29.md(七节:总评/健康面/P0/P1/P2/待裁点/取证口径;零测试执行零引擎运行,全部结论带 文件:行号)。健康面已逐条核干净:Core 零 UI 八项判据全零命中、core 内 RNG 单点 100% 成立、字符串式信号连接全库 0 处、core 层零超长函数、19 表 ↔ 19 schema 一一对应、无循环 preload。问题集中在三条「写了没闸守」的纪律被实际破坏:①数值单一事实源被 18 处硬编码击穿,最危险两处是 `presentation/main.gd:787` 与 `:790` 把 `rap_refresh_cost=8` 与 `refresh_cap_per_round=2` 写死进提示文案(紧邻 783 行是正确读表的),表改文案不改、玩家直接受错误数字;另有 4 组代码自标「机制结构常量/产出约束」的字面量(`node_map_generator.gd:12` `MAX_WIDTH`、`action_economy.gd:14` `CHARGE_LAYER_CAP`、`board_data.gd:9` `SPAWN_AREA_CELLS`、`node_map_generator.gd:83-94` 域字面量)是否入表待裁。②`game/sim/` 与 `game/core/` 四组平行实现——扫雷推理引擎双份(`board_generator.gd` `measure_inferability` 族 vs `auto_player.gd` `_deduce` 族,输入集口径不同:前者含 safe_set oracle、后者 no-peek)、伤害掷点期望重算(`damage_probe.gd:196-201`)、档位排序与驱动循环双份(`level_autoplay.gd` vs `treasure_item_table.gd:44` 与 `battle_driver.gd:17`)、FakeDB 伪造表喂生成器——直接威胁「模拟读数 = 游戏真实数值」这一数值验证前提。③RNG 单点纪律在 core 外失守(sim 4 处/probe 1 处/tests 3 处自建 `RandomNumberGenerator`,均显式定种、确定性尚存),而 `static_scan.sh` 的 S1/S2 扫描面只含 `DIR_CORE` + `DIR_PRES`。守卫面另有三缺口:S8 是 9 文件显式清单(新增结算文件忘登记=静默不扫,缺位自检只防删改不防增)、S9 类型闸与 S13 质量闸扫描面止步于 core+data+presentation(sim/probe/tests 三层除 S11/S12 外零闸)、S13 三处豁免常态化到最大户文件(`battle_orchestrator`/`main.gd`/`tune_sim_controller`);另有四个 core 文件零测试点名(`attune_loadout`/`battle_fx_host`/`meta_state_store`/`slot_store`)。P2 级:`core/settlement/` 五段类直读写编排器私有成员 20+ 处(`oc._damage.*`/`oc._enemy_system.*`,GDScript 无编译期检查、改名静默断裂);架构文档三处漂移(`architecture.md:110` 登记的 `core/hero_ledger.gd` 盘上不存在且 `hero_ledger_test.gd:171` 显式断言它必须不存在、`:135` 行数过期、EC8 热重载门后 `ConfigDb.reload()` 零调用方且走 `load()` 拿不到磁盘新值);class_name 级双向依赖(`core/config_db` → `data/schemas/board_gen_table` → `core/board_data.SPAWN_AREA_CELLS`)与 `NODE_TYPES` 词表双份;`MetaProgression` 是唯一用 `get_node("/root/...")` 取依赖、唯一跨 Autoload 直调的单例。
**实况**:2026-10-29 全库架构静态审计的四组待裁余项,自「架构审查优化讨论」条目迁入(该条目的 3.1+3.2 部分已随迭代 50 卡③实现合回〔合并提交 8d3a12ec〕,余项不在本卡,按未决先迁再死迁立本条)。四组余项(审计待裁点 ④⑤⑥⑦,读数为审计时点,逐项现值以仓库为准):①守卫闸面缺口——S1/S2 随机函数扫描面止步 core+presentation(sim 4 处/probe 1 处/tests 3 处自建 RNG 不在扫)、S9 类型闸与 S13 质量闸扫描面不含 sim/probe/tests、S8 是 9 文件显式清单(缺位自检只防删改不防增);②S13 质量闸豁免存废——审计时点三处豁免常态化到最大户文件(battle_orchestrator 已随拆件批收窄,余量以闸件为准);③零测试点名四件(attune_loadout/battle_fx_host/meta_state_store/slot_store);④架构文档漂移三处(architecture.md 登记的 core/hero_ledger.gd 盘上不存在且测试断言它必须不存在、行数过期、EC8 热重载门后 ConfigDb.reload() 零调用方且走 load() 拿不到磁盘新值)。凭据:reports/审计-全库架构审查-2026-10-29.md(待裁点节)+reports/处置-架构审查3.1+3.2整改-2026-11-02.md(3.1+3.2 闭合凭据,随迭代 50 合回)。
**2026-11-02 设计闭合(3.1+3.2 部分,用户逐项裁决)**:凭据=reports/处置-架构审查3.1+3.2整改-2026-11-02.md(总判据六条+逐项裁决记录+设计方案甲~庚+取证事实 18 处现址表)。用户总判据:机制数据一律长在所属封装实体的内部属性(表行字段)里,全局常量与无主账本清零;不要任何缺省值(缺字段=加载期报错);死代码不保留;sim 零规则副本;伤害期望独立复算=按需诊断件不进闸。GDD 已落文五份(天赋树 v0.12/关卡节点图生成 v1.4/冒险结构 v1.4/地形变异 v1.2/棋盘生成 v1.2,worktree 提交 15352170,文档域闸全绿)。全部改动(含 sim 面)归同一张需求卡片(用户裁,完整性优先)。**本条未闭合余项**(审计待裁点 ④⑤⑥⑦,不在本卡):闸面缺口(S1/S2/S9/S13 扫描面、S8 目录域)、S13 三处豁免存废、零测试点名四件、架构文档漂移三处——留待后续讨论段,不阻塞本卡。
**2026-11-02 写卡(2026-11-03 修订闭合)**:需求卡片 reports/需求卡片-架构审查3.1+3.2整改批-2026-11-02.md(v1.2——子代理写卡+grilling 一轮 19 条折入+godot-master 式终审 4 条折入,pipeline_gate PASS,worktree 提交 2f43b81d);11 张 T 卡估时合计 8 工作日(超 10 须特批提示在卡);能力行 10 增 5 改 1 删已入 game/tests/README.md。
**缺口**:还差一次设计讨论逐项裁决(总判据沿用「机制数据一律长在所属封装实体的内部属性里、不要任何缺省值、死代码不保留」),闭合后方可写卡或直改。
**改动面**:文档+游戏代码+工具代码
**状态**:文档设计已闭合+已写卡+已编迭代 50
**状态**:待文档设计
#### 三关色相 × 五组微光互辨抽测——三关图类型色板终值冻结的前置抽测(2026-10-28 登记,来源=会话提及)
@@ -47,20 +45,6 @@
**状态**:文档设计已闭合
#### 能力清单覆盖缺口补齐——六类无断言面或设计未定项(2026-10-29 登记,来源=会话提及)
**实况**:实际情况=2026-11-02 设计讨论闭合——④除名(用户裁:死亡灰化/碎裂属纯表现锦上添花,探针+人工目检已是合规终态,呈现与 battle.md 承诺行零触碰);范围收窄:④除名后余五类,其中②多语言半边(P1 功能缺口,归 owner 文档待设计问题清单)、③音频(P1 后置)、⑤数值落带半边(归 M4 数值批)三块延期不在本条,可写卡面=①增益状态结算链、②减动效开关、⑤机制门控、⑥锻造工坊结构四处。关联文档:
- reports/需求卡片-断言补齐批-2026-11-02.md(2026-11-02,本条需求卡片——已写卡凭据)
- `game/tests/README.md` 覆盖域表对照行(2026-10-29 立,缺口证据;2026-11-02 随卡刷新五行能力行与覆盖域口径)
- `design/gdd/systems/跨局循环/锻造工坊.md` v0.11(2026-11-02,验收标准节九条判据落文——⑥写卡输入合同)
- `design/gdd/systems/战斗循环/增益状态.md` v1.4(①结算链规则定稿)
- `design/gdd/systems/冒险循环/难度曲线与Boss.md` v1.2(⑤机制门控规则定稿;数值带 provisional 归 M4)
- `design/gdd/systems/表现与支撑/设置与本地化.md` v1.1(②减动效开关与呈现承诺现行口径)
**改动面**:游戏代码+工具代码
**状态**:文档设计已闭合+已写卡+已编迭代 50
#### 数值标定窗口总挂账——原九条数值类条目合并(2026-10-28 登记,来源=会话提及)
**实况**:2026-10-28 用户令把九条数值类挂账合并为一条:削弱档位的最终数值/迭代 10 奖励重构联动欠账/调参批数值点评登记/三方向各自的解锁清单与定价/GP 经济换算失衡/天赋树实装批登记欠账余两件/商店独立刷新机制两参数/基线通关率越带加难杠杆扫描/成长系数节奏——原九条同步删除,内容全量迁入汇总文档,git 历史可考(本提交)。共同背景:M4 数值批卡已随 2026-10-16 删卡令退役;2026-10-18 用户裁=各条留待办清单、未设计未启动、不另行归属,未来数值标定窗口重开时重走设计段再写卡——本条沿用该裁定,重启条件=用户发令开窗口。合并动机=九条共享同一重启条件与同一执行形态(窗口内一次 MC 批量统一覆盖各条对比需求:全冒险期望+奖励期望),分散登记徒增维护面。逐条挂账明细、裁定史与相关文档见汇总文档。
@@ -164,19 +148,6 @@
**状态**:待文档设计
#### 敌方状态个体化——状态实例归属到敌人个体(2026-11-02 登记,来源=会话提及)
**实况**:实际情况=用户裁敌方侧共享设计推翻——敌人是个体,状态实例必须按个体归属("对全体"=对每个存活敌各发一条实例);附带裁决:敌方增益技目标=施放者自己(现行一只施放全体受益属实现错误)、目标规则词表收四词(全体存活敌/自己/单体/顺位最前,种类级等首个内容批再加词)、个体死亡即清名下实例、呈现各读各的。存储方案=逐个体授予独立实例(用户裁 A 案;权威调研十余案例同构——Slay the Spire/Into the Breach/Cataclysm DDA/Unreal GAS 等,阵营桶仅服务换人继承类需求,本项目敌人开战一次性入场无此路径)。原「单体寻址的接口扩展位」条目(2026-10-18 登记)随本条并入退役——其五条语义被个体归属通则吸收。关联文档:
- `design/gdd/systems/战斗循环/增益状态.md` v1.5(2026-11-02,硬规矩改「实例按个体归属」+〈目标规则与个体归属〉节定稿)
- `design/gdd/systems/战斗循环/敌人系统.md` v1.5(2026-11-02,增益技落点=施放者自己+警觉授予随动)
- `design/gdd/systems/战斗循环/战斗结算.md` v1.6(2026-11-02,警觉与 AC 合流句个体化随动)
- `design/gdd/ux/battle.md`(2026-11-02,敌方增益呈现行个体化随动)
- reports/需求卡片-敌方状态个体化批-2026-11-02.md(2026-11-02,本条需求卡片——已写卡凭据)
**改动面**:游戏代码
**状态**:文档设计已闭合+已写卡+已编迭代 50
#### 冒险前资源配比预设(构筑提案)(2026-09-18 登记,来源=会话提及)
**实况**:构筑提案 2026-09-18 立项、八项裁决全裁(2026-10-04),设计闭合机制=[元进度](design/gdd/systems/跨局循环/元进度.md)「冒险开始参数面与覆盖值通道」(零新机制);2026-10-05 挂起——移出 roadmap 迭代 14,八项裁决与需求卡片冻结保留,重启须用户另行发令;全案与淘汰依据原载已退役提案(git 历史可考),裁决细节冻结在卡片。关联文档:[元进度](design/gdd/systems/跨局循环/元进度.md) v1.0(闭合凭据;现行 v1.25 已复核在役,2026-10-26 文档体检第 10 项);需求卡片 reports/需求卡片-冒险前资源配比预设批-2026-10-04.md(文件头挂冻结横幅)。