diff --git a/reports/iter40-验收审计-2026-10-28-卡①卡②.md b/reports/iter40-验收审计-2026-10-28-卡①卡②.md new file mode 100644 index 00000000..e40ae5ca --- /dev/null +++ b/reports/iter40-验收审计-2026-10-28-卡①卡②.md @@ -0,0 +1,77 @@ +# 迭代 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 提交信息「两条…改」与实际改动一条不符——沿革不可改,以本报告为正。 + +**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`(除在册存量红 02/08d/09 外零新增红、`changed_vs_baseline` 空)。本审计时点该回执不存在(现盘回执为 commit 钩子顺带的 docs 域),不计入本审计判。 +- 闸 09 指纹记账(用户已裁「刷」)在验收闸跑之前提交落位。 + +## 结论 + +**通过**——附 F1(非阻塞缺漏,建议验收闸前一行修正,交用户裁)、F2/F3(记录性例外)。未过项零。