diff --git a/reports/需求卡片-结构小件定点修批-2026-10-26.md b/reports/需求卡片-结构小件定点修批-2026-10-26.md index 824830bb..f4cfe63c 100644 --- a/reports/需求卡片-结构小件定点修批-2026-10-26.md +++ b/reports/需求卡片-结构小件定点修批-2026-10-26.md @@ -1,23 +1,24 @@ # 需求卡片:结构小件定点修批(审计 §三 其余小件六件:死变量/confirm 收口/空判/常驻 flush/fatal 违约回调/未播种取数通道) -- 版本:**v1.3**(2026-10-26 定稿——含迭代 38 停卡后的载体修订与复核轮收紧;逐轮 grilling 与停卡呈报记录见 §12) +- 版本:**v1.4**(2026-10-27 定稿——迭代 40 卡② 施工实测 p5 原处方在 `RewardEconomy` 上顶破类变量阈值,用户裁「缝拆+另立卡」替换 p5 处方并加两条验收;v1.3 的验收载体改独立负面套件与 p7 并修沿用;逐轮 grilling 与停卡呈报记录见 §12) - 来源:[待办清单](../待办清单.md)「结构审查未立项小件候审」条目(2026-10-25 登记,状态=待裁决)——**2026-10-26 用户裁「全六件立项」**;本卡收六件(①③④⑤⑥ 审计原编号+p7 同函数第二处,2026-10-26 用户裁「并修」随 v1.3 入卡),件②(level_map 越界/BFS)独立成卡、已随迭代 38 卡① 合回退役(git 提交 b85b3b45/8ea7cfba)(唯一事实源:工程证据指认=审计报告 [§三 其余小件](审计-game代码结构审查-2026-10-24.md) §90-95 逐件行号+本卡 §3 行号级实查〔迭代 37 拆件后行号重定位〕) -- 归属:`game/presentation/main_overlay_flow.gd`+`game/presentation/main.gd`+`game/presentation/row_pacer.gd`(消费一行)+`game/core/board_generator.gd`+`game/core/reward_economy.gd`+`game/core/rng_service.gd`+`game/core/battle_orchestrator.gd`(组装接线两行)+测试面(新增负面套件一件+其 `.uid` 边车+`game/tests/run_all.gd` manifest 登记一行+探针回归) -- 排期:未编入(迭代批卡片;估时 ≈0.85 工作日——含负面套件新件、manifest 登记与清单对账 ≈0.1d;归属车道随「gdstyle 存量债全量清偿」条目波 7 或另编迭代,由编排段定) +- 归属:`game/presentation/main_overlay_flow.gd`+`game/presentation/main.gd`+`game/presentation/row_pacer.gd`(消费一行)+`game/core/board_generator.gd`+`game/core/reward_economy.gd`+`game/core/battle_fx_host.gd`(v1.4 追加一枚公开查询口;该件由迭代 40 卡① 建)+`game/core/rng_service.gd`+`game/core/battle_orchestrator.gd`(组装接线:fatal 两行+一行换一行)+测试面(新增负面套件一件+其 `.uid` 边车+`game/tests/run_all.gd` manifest 登记一行+`game/tests/unit/battle_settlement/variant_placement_test.gd` 追加三条断言+探针回归) +- 排期:未编入(迭代批卡片;估时 ≈1.0d——v1.3 的 ≈0.85d+v1.4 缝拆增量 ≈0.15d=宿主查询口一枚、掷格件成员替换、三条断言、dump 六组改前基线采集与批末 diff。归属车道随「gdstyle 存量债全量清偿」条目波 7;卡序随迭代 40 行内排列(卡①→卡②),由编排段定) - 开工门:U0+复核门过(§12);零待裁点 ## 0. 前置依赖与并行性 - **第〇步核对(2026-10-26 写卡会话)**:来源条目=需求性工程条目(审计行号证据),用户 2026-10-26 点名全六件立项——放行。 -- 审计行号基线=2026-10-24(迭代 37 拆件前);本卡 §3 已按现行 master 重定位(①main→main_overlay_flow 拆件迁移、③行号漂移),**v1.3 复核轮再按迭代 38 合回点 8ea7cfba 重锚一遍**(`battle_orchestrator.gd` 组装点与 `_fatal`、`main.gd` 各址均漂移),开工日 T0 仍须复核。 +- 审计行号基线=2026-10-24(迭代 37 拆件前);本卡 §3 已按现行 master 重定位(①main→main_overlay_flow 拆件迁移、③行号漂移),**v1.3 复核轮再按迭代 38 合回点 8ea7cfba 重锚一遍**(`battle_orchestrator.gd` 组装点与 `_fatal`、`main.gd` 各址均漂移),**v1.4 的 p5 缝拆面另按迭代 40 卡① 落定形态锚**(见下条硬前置),开工日 T0 仍须复核。 - 与 2026-10-25 两批卡零文件交叠(卡 A 触 battle_orchestrator 的发射点/头注/校验段——本卡 p5 只动组装点的两行接线与两协作件 `_fatal` 成员,**按语义面判交叠、不按行号**:行号随合回漂移,「发射与校验段」对「组装点接线行」的面不相交在换代后仍成立;rng_service p6/p7 与其零叠)。同波无冲突。 - p6/p7 同触 `rng_service.gd:100-112` 同一函数的两条分支——v1.3 并修后两处改动面相邻,禁拆成两波同文件互踩(一条波次内完成)。 -- **与「核心数据面结构收敛批」(2026-10-27 v1.0,在册同条目)文件交叠**:同触 `board_generator.gd`(本卡改 `_fatal` :396-398)与 `reward_economy.gd`(本卡改 `_fatal` :366-368)——该卡 §0 已记此交叠并裁「编排串行、后行者 T0 吸收行号漂移」。本卡体量最小(六件皆行级),**宜先行**;若被排在该卡之后,§1/§3/S5 的行号锚一律按其 T0 重核,禁照搬本卡现值。 -- p5 触结算域(core 件 _fatal 形态)——parity 触面按 MC 纪律:零数值改动=零 MC(_fatal 是违约路径,合法路径零触碰)。 +- **p5 硬前置=迭代 40 卡①(B1 战斗域拆件批)**:v1.4 缝拆的落点件 `game/core/battle_fx_host.gd`(`BattleFxHost`)由卡① 建件——卡② p5 必在卡① 之后施工(roadmap 迭代 40 行内卡序=执行序);组装点现形 `_reward_economy.set_fx(_fx_host.engine, _fx_host.counters_ctx)`,行号与形态按卡① 落定后 T0 重核,禁照搬本卡 v1.3 的 :285/:290 锚。 +- **与「核心数据面结构收敛批」(2026-10-27 v1.0,在册同条目)文件交叠**:同触 `board_generator.gd`(本卡改 `_fatal` :396-398)与 `reward_economy.gd`(本卡改 `_fatal` :366-368+v1.4 缝拆 :20-26/:63-69)——该卡 T9 拆的是同文件 `roll_board` 的 :42-52/:220-259 三段,与本卡改段同函数不相交、行号互漂必发;其 §0 已裁「编排串行、后行者 T0 吸收行号漂移」。本卡体量最小,**宜先行**;若被排在其后,§1/§3/S5/S8 的行号锚一律按其 T0 重核,禁照搬本卡现值。 +- p5 触结算域(两 core 件 `_fatal` 形态+`RewardEconomy` 与 `BattleFxHost` 之间一处成员替换)——parity 触面按 MC 纪律:零数值改动=零 MC(`_fatal` 是违约路径,缝拆只搬判定、权重表与池结构一字不动,合法路径零触碰);行为零变化的兜底由 wr11 的 dump 六组逐位 diff 承担。 ## 1. 目标与完成定义 -**目标**:六件审计定点小件落地——①_ sync_status_entry 死变量与重复四句清除;③settle_batch 两入口显式 null 防护;④row_pacer 会话更替机制化 flush;⑤两 core 协作件 _fatal 的 release 软回退补真中止通道(经 orchestrator 既有封印传导);⑥rng_service open_stream 未知标签补 return+可测违约回调;⑦同函数未播种取数分支(`_master_seed < 0`)同款补 return+违约回调(p6 同病根第二处,v1.3 用户裁并修)。合法路径行为逐位不变(p2 confirm 收口是唯一行为改动=锁域归位,对照表专行)。 +**目标**:六件审计定点小件落地——①_sync_status_entry 死变量与重复四句清除;③settle_batch 两入口显式 null 防护;④row_pacer 会话更替机制化 flush;⑤两 core 协作件 `_fatal` 的 release 软回退补真中止通道(经 orchestrator 既有封印传导),其中 `RewardEconomy` 同步做效果层缝拆(v1.4:`_fx`/`_ctx` 与 `bias_rewards` 判定搬进 `BattleFxHost`,类变量数不越阈值);⑥rng_service open_stream 未知标签补 return+可测违约回调;⑦同函数未播种取数分支(`_master_seed < 0`)同款补 return+违约回调(p6 同病根第二处,v1.3 用户裁并修)。合法路径行为逐位不变(p2 confirm 收口是唯一行为改动=锁域归位,对照表专行)。 **验收载体口径**(v1.3 停卡修订立此,实装段禁改回落位):违约路径取证(wr5/wr6/wr7)**一律落独立负面套件**并按 manifest 登记 `expect=1, negative=true`,禁落现役非负面套件——headless 下 `assert` 失败必产 `SCRIPT ERROR` 行、不可捕获,非负面套件的输出被闸 02 扫描命中即判 FAIL(规则出处=test-conventions §5「负面套件仅可豁免第 2 闸,且须在 manifest 显式标记」;在册先例三件=`reward_dangling_treasure_test`/`counter_prefix_fatal_test`/`extended_row_violation_test`)。 @@ -29,14 +30,14 @@ | p2 | confirm 旁路单口违约:`main_overlay_flow.gd:88` `root.confirm_dialog.open(...)` 与 `main.gd:311/:320` `confirm_dialog.close()` 直开直关——绕过 `_open_modal/_close_modal`(main.gd:281-285 → ModalFlow.open/close 挂起兜底/遮挡记账/开侧同步),违 main.gd 自身头注单口纪律;confirm_dialog.gd:40-41「树序由构建序保证」注释失真 | 三处收口:open 前经 `root._open_modal(root.confirm_dialog)`(ModalFlow.open 承载显示编排,T0 核其与 confirm_dialog.open 设文案的先后序);close 经 `root._close_modal(...)`;:40-41 失真注释随修。**行为改动=confirm 开合进 ModalFlow 栈(输入锁/互斥域归位)**——对照表专行+探针回归 | 审计 ①后半;架构单口纪律 | | p3 | `main.gd:721/:748` settle_batch 两入口直取 `run_scope.settlement.minesweeper.settle_batch(...)`——前置空判隐式依赖 `_input_locked` 第三例外(锁谓词保证只在局内可达) | 两入口各加显式防护:`if run_scope.settlement == null: return`(零成本双保险——锁谓词异常时不再崩于空引用) | 审计 ③「入口显式 null 防护零成本双保险」 | | p4 | `row_pacer.gd:11` `_rows` 待播队列住 main 级常驻节点(违架构「局态一律住 RunScope」)——会话更替零残留靠时序约定兜底 | `main.gd:175` `_begin_session` 内加 `_row_pacer.flush()` 一行(:49 现成公开面——机制保证会话更替即清队) | 审计 ④「_begin_session 内 flush 一行变机制保证」 | -| p5 | `board_generator.gd:396-398` 与 `reward_economy.gd:366-368` 两处 `_fatal`=push_error+assert(false)——release 模板剥离 assert 后退化为软回退(无 orchestrator 的 battle_result 封印兜底) | 两件 `_fatal` 各加可注入违约回调:`var fatal_handler: Callable`(缺省 `Callable()`=现行为逐字保持)+`_fatal` 体内 handler 有效则调用;组装点 `battle_orchestrator.gd:285/:290` 各接一行 `fatal_handler = _fatal`(orchestrator 自身 _fatal :1304 已带 battle_result 封印——协作件违约即传导封印=战斗中止,release 真中止成立) | 审计 ⑤「出包前需换真中止(可经宿主注入 fatal 回调)」——经组装层传导,零穿透三层、复用既有封印 | +| p5 | 两协作件 `_fatal`=push_error+assert(false),release 模板剥 assert 后退化软回退(`board_generator.gd:396-398`/`reward_economy.gd:366-368`);且 `RewardEconomy` 直持效果引擎——`_fx`(:20)、`_ctx`(:21)、`set_fx`(:24-26) 只为 :63-69 一处 `bias_rewards` 求和服役,该件类变量现行 15=gdstyle 阈值顶(基线无该键,第 16 枚即出闸 09 新增红) | **缝拆+fatal 通道,三处**:① `game/core/reward_economy.gd` 删 `_fx`/`_ctx`/`set_fx`,改注入 `var luck_bias_query: Callable`,保留 `var fatal_handler: Callable`(类变量 15−2+2=净 15);② `game/core/battle_fx_host.gd` 新增 `func luck_bias_for(cell_count: int) -> int`,把 `reward_roll` 发射与 `bias_rewards` 求和收回效果层(体内三参形 dispatch,见契约 7);③ `game/core/battle_orchestrator.gd` 组装点 `_reward_economy.set_fx(...)` 一行 → `_reward_economy.luck_bias_query = _fx_host.luck_bias_for`(1 换 1,行数不变),另在两件 new 之后各接一行 `fatal_handler = _fatal` | 审计 ⑤+2026-10-27 用户裁「缝拆+另立卡」;判定搬进已持该引擎的件=一处真迁移,禁为凑计数保留无效成员(契约 5) | | p6 | `rng_service.gd:100-103` `open_stream` 未知标签 push_error+assert 后**无 return**——release 剥 assert 后静默继续发号(违随机流纪律) | 补违约通道:`var violation_handler: Callable`(缺省现行为)+未知标签分支 handler 有效则调用+**`return null`**(合法路径零变化;release 下返回 null 使调用方即刻崩=fail-fast 传导);handler 注入使负路径 debug 可测(见 wr6) | 审计 ⑥「补 return 即闭合」+可测性(撤销证明口径) | | p7 | `rng_service.gd:104-106` `open_stream` 的 `_master_seed < 0` 分支=push_error+assert 后**同样无 return**(p6 同病根第二处,grilling 一轮点名、v1.3 用户裁并修)——未播种即取数在 release 剥 assert 后静默继续发号(违 EC7 与随机流纪律) | 未知标签通道同款:该分支复用 p6 的 `violation_handler`(handler 有效则调用,传用途标签)+**`return null`**(合法路径零变化;release 下调用方即刻崩=fail-fast 传导);违约取证落负面套件第 ③ 测试点(见 wr7) | 审计 ⑥同函数第二处;卡面 §9 L3 原停卡条款经用户裁转并修 | **完成定义**: -1. p1–p7 落地;合法路径闸按域选档处置闭合——本批属代码面(`game/` 下非 `.md`),验收=`tools/run_all_gates.sh --code`;**闸 09 现状不是绿**:09 静态扫描基线为迭代 38 带红合并时用户特批登记的存量红(`game/tests/.gates/baseline.json` 闸 09 `exit=1`、标记 `user-approved-iter38`),p5 接线两行加在 `battle_orchestrator.gd`(现 1313 行,基线 `max-file-length` 登记 1302)=同键继续恶化,p6/p7 给 `rng_service.gd` 加成员与两行是否出 NEW 键须实测(`gdstyle_gate.py` 的 SCAN_DIRS=core/data/presentation,不含 `game/tests/`,故新测试文件本身零影响)——**实现段开工前由用户二选一处置:随批还债(压缩该文件行数)或经批准刷新基线,禁以「闸 09 全绿」为完成定义**;其余闸段全绿; +1. p1–p7 落地;合法路径闸按域选档处置闭合——本批属代码面(`game/` 下非 `.md`),验收=`tools/run_all_gates.sh --code`;**本卡对闸 09 的义务=零新增**:`tools/gdstyle_baseline.txt` 一字不动(登记值只降不升,禁 `--refresh` 抬登记值换绿),`RewardEconomy` 类变量净 15(实测出第 16 枚=L3 停呈)、组装点 1 换 1 净增零行(两枚 fatal 接线按 T0 实测不得使 `battle_orchestrator` 的 `max-file-length` 较登记 1302 恶化,否则停呈)、p6/p7 给 `RngServiceCore` 加一枚成员实测零 NEW 键;闸 09 现行两条红(`battle_orchestrator` 行数、`level_map_screen` 类变量)属在册存量债,本卡不清零、不登记新值;其余闸段全绿; 2. wr 断言绿(负面套件三点=wr5 封印传导+缺省、wr6 未知标签违约通道、wr7 未播种违约通道;加 p2 锁域回归与 wr4 夹具断言); 3. 撤销证明四条(p1/p5/p6/p7 各一——§8.1,负面套件那三条按退出码口径判红);三份产出物写齐(T2)。 @@ -49,8 +50,10 @@ | D3 | [code-conventions](../design/engineering/code-conventions.md) §1(死代码/重复语句)+fail-fast 红线 | p1/p3/p5/p6 依据 | | D4 | 2026-10-26 用户令「全六件立项」 | 立项凭据 | | D5 | 2026-10-26 用户裁「把需求变更给修正确」(迭代 38 卡② 停卡呈报后)——批准 v1.3 两处载体修订=wr5/wr6/wr7 落独立负面套件+p7 并修 | 停卡修订凭据 | +| D6 | 2026-10-27 用户裁「缝拆+另立卡」(迭代 40 卡② 施工呈报 p5 原处方在 `RewardEconomy` 上顶破类变量阈值后) | p5 处方替换凭据 | +| D7 | [code-conventions](../design/engineering/code-conventions.md) §1.1(一类一职责/禁为机检保留无效成员)+§1.3(依赖单向)+§2.1(跨类调用契约成文)+迭代 40 卡① 契约 5(跨件单向接线、禁 RefCounted 环) | v1.4 缝拆合规凭据 | -## 3. 现状事实(2026-10-26 写卡会话实查,v1.3 复核轮按迭代 38 合回点 8ea7cfba 重锚行号——审计 2026-10-24 行号已按拆件后重定位;开工日 T0 复核行号) +## 3. 现状事实(2026-10-26 写卡会话实查,v1.3 复核轮按迭代 38 合回点 8ea7cfba 重锚行号——审计 2026-10-24 行号已按拆件后重定位;v1.4 补 S8 缝拆面实查,p5 落点件面按迭代 40 卡① 落定形态锚;开工日 T0 复核行号) | # | 事实 | 出处 | |---|---|---| @@ -61,20 +64,22 @@ | S5 | 两协作件 `_fatal`=push_error+assert(false) 两行(无兜底——board_generator 实址 :396-398,grilling 订正 v1.0 的 :391-393;reward_economy :366-368 准确);组装点在 orchestrator(:285 `BoardGenerator.new()`、:290 `RewardEconomy.new(db, rng)`);orchestrator 自身 `_fatal`(:1304)=push_error+`battle_result = "fatal_error"` 封印+assert(release 剥 assert 后封印仍在=唯一阻断面) | `game/core/board_generator.gd:396-398`;`game/core/reward_economy.gd:366-368`;`game/core/battle_orchestrator.gd:285/290/1304-1307` | | S6 | `open_stream` 未知标签分支(:101-103)push_error+assert 后直落 `_master_seed` 检查与发号——无 return;PURPOSE_TAGS 封闭词表(头注 EC12) | `game/core/rng_service.gd:100-112` | | S7 | 同函数 `_master_seed < 0` 分支(:104-106,2026-10-26 v1.3 复核码面仍在)=push_error+`assert(false, "未播种取数致命(EC7)")` 后同样无 return,直落 :107 起的取号与发号段——debug 下 assert 只中断当前函数、控制流回调用方,release 下剥 assert 后静默发号 | `game/core/rng_service.gd:104-112` | +| S8 | v1.4 缝拆面实查:`RewardEconomy` 类变量 15=:8-18 十一枚+:20/:21 两枚+`board_skew`(:191)+`_treasure_unlocked`(:306),恰在 gdstyle 阈值顶且基线无该键;`_fx`/`_ctx` 全仓唯一消费点=:66-69 的 `bias_rewards` 求和(`roll_board` 内,开流之后一步);`set_fx` 全仓唯一调用点=`battle_orchestrator.gd:295`,其余五处构造(`sim/reward_expectation.gd`+两测试)从不注入=删该法零外部破坏面;`DamageController`(:46/:47/:71,五枚事件 attack_commit/armor_roll/clamp_check/kill/damage_taken+计数器读写回写 :348/:354) 与 `ActionEconomy`(:44/:45/:50,三枚事件 dig_paid/dig_stop/charge_full) 同款直连——本卡不动,归新登记条目(§5 不做) | `game/core/reward_economy.gd:20-26/63-69/191/306`;`game/core/battle_orchestrator.gd:293-295`;`tools/gdstyle_baseline.txt`(键账实测) | ## 4. 设计契约(红线,违反 = L3 停机呈报) -🔴 **契约 1 · 改动面封闭**:p1–p7 只动 §1 所列行;合法路径(无违约输入)行为逐位不变——结算、随机发号、排播时序、角标同步零变化;p2 是唯一申报的行为改动(锁域归位)。 +🔴 **契约 1 · 改动面封闭**:p1–p7 只动 §1 所列行(v1.4 的 p5 含三处=`RewardEconomy` 成员替换、`BattleFxHost` 追加一枚公开方法、组装点一行换一行);合法路径(无违约输入)行为逐位不变——结算、随机发号、排播时序、角标同步零变化;p2 是唯一申报的行为改动(锁域归位)。 🔴 **契约 6 · 负面载体不得回落现役套件**(v1.3 停卡修订立):违约取证若被写回现役非负面套件,闸 02 必红且违 test-conventions §5 的显式标记要求——实装段禁自行「复用既有套件省事」。三测试点的回归态判据**只能取「改前改后真有差异」的可观测面**=handler 成员与调用点是否存在(记录位)、封印是否落;`return` 位与计数器读数在 debug 下两态不可判别(assert 先中断函数本体,控制流回调用方,`:107-108` 的推计数段谁也到不了),把它当运行期判据=假绿——p6/p7 的 `return` 走静态判据+grep 在位+评审注记(同 wr3 手法)。 -🔴 **契约 2 · 缺省零变化**:p5/p6 的 handler 缺省(`Callable()`)时两件 `_fatal` 与 `open_stream` 行为逐字等于现状——禁顺手改 push_error 文案与 assert 条件。 +🔴 **契约 2 · 缺省零变化**:p5/p6/p7 的 handler 缺省(`Callable()`)时两件 `_fatal` 与 `open_stream` 行为逐字等于现状;v1.4 的 `luck_bias_query` 缺省(`Callable()`)时 `luck_bias` 恒 0=现行逐位不变(现网无任何 `bias_rewards` 数据行,S8 实查);禁顺手改 push_error 文案与 assert 条件。 🔴 **契约 3 · 封印传导不绕**:p5 组装接线后,协作件违约必须经 orchestrator `_fatal` 落 battle_result 封印——禁另立第二中止通道。 🔴 **契约 4 · 排播语义不变**:p4 的 flush 只在会话更替时点清队——正常运行期排播节奏零变化(pacing_queue_test 回归)。 🔴 **契约 5 · 禁为机检文本保留无效成员**(req-card 第 13 条,本卡属定点重构类):禁为避免断言/清单更新保留死变量或重复句(p1 歧路拦截);机检键与本卡契约互斥时一律停卡呈报。 +🔴 **契约 7 · 发射面逐字同形**(v1.4 立):`luck_bias_for` 体内必须走 `engine.dispatch(counters_ctx, "reward_roll", {"polarity": "positive", "cell_count": cell_count})` 的**三参形**,**禁复用宿主 `fx_emit`**——那枚带第四实参 `_fx_fact`(`facts: Callable`),会打开订阅行 `when` 的事实条件读取面、命中集可变=契约 1 破。发射时点(开流之后、`_biased_cell_rows` 装配之前)、事件名、payload 键值三件逐字不变;取号序由 wr11 六组逐位 diff 兜。 ## 5. 范围边界 @@ -85,6 +90,7 @@ - orchestrator 自身 `_fatal` 改造(已有封印,审计未点); - run_all.gd/probe_gate.sh 挂死防护(闸壳件②——工程直改通道,另拆注); - confirm_dialog 的 open/close 方法本体(收口在调用面,方法语义不动)。 +- `DamageController`/`ActionEconomy` 两处 `_fx`/`_ctx`/`set_fx` 直连的「效果发射端口」化,以及 `BattleOrchestrator` 瘦身(卡① 后仍留 38 类变量,在册豁免登记中)、`RewardEconomy` 掷格面与受理账面分件——三条归待办清单「战斗域结构深拆批」条目(2026-10-27 登记,状态=待文档设计),本卡不裁端口形态、不裁件边界; ## 6. 关联文档同步面 @@ -92,7 +98,7 @@ |---|---|---| | `待办清单.md` | 来源条目状态:原「结构审查未立项小件候审」六件候审条目 2026-10-26 已并入「gdstyle 存量债全量清偿」条目波 7(本卡为其登记在册的现成卡),本卡出账随该条目波 7 推进,禁另立重复条目 | 反哺点 · 列清单(①:状态归属注记) | | `design/engineering/test-conventions.md` §5 | 负面套件豁免第 2 闸的规则**已在册、零修订预期**——本卡只是首次把「运行期违约通道取证」这条落位规则用满(先例三件在册);如复核认为该规则该升级为「违约通道类需求点必须落负面套件」的显式条款,列反哺点由文档批裁 | 反哺点 · 列清单(③:预期零改动注记) | -| [architecture](../design/engineering/architecture/architecture.md) 模块归属表 | p2/p4 若涉契约表述(单口纪律/RunScope 条款现行表述已覆盖——预期零改动;T0 核) | 反哺点 · 列清单(②:预期零改动注记) | +| [architecture](../design/engineering/architecture/architecture.md) 模块归属表+「战斗编排域拆件定稿」节 | p2/p4 涉单口纪律与 RunScope 条款(现行表述已覆盖,预期零改动);**v1.4 缝拆三处随动**=① B4 `reward_economy` 行「消费依赖」列现写 `effect_engine(事件发射 dispatch——上层消费基础层)`,缝拆后须改「经注入 Callable 向 BattleFxHost 取偏运合计」;② `BattleFxHost` 行职责/暴露面补该查询口;③「战斗编排域拆件定稿」跨件单向接线款补一枚注入 Callable | 反哺点 · 列清单(②:三处逐条列明;实现批禁写 design/,落文归文档批) | ## 7. 任务卡 @@ -105,23 +111,28 @@ | `game/presentation/views/confirm_dialog.gd` | p2 注释随修 :40-41(复用既有·修改) | 非行为(注释) | | `game/presentation/row_pacer.gd` | 零改动(flush :49 现成被消费) | — | | `game/core/board_generator.gd` | p5 handler 注入面(复用既有·修改) | 非行为(缺省零变化)→ wr5 | -| `game/core/reward_economy.gd` | p5 同上(复用既有·修改) | 非行为 → wr5 | -| `game/core/battle_orchestrator.gd` | p5 组装接线两行(:285/:290 后各一行)(复用既有·修改) | 非行为(接线)→ wr5 | +| `game/core/reward_economy.gd` | p5 `_fatal` handler 注入+v1.4 缝拆(删 `_fx`/`_ctx`/`set_fx`,增 `luck_bias_query`)(复用既有·修改) | 非行为(缺省零变化)→ wr5/wr10/wr11 | +| `game/core/battle_fx_host.gd` | p5 缝拆落点:追加公开方法 `luck_bias_for(cell_count)`(件由迭代 40 卡① 建,本卡只在件内加口)(复用既有·修改) | 非行为(判定搬运)→ wr10/wr11 | +| `game/core/battle_orchestrator.gd` | p5 组装接线:fatal 两行+`set_fx` 一行换 `luck_bias_query` 一行(1 换 1)(复用既有·修改) | 非行为(接线)→ wr5/wr10 | | `game/core/rng_service.gd` | p6 handler+return(未知标签分支)+p7 同款(未播种分支)(复用既有·修改) | 非行为(缺省零变化)→ wr6/wr7 | | `game/tests/unit/core/run_time_fatal_test.gd` | **新增负面套件**(wr5+wr6+wr7 三测试点;名系提案,终名属白名单 2 代拍板范围)(新增文件) | 断言面(退出码判据) | | `game/tests/run_all.gd` | manifest 登记一行 `expect=1, negative=true`(:73 先例同款) | 闸登记面 | | `game/tests/unit/battle_settlement/round_flow_skill_pool_test.gd` | **零改动**(v1.2 曾把 wr5 写进本件,v1.3 迁出——现役非负面套件禁承载违约取证) | — | +| `game/tests/unit/battle_settlement/variant_placement_test.gd` | p5 缝拆验收载体:追加三条 `Kit.check`(判定面/接线面/权重生效面,见 wr10)(复用既有·修改) | 断言面新增(零删改既有断言)→ wr10 | -(新增一处=运行期违约通道负面套件+manifest 登记一行;其余为既有件内成员/分支/行级改动,p5/p6/p7 是成员变量+分支段。) +(新增一处文件=运行期违约通道负面套件+manifest 登记一行;v1.4 另在 `battle_fx_host.gd` 追加一枚公开方法、在 `variant_placement_test.gd` 追加三条断言——均属既有件内的成员/方法/行级改动,无新文件) ### 接口块 -- **p5 形态**(两件同款):`var fatal_handler: Callable = Callable()`(成员声明,注释「违约中止通道——缺省退化 push_error+assert;组装层注入 orchestrator._fatal 经封印真中止」);`_fatal` 体内 assert 前 `if fatal_handler.is_valid(): fatal_handler.call(msg)`。 -- **p5 接线**:orchestrator 组装点 `:285`(`_board_generator = BoardGenerator.new()`)后 `_board_generator.fatal_handler = _fatal`、`:290`(`_reward_economy = RewardEconomy.new(db, rng)`)后 `_reward_economy.fatal_handler = _fatal`(行号=v1.3 按迭代 38 合回后 master 重锚;orchestrator 自身 `_fatal` 现址 :1304)。 +- **p5 形态(fatal 通道,两件同款)**:`var fatal_handler: Callable = Callable()`(成员声明,注释「违约中止通道——缺省退化 push_error+assert;组装层注入 orchestrator._fatal 经封印真中止」);`_fatal` 体内 assert 前 `if fatal_handler.is_valid(): fatal_handler.call(msg)`。 +- **p5 接线(fatal)**:`_board_generator = BoardGenerator.new()` 之后 `_board_generator.fatal_handler = _fatal`、`_reward_economy = RewardEconomy.new(db, rng)` 之后 `_reward_economy.fatal_handler = _fatal`;行号与现形按迭代 40 卡① 合回后 T0 重锚(`BattleOrchestrator` 自身 `_fatal` 的 battle_result 封印是唯一阻断面)。 +- **p5 缝拆·宿主侧形态**:`func luck_bias_for(cell_count: int) -> int`(落 `game/core/battle_fx_host.gd`)——体内按契约 7 三参形 dispatch,命中里取 `kind == "bias_rewards"` 的 `value` 求和返回,零命中返回 0。该件公开方法 11→12(阈值 20)、类变量不变。 +- **p5 缝拆·掷格侧形态**:`var luck_bias_query: Callable = Callable()`;头注按 code-conventions §2.1 成文(参数语义=本次 install 可掷格数、返回值=偏运权重加算量、消费方=`_biased_cell_rows` 入参、缺省空回调=恒 0);`roll_board` 内 :65-69 的五行合算改形为 `var luck_bias := 0` + `if luck_bias_query.is_valid(): luck_bias = luck_bias_query.call(list.size())`,调用位仍在开流之后、`_biased_cell_rows(luck_bias)` 之前。 +- **p5 缝拆·接线**:组装点 `_reward_economy.set_fx(_fx_host.engine, _fx_host.counters_ctx)` 一行 → `_reward_economy.luck_bias_query = _fx_host.luck_bias_for`(1 换 1;禁在掷格件内重建引擎引用)。 - **p6 形态**:`var violation_handler: Callable = Callable()`;未知标签分支=push_error + `if violation_handler.is_valid(): violation_handler.call(purpose)` + `assert(false, …)`(handler 有效时调用在 assert 前——debug 注入测试面可断言)+ `return null`。 - **p7 形态**(v1.3 新增):`_master_seed < 0` 分支同款——push_error + 复用 p6 的 `violation_handler`(有效则调用,传 purpose 标签)+ `assert(false, …)` + `return null`;缺省(不注入)时行为逐字等于现状(契约 2 同样约束 p7)。分支次序事实:未知标签检查(:101-103)在播种检查(:104-106)之前,故 p7 通道只能用**在册合法标签**触达。 - **wr5/wr6/wr7 三点**:全部落**一个新增负面套件** `game/tests/unit/core/run_time_fatal_test.gd`(extends SceneTree,退出码判据:全绿尾行 `quit(1)`、回归态 `quit(2)`——`extended_row_violation_test` 同款形态),manifest 登记 `{"path": …, "expect": 1, "negative": true}`。 - - **载体三纪律**(v1.3 复核轮钉死,违此即 L3 停呈):① **注入只经编排器组装点**(:285/:290 两行接线),**禁在测试体内手工 `bg.fatal_handler = oc._fatal`**——手工接线会让撤销证明②(回退组装点)空转;② 三测试点**各用新建 `RngServiceCore` 实例**,禁跨点复用、禁跑过取号后再播种(`set_master_seed` 自带 `assert(_counter == 0)`,:60——复用实例必炸在播种步);③ **回归态判据只能取「改前改后真有差异」的可观测面**——可差异的面只有两处:handler **成员与调用点是否存在**(记录位真假)与**封印是否落**。`return` 位与计数器读数在 debug 下不可判别:assert 已先中断 `open_stream` 本体,「装了 return」与「删掉 return」两态同样到不了 `:107-108` 的推计数段、同样表现为「拿不到可用 RNG」——**拿这两面当撤销证明=必假绿**;故 p6/p7 的 `return` 位按 wr3 同款「静态判据+代码评审注记(+grep 该分支 return 行在位)」承接,**禁写「违约行照发号/未播种照取号」式运行期判据**(照实装必触发 §9 L3 再停卡)。 + - **载体三纪律**(v1.3 复核轮钉死,违此即 L3 停呈):① **注入只经编排器组装点**(`_board_generator = BoardGenerator.new()`/`_reward_economy = RewardEconomy.new(db, rng)` 之后的 fatal 接线两行,行号按迭代 40 卡① 落定形态 T0 重锚),**禁在测试体内手工 `bg.fatal_handler = oc._fatal`**——手工接线会让撤销证明②(回退组装点)空转;② 三测试点**各用新建 `RngServiceCore` 实例**,禁跨点复用、禁跑过取号后再播种(`set_master_seed` 自带 `assert(_counter == 0)`,:60——复用实例必炸在播种步);③ **回归态判据只能取「改前改后真有差异」的可观测面**——可差异的面只有两处:handler **成员与调用点是否存在**(记录位真假)与**封印是否落**。`return` 位与计数器读数在 debug 下不可判别:assert 已先中断 `open_stream` 本体,「装了 return」与「删掉 return」两态同样到不了 `:107-108` 的推计数段、同样表现为「拿不到可用 RNG」——**拿这两面当撤销证明=必假绿**;故 p6/p7 的 `return` 位按 wr3 同款「静态判据+代码评审注记(+grep 该分支 return 行在位)」承接,**禁写「违约行照发号/未播种照取号」式运行期判据**(照实装必触发 §9 L3 再停卡)。 - ① wr5 封印传导(p5):装配构造真实编排器(V6 形态,`round_flow_skill_pool_test` 现成装配链可照抄)→ 违约经**组装点注入的** handler 传导 → 直调 `_board_generator._fatal("测试违约")` → 验 `oc.battle_result == "fatal_error"`(`_fatal` :1304 先落封印再 assert);**回归态**=组装点接线被移除 → 协作件违约不落封印 → `quit(2)`。 - ② wr6 未知标签违约通道(p6):新建实例 → 注入记录型 `violation_handler` → `open_stream("bogus_purpose")`(出词表)→ 验 handler **记录位为真**(判据主体)+拿不到可用 RNG;**对照**=新实例播种后取在册合法标签(`board_gen`)返回可用 RNG 且 `counter()` +1;**回归态判据**=handler 成员与调用点不存在(未实装 p6 形态)时注入无处可注 → 记录位守不住 → `quit(2)`;`return` 位本体不可观测,走 grep 在位+评审注记。 - ③ wr7 未播种取数通道(p7):新建实例**不播种**(`_master_seed` 缺省 -1,:23)→ 注入 handler → `open_stream("board_gen")`——**必须用在册合法标签**:`PURPOSE_TAGS`(:9)不含 `adventure`,且未知标签检查排在播种检查之前,出错标签会让本点退化成测试点②(撤销证明④空转);验 handler **记录位为真**+拿不到可用 RNG;**对照**=同标签播种后照常取号;**回归态判据**=该分支 handler 调用点缺失 → 记录位守不住 → `quit(2)`;`return` 位同走静态面。 @@ -132,30 +143,31 @@ ### 落位与可复用性预检 - **新增件一处**:`game/tests/unit/core/run_time_fatal_test.gd`(运行期违约通道负面套件)——**为什么必须新增**=违约取证必产不可捕获的 SCRIPT ERROR 行,现役非负面套件被闸 02 扫描覆盖,落位无处可复用(req-card 第 13 条落位预检的答题;闸侧 `negative=true` 豁免机制与 `extended_row_violation_test` 形态照抄,闸件本身零改动)。其余全部为既有件内成员/分支/行级改动;flush/pending_rows 复用 row_pacer 现成公开面。 -- **复用面**:p5 复用 orchestrator 既有 `_fatal` 封印(不造第二中止机制——审计「可经宿主注入」的最小实现);p4 复用 flush();p2 复用 ModalFlow 单口既有编排;p7 复用 p6 的 `violation_handler` 成员(不新开第二回调面);负面套件复用 run_all 的 `negative` 豁免通道。 -- **唯一面**:违约通道各件唯一(`fatal_handler` 两件各一处;`violation_handler` rng_service 单件一处、覆盖未知标签与未播种两条分支;组装接线单点);confirm 开合收口后单口唯一。 -- **分层**:core 件零 UI 依赖不破(Callable 注入非 UI 引用;组装接线在 core 内层间);presentation 收口经既有 ModalFlow。 +- **复用面**:p5 复用 orchestrator 既有 `_fatal` 封印(不造第二中止机制——审计「可经宿主注入」的最小实现)+复用 `BattleFxHost` 既有的 `engine`/`counters_ctx` 持有(判定搬进已持该引擎的件,不新建宿主、不新开第二处引擎引用);p4 复用 flush();p2 复用 ModalFlow 单口既有编排;p7 复用 p6 的 `violation_handler` 成员(不新开第二回调面);负面套件复用 run_all 的 `negative` 豁免通道。 +- **唯一面**:`bias_rewards` 判定全仓单点(从掷格件搬进宿主件一枚公开方法,掷格件只留 `luck_bias_query` 一处回调);违约通道各件唯一(`fatal_handler` 两件各一处;`violation_handler` rng_service 单件一处、覆盖未知标签与未播种两条分支;组装接线单点);confirm 开合收口后单口唯一。 +- **分层**:core 件零 UI 依赖不破(Callable 注入非 UI 引用;组装接线在 core 内层间);v1.4 注入方向单点——`RewardEconomy` 指 `BattleFxHost` 的公开方法,宿主不持掷格件引用=禁 RefCounted 环(同迭代 40 卡① 契约 5);presentation 收口经既有 ModalFlow。 ### T0 事实坐实(≈0.1d) -- [ ] 复核 S1–S7(重点:S2 ModalFlow.open 与 confirm_dialog.open 先后序、S6/S7 两分支现行行号、wr2 探针段定位);确认 pacing 回归面与 `round_flow_skill_pool_test` 装配链(wr5 ① 照抄用)。可核查结果:定位清单进实现报告素材。 +- [ ] 复核 S1–S8(重点:S2 ModalFlow.open 与 confirm_dialog.open 先后序、S6/S7 两分支现行行号、S8 的 `RewardEconomy` 类变量现值与 `_fx`/`_ctx` 消费点);p5 面按迭代 40 卡① 落定形态重锚(`battle_fx_host.gd` 是否已建、`BattleFxHost` 公开方法计数、组装点现形与行号);确认 pacing 回归面与 `round_flow_skill_pool_test` 装配链(wr5 ① 照抄用);采改前 dump 基线=`sim/dump_battle.gd` 六组(种子 {42, 779401, 779501}×关卡 {1, 2})JSONL 留盘(wr11 对照)。可核查结果:定位清单+改前六组基线路径进实现报告素材。 ### T1 定点修六件+负面套件(≈0.5d) - [ ] 实装 p1/p3/p4(删句/防护/flush)+wr4 带夹具断言。可核查结果:grep 死变量与重复组零命中(:123-124 保留段除外);pacing_queue_test 直跑绿;wr4 断言绿。 -- [ ] 实装 p5/p6/p7(handler 面+接线+两分支 return)。可核查结果:缺省形态断言绿(契约 2);负面套件三测试点尚未建时先直跑 rng/board_generator 相关现役套件确认合法路径零红。 +- [ ] 实装 p5 缝拆三处(掷格件成员替换+宿主查询口 `luck_bias_for`+组装点一行换一行,体内按契约 7 三参形)。可核查结果:`RewardEconomy` 类变量实测 15(`python tools/gdstyle_gate.py` 直扫零 NEW 键、`tools/gdstyle_baseline.txt` 零改动);`bias_rewards` 判定单点在 `battle_fx_host.gd` 在位;缺省态(不注入)`roll_board` 输出与改前逐字同。 +- [ ] 实装 p5 fatal 通道+p6/p7(两件 `fatal_handler` 面+组装接线两行+rng 两分支 handler 与 `return null`)。可核查结果:缺省形态断言绿(契约 2);负面套件三测试点尚未建时先直跑 rng/board_generator 相关现役套件确认合法路径零红。 - [ ] 建负面套件 `run_time_fatal_test.gd` 三测试点+`run_all.gd` manifest 登记一行(`expect=1, negative=true`)+**新件的 `.gd.uid` 边车随批入库**(`.gitignore:6`「.uid 必须提交」——迭代 38 卡④ 曾漏带边车留未跟踪态)。可核查结果:本件直跑退出码恰 1;闸 02 对本件不判红(负面豁免生效);登记行与 `:73` 先例形态逐字段一致;`git status` 无残留 `?? *.uid`。 - [ ] 实装 p2(confirm 三处收口+注释)。可核查结果:wr2 回归绿;grep `confirm_dialog.open(`/`.close()` 直调仅剩方法定义与收口内调用。 - [ ] 验证步骤:全套闸按域选档跑一次全绿。 ### T2 撤销证明+产出物落位卡(≈0.15d,末卡) -- [ ] 撤销证明四条:①回退 p1 hunk(死变量还原)→ grep `battle_live` 命中即红;②回退 p5 组装点接线两行 → 协作件违约不落封印 → 本件退出码 0 ≠ expect 1(wr5 测试点① `quit(2)`)→ 还原复绿;③回退 p6 hunk(handler 成员与调用点整体不存在→注入无处落)→ wr6 记录位守不住 → 退出码非 1 → 还原复绿;④回退 p7 hunk(同上,针对未播种分支调用点)→ wr7 记录位守不住 → 退出码非 1 → 还原复绿。**三条负面套件套一律以退出码为判据,禁写「断言变红」式口径**(assert 不改进程退出码,红只落在 `quit(2)`);p6/p7 的 `return` 位不作运行期判据(debug 下两态不可判别,见契约 6),以「grep 该分支 return 行在位+代码评审注记」出证并在实现报告如实标注观测面局限。记录进实现报告。 -- [ ] 清单同步:`python tools/extract_checks.py --extract --force` 重生成 `game/tests/验证集清单.md`(清单已存在时无 `--force` 拒写并返 2),再 `--diff` 对账零差异。**预期零新增行**:提取器只认 `check(` 形态,负面套件以 `quit()` 承载、`extended_row_violation_test` 在册先例即零 check 行;新件仍会进清单头部的源文件列表——该变化不算断言新增,禁为凑行去补 `Kit.check`。 +- [ ] 撤销证明五条:①回退 p1 hunk(死变量还原)→ grep `battle_live` 命中即红;②回退 p5 组装点 fatal 接线两行 → 协作件违约不落封印 → 负面套件退出码 0 ≠ expect 1(wr5 测试点① `quit(2)`)→ 还原复绿;③回退 p6 hunk(handler 成员与调用点整体不存在→注入无处落)→ wr6 记录位守不住 → 退出码非 1 → 还原复绿;④回退 p7 hunk(同上,针对未播种分支调用点)→ wr7 记录位守不住 → 退出码非 1 → 还原复绿;⑤删 p5 缝拆的组装注入一行(`luck_bias_query` 停为缺省 `Callable()`)→ wr10 ②③ 断言红(① 测宿主面不红,恰证判据钉在接线上)→ 还原复绿。**三条负面套件套一律以退出码为判据,禁写「断言变红」式口径**(assert 不改进程退出码,红只落在 `quit(2)`);p6/p7 的 `return` 位不作运行期判据(debug 下两态不可判别,见契约 6),以「grep 该分支 return 行在位+代码评审注记」出证并在实现报告如实标注观测面局限。记录进实现报告。 +- [ ] 清单同步:`python tools/extract_checks.py --extract --force` 重生成 `game/tests/验证集清单.md`(清单已存在时无 `--force` 拒写并返 2),再 `--diff` 对账零差异。**预期新增三条**(wr10 判定面/接线面/权重生效面,落 `variant_placement_test.gd`,均为 `Kit.check` 形态);负面套件仍以 `quit()` 承载、零 check 行(`extended_row_violation_test` 在册先例),新件进清单头部源文件列表不算断言新增,禁为凑行补 `Kit.check`。 - [ ] 写齐三份产出物(实现报告〔六件逐件核对表+wr 断言读数+实机目检总清单——选档删除确认流目检一项(p2 锁域归位后行为目检)〕/代拍板追认单/反哺点清单〔§6 逐条落点〕)。 - [ ] 合并前置:独立验收审计(§8.3)逐行「通过」。 -**估时合计 ≈0.85d**(v1.3 停卡修订随增 ≈0.1d=负面套件新件+manifest 登记+清单对账;p7 并修增量落在同一 handler 形态内,随增 0)。编排注记:六件皆小而独立——与卡 A 同迭代分波无冲突;p2 有锁域行为面(wr2 回归是合并前置);**v1.3 起验收载体已定死为负面套件,编排段与实现段禁再把 wr5/wr6/wr7 挪回现役套件**。 +**估时合计 ≈1.0d**(v1.3 ≈0.85d + v1.4 缝拆增量 ≈0.15d=宿主查询口一枚、掷格件成员替换、wr10 三条断言、dump 六组改前基线采集与批末 diff;p7 并修增量落在同一 handler 形态内,随增 0)。编排注记:六件皆小而独立——与卡① 同迭代按卡序施工(p5 硬前置见 §0);p2 有锁域行为面(wr2 回归是合并前置);**v1.3 起验收载体已定死为负面套件、v1.4 起 p5 已定死为缝拆三处,编排段与实现段禁再把 wr5/wr6/wr7 挪回现役套件、禁改回「只加 fatal_handler」的老处方**。 ## 8. 验证闸 @@ -167,37 +179,39 @@ | wr2 confirm 收口锁域归位(p2) | main_overlay_flow.gd:88+main.gd:311/320 | save_select/confirm 回归探针段〔wr2〕+锁域断言 | 探针 | 选档删除确认真实流(探针驱动) | 回退 p2 hunk → 收口判据 grep 命中即红+锁域断言红 | | wr3 入口 null 防护(p3) | main.gd:721/748 前置防护 | 防护分支单测/静态判据〔wr3〕(防护态构造经探针锁谓词异常态不可达——静态面+代码评审注记申报) | 静态 | — | 回退 p3 hunk → grep 防护行零命中红 | | wr4 会话 flush(p4) | main.gd:175 一行 | pacing_queue_test+会话更替断言〔wr4〕(新增:**前置夹具入队若干行再调 begin_session**,断言其后 pending_rows()==0——无夹具则改前改后皆绿钉不住〔grilling 订正〕) | 单元 | _begin_session 真实调用路径+enqueue 真实入队面 | 回退 p4 hunk → 带夹具断言红(残留非零) | -| wr5 fatal 封印传导(p5) | 两件 handler+orchestrator 组装点接线(:285/:290) | 负面套件测试点①(含缺省形态断言;注入只经组装点,禁测试内手工接线)〔wr5〕 | 单元(负面) | V6 装配构造真实编排器路径 | 回退接线两行 → 本件退出码 0 ≠ expect 1(T2②) | +| wr5 fatal 封印传导(p5) | 两件 handler+orchestrator 组装点 fatal 接线两行(行号按卡① 形态 T0 重锚) | 负面套件测试点①(含缺省形态断言;注入只经组装点,禁测试内手工接线)〔wr5〕 | 单元(负面) | V6 装配构造真实编排器路径 | 回退接线两行 → 本件退出码 0 ≠ expect 1(T2②) | | wr6 未知标签违约通道(p6) | rng_service 未知标签分支 handler+return | 负面套件测试点②(handler 记录位为判据主体+拿不到可用 RNG+在册标签对照)〔wr6〕 | 单元(负面) | open_stream 真实调用路径 | 回退 p6 hunk(成员与调用点整体消失→注入无处落)→ 记录位守不住 → 退出码非 1(T2③);`return` 位=grep 在位+评审注记(debug 下两态不可判别,禁当运行期判据) | | wr7 未播种取数通道(p7) | rng_service 未播种分支 handler+return | 负面套件测试点③(在册合法标签+不播种实例;handler 记录位+拿不到可用 RNG+播种对照)〔wr7〕 | 单元(负面) | 未播种的 open_stream 真实路径 | 回退 p7 hunk(该分支调用点缺失)→ 记录位守不住 → 退出码非 1(T2④);`return` 位同走静态面 | | wr8 负面载体登记 | 新件+`run_all.gd` manifest 一行 | 登记行在位判据〔wr8〕(`expect=1` 与 `negative=true` 两字段齐备,静态 grep+评审注记——全仓无闸对账盘上测试文件与 manifest,禁写「删登记行即红」的不存在判据)+闸 02 对本件不判红+验证集清单 --diff 零差异 | 闸登记 | run_all 真实批跑路径 | 删 `negative=true` 标记而保留登记行 → 本件输出被闸 02 捕获判 FAIL | | wr9 产出物 | T2 三份 | 件核〔wr9〕 | — | — | 缺项红 | +| wr10 偏运判定收口+注入接线(p5 缝拆) | `battle_fx_host` 新增 `luck_bias_for`+`reward_economy` 成员替换+组装点一行换一行 | `variant_placement_test.gd` 三条断言:①判定面=夹具经宿主 engine 装载一枚 `reward_roll`→`bias_rewards value=2` 订阅(现网无此类数据行,白盒装载先例=`tree_rules_v11_test` 读 `_triggers`),断言 `oc.fx_host().luck_bias_for(4) == 2` 且空订阅 == 0;②接线面=真装配编排器断言 `oc._reward_economy.luck_bias_query.is_valid()` 且与 `oc.fx_host().luck_bias_for` 同源;③权重生效面=`eco._pool_weight(eco._biased_cell_rows(eco.luck_bias_query.call(4))) == 77 + 4 * 2`(与现役 :238-241 白盒合成序断言同值)〔wr10〕 | 单元 | 编排器 `_init` 组装链+`begin_battle` 真链 | 删组装注入一行 → `luck_bias_query` 无效 → bias 恒 0 → ②③ 红(① 不红恰证判据钉在接线上)→ 还原复绿(T2⑤) | +| wr11 合法路径逐位(p5 缝拆总断言,兜契约 1/契约 7) | p5 缝拆三处的改动总和(总断言行,无独立改动) | `sim/dump_battle.gd` 六组(种子 {42, 779401, 779501}×关卡 {1, 2})批末复跑与 T0 改前 JSONL 逐行 diff——非空即红,零新码(迭代 40 卡① wr10 同款机制)〔wr11〕 | 集成 | `--script res://sim/dump_battle.gd` 直跑(关卡×种子矩阵) | 回退任一缝拆 hunk → 复跑出差异(发射面或取号序变)→ 还原复绿 | ### 8.2 测试削弱申报 -零(既有断言零改动;新增断言四条=wr4 夹具断言+wr2 锁域断言(若现役未覆盖)+负面套件内两处缺省形态断言,其中违约三点以退出码承载、非 `Kit.check` 形态;wr5/wr6/wr7 由现役套件迁至独立文件属**载体迁移**,被迁走的断言在 v1.2 从未合回 master,不存在削弱既有验证面;wr3 防护分支不可达性以静态判据+申报承载——不虚构不可达态的运行期断言)。 +零(既有断言零改动;新增断言七条=wr4 夹具断言+wr2 锁域断言(若现役未覆盖)+wr10 三条(判定面/接线面/权重生效面,`Kit.check` 形态进清单)+负面套件内两处缺省形态断言,其中违约三点以退出码承载、非 `Kit.check` 形态;wr5/wr6/wr7 由现役套件迁至独立文件属**载体迁移**,被迁走的断言在 v1.2 从未合回 master,不存在削弱既有验证面;wr3 防护分支不可达性以静态判据+申报承载——不虚构不可达态的运行期断言;wr11 复用既有 `sim/dump_battle.gd`,零新码零删改)。 ### 8.3 独立验收审计 -入口=未参与实现的会话或子代理;报告落 `reports/iter-验收审计-<日期>.md`(多卡同批须带卡号位防撞名);抽查重点=契约 1/2(合法路径逐位不变——缺省形态断言在案)、p2 锁域回归读数、p5 接线单点、p6/p7 两分支 return 位置(assert 语义保持)、**契约 6 与载体三纪律四判据**=① manifest 的 `negative=true`+`expect=1` 在册;② 三测试点回归态判据真能变红且**只取有差异面**(变异注入实测:抹掉 handler 成员与调用点/拆掉组装接线 → 退出码非 1;若审计发现判据落在 `return` 位或计数器这类 debug 下两态不可辨的面=阻断,防假绿);③ 注入面只在编排器组装点(`grep fatal_handler` 在测试文件内零命中——防撤销证明②空转);④ 三测试点各用新建实例(复用实例会撞 `assert(_counter == 0)`,撞即证纪律失效)。未过不得合并。 +入口=未参与实现的会话或子代理;报告落 `reports/iter-验收审计-<日期>.md`(多卡同批须带卡号位防撞名);抽查重点=契约 1/2(合法路径逐位不变——缺省形态断言在案)、p2 锁域回归读数、p5 接线单点、p6/p7 两分支 return 位置(assert 语义保持)、**契约 6 与载体三纪律四判据**(见 v1.3 段)、**v1.4 缝拆三判据**=①`luck_bias_for` 体内 dispatch 为三参形(`grep` 宿主件内该方法体零 `fx_emit` 复用、零第四实参);②`RewardEconomy` 类变量实测 15(`python tools/gdstyle_gate.py` 现算与 `tools/gdstyle_baseline.txt` 逐字节零变化,禁以 --refresh 换绿);③wr10 三条断言非空转(夹具装载订阅命中数 >0 前置写在断言消息里,命中为 0 即 L3;防「扫描面为空照样绿」)。未过不得合并。 ## 9. 异常分级 - **L1(自救)**:p2 收口先后序形态;p5/p6/p7 注释措辞;断言挂点与负面套件事件命名(在 `*_violation_test`/`*_fatal_test` 既有约定内)。 - **L2(记录继续)**:行号漂移;manifest 登记行的注释尾缀现位变化。 -- **L3(停机呈报)**:ModalFlow.open 与 confirm_dialog.open 语义冲突(双显示/挂起兜底破坏确认流——收口形态失配停呈);p4 flush 引入排播节奏变化(契约 4 破);p5 接线后协作件违约不落封印(传导断链);发现第三处 `_fatal` 同型软回退(审计清单外);负面套件三测试点的回归态判据不变红(抹掉 handler 成员与调用点、或拆掉组装接线后本件仍出 1——说明判据取到了 debug 下两态不可辨的面,停呈禁改落位自救);出现测试体内手工接线(违载体纪律①,撤销证明②会空转);跨测试点复用同一 rng 实例致播种撞 `assert(_counter == 0)`(违纪律②——改正方向是每点新建实例,禁动播种断言)。 +- **L3(停机呈报)**:ModalFlow.open 与 confirm_dialog.open 语义冲突(双显示/挂起兜底破坏确认流——收口形态失配停呈);p4 flush 引入排播节奏变化(契约 4 破);p5 接线后协作件违约不落封印(传导断链);发现第三处 `_fatal` 同型软回退(审计清单外);**v1.4 新增三条**=p5 缝拆后 dump 六组出差异(=发射面或取号序被动,契约 1/7 破);`RewardEconomy` 类变量实测出第 16 枚、或 fatal 接线使 `battle_orchestrator` 的 `max-file-length` 较登记 1302 恶化(禁抬基线,停呈由用户裁拆法);wr10 ① 夹具装载的订阅命中为 0(判据空转,停呈禁改判据自救);负面套件三测试点的回归态判据不变红(抹掉 handler 成员与调用点、或拆掉组装接线后本件仍出 1——说明判据取到了 debug 下两态不可辨的面,停呈禁改落位自救);出现测试体内手工接线(违载体纪律①,撤销证明②会空转);跨测试点复用同一 rng 实例致播种撞 `assert(_counter == 0)`(违纪律②——改正方向是每点新建实例,禁动播种断言)。 - v1.2 曾列的「p6 同函数 master_seed<0 分支(:104-106)单通道停卡呈报」条款**已由用户裁并修,随 v1.3 出账**(转 §1 p7+wr7);同型第四处仍走本条停呈通道。 ## 10. 代拍板白名单(超清单必呈报) -1. p5/p6/p7 成员命名与注释措辞(p7 复用 p6 的 `violation_handler`,禁另开第二成员)。 +1. p5/p6/p7 成员命名与注释措辞(`fatal_handler`/`violation_handler` 沿用 v1.3;p7 复用 p6 的 `violation_handler`,禁另开第二成员);**v1.4 的 `luck_bias_query`/`luck_bias_for` 两名已由用户 2026-10-27 钉死,禁改名**,注释措辞可自定;wr10 ① 判定面夹具的装载形态(`_push_trigger` 白盒装载或等价现成口)在 `tree_rules_v11_test` 先例内自选。 2. wr 断言挂点与消息文本、负面套件文件名终名(提案名 `run_time_fatal_test.gd`,须落 `*_violation_test`/`*_fatal_test` 既有约定内)。 3. p2 收口的先后序实现形态(ModalFlow.open 语义 T0 核后定形)。 4. 提交切分与 worktree 分支命名。 ## 11. 待裁点 -**零待裁点,开工门=U0。** 灰色推导四处(呈报可否决,随 T2 反哺点):①p5 走「组装层传导 orchestrator 封印」而非回调穿透到 presentation——依据=core 件零 UI 依赖红线+复用既有封印零新中止机制;②wr3 防护分支验收用静态判据不造运行期断言——依据=分支在锁谓词正常态不可达,虚构异常态夹具违背「真实入口」口径;③wr5/wr6/wr7 载体取独立负面套件而非改造闸 02 扫描规则——依据=闸豁免机制本为此设且已在册三件先例,改扫描规则属动闸件(工程改动面)且会削弱「断言不终止进程」的防假绿能力(test-conventions §5 三硬闸的存在理由);④p7 并修而非另立——依据=用户 2026-10-26 裁(实现报告 §三建议案),且 p7 与 p6 同函数同形态、复用同一 handler 成员,改动面仍封闭在 §1 所列行内(违不违契约 1 的答案=不违,因契约 1 的名单随 v1.3 扩到 p7)。 +**零待裁点,开工门=U0。** 灰色推导六处(呈报可否决,随 T2 反哺点):①p5 走「组装层传导 orchestrator 封印」而非回调穿透到 presentation——依据=core 件零 UI 依赖红线+复用既有封印零新中止机制;②wr3 防护分支验收用静态判据不造运行期断言——依据=分支在锁谓词正常态不可达,虚构异常态夹具违背「真实入口」口径;③wr5/wr6/wr7 载体取独立负面套件而非改造闸 02 扫描规则——依据=闸豁免机制本为此设且已在册三件先例,改扫描规则属动闸件(工程改动面)且会削弱「断言不终止进程」的防假绿能力(test-conventions §5 三硬闸的存在理由);④p7 并修而非另立——依据=用户 2026-10-26 裁(实现报告 §三建议案),且 p7 与 p6 同函数同形态、复用同一 handler 成员,改动面仍封闭在 §1 所列行内(违不违契约 1 的答案=不违,因契约 1 的名单随 v1.3 扩到 p7);⑤**v1.4** `luck_bias_for` 不带第四实参 facts——依据=逐位不变优先于「顺手把事实面接通」,接通 facts 会打开订阅行 `when` 条件面,其归位属端口设计题(归新登记条目);⑥**v1.4** wr10 ① 判定面用白盒装载订阅——依据=现网 `game/data/tables/` 无任何产出 `bias_rewards` 的行(S8 实查),走真实内容行无处可取,白盒装载有 `tree_rules_v11_test` 在册先例;代价随 T2 反哺点呈报(`bias_rewards` 词汇进宿主层一行)。 ## 12. 自审六查与复核记录 @@ -210,3 +224,5 @@ **迭代 38 实现段停卡呈报(2026-10-26,非复核件·上游缺陷移交)**:p1–p6 实装完成后,wr5/wr6 落位核查发现 v1.2 处方不成立——headless 下 `assert` 失败必产 `SCRIPT ERROR`、不可捕获且只中断当前函数,而 `run_all.gd` 对非负面套件的判定是「输出含该标记即 FAIL」(闸 02,test-conventions §5 三硬闸之二),故「wr5/wr6 绿+全套闸全绿」在同一跑次内互斥。改动全数还原、零提交(WIP 补丁 172 行留 `C:/Users/DK/AppData/Local/Temp/iter38_card2_wip.patch`;重启按合回后 master 重核行号重做,禁直接 apply)。同款缺陷卡④ 在 grilling 一轮已撞见并以独立负面套件承载(`extended_row_violation_test`,manifest `expect=1, negative=true`)——卡② 两轮复核未复现该判点,因直跑单套件不经过闸 02 扫描,只有批末全量闸才暴露。 **v1.3 裁定与判据(2026-10-26,用户裁「把需求变更给修正确」)**:①违约取证(wr5/wr6/wr7)只落**一个新增负面套件**+manifest 显式登记 `expect=1, negative=true`,现役非负面套件零改动;②`master_seed < 0` 分支经用户裁并修,立为 p7+wr7;③p7 触达前提是播种检查排在未知标签检查之后,故测试点③必须在册合法标签;④回归态判据只取 debug 可观测面,release 独有位走静态判据+评审注记;⑤载体三纪律(组装点注入/每点新建实例/禁手工接线)与撤销证明四条(①grep 面,②③④退出码面)为完成定义;⑥估时 ≈0.85d;⑦闸 09 现为迭代 38 特批存量红,本批开工前须由用户裁「还债或刷新基线」,禁以「闸 09 绿」为完成条件;⑧件②独立卡已随迭代 38 卡① 合回退役,来源指址改 git 提交号;⑨条目归属随「gdstyle 存量债全量清偿」波 7。 + +**v1.4 用户裁定与现行口径(2026-10-27)**:迭代 40 卡② 施工至 p5 时实测 `RewardEconomy` 类变量 15=gdstyle 阈值顶(`tools/gdstyle_baseline.txt` 无该键,第 16 枚即闸 09 新增 FAIL),v1.3 处方「加 fatal_handler 一枚」在该件不可实现;基线只降不升,禁登记 16 抵账。现行口径=①p5 定三处(成员替换、`bias_rewards` 判定收回 `BattleFxHost` 公开方法、组装点一行换一行),`RewardEconomy` 类变量净 15;②p5 硬前置=迭代 40 卡①(落点件由该卡建);③闸 09 义务=零新增,登记值只降不升(v1.3 完成定义里的「还债或经批准刷新基线」二选一与此口径冲突,已废);④验收加 wr10(三条 `Kit.check`)与 wr11(`sim/dump_battle.gd` 六组逐位);⑤端口化与宿主瘦身、掷格/受理分件三条不属本卡,落待办清单「战斗域结构深拆批」条目(状态=待文档设计);⑥已知代价随 T2 反哺点呈报=`bias_rewards` 词汇进宿主层一行,端口化后归位。 diff --git a/待办清单.md b/待办清单.md index 6942a0c7..fc8c0dd8 100644 --- a/待办清单.md +++ b/待办清单.md @@ -20,6 +20,20 @@ **状态**:文档设计已闭合+已写卡+已编迭代 40+已编迭代 41 +#### 战斗域结构深拆批——效果发射端口+宿主瘦身+掷格/受理分件(2026-10-27 登记,来源=批次移交) + +**实况**:三条同病根的结构债,需先一次设计讨论定端口形态,再谈切卡;`RewardEconomy` 的最小缝拆样本已由迭代 40 卡② 落卡。 +- 效果发射端口(设计题本体):`game/core/damage_controller.gd:46/47/71` 与 `game/core/action_economy.gd:44/45/50` 仍直持 `EffectEngine`+`EffectContext`——前者用 attack_commit/armor_roll/clamp_check/kill/damage_taken 五枚事件并带计数器读写回写(:348/:354),后者用 dig_paid/dig_stop/charge_full 三枚事件。`RewardEconomy` 同款直连只服务一枚 `bias_rewards` 求和,已由 reports/需求卡片-结构小件定点修批-2026-10-26.md v1.4 的 p5 缝拆成单枚查询口(成员 −2+2、类变量净 15)——最小样本成立;另两处事件多且带计数器回写,缝拆不成立,必须先设计「业务类只持一个回调、取回命中批」的端口形态。 +- battle_orchestrator 瘦身:迭代 40 卡① 拆出 `BattleFxHost`/`RewardGrant` 后宿主仍留 38 类变量(阈值 15;卡① §11 裁决记录④ 按「改善非清零」为该类变量键立了在册豁免——豁免不等于了结),`tools/gdstyle_baseline.txt` 在册 `game/core/battle_orchestrator.gd|quality/max-class-variables = 50` 与 `|quality/max-file-length = 1302` 两键,实际计数与行数以卡① 合回后实测重锚。 +- reward_economy 分件:`RewardEconomy` 现 15 类变量恰在阈值线上(加第 16 枚即出闸 09 新增红——迭代 40 卡② 施工实测撞见,正是本条登记起因),掷格面(install 期 roll/池行装配/权重合成)与受理账面(grant/身份查询/快照/retire)两职责同居一件。 +- 相关文档:design/engineering/architecture/architecture.md(系统分层图与功能层 B1/B4 行、「战斗编排域拆件定稿」节须随端口定稿改写)· reports/审计-gdstyle存量债清点与清偿方案-2026-10-26.md(216 键波次方案与残留债口径;在册「尾波」只覆盖迭代 39 三宿主,不含本条)· reports/需求卡片-结构小件定点修批-2026-10-26.md v1.4(缝拆样本与 2026-10-27 用户裁记载于该卡 §12) + +**缺口**:效果发射端口形态未定稿(一枚回调的束形与返回值、计数器读写回写与 facts 取值的归属面、`bias_rewards` 等域词汇是否留在宿主层、是否与 `BattleFxHost` 同件承载);宿主保留面与掷格件的职责边界(哪些成员随件迁出、件怎么切)未裁定——需一次设计讨论并落 architecture.md 后才能写卡。 + +**改动面**:游戏代码 + +**状态**:待文档设计 + #### 波 0:gdstyle 基线刷新——清 18 陈旧键+登记迭代 40 还债水位(2026-10-27 登记,来源=会话提及) **实况**:证据=`tools/gdstyle_baseline.txt` 存量登记 234 键中有 18 条陈旧键不命中当前盘面(迭代 37 重构已消、键未清)+迭代 38 特批带红合并的恶化债(git 提交 c4c69701)待迭代 40 还债归绿——刷新后账本对齐现实。人工 `python tools/gdstyle_gate.py --refresh` 一次,清陈旧键 18 条(骤降 18/234≈7.7% 低于 10% 守卫线无需 --force)+登记迭代 40 还债后的新水位(卡① battle_orchestrator 行数归绿、卡① settlement_table 拆段后的键账变化)。**执行时点=迭代 40 合回 master 之后、用户发令**(「gdstyle 存量债全量清偿」条目清点报告波 0 行同源);处迭代 40 与 41 之间的固定动作,完成即删本条目。