docs(反哺): 迭代 27/28/29 GDD 反哺点八条+一条建议逐点裁决写入(2026-10-17 用户令「全部按推荐案」)——①③④⑤architecture.md v1.8:新增「战斗域装配现状」(结算五段/RunLedger 四账)与「呈现层装配与会话生命周期」(三屏壳/装配合同立条款不摘录表/RunScope 九阶段×五引用面矩阵认账/ModalFlow tags)两节+初始化顺序补启动后置条件六条,呈现层 D1 行与实现实证读数换代;②code-conventions.md §4 第 7–12 条(S9 三规则口径/:= {} 不算债/type-hint-ignore 与 rng-seed-exempt 两豁免通道/禁裸 autoload/Variant 参数化口径);⑥⑦⑨test-conventions.md 新增 §7 判定三硬闸(含新写测试件全类型标注写法纪律)与 §8 判定可靠性优先于覆盖率(含脚本错误静默中断断言的机制事实与自证义务);⑧07 v1.4:㉖① 保留不注销、加 screen_flow_probe 机检承接注记。同步清三笔在册旧账:iter27/28/29 三份实现报告 git mv 往 reports/(06 条③迁位账清零,全库引用改指新路径、iter24/25/26 等已删报告死指针改「已退役(git 历史可考)」);iter29 报告 §六第 0 项按合并现实(fff4f120,两红各自结案 dac9a94b/fcb8c3f8+8c18b52b)改写;06 补登迭代 29 反哺专条(该批漏登)。登记时「16 层/十断言」读数按代码实态 17 项/11 条订正。非迭代批不占迭代号;active.md 改动留主区工作副本不随本批提交,等闸回执。

This commit is contained in:
DKChan committed 2026-10-17 06:25:28 +08:00
1 parent d984d47c8c
commit abe5f180fb
10 files changed
+137 -38

No files matched your search

+96
View File
@@ -0,0 +1,96 @@
# 迭代 27 实现报告——代码架构技术债修复批(五波全量入库)
- 日期:2026-10-14(单会话 /goal+iter U0 交付,worktree g-plan2-iter27-techdebt 分支 iter27-techdebt-20261014)
- 需求卡片:`design/research/需求卡片-代码架构技术债修复批-2026-10-14.md`(v1.2——三点待裁 2026-10-14 用户三裁全按推荐案:①SaveManager/MetaProgression=第三个 autoload/②Ledger=单类持四账/③_settle=审计五段)
- 来源审计:代码架构与实现质量审计报告-2026-10-14(双席基线 97de02c;**本批收口时按退役规则 git rm——吸收即死,结论迁本报告与卡片**)
- 核心验收(V1):**重构前后同种子完整局输出逐位一致**——parity_anchor 三变体(base/attune/shop)×40 局×RUNSUM+JSONL 剔 ts 双面哈希对拍,**五波出口五跑全同**(锚冻结于 T0,种子面 71000/72000/73000)
## 一、五波交付
### 波一 场景拆分+局生命周期物化(P0-1/P0-2,7a0d57d)
- 三屏壳场景 `presentation/scenes/`:menu_screen/camp_screen/adventure_screen(内含 level_map/battle 两容器)——视图代码原样构建(装配器/视图类零 .tscn 化,契约 2);组合根句柄全部保留(探针挂载假设 main.X 一级路径零迁移);树序=屏壳在前全模态之下(视觉共存对逐对验算:legend/battle、debug/level_screen、shop/level_screen 等全部保序)。
- 会话物化 `run_scope.gd`:adventure/runner/settlement/局态旗/账本随会话节点承载;`_begin_session` 建会话(_ready 即建闲时态=永非 null)、终局整节点 queue_free()——`_reset_run_scope` 三项+`_on_battle_end_continue` 置空四件手工清单消亡。
- SaveManager/MetaProgression 升格 autoload(裁点①甲;类名加 Core 后缀沿 RngService 先例);探针隔离改 attach_path 原地重置(set_master_seed 先例);**发现并修复**:屏壳根全屏 Control 默认 STOP 吃掉下层模态鼠标输入(ui_input 实证)——三屏壳根 mouse_filter=IGNORE+V2 回归闸。
- V2 屏壳独立实例化 11 断言+V3 两连局复位 11 断言进 smoke。
### 波二 _settle 五段拆 Segment(P1-1,26301ba)
- `core/settlement/` 五段类:GrantSegment(授予段体+旗判随段迁入+counter_add 五位/grant_material 三位分支单点化)/AuraSegment/CombatSegment/DecaySegment/VerdictSegment(返回裁定,终局早退语义留宿主);编排器 1725→1325 行退为段序编排+行发射原语单点。
- 姊妹病灶:`_resolve_hero_attack` 148 行拆四步(ctx 命中面→基值装配→掷点兑现→交付),ctx/redemption 字典穿线算序逐字保留。
- V4 settle_segments_test 16 断言进 run_all。
### 波三 账本收口(P1-2/P1-3/P1-4,6fd7d78)
- `core/run_ledger.gd` RunLedger 单类持四账(裁点②甲):attune_charges/vision_counter/adventure_counters/bonus;战斗侧只拿 read/append 原语;AR 持账→LR set_run_ledger→enc 单键下传;编排器三裸引用成员退役;调试/单场缺省新账=零扰动面(vision_counter 缺省空=不计,原 enc 缺键守卫语义保留)。
- 刷新双账:main 副本删除;presentation_snapshot 成文面升键 refresh_used(can_refresh 邻位)——HUD 余量/遥询单源读快照;V5 快照一致性断言×3。
- GP 影子账:summary 增 gp_final 键(close_wallet 清账前快照);gp_shadow_ledger.gd 全件退役;终局面板 GP 行取数=summary 键;ui_probe 断言换代。
### 波四 组合根可测化+模态协议内聚(P1-5/P2-7,8b9e556)
- **重估结论(卡片 T4 前置义务)**:场景拆分落地后,模式状态机已随 RunScope 物化、屏构建已随屏壳迁出——抽取面收敛为**模态编排域**:`modal_flow.gd` ModalFlow 纯逻辑类(依赖仅 ModalStack+查询 Callable,审计处方形态)——开合编排(挂起兜底/排播排空/遮挡记账/开合同步)/输入锁谓词(三例外注入)/双形制角标谓词。
- **V6 测试抓出并修正一处真分歧**:挂起兜底递归后误加 return(原 main 语义=先结挂起后继续开本层两拍都走)——单测缝的结构价值实证。
- ModalStack 互斥域随层登记:register(m, tags)+TAG_NON_LOCKING/TAG_SCREEN_STATE 封闭词表+has_open_excluding_tags 组查询;原调用点排除式拼装(:404-409 输入锁等五处)退役;main._modals=flow.stack(ui_struct _list 断言缝保留)。
- 控制器构造收拢 context:curio 16 参→CurioFlowContext/camp 13 参→CampFlowContext(字段逐一同名,控制器可独立实例化)。
### 波五 类型闸+卫生件(P1-6/P2 组,b605022+T6 笔)
- 类型闸:`tools/audit_type_hints.py` 机器闸(R1 无类型容器注解/R2 有值返回缺类型/R3 参数缺类型+行级白名单通道);368 处容器注解机械参数化(Array[Variant]/Dictionary[Variant, Variant] 零行为面)、13 处参数真类型;project.godot 拉起 untyped_declaration=1;static_scan 新 S9 规则。
- 卫生件:死代码 13 函数删除(审计 16 处复核后其中 ui_kit:486 一处经实读为现役非死码,见追认单)+FeatsEngine 整文件退役;字符串 Callable×10 位换方法引用形态(编译期方法存在性校验);冒险状态机/standee 主角三态 enum 化(外部 String 契约逐位一致);ConfigDB `_fatal` 退出归根(核心层去 quit/crash,置 `_fatal_flag`,退出决策归组合根既有 fail-fast 通道)+resolver 诊断/数据通道全面 Callable 化(ConfigDb↔Resolver 类型环断根)。
## 二、闸记录(每波出口+批末)
| 闸 | 基线(T0 冻结) | 波一 | 波二 | 波三 | 波四 | 波五 |
|---|---|---|---|---|---|---|
| 逐位一致对拍(V1 核心) | 锚冻结 | ✓ 全同 | ✓ 全同 | ✓ 全同 | ✓ 全同 | ✓ 全同 |
| 冒烟 | 1055/0 | 1077/0 | 1077/0 | 1079/0 | 1079/0 | 1081/0 |
| run_all | 25 套 | 25 | 26 | 26 | 27 | 27 |
| probe_gate --click | 绿 | 绿 | 绿 | 绿 | 绿 | 绿 |
| render_gate golden | 0.00% | 0.00% | 0.00% | 全绿 | 全绿 | 全绿 |
| static_scan | (历史 cd 错位恒跳过) | — | — | — | — | S1/S2/S4/S9 全绿 |
批末(T6 后)run_all 27 套全绿+冒烟 1081/0+probe/render 全绿+对拍全同(T6 对拍见 /tmp/parity_check6.log 记录,exit 0)。
## 三、代拍板追认单(白名单九项执行实录+计划外决断)
> **追认结果(2026-10-17 用户令)**:以下十五项**全部同意,无修改意见**——第 1–9 项白名单执行实录、第 10–15 项计划外决断均认作本批既定做法。第 7 项附带的元素精化(`Array[Variant]`→具体元素型)仍是后续批的渐进面,不随本追认提前。第 15 项的取数面换代已生效。
1. **屏场景命名/落位**(白名单①):`presentation/scenes/{menu,camp,adventure}_screen.tscn`——三屏壳与卡片三屏一一对应。
2. **屏壳内部分层**(白名单②):adventure 屏壳内 battle_root+level_screen 平级(无同时可见态,层内先后零视觉差)。
3. **Segment 五类命名/落位**(白名单③):`core/settlement/{grant,aura,combat,decay,verdict}_segment.gd`,类名 XxxSegment。
4. **Ledger 命名/原语形状**(白名单④):`core/run_ledger.gd` RunLedger;原语=attune_charge_has/set/consume、vision_count_add、counters_seed_snapshot/merge_export、bonus_add_axis(各站点原语义逐字收拢)。
5. **run-scope 物化形态**(白名单⑤):RunScope Node 挂 main;_ready 即建闲时态(永非 null——全组合根免空判);会话更替=旧节点 queue_free+新节点同拍建。
6. **探针迁移最小改动**(白名单⑥):组合根句柄保留策略使 10 探针中 7 个零迁移、3 个仅 run_scope 路径换代;pacing 测试改 attach 隔离。
7. **类型标注写法**(白名单⑦):368 处机械参数化取 `Array[Variant]`/`Dictionary[Variant, Variant]` 零行为面口径——**元素精化(如 Array[Dictionary])留后续批渐进**(机器闸已封住新增无类型)。
8. **死代码删除切分**(白名单⑧):随 T6 单笔提交。
9. **enum 命名**(白名单⑨):adventure `State`/standee `HeroState`(+_HS_NAME/_HS_VALUE 双向映射常量)。
10. **〔计划外〕P2-2 autoload 直取降格实现**:审计处方「编译期全局名」与本仓 --script 模式编译器不解析裸 autoload 标识符**硬冲突**(run_all.gd 头注在案+pacing 实测 Parse Error)——降格为路径常量单点(AUTOLOAD_PATH_* 四常量)+T1 读视图属性;拼写风险收敛一处,类型面保留。
11. **〔计划外〕board_generator 四 db 参白名单**:generate/_attempt/legality/_finalize 的 db 参保持鸭子型(测量面 _BoardRowStub 冒烟夹具注入,typed 参拒 stub)——`# type-hint: ignore` 显式白名单通道首用。
12. **〔计划外〕static_scan 历史 cd 错位修复**:9-24 布局迁移后 `dirname/..` 落 game/ 致 `game/core` 守卫恒跳过=静默空转遗产——修 `/../..` 后 S1-S4/S9 首次实跑,暴露并处置两笔存量(S1/S2 main `_seed_value` randi=文档化豁免面→`rng-seed-exempt` 标记豁免通道;S9 即本批闸)。
13. **〔计划外〕V6 测试抓出挂起兜底分歧**:ModalFlow 初版在挂起兜底后误加 return(原 main 语义两拍都走)——以原语义为准修正;该处即单测缝价值的直接实证。
14. **〔计划外〕审计「死代码 16 处」复核为 13 处**:ui_kit.gd:486 一处实读为现役代码(审计抽样误差),不删;其余 12 函数+FeatsEngine 整文件照删。
15. **〔计划外〕刷新遥测取数面换代**:`ux_refresh_attempt` 的 round_refresh_index 从 main 副本改读快照(P1-2 连带,载荷键与数值语义零变化)。
## 四、GDD 反哺点(两条,已登记 06,待用户逐点裁决另批落文)
| # | 文档 | 反哺点 |
|---|---|---|
| 1 | design/dev/architecture/architecture.md | 场景分层陈述(三屏壳+组合根句柄面);会话生命周期(RunScope 物化+_begin_session/_end_session 语义);结算五段 Segment 结构(core/settlement/);RunLedger 四账所有权模型;ModalFlow 模态编排层与互斥域 tags 协议——architecture 现行陈述均滞后于实态 |
| 2 | design/dev/code-conventions.md | §4 语言纪律机器化(S9+audit_type_hints.py 三规则);`:= {}` 推断形态=类型推断合法面不算债的口径;`# type-hint: ignore` 行级白名单通道;`# rng-seed-exempt` S1/S2 标记豁免通道;--script 模式禁裸 autoload 标识符纪律(新);Variant 参数化口径与元素精化后续 |
## 五、实机目检总清单(登记 07 ㉖——真人检测不阻塞,2026-10-12 立规)
1. 全流程操作观感零变化走查:开始菜单→营地(四柜台)→开新冒险→选路→战斗(挖/旗/刷新/停手)→三选一→商店→Boss→终局逐屏过一遍(场景拆分+会话物化后唯一人闸面)。
2. 续玩断点恢复:停点退出→继续上局(断点文案/恢复落点)。
3. 调试浮窗对局中可开不锁棋盘(:407-408 事故回归——互斥域 tags 化后行为钉面)。
4. 刷新按钮余量显示与受理一致(双账删副本后 HUD 单源读快照)。
5. DS_DEBUG=1 启动即开浮窗+两屏角标(同步面随 ModalFlow 迁移)。
## 六、残留与去向
- 残留人闸:07 ㉖ 五件(登记不阻塞)。
- **卡片核对补登(2026-10-15)**:逐条核对卡片 §2/§4/§6/§7 兑现面,补齐三项——①V8 卫生 grep 断言落地(smoke `_smoke_hygiene_gates`:字符串 Callable 产品码零命中/FeatsEngine 文件退役/死代码抽查/GP 影子账零残留);②卡片 §4「长函数 17 个登记 06 观察」+§2.3「lambda 连接 76 处登记防回归」两条义务补登 06(17 中 3 件已随波一/二消解,余 14 件备忘);③漏网字符串 Callable×2 补装(config_db resolver 通道——T6 新增位点,追认单#15 换装面覆盖)+main 头注死引用清理。核对结论:§1 五波/§3 六契约/§6 T0-T7/§7 V1-V9 其余条目全部兑现(详见各波闸记录)。
- 代拍板追认单十五项(上表)待用户逐项追认。
- GDD 反哺点两条(06 在册)待裁决另批落文。
- 审计报告本体已按退役规则 git rm(吸收即死;修正后计数已由需求卡片 v1.2 承载)。
- 元素精化(Array[Variant]→具体元素型)为类型闸后续渐进面(06 反哺点②附带)。
+194
View File
@@ -0,0 +1,194 @@
# 迭代 28 实现报告——启动装配与生命周期验收补全批(六任务全量入库)
**日期**:2026-10-15 **分支**:iter28-bootlife-20261015(worktree `g-plan2-iter28-bootlife`,基点 39c6544)
**需求卡片**:`design/research/需求卡片-启动装配与生命周期验收补全批-2026-10-15.md` v1.0(零待裁点,用户预批连做全批,不入 git)
**一句话**:把「启动后玩家该看到什么、状态对象何时该活何时该死」从口头约定变成**可执行验收函数**,并逐条用变异实验证明这些函数真能抓住对应缺陷。
---
## 一、六卡交付
| 卡 | 内容 | 提交 |
|---|---|---|
| T0 | worktree + 基线三查 + 运行期树序实采(临时探针两枚,采完即删) | 无产物(定义面已在前置笔 39c6544) |
| T1 | 装配语义合同单点化 + 装配顺序修复 + V2 断言重写 | `6f71509` |
| T2 | boot 链路时序后置条件(`_smoke_boot_chain`) | `a35581e` |
| T3 | 生命周期存活性矩阵(`_smoke_lifecycle_matrix`) | `77075e6` |
| T4 | 渲染面内容断言三件(探针自检 + 墨色判据 + 启动态菜单 golden) | `67342c6` |
| T5 | 变异验证(横切,六次注入;**零提交——注入即还原**) | 无提交(见 §五) |
| T6 | 规范三处落文 + 机械面文档同步闸 | `db1bf42` |
| T1 补 | 类型闸 S9 归零(`main.gd` 合同装配容器注解) | `140e440` |
### T0 开工基线与事实复核
基线冻结:冒烟 **1086/0**(roadmap 与卡片所记 1081 系 iter27 补遗批 `d5eea25` +V8×5 未回写,以实跑为准,**已随本批回写**)、run_all **27 套**全绿、probe_gate --click 全绿残留 0。
运行期实采修正了计划书与卡片的三处描述偏差(按「诊断订正」惯例以代码/运行期为准):
1. **屏壳是容器、不当「顶层可见层」候选**(卡片诊断订正①,运行期实证):三屏壳根均 `MOUSE_FILTER_IGNORE` 纯容器,camp 壳 boot 态 `visible=true` 但成员恒隐;裸树遍历自顶向下会先命中透明壳。断言改为遍历合同**内容层**候选集。
2. **`_row_pacer` 句柄数**(卡片诊断订正②):计划书称 6 视图句柄,实查 5 + 2 Callable。
3. **`main.gd:378` 十二模态登记数组**形态与卡片描述有差异——合同常量按运行期实采自行定义为 **16 层自洽表**(含 host 宿住层、shell 屏壳占树位两类特例)。
T0 临时探针 `t28_treeorder_probe.gd` / `t28_treeorder_probe2.gd` 采完即删,未提交。
### T1 装配语义合同单点化 + 顺序修复 + V2 断言重写
- **合同常量 `LAYER_CONTRACT`**(`main.gd`)=全仓唯一事实源:16 层(屏壳 shell / 模态 modal / 全屏态 state / 非视觉 node),带 `tags`(模态互斥域)、`host`(宿住层:level_screen 宿冒险屏壳)、`shell`(屏壳占树位、成员占登记位:camp_overlay/camp_screen)四类字段。树序=登记序=z 序同源派生。
- **唯一落位口 `_apply_layer_contract()`**:按合同序 `move_child(node, slot)` + `_register_modal(member, tags)`;删除了原先散落在 `_build_ui` 的两处 `move_child`(camp 屏壳插位、curio 对位)。新增 `_layer_node(key)` 查表寻址函数。
- **装配顺序修复**:`_adventure_screen` 先实例化挂树、`_menu_screen` 后挂——修复坏事实①「菜单屏先挂垫底被冒险屏盖死,F5 见战斗界面」。
- **V2 断言重写**(坏事实②:旧断言把错误顺序写成期望值,测试在保护 bug):删除三条裸下标断言(`kids.find(_menu_screen)==0 and kids.find(_adventure_screen)==1` 等),改为
- **V1a** 启动态顶层可见层=start_overlay(内容层遍历,屏壳不当候选)
- **V1b** 语义关系:菜单屏壳树序 > 冒险屏壳树序
- **V1c** 合同树序链逐对保序(运行期树序 == `LAYER_CONTRACT` 序)
- **V1d** 落位单口源码断言(`_apply_layer_contract` 函数体之外 `move_child(` 计数 == 0)
- 场景探针同步:`ui_struct_probe` 新增 `_modal_registry_contract`(登记序==合同模态序逐位点名、直接子层树序==合同序、level_screen 宿主特例、camp 屏壳夹位特例),旧 `_career_registry_contract` 同批退役。
### T2 boot 链路时序后置条件
新增 `_smoke_boot_chain`,**十断言**(卡片写「六断言」,实施期按可断言面扩为十):ConfigDB 就绪且表已载 / 音量与减动效引擎态 == settings_store 现值 / start_overlay 可见 / **续玩钮态 == 断点在档态(boot 路径关系判据 + 隔离新档双向三子态:无断点隐、合成断点显、清断点回隐)** / run_scope 闲时会话在树 / 调试浮窗态 == DS_DEBUG 门控。存档隔离走 `attach_path("user://smoke_boot_chain.json")`。
### T3 生命周期存活性矩阵
新增 `_smoke_lifecycle_matrix`,**九阶段 × 五引用面**:闲时 / 开局停点(地图选路停点态合并)/ 战斗中 / 结算后(胜利停点)/ 选路页 / 终局面 / 回菜单收束 / 各模态开合后(菜单域四模态)/ 两连局 + 续玩。每阶段判 20+ 取数面的存活性:`run_scope` 在树、adventure / runner / settlement 三面活死、四处回调句柄(treasure/bonus/camp/modal_flow)与 `run_scope` 成员同源。活战斗驱动复用现有 `_auto_play_round` 模式(phase/round 守卫 + `AutoPlayer.choose_dig`)。
### T4 渲染面内容断言三件(坏事实③)
1. **`shot_probe.gd` 两自检**:boot 态顶层可见层 == start_overlay;菜单标题/副标题 `is_visible_in_tree` 且 `get_global_rect()` 落视口内。隔离调用改 `ProbeUiUtil.isolate_save(main, "smoke_shot_probe", false, true, true)`(refresh_resume 开——菜单截图/golden 不依赖真实档断点态)。
2. **`shot_checker.py` 墨色判据 F**:新增 `check_text_presence()`——与中位灰度差 >60 的像素占比落在 [2%, 55%] 带(**极性无关**,不预设字色深浅)。
3. **启动态菜单 golden**:`golden_baseline_refresh.sh` 新增 `--menu` 模式(含字体与 `button_stone.png` 素材守卫),基线 `game/tests/golden/menu_boot.png` 入库;`render_gate.sh` 补菜单 golden 逐像素对比段(基线缺失=FAIL、截图/素材缺位=SKIP,沿既有 Q5 口径)。帧差前置验证:菜单 **changed=0.0000% / max_diff=0**(光柱是静态贴片),故全屏 golden 安全、无需收窄区。
### T6 规范落文 + 机械面文档同步
- **新硬规则「验收函数无变异红记录不算验收成立」**三处落文:`CLAUDE.md` 批次工作流第 9 条(原 9–14 顺延 10–15)、`design/dev/code-conventions.md` §3.6 变异验证操作细则(注入→最窄闸见红→`git checkout` 精确还原→记录四步;变异不红的二选一处理;判据强弱分层)、req-card 技能 §7 验证闸(WorkBuddy 与 ZCode 两份副本已同步;CodeBuddy / Qoder CN 无此技能副本,不动)。
- 机械面文档随批更新:roadmap 迭代 28 行换代+近期主战场前沿改 29+ M4;06 登记条销号改写+反哺点三条专条;07 新增 ㉗ 启动态菜单目检节;doc 三闸对基线零新增。
---
## 二、闸记录
| 闸 | 结果 |
|---|---|
| 冒烟全量 | **1125 / 0**(基线 1086/0,+39) |
| 单元测试 run_all | **27 套全绿** |
| probe_gate --click | **全绿**,残留 Godot = 0 |
| probe_gate --full | ⚠️ **t17_defer_probe 红**(存量红,非本批引入——详见 §六),其余五件全绿 |
| render_gate | **全绿**:shot_checker A–D 过(含新增 F 判据 I-OK×2)、棋盘 golden 0.00%×3、**菜单 golden 0.00%** |
| doc 三闸 | 对基线零新增(gdd_lint 三件 / 死链 3 / 术语 5 组,与 master 39c6544 同) |
| static_scan | S1/S2 ok、S4 ok、**S9 归零**、S10 FAIL=文件头存量 125 处(2026-10-15 新立规,清偿批在册待发令,非本批引入) |
| MC 模拟 | **零跑**(本批零数值零行为变更,装配顺序修复除外) |
**类型闸自纠一笔**:批末 static_scan 报 S9(类型闸)**存量 1 处**——`main.gd:453` `_apply_layer_contract` 内 `var tags: Array` 未带元素类型,系本批新增代码触发(iter27 立闸时 S9 全绿)。随批修为 `Array[Variant]`,S9 归零,冒烟复跑 1125/0 不变。**这笔正是「闸不是摆设」的反面印证**:本批新增的验收函数抓别人的错,既有的类型闸同样抓本批的错。
**顺带清理(非本批引入,基线带入)**:`design/gdd/07-体验验证清单.md` v1.0 行处残留 `<<<<<<<` / `=======` / `>>>>>>>` 合并冲突标记(iter27-techdebt-20261014 分支合并进 master 时漏解)。两侧均有效故全留(qa 收尾批人闸核销行 + ㉖ 目检节登记行与正文节),版本号顺延 v1.1,清理注记入 v1.2 行。
---
## 三、代拍板追认单
> **追认结果(2026-10-17 用户令)**:第 1–13 项**全部同意,无修改意见**(含第 9–13 项五条白名单外)。第 14 项本批动作(只补 ZCode 副本、未擅自取齐)照认;其**"两副本是否取齐"仍是待裁问题**,挂在 active.md 未决面,不因本追认自动通过。
白名单内八项(卡片 §9)全部按授权执行;以下为实施期实际取定的形态与**白名单外需追认项**:
| # | 事项 | 取定 | 归属 |
|---|---|---|---|
| 1 | 合同常量数据形态 | 有序 `Array[Dictionary]` + tags/host/shell 特例字段(白名单①) | 白名单 |
| 2 | 特例层断言表达 | 经宿主屏壳 / 成员间接比较(白名单②) | 白名单 |
| 3 | boot 顶层断言候选集 | 显式内容层清单(屏壳不当候选)(白名单③) | 白名单 |
| 4 | 墨色阈值 | 差 >60、占比带 [2%, 55%],按菜单文字实测定 provisional(白名单④) | 白名单 |
| 5 | 菜单 golden 收窄区 | 不收窄——帧差实证 0.0000%,直接全屏比对(白名单⑤,结论为「无需收窄」) | 白名单 |
| 6 | 变异注入手段 | 改常量序 / 插 `move_child` / 注释 `add_child` / 注释 `queue_free` / `visible=false` / 状态源取反(白名单⑥) | 白名单 |
| 7 | 新冒烟段挂载位置 | `_smoke_scene_split` → `_smoke_boot_chain` → `_smoke_run_lifecycle` → `_smoke_lifecycle_matrix`,挂 `_split_tail`(白名单⑦) | 白名单 |
| 8 | 计划书存档文件名 | `.zcode/plans/启动装配与生命周期验收补全批-loop-plan-2026-10-15.md`(白名单⑧) | 白名单 |
| 9 | **合同表规模 12 → 16 层** | 卡片基于「十二模态登记数组」,实采后扩为覆盖全视觉层的 16 层(屏壳/非视觉节点/全屏态亦入表)——约束「单点化+同源派生」未破 | **白名单外,请追认** |
| 10 | **T2 断言数 6 → 10** | 卡片写六断言,实施期把续玩钮拆出隔离三子态、补全 ConfigDB/设置/会话/浮窗门控面 | **白名单外,请追认** |
| 11 | **T3 阶段划分调整** | 卡片写「十阶段」,实施期把「地图选路停点态」并入「开局停点」(同一运行期状态,无独立断言面),得九阶段 | **白名单外,请追认** |
| 12 | **变异 2b 形态偏离计划书** | 计划书原文「注释 `_begin_session`/提前 free」;实施期取 2a=注释 `add_child`(该活不活)、2b=**注释 `queue_free`(该死不死)** 互补双向。「提前 free」改为 `free()` 会与 V3f 断言同向(仍绿),不构成有效变异,故未取 | **白名单外,请追认** |
| 13 | **07 冲突标记清理** | 基线带入的未解合并标记,本批因需同文件登记 ㉗ 而顺手解开(两侧全留,零内容发明) | **白名单外,请追认** |
| 14 | **req-card 技能双副本** | ZCode 副本与 WorkBuddy 副本已各自演进(ZCode 多两条自有条目),本批只把变异验证一条补进 ZCode 副本,**未擅自取齐**两副本差异 | 知会项;是否取齐请裁 |
---
## 四、GDD 反哺点(三条,已登记 06,待用户逐点裁决另批落文)
| # | 文档 | 反哺点 |
|---|---|---|
| 1 | `design/dev/architecture/architecture.md` | **视觉层装配合同**=`main.gd` 的 `LAYER_CONTRACT` 常量(16 层),树序=登记序=z 序同源派生,全仓唯一落位口 `_apply_layer_contract`;现行架构文档无此条款(仅 :124 提「组合根 main.gd」、:173 提「主场景装配视图单元」)——是否立条款、合同表是否随架构文档摘录待裁 |
| 2 | `design/dev/architecture/architecture.md` | **boot 链路后置条件**已由 `_smoke_boot_chain` 十断言成文;架构文档启动流程(:173)只有装配动作无后置条件——是否入册待裁 |
| 3 | `design/dev/architecture/architecture.md` | **RunScope 生命周期存活性矩阵**(九阶段×五引用面)已可执行化;架构文档 :124 只登记了 RunScope 的存在——矩阵是否入册、阶段划分是否认账待裁 |
**与迭代 27 反哺点①的关系**:iter27 只登记了「场景分层/会话生命周期陈述滞后于实态」的方向性缺口;本批把其中「层序=谁说了算」「boot 后置条件是什么」「会话引用面何时活何时死」三件做成了代码级事实与可执行断言,本条是其**具体化承接**,落文时可合并处理。
---
## 五、变异验证记录表(六次注入,全部见红并精确还原)
判据:**注入 → 跑最窄的那一道闸 → 见红 → `git checkout -- <文件>` 精确还原 → 复跑确认回绿**。还原后统一复跑冒烟得 **1125/0**,六轮全以 `REVERTED-CLEAN` 收尾。
| # | 变异点(file:line) | 注入方式 | 缺陷类 | 跑的闸 | 红输出(摘要) |
|---|---|---|---|---|---|
| 变异 1 | `game/presentation/main.gd` `LAYER_CONTRACT` 首两行 | `adventure_screen` / `menu_screen` 对调(翻装配序) | 装配序错 | `python tools/run_smoke.py` | 1125 项 **2 失败**:`V1a`(实测顶层=`@VBoxContainer@648`,菜单被冒险屏盖住)、`V1b`(菜单屏壳树序不在冒险屏壳之上)红;`V1c/V1d` 绿 |
| 变异 1b | `main.gd` `_apply_layer_contract()` 调用后 | 插入散落 `move_child(debug_overlay, 0)` | 层序硬编码(合同外落位) | 同上 | 1125 项 **2 失败**:`V1d`(函数体之外 move_child 调用点=1 应=0)、`V1c`(违例 `@Control@1057(14)≤@Control@1119(0)`)红 |
| 变异 2a | `main.gd:195` `_begin_session` | 注释 `add_child(run_scope)`(会话对象不挂树) | 对象该活不活 | 同上 | 1125 项 **22 失败**:`V2e` 红 + V3 全部 21 个阶段面「run_scope=不在树」 |
| 变异 2b | `main.gd:191-192` `_begin_session` | 注释 `run_scope.queue_free()`(旧会话不销毁) | 对象该死不死 | 同上 | 1125 项 **1 失败**:`V3f`「收束后旧局经 queue_free 消亡(is_instance_valid=false)」红 |
| 变异 3 | `main.gd:218` `_ready` | `_start_overlay.visible = false`(藏菜单层) | 层被盖/不可见 | 冒烟 + 窗口化 `shot_probe` + `golden_compare` + `shot_checker` | 冒烟 **3 失败**(`V1a`/`V2c`/`V3a`);探针自检 **3 问题**(顶层≠start_overlay、标题/副标题 `is_visible_in_tree=false`);golden `changed=34.23%` FAIL;`shot_checker` exit=1 |
| 变异 4 | `main.gd:531` `_refresh_resume_button` | `_resume_btn.visible = not has`(状态源倒置) | 状态源/时序倒置 | `python tools/run_smoke.py` | 1125 项 **6 失败**:`V2d` 四条全红(boot 态、无断点态、有断点态、清断点回隐)+ `V3a` + `V3i` |
### ⚠️ 变异 3 暴露的一条判据边界(重要,如实记录)
**F 判据(墨色占比)本身没有红**——菜单层被藏后,底层棋盘内容透过标题框仍给出 33.48% 的高反差像素,落在 [2%, 55%] 带内,`I-OK` 照过。真正拦下这个缺陷的是另外两件:探针的 `is_visible_in_tree` 自检,和 golden 逐像素(34.23%)。`shot_checker` 虽 exit=1,但红的是 **C 判据**(背景纹理幅度 79.4 > 18),属间接命中。
**结论**:F 判据只能证伪「整框空白/整框糊」,**不证明「框里是菜单标题」**。菜单内容断言的强判据是「可见性自检 + golden 逐像素」,F 判据为补充。这条边界已同步写进 `code-conventions.md` §3.6 的「判据强弱分层」,供后续写卡配判据时援引。
---
## 六、残留与去向
### 6.1 probe_gate --full 的 t17_defer_probe 红(存量红,**非本批引入**,待裁)
**① 现象**:`tools/probe_gate.sh --full` 中 `t17_defer_probe` 失败——`[t17_defer] FAIL — 关卡画面未出现`(exit=2;首次运行时表现为 exit=124 超时挂死,同一根因的两种表现)。`--full` 的其余五件(ui_input / ui_struct / ui_contrast / ui_probe / ui_tune / fx)**全绿**,`--click` 亦全绿。
**② 证据链(三条,均指向「非本批引入」)**:
| 证据 | 结果 |
|---|---|
| 主区 master 39c6544(**不含本批任何改动**)跑同一探针 | **同样 FAIL 4/4**,失败行与本批完全一致 |
| 把真实档 `user://save.json` 临时改名移开后跑同一探针 | **PASS**(exit=0,15s,`胜利同帧挂起+排播完开窗 两断言全过`) |
| 探针自身行为 | 首次跑绿、跑完即把真实档写成带断点状态,其后必红——**探针会污染它本应隔离的真实档** |
**③ 机理**:`_start_adventure_from_menu()`(`main.gd:498`)在 `save_manager.has_breakpoint()` 为真时不开冒险,改弹「已有未完冒险」确认框。真实 `user://save.json` 当前存在未完冒险断点时,探针的隔离(`main.save_manager = iso_c`)没能覆盖到这条路径,于是 60 帧内等不到 `level_screen.visible` → FAIL。
**④ 补充事实(须告知)**:`user://` 目录(`%APPDATA%/Godot/app_userdata/DungeonSweeperVerticalSlice/`)由**全部 worktree 共享**(同 project name),所以主区与任何 worktree 的探针/冒烟都在读写同一份存档。本机这份真实档现在带有一个未完冒险断点。**本批验证过程中曾为定位根因临时改名移开该档,已按原样还原并通过逐字节 `cmp` 校验一致**(备份留 `/d/tmp_save_backup_20261015.json`)。
**⑤ 历史沿革**:iter26 台账记「probe click/full 全绿」,**iter27 台账只记了 `probe click` 未记 `--full`** —— 该红大概率自 iter27(row_pacer 排播泵迁出 + ModalFlow 抽取)起就存在而未被跑到。probe_gate 头注亦有预言:「超时多半=探针未适配新停点层,归 probe 适配批」。
**⑥ 待裁(不擅自处理)**:本红属**探针适配存量债**,修它=改探针隔离方式,是卡片外的新需求。三个选项请裁:
- **甲**:认可存量红、照常合并——红与本批无关,master 现状同红,合并不会使任何东西变差;
- **乙**:先修探针隔离(补真实档隔离/跑前清断点)再合并——属新需求,需用户批后另起小批;
- **丙**:用户先自行处置本机真实档断点(游戏内开新冒险覆盖或删档),我再复跑 `--full` 取绿后合并——但此法只治本机这一次,探针自污染的根因仍在。
### 6.2 实机目检(登记不阻塞,2026-10-12 立规)
已登记 `design/gdd/07-体验验证清单.md` **㉗ 启动态菜单目检**五观测项:启动即见主菜单 / 菜单六钮可点 / 菜单与战斗互不遮挡 / 各覆盖层开合层级正确 / 音量与减动效启动即生效。**登记完毕即批内义务了结**,用户自行安排时间验收。
### 6.3 其他
- 计划书存档:`.zcode/plans/启动装配与生命周期验收补全批-loop-plan-2026-10-15.md`(不入 git)。
- 需求卡片按「中间产物吸收即死」惯例不入 git;卡片所记基线 1081 与实测 1086 的差异已随本批回写 roadmap 与 06。
- req-card 技能两份副本(WorkBuddy / ZCode)本批各补一条后**仍有两条 ZCode 自有条目未取齐**,是否取齐请裁(§三 #14)。
---
## 七、冒烟断言数增量呈报
**1086 → 1125,净 +39**,逐项可溯源:
| 项 | 条数 |
|---|---|
| 新增 V1(装配合同四断言:V1a/V1b/V1c/V1d) | +4 |
| 新增 V2(boot 链路十断言) | +10 |
| 新增 V3(生命周期矩阵,九阶段面 + 各附加判据) | +28 |
| 退役裸下标断言(`kids.find(...)` 三处——合同链断言已覆盖) | −3 |
| **合计** | **+39** |
(新增 42 条全部带 `〔装配生命批 Vn〕` 尾缀,可与需求卡片 §7 逐条 grep 对账。)
+169
View File
@@ -0,0 +1,169 @@
# 迭代 29 实现报告 · 测试分层与门禁语义修正批(2026-10-16)
- 需求卡片:`design/research/需求卡片-测试分层与门禁语义修正批-2026-10-15.md`(**v2.0**,三轮复查定稿、零待裁点)
- 开工门 U0:用户 `/iter 29` 发令(2026-10-16)。基线 master `752c9a0a`
- worktree:`g-plan2-iter29-testlayers`,分支 `iter29-testlayers-20261016`,八提交(`698d864d` … `c3b64030`)
- 用户原始诉求(本批要兑现的三条):①最单元的逻辑代码有它的单元测试;②整体的模块有它的接口测试;
③整体的系统在执行之后,也有它 UI 方面的和场景切换相关的测试。**并且验收不能只是"冒烟"——
可以是冒烟,但更重要的是逻辑正确性**
---
## 一、批次概览
| 卡 | 内容 | 状态 |
|---|---|---|
| T0 | 证据坐实与基线冻结(三反例实测 + 墙钟 + 行号复核 + 存量红留档) | ✅ |
| T1 | 本地闸判定三硬闸(退出码/脚本错误扫描/断言数下限) | ✅ |
| T2 | 术语订正 + CI 残留清除(机械面) | ✅ |
| T3 | L2 接口层建承载(`integration/` + parity 条件闸件收编) | ✅ |
| T4 | L3 屏壳切换探针 `screen_flow_probe`(入轻闸默认段) | ✅ |
| T5 | L1 覆盖补洞(4 个 core + 呈现层两件) | ✅ |
| T6 | 扫描域:S3 路径修正 + 零命中自检 + 补 S5 | ✅ |
| T7 | 游离脚本台账 + golden 时效判定 | ✅ |
| T8 | 文档同步闸(架构事实源回写 + 06 登记)与全闸 | ✅ |
**读数**:冒烟 **1127/0**(与开工日持平,本批零新增冒烟断言);单元套件 **27 → 33 套**;
在闸探针 **9 → 10 件**(新增 `screen_flow_probe`);轻闸 `--quick` 墙钟 363s → 405s;
全量重闸 **exit=0,存量红零新增**。
---
## 二、四件事的交付
### ① 本地闸三硬闸(本批改造成效最大的一卡)
判定语义从「超时 + 日志含 PASS 串」扭到三硬闸,**每一条都有反例实证**(不是推断,是跑出来的):
| 硬闸 | 反例构造 | 改前判定 | 改后判定 |
|---|---|---|---|
| 退出码为唯一权威判据 | 探针打印 PASS 后 `quit(1)` | `[probe_gate] 全绿` ❌ | `FAIL — 退出码=1(PASS 串不抵)` ✅ |
| 脚本错误扫描命中即红 | 套件中途触发 `SCRIPT ERROR` 后仍退出 0 | `[run_all] PASS` ❌ | `FAIL — 输出含脚本错误标记` ✅ |
| 断言数为零即红 | `Kit.finish()` 时 `checks==0` | `all green (0 checks)` ❌ | 返回专用退出码 **2** → `FAIL` ✅ |
实现要点:
- `probe_gate.sh` 八件探针判定统一走 `verdict` 函数(退出码优先 → 脚本错误扫描 → 签名标记附加判据);
`ui_click_probe` 本就走退出码语义、日志不写 PASS,签名标记传它自己的 `click_probe` 串,不强加。
- 新闸件 `tools/error_scan.py`:错误标记 `import` 自 `run_smoke.py` 的 `ERROR_MARKERS`,**禁第二份清单**。
- `run_all.gd` 侧遇到两个本机事实(都写进注释防复发):
① `OS.execute` 的输出管道在本机恒空(实测 0 行)——子套件输出必须交给系统命令解释器重定向落盘再读;
② `OS.get_executable_path()` 返回的是 GUI 子系统 exe,它起的子进程 stdout/stderr 句柄无效——
必须换 `*_console.exe`(`GODOT_BIN` 优先)。
- 断言下限用**专用退出码 2**(不是 1):致命类套件 manifest 期望 1,零断言若也返回 1 会被 expect 协议放过。
### ② L2 接口层从零建承载
- 建 `game/tests/integration/`,首个集成用例 `save_rng_roundtrip_test.gd`(17 条断言):存档 ⇄ RNG 快照往返,
跨 SaveManager(落盘 + 版本迁移链)× AdventureRunner(断点消费)× RngService(续跑零跳号)× 停点态确定性。
与 `unit/core/breakpoint_resume_test` 的分工:那件是单测只验首战开板一致,本件验跨系统闭环,
含**「旧版本档经迁移链后断点仍可续玩」**这条真实玩家路径。
- `tools/parity_anchor.py` 收编为重闸 **11 号条件闸件**:每次跑批都对 merge-base 做一遍触面判定
(`data/tables`/`rng_service`/`save_manager`/`meta_progression`/`settlement`/`damage_math`/
`damage_controller`/`battle_orchestrator`/`adventure_monte_carlo`),未触面 SKIP;**触面也不自动跑**——
它调的是 MC 脚本,属「跑批发起前须用户批准」红线,闸只负责把触面判定做一遍并显式要求批准
(批准后 `PARITY_APPROVED=1` 重跑)。**本批即判为触面(改了 `battle_orchestrator.gd`),故挂在 NEED-APPROVAL 待你批准**(见第六节)。
### ③ L3 屏壳切换探针
新建 `game/smoke/screen_flow_probe.gd/.tscn`:走 菜单→营地→菜单→冒险→(关卡屏⇄战斗屏)→放弃→终局→菜单
六步主流程与两条回退路径,每步断言屏级互斥 + 流程状态位,入**轻闸默认段**。全库 `change_scene` 零命中、
屏切换全靠 visible 互斥,这正是最容易被装配顺序改动悄悄破坏又最难被单测覆盖的面。
判据两处订正(首跑实测抓出):① 屏标记不能裸看 `visible`——战斗容器 `battle_root` 在局外也 visible,
会把 boot 态误判成「菜单与冒险同时在场」;② 互斥不能用「可见屏计数 ≤1」——终局覆盖层合法叠在冒险内容之上
(终局态 `is_adventure` 尚未收束,是设计如此),改为冲突对判定,合法叠加仅「终局+冒险」这一对。
### ④ L1 补洞 + 术语订正 + 台账清理
- 新增六套(全部进 manifest):`board_generator`(9 条)/`minesweeper_rules`(12 条)/
`config_db_resolver`(8 条)/`config_db_cross_validator`(4 条)/`hud_presenter`(5 条)/`battle_narrator`(9 条)。
三屏壳的断言面由 ③ 的探针承担,不另起第二载体。
- 术语:「冒烟」回归本义=秒级存活检查,写进 README 术语小节,并显式点破两处历史遗留命名
(`run_smoke.py` 与 `game/smoke/` 名带 smoke,实际承载的是系统级断言面与场景探针——判定看语义不看文件名)。
- 台账:`game/smoke/` 15 个不带 `.tscn`、不入闸的手动入口件逐个定性成表(用途 + 触发方式 + 结果由谁判),
存疑一律按在役登记并标注,禁「没看见=死件」式清理。
- golden:**先判再动**——实测棋盘三图 changed 0.00%/0.00%/0.00%、菜单 0.15%,均远低于 2% 阈值 ⇒ 判有效,
留在位不重制(禁「重制一下就绿了」掩盖真实视觉回归)。
---
## 三、代拍板追认单(超清单必呈报;本批共 12 项)
> **追认结果(2026-10-17 用户令)**:以下十二项**全部同意,无修改意见**。第四节「经你裁决的四项」是施工中已问过、你已答的四条,不在本追认范围,维持原记录。
| # | 代拍板事项 | 处置与依据 |
|---|---|---|
| 1 | 三硬闸的具体实现写法 | `probe_gate` 抽 `verdict` 函数;错误扫描抽独立闸件 `tools/error_scan.py`(标记 import 自 `run_smoke.py`) |
| 2 | 断言数下限的阈值 | 每套件 ≥1(防误伤小套件);零断言用专用退出码 2 与「断言失败=1」区分 |
| 3 | `integration/` 内部目录分类 | 平铺,按系统命名(`save_rng_roundtrip_test.gd`)——首例而已,够用不加层 |
| 4 | 新集成套并入 `run_all` manifest 的执行细节 | 零新机制,与单元套件同一入口同一协议 |
| 5 | 新单测/新探针的文件命名与落点 | 沿用 `[system]_[feature]_test.gd` 与 `presentation/` 归位 |
| 6 | 4 个 core 模块单测的断言面取舍 | 各 4–12 条真值断言,期望值一律由盘上/注入内容数出来(零玩法数值字面量) |
| 7 | **断言本身写错且与现行设计冲突**时的修法(契约 1 唯一例外) | 见第四节「经你裁决的四项」,逐条列明 |
| 8 | 游离脚本「在役/失效」的判定 | 存疑按在役登记并标注;`CLAUDE.md` 在册入口禁当死件 |
| 9 | S5 规则的正反例构造 | 形态=标识符后紧跟 `.` 的成员访问,排除注释行与字符串字面量;core 实测零命中 |
| 10 | 提交切分与分支命名 | 八提交按 T0–T8 一卡一笔;分支 `iter29-testlayers-20261016` |
| 11 | **S3 零命中自检的实现形态** | 扫描路径收为单点变量 + 规则自己数扫描面文件数,为零即判红,且规则体包进自检成立分支 |
| 12 | **条件闸件的 diff 触面路径表** | 写进 `run_all_gates.sh` 内(不自造第二份清单),见上文 ② |
---
## 四、经你裁决的四项(施工中冒出的分歧,未自答)
1. **`fx_grant_gp` 补进行来源断言豁免表**(你裁「本批补豁免」):`grant_segment.gd:221` 发「专长·GP 入账」
效果行(source_class=`fx_grant_gp`、origin_cell=(-1,-1)),而 `SOURCE_EXEMPT_CLASSES` 只豁免了 `fx_reveal`
⇒ 每局触发行来源断言失败 7 次,因脚本错误不改退出码被闸长期漏过。改动=一行常量加一个字符串,
零玩法行为变更(迭代 21 同款修过 `fx_reveal`,本例是同一张表的漏网)。
2. **manifest 增 `negative` 字段**(负面套件豁免错误扫描一闸):仅 `reward_dangling_treasure` 一件——
坏表是它的测试目标,输出里的 Parse Error 属误伤。退出码与断言下限照判,不是开后门。
3. **`config_db_test` 的 10 条被吞断言**(你裁「本批全修」):`rows` 是 `Array[Dictionary]` 定型属性,
直接赋 untyped 数组字面量触发 `Invalid assignment` ⇒ **中断整个函数**,敌人表「行集构成三条纪律」
的 10 条断言从未执行过(文件 31 处 check,实跑 21 条)。改 `rows.assign([...])` 后 26 条全跑,
其中两条正向断言见红,根因是**夹具缺 depth-0 锚行**(`validate` 的 anchor 规则),补锚行后全绿。
4. **`system_contracts_test` 的空桩换真实实例**(同上):`RngStub`/`UnitContainerStub` 赋给定型成员
报 `Trying to assign value of type ''`,`RngStub` 类删除,`UnitContainer`/`StatusContainer` 改真实实例。
---
## 五、闸与读数(全量重闸 `tools/run_all_gates.sh`,commit `c3b64030`)
| 闸 | exit | 说明 |
|---|---|---|
| 01 冒烟全量 | 0 | **1127 项检查 0 项失败**(与开工日持平) |
| 02 单元套件 | 0 | **33 套**(26 单元 + 1 集成 + 6 新单测);编排层另扫 `unit.log` 零命中 |
| 03 探针 --click | 0 | 五件(含新增 screen_flow)全绿,残留 Godot=0 |
| 04 探针 --full | 0 | 四件全绿 |
| 05 渲染闸 | 0 | shot_checker 全过;棋盘 golden 三图 0.00%;菜单 0.15%(≤2%) |
| 06 gdd_lint / 07 doc_link / 08 doc_term | 0 | doc_term 首跑抓到我新写的退役词「对拍」1 处,已改正 |
| 08b active.md 体量 | 0 | — |
| 09 静态扫描 | 1 | **存量红零新增**:S10 文件头存量 127 处,指纹与基线 `4354b2aa72a7` 一致 |
| 10 熵增闸 | 0 | — |
| 11 回放确定性对拍 | NEED-APPROVAL | 本批 diff 触及结算面,对拍需你批准发起(见第六节) |
**验收通过**(`all_green=true`,存量红零新增)。轻闸 `--quick` 墙钟 405s(开工日 363s + 新探针约 40s)。
---
## 六、待裁与遗留
0. **【合回状态:已合并进 master(`fff4f120`,十提交,2026-10-16)】** 本项原文为「暂不合回,等两个非本批红处理完」
(2026-10-16 用户裁),两个红其后各自结案:①渲染闸 `menu_boot.png` changed=4.61%(菜单 golden 热区漂移)
——基线已在合并代码上显式重采(`dac9a94b`),现行菜单与棋盘三张 golden 均 0.00%;②gdd_lint
`01-核心循环.md` R5 缺流程图——由引入批补流程图结案(提交 `fcb8c3f8`+`8c18b52b`),基线 06 已回绿。
本段为 2026-10-17 迁位批(`design/qa/` → `reports/`)改写,原待裁文字 git 历史可考。
1. **11 号闸的 parity 对拍要不要跑一次**(需你批准,我不能自行发起):触面判定是机械的路径匹配,
本批对 `battle_orchestrator.gd` 的改动实际只是加一个断言豁免常量(零玩法行为变更、零数值改动)。
- 若按「MC 无数值改动零跑」红线 ⇒ 不跑,闸维持 NEED-APPROVAL(回执里留名,不判失败);
- 若要验证一次 ⇒ 批准后 `PARITY_APPROVED=1 tools/run_all_gates.sh`(三变体约 10–15 分钟)。
2. **GDD 反哺点三条**(2026-10-17 用户逐条裁决:三条全部写入):
- 「三硬闸」与「新写测试件全类型标注」→ **test-conventions.md §7**(code-conventions §3 已独立成文至此,故落此处);
- 「判定可靠性优先于覆盖率」→ **test-conventions.md §8**(本批核心命题成节);
- `screen_flow_probe` 转机检 → **07 v1.4**:㉖① 保留不注销,节首加机检承接注记。
本条补登记为 06 专条(原漏登)。
3. **06 已登记本批未收的七项**(不阻塞不排期):余下 3 个 core 零指名模块、`render_gate` 的脚本错误扫描缺失、
S7/S8(S6 亦仍在 TODO)、E 级卫生件、行覆盖率度量、`smoke_all` 拆分、parity 触面判定偏粗。
4. **本批最有价值的副产品**(2026-10-17 用户裁决:写入):脚本错误会**静默中断所在函数的剩余断言**而
套件仍报「全绿」——本批至少三处实证(敌人表行集纪律 10 条零覆盖、`Callable` 形参类型写错让解析函数
返回 null)。已由三硬闸之二机制性拦住;机制事实与「写验收函数须自证断言全数执行」义务已写入
**test-conventions.md §8**。