diff --git a/reports/需求卡片-minesweeper_rules公开面还债批-2026-11-04.md b/reports/需求卡片-minesweeper_rules公开面还债批-2026-11-04.md new file mode 100644 index 00000000..71164beb --- /dev/null +++ b/reports/需求卡片-minesweeper_rules公开面还债批-2026-11-04.md @@ -0,0 +1,179 @@ +# 需求卡片:minesweeper_rules 公开面还债批 + +> 来源:待办清单「minesweeper_rules 公开面还债——S13 超标键撤销后的清偿」(2026-11-04 登记,来源=批次移交,优先级=P0;需求性工程条目,证据指认在条目实况)。**唯一事实源:该条目实况证据链+本卡第 3 节 2026-11-04 代码级考证(21 公开方法全量调用方盘点,逐方法实查)。** +> 裁决沿革:登记方向=「settle_batch/fx_reveal 族收敛或搬迁」(批次移交在册);2026-11-04 本会话全量盘点后按证据收窄——两族受架构在册边界与职责轴保护不可作收敛点(§3.2),收敛点唯一化=`safe_remaining`(无生产消费方公开面收回,§3.3),待用户批卡背书。 +> 验收档:中 +> 版本:v1.0(2026-11-04) + +## 1. 目标与完成定义 + +把 S13 红键清偿为绿: + +- `game/core/minesweeper_rules.gd` 公开方法 21→20:`safe_remaining` 公开→私有 `_safe_remaining`(函数体逐字不动); +- gdstyle 闸(S13=`quality/max-public-methods`,默认上限 20)该文件归绿,**零新增基线键**; +- 游戏行为零变化:私有化=改名,无任何运行期可观测面变化;4 处测试直连点改锚私有面,断言消息与期望值逐字不变。 + +**完成定义**:gdstyle 单件读数公开方法 20≤20 且零红键;`minesweeper_rules_test` 既有断言全数通过;全仓 `\.safe_remaining\(` 调用形态零残留;`--code` 域全套闸绿。 + +## 2. 设计事实源 + +需求性工程条目(重构/还债,无设计线):设计事实源=**证据指认**——待办清单条目实况证据链(`tools/gdstyle_baseline.txt` 该文件零在册键=S13 键 2026-11-04 用户裁撤销后为活红;git 提交 7f512aa8 归位两法在案)+本卡第 3 节 2026-11-04 代码级复核(file:line 逐条实查)。 + +## 3. 现状事实(2026-11-04 代码级考证) + +### 3.1 红键本体 + +- gdstyle S13 规则=`quality/max-public-methods`,默认上限 20(`tools/gdstyle.toml` 头注:阈值取 gdstyle 默认值)。 +- `game/core/minesweeper_rules.gd` 非下划线公开方法实数 21(`_init` 豁免,与 S9 R3 同口径)::52/:58/:70/:81/:85/:89/:93/:97/:101/:109/:116/:129/:134/:146/:175/:180/:239/:379/:397/:487/:554。 +- `tools/gdstyle_baseline.txt` 该文件零在册键(grep 零命中)——S13 键经用户裁撤销后,红为 NEW 形态活红。 + +### 3.2 登记方向考证——settle_batch/fx_reveal 两族为何不可作收敛点 + +1. **settle_batch**(:239)=架构在册**唯一提交入口**(architecture.md:105「A2 行」);生产调用方=组合根 `main.gd:574`/:603 两处。搬迁=改架构在册 API 边界;收敛(合并/缩签名)=改唯一提交口契约,零职责收益。 +2. **fx_reveal**(:379)=**棋盘状态本体写口**:函数体改已开集 `_revealed`、发 `cell_revealed`(:380-392);消费方=core 件 `battle_fx_host.gd:185`、`reward_grant.gd:176`。按职责轴(code-conventions §1.1 拆分判据①)是本类本职——搬出=状态暴露或连锁闭包复制(违唯一面)。 + +### 3.3 21 公开方法全量调用方盘点(2026-11-04) + +排查语料=`game/` 全部 .gd 与 .tscn 非注释行;下表「生产调用方实证」=调用形态实查(接收者为 minesweeper 实例)。 + +| # | 方法(定义行) | 生产调用方实证 | 测量/测试面 | 处置 | +|---|---|---|---|---| +| 1 | current_board(:52) | main.gd:375/:582、board_resolvers.gd:30/:44、battle_orchestrator.gd:701 | sim:7 probe:16 test:52 | 保留 | +| 2 | harmful_variants(:58) | grant_segment.gd:110 | — | 保留 | +| 3 | harmful_adjacent(:70) | grant_segment.gd:359 | — | 保留 | +| 4 | reveal_record(:81) | board_view.gd:494/:564 | sim:1 probe:1 test:1 | 保留 | +| 5 | hero_pos(:85) | main.gd:588 | sim:6 probe:19 test:45 | 保留 | +| 6 | is_revealed(:89) | board_view.gd:303/:475/:490/:535、battle_fx_host.gd:177 | sim:10 probe:23 test:22 | 保留 | +| 7 | has_seal(:93) | reward_grant.gd:174 | sim:7 probe:11 test:7 | 保留 | +| 8 | revealed_cells(:97) | battle_orchestrator.gd:507/:700 | sim:3 probe:1 test:16 | 保留 | +| 9 | **safe_remaining(:101)** | **生产外部零调用**——唯一生产调用=同类 clear_map_cleared(:110) | test:4 | **收敛点:公开→私有** | +| 10 | clear_map_cleared(:109) | main.gd:582 | test:1 | 保留 | +| 11 | remove_mines_in(:116) | reward_grant.gd:187、grant_segment.gd:400 | — | 保留 | +| 12 | is_removed(:129) | board_view.gd:303/:537 | test:3 | 保留 | +| 13 | has_unrevealed(:134) | treasure_interact_controller.gd:123 | test:1 | 保留 | +| 14 | install_board(:146) | board_installer.gd:50 | test:6 | 保留 | +| 15 | seal_count(:175) | battle_orchestrator.gd:508/:701 | test:9 | 保留 | +| 16 | retire_board(:180) | battle_orchestrator.gd:534、battle_refresh_flow.gd:69 | — | 保留 | +| 17 | settle_batch(:239) | main.gd:574/:603 | sim:3 probe:8 test:134 | 保留(§3.2-1) | +| 18 | fx_reveal(:379) | battle_fx_host.gd:185、reward_grant.gd:176 | test:13 | 保留(§3.2-2) | +| 19 | preview_reveal(:397) | 生产零调用——**架构在册 sim 信息面出口**(architecture.md:105;sim/auto_player.gd:155 消费) | test:6 | 保留(改它必破坏 MC 自动玩家读数连续性) | +| 20 | compute_move_path(:487) | board_hover.gd:122+同类 _do_move(:479) | sim:3 probe:1 test:5 | 保留 | +| 21 | mine_total(:554) | battle_orchestrator.gd:384 | test:2 | 保留 | + +**结论**:20 个公开方法有生产调用方(全数保留);`preview_reveal` 生产零调用但为架构在册 sim 出口(保留);`safe_remaining` 生产外部零调用(唯一外部消费面=测试直连)——公开面收回的唯一合法收敛点。 + +### 3.4 safe_remaining 本体 + +- 函数体(:101-106):数未揭示安全格(遍历 `_board.safe_cells()` 对 `_revealed` 求余量)。 +- 消费面:同类 `clear_map_cleared`(:110 `return safe_remaining() == 0`)+测试直连 4 组断言 5 处调用表达式(`minesweeper_rules_test.gd` :56/:89/:93 两处/:94——精确余量断言,无公开可观测面承载精确计数:`clear_map_cleared` 仅 bool)。 +- 在案观察(不收件):`_classify`(:276-280)有一段内联余量计数,与 `safe_remaining` 形态重复——合并无职责依据,不动。 + +## 4. 设计契约(🔴 违反即 L3 停机呈报) + +1. 🔴 **游戏行为零变化**——私有化=改名,函数体逐字不动;零 RNG/信号/存档/表值触面。 +2. 🔴 **收敛动机纪律**——本批收敛对象=「无生产消费方的公开面」收回(职责依据,与死码清退同族);禁以阈值数字为动机合并/收拢/搬迁任何有消费方的公开面(code-conventions §1.1 拆分判据③);禁动 settle_batch/fx_reveal/preview_reveal(§3.2/§3.3 在册理由)。 +3. 🔴 **禁保留无效成员**——私有化后禁留公开别名/转发壳/空 getter(code-conventions §1.1 拆分判据⑤)。 +4. 🔴 **测试断言零削弱**——4 组断言改锚后检查语义与期望值逐字不变;改锚=内部面直查**受控例外**(test-conventions §8.2:精确余量计数无公开可观测面可钉),对照表该行注明理由。 +5. 🔴 **MC/模拟零跑**——无数值改动;sim/auto_player 零触碰。 +6. 🔴 **实现批禁写 `design/` 整个目录与根规则文件**——architecture.md:105 走反哺点清单由文档批落文。 +7. 🔴 **车道铁律**——实现走独立 worktree,主区只作合并落点。 + +## 5. 范围边界 + +**做**:`safe_remaining`→`_safe_remaining` 改名(1 处定义+1 处内部调用点+测试 5 处调用表达式改锚)。 + +**不做**: +- 其余 20 公开方法零触碰(§3.3 盘点表逐行在册理由); +- `tools/gdstyle_baseline.txt` 零编辑(不加键不改键——21→20 低于默认上限自然归绿;基线维护归人工修订经用户批准,本批无需); +- `_classify` 内联计数与 `safe_remaining` 的形态重复不并(§3.4 在案观察); +- sim/probe 零触碰。 + +**明示不收件的去向**:无。 + +## 6. 关联文档同步面 + +| 文档 | 关联点(本批实现会改变它的哪条陈述) | 同步义务 | +|---|---|---| +| `design/engineering/architecture/architecture.md` | :105「A2 行」句「公开方法面 19→21(超阈值贴顶——还债归待办清单 P0 条目…)」本批落地后过期 | 实现批禁写——登记进反哺点清单(改现状句:公开方法面 20,safe_remaining 私有化,S13 归绿),用户裁决后归文档批落文 | +| `game/tests/README.md` | :118-121 排雷玩法四能力行——代表用例均为 `_test_*` 函数名,本批零改名 | 实现批禁写——批末收尾核对名实一致(零回表预期) | +| 术语表/GDD 各系统文档 | 零关联(纯代码面收敛) | 无同步义务 | +| 待办清单 | 本条目状态推进(已写卡→已编迭代→完成删除) | 流水线各段承载,实现批不碰 | + +## 7. 任务卡 + +**卡前文件结构图**(零新增文件): + +| 文件 | 职责与改动 | 行为改动 | +|---|---|---| +| `game/core/minesweeper_rules.gd` | :101 定义改名+:110 调用点同步(函数体逐字不动) | 否(非行为改动——对照表行 1) | +| `game/tests/unit/core/minesweeper_rules_test.gd` | 5 处调用表达式改锚(断言消息与期望值逐字不动) | 否(适配——申报见第 8 节) | + +### T0 基点读数(≈0.1 工作日) + +- [ ] gdstyle 单件读数固化:`python tools/gdstyle_gate.py` 按闸件用法跑 `game/core/minesweeper_rules.gd`——记录红键原文(NEW:公开方法 21)与公开方法计数 +- [ ] 测试断言基线固化:`minesweeper_rules_test.gd` :55-56/:89-94 四组断言现文抄录进实现报告(改锚前后逐字比对锚) + +### T1 私有化与测试改锚(≈0.25 工作日) + +- [ ] `minesweeper_rules.gd:101`:`func safe_remaining() -> int:` → `func _safe_remaining() -> int:`(:102-106 函数体逐字不动) +- [ ] `minesweeper_rules.gd:110`:`return safe_remaining() == 0` → `return _safe_remaining() == 0` +- [ ] `minesweeper_rules_test.gd`::56/:89/:93(两处)/:94 调用目标 `_rules.safe_remaining()` → `_rules._safe_remaining()`——断言消息串与期望表达式逐字不动 +- [ ] 孤立验证:`…console.exe --script res://tests/run_all.gd` 单测域全绿(重点 minesweeper_rules_test) + +### T2 验证与落位(≈0.15 工作日) + +- [ ] gdstyle 单件绿:公开方法 20≤20,该文件零红键 +- [ ] 零残留 grep:全仓 `\.safe_remaining\(` 零命中;`\._safe_remaining\(` 恰 6 处(:110+测试 5 处) +- [ ] 里程碑步出口:`tools/run_all_gates.sh --code` 全绿 +- [ ] 产出物落位:`reports/iter-实现报告-<日期>.md`(各卡状态+受控例外注记+实现决定记录;无实机目检项——改名零玩家可观测提交面)+`reports/iter-反哺点-<日期>.md`(architecture.md:105 一条) + +**估时**:合计中值 ≈0.5 个工作日(区间 0.4–0.6)。 + +## 8. 验证闸(改动—验收对照表) + +| # | 需求点 | 改动(文件:行/行为) | 验收测试(名称+落点+尾缀) | 层级 | 真实入口 | 判据绑定面 | 能力行 | +|---|---|---|---|---|---|---|---| +| 1 | 公开面收敛 21→20(S13 归绿) | `minesweeper_rules.gd:101/:110` 改名 | gdstyle S13 读数:该文件 NEW 红→零红(20≤20)——落实现报告 | 静态闸 | gdstyle 闸单件直跑 | S13 公开方法计数 21→20=本批特有提交面 | 既有:装板与开局免费展开(封锁格无资源、计入清图) | +| 2 | 行为零变化回归锚 | 同行 1(改名) | `minesweeper_rules_test.gd` 既有断言全数通过(_test_install_invariants/_test_reveal_advances 等,当轮跑批执行) | 单元 | `tests/run_all.gd` 单元套件 | 断言期望值零变化(改名后同值同断言)=零行为漂移证据 | 既有:装板与开局免费展开(封锁格无资源、计入清图) | +| 3 | 测试直连改锚(受控例外) | `minesweeper_rules_test.gd` :56/:89/:93/:94 | 同行 2(改锚后断言在当轮真实跑批执行并通过) | 单元 | 同行 2 | 精确余量计数断言——**受控例外注记**:精确余量无公开可观测面可钉(`clear_map_cleared` 仅 bool),理由随本表申报 | 既有:装板与开局免费展开(封锁格无资源、计入清图) | + +- **能力行覆盖说明**:本批测试函数名零变化——README:118-121 四能力行(装板与开局免费展开/挖/封印合法性与可辨拒绝/棋盘揭示预览只读口/封印不可逆与挖开封印格放行)的用例全部照旧运行;对照表三行选「装板与开局免费展开」为锚(其代表用例 `_test_install_invariants` 直含改锚断言 :56),其余三行由同套件当轮跑批兜底。 + +- **非行为改动行**:私有化改名=非行为改动(判断依据:函数体逐字不动+行 2 断言全绿)。 +- **测试方式两分法**:本批全部归调试接口验证(单元断言+静态闸读数);**无用户目检项**(零玩家可观测提交面)。 +- **测试削弱申报**:测试调用点 5 处改锚——断言期望值与检查语义逐字零变化;无断言删除、无阈值放宽、无扫描面缩小。 +- **独立验收审计**:`reports/iter-验收审计-<日期>.md`,未参与实现的会话或子代理执行,未过不得合并(test-conventions §8.7;验收档中=对照表全量核对+判据绑定面抽查+复跑以远端 CI 现查读数代证)。 +- **回归措辞**:里程碑步(T2)出口跑一次 `--code` 域全套闸;卡内修复只做出红最小单元的最窄确认。 + +## 9. 异常分级 + +- **L1 自救**:断言消息占位符顺序微调、空行排版。 +- **L2 记录继续**:措辞级微调(记录进实现报告「实现决定记录」)。 +- **L3 停机呈报**:①改名后 S13 仍红(计数口径与本卡考证不符=上游缺陷,停卡退回写卡段);②发现 `safe_remaining` 生产外部调用方(与 §3.3 盘点矛盾);③机检键与本卡契约互斥(禁改闸件豁免、禁自造第三条路);④全套闸红不可最小单元收敛。 + +## 10. 代拍板白名单 + +1. 断言消息串中随改名联动的参数占位写法(保持文案语义)。 +2. 删除/空行排版微调。 + +## 11. 待裁点 + +零待裁点——收敛点按 §3.3 盘点证据唯一化(safe_remaining);登记方向(settle_batch/fx_reveal 族)的排除分析在册(§3.2);用户批卡即对收窄方向背书。开工门=grilling 复核+用户裁决+迭代编排(编入迭代后估时总量 <5 工作日=冻结待凑批)。 + +## 12. 落位与可复用性预检 + +- **复用面**:零新增件——纯改名;禁新增任何转发壳(契约 3)。 +- **唯一面**:`_safe_remaining` 唯一落点仍在 `minesweeper_rules.gd`(数剩余安全格=棋盘状态本职,不迁移);grep 同名核查已证 `safe_remaining`(被私有化)与 `safe_cells`(BoardData 方法,另一标识符域)无混淆。 +- **分层与交互面**:零跨层变化——生产调用方只有同类内部一点(:110);测试直连走受控例外(契约 4);Core 零 UI 依赖不因改名新增绕行;零表值触面。 + +## 13. 禁为机检文本保留无效成员 + +🔴 适用——禁为迎合 S13 消息文本(含计数)保留或新增无效成员/别名/转发壳;改名与机检键互斥时实现段一律停卡呈报,不得自造第三条路。 + +## 14. 实现规范预算 + +零新增文件——三查不适用。存量触面:`minesweeper_rules.gd` 基线零在册键(grep 已证)——S13 预期 NEW 红→消失(21→20);改名不改函数长/分支/返回数(gdstyle 函数级规则零漂移);测试文件不在 S13 扫描面(产品码三目录外,code-conventions §4.13)。全部触面 S13 键较登记值只降不升(T0/T2 读数步骤承载)。 + +## 15. 拆分边界纪律 + +本卡为收敛类(公开面收回)——**无拆出单元**(私有化非拆分,无新件)。红线:收敛动机=职责依据(无生产消费方公开面,§3.3 盘点表为证),非阈值数字;禁为凑 20 合并/收拢任何有消费方的公开面;禁把本卡与卡②清退面混装(两卡两事项,编排段可凑批)。 diff --git a/reports/需求卡片-孤儿函数清退批-2026-11-04.md b/reports/需求卡片-孤儿函数清退批-2026-11-04.md new file mode 100644 index 00000000..5b2527ed --- /dev/null +++ b/reports/需求卡片-孤儿函数清退批-2026-11-04.md @@ -0,0 +1,251 @@ +# 需求卡片:孤儿函数清退批 + +> 来源:待办清单「EffectEngine 死函数与全仓孤儿函数清退」(2026-11-04 登记,来源=会话提及,优先级=P0;需求性工程条目,证据指认在条目实况)。**唯一事实源:该条目实况证据链+本卡第 3 节 2026-11-04 全仓排查考证(排查总体/口径/判死清单逐件实查)。** +> 裁决沿革:删除方向 2026-11-04 用户裁(删 `has_effect_on` 并全仓排查生产码零调用死函数一并清退);排查口径按登记(生产码为排查总体;测试直连与受控例外面不判死)。 +> 验收档:中 +> 版本:v1.0(2026-11-04) + +## 1. 目标与完成定义 + +产品码三目录孤儿函数清零: + +- 判死清单六件(§3.2)零调用方死函数删除(含各自专属文档注释行); +- 删除后级联零新增孤儿(关联在役成员逐件留存复核); +- 游戏行为零变化(六件全为无调用方死件,删除无运行期可观测面)。 + +**完成定义**:六件定义行消失且全仓(.gd+.tscn)零残留;级联留存复核通过(§3.2 级联核列);既有套件全绿;`--code` 域全套闸绿。 + +## 2. 设计事实源 + +需求性工程条目(死码清退,无设计线):设计事实源=**证据指认**——待办清单条目实况(`game/core/effect_engine.gd:204` `has_effect_on` 全仓零调用方,登记证据;2026-11-04 用户裁删并全仓排查)+本卡第 3 节 2026-11-04 全仓排查复核(file:line 逐件实查)。 + +## 3. 现状事实(2026-11-04 全仓排查考证) + +### 3.1 排查口径与方法(可复现) + +- **排查总体**=`game/core`+`game/data`+`game/presentation` 全部 `func` 定义(code-conventions §4.13 产品码三目录口径;`game/` 根目录无散落 .gd——find 已证)。 +- **语料**=`game/` 下全部 .gd 与 .tscn 的非注释行(.tscn 覆盖信号接线 `method=` 形态)。 +- **判死**=全仓零调用方——测试/sim/probe 直连不判死(登记口径);引擎虚函数(`_init`/`_ready`/`_process` 等)除外。 +- **方法**:逐函数名全仓标识符检索(词边界)→ 剥注释 → 定义行外零出现=死函数候选 → 逐件人工复核调用形态(排除字符串标签/跨类同名噪声;同名多定义清单已核,六件名均无跨类同名定义)。 + +### 3.2 判死清单(六件) + +| # | 件 | 定义(含注释) | 职责 | 零调用证据 | 级联核(保留面) | +|---|---|---|---|---|---| +| 1 | `has_effect_on` | effect_engine.gd:203-212 | 订阅查询面(发射点缺省行为仲裁——round_end 走 RAP 转存后成死件) | 登记证据+本次全仓 grep 仅定义命中 | `_triggers`/`dispatch`(:218)在役不受影响 | +| 2 | `_bp_read_int` | breakpoint_store.gd:211-219 | 数值类读侧 helper(clamp/params_fallback 策略分支) | 全仓零调用;生产读侧=`bp_read`(:197,消费 keep_on_null/plain) | `_bp_strategy`(:207)由 `bp_read` 共用——保留;`BREAKPOINT_FIELDS` 的 clamp/params_fallback 策略标签保留(文档标签;其机械消费面缺失在案观察,见 §3.3 注④) | +| 3 | `_find_token` | adventure_runner.gd:250-252 | 死包装——转发 `_curio.find_token`,而 curio_stop 无此方法(若被调用即运行期错误);真件=`curio_deck.find_token`(curio_deck.gd:51,curio_stop.gd:107/:229 在役消费) | 全仓零调用 | `curio_deck.find_token` 保留(活) | +| 4 | `has_open` | modal_stack.gd:56-62 | 开态查询(组合根输入锁判据位) | 全仓零调用——组合根实际消费 `has_open_excluding_tags`(空标签集=全计,同形;:65-67 注释自证) | 独立谓词,零级联 | +| 5 | `set_feedback_state` | camp_scene_view.gd:88-92 | 持久基态外部设置口 | 全仓零调用——视图内 `_handle_motion` 族自持(`_apply_state` :113/:116/:118/:127/:133 在役) | `_apply_state`/`_base_state`/`_base_states` 保留 | +| 6 | `stop_resolved` | curio_stop.gd:303-305 | 放行谓词(宿主关序受理) | 全仓零调用 | `_resolved` 多读写在役(:207/:215/:216/:343/:360/:394/:401/:413);`_pending` 由 `curio_stop_pending`(:300)消费——均保留 | + +### 3.3 B 段清单——生产码零调用、仅 sim/probe/tests 出现(登记口径保留,不判死) + +排查另得 69 件(附表全列)+ `_init`/`_ready` 引擎虚函数面(排除)。重点注记: + +- **注①**:`config_db.gd:170` `_validate_skill_pool_links`——被**跨表校验件取代的旧实现**:生产真身=`config_db_cross_validator.gd:197-213`(同判定类别 dangling_skill/pool_composition,检查面更全);旧件生产零调用、测试直连 5 处(round_flow_skill_pool_test.gd:869/871/876/893/905)——测试锚在被取代实现。**去向=新立待办条目**(写卡段同批登记),不在本卡收件。 +- **注②**:`gp_wallet.gd:10` `gain_gp`——生产零调用、测试造数面(hero_ledger_test.gd:105)——保留。 +- **注③**:`main.gd:106` `_start_adventure_from_menu`——**在册中间态**(代码注释自证:探针直调位点 mn10 逐个登记,卡④到位后由大门两分支换代)——非孤儿发现,保留。 +- **注④**:`breakpoint_store.gd` 的 BREAKPOINT_FIELDS 策略标签 `clamp`/`params_fallback`(:19/:20/:39/:40/:41)机械消费面随 `_bp_read_int` 死亡——标签保留为文档语义,是否补消费面或清标签归后续裁决(本卡不动)。 +- 其余 B 段件=探针取证面(`*_probe`/`press_*_for_probe`)、调试面(debug_overlay 族)、测量面(playtest_logger/sim 消费)与测试造数面——按登记口径全部保留。 + +**B 段附表(69 件全列)**: + +| 定义处 | 函数名 | 保留面调用计数 | +|---|---|---| +| presentation/main.gd:106 | _start_adventure_from_menu | probe:11, test:6 | +| core/config_db.gd:170 | _validate_skill_pool_links | test:5 | +| core/slot_store.gd:48 | active_slot | probe:5, test:11 | +| presentation/views/hero_info_panel_view.gd:156 | armor_text | probe:2 | +| core/slot_store.gd:24 | attach_path | probe:3, test:9 | +| core/slot_store.gd:34 | attach_slot_template | probe:4, test:15 | +| presentation/views/hero_info_panel_view.gd:152 | attack_text | probe:3 | +| core/battle_orchestrator.gd:152 | attune_has | test:8 | +| core/level_runner.gd:482 | awaiting_choice | probe:5, sim:1, test:19 | +| presentation/views/level_map_screen.gd:589 | canvas_probe | probe:3, test:1 | +| presentation/views/board_view.gd:442 | cell_center_local | probe:1 | +| presentation/views/board_view.gd:845 | cell_rect_probe | probe:3 | +| presentation/views/board_view.gd:817 | cells_probe | probe:25 | +| presentation/views/board_view.gd:419 | click_cell | probe:7 | +| presentation/views/ap_bar_view.gd:197 | confirm_visible | probe:1 | +| presentation/views/standee_body.gd:355 | content_rect | probe:1 | +| data/schemas/adventure_table.gd:165 | deck_total | test:2 | +| core/config_db.gd:86 | diagnostics | sim:1, test:17 | +| presentation/views/board_view.gd:822 | diggable_probe | probe:8 | +| presentation/views/level_map_screen.gd:595 | display_probe | probe:2, test:1 | +| presentation/views/debug_overlay.gd:69 | effect_text | probe:2 | +| presentation/views/battle_stage_view.gd:262 | enemy_body_at | probe:2 | +| presentation/views/board_view.gd:832 | fog_params_probe | probe:5 | +| presentation/views/battle_end_overlay.gd:382 | fx_probe | probe:10, test:1 | +| presentation/views/standee_body.gd:217 | fx_probe | probe:10, test:1 | +| core/gp_wallet.gd:10 | gain_gp | test:1 | +| presentation/views/camp_scene_view.gd:83 | get_hotspot_rect | probe:1 | +| core/slot_store.gd:53 | has_write_target | test:9 | +| presentation/views/standee_body.gd:304 | hero_state_probe | probe:4 | +| presentation/views/board_view.gd:827 | hover_probe | probe:2 | +| presentation/views/standee_body.gd:57 | intent_probe | probe:4 | +| core/reward_economy.gd:74 | is_mapped | sim:1 | +| presentation/views/level_map_screen.gd:584 | layout_probe | probe:7, test:5 | +| presentation/playtest_logger.gd:45 | log_path | sim:11, test:2 | +| presentation/playtest_logger.gd:118 | log_run | sim:2 | +| presentation/views/standee_body.gd:64 | name_line_probe | probe:1, test:3 | +| core/level_runner.gd:400 | next_candidates | sim:1, test:2 | +| presentation/views/debug_overlay.gd:121 | output_text | probe:1 | +| presentation/views/battle_log_view.gd:102 | parsed_text | probe:2, test:6 | +| presentation/views/standee_body.gd:283 | portrait_probe | probe:2, test:3 | +| presentation/views/debug_overlay.gd:127 | press_apply_for_probe | probe:2 | +| presentation/views/level_map_screen.gd:402 | press_candidate | probe:8, test:1 | +| presentation/views/curio_pick_overlay.gd:157 | press_card | probe:3, test:2 | +| presentation/views/curio_pick_overlay.gd:163 | press_confirm | probe:3, test:1 | +| presentation/views/ap_bar_view.gd:201 | press_confirm_for_probe | probe:1 | +| presentation/views/curio_pick_overlay.gd:167 | press_continue | probe:7, test:1 | +| presentation/views/node_overlay.gd:33 | press_continue | probe:7, test:1 | +| presentation/views/curio_pick_overlay.gd:172 | press_refresh | test:2 | +| presentation/views/ap_bar_view.gd:193 | press_refresh_for_probe | probe:1 | +| presentation/views/debug_overlay.gd:131 | press_reset_for_probe | probe:1 | +| presentation/views/debug_overlay.gd:135 | press_simulate_for_probe | probe:1 | +| core/minesweeper_rules.gd:397 | preview_reveal | sim:1, test:6 | +| core/treasure_items.gd:236 | probe | probe:24, test:51 | +| presentation/views/settlement_fx_view.gd:73 | probe_banners | probe:3 | +| presentation/views/settlement_fx_view.gd:78 | probe_settlement_marks | probe:1 | +| presentation/views/ap_bar_view.gd:206 | refresh_remaining_text | probe:3 | +| core/refresh_bank.gd:38 | refresh_y | sim:2, test:10 | +| core/config_db.gd:180 | reload | probe:2, test:4 | +| core/config_db.gd:81 | reset_diagnostics | test:3 | +| presentation/views/settings_overlay.gd:26 | retarget | probe:1 | +| presentation/views/debug_overlay.gd:101 | run_data_probe | probe:1 | +| presentation/views/board_view.gd:163 | set_fog_enabled | probe:2 | +| presentation/views/debug_overlay.gd:73 | set_sim_count | probe:1 | +| presentation/views/debug_overlay.gd:58 | set_sliders | probe:4 | +| presentation/views/board_view.gd:345 | set_type_glow_enabled | probe:4, test:5 | +| core/level_runner.gd:144 | start_level | probe:2, sim:2, test:11 | +| presentation/debug_session.gd:31 | start_single | probe:1 | +| presentation/views/board_view.gd:837 | type_glow_probe | probe:13, test:11 | +| presentation/views/battle_end_overlay.gd:204 | verdict_text | probe:2 | + +## 4. 设计契约(🔴 违反即 L3 停机呈报) + +1. 🔴 **游戏行为零变化**——六件全为零调用方死件,删除零运行期可观测面;零 RNG/信号/存档/表值触面。 +2. 🔴 **级联零新增**——删除后全仓不得出现新孤儿函数(§3.2 级联核列逐件留存复核,T2 判据)。 +3. 🔴 **范围纪律**——只删 §3.2 六件;B 段一律不收(注①去向=新立待办);禁顺手清 tests/sim/probe 面(非生产码)。 +4. 🔴 **禁保留无效成员**——删函数禁留空壳/别名/注释存根(code-conventions §1.1 拆分判据⑤)。 +5. 🔴 **断言零削弱**——六件无测试直连(grep 已证),测试文件零触碰、零断言改判。 +6. 🔴 **实现批禁写 `design/` 整个目录与根规则文件**(architecture.md 六件名 grep 零命中,无反哺点——已核)。 +7. 🔴 **MC/模拟零跑**——无数值改动。 8. 🔴 **车道铁律**——实现走独立 worktree。 + +## 5. 范围边界 + +**做**:§3.2 六件删除(含各自专属文档注释行;六件行段见 §7 文件结构图)。 + +**不做**: +- B 段全部 69 件(§3.3;注①去向=新立待办条目,注④归后续裁决); +- 六件级联核保留面(§3.2 末列); +- tests/sim/probe 面的孤儿排查(非生产码,不在登记范围)。 + +**明示不收件的去向**:待办清单新立条目「config_db._validate_skill_pool_links 旧校验件清退与测试改锚」(写卡段同批登记)。 + +## 6. 关联文档同步面 + +| 文档 | 关联点(本批实现会改变它的哪条陈述) | 同步义务 | +|---|---|---| +| `design/engineering/architecture/architecture.md` | 六件名 grep 零命中(has_effect_on/bp_read_int/find_token/has_open/set_feedback_state/stop_resolved 全零——已核) | 无同步义务(零反哺点) | +| `game/tests/README.md` | 六件名零命中能力清单(已核);六件所属套件能力行不受影响 | 实现批禁写——批末收尾核对名实一致(零回表预期) | +| 术语表/GDD 各系统文档 | 零关联(纯代码面清退) | 无同步义务 | +| 待办清单 | 本条目状态推进+新立注①条目 | 状态推进归流水线各段,实现批不碰 | + +## 7. 任务卡 + +**卡前文件结构图**(零新增文件;六件全为非行为改动): + +| 文件 | 改动 | 行为改动 | +|---|---|---| +| `game/core/effect_engine.gd` | 删 :203-212(文档注释+函数) | 否(对照表行 1) | +| `game/core/breakpoint_store.gd` | 删 :211-219(注释+函数) | 否(行 2) | +| `game/core/adventure_runner.gd` | 删 :250-252(注释+函数) | 否(行 3) | +| `game/presentation/modal_stack.gd` | 删 :56-62(注释+函数) | 否(行 4) | +| `game/presentation/views/camp_scene_view.gd` | 删 :88-92(函数;无专属注释块) | 否(行 5) | +| `game/core/curio_stop.gd` | 删 :303-305(注释+函数) | 否(行 6) | + +### T0 基点读数(≈0.2 工作日) + +- [ ] 六件定义处行号与所在文件基线键读数固化(`adventure_runner.gd` max-class-variables=23 在册,其余五文件 grep 基线键记录)——落实现报告(删除后只降不升核对面) +- [ ] 六件零调用方证据复核:逐件全仓 grep(.gd+.tscn,词边界)仅定义命中——与 §3.2 一致;不一致即停卡(L3-①) + +### T1 六件删除(≈0.3 工作日) + +- [ ] `effect_engine.gd`:删 :203-212(`## 订阅查询面…` 注释+`has_effect_on` 函数体) +- [ ] `breakpoint_store.gd`:删 :211-219(`# 数值类读侧…` 注释+`_bp_read_int` 函数体) +- [ ] `adventure_runner.gd`:删 :250-252(`# 候选令牌匹配…` 注释+`_find_token` 转发行) +- [ ] `modal_stack.gd`:删 :56-62(`# 开态查询…` 注释+`has_open` 函数体) +- [ ] `camp_scene_view.gd`:删 :88-92(`set_feedback_state` 函数体) +- [ ] `curio_stop.gd`:删 :303-305(`# 放行谓词…` 注释+`stop_resolved` 函数体) +- [ ] 各删除点相邻空行规范化(两空行分隔惯例保持) + +### T2 级联与零残留复查(≈0.15 工作日) + +- [ ] 六件名全仓 grep(.gd+.tscn,词边界)零残留 +- [ ] 级联留存复核(grep 计数落实现报告):`_bp_strategy`/`bp_read`、`curio_deck.find_token`、`has_open_excluding_tags`、`_apply_state` 族、`_resolved`/`_pending`、`_triggers`/`dispatch` 各 ≥1 在役调用方 +- [ ] 新增孤儿扫描:按 §3.1 口径复查六文件——删除不产生新零调用函数 + +### T3 验证闸(≈0.15 工作日) + +- [ ] 孤立验证:`…console.exe --script res://tests/run_all.gd` 单测域全绿(重点 effect_port/breakpoint/curio/modal/camp/adventure 关联套件) +- [ ] 里程碑步出口:`tools/run_all_gates.sh --code` 全绿 + +### T4 产出物落位卡(≈0.1 工作日) + +- [ ] `reports/iter-实现报告-<日期>.md`:各卡状态+实现决定记录+级联留存复核计数+实机目检总清单(登记「无实机目检项」——死件删除零玩家可观测提交面) +- [ ] `reports/iter-反哺点-<日期>.md`:零条(§6 已核;文件仍须落,写明「零反哺点」) + +**估时**:合计中值 ≈0.9 个工作日(区间 0.75–1.25)。 + +## 8. 验证闸(改动—验收对照表) + +| # | 需求点 | 改动(文件:行/行为) | 验收测试(名称+落点+尾缀) | 层级 | 真实入口 | 判据绑定面 | 能力行 | +|---|---|---|---|---|---|---|---| +| 1 | has_effect_on 退役(登记原件) | `effect_engine.gd:203-212` 删 | 静态判据:T2 零残留 grep+既有套件全绿(effect_port_test 等当轮跑批执行) | 静态+单元 | `tools/run_all_gates.sh --code`(09 静态扫描+00/01 保险) | 定义行消失+全仓零残留+回归绿三面(死函数无运行期提交面——静态判据+评审注记申报观测面局限) | 既有:效果发射端口单点 | +| 2 | _bp_read_int 退役 | `breakpoint_store.gd:211-219` 删 | 同行 1(断点关联套件为回归锚) | 静态+单元 | 同行 1 | 同行 1 | 既有:断点片段往返与续玩幂等 | +| 3 | _find_token 退役(死包装) | `adventure_runner.gd:250-252` 删 | 同行 1(adventure 关联套件为回归锚) | 静态+单元 | 同行 1 | 同行 1 | 既有:冒险生命周期:开局受理/三关序列/败北线 | +| 4 | has_open 退役 | `modal_stack.gd:56-62` 删 | 同行 1(modal 关联套件为回归锚) | 静态+单元 | 同行 1 | 同行 1 | 既有:模态覆盖层编排与输入锁 | +| 5 | set_feedback_state 退役 | `camp_scene_view.gd:88-92` 删 | 同行 1(camp 关联套件/探针为回归锚) | 静态+单元 | 同行 1 | 同行 1 | 既有:营地场景图十层铺底与门洞留空呈现 | +| 6 | stop_resolved 退役 | `curio_stop.gd:303-305` 删 | 同行 1(curio 关联套件为回归锚) | 静态+单元 | 同行 1 | 同行 1 | 既有:奖励三选一候选/刷新付费/呈现 | +| 7 | 级联零新增(完成定义判据) | 六件删除的伴生核(无新增代码改动) | T2 级联留存复核:§3.2 末列六组保留面 grep 计数各 ≥1 在役调用方+新增孤儿扫描(按 §3.1 口径复查六文件零新孤儿)——计数落实现报告 | 静态 | 同行 1 | 保留面调用计数与新孤儿扫描零命中=本批级联判据特有提交面 | 既有:效果发射端口单点 | + +- **非行为改动行**:六行全部为非行为改动(判断依据:被删函数全仓零调用方〔§3.2 证据〕=无运行期提交面;既有套件全绿兜底)。 +- **测试方式两分法**:本批全部归静态判据+套件回归锚;**无用户目检项**(零玩家可观测提交面)。 +- **测试削弱申报**:无——测试文件零触碰(六件无测试直连,grep 已证)。 +- **独立验收审计**:`reports/iter-验收审计-<日期>.md`,未参与实现的会话或子代理执行,未过不得合并(test-conventions §8.7;验收档中=对照表全量核对+判据绑定面抽查+复跑以远端 CI 现查读数代证)。 +- **回归措辞**:里程碑步(T3)出口跑一次 `--code` 域全套闸;卡内修复只做出红最小单元的最窄确认。 + +## 9. 异常分级 + +- **L1 自救**:空行规范化笔误、grep 白名单笔误。 +- **L2 记录继续**:级联留存复核的计数呈现形态(记录进实现报告)。 +- **L3 停机呈报**:①T0 复核发现任一件实有调用方(字符串派发/动态接线漏判=上游考证缺陷,停卡退回写卡段);②级联复查发现新孤儿(误判级联);③机检键与本卡契约互斥(禁改闸件豁免);④全套闸红不可最小单元收敛。 + +## 10. 代拍板白名单 + +1. 删除点相邻空行规范化。 +2. T2 复核计数落实现报告的表格形态。 + +## 11. 待裁点 + +零待裁点——删除方向 2026-11-04 用户裁;排查口径按登记(生产码总体+测试直连不判死);B 段保留与注①去向新立待办=登记口径的执行。开工门=grilling 复核+用户裁决+迭代编排(编入迭代后估时总量 <5 工作日=冻结待凑批)。 + +## 12. 落位与可复用性预检 + +- **复用面**:零新增件——纯删除。 +- **唯一面**:删除不产生第二落点;三组同名体已核辨——`curio_deck.find_token`(在役真件)与被删 `_find_token`(死包装)是两个标识符域;`has_open` 与 `has_open_excluding_tags`(在役)同理;`stop_resolved` 与信号 `curio_resolved`(在役)同理。 +- **分层与交互面**:零跨层变化——六件均无调用方,删除不改变任何调用路径;Core 零 UI 依赖不因删除新增绕行;零表值触面。 + +## 13. 禁为机检文本保留无效成员 + +🔴 适用(删除侧反向)——禁为保机检键/计数留空壳、别名、注释存根;删除与机检键互斥时实现段一律停卡呈报,不得自造第三条路。 + +## 14. 实现规范预算 + +零新增文件——三查不适用。存量触面六文件:函数删除不改类变量数(`adventure_runner.gd` max-class-variables=23 在册,读数不变);gdstyle 函数级键(若有)只降不升;S13 公开方法数只降不升(六件中 `has_effect_on`/`has_open`/`set_feedback_state`/`stop_resolved` 为公开方法——四文件 S13 计数各 −1,T0 读数承载)。全部触面 S13 键较登记值只降不升。 + +## 15. 拆分边界纪律 + +本卡为删除类(非拆分/收敛类),无拆出单元。红线:禁为凑指标或摊薄审查把六件拆多批留尾——六件一次清完(T1 六个复选框是施工粒度,非范围拆分);禁把 B 段任何件搭车收进本批(§4 契约 3)。 diff --git a/待办清单.md b/待办清单.md index e8b4c481..a90fad21 100644 --- a/待办清单.md +++ b/待办清单.md @@ -257,15 +257,23 @@ #### minesweeper_rules 公开面还债——S13 超标键撤销后的清偿(2026-11-04 登记,来源=批次移交,优先级=P0) -**实况**:证据=tools/gdstyle_baseline.txt(本批撤销无凭证键后,gdstyle 闸红单键:game/core/minesweeper_rules.gd 公开方法 21>上限 20);+2 搬家方法 harmful_variants/harmful_adjacent 为迭代51卡② R2「五方法归位」裁决的直接后果(git 提交 7f512aa8),基点漂移考证:写卡基点 6261b36e 实数 18,iter50-卡3 a2886a53 +1 → 实现基点 19,+2=21。还债方向:settle_batch/fx_reveal 族收敛或搬迁,公开方法 21→≤20;还债批合回后 gdstyle 归绿(CI 追绿),期间代码域 CI 红在案、文档批不受影响(域分流)。 +**实况**:证据=tools/gdstyle_baseline.txt(本批撤销无凭证键后,gdstyle 闸红单键:game/core/minesweeper_rules.gd 公开方法 21>上限 20);+2 搬家方法 harmful_variants/harmful_adjacent 为迭代51卡② R2「五方法归位」裁决的直接后果(git 提交 7f512aa8),基点漂移考证:写卡基点 6261b36e 实数 18,iter50-卡3 a2886a53 +1 → 实现基点 19,+2=21。还债方向经 21 公开方法全量盘点收窄=safe_remaining 私有化(其余 20 个有生产调用方;preview_reveal=架构在册 sim 出口;settle_batch/fx_reveal 受架构在册边界与职责轴保护)——需求卡片 reports/需求卡片-minesweeper_rules公开面还债批-2026-11-04.md(实现批输入合同,0.5 工作日)。 **改动面**:游戏代码 -**状态**:待写卡 +**状态**:已写卡 #### EffectEngine 死函数与全仓孤儿函数清退(2026-11-04 登记,来源=会话提及,优先级=P0) -**实况**:证据=game/core/effect_engine.gd:204 has_effect_on 全仓零调用方(迭代51卡①删唯一调用方后成死码,grep 仅定义命中;卡① 备案见 git 提交 7f512aa8;2026-11-04 用户裁=删并全仓排查)。范围=删除 has_effect_on+全仓排查生产码零调用死函数/孤儿函数一并清退;测试直连与受控例外面不算死码,排查随写卡段考证。 +**实况**:证据=game/core/effect_engine.gd:204 has_effect_on 全仓零调用方(迭代51卡①删唯一调用方后成死码,grep 仅定义命中;卡① 备案见 git 提交 7f512aa8;2026-11-04 用户裁=删并全仓排查)。排查已于写卡段完成:判死六件(has_effect_on/bp_read_int/find_token/has_open/set_feedback_state/stop_resolved,级联零牵连),B 段 69 件生产零调用仅测量面按登记口径保留——需求卡片 reports/需求卡片-孤儿函数清退批-2026-11-04.md(实现批输入合同,0.9 工作日)。 + +**改动面**:游戏代码 + +**状态**:已写卡 + +#### config_db._validate_skill_pool_links 旧校验件清退与测试改锚(2026-11-04 登记,来源=审计发现) + +**实况**:config_db.gd:170 _validate_skill_pool_links 生产零调用——技能池链接校验生产真身已迁 config_db_cross_validator.gd:197-213(同判定类别 dangling_skill/pool_composition,检查面更全);旧件测试直连 5 处(round_flow_skill_pool_test.gd:869/871/876/893/905),测试锚在被取代实现。处置方向待裁(删旧件+测试改锚跨表校验件〔推荐〕vs 留旧件作测试对照件)。证据=孤儿函数清退批写卡段全仓排查(reports/需求卡片-孤儿函数清退批-2026-11-04.md §3.3 注①)。 **改动面**:游戏代码