合并 master 整合(棋盘瓦片与立体表现重做批): 冲突三件解决+封印呈现对齐迭代56+卡片第六轮复核

- art-bible 冲突:保留 C 地形八条,采纳 master v3.48 封印规则并适配——封印居已揭示地面格心、身份字形垫色牌叠于法阵上、印记与色牌固定低于小人、不参与浮空层;承载面因新地面 #695038 对封印黑仅 2.35–2.98:1,改本关受光棱色封印石(6.45–9.94:1,零新增色);版本 v3.51;§1.2/§1.4/§3.2/§4.1/§6.5/§8.2 同步。
- README 冲突:保留 master 迭代56「结算期零逐行文字与 FX 排播链保持」+旧地形行(父注保留),追加本批 6 条新能力;能力名改「旧瓦片退役与普通数字零底牌」「棋盘顶面锚点与迷雾几何(微光、变异岩顶偏移,封印格心)」。
- roadmap 冲突:保留 master 迭代55/56当前位原文,仅把待编池「二三关棋盘观感」替换为「棋盘瓦片与立体表现重做(已写卡,待编排)」。
- 需求卡片适配:封印格色牌为唯一例外、plate 保留(CellUnit 12→13)、board_terrain_layer 增 sealed_at(≤13 成员)、测试改 _test_no_ordinary_plate_path+_test_seal_substrate、§12 行8/9/11/14/15 与 §16 第六轮 6 条记录;术语表/checklist/battle.md/待办/08 同步 v3.51。
- 区内凭据:pipeline_gate PASS(条目45/总表56/交叉核3/卡片5);capability_audit 红项0(能力行123/套件87);run_all_gates --docs 内容无新增红(回执待本提交后重跑)。
This commit is contained in:
DKChan committed 2026-11-07 23:39:53 +08:00
commit 5b42c13aca
165 files changed
+3342 -1197

No files matched your search

+9
View File
@@ -0,0 +1,9 @@
# 迭代 55 反哺点清单——QA 覆盖余量收口批(2026-11-07)
> 接收方:待办清单条目「QA harness 覆盖余量——B4 本体缺口与 B5 控件零命中缺口复核分流」。
> 卡 §6 预期:零条(战斗结算.md :124「读表」句接线后由声称变属实,零文本改动义务)。
**反哺点:零条。**
说明:本批两项 L3 停机呈报(cell_mark_overlay 分类前提、进入下一层到达性)的裁决落点属
B4/B5 复核记录与需求卡片面,不属 GDD/art-bible 反哺——见 `reports/iter55-实现报告-2026-11-07.md` §6。
+127
View File
@@ -0,0 +1,127 @@
# 迭代 55 实现报告——QA 覆盖余量收口批(2026-11-07)
> 接收方:待办清单条目「QA harness 覆盖遗漏余量——B4 本体缺口与 B5 控件零命中缺口复核分流」(2026-11-07 登记,P0)。
> 输入合同:`reports/需求卡片-QA覆盖余量收口批-2026-11-07.md`(零待裁点,U0=iter 技能调用)。
> 执行形态:整迭代单工作区(`../g-plan2-iter55`,分支 iter55),T0→T11 串行;单卡批。
> 本报告落盘时点状态:T0–T11+**卡修续行(轮 2 用户裁决落地,2026-11-07)**已提交施工;两项 L3 呈报已裁决落定(见 §6);棋盘三图基线换代经用户过目;独立验收审计已落定(见 §7)——待合回。
## 1. 各卡状态
| 任务卡 | 状态 | 凭据(提交+读数) |
|---|---|---|
| T0 开工 | 完成 | worktree 四件套齐;改前读数锚:coverage_enum 870 实体/缺口 211/62 分组 40 组带缺口(与卡逐字同);screen_flow 探针 exit0(seen 116/hits 19 键 25 次);ui_click 探针 exit0(seen 91/hits 30 键 43 次,停手钮已随迭代 54 修复在命中集);单元全套件 all green(86 套件)exit0。读数入 T1 提交信息 |
| T1 G1 违约词负面断言 | 完成 | 提交(schema_vocab_violation_test 七函数+manifest 登记);单件直跑 all green(19 checks)exit0 零脚本错误 |
| T2 G2 结算钉与 p_perfect 接线 | 完成 | 提交 552bd3b6;硬编码 2↔表值 200 相等=行为零漂移核对通过;guard 91 checks/treasure 全绿/seal 70 checks(V10 回归面 :330-401 完美双份真实流 ×2 仍绿) |
| T3 G3 cap 七槽+配额满 | 完成 | 提交;guard 98 checks/feats 144 checks 全绿 |
| T4 G4 布局字段断言 | 完成 | 提交;stage_background 23 checks 全绿 |
| T5 G5 天赋树行与投影 | 完成 | 提交;forge 182 checks 全绿 |
| T6 G6 defensive_stance 值断言 | 完成 | 提交;round_flow 142 checks 全绿(种子狩猎真实链命中) |
| T7 G7 L3 变异行 | 完成 | 提交;variant_placement 25 checks 全绿 |
| T8 G8 reward 行读值改断 | 完成 | 提交;seal 76 checks/guard 100 checks 全绿 |
| T9 B5 探针扩面+开发面过滤+渲染采集态核对 | 完成 | 原提交(353 行,十一组真输入全命中)+卡修续行 cf08a4ac(登记件开发面过滤——三根解析,两探针复跑 exit0:ui_click seen 80/命中 85 次/开发面键 0,screen_flow PASS seen 107/开发面键 0)+b5a981ef(采集态六类型注入+逐类型读数——全入帧零缺型,探针 PASS exit0 双帧 PASS) |
| T10 豁免登记+对账工具面修正 | 完成 | 原提交(ontology 154+controls 登记)+卡修续行 cf08a4ac(scan_screens 基类分类修正+controls 开发面 3 条删除);coverage_enum 复跑 868 实体/缺口 163/未豁免未补测=0;附录 C 归并口径零命中 9 键全被 controls 19 条覆盖=0 残留 |
| T11 产出物落位 | 完成 | 本报告+反哺点清单+收尾核对(§5)+卡修续行报告同步 |
## 2. 实际改动—验收对照表(结果列)
| # | 需求点 | 改动 | 验收测试 | 结果 |
|---|---|---|---|---|
| V1 | 十七违约词拒绝路径 | 新增 `game/tests/unit/schema_vocab_violation_test.gd` 七函数+run_all manifest 登记 | 同文件 7 函数(〔QA余 V1〕×19) | 绿(单件直跑 19 checks exit0) |
| V2 | equivalence_ref_damage 钉 4+p_perfect 钉 200+读数活性 | guard+`_check_settlement_pin_values`;reward_grant 改读 ConfigDB | 同函数 5 断言+seal :330-401 既有段 | 绿(91 checks;活性断言 p_perfect=100 单份兑付命中;回归面双份 ×2 仍绿) |
| V3 | cap 段七槽钉值 | guard+`_check_curio_cap_segment_pins` | 同函数 7 断言 | 绿(98 checks) |
| V4 | feat_ticket_quota 配额满分支 | feats+`_check_ticket_quota_exhausted` | 同函数 6 断言(真实入口链 consider+node_curio_candidates) | 绿(144 checks) |
| V5 | rap_transfer_mult 行值端到端 | treasure_effects+`_test_rap_transfer_row_e2e` | 同函数 5 断言(add_item→装配→参数和 125→转存兑付) | 绿(treasure 全绿) |
| V6 | AP 条高/结算带高读表 | stage_background+两函数 | 同文件 3 断言 | 绿(23 checks) |
| V7 | 树面四行一组断言 | forge+四函数+`_ks_row_level` 读数面 | 同文件 12+ 断言(〔QA余 V7〕) | 绿(182 checks) |
| V8 | reward stacks 行钉 | guard+`_check_reward_row_pins` | 同函数 2 断言(扫描面非空前置+全 1 钉) | 绿(100 checks) |
| V9 | defensive_stance 值断言 | round_flow+`_check_defensive_stance_values` | 同函数 5 断言(种子狩猎真实链+容器级叠层) | 绿(142 checks) |
| V10 | p_perfect 读表接线 | reward_grant.gd:416-422 改读 db.combat.settlement.core.p_perfect | V2 活性断言+seal 既有真实流段 | 绿(行为零漂移:双份 ×2 仍绿) |
| V11 | L3 两变异行 | variant_placement+`_test_l3_rockfall_minedust_rows` | 同函数 6 断言(放置可达+rockfall 兑付 3+mine_dust 遮蔽面) | 绿(25 checks) |
| V12 | enemy_alert/ap_drain 生产行 | seal+两函数(生产行对象走 grant_routed 同链) | 同文件 4 断言 | 绿(76 checks) |
| V13 | 十一动线真输入可达 | ui_click_probe 扩面(十一组)+probe_ui_util 滚辅基准修 | 探针 `_ready` 扩面段+放弃收尾段 | 绿(exit0 零 FAIL;十一组命中。「进入下一层」组经轮 2 用户裁出圈——开发面,见 §6 L3-2 落定) |
| V14 | cell_mark_overlay 显示正确性(渲染通道) | board_shot_probe 采集态六类型注入与逐类型读数+棋盘三图基线换代(b5a981ef,新帧用户过目) | `board_shot_probe.tscn` 三图采集+渲染闸逐像素(裁剪区加严口径) | 绿(探针 PASS exit0;六类型全入帧零缺型;渲染闸本地全绿——golden 对比全过) |
| V15 | 豁免登记对账清零 | tools/coverage_exemptions.js 登记(ontology 154+controls 19——开发面 3 条随轮 2 改判删除) | T10 对账读数 | 绿(未豁免未补测=0;附录 C 归并口径 controls 覆盖后残留 0) |
| V16 | per_level_shift_pct 三关档钉 | guard+`_check_meta_per_level_pins` | 同函数 3 断言 | 绿(91 checks 内) |
| V17 | 开发面出圈与本体分类修正 | probe_coverage_recorder 三根过滤(cf08a4ac)+coverage_enum scan_screens 基类分类(cf08a4ac) | 两探针复跑 seen 集开发面键 0+coverage_enum 复跑 868 实体(cell_mark_overlay/debug_overlay 出圈) | 绿(dev_face_roots=3;ui_click skipped=708/screen_flow skipped=84;开发面键双探针 0;未豁免未补测=0) |
## 3. 实现决定记录(代拍板白名单外事项备案)
1. **主循环滑条 400/200→2000/2000**(探针行为参数):基线对照实证(stash 前后各一跑)400/200 下 L1 恒败退、零 L1 完成(2026-11-06 登记件同证);2000 下 L1 完成进 L2。原「高加成保 L1 可完成」注释在 400/200 下已失真。
2. **probe_ui_util.scroll_button_into_view 可视基准改按钮最近 ScrollContainer 祖先**:秘宝匣 `_ws_scroll` 336px 小于窗壳面板,面板基准把裁剪区外按钮误判「在视」、真点落空(购买 25/装配/升级零命中实证);树/秘宝两视图同修,既有树面滚点全数保持命中。
3. **秘宝段购后重开视图**:`_refresh_attune_segment` 的 unlocked 快照仅随 rebuild 刷新(代码注释自证),购后不重开则新解锁件装配钮恒禁用——重开=全量重建对齐快照。
4. **树面 ks_refresh(购买 30)后置到秘宝段之后**:其前置 ks_workshop 在秘宝段前段点亮(树段时序上尚未购,置灰实证一次)。
5. **T9 缺一组的到达性结论**:进入下一层组经代码考证定为开发面(见 L3-2)。轮 2 用户裁升级为「出圈非豁免」——覆盖登记层过滤承载,controls 开发面 3 条豁免删除(cf08a4ac)。
6. **棋盘三图基线换代**(V14 渲染通道):采集态扩型(变异 resolver 生产同源+真视/预读 overlay+移除写口+点迹/高亮定格)使 cell_mark_overlay 六绘制域全入帧;旧基线判失效(加严口径),`golden_baseline_refresh.sh` 重采集入基线——**新帧经用户过目确认**后换代,渲染闸本地复绿(golden 对比全过)。
## 4. 实机目检总清单(登记不阻塞)
- 探针扩面十一组动线的屏面观感(图例关闭落点、节点继续、三选一刷新重投喂、商店购买/刷新货架态、秘宝架四钮柜台态、树面高档购买与先手压制回切、弃图刷新确认 chips、地图放弃确认窗、Esc 浮窗设置、两拨杆开关态)——机器面已由真输入命中与落点断言承载,真人复看可选。
- p_perfect 接线后完美封印双份兑付的战内表现(值零漂移——真实流回归面已绿,观感复核可选)。
## 5. 收尾核对(能力行名实)
- 已落地名字与能力行一致:`_check_empty_tables`/`_check_settlement_pin_values`/`_check_curio_cap_segment_pins`/`_check_meta_per_level_pins`/`_check_ticket_quota_exhausted`/`_test_rap_transfer_row_e2e`/`_check_ks_workshop_row`/`_check_fork_side_projection`/`_check_defensive_stance_values`/ui_click 扩面段——逐名 grep 在案。
- 卡修续行回表(写卡段批 ef5d4679 已落):能力行「控件动线扩面真输入可达」删「进入下一层」与「cell_mark 模态断言」(十一段);新增「棋盘格面绘制显示(渲染闸棋盘三图 golden 逐像素)」行,代表用例 `board_shot_probe.gd:_ready` 已落地(采集态注入+读数段)——名实相符。
## 6. L3 停机呈报(两项;卡 §9 预授权停机点)
### L3-1 cell_mark_overlay 模态断言前提不成立(V14 未落地)
- **分歧点**:卡 V14/T9 要求「ui_struct_probe+cell_mark_overlay 段:开态 visible+遮挡物隐藏模态断言(锚 test-conventions §2 模态条款)」。
- **代码事实**:`game/presentation/views/cell_mark_overlay.gd` 为 **RefCounted 绘制域件**(CellUnit 拆件——变异标记/徽章/封印/点迹的绘制命令持有者),无 visible 属性、无开层动线、无遮挡物语义;`tools/coverage_enum.py:45` 的 VIEW_KIND_RE 按文件名后缀 `overlay$` 将其误分类为「屏与模态」实体(B4 缺口来源)。
- **两种读法**:①按卡字面造模态断言=无被测面可绑,判据绑定面落空(禁自造替代证明);②按实体本相改断言形态(实例化+绘制旗标)=实现期改判据(test-conventions §8.5=上游缺陷停卡)。
- **建议案**:B4 复核裁决改判——cell_mark_overlay 自「屏与模态真缺口」改豁免(reason=枚举器文件名误分类,实体为 CellUnit 绘制域件;封装纪律由 pres 封装扫描与能力清单承载),V14 行随卡退役;或另立卡对绘制域件立实例化断言规格。现状:豁免清单未登该 id,本体对账留 1 可见缺口(未豁免未补测=1)。
- **待办清单回退拟稿**:条目状态「已编迭代 55」→「已写卡」(缺口=V14/进入下一层两组裁决后重写卡 §7/§8 对应行)。
- **裁决落定(2026-11-07 用户裁,卡修轮 2)**:两处均不豁免——测试目的=验证显示正确性,走渲染通道:V14 改指渲染闸棋盘 golden(锚 test-conventions.md:100),本体清单出圈归枚举器 scan_screens 基类分类修正(T10),采集态缺型注入+基线换代经用户过目(b5a981ef)——V14 已落地绿。原呈报的「豁免」建议案作废(用户裁:豁免=在范围内特批不做,出圈面不占豁免)。
### L3-2 「进入下一层」动线到达性失败(T9 第十二组未落地)
- **分歧点**:卡附录 C 将 inter 覆盖层「进入下一层」列为 B5 真缺口动线组(T9 驱动)。
- **代码事实**:inter 覆盖层仅调试两层模式接线——`main.gd:360 _on_battle_finished` 头注「仅调试模式接线(冒险的关卡结束归 AdventureRunner._on_level_finished——大奖励/冒险终局分派)」;正常冒险 L1→L2 推进零该停点(本批三跑实证:L1 完成→L2 逐位进入,进入下一层键零命中)。入口钮「调试 · 连续关卡两层」本身属附录 C 开发面豁免(发布态恒隐)。
- **两种读法**:①真缺口——经调试两层模式驱动真点(入口为开发面恒隐钮,驱动链必经豁免面);②开发面豁免——inter 过渡屏与调试浮窗八钮同族(玩家不可达面),controls 豁免登记即收口。
- **建议案**:按②改判开发面豁免(已登记,reason 随注);卡附录 C 该组随裁决改判。若按①,需另立调试模式探针段规格(入口可达性前提先裁决)。
- **待办清单回退拟稿**:同 L3-1。
- **裁决落定(2026-11-07 用户裁,卡修轮 2)**:开发面出圈非豁免——覆盖登记件按调试面边界过滤(DebugOverlay 类型+ui.screens.inter_overlay/debug_badge 引用单点),inter 覆盖层整层调试专用不入玩家可达宇宙;controls 开发面 3 条豁免删除(cf08a4ac);两探针复跑开发面键 0(V17 绿)。原呈报的「豁免登记」建议案作废。
## 7. 独立验收审计结果与处置
- 审计报告:`reports/iter55-验收审计-2026-11-07.md`(中档深度;审计者=未参与实现的子代理)。
- **审计结论(初版):未通过——U1 一项硬伤**:T7 提交(8054f959)的编辑回退分支把
`_smoke_global_variant()` 调用行从 variant_placement_test 执行序中误删(函数体留盘成死代码,
33 条在役断言退出执行且全仓无第二宿主),违反卡 §4 零删除断言/§14 纯增量且零申报。
- **处置:已修复**——调用行恢复(执行序回归 master 原序),套件复跑 all green(58 checks=
原 25+复归 33,恰合)exit0 零脚本错误;提交「iter55 审计修复」。
- **审计结论(复验后终版+增量轮):通过**——E1/E2 随轮 2 用户裁决闭合(见 §6 裁决落定);
增量轮(独立子代理,卡修续行两笔 cf08a4ac/b5a981ef 对照新卡 V13/V14/V15/V17)通过,无硬伤
无阻塞项:过滤纯减法、注入全真链、基线换代纪律四要件齐、读数三源互证;F1(README 换代戳)
与 F2(登记件头注措辞——注释级零行为改动)已随审计落定修正;**E3 唯一在案例外**=controls
键形实例变体 17 条豁免超卡附录 C 面,随合并呈请用户追认。
- 观察 O1=对账叙述算术(164 缺口实例≠唯一 id 数——同 id 跨类重复,机器读数以校验脚本
逐 id 比对为准;卡修续行复跑实测未豁免未补测=0,与 O1 判读口径一致)。
## 8. 遗留读数义务
- 零 MC/verifier 义务(p_perfect 接线值相等零漂移,卡 §4 数值面零跑口径;无数值调整禁重跑在案)。
- 远端 CI:合回后 post-merge 钩子自动全量,`tools/ci_check.sh <合并提交>` 现查(合回零等待纪律)。
- E3 追认:controls 键形实例变体 17 条豁免(同控件重建实例的旧键形静默——各家族代表实例已真点命中)超卡附录 C 面,随合并呈请用户追认;追认不过=该 17 条从豁免件移除、键形改造立工程批。
## 9. 批内验证读数汇总(改完即测铁规凭据)
| 套件/探针 | 读数 |
|---|---|
| 单元全套件(T0 基线) | all green(86 套件)exit0 |
| schema_vocab_violation_test | all green(19 checks)exit0 |
| table_structure_guard_test | all green(100 checks)exit0 |
| adventure_feats_test | all green(144 checks)exit0 |
| treasure_effects_test | PASS 全绿 exit0 |
| seal_polarity_test | all green(76 checks)exit0 |
| stage_background_test | all green(23 checks)exit0 |
| meta_progression_forge_test | all green(182 checks)exit0 |
| round_flow_skill_pool_test | all green(142 checks)exit0 |
| variant_placement_test | all green(25 checks)exit0 |
| ui_click_probe | exit0 零脚本错误零 FAIL(十一组真输入命中);卡修续行复跑 exit0(seen 80/命中 85 次,dev_face_roots=3/skipped=708,开发面键 0) |
| screen_flow_probe | exit0;卡修续行复跑 exit0 PASS(seen 107,dev_face_roots=3/skipped=84,开发面键 0) |
| coverage_enum | 870 实体/缺口 211→164;卡修续行复跑 868 实体(cell_mark_overlay/debug_overlay 出圈)/缺口 163/未豁免未补测=0 |
| 两探针并集零命中 | 116 键→controls 豁免覆盖后 0 残留;卡修续行归并口径(去尾序位+折叠空锚段)零命中 9 键全被 controls 19 条覆盖=0 残留,开发面键 0 |
| board_shot_probe | 卡修续行 PASS exit0(六类型全入帧:变异角标 L2×4/真视框×3/徽章 9·3·3/点迹·高亮·退色×3);双帧比对 PASS |
| 渲染闸 | 基线换代后本地全绿(golden 对比全过,b5a981ef) |
+142
View File
@@ -0,0 +1,142 @@
# 迭代 55 验收审计——QA 覆盖余量收口批(2026-11-07)
> **审计身份**:独立验收审计(未参与本迭代实现,只读审计)。仓库 `D:\code\g-plan2-iter55`(分支 iter55,基线 master=bb6b1726)。
> **审计输入**:需求卡片 §8 对照表 V1–V16/§4 禁削弱申报/§16 验收档;实现报告 §2 实际对照表/§6 两项 L3 呈报;`git diff master..iter55`(10 笔提交、17 文件,逐文件读过);测试文件本体与探针文件本体。
> **验收档:中**(test-conventions §8.7 中档)。**实际执行深度**:对照表逐行全量核对(16/16,逐行 grep 测试文件核实断言存在与形态,不采信实现报告「已全绿」);判据绑定面抽查 4 行(V9/V10/V11/V12);测试削弱逐处删行核对(全 diff 删行 19 处逐一过);直查例外逐条沿先例核对(8 族);**最窄测试复跑省略**=以远端 CI 现查读数代证(合回未发生,记「待合回后 CI 代证」,见 §7)。审计动作仅只读 grep/git,未跑任何测试套件,除本报告外零文件改动。
## 1. 对照表逐行核对(V1–V16 全量)
| # | 结论 | 依据(审计自证,非转抄报告) |
|---|---|---|
| V1 | **通过** | `game/tests/unit/schema_vocab_violation_test.gd` 在库:七检查函数(`_check_empty_tables`/`_check_settlement_vocab`/`_check_zero_flat_guard`/`_check_keystone_cost_domain`/`_check_use_phase_domain`/`_check_solver_frozen`/`_check_meta_tree_load_bearing`)逐函数读毕,19 处 Kit.check(空表×8+settlement×3+zero_flat×2+keystone×1+use_phase×2+solver×2+load_bearing×1),〔QA余 V1〕尾缀 12 模板行全数 grep 命中;每函数带「判据出处: test-conventions.md:67」注记(卡 T1 义务);`game/tests/run_all.gd:172` manifest 登记在案(expect=0,非负面套件,符合卡 §4 第 4 条 validate 诊断面通道);注入形态=`load(schema).new()`+真行 deep duplicate(禁改共享 Resource,卡 T1 义务;严格型局部数组注释与 T1 提交的假绿修复记录一致)。真实入口=各表 schema `validate()` 直调,零绕过。 |
| V2 | **通过** | `table_structure_guard_test.gd:_check_settlement_pin_values`(:672 起)5 断言读毕:equivalence_ref_damage==4(含审计镜像注记)+p_perfect==200+p_perfect=100 活性断言(clear_reward 伤害行 ×1)+表值还原 200+构造启动前置。〔QA余 V2〕×4 grep 命中(构造启动为夹具断言无尾缀——报告「5 断言」口径一致)。活性断言的 `s._facts.perfect_hit_true=1` 注入与 `grant_clear_reward` 直调=master 在役同款(`seal_polarity_test.gd` master :383-386、`feat_vouchers_test.gd` master :207-211 先例),直查例外成立(§4)。 |
| V3 | **通过** | `_check_curio_cap_segment_pins`(:708 起)七槽 ap/armor/heal/max_hp/rap/refresh/time_sand 逐槽 `curio_cap()` 读表钉 99,〔QA余 V3〕grep 命中,与 gp/attack 既有钉同款。断言文本以槽短名引用故缺口 id 走豁免登记(`coverage_exemptions.js` cap 九槽族 reason 明示)——形态自洽。 |
| V4 | **通过(微偏差备案)** | `adventure_feats_test.gd:_check_ticket_quota_exhausted`(:926 起)6 断言读毕:生产配额==2 读表、consider 恒 false(保底同置满排除他因)、3 次 node_curio_candidates 零凭证、分支零记账、夹具还原。〔QA余 V4〕×4 grep 命中。`_deck.ticket_appeared/ticket_pity` 直填=同套件 master :564-573 `_deck.ticket_sold/ticket_pity` 测试通道先例同族(§4)。**微偏差**:卡 V4 真实入口栏写「`AdventureRunner.present_node_curio()` 链」,实现走 `node_curio_candidates()→draw_candidates→consider`(同链上游段)——报告 §2 已如实申报该链名,链族一致,判为备案不判缺漏。 |
| V5 | **通过** | `treasure_effects_test.gd:_test_rap_transfer_row_e2e`(:428 起)5 断言读毕:add_item 入库→装配直注起战→`attune_param_sum==125`(生产行值主证)→停手转存按 grant_segment 生产入参形态兑付。字面量 125 旧路径**保留并存**(diff 纯增量,:128-146 区域未触碰)——卡 T2「替字面量路径作行值主证」+报告「保留并存」一致,零削弱。〔QA余 V5〕×5 grep 命中。 |
| V6 | **通过** | `stage_background_test.gd:_test_ap_bar_height_from_table`/`_test_log_band_settle_height`(:181-201)3 断言读毕:视图几何==ap_bar_h==44、dig 态==log_band_h_dig、settle 态==84;生产读点经 `ApBarView._init`/`BattleLogView._init` 装配链(真实实例化+add_child)。〔QA余 V6〕×3 grep 命中。 |
| V7 | **通过** | `meta_progression_forge_test.gd` 四函数(:866-972)+`_ks_row_level` 共用读数面读毕:ks_workshop 行值/零价/前置拒购/购买前后投影、ks_refresh 同账路由(tree_buy→buy_attune_refresh,扣 meta 行 L1 30 币非树 price 面)/二次购 60/零刷新分支拒+零消费/fork 两行行值+侧名/tree_buy_fork 真链/fg_economy 组投影+切侧规则键换/spine 脉络读生产表行名。〔QA余 V7〕×10 模板行 grep 命中(循环模板展开后实跑断言≈30,报告「12+」为下界口径成立)。存档名册 +4 路径=纯增量(原 3 路径保留)。 |
| V8 | **通过** | `_check_reward_row_pins`(:726 起)2 断言:扫描面非空前置(防空表静默绿)+生产行 stacks 全 1 钉(行值面变更即红)。〔QA余 V8〕grep 命中。 |
| V9 | **通过** | `round_flow_skill_pool_test.gd:_check_defensive_stance_values`(:1165 起)读毕:生产行值钉(-25 percent/2 settlements/accumulate max_stack 1)+种子狩猎 401 内真实链施放 desperate_guard(压 HP 触发 self_hp_pct——测试通道弱形式当场标注)+个体池 effective_value==-25+施放行 duration==2+容器级再授不翻倍(卡 T6 明示 roll_multiplier 先例形态;master `roll_multiplier_test.gd:238-255` 同款直查先例成立)。〔QA余 V9〕×5 grep 命中。 |
| V10 | **通过** | `reward_grant.gd:416-425` 接线读毕:`perfect_mult := int(db.combat.settlement.core.p_perfect)/100` 经 ConfigDB 既有读法(db 句柄,零自建 load),`perfect_mult>=2` 门控第二份,高光计数 `(1+(1 if second_ok else 0))` 与原 `(2 if second_ok else 1)` 在 200 档逐位同=行为零漂移坐实;p_perfect 字面量零残留(grep 只余注释与换算)。活性断言(V2 内)+seal :330-401 既有真实流完美双份兑付段未触碰(:331-344 现读在案)。 |
| V11 | **通过(初版附未通过项 U1,已修复闭合——§10)** | `_test_l3_rockfall_minedust_rows`(:377 起)7 断言读毕:候选池两行值钉+200 种子真实布置段两行放置可达+rockfall 经 `fx_reveal`→授予段兑付行值==3(fx_reveal 直调=master `round_flow_skill_pool_test.gd:1101` 先例)+mine_dust 遮蔽数据面命中且无变异格零遮蔽。〔QA余 V11〕×6 grep 命中。初版发现同一提交(8054f959)移除了 `_smoke_global_variant()` 调用(U1,见 §3)——复验确认已由 857f24d5 修复闭合。 |
| V12 | **通过** | `seal_polarity_test.gd:_check_enemy_alert_production_row`/`_check_ap_drain_production_row`(:835 起)4 断言读毕:生产行对象 `row_by_id` 直读、走 `grant_routed` 同链(master :744-774 同款直调先例)、警觉 effect_id 随生产行、迟滞排队增量==-row.power——断言真值依赖生产行值,行值变更即红。**合成行旧断言保留并存**(seal diff 纯增量,master :772-774 合成行段未触碰)——卡 §4 G8 并存申报兑现。〔QA余 V12〕×4 grep 命中。 |
| V13 | **例外(E2)——十组落地一组未落地,呈报一致** | `ui_click_probe.gd` 扩面段逐段读毕,十组真输入+落点断言逐段核实:图例关闭(:1200-1225 真点开层+「关闭」钮真点,原 `.close()` 直调已改真输入——强化)、节点继续(:651-663 一次性落点断言)、三选一刷新(:698-705 落点=停点保持重投喂)、商店购买+刷新(:722-757 出账断言)、秘宝架四钮(购买10/25 出账+装配入装配集+升级 refresh_level+1)、树面高档三钮+ks_refresh 30 档+先手压制 A 侧回切(reload 持久断言)、弃图刷新确认链(:1321-1341 chips 出现+RAP8 扣账落点)、地图放弃(:985-1027 独立新局二击落点=终局面)、Esc 真键浮窗设置(:365-390)、减动效+全屏两拨杆(:527-555 store 态断言,原 `button_pressed` 直改已改真点——强化)。〔QA余 V13〕×35 grep 命中。**进入下一层组未落地=L3-2**(代码事实核实成立:`main.gd:360` 头注「仅调试模式接线」逐字在案,inter_overlay 仅 debug decision `next_layer` 可达——见 §5 E2)。删行九处全部为直改→真输入强化替换或备案参数改(§3)。 |
| V14 | **例外(E1)——未落地,呈报一致** | `ui_struct_probe.gd` 零触碰(diff 无此件)=V14 未实施,与报告 §2「未落地——L3-1」一致。代码事实核实成立:`cell_mark_overlay.gd:8` `extends RefCounted`(绘制域件,无 visible/开层动线/遮挡物语义);`tools/coverage_enum.py:45` `VIEW_KIND_RE=(screen|overlay|panel)$` 按文件名后缀误分类坐实——L3-1 前提「模态断言无被测面可绑」成立(§5 E1)。 |
| V15 | **通过(附例外 E3)** | `tools/coverage_exemptions.js` 程序计数:ontology 154 条(无重复 id)+controls 22 条——与报告 §2/T10 提交「154+22」逐字一致;头注纪律保留(人工维护/禁代码生成/reason 承载=逐族注释照抄卡附录 B);面板消费面核实:controls 走中缀包含(`coverage_report.html:185` `k.indexOf(e)>=0`)、ontology 精确匹配(:209 `ex.includes`)——文件头注与消费语义一致。**cell_mark_overlay 未入 ontology 豁免**(grep 零命中)=可见缺口 1,与报告 §2/§6 L3-1 口径一致;**`(root)/Button#进入下一层` 已入 controls 开发面**(随 L3 追认注记),与报告 §3.5/§6 L3-2 口径一致。**例外 E3**:controls 新增「键形实例变体」17 条中缀豁免,超出卡附录 C 豁免面(开发面 9 键+进程终结 2 键),见 §5。T10 对账读数(缺口 211→164→可见 1;controls 116→0 残留)为实跑申报,审计未复跑——待合回后 CI 代证(§7),纸面算术观察见 §6 O1。 |
| V16 | **通过** | `_check_meta_per_level_pins`(:694 起)三关档 max_hp 6/atk 9/armor_class 1 逐槽读表钉,〔QA余 V16〕grep 命中。 |
## 2. 判据绑定面抽查(中档 ≥3 行,实抽 4 行)
1. **V10 活性断言**(guard `_check_settlement_pin_values`):从真实编排器构造进入(begin_battle 真实启动+`_facts` 完美谓词——master seal :383 同款先例),钉在被测改动特有的提交面=`grant_clear_reward` 内 p_perfect 读表门控;表值注入 100 后伤害行 ×1、还原 200 有闭合断言——「接线但弃用」死接线在该面必红。绑定成立。
2. **V12 生产行兑付**(seal 两函数):`row_by_id` 读生产 reward 行→`grant_routed` 同链兑付→断言真值随行值(effect_id/power)——行值变更即红,判据直接绑「合成行未读生产行」这一被测缺口。绑定成立。
3. **V11 变异行效果通道**(variant_placement 新函数):真实布置段(begin_battle L3→deep_underdark 候选池)→放置可达→fx_reveal 挖开→兑付伤害行 display 落石值==3——判据绑「L3 两行零放置零断言」缺口的放置与兑付双面。绑定成立。
4. **V9 状态行值**(round_flow 新函数):生产行值钉+真实施放链(种子狩猎)+个体池读数+容器级再授——判据绑「defensive_stance 零值断言」缺口的行值与行为两面。绑定成立。
## 3. 测试削弱检查(全 diff 删行 19 处逐一核对)
删行清单(`git diff master..iter55` 全量 grep `^-`):reward_grant ×2、probe_ui_util ×4、ui_click_probe ×9、run_all ×0(纯增)、八个测试件中七件纯增、variant_placement ×2、coverage_exemptions ×3(空数组填充+头注扩展)。逐处结论:
| 删行 | 判定 | 申报面 |
|---|---|---|
| reward_grant.gd `if perfect and first_ok:`/`×2` 高光行 | V10 接线替换,行为零漂移已核(§1 V10) | 卡 V10/T2 申报 ✓ |
| probe_ui_util 滚动基准 4 行(面板基准→ScrollContainer 祖先,64px→8px 让位) | 测量面滚入参数修(代拍板白名单「滚入参数」),修因备案(秘宝匣 336px 裁剪误判) | 报告 §3.2 ✓ |
| ui_click_probe `motion_btn.button_pressed=false/true` ×2 | 直改→`push_click` 真点,周边断言(motion_scale/持久化)保留 | 报告 §3/T9 提交 ✓(强化) |
| ui_click_probe `set_sliders(400,200)` | 参数改 2000/2000,基线对照实证备案 | 报告 §3.1 ✓ |
| ui_click_probe `push_click(node_overlay._btn)` | 原句保留于 else 分支,一次性段新增锁定/落点断言 | T9 ✓(强化) |
| ui_click_probe reward 优选选路 5 行 | 原逻辑保留于回退分支,前置休息候选优先段为纯增 | T9 ✓(强化) |
| ui_click_probe `legend_overlay.close()` | 改「关闭」钮真点,`.close()` 降为 null 守卫兜底且前置 `_problems` 呈报 | T9 提交 ✓(强化) |
| **variant_placement `_smoke_global_variant()` 调用** | **初版未通过项 U1——已修复闭合(857f24d5,§10)**:master :31 在役调用曾被移除,函数体(:150 起)留盘成死代码——33 处 Kit.check 断言退出执行(互锁负样本③–⑦、门控三维、全局决议、Boss 兜底回落、资源面偏斜守恒/白名单/合成序、wr10 三面、确定性对拍——逐行读毕计数),断言字符串全仓 grep 无第二宿主(未搬移)。复验核对:调用行已恢复至执行序 master 原序(iter55 :30,带审计注记),套件复跑 58 checks=原 25+复归 33 恰合 exit0。 | 初版申报缺口:卡 §4「测试削弱零申报不发生——本批零删除断言」、§14「纯增量……零删改既有函数」、报告 §2/§3、T7 提交信息均零申报,`game/tests/README.md:90` 能力行仍列该函数为在役代表用例。修复提交(857f24d5)已逐项转记违规事实与读数,实现报告补 §7 审计结果节。 |
| variant_placement pack_min 断言行 | EOF 缺换行符修复(同文逐字重加),非削弱 | —(无申报义务) |
| coverage_exemptions 空数组/头注 3 行 | 豁免登记本体(V15 收件面) | 卡 T10 ✓ |
**G8 并存专项**:seal 合成行旧断言(master :772-774)与 treasure 字面量路径(master :128-146)均未触碰——卡 §4「合成行旧断言一律保留」兑现。**阈值放宽**:零(8px/2000/2000 为测量与行为参数,非断言阈值,均有备案)。
## 4. 直查例外核对(逐条沿先例)
| 注入/直查面 | 先例(master 在役) | 判定 |
|---|---|---|
| `s._facts.perfect_hit_true/false` 写(V2 活性) | seal_polarity master :383-384/:398-399、feat_vouchers :207-211 | 成立 |
| `grant_clear_reward` 直调(V2 活性) | seal_polarity master :386/:401 同款形态 | 成立 |
| `grant_routed` 直调(V12) | seal_polarity master :744-774、level_shop_economy_test :917 | 成立 |
| `minesweeper.fx_reveal` 直调(V11) | round_flow master :1101 | 成立 |
| `_deck.ticket_appeared/ticket_pity` 直填(V4) | 同套件 master :564-573 `_deck.ticket_sold/ticket_pity` 测试通道同族 | 成立 |
| `_status_effects.apply_effect/query_active` 容器级(V9 叠层) | roll_multiplier_test master :238-255(卡 T6 明示先例形态) | 成立 |
| `meta_state._add_keystone`(探针树面注钥) | ui_click_probe master :84 既有同款(卡 T9「调试注钥」申报面) | 成立 |
| `rnr_shop.gp = 500`(探针商店可达) | 单元侧先例 curio_refresh_paid_test :52/forge :812;探针侧为该先例族在探针面首次使用,T9 提交信息当场申报「测试通道注GP」 | 成立(备案) |
## 5. 已知例外与例外面核对
- **E1(L3-1,cell_mark_overlay)——申报一致性核实通过**:未落地事实(ui_struct_probe 零触碰)、代码事实(RefCounted 绘制域件、enum 后缀误分类)、报告四处口径(§1 T9 行/§2 V14/§5 名实不符/§6 呈报)、豁免面(ontology 未登记该 id=可见缺口 1)五点互相一致。属卡 §9 预授权停机点(到达性/前提类),不算审计失败。
- **E2(L3-2,进入下一层)——申报一致性核实通过**:代码事实核实成立(`main.gd:360` 「仅调试模式接线」头注逐字在案;inter_overlay 唯一显示点为 debug decision `next_layer` 分支);controls 已按开发面预登记 `(root)/Button#进入下一层`(注记「随迭代 55 L3 呈报呈请追认」);报告 §3.5/§6 与文件口径一致。属卡 §9 预授权停机点③(到达性失败),不算审计失败。
- **E3(键形实例变体豁免面扩张)——超卡面,需用户追认**:controls 22 条中「键形实例变体」17 条(save_select 三钮/shop 购买/treasure 四钮/tree 八钮)不在卡附录 C 豁免面(开发面 9+进程终结 2)内,亦非卡 §10 代拍板白名单或 §9 L2(reason 文案微调)可承载的裁决——附录 C 对这些键的裁决是「真缺口·动线扩面=T9 真点命中」,不是豁免。T10 提交信息有 breakdown 申报、文件内逐族 reason 在案(键形改造归工程批另登的卡 §5 口径亦抄注),十组扩面真输入与落点断言已核实存在(§1 V13),故不判测试削弱;但该 17 条使登记件旧键形永久静默(watchdog 面收缩),属对账口径裁决,**应随两项 L3 一并呈请用户追认**;报告 §6 未将其升格列呈报点,属呈报完整性缺口。
- **计数口径微瑕(O2)**:报告 §1 T9 行「十一组动线全数真输入命中——进入下一层组未落地」的「十一组」与卡附录 C 的 V13 十一组(含进入下一层)分组口径不同(提交信息把树面拆「树购/先手」两组凑十一);实质事实(附录 C V13 十一组中十组落地、进入下一层未落地)两处一致,仅计数口径不一致。
## 6. 观察项(不判未通过,留 CI 代证/追认)
- **O1**:T10 读数纸面算术未对齐——未关联缺口 164−ontology 豁免 154=10,与「未豁免未补测=1」差 9;豁免为精确匹配语义,纸面推不出该差值的去向。T10 为实跑读数(工具已在真实跑批中执行),判读以实跑为准,**待合回后 CI 复跑代证**;若 CI 读数≠1,按红账处置。
- **O2**:见 §5 计数口径微瑕。
- **O3**:卡 T10「验证:面板打开无红示警」在报告 §1 T10 行无对应读数记载(面板 reason 标红机制消费面未在报告留痕)——随 CI 批留痕即可。
## 7. 最窄测试复跑——省略声明(中档)
按卡 §16 与 test-conventions §8.7 中档,最窄复跑省略,以下读数以远端 CI 现查代证(合回未发生,**待合回后 CI 代证**):单元全套件与各触碰套件绿读数、两探针 exit0 与十一组命中键清单(`game/tests/.gates/coverage/` 不入 git,命中键无法从 diff 核实)、coverage_enum 对账读数(缺口 164/可见 1/controls 0 残留)。审计对断言存在性、形态与绑定面的核实均为静态逐行自证,不依赖上述读数。
## 8. 逐卡验收档与执行深度
| 卡 | 验收档 | 实际执行深度 |
|---|---|---|
| T0 开工 | 中 | 中档——读数锚与卡逐字同(报告 §1),审计未复跑(CI 代证) |
| T1/V1 | 中 | 中档全量——七函数逐行读毕+manifest 核实+先例核对 |
| T2/V2/V10/V16 | 中 | 中档全量——接线逐行读毕+字面量残留 grep+回归面在案核实+活性断言先例核对 |
| T3/V3/V4 | 中 | 中档全量——七槽与配额满六断言逐行读毕+直查先例核对 |
| T4/V6 | 中 | 中档全量——两函数三断言逐行读毕 |
| T5/V7 | 中 | 中档全量——四函数逐行读毕+真链入口核实 |
| T6/V9 | 中 | 中档全量(抽查行①)——值/持续/叠层三面读毕 |
| T7/V11 | 中 | 中档全量(抽查行③)——七断言读毕;同提交删行曾坐实 U1(已由 857f24d5 修复闭合——§10) |
| T8/V8/V12 | 中 | 中档全量(抽查行②)——生产行两面读毕+并存申报兑现核实 |
| T9/V13 | 中 | 中档全量——十组逐段读毕+删行九处逐一核对;进入下一层组=E2;hits 增键 CI 代证 |
| T9/V14 | 中 | 中档——未落地事实与五点口径一致性核实(E1) |
| T10/V15 | 中 | 中档——豁免件程序计数(154/22/无重复)+消费语义核实+两例外口径核实;工具读数 CI 代证;例外面 E3 |
| T11 | 中 | 中档——产出物三件在案核对;名实不符申报(cell_mark 段)与 L3-1 一致;初版指出收尾核对漏列 U1 与 README 能力行 `_smoke_global_variant` 名实失守(已随 857f24d5 处置转记——§10) |
## 9. 审计结论(复验后终版)
**通过(E1/E2/E3 例外随 L3 裁决包处理,O1 观察在案)。**
初版未通过项处置(1 项,已闭合):
1. **U1(测试削弱未申报,违卡 §4 红线)——已修复闭合**:T7 提交(8054f959)曾将 `game/tests/unit/battle_settlement/variant_placement_test.gd` 调用序中的 `_smoke_global_variant()` 移除(master :31→删行),函数体留 :150 成死代码——33 处在役断言(变异表互锁负样本、门控三维、全局决议、兜底回落、资源面偏斜守恒与合成序、wr10 接线三面、确定性对拍)退出执行且全仓无第二宿主,卡 §4「零删除断言」/§14「纯增量」零申报,README:90 能力行名实失守。**窄复验闭合(§10)**:修复提交 857f24d5 恢复调用行至执行序 master 原序(iter55 :30,带审计注记)并逐项转记违规事实;套件复跑 all green 58 checks=原 25+复归 33,与本审计 33 条静态计数恰合;实现报告补 §7 审计结果节如实转记初版结论。
例外(3 项,均已在案,随 L3 裁决包处理):
- E1(L3-1 cell_mark_overlay 未落地)——呈报五点口径一致,待用户裁决(改豁免或另立卡)。
- E2(L3-2 进入下一层组未落地)——呈报与豁免预登记一致,待用户追认。
- E3(controls 键形实例变体 17 条豁免超卡附录 C 豁免面)——T10 提交信息与文件 reason 在案,报告未升格呈报,待用户随两项 L3 一并追认。
观察项(2 项):O1 对账算术纸面未对齐(164−154≠1;实现报告 §7 已补记解释口径「缺口实例数≠唯一 id 数——同 id 跨类重复,机器读数以逐 id 比对为准」,仍待 CI 复跑代证);O2「十一组」计数口径与卡附录 C 分组不一致(实质一致)。
复跑省略代证项(1 项):最窄测试复跑省略+V13 hits 增键+V15 工具读数——待合回后远端 CI 现查代证。
合并放行条件:U1 已闭合,本审计不再阻塞合并;E1/E2/E3 属卡 §9 预授权停机面的用户裁决事项,裁决前不落实现动作。
## 10. 窄复验记录(2026-11-07,U1 修复后)
复验范围(仅三项,零其余动作;只读 grep/git):
1. **调用行与提交核对**:`git show 857f24d5`(iter55 分支最新笔)——variant_placement_test.gd 单行恢复 `_smoke_global_variant() # 审计 U1 修复恢复(T7 编辑回退分支误删调用——33 条在役断言复归执行)`,落位 :30=`_smoke_variant_placement(2)` 与 `_test_pack_min_from_table()` 之间,与 master 原序(master :29-32)逐位同;提交信息逐项转记违规事实(卡 §4/§14)、修因(编辑回退分支误删)与读数。
2. **读数闭合核对**:58 checks=原 25+复归 33——33 与本审计 §3 对 `_smoke_global_variant` 函数体的静态 Kit.check 计数(33)恰合,闭合成立。
3. **报告补节核对**:实现报告新增 §7「独立验收审计结果与处置」——初版结论(未通过/U1)、处置(857f24d5)、例外三项与 O1 转记逐项与本报一致。
附记:复验区间内分支另有一笔 4a9c844a(件核补笔)——V4 四断言补挂〔QA余 V4〕、V5 五断言补挂〔QA余 V5〕,diff 逐行核实为纯尾缀追加(断言逻辑零改动)+复跑读数在案(adventure_feats 144/treasure 全绿 exit0),属卡 §9 L1 自救范畴,不构成削弱;本审计初版 grep 读数即含该尾缀(审计时已在工作树),初版 §1 V4/V5 行结论不受影响。
## 11. 增量轮(卡修续行,2026-11-07)
审计对象=卡修轮 2(master ef5d4679 版卡片)落地续行两笔 cf08a4ac(登记件开发面过滤+coverage_enum scan_screens 分类修正+豁免件删开发面 3 条)与 b5a981ef(board_shot_probe 采集态六类型注入+逐类型读数+棋盘三图基线换代);审计者=未参与实现与写卡的只读子代理,全结论自读码自证(两笔 diff 逐文件读毕+.gates 产物实测+先例核对)。
逐项结论(8 项全过,详据见子代理审计记录):
1. 提交逐文件 diff 读毕无遗漏;2. 新卡 V13/V14/V15/V17 四行与实现报告 §2 行逐格一致,读数凭据三源互证(提交信息/报告 §9/.gates 实测:dev_face_roots=3、seen 开发面键 0、868 实体缺口 163、三张 PNG 入提交);3. cf08a4ac 零削弱(登记件纯增量 +36/−0,过滤纯减法;scan_screens 删行=卡 T10 申报面;豁免删 3 条三处裁决申报在案);4. b5a981ef 基线换代纪律四要件齐(显式重制/呈报/复闸/触发原因入提交信息),注入四链全真实写口或生产同源(set_treasure_overlays 生产 API、remove_mines_in 核心写口守卫前置、变异 resolver 生产同款构造、face 为每格自建实例非共享 Resource),既有双帧取证语义零削弱;5. 新函数零判定调用=无注记义务(既有注记位自洽);6. 过滤语义核验:三根互恰覆盖附录 C 开发面 10 键、seen 与登记同滤、null 分支只漏滤不误滤且有 seen 核对兜底;7. E3(键形实例变体 17 条)核实未处置仍在册——随合并裁决包呈请追认;8. 能力行两行与卡同文、代表用例在码。
发现清单:F1(golden/README 换代戳缺——**已随本审计落定补记**);F2(登记件头注「解析不到的根跳过并计数」措辞与实码偏差——**已随本审计落定改为注释级修正**,零行为改动、非行为改动备案);F3=E3 键形变体 17 条待用户追认(例外,随裁决包);F4(报告/审计本件待落盘——收口提交承载);F5(读数口径措辞「控件 51/命中 85 次」vs「seen 80/命中 85 次」各与 meta 语义吻合——备案)。
**增量轮结论:通过——无硬伤无阻塞项,E3 例外随合并裁决包处理。**
@@ -0,0 +1,6 @@
# 营地场景重排接线 · 反哺点清单(2026-11-07)
| 文档 | 落点 | 内容 | 状态 |
|---|---|---|---|
| design/art/art-status-checklist.md 营地行 | 营地场景图行状态列 | 补「围墙件 2026-11-07 换代(1280×164 补尖+墙脚入土,显示 200 高拉伸)」事实 | 待文档批落文 |
| roadmap.md | 迭代总表 | 本批未编迭代(用户直令落表);如需补记,由编排段处置 | 待用户裁 |
@@ -0,0 +1,30 @@
# 营地场景重排接线 · 实现报告(2026-11-07)
> 本批按用户 2026-11-07「落表」直接执行,未编迭代(卡片与实现同批落地,流程偏离记录在案)。
> 卡片:reports/需求卡片-营地场景重排接线-2026-11-07.md(复核记录两轮 24 发现全处置)
## 各卡状态
| 卡 | 状态 | 读数 |
|---|---|---|
| T0 围墙件入包 | 完成 | 1280×164 RGBA;palette_check 对八件基线 12 色零新增;path_check 0 |
| T1 布局表换代 | 完成 | 十层矩形+wall_band+schema 默认值/注释同步;营地单测 exit=0 |
| T2 新值钉断言+收口 | 完成 | 新增 5 条钉值断言(围墙/门扇/告示板/围墙带/六件落位)全 PASS;冒烟 15 项 0 失败;ui_struct_probe PASS |
## 实现决定记录
- 门扇 hotspot 高 147=贴图 138+9 余量(沿用旧表口径)。
- 六件 hotspot 按旧表同偏移平移(forge y−46、chest y−46/x−12/宽+24、notebook y−14/高+14、campfire y−46/高 80、board 高+19、dummy 同贴图)。
- 视图层 `_build_layer_node` 加 `expand_mode = EXPAND_IGNORE_SIZE`:否则 TextureRect 被贴图原高顶住最小尺寸,门扇 138 高矩形不生效(探针 V1 抓到,已修)。
## 实机目检总清单(登记不阻塞,用户自排)
1. 营地屏:围墙带 y220–420、桩尖完整、墙脚无贯通直线(入土感)。
2. 大门:240×138 显示、底压墙底 420、门扇在洞口 x520–760 内。
3. 告示板:(845,241,130,121) 挂墙、命中可点。
4. 其余六件落位与命中可点(锻炉/宝箱/笔记本/篝火/木桩/帐篷承载不动)。
5. 背景层拼接接缝被围墙遮住、无可见缝。
## 遗留读数义务
- 无新增遗留读数;远端 CI 由 post-merge 钩子推送,按需 `tools/ci_check.sh <合并提交>` 现查。
@@ -1,6 +1,6 @@
# 需求卡片——QA 覆盖余量收口批(B4/B5 复核分流落地)
> **日期**:2026-11-07 / **批名**:QA覆盖余量收口批 / **预计**:≈8.25 个工作日(区间 7–10.5,切分预案见 §7 尾)
> **日期**:2026-11-07 / **批名**:QA覆盖余量收口批 / **预计**:≈8.75 个工作日(区间 7–10.5,切分预案见 §7 尾)
> **来源**:待办清单「QA harness 覆盖遗漏余量——B4 本体缺口与 B5 控件零命中缺口复核分流」(2026-11-07 登记,P0,待写卡)。
> **唯一事实源**:本卡为需求性工程条目,设计事实源=证据指认(见 §2)。
> **验收档:中**(失败后果=验证承载面静默弱化,玩家不可见、无状态残留;触多档按最高档申报口径取中)。
@@ -9,9 +9,10 @@
把 QA harness 覆盖余量(B4 本体对账缺口 211 条/62 类+B5 控件级零真输入命中)逐条复核分流后的结论落地:
- **真缺口**(46 条,附录 A):补验证——数据表违约词负面断言、表值钉、行为值断言、屏可见性断言、探针真输入动线扩面。
- **真缺口**(45 条,附录 A):补验证——数据表违约词负面断言、表值钉、行为值断言、屏可见性断言、探针真输入动线扩面。
- **豁免**(165 条,附录 B):登记进 `tools/coverage_exemptions.js`(假缺口/预留埋点/挂起件三类),面板亮豁免灯不亮缺口灯。
- **完成定义**:①附录 A 全部真缺口有对应断言落地并跑绿;②附录 B 全部条目入豁免清单且带 reason;③重跑 `python tools/coverage_enum.py` 与两探针,本体缺口清单清零(未豁免未补测=0)+ui_click/screen_flow 零命中集合与附录 C 豁免面一致;④单元测试全套件绿(新增套件+被触碰套件)+场景探针绿。
- **出圈**(非豁免,附录 C 排除面+本体分类修正):开发面控件(调试浮窗/调试角标/inter 调试专用层)在覆盖登记层过滤、不入玩家可达宇宙;cell_mark_overlay 为绘制域件不入「屏与模态」本体清单(枚举器分类修正)——两者各归现役通道(渲染闸棋盘 golden/封装扫描),测试目的不豁免、换通道达成(§4 第 10 条)。
- **完成定义**:①附录 A 全部真缺口有对应断言落地并跑绿;②附录 B 全部条目入豁免清单且带 reason;③重跑 `python tools/coverage_enum.py` 与两探针,本体缺口清单清零(未豁免未补测=0)+ui_click/screen_flow 零命中集合与附录 C 排除面一致(seen 集零开发面键);④单元测试全套件绿(新增套件+被触碰套件)+场景探针绿。
## 2. 设计事实源
@@ -19,7 +20,7 @@
- 待办清单条目「QA harness 覆盖遗漏余量——B4 本体缺口与 B5 控件零命中缺口复核分流」(`待办清单.md`,2026-11-07 登记,P0,状态待写卡)。
- 登记处证据:`reports/QA-harness三批-缺陷与覆盖遗漏报告-2026-11-06.md`(B4=`game/tests/.gates/coverage/ontology_gaps.js`+覆盖面板第四节;B5=`probe_hits_ui_click.js`/`probe_hits_screen_flow.js` 的 seen−hit 差集;诚实边界=:42 假缺口假覆盖须人工逐条复核)。
- 本卡写卡段复核分流逐条裁决=附录 A(真缺口 46 条)/附录 B(豁免 165 条)/附录 C(B5 零命中 94 键归并裁决),由两名未参与撰写的只读子代理分裁决+写卡人按普查口径与代码事实校准(校准记录见 §17 复核记录)。
- 本卡写卡段复核分流逐条裁决=附录 A(真缺口 45 条)/附录 B(豁免 165 条)/附录 C(B5 零命中 94 键归并裁决;轮 2 用户裁两处出圈改判),由两名未参与撰写的只读子代理分裁决+写卡人按普查口径与代码事实校准(校准记录见 §17 复核记录)。
## 3. 现状事实(代码级,开工自行复核)
@@ -35,6 +36,7 @@
- **秘宝 rap_transfer_mult**:消费接线在役(`game/core/grant_segment.gd:301`),行为测试用字面量 125 直调数学面未装配真实行(`treasure_effects_test.gd:128-146`)——行值变更零测试失败。
- **状态行 defensive_stance**:同族状态行有值断言先例(`round_flow_skill_pool_test.gd:944,1119` empower/off_guard),本行零。
- **豁免清单机制现成**:`tools/coverage_exemptions.js`=人工维护、面板与工具只读、每条必带 reason(`:1-4`);`coverage_enum.py:145` 明写「人工核销走豁免清单,不落本文件」。
- **枚举分类与调试面(实现段 L3 回退坐实,2026-11-07 用户裁)**:`tools/coverage_enum.py:45` VIEW_KIND_RE 按文件名后缀归类「屏与模态」——`game/presentation/views/cell_mark_overlay.gd`(RefCounted 绘制域件,CellUnit 拆件,:7 `extends RefCounted`,无 visible/开层动线/遮挡物语义)误入;调试面接线与标注证据=`game/presentation/main.gd:361`「仅调试模式接线」(inter 覆盖层唯一显形写点=调试分支 `main.gd:370`,正常冒险层间推进归 AdventureRunner)+`debug_overlay.gd:1-3` 调试浮窗头注+`main_ui_build.gd:244-246` 装配注——三处散文标注在案,机器过滤单点缺位;过滤可依的成员引用单点=`ui.screens.debug_badge`(main_ui_build.gd:185)/`ui.modals.menu.debug_overlay`(:250,class_name DebugOverlay)/`ui.screens.inter_overlay`(ui_screens.gd:13)。
- **预留埋点口径**:`reports/普查-效果通道与事件词零现役-2026-11-06.md` §1/§2——词表先行内容后接,零现役词面全部保留;秘宝表旧词 9 个「迁移完成」收尾待用户另裁(不在本批)。
## 4. 设计契约(违反即返工,🔴 触碰=L3 停机)
@@ -47,18 +49,19 @@
- 🔴 **实现批禁写 `design/` 与根规则文件与 `game/tests/README.md`**——能力行已随本卡(写卡段)入表;收尾核对发现名实不符=停卡呈报(回表走写卡段通道,实现段不自行改表)。
- 🔴 **测试削弱零申报不发生**——本批零删除断言;G8 的合成行断言一律保留、新增生产行断言并存(申报面见 §8 尾)。
- 🔴 **拆分边界沿职责轴**(code-conventions §1.1)——新增负面套件=「schema 违约词拒绝路径」单一职责一件;禁为凑对照表行数拆碎或为省文件混装无关违约。
- 🔴 **开发面不入对账宇宙(2026-11-07 用户裁)**——调试面控件(DebugOverlay 浮窗/调试角标/inter 调试专用层)在覆盖登记层过滤、不产豁免条目:豁免=在玩家可达范围内特批不做,开发面本就不在该范围内,列豁免=范围定义错误;过滤边界按成员引用/类型单点判定(§3 枚举分类与调试面条),禁逐键黑名单。屏与模态分类按实体基类(场景节点型)判定,禁文件名后缀近似。
## 5. 范围边界
**收件**:附录 A 真缺口 46 条的验证补齐+p_perfect 接线+附录 B 165 条豁免登记+附录 C B5 探针动线扩面(十二动线组+cell_mark 屏断言)。
**收件**:附录 A 真缺口 45 条的验证补齐+p_perfect 接线+附录 B 165 条豁免登记+附录 C B5 探针动线扩面(十一动线组)+开发面出圈(登记件过滤+枚举器分类修正)+cell_mark_overlay 显示正确性渲染通道核对。
**不收件(去向在案)**:
- 普查在册预留词不重开:本批新认定预留词(ap_grant/risk/cell_removal/neq/hero_hp_pct/slot_cost/chain_ap_cost/move_ap_cost/ap_rounds_front/effective_rounds/mine_hit_halve/reflect_damage/refresh_pick/reward_weight_bias)随附录 B 豁免,词面不动;秘宝表旧词 9 个「迁移完成」收尾归普查条目待用户裁,不属本批。
- `settlement_review_overlay` 挂起死件不动(生涯条目承载处置两途)。
- iter54 已收口面(A1/A2/B1/B2/B3/B6)不重做;停手钮零命中属数据陈旧,随附录 C 排除。
- 覆盖面板与 `coverage_enum.py`/登记件本体零改动——B5 双源键形差异以人工复核记录(附录 C)承载,键形改造若要做归工程批另行登记。
- 未入探针 seen 的屏(如关卡结算屏族)不在 B5 对账面(登记件完备性边界在案);cell_mark_overlay 因属 B4 屏类真缺口仍收(探针补断言)。
- B5 双源键形差异以人工复核记录(附录 C)承载,键形改造若要做归工程批另行登记(开发面过滤按调试面边界判定、非键形修正,随本批 T9)。
- 未入探针 seen 的屏(如关卡结算屏族)不在 B5 对账面(登记件完备性边界在案);cell_mark_overlay 非屏与模态实体(RefCounted 绘制域件)——本体清单出圈(枚举器分类修正承载,T10),显示正确性归渲染闸棋盘 golden(T9 核对步,锚 test-conventions.md:100)。
- 豁免≠放弃:预留埋点词未来接线内容时须撤豁免补验证(撤豁免动作随接线批走)。
## 6. 关联文档同步面
@@ -87,9 +90,10 @@
| `game/tests/unit/round_flow_skill_pool_test.gd`(存量触碰) | +1 检查函数:defensive_stance 值断言 | 非产品码 → V9 |
| `game/tests/unit/variant_placement_test.gd`(存量触碰) | +1 检查函数:L3 两变异行放置+效果 | 非产品码 → V11 |
| `game/tests/unit/seal_polarity_test.gd`(存量触碰) | +2 检查函数:enemy_alert/ap_drain 生产行读值 | 非产品码 → V12 |
| `game/probe/ui_click_probe.gd`(存量触碰) | 动线扩面十二段(附录 C 真缺口面) | 测量面 → V13 |
| `game/probe/ui_struct_probe.gd`(存量触碰) | cell_mark_overlay 可见性/模态断言段 | 测量面 → V14 |
| `tools/coverage_exemptions.js`(存量触碰) | 附录 B 165 条登记 | 工程配套(面板配置,随批) |
| `game/probe/ui_click_probe.gd`(存量触碰) | 动线扩面十一段(附录 C 真缺口面) | 测量面 → V13 |
| `game/probe/probe_coverage_recorder.gd`(存量触碰) | 开发面过滤——`_wire_buttons()` 按调试面边界跳过(DebugOverlay 类型+inter_overlay/debug_badge 引用子树) | 测量面 → V17 |
| `tools/coverage_enum.py`(存量触碰) | `scan_screens()` 屏与模态分类修正——按 extends 场景节点基类,绘制域件与调试浮窗出圈 | 工程配套(对账工具,随批) → V17 |
| `tools/coverage_exemptions.js`(存量触碰) | 附录 B 165 条登记+controls 开发面 3 条删除 | 工程配套(面板配置,随批) |
### T0 开工(0.25 日)
- [ ] worktree 内拷导入缓存三件套,`git status` 归属核对
@@ -99,7 +103,7 @@
### T1 G1 schema 违约词负面断言(1.0 日)
- [ ] 新增 `game/tests/unit/schema_vocab_violation_test.gd`:七个检查函数——`_check_empty_tables`(八表空行集注入→errs 含 empty_table)、`_check_settlement_vocab`(missing_segment/pperfect_oob/segorder_violation 三注入)、`_check_zero_flat_guard`(feat+treasure 两表 zero_flat 白名单违约注入)、`_check_keystone_cost_domain`(meta attune 行 keystone_cost 域外注入)、`_check_use_phase_domain`(treasure use_phase 出域注入,覆盖 active_dig 枚值面)、`_check_solver_frozen`(board_gen solver_rules="single" 注入→frozen 拒,同钉 single_subset 冻结语义)、`_check_meta_tree_load_bearing`(meta_tree 彩蛋 cap>3 违约注入→category=load_bearing)
- [ ] 注入形态沿在役先例 `load(schema).new()` 新实例+行注入(`meta_progression_forge_test.gd:581` 同款)——禁改共享 Resource(避引擎 Gotcha:共享 Resource 池污染)
- [ ] 每检查函数带 `# oracle:` 注记锚 `design/engineering/test-conventions.md:67`
- [ ] 每检查函数带 `# 判据出处:` 注记锚 `design/engineering/test-conventions.md:67`
- [ ] `game/tests/run_all.gd` `_suites()` manifest 登记新套件(缺登记则全套件不含本件)
- [ ] 验证:单件直跑绿(读数入提交信息)
@@ -137,17 +141,19 @@
- [ ] `table_structure_guard_test.gd` +`_check_reward_row_pins`:stacks 生产行值钉
- [ ] 验证:套件直跑绿
### T9 G9+B5 探针扩面(2.0 日)
- [ ] `ui_struct_probe.gd` +cell_mark_overlay 段:开态 visible+遮挡物隐藏模态断言(锚 test-conventions §2 模态条款)
- [ ] `ui_click_probe.gd` +动线扩面十二段(附录 C 真缺口面,全部真输入):图例关闭/节点继续/curio 确认+继续+刷新/商店购买+刷新/秘宝架购买10·25·装配·升级30/树面购买0·高档(调试注钥)·先手压制(fork B 侧)/弃图刷新→确认弃图→确认弹窗/地图放弃/进入下一层/Esc 浮窗设置/减动效开关(store 态断言)
### T9 B5 探针扩面+开发面过滤+渲染采集态核对(2.25 日)
- [ ] `ui_click_probe.gd` +动线扩面十一段(附录 C 真缺口面,全部真输入):图例关闭/节点继续/curio 确认+继续+刷新/商店购买+刷新/秘宝架购买10·25·装配·升级30/树面购买0·高档(调试注钥)·先手压制(fork B 侧)/弃图刷新→确认弃图→确认弹窗/地图放弃/Esc 浮窗设置/减动效开关(store 态断言)
- [ ] 每动线钉「落点」判定(到哪屏/哪层可见),防空转假绿
- [ ] 验证:两探针直跑绿+`.gates` 零命中差集对附录 C 收敛读数
- [ ] `probe_coverage_recorder.gd` 开发面过滤:`_wire_buttons()` 接线遍历时按调试面边界跳过——边界单点=DebugOverlay 类型实例+`ui.screens.inter_overlay` 引用子树+`ui.screens.debug_badge` 引用子树(成员引用现役在案:main_ui_build.gd:185/:250、ui_screens.gd:13;依据=main.gd:361「仅调试模式接线」+test-conventions.md:65 调试面发布态恒隐);登记件头注补边界声明句(引用出处随句)
- [ ] cell_mark_overlay 渲染采集态核对:`board_shot_probe.tscn` 三图采集态逐类型核对其绘制域(变异标记/奖励徽章/路径点迹/焦点高亮/移除退色)是否在帧;缺的类型经确定性注入补进采集态(测试夹具直构同款口径);采集态改动=基线换代,走 `tools/golden_baseline_refresh.sh`(呈报用户过目后执行,`game/tests/golden/README.md` 时效判定纪律——显式重制+呈报+复闸,禁先动后判)
- [ ] 验证:两探针直跑绿+`.gates` 零命中差集对附录 C 排除面收敛读数(seen 集零开发面键)+渲染闸绿
- [ ] 套件耗时核对:扩面后探针单件耗时仍在 run_all 截止内(默认 120s,`game/tests/README.md` Running Tests 节),超则按白名单重排段序仍超→L2 记录并呈报
### T10 豁免登记与对账(0.5 日)
- [ ] `tools/coverage_exemptions.js` 登记附录 B 165 条(ontology 逐 id+reason,分组照抄附录)+附录 C 豁免面 controls 条目
- [ ] 复跑 `coverage_enum.py`+两探针:缺口清单=零(未豁免未补测=0)读数入提交信息
- [ ] 验证:面板打开无红示警(无 reason 缺失条目)
### T10 豁免登记+对账工具面修正(0.75 日)
- [ ] `coverage_enum.py` `scan_screens()` 分类修正:「屏与模态」实体=`extends` 场景节点基类(Control/CanvasLayer/Node2D/PanelContainer 等)的 `presentation/views/*.gd`;RefCounted/Resource 绘制域件出圈(cell_mark_overlay);`class_name DebugOverlay` 调试浮窗出圈(开发面,§4 第 10 条)——禁文件名后缀近似归类
- [ ] `tools/coverage_exemptions.js` 登记附录 B 165 条(ontology 逐 id+reason,分组照抄附录)+附录 C 豁免面 controls 条目(进程终结/双源同物/键形实例变体三族;开发面族不入——T9 过滤承载,已登记的 3 条随本裁决删除)
- [ ] 复跑 `coverage_enum.py`+两探针:缺口清单=零(未豁免未补测=0)+枚举基数与真缺口 45/豁免 165 口径核对,读数入提交信息
- [ ] 验证:工具最小参数全路径含产出落盘(`--out` 默认路径)+面板打开无红示警(无 reason 缺失条目)
### T11 产出物落位卡(0.25 日)
- [ ] `reports/iter<N>-实现报告-<日期>.md`:各卡状态+实机目检总清单(探针动线扩面屏点选段)+遗留读数义务+实现决定记录
@@ -172,14 +178,15 @@
| V10 | p_perfect 读表接线(`design/engineering/test-conventions.md:133`+`design/gdd/systems/战斗循环/战斗结算.md:124`) | `reward_grant.gd:418-421` 改读 ConfigDB | `table_structure_guard_test.gd:_check_settlement_pin_values`(值钉+p_perfect=100 活性断言)+`seal_polarity_test.gd` 既有真实流完美双份兑付段(:330-401)跑绿 | 单元 | 完美兑付路径(ConfigDB 出口) | 兑付倍率==表值且随表值变化(活性);字面量 grep 零残留为辅证(结构接线形态 grep 不判死接线,主证=活性断言) | 既有:轮内流与结算五段全序 |
| V11 | L3 两变异行(`design/engineering/test-conventions.md:133`) | `variant_placement_test.gd` +函数 | `variant_placement_test.gd:_test_l3_rockfall_minedust_rows` | 单元 | 变异布置段 | 两行放置可达+效果通道命中 | 既有:变异布置门控 |
| V12 | enemy_alert/ap_drain 生产行(`design/engineering/test-conventions.md:133`) | `seal_polarity_test.gd` +两函数 | `_check_enemy_alert_production_row`;`_check_ap_drain_production_row` | 单元 | 效果引擎兑付链读生产行 | 断言真值依赖生产行值 | 既有:封印与极性路由/不可逆 |
| V13 | 十二动线真输入可达(`design/engineering/test-conventions.md:37`) | `ui_click_probe.gd` 动线扩面 | `ui_click_probe.gd:_ready`(扩面段) | 探针 | 合成 InputEvent 经 `push_input` 真点 | 每动线落点可见性断言+登记件 hits 增键 | 新增:控件动线扩面真输入可达(图例关闭/节点继续/三选一与商店/秘宝架/树高档与先手/弃图链/地图放弃/进入下一层/Esc 设置/减动效开关)+cell_mark 模态断言 |
| V14 | cell_mark_overlay 模态断言(`design/engineering/test-conventions.md:35`) | `ui_struct_probe.gd` +段 | `ui_struct_probe.gd:_ready`(cell_mark 段) | 探针 | 真实实例化+开层动线 | 开态 visible+遮挡物隐藏 | 新增:控件动线扩面真输入可达(图例关闭/节点继续/三选一与商店/秘宝架/树高档与先手/弃图链/地图放弃/进入下一层/Esc 设置/减动效开关)+cell_mark 模态断言 |
| V15 | 豁免登记对账清零(`design/engineering/test-conventions.md:119`) | `tools/coverage_exemptions.js` +165 条 | T10 对账读数(`coverage_enum.py` 缺口=0+探针差集=附录 C 豁免面) | 工具直跑 | 工具最小参数全路径 | 读数落 `.gates` 且与附录一致 | 既有:全表装载、就绪态与表清单目录对账 |
| V13 | 十一动线真输入可达(`design/engineering/test-conventions.md:37`) | `ui_click_probe.gd` 动线扩面 | `ui_click_probe.gd:_ready`(扩面段) | 探针 | 合成 InputEvent 经 `push_input` 真点 | 每动线落点可见性断言+登记件 hits 增键 | 新增:控件动线扩面真输入可达(图例关闭/节点继续/三选一与商店/秘宝架/树高档与先手/弃图链/地图放弃/Esc 设置/减动效开关) |
| V14 | cell_mark_overlay 显示正确性——渲染通道(`design/engineering/test-conventions.md:100`) | 采集态逐类型核对与缺型补注(T9);采集态改动=基线换代走 golden_baseline_refresh.sh(用户过目后执行) | `board_shot_probe.tscn` 三图采集+`golden_compare.py` 逐像素 | 渲染闸 | 窗口化真实渲染截图(固定种子单关直构,`board_shot_probe.gd:_ready`) | 棋盘裁剪区加严口径(changed>0 落 900×760 裁剪区=判失效,`game/tests/golden/README.md`) | 新增:棋盘格面绘制显示(渲染闸棋盘三图 golden 逐像素——变异标记/奖励徽章/移除退色) |
| V15 | 豁免登记对账清零(`design/engineering/test-conventions.md:119`) | `tools/coverage_exemptions.js` +ontology 逐 id+controls 19 条(开发面族不入账) | T10 对账读数(`coverage_enum.py` 缺口=0+探针差集=附录 C 排除面) | 工具直跑 | 工具最小参数全路径 | 读数落 `.gates` 且与附录一致 | 既有:全表装载、就绪态与表清单目录对账 |
| V16 | per_level_shift_pct 三关档钉(`design/engineering/test-conventions.md:119`) | `table_structure_guard_test.gd` +函数 | `table_structure_guard_test.gd:_check_meta_per_level_pins` | 单元 | 表行读值 | 三关档值==6/9/1 | 新增:schema 违约词拒绝路径与关键表值钉(空表/冻结/出域/白名单/settlement 钉/cap 段七槽钉) |
| V17 | 开发面出圈与本体分类修正(`design/engineering/test-conventions.md:65`) | `probe_coverage_recorder.gd` 调试面边界过滤+`coverage_enum.py` `scan_screens()` 基类分类 | 复跑读数:两探针 seen 集零开发面键+枚举「屏与模态」无绘制域件/调试浮窗(`coverage_enum.py` 全路径落 `.gates`) | 工具直跑 | 工具最小参数全路径+探针直跑 | 登记件 seen 与枚举基数对附录 C 排除面/本体分类口径(逐项可判红) | 既有:全表装载、就绪态与表清单目录对账 |
**独立验收审计**:合回前由未参与实现的会话或子代理执行——审计入口=本卡 §8 对照表+实现报告实际对照表+diff+测试文件,报告落 `reports/iter<N>-验收审计-<日期>.md`;验收档=中,深度按 test-conventions §8.7 中档执行;未过不合回。
- **测试方式两分法**:V1–V12/V15=调试接口直改数据(单元面);V13/V14 动线=探针真输入;**用户目检项**=探针动线扩面十二段的屏面观感(登记实现报告目检总清单,登记不阻塞)。
- **测试方式两分法**:V1–V12/V15=调试接口直改数据(单元面);V13 动线=探针真输入;V14=渲染闸 golden;V17=工具直跑+登记件读数;**用户目检项**=探针动线扩面十一段的屏面观感+基线换代帧过目(登记实现报告目检总清单,登记不阻塞)。
- **回归措辞**:里程碑步(T 段)出口跑一次该步触碰套件+关联套件;波内修复只做出红最小单元最窄确认;新增测试先行孤立验证再并入全套。
- **闸口径**:本批改动含 `game/` 非文档行为载体(reward_grant.gd)→ 批末跑代码域闸(冒烟+单元+探针+渲染/静态);批末另有改前改后读数对拍(T0 锚 vs T10 复跑)。
- **测试削弱申报**:零删除断言、零放宽阈值;G8 合成行旧断言保留并存(非削弱);停手钮零命中排除=iter54 已修非本批动作。
@@ -200,9 +207,9 @@
## 12. 落位与可复用性预检
- **复用面**:46 条真缺口的验证全部落既有套件文件(table_structure_guard/adventure_feats/treasure_effects/stage_background/meta_progression_forge/round_flow_skill_pool/variant_placement/seal_polarity)+两既有探针——零新增产品码文件、零新增数据件;唯一新增件=`schema_vocab_violation_test.gd`,不能复用既有件的理由:现役套件先例两形态——致命通道专件(manifest negative,如 treasure_target_violation_test)与单表 validate 诊断面(level_table_validate_test)——本批十七违约词跨十二表的**违约词族集中面**与任一先例职责不同(单一变化原因=违约词族增删,code-conventions §1.1),拆散塞进各表既有套件会把集中义务打散成十二处触点;独立成件是职责轴切分,不是 §5.6 强制(validate 诊断注入本不触 §5.6)。
- **唯一面**:豁免登记唯一落点 `coverage_exemptions.js`;对账唯一工具 `coverage_enum.py`(零改动);p_perfect 表值读取唯一经 ConfigDB 出口;同名检查函数零重复(grep 计划名逐一核过)。
- **分层与交互面**:V10 接线在 core 内经 ConfigDB 既有读法(Core 零 UI 依赖不破);V4/V11 走 AdventureRunner 真链不经 UI;探针扩面只增段不改既有段(既有动线零回归风险面=探针文件内新增);测试面全落 `game/tests/unit`+`game/probe`(静态扫描 S 系面外,test-conventions §1.1 三元组归位:新增单元套件+探针段)。
- **复用面**:45 条真缺口的验证全部落既有套件文件(table_structure_guard/adventure_feats/treasure_effects/stage_background/meta_progression_forge/round_flow_skill_pool/variant_placement/seal_polarity)+两既有探针——零新增产品码文件、零新增数据件;唯一新增件=`schema_vocab_violation_test.gd`,不能复用既有件的理由:现役套件先例两形态——致命通道专件(manifest negative,如 treasure_target_violation_test)与单表 validate 诊断面(level_table_validate_test)——本批十七违约词跨十二表的**违约词族集中面**与任一先例职责不同(单一变化原因=违约词族增删,code-conventions §1.1),拆散塞进各表既有套件会把集中义务打散成十二处触点;独立成件是职责轴切分,不是 §5.6 强制(validate 诊断注入本不触 §5.6)。
- **唯一面**:豁免登记唯一落点 `coverage_exemptions.js`;对账唯一工具 `coverage_enum.py`(本批唯一工具改动面=`scan_screens()` 分类修正,T10);开发面过滤唯一落点=登记件 `probe_coverage_recorder.gd` 调试面边界(三处成员引用单点,§3);p_perfect 表值读取唯一经 ConfigDB 出口;同名检查函数零重复(grep 计划名逐一核过)。
- **分层与交互面**:V10 接线在 core 内经 ConfigDB 既有读法(Core 零 UI 依赖不破);V4/V11 走 AdventureRunner 真链不经 UI;探针扩面只增段不改既有段(既有动线零回归风险面=探针文件内新增);登记件过滤为纯减法(开发面子树不入账,玩家可达面登记零影响);枚举器分类修正为纯收窄(出圈件本无断言文料关联,其余四源零触碰);测试面全落 `game/tests/unit`+`game/probe`(静态扫描 S 系面外,test-conventions §1.1 三元组归位:新增单元套件+探针段)。
## 13. 禁为机检文本保留无效成员
@@ -211,7 +218,7 @@
## 14. 实现规范预算
- **新增件三查**(`schema_vocab_violation_test.gd`):①公开方法计划 8(`_ready`+7 个 `_check_*`)≤20 ✓;②成员变量计划 ≤5(夹具表句柄与 errs 收集)≤15 ✓;③迁移函数:无迁移。
- **存量触面一查**:触碰的 10 个测试件+run_all.gd(manifest 增一行)+1 个探针件均为纯增量(+1~+4 函数,零删改既有函数)——S13 键较登记值只降不升预期成立(无键新增:新增函数不涉 gdstyle 基线键面;探针/测试件不在 S9 扫描面,code-conventions §4.13)。
- **存量触面一查**:触碰的 10 个测试件+run_all.gd(manifest 增一行)+2 个探针面件(ui_click_probe 扩面段+probe_coverage_recorder 过滤判定,均纯增量+1~+2 函数零删改既有函数)——S13 键较登记值只降不升预期成立(无键新增:新增函数不涉 gdstyle 基线键面;探针/测试件不在 S9 扫描面,code-conventions §4.13);coverage_enum.py 属工具件不在 gdstyle 面(验证=最小参数全路径实跑)。
- **指标例外通道**:无申报。
## 15. 拆分边界纪律
@@ -229,19 +236,21 @@
| 0(写卡段复核分流) | 两名未参与撰写的只读子代理(Explore)分裁 B4 零命中 92 条与有命中 119 条;写卡人按普查口径与代码事实校准(推翻 2 条:skill neq/treasure cell_removal 属预留埋点;修正 7 条:ap_grant/risk/min_safe_count/indeg/terminals 等按消费事实与预留口径改判) | 裁决与代码事实的偏差(子代理未见普查报告、未查生产消费点) | 自判 | 写卡人逐条以 file:line 复核后定案(附录 A/B/C 底稿);分歧记录=`game/tests/.gates/coverage/review_scratch_b4.txt`(写卡段过程件,不入 git) |
| 1(grilling 对抗复核) | 未参与撰写的只读子代理(Explore),九审点全过+godot-master NEVER/Gotchas/性能预算对照 | ①hits 数 38/25 系事件数非键数 ②settlement.tres :29/:34 行号错位 ③action_economy.gd 跨 :64-68 ④meta_tree load_bearing 漏列附录 A(附录 A 实数 44 非 46)⑤V10 回归套件指错(settle_segments 无完美兑付断言)⑥V10 grep 判据抓不到死接线 ⑦run_all.gd manifest 触碰面漏列 ⑧回表通道三处口径不一 ⑨附录 B 草稿残留(未决问号/terminals 重复)⑩per_level_shift_pct 无验收行 ⑪「62 类」歧义 ⑫§12 复用论据半错 | 补写×9(①②③④⑤⑥⑦⑨⑩)+自判×3(⑧⑪⑫) | ①§3 改「38 次·去重 27 键/25 次·去重 19 键」②:29/:34 更正③:64-68 更正④G1 增第 17 词、真缺口实数修为 46(44+load_bearing+per_level)⑤V10 回归面改指 `seal_polarity_test.gd:330-401`⑥T2/V10 增 p_perfect=100 读数活性断言、grep 降辅证⑦结构图/T1/§12/§14 增 run_all.gd manifest 登记面⑧§4/T11 统一「名实不符=停卡呈报,回表走写卡段通道」(依据 test-conventions §8.3)⑨附录 B 残留清理⑩V16 行+T2 步骤+结构图+预算计数⑪改「62 分组中 40 组带缺口」⑫§12 论据改职责轴切分(单表 validate 诊断面先例 level_table_validate_test 在案,code-conventions §1.1) |
| 1 后(处置自查) | 写卡人(12 处置点逐条回读卡内落地) | 零残留(12/12 落地;待裁 0、退回上游 0) | 自判 | 本节即凭据;卡片成立,进入提交 |
| 2(实现段 L3 回退改判) | 用户裁决(实现报告 §6 两处 L3 呈报、写卡段呈两案后裁定);写卡段续任落实(未参与实现) | ①cell_mark_overlay 被枚举器按文件名后缀误分类为屏与模态(实体=RefCounted 绘制域件,模态断言无可观测面,V14 原形态作废);②「进入下一层」钮属调试两层模式专用(main.gd:361 仅调试模式接线),调试入口不入玩家可达测试范围——写卡段原呈两案(改判豁免/另立规格)均含豁免选项 | 待裁→用户裁决 | 用户裁(2026-11-07):两处均不豁免。①测试目的=验证其能否正常显示,走渲染通道——V14 改指渲染闸棋盘 golden(锚 test-conventions.md:100),本体清单出圈归枚举器分类修正(T10),能力行回表;②调试面在覆盖登记层过滤不入宇宙(T9+附录 C 排除面),controls 开发面 3 条豁免删除——豁免=在范围内特批不做,出圈面不占豁免;卡 §4 增第 10 条红线、§3 增现状条、估算与 roadmap 行随新任务面同步(≈8.75) |
**零待裁点,开工门=U0**(§11 两处自判依据:architecture.md「数值单一事实源」条款与 QA 报告 :47 完备性边界在案)。
---
## 附录 A:B4 真缺口明细(46 条,验证落点见 §7/§8)
## 附录 A:B4 真缺口明细(45 条,验证落点见 §7/§8)
**G1 违约词(17)**:empty_table×8(board_gen/enemy/level/meta/reward/shop/skill/status_effect——`trigger_cond_test.gd:46` 仅类别过滤非违约路径);settlement missing_segment/pperfect_oob/segorder_violation(`settlement_table.gd:23,37-38,63-64` 零负面件);feat zero_flat(`feat_table.gd:47` 零负面件);treasure zero_flat(`treasure_item_table.gd:110-112` 零负面件);meta keystone_cost(guard :147/:151 系 treasure unlock_keystone_cost 子串误命中);treasure use_phase+active_dig(schema :106-108 出域分支零注入);board_gen solver_rules+single_subset(`:57-60` frozen 分支零注入);meta_tree load_bearing(彩蛋 cap>3 违约分支零注入,`meta_tree_table.gd:65`)。
**G2 结算/秘宝数值(3)**:equivalence_ref_damage(运行时零消费、工具镜像零钉);rap_transfer_mult(接线在役、测试字面量);p_perfect(硬编码不读表——接线)。
**G3 adventure cap/配额(8)**:curio_cap ap/armor/heal/max_hp/rap/refresh/time_sand 七槽(guard :114-115 只钉 gp/attack);feat_ticket_quota(`curio_deck.gd:115` 配额满分支零测试)。
**G4 布局(2)**:ap_bar_h(`ap_bar_view.gd:35` 消费零断言);log_band_h_settle(`battle_log_view.gd:24,44,58` 消费零断言)。
**G5 天赋树(8)**:ks_workshop(零断言);ks_refresh(`tree_requires_level_test.gd:52` 仅注释);fork_sense/fork_economy(零断言);fg_economy/name_a/name_b(零断言);spine(`screen_flow_probe.gd:430` 夹具喂几何非语义)。
**G6–G9(5)**:defensive_stance(零值断言);rockfall/mine_dust(L3 零放置零断言);enemy_alert/ap_drain(合成行未读生产行,`trigger_cond_test.gd:130-133`/`seal_polarity_test.gd:772-773`);cell_mark_overlay(仅封装扫描,无实例化可见性断言);reward stacks(合成行键未读生产行)。
**G6–G8(4)**:defensive_stance(零值断言);rockfall/mine_dust(L3 零放置零断言);enemy_alert/ap_drain(合成行未读生产行,`trigger_cond_test.gd:130-133`/`seal_polarity_test.gd:772-773`);reward stacks(合成行键未读生产行)。
**出圈(非缺口非豁免)**:cell_mark_overlay——非屏与模态实体(RefCounted 绘制域件,枚举器文件名后缀误分类,2026-11-07 用户裁);显示正确性归渲染闸棋盘 golden(V14),本体清单出圈归枚举器分类修正(T10)。
**G10 换算率钉(1)**:per_level_shift_pct(运行时零消费、离线 verifier 消费端 `tools/balance_verifier.py:77-103`,值 6/9/1 零内容断言——钉值防标定漂移)。
## 附录 B:豁免登记清单(约 165 条,执行计数以尾注与 T10 登记清单为准——`tools/coverage_exemptions.js` ontology 逐 id+reason)
@@ -259,12 +268,11 @@
- 词表杂项:pity_threshold/min_safe_count(生产消费+行为承载)/atk_max/atk_min/initial_owned/per_level_gain/price_ratio_pct/type_axis/battle_ratio/fork_ways_max/rest_ratio/reward_ratio/shop_ratio/indeg/terminals/rest_heal_pct/gp_drops/price_a/pool_shelf/mult_oor_warning/round_direction/wall_band/canvas/gate_gap/hud_band_h/hotspot_key/texture_rect/log_band_h_dig/info_panel_w/info_visible_layers/curio_candidate_count/feat_ticket_chance/feat_ticket_limit/feat_ticket_pity_step/quota_segment/cap_segment/value_segment/seal_place_ap_cost/per_level_bonus/reserve_jar。
- treasure 现役词 11(use_phase 归 G1;area_3x3/board_wide/dimension_tags/load_bearing/remove_mines/passive/ap_charge_safe/charge_reset/charges_per_adventure/mine_count_preview/refresh_stock_grant/shop_refresh_bonus/unlock_keystone_cost):`treasure_effects_test`/`treasure_target_violation_test`/guard 现役承载。
> 注:per_level_shift_pct 已归附录 A 真缺口(G10);本附录为按族分组登记,T10 执行清单=重生成缺口集与本卡裁决的逐 id 差集(211−46),以登记时逐 id 清单为准。
> 注:per_level_shift_pct 已归附录 A 真缺口(G10);本附录为按族分组登记,T10 执行清单=重生成缺口集与本卡裁决的逐 id 差集(210−45——cell_mark_overlay 经枚举器分类修正出圈后的基数),以登记时逐 id 清单为准。
## 附录 C:B5 零命中裁决(并集口径:两探针 hits 归一化〔去尾序位+折叠空锚段〕后取交集)
- **排除(2 类非缺口)**:ap_bar 停手钮——iter54 卡 1 已修(数据 2026-11-06 早于合回);camp_object 七物件裸键——与场景路径键双源同物,并集后七件全命中(forge/notebook/campfire 由 screen_flow 承载)。
- **豁免·开发面(9 键)**:debug_overlay 八钮+`(root)/Button#调试`——发布态恒隐玩家不可达面。
- **排除(3 类非缺口)**:ap_bar 停手钮——iter54 卡 1 已修(数据 2026-11-06 早于合回);camp_object 七物件裸键——与场景路径键双源同物,并集后七件全命中(forge/notebook/campfire 由 screen_flow 承载);**开发面(10 键出圈,2026-11-07 用户裁非豁免)**——debug_overlay 八钮+`(root)/Button#调试`+inter 覆盖层「进入下一层」:调试面控件不入玩家可达测试宇宙,登记件按调试面边界过滤(DebugOverlay 类型+`ui.screens.inter_overlay`/`ui.screens.debug_badge` 引用单点;依据=main.gd:361「仅调试模式接线」+test-conventions.md:65 发布态恒隐);controls 豁免清单原开发面 3 条随本裁决删除——豁免语义=在玩家可达范围内特批不做,出圈面不占豁免。
- **豁免·进程终结(2 键)**:MenuScreen 退出游戏/camp_esc 退出游戏——真点即杀探针进程,按〔接线断言〕承载(既有结构断言在位)。
- **豁免·并集已覆盖(screen_flow 单侧零命中 17 键)**:status_panel 继续/settings 返回/confirm 取消·次选项/save_select 返回/forge 返回营地/图例钮/board_zone 状态/level_map 状态/树面解锁25·购买10·购买20/MenuScreen 进入存档等——ui_click 侧 hits 在案。
- **真缺口·动线扩面(十二组,T9)**:图例关闭;节点继续;curio 确认选择+继续+刷新钮;商店购买+刷新钮;秘宝架购买10/购买25/装配/升级30;树面购买0/购买30/40/60(调试注钥后真点)/先手压制(fork B 侧);弃图刷新+确认弃图(→确认弹窗);地图放弃;进入下一层;Esc 浮窗设置;减动效开关(settings 两枚 switch_toggle);cell_mark_overlay 屏断言(并入 V14)。
- **真缺口·动线扩面(十一组,T9)**:图例关闭;节点继续;curio 确认选择+继续+刷新钮;商店购买+刷新钮;秘宝架购买10/购买25/装配/升级30;树面购买0/购买30/40/60(调试注钥后真点)/先手压制(fork B 侧);弃图刷新+确认弃图(→确认弹窗);地图放弃;Esc 浮窗设置;减动效开关(settings 两枚 switch_toggle)。
@@ -0,0 +1,255 @@
# 需求卡片:封印动作改版批
> **批名**:封印动作改版批 **卡片日期**:2026-11-07 验收档:高
> **来源**:待办清单「封印动作改版——挖开与封印都揭示格子(2026-11-07 登记,来源=会话提及)」条目;用户 2026-11-07 会话三裁(①封印受理即揭示〔全揭示案〕②专长破封一击退役 ③MC 同批重锚)+封印格呈现预览用户人审通过(观感细化后置,不阻塞基线冻结)。
> **唯一事实源**:`design/gdd/systems/排雷循环/排雷玩法.md` v2.0(2026-11-07 用户裁「封印受理即揭示」);配套闭合凭据=战斗结算.md v1.9 · 地图战斗资源.md v1.7 · 行动经济.md v1.6 · 地形变异.md v1.4 · 奇物.md v1.7 · 术语表.md v1.28 · 教学引导.md(范围草案;封印首遇提示句 2026-11-07 换代)· 道具退役素材库.md 表五 · ux/battle.md「封印格呈现预览」节(Last Updated 2026-11-07)· art-bible §3.2 封印印记条与 §4.1 封印黑条(现行版)。
> **估时**:8 张 T 卡合计区间 6–10.25 个工作日,中值合计 **≈8.125 个工作日**(逐卡区间见第 9 节);**切分预案=超 10 个工作日停卡呈报用户改排**——T4/T6 均不可拆(T6 拆出违反三裁③「MC 同批重锚」;T4 拆出=改动先行落库而无当轮验收断言,违反验收闭合红线),无第三种拆法。
## 1. 目标与完成定义
这批把封印动作从「不揭示的盲承诺+可挖开改判」改成「受理即揭示、不可再挖开」:封印被受理的那一刻墙瓦片换地板、格下身份(危险格「危」/安全格数字)当场可见、封印法阵叠在其上;挖已封印的格被拒(新可辨拒绝原因),「封印后再挖开」路径整体删除;清图口径换代为「全部安全格完成=挖开或封印」。四类改动随批交付:
1. 排雷规则核心:合法性表换代(挖封印格拒绝)、封印受理揭示查询面、清图口径、批次语义序扩「能清图的挖或封」。
2. 结算与效果面:挖封印格兑付改判(四情况②④)与 `dug_under_seal` 事实词退役;标中/标空轮末判定批与封印溢价**零改动**。
3. 呈现层与探针:封印格地板+法阵+身份字形(垫色牌)渲染、悬停禁字、文案四处换代、三探针断言换代。
4. 内容与测量:破封一击退役(feats.tres 删行)、sim 自动玩家策略对齐、MC 基线锚同批重锚、golden 棋盘三图重制。
**完成定义**:本卡第 8 节对照表逐行有绿读数;改前改后 MC 配对读数落盘;golden 三图(windows)重制且渲染闸绿;批末「产出物落位卡」两件(实现报告+反哺点清单)写齐;合回后远端 CI 代码域全量绿。
## 2. 设计事实源
唯一事实源=`design/gdd/systems/排雷循环/排雷玩法.md` v2.0。本卡所有验收判据从下列闭合文档句子抄出(判据出处行锚在第 8 节逐行标注):
| 文档 | 版本 | 本批消费的判据面 |
|---|---|---|
| 排雷玩法.md | v2.0 | 动作合法性表(挖:未开、无封印;拒绝情形「已封印」)、封印受理即揭示段、清图口径(挖开或封印)、批次语义序「能清图的挖或封」、封印生命周期(无纠错路径)、验收标准「封印受理即揭示、挖封印格被拒」与「清图口径」两条 |
| 战斗结算.md | v1.9 | 授予段「封印受理即揭示」段、封印判定批兑付、验收标准「封印受理即揭示零兑付」条 |
| 地图战斗资源.md | v1.7 | 极性矩阵封印行(标中正向/标空负向+正向不兑付)、清图奖励口径句 |
| 行动经济.md | v1.6 | 价目表封印行(纠错路径不存在) |
| 地形变异.md | v1.4 | 伤害型变异条(封印揭示不触发变异伤害) |
| 奇物.md | v1.7 | 跨族桥退役段(破封一击退役、事实词除名) |
| 术语表.md | v1.28 | 「封印 / 控制」定义行 |
| ux/battle.md | 2026-11-07 | 「封印格呈现预览」节像素级判据五条+Interaction Map 封印行/已封印格行+拒绝细分 |
| 道具退役素材库.md | 表五 | 破封一击留底行(退役原因) |
| art-bible | 现行 | §3.2 封印印记占位句(已揭示格承载、数字同格合法)、§4.1 封印黑条(裸土承载对比 ≥4.5:1) |
## 3. 现状事实(代码级,开工自行复核)
核心(`game/core/minesweeper_rules.gd`,除非另注):
- 封印受理:`_do_seal_place` :447-468——扣费后仅 `_seals[c] = true`,不揭示、零事件;重复封印拒 `seal_present` :455-456。
- 挖封印格放行:`_board_face_dig` :362-372(:371 注释「封印不拦挖掘」);`_do_dig` :304-334——`was_sealed` :311/:313/:328、`_reveal_chain(c, order, was_sealed)` :331;`_reveal_chain` :341-359 载荷带 `"dug_under_seal"` :351/:358;:390 处 fx_reveal 载荷恒 false;`preview_reveal` :397-405 含封印隐式退役模拟;`_classify` :267-285 清图模拟含「本格封印视为已隐式退役」:271-275。
- 清图口径:`_safe_remaining` :101-110 与 `_cleared_after` :438-442 只认 `_revealed`,不认封印。
- 轮末判定:`_emit_seals_batch` 对在场封印逐格 `seal_judged`(标中=`_board.is_mine(c)`)——本批零改动。
- 中立移除:`remove_mines_in` :116-126 排除已揭示/有封印/非雷格——本批零改动。
结算与效果:
- `game/core/settlement/grant_segment.gd`——`dug_under_seal` 作废行 :102-103、雷事件载荷携带 :153、注释「封印格直挖照吃变异伤害」:204;`_judge_seal` :343 / `_judge_seal_hit` :352 / `_judge_seal_miss` :422(本批零改动)。
- `game/core/effect_engine.gd`——事实词表 `dug_under_seal` :55/:60。
- `game/core/reward_grant.gd`——天眼 `_safe_dig_open` 跳过封印格 :174(逻辑保留、注释换代);封印溢价消费 :216-217(零改动)。
呈现层:
- `game/presentation/views/board_view.gd`——印记可见性 `u.seal_on = seal and not revealed` :541;瓦片切换 revealed?:floor:wall :597-623;`_diggable` :301-304(未开且未移除即入可挖域,含封印格);左键分派 revealed→move 否则 dig :471-485(:483-484 注释「相邻封印格直接挖」);悬停 `board_hover.gd` :96-121(相邻封印格=挖掘光标 :109-112;:113-116 为**非相邻**封印格禁入分支);拒绝文案 `hud_presenter.gd` :169-191(`seal_present` :179 含「相邻时左键直接挖开」);图例 `legend_overlay.gd` :9-13;操作提示条 `board_zone_view.gd` :80(含 chord 退役后残留错句「同格双击 快开」)。
测试、探针、sim、数据(第 7 节文件结构图逐件列):
- 单元:`minesweeper_rules_test.gd`(`_test_dig_face_rules` :72-84 断言 `target_revealed`;`_test_seal_place` :101-111;preview 形态 B :122-161;判据锚 :73/:88/:102/:115);`seal_polarity_test.gd`(末点 AP 封印收轮 :46-82;封印不可逆四情况组 :579-651;资源资格面 :778-826);`settlement_wiring_snapshot_test.gd` 内嵌 golden(`"seals": 1`/`"revealed": 42` 等计数);`hud_presenter_test.gd` :29-30 与 `player_copy_sweep_test.gd` :69-82/:144-147(文案逐字);`adventure_feats_test.gd` :721-723(破封一击 `dug_under_seal`);`effect_words_t1_test.gd` :16-33(词表在册断言;:37-71 为封闭性后段)。
- 探针:`ui_input_probe.gd`(case④ 右键封印 :273-281、case④b 印记落位断言 :282-286、目标选取排除封印格 :230-242/:522-540/:601-608);`board_shot_probe.gd`(封印取证选择器 `has_seal and not is_revealed` :78/:191);`ui_click_probe.gd`(行为②撤封印 :1063-1069 恒假死路;随机封印行为① :1055-1062;图例行断言 :899-908)。
- sim:`auto_player.gd`(choose_dig 跳封印格 :20;已证雷先封后挖 :38-50/:86-97;`_constraints` 封印位计入已知雷约束 :162-185);`level_autoplay.gd`(「标雷误挖」滑失注入 :507-521——封印意图按概率转成同格挖意图)。
- 数据:`game/data/tables/feats.tres` :622 起「破封一击」行(feat_id=`breaker_strike` :623,display_name 行 :624);`game/data/tables/adventure.tres` feat_ticket_* 概率行(:46-49,本批不动);golden 基线 `game/tests/golden/`(board_L1/L2/L3 × windows/mac 六件+palette_baseline)。
- 存档:`breakpoint_store.gd` 28 键(BREAKPOINT_FIELDS :16-45)无格子状态键、停点粒度=节点级——**本批存档零改动**(同种子重放重建棋盘态)。
## 4. 设计契约(违反即返工;🔴 触碰=L3 停机呈报)
- 🔴 **语义唯一裁决=排雷玩法.md v2.0**:封印受理即揭示、挖封印格被拒、清图口径(挖开∪封印)、标中/标空轮末判定、印记无撤下手段。实现不得自造第三条路;实现与文档冲突=上游缺陷,停卡退回。
- 🔴 **事件集合封闭**:封印保持零事件——不新增事件、不发 `cell_revealed`;身份可见性走新增只读查询面,消费方=**呈现层+sim 策略域(测量侧镜像玩家可读信息)**,禁扩到战斗结算等兑付面。增删事件=接口修订,本批不做。
- 🔴 **数值单一事实源**:`action_economy.tres`(ap_per_round/dig_ap_cost/seal_place_ap_cost)、`settlement.tres`(seal_hit_premium/p_perfect/甲效/掷点)零改动;本批数据表改动仅限 `feats.tres` 删破封一击行与池引用清零核对。
- 🔴 **Core 零 UI 依赖、fail-fast、RNG 单点**:本批零新随机源;数据校验错误一律致命中止。
- 🔴 **兑付面零漂移**:标中正向(含溢价 ×(1+δ))、标空负向、完美封印双份、清图批、挖格批的既有结算行为,除删除 `dug_under_seal` 改判路径外逐位不变——MC 改前改后配对读数兜底。
- **拆分边界纪律**:本批零拆出单元(纯规则换代+删径),禁顺手重构;删径代码(`was_sealed` 一族、`dug_under_seal` 词与载荷键)必须删净,**禁为迎合机检消息文本保留无效成员/别名**(code-conventions §1.1 同款);机检键与卡片契约互斥时一律停卡呈报。
## 5. 范围边界
**做**:第 1 节四类改动面;`smoke/critical-paths.md` 人工 QA 清单第 4 条改写(原文「封印/撤封印/挪封印」随 seal_pull 退役早已过时——顺带修);`board_zone_view.gd` 提示条 chord 残留错句「同格双击 快开」顺带修(同文件触碰面)。
**不做**(明示不收件,去向):封印格观感细化(用户 2026-11-07 裁后置——**已登记待办清单**「封印格观感细化(2026-11-07 登记)」条,实现批不做);「结算明细文案入表」批(待办清单在册,文案承载面换代不混批);键盘/手柄输入(Beta);存档 schema(零改动);MC 读数的数值调参(重锚只换代锚,不做数值裁决——数值标定窗口另批)。
## 6. 关联文档同步面
| 文档 | 关联点(本批实现改变它的哪条陈述) | 同步义务 |
|---|---|---|
| 排雷玩法.md v2.0/战斗结算.md v1.9/地图战斗资源.md v1.7/行动经济.md v1.6/地形变异.md v1.4/奇物.md v1.7/术语表.md v1.28/ux/battle.md/art-bible §3.2·§4.1/道具退役素材库.md 表五 | 本批实现的就是这些句子;设计面已随本卡同区前置修订 | 设计权威文档——实现批**禁改**;实现与文冲突=停卡退回,差异走反哺点 |
| 教学引导.md(范围草案) | 「封印是一次性承诺的首遇提示」条 | **已随本批修订**(2026-11-07 提示句换代为新口径);实现批禁改 |
| game/tests/README.md(能力清单) | 第 8 节能力行清单:3 行换代、1 行删除、2 行新增、覆盖域表 1 行换代 | **已由写卡批同区维护**(随本卡合入);实现批禁写该文件;批末只核对表上名字与实际落地一致(改名回表) |
| smoke/critical-paths.md | 第 4 条人工 QA 清单句 | 随 T4 改写(game/tests/ 面文件,随批可改) |
| 反哺点预期 | 设计面已前置闭合 | 预期**零反哺点**;实现期发现文档缺陷才列 `reports/iter<N>-反哺点-<日期>.md` |
## 7. 文件结构图(本批新建/修改的文件逐件列;行为改动行标注对照表行号)
| 文件 | 职责与改动 | 行为改动 | 复用/新增 |
|---|---|---|---|
| game/core/minesweeper_rules.gd | 合法性换代(挖封印格拒 `target_sealed`)、删 `was_sealed` 一族与 `dug_under_seal` 载荷键、`_do_seal_place` 受理后清图判定接行动经济、`_safe_remaining`/`_cleared_after` 口径换代、`_classify` 语义序扩封印清图预判、`preview_reveal` 删封印形态、新增公开只读查询 `sealed_identity(c)` | R1 R2 R3 R4 R6 R7 | 全修改(新增 1 公开方法——落位预检见第 12 节) |
| game/core/action_economy.gd | 新增公开方法 `notify_cleared()`(封印路径清图事实上报——轮末仲裁与 `request_dig` 的 cleared 语义同源) | R3 | 修改(新增 1 公开方法) |
| game/core/settlement/grant_segment.gd | 删 :102-104 作废行、:153 载荷键、:204 注释句 | R6 | 修改 |
| game/core/effect_engine.gd | 事实词表删 `dug_under_seal`(:55/:60)+提取面清零 | R7 | 修改 |
| game/core/reward_grant.gd | :174 跳封印格注释换代(逻辑保留) | 非行为改动(注释) | 修改 |
| game/presentation/views/board_view.gd | `seal_on = seal`、封印格地板瓦片+身份字形(垫色牌)、`_diggable` 排除封印格、左键封印格零动作 | R8 R9 | 修改 |
| game/presentation/views/board_hover.gd | 封印格悬停=禁止光标+说明 | R9 | 修改 |
| game/presentation/hud_presenter.gd | `seal_present` 文案换代+新增 `target_sealed` 文案 | R10 | 修改 |
| game/presentation/views/legend_overlay.gd | 图例封印行重写(受理即揭示口径) | R10 | 修改 |
| game/presentation/views/board_zone_view.gd | 提示条换代+chord 残留错句顺带修 | R10 | 修改 |
| game/data/tables/feats.tres | 删「破封一击」行(:622 起,feat_id=breaker_strike)+全仓引用清零 | R7 | 修改 |
| game/tests/unit/core/minesweeper_rules_test.gd | 挖已揭示拒绝保留;新增挖封印格被拒/受理揭示/清图口径断言;preview 形态 B 删;判据锚刷新 | R1 R2 R3 | 修改 |
| game/tests/unit/battle_settlement/seal_polarity_test.gd | 四情况组重写(挖封印格两情况→被拒负面断言);末点 AP 收轮/seal_pull 出目录/标中标空判定/资源资格面保留 | R2 R5 R6 | 修改 |
| game/tests/unit/battle_settlement/settlement_wiring_snapshot_test.gd | 内嵌 golden 重录(seals/revealed 计数漂移) | R6 | 修改 |
| game/tests/unit/presentation/hud_presenter_test.gd、player_copy_sweep_test.gd | 文案断言换代 | R10 | 修改 |
| game/tests/unit/core/adventure_feats_test.gd、effect_words_t1_test.gd | 破封一击断言退役、词表断言换代 | R7 | 修改 |
| game/tests/unit/presentation/seal_mark_params_test.gd | 迷雾门控断言前提换代(印记承载面) | R8 | 修改 |
| game/probe/ui_input_probe.gd、board_shot_probe.gd、ui_click_probe.gd | case④b 印记落位断言换代、取证选择器换代、撤封印死路段清理 | R8 R9 | 修改 |
| game/tests/smoke/critical-paths.md | 第 4 条改写 | 非行为改动(清单句) | 修改 |
| game/sim/auto_player.gd、level_autoplay.gd | 约束集对齐、滑失注入退役 | R11 | 修改 |
| game/tests/golden/(board_L1/L2/L3 ×2 平台) | 渲染基线重制 | R12 | 基线资产换代 |
| sim-data/(MC 锚) | 改前锚留盘、新锚同 seed0 采集+现行锚指针换代 | R11 | 数据产物换代 |
| sim-data/README.md | 「现行锚」指针节换代+旧锚迁历史锚节 | R11 | 修改(入库件,不在实现批禁写清单) |
**对照表按行号引用第 8 节;表内 R 编号与第 8 节逐行对应。**
## 8. 验证闸(改动—验收对照表)
每行七格:需求点|改动|验收测试(名称+落点+尾缀〔封印改 Vn〕)|层级|真实入口|判据绑定面|能力行。判据出处行锚=需求点格内 `文档:行号`,已按本批修订后的 worktree 行号钉死(可 grep 核对)。
| # | 需求点(判据出处行锚) | 改动 | 验收测试 | 层级 | 真实入口 | 判据绑定面 | 能力行 |
|---|---|---|---|---|---|---|---|
| R1 | 封印受理即揭示——身份当场可查、受理零兑付零事件(design/gdd/systems/排雷循环/排雷玩法.md:52) | `_do_seal_place`+`sealed_identity(c)` 新查询面 | `minesweeper_rules_test.gd:_test_seal_reveal_identity`〔封印改 V1〕:封印受理后 `sealed_identity(c)` 返回 `{kind, digit}` 与板事实逐位一致;`settle_batch` 事件流零 `cell_revealed`(受理零兑付的结算侧证据由 R6 行覆盖) | 单元 | `MinesweeperRules.settle_batch()` | `sealed_identity` 返回值+事件流计数+结算行数 | 新增:封印受理即揭示(身份可查、受理零事件) |
| R2 | 挖已封印格被拒、原因可辨、零副作用(design/gdd/systems/排雷循环/排雷玩法.md:56) | `_board_face_dig` 增封印拒绝 | `minesweeper_rules_test.gd:_test_dig_sealed_rejected`〔封印改 V2〕:`sub_reason=="target_sealed"`、`has_seal`/`is_revealed`/AP 三态零变化;`seal_polarity_test.gd` 四情况组内原「直挖受理」断言改判为拒绝 | 单元 | `MinesweeperRules.settle_batch()` | 拒绝原因串+状态源取值 | 既有:挖/封印合法性与可辨拒绝(拒绝零副作用、挖封印格被拒) |
| R3 | 清图口径=已挖∪已封印;封印可完成清图;封印后清图判定触发(design/gdd/systems/排雷循环/排雷玩法.md:139) | `_safe_remaining`/`_cleared_after` 换代+`_do_seal_place` 清图接 `ActionEconomy.notify_cleared()` | `minesweeper_rules_test.gd:_test_clear_by_seal`〔封印改 V3〕:封掉最后安全格→`clear_map_cleared()` 翻 true 且轮次以清图收束(轮末事件 carry 清图);封掉非末安全格→`clear_map_cleared()` 仍 false、再挖开其余安全格后清图照常触发 | 单元 | `MinesweeperRules.settle_batch()` | 公开读数 `clear_map_cleared()`+轮次结束事件载荷 | 新增:清图口径换代(挖开∪封印、封印可完成清图) |
| R4 | 批次语义序「能清图的挖或封最优先」(design/gdd/systems/排雷循环/排雷玩法.md:166) | `_classify` 封印清图预判 | `minesweeper_rules_test.gd:_test_classify_seal_clears`〔封印改 V4〕:同批「耗尽前停手+能清图的封」提交,赢家=清图高光而非停手 | 单元 | `MinesweeperRules.settle_batch()` | 结算赢家类别 | 既有:挖/封印合法性与可辨拒绝(拒绝零副作用、挖封印格被拒) |
| R5 | 标中/标空轮末判定批与溢价逐位不变(design/gdd/systems/战斗循环/战斗结算.md:139) | 判定批零改动(回归保护) | `seal_polarity_test.gd` 保留断言原样跑绿(末点 AP 收轮、标中兑付+溢价 125%、标空负向+归因行、完美封印双份);保留组各函数补判据出处注记行(`# 判据出处: design/gdd/systems/战斗循环/战斗结算.md:139 …〔封印改 V5〕`——尾缀 grep 载体)〔封印改 V5〕 | 单元 | `BattleOrchestrator.begin_battle()` 全轮驱动 | 结算行流逐项 | 既有:封印与极性路由/不可逆 |
| R6 | 受理当场零兑付、改判路径死(design/gdd/systems/战斗循环/战斗结算.md:134) | grant_segment 删改判面 | `settlement_wiring_snapshot_test.gd` golden 重录〔封印改 V6〕:同种子驱动序内「挖+封+停」行流/快照逐位对拍新 golden;流水零「奖励作废(封印格直接挖开)」行 | 单元 | `BattleOrchestrator` 真实驱动序 | 内嵌 golden 逐位 | 既有:封印与极性路由/不可逆 |
| R7 | 破封一击退役、`dug_under_seal` 事实词除名(design/gdd/systems/冒险循环/奇物.md:72) | feats.tres 删行+词表删+断言退役 | `adventure_feats_test.gd` 破封一击断言删;`effect_words_t1_test.gd` 词表断言换代〔封印改 V7〕;`grep dug_under_seal game/ 全域=0`;抽取池引用清零核对 | 单元+静态 | feats.tres 装载路径 | 表行缺席+词表缺席 | 既有:换图系刷新链路与效果词表接线 |
| R8 | 封印格呈现:地板+法阵+身份字形垫色牌(design/ux/battle.md:170) | board_view 渲染换代 | `seal_mark_params_test.gd:_test_seal_on_revealed_visible` 新增断言〔封印改 V8〕:`seal_on` 与已揭示同真时印记子件仍可见(新组合态;直读 CellUnit 子件可见性=受控例外——该行为无公开可观测面可钉,随行申报)+`ui_input_probe.gd` case④b 换代:真输入右键封印后印记子件可见且身份字形可查 | 探针 | 真实实例化场景+`push_input` 右键 | `seal_on` 供数表达式+子件可见性 | 既有:棋盘封印印记呈现(已揭示格承载+已封印格零动作) |
| R9 | 已封印格无动作:左/右键零意图、悬停禁止+说明可见(design/ux/battle.md:299) | board_view 输入分派+board_hover | `ui_input_probe.gd` 新增 case〔封印改 V9〕:真输入左/右键已封印格→`action_requested` 零发射、光标态=禁止、悬停说明在册可见(措辞按白名单 2 润,断言钉在册) | 探针 | 真实实例化场景+`push_input` | 信号发射面零计数+说明可见性 | 既有:棋盘封印印记呈现(已揭示格承载+已封印格零动作) |
| R10 | 文案换代四件(design/ux/battle.md:284) | hud_presenter/legend/board_zone_view | `hud_presenter_test.gd`/`player_copy_sweep_test.gd` 断言换代〔封印改 V10〕+`ui_click_probe.gd` 图例行断言换代 | 单元+探针 | 文案装配函数+真实场景 | 逐字串断言 | 既有:挖/封印合法性与可辨拒绝(拒绝零副作用、挖封印格被拒) |
| R11 | sim 策略对齐+MC 基线锚同批重锚(design/gdd/systems/排雷循环/排雷玩法.md:52——策略镜像玩家可用的揭示面;同批重锚授权=用户 2026-11-07 裁) | auto_player/level_autoplay 换代+「标雷误挖」注入退役+等价补偿注入重标定(用户 2026-11-07 裁③) | MC 重锚:改前锚留盘,新锚同 seed0 采集落盘,逐项对比读数写实现报告〔封印改 V11——载体=实现报告对照表行+重锚提交说明,独立审计按报告核对〕;补偿注入后普通档踩雷读数对齐改前锚量级 | 测量 | sim 采集链(master_seed 配对) | 改前改后读数差分(留盘) | 既有:挖/封印合法性与可辨拒绝(拒绝零副作用、挖封印格被拒) |
| R12 | 渲染基线换代(design/ux/battle.md:170) | golden 三图重制 | 渲染闸绿+新基线采集前用户对照预览图确认一眼(test-conventions §8.2 口径);mac 三件缺则记遗留(闸 SKIP 不判红)〔封印改 V12——载体=实现报告对照表行+基线刷新提交说明,独立审计按报告核对〕 | 渲染闸 | 真实渲染截图 | 逐像素基线比对 | 既有:棋盘封印印记呈现(已揭示格承载+已封印格零动作) |
**测试方式两分法**:R1-R7、R10 能力验证=调试接口直调核心写口构造局面(不走正常积累流程);R8、R9、R12 体验验证=用户目检项登记实现报告目检总清单(登记不阻塞):封印受理瞬间揭示的观感、封印格悬停禁字、图例新句、清图高光在封印完成时触发。
**闸口径**:本批改动含 `game/` 非文档行为载体 → 批末跑代码域闸(域划分唯一出处=`tools/run_all_gates.sh`);批末四闸语义=「代码域闸全绿+改前改后 MC 读数对拍落盘」。回归措辞照模板:里程碑步出口跑一次全套闸;波内修复只做出红最小单元最窄确认;新增测试先行孤立验证再并入。
**测试削弱申报**:允许改判的旧断言仅限本卡点名的四处——①`seal_polarity_test` 四情况组「直挖受理/隐式退役/零兑付」断言(语义被用户裁替换)②`minesweeper_rules_test` preview 形态 B 组(前提消失)③`hud_presenter_test`/`player_copy_sweep_test` 文案逐字断言(文案换代)④`settlement_wiring_snapshot` 内嵌 golden(计数漂移)。其余削弱=独立验收审计判红。
**独立验收审计**:`reports/iter<N>-验收审计-<日期>.md`,未参与实现的会话或子代理执行,验收档=高(全量:对照表逐行核对、判据绑定面抽查、削弱检查逐处、直查例外逐条、最窄测试抽查复跑)。
## 9. 任务卡 T0..T7
**T0 开工与基线读数**(0.25–0.5 日,中值 0.375)
- [ ] 建 worktree+拷 `.godot/` 导入缓存与字体边车+**自主区拷现行 MC 锚 jsonl 入本区 sim-data/**(锚不入 git,worktree 冷检无此件)+`git status` 归属核对
- [ ] S13 键读数:本批触碰的存量文件(minesweeper_rules/action_economy/grant_segment/effect_engine/board_view/board_hover 等)对照 `tools/gdstyle_baseline.txt` 登记——预期只降不升(删径只减成员),超预期即停
- [ ] MC 改前读数确认:现行锚文件在盘、seed0 记录在案(只核对,禁补跑)
**T1 排雷规则核心换代**(1.5–2.5 日,中值 2.0)|取用:无|产出:`sealed_identity(c) -> Dictionary`(minesweeper_rules.gd 公开只读)、`ActionEconomy.notify_cleared()`(action_economy.gd 公开)
- [ ] `_board_face_dig` 增封印拒绝(`target_sealed`,置于已揭示检查之后、中立移除之前),删 :371 放行注释
- [ ] `_do_dig`/`_reveal_chain`/`preview_reveal`/`_classify` 删 `was_sealed` 一族与 `dug_under_seal` 载荷键(`_reveal_chain` 去第三参)
- [ ] `_do_seal_place` 受理后:`_seals[c]=true` 照旧+清图判定(`_cleared_after({})` 换代口径)成立→`action_economy.notify_cleared()` 走清图收轮;末点 AP 耗尽路径保持现行收轮序(先封印判定后轮次结束)
- [ ] `_safe_remaining`/`_cleared_after` 换代:安全格完成=已揭示或已封印
- [ ] `_classify` 增「能清图的封」归最先类(模拟封印受理后清图口径)
- [ ] 新增 `sealed_identity(c)`:封印格返回 `{kind, digit}`(`reveal_record` 契约不动——未开仍 `{}`,已开格消费面零扰动)
- [ ] 验收步骤:R1/R2/R3/R4 断言孤立跑绿(读数进本步提交信息)
**T2 结算与效果面退役**(0.5–1 日,中值 0.75)|取用:T1 载荷换代|产出:结算载荷无 `dug_under_seal`
- [ ] grant_segment.gd 删 :102-104 作废行块、:153 载荷键、:204 注释句
- [ ] effect_engine.gd 事实词表删 `dug_under_seal`(:55/:60)+提取面清零
- [ ] reward_grant.gd :174 注释换代(跳封印格逻辑保留——封印格不代开)
- [ ] 验收步骤:R6/R7 断言绿+`grep -r dug_under_seal game/`=0
**T3 呈现层换代**(0.75–1.25 日,中值 1.0)|取用:T1 `sealed_identity`|产出:封印格渲染与输入分派
- [ ] board_view.gd:`u.seal_on = seal`;瓦片切换 sealed→地板;封印格身份字形=数字/「危」垫现行色牌件(读 `sealed_identity`);`_diggable` 排除封印格;左键封印格零发射
- [ ] board_hover.gd:封印格悬停=禁止光标+说明(:109-112 相邻分支内的封印格豁免删——封印格改落 :113-116 禁入分支)
- [ ] hud_presenter.gd:`seal_present` 句换代+`target_sealed` 新句;legend_overlay.gd 图例封印行重写;board_zone_view.gd 提示条换代+chord 错句顺带修
- [ ] 验收步骤:R8/R9/R10 单元侧断言绿(探针断言随 T4 全链跑)
**T4 测试与探针换代**(1.5–2.5 日,中值 2.0)|取用:T1-T3 全部签名|产出:全套件换代绿
- [ ] minesweeper_rules_test:新增 V1-V4 四函数、preview 形态 B 删、判据锚刷新
- [ ] seal_polarity_test:四情况组重写(保留组原样)
- [ ] settlement_wiring_snapshot_test:golden 重录
- [ ] hud_presenter_test/player_copy_sweep_test/seal_mark_params_test/adventure_feats_test/effect_words_t1_test 换代
- [ ] ui_input_probe(case④b+新 case V9)/board_shot_probe(选择器)/ui_click_probe(行为②清理+图例行)换代
- [ ] smoke/critical-paths.md 第 4 条改写
- [ ] 验收步骤:改过的套件与探针逐件孤立跑绿后并入全套(读数进提交信息)
**T5 内容退役**(0.25–0.5 日,中值 0.375)|取用:无|产出:破封一击零引用
- [ ] feats.tres 删「破封一击」行(:622 起);grep 全仓 `破封`/`breaker_strike` 清零
- [ ] 验收步骤:数据装载冒烟绿+R7 断言绿
**T6 sim 域换代+MC 同批重锚**(0.75–1.25 日,中值 1.0)|取用:T1 查询面|产出:新 MC 锚落盘
- [ ] auto_player:`_constraints` 用 `sealed_identity` 已知身份、choose_dig 跳封印格保持、注释换代
- [ ] level_autoplay:「标雷误挖」注入退役(用户 2026-11-07 裁③);新增等价补偿注入——推荐形态「错触直挖」(普通档对已判雷格按新常量概率直接挖,新规则下合法路径),常量初值以改前锚普通档踩雷读数为标定目标,偏差记实现决定
- [ ] MC 重锚:改前锚留盘禁补跑;新锚同 seed0 采集(档位与总量按 sim-data/README「MC 采集档位表」——用户 2026-11-07 已授权同批重锚=发起权在案);改前改后逐项对比写实现报告
- [ ] 验收步骤:R11 读数落盘;重锚后旧锚退役入档
**T7 golden 重制与批末收口**(0.5–0.75 日,中值 0.625)|取用:T1-T6 全绿|产出:新基线+两份产出物
- [ ] 用户对照 ux/battle.md 预览图确认一眼后,`tools/golden_baseline_refresh.sh` 重制棋盘三图(windows);mac 三件随批尽力、缺则记遗留(渲染闸 SKIP 不判红)
- [ ] MC 新锚携回主区:新锚 jsonl 拷入主区 `sim-data/`(数据件不入 git,合并不携带);`sim-data/README.md` 现行锚指针随批合回、旧锚迁历史锚节
- [ ] 渲染闸绿;批末核对:改动面×改完即测读数逐面对账、能力行名字与落地一致(改名回表)
- [ ] `reports/iter<N>-实现报告-<日期>.md`+`reports/iter<N>-反哺点-<日期>.md`(预期零条——设计面已前置闭合)
## 10. 异常分级
- **L1 自救**:闸红一次重试(导入缓存类在册坑按坑册处置)。
- **L2 记录继续**:连续 3 次同红灯升级;golden 逐像素差异落棋盘裁剪区→按加严口径显式呈报、由用户定重制(不自行回退基线)。
- **L3 停机写报告等用户**:①实现与排雷玩法.md v2.0 冲突(上游缺陷)②MC 重锚读数显示结算面非预期漂移(溢价/标空/完美封印任一逐位不齐)③机检预算与卡片契约互斥(禁自造第三条路)④feats.tres 删行引发装载期 fail-fast(池结构校验红)。
## 11. 代拍板白名单(微决策逐条列;超清单记实现报告「实现决定记录」)
1. 拒绝原因英文串定名(`target_sealed`;卡内已钉,拼写微调需同步 R2 断言——保持卡串优先)。
2. 拒绝/悬停 toast 与图例的最终措辞(语义按 ux/battle.md 各句,字句可润)。
3. 测试函数命名与断言组织细节(对照表点名函数名优先)。
4. 色牌、装饰裂纹等渲染细节取现行 ui_kit/art-bible 现行值,零新常量。
5. sim 补偿注入的形态与常量初值(「标雷误挖」退役后的重标定补偿——标定目标=改前锚普通档踩雷读数;只动 sim 常量、不动玩法数值),记录进实现决定。
6. mac golden 三件缺件时记遗留的处理顺序。
## 12. 落位与可复用性预检
**新增件两件(仅此两件),其余全为修改既有件**:
| 新增 | 为什么不能复用既有 | 落点唯一性核查 |
|---|---|---|
| `MinesweeperRules.sealed_identity(c)` | `reveal_record(c)` 契约=未开返回 `{}`(board_view 已开格渲染消费此语义,:494/:564 注释在案)——改它会扰动全部已开格渲染判定;身份揭示是封印态专用读数 | grep `sealed_identity` 全仓=0(新名);落 minesweeper_rules.gd 查询面区(`reveal_record`/`is_revealed` 同区),单一事实出处 |
| `ActionEconomy.notify_cleared()` | `request_dig(chain_size, clears)` 的 cleared 语义绑定挖掘计费流程;封印不产挖掘计费,硬塞会引入假挖掘记账;清图事实需要独立上报口 | grep `notify_cleared` 全仓=0(新名);轮末仲裁 owner=action_economy(架构归属),落点唯一 |
**复用面**:封印法阵渲染复用 `SealMarkLayer` 参数化绘制(零新美术);身份字形复用既有数字/「危」绘制与色牌件;轮末判定/溢价/完美封印/中立移除全复用既有实现。**唯一面**:清图口径只在 `_safe_remaining`/`_cleared_after` 两处同源换代(私有共享计数 helper),禁第三处重复实现;`target_sealed` 词串只在规则引擎定义一处、呈现文案映射一处。**分层与交互**:呈现读身份走既有 `_minesweeper` 引用通道(board_view 现行只读惯例),不经组合根新增接线;`notify_cleared` 只由 rules 在封印受理后调用(写调用经批次入口,Core 内部纵向调用,零 UI 依赖)。
## 13. 禁为机检文本保留无效成员
本批删径面(`was_sealed` 参数与分支、`dug_under_seal` 事实词/载荷键/提取面、`_reveal_chain` 第三参、作废行块、滑失注入段)必须删净;**禁止**为保 S 系扫描键、断言尾缀计数或任何机检消息文本而保留无效成员、空壳函数或别名。机检键与本卡契约互斥时一律停卡呈报,不自造第三条路。
## 14. 实现规范预算
**零新增文件**。新增公开方法 2 个(`sealed_identity`、`notify_cleared`)——两宿主现行公开方法数远低于 20 上限(T0 读数核对);新增类变量 0。**迁移函数**:无(删径不搬移)。**存量触面**:第 7 节全部修改文件在 T0 逐件读 S13 键,预期只降不升(删成员只减);`_reveal_chain` 签名变更属参数删除,分支数不升。**指标例外申报**:无。
## 15. 复核记录
| 轮次 | 复核者身份 | 发现 | 去向 | 处置结果 |
|---|---|---|---|---|
| 1 | 只读子代理(对抗复核,未参与本卡与文档撰写) | F1 教学引导.md:58 首遇提示句仍是「左键直接挖开」旧口径——本批 grep 词面(挖开封印/四情况等)扫不到「左键直接挖开」词形 | 退回上游 | 设计段(本批同区)已修:教学引导.md:58 提示句换代为受理即揭示口径;卡头闭合凭据与第 6 节同步面补列教学引导.md |
| 1 | 同上 | F2 「标雷误挖」滑失注入退役前提失真——注入是封印意图提交前转同格挖意图,目标格当时未封未揭,新规则下该挖仍合法可执行;注入与被删路径无行为耦合 | 待裁 | **用户 2026-11-07 裁③退役+重标定补偿**:T6/R11/白名单 5 已改写——旧注入退役,新增等价补偿注入(推荐形态「错触直挖」),常量以改前锚普通档踩雷读数为标定目标 |
| 1 | 同上 | F3 R5 行锚 :146 实为兑付形态表头行,不支撑判定批判据 | 自判 | R5 行锚改 战斗结算.md:139+:126(判定批行+溢价注记行) |
| 1 | 同上 | F4 🔴 事件封闭条「消费方只有呈现层」与 T6 sim 消费 `sealed_identity` 自相矛盾 | 自判 | 🔴 句改为「消费方=呈现层+sim 策略域(测量侧镜像玩家可读信息),禁扩到兑付面」 |
| 1 | 同上 | F5 估时上界实为 10.25 非 10(八卡上界合计);切分预案与三裁③及验收闭合红线打架 | 自判 | 头部估时上界改 10.25;切分预案改「超 10 停卡呈报用户改排」并写明 T4/T6 不可拆依据 |
| 1 | 同上 | F6 能力行换代承诺未兑现(README 零改动,五锚点全旧文) | 自判 | 写卡段已实做:3 行换代(:88/:117/:120)、1 行删除(旧「封印不可逆与挖开封印格放行」行)、2 行新增(受理即揭示/清图口径)、覆盖域表排雷玩法行换代 |
| 1 | 同上 | F7 「登记待办清单『封印格观感细化』」实际未登记,后置决定悬空 | 自判 | 已登记待办清单条目(封印格观感细化,2026-11-07,待美术设计〔备选〕);卡 §5 措辞改事实句 |
| 1 | 同上 | F8 两处现状失准:board_view reveal_record 消费注释在 :494/:564 非 :80;断点键 28 个非 27 | 自判 | 卡 §12 与 §3 两处已改;「存档零改动」结论不变 |
| 1 | 同上 | F9 V5/V11/V12 三尾缀无 grep 载体(保留断言旧尾缀/sim 不进扫描面/渲染闸无断言体) | 补写 | R5 补判据出处注记行载体;R11/R12 明写载体=实现报告对照表行+提交说明(独立审计按报告核对) |
| 1 | 同上 | F10 R1「grant 批零新兑付行」与该行真实入口(rules 夹具无结算面)不匹配 | 补写 | R1 判据改注「受理零兑付的结算侧证据由 R6 行覆盖」 |
| 1 | 同上 | F11 MC 锚数据件不入 git——worktree 冷检无锚、合并合回不携带、sim-data/README.md 指针换代面缺位 | 补写 | T0 加「自主区拷现行锚」步骤;T7 加「新锚携回主区+README 指针随批合回+旧锚迁历史节」;第 7 节补 sim-data/README.md 行 |
| 1 | 同上 | F12 对照表注记缺口:board_view 行缺 R9 标注、rules 行缺 R6/R7 归属、R8 子件直查未申报受控例外 | 补写 | 三处已补(board_view 行标 R8 R9;rules 行标 R1-R4/R6/R7;R8 行随行申报受控例外理由) |
| 1 | 同上 | F13 悬停说明文案(ux/battle.md:299)无断言载体 | 补写 | R9 收编「悬停说明在册可见」断言(措辞按白名单 2 润) |
| 1 | 同上 | 核实通过面:九文档行锚逐一实核、15+ 处现状 file:line 全对、`sealed_identity`/`notify_cleared` 全仓零命中、引擎三查(NEVER list/Gotchas/性能预算)零触碰、MC 纪律与渲染闸 mac 缺件 SKIP 语义一致 | 自判 | 不改+依据:实核通过,记录在案供审计追溯 |
| 2 | 卡修批复核(2026-11-07,写卡段核对+子代理逐行实读) | F14 board_hover 行锚失位——「相邻封印格=挖掘光标 :113-116」实为非相邻封印格禁入分支,相邻封印格挖掘光标在 :109-112 | 补写 | §3 锚改 :109-112 并注明 :113-116 为非相邻禁入分支;T3 步骤钉死删分支对象(:109-112 内的封印格豁免,删后封印格落 :113-116 禁入分支) |
| 2 | 同上 | F15 feats.tres 行锚偏差——破封一击行块自 :622 起、feat_id=`breaker_strike` 在 :623(:624 是 display_name 行) | 补写 | §3/§7/T5 改锚并补 feat_id;T5 grep 清零词补 `breaker_strike` |
| 2 | 同上 | F16 player_copy_sweep_test.gd 文案逐字断言实际在 :144-147(卡写 :125-140 是夹具构造循环) | 补写 | §3 改锚 |
| 2 | 同上 | F17 adventure_feats_test.gd/effect_words_t1_test.gd 实际在 game/tests/unit/core/ 而非卡内所写 unit/battle_settlement/ 路径 | 补写 | §7 路径改正(§3 引用不带路径,不受影响) |
| 2 | 同上 | F18 effect_words_t1_test.gd :37-71 实为封闭性后段,词表在册断言在 :16-33 | 自判 | §3 锚改 :16-33 |
| 2 | 同上 | F19 §5 不做清单引「结算明细文案入表(待办清单在册)」失实——该条目当时待办清单缺册 | 补写 | 本卡修批已补登记待办清单条目「结算明细文案入表」(2026-11-07,批次移交,待文档设计),§5 引用随登记成立 |
复核结论:待裁类 1 条(F2)已经用户裁决(2026-11-07 裁③退役+重标定补偿)并落卡;轮 1 自判 5、补写 5、退回上游 1 全部处置;轮 2(卡修批)六发现全处置(补写 4、自判 2)、零待裁——**卡片修订成立**。
@@ -1,16 +1,16 @@
# 需求卡片:棋盘瓦片与立体表现重做批
> 来源:`待办清单.md`「棋盘瓦片与立体表现重做」(2026-11-07 登记)。
> **设计事实源(唯一事实源)**:`design/art/art-bible.md` v3.50 §1.4/§3.2/§4.1「三关棋盘环境八色」/§6.3/§7/§8.2+`design/ux/battle.md`(Last Updated 2026-11-07)「Layout Zones」D 区行/「D 区布局与棋盘画法预览」+`design/gdd/systems/表现与支撑/HUD框架.md`(2026-11-07)D 区行与字号下限+`game/tests/golden/README.md`「越格口径」。
> **设计事实源(唯一事实源)**:`design/art/art-bible.md` v3.51 §1.4/§3.2/§4.1「三关棋盘环境八色」/§6.3/§7/§8.2+`design/ux/battle.md`(Last Updated 2026-11-07)「Layout Zones」D 区行/「D 区布局与棋盘画法预览」/「封印格呈现预览」+`design/gdd/systems/表现与支撑/HUD框架.md`(2026-11-07)D 区行与字号下限+`game/tests/golden/README.md`「越格口径」。
> **验收档:中**(呈现与交互几何改动,后果玩家可见但不损持久状态;用户 U0 可改判)。
> **预计**:9.5 个工作日(区间 9–10;T0 0.5/T1 1.5/T2 0.5/T3 2.0/T4 1.5/T5 1.5/T6 0.5/T7 1.0/T8 0.5)。
> **卡片状态**:复核记录见 §16;第一轮 19 条、第二轮 23 条、第三轮 4 条、第四轮 5 条、第五轮 1 条均已处置,第五轮定向复核通过。
> **卡片状态**:复核记录见 §16;第一轮 19 条、第二轮 23 条、第三轮 4 条、第四轮 5 条、第五轮 1 条、第六轮(合并整合)6 条均已处置,第六轮定向复核通过。
---
## 1. 目标与完成定义
把棋盘从「逐格 32×32 墙/地瓦片+格内立面」换成**合并岩体+连续地面**的 2.5D 画法:连通未开格(四邻)共享一块抬升岩顶与连续南/东崖面,北/西受光,南/东投影;数字脱离格面,变成**浮空数字+双色引导线+格面小阴影圆**,数字与引导线永远最顶、阴影圆在小人之下;D 区顶部 AP 条整条撤掉,AP 放左栏、RAP/图例/弃图刷新放右栏,棋盘占 D 区全高并在上方预留 44px 给顶行浮空数字越出棋盘;棋盘底常驻操作提示条退役;小人与南侧岩体按脚底 y 排序遮挡;旧 `terrain_*` 63 件与数字底牌路径全部退役;三关色板按已过审样张冻结。
把棋盘从「逐格 32×32 墙/地瓦片+格内立面」换成**合并岩体+连续地面**的 2.5D 画法:连通未开格(四邻)共享一块抬升岩顶与连续南/东崖面,北/西受光,南/东投影;数字脱离格面,变成**浮空数字+双色引导线+格面小阴影圆**,数字与引导线永远最顶、阴影圆在小人之下;封印按迭代56已闭合的「受理即揭示」呈现——印记居已揭示地面格心、身份字形垫色牌叠于法阵之上、不参与浮空层,承载面取本关受光棱色封印石以保 ≥4.5:1 对比;D 区顶部 AP 条整条撤掉,AP 放左栏、RAP/图例/弃图刷新放右栏,棋盘占 D 区全高并在上方预留 44px 给顶行浮空数字越出棋盘;棋盘底常驻操作提示条退役;小人与南侧岩体按脚底 y 排序遮挡;旧 `terrain_*` 63 件与普通数字底牌路径退役(封印格身份色牌保留);三关色板按已过审样张冻结。
**完成定义**(全部满足才算完):
@@ -20,9 +20,10 @@
4. 深度排序:深度键=格底 y;岩体取最南格格底;升序绘制;南侧岩体画在小人之后并遮住小人脚底;小人所在格数字仍完整可见。格件顶面贴花/交互反馈随所属格件参与同一深度排序——北侧(脚底≤小人)低于小人(`z=0`),南侧(脚底>小人)随岩体在前(`z=3`);浮空数字仍最顶。
5. 浮空数字:字高 21px、2px 深墨描边+1px 浮空投影、暖白字芯、字底距格顶 15px、2px 双色引导线、10×6 阴影圆(圆心格顶+7,画在开启格地面、位于小人之下);数字与引导线 z 最高,任何地形/小人/特效不遮数字与引导线;小人可遮阴影圆。
6. D 区:左栏 AP 点阵+停手,右栏 RAP 点阵+数字+图例+弃图刷新;`side_rail_w=200` 入布局表;`ap_bar_h` 游戏视图零引用(布局表字段暂留供样张渲染工具,删除归工具批);棋盘底常驻操作提示条退役;toast 槽在左栏顶部且不覆盖棋盘与浮空数字。
7. 旧 `terrain_*` 63 件与 `tile_palette.gd`/`cell_base_layer.gd` 删除;`seal_mark.png` 保留;棋盘绘制路径零 `DIGIT_PLATE`/`plate` 调用。
8. 三关(dungeon/underdark/deep_underdark)都走新材质与同一画法;三关八色按 art-bible §4.1 冻结(underdark 冷蓝灰、deep 灰黑);三关 golden 基线重制并在渲染闸通过。
9. 命中仍按逻辑格矩形:点在抬升岩顶/崖面/浮空数字上不改变格坐标映射;16×16 等非当前板型由同一公式求值。
7. 旧 `terrain_*` 63 件与 `tile_palette.gd`/`cell_base_layer.gd` 删除;`seal_mark.png` 保留;**普通数字**棋盘绘制路径零 `DIGIT_PLATE`/`plate` 调用;封印格身份字形色牌保留(迭代56封印改版,唯一例外)。
8. 封印呈现按迭代56「受理即揭示」口径:印记居已揭示地面格心、身份字形垫色牌叠于法阵之上、印记与色牌固定低于小人、该格不生成浮空 entries;封印格地面铺本关受光棱色封印石(零新增色,对封印黑对比 6.45–9.94:1),普通已开格地面仍为连续新地面。
9. 三关(dungeon/underdark/deep_underdark)都走新材质与同一画法;三关八色按 art-bible §4.1 冻结(underdark 冷蓝灰、deep 灰黑);三关 golden 基线重制并在渲染闸通过。
10. 命中仍按逻辑格矩形:点在抬升岩顶/崖面/浮空数字上不改变格坐标映射;16×16 等非当前板型由同一公式求值。
**不做**:真 3D、HD-2D、A/B 方案对照、旧瓦片回退、逐格新 PNG 瓦片、B/C 区改版、核心规则/数值/RNG 改动。
@@ -30,7 +31,8 @@
## 2. 设计事实源
- **画法与配色**:`design/art/art-bible.md` v3.50 §3.2「棋盘地形体系」八条(术语与定义/投影与搭接/受光与崖面/材质与装饰/投影与整板悬崖/绘制序与遮挡/浮空数字/旧资产处理)、§4.1「棋盘环境子板/三关棋盘环境八色」、§6.3「三关 tile_closed/tile_open 终值」、§8.2「封印印记参数表」、§1.4 第一验收项。
- **画法与配色**:`design/art/art-bible.md` v3.51 §3.2「棋盘地形体系」八条(术语与定义/投影与搭接/受光与崖面/材质与装饰/投影与整板悬崖/绘制序与遮挡/浮空数字/旧资产处理)+封印印记条、§4.1「棋盘环境子板/三关棋盘环境八色/封印黑/数字色牌」、§6.3「三关 tile_closed/tile_open 终值」、§8.2「封印印记参数表」、§1.4 第一验收项。
- **封印呈现前置**:迭代56「封印动作改版批」已闭合 `design/gdd/systems/排雷循环/排雷玩法.md` v2.0「封印受理即揭示」与 `design/ux/battle.md`「封印格呈现预览」——封印格 = 已揭示地面+法阵+身份字形色牌;本卡承接其地形换代(承载面改受光棱封印石、圆心仍格心、色牌与法阵层序不变),不重写揭牌逻辑。
- **布局与像素判据**:`design/ux/battle.md`(2026-11-07)D 区行、棋盘格尺寸公式、「D 区布局与棋盘画法预览」像素判据表(含顶面/视觉 rect、悬停/路径 rect、层序)、Component Inventory 三行(行动资源侧栏/棋盘地形层/棋盘浮空数字层)。
- **HUD 契约**:`design/gdd/systems/表现与支撑/HUD框架.md` D 区行(侧栏/全高棋盘/提示条退役)、布局表高度口径、字号下限(浮空数字 21px 固定)。
- **验收面**:`game/tests/golden/README.md`「加严口径(棋盘三图)」「越格口径(2026-11-07 棋盘地形换代)」。
@@ -47,20 +49,22 @@
| 格边公式预留为「上 12+下 12+悬崖 8」,无顶栏/侧栏项 | `game/presentation/views/board_view.gd:205-232`(`_cell_for`:`reserve := 24.0 + d`、`avail.x - 12.0 - d`) |
| 棋盘原点由 CenterContainer 居中;`cell_origin` 读 `_svp_container.position` | `board_view.gd:403-404`;`_wrap`/`_svp_container` 建于 `board_view.gd:90-110` |
| 棋盘逐格 16 墙瓦片+5 地面变体,按 `board_type` 装 PNG | `game/presentation/views/tile_palette.gd:17-20,66-94`;`board_view.gd:118,264-267` |
| 数字有「亮直/深直/落牌」三态与色牌垫底 | `tile_palette.gd:50,88-94,166`;`board_view.gd:517-518,586-588`;`cell_mark_overlay.gd:74-104` |
| 数字有「亮直/深直/落牌」三态与色牌垫底;封印格身份字形同走色牌 | `tile_palette.gd:50,88-94,166`;`board_view.gd:517-518,586-591`;`cell_mark_overlay.gd:74-104` |
| 封印当前代码仍是「未开格+`seal_on = seal and not revealed`」;迭代56封印改版已编未开工(本卡排其后,按其实装后的「已揭示地面+身份色牌」口径承接) | `board_view.gd:536-545`;`board_cell_unit.gd:31,39,51-77`;`seal_mark_layer.gd:12-20`;`reports/需求卡片-封印动作改版批-2026-11-07.md` §7 |
| 封印取证选择器仍 `has_seal and not is_revealed`、取证 rect 按逻辑格(圆心格心) | `game/probe/board_shot_probe.gd:264-281`;迭代56卡片 §7 换代选择器 |
| 格内立面/北投影/东立面全在本格内画;接触带也在基座层 | `game/presentation/views/cell_base_layer.gd:60,82-91,109-115,168,183,196` |
| 小人 z=1、落影相对 z=-1(全局 0);无脚底排序;格件默认 z=0 | `game/presentation/views/board_world.gd:39,48`;`board_cell_unit.gd`(全文无 `z_index` 赋值) |
| 旧 `terrain_*` 63 件(16+5,三关各一套)在库 | `game/assets/art/board/`(63 PNG+63 `.import`+`seal_mark.png`+其 `.import`) |
| 棋盘取证探针视图 900×900,微光「禁越圈」按逻辑格;封印取证也按逻辑 rect | `game/probe/board_shot_probe.gd:112,157,184,307` |
| 棋盘取证探针视图 900×900,微光「禁越圈」按逻辑格;封印取证也按逻辑 rect | `game/probe/board_shot_probe.gd:179,261,318,369` |
| 微光取证探针同用逻辑 rect | `game/probe/type_glow_shot_probe.gd:126,161` |
| 变格边长探针恢复时调 `set_cell_area(bv.size)`(无侧栏参) | `game/probe/ui_input_probe.gd:360-366` |
| 布局探针等价断言 `_cell_for(n, bv.size)`(无侧栏参) | `game/probe/layout_probe.gd:108-120` |
| 对比度探针的迷雾派生段依赖 TilePalette | `game/probe/ui_contrast_probe.gd:119-147,164-190` |
| 能力清单旧行「地形瓦片套与格面数字可读」仍引用 terrain 套件 | `game/tests/README.md`(旧行保留;删除归写卡段后续) |
| 落牌断言在玩家复制回归件 | `game/tests/unit/presentation/player_copy_sweep_test.gd:145`(`u.plate == true`) |
| 普通已开危险格「危」当前垫色牌;落牌断言在玩家复制回归件(本卡后普通「危」改浮空、plate=false;封印格「危」仍垫牌) | `game/tests/unit/presentation/player_copy_sweep_test.gd:142-147`(`u.plate == true`) |
| 单元测试入口登记 terrain 套件 | `game/tests/run_all.gd:225` |
| 布局表字段被样张渲染工具读取(本批不改工具) | `tools/layout_config.py:12`;`tools/render_sample_sheet.py:51,956`;`tools/render_sample_sheet_v3.py:862,936` |
| 档期现状:待办清单仍「待文档设计+待美术设计」,roadmap 仍「待设计+待美术」 | `待办清单.md:203`;`roadmap.md:9`(收尾段同步推进) |
| 档期现状:待办清单已「已写卡」、roadmap 待编池「棋盘瓦片与立体表现重做(已写卡,待编排)」、08 已写卡 | `待办清单.md:265-268`;`roadmap.md:9`;`design/gdd/08-Alpha版本标准.md:149` |
---
@@ -68,10 +72,10 @@
1. 🔴 **只改呈现层与必要接线**:禁止改 `game/core/` 的排雷规则、棋盘数据、AP/RAP、战斗结算、RNG;棋盘数据只读。新增/修改只落 `game/presentation/`(含 `main.gd`/`main_debug_flow.gd` 的重建接线)、`game/probe/`、`game/tests/`、`game/data/schemas/`、`game/data/tables/` 与 `reports/`。
2. 🔴 **不做逐格瓦片**:禁止保留或新增 16+5 逐格瓦片路径、`terrain_*` 回退、`TilePalette` 装图链;岩体/地面/崖面必须按整板矩形与格边程序化绘制,连通按四邻。
3. 🔴 **数字零底牌**:禁止 `DIGIT_PLATE`、`plate`、`_digit_ink_mode` 三态、`_draw_digit_plate` 在棋盘绘制路径复活;数字只走浮空描边字。
4. 🔴 **浮空分层**:数字+引导线必须比地形/小人/封印/微光/交互反馈都高,任何元素不得遮数字与引导线;**阴影圆相反——画在开启格地面、位于小人之下**,小人站该格时遮住圆;顶行数字必须在 D 区内完整可见。**顶面贴花/交互反馈不得一律置顶**——随所属格件脚底行分档:北侧(脚底≤小人)低于小人,南侧(脚底>小人)随岩体在前;禁恢复“格件一律 z=3”。
3. 🔴 **普通数字零底牌**:普通数字(含普通已开格的「危」/「?」)只走浮空描边字;禁止 `_digit_ink_mode` 三态、`plate_digit` 在普通数字路径复活。**封印格身份字形色牌为唯一例外**(迭代56封印改版:`plate=true`、`_draw_digit_plate` 保留、字形叠于法阵之上),禁把例外扩回普通数字。
4. 🔴 **浮空分层**:数字+引导线必须比地形/小人/封印/微光/交互反馈都高,任何元素不得遮数字与引导线;**阴影圆相反——画在开启格地面、位于小人之下**,小人站该格时遮住圆;顶行数字必须在 D 区内完整可见。**顶面贴花/交互反馈不得一律置顶**——随所属格件脚底行分档:北侧(脚底≤小人)低于小人,南侧(脚底>小人)随岩体在前;禁恢复“格件一律 z=3”。**封印格例外**:该格不生成浮空 entries/阴影圆,印记与身份色牌固定低于小人(整格 z=0,不参与南侧前推)。
5. 🔴 **命中按逻辑格**:`_cell_at` 仍用逻辑格矩形与 `SEP` 步长;抬升岩顶、崖面、浮空数字不是命中区;顶面左上角点按逻辑公式归属北/西邻格,不做“归本格”特判。
6. 🔴 **脚底排序**:深度键=格底 y;岩体取最南格格底;升序绘制;南侧岩体必须能遮住小人脚底;格件贴花/交互反馈按同一格底 y 分档(北侧 z=0 低于小人、南侧 z=3 随岩体在前);禁止退回“全部岩体先画、小人最后画”。
6. 🔴 **脚底排序**:深度键=格底 y;岩体取最南格格底;升序绘制;南侧岩体必须能遮住小人脚底;格件贴花/交互反馈按同一格底 y 分档(北侧 z=0 低于小人、南侧 z=3 随岩体在前;**封印格恒 0**);禁止退回“全部岩体先画、小人最后画”。
7. 🔴 **顶预留 44px**:`TOP_RESERVE=44`、`BOTTOM_RESERVE=12`、`DEPTH_PX=8`;公式与预览判据一致;禁止用 AP 条高度重新挤压棋盘;board_area 高 = D 区全高 548。
8. 🔴 **侧栏宽表单源**:`side_rail_w` 只从 `BattleLayoutTable` 读,视图内禁止硬编码 200;`ap_bar_h` 游戏视图零引用(布局表字段暂留供样张工具,删除归工具批)。
9. 🔴 **旧资产先验后删**:T0 采样三关当前画面读数入报告;新路径三关 golden 绿后,才允许删除 63 件 PNG 与 `.import`;`seal_mark.png` 禁删。
@@ -81,6 +85,7 @@
13. 🔴 **RNG 单点**:程序化材质/装饰噪声禁止 `randomize()`、自建 `RandomNumberGenerator`、消耗 `RngService` 共享流;一律用格坐标确定性哈希(同板同参逐位复现)。
14. 🔴 **色字面量落点**:三关八色只落 `board_terrain_palette.gd`;用 `Color("#RRGGBB")` 常量,禁 `Color8` 散落;其它绘制点只读 palette,禁第二份色值表。
15. 🔴 **BoardView 公开面不增**:`board_view.gd` 公开方法保持 27、类成员 ≤31(S13 基线;删 `_palette` 后 30);新增地形/浮空/阴影圆层一律落为**固定名字子节点**(`_world` 下 `TerrainBack`/`TerrainFront`/`LabelShadow`,壳层下 `FloatLayer`),三层在 `_init` 创建一次常驻、`rebuild` 只重跑 `setup` 不重建节点,经 `get_node_or_null` 取用,不新增类成员;只允许 `set_cell_area`/`rebuild` 增加可选参数与私有 `_visual_rect_for`/`_top_face_rect`/`_resort_cell_decals`,禁新增公开方法或成员。
16. 🔴 **封印呈现对齐迭代56**:封印印记居已揭示地面格心(不随岩顶 −ESHIFT/−LIFT 偏移);身份字形垫色牌叠于法阵之上(`seal_mark_layer` 子件 `show_behind_parent=true` 或等价实装)、不参与浮空层、不生成阴影圆;印记与色牌固定低于小人(封印格整格 z=0);封印格地面铺本关受光棱色封印石(零新增色,`palette.light_edge`);法阵参数(环径/环壁/十字/光圈)与揭牌逻辑沿迭代56,禁在本卡重写。
---
@@ -92,10 +97,10 @@
- 棋盘地形深度层(连续地面、合并岩顶、南/东崖面、内阴影、四段投影、整板悬崖)。
- 浮空数字层(阴影圆、引导线、描边字、1px 浮空投影、数字/线最顶、顶行越界)。
- 小人与岩体的脚底排序;阴影圆在小人之下。
- 封印/类型微光/变异纹带/奖励徽章/悬停/路径/可挖域微光的锚点迁移(岩顶中心/顶面 rect)。
- 封印印记/身份色牌的承载面与层序(已揭示地面格心+受光棱封印石+色牌叠于法阵之上且低于小人);类型微光/变异纹带/奖励徽章/悬停/路径/可挖域微光的锚点迁移(顶面 rect)。
- 迷雾黑罩/记忆态与抬升岩顶的几何对齐。
- 布局表 schema/tres、AP 条→侧栏的视图改造、命中测试。
- 旧瓦片与色牌路径退役、三关色板、三关 golden 基线重制、测试与能力行落地。
- 旧瓦片与普通数字色牌路径退役(封印格身份色牌保留)、三关色板、三关 golden 基线重制、测试与能力行落地。
- 棋盘底常驻操作提示条退役(`board_zone_view` 的 hint 条删除)。
**不收件**:
@@ -115,12 +120,12 @@
| 文档 | 关联点(实现会改变它的哪条陈述) | 同步义务 |
|---|---|---|
| `design/art/art-bible.md` §1.2/§3.2/§4.1/§6.3/§6.5/§7/§8.2 | 三关八色、四邻合并、顶面/视觉 rect、阴影视小、浮空字 1px 投影、贴花按脚底行分档、记忆态合成底、提示条 caption 退役 | 设计段已按本卡写入 v3.50;实现读数若与条款不符→列反哺点,文档批裁决,实现批禁直改 |
| `design/ux/battle.md` §Layout/§Component/预览判据 | D 区全高、侧栏 200、棋盘 38/32、原点、顶预留 44、层序(贴花/交互按脚底行分档)、悬停/路径 rect、提示条退役 | 设计段已同步(2026-11-07);实现偏差→反哺点 |
| `design/art/art-bible.md` §1.2/§3.2/§4.1/§6.3/§6.5/§7/§8.2 | 三关八色、四邻合并、顶面/视觉 rect、阴影视小、浮空字 1px 投影、贴花按脚底行分档、记忆态合成底、提示条 caption 退役;封印印记改已揭示地面格心+受光棱封印石+身份色牌层序(v3.51) | 设计段已按本卡写入 v3.51;实现读数若与条款不符→列反哺点,文档批裁决,实现批禁直改 |
| `design/ux/battle.md` §Layout/§Component/预览判据 | D 区全高、侧栏 200、棋盘 38/32、原点、顶预留 44、层序(贴花/交互按脚底行分档)、悬停/路径 rect、提示条退役;封印格承载面改受光棱封印石、圆心格心、色牌叠法阵 | 设计段已同步(2026-11-07);实现偏差→反哺点 |
| `design/gdd/systems/表现与支撑/HUD框架.md` D 区/字号 | D 区侧栏、全高棋盘、`ap_bar_h` 不再参与、浮空数字 21px、提示条退役 | 设计段已同步(2026-11-07);实现偏差→反哺点 |
| `game/tests/golden/README.md` | 棋盘裁剪 1036×548、越格口径、类型微光禁越圈范围 | 设计段已同步;实现批禁直改,基线重制按该文件口径执行(重制前用户确认) |
| `design/gdd/术语表.md` 掩尘/裸土/浮空数字/色牌 | 基色值、浮空数字定义、色牌退役 | 设计段已同步;实现批禁直改 |
| `design/art/asset-path-map.md`/`art-assets-checklist.md` | 旧 terrain_* 退役、seal_mark 保留、色牌退役、程序化材质无入包 PNG | 设计段已同步;实现删除资产后按反哺点核对 |
| `design/gdd/术语表.md` 掩尘/裸土/浮空数字/色牌 | 基色值、浮空数字定义、普通数字色牌退役+封印格色牌例外 | 设计段已同步;实现批禁直改 |
| `design/art/asset-path-map.md`/`art-assets-checklist.md` | 旧 terrain_* 退役、seal_mark 保留、普通数字色牌退役+封印格色牌例外、程序化材质无入包 PNG | 设计段已同步;实现删除资产后按反哺点核对 |
| `design/engineering/architecture/architecture.md:178` | 单格两绘制域件行把 `cell_base_layer` 记为在役组件;本批删除该件、新增地形/浮空/阴影层 | 架构文档写权限=用户专属(2026-11-07 裁):实现批禁直改,T8 反哺点列「架构表该行待用户发令修订」 |
| `game/tests/README.md` 能力表 | 新增 6 条能力;旧「地形瓦片套与格面数字可读」保留(删除归写卡段后续;实现批禁写);「战斗屏三区几何」代表用例改名 | 写卡段本批入表(本卡同 commit);实现批只核对名字与实际落地一致 |
| `roadmap.md`/`design/gdd/08-Alpha版本标准.md`/`待办清单.md` | 本卡已写/待编排状态 | 编排段与收尾段推进;实现批禁直改 |
@@ -131,32 +136,32 @@
| 文件 | 行为改动/非行为 | 职责 | 验收行 |
|---|---|---|---|
| `game/presentation/views/board_terrain_palette.gd`(新增) | 非行为(数据) | 三关八色表:`palette_for(board_type)`;dungeon/underdark/deep 取 art-bible v3.50 §4.1 冻结值;只读 | §12-14 |
| `game/presentation/views/board_terrain_layer.gd`(新增) | 行为 | 地面、合并岩顶、南/东崖面、内阴影、四段投影;`setup()`/`set_hero_foot_y()`/`set_pass()`/`mass_rects()`/`terrain_metrics()`;静态 `lift_for()`/`eshift_for()`;back/front 两实例(`_world` 下固定名字 `TerrainBack`/`TerrainFront`,不占 BoardView 成员) | §12-3/4/5 |
| `game/presentation/views/board_float_layer.gd`(新增,Control) | 行为 | 外壳层浮空字:2px 描边、1px 浮空投影、双色引导线;`setup()`/`set_entries()`/`set_font()`/`label_rects()`/`label_metrics()`;不画阴影圆;壳层固定名字子节点 `FloatLayer`,不占 BoardView 成员 | §12-6/7 |
| `game/presentation/views/board_label_shadow_layer.gd`(新增,Node2D) | 行为 | 开启格地面 10×6 四层阴影圆;`setup(cell, cells)`/`circle_rects()`(世界局部/格坐标);`_world` 下固定名字 `LabelShadow`,不占 BoardView 成员;z=0,位于小人之下 | §12-6/7 |
| `game/presentation/views/board_terrain_palette.gd`(新增) | 非行为(数据) | 三关八色表:`palette_for(board_type)`;dungeon/underdark/deep 取 art-bible v3.51 §4.1 冻结值;八槽键 `rock_top/ground/cliff/seam/bevel_light/bevel_dark/ink/light_edge`;封印石读 `light_edge`(零新增色);只读 | §12-14 |
| `game/presentation/views/board_terrain_layer.gd`(新增) | 行为 | 地面、合并岩顶、南/东崖面、内阴影、四段投影、封印格受光棱封印石贴片;`setup(cell, cols, rows, wall_at, sealed_at, palette, board_type)`/`set_hero_foot_y()`/`set_pass()`/`mass_rects()`/`terrain_metrics()`;静态 `lift_for()`/`eshift_for()`;back/front 两实例(`_world` 下固定名字 `TerrainBack`/`TerrainFront`,不占 BoardView 成员) | §12-3/4/5/8 |
| `game/presentation/views/board_float_layer.gd`(新增,Control) | 行为 | 外壳层浮空字:2px 描边、1px 浮空投影、双色引导线;`setup()`/`set_entries()`/`set_font()`/`label_rects()`/`label_metrics()`;不画阴影圆;**封印格不生成 entries**;壳层固定名字子节点 `FloatLayer`,不占 BoardView 成员 | §12-6/7 |
| `game/presentation/views/board_label_shadow_layer.gd`(新增,Node2D) | 行为 | 开启格地面 10×6 四层阴影圆;`setup(cell, cells)`/`circle_rects()`(世界局部/格坐标);**封印格不生成圆**;`_world` 下固定名字 `LabelShadow`,不占 BoardView 成员;z=0,位于小人之下 | §12-6/7 |
| `game/presentation/views/ap_bar_view.gd`(修改,保留类名/字段名) | 行为 | 根改为全幅 Control(IGNORE)+左右两个 PanelContainer(`_init` 局部变量,不新增成员);左 AP+停手,右 RAP+图例+弃图刷新;信号/setter 名不变;`side_rail_w` 从布局表读 | §12-1/12 |
| `game/presentation/views/board_view.gd`(修改) | 行为 | 新格边公式、顶预留 44、棋盘原点、地形/浮空/阴影圆固定名字子节点装配(不新增成员)、`rebuild` 清场跳过三层、`_resort_cell_decals` 按脚底行分档、命中测试、refresh 清理(删 `_paint_cell_base`/`_paint_cell_facade` 与 `u.base.*`)、迷雾 rect、rebuild/set_cell_area 侧栏参 | §12-2~9 |
| `game/presentation/views/board_zone_view.gd`(修改) | 行为 | 去掉 VBox/AP 条/hint;board_area 全幅;侧栏叠层;toast 左栏顶部;`_side_rail_w` 存 layout 值 | §12-1 |
| `game/presentation/views/board_world.gd`(修改) | 行为 | 悬崖保留 z=0、材质色接新 palette;小人 z=1、落影相对 z=-1;格子 z 对齐 | §12-5 |
| `game/presentation/views/board_cell_unit.gd`(修改) | 行为 | 去基座层(删 `base` 成员);新增 `top_face_offset`/`visual_rect`;`z_index` 按脚底行分档(北侧 0/南侧 3,`refresh`/英雄移动重算);迷雾三块;记忆态地面色/灰罩/记忆墨数字迁入固定名字低层子件 `MemoryGround`(`z_as_relative=false`、全局 z=-1:地面之上、阴影圆 0 之下),不整矩形压南邻岩顶;`draw_removed_dim` 墙格改顶面 rect;接触带迁入固定名字低层子件 `ContactGlow`(同全局 -1);`plate` 删除;glyph 仅留记忆态;文件头注删 `cell_base_layer` 引用 | §12-8/9/13 |
| `game/presentation/views/cell_mark_overlay.gd`(修改) | 行为 | 删数字/色牌/`tex_glyph`;保留变异/徽章/路径/高亮/退色;顶面 rect 参数 | §12-8 |
| `game/presentation/views/board_cell_unit.gd`(修改) | 行为 | 去基座层(删 `base` 成员);新增 `top_face_offset`/`visual_rect`;**保留 `plate`**(封印格身份色牌);`z_index` 按脚底行分档(北侧 0/南侧 3;**封印格恒 0**,由 `_resort_cell_decals` 重算);`glyph` 只写封印格(色牌字形),普通数字不写格面;封印子件 `show_behind_parent=true`(法阵在色牌下);迷雾三块;记忆态地面色/灰罩/记忆墨数字迁入固定名字低层子件 `MemoryGround`(`z_as_relative=false`、全局 z=-1:地面之上、阴影圆 0 之下),不整矩形压南邻岩顶;`draw_removed_dim` 墙格改顶面 rect;接触带迁入固定名字低层子件 `ContactGlow`(同全局 -1);文件头注删 `cell_base_layer` 引用 | §12-8/9/13 |
| `game/presentation/views/cell_mark_overlay.gd`(修改) | 行为 | 删普通数字字形/色牌路径;**保留封印格字形+`_draw_digit_plate` 色牌+徽章**;保留变异/路径/高亮/退色;顶面 rect 参数 | §12-8/11 |
| `game/presentation/views/cell_base_layer.gd`(删除) | 非行为(清理) | 逐格基座/立面/投影/接触带职责移交 | §12-3/13 |
| `game/presentation/views/tile_palette.gd`(删除) | 非行为(清理) | 16+5 装图/三态墨色职责退役 | §12-11 |
| `game/data/schemas/battle_layout_table.gd`(修改) | 非行为(数据契约) | 增 `side_rail_w`;`ap_bar_h` 保留字段(游戏视图零读) | §12-1 |
| `game/data/tables/battle_layout.tres`(修改) | 非行为(数据) | `side_rail_w = 200`;`ap_bar_h` 字段保留 | §12-1 |
| `game/presentation/main.gd`/`main_debug_flow.gd`(修改) | 非行为(接线) | `BoardView.rebuild(..., side_rail_w)` 传布局表值 | §12-2 |
| `game/probe/board_shot_probe.gd`(修改) | 非行为(取证) | 视图 1036×548、侧栏 200、顶面 rect 微光圈、封印取证 rect、三关截图 | §12-15 |
| `game/probe/board_shot_probe.gd`(修改) | 非行为(取证) | 视图 1036×548、侧栏 200、顶面 rect 微光圈;**封印取证保持逻辑格 rect(圆心格心)**,选择器按迭代56后 `has_seal` 口径;三关截图 | §12-15 |
| `game/probe/type_glow_shot_probe.gd`(修改) | 非行为(取证) | 视图 1036×548、`rebuild(..., 200)`、微光允许区改顶面 rect | §12-15 |
| `game/probe/layout_probe.gd`(修改) | 非行为(取证) | `_cell_for` 带侧栏;D 区/原点/顶预留读数(含 1920 档) | §12-2/15 |
| `game/probe/ui_input_probe.gd`(修改) | 非行为(取证) | `set_cell_area` 恢复时带侧栏参 | §12-2/15 |
| `game/probe/ui_contrast_probe.gd`(修改) | 非行为(取证) | 去旧瓦片均值段;加浮空字四类底复合对比;迷雾派生段改读新 palette | §12-6/9 |
| `game/tests/unit/presentation/board_terrain_test.gd`(新增) | 非行为(测试) | 格边/合并/投影/深度/锚点/命中/迷雾/接触/色板/旧资产 | §12-2~5,8,9,11,13,14 |
| `game/tests/unit/presentation/board_float_label_test.gd`(新增) | 非行为(测试) | 字高/间距/顶预留/最顶/阴影视小/复合对比/零底牌 | §12-6/7/11 |
| `game/tests/unit/presentation/board_terrain_test.gd`(新增) | 非行为(测试) | 格边/合并/投影/深度/锚点/命中/迷雾/接触/色板/旧资产/封印承载与色牌 | §12-2~5,8,9,11,13,14 |
| `game/tests/unit/presentation/board_float_label_test.gd`(新增) | 非行为(测试) | 字高/间距/顶预留/最顶/阴影视小/复合对比/普通数字零底牌(封印格跳过) | §12-6/7/11 |
| `game/tests/unit/presentation/board_side_rail_test.gd`(新增) | 非行为(测试) | 侧栏几何、信号、setter、提示条退役 | §12-1/12 |
| `game/tests/unit/presentation/terrain_tile_sets_test.gd`(删除) | 非行为(测试) | 旧瓦片套断言整体退役 | §12-11 |
| `game/tests/unit/presentation/stage_background_test.gd`(修改) | 非行为(测试) | 新增 `_test_side_rail_width_from_table`(现无 AP 条高度测试) | §12-1 |
| `game/tests/unit/presentation/player_copy_sweep_test.gd`(修改) | 非行为(测试) | 删 `u.plate==true`;改查浮空 entries/记忆态 glyph | §12-6/11 |
| `game/tests/unit/presentation/player_copy_sweep_test.gd`(修改) | 非行为(测试) | 普通已开危险格:`u.plate==true` 改 `u.plate==false`+浮空 entries 含该格;封印格色牌断言归 `board_terrain_test` | §12-6/11 |
| `game/tests/unit/presentation/standee_present_values_test.gd`(修改) | 非行为(测试) | V11 口沿高光源码锚由 `cell_base_layer.gd` 改指 `board_terrain_layer.gd`(北/西主亮棱);`body_src` 段保留 | §12-3/11 |
| `game/tests/run_all.gd`(修改) | 非行为(测试入口) | 注册三个新套件、移除 terrain 套件 | §12-16 |
| `game/tests/README.md`(写卡段本批改) | 非行为(能力清单) | 新增 6 条能力;旧地形行保留(删除归写卡段后续);代表用例改名 | §12 全表 |
@@ -174,7 +179,7 @@
| `ap_bar_view.gd`(改造不换名) | 现有 `ApBarView` 已含 AP/RAP/确认/图例/刷新全部逻辑与信号,且被组合根/探针以字段名 `ap_bar` 引用;改名会波及 7 个接线文件,收益低风险高,故保留类名/字段名,只改布局职责 | 侧栏只此一件;`BoardZoneView` 只持有它 | 由 `BoardZoneView` 创建;信号经原有组合根路径上抛 |
| 三个测试件 | 现有 `terrain_tile_sets_test` 只测旧瓦片套;新职责无法复用;按职责拆三件(地形/浮空/侧栏) | 每个测试件只测对应域 | 经真实 `BoardView`/`BoardZoneView` 入口实例化;不直调核心写 |
**唯一面核查**:`LIFT`/`ESHIFT`/`TOP_RESERVE`/`side_rail_w` 各只有一个定义点;`DIGIT_PLATE`/`plate` 在棋盘路径零引用;`terrain_*` 零引用;三关八色只在 palette 件;层节点名 `_world/TerrainBack`/`_world/TerrainFront`/`_world/LabelShadow`/壳层 `FloatLayer` 各只有一个创建点,`rebuild` 只清格件与英雄、不误清三层。
**唯一面核查**:`LIFT`/`ESHIFT`/`TOP_RESERVE`/`side_rail_w` 各只有一个定义点;普通数字路径 `DIGIT_PLATE`/`plate` 零引用(封印格身份色牌为唯一例外,`cell_mark_overlay`/`CellUnit.plate`);`terrain_*` 零引用;三关八色只在 palette 件;封印格承载色只读 `palette.light_edge`;层节点名 `_world/TerrainBack`/`_world/TerrainFront`/`_world/LabelShadow`/壳层 `FloatLayer` 各只有一个创建点,`rebuild` 只清格件与英雄、不误清三层。
**分层与交互**:Core 零 UI、数据只经 ConfigDB、RNG 零触碰、命中只读——全部保持;新增件不互相反向持宿主引用。
@@ -185,15 +190,15 @@
| 新文件 | 公开方法预算 | 成员变量预算 | 说明 |
|---|---|---|---|
| `board_terrain_palette.gd` | 1(`palette_for`) | 8 个常量 | 纯数据;不新增类状态 |
| `board_terrain_layer.gd` | ≤7(`setup`/`set_hero_foot_y`/`set_pass`/`mass_rects`/`terrain_metrics`/`lift_for`/`eshift_for`) | ≤12 | 两个实例共享一个类;`pass_mode` 区分 back/front |
| `board_terrain_layer.gd` | ≤7(`setup`/`set_hero_foot_y`/`set_pass`/`mass_rects`/`terrain_metrics`/`lift_for`/`eshift_for`) | ≤13(新增 `_sealed_at` 一个成员——封印石贴片输入;其余同前) | 两个实例共享一个类;`pass_mode` 区分 back/front |
| `board_float_layer.gd` | ≤5(`setup`/`set_entries`/`set_font`/`label_rects`/`label_metrics`) | ≤8 | 一个 Control;所有数字在一个 `_draw` |
| `board_label_shadow_layer.gd` | ≤2(`setup`/`circle_rects`) | ≤6 | 一个 Node2D;所有圆在一个 `_draw`;坐标=世界局部/格坐标 |
| `ap_bar_view.gd`(改造) | 既有 10 个公开函数不减 | 既有 14 个成员不增(左右栏容器为 `_init` 局部变量) | 不新增公开面/成员;只改 `_init`/`_build_*` |
| 三个测试件 | 每件 ≤20 个 `func _test_*` | 夹具变量 ≤15 | 不计生产接口;测试件无消费面 |
**存量触面**:`board_view.gd` 852 行、公开方法 27、类变量 31→30(删 `_palette`);本批只扩展 `set_cell_area(avail, side_rail_w := 0.0)` 与 `rebuild(board, minesweeper, side_rail_w := 0.0)` 的可选参数,新增 `_visual_rect_for`/`_top_face_rect`/`_resort_cell_decals` 私有方法,**不新增公开方法/成员**;地形/浮空/阴影圆层经固定名字子节点取用(`TerrainBack`/`TerrainFront`/`LabelShadow`/`FloatLayer`);S13 键只降不升。`board_zone_view.gd` 6→7 成员(新增 `_side_rail_w`,默认阈值内)。`board_cell_unit.gd` 12→12 成员(删 `plate`/`base` 与 `_BASE_LAYER` 预载,新增 `top_face_offset`/`visual_rect`,净 0;`ContactGlow`/`MemoryGround` 用固定名字子节点、不新增成员,默认阈值内)。`ap_bar_view.gd` 14 成员不增。`cell_mark_overlay.gd` 只减面。迁移函数对账:`cell_base_layer.gd` 的 `draw_base`/`_draw_south_facade`/`_draw_north_projection`/`_draw_e_facade` 不迁入新件同名函数,新件按职责重写并保留像素判据;`tile_palette.gd` 的 `load_board_tiles`/`digit_ink_mode`/`normalize_floor_luma` 不迁移(职责退役)。
**存量触面**:`board_view.gd` 852 行、公开方法 27、类变量 31→30(删 `_palette`);本批只扩展 `set_cell_area(avail, side_rail_w := 0.0)` 与 `rebuild(board, minesweeper, side_rail_w := 0.0)` 的可选参数,新增 `_visual_rect_for`/`_top_face_rect`/`_resort_cell_decals` 私有方法,**不新增公开方法/成员**;地形/浮空/阴影圆层经固定名字子节点取用(`TerrainBack`/`TerrainFront`/`LabelShadow`/`FloatLayer`);S13 键只降不升。`board_zone_view.gd` 6→7 成员(新增 `_side_rail_w`,默认阈值内)。`board_cell_unit.gd` 12→13 成员(删 `base` 与 `_BASE_LAYER` 预载,新增 `top_face_offset`/`visual_rect`,保留 `plate` 封印色牌;净 +1;`ContactGlow`/`MemoryGround` 用固定名字子节点、不新增成员,默认阈值内)。`ap_bar_view.gd` 14 成员不增。`cell_mark_overlay.gd` 普通数字路径只减面,封印格色牌/字形面保留。迁移函数对账:`cell_base_layer.gd` 的 `draw_base`/`_draw_south_facade`/`_draw_north_projection`/`_draw_e_facade` 不迁入新件同名函数,新件按职责重写并保留像素判据;`tile_palette.gd` 的 `load_board_tiles`/`digit_ink_mode`/`normalize_floor_luma` 不迁移(职责退役)。
**指标例外申报**:无。若实现期发现 `board_terrain_layer.gd` 超过 7/12,按职责拆 `board_terrain_face_layer.gd`(崖面/投影)——先停卡呈报,不在实现段自行扩面。
**指标例外申报**:无。若实现期发现 `board_terrain_layer.gd` 超过 7/13,按职责拆 `board_terrain_face_layer.gd`(崖面/投影)——先停卡呈报,不在实现段自行扩面。
---
@@ -222,7 +227,7 @@
- [ ] 跑 `board_shot_probe` 存三关当前帧与 `board_meta.json`,记下 hash;不重制基线(T7 才换代)。
- [ ] 确认 `game/assets/art/board/` 63 PNG+63 `.import`+`seal_mark.png` 在库;报告列清单。
- [ ] 跑 `python tools/gdstyle_gate.py` 记录 `board_view.gd` 当前 27/31 基线读数;跑 `python tools/capability_audit.py` 记录当前红项(T8 复跑)。
- [ ] 录三关 `board_type` 字符串与 art-bible v3.50 §4.1 三关八色;不采样旧瓦片均值。
- [ ] 录三关 `board_type` 字符串与 art-bible v3.51 §4.1 三关八色;不采样旧瓦片均值。
### T1 布局表与 D 区侧栏(1.5 日)
@@ -255,19 +260,20 @@
### T3 地形深度层(2.0 日)
**取用**:T2 的格边/原点;art-bible v3.50 §4.1 三关八色。
**取用**:T2 的格边/原点;art-bible v3.51 §4.1 三关八色。
**产出**:`board_terrain_palette.gd`、`board_terrain_layer.gd` 两个实例(back/front);`BoardView` 装配;`cell_base_layer.gd` 删除;接触带迁入 CellUnit。
- [ ] `board_terrain_palette.gd`:八色常量(`Color("#...")`)按 art-bible v3.50 §4.1 三关表;`palette_for(board_type)` 返回 Dictionary;未知 board_type 回退 dungeon 并记录(fail-fast 只在核心,呈现回退不刷错)。
- [ ] `board_terrain_layer.gd`:`setup(cell, cols, rows, wall_at, palette, board_type)`;`set_pass("back"/"front")`;`set_hero_foot_y(y)`;`_draw()` 中**地面/投影/背岩体只在 back 画**(整板悬崖仍由 `BoardWorld._draw` 承担,不重复绘制),岩体按 pass 过滤(back=脚底≤hero,front=>hero),每个 setter 调 `queue_redraw()`;静态 `lift_for(cell)`/`eshift_for(cell)`。
- [ ] `board_terrain_palette.gd`:八色常量(`Color("#...")`)按 art-bible v3.51 §4.1 三关表;八槽键 `rock_top/ground/cliff/seam/bevel_light/bevel_dark/ink/light_edge`;`palette_for(board_type)` 返回 Dictionary;未知 board_type 回退 dungeon 并记录(fail-fast 只在核心,呈现回退不刷错)。
- [ ] `board_terrain_layer.gd`:`setup(cell, cols, rows, wall_at, sealed_at, palette, board_type)`(`sealed_at` = 封印格查询 Callable);`set_pass("back"/"front")`;`set_hero_foot_y(y)`;`_draw()` 中**地面/投影/封印石/背岩体只在 back 画**(整板悬崖仍由 `BoardWorld._draw` 承担,不重复绘制),岩体按 pass 过滤(back=脚底≤hero,front=>hero),每个 setter 调 `queue_redraw()`;静态 `lift_for(cell)`/`eshift_for(cell)`。
- [ ] 封印石贴片(back):`sealed_at(c)` 为真的格,在连续地面之上铺本格逻辑 rect 的 `palette.light_edge` 实色(可带 1px `palette.seam` 收边),不越格、不加新色;封印黑对受光棱对比 6.45–9.94:1(art-bible v3.51 §3.2/§4.1)。
- [ ] 岩顶公式:`LIFT=round(cell*0.435)`、`ESHIFT=round(cell*0.109)`;四邻连通合并;相邻墙顶搭接 2;板边外延 ESHIFT;南崖高 LIFT、宽 cell+ESHIFT;东崖宽 ESHIFT、高 cell+LIFT;禁竖条纹。
- [ ] `BoardView` 在 `_init` 以固定名字子节点创建一次常驻的 `_world/TerrainBack`(z=-1)与 `_world/TerrainFront`(z=2),不新增类成员;两层设 `use_parent_material = true`(随 `_world.material` 去饱和);back 画地面/投影/背岩体;front 画南侧岩体;`hero z=1` 不变;格件 z 按脚底行分档(北侧 0、南侧 3),由 `_resort_cell_decals` 重算(顶面贴花/交互/迷雾同格件 z);`board_world` 悬崖保留 z=0、`mat` 取新 palette 岩顶色(`_refresh_slab` 不再写 `COL_BRICK`);`rebuild` 清 `_world` 子件时跳过 `TerrainBack`/`TerrainFront`/`LabelShadow`(只清格件与英雄),再对各层重跑 `setup`(不重建节点)。
- [ ] `BoardView._resort_cell_decals()`(私有):遍历 `_cells`,`u.z_index = 3 if c.y > hero.y else 0`;`ContactGlow`/`MemoryGround` 子件 `z_as_relative=false`、`z_index=-1`(全局 -1:地面之上、阴影圆 0 之下);`refresh` 与 `_update_hero` 末尾调用;hero 缺位时全部按 0 档。
- [ ] `board_view.gd` 删 `_paint_cell_base`/`_paint_cell_facade`(及 `_paint_cell`/`refresh` 调用)、`_floor_tile_for`/`_wall_tile_for`、`_build_cell_unit` 的 `u.base.bevel`;`_paint_cell_ink` 删 `bg` 计算/返回(`COL_FLOOR`/`COL_BRICK` 随之删);`_apply_contact_bands`/`_process`/`_reset_breath` 的 `u.base.contact_*` 改调 `ContactGlow.set_bands(bands, corners, color)`(不再经 `u.base`);`COL_DIGIT` 无引用即删;英雄贴图缺位字形「人」回退随基座退役(T4 登记)。
- [ ] `BoardView` 在 `_init` 以固定名字子节点创建一次常驻的 `_world/TerrainBack`(z=-1)与 `_world/TerrainFront`(z=2),不新增类成员;两层设 `use_parent_material = true`(随 `_world.material` 去饱和);back 画地面/投影/封印石/背岩体;front 画南侧岩体;`hero z=1` 不变;格件 z 按脚底行分档(北侧 0、南侧 3;**封印格恒 0**),由 `_resort_cell_decals` 重算(顶面贴花/交互/迷雾同格件 z);`board_world` 悬崖保留 z=0、`mat` 取新 palette 岩顶色(`_refresh_slab` 不再写 `COL_BRICK`);`rebuild` 清 `_world` 子件时跳过 `TerrainBack`/`TerrainFront`/`LabelShadow`(只清格件与英雄),再对各层重跑 `setup`(不重建节点);`setup` 传入 `_minesweeper.has_seal` 作 `sealed_at`。
- [ ] `BoardView._resort_cell_decals()`(私有):遍历 `_cells`,`u.z_index = 0 if u.seal_on else (3 if c.y > hero.y else 0)`;`ContactGlow`/`MemoryGround` 子件 `z_as_relative=false`、`z_index=-1`(全局 -1:地面之上、阴影圆 0 之下);`refresh` 与 `_update_hero` 末尾调用;hero 缺位时全部按 0 档。
- [ ] `board_view.gd` 删 `_paint_cell_base`/`_paint_cell_facade`(及 `_paint_cell`/`refresh` 调用)、`_floor_tile_for`/`_wall_tile_for`、`_build_cell_unit` 的 `u.base.bevel`;`_paint_cell_ink` 删 `bg` 计算/返回(`COL_FLOOR`/`COL_BRICK` 随之删)但保留 glyph 计算:**封印格写 `u.glyph`/`u.glyph_color`/`u.plate=true`(色牌字形),普通已开格只把 glyph 交给浮空 entries、`u.glyph` 留空**;`_apply_contact_bands`/`_process`/`_reset_breath` 的 `u.base.contact_*` 改调 `ContactGlow.set_bands(bands, corners, color, ground_visible_rect)`(不再经 `u.base`);`COL_DIGIT` 无引用即删;英雄贴图缺位字形「人」回退随基座退役(T4 登记)。
- [ ] 删除 `cell_base_layer.gd`;`board_cell_unit.gd` 去 `_BASE_LAYER` 预载、`base` 成员与 `base.draw_base`,文件头注删 `cell_base_layer` 引用;英雄蓝框随基座退役;接触带绘制迁入固定名字低层子件 `ContactGlow`(`z_as_relative=false`、全局 z=-1:地面之上、阴影圆 0 之下;只画英雄格地面侧,正交整边/斜向角点+两半边,逻辑格边,不进岩体);记忆态地面色/灰罩/记忆墨数字迁入固定名字低层子件 `MemoryGround`(同全局 -1);BoardView 计算 `ground_visible_rect`(本格逻辑 rect 扣除南/东邻未开格岩顶越入,南邻约 LIFT−SEP、东邻约 ESHIFT−SEP)并下发 `MemoryGround.setup(...)`/`ContactGlow.set_bands(..., ground_visible_rect)`,子件不读棋盘、CellUnit 不增成员;两个低层子件只绘地面可见区,禁整矩形覆盖 back 岩顶/崖面;设 `use_parent_material = true`(随世界去饱和);`draw_removed_dim` 墙格改顶面 rect。
- [ ] `standee_present_values_test.gd:79-86`:`cell_src` 源码锚由 `cell_base_layer.gd` 改指 `board_terrain_layer.gd`(北/西主亮棱绘制点),删 `FACADE_HIGHLIGHT_PX), UiKit.BRICK, true` 断言;`body_src` 段保留;跑该件至 0。
- [ ] `board_terrain_test.gd:_test_merged_mass_geometry`:四邻合并、相邻墙顶 rect 相交/搭接 2、无墙顶内框、地面无缝;`_test_projection_ratios`:38 格 LIFT=17、ESHIFT=4、南崖 17×42、南崖顶缘高光=本关受光棱、东崖 4×55、北/西 2+2+外 2 墨边、南/东内阴影 3×2。
- [ ] `board_terrain_test.gd:_test_depth_order`:三行夹具,断言 back 含北岩体、front 含南岩体、hero 在两者之间;北侧格件 `z_index=0`、南侧格件 `z_index=3`、`ContactGlow`/`MemoryGround` 全局 -1;南岩体覆盖小人脚底像素(探针)。
- [ ] `board_terrain_test.gd:_test_depth_order`:三行夹具,断言 back 含北岩体、front 含南岩体、hero 在两者之间;北侧格件 `z_index=0`、南侧格件 `z_index=3`、**封印格(含南侧)`z_index=0`**、`ContactGlow`/`MemoryGround` 全局 -1;南岩体覆盖小人脚底像素(探针)。
- [ ] `run_all.gd` 注册 `board_terrain_test.gd`。
- [ ] 跑三关 golden 采集(先不重制基线)看差异落点;报告写地形层 draw calls。
@@ -276,13 +282,13 @@
**取用**:T2 的原点/格边;T3 的深度分层。
**产出**:`board_float_layer.gd`(Control 外壳)、`board_label_shadow_layer.gd`(Node2D 世界层);`BoardView` 装配;`cell_mark_overlay` 删数字路径。
- [ ] `board_float_layer.gd`:`setup(cell, origin, entries, font)`(origin = 壳层棋盘原点);`_draw()` 画双色引导线(左深右浅、2px、格顶−12..格顶+4)→数字(字高 21、2px 八向描边、1px 浮空投影、暖白芯);`危/?` 同规则;`label_rects()`/`label_metrics()`(壳层局部坐标);全幅 Control(`mouse_filter=IGNORE`)、z 最高;每个 setter 调 `queue_redraw()`;**不画阴影圆**。
- [ ] `board_label_shadow_layer.gd`:`setup(cell, cells)`(世界局部/格坐标系,不传 shell 原点);`_draw()` 画 10×6 四层同心椭圆(外→内 α40/70/105/140,尺寸 100%/80%/60%/40%;用 `draw_set_transform` 缩放后 `draw_circle` 或 16 点椭圆多边形,禁单用 `draw_circle`);圆心 = 逻辑格心、格顶+7;z=0(小人之下);`circle_rects()`(世界局部);setter 调 `queue_redraw()`。
- [ ] `BoardView` 在 `_init` 以固定名字子节点创建一次常驻的 `FloatLayer`(BoardView 子 Control,全幅,z 最高)与 `_world/LabelShadow`(Node2D,z=0),不新增类成员;`LabelShadow` 设 `use_parent_material = true`,`FloatLayer` 不在 `_world` 材质链,`set_desaturated` 同拍给 `FloatLayer.material = _desat_mat`/`null`(结算期浮空数字同样灰化,禁成彩色例外);`rebuild` 清 `_world` 子件时跳过 `LabelShadow`(T3 同款跳过表);entries 由 `refresh` 的 `u.glyph` 生成(`1–8`/`危`/`?`),记忆态不生成 entries。
- [ ] `BoardView.set_world_font(f)` 同时 `FloatLayer.set_font(f)`;`cell_mark_overlay.gd` 删 `tex_glyph`/`plate`/`_draw_digit_plate`/字形绘制;`draw_glyph_layer` 只留徽章;`BoardCellUnit.plate` 删除;`board_view.gd` 删 `_digit_ink`/`_palette.digit_*`;`refresh` 字形段删 `_digit_ink` 三档与 `plate_digit`/`u.plate` 写入(:577-591),只写 `u.glyph`/`u.glyph_color`(记忆墨仍用 `FOG_MEMORY_INK`;浮空字固定暖白芯);英雄贴图缺位字形「人」回退随基座退役(资产在包,正常路径不可达),实现报告「实现决定记录」登记。
- [ ] `board_float_layer.gd`:`setup(cell, origin, entries, font)`(origin = 壳层棋盘原点);`_draw()` 画双色引导线(左深右浅、2px、格顶−12..格顶+4)→数字(字高 21、2px 八向描边、1px 浮空投影、暖白芯);`危/?` 同规则;`label_rects()`/`label_metrics()`(壳层局部坐标);全幅 Control(`mouse_filter=IGNORE`)、z 最高;每个 setter 调 `queue_redraw()`;**不画阴影圆;封印格不进 entries**。
- [ ] `board_label_shadow_layer.gd`:`setup(cell, cells)`(世界局部/格坐标系,不传 shell 原点;`cells` = 浮空 entries 的格集,**不含封印格**);`_draw()` 画 10×6 四层同心椭圆(外→内 α40/70/105/140,尺寸 100%/80%/60%/40%;用 `draw_set_transform` 缩放后 `draw_circle` 或 16 点椭圆多边形,禁单用 `draw_circle`);圆心 = 逻辑格心、格顶+7;z=0(小人之下);`circle_rects()`(世界局部);setter 调 `queue_redraw()`。
- [ ] `BoardView` 在 `_init` 以固定名字子节点创建一次常驻的 `FloatLayer`(BoardView 子 Control,全幅,z 最高)与 `_world/LabelShadow`(Node2D,z=0),不新增类成员;`LabelShadow` 设 `use_parent_material = true`,`FloatLayer` 不在 `_world` 材质链,`set_desaturated` 同拍给 `FloatLayer.material = _desat_mat`/`null`(结算期浮空数字同样灰化,禁成彩色例外);`rebuild` 清 `_world` 子件时跳过 `LabelShadow`(T3 同款跳过表);entries 由 `refresh` 的已开记录生成(`1–8`/`危`/`?`),**封印格跳过**(其字形走色牌),记忆态不生成 entries。
- [ ] `BoardView.set_world_font(f)` 同时 `FloatLayer.set_font(f)`;`cell_mark_overlay.gd` 删普通数字字形/色牌路径,**保留封印格字形+`_draw_digit_plate` 色牌**;`BoardCellUnit.plate` 保留(封印格 `true`、普通格 `false`);`board_view.gd` 删 `_digit_ink`/`_palette.digit_*`;`refresh` 字形段删 `_digit_ink` 三档与 `plate_digit` 普通路径(:586-591),封印格写 `u.glyph`/`u.glyph_color`/`u.plate=true`,普通已开格只交 entries(记忆墨仍用 `FOG_MEMORY_INK`;浮空字固定暖白芯);英雄贴图缺位字形「人」回退随基座退役(资产在包,正常路径不可达),实现报告「实现决定记录」登记。
- [ ] `run_all.gd` 注册 `board_float_label_test.gd`。
- [ ] `board_float_label_test.gd:_test_label_geometry`:字高 21、字底距格顶 15、视觉顶距格顶 38、线 2px、1px 投影;`_test_topmost_layer`:`FloatLayer` 为 BoardView 子 Control、z 最高、顶行 rect 在 D 区内(顶行 top=6 local);`_test_shadow_circle`:圆 10×6、圆心格顶+7、`_world/LabelShadow.z==0` 低于 hero、开启格才有圆;`_test_desaturation`:`set_desaturated(true)` 后 `FloatLayer.material` 与 `TerrainBack/TerrainFront/LabelShadow` 的 `use_parent_material` 同拍生效;`_test_contrast`:四类底复合对比 ≥4.5。
- [ ] `board_float_label_test.gd` 与 `board_terrain_test.gd:_test_no_plate_path` 扫描源码:`DIGIT_PLATE`/`plate`/`_draw_digit_plate` 在棋盘路径零命中。
- [ ] `board_float_label_test.gd:_test_label_geometry`:字高 21、字底距格顶 15、视觉顶距格顶 38、线 2px、1px 投影;`_test_topmost_layer`:`FloatLayer` 为 BoardView 子 Control、z 最高、顶行 rect 在 D 区内(顶行 top=6 local);`_test_shadow_circle`:圆 10×6、圆心格顶+7、`_world/LabelShadow.z==0` 低于 hero、开启格才有圆、封印格无圆;`_test_desaturation`:`set_desaturated(true)` 后 `FloatLayer.material` 与 `TerrainBack/TerrainFront/LabelShadow` 的 `use_parent_material` 同拍生效;`_test_contrast`:四类底复合对比 ≥4.5。
- [ ] `board_float_label_test.gd:_test_no_ordinary_plate_path` 与 `board_terrain_test.gd:_test_seal_substrate` 扫描/断言:普通数字路径(`board_view.gd`/`board_float_layer.gd` 与 `cell_mark_overlay` 的非封印分支)零 `plate_digit`/`_digit_ink_mode`;`DIGIT_PLATE`/`_draw_digit_plate` 只在封印格分支命中。
- [ ] 跑 `board_float_label_test`;三关截图看顶行数字越界与小人遮圆;报告写读数。
### T5 交互/封印/微光/迷雾锚点(1.5 日)
@@ -291,12 +297,12 @@
**产出**:`cell_mark_overlay`/`cell_unit`/`seal_mark_layer`/`cell_type_glow_layer`/`board_view` 锚点与 fog rect;`board_terrain_test` 锚点/迷雾断言。
- [ ] `BoardView._top_face_rect(c)`(私有)= 墙格 `Rect2(x-ESHIFT, y-LIFT, cell, cell)`、地面格逻辑 rect;`BoardView._visual_rect_for(c)`(私有)= 墙格 `Rect2(x-ESHIFT, y-LIFT, cell+ESHIFT, cell+LIFT)`、地面格逻辑 rect;两者不新增公开方法。
- [ ] `CellUnit` 增 `top_face_offset`(墙格 `(-ESHIFT,-LIFT)`、地面 `(0,0)`)与 `visual_rect`;`_draw` 用 `Rect2(top_face_offset, edge, edge)` 传给 face;`_sync_seal_layer` 调 `setup(edge, visible, top_face_offset)`;`cell_type_glow_layer.setup(edge, group, top_face_offset)`;`cell_mark_overlay` 的变异/徽章/悬停/退色/路径按该 rect(墙格顶面、地面逻辑;路径点迹只地面逻辑)。
- [ ] 封印圆心:`seal_mark_layer.setup(edge, visible, center_offset=Vector2(-ESHIFT,-LIFT))`;环径/环壁/十字/光圈比例不变;验收 `ring_px` 仍 82%±1。
- [ ] `CellUnit` 增 `top_face_offset`(墙格 `(-ESHIFT,-LIFT)`、地面 `(0,0)`)与 `visual_rect`;`_draw` 用 `Rect2(top_face_offset, edge, edge)` 传给 face;`_sync_seal_layer` 调 `setup(edge, visible)`(**不传 top_face_offset**——封印居逻辑格心,见下条);`cell_type_glow_layer.setup(edge, group, top_face_offset)`;`cell_mark_overlay` 的变异/徽章/悬停/退色/路径按该 rect(墙格顶面、地面逻辑;路径点迹只地面逻辑)。
- [ ] 封印圆心:`seal_mark_layer.setup(edge, visible)` 不变(子件本地全幅 draw_rect,圆心 = CellUnit 本地 `(edge/2, edge/2)` = 逻辑格心);**不随岩顶 −ESHIFT/−LIFT 偏移**(art-bible v3.51 §3.2/§8.2);环径/环壁/十字/光圈比例不变;验收 `ring_px` 仍 82%±1。封印子件设 `show_behind_parent = true`,保证身份色牌叠于法阵之上;封印格地面受光棱石由 `board_terrain_layer` back 画(T3)。
- [ ] 类型微光:绘制 rect 改顶面 rect;`board_shot_probe`/`type_glow_shot_probe` 的「禁越圈」允许区改顶面 rect;微光不越出本格岩顶。
- [ ] 迷雾:`CellUnit._draw_fog_layer` 墙格画三块黑罩(顶面 rect+南面 `Rect2(x-ESHIFT,y-LIFT+cell,cell+ESHIFT,LIFT)`+东面 `Rect2(x-ESHIFT+cell,y-LIFT,ESHIFT,cell+LIFT)`;只在未开格);记忆态由固定名字低层子件 `MemoryGround` 画新地面色(palette floor)+灰罩+记忆墨数字,不读 `base.tex_base`,不生成浮空 entries;只绘地面可见区(扣南/东邻岩顶越入),不覆盖北/西邻格地面。
- [ ] 迷雾:`CellUnit._draw_fog_layer` 墙格画三块黑罩(顶面 rect+南面 `Rect2(x-ESHIFT,y-LIFT+cell,cell+ESHIFT,LIFT)`+东面 `Rect2(x-ESHIFT+cell,y-LIFT,ESHIFT,cell+LIFT)`;只在未开格);记忆态由固定名字低层子件 `MemoryGround` 画新地面色(palette floor)+灰罩+记忆墨数字,不读 `base.tex_base`,不生成浮空 entries;只绘地面可见区(扣南/东邻岩顶越入),不覆盖北/西邻格地面;封印格在记忆态同样随格隐没(印记与色牌不显)。
- [ ] 接触带:绘制迁入固定名字低层子件 `ContactGlow`(全局 z=-1:地面之上、阴影圆 0 之下);`board_view._apply_contact_bands`/`_process`/`_reset_breath` 改调 `ContactGlow.set_bands(bands, corners, color, ground_visible_rect)`,不再经 `u.base.contact_*`;只画英雄格地面侧,正交整边/斜向角点+两半边;只绘地面可见区(扣南/东邻岩顶越入);`_contact_unit` rect 不改;光不进岩体。
- [ ] `board_terrain_test.gd:_test_top_face_anchor`:封印圆心、变异纹带、微光 rect 均按 `-ESHIFT/-LIFT`;`_test_fog_rect`:墙格三块黑罩覆盖顶面+南+东、地面格不越格;采样北邻格左上 (x_n+2,y_n+2) 与西邻格左上 (x_w+2,y_w+2) 的非岩顶地面像素 = 原地面色、零黑罩(岩顶投影可越入邻格屏幕区);`_test_memory_cover`:记忆态格与南邻墙体重叠区采样,`MemoryGround` 只绘地面可见区,记忆地面/灰罩/记忆墨与 `removed_dim` 不覆盖南邻岩顶(重叠区像素来自南邻墙体);`_test_contact_glow`:接触带只绘地面可见区、在英雄格地面侧且全局 z=-1。
- [ ] `board_terrain_test.gd:_test_top_face_anchor`:**封印圆心 = 逻辑格心(不偏移)**、变异纹带/微光 rect 按 `-ESHIFT/-LIFT`;`_test_seal_substrate`:封印格地面像素 = 本关 `palette.light_edge`、普通已开格 = `palette.ground`;封印格 `plate=true`、`glyph` 为危/数字、无浮空 entries/无阴影圆;封印格 `z_index=0`;`_test_fog_rect`:墙格三块黑罩覆盖顶面+南+东、地面格不越格;采样北邻格左上 (x_n+2,y_n+2) 与西邻格左上 (x_w+2,y_w+2) 的非岩顶地面像素 = 原地面色、零黑罩(岩顶投影可越入邻格屏幕区);`_test_memory_cover`:记忆态格与南邻墙体重叠区采样,`MemoryGround` 只绘地面可见区,记忆地面/灰罩/记忆墨与 `removed_dim` 不覆盖南邻岩顶(重叠区像素来自南邻墙体);`_test_contact_glow`:接触带只绘地面可见区、在英雄格地面侧且全局 z=-1。
- [ ] 跑 `seal_mark_params_test`/`type_glow_test`/`board_terrain_test`;报告写读数。
### T6 旧瓦片与旧路径退役(0.5 日)
@@ -306,7 +312,7 @@
- [ ] 删除 `game/assets/art/board/terrain_*` 63 PNG 与同名 `.import`;保留 `seal_mark.png`+`.import`。
- [ ] 删除 `tile_palette.gd`、`terrain_tile_sets_test.gd`;`run_all.gd` 移除该套件;`board_view.gd`/`board_world.gd`/`ui_contrast_probe.gd` 的 `TilePalette` 引用全清。
- [ ] `player_copy_sweep_test.gd:145` 删 `u.plate==true`,改查浮空 entries/`label_metrics()` 或记忆态 glyph;`ui_contrast_probe._fog_derived_check` 改读 `board_terrain_palette` 的新地面/岩顶色或渲染帧取样,三行行值按新地面色重算(±2/255),删除旧瓦片均值段。
- [ ] `player_copy_sweep_test.gd:142-147`:普通已开危险格 `u.plate==true` 改 `u.plate==false`,并断言浮空 entries 含该格(或 `label_metrics()` 有该格);封印格色牌断言归 `board_terrain_test._test_seal_substrate`;`ui_contrast_probe._fog_derived_check` 改读 `board_terrain_palette` 的新地面/岩顶色或渲染帧取样,三行行值按新地面色重算(±2/255),删除旧瓦片均值段。
- [ ] `board_terrain_test.gd:_test_legacy_assets_absent`:目录无 `terrain_*`、`seal_mark.png` 在库;源码 grep 零 `terrain_`/`TilePalette`/`CellBaseLayer`/`u.base`。
- [ ] 跑 `repo_structure_audit.py`、`capability_audit.py` 与 `board_terrain_test`;报告写清单;旧地形行**保留**(实现批禁写 `game/tests/README.md`;删除归写卡段后续,T8 audit 经卡内豁免通道绿)。
@@ -315,10 +321,10 @@
**取用**:T3–T6 全绿。
**产出**:`board_shot_probe` 视图 1036×548、侧栏 200、顶面 rect 微光圈/封印 rect;三关 golden 重制;渲染闸绿;`type_glow_shot_probe`/`layout_probe`/`ui_input_probe`/`ui_contrast_probe` 换代;三关色板逐值/互辨。
- [ ] `board_shot_probe.gd`:`view.size=Vector2(1036,548)`、`view.position=Vector2.ZERO`;`view.rebuild(..., 200)`;`_meta` 写全幅 rect;`_crop_cell` 用 `_visual_rect_for` 的屏幕换算;`_check_dual_frames` 的允许区改顶面 rect(用 `lift_for/eshift_for` 换算);`_seal_evidence` 取样 rect 改顶面 rect;注释与 `game/tests/golden/README.md` 口径一致。
- [ ] `board_shot_probe.gd`:`view.size=Vector2(1036,548)`、`view.position=Vector2.ZERO`;`view.rebuild(..., 200)`;`_meta` 写全幅 rect;`_crop_cell` 用 `_visual_rect_for` 的屏幕换算;`_check_dual_frames` 的允许区改顶面 rect(用 `lift_for/eshift_for` 换算);**`_seal_evidence` 保持逻辑格 rect(封印居格心),选择器按迭代56后的 `has_seal` 口径**;注释与 `game/tests/golden/README.md` 口径一致。
- [ ] `type_glow_shot_probe.gd:64-78` 视图改 1036×548、`rebuild(..., 200)`(与生产同格边 38),允许区/取样改顶面 rect;`layout_probe.gd` 的 `_cell_for` 带侧栏;`ui_input_probe.gd` 的恢复调用带侧栏;`ui_contrast_probe` 浮空四类底段与迷雾段换代。
- [ ] 跑一次渲染闸看差异(预判棋盘三图全幅 changed>0,属换代);**显式呈报用户,按 `game/tests/golden/README.md` 现行口径获用户确认后**再按 `tools/golden_baseline_refresh.sh` 重制三关基线;复闸绿。
- [ ] 三关色板逐值核对:`board_terrain_test.gd:_test_palette_three_boards` 与 art-bible v3.50 §4.1 三关八色同值(用户 2026-11-07 已看样张冻结);`glow_discrimination_sheet.py` 读已删旧 `terrain_*`,本批不跑,工具换代登记待办(tools 批);不过即停卡呈报,不调色绕过。
- [ ] 三关色板逐值核对:`board_terrain_test.gd:_test_palette_three_boards` 与 art-bible v3.51 §4.1 三关八色同值(用户 2026-11-07 已看样张冻结);`glow_discrimination_sheet.py` 读已删旧 `terrain_*`,本批不跑,工具换代登记待办(tools 批);不过即停卡呈报,不调色绕过。
- [ ] 跑 `bash tools/run_all_gates.sh --code`;报告写 smoke/unit/probe/render 读数。
### T8 产出物落位(0.5 日)
@@ -344,17 +350,17 @@
| 2. 格边/原点/顶预留/重建接线(判据:`design/ux/battle.md:140,144`) | `board_view.gd:205-232,403-404,428-439`、`main.gd:470`、`main_debug_flow.gd:104` | `board_terrain_test.gd:_test_cell_formula_base`+`_test_hit_test_logical_rect`;`layout_probe.gd:_ready`;`ui_input_probe.gd` | 单元+探针 | `BoardView.set_cell_area(Vector2(1036,548), 200)`/`rebuild(..., 200)` | `_cell_for(12, Vector2(1036,548), 200)==38`、`_cell_for(14, Vector2(1036,548), 200)==32`、局部原点 (279,44)/(281,44)、屏幕 (523,296)、全格命中 | 新增:棋盘点击命中与格边公式(逻辑格矩形) |
| 3. 合并岩体+连续地面(判据:`design/art/art-bible.md:170,173`) | `board_terrain_layer.gd`(新增)、`board_view.gd`、删 `cell_base_layer.gd` | `board_terrain_test.gd:_test_merged_mass_geometry`;`standee_present_values_test.gd:_init`(V11 源码锚改指 `board_terrain_layer.gd`);三关 `board_shot_probe` 截图 | 单元+探针 | `BoardView.rebuild()`→`_world/TerrainBack`、`_world/TerrainFront` 的 `mass_rects()` | 四邻合并、相邻墙顶搭接 2、无墙顶内框、地面无缝、板边外延 ESHIFT;V11 口沿高光新锚在位且全套件绿 | 新增:棋盘合并岩体与连续地面(深度遮挡、投影、崖面) |
| 4. 投影/崖面/受光(判据:`design/art/art-bible.md:171,172,174`) | `board_terrain_layer.gd` | `board_terrain_test.gd:_test_projection_ratios`;三关 golden | 单元+探针 | 同上 | 38 格 LIFT=17、ESHIFT=4、南崖 17×42、南崖顶缘高光=本关受光棱、东崖 4×55、北/西 2+2+外2、南/东内阴影 3×2 自 0.217 起、投影 4×4 α0.44/0.30/0.16/0.07 | 新增:棋盘合并岩体与连续地面(深度遮挡、投影、崖面) |
| 5. 脚底排序遮挡(判据:`design/art/art-bible.md:175`) | `board_terrain_layer.gd`、`board_world.gd:39,48` | `board_terrain_test.gd:_test_depth_order`;三关截图 | 单元+探针 | 构造 hero 行与南邻墙;`terrain_metrics()["order"]`/`CellUnit.z_index` | back 含脚底≤hero 的岩体、front 含 >hero 的岩体;北侧格件 z=0、南侧格件 z=3、`ContactGlow`/`MemoryGround` 全局 -1;南岩体覆盖小人脚底像素 | 新增:棋盘合并岩体与连续地面(深度遮挡、投影、崖面) |
| 6. 浮空字+阴影圆几何/对比(判据:`design/art/art-bible.md:176`、`design/ux/battle.md:307`) | `board_float_layer.gd`(新增)、`board_label_shadow_layer.gd`(新增) | `board_float_label_test.gd:_test_label_geometry`+`_test_shadow_circle`+`_test_contrast`;`ui_contrast_probe.gd` 浮空字段 | 单元+探针 | `BoardView.refresh()`→`FloatLayer.set_entries()`/`_world/LabelShadow.setup()` | 字高 21、间距 15、视觉顶 38、线 2、1px 投影;圆 10×6、圆心格顶+7、z=0 低于 hero;四类底复合对比 ≥4.5 | 新增:棋盘浮空数字与引导线(最顶层、顶部预留) |
| 5. 脚底排序遮挡(判据:`design/art/art-bible.md:175`) | `board_terrain_layer.gd`、`board_world.gd:39,48` | `board_terrain_test.gd:_test_depth_order`;三关截图 | 单元+探针 | 构造 hero 行与南邻墙;`terrain_metrics()["order"]`/`CellUnit.z_index` | back 含脚底≤hero 的岩体、front 含 >hero 的岩体;北侧格件 z=0、南侧格件 z=3、**封印格(含南侧)z=0**、`ContactGlow`/`MemoryGround` 全局 -1;南岩体覆盖小人脚底像素 | 新增:棋盘合并岩体与连续地面(深度遮挡、投影、崖面) |
| 6. 浮空字+阴影圆几何/对比(判据:`design/art/art-bible.md:176`、`design/ux/battle.md:307`) | `board_float_layer.gd`(新增)、`board_label_shadow_layer.gd`(新增) | `board_float_label_test.gd:_test_label_geometry`+`_test_shadow_circle`+`_test_contrast`;`ui_contrast_probe.gd` 浮空字段 | 单元+探针 | `BoardView.refresh()`→`FloatLayer.set_entries()`/`_world/LabelShadow.setup()` | 字高 21、间距 15、视觉顶 38、线 2、1px 投影;圆 10×6、圆心格顶+7、z=0 低于 hero;**封印格无 entries/无圆**;四类底复合对比 ≥4.5 | 新增:棋盘浮空数字与引导线(最顶层、顶部预留) |
| 7. 浮空层最顶/顶行不裁切(判据:`design/ux/battle.md:165,307,313`) | `board_view.gd` 层装配、`board_float_layer.gd` | `board_float_label_test.gd:_test_topmost_layer`+`_test_desaturation`;三关截图 | 单元+探针 | `BoardView` 固定名字子件 z 序与 entries/`set_desaturated()` | `FloatLayer` 为 BoardView 子 Control、z 最高;`TerrainBack`/`TerrainFront`/`LabelShadow` 固定名字在树;顶行 rect top=6 local;无元素遮数字/线;结算期浮空层与地形层同拍灰化 | 新增:棋盘浮空数字与引导线(最顶层、顶部预留) |
| 8. 顶面锚点/交互(判据:`design/art/art-bible.md:167,175`、`design/ux/battle.md:311-312`) | `board_view.gd`、`cell_mark_overlay.gd`、`seal_mark_layer`、`cell_type_glow_layer`、`board_cell_unit.gd` | `board_terrain_test.gd:_test_top_face_anchor`;`seal_mark_params_test.gd`;`type_glow_test.gd` | 单元+探针 | `BoardView.refresh()`→`CellUnit.visual_rect`/`CellUnit.z_index` | 封印圆心/变异/微光/墙格悬停按 -ESHIFT/-LIFT;地面路径按逻辑 rect;环径 82%±1;北侧格件贴花低于小人、南侧随岩体在前 | 新增:棋盘顶面锚点与迷雾几何(封印、微光、变异的岩顶偏移) |
| 9. 迷雾几何/记忆态(判据:`design/art/art-bible.md:427-429`) | `board_cell_unit.gd:_draw_fog_layer`/`MemoryGround`、`board_view.gd` | `board_terrain_test.gd:_test_fog_rect`+`_test_memory_cover`;`ui_contrast_probe.gd` 迷雾段;`type_glow_test.gd` | 单元+探针 | `BoardView.refresh()`→`CellUnit.fog_state`/`MemoryGround` | 墙格三块黑罩(顶面+南+东)覆盖、北/西邻格非岩顶地面像素零覆盖(岩顶投影可越入邻格屏幕区);地面格不越格;记忆态/退色不覆盖南邻岩顶(`MemoryGround` 只绘地面可见区,重叠区像素来自南邻墙体);记忆态无浮空 entries;记忆墨对比 ≥4.5 | 新增:棋盘顶面锚点与迷雾几何(封印、微光、变异的岩顶偏移) |
| 8. 顶面锚点/封印/交互(判据:`design/art/art-bible.md:167,175`、`design/ux/battle.md:311-312`) | `board_view.gd`、`cell_mark_overlay.gd`、`seal_mark_layer`、`cell_type_glow_layer`、`board_cell_unit.gd` | `board_terrain_test.gd:_test_top_face_anchor`+`_test_seal_substrate`;`seal_mark_params_test.gd`;`type_glow_test.gd` | 单元+探针 | `BoardView.refresh()`→`CellUnit.visual_rect`/`CellUnit.z_index`/封印格 `plate` | **封印圆心=逻辑格心(不偏移)**、变异/微光/墙格悬停按 -ESHIFT/-LIFT;地面路径按逻辑 rect;环径 82%±1;封印格 `plate=true`、`glyph` 为危/数字、无浮空/无圆、色牌叠法阵上;封印格 z=0 低于小人,其余格件北 0/南 3 | 新增:棋盘顶面锚点与迷雾几何(微光、变异岩顶偏移,封印格心) |
| 9. 迷雾几何/记忆态(判据:`design/art/art-bible.md:427-429`) | `board_cell_unit.gd:_draw_fog_layer`/`MemoryGround`、`board_view.gd` | `board_terrain_test.gd:_test_fog_rect`+`_test_memory_cover`;`ui_contrast_probe.gd` 迷雾段;`type_glow_test.gd` | 单元+探针 | `BoardView.refresh()`→`CellUnit.fog_state`/`MemoryGround` | 墙格三块黑罩(顶面+南+东)覆盖、北/西邻格非岩顶地面像素零覆盖(岩顶投影可越入邻格屏幕区);地面格不越格;记忆态/退色不覆盖南邻岩顶(`MemoryGround` 只绘地面可见区,重叠区像素来自南邻墙体);封印格记忆态随格隐没;封印格地面=palette.light_edge;记忆态无浮空 entries;记忆墨对比 ≥4.5 | 新增:棋盘顶面锚点与迷雾几何(微光、变异岩顶偏移,封印格心) |
| 10. 命中逻辑格(判据:`design/ux/battle.md:140`) | `board_view.gd:428-439` | `board_terrain_test.gd:_test_hit_test_logical_rect` | 单元 | `BoardView.cell_center_local()`/`_cell_at()` | 全格 `_cell_at(cell_center_local(c))==c`;顶面左上角点按逻辑归北/西邻格;板外 (-9,-9) | 新增:棋盘点击命中与格边公式(逻辑格矩形) |
| 11. 旧资产退役/零底牌(判据:`design/art/art-bible.md:177,202`) | `game/assets/art/board/`、`tile_palette.gd`、`cell_base_layer.gd`、`terrain_tile_sets_test.gd` | `board_terrain_test.gd:_test_legacy_assets_absent`;`board_float_label_test.gd:_test_no_plate_path`;`repo_structure_audit.py` | 单元+静态 | 扫描 `game/assets/art/board/` 与源码 | 零 `terrain_*`、零 `TilePalette`/`CellBaseLayer`/`u.base`、`seal_mark.png` 在库、零 `DIGIT_PLATE`/`plate` | 新增:旧瓦片退役与棋盘零底牌 |
| 11. 旧资产退役/普通数字零底牌(判据:`design/art/art-bible.md:177,215`) | `game/assets/art/board/`、`tile_palette.gd`、`cell_base_layer.gd`、`terrain_tile_sets_test.gd` | `board_terrain_test.gd:_test_legacy_assets_absent`;`board_float_label_test.gd:_test_no_ordinary_plate_path`;`repo_structure_audit.py` | 单元+静态 | 扫描 `game/assets/art/board/` 与源码 | 零 `terrain_*`、零 `TilePalette`/`CellBaseLayer`/`u.base`、`seal_mark.png` 在库、普通数字零 `plate_digit`/`_digit_ink_mode`(封印格 `plate`/`DIGIT_PLATE` 为唯一例外) | 新增:旧瓦片退役与普通数字零底牌 |
| 12. 侧栏信号/setter(判据:`design/ux/battle.md:163`) | `ap_bar_view.gd` | `board_side_rail_test.gd:_test_signals` | 单元 | 真实按钮 `pressed`/setter | `stop_pressed`/`refresh_confirmed`/`legend_toggled` 逐信号;`set_ap`/`set_rap`/`set_refresh_state` 读数 | 新增:D 区行动资源侧栏(AP 左栏、RAP 右栏、全高棋盘) |
| 13. 接触带延续(判据:`design/art/art-bible.md:168`) | `board_cell_unit.gd`、`board_view.gd:740,764-765` | `board_terrain_test.gd:_test_contact_glow`;`type_glow_test.gd` | 单元 | `BoardView.refresh()`→`ContactGlow.set_bands(..., ground_visible_rect)` | 英雄格地面侧接触带在位,正交整边/斜向角点+两半边,只绘地面可见区、不进岩体;全局 z=-1 | 既有:未开格类型微光(8 邻作用集、五组色相、零玩法写入) |
| 14. 三关色板/互辨(判据:`design/art/art-bible.md:202,414`) | `board_terrain_palette.gd` | `board_terrain_test.gd:_test_palette_three_boards` | 单元+静态 | `palette_for("dungeon"/"underdark"/"deep_underdark")` | 三关八色与 art-bible v3.50 §4.1 逐值一致;三关同名槽位不全等(用户过审样张冻结);不变槽恒定 | 新增:棋盘合并岩体与连续地面(深度遮挡、投影、崖面) |
| 15. 取证面换代(判据:`game/tests/golden/README.md:28,31`) | `board_shot_probe.gd`、`type_glow_shot_probe.gd`、`layout_probe.gd`、`ui_input_probe.gd`、`ui_contrast_probe.gd` | 三关 `board_shot_probe`+渲染闸;`type_glow_shot_probe`;`layout_probe.gd:_ready`;`ui_input_probe.gd`;`ui_contrast_probe.gd` | 探针+渲染闸 | `res://probe/board_shot_probe.tscn`;`tools/render_gate.sh` | 视图 1036×548、侧栏 200、裁剪全幅、顶面 rect 微光圈/封印 rect、三关 golden 重制后 0 差异 | 既有:战斗屏三区几何与棋盘格边长(分辨率两档×四档板型) |
| 14. 三关色板/互辨(判据:`design/art/art-bible.md:202,415`) | `board_terrain_palette.gd` | `board_terrain_test.gd:_test_palette_three_boards` | 单元+静态 | `palette_for("dungeon"/"underdark"/"deep_underdark")` | 三关八色与 art-bible v3.51 §4.1 逐值一致;三关同名槽位不全等(用户过审样张冻结);不变槽恒定;封印石读 `light_edge` | 新增:棋盘合并岩体与连续地面(深度遮挡、投影、崖面) |
| 15. 取证面换代(判据:`game/tests/golden/README.md:28,31`) | `board_shot_probe.gd`、`type_glow_shot_probe.gd`、`layout_probe.gd`、`ui_input_probe.gd`、`ui_contrast_probe.gd` | 三关 `board_shot_probe`+渲染闸;`type_glow_shot_probe`;`layout_probe.gd:_ready`;`ui_input_probe.gd`;`ui_contrast_probe.gd` | 探针+渲染闸 | `res://probe/board_shot_probe.tscn`;`tools/render_gate.sh` | 视图 1036×548、侧栏 200、裁剪全幅、顶面 rect 微光圈、**封印取证保持逻辑格 rect(圆心格心)**、三关 golden 重制后 0 差异 | 既有:战斗屏三区几何与棋盘格边长(分辨率两档×四档板型) |
| 16. 测试入口/能力审计(判据:`design/engineering/test-conventions.md:196`) | `run_all.gd:225`、新增测试件、`game/tests/README.md` | `bash tools/run_all_gates.sh --code`;`capability_audit.py` | 集成 | 单元测试全套件 | 三新套件在册、terrain 套件移除、能力审计红项 0、全绿 | 新增:棋盘合并岩体与连续地面(深度遮挡、投影、崖面) |
| 17. 产出物/独立审计(判据:`design/engineering/test-conventions.md:147`) | `reports/` | 末卡产出物落位;`reports/iter<N>-验收审计-<日期>.md` | 集成 | 实现报告/反哺点清单/审计报告 | 三件齐、逐行勾选、审计未过不合并 | 既有:战斗屏三区几何与棋盘格边长(分辨率两档×四档板型) |
@@ -362,7 +368,7 @@
- `terrain_tile_sets_test.gd` 整件删除(旧瓦片套/三态墨色已退役);其“格套完整性/色相域/墨模式”覆盖由 `board_terrain_test`/`board_float_label_test` 接班。
- `ui_contrast_probe.gd` 旧瓦片均值段与 `_fog_derived_check` 的 TilePalette 依赖删除;改为读新 palette/渲染帧,浮空字四类底段新增。
- `stage_background_test.gd` 新增 `_test_side_rail_width_from_table`(该件无旧 AP 条高度测试可改名),等价断言 `side_rail_w==200`;`player_copy_sweep_test.gd:145` 的 `u.plate==true` 删除,改查浮空 entries/记忆态 glyph。
- `stage_background_test.gd` 新增 `_test_side_rail_width_from_table`(该件无旧 AP 条高度测试可改名),等价断言 `side_rail_w==200`;`player_copy_sweep_test.gd:142-147` 的普通已开危险格 `u.plate==true` 改 `u.plate==false`+浮空 entries 含该格(封印格色牌保留,归 `_test_seal_substrate`)。
- `board_view.gd` 的 `_paint_cell_base`/`_paint_cell_facade` 段随基座退役(其立面/投影/蓝框覆盖由 `board_terrain_test` 的岩体/崖面/接触带断言接班);`u.base.*` 无残留。
- `standee_present_values_test.gd:79-86` 的 `cell_src` 源码锚由 `cell_base_layer.gd` 改指 `board_terrain_layer.gd`(旧口沿高光绘制点随基座退役,等价断言改新落点);`body_src` 的 V11 断言保留。
- `board_shot_probe.gd` 的 900×900 视图与逻辑格“禁越圈”允许区替换为 1036×548 与顶面 rect;加严口径本身不删、不放宽。
@@ -377,7 +383,8 @@
- **L1 自救**:测试环境缺 `user://`、字体、导入缓存——按 `game/tests/README.md` 现行坑册处置。
- **L2 记录继续**:三关色板派生读数偏差在 ±1 通道内、draw calls 波动 <10%——记入实现报告继续。
- **L3 停机呈报**:
- 新路径与 art-bible 条款冲突(比例/顶预留/圆心/层序/三关色板任一不符)——停卡,列反哺点,禁自行改条款。
- 新路径与 art-bible 条款冲突(比例/顶预留/圆心/层序/三关色板/封印承载任一不符)——停卡,列反哺点,禁自行改条款。
- 封印呈现与迭代56「受理即揭示」或 art-bible v3.51 封印条冲突(印记落未开格、圆心随岩顶偏移、身份字形进浮空层、色牌层序颠倒、封印石对比 <4.5)——停卡呈报,禁把封印改回旧假设。
- `board_terrain_layer` 超 7 公开方法/12 成员且按职责拆不出内聚单元——停卡走豁免/还债通道,禁凑数拆绿。
- 机检键与卡片契约互斥(如测试要求保留 `plate` 字段)——停卡呈报,禁为机检保留无效成员。
- 三关色板逐值/互辨不过——停卡呈报,禁调色绕过或改判据。
@@ -398,12 +405,13 @@
5. 记忆态灰罩的绘制方式(只要不出现浮空层、对比 ≥4.5、地面色取 palette)。
6. 测试夹具的构造方式(直接 `new()` 或场景实例化,只要走真实入口)。
7. 记忆态地面/灰罩/记忆墨拆入低层子件的具体绘制顺序(只要不覆盖南邻岩顶、对比 ≥4.5)。
8. 封印石贴片的收边方式(整格或内缩 0–1px、是否加 1px `palette.seam` 收边)——只要不越格、对比 ≥4.5、零新增色。
---
## 15. 待裁点
零待裁点。已裁记录:①underdark/deep 两关色板 2026-11-07 用户看方向样张后选「按目标八色冻结」;②棋盘底操作提示条退役 2026-11-07 用户选定。开工门=U0(用户批卡);U0 前不写实现代码。
零待裁点。已裁记录:①underdark/deep 两关色板 2026-11-07 用户看方向样张后选「按目标八色冻结」;②棋盘底操作提示条退役 2026-11-07 用户选定;③合并 master 时与迭代56已闭合的封印改版对齐(用户 2026-11-07 已裁「封印受理即揭示」)——本卡承接其呈现面:已揭示地面格心+身份色牌+受光棱封印石承载(新地面 `#695038` 对封印黑仅 2.35–2.98:1,受光棱 6.45–9.94:1,保 art-bible ≥4.5 判据,零新增色);法阵参数/揭牌逻辑沿迭代56。开工门=U0(用户批卡);U0 前不写实现代码。
---
@@ -466,5 +474,11 @@
| 4 | 同上 | README 旧行仍写「T6 与套件同拍退役」;T8 名实一致无例外 | 补写 | README 改「旧行保留;删行归写卡段后续」;卡 §3/T8 同步 |
| 4 | 同上 | §16 补审/第三轮行前空行断表 | 补写 | 去空行并入同表 |
| 5 | 独立只读子代理(第五轮定向复核,2026-11-07) | §16 第四轮 5 行前空行断表 | 补写 | 去空行并入同表;复核通过 |
| 6 | 写卡会话(合并 master 整合复核,2026-11-07) | master 迭代56已闭合「封印受理即揭示」:印记在已揭示地面+身份字形垫色牌;本卡原写「封印在未开格岩顶+普通数字零底牌」与上游冲突 | 补写 | 全卡改配:封印居已揭示地面格心(不随岩顶偏移)、`plate` 保留且仅封印格为真、字形不进浮空层、封印格 z=0 低于小人;§1/§3/§4-3/§4-16/§5/§7/§9/T3/T4/T5/T7/§12 行8/9/11 同步;art-bible v3.51/battle.md/术语表/checklist 同步 |
| 6 | 同上 | 新连续地面 `#695038` 对封印黑仅 2.35–2.98:1,低于 art-bible ≥4.5 判据;旧裸土 `#B39A78` 随旧地板退役 | 补写 | 封印格地面铺本关受光棱色封印石(6.45–9.94:1,零新增色,读 `palette.light_edge`);art-bible §3.2/§4.1/§8.2、battle.md 封印预览判据、卡 §1-2/§12 行8/§13 同步 |
| 6 | 同上 | `game/tests/README.md` 冲突:master 迭代56「结算期零逐行文字与 FX 排播链保持」+旧地形行 vs 本卡新能力行 | 补写 | 合并保留 master 迭代56句与旧地形行(父注「旧行保留」),追加本卡 6 条新能力;能力名改「旧瓦片退役与普通数字零底牌」「棋盘顶面锚点与迷雾几何(微光、变异岩顶偏移,封印格心)」 |
| 6 | 同上 | `roadmap.md` 冲突:master 迭代55/56行 vs 本卡旧版(无55/56、旧「二三关棋盘观感」) | 补写 | 保留 master 迭代位/下一步原文,仅把待编池「二三关棋盘观感(待设计+待美术)」替换为「棋盘瓦片与立体表现重做(已写卡,待编排)」 |
| 6 | 同上 | 保留 `plate` 后成员预算变化:`board_cell_unit` 12→13;封印石输入给 `board_terrain_layer` 增 `_sealed_at` 成员 | 补写 | §9 改 `board_cell_unit` 12→13(删 base、加两成员、保留 plate);`board_terrain_layer` 成员预算 ≤13;§7/T3/T4 同步 |
| 6 | 同上 | 测试面需区分普通数字与封印色牌:`player_copy_sweep_test:142-147`、`_test_no_plate_path`、`_test_top_face_anchor` 原断言把封印色牌一并判零 | 补写 | 普通已开危险格 `plate==false`+浮空 entries;`_test_no_ordinary_plate_path`;新增 `_test_seal_substrate`(封印石/色牌/无浮空/无圆/z=0);§7/T4/T5/§12 同步 |
第五轮定向复核:通过(第五轮 1 条已处置)。
第六轮定向复核:通过(第六轮 6 条已处置;合并冲突全部闭合)。
@@ -0,0 +1,192 @@
# 需求卡片:结算期文字列表退役与日志零文案批
> 状态:待用户裁决(写完呈用户,开工令归 /iter 或用户另行发令)
> 验收档:中(依据 test-conventions §8.3:后果玩家可见但不损持久状态,本批不动存档写读、RNG 流、结算公式与数值表结构;用户批卡 U0 时可改判)
> 来源:`待办清单.md`「结算期逐行文字列表退役与日志零文案」条(2026-11-07 登记,来源=会话提及)
> **唯一事实源**=2026-11-07 用户裁定(会话设计讨论闭合、待裁点清零)+ `design/gdd/08-Alpha版本标准.md` v1.29(「逐行结算排播」行已删)+ `待办清单.md` 该条实况。三处 GDD 条款改写属实现批禁写面,列在第 6 节由文档批落文。
## 1 目标与完成定义
撤掉战斗屏结算期一行行滚动的文字列表;保留伤害飘字、攻击特效与站桩动画;日志侧零中文文案、只存结构化字段,并保证数值分析判读结论与改前逐位一致。
完成定义:①结算期 B 区不产任何逐行文字;②FX 排播链与两类 toast 仍在;③新日志 `step` 行零中文字段、原有全字段与全部 payload 仍在;④`tools/analyze_playtest.py` 判读等价:T0 两份基线日志(现行历史锚+改前同种子日志)改后复跑逐位一致+同种子改前改后日志配对逐位一致;⑤每个需求点有从真实入口进入的正向验收断言并跑绿,读数写进该步提交信息。
## 2 设计事实源
- 用户裁定(2026-11-07 会话,待裁点清零、用户点头):撤掉结算期逐行滚动文字列表;保留伤害飘字与攻击特效;日志零文案只存字段;战斗画面优化另立待办。
- `design/gdd/08-Alpha版本标准.md` v1.29:「五、表现」表已删「逐行结算排播」行,「战斗演出链(弹道/受击/血条/灰化)在役」行保留。
- `待办清单.md` 该条实况与状态(写卡时推进为「文档设计已闭合+已写卡」)。
- 设计闭合凭据说明:req-card 第〇步要求的闭合凭据=用户裁定已落 `08-Alpha版本标准.md` v1.29;`battle.md`/`战斗结算.md`/`战斗表现.md` 三处条款改写不是设计待裁点,是按裁定的文档同步义务,按「实现批禁写 `design/`」纪律列进第 6 节与反哺点清单,由文档批落文。
## 3 现状事实(代码级考证)
| 事实 | 位置 |
|---|---|
| 结算行协议:`_emit_row()` 发 `step_row`,公共字段 type/source_class/origin_cell/round_index/display_name/value/highlight+extra 全平铺 | `game/core/battle_orchestrator.gd:710-735` |
| 玩家侧逐行文字渲染(7 处读 display_name、BBCode 行模板) | `game/presentation/views/battle_log_view.gd:87-103`(逐行渲染入口)、`:146-263`(行格式化域);上轮摘要 `:72-84`、聚合计数 `:109-130` |
| 排播泵:文字入带是 `log_view.append_row/append_bb/finish_settlement_round`;FX 链是 `stage.on_step_row_fx`/`_play_cross_zone_fx`/`_play_settlement_mark`/`refresh_request`/`pump_ended` | `game/presentation/row_pacer.gd:83-101`、`:106-152` |
| 动画定位走 target/target_id,不读行文案 | `game/presentation/views/battle_stage_view.gd:327-344` |
| 两类 toast 仍读 display_name/display:清图奖励、Boss 半血解锁技名 | `game/presentation/main.gd:417-425`;`row_pacer.gd:97-100`;规格 `design/gdd/systems/战斗循环/敌人系统.md:207` |
| 日志逐行全字段落盘;中文字段两处=`text`(:138)与平铺进去的 `display_name`(:140-142) | `game/presentation/playtest_logger.gd:130-143` |
| 开新/续玩均开日志会话并挂接战斗 | `game/presentation/main.gd:247-253`、`:295-302`;`game/presentation/main_adventure_flow.gd:62` |
| 分析工具依赖 `text` 做四类判读:effect_id 反查、群伤奖励判定(两处)、未生效原因分类 | `tools/analyze_playtest.py:83-88`、`:189`、`:434`、`:471-478` |
| 群伤行已有结构化 `target: "all_enemies"`;未生效行散有 `batch_key`/`forfeit`/`deferred`,无统一「原因」字段——全仓 `reward_ineffective` 发射点共七处:补 `reason` 的六处=damage_controller:623-624/reward_grant:269-271/:362-364/:366-369/combat_segment:123-124/grant_segment:321;**grant_segment:103 不补**(封印作废行「奖励作废(封印格直接挖开)」——四类枚举无对应文案,且该行块 :102-104 随同迭代后行批「封印动作改版批」整块删除) | `game/core/damage_controller.gd:515-516`、`:623-624`;`game/core/reward_grant.gd:269-271`、`:362-369`;`game/core/settlement/combat_segment.gd:123-124`;`game/core/settlement/grant_segment.gd:103`、`:321` |
| 玩家可见文案的现役测试/探针面 | `game/tests/README.md:137`/`:138`(写卡段已入表的新能力行;旧行「结算明细带逐行呈现与排播节奏」已删);`game/tests/unit/presentation/theme_projection_test.gd:385`;`player_copy_sweep_test.gd:86-108`;`pacing_queue_test.gd:108-120`(:165 是收尾 PASS 打印行);`game/probe/ui_probe.gd:133-135`(折叠态断言——读 `pending_rows()` 与尺寸,不读行文本);`game/probe/ui_click_probe.gd:423`、`:473`、`:616`、`:798-844` |
## 4 设计契约(🔴 触碰=L3 停机呈报)
1. 🔴 保留伤害飘字、攻击特效、站桩闪白/弹道/灰化;`row_pacer.gd:89-101` 的 FX 调用链与 `pump_ended`/`refresh_request` 零删改。文字列表退役不等于取消结算演出。
2. 🔴 核心层 `step_row` 公共字段集不变:`display_name` 保留(清图奖励 toast、Boss 解锁技名 toast、历史日志兼容都读它);本批只改日志消费端与补 `reason` 这类结构化 extra,不动 `_emit_row()` 签名与载荷键集。
3. 🔴 日志逐行全字段落盘义务不变(kind/type/source/cell/round/value/highlight+全部 payload);只去掉 `text` 与 `display_name` 两份中文文案。
4. 🔴 数值与随机零改动;玩法数值只经 ConfigDB 单点,随机只经 RngService;Core 零 UI。
5. 🔴 实现批禁写 `design/` 整个目录、根规则文件与 `game/tests/README.md`(能力清单归写卡段维护);文档义务只进 `reports/` 反哺点清单。
6. 🔴 按 2026-10-24/2026-10-28 用户裁:禁变异类测试与撤销类取证,禁删断言/放宽阈值换绿;验收主力=从真实入口进入的正向断言,同种子复放对拍只作兜底。
## 5 范围边界
- 做:撤 B 区逐行文字(含上轮摘要、轮首分隔行、聚合计数行的文字呈现);日志零中文文案;补未生效原因的结构化字段;分析工具改读结构化字段;相关测试/探针改写成退役后的正向断言;能力行换代。
- 不做:战斗画面优化(另立待办,等用户发令)、美术资产、`design/` 三处条款改写(文档批)、日志采集面扩充(除 `reason` 外零新增)、`step_row` 行协议重构、`08-Alpha版本标准.md`(已落地 v1.29)。
- 不收件去向:动画密度与素材范围 →「战斗画面优化」待办;三处设计条款 → 反哺点清单;历史锚里的旧 `text` 字段 → 不改历史数据,分析工具保留旧日志兼容分支。
## 6 关联文档同步面
| 文档 | 关联点(本批实现会改变它的哪条陈述) | 同步义务 |
|---|---|---|
| `design/ux/battle.md:199`/`:272`/`:347` | 结算期明细带逐行滚动(:199 明细带行/:272 结算阶段逐行);「结算逐行兑现不可整体跳过、只给减动效」(:347)——旧锚 :157/:230/:304 系封印预览节插入前行号,已失位(下移约 42 行) | 实现批禁写 `design/`;逐条列进 `reports/iter<N>-反哺点-<日期>.md`,用户裁决后由文档批落文 |
| `design/gdd/systems/战斗循环/战斗结算.md:73`/`:87` | 明细流水是结算明细屏的数据源;「显示名等玩家可见文案是数据面字段、代码读表拼行」 | 同上 |
| `design/gdd/systems/战斗循环/战斗表现.md:53`/`:99`/`:149` | 结算逐行兑现是信息载体;因果可读验收「能说出这一行来自哪步操作」 | 同上 |
| `design/gdd/08-Alpha版本标准.md` v1.29 | 「逐行结算排播」行已删(合并 `f7d7761e`) | 已落地,本批零动作 |
| `game/tests/README.md:137`/`:138` | 新能力行两行(「结算期零逐行文字与 FX 排播链保持」「日志 step 行零文案与结构化判读等价」)**已由写卡段入表**;旧行「结算明细带逐行呈现与排播节奏」已删 | 实现批禁写;批末只核对名实一致(T3) |
| `体验验证清单.md:86`/`:206`/`:220`/`:314`/`:315`/`:326`/`:442`/`:519` | 逐行结算、明细带来源/行序/文案可读性、减半标签等目检项 | 实现批禁写根规则文件;列进反哺点清单,由文档批落文;真人目检登记不阻塞 |
## 7 文件结构图
| 路径 | 职责 | 行为/非行为 | 对照表行 | 复用/新增 |
|---|---|---|---|---|
| `game/presentation/views/battle_log_view.gd` | B 区文字列表渲染面退役(保留视图壳供挖掘期摘要位或整体退役,二选一定在 T1) | 行为改动 | R1 | 复用既有件,不新增 |
| `game/presentation/row_pacer.gd` | 移除文字入带调用,保留 FX 排播链 | 行为改动 | R1/R2 | 复用既有件 |
| `game/presentation/main.gd` | 组合根 `log_view` 接线与 `clear()` 调用面同步 | 行为改动 | R1 | 复用既有件 |
| `game/presentation/playtest_logger.gd` | 日志 `step` 行去掉两份中文文案 | 行为改动 | R3 | 复用既有件 |
| `game/core/damage_controller.gd`/`reward_grant.gd`/`settlement/combat_segment.gd`/`settlement/grant_segment.gd` | `reward_ineffective` 行补 `reason` 枚举 extra | 行为改动 | R5 | 复用既有 `_emit_row` 出口 |
| `tools/analyze_playtest.py` | 四处 `text` 判读改读结构化字段,保留历史锚兼容分支 | 行为改动 | R4 | 复用既有解析入口 |
| `game/tests/unit/presentation/*`/`game/probe/*` | 旧断言改写成退役后正向断言 | 行为改动 | R1/R2/R3 | 复用既有套件 |
| `game/tests/README.md` | 能力行已由写卡段入表(新行 :137/:138、旧行已删)——本批零改动,批末只核对名实一致 | 非行为改动 | — | 复用既有表行 |
| `reports/需求卡片-…`/实现报告/代拍板追认单/反哺点清单/验收审计 | 过程件 | 非行为改动 | — | 复用既有模板 |
## 8 落位与可复用性预检
- **复用面**:本批零新增视图、服务、工具脚本(游戏码零新增文件)。`grep` 现成实现结果=文字渲染唯一在 `battle_log_view.gd`,排播唯一在 `row_pacer.gd`,日志落盘唯一在 `playtest_logger.gd:130-143`,分析判读唯一在 `tools/analyze_playtest.py`;同名同义标识符无第二处。新增文件面=四件:测试三件(`battle_log_zero_text_test.gd`/`playtest_logger_step_fields_test.gd` 落 `game/tests/unit/presentation/`,`reward_ineffective_reason_test.gd` 落 `game/tests/unit/battle_settlement/`)+工具一件(`tools/analyze_parity_check.py`)。
- **唯一面**:`step` 行字段定义只在 `battle_orchestrator.gd:723-735`;`reason` 枚举取值只在第 9 节 T2 定义一次,各发射点只引用不各自定义;日志行字段组装只在 `playtest_logger.gd:136-143`;分析工具的「旧日志兼容分支」只在 `effect_id_of()` 一处。
- **分层与交互面**:core 发 `step_row` → 呈现层 `row_pacer`/`playtest_logger` 并列订阅(删文字只动呈现层那条);`row_pacer` → `stage.on_step_row_fx`/`settlement_fx`/`board_zone` 的调用链不变;core 零 UI、数值经 ConfigDB、随机经 RngService 三条红线不因补 `reason` 而绕。
## 9 任务卡
估时合计 3.5–4.75 个工作日(软盒 5 日);T2 若 `reason` 枚举落点超 4 处,按「先 damage_controller+reward_grant 两处、再 combat/grant 两处」切成 T2a/T2b,不扩 T 卡验收面。
### T0 开工核对与改前基线(0.25 日)
取用:本卡第 3 节全部 file:line。产出:`sim-data/` 下改前判读基线读数一份(不入库)、T1..T4 共用的 `REASON_ENUM` 取值表。
- [ ] 逐条复核第 3 节 file:line 与现役代码一致,不一致处回呈写卡段,不改卡硬做。
- [ ] 跑 `python tools/analyze_playtest.py` 对现行历史锚出一份判读基线,落 `sim-data/` 并在实现报告登记路径。
- [ ] 经 sim 采集链采改前同种子日志一份(`level_autoplay.gd` 挂 `logger.start_session(seed)`,headless 直跑),同法出第二份判读基线——与历史锚基线一并落盘登记;此日志是 T3 改后同种子复放的配对腿(现行历史锚四类未生效计数为零,判读力由本腿承担)。
- [ ] 跑 `python tools/run_all_gates.sh --docs` 确认写卡段文档域闸绿,回执记入实现报告。
### T1 撤玩家侧逐行文字(1–1.5 日)
取用:T0 复核结果、`battle_log_view.gd`/`row_pacer.gd`/`main.gd` 现役签名。产出:`row_pacer.log_view` 句柄与文字入带调用清零、FX 调用链原样。
- [ ] 在 `row_pacer.gd:83-101` 移除 `log_view.append_row(row)`、`log_view.append_bb(...)`、`log_view.finish_settlement_round()` 三处调用,保留 `:89-101` 其余 FX 调用与 `refresh_request.call()`。
- [ ] 在 `row_pacer.gd` 移除 `log_view: BattleLogView` 句柄声明与组合根注入面,保留 `stage`/`board_zone`/`settlement_fx`/`board_view` 四个句柄。
- [ ] 在 `main.gd` 移除 `_start_adventure`/`_resume_from_menu` 的 `ui.battle.log_view.clear()` 调用(:252/:300);`wire_battle`(:408-412)唯一调用方在 `main_debug_flow.gd`、不在本批改动面,不动;`_on_step_row` 的清图奖励 toast 保留。
- [ ] 定 `battle_log_view.gd` 去留并落实现:视图壳整体退役或只保留挖掘期摘要位,二选一以「B 区结算期零文字节点」为准,改动写进实现报告。
- [ ] 从真实入口(停手→结算)跑 `battle_log_zero_text_test.gd:_smoke_settle_zero_rows`,断言结算期 B 区 `RichTextLabel` 行文本为空且无逐行追加,读数写进本步提交信息。
### T2 日志零文案与结构化字段补齐(1–1.5 日)
取用:`step_row` 行协议(公共字段+extra 全平铺)、`REASON_ENUM`。产出:新日志 `step` 行零中文字段、`reward_ineffective` 行带 `reason`。
- [ ] 在 `playtest_logger.gd:136-143` 从 `line` 去掉 `"text"`,并在 `:140-142` 平铺循环里跳过 `display_name`,其余字段与 payload 一行不减。
- [ ] 定义 `REASON_ENUM` 四个取值:`full_layers`/`full_hp`/`no_enemy_alive`/`hero_down`,只在本卡定义一次。
- [ ] 在 `damage_controller.gd:623-624`(调用方 :483/:508 均传「无存活敌人」)、`reward_grant.gd:269-271`(满层)、`:362-364`(主角已倒下)、`:366-369`(满血)、`combat_segment.gd:123-124`(主角已倒下)、`grant_segment.gd:321`(满血)的 `reward_ineffective` 行 extra 各补一个 `reason` 键,取值对号入座即 `REASON_ENUM`。**`grant_segment.gd:103` 不补**——封印作废行「奖励作废(封印格直接挖开)」四类枚举无对应文案,且该行块 :102-104 随同迭代后行批「封印动作改版批」整块删除;分析器对缺 `reason` 行落「其他」桶,与改前该行分类一致,R4 等价不受影响。
- [ ] 从真实入口(开新局→真实结算→落盘 JSONL 读回)跑 `playtest_logger_step_fields_test.gd:_assert_no_text_and_full_payload`,断言 `step` 行无 `text`/`display_name`、且 `type`/`source`/`cell`/`round`/`value`/`highlight` 与全部 payload 键集与改前逐位一致。
### T3 分析工具、测试与探针正面化(0.75–1 日)
取用:T0 判读基线、T2 的 `REASON_ENUM`。产出:分析判读结论与改前一致、旧断言全部改写而非删除。
- [ ] 在 `tools/analyze_playtest.py:83-88` 的 `effect_id_of()` 保留旧日志 `text` 兼容分支,新日志分支改读 `effect_id`。
- [ ] 在 `:189`/`:434` 把 `"全体敌人" in r.get("text","")` 改读 `r.get("target") == "all_enemies"`。
- [ ] 在 `:471-478` 把未生效原因分类由 `text` 子串改读 `s.get("reason")`,四类取值与 `REASON_ENUM` 一一对应。
- [ ] 把 `theme_projection_test.gd:_smoke_battle_log_view`/`player_copy_sweep_test.gd:_sweep_source_names`/`ui_probe.gd:133-135`/`ui_click_probe.gd:423`、`:473`、`:616`、`:798-844` 的旧文字断言改写为退役后的正向断言(例:结算期零行文本、来源标签从数据表读而非从行文本读),逐条登记进测试削弱申报表。
- [ ] 批末核对 `game/tests/README.md:137`/`:138` 两条能力行(写卡段已入表)与实际落地名实一致(改名则回表走写卡段通道);实现批禁写该文件(第 4 节 🔴5)。
- [ ] 判读等价三读数:①对 T0 两份基线日志(历史锚+改前同种子日志)各复跑一次 `tools/analyze_playtest.py`,结论与各自 T0 基线逐位一致(兼容分支等价);②同种子复放采改后新日志跑一次,结论与 T0 改前同种子日志基线逐位一致(同种子+第 4 节 🔴4 玩法零改动=事件流逐位同)。读数写进本步提交信息。
### T4 批末验收与产出物落位(0.5 日)
取用:T1..T3 各步读数、第 10 节对照表。产出:`reports/` 四份过程件。
- [ ] 按本批改动域跑重闸选档全绿,回执记入实现报告。
- [ ] 跑独立验收审计(入口 `reports/iter<N>-验收审计-<日期>.md`,由未参与实现的会话或子代理执行),未过不合并。
- [ ] 在轻闸全绿后、合并前写齐 `reports/` 三份:实现报告(各卡状态+实机目检总清单+遗留读数义务)、代拍板追认单、反哺点清单(第 6 节每条都有落点)。
- [ ] 用户目检项只登记不阻塞,登记完成即本卡义务了结。
## 10 验证闸(改动—验收对照表)
| 需求点 | 改动(文件:行/行为) | 验收测试(名称+落点+尾缀) | 层级 | 真实入口 | 判据绑定面 | 能力行 |
|---|---|---|---|---|---|---|
| R1 结算期零逐行文字(design/ux/battle.md:199) | `battle_log_view.gd:87-103`/`row_pacer.gd:83-101`/`main.gd:417-425` | `battle_log_zero_text_test.gd:_smoke_settle_zero_rows`(新增,落在表现层单元套件) | 单元+探针 | 真实停手→轮末结算→读 B 区场景树与 `RichTextLabel` 行文本 | `step_row` 消费后 `RichTextLabel.append_text` 调用计数=0、parsed_text 空;不绑终屏态 | 新增:结算期零逐行文字与 FX 排播链保持 |
| R2 FX 与 toast 链不断(design/ux/battle.md:347) | `row_pacer.gd:89-101` 保留 | `pacing_queue_test.gd:_assert_fx_chain`(既有套件内新增断言函数——套件文件已存在)+`standee_fx_sweep_test.gd:_init` | 单元+集成 | `step_row`→`row_pacer`→`stage.on_step_row_fx`/`settlement_fx` | `on_step_row_fx`/`play_damage_number`/`play_projectile` 调用计数与改前逐位一致 | 新增:结算期零逐行文字与 FX 排播链保持 |
| R3 日志零文案、字段不缺(design/gdd/systems/战斗循环/战斗结算.md:73) | `playtest_logger.gd:136-143` | `playtest_logger_step_fields_test.gd:_assert_no_text_and_full_payload`(新增) | 单元+集成 | `start_session`→真实结算→落盘 JSONL 读回 | 落盘 `step` 行键集:`type`/`source`/`cell`/`round`/`value`/`highlight`+全部 payload 与改前一致,且无 `text`/`display_name` | 新增:日志 step 行零文案与结构化判读等价 |
| R4 分析判读等价(design/engineering/test-conventions.md:133) | `tools/analyze_playtest.py:83-88`/`:189`/`:434`/`:471-478` | `analyze_parity_check.py`(新增,落在 `tools/`) | 工具/集成 | T0 两份基线日志复跑+同种子改后新日志配对判读 | 复跑读数与 T0 基线逐位一致;改后新日志读数与改前同种子基线逐位一致(配对腿——未生效分类判读力主要在此腿,现行历史锚四类计数为零) | 新增:日志 step 行零文案与结构化判读等价 |
| R5 未生效原因结构化(design/gdd/systems/战斗循环/战斗结算.md:80) | 四处 `reward_ineffective` 发射点 extra 补 `reason` | `reward_ineffective_reason_test.gd:_assert_four_reasons`(新增,落在结算域单元套件) | 单元 | 真实结算产生满层/满血/无存活敌人/主角已倒下四类未生效行→`step_row` 载荷 | `step_row` 载荷 `reason` 键取值四类逐一命中,不绑终态结算结果 | 新增:日志 step 行零文案与结构化判读等价 |
**测试削弱申报**:随文字列表退役需改写的旧断言=`theme_projection_test.gd:_smoke_battle_log_view`、`player_copy_sweep_test.gd:_sweep_source_names`、`ui_probe.gd:133-135`(折叠态断言)、`ui_click_probe.gd:423`/`:473`/`:616`/`:798-844`、`pacing_queue_test.gd:108-120` 的文字呈现部分。一律改写为退役后的正向断言,**不删除、不放宽阈值、不缩小扫描面**;实现期出现未申报的删除断言由独立验收审计判红。
**独立验收审计**:`reports/iter<N>-验收审计-<日期>.md`,由未参与实现的会话或子代理执行,未过不得合并。
## 11 异常分级
- L1 自救:单件直跑出红,只重跑该红件最小单元(一次重试)。
- L2 记录继续:连续三次同红灯,记录进实现报告并继续本卡其余步骤。
- L3 停机写报告等用户:触碰第 4 节任一 🔴、分析判读结论与改前不一致且定位不到字段来源、独立验收审计未过。
## 12 代拍板白名单
1. 新增测试函数命名与落点(须落在第 7 节列出的既有套件/工具目录)。
2. `battle_log_view.gd` 视图壳整体退役 vs 只留挖掘期摘要位,以「结算期 B 区零文字节点」为判据自判,结论写进实现报告;**选整体退役时须同批处置 `main_adventure_flow.gd` 的五处叙述行 `log_view.append_bb` 调用(:65/:70/:75/:88/:170)迁置**(该分支改动面随结论登记进实现报告;选「只留摘要位」则这些调用不动)。
3. `reason` 四个枚举键在四个发射点的写法(照现役 `_emit_row` extra 模式,不新增helper)。
超出以上三项一律呈报。
## 13 待裁点
零待裁点。用户裁定已覆盖方向、保留面、日志口径与 08 清单行处置;开工门=U0(用户发令 /iter)。卡片写完呈用户裁决后才可开工。
## 14 复核记录
复核发现按四类去向逐条登记(自判/补写/待裁/退回上游);本节即复核凭据,不另设报告文件(2026-11-06 用户裁)。
| 发现 | 去向 | 处置结果 |
|---|---|---|
| 视图壳整体退役 vs 只留挖掘期摘要位 | 自判 | 以「结算期 B 区零文字节点」为判据自判,写进第 12 节白名单第 2 项 |
| 新增测试函数命名与落点 | 自判 | 写进第 12 节白名单第 1 项,落在第 7 节列出的既有套件 |
| `reason` 枚举键在四个发射点的写法 | 自判 | 写进第 12 节白名单第 3 项,照现役 `_emit_row` extra 模式 |
| 上一轮核查漏项:`tools/analyze_playtest.py` 四处读 `text` | 补写 | 补进 T2/T3/R4,并保留旧日志 `text` 兼容分支 |
| 未生效原因缺统一结构化字段 | 补写 | 补进 T2/R5,定义 `REASON_ENUM` 四个取值 |
| 验收对照表列名与 2026-10-24/10-28 两裁冲突 | 补写 | 第六列改「判据绑定面」,内容全改正向断言与改前改后对照 |
| req-card 第〇步「标题带设计面=标记」与现行 §12.1 模板冲突 | 补写 | 按现行规约,闭合凭据以用户裁定+`08-Alpha版本标准.md` v1.29 为准,第 2 节写明 |
| 【轮 2·卡修批 2026-11-07】跨卡冲突:T2 六处发射点中 `grant_segment.gd:103` 是封印作废行「奖励作废(封印格直接挖开)」——四类 `REASON_ENUM` 无对应文案,且该行块 :102-104 随同迭代后行批「封印动作改版批」整块删除 | 补写 | §3/T2 剔除 :103(注明不补缘由);四类 reason 各另有独立归属点,R5 不受影响;分析器对缺 `reason` 行落「其他」桶,与改前该行分类一致,R4 等价不破 |
| 【轮 2·卡修批】R4 新日志腿缺改前采集——T0 只对历史锚出基线,「新日志结论与 T0 基线逐位一致」照字面不可执行(新日志与历史锚是两局内容) | 补写 | T0 增「改前同种子日志采集+判读基线」步(sim 采集链 headless 可产:`level_autoplay.gd` 挂 `logger.start_session(seed)`);T3 改三读数(历史锚复跑+改前日志复跑+同种子改前改后配对);§1 完成定义④与 R4 行同步改写 |
| 【轮 2·卡修批】T3「同步 game/tests/README.md:135 能力行」撞本卡 🔴5(实现批禁写 README),且 :135 旧行已被写卡段删除、新能力行 :137/:138 已在册 | 自判 | T3 改「批末核对 :137/:138 名实一致」;§6 表行与 §7 README 行同步改写 |
| 【轮 2·卡修批】R1/R2 判据出处 ux/battle.md :157/:297 与 §6 四锚 :157/:230/:304 失位——封印预览节(:130-170)插入后下移约 42 行,:157 现为预览 SVG 内字形文本 | 补写 | R1 锚改 :199、R2 锚改 :347、§6 改 :199/:272/:347(三处内容均已实读核实) |
| 【轮 2·卡修批】T1「移除 wire_battle 相关文字接线」措辞失实——`wire_battle`(main.gd:408-412)唯一调用方在 main_debug_flow.gd:99,不在两函数内 | 补写 | T1 改为只移除 :252/:300 的 `ui.battle.log_view.clear()` 调用 |
| 【轮 2·卡修批】白名单 2「整体退役」分支缺改动面——`main_adventure_flow.gd` 五处叙述行 `log_view.append_bb`(:65/:70/:75/:88/:170)未列入卡内文件清单 | 补写 | 白名单 2 补「整体退役分支须同批处置五处 append_bb 迁置」 |
| 【轮 2·卡修批】§8「新增文件只有过程件与新增测试函数」与 R4 新增 `tools/analyze_parity_check.py`+三个新测试文件自相矛盾 | 自判 | §8 改事实句(四件新增面点名落目录) |
| 【轮 2·卡修批】锚漂移三处:battle_log_view 上轮摘要/聚合计数实为 :72-84/:109-130(卡写 :146-264);pacing_queue_test 文字断言实为 :108-120(:165 是 PASS 打印行);ui_probe:133-135 为折叠态断言不读行文本 | 自判 | §3/削弱申报行号已改正;ui_probe 性质注记随 §3 行 |
零待裁点、零退回上游。轮 2(卡修批)八发现全处置——**卡片修订成立**。
**自审六查**:①规格覆盖——第 1 节五条完成定义逐条指到 T1..T4 与 R1..R5,无悬空;②步骤扫描——每步一个动作+一个可核查结果,无「TBD/酌情/适当优化」;③类型一致性——`REASON_ENUM` 四个取值在 T2 定义、T3 与 R5 逐字引用;④审查焦点+改动覆盖——最可能坑到玩家的失败模式=FX 链被误删(R2 兜)、分析判读静默失真(R4 兜)、日志丢 payload(R3 兜),文件结构图每个行为改动都有对照表行;⑤篇幅比例——本卡以签名、取值、断言名为主,未抄函数体;⑥落位与复用——第 8 节三问逐条答完,零新增视图/服务/工具,与第 7 节「复用既有」标注一致。
**上一轮核查漏项补正详情**:此前报「日志零缺漏」时未查到 `tools/analyze_playtest.py:83-88`/`:189`/`:434`/`:471-478` 对 `text` 的四处判读依赖;本卡已列为 R4 并补 `reason` 字段(R5),不属新增需求,属用户令「缺什么补什么」的同批处理。
@@ -0,0 +1,137 @@
# 需求卡片 · 营地场景重排接线
> 批名:营地场景重排接线 · 日期:2026-11-07 · 验收档:中(布局呈现数据面,无存档/结算传播)
> 来源:待办清单「营地场景重排接线——十层新矩形与游戏内终审」条目(2026-11-07 登记,批次移交)
> 设计事实源(唯一):[camp-scene-prompts](../design/art/camp-scene-prompts.md) v1.9 §2.3/§3/§5 第 12 条(2026-11-05 与 2026-11-07 用户裁)+[art-bible](../design/art/art-bible.md) v3.48 §6.2(围墙显示矩形与墙脚入土线)+[camp](../design/ux/camp.md) 第 29 行(围墙带 y220–420)+2026-11-07 用户裁原话(墙高 200、顶 y220、门/板跟随、墙脚入土;预览过审 `artwork/2026-11-07-营地接线预览/camp_new_layout_preview_c.png`)
## 1. 目标与完成定义
把营地十层的运行数据换成重排后的新矩形:围墙 (0,220,1280,200)、大门/告示板尺寸不变跟随、其余六件(dummy/forge/tent/chest/notebook/campfire)按 2026-11-05 裁定落位;新围墙件(1280×164,补尖+墙脚入土缺口)入包;布局表几何红线单测与冒烟全绿;游戏内营地图层按新矩形铺底、墙脚无贯通直线。
完成定义:`camp_scene_layout_test.gd` V14 全绿(含新值钉断言)+冒烟测试 exit 0+`palette_check` 围墙对八件零新增色+`path_check` 0 问题;游戏内目检归用户(登记不阻塞)。
## 2. 现状事实(开工自行复核)
- 数据表 [camp_scene_layout.tres](../game/data/tables/camp_scene_layout.tres):wall `texture_rect=(0,261,1280,49)`、gate `(520,250,240,211)`、board `(845,268,130,121)`、tent `(982,520,251,170)`、forge `(40,467,240,193)`、dummy `(340,520,120,180)`、chest `(1097,700,106,90)`、notebook `(818,704,100,66)`、campfire `(560,571,160,149)`;`wall_band=(0,240,1280,70)`;`gate_gap=(520,760)`。
- 视图按表建层、`TextureRect.STRETCH_SCALE` 拉伸到矩形尺寸:[camp_scene_view.gd:136](../game/presentation/views/camp_scene_view.gd#L136);子节点序=表序=z 序(同文件头注)。
- schema 加载期 fail-fast:validate 入口 [camp_scene_layout_table.gd:15](../game/data/schemas/camp_scene_layout_table.gd#L15);贴图矩形不出画布、命中区不出画布/不侵 y<48/两两不相交、`wall_band` 必须包含 wall 贴图矩形([camp_scene_layout_table.gd:67](../game/data/schemas/camp_scene_layout_table.gd#L67))。
- 单测读表动态取值、以关系谓词为主:[camp_scene_layout_test.gd:82](../game/tests/unit/presentation/camp_scene_layout_test.gd#L82)(门扇命中对齐 gate_gap)、`:87`(布告板命中顶落围墙带)、`:77`(篝火命中贴贴图底)。
- 包内围墙件仍是旧 1280×49(`game/assets/art/scene/scene_camp_wall.png`);门扇件 240×211 由运行时压扁到矩形高(STRETCH_SCALE,2026-11-07 用户裁「不动美术素材」),无需换件。
## 3. 设计契约(违反即返工)
🔴 逐层锁定值(写进 .tres,值逐字照此):
| 层键 | texture_rect | hotspot | hotspot_key |
|---|---|---|---|
| bg | (0,0,1280,800) | (0,0,0,0) | — |
| wall | (0,220,1280,200) | (0,0,0,0) | — |
| board | (845,241,130,121) | (845,241,130,140) | board |
| gate | (520,282,240,138) | (520,282,240,147) | gate |
| dummy | (340,474,120,180) | (340,474,120,180) | dummy |
| forge | (40,421,240,193) | (40,374,240,240) | forge |
| tent | (982,335,251,170) | (0,0,0,0) | — |
| chest | (1097,654,106,90) | (1085,654,130,90) | chest |
| notebook | (870,515,100,66) | (870,501,100,80) | notebook |
| campfire | (560,525,160,149) | (560,594,160,80) | campfire |
表级:`canvas=(1280,800)`、`hud_band_h=48`、`gate_gap=(520,760)`、`wall_band=(0,220,1280,200)`;层数组序不变(bg,wall,board,gate,dummy,forge,tent,chest,notebook,campfire)。
🔴 围墙件:1280×164、RGBA、≤32 色(实测 12 色)、顶行仅柱尖若干列不透明(柱尖补全)、底行全透明(入土缺口 1–7px 低频起伏);源文件=主检出 `artwork/2026-11-07-营地接线预览/scene_camp_wall_final.png`。
🔴 门扇 hotspot 高 147=贴图 138+底部 9px 余量(沿用旧表「命中比贴图高 9」口径,属实现微决策,见 §9 代拍板)。门扇件不换件:现 240×211 由运行时压扁到矩形(用户 2026-11-07 裁「不动美术素材」;设计文档中「随门洞压扁重画」旧句已在本批改为运行时压扁口径)。
🔴 其余六件的 hotspot 由旧表相对关系同偏移得出(dummy 同贴图;forge y−46/高+46;chest y−46/x−12/宽+24;notebook y−14/高+14;campfire y−46/高 80;board 同贴图 y/高+19)——值已列上表,禁止再自拟。
## 4. 范围边界
做:上表十层数据、围墙件入包、单测新值钉断言(追加,不删旧断言)。
不做:门扇/布告板/其余七件素材重出;背景层;土线改为独立代码层(入土效果落在围墙件缺口,零新代码);camp.md/art-bible/camp-scene-prompts 的进一步改写(归文档批)。
不收件去向:art-status-checklist 营地行状态更新归文档批(反哺点);游戏内终审归用户(登记不阻塞)。
## 5. 关联文档同步面
| 文档 | 关联点 | 同步义务 |
|---|---|---|
| design/art/art-bible.md §6.2 | 围墙显示矩形与墙脚入土线(已随设计批改到 v3.48) | 实现批不直改;若实现取此卡值时偏差则列反哺点 |
| design/art/camp-scene-prompts.md §2.3/§3/§5 | 坐标表(已随设计批改到 v1.9) | 同上 |
| design/ux/camp.md 第 29 行 | 围墙带 y220–420(已随设计批改) | 同上 |
| design/art/art-status-checklist.md 营地行 | 需补「围墙件 2026-11-07 换代」事实 | 反哺点,归文档批落文 |
## 6. 任务卡
### T0 围墙件入包(≈0.25 工作日)
- 取用:无。产出:`game/assets/art/scene/scene_camp_wall.png`(覆盖)。
- [ ] 从主检出 `artwork/2026-11-07-营地接线预览/scene_camp_wall_final.png` 拷入 → 核对尺寸 1280×164、模式 RGBA
- [ ] 建隔离基线目录并跑色板闸:`mkdir -p /tmp/wall_base /tmp/wall_only && cp game/assets/art/scene/scene_camp_{board,gate,dummy,forge,tent,chest,notebook,campfire}.png /tmp/wall_base/ && cp game/assets/art/scene/scene_camp_wall.png /tmp/wall_only/ && python tools/palette_check.py /tmp/wall_only --baseline /tmp/wall_base` → 围墙零新增色(八件基线)
- [ ] 跑 `python tools/path_check.py` → 0 问题(worktree 缺 `artwork/mockups` 时该项 SKIP/FAIL 属环境坑:以主检出 `--repo` 口径复核)
### T1 布局表换代(≈0.25 工作日)
- 取用:T0 的素材。产出:`game/data/tables/camp_scene_layout.tres`(十层+表级值)。
- [ ] 按 §3 表逐字改十层 texture_rect/hotspot 与 wall_band → 跑 `godot --headless --path game --script res://tests/unit/presentation/camp_scene_layout_test.gd`(加载期 validate+钉值+关系谓词全绿,exit 0)
- [ ] `_build_layer_node` 的 TextureRect 加 `expand_mode = EXPAND_IGNORE_SIZE`(否则门扇节点被贴图最小高 211 夹住、矩形 138 不生效)→ 场景探针 ui_struct_probe camp V1 转绿
### T2 新值钉断言+收口(≈0.25 工作日)
- 取用:T1 的表。产出:`game/tests/unit/presentation/camp_scene_layout_test.gd`(追加断言);`reports/iter<N>-实现报告-2026-11-07.md`;`reports/iter<N>-反哺点-2026-11-07.md`。
- [ ] 在 `_test_layout_hotspot_geometry` 追加:wall/gate/board/wall_band 四条钉值(已在本批落笔);六件落位钉值一条(逐层 Rect2 比对)
- [ ] 跑 `python tools/run_smoke.py` → exit 0;跑营地套件 `godot --headless --path game --script res://tests/unit/presentation/camp_scene_layout_test.gd` → exit 0;跑场景探针 `…console.exe --headless --path . res://probe/shot_probe.tscn` + `python tools/shot_checker.py <截图目录>` → A 段 PASS
- [ ] 写实现报告(各卡状态+目检清单+决定记录)与反哺点清单(§5 四条逐条落点)
## 7. 验证闸(改动—验收对照表)
| 需求点 | 改动(文件:行/行为) | 验收测试(名称+落点+尾缀) | 层级 | 真实入口 | 判据绑定面 | 能力行 |
|---|---|---|---|---|---|---|
| 围墙显示矩形 220/200(判据出处 design/ux/camp.md:29) | camp_scene_layout.tres wall | V14 围墙矩形钉值(camp_scene_layout_test.gd `_test_layout_hotspot_geometry`) | 单元 | load 表+validate | texture_rect 取值 | 既有:营地场景图十层铺底与门洞留空呈现 |
| 门/板跟随(判据出处 design/art/camp-scene-prompts.md:250) | .tres gate/board | V14 门板矩形钉值 | 单元 | 同上 | texture_rect 取值 | 既有:营地场景图十层铺底与门洞留空呈现 |
| 其余六件落位(判据出处 design/art/camp-scene-prompts.md:244) | .tres 六件 | V14 六件落位钉值+七命中区几何红线(validate+不相交+不越界) | 单元 | 同上 | texture_rect/hotspot 取值 | 既有:营地场景图十层铺底与门洞留空呈现 |
| 门扇显示高 138(判据出处 design/art/camp-scene-prompts.md:250) | camp_scene_view.gd `_build_layer_node` 加 `EXPAND_IGNORE_SIZE` | 场景探针 ui_struct_probe camp V1「层贴图矩形≠layout 表」 | 探针 | `res://probe/ui_struct_probe.tscn`(camp 段) | 节点 position/size 逐值 | 既有:营地场景图十层铺底与门洞留空呈现 |
| 围墙件换代(判据出处 design/art/art-bible.md:212) | scene_camp_wall.png | T0 `palette_check`/`path_check` | 资产 | 文件读数 | 色数 12、零新增色 | 既有:营地场景图十层铺底与门洞留空呈现 |
| 墙脚入土(判据出处 design/art/art-bible.md:396) | 围墙件底行 | 目检(游戏内终审,登记式) | 目检 | 营地屏 | 墙底无贯通直线 | 既有:营地场景图十层铺底与门洞留空呈现 |
| 营地屏铺底不回归(判据出处 design/ux/camp.md:29) | 十层矩形整体 | 场景探针 `shot_probe` camp 截图+`shot_checker` A 段(角色/面板骨架不回归) | 探针 | `--headless --path . res://probe/shot_probe.tscn` | 截图色彩数/骨架 | 既有:营地场景图十层铺底与门洞留空呈现 |
注:未删改任何旧断言;新增 5 条钉值断言(围墙/门扇/告示板/围墙带/六件落位),测试削弱申报:无。
**独立验收审计**:入口=未参与实现的独立会话或子代理(对照本卡 §7 逐行核);报告文件 `reports/iter<N>-验收审计-2026-11-07.md`;未过不得合并。
## 8. 异常分级
L1 自救:格式/导入缓存类异常自行重跑。L2 记录继续:非本卡面的既有红记录进报告。L3 停机:表值触 schema fail-fast 或与 §3 冲突=停卡呈报(上游缺陷退写卡段);素材缺位=停卡(不得用旧 49px 墙凑合)。
## 9. 代拍板白名单
门扇 hotspot 高 147(贴图 138+9 余量);七件 hotspot 的平移口径(§3 已列值);T2 钉值断言的命名与位置(同套件内追加)。超出=记实现报告「实现决定记录」。
## 10. 待裁点
零待裁点(用户已裁:墙 220/200、门板跟随、入土线;2026-11-07)。开工门=U0。
## 11. 落位与可复用性预检
本批零新增代码文件、零新增函数:改既有 `camp_scene_layout.tres`(数据行唯一落点)、既有单测追加断言、覆盖既有 `scene_camp_wall.png`(消费名不变,`UiKit.TEX_CAMP_WALL`);另产出两份 `reports/` 过程件(实现报告、反哺点清单)。复用面:视图/装载/校验链现成(camp_scene_view.gd、schema.validate、camp_scene_layout_test.gd),不新增渲染件。唯一面:坐标只落表一处,视图/探针/单测均读表。
## 12. 实现规范预算
零新增文件、零新增方法 → gdstyle 阈值面无新增;存量触面:camp_scene_layout_test.gd 追加一段断言(方法数不变、成员数不变)。
## 13. 复核记录
| 轮次 | 复核者身份 | 发现 | 去向 | 处置结果 |
|---|---|---|---|---|
| 1 | 前台只读复核子代理(未参与撰写) | 七件/六件计数不一(§1/§3/§7) | 补写 | 统一为六件(dummy/forge/tent/chest/notebook/campfire) |
| 1 | 同上 | 六件新值未钉,V14 只证互斥/边界 | 补写 | T2 增六件落位钉值断言,本批已落(PASS 实测) |
| 1 | 同上 | T2 单元套件无真实入口命令 | 补写 | 改为 `godot --headless --path game --script res://tests/unit/presentation/camp_scene_layout_test.gd` |
| 1 | 同上 | T1 `python -c` 不能读 .tres;`db.load_tables` 无命令入口 | 补写 | T1 改为直跑该单测(加载期 validate+钉值) |
| 1 | 同上 | T0 基线写占位目录;扫全 scene 会带 stage 件红 | 补写 | 写入临时隔离基线命令(八件拷贝)与限定扫描面;path_check 环境坑注明 |
| 1 | 同上 | prompts §5 第 9 条布告板旧值 (845,224) | 退回上游 | 文档区已修:(845,241,130,121),底 362 落在墙内 |
| 1 | 同上 | art-bible §6.2 门扇旧句「贴图 240×138 随门洞压扁重画、y283–367」 | 退回上游 | 文档区已修:运行时压扁、底压 y420 |
| 1 | 同上 | prompts §2.3 门洞 y282–420 与在包墙件全高缺口不相符 | 退回上游 | 文档区已修:墙件缺口全高 220–420、门扇可见 282–420 |
| 1 | 同上 | art-bible:395 不含色数判据 | 补写 | 锚改 art-bible.md:212(营地子板色数行) |
| 1 | 同上 | §13 复核报告文件行违反 2026-11-06 裁(凭据=本节) | 自判 | 删除该行 |
| 1 | 同上 | 门扇「重画 138」vs 运行时压扁,§10 零待裁是否成立 | 自判 | 用户 2026-11-07 明裁「不需要动任何美术素材」,运行时压扁即终稿;§10 零待裁成立 |
| 2 | 后台只读复核子代理(未参与撰写) | schema 默认 `wall_band=(0,240,1280,70)` 与注释仍旧值 | 补写 | schema 默认改 (0,220,1280,200)+注释同步 |
| 2 | 同上 | §7「未新增/删除任何断言」措辞与 +5 条钉值矛盾 | 补写 | 改为「未删改旧断言,新增 5 条钉值断言」 |
| 2 | 同上 | test.gd 头注「禁坐标字面量」与新钉值冲突 | 补写 | 头注改为「关系谓词为主+重排钉值」,钉值前加 `# oracle:` 行锚 |