收尾(迭代40批后): 反哺点13条落文凭据核对+产出物退役十件+账面换代——①退役删十件: iter40四产出物(实现报告§七收口口径承载审计结论=通过后随批退役/代拍板/反哺点/验收审计)+通关口径换代批四产出物(2026-10-26更旧残留,同表过判据:反哺零落文义务③④⑤随批完成/代拍板属白名单内备案确认/审计通过批末回执green)+两张需求卡(死期=迭代40合回master 514457d1);②判据链: 反哺13条已全落(git 37007552: architecture v1.22 A1-A4+B2/test-conventions §5.6违约通道条款与§8.4两禁令/待办C1波1+波7出账·C2深拆重锚38/1036·C4挂死实证/roadmap C3估时6.375),D组四条随卡片退役消解;代拍板第7条用户裁处置甲(变异类取证标注结论仅参考)、第1-6条随用户本人执行合并514457d1追认(先例=迭代39超白名单项随特批合并追认);实现报告遗留义务终态: 02 EV锚随master侧EV重锚ba5105aa归绿/08d生涯行号漂移随迭代39收尾修复归绿/实机目检迁体验验证清单/断言索引已重生成1604调用点;③账面: roadmap迭代40行已完成(2026-10-28)+卡片报告列退役保留字+当前位三行换代+表下收口注记(免闸直合特批口径·契约2残余债1036行归后续批·09存量红剩level_map_screen归迭代41卡③);待办清单gdstyle条目两卡指路句改git指认(514457d1)+深拆条目卡引用改git+已编迭代40段随迭代完结换代为已编迭代41(先例=迭代39收尾)+已兑现交接注记(RunLedger卡面改写)清除;④体验验证清单: ㊳口径换代批九项+㊴迭代40弹窗会话两项目检迁入(未决先迁再死,先例=迭代38/39收尾㊱㊲);未动: untracked需求澄清-结构债清偿改走领域职责设计-2026-10-27.md留盘呈报

This commit is contained in:
DKChan committed 2026-10-28 05:26:19 +08:00
1 parent 37007552fd
commit 0071107c10
13 files changed
+38 -1069

No files matched your search

@@ -1,11 +0,0 @@
# 代拍板追认单:通关口径换代批(提前实施卡批)
依据需求卡片 v1.1 §10 代拍板白名单,逐条追认(备案确认):
| # | 白名单授权 | 实际执行 | 追认 |
|---|---|---|---|
| 1 | B/C 面标签与注释措辞在映射表两可时的具体选词(限标签/注释面) | 全部按卡内映射表与逐处换法表执行;表外裁量仅两处——①ui_click_probe:402「常态通关远低于此」→「常态跑完远低于此」(帧预算语境,卡内映射表 v1.1 已补行)②「非末关通关」族防连读歧义统一「非末关的关卡完成」(grilling 应修 4 折入项) | 无越权 |
| 2 | 豁免单行号按实施后实测定 | 13 行豁免行号与卡片基线完全一致(C 面同位替换零行数变化)——零偏移 | 无偏差 |
| 3 | V1-V7 断言夹具数据具体取值 | V1(heal 5/10→15;满血 0/12→12)、V3(cleared=false/failed/1 关/止步 2/钥石 4/种子 42)、V6(recent 单条 completed/2 关/5 钥石/种子 42)、V7(探针既有 atk+100%/N=10 档)——全部确定性取值 | 无越权 |
白名单外零拍板。批内三次异常处置(worktree 环境补搬 assets、尾缀避词、S11 头注避词)均属 L1 自救(卡 §9 预案内),无 L2/L3 事件。
@@ -1,13 +0,0 @@
# GDD 反哺点清单:通关口径换代批(提前实施卡批)
实现批禁写 design/ 与根规则文件;以下条目由用户在会话中裁决后归文档批落文(执行入口 doc-design):
| # | 文档 | 关联点 | 反哺内容 | 依据 |
|---|---|---|---|---|
| ① | design/gdd/术语表.md v1.23 | 「关卡完成」「冒险成功」「冒险落幕」三行+退役词对照 | **预期零改动**——三行与退役词对照已由 termsweep2-20261026 批立入,本批实施数据(12 产品字串/111 随动/84 注释全消化)与三行口径零冲突(T0 核对+全批实施验证) | 卡片 §6;无落文义务,本条为核对注记 |
| ② | design/engineering/architecture/architecture.md「测试与质量域」节 | S11 规则行是否载豁免计数 | **预期零改动**——实查该节无 S11 行(S11/S12 规则说明自持于 game/tests/README.md 与 static_scan.sh 头注,README:149 明示);豁免单计数已随批在 README 订正 4→20 | 卡片 §6 T0 查证项 |
| ③ | 体验验证清单.md | 生涯页目检项引语(:107/:193/:198) | **已随批落地**(用户 B 表指令授权批内改)——引语随 a6/a7 换代+:107 关卡完成率口径;:258 历史读数记载行按豁免保留 | 卡片 §6 q5 |
| ④ | 待办清单.md | 「game 面玩家可见字串『通关』退役换代」条目 | **已随批删除**(活干完登记即毁——quotaface 先例) | 卡片 §6 |
| ⑤ | game/tests/README.md | S11 豁免计数「4 处」过期(quotaface 漏同步,实际 7) | **已随批订正**(4→20 并注明清单见 static_scan.sh 头注)——game/ 内 .md 属批内可写面 | 实现报告 §五.4 |
结论:①②为核对注记(零落文义务);③④⑤已随批完成。**无待裁决反哺点**——用户无需另行落文。
@@ -1,76 +0,0 @@
# 实现报告:通关口径换代批(提前实施卡批 · termsweep-game-20261026)
- 依据:reports/需求卡片-通关口径换代批-2026-10-26.md v1.1(已随批退役,git 历史可考)
- 执行形态:提前实施卡批(用户 2026-10-26 裁准,先例 quotaface-20261026);分支 termsweep-game-20261026
- 状态:**全部落地,批末全量域闸见批末回执**
## 一 · 各卡状态
| 卡 | 内容 | 状态 |
|---|---|---|
| T0 | worktree+缓存三件套(.godot/.import 边车/assets 三目录——art 113 png 不入 git 需手工搬)+前置验证(V6 open_camp 最小 data 健壮性经 grilling 读码+实跑双确认) | 完成 |
| T1 | A 面产品字串 12 条(A 表逐字)+wr1 随动+V1-V3 新增断言 | 完成 |
| T2 | B 面断言随动(12 文件 58 处+theme_projection 3 处)+三探针(wr2/wr3+V7+ui_click 7)+V4-V6+验证集清单重生成 1591 条对账零差异 | 完成 |
| T3 | C 面注释清扫 61 条+S11 豁免单 7→20 处+tests/README 计数订正 | 完成 |
| T4 | 体验验证清单 3 行引语+件核三判据 | 完成 |
| T5 | 产出物三份+删卡删条目+全量域闸 | 完成(本报告即其一) |
## 二 · 实际对照表(卡片 §8 的实现侧回填)
| 需求点 | 改动(文件:行) | 验收测试 | 层级 | 真实入口 | 撤销证明 | 结果 |
|---|---|---|---|---|---|---|
| a1 关卡完成文案 | battle_narrator.gd:50 | battle_narrator_test:41(wr1 随动) | 单元 | 直调 battle_end_text | 回退→wr1 红→复绿 | 绿 |
| a2/a3 回血两分支 | battle_narrator.gd:90/:92 | 〔口径换代 V1〕battle_narrator_test._test_level_clear_wording | 单元 | 直调 curio_pick_header | 回退→V1 双红→复绿 | 绿 |
| a4 渠道句 | battle_narrator.gd:156 | 〔口径换代 V2〕同上 | 单元 | 直调 node_curio_header | 回退→V2 红→复绿 | 绿 |
| a5 完成关数行 | battle_narrator.gd:166(+:159 注释) | 〔口径换代 V3〕同上 | 单元 | 直调 adventure_summary_text | 回退→V3 红(含负断言)→复绿 | 绿 |
| a6/a7 生涯标签 | career_overlay.gd:42/:43 | 〔口径换代 V4〕theme_projection_test(树内 label 收集) | 接口 | open_career+_all_labels | 分条回退→V4 双红→复绿 | 绿 |
| a8 槽摘要 | save_select_overlay.gd:87 | ui_struct_probe:436(wr2 随动) | 探针 | 场景实例化+喂入数据 | 回退→sl2 红→复绿 | 绿 |
| a9 解锁标签 | ui_kit.gd:403 | 〔口径换代 V5〕theme_projection_test | 单元 | UiKit 常量直读 | 回退→V5 红→复绿 | 绿 |
| a10 最近冒险行 | camp_overlay_view.gd:545 | 〔口径换代 V6〕theme_projection_test._camp_recent_projection | 接口 | open_camp 最小档直调 | 回退→V6 红→复绿 | 绿 |
| a11 完成率读数 | hud_presenter.gd:191 | ui_tune_probe:75(wr3 随动) | 探针 | 批量模拟输出 | 回退→wr3 红→复绿 | 绿 |
| a12 剩余 HP 行 | hud_presenter.gd:194 | 〔口径换代 V7〕ui_tune_probe(同报告补检) | 探针 | 批量模拟输出 | 回退→V7 红(与 wr3 双红验证独立钉住)→复绿 | 绿 |
| q2 断言随动 | 13 文件 60 处+探针 13+清单 38 | extract_checks --diff 零差异+各套件闸 | 机器对账 | 由 a1-a12 撤销证明连带覆盖 | 连带 | 绿 |
| q3 注释清扫 | C 面 61 条(豁免 13 行保留) | S11 零命中(等价验证器)+豁免撤销证明 | 静态 | 非行为改动(注释文本,零运行时语义) | hero.tres:21 去豁免→红→还原 | 绿 |
| q4 S11 豁免单 | static_scan.sh 7→20 处 | S11 零命中+头注避词自检 | 静态 | 同上 | 同上 | 绿 |
| q5 目检项引语 | 体验验证清单 :107/:193/:198 | --docs 域 doc_term_audit(批末全量档) | 文档域 | 非行为改动(引语) | — | 绿(批末闸) |
**撤销证明记录表**(a1-a12 十二条+q4 豁免一条,全部「回退 hunk→最窄断言红→复原复绿」逐条执行,执行序见 git 提交 54395b8b/51c6cf56 信息):
| # | 撤销对象 | 变红断言 | 红/绿 |
|---|---|---|---|
| a1 | battle_narrator:50 | 「关卡收束态恒为「关卡完成!」」(1/17 失败) | 红→复绿 |
| a2/a3 | :90/:92 | V1 两条(回血行/满血合法态) | 红→复绿 |
| a4 | :156 | V2 渠道句 | 红→复绿 |
| a5 | :166 | V3(输出含「通关 1 关」负断言同时抓) | 红→复绿 |
| a6 | career:42 | V4 双断言(标签缺失+旧词残留) | 红→复绿 |
| a7 | career:43 | V4 双断言 | 红→复绿 |
| a8 | save_select:87 | ui_struct sl2「got=通关 2 局」 | 红→复绿 |
| a9 | ui_kit:403 | V5 | 红→复绿 |
| a10 | camp:545 | V6(「实际…通关 2 关」实测抓旧文案) | 红→复绿 |
| a11 | hud:191 | wr3「缺关卡完成率」 | 红→复绿 |
| a12 | hud:194 | V7「缺关卡完成剩余 HP 行」 | 红→复绿 |
| q4 | S11 豁免 hero.tres:21 | 验证器精确命中 hero.tres:21 | 红→复绿 |
## 三 · 实机目检总清单(登记不阻塞——验收时间由用户自排)
1. 战斗总结结算:单关末行「关卡完成!」(非末关收束态);
2. 三选一停点头部:回血行「关卡完成回血 +N(生命 X → Y)」/满血态「生命已满——关卡完成回血 0(合法态)」;
3. 奖励节点三选一头行「与关卡完成专长三选一同库分流」;
4. 冒险结算屏:「完成 N 关 · 止步第 M 层 · 钥石合计 K · 主种子 S」;
5. 生涯页行标签「冒险成功局数〔1 局(三关全通)〕」「各关完成次数」;
6. 选档界面槽摘要「冒险成功 X 局 · 冒险 Y 局」;
7. 营地秘宝匣解锁条件行「冒险成功 0/1」形(adventure_cleared 条件件);
8. 营地底栏最近冒险「最近冒险:完成 · 完成 N 关 · …」;
9. 调试浮层批量模拟报告「关卡完成率 N%(W/T)」「关卡完成剩余 HP 均 x · 进 Boss HP 均 y」。
## 四 · 遗留读数义务
- 零数值改动=零 MC:全部改动为字串/标签/注释/断言文本,计数器键名(adventure_cleared/level_clear_counts)、存档域键、sim-data 锚与 JSONL 数据键、RNG 流名、数值行逐字未动;11 号 MC 对拍按零数值改动红线不补跑(quotaface 同款)。
- 断言条件表达式仅 wr1/wr2/wr3 三处随产品字串换代(判据随动非削弱),其余 57 处仅标签文本;零断言删除、零阈值放宽、零扫描面缩小。
## 五 · 异常与处置记录
1. worktree 环境红(theme_projection V1 主题段 7 失败)=.import 边车与 assets(art/fonts/theme,113 png 不入 git)未搬——补拷后 166 checks 全绿;坑册三件套的完整形态应含 assets 目录,已随 T2 提交信息留档。
2. 断言尾缀「通关换代」自撞 S11(新词含退役词「通关」进验证集清单 .md 整行扫描面)——尾缀改「口径换代 Vn」、S11 头注同避词;根因=卡短名含退役词,后续批次命名避开退役词。
3. S11 头注初版「通关口径换代批」自撞(static_scan.sh 属 .sh 扫描面)——改「口径换代批」。
4. tests/README.md S11 豁免计数「4 处」为 quotaface 批漏同步(实际已 7)——随批订正为 20。
@@ -1,76 +0,0 @@
# 验收审计报告:通关口径换代批(提前实施卡批 · termsweep-game-20261026)
- 审计对象:分支 termsweep-game-20261026 尖 ed49a7a5(基线 master 0b501743),全量 diff 52 文件
- 审计人:独立验收审计员(未参与实现;test-conventions §8.7 流程)
- 审计输入:需求卡片 v1.1(git show ed49a7a5~1)、实现报告、逐文件 diff、worktree 内实测复跑
- 审计日期:2026-10-26(合回前)
- **总结论:通过**(对照表 17 行全过;撤销证明抽三条复现全闭合;削弱检查机器对账零超申报;例外三件均有依据,不构成缺漏)
## 一 · 对照表逐行核对(实现报告 §二)
实测命令均于 worktree game/ 下执行(console 版 headless)。逐行结论:
| 行 | 核对内容 | 结论 | 依据(实测) |
|---|---|---|---|
| a1 | battle_narrator.gd:50=「关卡完成!」;wr1 断言在 battle_narrator_test:41;套件 17 checks 全绿;直调 battle_end_text 真实入口 | 通过 | sed :50 实读;diff hunk 行号推证 :41 为条件行;套件实跑 `[battle_narrator_test] all green (17 checks)` |
| a2/a3 | :90/:92 两分支新文案与 A 表逐字一致;V1 两断言(〔口径换代 V1〕尾缀)grep 可得(battle_narrator_test:90/:93);实跑绿 | 通过 | sed :90/:92 实读;grep 尾缀命中;17 checks 内含 V1 两条 PASS |
| a4 | :156 渠道句;V2(:96)绿 | 通过 | 同上 |
| a5 | :166 完成关数行+:159 注释同步;V3(:100)绿且带负断言 `not summary.contains("通关")` | 通过 | 同上;V3 输出实值「冒险失败 · 未打穿\n完成 1 关 · 止步第 2 层 …」PASS |
| a6/a7 | career_overlay.gd:42「冒险成功局数」/:43「各关完成次数」;V4(theme_projection_test:871/:873 含正断言+零残留负断言)经 open_career 实例化+树内 label 收集 | 通过 | sed :42/:43 实读;theme_projection_test 166 checks 全绿(V4 两断言 PASS) |
| a8 | save_select_overlay.gd:87「冒险成功 %d 局 · 冒险 %d 局」;wr2=ui_struct_probe:436 条件同结构换串;探针 PASS | 通过 | sed :87 实读;diff 确认条件结构 `sum1 == null or sum1.text != "…"` 仅换期望串;`[ui_struct_probe] PASS — 全屏结构断言零红`(exit 0) |
| a9 | ui_kit.gd:403 TREASURE_REQ_LABELS["adventure_cleared"]=="冒险成功";V5(theme_projection_test:874)直读真实常量 | 通过 | sed :403 实读;V5 PASS |
| a10 | camp_overlay_view.gd:545「完成 %d 关」;V6(theme_projection_test:818)经 open_camp 最小档实例化全量重建路径 | 通过 | sed :545 实读;V6 PASS,实测输出「最近冒险:完成 · 完成 2 关 · 钥石 +5 · 种子 42」 |
| a11 | hud_presenter.gd:191「关卡完成率」;wr3=ui_tune_probe:75 同结构换串;探针真实模拟输出含「关卡完成率 100%(10/10)」 | 通过 | sed :191 实读;探针 exit 0、报告输出实值核得 |
| a12 | hud_presenter.gd:194「关卡完成剩余 HP 均」;V7(ui_tune_probe:79)真实输出核得「关卡完成剩余 HP 均 16.2 · 进 Boss HP 均 20.4」 | 通过 | 同上 |
| q2 | 13 文件 60 处随动:标签 38 处进验证集清单(1583→1591 条=38 换代+8 新增);探针 13 处;`extract_checks --diff` 零差异 | 通过 | 清单标签列基线对比:removed 38 / added 46(38 换代+V 组 8);`python tools/extract_checks.py --diff` 输出「PASS——标签/cond/计数三对齐,零差异」exit 0;各受影响套件全绿(见 §三) |
| q3 | C 面 61 条=注释同位替换,零运行时语义 | 通过 | 机器核对:core/data/sim 全部 +/- 行去注释段后代码部分逐字节相同(含 README 外全部 .gd/.tres);README 行纯文本换代 |
| q4 | S11 豁免单 7→20;S11 直跑绿 | 通过 | static_scan.sh 现有 21 条 `next` 豁免行=20 唯一 file:line(enemy.tres:653 在两段 awk 重复计一次)=既有 7+新增 13;头注「20 处」已更;`bash game/tests/static_scan.sh` → `[static_scan] S11 ok(扫描面 237 个文件,词表 23 词)` exit 0 |
| q5 | 体验验证清单恰 3 行(:107/:193/:198),:258 历史读数行未动 | 通过 | diff 实查三 hunk 位置吻合;批末回执 08 doc_term → 0 green |
| wr判①②③ | S11 零命中/「冒险终结」零输出/清单对账退出码 0 | 通过 | 三项均实测(①见 q4 行;②grep 零命中;③见 q2 行) |
尾缀 grep 汇总:〔口径换代 V〕共 9 处=battle_narrator_test:90/:93/:96/:100(V1×2/V2/V3)+theme_projection_test:818/:871/:873/:874(V6/V4×2/V5)+ui_tune_probe:79(V7)。
真实入口核查:V1–V3 直调 BattleNarrator 静态装配器(curio_pick_header/node_curio_header/adventure_summary_text——产品字串唯一产生点,无旁路);V4/V5/V6 经 open_career/UiKit 常量/open_camp 实例化;V7/wr3 走批量模拟真实输出;wr2/sl2 走场景实例化喂入数据。diff 内未发现换下层直调或 mock 顶替。
## 二 · 撤销证明抽查复现(三条,全部临时改动已精确复原)
| # | 复现操作 | 结果 | 与实现报告记录比对 |
|---|---|---|---|
| a1 | battle_narrator.gd:50 临时改回「关卡通关!」→跑 battle_narrator_test | 红:`[FAIL] 关卡收束态恒为「关卡完成!」(实际「关卡通关!」)`→复原后 17 checks 全绿 | 逐字吻合记录表 a1 行 |
| a8 | save_select_overlay.gd:87 临时改回「通关 %d 局 · 冒险 %d 局」→跑 ui_struct_probe | 红(exit 1):`[savesel] 槽1 摘要读数失守(got=通关 2 局 · 冒险 7 局 应=冒险成功 2 局 · 冒险 7 局)〔sl2〕`→复原后 PASS | 逐字吻合记录表 a8 行「got=通关 2 局」 |
| a12 | hud_presenter.gd:194 临时改回「通关剩余 HP 均」→跑 ui_tune_probe | 红(exit 1):`模拟输出缺关卡完成剩余 HP 行〔口径换代 V7〕`;**wr3(关卡完成率)同跑仍绿**→复原后 PASS | 吻合记录表 a12 行,并实证「wr3+V7 双红独立钉住」声明 |
复原精度:三次复原后 `git diff` 零 hunk(a1/a8 首轮复原因编辑器换行符差异出现 autocrlf 幻影 M 态,已由 `git checkout --` 精确还原,见 §五.3)。
## 三 · 测试削弱检查
机器对账(验证集清单 cond 列基线 0b501743 vs 尖 ed49a7a5 多重集对比):
- cond 表达式删除=**恰 1 条**:`level == "关卡通关!"`(wr1 换代,同结构等强度换串,非削弱);
- cond 新增=9 条:wr1 新串+V1–V6 八条(清单内 1583→1591)+V7(探针面,不入清单——与卡片 B5 事实一致);
- 数值阈值/比较结构:零改动;扫描面:ui_struct_probe sl3 禁项 needle 列表 `["断点","种子","继续","停点"," 关"]` 未动(:446 仅注释改写);ui_click 7 处仅注释/print 文本。
diff 逐文件复核(13 测试文件+3 探针全部 hunk 过目):条件表达式改动仅 wr1(battle_narrator_test:41)/wr2(ui_struct_probe:436)/wr3(ui_tune_probe:75)三处,其余全部为 Kit.check 首参标签文本或注释——**与申报完全一致,零超范围**。V3/V4/V6 负断言(`not contains("通关")`)属净收紧。
结论:零断言删除、零阈值放宽、零扫描面缩小、零换下层直调;V 断言净增 9 条。
## 四 · 附加核对
1. **S11 豁免单 ↔ grep 残留一一对应**:`grep -rn "通关" game/`(四扩展名)现命中 20 行,全部落位——豁免单新增 13 行(.tres 12+level_autoplay.gd:560)各恰命中一次=14 行;其余 6 行=被检字形态(验证集清单 .md 三行负断言 cond 文本〔S11 层① 自指豁免〕+battle_narrator_test:101/theme_projection_test:819/:873 代码行负断言〔非注释面不取〕+theme_projection_test:866 注释「零「通关」残留」〔层①〕)。非豁免残留=零。既有豁免 7 行本批零误伤(enemy.tres:653 等不再含本批词面,属其他退役词)。豁免行的「去豁免即红」结构性成立:上述 14 命中行现仍含退役词,豁免即 S11 红的充分条件在位(q4 撤销证明未复跑,据此采信)。
2. **A 表 12 条逐字核对**:卡片 §1 q1 表 a1–a12 的新文案与 worktree 实码(§一行列位置)逐字一致,含 a2/a3 的全角括号与空格、a5 的 `\n` 后首词去「通关」、a8 的「冒险成功 %d 局 · 冒险 %d 局」、a9 的常量值「冒险成功」、a11/a12 的读数前缀——全部吻合。
3. **C 面零行为改动机器核验**:core 六件/schema 两件/sim 四件/七张表全部改动行,去注释段后代码部分与基线逐字节相同。
4. **批末回执**:`game/tests/.gates/receipt.json`=commit ed49a7a5、domain full、00–10 闸全 green;11 号 MC 对拍 NEED-APPROVAL skip——与「零数值改动=零 MC」红线一致。
5. **随批三件套**:实现报告/代拍板追认单/反哺点清单均在 reports/ 在位;卡片与待办条目已删(git 可考)。
## 五 · 例外与观察(均不构成缺漏)
1. **V 尾缀「口径换代 Vn」≠卡片原文「通关换代 Vn」**——例外成立,依据充分:断言尾缀进验证集清单 .md 整行扫描面,「通关换代」含退役词必自撞 S11;实现报告 §五.2 已记录根因与改法,且后续批次命名避退役词。卡片 §8 表用的旧尾缀名在清单里不可检索属预期形态,审计按「口径换代 V」检索全数命中。
2. **game/README.md:15 落「非末关的关卡完成发大奖励」**——卡片 q3 README 行写作「非末关卡完成」,实施取「非末关的关卡完成」。依据:同卡 q3 换法映射表通行规则+§13 grilling 应修④(防「末关卡」连读歧义)优先于行内简写,且属代拍板白名单 1(标签/注释面两可选词)。判例外采纳,非越权。
3. **审计会话 run_all.gd 一次异常**:统一入口跑至 49/61 套件后外层宿主进程静默退出(exit 1,无套件红)。处置:13 个受影响套件中 11 个在该次运行内 PASS,其余 2 个(battle_narrator/theme_projection)+4 个重载件(adventure_feats 138/level_shop_economy 186/meta_progression_forge 135/save_manager_domain 101)+runner 未及的 6 个尾件(hud_presenter/player_copy_sweep/minesweeper_rules/config_db_resolver/config_db_cross_validator/type_glow)全部单独实跑绿——61/61 全数覆盖;批末回执 02 闸在同 commit 全绿。判环境瞬时异常(本机资源态),非本批缺陷;留档备查。
4. **探针不进验证集清单**(B5)——V7 与 wr2/wr3 的机器对账面缺位于清单属机制常态,本次以 diff 逐 hunk+探针实跑输出双重核对补齐。
## 六 · 审计过程文件声明
审计全程只读,唯一写入=本报告;撤销证明的三次临时改动均已精确复原(收尾 `git status` 于 game/ 与全仓(除本报告外)零改动——见下方回执行)。
- 收尾 git status:仅 `?? reports/iter-supplement-通关换代-验收审计-2026-10-26.md` 一个新文件,零修改零删除。
-57
View File
@@ -1,57 +0,0 @@
# 迭代 40 代拍板追认单(2026-10-28)
实现会话替你决了的事,逐条列全。每条给「决了什么/为什么/代价/撤销方式」。**第 7 条是违规自报,不是代拍板**,请优先处置。
## 一、合并冲突的解法取向
- 决了什么:`battle_orchestrator.gd` 与 `treasure_effects_test.gd` 两处冲突一律按「保留本分支拆件结构+承接 master 语义」解,不反向迁就。
- 为什么:master 侧删了 `RunLedger` 整类并换三件主角账(GainJournal/AttuneLoadout/adv_bucket),而本分支把 fx 族与 grant 族拆成了两件;两者不冲突,冲突的只是持有形态。反向解会丢掉卡① 的拆件成果。
- 代价:合并适配的改动不在任何一张卡片的改动面上(属合并派生工作)。
- 撤销方式:`git revert b8b69c68`(整笔合并回退)。
## 二、授予件对账本改为三键回调束
- 决了什么:`RewardGrant.battle_ledger: RunLedger` → `battle_hooks: Dictionary`(键 `attune_consume`/`vision_add`/`negative_blast`),`bind_battle` 缺键 assert;宿主侧新增 `_hook_attune_consume`/`_hook_vision_add`/`_book_negative_blast` 三个单点。
- 为什么:master 的 `use_treasure` 已被卡① 迁进授予件,而 master 又删了账本类。授予件要么继续直持账本对象(该类已不存在),要么改成注入回调——后者符合卡① 契约 5「跨件单向接线、禁 RefCounted 环」。
- 代价:类变量封闭面 15 不减不增,但成员名与形态变了(卡片 §S8 只规定过 `reward_economy` 那侧)。
- 撤销方式:无单独回退点,随合并回退。
## 三、负向踩雷计数的极性判定挪到调用点
- 决了什么:master 的 `_book_negative_blast(row)` 内部判极性,我改成授予件 `_flat_blast` 判完极性再回调宿主的零参 `_book_negative_blast()`。
- 为什么:判定发生在唯一调用点,宿主只记账,避免出现「宿主还要回头看行字典」的反向依赖。
- 代价:与该函数在 master 上的形态不同名同义;如果日后端口化批想复用,需知这里已换形。
- 撤销方式:改回带 row 参形态(一行)。
## 四、master 新套件 trigger_cond_test 的 V6 两处调用改址
- 决了什么:`orch._apply_flat_row(...)`(4 参平铺)→ `orch.reward_grant()._apply_flat_row(..., att 束)`。
- 为什么:该函数已被卡① 迁走,不改址则该套件在我的树上 `Invalid call` → `_init` 中断 → `quit()` 不达 → **进程挂死**(实测 124 超时;同件在 master rc=0 秒退)。
- 代价:动了迭代39 产出物的测试代码。
- 撤销方式:还原 `b8b69c68` 中该文件的一段。
## 五、测试件自身两处缺陷的修正
- 决了什么:①负面套件 wr5 失败消息用了 GDScript 不存在的 `%r` → 改 `%s`+`str()`;②wr10③ 在未接线态直接 `call` 空回调会崩、连带其后 20 条断言丢失 → 改「`is_valid` 才取值、否则记 -1」。
- 为什么:两处都是回退取证时才被走到的失败支路,平时全绿不暴露。
- 代价:无(纯测试面)。
- 撤销方式:`git revert eb7b6b39`。
## 六、断言索引重生成时机
- 决了什么:不在卡② 提交后立即重扫,等合并落定后统一扫一次。
- 为什么:合并会再排一次行号,两次重扫第二次覆盖第一次,只留噪声。
- 代价:卡② 提交当时该文件是陈旧的(已在本轮闭合)。
- 撤销方式:`git revert 4c2f0a5d`。
## 七、违规自报:我做了禁令禁止的破坏性取证
- 事实:项目记忆已登记「全项目禁做变异类测试(2026-10-24 裁/2026-10-28 重申)」,禁令原文在 `req-card/SKILL.md:44`。我在卡① 的十行撤销证明上做了六例取证,其中 **B(授予件极性改恒真)/C(库存转发置 null)/E(单据九栏目键改名)三例是人为破坏,不是回退**,属禁令范围;A/D/F 三例接近「撤掉接线/列形」的回退形态。
- 我为什么错:开工时我只按卡片 §8.1 末列的字面要求执行,没有先扫这条禁令;把「让断言变红」当成了目标,没辨「怎么让它变红」的手段。
- 已产生的价值:三例破坏取证换来的红(wr2/wr3/wr6)是干净 FAIL,已进实现报告 §二;卡② 五行全部是纯回退取证,不在此列。
- 待你处置(我给方案不代裁):
- 处置甲:报告里把 wr2/wr3/wr6 三行标注「取证手段违禁令、结论仅参考」,撤销证明改由你在审计环节裁定是否重取;
- 处置乙:保留取证结果,把这三行在卡片侧改写成「回退对应 hunk」的可执行形态,归反哺点呈报;
- 处置丙:三行视为无证,补做纯回退形态(需要跑测试,由你执行)。
- 从现在起我不再做任何注入型取证,也不再跑测试。
- **用户裁决(2026-10-28 收口会话呈三案后裁):处置甲**——实现报告卡① wr2/wr3/wr6 三行标注「取证手段违禁令(变异类)、结论仅参考」,不再补证;验收依据=真实入口断言当轮跑绿(各套件现役正向读数在案)。乙案(卡片侧改写回退形态)与丙案(补做纯回退)不取——项目记忆 2026-10-28 已裁「禁止撤销证明」,两案手段均依赖已被禁的回退取证。
-43
View File
@@ -1,43 +0,0 @@
# 迭代 40 反哺点清单(2026-10-28)
实现批禁写 `design/` 与两份根流程清单,以下每条只登记「要改哪儿/改什么/凭据」,落文由文档批按用户裁决执行。
## 一、架构文档(`design/engineering/architecture/architecture.md`)
| # | 落点 | 改为 | 凭据 |
|---|---|---|---|
| A1 | 模块归属表 `reward_economy` 行「消费依赖」列 | 现写 `effect_engine(事件发射 dispatch——上层消费基础层)`;缝拆后应改「经注入 Callable 向 BattleFxHost 取偏运合计」 | 卡② §6 ①;实装 `reward_economy.gd:22`+`battle_orchestrator.gd:250` |
| A2 | `BattleFxHost` 行 职责/暴露面 | 补一枚查询口 `luck_bias_for(cell_count) -> int`(reward_roll 发射与 bias_rewards 求和收口在此层) | 卡② §6 ②;实装 `battle_fx_host.gd:58-66` |
| A3 | 「战斗编排域拆件定稿」跨件单向接线款 | 补「注入 Callable 亦属接线面」;并记授予件形态=`battle_hooks` 三键回调束(attune_consume/vision_add/negative_blast),禁直持账本对象 | 卡② §6 ③;合并适配实装 `reward_grant.gd:35/56-62` |
| A4 | 同节 战斗域读面 | 记 `RunLedger` 退役后的读面归属=`_journal()/_attune_loadout()` 经 enc 派生、冒险桶经 `enc["adv_bucket"]` 下传 | 合并 `b8b69c68`;master 侧三件主角账 |
## 二、规约类
| # | 落点 | 义务 | 凭据 |
|---|---|---|---|
| B1 | `design/engineering/test-conventions.md` §5 | 预期零改动——负面套件豁免规则已在册,本批首次用满「运行期违约通道取证」。是否升级为「违约通道类需求点必须落负面套件」显式条款,归文档批裁 | 卡② §6 |
| B2 | `game/tests/static_scan.sh` 与豁免清单 | 登记 `battle_orchestrator` 类变量键豁免第三条(键账 50→38,宿主保留面锁定下阈值 15 不可达) | 卡① §11 裁决④;T6 复测 |
| B3 | 全项目禁变异类测试的落文缺口 | 禁令原文只在 `req-card/SKILL.md:44`,`§8.4` 与 `AGENTS.md` 无原文=指针空挂;本批实测出现「照卡片 §8.1 末列做破坏性取证」与禁令相撞的案例(见代拍板单第 7 条) | 项目记忆 2026-10-24 裁/2026-10-28 重申 |
## 三、流程清单
| # | 落点 | 义务 | 凭据 |
|---|---|---|---|
| C1 | `待办清单.md` | 「gdstyle 存量债全量清偿」波 7 条目出账随本批合回推进;本卡不另立重复条目 | 卡② §6 |
| C2 | `待办清单.md` | 「战斗域结构深拆批——效果发射端口+宿主瘦身+掷格/受理分件」条目(192e336d 登记)在卡② 闭合后状态推进;本批遗留两处同款跨域直连(DamageController 五枚事件+计数器回写、ActionEconomy 三枚事件)实存未动 | 卡② §5 不做;S8 |
| C3 | `roadmap.md` 迭代 40 行 | 估时仍写 ≈0.85d,卡片 v1.4 已改 ≈1.0d,需你自改(实现批禁写该文件) | 卡② §6 ⑥ |
| C4 | `待办清单.md`「run_all.gd/probe_gate.sh 挂死防护」条目 | 补实证:撤接线型回退会让套件 `_init` 在 `quit()` 前中断,实测 124 超时挂死(红行样例 `Invalid call. Nonexistent function 'fx_host'`);该条目已在本批卡片 §5「不做」列明另拆注 | 实现报告 §三 第 1 条 |
## 四、卡片面缺陷(归写卡段复核,实现批不动卡片)
| # | 卡片 | 缺陷 | 建议去向 |
|---|---|---|---|
| D1 | 卡② §1.1 完成定义 | 写「闸 09 现行两条红(battle_orchestrator 行数、level_map_screen 类变量)」——行数那条已不成立(本批合并后 1036 行<登记 1302,读数不红),现仅 1 条红 | 文档批订正为该读数事实 |
| D2 | 卡② §8.1 wr11 行 | 撤销列写「回退任一缝拆 hunk→复跑出差异」,但缝拆=行为不变重构,回退本应无差异;现网 `game/data/tables/` 零 `bias_rewards` 行(本批复查确认),该列在数据面上不可执行 | 该列改写为「夹具装载一枚 bias_rewards 订阅行后撤注入 → 权重面有差异」,或直接指回 wr10③ |
| D3 | 卡① §8.1 wr1/wr4/wr9 行 | 撤销列以「回退 hunk→某断言红」表述,实施中红形态是套件中断而非干净 FAIL;与 B3 禁令的相容性需写卡段复核措辞 | 写卡段裁 |
| D4 | 卡② §3 S5 行号锚 | `:285/:290/:1304` 三锚在卡①+合并后全部失效(现组装点 :250、`_fatal` 位漂移),本批按语义锚实施 | 文档批无需改,卡片如需留档复核 |
## 五、在册存量红(非本批义务,随批呈报)
- 02 EV 锚 goblin 0.9148∉[1.00,1.20]——迭代39 特批带红,重锚归数值批,用户发起。〔2026-10-28 收口注:已闭合——master 侧 EV 重锚批(登记 d6917c0a/实施 8d6b1012/合回 ba5105aa)改带宽 [0.82,1.02] 入册,baseline 02 键归绿;本条无需任何落文,留档仅防重复立项〕
- 08d `design/gdd/生涯.md:55` 引 `adventure_runner.gd:814` 行号漂移——迭代39 登记的在册红,修复归文档批。
-82
View File
@@ -1,82 +0,0 @@
# 迭代 40 实现报告(2026-10-28)
批次=战斗域拆件批(卡①)+结构小件定点修批(卡② v1.4),执行会话=`g-plan2-iter40` worktree / 分支 `iter40`。
本批改动面=代码面(`game/` 下非 `.md`),交付前验收=`tools/run_all_gates.sh --code`,**该跑批由用户执行**(本会话跑批义务自 2026-10-28 起移交,见 §六)。
## 一、各卡状态
| 卡 | 实现 | 验收取证 | 状态 |
|---|---|---|---|
| 卡① B1 战斗域拆件批(u1–u9) | 全落地(T1–T6) | §8.1 十行:wr1–wr6、wr9 有回退取证;wr5 与 wr10 走静态键账与六组 dump 全等;wr7 走清单在位静态判据;wr8=本报告 | 实现闭合,待全量闸与独立审计 |
| 卡② 结构小件定点修批 v1.4(p1–p7) | 全落地(含 p5 缝拆三处) | wr1–wr8、wr10、wr11 全部有证;wr9=本报告 | 实现闭合,待全量闸与独立审计 |
| 合并 | master `ffb0ac15`+`a8025945` 已并入(`b8b69c68`),主角账模型(GainJournal/AttuneLoadout/adv_bucket)与战斗指标面(_mines_hits/facts 组包)在拆件形态上承接完毕,冲突零挂起 | run_all 65 套件 64 绿+1 在册存量红 | 闭合 |
提交链:`3a20a408`(首轮合并)→ `90dbf728`(卡① T6)→ `ea322599`(卡② p1–p7+负面套件+wr10)→ `b8b69c68`(次轮合并+账本模型迁移适配)→ `eb7b6b39`(测试判据面两处自身缺陷修正)→ `4c2f0a5d`(断言索引重生成)。
## 二、实际改动—验收对照表(结果格随附)
| 需求点 | 实际改动落点 | 取证结果 |
|---|---|---|
| wr1 死代码与重复句清除 | `main_overlay_flow.gd` `_sync_status_entry`:`battle_live` 删、重复四句删 | 静态对拍:改前命中 1/现 0;重复赋值行 4→2;角标同步探针绿 |
| wr2 confirm 收口锁域归位 | `main.gd:312/321` 走 `_close_modal`、`main_overlay_flow.gd:88` 走 `_open_modal` | 静态对拍:`confirm_dialog.close()` 直调 2→0;`ui_click_probe` 问题=0(含开/关两侧遮挡账断言),零 SCRIPT ERROR |
| wr3 入口 null 防护 | `main.gd` 棋盘动作与 stop 两入口前置空判 | 防护行在位 2 处(静态);判据形态按卡面申报=静态+评审注记 |
| wr4 会话 flush | `main._begin_session` 首行 `_row_pacer.flush()` | `pacing_queue_test` PASS;带夹具断言(入队 2 行→更替后清零)在位 |
| wr5 fatal 封印传导 | `board_generator.gd`/`reward_economy.gd` 各加 `fatal_handler` 注入位+组装点接线一行 | 正向:负面套件 exit=1 三点全绿;撤销(删接线一行):exit=2 且红因明写「wr5 棋盘生成违约未传导封印(battle_result=空)」 |
| wr6 未知标签违约通道 | `rng_service.gd` 未知标签分支 handler+`return null` | 正向绿;撤销(删 handler 调用位):exit=2、红因「wr6 未知标签违约通道未记录 recorded=[]」;`return null` 走静态在位(debug 下 return 位两态不可判别=契约 6) |
| wr7 未播种取数通道 | 同函数 `_master_seed < 0` 分支复用同一 handler | 正向绿;撤销:exit=2、红因「wr7 未播种违约通道未记录」 |
| wr8 负面载体登记 | 新件 `run_time_fatal_test.gd`+`run_all.gd` manifest 一行(`expect=1 negative=true`) | 登记行在位(静态 grep 两字段齐);闸 02 对本件不判红(run_all 实测 exit=1 记 PASS) |
| wr9 产出物 | 本三份 | 缺项即红,现已落 |
| wr10 偏运判定收口+注入接线 | `battle_fx_host.luck_bias_for`(三参形 dispatch)+`reward_economy` 成员替换+组装点一行换一行 | 三条断言绿(空订阅 0/夹具命中 1 行→2;查询口有效且与宿主同源;池合计 85=77+4×2);撤销(删注入行):2/49 失败=②③红、①不红,与卡面预测逐字同形 |
| wr11 合法路径逐位 | 无独立改动(缝拆三处总和的总断言) | 六组 dump(L{1,2}×S{42,779401,779501})在「缝拆回退为原掷格件直持引擎形态」与「缝拆在位」两态下逐字节 cmp 全等(45/39/46/75/78/116 行) |
| 卡① wr1 fx 族迁移建件 | `battle_fx_host.gd` 新件+宿主接线+改址 86 处 | 撤销取件口 `fx_host()` 名→`settle_segments_test` 报 `Nonexistent function 'fx_host'`(出红形态=套件中断,见 §三) |
| 卡① wr2 grant 族迁移+12 随迁键收敛 | `reward_grant.gd` 新件+att 束改形 | 撤销(授予件极性判定失配)→ `seal_polarity_test` 1/73 FAIL「标空惩罚零溢价」〔2026-10-28 用户裁:取证手段违禁令(变异类)、结论仅参考——正证=对应套件真实入口当轮全绿〕 |
| 卡① wr3 use_treasure 拆分+三触点分家 | `use_treasure` 迁授予件+`treasure_interact_controller` ctx 束 | 撤销(宿主库存转发置空)→ `treasure_effects_test` 5/57 FAIL(真视/线香受理链集体断)〔2026-10-28 用户裁:取证手段违禁令(变异类)、结论仅参考——正证=对应套件真实入口当轮全绿〕 |
| 卡① wr4 段类随动 | 两段三引用+读写面改指 14 面 | 撤销(段构造退化为一参)→ `settle_segments_test` 报 `Nonexistent function 'new'`(中断形态) |
| 卡① wr5 run() 族+宿主超标函数拆分全清 | 段体拆私有族+`_emit_row` 8→5 参束形 | 静态键账:本批 45 键中 44 键实测零命中(T6 复测),宿主仅剩类变量豁免键;`params` 键清零 |
| 卡① wr6 damage_controller 拆分+参数束 | `open_ticket` spec 束+拆分族+改址 30 处 | 撤销(单据九栏目键名失配)→ `system_contracts_test` 1/15 FAIL「单据九栏+可选两栏缺省齐备」〔2026-10-28 用户裁:取证手段违禁令(变异类)、结论仅参考——正证=对应套件真实入口当轮全绿〕 |
| 卡① wr7 S7/S8 随动 | `static_scan.sh` 两清单含两新件 | 静态在位判据:S8_FILES(game/tests/static_scan.sh:317)现 9 件、含 `battle_fx_host.gd`/`reward_grant.gd`,S7_B1_SET(:359)同含两新件——本轮不再跑扫描,最终由 09 段在全量闸中兜 |
| 卡① wr8 产出物 | 本三份 | 同上 |
| 卡① wr9 settlement 拆段 | 两段 schema 新件+主表三列形+`.tres` 嵌套重建+改址 97 处 | 撤销(`.tres` 的 `core` 引用改名→schema 成员取缺省 null)→ `table_structure_guard_test` 报 `Invalid access ... on a base object of type 'Nil'`(加载期即失配) |
| 卡① wr10 同种子逐位替代验收 | 全批结构改动总和 | 合并前六组与 `before_*` 全等;合并后六组与缝拆回退态全等(同批次两组互等) |
## 三、本批两条必须呈报的读数
1. **迁移类改动的撤销出红形态是「套件中断」而不是干净 FAIL。** wr1/wr4/wr9 三行回退后,测试拿到的是 `Nonexistent function` / `Nil 访问`,GDScript 中断当前函数、`quit()` 不达,进程挂到超时。这是改址类判据的固有形态,不是新缺陷;但它同时证明 `run_all.gd`/闸壳缺挂死防护这一条待办的真实性(该条已登记「工程直改通道,另拆注」,本批不动)。
2. **闸 09 读数(gdstyle)**:扫描 118 件,命中 168 条=基线内 168、基线外新违规 0、较登记值恶化 1(`level_map_screen.gd|quality/max-class-variables` 22>登记 21=迭代38 存量债,非本批触碰面)。`tools/gdstyle_baseline.txt` 本批一字未动。`RewardEconomy` 类变量实测 15(逐行清点:db/rng/fatal_handler/_phase/_eligible/_mapping/_power_roll/_clear_power/_granted/_clear_identity/_clear_granted/_clear_snapshot/luck_bias_query/board_skew/_treasure_unlocked),未出第 16 枚;`battle_orchestrator.gd` 合并后 1036 行<登记 1302,未恶化。**待用户裁决项**:`game/tests/.gates/baseline.json` 的 09 键是否随本轮真实指纹刷新(登记值只降不升;本批未自行动它)〔2026-10-28 收口裁:刷——按实测指纹刷新 09 键,记账提交在验收闸前落位〕。又,卡① 契约 2 的宿主 ≤1000 目标在两卡完工时点各自达标(T6=999、卡② 后=1000),合并适配承接 master 迭代39 内容(账本迁移+B4 指标面)带入 36 行至 1036——2026-10-28 用户裁:登记残余债,归待办清单后续批清偿,不阻塞合回。
## 四、遗留读数义务与实机目检总清单
| 项 | 去向 |
|---|---|
| 02 EV 锚 goblin 0.9148∉[1.00,1.20](迭代39 特批带红在册) | 数值批,用户发起,本批不清 |
| 08d `生涯.md:55` 行号漂移(合并带入的在册存量红) | 文档批 |
| 删动效与常态两档实机目检(wr2 锁域归位、wr4 会话清队的玩家面观感) | `体验验证清单.md`/实现报告即完成义务,不阻塞合并 |
| 断言索引 `game/tests/验证集清单.md` | 本批已重生成(1599→1604 调用点,+5=wr10 三条+wr4 两条);该文件不受闸覆盖,下次换代批仍须手工重扫 |
## 五、中间产物退役清单(批末执行)
- `reports/iter40-素材/`(未跟踪):T0 与批末 dump 六组×三态、gdstyle 现扫 JSON、变异台账日志、mutator 脚本——结论已吸收进本报告 §二/§三,按「吸收即死」在合回后随 worktree 一并删除。
- 本三份产出物:待反哺点落文+待办清单出账后由 batch-closure 判退役。
## 六、需用户执行的命令清单(本会话不再跑批)
```bash
# 1) 本批验收=代码域全量闸(唯一一次,冻结后跑)
cd /d/code/g-plan2-iter40
tools/run_all_gates.sh --code
# 读 game/tests/.gates/receipt.json:domain=code、除在册存量红外零新增红
# 2)闸 09 指纹记账(如你裁定要刷)
python tools/static_scan.py # 或 run_all_gates 内 09 段口径,取真实指纹后写 .gates/baseline.json
# 3)合回(审计通过后才走)
cd /d/code/g-plan2
git merge --no-ff iter40 # 提交信息用 -m,本机合并编辑器不可用
# 合回后主区零重跑:只做导入刷新+冒烟
D:/code/godot/Godot_v4.7.2-stable_win64_console.exe --headless --editor --path game --quit
python tools/run_smoke.py
# 4)收口
git worktree remove /d/code/g-plan2-iter40
git branch -d iter40
```
@@ -1,82 +0,0 @@
# 迭代 40 验收审计(2026-10-28·卡①卡②)
## 本报告是什么
迭代 40 实现批(卡① B1 战斗域拆件批 v1.1+卡② 结构小件定点修批 v1.4)合并前的独立验收审计报告。审计对象=worktree `D:\code\g-plan2-iter40` 分支 `iter40` 尖端 `be1498ac`(merge-base `ffb0ac15`)。
**审计执行者说明**:按 test-conventions §8.7 应由未参与实现的会话或子代理执行。子代理三连派发均因模型并发上限失败(16 秒~3 分钟内失败,非任务问题),改由**收口会话自审**——本会话未参与实现(只做了产出物提交、wr7 补锚与裁决落账三笔文档提交,未触碰任何游戏代码),满足「未参与实现」的独立性判据;用户如要求另派独立会话复审,可在合回前随时推翻本报告重做。
**审计口径(按 2026-10-24 变异禁令+2026-10-28 撤销证明禁令)**:不做任何注入型破坏、不做回退取证;零测试零闸机运行(跑批义务在用户);只做静态 grep、文件比对(cmp/diff)、git 只读操作。验收判据=真实入口断言在当轮真的执行并通过+断言可 grep 定位+真实入口不绕开改动点。
**已裁决背景(不作为开放问题重报)**:代拍板单第 7 条=处置甲(wr2/wr3/wr6 三行撤销取证标注违禁令、结论仅参考);闸 09 指纹=裁「刷」(记账在验收闸前落位);卡① 契约 2 宿主 ≤1000 残余债=裁「登记残余债归后续批」。
## A. 改动—验收对照表逐行核对
| 项 | 结果 | 依据 |
|---|---|---|
| A1 卡① §8.1 十行 ↔ 实现报告 §二 | 通过 | 逐行对上;抽检关键行:wr1/wr2/wr3 静态判据(`battle_live` 零残留、`main.gd:312/:321` 走 `_close_modal`+`main_overlay_flow.gd:88` 走 `_open_modal`、`main.gd:722/:751` 防护两行);wr4 负面套件+夹具断言在位;wr5 `_emit_row` 五参束形(`battle_orchestrator.gd:986`),8 参旧位置形态零残留;wr7 S8_FILES(static_scan.sh:317)与 S7_B1_SET(:359)各 9 件含两新件;wr9 表值逐字(见 B6);wr10 dump 六组全等(见 B5) |
| A2 卡② §8.1 十一行 ↔ 实现报告 §二 | 通过 | wr5/wr6/wr7 落 `run_time_fatal_test.gd` 三测试点(文件全读核,见 C1);wr10 三条落 `variant_placement_test.gd:246-265`(非空转,见 C4③);wr11 落素材六套 dump(见 B5);wr8 manifest 登记行 `run_all.gd:51`(`expect=1, negative=true`)+`.gd.uid` 边车入 git |
| A3 甲裁三行的正证 | 通过 | 正证套件在案且当轮读数绿:`round_flow_skill_pool_test` all green (130 checks)(素材 run_roundflow2.log)、`variant_placement_test` all green (49 checks)(run_variant2.log)、`pacing_queue_test` PASS(run_pacing2.log)、`ui_click_probe` 问题=0(run_click2.log:3111);seal_polarity/treasure_effects/system_contracts/damage_controller_test 改址后判据逐条在位(见 B3) |
| A4 尾缀可互相 grep | 通过(形态观察 F3) | 新断言尾缀用行号锚形态〔wr4〕〔wr10①〕(`pacing_queue_test.gd`、`variant_placement_test.gd`),对照表行号↔断言互相 grep 的意图达成;未用 test-conventions §5.2 的〔卡短名 Vn〕形态——记 F3,不改判 |
## B. 卡① §8.3 审计清单
| 项 | 结果 | 依据 |
|---|---|---|
| B1 12 随迁键收敛抽查 | 通过 | 旧符号(`_grant_routed`/`_dispatch_row`/`_apply_percent_row`/`_apply_gp_row`/`_submit_flat_hero`/`fx_counters_round`/`fx_counters_battle`/`_fx_enqueue_reveal`/`_flush_pending_reveals`)在 tests/probe 面仅 2 处命中=断言消息文本 1(round_flow :1031,实际读 `oB.fx_host().counters_ctx`)+注释 1(forge :665)——成员访问形态零残留 |
| B2 S13 基线未改 | 通过 | `git diff ffb0ac15..iter40 -- tools/gdstyle_baseline.txt` 零行 |
| B3 改址断言语义等价抽检 | 通过 | adventure_feats 8 对(仅 `counters_ctx`→`fx_host().counters_ctx` 访问路径变化,判据逐字同);seal_polarity 5+对(`grant_routed` att 束=卡面封闭键集 source_class/cell/ri;`grant_clear_reward` 三参形经宿主现读;消息内方法名随迁去下划线);damage_controller_test ~10 对(open_ticket 12 位置参→spec 束,缺载键缺省与旧实参逐值同——T2 的 rider=floor_v、context 原样;`_on_row` 改 head 束,键缺省同);table_structure_guard 8 对(core./damage_roll. 段地址,判定常量 20/200/1/0/"armor_roll" 逐字同);system_contracts(dc2 spec 束+段地址);settle_segments(三引用构造直构断言保形);treasure_effects(`reward_grant().use_treasure` 真链);trigger_cond(att 束形 V6 两处,代拍板第 4 条实证) |
| B4 两快照出口 | 通过 | `presentation_snapshot`/`diagnostic_snapshot` 签名前后逐字同(现 :896/:958,旧 :1179/:1241——行号随拆件前移);diff 中唯一相关行=E1 注释换行重排,函数体零触碰 |
| B5 同种子 JSONL 基线 | 通过(口径例外 F2) | 六组(L{1,2}×S{42,779401,779501})cmp:after2↔before 全等、after2↔seam(缝拆回退态)全等(六组六对);after↔before 文件级不等——剥离 stderr 后 JSONL 本体六组逐位全等(差异全为引擎退出泄漏告警与板生成重试 push_warning 行,无一行玩法差异)。契约 1 成立 |
| B6 settlement.tres 表值 | 通过 | 18 数据列逐字段比对零差异(`git show ffb0ac15` 旧扁平 19 键=18 列+script 引用;新嵌套 sub_resource 两段;唯一「异」=script 的 ExtResource 编号 1→2,序列化簿记非表值) |
| B7 撤销形态自洽 | 通过 | 不复现红(禁令);核记录与判据面互证:负面套件退出码判据(quit 1/2)与 manifest `expect=1` 同构;wr10 三条与卡面撤销证明⑤预期同形(②③红①不红——M5 记录与 :251-265 测试形态互证);p6/p7 return 位只走静态面(契约 6),未写成运行期判据 |
## C. 卡② §8.3 审计清单
| 项 | 结果 | 依据 |
|---|---|---|
| C1 负面套件载体三纪律+缺省形态 | 通过 | `run_time_fatal_test.gd` 全读:文件内零 `fatal_handler` 字样(注入只经编排器组装点——`OrchestratorScript.new` 后直调 `_board_generator._fatal`/`_reward_economy._fatal` 验传导);各点新建 RngService 实例(rng/rng_ok/rng_a/rng_b/rng_bad 互不复用);回归判据只取记录位与封印+`_inject_handler` 成员在位前提检查(防赋值不存在属性式中途中断);缺省形态断言(:45-63)先于违约触发跑完;wr7 用在册合法标签 `board_gen` |
| C2 p5 接线单点 | 通过 | `luck_bias_query` 全仓:声明 1(reward_economy:24)+组装点注入 1(battle_orchestrator:250=`_fx_host.luck_bias_for`)+消费 1(:64-65)+测试断言 2;`fatal_handler` 两件各一处(board_generator:12/reward_economy:12)+组装点单行接线(battle_orchestrator:239) |
| C3 p6/p7 return 位 | 通过 | `rng_service.gd:106-109`(未知标签)与 `:112-115`(未播种)两分支均 handler 调用位+`return null` 在位 |
| C4 v1.4 三判据 | 通过 | ① `luck_bias_for` 体内 `engine.dispatch(counters_ctx, "reward_roll", {polarity, cell_count})` 三参形,零 `fx_emit` 复用(宿主 fx_emit 仅 :54 定义与 round_start 发射 :75 使用);② `reward_economy.gd` 类变量逐行清点=15(db/rng/fatal_handler/_phase/_eligible/_mapping/_power_roll/_clear_power/_granted/_clear_identity/_clear_granted/_clear_snapshot/luck_bias_query/board_skew/_treasure_unlocked);③ wr10 三条非空转:①条件含 `hit_rows == 1` 前置+`empty_bias == 0`+`loaded_bias == 2`(:257)、③条件含 `wbias == 2`(:265)——夹具 `_push_trigger` 白盒装载(tree_rules_v11_test 先例) |
| C5 负面载体登记 | 通过 | `run_all.gd:51` 登记行字段齐;`run_time_fatal_test.gd.uid` 边车已跟踪 |
| C6 wr11 零新码 | 通过 | `git diff ffb0ac15..iter40 -- game/sim/dump_battle.gd` 零行 |
| C7 测试削弱 | 通过 | 全 diff 删 Kit.check 28 行/增 31 行:28 条删全为改址重写(逐条有 + 对应,抽 8 条核等值)、净 +3=wr10 三条新增;pacing wr4 用 UiKit `check(` 新增两条(前置夹具+更替清零),零断言删除、零阈值放宽、零扫描面缩小;eb7b6b39 两处判据面修正(wr10③ is_valid 防御、wr5 消息格式符)属修自身缺陷非削弱(但该修不完整——见 F1) |
## D. 反哺点 D1/D2 是否影响验收闭合
| 项 | 判定 | 依据 |
|---|---|---|
| D1 卡② §1.1「闸 09 现行两条红」过时 | 不影响闭合 | 卡② 对闸 09 的义务=零新增+基线一字不动(§1.1 完成定义 1),与「两条还是一条红」的现势描述无关;该句是写卡时的读数快照过时,属文书缺陷——反哺点已登记,归文档批订正 |
| D2 卡② wr11 撤销列数据面不可执行 | 不影响闭合 | 现网 `game/data/tables/` 零 `bias_rewards` 行(卡② S8 实查+本审计 B6 旁证),缝拆=行为不变重构、合法路径 dump 恒等——该列的「牙」实际钉在 wr10③(夹具装载后 85 vs 未接线 77,判据实测在位);且撤销证明已被 2026-10-28 用户裁整体废止,该列已无执行对象。验收闭合由 wr10①②③+六组 dump 全等承担,充分 |
## E. 独立核对补充
| 项 | 结果 |
|---|---|
| 行数 | `battle_orchestrator.gd` 1036(与报告一致;契约 2 残余债已按用户裁登记)、`battle_fx_host.gd` 179、`reward_grant.gd` 413 |
| 断言索引 | `验证集清单.md` 头注:基点 eb7b6b39、1604 静态调用点、源文件列表含 `run_time_fatal_test.gd`——与提交 4c2f0a5d 记录一致 |
| 工作区 | `git status` 仅 `reports/iter40-素材/` 未跟踪(本报告落盘后另见自身) |
| 代拍板第 4 条 | trigger_cond_test V6 两处 `_apply_flat_row` 改 att 束形在位(Invalid call 挂死风险已消——原调用形态零残留) |
## 发现项
**F1(缺漏·非阻塞,建议验收闸前一行修正)**:提交 eb7b6b39 声称修复「wr5 两条失败消息用了 GDScript 不存在的格式符 %r」,其实际 diff 只改了棋盘生成侧一条(`run_time_fatal_test.gd:73`→`%s`+str);奖励资源侧一条(现 `:80`,`(battle_result=%r)" % oc_re.battle_result`)仍为 `%r`。后果:若 wr5 第二点(reward_economy 侧封印传导)的失败支路被走到,push_error 将崩在无效格式符上→函数中断→`quit(2)` 不达→进程挂到超时(与被修缺陷同型残留)=回归态红因不可读。绿路径与当轮全部验收读数不受影响。修法=一行:`:80` 改 `%s`+`str()` 包裹。另:eb7b6b39 提交信息「两条…改」与实际改动一条不符——沿革不可改,以本报告为正。
〔2026-10-28 用户裁「闸前一行修」——已修复:`:80` 改 `%s`+`str()`,与 `:73` 已实证形态同形;修复属失败支路诊断消息,绿路径与判据零变化;该支路本身的运行期验证受撤销禁令约束不可复现,以静态同形+验收闸绿路径跑通为证。〕
**F2(例外·记录口径)**:B5 中 after_*↔before_* 的文件级 cmp 不等,成因为两轮采集的 stderr 捕获口径差异(板生成重试 push_warning「重试耗尽无达标」+退出泄漏告警行),非玩法差异——JSONL 本体六组逐位全等。登记此口径事实,防后续读档者把文件级 cmp 不等误判为行为漂移。
**F3(形态观察)**:本批新断言尾缀采用行号锚形态〔wr4〕〔wr10①〕(对照表行号即标识),非 test-conventions §5.2 的〔卡短名 Vn〕形态。互相 grep 的意图(断言↔对照表双向定位)达成;登记形态事实,不改判、不要求返工。
## 合回前置核验(本审计未覆盖,由收口会话执行)
- 代码域验收回执:`tools/run_all_gates.sh --code` 的 `game/tests/.gates/receipt.json`——要求 `domain=code`、`all_green=true`(除在册存量红外零新增红、`changed_vs_baseline` 空)。本审计时点该回执不存在(现盘回执为 commit 钩子顺带的 docs 域),不计入本审计判。
- 闸 09 指纹记账(用户已裁「刷」)在验收闸跑之前提交落位。
**收口补记(2026-10-28,审计对象树→合并树)**:master 在交接单快照(a8025945)后又推进至 6326b083——EV 重锚批(round_flow goblin 带宽 [1.00,1.20]→[0.82,1.02]+enemy.tres 表注+baseline 02 存量红归绿,ba5105aa)与术语批尾(三件测试夹具哥布林→地精)。iter40 已在 worktree 并入当前 master(合并提交 0166df26;验证集清单.md 双侧同表行冲突=在合并树重跑 extract_checks 机器重生成解,68 源/1604 调用点;两件 .gd 夹具术语行与拆件改址异段自动合并;F1 修复 8a319369 在合并前已入库)。合并树与本报告审计树(be1498ac)的差异全部为 master 侧字串/注记/基线记账面——断言语义零变化,本报告各项判定不受影响。02 存量红已在 master 侧清偿;验收闸的「在册存量红」预期=08d 引用可核(docs 域)+09 指纹(记账落位前)。
**合回核验实况(2026-10-28 收口落账)**:①闸 09 指纹记账已落位(iter40 `33a45339`:91d45583cf6d→8467b4588a20,按闸壳同款算法对用户探跑日志实算,红项 2 条收敛为 1 条=只降不升;与合并后 master 树实测红集一致——battle_orchestrator 行数红项随拆件还债消失,level_map_screen 22>21 存量归迭代41 卡③)。②master 在收口期三次前移(6326b083 EV 重锚+术语批尾/21cd0f2e 挂死防护·probe_gate 件/6139d2de 迭代39 批后收尾,另有 c5382032 bp 对拍载体退役),iter40 已在 worktree 全数并入(0166df26/185bf815/95a86cee,仅验证集清单.md 一次冲突=机器重生成解),各 master 侧批均自带在册代码域回执。③**全量域验收回执未取得=用户 2026-10-28 特许免闸直合**(用户原话「不用跑了;我特许的」)——合回由用户本人执行(合并提交 `514457d1`,`--no-ff` 带消息,守卫对用户手工合并不设防);本报告审计判定不受影响,但「合回前独立审计通过+所选域全绿」的标准链在回执环节断于用户特许,如实记档不作绿报。
## 结论
**通过**——F1 已按用户裁修复入库(iter40 `8a319369`);F2/F3 记录性例外;未过项零。合回实况见「合回核验实况」(全量回执环节=用户特许免闸,非审计判通过)。
@@ -1,393 +0,0 @@
# 需求卡片:B1 战斗域拆件批(gdstyle 存量债·波 1+波 3+damage/treasure 收编)
- 版本:**v1.1**(2026-10-27 用户四项裁决落死——零待裁点;自审六查+grilling 自检一轮全折入,记录见 §12)
- 来源:[待办清单](../待办清单.md)「gdstyle 存量债全量清偿——216 键按病根分波整改」条目(2026-10-26 登记,P0,状态=文档设计已闭合+已写卡)(唯一事实源:[architecture](../design/engineering/architecture/architecture.md) **v1.19**「战斗编排域拆件定稿」节全文+功能层表 BattleFxHost/RewardGrant 两行)
- 归并与账目:[审计报告](./审计-gdstyle存量债清点与清偿方案-2026-10-26.md) §六第 7 条(2026-10-27 写卡整合裁定)——本卡收编波 1(22 键)+波 3(12 键)+damage_controller(9 键)+treasure_interact_controller(2 键)=**45 键**;v1.1 全清口径=44 键卡内清零义务+1 键豁免登记归账(§11 裁决记录④)
- 归属:`game/core/` 新二件+battle_orchestrator/settlement/ 两段/damage_controller/settlement_table 拆段+treasure_interact_controller 三触点分家+`game/data/schemas/` 新两段件+测试与装配面改址+static_scan 两清单随动
- 排期:未编入(迭代批卡片;估时 ≈5.25 个工作日,区间 5.0–5.75)
- 开工门:U0+复核门过(§12);**零待裁点(§11 2026-10-27 用户裁决记录)——可编入迭代**
- 同日姊妹卡:核心数据面结构收敛批(卡 2)、呈现层结构收敛批(卡 3)——整合裁定后三卡文件交叠为零
## 0. 前置依赖与并行性
- **第〇步核对(2026-10-27 写卡会话;v1.1 修订会话复核)**:来源条目=设计线条目(gdstyle 存量债清偿,逐波设计段闭合),波 1 闭合凭据=architecture v1.19(「战斗编排域拆件定稿」节+功能层两新件行;v1.19=2026-10-27 全清设计补课——组合根句柄面与测量面两处 S13 豁免登记,为本卡全清口径豁免支臂的同族先例),状态已到「已写卡」,放行。波 3/damage/treasure 三收编件按 §六第 5 条定性纯代码(零设计改动)+重测读数写卡。
- **attune 族领地隔离**:同调配装 8 成员原位保留(拆件定稿节第 4 款)——语义领地归迭代 39 副卡(AttuneLoadout 充能单源化)。本卡禁触 attune 族与 adventure_runner/level_runner/board_view 三宿主(迭代 39 在册规避);level_runner 对本卡零改动(其 treasure_inventory 注入 `level_runner.gd:502` 与 set_treasure_unlocked `:640` 走宿主公有面不变)。
- **并行冲突注记**:与卡 2(波 2/4/8 core/data 面+effect_engine)、卡 3(波 6/8 呈现面)文件交叠零(整合裁定消除);与波 7 现成卡(结构小件定点修批 v1.3,2026-10-26 修订定稿)文件交叠零。同迭代排波先后自便(本卡自持 worktree 批)。
- **PARITY 触面注记**:本卡改动面命中 `run_all_gates.sh:227` PARITY_TOUCH_FACES 四路径(battle_orchestrator.gd/settlement//damage_controller.gd+game/data/tables/〔settlement.tres 重建〕)——对拍发起已裁停(§11 裁决记录①),触面判定仍在每次跑批显式呈报;若用户改裁实跑按契约 4 保留机制。
## 1. 目标与完成定义
**目标**:battle_orchestrator(1313 行/50 类变量/S13 全库单文件最大户)按变化原因拆出 **BattleFxHost**(效果引擎宿主件)与 **RewardGrant**(奖励授予件)两协作件;settlement/ 授予段与战斗段随动改指;grant/combat 两段 run() 与 settlement_table.validate() 段内拆私有函数族;settlement_table schema 拆两个子 Resource 嵌套段(类变量 18→3)+.tres 单文件嵌套重建+消费方改址;宿主超标函数 begin_battle/_place_variants 函数级拆分与 _emit_row 参数束改形全清(§11 裁决记录③);damage_controller 函数级拆分+open_ticket 参数束;treasure_interact_controller 三触点分家+ctx 束构造。**游戏行为零变化**(契约 1),iter38 行数恶化债(c4c69701)本批还债归绿。
**改动单元清单**(与 §7 文件结构图同源):
| # | 单元 | 内容 |
|---|---|---|
| u1 | BattleFxHost 建件+fx 族迁移 | 事件发射面(_fx_emit)、事实判定(_fx_fact)、AC 基线与本轮/本战累积、bonus_delta 四轴累积(战末宿主 drain)、揭示待兑队列与兑付(含 _fx_revealing 再入闸)、round/battle 桶计数器持有(桶随编排器生灭)、round_start 发射、订阅重建 |
| u2 | RewardGrant 建件+grant 族迁移 | 极性路由兑付(grant_routed)、三种行应用(flat/percent/gp)、伤害单据提交面(submit 族)、清图奖励与身份授予、GP 缓冲 escrow、案C 暂存闸(defer) |
| u3 | use_treasure 拆分+三触点分家 | use_treasure 四步编排迁 RewardGrant+体拆分;treasure_interact_controller 经组合根现值回调改注 RewardGrant,minesweeper 读与 attune_convert_state 仍走宿主取值回调(双取值面) |
| u4 | 段类随动 | GrantSegment/CombatSegment 构造注入直持宿主+两新件三引用(Middle Man 禁壳,调用点改指;读写面=拆件定稿节第 3 款点名清单) |
| u5 | run() 族拆分+宿主超标函数拆分全清 | grant_segment.run()+_judge_seal、combat_segment.run()、settlement_table.validate() 段内拆私有函数族;begin_battle(141 行/17 分支/16 局部/7 return 四键)与 _place_variants(52 行/14 局部/6 嵌套三键)分段拆族、_emit_row 参数束改形(8→5)——三函数键全清 |
| u6 | damage_controller 拆分 | open_ticket 参数束(4 参 spec 形态)、_hero_attack_ctx/_hero_attack_redeem/_resolve_enemy_skill 拆分、类变量 19→15 收敛(inject 束+fx_calls 束) |
| u7 | 改址+随动 | 测试/探针/装配面改址 123 处(§3 G11 清单)+settlement 列消费改址 97 处(§3 G15 清单);static_scan.sh S7_B1_SET/S8_FILES 登记两新件 |
| u8 | 撤销证明+产出物 | 逐 wr 撤销证明;三份产出物落位 |
| u9 | settlement 拆段 | schema 拆两子 Resource 段件(「结算结构与封印溢价」7 列/「伤害掷点与护甲」10 列,segment_order 留主表——主表三列形)+settlement.tres 单文件嵌套重建+消费方改址 97 处+validate 校验随动(契约 10) |
**完成定义**:
1. u1–u9 落地;代码域闸全绿;行数恶化债归绿——拆件后宿主与两新件文件行数全部 ≤1000(宿主实测预估 ≈950,T3 分段函数壳与束形改形开销已计)。
2. 45 键账逐键核对(读数表进实现报告):44 键零超标命中逐键落地(机制清单见 §11 裁决记录②③)+battle_orchestrator 类变量键 50→38 豁免登记归账(§11 裁决记录④——登记义务随批走反哺点清单);**零「残留申报/改善非清零」形态**(该两形态已废)。
3. 行为零变化验收落地(§11 裁决记录①替代验收):批末 dump_battle 六组逐行 diff 非空即红+现役同种子断言面全绿。
4. 撤销证明逐 wr 行落地;三份产出物写齐(T7);独立验收审计过。
## 2. 设计事实源
| # | 出处 | 取用条款 |
|---|---|---|
| D1 | [architecture](../design/engineering/architecture/architecture.md) **v1.19** | 「战斗编排域拆件定稿」节八款全文(轴甲两件/跨件单向接线/段类随动读写面点名/attune 原位/呈现零变化/S13 键账收敛义务/验收红线/S7-S8 随动——其中验收红线款「S13 改善非清零口径」句被 2026-10-27 用户裁决取代,卡内执行全清口径、该句改写义务入反哺点清单)+功能层表 BattleFxHost 行(消费依赖 9 类)与 RewardGrant 行(消费依赖 12 类)+battle_orchestrator 行过渡注记 |
| D2 | [审计报告](./审计-gdstyle存量债清点与清偿方案-2026-10-26.md) | §三波次表(波 1/3/5 病根与注意)、§六第 5 条(open_ticket 12 参单据声明形态定性)、第 6 条(独立审查 6 组折入)、第 7 条(三卡整合裁定与 45 键账目) |
| D3 | [战斗结算](../design/gdd/systems/战斗循环/战斗结算.md)(只读引用) | :175「单据九个栏目」=单据字典语义面契约(兑付配方/来源三件/显示名/通道/攻击类型/威力基数/目标规则/必中附加分量),未绑定函数签名——本卡零修订(同步面见 §6) |
## 3. 现状事实(2026-10-27 写卡会话实查于 master 8b146321;开工日 T0 复核行号)
| # | 事实 | 出处 |
|---|---|---|
| G1 | battle_orchestrator.gd 实测 1313 行(gdstyle 读数 1314,口径差 1 以闸为准;基线登记 1302——**恶化债在案**);类变量 50(逐员对账一致);信号 4/const 2。键 22 条=行数+类变量+begin_battle×4+_place_variants×3+use_treasure×4+_grant_routed 参数+_dispatch_row/_apply_percent_row/_apply_gp_row 参数×3+_apply_flat_row 参数+返回+_submit_flat_hero 参数+_fx_fact 返回+_emit_row 参数 | `game/core/battle_orchestrator.gd` 全读+`python tools/gdstyle_gate.py` 实跑(216 命中/恶化 2)+`tools/gdstyle_baseline.txt` |
| G2 | fx 族成员 11:_fx_hero_ac_base:78/_fx_ac_round:79/_fx_ac_battle:81/_fx_bonus_delta:82/_fx_new_resource_types:83/_fx_pending_reveals:84/_fx_revealing:85/_fx:91/fx_counters_round:92/fx_counters_battle:93/counters_ctx:94;fx 族函数 9:_fx_emit:98/_emit_round_start:107/_sync_hero_ac:118/_apply_ac_bonus:126/_fx_enqueue_reveal:138/_flush_pending_reveals:145(fx_reveal 流 :158 随件迁移点)/_fx_fact:173。fx_counters_round/battle 两成员在 _init:283-284 挂入 counters_ctx 后全库零读者(「同物异名同字典」自注)——迁入后可删 | 实读+grep 全库(tests 命中均为行键文本/ctx 读) |
| G3 | grant 族成员 3:escrow:53/_defer_board_damage:59/_deferred_board:60;grant 族函数 11:use_treasure:710(62 行/8 返回/18 分支/11 局部)/_grant_routed:778(8 参)/_dispatch_row:810(6 参)/_apply_percent_row:820(6 参)/_apply_gp_row:844(6 参)/_apply_flat_row:859(7 参/9 返回)/_submit:900/_outcome_of:909/_submit_flat_hero:914(7 参)/_grant_clear_reward:924/_grant_clear_identity:943。_pool_effective:1016/perfect_sweep_earned:1312/四 helper(_feat_yield_adjust:654/_harmful_variants:668/_harmful_adjacent:680/_hits_of:691)留宿主(拆件定稿节第 3 款点名) | 实读 |
| G4 | 宿主保留面(拆件定稿节第 1 款):状态机与生命周期(begin_battle:310-449/_install_new_board:452/_battle_over:1121)、轮 facts 缓冲(_facts_reveals/seals/path:55-57)、A2 三事件订阅(_on_cell_revealed:586/_on_seal_judged:615/_on_round_end:619)、五段驱动(_settle:634)、attune 族 8 成员原位(attune_has/attune_param_sum/_attune_charge_safe_row/_reseed_attune_charges/attune_convert_state/_attune_safe_seen 等 :74-76/:199-265)、行发射基建(_emit_row:1269/_assert_row_source:1294/_fatal:1304)、呈现投影(presentation_snapshot:1179/diagnostic_snapshot:1241——两出口均不读迁移态,实查载荷字段全宿主成员)、刷新面(can_refresh:1100/player_request_refresh:1110)、nest_preview_count:80 | 实读 |
| G5 | grant_segment.gd 329 行:run() :18-229(211 行/36 局部/33 分支/6 嵌套——全库最大单函数)、_judge_seal :234-316(84 行/14 分支/11 局部/6 嵌套)、_apply_counter_hit:320/_apply_material_hit:326。对迁移面引用实测:oc._grant_routed×5(:59/:122/:290/:316/:329)/oc._submit×6(:79/:114/:127/:156/:195/:209)/escrow 写 :217/_fx_new_resource_types :42-44/_feat_first_dig_used :46/:74-75/_fx_bonus_delta 写 :108-109/:266-267/_apply_ac_bonus :151/:263/_fx_enqueue_reveal :67/:121/_flush_pending_reveals :228/_grant_clear_reward :227/counters_ctx :100/:202/:322/oc._fx(engine 判定):224;另有 oc._emit_row 直调 5 处(:33/:218/:271/:281/:309——经宿主行发射单点,留守不改指、随 T3 束形改参) | `game/core/settlement/grant_segment.gd` 全读 |
| G6 | combat_segment.gd 100 行:run() :17-100(83 行/13 局部)。对迁移面引用实测:_defer_board_damage 复位 :18、_deferred_board 结账 :92-99、_damage.dig_streak/charge_layers 注入 :29/:32、_hits_of :50(宿主 helper 留守);_emit_row 零直调(伤害行经 damage_controller emit_row_cb) | `game/core/settlement/combat_segment.gd` 全读 |
| G7 | aura/decay/verdict 三段对迁移面引用 **零命中**(grep 实测)——维持 _init(host) 单引用,不入三引用随动面 | grep 实测 |
| G8 | settlement_table.gd 89 行:@export 18 列(=类变量键 18/15 的全部构成——表 schema 数据列)、validate() :44-89(16 分支)、结构冻结 const 4(ARMOR_KEYS/ATTACK_TYPE_KEYS/FROZEN_SEGMENT_ORDER/P_PERFECT_DOMAIN——const 不计类变量)。18 列全集=equivalence_ref_damage/p_perfect/seal_hit_premium/segment_order/source_label_map/effect_pool_map/pool_clamp_lo/pool_clamp_hi/round_direction/armor_effectiveness/roll_faces/attack_bonus/roll_tier_bounds/roll_tier_discounts/crit_roll/crit_multiplier/damage_floor/armor_roll_stream | `game/data/schemas/settlement_table.gd` 全读 |
| G9 | damage_controller.gd 629 行/类变量 19(逐员对账一致):open_ticket :144-173(12 参——单据声明形态,返回单据字典含九栏目+requires/source_unit)、_hero_attack_ctx :266-325(61 行/9 分支/16 局部)、_hero_attack_base_value :330-360(达标)、_hero_attack_redeem :365-417(54 行/10 分支/12 局部)、_resolve_enemy_skill :440-482(13 局部)、fx_reveal_request/fx_ac_request :99-100(begin_battle :393-394 同点注入)、dig_streak/charge_layers/rider_tier×2 :51-54(combat_segment 与 begin_battle 注入) | `game/core/damage_controller.gd` 实读 |
| G10 | treasure_interact_controller.gd 159 行:_init :20-28(7 参)、inventory_projection :102-146(11 局部);三触点实测——use_treasure 经 _settlement_get :85-89、minesweeper 读 :107-111、attune_convert_state :113。构造点唯一=main_ui_build.gd:66-67(两 lambda 现值回调) | `game/presentation/treasure_interact_controller.gd` 全读+grep |
| G11 | 测试/探针/装配面改址清单(grep 实测,非注释直引):**counters_ctx 80 处**(adventure_feats_test 71/treasure_effects_test 5/round_flow_skill_pool_test 3〔:653/:673/:711/:1019 等〕/settle_segments_test 1);**_fx_emit 4**(adventure_feats :751-754);**_fx_enqueue_reveal 2+_flush_pending_reveals 2**(round_flow :1040-1041/:1057-1058);**_grant_routed 8**(seal_polarity :724/:732/:743/:752/:754、level_shop_economy :902/:924、meta_progression_forge :676);**_grant_clear_reward 2**(seal_polarity :380/:395);**use_treasure 3**(treasure_effects :167/:236/:285);**.escrow 成员直读 3**(level_shop :892/:894/:904——:810-850 系行载荷键零改址);**open_ticket 直调 16**(damage_controller_test 15+system_contracts_test :74);**构造点 1**(main_ui_build :66-67);**段构造 2 行**(settle_segments_test :20/:22)。合计 **123 处**。零改址面:nest_preview_count(main.gd:531-532/treasure_effects:151——留宿主)、attune_convert_state 2/attune_param_sum 3(treasure_effects——留宿主)、query_reward_identity/presentation_snapshot/diagnostic_snapshot(board_resolvers:34/:32、hud_presenter:41/:329、main_debug_flow:14、ui_tune_probe:112、ui_click_probe:890、damage_probe:338/:421、auto_player——留宿主)、行协议 escrow 键(battle_log_view:160/level_shop _escrow_sum_of)、cross_system_flow:70 与 adventure_feats:496/:746 的 open_ticket 均为 triggers 载荷字符串非函数调用 | grep 全库实测 |
| G12 | static_scan.sh 两清单各 7 文件:S8_FILES :315、S7_B1_SET :357(battle_orchestrator+settlement/ 五段+damage_controller);PARITY_TOUCH_FACES=`tools/run_all_gates.sh:227-236`(含 game/data/tables/ 面——settlement.tres 重建命中) | 实读 |
| G13 | GDD 定性:`design/gdd/systems/战斗循环/战斗结算.md:175` 描述单据九栏目(语义面),全节无函数签名契约——open_ticket 参数收束定性纯代码(与审计 §六第 5 条一致) | 实查 |
| G14 | 事件总线现状:minesweeper 三信号连接宿主方法(_init:296-298);damage/action_economy/reward_economy 三 set_fx 注入(_init:293-295);_damage.emit_row_cb = _emit_row(_init:292)——拆件后经 fx_host.engine/counters_ctx 转注,形态不变 | 实读 |
| G15 | settlement 表 18 数据列全库消费实测:`db.settlement.<列>`/`_db.settlement.<列>` 链式访问 96 处/87 行/15 文件(产品面 28 行 6 文件=damage_controller 21+battle_orchestrator 2+effect_engine 1+grant_segment 1+combat_segment 1+battle_log_view 2;测试与 sim 面 59 行 9 文件=table_structure_guard 12+damage_controller_test 12+damage_probe 10+roll_multiplier 9+damage_math 7+round_flow 5+seal_polarity 2+system_contracts 1+player_copy_sweep 1)+局部表引用形态 2 处(config_db_cross_validator :46/:52——st_tab.effect_pool_map/source_label_map);segment_order 直读 1 处(round_flow :381——留主表零改址);p_perfect/equivalence_ref_damage 零外部读者(纯表值)。**改址合计=97 处**(core 段 35=链式 33+cross_validator 2;damage_roll 段 62) | grep 全库实测(2026-10-27 修订会话) |
| G16 | 全库 `.tres` 零嵌套 sub_resource、`game/data/schemas/` 零段类 Resource 先例(grep 实测)——settlement 拆段为全库首个子 Resource 嵌套 schema(Godot 标准 .tres 能力,engine-reference 破坏性变更表仅 duplicate 语义注意) | grep 实测+engine-reference 查核 |
## 4. 设计契约(红线,违反 = L3 停机呈报)
🔴 **契约 1 · 行为零变化**:RNG 消费序零漂移——fx_reveal 封闭流随件迁移**取号序不变**(_flush_pending_reveals 掷格时机/候选序/流名逐字,G2 迁移点 :158);信号顺序契约冻结(step_row/battle_finished/round_started/board_changed/settlement_snapshot 发射点与时序零改动);明细行协议词表零触碰(基础 9 类+扩展行 effect_id 词表与头注清单不动——_emit_row 参数束改形只动函数形参、行字典字段与 step_row 载荷逐字不变);同种子逐位一致(§11 裁决记录①替代验收:dump_battle JSONL 六组逐行 diff 非空即红+现役同种子断言面全绿)。
🔴 **契约 2 · 行数恶化债还债归绿**:iter38 特批带红合并挂账(commit c4c69701,battle_orchestrator 行数 1314>基线 1302)本批还债——拆件后宿主与两新件文件行数全部 ≤1000;禁以 refresh 换绿、禁删注释凑行数。
🔴 **契约 3 · S13 键账纪律**:`tools/gdstyle_baseline.txt` 禁改禁 refresh;还债=数值下降自然绿;**12 个随迁键卡内收敛为本批义务**(use_treasure×4/_grant_routed 参数 8/_dispatch_row/_apply_percent_row/_apply_gp_row 参数×3/_apply_flat_row 参数+返回/_submit_flat_hero 参数/_fx_fact 返回——随函数迁入新文件即基线外 NEW,禁波 0 合并 refresh 吸收);宿主超标函数键(begin_battle×4+_place_variants×3+_emit_row×1)随 T3 全清(§11 裁决记录③);battle_orchestrator 类变量键按豁免登记归账(§11 裁决记录④——键永久基线内、禁再恶化);机检键与卡内契约互斥时实现段一律停卡呈报;禁为迎合机检消息文本保留或新增无效成员/别名(§13)。
🔴 **契约 4 · PARITY 触面(对拍已裁停——§11 裁决记录①)**:battle_orchestrator.gd/settlement//damage_controller.gd/game/data/tables/(settlement.tres 重建)四面被改即触对拍触面表——本批对拍**不发起**,替代验收=既有 `sim/dump_battle.gd` 改前改后 JSONL 逐行 diff(种子矩阵 {42, 779401, 779501}×关卡 {1, 2} 六组,零新码)+现役同种子断言面(§8.1 wr10);若用户改裁实跑,按 PARITY_APPROVED=1 机制执行(批末设变量跑全套闸即实跑、对拍非零差异即红、**不得借机重锚**——机制指引保留防未来翻案无据)。
🔴 **契约 5 · 跨件单向接线(禁 RefCounted 双向环)**:RewardGrant 持 BattleFxHost 引用(treasure_used 发射与 counter_spend 消费);BattleFxHost 对授予面走 bind 时注入的兑付 Callable(揭示队列 flush 回调)——禁反向强引用。行发射经注入 emit Callable(协议面单点留宿主,CurioDeck bind_handlers 同款先例);fatal 经注入 Callable 转宿主 _fatal(battle_result 状态机唯一写点留宿主);facts 缓冲留宿主、fx 件经注入 facts Callable 取值;_seal_consumed 留宿主(与 A2 seal_judged 订阅同域)。禁件回调宿主私有族、禁转发壳(Middle Man)。
🔴 **契约 6 · 呈现零变化**:presentation_snapshot/diagnostic_snapshot 两出口签名与载荷逐字不变(G4 实查不读迁移态,零改写压力);treasure_interact_controller 三触点分家——use_treasure 经组合根现值回调改注 RewardGrant(**每战新建编排器,禁一次性直引防悬挂**),minesweeper 读与 attune_convert_state 仍走宿主取值回调(双取值面);nest_preview_count 直读面零变化(main.gd:531-532 与 treasure_effects_test:151 冻结零改址)。
🔴 **契约 7 · attune 族原位**:同调配装 8 成员不进新件(迭代 39 副卡语义领地);RewardGrant 经宿主 attune 读投影 Callable 取 _attune_safe_seen(use_treasure 拒绝文案读数);attune_convert_state/attune_param_sum 留宿主。
🔴 **契约 8 · open_ticket 参数束不改单据栏目**:参数收束为 spec 束形态(4 参),返回单据字典九栏目与 requires/source_unit 键逐字不变(GDD :175 九栏目为语义面契约、无签名绑定——G13);spec 必载键(channel/base_value/target_rule/ri)缺载即 assert(fail-fast 同现行缺省纪律);禁改单据字段名、禁改明细行发射协议。
🔴 **契约 9 · 测试改址非削弱**:≈220 处改址(G11 123 处+G15 97 处)=访问路径改写与 spec/head 束键值搬运,断言语义与判据逐条保持;实现期不得借改址删断言/放宽判据(测试削弱申报=零,§8.2)。
🔴 **契约 10 · settlement 拆表数值零变化**:18 数据列值迁两段**逐字不变**(settlement.tres 表值与尾注批注史逐字保留——只挪结构不挪值);settlement.tres **单文件保持**(子 Resource 嵌套序列化=Godot 标准 .tres 能力,G16);ConfigDB 加载面不变(`db.settlement` 仍 SettlementTable 实例,load_tables 与 `config_db.gd:19/:40` 无改);segment_order 留主表(段序骨架列——round_flow :380-382 `SettlementTable.FROZEN_SEGMENT_ORDER` 断言引用面零变化,const 四枚随主表);消费方改址 97 处=访问路径改写,值语义零变化;validate() 错误载荷逐字同构。
## 5. 范围边界
**做**:u1–u9(§7 全部任务卡);§8 全部验收;撤销证明;产出物。
**不做**(去向明示):
- attune 族迁移/AttuneLoadout 建件 → 迭代 39 副卡(在册);
- aura/decay/verdict 三段(迁移面零触及,G7)→ 零改动;
- effect_engine 数据面改造/其余数据面 schema 文件 → 卡 2(核心数据面结构收敛批)——本卡 schema 新建面仅 settlement 两段件(G16 落点唯一);
- 呈现层视图面(golden 锚批)→ 卡 3(呈现层结构收敛批);
- 波 0 基线对账 refresh(陈旧键清理)→ 直改批不写卡,本卡只保证不新增恶化;
- MC 调参与数值表任何值改动 → 零数值改动(契约 10 拆段只挪结构),MC 不跑(无数值改动零跑铁规);
- design/ 与根规则文件任何编辑 → 反哺点清单(§6)。
## 6. 关联文档同步面
| 文档 | 关联点(本批实现会改变它的哪条陈述) | 同步义务 |
|---|---|---|
| `design/engineering/architecture/architecture.md` | 功能层 battle_orchestrator 行「已定稿拆出 BattleFxHost」过渡注记改写为现状;BattleFxHost/RewardGrant 两行「设计定稿——实现批建件」标注换代为现状;「战斗编排域拆件定稿」节头注转现状登记;验收红线款「S13 改善非清零口径」句随全清裁决改写为全清义务(§11 裁决记录③);S13 豁免登记节补第三条——battle_orchestrator 类变量键(宿主保留面承载面豁免,§11 裁决记录④) | 反哺点 · 列清单 |
| `game/tests/验证集清单.md` | ≈220 处改址与四新件断言登记的清单同步(机器提取重生成) | 批内机械同步(game 内 .md,非禁写面) |
| `design/gdd/systems/战斗循环/战斗结算.md` | **零修订预期**——单据九栏目与行协议词表零触碰(契约 8);settlement 拆段为纯结构(契约 10 表值零变化);若实现期发现冲突即停卡呈报 | 无(零修订预期) |
| `待办清单.md` | 来源条目状态推进(实现批收尾由 batch-closure 承接) | 反哺点 · 列清单 |
## 7. 任务卡
### 卡前 · 文件结构图
| 文件 | 职责 | 行为改动 |
|---|---|---|
| `game/core/battle_fx_host.gd`(**新增**) | 效果引擎宿主件:fx_emit 发射面/fx_fact 事实判定/AC 三值累积与同步/bonus_delta 累积与 drain/揭示队列与兑付(再入闸)/两桶+ctx 持有/round_start 发射/订阅重建(结构图与预检互指:标「新增」,理由见 §7 预检) | 新件(承载迁移态,行为不变)→ wr1 |
| `game/core/reward_grant.gd`(**新增**) | 奖励授予件:grant_routed 极性路由/三种行应用(flat 拆四)/submit 案C 闸/清图奖励/escrow/use_treasure 四步(拆 _apply_use_kinds) | 新件(承载迁移态+12 随迁键收敛)→ wr2/wr3 |
| `game/core/battle_orchestrator.gd`(修改) | 宿主保留面(G4)+建件接线(_init 建两件并注入引用束/bind_grant 接线)+begin_battle 各调用点改指+_on_cell_revealed 旁路读改 reveal_busy+_battle_over bonus drain+新增 _fx_host_fact 方法+组件出口两枚:`fx_host() -> BattleFxHost`/`reward_grant() -> RewardGrant`(取件方法非委托壳——姊妹卡 hero()/stop() 同款先例,呈现与测试经此取件,禁链式穿透)+begin_battle/_place_variants 分段拆族+_emit_row 束形(T3) | 结构改动,行为不变 → wr1/wr2/wr5 |
| `game/core/settlement/grant_segment.gd`(修改) | 三引用构造+读写面改指(G5 清单)+run() 拆私有函数族+_judge_seal 两分+oc._emit_row 5 调用点随 T3 束形改参 | 结构改动 → wr4/wr5 |
| `game/core/settlement/combat_segment.gd`(修改) | 三引用构造+defer/dig_streak/charge_layers 改指+run() 拆三私有 | 结构改动 → wr4/wr5 |
| `game/data/schemas/settlement_core_table.gd`(**新增**) | 「结算结构与封印溢价」段 Resource(纯数据载体):source_label_map/effect_pool_map/pool_clamp_lo/pool_clamp_hi/round_direction/p_perfect/seal_hit_premium 七列,值逐字迁入 | 新件(纯数据载体,行为不变)→ wr9 |
| `game/data/schemas/damage_roll_table.gd`(**新增**) | 「伤害掷点与护甲」段 Resource(纯数据载体):equivalence_ref_damage/armor_effectiveness/roll_faces/attack_bonus/roll_tier_bounds/roll_tier_discounts/crit_roll/crit_multiplier/damage_floor/armor_roll_stream 十列,值逐字迁入 | 新件(纯数据载体,行为不变)→ wr9 |
| `game/data/schemas/settlement_table.gd`(修改) | 主表三列形(segment_order 留主表+core+damage_roll——类变量 18→3)+validate() 拆四私有校验器(错误载荷逐字,列读改段地址) | 结构改动 → wr5/wr9 |
| `game/data/tables/settlement.tres`(修改) | 单文件嵌套重建(sub_resource 两段嵌入;18 列值与尾注批注史逐字保留——契约 10) | 数据件结构重建,值零变化 → wr9 |
| `game/core/damage_controller.gd`(修改) | open_ticket spec 束+_hero_attack_ctx/_hero_attack_redeem/_resolve_enemy_skill 拆分+类变量收敛(inject 束+fx_calls 束)+emit_row_cb 注释与 6 调用点随 T3 束形改参 | 结构改动 → wr6 |
| `game/presentation/treasure_interact_controller.gd`(修改) | _init(ctx 束)+attempt_use 改注 grant_get+inventory_projection 拆两私有(三触点分家) | 结构改动 → wr3 |
| `game/presentation/main_ui_build.gd`(修改) | 秘宝交互构造改 ctx 束形态(:66-67 一处) | 装配面改址 → wr3 |
| `game/tests/static_scan.sh`(修改,工具面随动) | S7_B1_SET/S8_FILES 各增两新件路径+头注计数 7→9 | 工具面随动(非行为)→ wr7 |
| `game/tests/` 改址 9 文件(修改) | G11 清单:adventure_feats 75/treasure_effects 8/round_flow 7/seal_polarity 7+2〔G15〕/level_shop 5/forge 1/damage_controller_test 15+12〔G15〕/system_contracts 1+1〔G15〕/settle_segments 3;另 G15 清单:table_structure_guard 12/damage_probe 10/roll_multiplier 9/damage_math 7/round_flow 5/player_copy_sweep 1;core/presentation 面改址:damage_controller 21/battle_orchestrator 2/effect_engine 1/两段各 1/battle_log_view 2/config_db_cross_validator 2 | 测量面改址 → wr1/wr2/wr3/wr6/wr9 |
| `game/tests/unit/core/settle_segments_test.gd`(修改) | 两新件直构断言+grant/combat 段三引用构造改形 | 新增断言(随 T2/T4)→ wr4 |
(两新件、两段 schema 件与新增束的复用/唯一性核查见「落位与可复用性预检」;settlement.tres 仍单文件——嵌套重建非新增 .tres。)
### 接口块
**BattleFxHost(`game/core/battle_fx_host.gd`)**
```gdscript
class_name BattleFxHost extends RefCounted # 生命周期=随编排器(编排器 _init 同建同灭;桶随编排器生灭语义不变)
func _init(bundle: Dictionary) -> void
# bundle 封闭键集(缺一键 assert——引用束注入防 _init max-parameters 新键;两新件消费依赖列):
# db:ConfigDb/rng:RngServiceCore(fx_reveal 封闭流)/minesweeper:MinesweeperRules(板读与 fx_reveal)/
# action_economy:ActionEconomy(queue_ap_delta/charge_layers/ap_exhausted_last_round)/
# damage:DamageController(set_hero_ac_override)/
# emit_cb:Callable(宿主 _emit_row——行协议面单点;T3 改 5 参束形后随束形)/
# facts_cb:Callable(宿主 _fx_host_fact——round_index/battle_index/seals_count/nest_count/hp_ratio 五事实宿主侧单点)
func bind_grant(cb: Callable) -> void # 揭示兑付回调=RewardGrant.grant_routed(宿主 _init 建两件后接线——
# 构造序解法:RewardGrant bundle 持 fx_host、fx_host 对授予面走注入 Callable,禁双向强引用)
var engine: EffectEngine # 效果引擎(原 _fx;宿主 _init 经此转注 damage/action_economy/reward_economy 三 set_fx)
var counters_ctx: EffectContext # 四桶引用束(round/battle 两桶本件自有;adventure/level 桶 begin_battle mount_buckets 挂引用)
func fx_emit(event: String, payload: Dictionary) -> Array # 原 _fx_emit——18 发射点统一入口
func emit_round_start() -> void # 原 _emit_round_start(含 ac_round 清零与同步)
func apply_ac_bonus(h: Dictionary) -> void # 原 _apply_ac_bonus
func enqueue_reveal() -> void # 原 _fx_enqueue_reveal
func flush_pending_reveals(ri: int) -> void # 原 _flush_pending_reveals(fx_reveal 流随件迁移取号序不变)
func rebuild_subscriptions(feats: Array, attunement: Array, tree_rules: Array) -> void # 原 _fx.rebuild 调用点(装载序 feats→treasure→树规则写死)
func mount_buckets(adv_bucket: Dictionary, level_bucket: Variant) -> void # begin_battle 桶挂引用(level 非 Dictionary 即不挂——现 :390-392 语义)
func reset_battle_state(ac_base: int) -> void # begin_battle 运行态清零(ac 三值/bonus_delta 四轴/new_resource_types/揭示队列+闸——现 :381-386 原序)
func bonus_delta_drain() -> Dictionary # 战末 drain(读后清零;宿主 _battle_over 单消费——现 :1132-1135 读改清三拍合一,时序等价)
func reveal_busy() -> bool # 揭示兑付中读投影(宿主 _on_cell_revealed 旁路判定——拆件定稿节第 6 款揭示态消费方)
# 内部:fx_fact(fact)(charge_layers 自答、余五事实转 facts_cb——2 返回);_sync_hero_ac(经 damage 注入引用)
# 类变量封闭面(14≤15):bundle 7 项+grant_cb+engine+counters_ctx+ac{base,round,battle}+_fx_bonus_delta+
# _fx_new_resource_types+reveal{queue,busy}——ac/reveal 两束键集封闭、头注声明(原 fx_counters_round/battle
# 两成员迁入即删——同物异名零读者,G2)
```
**RewardGrant(`game/core/reward_grant.gd`)**
```gdscript
class_name RewardGrant extends RefCounted # 生命周期=随编排器
func _init(bundle: Dictionary) -> void
# bundle 封闭键集(12 项):db:ConfigDb/reward_economy:RewardEconomy(polarity_row/grant/grant_clear/query_full_snapshot)/
# damage:DamageController(open_ticket/submit)/fx_host:BattleFxHost(treasure_used 发射与 counters_ctx 消费)/
# minesweeper:MinesweeperRules(校验回调/fx_reveal/remove_mines_in/hero_pos)/action_economy:ActionEconomy(相位闸/grant_ap/queue_ap_delta)/
# status_effects:StatusContainer(apply_effect)/units:UnitContainer(hero_unit/heal)/
# emit_cb:Callable/fatal_cb:Callable(宿主 _fatal——battle_result 唯一写点留宿主)/
# attune_safe_seen_cb:Callable(宿主 attune 读投影——use_treasure 拒绝文案)/pool_effective_cb:Callable(宿主 _pool_effective——percent 行池值读)
var escrow := 0 # 战斗内 GP 缓冲(原宿主成员语义逐字;宿主 _roll_gp_drop 读投影)
var defer := {"on": false, "queue": []} # 案C 暂存闸(原 _defer_board_damage/_deferred_board 二合一;键集封闭)
var treasure_inventory: TreasureItems = null # 经宿主 setter 转发注入(库存注入时序在宿主构造之后)
func bind_battle(ledger_ref: RunLedger) -> void # begin_battle 账本引用挂接(attune_charge_consume/vision_count_add 消费)
func reset_battle() -> void # begin_battle 现 :315 语义(escrow 清零+defer 复位)
func use_treasure(handle: int, target: Vector2i) -> Dictionary # 原 use_treasure 四步(拆 _apply_use_kinds——12 随迁键收敛)
func grant_routed(snap: Dictionary, polarity: String, att: Dictionary) -> bool # 原 _grant_routed
func submit(t: Dictionary, sync: bool) -> int # 原 _submit(案C 闸承载:defer.on 即入 defer.queue)
func outcome_of(ticket_id: int) -> String # 原 _outcome_of
func grant_clear_reward(ri: int, skip_on_refresh: bool, perfect: bool) -> void # 原 _grant_clear_reward(宿主态读经参传入)
# att 归因束封闭键集(全 grant 族共用):source_class:String/cell:Vector2i/ri:int/
# highlight:String(缺省"")/label_suffix:String(缺省"")/halve_pct:int(缺省 0)
# 内部族(签名随 att 束改形,全部 ≤5 参):_apply_use_kinds(v, target) -> Dictionary(拒收字典/空字典=受理)/
# _dispatch_row(row, att)/_apply_percent_row(row, att)/_apply_gp_row(row, att)/
# _apply_flat_row(row, att, sync) -> String(按 ctype 分派 _flat_action/_flat_blast/_flat_typed/_flat_heal 四私有,
# 返回 ≤6)/_submit_flat_hero(display, power, att, sync)/_grant_clear_identity(snap, ri, suffix)
# 类变量封闭面(15≤15):bundle 12 项+escrow+defer+treasure_inventory
```
**damage_controller 改形(`game/core/damage_controller.gd`)**
```gdscript
var inject := {"dig_streak": 0, "charge_layers": 0, "rider_tier_bonus": 0, "rider_tier_crit": false}
# 每轮/每战注入运行态(原四散成员收敛;键集封闭——combat_segment 写前两键、begin_battle 写后两键、
# _fx_fact/管线读同键;19→15 收敛之一)
var fx_calls := {"reveal": Callable(), "ac": Callable()}
# 效果引擎入站回调(原 fx_reveal_request/fx_ac_request;begin_battle 同点注入 fx_host 两方法 Callable)
func open_ticket(kind: String, source_class: String, display: String, spec: Dictionary = {}) -> Dictionary
# spec 必载键:channel/base_value/target_rule/ri(缺载 assert——fail-fast);可选键缺省=现签名缺省:
# origin_cell=(-1,-1)/attack_type=""/rider=0/highlight=""/context={}
# 返回单据字典九栏目+requires/source_unit 逐字不变(契约 8)
# 拆分族:_ctx_rewrites(t, target, matchup, ar_hits) -> Dictionary(按序改写族四拍——threshold/crit/discount/
# spike_ready/roll_read 穿线)/_ctx_clamp_delta(atk_type, armor, matchup) -> int(克制点数读值+订阅改写)/
# _kill_overflow(t, target, landed) -> void(kill 发射+贯穿弹射)/
# _enemy_roll(t) -> Dictionary(掷点/折扣/克制/池乘/下限)/_enemy_shield_apply(hits, total) -> Dictionary(damage_taken 施加面——{total,shield} 穿线)
```
**treasure_interact_controller 改形(`game/presentation/treasure_interact_controller.gd`)**
```gdscript
func _init(ctx: Dictionary) -> void
# ctx 封闭键集(8 项):db/meta/info_panel:HeroInfoPanelView/toast:ToastStack/board_view:BoardView/
# settlement_get:Callable(宿主取值回调——minesweeper 读与 attune_convert_state 双取值面之一)/
# runner_get:Callable/grant_get:Callable(现值回调——use_treasure 直注 RewardGrant,每战取现值防悬挂)
# attempt_use/on_slot_clicked 空值守卫升级:settlement/runner/grant 三现值同查(null 即静默 return——现 settlement null 同语义)
# inventory_projection 拆两私有:_projection_row(rec, cs) -> Dictionary+_auto_row(cs) -> Dictionary(自动兑付件展示行)
```
**段类随动(`game/core/settlement/grant_segment.gd`/`combat_segment.gd`)**
```gdscript
func _init(host, fx_host: BattleFxHost, reward_grant: RewardGrant) -> void # 三引用构造注入(两段同形)
# 读写面改指(拆件定稿节第 3 款点名+G5/G6 实测):
# grant 段:oc._grant_routed×5→reward_grant.grant_routed(att 束拼装)/oc._submit×6→reward_grant.submit/
# escrow 写→reward_grant.escrow/_fx_new_resource_types→fx_host._fx_new_resource_types/
# _apply_ac_bonus→fx_host.apply_ac_bonus/_fx_enqueue_reveal→fx_host.enqueue_reveal/
# _flush_pending_reveals→fx_host.flush_pending_reveals/_grant_clear_reward→reward_grant.grant_clear_reward
# (skip_on_refresh/perfect 两实参经宿主引用现读:oc._board_from_midround_refresh/oc.perfect_sweep_earned())/
# counters_ctx→fx_host.counters_ctx;_feat_first_dig_used 与四 helper 仍经宿主(留守面);
# oc._emit_row×5 直调留守(经宿主行发射单点,随 T3 束形改参——不改指)
# combat 段:_defer_board_damage 复位→reward_grant.defer["on"]=false/_deferred_board 结账→reward_grant.defer["queue"]/
# _damage.dig_streak/charge_layers→_damage.inject 同键/oc._fx→fx_host.engine(:224 finish_round_stop 判定,G5)
# aura/decay/verdict 三段维持 _init(host) 单引用(G7 迁移面零触及)
```
**settlement 拆段(`game/data/schemas/settlement_table.gd`+两段新件)**
```gdscript
# 主表三列形(类变量 18→3;const 四枚随主表):
@export var segment_order: PackedStringArray = [] # 结构冻结段序骨架——留主表(round_flow :380-382 SettlementTable.FROZEN_SEGMENT_ORDER 断言引用面零变化)
@export var core: SettlementCoreTable # 「结算结构与封印溢价」段(game/data/schemas/settlement_core_table.gd 新件,7 列)
@export var damage_roll: DamageRollTable # 「伤害掷点与护甲」段(game/data/schemas/damage_roll_table.gd 新件,10 列)
# SettlementCoreTable 7 列(值逐字迁入):source_label_map/effect_pool_map/pool_clamp_lo/pool_clamp_hi/
# round_direction/p_perfect/seal_hit_premium
# DamageRollTable 10 列(值逐字迁入):equivalence_ref_damage/armor_effectiveness/roll_faces/attack_bonus/
# roll_tier_bounds/roll_tier_discounts/crit_roll/crit_multiplier/damage_floor/armor_roll_stream
func validate() -> Array # 编排骨架:errs 建账+四私有校验+return(分支 ≤8)
# 私有族(errs: Array[Dictionary] 追加式,与现 fail-fast 载荷逐字同构;列读改段地址 core./damage_roll.):
# _validate_scalars(errs) # 标量域(damage_roll: roll_faces/crit_roll/crit_multiplier/damage_floor/attack_bonus/armor_roll_stream;core: p_perfect/seal_hit_premium)
# _validate_frozen(errs) # 结构冻结(segment_order 恒等〔主表〕;round_direction/pool_clamp〔core 段〕)
# _validate_tier_table(errs)# 档位表形状(damage_roll 段:bounds 升序/discounts 降序/档数=边界数+1)
# _validate_armor_matrix(errs) # 克制矩阵 3×3 域 [-3,+3](damage_roll.armor_effectiveness)
# 两段件=纯数据载体(零函数零随机零 await;各 7/10 类变量 ≤15);.tres 单文件嵌套重建(契约 10——18 列值与尾注批注史逐字保留)
```
**T 卡间接口**:T1 产出 BattleFxHost 全 API 与 fx 族改址完成态(T2/T4 取用 fx_host.engine/counters_ctx/三回调);T2 产出 RewardGrant 全 API、att 束键集、use_treasure 迁移完成态与 grant_get 回调(T3/T4 取用);T3 产出 _emit_row 束形与宿主超标函数拆分完成态(T4 段迁移直用新形);T4 产出段三引用构造形+settlement 三列主表面(T6 收尾对账取用);T5 产出 open_ticket spec 束形态(damage 测试改址——T5 卡内自取);各卡验收断言随卡落地。
### 落位与可复用性预检
| 新增件 | 复用面(为何不能复用既有) | 唯一面 | 分层与交互 |
|---|---|---|---|
| battle_fx_host.gd | 效果引擎宿主职责现散在 battle_orchestrator(本批迁出)——无同职责既有件;grep `BattleFxHost`/`battle_fx_host` 零命中;EffectEngine 是解释器本体非宿主(宿主=施加面+计数器桶+揭示队列),不可互代 | fx 族状态与施加面唯一所有者;桶随编排器生灭语义唯一落点 | Core 纯逻辑(RefCounted);由 battle_orchestrator _init 建并注入引用束;对宿主单向(兑付/发射/事实走注入 Callable——契约 5);随机只经注入 rng 的 fx_reveal 封闭流 |
| reward_grant.gd | 授予管线现散在 battle_orchestrator(本批迁出);grep 零同名类;B4 RewardEconomy 是资源身份/字典查询件(路由执行归 B1 授予段——architecture 功能层表明文),不可互代 | 奖励授予唯一兑付管线;escrow 与案C 闸唯一落点 | Core 纯逻辑;持 fx_host 引用(单向);宿主态(perfect/装板 provenance/attune/pool 值)全经参传或注入 Callable,不持宿主引用——禁环 |
| settlement_core_table.gd+damage_roll_table.gd(两段 schema 件) | 18 列全集实查**无既有等价结构**:全库 .tres 零嵌套 sub_resource、schemas/ 目录零段类 Resource 先例(G16 grep 实测)——复用既有扁平表即违「拆段只挪 settlement 结构」边界,复用其他表结构更无对应列语义;EffectContext 等引用束是运行期字典非 Resource schema,不可互代 | settlement 两段列的唯一承载;.tres 单文件嵌套重建唯一落点 | game/data/schemas/(表 schema 目录惯例:class_name <名>Table extends Resource、<名>_table.gd 文件名);SettlementTable 主表持两段字段;段件零函数零随机零 await |
| att 归因束/spec 束/ctx 束/inject/fx_calls 束/emit head 束(数据面约定,非新文件) | 项目 Dictionary 载荷惯例(行协议 extra/单据 context/encounter 装配同法);CurioFlowContext 先例同法(curio_interact_controller 装配 ctx)——不另立类型文件 | 每束键集封闭并头注声明(缺一 assert 或缺省显式);单一声明处=各件头注 | 随所属件生灭;键名在接口块定死,禁实现期增删 |
### T0 事实坐实+改前基线采集(≈0.25d)
- [ ] 复核 G1–G16 行号与读数(吸收并行批漂移);记录改前读数表:S13 六文件键读数(gdstyle_gate 实跑输出)+行数/类变量计数——进实现报告素材。可核查结果:改前读数表在案。
- [ ] 改前确定性基线采集:`…console.exe --headless --path . --script res://sim/dump_battle.gd -- <关卡> <种子>`(既有 dump 载体——step_row 逐行 JSON,关卡/种子两参数,零新码)跑种子矩阵 {42, 779401, 779501}×关卡 {1, 2},stdout 重定向落 `reports/` 实现报告素材目录(六文件)。可核查结果:改前 JSONL 六份在案(替代验收本体——§11 裁决记录①;批末 T6 按同参复跑逐行 diff)。
### T1 BattleFxHost 建件+fx 族迁移+S7/S8 登记(≈0.75d)
- [ ] 实装 battle_fx_host.gd(接口块全签名;fx 族 11 成员+9 函数自 battle_orchestrator :77-94/:97-196 语义逐字迁入;_fx_fact 改形两返回、charge_layers 自答余五事实转 facts_cb;ac/reveal 两束键集封闭)。可核查结果:件可 `new()` 直构单测。
- [ ] battle_orchestrator 接线:_init 建 _fx_host(引用束 7 键)→建 _reward_grant→`_fx_host.bind_grant(_reward_grant.grant_routed)`(构造序禁环)+组件出口 `fx_host()`/`reward_grant()` 两取件方法+`_damage.set_fx(_fx_host.engine, _fx_host.counters_ctx)` 等三处转注(G14)+新增 `_fx_host_fact(fact) -> Variant` 五事实方法(:173-196 五分支搬运);begin_battle 各调用点改指(reset_battle_state/mount_buckets/rebuild_subscriptions/board_installed emit/emit_round_start 原位替换)+fx_calls 注入;_on_cell_revealed 旁路改 `not _fx_host.reveal_busy()`(:592);_battle_over 改 bonus_delta_drain(:1132-1135);宿主 fx 族 11 成员删除(fx_counters 两零读者成员一并删——G2)。
- [ ] fx 族测试改址(G11,经组件出口):adventure_feats 75 处(counters_ctx 71+_fx_emit 4→`orch.fx_host().` 前缀);round_flow 7 处(counters_ctx 3+enqueue/flush 4→`o_fx.fx_host().`);treasure_effects 5 处(counters_ctx);settle_segments 1 处。
- [ ] static_scan.sh 两清单登记:S8_FILES :315 与 S7_B1_SET :357 各追加 `game/core/battle_fx_host.gd game/core/reward_grant.gd`+头注计数 7→9(:309)。可核查结果:S7/S8 段扫描含两新件且零命中。
- [ ] 验收步骤:〔fx1〕现役揭示管线断言改址后全绿(round_flow 扩展行收敛 V6:`o_fx._fx_host.enqueue_reveal()`→`flush_pending_reveals(1)`→兑付行/落空行同判据);〔fx2〕battle 桶隔离断言(round_flow :1019 改 `oB._fx_host.counters_ctx` 读 insurance_used=0);〔fx3〕空订阅零命中断言(adventure_feats :751-754 改 `_fx_host.fx_emit` 同判据)。撤销证明见 wr1。
### T2 RewardGrant 建件+grant 族迁移+use_treasure 拆分+三触点分家(≈1.0d)
- [ ] 实装 reward_grant.gd(接口块全签名;grant 族 3 成员+11 函数自 battle_orchestrator :698-957 语义逐字迁入;use_treasure 拆 `_apply_use_kinds(v, target) -> Dictionary`——③步逐 kind 应用迁出,四步编排骨架留守;_apply_flat_row 按 ctype 分派 _flat_action/_flat_blast/_flat_typed/_flat_heal;grant 族签名随 att 束改形)。可核查结果:12 随迁键在迁入形下逐键过阈值(T0 gdstyle 复跑两新件零基线外 NEW)。
- [ ] battle_orchestrator 接线:_init 建 _reward_grant(引用束 12 键)+`treasure_inventory` 改带 setter 转发(`set(v)` 同步写 _reward_grant.treasure_inventory——外部赋值路径零改址,G11 treasure_effects 三处直赋保持);begin_battle :315 改 `_reward_grant.reset_battle()`、:388 后加 `_reward_grant.bind_battle(_ledger)`;宿主 grant 族 3 成员删除;_roll_gp_drop 读 `_reward_grant.escrow`(:1169)。
- [ ] 三触点分家:treasure_interact_controller._init 改 ctx 束(8 键)+attempt_use 改 `grant_get.call().use_treasure(handle, target)`+inventory_projection 拆 _projection_row/_auto_row 两私有+守卫三现值同查;main_ui_build :66-67 构造改 ctx 束(新增 grant_get=经 `root.run_scope.settlement.reward_grant()` 现值取件、null 即 null——每战取现值防悬挂)。
- [ ] grant 族测试改址(G11,经组件出口):seal_polarity 7 处(_grant_routed 5 直调改 `settlement.reward_grant().grant_routed(snap, 极性, {source_class, cell, ri}` att 束+_grant_clear_reward 2 直调改三参形);level_shop 5 处(_grant_routed 2+.escrow 直读 3→`.reward_grant().escrow`);forge 1 处(_grant_routed att 束);treasure_effects 3 处(use_treasure→`obX.reward_grant().use_treasure`)。
- [ ] 验收步骤:〔rg1〕负向字典直验断言改址后全绿(seal_polarity :720-754 五型逐型同判据);〔rg2〕escrow 隔离断言(level_shop :892/:894/:904 改址后同值判据);〔rg3〕use_treasure 真链三例(treasure_effects :167/:236/:285——overlay/AP/拒绝零消耗同判据);〔rg4〕use_treasure 拆分后同种子受理序列逐位一致(T0 JSONL 批末复跑 diff 承载——§11 裁决记录①)。撤销证明见 wr2/wr3。
### T3 宿主超标函数拆分全清(≈0.5d)
- [ ] begin_battle 函数级拆分全清(141 行/17 分支/16 局部/7 return 四键清零):按现行执行序拆编排骨架+分段私有族(命名=`_begin_<段>` 形态——受理与账本挂接/装板与板态落值/桶挂接与订阅重建/运行态清零与轮始发射;拆后逐函数过 gdstyle 阈值,仍超者按同规则续分;段序/发射序/取号序逐字——以 T1/T2 改指后的现形为基准)。可核查结果:gdstyle 对 battle_orchestrator 四 begin_battle 键零命中。
- [ ] _place_variants 拆分(52 行/14 局部/6 嵌套三键清零):嵌套施加面拆私有(命名=`<名>_apply` 形态),主函数留编排序;拆后逐键过阈值。可核查结果:三键零命中。
- [ ] _emit_row 参数束改形(8 参→5 参,键清零):`_emit_row(head: Dictionary, ri: int, display: String, value: int, extra: Dictionary)`——head 封闭键集 {type, source_class, origin_cell, highlight(缺省"")} 头注声明;行字典字段与 step_row 载荷逐字不变(契约 1/6);调用点全量改形:host 14 处+damage_controller emit_row_cb 注释 :36 与 6 调用点+grant 段 oc._emit_row 5 调用点(combat 段零直调,G5/G6)+BattleFxHost/RewardGrant 接口块 emit_cb 注记随动。可核查结果:params 键零命中+现役断言面全绿(行载荷逐字)。撤销证明见 wr5。
### T4 段类随动+run() 族拆分+settlement 拆段(≈1.25d)
- [ ] 授予/战斗两段三引用构造(接口块签名);读写面改指按接口块清单逐条(G5 ×12 面+G6 ×3 面);aura/decay/verdict 三段零改动(G7);settle_segments_test :20/:22 两行构造改三参形(实例经 `oc.fx_host()`/`oc.reward_grant()` 取件)。
- [ ] grant_segment run() 拆私有函数族:`run(ri)` 编排骨架+`_reveal_batch(ri)`+`_reveal_safe(evt, snap, ri)`(施加面拆 `_reveal_safe_apply(dr_hits, evt, snap, ri)`)+`_reveal_mine(evt, snap, ri)`(施加面拆 `_reveal_mine_apply(mh_hits, snap, ri)`)+`_terrain_batch(ri)`+`_seal_batch(ri)`+`_round_end_apply(ri)`;_judge_seal 两分 `_judge_seal_hit(evt, ri)`(施加面拆 `_seal_hit_effects(fh_hits, cell, ri)`)+`_judge_seal_miss(evt, ri)`。段序/发射序逐字(run 内调用序=现行 :22-229 执行序)。
- [ ] combat_segment run() 拆:`run(ri)` 骨架+`_hero_strike(ri)`+`_enemy_actions(ri)`+`_board_deferred_settle(ri)`。
- [ ] settlement_table.validate() 拆四私有校验器(接口块签名;错误载荷逐字——列读经 core./damage_roll. 段地址,随本卡拆段项同批落地)。
- [ ] settlement 拆段(契约 10;§11 裁决记录②):实查 18 列分组在案(G8/G16——segment_order 留主表+两段 7+10 列)→新建 settlement_core_table.gd/damage_roll_table.gd(接口块全列)→settlement_table.gd 主表改三列形+validate 四私有校验器列读改址(错误载荷逐字)→settlement.tres 单文件嵌套重建(sub_resource 两段嵌入;18 列值与尾注批注史逐字保留)→消费方改址 97 处(G15 清单:core 段 35=`db.settlement.core.`/`st_tab.core.` 改写;damage_roll 段 62;segment_order 直读 1 处零改址;产品面 6 文件+tests/sim 面 9 文件+config_db_cross_validator)。可核查结果:〔st1〕表值逐字断言+〔st2〕validate 绿+〔st3〕消费改址断言(下条验收步骤)。
- [ ] 验收步骤:〔sg1〕同种子完整局 step_row 逐位一致(现役断言面全绿——round_flow/seal_polarity/level_shop 全套);〔sg2〕五段段直构断言(settle_segments_test 改形后绿);〔sg3〕validate 拆分后错误载荷逐字断言(现役 validate 单测继承);〔st1〕settlement.tres 重建前后 18 列值逐字断言(table_structure_guard_test 改址后全绿);〔st2〕validate 拆段后全绿(加载期校验真链);〔st3〕damage_math/roll_multiplier/damage_controller_test 改址后全绿(段地址读值同值判据)。撤销证明见 wr4/wr5/wr9。
### T5 damage_controller 拆分+参数束(≈0.75d)
- [ ] open_ticket 改 spec 束(接口块签名;必载四键 assert);core 调用点 13 处改形(RewardGrant 内 grant 族 3 处〔T2 已迁入〕、grant_segment 6 处 :76/:112/:125/:154/:192/:206、combat_segment 3 处 :44/:54/:84、控制器内部 overflow 1 处 :410;KIND_HERO_ATTACK 分支内构造逻辑不动)。
- [ ] 类变量收敛:inject 束(4→1)+fx_calls 束(2→1)——combat_segment :29/:32 与 begin_battle :393-394/:398-399 注入点随动改键写;_fx_fact/管线读改键读;19→15。
- [ ] 拆分族落地(接口块签名):_ctx_rewrites+_ctx_clamp_delta(自 _hero_attack_ctx 拆出);_kill_overflow(自 _hero_attack_redeem 拆出);_enemy_roll+_enemy_shield_apply(自 _resolve_enemy_skill 拆出)。拆后逐函数过 gdstyle 阈值;仍超者按施加面/兑付面继续两分,命名=`<名>_apply`/`<名>_roll` 形态。
- [ ] damage 测试改址(G11+G15):damage_controller_test 15 处直调改 spec 束(键值搬运,断言逐字)+12 处 db.settlement 段地址改写;system_contracts :74 一处+1 处段地址;combat/grant 段内 open_ticket 调用随 T4 已改指处套 spec 形。
- [ ] 验收步骤:〔dc1〕damage_controller_test 全套改址后全绿(A/B 两模式、死亡作废、requires 门、flush_submit 同批契约逐条同判据);〔dc2〕九栏目契约断言(system_contracts :74 改址后——单据字典九键+requires/source_unit 逐键同值);〔dc3〕伤害真链断言继承(round_flow 主角先手/敌方还手/地图账殿后现役断言)。撤销证明见 wr6。
### T6 改址收尾+键账逐键复测+替代验收(≈0.5d)
- [ ] 改址扫尾:grep 旧符号全库零残留(`_grant_routed\|_flush_pending_reveals\|_fx_enqueue_reveal\|\.escrow\b` 于 tests/probe 的成员访问形态;open_ticket 12 参位置形态;`db.settlement.<17 列裸列名>` 平铺地址逐列零残留——segment_order 除外〔G15〕;_emit_row 8 参位置形态零残留)——G11/G15 清单逐条对账(≈220 处)。
- [ ] 键账复测:`python tools/gdstyle_gate.py`——预期基线外新违规 0、恶化 0;六文件 45 键逐键读数记录进实现报告(44 键零超标命中逐键+battle_orchestrator 类变量键 50→38 豁免登记归账核对——§11 裁决记录④)。可核查结果:键账对照表在案。
- [ ] 替代验收执行:批末按 T0 同参复跑 dump_battle 六组(种子矩阵 {42, 779401, 779501}×关卡 {1, 2}),与改前 JSONL 逐行 diff——非空即红(L3);现役同种子逐位断言面全绿(round_flow/seal_polarity/level_shop 全套)。可核查结果:六组 diff 空记录在案(wr10)。
- [ ] 验证步骤:全套闸按本批改动域选档跑一次全绿(里程碑出口;波内修复只做出红最小单元最窄确认)。撤销证明见 wr7。
### T7 撤销证明+产出物落位卡(≈0.25d,末卡)
- [ ] 逐 wr 行撤销证明(§8.1 末列——回退对应 hunk→最窄闸红→还原复绿,记录进实现报告)。
- [ ] 写齐三份产出物(实现报告〔45 键账对照+改前改后读数+实机目检总清单〕/代拍板追认单/反哺点清单〔§6 逐条落点〕)。
- [ ] 合并前置:独立验收审计(§8.3)逐行「通过」。
**估时合计 ≈5.25d**(区间 5.0–5.75:T4 settlement 拆段与 97 处改址、T3 宿主全清拆分为 v1.0 基础上的增量来源)。
## 8. 验证闸
### 8.1 改动—验收对照表
| 需求点 | 改动(文件:行/行为) | 验收测试(名称+落点+尾缀) | 层级 | 真实入口 | 撤销证明 |
|---|---|---|---|---|---|
| wr1 fx 族迁移建件 | battle_fx_host 新件+宿主接线+counters_ctx/_fx_emit/enqueue/flush 改址 86 处 | 〔fx1〕揭示管线〔fx2〕桶隔离〔fx3〕空订阅零命中〔T1,round_flow/adventure_feats/settle_segments 改址后〕 | 单元+集成 | 编排器 begin_battle 真链→挖掘→揭示兑付 | 回退 fx 接线 hunk→fx1 红(`_fx_host` 路径不存在) |
| wr2 grant 族迁移+12 随迁键收敛 | reward_grant 新件+att 束改形+escrow 直读改址 5 处 | 〔rg1〕负向字典直验〔rg2〕escrow 隔离〔T2〕+T6 gdstyle 键账(12 键清零) | 单元+集成+静态 | grant_routed 直调(seal_polarity)+完整战斗真链(level_shop) | 回退 grant 接线 hunk→rg1 红 |
| wr3 use_treasure 拆分+三触点分家 | use_treasure 迁 RewardGrant+_apply_use_kinds 拆分+treasure_interact ctx 束+main_ui_build 构造 | 〔rg3〕use_treasure 真链三例〔T2〕+ui_click_probe 秘宝使用流直跑绿 | 单元+探针 | C 区槽选→点格使用真链(探针/单测装配) | 回退三触点 hunk→rg3 红(use_treasure 旧路径失配) |
| wr4 段类随动 | 两段三引用+读写面改指 14 面 | 〔sg1〕同种子逐位一致〔sg2〕段直构〔T4〕 | 集成+单元 | 完整战斗真链(现役结算断言面) | 回退段构造 hunk→sg2 红 |
| wr5 run() 族+宿主超标函数拆分全清 | grant/combat run 拆族+_judge_seal 两分+validate 四拆+begin_battle/_place_variants 分段拆族+_emit_row 束形 | 〔sg1〕同种子逐位一致〔sg3〕validate 载荷逐字〔T4〕+T6 gdstyle 键账(run/_judge_seal/validate/begin_battle/_place_variants/_emit_row 键清零) | 集成+单元+静态 | 完整战斗真链+表加载期校验 | 回退拆分 hunk→行为断言恒绿+gdstyle 对应键读数回升(键账断言红);回退束形 hunk→行发射调用点形失配红 |
| wr6 damage_controller 拆分+参数束 | open_ticket spec 束+拆分族+inject/fx_calls 束+改址 16 处 | 〔dc1〕控制器全套〔dc2〕九栏目契约〔dc3〕伤害真链〔T5〕 | 单元+契约+集成 | open_ticket→submit→flush 真链(damage_controller_test 装配) | 回退 spec 束 hunk→dc2 红(构造形态缺失) |
| wr7 S7/S8 随动+改址收尾 | static_scan 两清单+改址扫尾 | S7/S8 段扫描含两新件零命中+T6 全套闸按域选档全绿+键账对照表 | 静态+全套 | 闸机(工具面) | 回退清单 hunk→S7/S8 红(新文件越集命中/缺位) |
| wr8 产出物 | T7 三份 | 件核〔wr8〕 | — | — | 缺项红 |
| wr9 settlement 拆段 | 两段 schema 新件+主表三列形+settlement.tres 嵌套重建+消费改址 97 处 | 〔st1〕表值逐字断言〔st2〕validate 绿〔st3〕消费改址断言〔T4,table_structure_guard/damage_math/roll_multiplier/damage_controller_test 改址后〕 | 单元+集成 | ConfigDB 加载真链(db.load_tables→`db.settlement.core.`/`db.settlement.damage_roll.` 读值) | 回退拆段 hunk→主表三列形缺失→ConfigDB 加载期致命红 |
| wr10 同种子逐位替代验收(契约 1 总断言) | 全批结构改动总和(总断言行,无独立改动) | 批末 dump_battle 六组复跑与 T0 改前 JSONL 逐行 diff 非空即红+现役同种子断言面全绿〔T6〕 | 集成+全套 | `sim/dump_battle.gd --script` 直跑(关卡×种子矩阵六组) | 回退任一拆件 hunk→复跑 diff 出差异→还原复绿 |
### 8.2 测试削弱申报
零(改址≈220 处=访问路径改写与 spec/head 束键值搬运,断言语义与判据逐条保持——契约 9;无任何断言删除/阈值放宽/扫描面缩小)。
### 8.3 独立验收审计
入口=未参与实现的会话或子代理;报告落 `reports/iter<N>-验收审计-<日期>.md`;抽查重点=12 随迁键清零逐键核对、44 键零超标命中逐键复核+battle_orchestrator 类变量键豁免登记义务在反哺点清单在案(§11 裁决记录④)、S13 基线未改(git diff 查 `tools/gdstyle_baseline.txt` 零变化)、改址断言语义等价抽检(adventure_feats/seal_polarity/damage_controller_test/table_structure_guard 各 ≥3 处)、两快照出口载荷逐字比对、同种子 JSONL 基线(六组 diff 空在案)、settlement.tres 重建前后表值逐字比对、撤销证明复现。未过不得合并。
## 9. 异常分级
- **L1(自救)**:行号漂移(T0 基线对照自核);测试改址等价写法微调;拆分族仍超阈值时的续拆(按 §7 T5 命名规则与 T3 `_begin_<段>` 形态)。
- **L2(记录继续)**:迁移代码注释随迁措辞(语义不变);spec/att/ctx/inject/head 束键拼装顺序(键集不变)。
- **L3(停机呈报)**:同种子逐位断言红(JSONL diff 非空/现役断言面红);settlement 拆段后表值与重建前不一致或 validate 载荷漂移(契约 10);信号顺序或行协议词表漂移;机检键与卡内契约互斥(契约 3);跨件接线需求与契约 5 冲突(如发现新件必须回调宿主私有族);S7/S8 与架构文档冲突;attune 族被牵连触碰。
## 10. 代拍板白名单(超清单必呈报)
1. 提交切分与 worktree 分支命名。
2. 测试改址的等价访问写法(语义不变前提下)。
3. 迁入代码的注释随迁措辞(语义不变前提下)。
4. att/spec/ctx/inject/head 束键拼装的写法细节(键集与缺省不变前提下)。
5. 拆分族续拆的函数内局部组织(签名与命名规则不变前提下)。
6. settlement 两段的 .tres 嵌套序列化组织细节(段字段名与键集、18 列值逐字不变前提下)。
## 11. 待裁点(零待裁点——2026-10-27 用户裁决记录,全部落死)
1. **PARITY 对拍=停止**:不发起对拍;验收改用既有 `sim/dump_battle.gd` 改前改后 JSONL 逐行 diff(种子矩阵 {42, 779401, 779501}×关卡 {1, 2} 六组,零新码)+现役同种子逐位断言面(round_flow/seal_polarity/level_shop 全套)全绿。执行步=T0 采集改前基线+T6 批末复跑 diff(§8.1 wr10);若用户改裁实跑按契约 4 保留的 PARITY_APPROVED 机制执行(不得借机重锚)。
2. **settlement_table 类变量 18/15=清零拆段**:schema 拆两个子 Resource 嵌套段——「结算结构与封印溢价」段(7 列:source_label_map/effect_pool_map/pool_clamp_lo/pool_clamp_hi/round_direction/p_perfect/seal_hit_premium)+「伤害掷点与护甲」段(10 列:equivalence_ref_damage/armor_effectiveness/roll_faces/attack_bonus/roll_tier_bounds/roll_tier_discounts/crit_roll/crit_multiplier/damage_floor/armor_roll_stream),segment_order 留主表(段序骨架列)——18 列全集实查分组在案(G8/G16),主表类变量 18→3。单 .tres 单文件保持,ConfigDB 加载面不变,消费方改址 97 处任务入卡(T4/wr9);数值零变化(契约 10)。
3. **宿主残留键=全清**:v1.0「改善非清零口径(宿主残留 8–10 键)」废除——begin_battle(141 行/17 分支/16 局部/7 return)、_place_variants(52 行/14 局部/6 嵌套)、_emit_row(8 参)随拆件后函数级拆分与参数束改形全部清零(T3,wr5 承载);12 随迁键卡内收敛义务不变(契约 3)。
4. **全清口径落点核算**(grilling 自检折入——非新裁决,上三项裁决的算术落地):45 键逐键归零=44 键卡内清零义务逐键有机制(T1–T6:迁移收敛/函数拆分/参数束/schema 拆段)+唯一清零算术不可达键=battle_orchestrator 类变量(50:迁移 14+新引用 2→实测落点 38,阈值 15 不可达——宿主保留面为拆件定稿节第 1 款锁定职责承载面+attune 原位,禁为清键拆散保留面),按用户全清口径「要么清零、要么属在册豁免」第二支臂随批登记 S13 豁免第三条(main.gd 探针契约面同形先例:键永久基线内、禁再恶化),登记落文走反哺点清单(§6),键账对照表如实记 50→38——零「残留申报/改善非清零」形态(两形态已废,不再作为任何键的处置出口)。
## 12. 自审六查与复核记录
**自审六查(2026-10-27 v1.1 修订会话)**:①规格覆盖——u1→T1/wr1、u2→T2/wr2、u3→T2/wr3、u4→T4/wr4、u5→T3+T4/wr5、u6→T5/wr6、u7→T1/T6/wr7、u8→T7/wr8、u9→T4/wr9、契约 1 总断言→wr10,完成定义四条各有落点;②步骤扫描——每步一动作一可核查结果,无「TBD/酌情」行(续拆规则=T5 命名规则、begin_battle 分段命名=`_begin_<段>` 形态,均非待定);③类型一致性——接口块与 T 卡引用逐字:两段字段名 core/damage_roll 与类名 SettlementCoreTable/DamageRollTable 在结构图/接口块/T4/wr9 同形;_emit_row 五参束形(head/ri/display/value/extra)在接口块注记/T3/wr5 同形;前版笔误「T4 产出 spec 束(T5 damage 测试改址取用)」随重编号订正为 T5 卡内自取;G1 键清单补 _emit_row 参数(前版漏列,22 条对账补齐);④审查焦点+改动覆盖——最可能坑玩家面=RNG 取号序(fx_reveal 迁移点)与 begin_battle 拆分执行序:fx1/sg1 双断言+T3「段序/发射序/取号序逐字」判据+wr10 六组 diff;settlement 拆段坑=表值漂移:st1 表值逐字断言+L3 红线;文件结构图新增行均指 wr 行;⑤篇幅比例——接口块为签名非实现体,无函数体抄写;⑥落位预检——两新 core 件、两段 schema 件、新增 head 束各有不能复用理由与唯一落点(G15/G16/预检表),与结构图「新增」标记对上。
**grilling 自检一轮(2026-10-27 v1.1,写卡会话对抗视角逐款过)**——阻断与折入七条全折入本版:①对拍停止后的验收可执行性——dump_battle 既有零新码、种子矩阵六组 T0 采齐、批末同参复跑 diff(T6 执行步+wr10 行),判据非空即红;②settlement「18→3」算术核验——18 列全集实查=两段 7+10+segment_order 留主表,主表三列形自洽(§11 裁决记录②);③全清口径对 battle_orchestrator 类变量键的算术核验——宿主保留面锁定下阈值 15 不可达(50−迁移 14+新引用 2=38):按全清口径第二支臂随批登记 S13 豁免第三条(main.gd 同形),义务入反哺点清单、键账如实记 50→38(§11 裁决记录④)——杜绝以「改善达标」名目复活残留申报形态;④_emit_row 清零机制——函数级拆分不降参数数,唯参数束改形可达(8→5):束形定义+调用点全量改形(host 14+damage_controller 注释与 6 调用点+grant 段 5 调用点随 T3 改形、combat 段零直调)入 T3,行字典字段与 step_row 载荷逐字不变(契约 1 不受损);⑤前版键账算术缺陷订正——「44 键清零」与「宿主残留 8 键达标线」并存自相矛盾,本版改逐键机制列清(§11 裁决记录③④+T6 复测判据),并补 G5 漏列的 grant 段 oc._emit_row×5 直调与 G6 combat 零直调实测;⑥settlement.tres 重建回滚安全性——回退拆段 hunk=主表三列形缺失→ConfigDB 加载期致命(fail-fast 即红),wr9 撤销证明按此写;⑦PARITY 触面清单补全——settlement.tres 重建命中 `run_all_gates.sh:227` `game/data/tables/` 面(前版三路径外),触面判定仍每次跑批呈报(契约 4)。前版已折入的七项阻断约束沿用核验通过:随迁键先收敛后迁移时序、fx host 类变量封闭面 14/15、grant_clear_reward 三参形、dump 复用零新码、bind_grant 构造序解法、组件出口取件、计数与行号订正——本版改址增量后合计复核在案(G11 123 处+G15 97 处=220 处)。
## 13. 禁为机检文本保留无效成员(重构类必填条款)
禁止为迎合机检消息文本(含计数)而保留或新增无效成员/别名:本批迁移面中 fx_counters_round/fx_counters_battle 两零读者成员随迁即删(G2)、12 随迁键以真实拆分/签名改形收敛、_emit_row 束形以真实改形收敛(非别名转发)、settlement 拆段以真实 schema 重建落段(禁主表留平铺列的同名转发或别名);禁以「基线计数」「测试便利」等理由在宿主保留任何迁移成员的同名转发或别名;机检键与卡片契约互斥时实现段一律停卡呈报,不得自造第三条路(code-conventions §1.1 同款)。
@@ -1,228 +0,0 @@
# 需求卡片:结构小件定点修批(审计 §三 其余小件六件:死变量/confirm 收口/空判/常驻 flush/fatal 违约回调/未播种取数通道)
- 版本:**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/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` 各址均漂移),**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 并修后两处改动面相邻,禁拆成两波同文件互踩(一条波次内完成)。
- **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 既有封印传导),其中 `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`)。
**改动单元清单**(🔴 契约 1):
| # | 单元(实查·现行行号) | 改法 | 依据 |
|---|---|---|---|
| p1 | `main_overlay_flow.gd:107-124` `_sync_status_entry`::111 `var battle_live` 赋值后零消费(死变量)+首组四句 :112-116(:114 置灰注释行夹中)与重复四句 :119-122 逐字相同(:117-118「重复语句在案」注释两句自认) | 删 :111 死变量行+删 :117-122(自认注释两句+重复四句);保留首组与 :123-124 调试角标注释段(非重复组——grilling 订正 v1.0 误圈) | 审计 ①;死代码与重复句清除 |
| 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 | 两协作件 `_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 的义务=零新增**:`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)。
## 2. 设计事实源
| # | 出处 | 取用条款 |
|---|---|---|
| D1 | 工程证据指认=审计报告 §三「其余小件」段(§90-95 逐件)+本卡 §3 实查重定位 | 六件清单与判据 |
| D2 | [architecture](../design/engineering/architecture/architecture.md)「局态一律住 RunScope」+单口纪律 | p2/p4 依据 |
| 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 行号已按拆件后重定位;v1.4 补 S8 缝拆面实查,p5 落点件面按迭代 40 卡① 落定形态锚;开工日 T0 复核行号)
| # | 事实 | 出处 |
|---|---|---|
| S1 | `_sync_status_entry` 现住拆出件::111 死变量 battle_live(赋值零消费);首组四句 :112-116 与重复四句 :119-122 逐字相同(:117-118 注释自认「重复语句在案」;:123-124 调试角标注释独立保留) | `game/presentation/main_overlay_flow.gd:107-124` |
| S2 | confirm 旁路三处:main_overlay_flow.gd:88 open(选档删除确认流)+main.gd:311/:320 close(确认/取消两分支);单口 `_open_modal`→`_modal_flow.open(m)`(挂起兜底/排播排空/遮挡记账/开侧同步——main.gd:281-282 注释);confirm_dialog:open(:36 设文案)/close(:46)/is_open(:50),:40-41 注释「树序由构建序保证」与 ModalFlow 登记序口径不符 | `game/presentation/main_overlay_flow.gd:88`;`game/presentation/main.gd:311/320/281-285`;`game/presentation/views/confirm_dialog.gd:36-50` |
| S3 | settle_batch 两入口::721(棋盘动作批次——treasure 劫持检查后直取)与 :748(stop 批次——:743 有 `_input_locked` 守卫)均无 settlement null 防护 | `game/presentation/main.gd:721/748` |
| S4 | row_pacer 常驻队列 `_rows: Array[Variant]`(:11)+现成公开 `flush()`(:49);`_begin_session`(main.gd:175)现不 flush | `game/presentation/row_pacer.gd:11/49`;`game/presentation/main.gd:175` |
| 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 所列行(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/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. 范围边界
**做**:p1–p7;一个负面套件新件(三测试点)+`run_all.gd` manifest 登记一行;wr2 锁域回归与 wr4 夹具断言;探针回归;撤销证明;产出物。
**不做**:
- 件②level_map 三段(独立卡:独立卡已随迭代 38 卡① 实现合回并按「吸收即死」退役(git 提交 b85b3b45/8ea7cfba 可考));
- 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. 关联文档同步面
| 文档 | 关联点 | 同步义务 |
|---|---|---|
| `待办清单.md` | 来源条目状态:原「结构审查未立项小件候审」六件候审条目 2026-10-26 已并入「gdstyle 存量债全量清偿」条目波 7(本卡为其登记在册的现成卡),本卡出账随该条目波 7 推进,禁另立重复条目 | 反哺点 · 列清单(①:状态归属注记) |
| `design/engineering/test-conventions.md` §5 | 负面套件豁免第 2 闸的规则**已在册、零修订预期**——本卡只是首次把「运行期违约通道取证」这条落位规则用满(先例三件在册);如复核认为该规则该升级为「违约通道类需求点必须落负面套件」的显式条款,列反哺点由文档批裁 | 反哺点 · 列清单(③:预期零改动注记) |
| [architecture](../design/engineering/architecture/architecture.md) 模块归属表+「战斗编排域拆件定稿」节 | p2/p4 涉单口纪律与 RunScope 条款(现行表述已覆盖,预期零改动);**v1.4 缝拆三处随动**=① B4 `reward_economy` 行「消费依赖」列现写 `effect_engine(事件发射 dispatch——上层消费基础层)`,缝拆后须改「经注入 Callable 向 BattleFxHost 取偏运合计」;② `BattleFxHost` 行职责/暴露面补该查询口;③「战斗编排域拆件定稿」跨件单向接线款补一枚注入 Callable | 反哺点 · 列清单(②:三处逐条列明;实现批禁写 design/,落文归文档批) |
## 7. 任务卡
### 卡前 · 文件结构图
| 文件 | 职责 | 行为改动 |
|---|---|---|
| `game/presentation/main_overlay_flow.gd` | p1 死变量/重复句删除+p2 open 收口(复用既有·修改) | p1 非行为/p2 **行为改动(锁域)**→ wr2 |
| `game/presentation/main.gd` | p2 close 收口两处+p3 null 防护两处+p4 flush 一行(复用既有·修改) | p2 行为(同行)/p3/p4 非行为(防护/会话边界) |
| `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 `_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 登记一行;v1.4 另在 `battle_fx_host.gd` 追加一枚公开方法、在 `variant_placement_test.gd` 追加三条断言——均属既有件内的成员/方法/行级改动,无新文件)
### 接口块
- **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 停呈):① **注入只经编排器组装点**(`_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` 位同走静态面。
- **缺省形态断言**(契约 2):新构造件不接线 → 直调 `_fatal` → `battle_result` 不受影响;不注入 handler 的 rng 件在合法标签与已播种路径逐位不变(本段在**违约注入之前**跑完,验完再触发违约——否则 SCRIPT ERROR 混入正向判定)。
- **wr2 回归**:save_select/confirm 流现役探针(ui_click_probe 选档删除确认段——T0 定位)直跑绿+锁域断言(confirm 开时输入锁生效——若现役断言未覆盖则增一条)。
- **取用**:无。**最窄闸**:新负面套件直跑(期望退出码 1)+`run_all.gd` 登记行核在位+pacing/round_flow 现役套件直跑绿+ui_click_probe 直跑;全套闸按本批改动域选档。
### 落位与可复用性预检
- **新增件一处**:`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` 封印(不造第二中止机制——审计「可经宿主注入」的最小实现)+复用 `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–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 缝拆三处(掷格件成员替换+宿主查询口 `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 组装点 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)逐行「通过」。
**估时合计 ≈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. 验证闸
### 8.1 改动—验收对照表
| 需求点 | 改动(文件:行/行为) | 验收测试(名称+落点+尾缀) | 层级 | 真实入口 | 撤销证明 |
|---|---|---|---|---|---|
| wr1 死代码与重复句清除(p1) | main_overlay_flow.gd:111+:117-122 | grep 判据零命中(:123-124 保留段除外)〔wr1〕+现役角标同步探针绿 | 静态+探针 | grep 真实跑批+ui 探针 | 回退 p1 hunk → grep 命中即红(T2①) |
| 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 组装点 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 锁域断言(若现役未覆盖)+wr10 三条(判定面/接线面/权重生效面,`Kit.check` 形态进清单)+负面套件内两处缺省形态断言,其中违约三点以退出码承载、非 `Kit.check` 形态;wr5/wr6/wr7 由现役套件迁至独立文件属**载体迁移**,被迁走的断言在 v1.2 从未合回 master,不存在削弱既有验证面;wr3 防护分支不可达性以静态判据+申报承载——不虚构不可达态的运行期断言;wr11 复用既有 `sim/dump_battle.gd`,零新码零删改)。
### 8.3 独立验收审计
入口=未参与实现的会话或子代理;报告落 `reports/iter<N>-验收审计-<日期>.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` 同型软回退(审计清单外);**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 成员命名与注释措辞(`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);⑤**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. 自审六查与复核记录
**自审六查(v1.3 复核轮,2026-10-26)**:①规格覆盖——p1–p7→T1、wr1–wr9→§8.1 逐行有承接(wr7 承 p7、wr8 承登记面、wr9 承产出物)、撤销证明四条与清单同步→T2;②步骤扫描——T0 一步+T1 四步+T2 四步各挂可核查结果;③类型一致性——接口块三测试点与 S5/S6/S7 实查一致,退出码判据与 `run_all.gd` 的 `expect`/`negative` 字段类型一致,wr7 所用标签在册(`PURPOSE_TAGS` 无 `adventure`,取 `board_gen`);④审查焦点——缺省零变化(契约 2 覆盖 p5/p6/p7)、锁域回归(wr2)、封印传导链(契约 3)、排播节奏护栏(契约 4)、**违约取证落位与闸 02 互斥+回归态判据只取可观测面(契约 6 与载体三纪律——本轮主判点)**;⑤篇幅比例——零实现体;⑥落位预检——新增一处(负面套件)已答「为什么不能复用」,复用面(flush/ModalFlow/封印/negative 豁免通道)齐备。
**grilling 一轮复核记录(2026-10-26,独立子代理对抗复核,判「通过(附四应修+一建议)」)**:①wr4 撤销证明不可执行(无夹具时改前改后皆绿)——v1.1 折入前置夹具断言;②p1 删除边界误圈(:123 调试角标注释非重复组;首组实为 :112-116、重复组 :119-122)——订正;③S5 board_generator _fatal 实址 :396-398——订正;④缺 req-card 第 13 条——立契约 5;⑤建议=p6 同函数 master_seed<0 分支(:104-106)同款 assert 后无 return——L3 点名(二轮收紧为单通道停卡呈报)。复核确认项:S2-S4 行号逐条命中、wr3 静态判据申报诚实、p5 载体成立(round_flow_skill_pool_test 现有装配形态)、handler-before-assert 排序与 headless 实测语义相容。
**二轮闭合复检(2026-10-26,判「通过(附三应修))**:四应修核闭合(wr4 夹具/p1 边界/S5 实址/契约 5);残留三处随本轮一并处理——wr1 行与 S5 出处列的旧行号订正、master_seed 条款由「并修或停卡」收紧为单通道「停卡呈报」(并修路线违契约 1 与实现段零裁断)。
**迭代 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` 词汇进宿主层一行,端口化后归位。
+4 -3
View File
@@ -5,8 +5,8 @@
## 当前位(只回答「现在该做什么」;三行内随批次换代,禁止在此扩写成状态快照)
- **阶段**:M3——Alpha 版本的完整实现(2026-10-09 立规:未明令宣布完成前停留 M3,迭代只排 M3 需求,M4 不排期;根目录 stage.txt 为旧阶段开关仅存档)。
- **迭代位**:迭代 1–39 全部已完成——迭代 39 三卡 2026-10-27 特批带红合回,2026-10-28 完成批后收尾(反哺落文+产出物退役+账面换代)。
- **下一步**:迭代 40 已编两卡——2026-10-27 编入,≈6.225 个工作日,B1 战斗域拆件批〔gdstyle 波 1〕+结构小件定点修批〔波 7 现成卡,iter38 卡②停卡退上游后 v1.3 修订定稿〕——待开工,实现段由用户以 /iter 40 发令;迭代 41 已编两卡(核心数据面+呈现层结构收敛批,≈13.15 个工作日〔用户特批 2026-10-27 超 10 个工作日〕)排其后。待编池:营地交互重做卡⑤(排卡④之后)、卡④(已退回美术设计段,美术设计闭合后重立卡)、冒险前资源配比预设(冻结备选)、迭代 30 原卡②③(2026-10-17 已剔出迭代 30 规划、退回待设计,待美术/设计定稿后重新立卡)。
- **迭代位**:迭代 1–40 全部已完成——迭代 40 两卡 2026-10-28 合回(合并提交 514457d1,用户特许免闸直合),同日完成批后收尾(反哺落文 13 条+产出物退役+账面换代)。
- **下一步**:迭代 41 已编两卡(核心数据面结构收敛批+呈现层结构收敛批,≈13.15 个工作日〔用户特批 2026-10-27 超 10 个工作日〕)——待开工,实现段由用户以 /iter 41 发令;开工前固定动作=波 0 gdstyle 基线刷新(待办清单在册,待用户发令)。待编池:营地交互重做卡⑤(排卡④之后)、卡④(已退回美术设计段,美术设计闭合后重立卡)、冒险前资源配比预设(冻结备选)、迭代 30 原卡②③(2026-10-17 已剔出迭代 30 规划、退回待设计,待美术/设计定稿后重新立卡)。
## 里程碑时间线
@@ -73,11 +73,12 @@
| 迭代 37 | 已完成(2026-10-25) | 已退役(git 历史可考) | 2026-10-25 | ≈8.25 个工作日 | 已退役(git 历史可考) |
| 迭代 38 | 已完成(2026-10-26) | 已退役(git 历史可考) | 2026-10-26 | ≈5.225 个工作日 | 已退役(git 历史可考) |
| 迭代 39 | 已完成(2026-10-27) | 已退役(git 历史可考) | 2026-10-26 | ≈10.15 个工作日〔用户特批 2026-10-26 超 10 个工作日〕 | 已退役(git 历史可考) |
| 迭代 40 | 待开工 | reports/需求卡片-B1战斗域拆件批-2026-10-27.md<br>reports/需求卡片-结构小件定点修批-2026-10-26.md | 2026-10-27 | ≈6.375 个工作日 | — |
| 迭代 40 | 已完成(2026-10-28) | 已退役(git 历史可考) | 2026-10-27 | ≈6.375 个工作日 | 已退役(git 历史可考) |
| 迭代 41 | 待开工 | reports/需求卡片-核心数据面结构收敛批-2026-10-27.md<br>reports/需求卡片-呈现层结构收敛批-2026-10-27.md | 2026-10-27 | ≈13.15 个工作日〔用户特批 2026-10-27 超 10 个工作日〕 | — |
- 迭代 38 收口为带红合并〔用户特批 2026-10-26〕:09 静态扫描 S13 gdstyle 恶化 2 条经批准记入基线存量红(git 提交 c4c69701),卡② 停卡退上游,处方已于 2026-10-26 修订定稿 v1.3(git 提交 b3ea7532),随「gdstyle 存量债全量清偿」条目波 7 待编排。
- 迭代 39 收口为带红合并〔用户特批 2026-10-27〕:02 EV 锚 goblin 0.9148∉[1.00,1.20](触发器批有意行为改动,fp f74b9a48ef4a)已随 EV 锚重锚批换带归绿(git 提交 ba5105aa);08d 生涯.md:55 行号漂移已随 2026-10-28 批后收尾反哺落文修复归绿。三卡拆分后终局 gdstyle 恶化 2 条(battle_orchestrator max-file-length、level_map_screen max-class-variables)归迭代 40 卡①还债与迭代 41 存量债序列。
- 迭代 40 收口为用户特许免闸直合〔2026-10-28〕:全量域验收回执未取得(回执环节断于用户特许,验收审计报告如实记档不作绿报;独立审计结论=通过,F1 一行修 iter40 8a319369 先行入库)。卡① 契约 2 宿主行数残余债(实测 1036 行,合并适配带入 36 行)经用户裁登记归后续批清偿(待办清单「战斗域结构深拆批」条目承载);09 存量红剩 level_map_screen 类变量一条归迭代 41 卡③。
- 历史行的「—」= 该列事实不可考:迭代 1~8 早于需求卡片制;编排时点与预计周期不再回溯,细节查 git 提交史。
- 「已退役(git 历史可考)」= 需求卡片或实现报告曾存在,已按「证据只留最新」退役;已完成迭代的实现报告列只填 reports/ 现存路径或本保留字,不填「—」。
- 新迭代行的编排与各列判据见 doc-conventions §12.2 与 iter-plan 技能,由流水线闸(`tools/pipeline_gate.py`)机检。
+29
View File
@@ -437,3 +437,32 @@
| 2 | 低血防御技(孤注守势) | 地精血量降至约三分之一以下后的开轮,出「孤注守势」(自身防御向增益)——低血触发时机观感合理、增益行可读 |
- **红灯信号**:两技不出现(机制未触发)或触发时机明显不合理(如满血触发、低血不触发)即报缺陷。
- **结论回流**:实现缺陷归待办清单登记新条目;触发观感类判读(频率/时机手感)归难度曲线调参批数值面,不在目检现场改数。
## ㊳ 口径换代批——玩家可见字串换代实机目检(2026-10-28 随批后收尾登记)
> 提前实施卡批合回(2026-10-26,git 提交 ed49a7a5):12 条玩家可见字串按「关卡完成/冒险成功/冒险落幕」新口径换代+断言随动 60 处+注释清扫 61 条。字串内容已由 V1–V7+wr1–3 十七条断言钉死并实跑绿、验收审计逐字核对;渲染观感(字体、换行、截断)要人眼。登记不阻塞(2026-10-12 真人检测立规);读数与论证详见实现报告(git 提交 ed49a7a5)。
| # | 目检项 | 判据 |
|---|---|---|
| 1 | 战斗总结结算 | 单关末行「关卡完成!」(非末关收束态) |
| 2 | 三选一停点头部回血行 | 「关卡完成回血 +N(生命 X → Y)」;满血态「生命已满——关卡完成回血 0(合法态)」 |
| 3 | 奖励节点三选一头行 | 「与关卡完成专长三选一同库分流」 |
| 4 | 冒险结算屏 | 「完成 N 关 · 止步第 M 层 · 钥石合计 K · 主种子 S」 |
| 5 | 生涯页行标签 | 「冒险成功局数〔1 局(三关全通)〕」「各关完成次数」 |
| 6 | 选档界面槽摘要 | 「冒险成功 X 局 · 冒险 Y 局」 |
| 7 | 营地秘宝匣解锁条件行 | 「冒险成功 0/1」形(adventure_cleared 条件件) |
| 8 | 营地底栏最近冒险 | 「最近冒险:完成 · 完成 N 关 · …」 |
| 9 | 调试浮层批量模拟报告 | 「关卡完成率 N%(W/T)」「关卡完成剩余 HP 均 x · 进 Boss HP 均 y」 |
- **红灯信号**:上述任一位置仍出现退役旧词「通关」即报缺陷(静态扫描 20 行豁免为已登记例外,不含玩家可见面)。
- **结论回流**:呈现缺陷归待办清单登记新条目。
## ㊴ 迭代 40——拆件批弹窗与会话更替实机目检(2026-10-28 随批后收尾登记)
> 两卡合回(2026-10-28,git 提交 514457d1):卡① B1 战斗域拆件批(battle_fx_host/reward_grant 两新件+settlement 拆段三列形)+卡② 结构小件定点修批(六件定点修+RngService 双违约通道+负面套件)。拆件面以同种子 dump 六组逐位全等与真实入口断言收口,玩家可见行为零变化;下两项是弹窗收口与会话清队的观感核。登记不阻塞(2026-10-12 真人检测立规);读数与论证详见实现报告(git 提交 514457d1 一线可考)。
| # | 目检项 | 判据 |
|---|---|---|
| 1 | 确认弹窗开关与遮挡(删动效+常态两档各看一遍) | 两档下确认框打开均遮挡底层、关闭均恢复显示,无残影无叠层错位(wr2 确认弹窗开关路径归位) |
| 2 | 战斗会话更替状态行(删动效+常态两档) | 两档下新开一场战斗后上一场遗留状态行已清、新会话首行即时显示(wr4 会话 flush) |
- **红灯信号**:弹窗关闭后底层未恢复或残留残影、新战斗开始后旧状态行未清即报缺陷。
- **结论回流**:呈现缺陷归待办清单登记新条目。
+5 -5
View File
@@ -16,20 +16,20 @@
#### gdstyle 存量债全量清偿——216 键按病根分波整改(2026-10-26 登记,来源=会话提及,优先级=P0)
**实况**:S13 闸实测存量债 216 键/60 文件(2026-10-26,master f3b148ce,gdstyle v0.4.0 默认阈值;基线登记 234 键=实存 216+陈旧 18)。全量清单、波次方案与纪律见清点报告(本条目裁决源)。2026-10-26 用户裁:撤销「一条总账」与「按病根拆多条」两案,并为本条单账(存量债全部清除,紧急优先级);原「gdstyle 基线陈旧键待人工清理」条目并入波 0(基线对账刷新),原「结构审查未立项小件候审」条目并入波 7(卡已写;iter38 施工停卡后经用户裁于 2026-10-26 修订定稿 v1.3,待编排)。**2026-10-26 设计段闭合(逐波裁定全数落定)**:①段组织=逐波开设计段,纯代码波(波 0/2/3/4/5/6/8)写卡前确认零设计改动+按当时 master 重测读数即可写卡;②波 2 各文件内部拆、波 6 视图内部拆私有函数、波 8 config_db 纯代码收敛(三处零设计改动);③波 1 拆件定稿=轴甲两件——battle_orchestrator 拆出 BattleFxHost(效果引擎宿主域)+RewardGrant(奖励授予域),宿主保留状态机/facts 缓冲/订阅/段驱动/行发射基建/呈现投影,attune 族原位保留(迭代 39 副卡语义领地),emit 经 bind 注入 Callable,行数恶化债(c4c69701 挂账)本波还债归绿,残留债「改善非清零」口径预计 8–10 键;定稿落文 architecture.md v1.18(功能层两新件行+「战斗编排域拆件定稿」节);**同日独立审查折入**(grilling+godot-master 双子代理并行、双判回炉补裁级——骨架成立、接线未闭合):阻断 8 条去重 6 组+建议 5 条全数折入 v1.18——跨件单向接线裁死(RewardGrant 持 fx 件引用/fx 兑付走注入 Callable,禁 RefCounted 环)、settlement/ 段类随动(直持三引用封转发壳)、12 随迁键卡内收敛义务(禁波 0 refresh 吸收)、两新件消费依赖列补全+引用束注入、treasure_interact_controller 三触点分家(现值回调双取值面)、_fx_revealing 再入闸归 fx 件(裁定全文见清点报告 §六第 6 条);④全部波不改游戏规则与玩家可见行为,design/gdd/systems/ 零修订预期;波 5 已实查落定纯代码(open_ticket 12 参=单据声明形态)。波 7 的 wr5/wr6 验收载体重裁为写卡段用户裁点(卡 v1.2 在册,写卡补呈报)。裁定全文见清点报告 §六。**2026-10-28 交接注记(迭代 39 收尾批迁入——实现报告 §六第 6 条未决项出账)**:迭代 40 卡① 卡面接口块仍引用已退役的 RunLedger——该批 T0 须按现态改写(RunLedger 已随迭代 39 拆件批整类退役,encounter 注入面换代为桶字典+实体账+配装件多路)。**2026-10-28 迭代 40 合回出账(波 1+波 7 闭合,合并提交 514457d1)**:卡①(波 1)45 键清 44、宿主类变量键豁免第三条顺带落 architecture v1.22 S13 豁免登记,行数恶化债还清(实测 1036≤登记 1302;契约 2 残余 36 行系合并适配承接 master 迭代 39 内容带入,用户裁登记残余债归后续批);卡②(波 7)六件定点修+运行期违约通道负面套件(run_time_fatal_test)落地合回。余波 2/4/6/8 归迭代 41 两卡(在册)。
**实况**:S13 闸实测存量债 216 键/60 文件(2026-10-26,master f3b148ce,gdstyle v0.4.0 默认阈值;基线登记 234 键=实存 216+陈旧 18)。全量清单、波次方案与纪律见清点报告(本条目裁决源)。2026-10-26 用户裁:撤销「一条总账」与「按病根拆多条」两案,并为本条单账(存量债全部清除,紧急优先级);原「gdstyle 基线陈旧键待人工清理」条目并入波 0(基线对账刷新),原「结构审查未立项小件候审」条目并入波 7(卡已写;iter38 施工停卡后经用户裁于 2026-10-26 修订定稿 v1.3,待编排)。**2026-10-26 设计段闭合(逐波裁定全数落定)**:①段组织=逐波开设计段,纯代码波(波 0/2/3/4/5/6/8)写卡前确认零设计改动+按当时 master 重测读数即可写卡;②波 2 各文件内部拆、波 6 视图内部拆私有函数、波 8 config_db 纯代码收敛(三处零设计改动);③波 1 拆件定稿=轴甲两件——battle_orchestrator 拆出 BattleFxHost(效果引擎宿主域)+RewardGrant(奖励授予域),宿主保留状态机/facts 缓冲/订阅/段驱动/行发射基建/呈现投影,attune 族原位保留(迭代 39 副卡语义领地),emit 经 bind 注入 Callable,行数恶化债(c4c69701 挂账)本波还债归绿,残留债「改善非清零」口径预计 8–10 键;定稿落文 architecture.md v1.18(功能层两新件行+「战斗编排域拆件定稿」节);**同日独立审查折入**(grilling+godot-master 双子代理并行、双判回炉补裁级——骨架成立、接线未闭合):阻断 8 条去重 6 组+建议 5 条全数折入 v1.18——跨件单向接线裁死(RewardGrant 持 fx 件引用/fx 兑付走注入 Callable,禁 RefCounted 环)、settlement/ 段类随动(直持三引用封转发壳)、12 随迁键卡内收敛义务(禁波 0 refresh 吸收)、两新件消费依赖列补全+引用束注入、treasure_interact_controller 三触点分家(现值回调双取值面)、_fx_revealing 再入闸归 fx 件(裁定全文见清点报告 §六第 6 条);④全部波不改游戏规则与玩家可见行为,design/gdd/systems/ 零修订预期;波 5 已实查落定纯代码(open_ticket 12 参=单据声明形态)。波 7 的 wr5/wr6 验收载体重裁为写卡段用户裁点(卡 v1.2 在册,写卡补呈报)。裁定全文见清点报告 §六。**2026-10-28 迭代 40 合回出账(波 1+波 7 闭合,合并提交 514457d1)**:卡①(波 1)45 键清 44、宿主类变量键豁免第三条顺带落 architecture v1.22 S13 豁免登记,行数恶化债还清(实测 1036≤登记 1302;契约 2 残余 36 行系合并适配承接 master 迭代 39 内容带入,用户裁登记残余债归后续批);卡②(波 7)六件定点修+运行期违约通道负面套件(run_time_fatal_test)落地合回。余波 2/4/6/8 归迭代 41 两卡(在册)。
关联文档清单:
- 清点报告 reports/审计-gdstyle存量债清点与清偿方案-2026-10-26.md(2026-10-26,216 键全量清单+波次方案+纪律+设计段裁定记录 §六含整合裁定第 7 条)
- 设计定稿 design/engineering/architecture/architecture.md v1.19(2026-10-27:波 1 拆件定稿 v1.18 节+全清设计补课——ConfigDB 访问器归位与域容器持有+SlotStore/MetaStateStore 两新件行+组合根句柄面/测量面两处 S13 豁免登记)
- 需求卡片 reports/需求卡片-B1战斗域拆件批-2026-10-27.md(2026-10-27 v1.1 全清口径修订:对拍停止改 dump_battle 替代验收+settlement_table 拆两个子 Resource 段+宿主超标函数全清;估时 ≈5.25d;零待裁点)
- 需求卡片 B1 战斗域拆件批卡(2026-10-27 v1.1 全清口径修订后编入;已随迭代 40 实现批合回退役,git 历史可考——合并提交 514457d1)
- 需求卡片 reports/需求卡片-核心数据面结构收敛批-2026-10-27.md(2026-10-27 v1.1 全清口径修订:config_db 访问器归位+三域容器+SlotStore/MetaStateStore 拆件+adventure_table 拆段+spawn 束化;估时 ≈7.9d;零待裁点)
- 需求卡片 reports/需求卡片-呈现层结构收敛批-2026-10-27.md(2026-10-27 v1.1 全清口径修订:print 删除+七件绘制态内部收拢+main/await 两键按 v1.19 豁免申报;估时 ≈5.3d;零待裁点)
- 三宿主主副卡(已随迭代 39 实现批合回退役,git 历史可考——合并提交 ffb0ac15;原「规避指向:本事项禁触三宿主」随三宿主债清偿完成历史使命,残留归尾波)
- 需求卡片 reports/需求卡片-结构小件定点修批-2026-10-26.md v1.3(波 7 现成卡:iter38 卡②停卡退回上游后,2026-10-26 用户裁定验收载体改独立负面套件+并修未播种分支,卡面已修订定稿待编排)
- 需求卡片 结构小件定点修批卡(波 7 现成卡:iter38 卡②停卡退回上游后经 v1.3→v1.4 修订定稿编入;已随迭代 40 实现批合回退役,git 历史可考——合并提交 514457d1)
**改动面**:游戏代码+工具代码
**状态**:文档设计已闭合+已写卡+已编迭代 40+已编迭代 41
**状态**:文档设计已闭合+已写卡+已编迭代 41
#### 战斗域结构深拆批——效果发射端口+宿主瘦身+掷格/受理分件(2026-10-27 登记,来源=批次移交)
@@ -37,7 +37,7 @@
- 效果发射端口(设计题本体):`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` 同款直连已由迭代 40 卡② p5 缝拆实装合回(单枚查询口 `luck_bias_query`——成员 −2+2、类变量净 15、判定归 `BattleFxHost.luck_bias_for`),最小样本在库可考;另两处事件多且带计数器回写,缝拆不成立,必须先设计「业务类只持一个回调、取回命中批」的端口形态。
- battle_orchestrator 瘦身:迭代 40 卡① 拆出 `BattleFxHost`/`RewardGrant` 后宿主实测 38 类变量(阈值 15;豁免第三条已顺带落 architecture v1.22 S13 豁免登记——豁免不等于了结),`tools/gdstyle_baseline.txt` 在册 `game/core/battle_orchestrator.gd|quality/max-class-variables = 50` 与 `|quality/max-file-length = 1302` 两键,实测 38/1036 均已收敛到登记值内(波 0 刷新时按实测重锚)。
- 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)
- 相关文档:design/engineering/architecture/architecture.md(系统分层图与功能层 B1/B4 行、「战斗编排域拆件定稿」节须随端口定稿改写)· reports/审计-gdstyle存量债清点与清偿方案-2026-10-26.md(216 键波次方案与残留债口径;在册「尾波」只覆盖迭代 39 三宿主,不含本条)· 结构小件定点修批卡已随迭代 40 合回退役(git 历史可考,合并提交 514457d1;缝拆样本与 2026-10-27 用户裁史见该卡 git 版本)
**缺口**:效果发射端口形态未定稿(一枚回调的束形与返回值、计数器读写回写与 facts 取值的归属面、`bias_rewards` 等域词汇是否留在宿主层、是否与 `BattleFxHost` 同件承载);宿主保留面与掷格件的职责边界(哪些成员随件迁出、件怎么切)未裁定——需一次设计讨论并落 architecture.md 后才能写卡。