iter53-收尾:迭代53产出物: 实现报告+反哺点清单10条+独立验收审计(通过);并master(fd9c8ad9 QA harness 定案登记+营地背景层两批,零交集)

This commit is contained in:
DKChan committed 2026-11-06 00:08:18 +08:00
1 parent 76a7067440
commit c89e59febb
8 files changed
+350 -46

No files matched your search

+21
View File
@@ -0,0 +1,21 @@
# 迭代 53 反哺点清单(2026-11-05)
- 接收方:[待办清单](../待办清单.md)(反哺点裁决后由文档批/工程批写入并把本清单条目清掉)。
- 依据:`reports/iter53-实现报告-2026-11-05.md`;两卡「关联文档同步面」逐条落点如下。
| # | 落点(哪个文件哪一节) | 改成什么 | 依据 |
|---|---|---|---|
| 1 | `design/gdd/systems/跨局循环/锻造工坊.md` §满级特效扩展位——重甲反震候选条 | 实现前提句补一句:反弹伤害需新开消费点(本批摘 `spike` 词表位后彻底无位,候选=「需新代码」档) | 卡② §6 第 2 行;damage_controller.gd 摘除后 `open_ticket` reflect 通道为唯一反弹面且零现役表行 |
| 2 | `design/gdd/systems/战斗循环/增益状态.md`/`伤害与护甲.md` | 零命中备案——两文档叙述「按序改写族」的句子未挂退役件名,无需改动 | 卡② §6 机械面核对读数(40 名扫描两文件零命中) |
| 3 | `design/gdd/systems/冒险循环/奇物.md`、`systems/战斗循环/地图战斗资源.md`、`design/gdd/术语表.md`、`00-游戏概念.md`、`03-内容规模.md` | 各文仍提退役内容名的句子逐处换机制名(清退口径同卡② T3:只换名不换职责) | 卡② §5 去向表;40 名扫描命中所在(GDD 面不在本批可写域) |
| 4 | 结算明细标签是否入表(文案硬编码 `reward_grant.gd:226`) | 规范裁决点:玩家可见明细文案归属——维持代码硬编码 or 入数据表行;裁决后改对应规范文档 | 卡② §5 去向表末条;本批已把标签换代为「挖掘惩罚减半(%d→%d)」 |
| 5 | `tools/gate_platform.sh` `gate_run_timeout` | 修 Windows 恒 124 缺陷:`kf` 改「先赋路径、`rm -f` 后置守卫」(probe_gate.sh run_suite 同款正确写法);连带修 `golden_baseline_refresh.sh` 的 guard 子Shell kill 短路(7 分钟等待症状) | iter53 实现报告「遗留读数义务与发现呈报」第 1 条;实证=直接调用 4 秒返回 124、refresh 两次 7m1s |
| 6 | `game/tests/golden/mac/` | mac 侧补冻关卡视口两 Shot 基线(跑 `golden_baseline_refresh.sh --lmap`) | 渲染闸 lmap 段缺基线记 SKIP;windows 已冻结(6394abf7),mac 冻结后两平台同盯 |
| 7 | `game/tests/golden/README.md` §时效判定纪律 | 「基线冻结于 2026-09-30」句补 lmap 两 Shot 冻结日(2026-11-05)与两 Shot 面口径指针 | 本批 golden/README 台账已改现持清单,冻结纪律节的时间句留待文档批随批换代 |
| 8 | `game/tests/README.md` 能力行 :163(关卡画面视口平移) | 代表用例名 `_probe_clamp_bounds` 回表为落地名 `_probe_clamp_bounds_and_columns`(实现按卡 §8 对照表外的更 descriptive 名落地,回表归写卡段) | 验收审计 D1(建议级):名实回表义务 |
| 9 | 探针直读申报口径(test-conventions §8.2/§8.4 受控例外注记) | 「探针直读视口子件结构(`get_child(0)` 画布位、按名取指引子件 FadeL/FadeR/PanHint)」补进探针直读惯例的申报面注记 | 验收审计 D2(观察级):直读有注释理由、零风险,补成文口径 |
| 10 | `reports/iter53-实现报告-2026-11-05.md` 决定 3 | 已随本清单同批订正(case⑰→⑱ 笔误)——归档备查,无文档批动作 | 验收审计 D3 |
## 零反哺备案
- 卡① `design/gdd/ux/level-map.md`:实现未发现 spec 缺口——布局决策 5 行为四条+像素级判据①–④+AC 260–271 全部有绿读数承载(实现报告对照表 R1–R9+golden 段)。
+80
View File
@@ -0,0 +1,80 @@
# 迭代 53 实现报告(2026-11-05)
- 接收方:[待办清单](../待办清单.md)条目「超预算图策略升级路径——等比缩放与滚动视口两案待裁」(卡①卷轴视口批)+「damage_controller 按序改写族——内容孤儿机制与退役名注释层」(卡②改写族清退批)。
- 需求卡片:`reports/需求卡片-卷轴视口批-2026-11-05.md`(验收档:中)+`reports/需求卡片-改写族孤儿机制与退役名清退批-2026-11-05.md`(验收档:中)。
- 独立验收审计:`reports/iter53-验收审计-2026-11-05.md`(未参与实现的会话执行;两卡均按中档深度)。
- 执行形态:整迭代单工作区(`g-plan2-iter53`,两卡均未声明可并行),卡序=卷轴视口 → 改写族清退。
## 各卡状态
| 卡 | 状态 | T 卡 | 凭据摘要 |
|---|---|---|---|
| 卡①卷轴视口批 | 完成(T0–T4 全收口+golden 扩项冻结) | T0 基线读数在案/T1–T3 实现波提交 c1043902/T4 指针反转 4e87a012/golden 扩项 6394abf7 | 新探针 26 断言全绿+探针族全绿+冒烟 15/0+S13 基线内 7 新增 0+渲染闸全绿(lmap 双图 changed=0.00%) |
| 卡②改写族清退批 | 完成(T0–T5 全收口) | T0 基线读数在案/T1 b5c21e3a/T2 1bd50304/T3+T4 并笔 ed793e8c | 三套件+四套窄测 exit=0+对拍六组逐字节 diff=0+四探针负域全拒+契约 1 三条 grep 全零+40 名注释面清零 |
## 卡① 实际改动—验收对照表
| 需求点 | 改动(文件:行) | 验收测试(落点+尾缀) | 层级 | 真实入口 | 判据绑定面 | 结果 |
|---|---|---|---|---|---|---|
| R1 浅图整幅居中无裁切 | level_map_screen.gd 三段页承载+level_map_viewport.gd `_axis_center_offset` 居中分支 | `level_map_viewport_probe.gd:71/74/76`〔卷轴批 V1〕 | 探针 | `open_choices` 真实停点(L1 固定种子直构 runner) | 画布≤窗居中 offset 定位+画布矩形 encloses 于视口 | 绿 |
| R2 停点切换当前节点居中 x=640±2 | level_map_viewport.gd `reanchor`+screen `_viewport_anchor`/open_choices 接线 | `level_map_viewport_probe.gd:221`〔卷轴批 V2〕 | 探针 | 断点停点重建+真实 `open_choices` | 当前节点画布投影=视口中线±2 | 绿 |
| R3 拖拽平移 | screen `_on_canvas_motion` 拖拽态逐帧 `pan_by`(含激活帧位移) | `level_map_viewport_probe.gd:137`〔卷轴批 V3〕 | 探针 | `push_drag_at` 合成沿走 `push_input` | 视线位移=拖拽位移(40px 逐位) | 绿 |
| R4 滚轮横滚 | screen `_wheel_pan_step` 映射(下/右=前进向) | `level_map_viewport_probe.gd:114/116/120`〔卷轴批 V4〕 | 探针 | `push_wheel_at` 合成滚轮沿 | 单档 ±60 逐位+窗内不钉边界 | 绿 |
| R5 clamp 包络与首末列可达 | level_map_viewport.gd `_axis_pan_offset`/`is_clamped_at_edge` | `level_map_viewport_probe.gd:88/102/158/160/161/167/168`〔卷轴批 V5〕 | 探针 | 超包络拖拽沿两极 | 中线恒在夹紧域+两极 edge=true+首末列中心入屏+入口组包围盒锚点 | 绿 |
| R6 拖拽不触发选路 | screen `_on_canvas_click` 拖拽抬杆不提交 | `level_map_viewport_probe.gd:200/201/206`〔卷轴批 V6〕 | 探针 | 拖拽沿/完整点击沿起止候选上方 | `route_chosen` 零发射+屏未关;完整点击仍提交=1 | 绿 |
| R7 平滑滚动与减动效瞬切 | level_map_viewport.gd `reanchor(smooth)` tween `UiKit.motion(0.3)`+`ArmedTimer.motion_still` 跳终态 | `level_map_viewport_probe.gd:245/249/258`〔卷轴批 V7〕 | 探针 | 可见屏停点切换+`UiKit.motion_scale` 置位 | 平滑有 tween 中间帧(同向在途)+减动效即达 | 绿 |
| R8 指引件可见性与几何 | level_map_viewport.gd `_build_guidance`/`_sync_guidance` | `level_map_viewport_probe.gd:271–287`〔卷轴批 V8〕 | 探针 | 深图真实停点+浅图复验 | 渐隐带 70px+chip 240×30 居中可见;浅图隐藏 | 绿 |
| R9 schema 头注指针反转(非行为) | level_gen_params.gd:3-4/:66 头注 | 静态判据:grep「调参表」残留=0、「参数契约节」指向=2;`--check-only` 零错 | 静态 | — | 全仓无「域并单点=调参表」残留 | 绿 |
| golden 两 Shot 面(2026-11-05 用户裁) | level_map_shot_probe.gd+golden/windows/lmap_entry·lmap_boss+render_gate.sh 对拍段 | 渲染闸「关卡视口 golden 逐像素」段(changed=0.00% 双绿);重采集确定性=0.00% | golden | 窗口化真实渲染+固定种子 | 两 Shot 逐像素 ≤16 差/≤2% | 绿 |
非行为改动行:无(R9 之外全部行为面;`.uid` 边车随新件入库)。
## 卡② 实际改动—验收对照表
| # | 需求点 | 改动(文件:行) | 验收测试(落点+尾缀) | 层级 | 真实入口 | 判据绑定面 | 结果 |
|---|---|---|---|---|---|---|---|
| R1 | 摘四段不可达改写分支 | damage_controller.gd(原 :297-302/:305-309/:310-314/:316-323/:350-353/:367-372/:623 全摘+spike_ready 键摘) | `damage_controller_test.gd`(exit=0);`roll_multiplier_test.gd`(exit=0);`round_flow_skill_pool_test.gd`(exit=0);dump_battle 六组改前改后逐字节比对 diff=0 | 单元+集成 | `BattleOrchestrator.begin_battle()` 全链 | step_row 流逐位=改前基线(L{1,2}×S{42,779401,779501});静态=契约 1 三条 grep 全零+摘后 `spike_ready` 零残留。观测面局限申报:零现役注册行使分支不可达,禁注入表行取证(卡 §8 申报在案) | 绿 |
| R2 | EFFECT_KINDS 摘 spike | effect_engine.gd:30 | `effect_kind_retired_test.gd:89`「effect_kind_retired_test/③词表闭面:kind=spike 出域拒绝」 | 单元(负面,独立进程) | `ConfigDB.load_tables()` → `validate_trigger_row` | do.kind=spike 行被拒+error 诊断在案+退出码 1(负面期望码) | 绿 |
| R3 | DO_KEYS 摘 trade_hit/trade_atk | effect_engine.gd:82 | `effect_kind_retired_test.gd:92`「effect_kind_retired_test/④do 键闭面:trade_hit 出域拒绝」 | 单元(负面,独立进程) | 同上 | 带 trade_hit 键 do 字典被拒+退出码 1 | 绿 |
| R4 | 注释面退役名清零(13 文件) | T3 35 处注释改写(对照卡 3.3 表逐处) | 静态判据:40 名全扫仅剩卡 §5 留底 3 行(treasure_items_test:31/33/35 StubDB 夹具名);宿主套件逐位不变(四套窄测 exit=0) | 静态(闸件扫描) | 宿主套件回归(改写面不进运行期) | 注释面命中 0+套件绿 | 绿 |
| R5 | 减半明细行去退役件名 | reward_grant.gd:226(标签→「挖掘惩罚减半(%d→%d)」+effect_id→nest_halve) | `meta_progression_forge_test.gd:694/697/699/700`(断言串随动,非空+等值+不含旧词强度不降) | 集成(信号采集) | 锻造锋线满级特效 → begin_battle → mine_hit 减半路径 → step_row | display_name==「挖掘惩罚减半(6→3)」+power 减半数值与发射次数逐字不变+grep nest_counter=0 | 绿 |
| R6 | 空集拒绝 reason 去退役件名 | reward_grant.gd:189(→「中立移除:…」) | 静态判据:grep 爆破工兵包 reward_grant.gd=0;`table_structure_guard_test.gd` exit=0 | 静态+单元 | 通道校验面(零现役行不可达) | grep 零命中+通道校验绿。观测面局限申报:reason 不可达,禁造行取证 | 绿 |
| R7 | 反弹明细标签去退役件名 | grant_segment.gd:166(标签→「反弹伤害」+归因串→attune_nest_halve;channel=="reflect" 判据与开单参数字典逐字不动) | 静态判据:grep 惊巢反制 game/=0、attune_nest_counter=0;`round_flow_skill_pool_test.gd` exit=0 | 静态+集成 | mine_hit 订阅施加链(reflect 行族零表行,今天不可达) | grep 零命中+发射面零变化回归。观测面局限申报:禁造行取证 | 绿 |
| R8 | sim 恒 false 匹配删除 | level_autoplay.gd(原 :415 注释+:421 contains(雷区图谱) 条件删,highlight==seal_hit 单判据保留) | 静态判据:grep 雷区图谱 game/=0;sim 驱动链套件绿(四套窄测含 autoplay 消费面 exit=0) | 静态+单元 | autoplay 驱动链(测量面) | grep 零命中+套件绿。观测面局限申报:恒 false 条件不可达 | 绿 |
非行为改动行:T3 注释面 35 处(由 R4 行覆盖);契约 3 约束下 :226/:166 仅标签与归因串文本变动、取值/位序/载荷键逐字未动(R1 对拍 diff=0 为其逐位证据)。
## 读数义务对账(卡内 T 卡产出)
- **卡①T0**:S13 基线无 `level_map_screen` 键(记「无键、按工具默认」);ui_struct_probe PASS 全屏结构断言零红;screen_flow_probe PASS;冒烟 15 项 0 失败。
- **卡①T4 复跑**:S13 基线内 7 条、新增 0(`_on_canvas_input` 重构触发的 max-branches 新违规已拆 `_on_canvas_motion`/`_on_canvas_click`/`_wheel_pan_step` 归零);ui_struct_probe/screen_flow_probe 复跑绿(探针族全绿内含)。
- **卡②T0**:契约 1 三条 grep——`game/data/tables/` 内 spike/armor_rewrite/discount_shift/trade_hit/trade_atk 全零(对照记录=feats.tres:855 clamp_bonus 现役一行);tree_rules 面零;effect_kinds 面 cell_removal 表面零(仅 schema 在册:treasure_item_table.gd:20/:26,本批不摘通道)。S13 四文件无登记键(damage_controller/effect_engine/reward_grant/level_autoplay 均按工具默认)。改前对拍基线六组落盘(L{1,2}×S{42,779401,779501})。改前断言串=「惊巢反制——危险格挖掘惩罚减半(6→3)」(:693/:698-701 现行文本抄录在案)。
- **卡②T5**:改后对拍六组 diff=0;40 名全扫终读数=3 行留底夹具;R5–R8 静态 grep 全零;负域套件 exit=1(期望码)四探针全拒。
- **存量触面 S13 对照**:damage_controller(分支数/函数长度随摘除下降,无新增键);effect_engine(常量字面量变短,方法数/成员数不变);reward_grant/level_autoplay(删文本与恒 false 条件)——S13 终读数=基线内 7、新增 0、恶化 0。
## 实机目检总清单(登记不阻塞)
| 目检项 | 来源卡 | 承载 |
|---|---|---|
| 深度 13+ 图拖拽可达首末列、推进跟随方向感、chip 不碍选路 | 卡① | 窗口化实跑截图已冻结(golden/windows/lmap_entry·lmap_boss);真人试玩复核登记体验验证清单(归批后收尾) |
| 结算明细行减半标签「挖掘惩罚减半(6→3)」一眼可读、无退役件名突兀感 | 卡② | 实现报告登记;真人目检归体验验证清单(归批后收尾) |
## 实现决定记录(超白名单/超卡片明列面逐条备案)
1. **拖拽态成员落屏侧**(卡①§11 把 `_drag_active`/`_drag_accum` 枚举进视口件成员,§6 职责边界却写明视口件「只管裁切/offset/clamp/跟随」、拖拽判定留画布)——取 §6 职责边界优先:拖拽判定状态随输入处理落 screen(`_drag_active`/`_drag_press_pos`),视口件成员 6 个(≤8 达标)、公开方法 5 个(≤20 达标)。撤销方式=成员迁视口件+canvas 经方法驱动(纯结构搬移)。
2. **open_choices 平滑判据=有无当前节点**(卡①§6 写「reanchor(false) 首锚」、T2 写「停点切换/回图接 reanchor(true)」,open_choices 同时承载两路径)——合并读法:入口停点(current_node_id<0)即达=首锚,其余停点/兑付回图平滑=跟随。R2/R7 断言均经此路径。
3. **提交沿移至抬杆**(原提交在按下沿;布局决策 5 阈值区分语义下按下时无法预知是否成拖拽,R6 要求拖拽沿零发射)——完整点击(按下→未超阈值抬杆)提交、拖拽抬杆不提交;ui_input_probe case⑫/⑱ 补 release 沿适配(验收审计 D3 订正:原呈报误写⑰,实际落点两处)(判据语义「图上真实点击提交选路」不变,输入形态更完整)。
4. **滚轮步进 60px、渐隐带色 BG_ROOT 不透明端 0.9、chip 底 HP_BAR_BACK/描边 STONE/文字 WARM、缓动 TRANS_CUBIC+EASE_OUT**——卡 §12 白名单 4/5/3 授权面内定值。
5. **视口件 NOTIFICATION_RESIZED 即席重锚**——首开布局晚于 open_choices 锚定(隐藏子树容器排序首可见帧才传播,4.7 行为;实证=探针首跑 y 锚偏 88px),resize 即席 `reanchor(false)` 收敛;同时是窗口尺寸变化的正确行为。
6. **_fit_canvas 画布尺寸同帧收敛**(`canvas.size = _content_size` 显式置)——视口锚点数学与 `_layout` 同源读画布尺寸,容器延迟收敛不等锚点。
7. **mouse_exited 清拖距跟踪器**——按下即武装的跟踪器在丢失 release 沿(alt-tab 等)后残留会把后续 motion 误判为拖拽激活(ui_input_probe case⑰⑧ press-only 实证);非拖拽态离画布即解除。
8. **卡②探针①注入 do.kind="spike"**(卡 T2 括注 kind=modify_ticket+mode=spike 形态)——括注形态无拒绝通道(`validate_trigger_row` 无 mode 值域检查,mode 属载荷字段非词表),按断言名「词表闭面:kind=spike 出域拒绝」与 R2 判据绑定面(effect_kinds 出域文案)的机制注入 kind 形态。
9. **golden 两 Shot 面口径**(卡①现状事实写「本批不触渲染闸对拍」、批纪律 iter 4.4+test-conventions §8.2 要求扩项)——呈裁用户,2026-11-05 裁「只处理最初始的和最终的:关卡最开始+关卡 Boss 节点,中间过程不对拍」,按两 Shot 面扩项冻结。
10. **卡② T3 与 T4 并笔提交**——卡 §10 白名单授权面。
## 遗留读数义务与发现呈报
1. **闸件缺陷呈报(工程批)**:`tools/gate_platform.sh` 的 `gate_run_timeout` 用 `mktemp` 造超时标志文件——mktemp 即建文件,末尾 `[ -f "$kf" ]` 在 Windows(Git Bash)恒真→**恒返回 124**。被各闸「判定锚工件而非退出码」口径掩住(菜单/棋盘 golden 段与本批 lmap 段均工件锚定,不受影响);`tools/golden_baseline_refresh.sh` 的 7 分钟等待症状(guard 子Shell `sleep 420` 未被 kill 短路)同根。修法=改 `kf="$TMP/..." ; rm -f "$kf"`(run_suite 同款,probe_gate.sh 已是正确写法)。本批不代修(闸件改动归工程批)。
2. **mac 端关卡视口基线冻结义务**:`golden/mac/` 缺 lmap_entry/lmap_boss——渲染闸缺基线记 SKIP 不判红(windows 已锚即盯),mac 冻结归 mac 侧跑 `golden_baseline_refresh.sh --lmap`。
3. **效果通道与事件词的零现役普查**——已在待办清单在册(卡② §5 去向),本批不扩。
4. 卡① level-map.md 同步面:实现未发现 spec 缺口(布局决策 5 行为四条+像素级判据+AC 全部有绿读数承载),零反哺。
+122
View File
@@ -0,0 +1,122 @@
# 迭代 53 验收审计(2026-11-05)
- 审计员:独立会话子代理——未参与本迭代任何实现、设计或写卡工作,只读证据做审计。
- 审计对象:迭代 53 两张需求卡片——卡①卷轴视口批(`reports/需求卡片-卷轴视口批-2026-11-05.md`)+卡②改写族孤儿机制与退役名清退批(`reports/需求卡片-改写族孤儿机制与退役名清退批-2026-11-05.md`)+卡① golden 扩项(2026-11-05 用户裁两 Shot 面)。
- 实现报告:`reports/iter53-实现报告-2026-11-05.md`(两卡「实际改动—验收对照表」为逐行核对基准)。
- 验收档与实际执行深度:两卡均申报「中」档;本次按 test-conventions §8.7 中档执行——对照表逐行全量核对(两卡 R 行逐行)、判据绑定面抽查(超出下限)、测试削弱检查逐处、直查例外核对逐条、判据出处抽查 6 处。**最窄测试复跑=省略,该格写「合回后 CI 现查补记」**(合并尚未发生——本审计为合并前置闸,远端 CI 现查读数待合回落地后按 `tools/ci_check.sh <合并提交>` 补记;静态 grep/文件核对类检查由审计员当场重跑,不属省略面)。
- 基线提交:`709d9a85..8b4399ad`(iter53 分支;7 笔实现笔 c1043902/4e87a012/b5c21e3a/1bd50304/ed793e8c/6394abf7/78e08234 + 1 笔并 master 8b4399ad)。工作树存在本机 Godot 导入元数据漂移(若干 `*.png.import` 未提交改动),不属提交面审计对象。
- 审计动作面:`git diff 709d9a85..HEAD` 全量过目(37 文件);测试/探针/闸件改动逐 hunk 核对;契约 1 五词 grep、40 名退役名全扫、契约 5 残留 grep 由审计员当场重跑。
## 卡① 卷轴视口批(验收档:中|执行深度:中档)
### 对照表逐行核对(全量)
| 行 | 结论 | 依据(文件:行) |
|---|---|---|
| R1 浅图整幅居中无裁切 | 通过 | 断言在案且尾缀可 grep:`game/probe/level_map_viewport_probe.gd:71/74/76`〔卷轴批 V1〕;承载改造落地 `level_map_viewport.gd:30-36`(setup/clip_contents)+`level_map_screen.gd:134-145`(CenterContainer→视口件);真实入口=`open_choices` 真实停点(探针 :62-64,L1 固定种子直构 runner,start_level_external 注入)。运行读数=实现者「绿」在案;合回后 CI 现查补记 |
| R2 停点切换当前节点居中 x=640±2 | 通过 | 断言 `level_map_viewport_probe.gd:221`〔卷轴批 V2〕;断言钉屏空间投影(当前节点屏幕 x 对视口中心 ±2)——比卡面所写 `viewport_center_canvas_pos()` 调用更外层的真实观测,与 level-map.md:101/:154 判据①「居屏中线 x=640±2」同义,非削弱(观察 4);真实入口=断点停点重建+真实 `open_choices`(探针 :216-217)→ screen `reanchor` 接线 `level_map_screen.gd:312-315`+锚点提供方 :483-516。合回后 CI 现查补记 |
| R3 拖拽平移 | 通过 | 断言 `level_map_viewport_probe.gd:137`〔卷轴批 V3〕;真实输入沿=`ProbeUiUtil.push_drag_at`(`game/probe/probe_ui_util.gd:146-166`,press→motion×4→release 全经 `push_input`)打真实画布 `_gui_input`(`level_map_screen.gd:381-403` 拖拽态逐帧 `pan_by`)——**未绕过改动点**(探针全文零 `pan_by` 直调,grep 证);判据=视线位移=拖拽位移 40px 逐位。合回后 CI 现查补记 |
| R4 滚轮横滚 | 通过 | 断言 `level_map_viewport_probe.gd:114/116/120`〔卷轴批 V4〕;`push_wheel_at`(probe_ui_util.gd:168-176)经 `push_input`;映射 `_wheel_pan_step`(level_map_screen.gd:426-433,下/右=+60 前进向,代拍板白名单 5 授权)。合回后 CI 现查补记 |
| R5 clamp 包络与首末列可达 | 通过 | 断言 `level_map_viewport_probe.gd:88/102/158/160/161/167/168`〔卷轴批 V5〕;判据绑定 `viewport_center_canvas_pos()` 夹紧域(level_map_viewport.gd:76-77/:97-100/:111-114)+`is_clamped_at_edge()` 两极翻转(:81-86)+极值列入屏(:161-169,等价 spec 判据④);真实入口=超包络拖拽沿两极。合回后 CI 现查补记 |
| R6 拖拽不触发选路 | 通过 | 断言 `level_map_viewport_probe.gd:200/201/206`〔卷轴批 V6〕;**拖拽沿确从候选节点上方起沿**(:193 `gpos`=候选屏幕投影,:197 `push_drag_at(self, gpos, …)` 起点即候选);判据绑 `route_chosen` 发射面零计数(screen `route_chosen.emit` :465)+屏未关+阈值另一侧完整点击提交=1(:203-206,点击沿 press+release 成对经 push_input)。合回后 CI 现查补记 |
| R7 平滑滚动与减动效瞬切 | 通过 | 断言 `level_map_viewport_probe.gd:245/249/258`〔卷轴批 V7〕;tween 单段缓动 TRANS_CUBIC-EASE_OUT UiKit.motion(0.3)(level_map_viewport.gd:57-59);减动效走 `ArmedTimer.motion_still()`(armed_timer.gd:16-17=motion_scale<1)跳终态——探针置 `UiKit.motion_scale=0.5` 即设置面单点(settings_overlay.gd:96 同驱),判据同向在途+即达。合回后 CI 现查补记 |
| R8 指引件可见性与几何 | 通过 | 断言 `level_map_viewport_probe.gd:272-278`+浅图隐藏 :289〔卷轴批 V8〕;几何常量 FADE_BAND_W=70(level_map_viewport.gd:10)、CHIP_SIZE 240×30(:11)直挂 spec 判据②③;可见性=`_sync_guidance` 画布超窗判据(:181-191)。合回后 CI 现查补记 |
| R9 schema 头注指针反转(非行为) | 通过(静态重跑) | `level_gen_params.gd:3-4`+:70 反转落地;审计员重跑 grep:该文件「调参表」残留=0、「参数契约节」指向=2、`--check-only` 读数实现者在案。全仓唯一「调参表」残留=variation_table.gd:41(地形变异 v1.2 owner,不同文件不同域,不属本卡清退面) |
| golden 两 Shot 面(用户裁) | 通过 | `game/probe/level_map_shot_probe.gd`(PASS 签名 :36+落盘 fail-fast :89-91)+`game/tests/golden/windows/lmap_entry.png`/`lmap_boss.png` 已入库(6394abf7,Bin 215164/211513 字节)+`tools/render_gate.sh:168-197` 对拍段(PASS 签名+双图非零工件锚定+平台缺基线 SKIP 不判红)+`tools/golden_baseline_refresh.sh` --lmap 模式(:59-85,素材齐盘守卫)+`game/tests/golden/README.md` 台账随动;mac 缺基线义务已呈报(实现报告遗留 2+反哺点 6)。运行读数(changed=0.00% 双绿)=实现者在案;合回后 CI 现查补记 |
卡①补充核对:26 断言计数属实(探针 26 处 `_check`+尾缀〔卷轴批 V1..V8〕27 行含 1 处缺位告警);`tools/probe_gate.sh:137-141` 注册新探针;ui_struct_probe 本批零改动(未触其结构断言面,卡①削弱申报该项落空=无事);实现报告实现决定 1-7(拖拽态落屏侧/open_choices 平滑判据/提交沿移抬杆/代拍板白名单定值/resize 即席重锚/_fit_canvas 同帧/mouse_exited 清跟踪器)均有代码承载且不越卡 §12 白名单;7 笔实现笔无一触碰 `design/`/两份根清单/`game/tests/README.md`(逐笔 name-only 核对)。
### 判据绑定面抽查(本卡抽 4 行,超中档下限 2 行)
- R6(如上)——`route_chosen` 零发射+屏未关+完整点击仍提交,三面钉在「拖拽不提交/点击提交」的特有提交面上。
- R2(如上)——当前节点屏空间投影=视口中线 ±2。
- R5(如上)——夹紧域+两极 edge 翻转+极值列入屏。
- R3(如上)——拖拽位移与视线位移逐位一致,且全程走引擎输入管线。
### 直查例外核对(逐条)
| 直查行 | 申报状态 | 结论 |
|---|---|---|
| `level_map_viewport_probe.gd:67` `vp.get_child(0)`(取视口画布子件) | 探针内注释已给理由(「画布=视口首子件——setup 注入序」,:61),对照表/实现报告**未单列申报口径** | 缺漏(建议级,见末节 D2)——断言对象即承载结构本身,无公开可观测面可钉,风险零 |
| `level_map_viewport_probe.gd:266-268/:287-288` 按名取 FadeL/FadeR/PanHint | 同上——探针内注释在案,对照表未单列 | 缺漏(建议级,并入 D2)——R8 断言对象即指引子件结构本身 |
| screen 侧私有成员 | 新探针**未直读**任何 screen 私有成员(`_drag_active`/`_drag_press_pos` 零探针触达);既有「探针直读冻结」惯例面(level_map_screen.gd:39/:57-64)未扩 | 通过 |
## 卡② 改写族孤儿机制与退役名清退批(验收档:中|执行深度:中档)
### 对照表逐行核对(全量)
| # | 结论 | 依据(文件:行) |
|---|---|---|
| R1 摘四段不可达改写分支 | 通过(静态面重跑一致;运行读数合回后 CI 现查补记) | diff 逐段核对:`damage_controller.gd` 命中侧交换/免掷覆盖/spike 置位/移档调用/增伤侧/spike 倍乘/`_discount_shift_up` 整函数全摘;`_ctx_rewrites` 返回键集={roll_read,threshold,crit,discount,clamp_hits}(:301-303)、`_hero_attack_ctx` 摘 spike_ready(:278-281)——与卡 T1 收窄键集逐字一致;armor_roll 发射点保留不接收返回值(:289-290,卡 3.6 口径);spike_ready/ar_hits/shift 残留 grep=0(审计员重跑)。六组逐字节对拍 diff=0 与三套件 exit=0=实现者读数在案;dump_battle 六组参数面(seed 42 默认+参数覆盖,dump_battle.gd:13/:21)核对成立 |
| R2 EFFECT_KINDS 摘 spike | 通过 | `effect_engine.gd:30` 词表摘名;断言 `effect_kind_retired_test.gd:89`「③词表闭面:kind=spike 出域拒绝」在案,沿既有 `_assert_rejected`/`_inject` 骨架(卡 T2 明示沿用);注入形态偏差(do.kind=spike,非卡 T2 括注 kind=modify_ticket+mode=spike)=实现决定 8 申报在案且经审计员核实——`validate_trigger_row`(effect_engine.gd:382-396)确无 mode 值域检查,括注形态无拒绝通道,实现口径与断言名/R2 判据绑定面(词表出域)一致。运行读数(负域套件 exit=1 四探针全拒)合回后 CI 现查补记 |
| R3 DO_KEYS 摘 trade_hit/trade_atk | 通过 | `effect_engine.gd:80-82` 摘两键;断言 `effect_kind_retired_test.gd:92`「④do 键闭面:trade_hit 出域拒绝」在案。运行读数合回后 CI 现查补记 |
| R4 注释面退役名清零 | 通过(40 名全扫审计员重跑) | 审计员自解析 `design/content-archive/道具退役素材库.md` 两表 40 名(41 减现役淬毒刃纹)重扫 `game/` 全域 .gd/.tres/.md/.tscn:命中仅 3 行=`treasure_items_test.gd:31/33/35` StubDB 夹具名——与卡 §5 留底申报逐行一致;契约 2 抽 4 处(grant_segment.gd:232「完美布防→封印全中倍率」、damage_controller.gd:109「猎巢人→nest_count 订阅消费面」、reward_grant.gd:130「掘进蓄能→付费积点账本」、grant_segment.gd:359「雷区图谱→标中雷追加」)——职责陈述(做什么/按什么序/取值从哪来)逐处保留,只换名;宿主套件绿=实现者读数,合回后 CI 现查补记 |
| R5 减半明细行去退役件名 | 通过 | `reward_grant.gd:226` 标签→「挖掘惩罚减半(%d→%d)」+effect_id→nest_halve;断言随动 `meta_progression_forge_test.gd:694/697/699-700`,强度三件(nc_hit 非空+等值「挖掘惩罚减半(6→3)」+零「挖雷」)与改前逐项对齐(基线 709d9a85:693-701 核对);grep nest_counter=0(审计员重跑)。合回后 CI 现查补记 |
| R6 空集拒绝 reason 去退役件名 | 通过(静态重跑) | `reward_grant.gd:189` reason 前缀→「中立移除:…」,`{"ok": false}` 形态未动(diff 核对);grep 爆破工兵包 game/=0(审计员重跑);观测面局限申报(reason 不可达、禁造行)在卡 §8/对照表一致在案 |
| R7 反弹明细标签去退役件名 | 通过(静态重跑) | `grant_segment.gd:165-166` 标签→「反弹伤害」+归因串→attune_nest_halve;**契约 3 逐字核对成立**:`channel=="reflect"` 判据、开单参数字典(channel/base_value/target_rule/ri/origin_cell)、`reward_grant.submit` 调用全未动(diff 对照基线 709d9a85:164-170);grep 惊巢反制/attune_nest_counter=0(审计员重跑)。运行读数合回后 CI 现查补记 |
| R8 sim 恒 false 匹配删除 | 通过(静态重跑) | `level_autoplay.gd:414-418` highlight=="seal_hit" 单判据保留、contains(雷区图谱) 条件与 :415 注释随删;grep 雷区图谱 game/=0(审计员重跑)。套件绿=实现者读数,合回后 CI 现查补记 |
卡②补充核对(契约逐条):契约 1 三条 grep 审计员重跑全零——tables 五词 0、tree_rules 面 0、cell_removal 表面 0 仅 schema 在册(treasure_item_table.gd:20/:26);`feats.tres:855` clamp_bonus 现役一行对照记录与实现报告 T0 一致,表内现存 mode 值(queue/round/battle/clamp_bonus/refresh)零退役四模式。契约 5 禁留空壳——spike_ready/ar_hits/shift/_discount_shift_up 残留 grep 全零(审计员重跑)。契约 6 实现批禁写文档——7 笔实现笔 name-only 核对零触 design//待办清单/体验验证清单/game/tests/README.md。契约 7 零新增数值——diff 内零 .tres 表值改动。反哺点清单 7 条落点齐(含「明细标签是否入表」裁决点+增益状态/伤害与护甲零命中备案)。
### 判据绑定面抽查(本卡抽 3 行)
- R2/R3(如上)——负域探针钉「退役词/键注入行→load_tables 拒绝+error 诊断≥1+进程退出码 1」;归属由夹具结构保证(copy_tables 全量现役表+唯一异常探针行)。观察 5:卡面写的「error 载荷含 effect_kinds 出域文案」未做逐字断言——沿用卡 T2 明示的既有骨架语义,非削弱。
- R5(如上)——step_row display_name 等值断言+非空+零旧词,判据绑减半路径特有发射面。
- R1 静态面(如上)——收窄键集逐字核对+摘除残留 grep,钉在「分支消亡」这一改动特有提交面。
### 测试削弱检查(逐处,两卡合并过目)
`git diff 709d9a85..HEAD -- game/tests/ game/probe/` 全量 hunk 过目,共 5 文件:
1. `effect_kind_retired_test.gd`:**纯新增**(两探针常量+两次 `_assert_rejected` 调用+PASS 文案随动);既有探针①②与 quit 语义零改动;`run_all.gd:195` 在册条目 expect=1/negative=true 未动。无削弱。
2. `meta_progression_forge_test.gd`:恰 4 处期望串随 R5 换代(:694 匹配串/:697 描述/:699-700 等值串)+2 行注释(卡 3.3 表申报面)——断言强度逐项不降(非空+等值+不含旧词全保留),与卡 §8 削弱申报逐字吻合。无申报外削弱。
3. `variant_placement_test.gd`:1 行注释(偏运硬币→订阅行,卡 3.3 表 :239 申报面),断言零改动。无削弱。
4. `ui_input_probe.gd`:+16 行=case⑫断言段(图上命中提交沿)+case⑱ 雾段(雾下点击零提交)各补 release 沿——实现报告决定 3 申报在案;判据语义核对:雾段=零提交不变(且改为完整点击沿后更强)、命中段=提交沿随新语义移至抬杆(单 press 沿在新语义下不再是提交沿,不适配则必红——必要适配非放宽)。**呈报笔误**:申报写「case⑫⑰⑧」,实际落点两处、无 ⑰(case⑰ 未开格类型微光走 `_push_click` 既有成对沿,无需适配)(建议级 D3)。
5. `ui_struct_probe.gd`:零改动——卡①「适配须保持语义」条款无事可核,非缺漏。
无申报外的断言删除、阈值放宽、扫描面缩小、换下层直调。
### 判据出处抽查(6 处,超下限 4 处)
| 断言预期值 | 规格出处 | 独立可写出性 |
|---|---|---|
| 居中 ±2(探针 R2 :221) | level-map.md:101「屏中线 x=640±2」/:154 判据①/:269 | 能——规格句直接给出 640±2 |
| 渐隐带 70px(探针 R8 :273-274) | level-map.md:104/:154 判据②「屏缘两侧各 70px 渐隐带」 | 能 |
| chip 240×30(探针 R8 :275-276) | level-map.md:104/:154 判据③「240×30、圆角 6」 | 能 |
| 「挖掘惩罚减半(6→3)」(forge 测试 :699-700) | 卡② §8 R5 判据明文+reward_grant.gd:226 契约 3 边界;6→3 可由测试构造独立推出(heal 行 power=6×halve 50% ceil=3) | 能——预期值在卡内先行锁定,非镜像实现 |
| 拖拽阈值 8px(DRAG_THRESHOLD,level_map_screen.gd:34) | 卡① §12 白名单 2「8px 附近 provisional 区间内定值」授权;spec :103 明示阈值实现期定值 | 能——授权面在卡,值属 provisional 自主面 |
| golden 两 Shot 面 | 2026-11-05 用户裁决(实现报告决定 9 在案):只对拍关卡最开始+Boss 节点 | 能——裁决记录在实现报告与 golden/README 台账双在案 |
六处均非「预期值只在实现里出现」的同义反复。
## 附加核对
- 能力行名实(game/tests/README.md:162-164 三行)::162 跟随行(_probe_follow_anchor/_probe_smooth_scroll_reduced_motion)与 :164 指引行(_probe_guidance_chrome)名实一致;**:163 平移行的 `_probe_clamp_bounds` 与落地名 `_probe_clamp_bounds_and_columns` 不一致**(建议级 D1——卡① §5「批末收尾核对表上名与落地一致(改名则回表)」未回表,反哺点清单亦未收录;实现批禁写 README,正确通道=回写卡段/反哺点)。
- 负面套件在册:`game/tests/run_all.gd:195` effect_kind_retired_test expect=1/negative=true 登记在位,卡② T2 未动在册条目——一致。
- S13 基线读数:`tools/gdstyle_baseline.txt` 恰 7 条且无本批触面键(level_map_screen/damage_controller/effect_engine/reward_grant/level_autoplay 均无键)——与实现报告 T0/T4 读数一致。
- 闸件缺陷呈报核实(实现报告遗留 1):`tools/gate_platform.sh:37` `kf="$(mktemp …)"` 即建文件+:48 `[ -f "$kf" ]` 恒真→恒 124,呈报描述与代码相符;probe_gate.sh:97 `kf="$TMP/killed.$RANDOM"`(先赋路径不预建)为正确写法参照——呈报属实;该缺陷修法归工程批,本审计不裁定(不在验收对象内,已入反哺点 5)。
## 缺漏与观察清单
阻断级:无。
建议级(不阻断合并,归批后收尾/文档批):
- D1:能力清单 `game/tests/README.md:163` 代表用例名 `_probe_clamp_bounds` ≠ 落地名 `_probe_clamp_bounds_and_columns`(卡① §5 名实核对义务未回表;反哺点清单漏收)。
- D2:新探针对宿主内部结构的直查(`level_map_viewport_probe.gd:67` get_child(0)+:266-268/:287-288 按名取指引子件)未按 test-conventions §8.7 第 4 条在对照表逐条申报口径;探针内注释已给理由(断言对象=承载结构本身,无公开观测面),screen 侧既有「探针直读冻结」惯例未被动用、新私有成员零直读,风险零。
- D3:实现报告/提交信息写「ui_input_probe case⑫⑰⑧ 补 release 沿」,实际落点为 case⑫断言段+case⑱雾段两处、无 ⑰——呈报笔误,判据语义已核保持。
观察(记录在案,不构成缺漏):
- O1:R2 判据绑定面用屏空间投影而非卡面所写 `viewport_center_canvas_pos()` 调用——更外层真实观测,与 spec 判据①同义,非削弱;连带 `game/tests/README.md:162` 读面句与实况有轻微出入。
- O2:卡② R2/R3 负域探针未逐字断言错误文案(沿用卡 T2 明示骨架语义;归属由夹具唯一异常行结构保证)。
- O3:卡① T1 写「探针宿主沿组合根真实屏」、卡 §8 对照表写「场景探针实例化本屏」——卡内两处口径不一,实现取对照表口径且在对照表真实入口格如实呈现;`push_input` 真实输入管线口径照守(禁合成投喂的实质红线未破)。
- O4:探针宿主直构 runner(start_level_external)属 test-conventions §5.4 自动化测试直构口径,探针头注已申报。
## 审计结论
**通过**(可合并;合并落地后按中档梯度以 `tools/ci_check.sh <合并提交>` 现查读数补记「最窄复跑」格——零触发或不可判不作绿证)。
- 卡①卷轴视口批(验收档:中):对照表 10 行全通过;绑定面抽查 4 行钉面成立;削弱零申报外;判据出处 4+ 处独立可写出;缺漏 3 项均建议级(D1 能力行名实回表、D2 直查申报口径补记、D3 呈报笔误)。
- 卡②改写族清退批(验收档:中):对照表 8 行全通过;契约 1/2/3/5/6/7 审计员重跑/逐处核对全部成立;削弱恰为申报内 4 处期望串且强度不降;40 名扫描与卡 §5 留底逐行一致;无阻断项。
- golden 扩项:两 Shot 面用户裁决在案、基线入库、闸件对拍段与台账齐;mac 冻结义务已呈报(反哺点 6)。