diff --git a/reports/需求卡片-奖励节点过时表述清扫批-2026-10-25.md b/reports/需求卡片-奖励节点过时表述清扫批-2026-10-25.md new file mode 100644 index 00000000..2ff3cae3 --- /dev/null +++ b/reports/需求卡片-奖励节点过时表述清扫批-2026-10-25.md @@ -0,0 +1,168 @@ +# 需求卡片:奖励节点过时表述清扫批(「奖励节点三选一实装」注销承接·第四微卡) + +- 版本:**v1.1**(2026-10-25 成文;内容全部迁自卡 B〔效果引擎校验文案计数修正批〕P 支——该面已经卡 B 两轮 grilling 复核,2026-10-25 用户裁点 P 乙案迁出独立成卡;独立成卡后轻量复核判「通过(附两应修)」→v1.1 折入〔battle_narrator 行号订正+wr1 判据补「内容未定」串〕,复核记录见 §12) +- 来源:[待办清单](../待办清单.md)「奖励节点过时表述清扫批」条目(2026-10-25 随注销同批登记,状态=已写卡·本卡)(唯一事实源:工程证据指认=「奖励节点三选一实装」条目 2026-10-25 用户确认注销的承接义务包〔注释修订+玩家文案修订+wa4 断言转正〕+本卡 §3 行号级实查〔迁自卡 B 并经其 grilling 独立复核订正〕) +- 归属:`game/core/level_runner.gd`(注释两处)+ `game/presentation/battle_narrator.gd`(玩家文案一行)+ `game/probe/ui_click_probe.gd`(wa4 断言转正)+ `game/sim/level_autoplay.gd`(注释理由句一行) +- 排期:未编入(迭代批卡片;估时 ≈0.5 工作日) +- 开工门:U0+复核门过(§12);**零待裁点**(承接义务成立与范围均已由注销确认与裁点 P 乙落定) + +## 0. 前置依赖与并行性 + +- **承接链**:「奖励节点三选一实装」条目(2026-10-25 用户确认注销)在册义务两笔——①「本条实装后须重跑该断言」(wa4 条件断言,test-conventions §6 口径)→ 本卡 d4 承接;②条目证据(过时注释)与其掩护的过时表述族 → 本卡 d1/d2/d3。承接包落位=2026-10-25 用户裁点 P 乙(独立微卡)——禁随注销湮灭(卡 B 第一轮 grilling 阻断二的裁决记录在案)。 +- 与卡 B(迁出源)零文件交叠后互不依赖:卡 B 只余 effect_engine 面与本卡的 ui_click_probe wa4 段无叠。 +- 与卡 C 同触 ui_click_probe 不同段(其角标段 :325-327/本卡 wa4 段 :415-425 与历史注记 :670-672 豁免)——无冲突。 +- 与卡 A 零交叠。 + +## 1. 目标与完成定义 + +**目标**:「奖励节点零兑付直通占位」过时表述族在判据面清扫(level_runner 两注释+autoplay 理由句+battle_narrator 玩家可见文案),wa4 条件断言转正复跑(拦截能力未证→必达)。 + +**改动单元清单**(🔴 契约 1): + +| # | 单元(实查) | 改法 | 依据 | +|---|---|---|---| +| d1 | `game/core/level_runner.gd:477-478` `"reward"` 分支注释「奖励点内容未定…节点保留占位、零兑付直通」+`:10` 信号注释 `reward={}(内容待定)`——与实现相悖(emit :479 后全链三选一兑付在位,§3 E1) | 注释改现状准确表述(措辞 L1:奖励节点=三选一停点、兑付确认后选路、呈现编排归 curio_interact_controller.present_node_curio;信号注释=`reward={}` 三选一停点空载荷、内容经 present_node_curio 拉取) | 注销承接(§0) | +| d2 | `game/sim/level_autoplay.gd:484` 注释理由句「奖励点 = 内容未定直通节点」——autoplay 直 continue 是 sim 策略选择(**行为保留**)、理由句失实 | 理由句换代为策略语义(措辞 L1:「autoplay 直通不解三选一——策略选择」方向);行为零触碰 | 同上;B5 分类(卡 B 二轮复核订正) | +| d3 | `game/presentation/battle_narrator.gd:15` `reward_line()` 玩家可见战报文案「关卡奖励点(节点内容待定——直通)」——三选一弹层拉起同屏打印(main_adventure_flow.gd:53-57),**玩家拿到的明明是三选一,文案却宣告直通** | 文案改现状表述(措辞 L1:「关卡奖励点(三选一——选毕推进)」方向);**呈现文案变化=玩家可见行为改动**,对照表专行(wr2);CurioPickOverlay 头部串(wa4 匹配对象「关卡奖励点」)**不动**——两串独立,d3 不破 wa4 匹配 | 注销承接;文案与实现相悖的玩家可见面 | +| d4 | `game/probe/ui_click_probe.gd:415-425` wa4 三选一头部断言——条件断言(`_tested_curio_head` 仅在探针真实走到三选一停点时置位校验,未走到即静默跳过=拦截能力未证) | 转正:探针驱动路径保证到达三选一停点(奖励节点真实路径),断言必达(未命中停点即红);头部校验逻辑本体(「冒险牌库」/「属性值提升与补给」等串)零改动 | 条目在册 wa4 复跑义务(test-conventions §6 条件断言转正口径) | + +**完成定义**: + +1. d1–d4 落地;wr1 grep 判据零命中+wr2 断言绿+wr3 探针直跑绿且 wa4 真执行; +2. 全套闸按本批改动域选档全绿; +3. 撤销证明两条(wr2/wr3);三份产出物写齐(T2)。 + +## 2. 设计事实源 + +| # | 出处 | 取用条款 | +|---|---|---| +| D1 | 工程证据指认=「奖励节点三选一实装」条目注销确认(2026-10-25 用户)+裁点 P 乙落定 | 承接义务包范围 | +| D2 | [test-conventions](../design/engineering/test-conventions.md) §6/§8 | 条件断言「拦截能力未证」口径与转正义务;断言新增须同步验证集清单 | +| D3 | 卡 B 两轮 grilling 复核记录(2026-10-25) | B5 分类表与行号订正的已审凭据 | + +## 3. 现状事实(迁自卡 B §3 并经其两轮 grilling 独立复核订正;开工日 T0 复核行号) + +| # | 事实 | 出处 | +|---|---|---| +| E1 | 三选一全链在位:`"reward"` 分支(:476-480,注释 :477-478、emit :479)发射 `node_entered.emit(node, {})` → adventure_runner 转发(:724 connect/:849 _forward_node_entered)→ main_adventure_flow.gd:53-57 `present_node_curio()` 拉起 → curio_interact_controller.gd:116-131 三选一弹层(抽签→open_pick→apply_node_curio 兑付) | `game/core/level_runner.gd:476-480`;链上各文件实查 | +| E2 | 过时表述判据面(grep「零兑付直通」「内容待定」两串·两文件):level_runner.gd:477-478/:10+battle_narrator.gd:15-16——修订后判据面清零;autoplay 域 :220(空池直通)/:381(MC 夹具语境)行为性准确保留、:484 理由句随 d2 修订(d2 后「内容未定」字样消、:220/:381 的「直通」字样不在判据面);ui_click_probe.gd:670-672 历史注记保留(迭代 36 卡片前提缺陷记录,git 可考);design/ 侧 08-Alpha版本标准.md:113 与 roadmap 指路句走反哺(§6) | grep 全仓+逐处实查(卡 B B5 表迁入) | +| E3 | wa4 断言现形态:`_tested_curio_head` 条件位+头部串校验(匹配「关卡奖励点」=CurioPickOverlay 头部串 `node_curio_header()`——与 d3 战报行串两处独立);断言新增/转正须同步 `game/tests/验证集清单.md`(test-conventions §8.3——清单对账 `python tools/extract_checks.py --diff` 不在闸内,卡内显式步骤承载) | `game/probe/ui_click_probe.gd:415-425`;`game/tests/验证集清单.md` | + +## 4. 设计契约(红线,违反 = L3 停机呈报) + +🔴 **契约 1 · 改动面封闭**:d1/d2 注释四行+d3 文案一行+d4 断言形态转正——零第五改动点;autoplay 直 continue 行为、CurioPickOverlay 头部串、wa4 头部校验逻辑本体零触碰。 + +🔴 **契约 2 · 行为改动唯一申报**:d3 战报文案是本卡唯一玩家可见行为改动(wr2 专行验收);d1/d2 纯注释零行为。 + +🔴 **契约 3 · wa4 承接不虚置**:d4 断言必达(探针真实走到三选一停点);转正后若探针驱动路径不可达停点即红——禁保留条件形态交差。 + +🔴 **契约 4 · 清单跟上**:d4 断言转正若涉验证集清单登记(新增/改判),`tools/extract_checks.py --diff` 对账零差异——「清单没跟上视同未完成」;禁为免对账保留旧形态。 + +## 5. 范围边界 + +**做**:d1–d4;grep/探针验证;撤销证明;产出物。 + +**不做**: +- autoplay 直通策略行为(:484 的 continue——策略选择保留); +- level_autoplay.gd:220/:381 行为性准确表述(E2 分类); +- ui_click_probe.gd:670-672 历史注记(沿革留痕); +- CurioPickOverlay 头部文案(现行准确,wa4 匹配对象); +- design/ 与根规则文件的过时句落文(§6 反哺通道); +- 三选一机制本身(已实装——注销前提)。 + +## 6. 关联文档同步面 + +| 文档 | 关联点 | 同步义务 | +|---|---|---| +| [08-Alpha版本标准](../design/gdd/08-Alpha版本标准.md):113 | 「未结半=奖励节点现为零兑付直通占位,登记面=待办清单『奖励节点三选一实装』条」——注销后登记面死指+现状句与 E1 相悖 | 反哺点 · 列清单(①:该句随注销改写) | +| [roadmap](../roadmap.md)「当前位·下一步」句 | 「奖励节点三选一实装(2026-10-25 新登记)」待编池指路句随注销过时 | 反哺点 · 列清单(②:该短句摘除) | +| `待办清单.md` | 来源条目(本卡登记条目)状态推进;注销条目由写卡会话同批删除(非实现批义务) | 反哺点 · 列清单(③:状态核对注记) | + +## 7. 任务卡 + +### 卡前 · 文件结构图 + +| 文件 | 职责 | 行为改动 | +|---|---|---| +| `game/core/level_runner.gd` | d1 注释两处(复用既有·修改) | 非行为改动(注释面) | +| `game/sim/level_autoplay.gd` | d2 注释理由句一行(复用既有·修改) | 非行为改动(注释面) | +| `game/presentation/battle_narrator.gd` | d3 战报文案一行(:15,复用既有·修改) | **行为改动(玩家可见文案)** → wr2 | +| `game/probe/ui_click_probe.gd` | d4 wa4 断言转正+wr2 断言(复用既有·改断言形态/增断言) | 断言面 → wr2/wr3 | +| `game/tests/验证集清单.md` | d4 转正涉及的清单登记同步(复用既有·同步) | 非行为改动(清单面)→ wr3 | + +(零新增文件、零新增函数。) + +### 接口块 + +- **d3 新文案定值**(措辞 L1 白名单,语义=现状准确):「关卡奖励点(三选一——选毕推进)」方向。 +- **wr2 断言**(ui_click_probe 奖励节点路径,与 d4 同一驱动路径承载):断言 log_view 战报文本含 d3 新文案定值、不含「内容待定」。 +- **d4 转正形态**:探针驱动路径保证到达三选一停点(奖励节点真实选路路径——autoplay 式直通不改,探针走真人路径进停点);`_tested_curio_head` 条件位转必达判据(未命中停点即红);头部校验串零改动;涉及清单行同步(E3)。 +- **wr1 静态验证命令**(两条,判据=各零输出):①`grep -n "零兑付直通\|内容待定" game/core/level_runner.gd game/presentation/battle_narrator.gd`;②`grep -n "内容未定" game/core/level_runner.gd game/sim/level_autoplay.gd`(:477/:484 用「未定」非「待定」——第一条罩不住,两串分立钉死)。 +- **最窄闸**:ui_click_probe 单件直跑+`python tools/extract_checks.py --diff` 对账;全套闸按本批改动域选档。 + +### 落位与可复用性预检 + +- **零新增件**:d4 转正与 wr2 断言全在现役 ui_click_probe 原位(奖励节点驱动路径为该探针既有选路域),不造夹具。 +- **复用面**:d1 措辞对齐 main_adventure_flow.gd:53-57 既有注记风格;d3/wr2/d4 共用同一探针驱动路径。 +- **唯一面**:判据面过时表述修订后清零(E2 分类闭环——autoplay 两处与历史注记显式豁免);wa4 断言唯一载体仍在 ui_click_probe(转正不旁立)。 +- **分层**:注释+呈现文案+探针断言面;core 逻辑零触碰。 + +### T0 事实坐实(≈0.05d) + +- [ ] 复核 E1–E3(重点:行号、wa4 现形态、判据面两文件命中清单)。可核查结果:命中清单表进实现报告素材。 + +### T1 清扫实装+断言转正(≈0.35d) + +- [ ] 实装 d1/d2(注释)+d3(文案)。可核查结果:wr1 grep 判据零输出。 +- [ ] 实装 d4 转正+wr2 断言+清单登记同步。可核查结果:ui_click_probe 直跑绿且 wa4 真执行(打印行/计数证据);extract_checks --diff 零差异。 +- [ ] 验证步骤:全套闸按域选档跑一次全绿。 + +### T2 撤销证明+产出物落位卡(≈0.1d,末卡) + +- [ ] 撤销证明两条:①回退 d3 文案 hunk → wr2 断言红(log_view 含旧文案串)→ 还原复绿;②回退 d4 转正 hunk(断言回条件形态)→ 必达判据红(探针未命中停点路径不再报错——按转正口径该跑必红)→ 还原复绿。记录进实现报告。 +- [ ] 写齐三份产出物(实现报告〔E2 分类表闭环记录+wa4 转正证据+实机目检总清单——奖励节点战报行新文案目检一项〕/代拍板追认单/反哺点清单〔§6 逐条落点〕)。 +- [ ] 合并前置:独立验收审计(§8.3)逐行「通过」。 + +**估时合计 ≈0.5d**。编排注记:微件卡;d4 转正依赖探针真实走到三选一停点(驱动路径若需扩,成本在 T1 内);与卡 B 同波零冲突。 + +## 8. 验证闸 + +### 8.1 改动—验收对照表 + +| 需求点 | 改动(文件:行/行为) | 验收测试(名称+落点+尾缀) | 层级 | 真实入口 | 撤销证明 | +|---|---|---|---|---|---| +| wr1 注释与理由句清扫 | level_runner.gd:477-478/:10+autoplay.gd:484 | grep 两串命令零命中〔wr1〕(两条命令与判据见接口块——「待定/未定」两串分立) | 静态文本 | grep 真实跑批+实现报告记录 | 恢复原注释/理由句 → 对应 grep 命中即红 | +| wr2 玩家战报文案换代 | battle_narrator.gd:15-16 一行 | log_view 含新文案/不含旧串断言〔wr2〕(ui_click_probe 奖励节点路径) | 探针 | 奖励节点真实战报路径(present_node_curio 同屏打印) | 回退 d3 hunk → 断言红(T2①) | +| wr3 wa4 断言转正 | ui_click_probe.gd:415-425 条件→必达+清单同步 | 直跑绿+真执行证据+extract_checks --diff 零差异〔wr3〕 | 探针+清单 | 探针真实走到三选一停点(奖励节点驱动路径) | 回退 d4 转正 hunk → 必达判据红(T2②) | +| wr4 产出物 | T2 三份 | 件核〔wr4〕 | — | — | 缺项红 | + +### 8.2 测试削弱申报 + +零(既有断言零删除;wa4 由条件转必达=判定面增强非削弱;新增 wr2 断言一条)。 + +### 8.3 独立验收审计 + +入口=未参与实现的会话或子代理;报告落 `reports/iter-验收审计-<日期>.md`;抽查重点=改动面封闭(契约 1)、E2 分类闭环(判据面五处全修、autoplay 两处与历史注记未被顺手改)、wa4 真执行证据与清单对账记录、wr2 断言钉在新文案上。未过不得合并。 + +## 9. 异常分级 + +- **L1(自救)**:d1/d2/d3 具体措辞(语义=现状准确);wr2/d4 断言消息文本;d4 必达的驱动路径实现形态。 +- **L2(记录继续)**:行号随 master 推进漂移;探针驱动路径扩面的正常成本。 +- **L3(停机呈报)**:探针无法驱动到三选一停点(d4 转正不可达——承接失效,停呈);发现 E2 分类之外的判据面残留;断言无法钉在文案文本上;CurioPickOverlay 头部串被误触(wa4 匹配破坏)。 + +## 10. 代拍板白名单(超清单必呈报) + +1. d1/d2/d3 具体措辞(语义=现状准确、风格对齐既有)。 +2. wr2/d4 断言消息文本与挂点。 +3. d4 必达形态的具体实现(真实信号路径前提下的具体形态)。 +4. 提交切分与 worktree 分支命名。 + +## 11. 待裁点 + +**零待裁点,开工门=U0。** 承接义务范围与落位均已落定(2026-10-25 注销确认+裁点 P 乙);灰色地带推导定值两处(呈报可否决,随 T2 反哺点):①autoplay :484 理由句随批修订而 :220/:381 豁免——依据=前者理由失实、后两者语境准确;②wa4 转正的必达判据挂在探针驱动路径上——依据=test-conventions §6 转正口径(未证拦截能力的条件断言不算数)。 + +## 12. 复核记录 + +**来源凭据**:本卡内容全部迁自卡 B v1.2 的 b2–b5 单元与 B5/B6/B7 现状事实——该面已经卡 B 两轮 grilling 独立复核(第一轮阻断「wa4 义务湮灭」的承接方案、第二轮「B5 分类表补全」的订正,均已折入本卡对应节)。 + +**独立成卡复核记录(2026-10-25,独立子代理轻量复核,判「通过(附两应修)」)**:迁出自洽(与卡 B v1.3 双向闭合、文件面零交叠实证)、承接完整(两笔义务全落 d1–d4、E1 全链五处行号逐一实证)、验收可钉(wr2 真实入口在 main_adventure_flow:57;探针无必达奖励节点路径的对冲已在卡内——L1 模板含 5 个 reward 节点、扩面=选路定向小改,L2/L3 兜住)、结构完备(13 节+六列+一步一动作零 TBD)。两应修折入:①battle_narrator 文案行号订正 :15(v1.0 虚记 :15-16);②wr1 判据补第二条 grep「内容未定」(:477/:484 用「未定」非「待定」,原单条判据罩不住 d1/d2 的撤销变红)——接口块两条命令+对照表 wr1 行同步。另呈的批落盘义务(本卡登记条目落盘+注销条目删除)由写卡会话同批落实(§6 ③)。 diff --git a/reports/需求卡片-效果引擎校验文案计数修正批-2026-10-25.md b/reports/需求卡片-效果引擎校验文案计数修正批-2026-10-25.md new file mode 100644 index 00000000..d1c2486d --- /dev/null +++ b/reports/需求卡片-效果引擎校验文案计数修正批-2026-10-25.md @@ -0,0 +1,153 @@ +# 需求卡片:效果引擎校验文案计数修正批(fact 词表计数文案动态化+头注计数治理) + +- 版本:**v1.3**(2026-10-25 v1.0 成文→grilling 第一轮判「回炉」(两阻断)→v1.1 折入→第二轮闭合复检「通过(附一应修)」→v1.2 折入→同日用户裁点落定:裁点 Q **甲**(动态取 FACTS.size())、裁点 P **乙**(奖励节点承接包 b2–b5 迁出独立成卡=reports/需求卡片-奖励节点过时表述清扫批-2026-10-25.md)→v1.3 定稿瘦身,复核记录见 §12) +- 来源:[待办清单](../待办清单.md)「效果引擎校验文案计数错误——封闭事实词表数写死『9 项』实为 18」条目(2026-10-25 登记,状态=待写卡)(唯一事实源:工程证据指认=条目实况〔原审计报告 §三 漂移清单第 5 条迁册〕+本卡 §3 行号级实查〔经两轮 grilling 独立复核〕) +- 归属:`game/core/effect_engine.gd`(报错文案一行+头注计数订正)+ `game/tests/unit/core/effect_words_t1_test.gd`(断言一条) +- 排期:未编入(迭代批卡片;估时 ≈0.25 工作日) +- 开工门:U0+复核门过(§12);**零待裁点** + +## 0. 前置依赖与并行性 + +- **第〇步核对(2026-10-25 写卡会话)**:来源条目=需求性工程条目(bug 证据带 file:line),跳过设计线、凭证据指认放行;条目状态=待写卡。 +- 与迭代 37(已合回 8faf1763)零文件交叠(其未触 effect_engine.gd/effect_words_t1_test.gd)。 +- 与卡 A/卡 C/第四卡(奖励节点过时表述清扫批)零文件交叠、零逻辑耦合——可同迭代并行波。 +- **迁出注记**:v1.0–v1.2 期间的裁点 P 支(奖励节点承接包 b2–b5)已按用户裁点 P 乙迁出独立成卡(头部版本行)——本卡不再含该面;承接链与 wa4 义务归第四卡 §0。 + +## 1. 目标与完成定义 + +**目标**:effect_engine 校验报错文案与 FACTS 词表实数对齐且不再随词表增删漂移(用户裁 Q 甲=动态取实数);同文件头注的另一处写死计数(EFFECT_KINDS 注释)一并治理。 + +**改动单元清单**(🔴 契约 1): + +| # | 单元(实查) | 改法 | 依据 | +|---|---|---|---| +| b1 | fact 出域报错文案 `game/core/effect_engine.gd:360`——现写死「事实词汇封闭 9 项」,FACTS 常量(:50-54)实为 19 项(审计时点 18 → 今日 19,两次漂移实证) | **动态实数(已裁)**:`"%s fact 出域(事实词汇封闭 %d 项): %s" % [rid, FACTS.size(), fact]`——词表增删文案自动随 | 用户裁点 Q 甲(2026-10-25);code-conventions §1.1 不留死数 | +| b2 | `game/core/effect_engine.gd:21-23` EFFECT_KINDS 头注——写死计数「定稿 19 行;类型实数 24」已漂移(常量实数 32),与 b1 同文件同类病根 | 头注计数表述治理:去掉写死实数、改「词表实数以 EFFECT_KINDS 常量为准」方向(措辞 L1;注内历史叙事句「标题计 23 系笔误——commit 留痕」保留,沿革不删) | grilling 第一轮新查明;禁写变更记录红线只禁增不禁留 | + +**完成定义**: + +1. b1+b2 落地+断言一条绿(wr1); +2. 合法数据加载零变化(出域报错 message 文本除外);全套闸按本批改动域选档全绿; +3. 撤销证明一条(wr1);三份产出物写齐(T2)。 + +## 2. 设计事实源 + +| # | 出处 | 取用条款 | +|---|---|---| +| D1 | 工程证据指认=待办清单条目实况(原审计 §三 漂移清单第 5 条迁册)+本卡 §3 实查 | 文案与实数不符的存在事实 | +| D2 | [code-conventions](../design/engineering/code-conventions.md) §1.1 | 禁为迎合校验文本保留无效成员/死数——b1/b2 依据 | +| D3 | 2026-10-25 用户裁点 Q 甲 | b1 动态实数定案 | + +## 3. 现状事实(2026-10-25 写卡会话实查+两轮 grilling 独立复核于 master 4a88c259;开工日 T0 复核行号) + +| # | 事实 | 出处 | +|---|---|---| +| B1 | fact 出域校验文案写死「事实词汇封闭 9 项」;FACTS 常量 19 项(:50-54 逐词:matchup/is_first_dig_of_battle/terrain_kind/target_armor_class/seals_count/charge_layers/nest_count/round_index/counter/new_resource_type/is_edge_cell/is_blank_zero/dug_under_seal/ap_exhausted_last/hp_ratio/amount/ap_left/pct/battle_index);审计时点 18 → 今日 19——写死数字两次漂移实证;全文件 errs.append 10 处仅 :360 含计数(grilling 复核确认——无第三处) | `game/core/effect_engine.gd:50-54/358-360` | +| B2 | validate_trigger_row 已有出域反例测试段(喂 fact="nope" 断言 errs 计数 :44),无 message 文本断言;errs 行结构={category, message} 字典——b1 断言的现成落点 | `game/tests/unit/core/effect_words_t1_test.gd:41-47`;`game/core/effect_engine.gd:347-387` | +| B3 | EFFECT_KINDS 头注写死「定稿 19 行;类型实数 24」、常量实数 32——同文件第二处计数漂移 | `game/core/effect_engine.gd:21-26` | + +## 4. 设计契约(红线,违反 = L3 停机呈报) + +🔴 **契约 1 · 改动面封闭**:b1 一行文案+b2 头注计数表述——零第三改动点;effect_engine 校验逻辑、FACTS/EFFECT_KINDS 词表、其余可执行语句零触碰。 + +🔴 **契约 2 · 零行为变化**:合法数据加载零变化;b1/b2 只改报错与头注文本(errs 的 category/计数结构不变)。 + +🔴 **契约 3 · 校验报错文案面不留死数**:b1 所在校验报错文案面禁残留写死计数(「9 项」「19 项」);范围=errs 文案,不覆盖 b2 头注(另治)与文件其余注释。 + +## 5. 范围边界 + +**做**:b1+b2+断言;撤销证明;产出物。 + +**不做**: +- FACTS/EFFECT_KINDS 词表增删(19/32 项现状不动); +- 其它常量报错文案计数排查(grilling 已核全文件 errs.append 10 处仅 :360 含计数——无同类残留); +- 奖励节点承接包(已按裁点 P 乙迁出第四卡——§0 迁出注记)。 + +## 6. 关联文档同步面 + +| 文档 | 关联点 | 同步义务 | +|---|---|---| +| `待办清单.md` | 来源条目状态推进(已写卡→编迭代→完成即删) | 反哺点 · 列清单(①:状态核对注记) | + +## 7. 任务卡 + +### 卡前 · 文件结构图 + +| 文件 | 职责 | 行为改动 | +|---|---|---| +| `game/core/effect_engine.gd` | b1 文案一行+b2 头注计数(复用既有·修改) | 非行为改动(报错/注释文本面)→ wr1 | +| `game/tests/unit/core/effect_words_t1_test.gd` | wr1 断言一条(复用既有·增断言) | 断言面 | + +(零新增文件、零新增函数。) + +### 接口块 + +- **b1 断言**(effect_words_t1_test.gd ③ 段后追加):喂 `validate_trigger_row("出域fact计数", {}, [{"on": "dig_stop", "when": [{"fact": "nope", "op": "eq", "value": 1}], "do": {"kind": "heal", "value": 1}}], errs)` → 断言 errs 该行 message 含 `str(EffectEngineScript.FACTS.size())`(即「封闭 19 项」随词表自动)。 +- **最窄闸**:effect_words_t1_test 单件直跑;全套闸按本批改动域选档。 + +### 落位与可复用性预检 + +- **零新增件**:断言落现役 ③ 段(B2 现成形态),不造套件;文案改动在既有 errs.append 行内。 +- **复用面**:FACTS 常量即计数的单一事实源(b1 直读它——不复制第二处数字)。 +- **唯一面**:词表计数唯一出处=常量(b1/b2 落地后文案与头注零第二份计数)。 +- **分层**:纯文本面改动,零跨层交互。 + +### T0 事实坐实(≈0.05d) + +- [ ] 复核 B1–B3(两词表计数复核);确认无新增同类。可核查结果:计数复核记进实现报告素材。 + +### T1 修订实装+断言(≈0.15d) + +- [ ] 实装 b1(动态实数)+b2(头注)+断言一条。可核查结果:断言绿;b2 头注零写死计数。 +- [ ] 验证步骤:全套闸按域选档跑一次全绿。 + +### T2 撤销证明+产出物落位卡(≈0.05d,末卡) + +- [ ] 撤销证明一条:回退 b1 文案 hunk → 断言红(message 含「9 项」不含实数)→ 还原复绿。记录进实现报告。 +- [ ] 写齐三份产出物(实现报告〔两词表计数复核+实机目检总清单——出域报错面属开发期面,无玩家可感项,写明零目检项及理由〕/代拍板追认单/反哺点清单〔§6 逐条落点〕)。 +- [ ] 合并前置:独立验收审计(§8.3)逐行「通过」。 + +**估时合计 ≈0.25d**。编排注记:微件卡,可与他卡同波;零测试基建前置。 + +## 8. 验证闸 + +### 8.1 改动—验收对照表 + +| 需求点 | 改动(文件:行/行为) | 验收测试(名称+落点+尾缀) | 层级 | 真实入口 | 撤销证明 | +|---|---|---|---|---|---| +| wr1 文案与实数对齐且不漂移 | effect_engine.gd:360 动态实数+:21-23 头注治理 | message 含实数断言〔wr1〕(effect_words_t1_test ③ 段后) | 单元 | validate_trigger_row static 真实调用(与加载期校验同一函数) | 回退 b1 hunk → 断言红(T2) | +| wr2 产出物 | T2 三份 | 件核〔wr2〕 | — | — | 缺项红 | + +### 8.2 测试削弱申报 + +零(既有断言零改动;新增断言一条)。 + +### 8.3 独立验收审计 + +入口=未参与实现的会话或子代理;报告落 `reports/iter-验收审计-<日期>.md`;抽查重点=改动面封闭(契约 1:逐 hunk 核对零越界)、断言真钉在 message 实数上、b2 头注零残留写死计数。未过不得合并。 + +## 9. 异常分级 + +- **L1(自救)**:b2 头注表述措辞;断言挂点函数与断言消息文本。 +- **L2(记录继续)**:行号随 master 推进漂移。 +- **L3(停机呈报)**:T0 发现其它 errs 文案存在同类写死计数(范围边界预注——呈报后另裁);断言无法钉在 message 文本上。 + +## 10. 代拍板白名单(超清单必呈报) + +1. b2 头注表述具体措辞(语义=实数以常量为准)。 +2. 断言挂点函数与断言消息文本。 +3. 提交切分与 worktree 分支命名。 + +## 11. 待裁点 + +**零待裁点,开工门=U0。** 两裁点均已落定(2026-10-25 用户):裁点 Q=甲(动态取 FACTS.size()——乙案写死 19 淘汰,两次漂移实证+D2 不留死数);裁点 P=乙(奖励节点承接包迁出独立成第四卡——甲案并卡淘汰,卡面主题分离;承接链见第四卡 §0)。 + +## 12. 自审六查与 grilling 复核记录 + +**自审六查(2026-10-25 写卡会话,v1.0)**:①规格覆盖——b1→T1/wr1、撤销/产出物→T2;②步骤扫描;③类型一致性;④审查焦点——漂移再发、roadmap 指路句反哺;⑤篇幅比例;⑥落位预检。 + +**grilling 第一轮复核记录(2026-10-25,独立子代理对抗复核,判「回炉」两阻断)**:①阻断一=v1.0「全仓仅 level_runner 两处」失实且掩护玩家可见过时文案与 08-Alpha:113 死指——v1.1 折入 B5 分类表与 b4/b5 承接单元;②阻断二=wa4 复跑义务随注销湮灭——v1.1 折入承接条款;③应修=行号转录错位订正+契约 3 与头注互斥(b6→现 b2 立单元)+§6 漏 08-Alpha 反哺(补)。〔注:①②③所涉 P 支面已按用户裁点 P 乙整体迁出第四卡,本卡保留复核记录原文以凭据在案;分类表与承接链现载第四卡 §3/§0。〕 + +**grilling 第二轮闭合复检记录(2026-10-25,独立子代理,判「通过(附一应修)」)**:第一轮条目核闭合属实;应修=B5 分类表补 autoplay 域三处+grep 词族钉死——v1.2 折入。〔同上注:该面已迁第四卡。〕 + +**裁点落定与迁出(2026-10-25 用户)**:Q 甲(动态实数)+P 乙(承接包独立第四卡)——v1.3 定稿瘦身:改动单元余 b1/b2(原 b6 并为 b2),现状事实余 B1–B3,§11 零待裁点。Q 支(b1 面)两轮复核全过(FACTS 19 实数、errs 结构、断言可钉、全文件仅 :360 含计数、撤销证明成立——第一轮建议 6 原文在案)。 diff --git a/reports/需求卡片-明细行扩展总型收敛批-2026-10-25.md b/reports/需求卡片-明细行扩展总型收敛批-2026-10-25.md new file mode 100644 index 00000000..dfca497f --- /dev/null +++ b/reports/需求卡片-明细行扩展总型收敛批-2026-10-25.md @@ -0,0 +1,193 @@ +# 需求卡片:明细行扩展总型收敛批(四专长实名行型→单一扩展行型+effect_id 载荷) + +- 版本:**v1.3**(2026-10-25 v1.0 成文→grilling 第一轮判「回炉」→v1.1→第二轮闭合复检判「回炉(单点)」:负路径断言载体改负面小套件→v1.2→同日用户裁点 R **甲**(授权重锚并账)→v1.3 裁点落定定稿,复核记录见 §12) +- 来源:[待办清单](../待办清单.md)「明细行扩展总型收敛批——四个专长实名行型收敛为单一扩展行型+效果载荷」条目(2026-10-25 登记,状态=待写卡)(唯一事实源:设计闭合凭据=[战斗结算](../design/gdd/systems/战斗循环/战斗结算.md)「明细流水」节+「扩展行」节——词表两层定稿〔基础 9 类+扩展行 1 类,「概念+指引」法,git 82d0cf24〕;工程证据=本卡 §3 行号级实查+grilling 实测补查) +- 归属:`game/core/battle_orchestrator.gd`(行协议头注+fx_reveal 三发射点+_emit_row 校验面)+ `game/core/settlement/grant_segment.gd`(另三发射点)+ `game/tests/unit/battle_settlement/round_flow_skill_pool_test.gd`(新断言)+ `game/tests/unit/core/treasure_effects_test.gd`(新断言+首次 feats 注入)+ `game/tests/unit/battle_settlement/extended_row_violation_test.gd`(**新增**·负面小套件——§7 预检)+ `game/tests/run_all.gd`(套件清单登记一行)+ parity 锚面(重锚并账已裁) +- 排期:未编入(迭代批卡片;估时 ≈1.85 工作日——含重锚并账) +- 开工门:U0+grilling 复核门过(§12)+裁点 R 已落甲(重锚并账授权,2026-10-25) + +## 0. 前置依赖与并行性 + +- **第〇步核对(2026-10-25 写卡会话)**:来源条目设计线闭合凭据齐——owner 文档「扩展行」节 2026-10-25 两层定稿(git 82d0cf24),条目状态=待写卡(轨闭合态),按 req-card 第〇步放行。 +- **与迭代 37(已合回 8faf1763)**:其卡① d12 给明细行 payload 新增 `target_id` 键(触 battle_orchestrator.gd 4 行)——本卡行型值收敛与其零冲突(payload 平铺面〔playtest_logger.gd:136-139〕不动);R1/R2/R3 拆件面与本卡零文件交叠。行号以 T0 复核为准。 +- **与「结算明细日志行序重锚批」(待办清单在册,2026-10-21 用户裁批准另立、发起时点另定)**:本卡改行型值 → JSONL 逐行落盘的 `type` 字段变 → parity 对拍锚必红(**已实测证实**:现行锚内 fx_preview_area 型行 1520 行、fx_reveal 型行 1329 行——A7)。两批并账一次重锚=§11 主裁点(重锚发起权在用户)。 +- **parity 触面**:本卡触 `battle_orchestrator.gd` 与 `grant_segment.gd`(结算行为面)——按 MC 配套纪律([sim-data/README.md](../sim-data/README.md)),本卡零数值改动=零 MC;对拍断言按纪律③为锚内子集复放、零新跑。**锚红机制实测注记**:relic 兑付把 feat_id 追加进持有集(adventure_runner.gd:415-417)——`feat_mode=off` 不挡锚内专长行出现,锚必红不依赖 feat 模式开关。 + +## 1. 目标与完成定义 + +**目标**:明细行协议的扩展行型按 owner 文档两层词表落地——四个专长实名行型值(fx_reveal/mine_neutralized/insurance_used/fx_preview_area)收敛为单一扩展行型值,效果身份改经 `effect_id` 载荷携带;顺带修复 fx_preview_area 行 source_class 空串违约(§3 A5);结算数值、行序、行数量、随机消费逐位不变。 + +**改动单元清单**(🔴 契约 1): + +| # | 单元(实查) | 改法 | 依据 | +|---|---|---|---| +| a1 | 四发射点行型值:`battle_orchestrator.gd:149/:157/:162`(fx_reveal×3——落空行×2+兑付行×1)+ `grant_segment.gd:271`(mine_neutralized)+ `grant_segment.gd:281`(fx_preview_area)+ `grant_segment.gd:309`(insurance_used) | 第一参(type)改单一扩展串(§10 代拍板,推荐 `extended`);原实名串转 `effect_id` 载荷进 extra(取值沿用原串,§10);display_name/value/highlight/其余参数逐字不动 | owner 文档「扩展行」节:扩展行是**一个**行型,效果身份由 effect_id 载荷说明 | +| a2 | `_emit_row`(battle_orchestrator.gd:1262)fail-fast 补强 | **emit 之前**插入校验(落位收紧——违约行先炸后不发):type==扩展串且 extra 无 `effect_id` → `assert(false, …)` 断言失败并 return(零发射);与 `_assert_row_source` 同族 assert 形态(开发期违约即炸);合法发射路径零变化。**负路径验收载体=独立负面小套件**(assert 必产 SCRIPT ERROR,非负面套件被闸机错误扫描判红——run_all.gd:133-136;负面套件豁免机制为此存在,§7 预检) | owner 文档行协议 fail-fast 同族;效果身份是扩展行必载字段 | +| a3 | fx_preview_area 行 source_class(grant_segment.gd:281 现传 `""`) | 改传真实来源类别(§10 代拍板,推荐 `fx_warning_beacon`)——示警烟火在表(feats.tres:301)、装配+封印命中即发射 | 行协议「任何一行找不到来源即断言失败」——空来源类别违约(A5) | +| a4 | 行协议头注(battle_orchestrator.gd:15-19,现写「9 类」清单) | 换代两层词表:基础 9 类(清单不变)+扩展行 1 类(单一扩展串值+四效果身份清单=四实名串转 effect_id 后的取值与发射点指引) | owner 文档「效果身份清单与发射点以实现侧头注为准」——头注即指引锚 | +| a5 | battle_log_view 呈现面(:9 AGG_TYPES/:90 append_row/:144 _format_row) | **零代码改动·核验面**:四实名串现状即无 match 分支、全落 fallback(:210 按 display_name 呈现);收敛后扩展串同样落 fallback——**a1 面呈现输出逐字节不变**;扩展行不属 AGG_TYPES 聚合域。**a3 面呈现差异如实申报**:示警烟火行将从无来源标注变为带来源类别裸键渲染(`_source_label` :133-136 对 settlement.tres `source_label_map` 无 fx_ 键裸键回退——与 mine_neutralized 行 `fx_seal_smith` 裸键先例一致,来源归因可见性反而归位;§10 代拍板处置) | owner 文档「呈现层按身份取各自的行文案」——发射点写 display_name、fallback 通用承载,已满足 | +| a6 | parity 锚面(game/tests/evidence/parity/anchor.json) | §11 裁点:甲=并账重锚(T2 内按 [sim-data/README.md](../sim-data/README.md) 档位与流程重制锚);乙=批内对拍闸落 skip+重锚批另立(先例=迭代 32 卡①,git d00f24a8) | 对拍锚锚现行 `type` 字段值,行型值变=锚必红(实测 A7);重锚只能用户发起 | + +**完成定义**: + +1. a1–a4 落地;a5 核验结论(零改动依据+裸键差异申报)记入实现报告; +2. 新断言六条绿(§8 wr2:四效果各一行扩展串+effect_id 断言+fx_reveal 落空行断言〔五条进两现役套件〕+a2 负路径断言〔一条进新增负面套件,expect=1 达成〕)+a3 修复断言绿(wr3)+撤销证明三条(wr1/wr2/wr3); +3. 全套闸按本批改动域选档全绿——含 a6 按裁点落定(甲=重锚后对拍绿;乙=skip 落账); +4. 三份产出物写齐(T3),含反哺点清单(§6 两条)。 + +## 2. 设计事实源 + +| # | 出处 | 取用条款 | +|---|---|---| +| D1 | [战斗结算](../design/gdd/systems/战斗循环/战斗结算.md)「明细流水」节+「扩展行」节(2026-10-25 两层定稿,git 82d0cf24) | 行型分两层:基础 9 类封闭+扩展行 1 类;扩展行效果身份由 effect_id 载荷说明;新增专长效果只新增载荷身份不再新增行型;行型词表改动必须走本文修订并同步呈现层行格式化 | +| D2 | 同上「明细流水」节两层豁免条款 | 行型层豁免两类(decay/verdict)+来源类别层豁免五类(含 fx_reveal)——豁免按 source_class 层生效,本卡行型值收敛零触碰豁免集合 | +| D3 | 同上「结算不变量」节「行型封闭」条款 | 流水行型只出现本文登记的基础 9 类与扩展行;未登记行型禁止落行 | +| D4 | 待办清单「结算明细日志行序重锚批」条目(2026-10-21 用户裁) | 重锚批只能由用户发起——§11 裁点的发起权依据 | +| D5 | [sim-data/README.md](../sim-data/README.md) MC 采集档位表+配套纪律③⑦ | 对拍断言=锚内子集复放零新跑;零数值改动=零 MC | + +## 3. 现状事实(2026-10-25 写卡会话实查+grilling 实测补查于 master 4a88c259;开工日 T0 复核行号) + +| # | 事实 | 出处 | +|---|---|---| +| A1 | 行协议头注列基础 9 类(effect/damage/heal/reward_ineffective/seal_miss/cast/decay/verdict/highlight),注记「清单改动须同步 battle_log_view 的 _format_row 与本文档头注」;无扩展行型登记 | `game/core/battle_orchestrator.gd:15-19` | +| A2 | 扩展行型值现状=四个专长实名串:fx_reveal(:149/:157/:162——落空行×2 带 `Vector2i(-1,-1)`、兑付行×1 带真实格)/mine_neutralized(grant:271,source_class=`fx_seal_smith`,真实格)/fx_preview_area(grant:281,**source_class=`""`**,真实格)/insurance_used(grant:309,source_class=`seal_miss`,真实格) | `game/core/battle_orchestrator.gd:149-162`;`game/core/settlement/grant_segment.gd:271/281/309` | +| A3 | `effect` 行型已有效果身份载荷先例:`{"effect_id": "fx_grant_gp"}`(grant:218)/`"nest_counter"`(:797)/`ap_delta`(:859)/eff 变量(:828/:841/:1024)——扩展行收敛沿用同款载荷键名;extra 平铺键与公共字段无冲突(effect_id 不撞 kind/type/source/cell/round/text/value/highlight——grilling 核实) | `game/core/settlement/grant_segment.gd:218`;`game/core/battle_orchestrator.gd:797/828/841/859/1024`;`game/presentation/playtest_logger.gd:127-140` | +| A4 | `_emit_row` 组装公共字段+extra 平铺后 `step_row.emit(row)`;`_assert_row_source` 两层豁免校验(SOURCE_EXEMPT_TYPES=[decay,verdict] :21;SOURCE_EXEMPT_CLASSES=[hero_attack,enemy_action,clear_reward,fx_reveal,fx_grant_gp] :25);`assert(source_class != "")` 对空来源类别判失败 | `game/core/battle_orchestrator.gd:1262-1300` | +| A5 | fx_preview_area 空串是现行违约:示警烟火在表(feat_id=warning_beacon,trigger kind=preview_area,feats.tres:301-313),装配+封印命中即走 :281 发射;**实测语义注记**(grilling):headless `--script` 下 assert 失败只中断当前函数不中止运行(现行锚源日志该行之后仍续写 4.2 万行收官)——编辑器调试会话才真炸;现行测试面未覆盖该路径 | `game/data/tables/feats.tres:301-313`;`game/core/settlement/grant_segment.gd:275-281`;锚源日志实测 | +| A6 | 呈现层:四实名串在 `_format_row` 的 match 无专属分支、全落 fallback(:210)按 display_name 呈现;AGG_TYPES=["reward_ineffective"](:9)不含扩展行——不聚合;`_source_label`(:133-136)对 settlement.tres `source_label_map`(:11-19)无的键裸键回退——mine_neutralized 行现即带 `fx_seal_smith` 裸键先例;示警烟火行现无来源标注(source_class 空) | `game/presentation/views/battle_log_view.gd:9/90-96/133-136/144-210`;`game/data/tables/settlement.tres:11-19` | +| A7 | JSONL 落盘:playtest_logger 订阅 step_row(:47),`_on_step_row` 逐行落 `{"kind":"step","type":row.type,…}`+payload 平铺(:127-140)——行型值变=JSONL 逐行变、parity 对拍锚必红。**实测凭据**(2026-10-25 锚种子日志):锚内 fx_preview_area 型行 1520 行、fx_reveal 型行 1329 行(insurance_used/mine_neutralized 锚内 0 行——该两专长锚局未持有);锚红机制=relic 兑付追加 feat_id 进持有集(adventure_runner.gd:415-417),`feat_mode=off` 不挡 | `game/presentation/playtest_logger.gd:47/127-140`;`sim-data/` 锚源日志实测 | +| A8 | 测试面零行型值断言直引。四串的**全部合法身份清单**(grep 残留判据与 L3 的基线——收敛后这些串仍将在库,属预期非残留):①行型值(六发射点——收敛后消失);②effect_id 载荷值(§10 推荐案——收敛后新增于发射行内);③source_class 实参(:149/:157/:162 第二参 `fx_reveal`、grant:271 `fx_seal_smith`——收敛后保留);④rng 封闭流名(:151 `open_stream("fx_reveal")`——保留);⑤EffectEngine counter 桶键 `insurance_used`(round_flow_skill_pool_test.gd:989-1008——保留);⑥MinesweeperRules 方法名 `fx_reveal`(minesweeper_rules_test.gd:89-92——保留);⑦feats.tres trigger kind 串(preview_area/forgive_seal_miss 等——保留) | grep 全仓实查分类 | +| A9 | 断言承载先例:round_flow_skill_pool_test 装配 `feats:["perfect_insurance"]` 驱动真实标错结算(:992)+step_row 捕获先例(:87/:151/:222——grilling 核实);treasure_effects_test:253 是**同调件**(attunement)装配先例——该套件现无 feats 注入形态,wr2 两断言(mine_neutralized/fx_preview_area)须引入 V6 式 `enc["feats"]` 注入(该套件首次);forgive_seal_miss(feats.tres:866)是 perfect_insurance 行(:850)内 trigger 的 kind 值非独立 feat | `game/tests/unit/battle_settlement/round_flow_skill_pool_test.gd:87/151/222/989-1008`;`game/tests/unit/core/treasure_effects_test.gd:253`;`game/data/tables/feats.tres:850-870` | +| A10 | 全仓 `extended` 串零占用(battle_orchestrator/battle_log_view 无命中)——扩展串值候选无冲突 | grep 实查 | + +## 4. 设计契约(红线,违反 = L3 停机呈报) + +🔴 **契约 1 · 改动面封闭**:只改 a1–a4 六个发射点行型值+载荷、_emit_row 一条校验(emit 之前)、一处 source_class 修复、头注换代;display_name/value/highlight/行序/行数量/发射时点逐字不动;基础 9 类行型任何发射点零触碰。 + +🔴 **契约 2 · 数值与复放零变**:结算数值、随机消费(core 内全部封闭随机流——`open_stream` 名九个:behavior_roll/board_gen/encounter/fx_reveal/gp_drop/reward_pick/reward_roll/shop_draw/variant_place,另 armor_roll 经表值变量)消费序与取号零变化——本卡不得有任何数值语义改动;同种子同输入步骤流除行协议字段(type/effect_id/source_class 三字段——§8 对拍口径)外逐位复现。 + +🔴 **契约 3 · 豁免集合零变化**:SOURCE_EXEMPT_TYPES/SOURCE_EXEMPT_CLASSES 两常量(:21/:25)逐字不动——fx_reveal 豁免按来源类别层继续生效;owner 文档两层豁免五类清单(D2)是校验面的规范源。 + +🔴 **契约 4 · 对拍诚实**:parity 对拍红不隐藏、不放宽、不删断言——按 §11 裁点落定(甲=重锚后绿;乙=skip 落账+实现报告登记重锚另批);「对拍断言=锚内子集复放零新跑」纪律不破。 + +🔴 **契约 5 · fail-fast 落地+禁为机检文本保留无效成员**:a2 校验(扩展行缺 effect_id 即断言失败且零发射)与 a3 修复同批落地——禁只收敛不设闸,也禁为过校验保留空串占位(code-conventions §1.1 同款);禁为迎合 grep 判据保留旧行型值;机检键与本卡契约互斥时一律停卡呈报。 + +## 5. 范围边界 + +**做**:a1–a6;六断言+a3 修复断言;撤销证明三条;产出物;头注换代。 + +**不做**: +- effect 行型既有效果的 effect_id 载荷面重构(gp_gain/nest_counter/ap_delta/fx_grant_gp 等现状不动——它们已是合法基础行型+载荷形态); +- 扩展行在 _format_row 增设专属呈现分支或改呈现输出(a5 核验结论=a1 面零改动;a3 面裸键差异按 §10 处置); +- settlement.tres `source_label_map` 补 fx_ 键(§10 代拍板备选,未裁不实装); +- 行序、行合并、聚合域变化(AGG_TYPES 不动); +- `insurance_used` counter 桶键更名(A8 ⑤——counter 键与行型值同物异义,本卡只动行型值侧); +- parity 锚重制的技术流程变更(甲授权则按 sim-data/README.md 现行档位与流程执行)。 + +## 6. 关联文档同步面 + +| 文档 | 关联点 | 同步义务 | +|---|---|---| +| [战斗结算](../design/gdd/systems/战斗循环/战斗结算.md)「扩展行」节 | 过渡句「现行实现的扩展行型值以专长实名串承载,效果身份清单与发射点以实现侧 `battle_orchestrator.gd` 文件头注为准;收敛为单一扩展行型+效果载荷的条目在待办清单在册」——收敛落地后「实名串承载」半句过时、「条目在册」句随条目出账失效 | 反哺点 · 列清单(①:过渡句摘除改写,头注指引句保留) | +| [roadmap](../roadmap.md)「当前位·下一步」句 | 「结算明细日志行序重锚(2026-10-21 授权发起、时点另定)」——重锚并账已裁甲,该句随批更新 | 反哺点 · 列清单(②:随批改写为已随卡 A 出账) | +| `待办清单.md` | 来源条目状态随批推进(已写卡→已编迭代→实现批完成即删);「结算明细日志行序重锚批」条目同批出账口径(裁点甲) | 反哺点 · 列清单(③:状态推进注记) | + +## 7. 任务卡 + +### 卡前 · 文件结构图 + +| 文件 | 职责 | 行为改动 | +|---|---|---| +| `game/core/battle_orchestrator.gd` | a1 三发射点行型值+载荷/a2 _emit_row 校验/a4 头注换代(复用既有·修改) | 行为改动 → wr1/wr2 | +| `game/core/settlement/grant_segment.gd` | a1 另三发射点+a3 source_class 修复(复用既有·修改) | 行为改动 → wr1/wr3 | +| `game/presentation/views/battle_log_view.gd` | a5 核验面——零改动(fallback :210 继续承载),核验结论+裸键差异申报记实现报告 | 非行为改动(核验) | +| `game/tests/unit/battle_settlement/round_flow_skill_pool_test.gd` | wr2 断言:insurance_used/fx_reveal(兑付+落空)(复用既有·增断言) | 断言面 | +| `game/tests/unit/core/treasure_effects_test.gd` | wr2 断言:mine_neutralized/fx_preview_area(首次引入 feats 注入——V6 形态移植)(复用既有·增断言) | 断言面 | +| `game/tests/unit/battle_settlement/extended_row_violation_test.gd` | **新增**·负面小套件:a2 负路径断言(违约直调 → assert 炸 → 进程非 0 退出)(新增·新文件) | 断言面 → wr2-np | +| `game/tests/run_all.gd` | 套件清单登记一行(`expect=1, negative=true`——负面豁免先例 :49-50 同款)(复用既有·登记) | 基建面 | +| parity 锚面(game/tests/evidence/parity/anchor.json) | a6——裁点甲=重制/乙=skip(非新增文件) | 裁点 | + +(新增件仅负面小套件一件+清单登记一行;落位预检见下。) + +### 接口块 + +- **行协议变化**(本卡产出,后续消费方以此为准):扩展行 row = 公共字段(type=`extended`〔§10 定值〕/source_class/origin_cell/round_index/display_name/value〔/highlight 可空〕)+`effect_id: String`(必载,a2 校验)+效果私有 payload 平铺(mine_neutralized 无/fx_preview_area 带 `types`/insurance_used 带 `forgiven`/fx_reveal 无)。 +- **effect_id 取值**(§10 代拍板推荐案):四效果沿用原行型串——`fx_reveal`/`mine_neutralized`/`insurance_used`/`fx_preview_area`。 +- **a2 校验**(_emit_row 体内、`step_row.emit` **之前**——违约行先炸后不发):type 为扩展串且 `extra.get("effect_id", "") == ""` → `assert(false, "[战斗结算] 扩展行缺 effect_id 载荷——行协议违约")` 并 return(零发射)。 +- **a2 负路径断言**(`extended_row_violation_test.gd` 新负面小套件,宿主形态=counter_prefix_fatal_test 同款〔expect=1+negative〕):构造编排器直调 `oc._emit_row("extended", "fx_reveal", Vector2i.ZERO, 1, "负路径", 0, {}, "")`(缺 effect_id)→ assert 炸 → 套件进程非 0 退出=闸判绿(manifest 行 `{"path": "res://tests/unit/battle_settlement/extended_row_violation_test.gd", "expect": 1, "negative": true}` 登记进 run_all.gd 套件清单)。 +- **wr2 断言五条**:①insurance_used 行(装配 perfect_insurance 标错,断言 type=="extended" 且 effect_id=="insurance_used");②fx_reveal 兑付行(装配揭示类专长开格,断言 type/effect_id);③fx_reveal 落空行(同装配+无未揭示安全格态,断言 type/effect_id——落空路径 :149/:157 的撤销证明载体);④mine_neutralized(treasure_effects_test feats 注入 seal_smith 三次封印,断言 type/effect_id);⑤fx_preview_area(feats 注入 warning_beacon 封印命中,断言 type/effect_id/source_class==定值非空——与 wr3 并一条)。 +- **取用**:无(本卡无前置卡)。**最窄闸**:两测试套件单件直跑;全套闸按本批改动域选档。 + +### 落位与可复用性预检 + +- **零新增产品码/零新增函数**:收敛是对六个既有发射点的参数改写+_emit_row 既有函数的补强段——产品码无处需要新落点。**新增件仅一件(负面小套件)**:为什么不能复用既有负面套件——现役负面套件全在 data_config 域(加载期校验面:config_db_fatal_oob/treasure_target_violation/reward_dangling_treasure/counter_prefix_fatal),行协议运行期违约面无先例;负面套件语义要求独立进程(expect=1),并入 round_flow 等非负面套件会因 SCRIPT ERROR 撞闸机错误扫描(run_all.gd:133-136)——独立小套件是唯一载体,manifest 负面豁免机制(:135-137/:49-50)为此存在。 +- **复用面**:effect_id 载荷键名复用 `effect` 行型既有 payload 先例(A3)——不造第二键名;呈现复用 _format_row fallback 既有分支(A6)——不造呈现路径;断言复用 round_flow_skill_pool_test 的 feats 装配+step_row 捕获双先例(A9)——不造测试夹具;负面套件宿主形态复用 counter_prefix_fatal_test 同款(expect=1+negative);treasure_effects_test 的 feats 注入按 V6 形态移植(A9 注记)。 +- **唯一面**:行型词表单点=owner 文档「扩展行」节(D1)+实现侧头注(a4)——两层指引互指已是既有结构,本卡只换代头注内容不立第二登记处;`extended` 串全仓零占用(A10)。 +- **分层**:core 层零 UI 依赖不破(发射点与校验均在 core;battle_log_view 零改动);随机、数值面零触碰。 + +### T0 事实坐实(≈0.25d) + +- [ ] 复核 A1–A10(重点:A2 六发射点行号、A5 示警烟火装配面、A8 身份清单七类复查——以开工日 master 为准);确认 §10/§11 裁点落定值。可核查结果:发射点清单表+身份清单+裁点定值注记进实现报告素材。 +- [ ] 改前读数:parity 锚基线状态(对拍绿)+**锚内行型出现计数**(按 A7 实测法记录:fx_preview_area/fx_reveal/insurance_used/mine_neutralized 各型行数);两测试套件通过数。可核查结果:基线表在案。 + +### T1 收敛实装+断言(≈0.85d) + +- [ ] 实装 a1(六发射点)。可核查结果:grep 判据=六发射点第一参全为扩展串;A8 身份清单①行型值类命中清零(②–⑦类按清单保留)。 +- [ ] 实装 a2(校验段,emit 之前)+a3(source_class)+a4(头注)。可核查结果:头注两层词表在位。 +- [ ] 断言六条(wr2 五条进两现役套件〔见接口块挂点〕+a2 负路径一条进新负面套件+manifest 登记行)。可核查结果:两现役套件直跑绿+负面套件非 0 退出(闸面 negative 豁免判绿)。 +- [ ] 验收步骤:全套闸按域选档跑(含 a6 按裁点:甲=重锚后对拍绿;乙=skip 落账)。 + +### T2 撤销证明+重锚(裁点甲时 ≈0.75d/乙 ≈0.5d)+产出物落位卡(末卡) + +- [ ] 撤销证明三条:①回退 a1 fx_reveal 兑付行发射点 hunk(type 改回实名串)→ wr2 断言②红(type 不匹配)→ 还原复绿——**限定「被断言钉住的发射点」**(六点中 :149/:157 落空行由断言③钉、grant 三点由断言①④⑤钉——全部有断言载体,任选其一执行并记录);②回退 a2 校验段 hunk → 负面套件红(违约直调不再炸、进程正常退出码 0 ≠ manifest expect 1)→ 还原复绿;③回退 a3 hunk(source_class 复空串)→ wr3 断言红(source_class 取值断言)→ 还原复绿。记录进实现报告。 +- [ ] 裁点甲时:按 [sim-data/README.md](../sim-data/README.md) 档位与流程重制 parity 锚(改后行为首采立新锚——「旧行为 MC 行为锚」条目 2026-10-25 先例形态),对拍复放绿(差异行数与 T0 锚内计数对账)。 +- [ ] 写齐三份产出物(实现报告〔a5 核验结论+裸键差异申报+发射点清单表+身份清单闭环+读数对拍(type/effect_id/source_class 三字段差)+实机目检总清单——结算明细屏四效果行目检+示警烟火行来源标注目检〕/代拍板追认单/反哺点清单〔§6 逐条落点〕)。 +- [ ] 合并前置:独立验收审计(§8.3)逐行「通过」。 + +**估时合计:裁点乙 ≈1.6d/裁点甲 ≈1.85d**。编排注记:行为改动面集中在行协议字段,数值/随机零触碰;parity 面重(对拍必红——编排时确认裁点已落);treasure_effects_test 首次 feats 注入有形态移植成本(T1 内);负面套件+manifest 登记是闸面新基建一行(T1 内)。 + +## 8. 验证闸 + +### 8.1 改动—验收对照表 + +| 需求点 | 改动(文件:行/行为) | 验收测试(名称+落点+尾缀) | 层级 | 真实入口 | 撤销证明 | +|---|---|---|---|---|---| +| wr1 四行型值收敛 | battle_orchestrator.gd:149/157/162+grant_segment.gd:271/281/309 type 改扩展串+effect_id 载荷 | 断言①–⑤〔wr2〕+ grep 身份清单判据〔wr1〕+改前改后 JSONL 读数对拍(**type/effect_id/source_class 三字段**差,其余零差异) | 单元+接口 | feats 装配驱动真实结算路径(round_flow_skill_pool_test :992 形态) | 回退被断言钉住的任一发射点 hunk → 对应断言红(T2①) | +| wr2 扩展行必载 effect_id | _emit_row 校验段(a2,emit 之前) | 负面套件断言〔wr2-np〕(缺 effect_id 直调 → assert 炸 → 进程非 0 退出=expect 1;extended_row_violation_test+manifest 登记行) | 单元(负面套件) | _emit_row 真实入口直调(同一发射管线,独立进程) | 回退 a2 校验段 → 负面套件退出码 0 ≠ expect 1 → 红(T2②) | +| wr3 fx_preview_area 空来源修复 | grant_segment.gd:281 source_class `""`→真实类别 | 断言⑤含 source_class==定值〔wr3〕 | 单元 | warning_beacon 装配+封印命中真实路径 | 回退 a3 hunk → wr3 断言红(T2③) | +| wr4 parity 面按裁点落定 | anchor.json(甲=重制/乙=skip) | 甲=对拍复放绿〔wr4〕/乙=skip 落账+实现报告登记 | 集成 | parity 复放真实跑批(锚内子集) | 甲=重锚前后对拍读数留档(差异行数与 T0 计数对账);乙=skip 状态留档 | +| wr5 产出物 | T2 三份 | 件核〔wr5〕 | — | — | 缺项红 | + +### 8.2 测试削弱申报 + +零(既有断言零改动;新增断言六条+校验段一条)。 + +### 8.3 独立验收审计 + +入口=未参与实现的会话或子代理;报告落 `reports/iter-验收审计-<日期>.md`;抽查重点=六发射点改动面封闭性(契约 1:逐 hunk 核对无越界改动)、a5 核验结论与裸键差异申报、wr1 读数对拍(**type/effect_id/source_class 三字段之外零差异**——A8 身份清单闭环核对)、a2 校验落位在 emit 之前、撤销证明三条记录在案。未过不得合并。 + +## 9. 异常分级 + +- **L1(自救)**:扩展串与 effect_id 具体取值(§10 白名单内);a3 来源类别命名;断言在两套件内的具体挂点函数。 +- **L2(记录继续)**:断言触发的装配前置成本(mine_neutralized 需构造第 3 次封印匠命中、落空行需无未揭示安全格态);treasure_effects_test feats 注入形态移植的正常成本;行号随 master 推进漂移。 +- **L3(停机呈报)**:任何结算数值/随机消费序变化(契约 2 破);豁免集合被迫改动(契约 3 破);grep 发现**A8 身份清单七类之外**的四串新身份(清单外新身份才停机——清单内七类保留是预期);parity 复放差异超出 type/effect_id/source_class 三字段(说明收敛外有行为漂移);重锚流程与 sim-data/README.md 档位表冲突。 + +## 10. 代拍板白名单(超清单必呈报) + +1. 扩展行型串值:推荐 `extended`(直译「扩展行」、全仓零占用 A10);备选 `fx`(淘汰:与 effect_id 载荷的 fx_ 前缀值域视觉混淆)。 +2. effect_id 取值:推荐四效果沿用原行型串(迁移最小、JSONL 可读性最大保留);备选统一改效果 kind 串(淘汰:与 counter 键、feats 行 kind 三处值域交叉,可读性反降)。 +3. a3 来源类别取值:推荐 `fx_warning_beacon`(对齐 `fx_seal_smith` 专长实名先例);备选 `preview_area`(淘汰:kind 串非来源语义)。 +4. **a5 裸键呈现差异处置**:推荐**申报差异**(示警烟火行带 `fx_warning_beacon` 裸键——与 mine_neutralized 行 `fx_seal_smith` 裸键先例一致,来源归因可见性归位;T2 目检覆盖);备选 settlement.tres `source_label_map` 补 fx_ 键给中文标注(淘汰:数值表改动扩面、且四效果只有一效果需要标注不成体系)。 +5. 提交切分与 worktree 分支命名。 + +## 11. 待裁点 + +**裁点 R(主裁点)· parity 重锚并账——已落甲(2026-10-25 用户裁「授权并账重锚」)**:T2 内按 sim-data/README.md 档位与流程重制锚(一次重锚并出账「结算明细日志行序重锚批」待办条目——该条目 2026-10-21 裁「批准另立、发起时点另定」,本次裁决即发起时点落定);批内对拍绿、无 skip 挂账。乙案(skip+另批)淘汰。本轮裁决前两案并列原文:甲=授权并账(推荐依据=乙案留 skip 挂账与读数对拍窗口期缺口、甲案一次出账两待办);乙=批内落 skip(先例 git d00f24a8)+重锚批另立。无第三路(重锚发起权在用户,D4)。 + +## 12. 自审六查与 grilling 复核记录 + +**自审六查(2026-10-25 写卡会话,v1.0)**:①规格覆盖——a1–a6→T1/T2、六断言/校验/撤销/产出物→T1/T2,指到 wr1–wr5;②步骤扫描;③类型一致性——接口块与 A3/A4/A7 实查一致;④审查焦点——呈现零变化靠 fallback 核验、parity 必红预登记、空来源先拆、counter 键同名残留预注记;⑤篇幅比例——零实现体;⑥落位预检——零新增件、三处复用已答。 + +**grilling 第一轮复核记录(2026-10-25,独立子代理对抗复核,判「回炉」一阻断)**:①阻断=a2 校验段零撤销证明(四断言只钉合法行、违约路径无断言;校验落位还开放为「前后均可」)——v1.1 折入:a2 落位收紧「emit 之前」+负路径断言+T2② 回退校验段证明+wr2-np 对照表行;②应修五条全折入——撤销证明机制句修正(headless --script 下 assert 只中断当前函数不断行,A5/T2③ 措辞按实跑语义改)、对拍口径补 source_class 三字段统一(契约 2/§8.1/§8.3/§9 四处)、撤销证明①限定「被断言钉住的发射点」并补 fx_reveal 落空行断言③(六发射点全有断言载体)、a3 裸键呈现差异申报(A6 补 source_label 机制+§10 白名单第 4 条处置+T2 目检)、grep 残留清单升格为 A8 七类身份清单+L3 改「清单外新身份」;③建议四条全折入——A9 先例名目订正、T1 拆三步、契约 2 随机流改「全部封闭随机流」并注九流名、锚必红升格实测凭据(A7 锚内行型计数 1520/1329+T0 基线表记数义务+锚红机制 feat_mode 注记)。核查通过项:六发射点/头注/豁免常量行号全属实、测试面四串零行型值直引、golden/probe/sim 零消费面、extra 平铺无键冲突、13 节结构齐、第 13 条已入契约 5。 + +**grilling 第二轮闭合复检记录(2026-10-25,独立子代理,判「回炉(单点)」)**:第一轮全部条目核闭合(阻断/五应修/四建议逐条落位属实);**新阻断一处**=wr2-np 负路径断言与闸机错误扫描互斥——run_all.gd:133-136 非负面套件输出含 SCRIPT ERROR 即判 FAIL,GDScript assert 失败必产 SCRIPT ERROR 且不可捕获,a2 按 assert 实装后负路径断言若在非负面套件内则闸 02 必红、「六断言绿」不可达。v1.2 折入:负路径断言载体改**独立负面小套件**(extended_row_violation_test.gd,manifest `expect=1, negative=true`——负面豁免机制先例 :49-50 同款)+撤销证明②改「退出码 0 ≠ expect 1」口径+文件结构图/接口块/预检/估时随更(新增件一件+manifest 登记一行,预检节补不能复用既有负面套件的依据——现役负面套件全在 data_config 域、负面语义要求独立进程)。复检同轮确认:卡面其余零新裂缝。 diff --git a/reports/需求卡片-调试入口写死行删除批-2026-10-25.md b/reports/需求卡片-调试入口写死行删除批-2026-10-25.md new file mode 100644 index 00000000..91f04be7 --- /dev/null +++ b/reports/需求卡片-调试入口写死行删除批-2026-10-25.md @@ -0,0 +1,194 @@ +# 需求卡片:调试入口写死行删除批(main.gd:199 发布态清理+角标断言面换代+随动同步面) + +- 版本:**v1.3**(2026-10-25 v1.0 成文→grilling 第一轮判「回炉」(一阻断)→v1.1 折入→第二轮闭合复检判「通过」→v1.2 措辞对齐→同日用户裁点 D **甲**(确认纯删)→v1.3 裁点落定定稿,复核记录见 §12) +- 开工门:U0+grilling 复核门过(§12)+裁点 D 已落甲(确认纯删,2026-10-25) +- 来源:[待办清单](../待办清单.md)「调试入口写死行必须在发布前删除——game/presentation/main.gd:196」条目(2026-10-18 登记,状态=待写卡)(唯一事实源:工程证据指认=条目实况〔2026-10-16 调试入口批实装记录+:199 行「发布前清」自注〕+本卡 §3 行号级实查——含登记时未查明的既有断言涟漪面与随动同步面) +- 归属:`game/presentation/main.gd`(删一行+注释随修)+ `game/tests/system_test.gd`+`game/probe/ui_click_probe.gd`+`game/probe/ui_tune_probe.gd`(三处既有断言换代)+ `game/tests/验证集清单.md`(改判对账)+ `game/README.md`(运行说明)+ `game/tests/golden/menu_boot.png`(基线重制,§10 代拍板) +- 排期:未编入(迭代批卡片;估时 ≈0.75 工作日) +- 开工门:U0+grilling 复核门过(§12)+§11 裁点落定 + +## 0. 前置依赖与并行性 + +- **第〇步核对(2026-10-25 写卡会话)**:来源条目=需求性工程条目(bug 证据带 file:line),跳过设计线、凭证据指认放行;条目状态=待写卡。 +- 与迭代 37 R1(main 判离拆件,已合回 8faf1763)同文件不同面——本卡只触 :73/:199-200 与三断言处及随动同步面,R1 拆出的件零触碰;行号以 T0 复核为准。 +- 与卡 A/卡 B 零逻辑耦合——可同迭代并行波(与卡 B 同触 ui_click_probe 不同段:本卡角标段 :325-327,卡 B wa4 段 :415-425〔其 :670-672 历史注记按其 §5 豁免不动〕——无冲突)。 +- **前置时序**:本卡删除动作使开发态调试 UI 入口永久关闭(§11 裁点甲语义)——编排时排在本迭代内不早于依赖调试浮窗人工操作的最后一张卡(现役卡片无此依赖;将来卡若有,排其后)。 + +## 1. 目标与完成定义 + +**目标**:删除 2026-10-16 调试入口批写死的门控行(发布前清理义务),调试浮层入口回到发布态(角标恒隐、浮窗无 UI 开启口);三处钉住「恒开令」的既有断言随发布态换代为反向断言;验证集清单、运行说明、渲染基线三处随动同步落地;被覆盖的回归语义退役面逐项申报。 + +**改动单元清单**(🔴 契约 1): + +| # | 单元(实查) | 改法 | 依据 | +|---|---|---|---| +| c1 | 写死门控行 `main.gd:199`(`_debug_entry = true # 调试入口门控写死=true(不读 DS_DEBUG 环境变量;发布前清)`) | 整行删除——`_debug_entry`(:73,缺省 `false`)恒 false,:200 `debug_badge.visible = _debug_entry` 随之恒隐 | 条目实况+:199 自注「发布前清」 | +| c2 | :73 声明注释「写死=true——恒开:启动即开浮窗+两屏角标点亮;_ready 赋值」——双重过时(写死描述随删行失效;「启动即开浮窗」早已不符——构建期显式初隐 ui_assembler.gd:195,开启唯经角标点击) | 随行修订为现状语义(缺省 false=发布态:角标恒隐、调试入口不可达);沿革只进 git log,注释零变更叙事 | 注释与实现相悖=审计判红面 | +| c3 | `system_test.gd:206-207` V2f 第二断言 `main.debug_badge != null and main.debug_badge.visible`(注记〔2026-10-16 用户令〕)——删行必红 | 反转:`not main.debug_badge.visible`,注记换代「发布态」;前一条「boot 不自动开浮窗」断言保留成立零触碰 | 断言对象随发布态换代;反转后断言即撤销证明载体(wr1) | +| c4 | `ui_click_probe.gd:325-327` 设置面开中「角标不可见=最顶层浮层失守」断言——删行必红 | 反转:断言角标在设置面开中保持恒隐(发布态语义);原「最顶层浮层不被遮挡」回归语义随调试浮层发布态退役——§8.2 申报 | 同 c3 | +| c5 | `ui_tune_probe.gd:116-126`「对局中角标点亮+真实信号路径开窗」段——:117 可见性断言删行必红、else 分支死路 | 段内换代:角标点亮断言反转(恒隐);「对局中开浮窗不锁棋盘输入」回归(P2 甲/T2 防护)改经 `main._show_debug_overlay()` 直调承载(同文件 :61 既有直调先例、TAG_NON_LOCKING 输入锁面零变化、回归语义不丢);:44-49 段程序性 `pressed.emit()` 不依赖可见性、零触碰 | 回归语义保载;按钮不可见≠信号路径删除(处理器 :861 保留) | +| c6 | `game/tests/验证集清单.md:139`(序号 74)冻结 V2f 旧 cond `main.debug_badge != null and main.debug_badge.visible`(行号/序号随 2026-10-25 迭代 37 结项补记清单重制漂移,T0 复核) | 改判同步:清单行随 c3 新 cond+标签换代;对账=`python tools/extract_checks.py --diff`(该对账不在闸内——T1 显式步骤承载,禁静默出库失真清单) | [test-conventions](../design/engineering/test-conventions.md) §8.3 维护锚+验证集清单头注「断言改判必须同步本清单,清单没跟上视同未完成」 | +| c7 | `game/README.md:16` 运行说明「`调试` 角标浮窗(恒开——2026-10-16 用户令 DS_DEBUG 写死…)」 | 随发布态改写(角标发布态恒隐;调试浮窗功能面说明保留但入口表述换代——具体措辞 L1) | 运行者入口指引失真;game/ 属实现批可写区 | +| c8 | `game/tests/golden/menu_boot.png` 基线右下角含可见角标像素(约 40×37px,x≈1222-1262/y≈748-785)——删行后差异约 0.14%,被 golden 2% 容差吸收、gate 仍绿 | §10 代拍板(推荐**显式重制基线+呈报**——render_gate 自身口径「预期面视觉变化=显式重制基线」;备选=容差吸收留痕——淘汰:基线长期带幽灵角标与发布态不符) | [render_gate](../tools/render_gate.sh):154 口径 | + +**完成定义**: + +1. c1–c8 落地;`_debug_entry` 全文件只剩 :73 声明与 :200 读取两处引用; +2. 反转断言三处绿+验证集清单对账零差异+撤销证明一条(恢复 :199 → 三处反转断言齐红 → 还原复绿); +3. 全套闸按本批改动域选档全绿(system_test/两探针/渲染面真实跑批——c8 重制后 gate 05 绿); +4. 三份产出物写齐(T2),实机目检总清单登记「设置面/菜单/对局中角标恒隐」目检项(登记不阻塞)。 + +## 2. 设计事实源 + +| # | 出处 | 取用条款 | +|---|---|---| +| D1 | 工程证据指认=待办清单条目实况(2026-10-16 调试入口批实装记录+:199 自注「发布前清」)+本卡 §3 实查 | 删除义务与「零第二改动点」原判(行为面) | +| D2 | 2026-10-16 用户令(V2f 断言注记在案)——恒开态与发布态的换代关系 | 断言换代(非削弱)依据 | +| D3 | [test-conventions](../design/engineering/test-conventions.md) §8 断言换代/削弱申报口径+§8.3 验证集清单维护锚 | c3–c6 的申报与对账义务 | +| D4 | 本卡 §11 裁点(2026-10-25 写卡会话呈报、用户落定) | 「开发态调试入口同断」的取舍依据 | + +## 3. 现状事实(2026-10-25 写卡会话实查+grilling 独立补查于 master 4a88c259;开工日 T0 复核行号) + +| # | 事实 | 出处 | +|---|---|---| +| C1 | `_debug_entry` 全文件三处::73 声明(缺省 `false`,注释双重过时)/:199 写死赋值(「发布前清」自注)/:200 角标可见性读取——删 :199 后行为面零第二改动点(:200 读缺省) | `game/presentation/main.gd:73/199/200` | +| C2 | 调试浮窗开启路径单点:`_show_debug_overlay`(main.gd:857 → main_debug_flow.gd:20-26 `_open_modal`——全仓唯一 `_open_modal(debug_overlay)`)。**生产调用方唯一**=角标点击(main_debug_flow.gd:31-36 形制守卫,无可见性检查——程序性 emit 亦可走通);**测试直调三处**=ui_tune_probe.gd:61/ui_struct_probe.gd:111/system_test.gd:525(c5 直调承载的既有先例);main_debug_flow.gd:87 浮窗内入口只收窗不开窗;构建期显式初隐 ui_assembler.gd:195;DS_DEBUG 环境变量通道 2026-10-16 写死时已断——角标恒隐后浮窗无任何 UI 开启口 | `game/presentation/main.gd:857-862`;`game/presentation/main_debug_flow.gd:20-36/87`;`game/presentation/ui_assembler.gd:195` | +| C3 | 角标点击处理器与便捷取用面保留在位(本卡不删):`_on_debug_badge_pressed`(:861-862)、:247 便捷取用、:56 LAYER_CONTRACT 登记——调试体系整体退役属另一批(范围边界) | `game/presentation/main.gd:56/246-247/861-862` | +| C4 | 既有断言三处钉「恒开令」、删行必红:system_test.gd:206 V2f 角标 boot 可见;ui_click_probe.gd:325-327 设置面开中角标可见(遮挡判据);ui_tune_probe.gd:116-126 对局中角标点亮+信号路径开窗(else 分支含输入锁回归)。**第四处注记**:smoke_boot.gd:75 `check(main.get("debug_badge") != null, …)` 仅装配 null 检查——删行后仍绿、不钉恒开、**非红处**(全仓 grep 命中时勿误触 L3「第四处钉恒开」停机) | 四文件实查 | +| C5 | ui_tune_probe.gd:44-49 段(boot 菜单角标点击开窗)为程序性 `pressed.emit()`+浮窗可见断言——不依赖角标可见性,删行后仍绿零触碰 | `game/probe/ui_tune_probe.gd:44-49` | +| C6 | 批量模拟主入口在 CLI(`--script res://sim/…`)不经调试 UI——删角标断的是人工调试便利(滑条/钥石/诊断转储 UI 入口),MC/闸机测量面零影响;**例外**=渲染面:menu_boot.png 基线右下角含可见角标像素(c8),删行后 golden 容差吸收仍绿但基线与发布态不符 | `game/sim/` 实查;`game/tests/golden/menu_boot.png` | +| C7 | 验证集清单.md:139(序号 74——2026-10-25 迭代 37 结项补记清单重制后现位)冻结 V2f 旧 cond——c3 改判须同步本清单(对账工具 `tools/extract_checks.py --diff` 不在闸内,须卡内显式步骤承载) | `game/tests/验证集清单.md:139`;[test-conventions](../design/engineering/test-conventions.md) §8.3 | +| C8 | `game/README.md:16` 运行说明载「恒开」表述——运行者入口指引随删行失真 | `game/README.md:16` | + +## 4. 设计契约(红线,违反 = L3 停机呈报) + +🔴 **契约 1 · 改动面封闭**:行为改动只 c1 删一行;c2 注释随修;c3–c5 只做断言换代与承载路径切换(`_show_debug_overlay` 直调);c6–c8 随动同步面;debug_overlay 体系、ModalFlow 门禁、输入锁、LAYER_CONTRACT 登记、角标处理器(C3)零触碰。 + +🔴 **契约 2 · 发布态语义唯一**:删行后 `_debug_entry` 不得出现第三处赋值(含环境变量读取——恢复门控属 §11 乙案、未裁不实装);角标恒隐是唯一终态。 + +🔴 **契约 3 · 断言换代不削弱+清单跟上**:c3–c5 每处必须以反向断言替代,禁只删不断言;「对局中开浮窗不锁输入」回归经直调承载不丢(c5);退役语义逐项进 §8.2 申报;c6 验证集清单对账零差异——「清单没跟上视同未完成」。 + +🔴 **契约 4 · 撤销证明钉行**:恢复 :199 单行 → 三处反向断言必须齐红;wr2 的回退=c5 整段回原形(只把直调换回 emit 而保留反转断言时该段仍绿——emit 不依赖可见性,红因在恢复的 if 分支=wr1 载体;实现期禁按字面只换回 emit)。 + +🔴 **契约 5 · 禁为机检文本保留无效成员**(req-card 第 13 条,本卡改机检提取面故立):禁为免重制验证集清单/渲染基线而保留旧 cond 或旧像素(c6/c8 歧路拦截);c5 段内既有 `conn_count==11` 计数断言(ui_tune_probe.gd:220)若因换代形态影响计数,停卡呈报不自行放宽;机检键与本卡契约互斥时一律 L3。 + +## 5. 范围边界 + +**做**:c1–c8;撤销证明;产出物;实机目检登记。 + +**不做**: +- 调试体系整体退役(debug_overlay 件本体、角标处理器、LAYER_CONTRACT 登记、debug_session——发布包排除属发布工程批); +- 恢复 DS_DEBUG 环境变量门控(§11 乙案未裁不实装); +- design/ 四处门控表述的落文(§6 反哺点通道——battle.md/生涯.md/test-conventions/code-architecture.json,实现批禁写 design/); +- tune_sim_controller/两层调试并发互斥缺陷(审计 §二 ④——另册在案); +- :200 行为语义变化(读缺省 false——不删 :200、不改其注释);smoke_boot.gd:75 装配检查(C4——保留不动)。 + +## 6. 关联文档同步面 + +| 文档 | 关联点 | 同步义务 | +|---|---|---| +| [battle](../design/gdd/ux/battle.md):159/229 | 调试浮窗入口/DS_DEBUG 门控表述——删行后「入口在座」类陈述落空(含 2026-10-16 恒开批的存量失真一并显形) | 反哺点 · 列清单(①:门控表述换代——发布态恒隐口径) | +| [生涯](../design/gdd/systems/跨局循环/生涯.md):18 | 调试入口描述随删行失真(T0 核具体句) | 反哺点 · 列清单(②) | +| [test-conventions](../design/engineering/test-conventions.md):49 | 调试入口门控表述 | 反哺点 · 列清单(③) | +| [code-architecture.json](../design/engineering/architecture/code-architecture.json):227 | 「DS_DEBUG 门控」节点副标 | 反哺点 · 列清单(④) | +| `待办清单.md` | 来源条目状态推进(已写卡→编迭代→完成即删) | 反哺点 · 列清单(⑤:状态核对注记) | + +(game/README.md 与验证集清单.md 属实现批可写区,已列改动单元 c6/c7,不走反哺。) + +## 7. 任务卡 + +### 卡前 · 文件结构图 + +| 文件 | 职责 | 行为改动 | +|---|---|---| +| `game/presentation/main.gd` | c1 删 :199+c2 注释随修(复用既有·修改) | 行为改动 → wr1 | +| `game/tests/system_test.gd` | c3 V2f 断言反转(复用既有·改断言) | 断言面 → wr1 | +| `game/probe/ui_click_probe.gd` | c4 设置面断言反转(复用既有·改断言) | 断言面 → wr1 | +| `game/probe/ui_tune_probe.gd` | c5 对局段换代+直调承载(复用既有·改断言/路径) | 断言面 → wr1/wr2 | +| `game/tests/验证集清单.md` | c6 改判对账(复用既有·同步) | 非行为改动(清单面)→ wr1 | +| `game/README.md` | c7 运行说明换代(复用既有·修改) | 非行为改动(文档面) | +| `game/tests/golden/menu_boot.png` | c8 基线重制(复用既有·重生成) | 非行为改动(基线面)→ wr1 | + +(零新增文件、零新增函数。) + +### 接口块 + +- **c3 断言**(system_test.gd V2f 第二条原位):`check(main.debug_badge != null and not main.debug_badge.visible, "V2f 调试浮层角标发布态恒隐(2026-10-25 删写死行批)")`——验证集清单序号 74 行(:139)同步此 cond+标签。 +- **c4 断言**(ui_click_probe.gd:325 原位反转):`if main.debug_badge == null or main.debug_badge.visible: _problems.append("设置面开中调试角标可见(发布态恒隐失守)")`。 +- **c5 段形**(ui_tune_probe.gd:116-126):角标可见断言反转(同 c4 句式);`else` 分支的 `dbg_badge.pressed.emit()` 改 `main._show_debug_overlay()` 直调(:61 既有直调先例;后续浮窗可见/输入锁/六项读数断言保持原样)。 +- **c6 对账命令**:`python tools/extract_checks.py --diff` → 判据=零差异(清单与代码 check 全对齐)。 +- **取用**:无。**产出**:无(末卡)。 +- **最窄闸**:system_test 直跑(`python tools/run_system_test.py`)+ui_click_probe/ui_tune_probe 单件直跑+渲染面(c8 重制后);全套闸按本批改动域选档。 + +### 落位与可复用性预检 + +- **零新增件**:三处断言换代全在现役套件原位;直调路径复用 `_show_debug_overlay` 既有单口与 :61 直调先例——不造第二开启口;清单对账复用 `tools/extract_checks.py` 既有工具;基线重制走 render_gate 既有重制口径。 +- **复用面**:撤销证明载体=c3 反转断言本身——不另造证明件。 +- **唯一面**:`_debug_entry` 赋值点删后唯一(:73 缺省);浮窗开启口唯一性不变(C2 单点);验证集清单仍是断言冻结唯一处(c6 只换代不旁立)。 +- **分层**:presentation 面改动,core 零触碰;探针改动属闸面断言换代(test-conventions 既有口径)。 + +### T0 事实坐实(≈0.1d) + +- [ ] 复核 C1–C8(重点:R1 拆件后 main.gd 行号、三断言原位、C4 第四处注记、C7 清单行、C8 基线像素坐标);确认 §11 裁点与 §10 c8 处置落定值。可核查结果:断言原位清单+裁点注记进实现报告素材。 + +### T1 删除+断言换代(≈0.4d) + +- [ ] 实装 c1(删行)+c2(注释)。可核查结果:`grep -n "_debug_entry" game/presentation/main.gd` 恰两处(:73/:200)。 +- [ ] 实装 c3/c4(反转)+c5(换代+直调)。可核查结果:三断言反向形态在位。 +- [ ] 实装 c6(清单同步+对账)+c7(README)+c8(基线重制,按 §10 落定值)。可核查结果:extract_checks --diff 零差异;README 发布态表述;新基线在位。 +- [ ] 验收步骤:system_test+两探针直跑绿;全套闸按域选档跑一次全绿。 + +### T2 撤销证明+产出物落位卡(≈0.15d,末卡) + +- [ ] 撤销证明一条:恢复 :199 单行(git 回退该 hunk)→ c3/c4/c5 三处反向断言齐红(system_test 与两探针直跑)→ 还原复绿(wr2 的回退按契约 4=整段回原形)。记录进实现报告。 +- [ ] 写齐三份产出物(实现报告〔断言换代清单+退役语义申报+清单对账与基线重制记录+实机目检总清单——菜单/设置面/对局中角标恒隐三项〕/代拍板追认单/反哺点清单〔§6 五条逐条落点〕)。 +- [ ] 合并前置:独立验收审计(§8.3)逐行「通过」。 + +**估时合计 ≈0.75d**。编排注记:微件卡;断言换代与随动同步落地后闸面即恢复绿——无跨卡前置。 + +## 8. 验证闸 + +### 8.1 改动—验收对照表 + +| 需求点 | 改动(文件:行/行为) | 验收测试(名称+落点+尾缀) | 层级 | 真实入口 | 撤销证明 | +|---|---|---|---|---|---| +| wr1 发布态角标恒隐 | main.gd:199 删除+三断言反转+c6/c8 随动 | V2f 反转断言〔wr1〕+设置面反转〔wr1〕+对局段反转〔wr1〕+清单对账零差异+新基线 | 系统+探针+渲染 | system_test 真实启动+两探针真实跑批(main.tscn 实例化路径)+render 面真实跑批 | 恢复 :199 → 三断言齐红(T2) | +| wr2 对局中开窗回归保载 | ui_tune_probe.gd 对局段直调承载(c5) | 浮窗可见/输入锁不锁/六项读数断言保持绿〔wr2〕 | 探针 | `_show_debug_overlay` 真实单口直调(对局中真实场景) | 回退=c5 整段回原形 → 该段断言红(契约 4 口径) | +| wr3 产出物 | T2 三份 | 件核〔wr3〕 | — | — | 缺项红 | + +### 8.2 测试削弱申报(断言换代+语义退役) + +- **换代非削弱**:c3/c4/c5 角标可见断言三处由「恒开令」正向反转为「发布态恒隐」反向——断言对象随用户令换代(D2),判据强度不变。 +- **语义退役申报**:ui_click_probe.gd:325 原断言兼任的「float 末位浮层不被设置面遮挡」回归语义,随角标发布态退役失去宿主、**无替代载体**(发布包无调试浮层面;该判据的重建与调试体系整体退役批同域)。 +- **承载切换**:c5「对局中开浮窗不锁棋盘输入」由角标信号路径切换为 `_show_debug_overlay` 直调——门禁与 ModalFlow 面零变化,回归语义经 wr2 保载。 +- 既有断言零删除(三处全为原位反转/换代)。 + +### 8.3 独立验收审计 + +入口=未参与实现的会话或子代理;报告落 `reports/iter-验收审计-<日期>.md`;抽查重点=改动面封闭(契约 1)、三断言反转形态与撤销证明记录(契约 4 口径)、c6 对账记录与 c8 基线重制呈报、c5 直调后 :44-49 段未被顺手改、§8.2 申报与实际改动一致。未过不得合并。 + +## 9. 异常分级 + +- **L1(自救)**:c2/c7 注释与说明措辞;c5 段内直调落点与断言消息文本;c8 重制的操作细节。 +- **L2(记录继续)**:行号随 master 推进漂移(R1 拆件面);探针内无关断言的既有存量噪声。 +- **L3(停机呈报)**:删除后仍有**生产**路径可开浮窗(C2 单点论断失实——测试直调三处不算);反转断言在恢复 :199 后不红(契约 4 破);C4 三红处之外发现第五处钉「恒开」的既有断言(smoke_boot:75 装配检查已注记豁免);c5 段内 conn_count 计数断言受换代影响(契约 5);对局中直调开窗后输入锁行为异常(门禁回归破);基线重制流程与 render_gate 口径冲突。 + +## 10. 代拍板白名单(超清单必呈报) + +1. c2/c7 注释与说明具体措辞(语义=发布态恒隐)。 +2. 三处反向断言与清单行的消息文本。 +3. c5 直调在段内的具体落点(保持后续断言原序前提)。 +4. **c8 基线处置**:推荐显式重制+呈报(render_gate:154 口径、基线与发布态一致);备选容差吸收留痕(淘汰:幽灵角标长期驻基线)。 +5. 提交切分与 worktree 分支命名。 + +## 11. 待裁点 + +**裁点 D · 删除的代价确认(开发态调试入口同断)——已落甲(2026-10-25 用户裁「确认纯删」)**:断言三处随发布态换代(c3–c5)+随动同步(c6–c8);依据=2026-10-16 用户令本就注明「发布前清」、本卡即履行;批量模拟与闸机主入口全在 CLI;开发期偶需调试临时改 :73 缺省(本地不提交)。乙案(删行并恢复 DS_DEBUG 环境变量门控)淘汰——为可逆后手(发布工程批需要时再立),现在恢复=提前为未证实的需求付改动面;且违「零第二改动点」原判、新增门控代码+探针环境面适配+§6 四处文档反哺口径复杂化。本轮裁决前两案并列原文:甲=确认纯删(推荐);乙=恢复环境变量门控。丙案(不删留发布批)与本卡立项意图相悖,未列。 + +## 12. 自审六查与 grilling 复核记录 + +**自审六查(2026-10-25 写卡会话,v1.0)**:①规格覆盖——c1–c5→T1、撤销/产出物→T2;②步骤扫描;③类型一致性;④审查焦点——涟漪断言三处、撤销证明钉行、对局回归保载、语义退役申报;⑤篇幅比例;⑥落位预检。 + +**grilling 第一轮复核记录(2026-10-25,独立子代理对抗复核,判「回炉」一阻断)**:①阻断=验证集清单同步义务漏载(c3 改判 check 须同步 验证集清单.md:140 序号 75,test-conventions §8.3「清单没跟上视同未完成」、对账工具不在闸内)——v1.1 折入:c6 单元+T1 对账步骤+契约 3 收口;②应修四条全折入——§6「无关联」失实改列 battle.md:159/229/生涯.md:18/test-conventions.md:49/code-architecture.json:227 四处反哺点(§6 五行表);C2 调用方枚举订正(生产唯一=角标点击、「浮窗内入口」不存在、测试直调三处 :61/:111/:525 入载);game/README.md:16 运行说明入 c7;menu_boot.png 基线幽灵角标(约 40×37px、容差吸收仍绿)入 c8+C6 表述收窄;③建议四条全折入——wr2 回退口径写明(契约 4);smoke_boot:75 第四处注记(C4);T1 拆三步(删行/断言/同步分立);req-card 第 13 条立契约 5(含 conn_count 计数断言注记)。工程主体(C1/C3–C5 机理、撤销证明、闸面归属)复核为全部成立。 + +**grilling 第二轮闭合复检记录(2026-10-25,独立子代理,判「通过」)**:第一轮一阻断四应修四建议逐条核闭合属实(c6 清单对账、§6 五行、C2 枚举、c7/c8、契约 4/5 口径全部落位);新面抽查零裂缝(c5 直调先例、c6 新 cond 与清单行互指、c8 与 §8.2/§8.3/§10.4 互指、:44-49 段独立性均属实);交叉一致性核过(与卡 B 同文件不同段不交叠、三卡对注销条目表述一致)。v1.2 仅 §0 一句措辞随卡 B 对齐,内容零改。 diff --git a/待办清单.md b/待办清单.md index a75a5037..33aebdf3 100644 --- a/待办清单.md +++ b/待办清单.md @@ -62,11 +62,14 @@ #### 效果引擎校验文案计数错误——封闭事实词表数写死「9 项」实为 18(2026-10-25 登记,来源=审计发现) -**实况**:证据=reports/审计-game代码结构审查-2026-10-24.md §三 漂移清单第 5 条(原「架构与规范对齐批」条目⑦,该条目 2026-10-25 闭合删除、未决先迁本条):game/core/effect_engine.gd:360 校验报错文案「事实词汇封闭 9 项」实为 18 项——一行字符串修订,零行为变化。属游戏代码字符串修订,按改动四类走需求改动通道。 +**实况**:证据=reports/审计-game代码结构审查-2026-10-24.md §三 漂移清单第 5 条(原「架构与规范对齐批」条目⑦,该条目 2026-10-25 闭合删除、未决先迁本条):game/core/effect_engine.gd:360 校验报错文案「事实词汇封闭 9 项」实为 18 项——一行字符串修订,零行为变化。属游戏代码字符串修订,按改动四类走需求改动通道。**2026-10-25 写卡会话复核与裁点**:FACTS 实数=19(审计 18→今 19 两次漂移实证);同文件头注 :21-23 另有一处写死计数(EFFECT_KINDS 注释「类型实数 24」实为 32)一并治理;用户裁修法=动态取 FACTS.size()(不留死数);奖励节点承接包经裁点 P 乙迁出独立卡(同日新条目在册)。 + +关联文档清单: +- 需求卡片 reports/需求卡片-效果引擎校验文案计数修正批-2026-10-25.md(2026-10-25 v1.3 定稿,grilling 两轮复核+用户裁点 Q 甲/P 乙落定,零待裁点;估时 ≈0.25d) **改动面**:游戏代码 -**状态**:待写卡 +**状态**:已写卡(reports/需求卡片-效果引擎校验文案计数修正批-2026-10-25.md) #### 明细行扩展总型收敛批——四个专长实名行型收敛为单一扩展行型+效果载荷(2026-10-25 登记,来源=批次移交) @@ -74,7 +77,10 @@ **改动面**:游戏代码 -**状态**:待写卡 +**状态**:已写卡(reports/需求卡片-明细行扩展总型收敛批-2026-10-25.md) + +关联文档清单: +- 需求卡片 reports/需求卡片-明细行扩展总型收敛批-2026-10-25.md(2026-10-25 v1.3 定稿,grilling 两轮复核+用户裁点 R 甲〔重锚并账授权——「结算明细日志行序重锚批」条目随卡出账〕,零待裁点;估时 ≈1.85d 含重锚) #### 营地五界面窗口化批——营地功能页点开后的呈现形态(2026-10-22 登记,来源=会话提及) @@ -570,13 +576,16 @@ **状态**:待写卡(备选) -#### 奖励节点三选一实装(2026-10-25 登记,来源=批次移交) +#### 奖励节点过时表述清扫批——三选一实装注销的承接微卡(2026-10-25 登记,来源=条目注销承接) -**实况**:局内奖励节点现为零兑付直通占位——`game/core/level_runner.gd:462-466` `"reward"` 分支注记「奖励点内容未定…节点保留占位、零兑付直通」,实跑选路直接跳过;L1 全部模板零商店节点(`game/data/tables/level.tres` L1 行=20 battle/5 boss/5 rest/5 reward,零 shop),现行局内 bonus 唯一可达来源=L2 商店货架。而规格已定:[node-reward](design/gdd/ux/node-reward.md) v2.8=奖励节点从冒险牌库抽三选一(属性值提升与补给;与通关专长三选一同库分流),池与库存口径归[冒险结构](design/gdd/systems/冒险循环/冒险结构.md)「奖励节点三选一池」节(共享令牌库、消耗即上限)。连带影响:迭代 36 卡C 路径②原设计「奖励节点拿属性卡→下一关开场行带后缀」不可驱动,已改快照喂入形态通过;wa4 探针半(三选一停点弹层头部断言)保留为条件断言、**拦截能力未证**(test-conventions §6 口径),本条实装后须重跑该断言。 +**实况**:「奖励节点三选一实装」条目 2026-10-25 经用户确认注销(功能已全链实装:level_runner 发射 node_entered → adventure_runner 转发 → main_adventure_flow 拉起 present_node_curio → curio_interact_controller 弹三选一兑付;条目唯一证据是一句 2026-09-24 起过时的注释)。注销承接义务包(用户裁点 P 乙=独立微卡承接):level_runner.gd:477-478/:10 两处过时注释+battle_narrator.gd:15 玩家可见过时战报文案(「节点内容待定——直通」——玩家实际拿到的是三选一)+autoplay.gd:484 注释理由句+wa4 条件断言转正复跑(ui_click_probe.gd:415-425,拦截能力未证→必达)。08-Alpha版本标准.md:113 与 roadmap 待编池指路句随注销过时,归反哺点(卡片 §6)。 + +关联文档清单: +- 需求卡片 reports/需求卡片-奖励节点过时表述清扫批-2026-10-25.md(2026-10-25 v1.1,独立成卡复核通过〔附两应修已折入〕,零待裁点;估时 ≈0.5d) **改动面**:游戏代码 -**状态**:待写卡 +**状态**:已写卡(reports/需求卡片-奖励节点过时表述清扫批-2026-10-25.md) #### 闸与探针存量噪声两件——_round_rows 类型错与批上下文挂死(2026-10-25 登记,来源=批次移交) @@ -651,34 +660,26 @@ #### 调试入口写死行必须在发布前删除——game/presentation/main.gd:196(2026-10-18 登记,来源=批次移交) -**实况**:2026-10-16 用户令把调试入口改为恒开,`game/presentation/main.gd:196` 的 `_debug_entry` 现恒为 true、不再读环境变量(2026-10-18 实查该行仍为 `_debug_entry = true` 并带「发布前清」注释;:197 是最顶层浮层角标的可见性赋值)。发布前删掉 :196 这一行即可——角标可见性随门控失效自动隐藏,无第二处改动点。不删的后果:正式包里调试浮层与角标常显。证据=该行代码注释与 2026-10-16 调试入口批的实装记录。 +**实况**:2026-10-16 用户令把调试入口改为恒开,`game/presentation/main.gd:196` 的 `_debug_entry` 现恒为 true、不再读环境变量(2026-10-18 实查该行仍为 `_debug_entry = true` 并带「发布前清」注释;:197 是最顶层浮层角标的可见性赋值)。发布前删掉 :196 这一行即可——角标可见性随门控失效自动隐藏,无第二处改动点。不删的后果:正式包里调试浮层与角标常显。证据=该行代码注释与 2026-10-16 调试入口批的实装记录。**2026-10-25 写卡会话查明+裁点**:现行行号 :199;删行涟漪面=三处钉「恒开令」的既有断言(system_test V2f/ui_click_probe:325/ui_tune_probe:116-126)随发布态换代+验证集清单/README/渲染基线三处随动;用户裁点 D 甲=确认纯删(开发态人工调试 UI 入口同断、CLI 测量面不受影响)。 + +关联文档清单: +- 需求卡片 reports/需求卡片-调试入口写死行删除批-2026-10-25.md(2026-10-25 v1.3 定稿,grilling 两轮复核+用户裁点 D 甲落定,零待裁点;估时 ≈0.75d) **改动面**:游戏代码 -**状态**:待写卡 - - ---- - -#### L3 屏壳切换探针的判定被仓库外存档状态污染,跑批绿红不可复现(2026-10-18 登记,来源=审计发现) - -**实况**:2026-10-18 卫生批跑全量档时 03 探针 --click 与 04 探针 --full 双双「基线绿→现红」,唯一失效单元是 `game/probe/screen_flow_probe.gd` 的第④步(菜单开新冒险进不去,⑤⑥⑦三条随之因前置不满足连带红)。根因已钉死且与本批及任何代码改动无关:`user://save.json`(主区与所有 worktree 共用同一份、不入 git)里现存一个 `breakpoint` 断点,而 `game/presentation/main.gd:476-482` 按「二轮修改批 A」的用户目检裁决,在 `save_manager.has_breakpoint()` 时弹实底确认框「已有未完冒险(第 N 关)——开新冒险将覆盖旧断点」并直接返回、不开冒险;探针第④步只用前缀匹配找「▶ 开始冒险」并按下、等 3 帧就断言进冒险屏,它隐含假设「存档里没有断点」。三条判据:主区那份未受本批影响的 master(`ea69670c`)单跑同一探针复现完全一样的 7 处;同一 worktree 同一代码把 save.json 临时移开再跑立刻 `PASS — 六步主流程+回退路径全绿`(跑完存档逐字节还原,sha1 `dd67444c35be` 与移开前一致);`game/**/*.gd` 自 10-17 那次绿回执 `7ffd1dc0` 之后零改动。断点来源=上一轮 `ui_click_probe` 或任一会话跑到中途留下的未完冒险(存档账目已累积到 `adventure_total=6`、`level_clear_counts={1:18,2:7,3:4}`)。后果是验证闸的绿红取决于「这台机器上谁最后跑过」,正是 test-conventions §8「判定可靠性优先于覆盖率」所管的同一类缺陷。修复方向两条,均待写卡时定:探针侧自救(第④步前先走弃断点通道,或在确认框上按「开新冒险」再断言)=改 `game/`;跑批侧隔离(给探针配独立 user 目录)=改 `tools/probe_gate.sh`,⚠ 此路有一条未验障碍——本日用 `--user-dir` 指到空目录跑该探针,Godot 挂住零输出、超时未出结论,走这条要先查明成因。证据已指认,按 §12.1 属需求性工程条目,跳过设计线。 - -**改动面**:游戏代码+工具代码 - -**状态**:待写卡 +**状态**:已写卡(reports/需求卡片-调试入口写死行删除批-2026-10-25.md) --- #### 结算明细日志行序重锚批(2026-10-21 登记,来源=批次移交) -**实况**:迭代 32 卡① N7 改动互换 `seal_miss`/`insurance_used` 两行日志顺序并改写豁免态 highlight(豁免态=insurance_used 行先行且 highlight 置空;未豁免态=两行相对序不变但 `seal_miss` 发射时点后移——完整对照见 git 提交 d00f24a8 批内实现报告,报告已退役);`playtest_logger._on_step_row` 逐行落盘含 highlight 字段,与基线数据逐项比对的 JSONL sha256 校验必红,实现批按规未发起、11 号闸落 skip。**用户 2026-10-21 裁=批准另立重锚批,发起时点另定**(重锚批只能由用户发起)。 -- 相关文档:`sim-data/` 锚与 `tools/parity_anchor.py`(重锚执行归用户发令批) +**实况**:迭代 32 卡① N7 改动互换 `seal_miss`/`insurance_used` 两行日志顺序并改写豁免态 highlight(豁免态=insurance_used 行先行且 highlight 置空;未豁免态=两行相对序不变但 `seal_miss` 发射时点后移——完整对照见 git 提交 d00f24a8 批内实现报告,报告已退役);`playtest_logger._on_step_row` 逐行落盘含 highlight 字段,与基线数据逐项比对的 JSONL sha256 校验必红,实现批按规未发起、11 号闸落 skip。**用户 2026-10-21 裁=批准另立重锚批,发起时点另定**(重锚批只能由用户发起)。**2026-10-25 发起时点落定**:用户裁「重锚随『明细行扩展总型收敛批』并账」——该批落地改行型值致锚必红(grilling 实测锚内受影响行 ≥2849),重锚在其 T2 内按 sim-data 档位与流程一并执行出账,本条不再另立批。 +- 相关文档:`sim-data/` 锚与 `tools/parity_anchor.py`(重锚执行归并账卡);需求卡片 reports/需求卡片-明细行扩展总型收敛批-2026-10-25.md(T2 重锚任务承载) **改动面**:工具代码 -**状态**:待裁决 +**状态**:已写卡(并账进 reports/需求卡片-明细行扩展总型收敛批-2026-10-25.md——2026-10-25 用户裁 R 甲随卡出账) ---