合并(写卡P0两批): minesweeper_rules公开面还债批+孤儿函数清退批两卡落盘(用户批卡成立); 待办清单两P0条目已写卡+新立_validate_skill_pool_links条目; pipeline_gate PASS
ci / gates (push) Successful in 36s

This commit is contained in:
DKChan committed 2026-11-04 14:37:30 +08:00
commit 131c63e7fb
3 files changed
+441 -3

No files matched your search

@@ -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<N>-实现报告-<日期>.md`(各卡状态+受控例外注记+实现决定记录;无实机目检项——改名零玩家可观测提交面)+`reports/iter<N>-反哺点-<日期>.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<N>-验收审计-<日期>.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 合并/收拢任何有消费方的公开面;禁把本卡与卡②清退面混装(两卡两事项,编排段可凑批)。
@@ -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<N>-实现报告-<日期>.md`:各卡状态+实现决定记录+级联留存复核计数+实机目检总清单(登记「无实机目检项」——死件删除零玩家可观测提交面)
- [ ] `reports/iter<N>-反哺点-<日期>.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<N>-验收审计-<日期>.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)。
+11 -3
View File
@@ -257,15 +257,23 @@
#### minesweeper_rules 公开面还债——S13 超标键撤销后的清偿(2026-11-04 登记,来源=批次移交,优先级=P0) #### 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) #### 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 注①)。
**改动面**:游戏代码 **改动面**:游戏代码