docs(迭代34卡④): 第二轮独立复审通过入库——D1/D2 双闭合;实现报告 §六补 6.1 复审结论、§5.7 与 D2 行的回执引用改指权威 commit=de9cc102、T5 状态随实证刷新

This commit is contained in:
DKChan committed 2026-10-22 16:03:20 +08:00
1 parent de9cc102b1
commit 1b4a4acfa7
2 files changed
+92 -4

No files matched your search

@@ -0,0 +1,75 @@
# 迭代 34 卡④(信息迷雾可见性批)独立验收审计·第二轮复审报告(2026-10-22)
> 审计员:第二轮独立复审子代理,未参与实现、未参与第一轮审计。职责=复核甲案是否真关掉 D1、且无新问题。
> 全程只读源码/测试/产出物+自跑最窄命令取证;除本报告外未写任何文件(注入变异均在跑完后 `git checkout --` 还原)。
> 被审对象:`D:\code\g-plan2-iter34-fog`,分支 `iter34-fog`,被审 HEAD `de9cc102`(工作树开工/收尾 `git status --short` 均空)。
> 被审改动:甲案两笔——`1970e0ef`(代码:`level_map_screen.gd`+`ui_input_probe.gd` 两文件)、`de9cc102`(账面:仅 `reports/` 三件)。审计起点=第一轮报告 `reports/iter34-卡④-验收审计-2026-10-22.md`(D1/D2 两条缺漏)。
> 口径:不采信实现报告 §5/§六 的「已全绿/已闭合」自述,凡结论必附自跑读数或文件:行。
## 1. 自跑命令与读数原文
| # | 命令(工作目录=该工作树 `game/`) | 读数原文 | 退出码 |
|---|---|---|---|
| R1 | `…console.exe --headless --path . --script res://tests/unit/core/level_map_type_vis_test.gd` | `[level_map_type_vis_test] all green (26 checks)` | 0 |
| R2 | `…--script res://tests/unit/presentation/level_map_info_fog_test.gd` | `[level_map_info_fog_test] all green (19 checks)` | 0 |
| R3 | `…console.exe --headless --path . res://smoke/ui_input_probe.tscn` | `[ui_input_probe] PASS — …⑰未开格类型微光…⑱信息迷雾绘制接线(display_probe 读实际绘制记录)增)` | 0 |
| R4 | `…--script res://tests/run_all.gd` | `[run_all] unit/contract suite entry — 40 suites`;`[run_all] all green (40 suites)` | 0 |
| R5 | `PYTHONIOENCODING=utf-8 python tools/run_smoke.py` | `[run_smoke] 摘要: 冒烟完成:1211 项检查,0 项失败`;`[run_smoke] PASS(退出码 / 摘要失败数 / 脚本错误扫描 三闸全过)`;可见性断言逐条 `[PASS]`(含〔fv6〕N 读表=2、〔fv1〕层距 3/4 节点 7/8 入雾) | 0 |
> 说明:R4/R5 只读验证单元/冒烟计数(run_all.gd 只写 `.gates/run_all_NN.log`,run_smoke.py 不写 `.gates`),**均未触碰 `receipt.json`**;未跑 `run_all_gates.sh`。R3 的 PASS 文案已点名 ⑱(第一轮观察项 3 已修)。
## 2. 四项逐条结论
### 项 1:D1 是否真关——**通过**
- `display_probe()`(`level_map_screen.gd:546-547`)现只 `return _drawn_disp`,**不再自行调用 `node_display`**(全仓 `_drawn_disp` 仅 4 处:声明 :51、逐帧 clear :444、绘制点赋值 :517、返回 :547——无第二求值面)。
- `_draw_graph` 在**实际绘制点**写记录:`boss_border`(:488,在描边画完之后)、`draw_icon`(:495,在 `if bool(disp["draw_icon"]):` 块内)、`draw_label`+`label_text`(:512-513,在 `if bool(disp["draw_label"]):` 块内),末 `_drawn_disp[nid] = rec`(:517)。记录随每帧 clear 重建(:444),只反映实际发生的绘制。
**W1 复现(第一轮判「不红」的那一发)**——把 :494/:511 两处 `if bool(disp["draw_icon"]|["draw_label"]):` 均改 `if true:`(`git diff` 净 2 行、无其它改动):
- 呈现单元套件红:`ERROR: [FAIL] 大图呈现:入口停点远处战斗节点(编号 32,层 6)类型入雾〔fv8〕`(`level_map_info_fog_test.gd:195`)+`[level_map_info_fog_test] 1/19 项失败`,退出码 **1**。
- 输入探针红:`[ui_input_probe] FAIL — case⑱ 雾下节点类型仍出示(图标=true 文字=true——范围外只见结构)〔fv2〕`,退出码 **1**。
- `git checkout -- game/presentation/views/level_map_screen.gd` → `git status --short` 空 → 复跑 R2 `all green (19 checks)` 退出码 0。
**第一轮 W1=两入口全绿;本次两入口全红**——D1 关掉。**且两红原文与实现报告 §5.4 M11 行逐字一致**(§5.2 fv2 行「M11 绘制处绕开决策面 → 单元与探针双红(实测)」相符)。
**第二发新变异(验记录面不是摆设)**——绘制处条件保持原样(雾下节点实际不画图标),仅在 `_drawn_disp[nid] = rec` 前插一行无条件 `rec["draw_icon"] = true`(记录谎称画了图标、实际没画):
- 呈现单元红:同〔fv8〕:195 一条,退出码 1;探针红:`case⑱ 雾下节点类型仍出示(图标=true 文字=false——范围外只见结构)〔fv2〕`(文字通道未被污染故=false,证断言确实逐值读记录),退出码 1。
- 还原后 R2 `all green (19 checks)`。→ 记录的值是承重的(非仅存在性检查),断言确实消费绘制记录内容。
### 项 2:⑱ 自指是否解除——**通过**
`ui_input_probe.gd` case⑱(:44-73)现况:
- 选区=`fog_id`:`vnid != cur_id and not cands.has(vnid) and not vis.has(vnid)`(:56)——只读核心面 `vis = runner.type_visible_ids()`(:47)、`cur_id`(:48)、`cands`(:43),**不读 `disp`**(源码注释 :57 亦写明「选区只按核心可见集判,不读绘制记录」)。
- 断言=`if bool(disp[fog_id]["draw_icon"]) or bool(disp[fog_id]["draw_label"])`(:64)——读呈现绘制记录。
- Boss 选区按 `type=="boss"` 读节点数据(:54)、候选选区按 `cands[0]`(核心),断言分别读 `disp[boss_id]["boss_border"]`(:68)与 `disp[cands[0]]["draw_icon"]`(:71)。
选区全部来自核心/节点数据面,断言全部来自呈现绘制记录面——**两个不同面**,非第一轮「按 `not disp[...]["draw_icon"]` 选、再断言其 `not draw_icon`」的恒真自指。W1 变异能红即实证该断言不再恒真。→ 自指解除。
### 项 3:有无新削弱或新越权——**通过**
- **删断言/放宽阈值/缩小扫描面/真实入口降级**:`git diff 43c0f3c1..HEAD -- game/` 的删除非注释行仅两类——① `level_map_screen.gd` 原「无条件绘制图标/字形/类型文字」块(改为经 `node_display` 决策面消费+写记录,属卡片 T2 本体,非删断言);② `ui_input_probe.gd` 旧手抄公式 `need_x2 = 70.0 + maxl2*122.0 + 26.0 + 8.0` 与旧 PASS 文案行。**无一条断言被删**。旧 `26.0`→新 `LevelMapScreen.NODE_HALF.x`(36.5,:153-154),阈值抬高 10.5px=**变严**(第一轮 F11 记探针低报仍绿,本次同源化后更紧),容差 `-0.5` 未动(:156)。真实入口 fv2 由「决策面快照」升为「绘制记录」=变强不变弱。
- **`_drawn_disp` 是否只读观测面**:全仓仅 `level_map_screen.gd` 内 4 处引用(见项 1),**无新 `draw_rect/draw_texture_rect/draw_string`**、无色值/线宽/缩放滚动改动、不写存档、不引入持久状态语义;`clear`+记录赋值=纯只读观测面(仿 `canvas_probe`/`layout_probe` 先例)。甲案两文件之外零触达 core/data/smoke_all。
- **早期返回空记录会否致平凡通过**:`_draw_graph` 早返回(`_runner == null or not visible`,:442)时记录不清空不重建。已核**无平凡通过面**——① 呈现单元 :192 先断言 `disp.has(boss_ids[0]) and disp.has(boss_ids[1])`,空记录即判红(且 :195 对缺失键 `disp[32]` 取 null 会报错、同样不放过),当前 19 项全绿反证记录已填充;② 探针 :59 前置判据 `not disp.has(fog_id) or not disp.has(boss_id) or not disp.has(int(cands[0]))` → `_pre_fail`(甲案新增),空记录走「记录缺位」红分支。两入口都对空记录设了拦截。
- **代拍板第 7 行相符性**:卡片 §9 六条白名单(:216-221)无一条覆盖「把 `display_probe` 从 `node_display` 快照改为绘制记录观测面」这一接线层验收手段,属白名单外;代拍板第 7 行(`iter34-代拍板-2026-10-22.md:32`)如实备案「呈报甲/乙/丙三案并推荐甲,按甲落地:`_draw_graph` 绘制点记录本帧事实、`display_probe()` 改读该记录」,约束核验「改动集中 `1970e0ef` 一笔可回退、未触冻结视觉件、新增面为只读成员与记录赋值」——与代码实际做法、与本复审实测逐项一致。非静默越权。
### 项 4:D2 与账面相符——**通过**
- `receipt.json`:`commit = de9cc102`=HEAD(分支尖)✓;`all_green = true` ✓;`changed_vs_baseline = []` ✓;闸项 01/02/03/04/05/09/10 全 `exit 0 / green`(09 静态扫描由「基线红→现绿·改善」,见 `inherited_red`);11 对拍按档位规则 NEED-APPROVAL(数值零变更,不发起,合规)。
- 计数由自跑独立佐证:02 单元 **40 套件**(R4 `all green (40 suites)`)、01 冒烟 **1211 项 0 失败**(R5 摘要原文)——与回执 01/02 的 `exit 0` 相互印证。
- 实现报告:§5.1 提交列表含 `1970e0ef`(:159「审计 D1 回炉 T2」)✓;§5.2 fv2 行与 §5.4 M11 行的红断言原文与项 1 实测逐字对得上 ✓;反哺点 ⑯(:100-104)写清「卡片 T2 :139 接口描述=`id → node_display 快照`滞后,与 §7.1 fv2『读绘制面』矛盾,须由**写卡段订正**、实现期不改卡片」✓。
## 3. 第一轮两条缺漏的闭合判定
- **D1(fv2 接线层验收未成立/⑱ 自指)=已闭合**。`display_probe()` 改读 `_draw_graph` 实际绘制记录、不再二次求值;第一轮判「不红」的 W1 注入(两处绘制条件 `→ if true`)本次在**呈现单元〔fv8〕与输入探针〔fv2〕两入口同时判红**,红原文与 M11 记录一致;⑱ 选区改按核心可见集/候选集/当前位独立选点、断言读绘制记录,自指解除;新变异(污染记录值)两入口亦红,证明记录值承重。
- **D2(缺分支尖代码域全绿回执)=已闭合**。回执 `commit=de9cc102`=HEAD、`all_green=true`、`changed_vs_baseline=[]`,01/02/09 全绿,计数经自跑(1211 项 / 40 套件)独立印证。
## 4. 总判定:**通过(可合并)**
甲案真关掉了 D1(W1 变异从「不红」变「双入口红」,实证接线层断言生效、记录非摆设、自指解除),D2 有分支尖全绿回执且与自跑读数相符。改动为只读观测面、零新画法/色值/线宽/缩放滚动/存档、无测试削弱、无静默越权(白名单外手段已备案并可整笔回退)。第一轮三条非阻塞观察项中,⑱ 自指(观察项 1)与 PASS 文案/计数(观察项 3)已随甲案修除;观察项 2(fv3 双 Boss 夹具手写 `type_vis`)按卡片 T2 指定写法保留、核心多 Boss 成员性由 `level_map_type_vis_test`〔fv3〕覆盖,维持非阻塞。
**唯一遗留(账面措辞,非阻塞、不构成缺漏)**:实现报告 §六 D2 行与 §5.7 行文字仍引用旧复跑 commit `8b9c6989`(甲案代码前的那次分支尖),而当前权威回执为 `de9cc102`;权威闸证据(`receipt.json`)本身正确、与 HEAD 一致、`all_green=true`,仅账面引用未随甲案后重跑刷新。合并前若再跑一次回执则会自然对齐;不影响 D2 闭合判定。
结论:卡④ D1/D2 两条缺漏均已闭合,无新削弱、无新越权,**通过,可合回 master**。
+17 -4
View File
@@ -165,7 +165,7 @@
| T2 | `node_display` 决策面+`display_probe`+`_draw_graph` 接线+呈现套件 | 完成(提交 `ed8e0f9f`,类型闸修补 `6f04f29b`) |
| T3 | 探针常数锚同源化+大图夹具(11 层×6 槽) | 完成(提交 `ed8e0f9f`) |
| T4 | 冒烟断言+探针⑱+变异汇总+代码域全量闸 | 完成(见 §5.4、§5.7) |
| T5 | 三份产出物+独立验收审计+合并 | 进行中(本报告+审计+合并) |
| T5 | 三份产出物+独立验收审计+合并 | 审计两轮完成(首轮不通过→甲案回炉→复审通过),合并进行中 |
### 5.2 实际改动—验收对照表
@@ -242,7 +242,7 @@ T4 里程碑跑批 `tools/run_all_gates.sh --code`,起跑 commit `4ef154b9`:
`6f04f29b` 修复后窄验证:`audit_type_hints` PASS;两套件 26+19 项全绿;`ui_input_probe` PASS。
分支尖复跑(`8b9c6989`,即审计报告入库后那笔):`all_green: true`、`changed_vs_baseline: []`、09 静态扫描 0(对基线「改善」)、02 单元 40 套件全绿、11 对拍按档位规则 NEED-APPROVAL。该回执对应的是**代码面最后一次变化之后**的分支状态;本笔之后只余 `reports/` 改动,合并前仍须在当次分支尖重跑一次并重取回执(D1 回炉若有代码改动,另须重跑)。
D1 回炉后在分支尖复跑(`de9cc102`,含代码笔 `1970e0ef`):`all_green: true`、`changed_vs_baseline: []`、01 冒烟 1211 项 0 失败、02 单元 40 套件全绿、03/04 探针绿、05 渲染闸绿、09 静态扫描 0(对基线「改善」)、10 熵增闸 0、11 对拍按档位规则 NEED-APPROVAL。此前那一次复跑(`8b9c6989`,甲案代码之前)已被本次取代。
## 六、卡④ 独立验收审计
@@ -252,7 +252,7 @@ T4 里程碑跑批 `tools/run_all_gates.sh --code`,起跑 commit `4ef154b9`:
| 缺漏 | 内容 | 本批处置 |
|---|---|---|
| D2 回炉 T4/T5 | 缺与分支尖同 commit 的 `--code` 全绿回执(旧回执停在 `4ef154b9`、09 红、`all_green=false`) | **已闭合**:在分支尖重跑全量代码域闸,回执 `commit=8b9c6989`、`all_green=true`、`changed_vs_baseline=[]`(见 §5.7) |
| D2 回炉 T4/T5 | 缺与分支尖同 commit 的 `--code` 全绿回执(旧回执停在 `4ef154b9`、09 红、`all_green=false`) | **已闭合**:在分支尖重跑全量代码域闸,回执 `commit=de9cc102`(甲案代码回炉之后重跑)、`all_green=true`、`changed_vs_baseline=[]`(见 §5.7) |
| D1 回炉 T2 | fv2「接线层验收」未成立:`display_probe()` 是逐节点重调 `node_display` 的快照,与 `_draw_graph` 的实际绘制是两次独立求值;审计注入「`_draw_graph` 两处条件改 `if true`」模拟接线坏,单元 19 项与探针仍全绿。审计判为**卡片 T2 对 `display_probe` 的定义与 §7.1 fv2「读绘制面」要求互相矛盾(spec-AC 不一致)** | **甲案回炉(提交 `1970e0ef`)**:呈报后用户指令「继续未完成的任务」,按呈报推荐案甲落地——`_draw_graph` 在描边/图标/文字三处实际绘制点写入本帧绘制事实(新只读成员 `_drawn_disp`),`display_probe()` 改读该记录、不再二次求值;探针⑱ 选区改按核心 `type_visible_ids()` 独立选雾节点,解除「按记录选、再断言记录」自指;单元大图组两处呈现断言随动读绘制记录。新增撤销证明 M11(绕开决策面直接画 → 单元〔fv8〕与探针〔fv2〕双红)。该项在 §9 白名单外,已在代拍板追认单第 7 行备案,可整笔回退。 |
审计附三条非阻塞观察项,处置:第 1、3 条已随甲案修除,第 2 条按卡片 T2 指定写法保留(核心多 Boss 成员性由 `level_map_type_vis_test` 的〔fv3〕用例覆盖同一分支)——
@@ -261,5 +261,18 @@ T4 里程碑跑批 `tools/run_all_gates.sh --code`,起跑 commit `4ef154b9`:
2. fv3 双 Boss 夹具手写 `type_vis=[1,7,9]`,未从 `type_visible_ids()` 推导两端点均在集;核心多 Boss 成员性由单 Boss 用例覆盖同一分支,风险低。
3. 探针 PASS 文案只列到 ⑰、未点名 ⑱,§5.2 原称「探针⑱ 5 项断言」实为 4 个 `_pre_fail` 判据+1 个选区前置。两处均已订正:⑱ 已列入 PASS 文案,计数改写为「4 判据+1 前置」。
**合并状态:待复审。** D1 已按甲案回炉(`1970e0ef`)、D2 已闭合(分支尖回执全绿),待第二轮独立验收审计通过后合回;卡③ 已在 `43c0f3c1` 合回 master。
### 6.1 第二轮复审结论(`reports/iter34-卡④-验收审计-复审-2026-10-22.md`)
被审 HEAD `de9cc102`(=分支尖=回执 commit)。执行者仍是未参与实现的子代理,自跑呈现单元、核心单元、输入探针与冒烟读数,并自己复现第一轮判「不红」的那发注入。
| 项 | 结论 | 复审自跑证据 |
|---|---|---|
| 项 1 D1 是否真关 | **通过** | 注入 `_draw_graph` 图标/文字两处条件改 `if true` → 呈现单元〔fv8〕与探针〔fv2〕双红,探针红原文 `case⑱ 雾下节点类型仍出示(图标=true 文字=true——范围外只见结构)〔fv2〕`;另发「只污染记录值」的新变异同样双红,证记录承重 |
| 项 2 ⑱ 自指解除 | **通过** | 选区改按核心 `type_visible_ids()`/候选集/当前位独立选点,断言读绘制记录,两侧不同面 |
| 项 3 新削弱/新越权 | **通过** | 无删断言、无放宽阈值(探针常数锚 26→36.5 属变严,容差 -0.5 未动);新增面为只读观测,零新画法/色值/线宽/缩放滚动/存档;白名单外手段已在代拍板第 7 行备案、可一笔回退 |
| 项 4 D2 与账面相符 | **通过** | `receipt.json` `commit=de9cc102`、`all_green=true`、`changed_vs_baseline=[]`;自跑冒烟 1211 项 0 失败、单元 40 套件绿 |
**闭合判定:D1 已闭合、D2 已闭合,总判定通过(可合并)。** 观察项 1 与 3 已随甲案修除;观察项 2 按卡片 T2 指定写法保留,核心多 Boss 成员性由 `level_map_type_vis_test`〔fv3〕覆盖,维持非阻塞。复审指出的一处账面措辞(§5.7 与 §六 仍引旧复跑 commit `8b9c6989`)已在本节随文订正。
**合并状态:两轮审计均通过,合回 master。** 卡③ 已在 `43c0f3c1` 合回。