merge(master)+二轮清扫:并回 master 新进提交(iter36 收尾/golden 纪律/S13 治本卡),冲突三处——process-conventions 取 master 新条款(回执 dirty_game 对齐判据/每批跑一次闸/复跑理由)重编号 8–14+闸件义务句维持人工确认口径,S9 卡 D4 维持全项目禁令版(master 侧旧定界句作废),状态面板瘦身卡取 master 删除(iter36 收尾已退役,清洗随亡);随批清扫——待办清单「变异测试禁令写入规约」整条删除(本批即其执行)、roadmap 待编池同步移除

This commit is contained in:
DKChan committed 2026-10-25 03:59:11 +08:00
commit a74fa87fe5
24 files changed
+254 -1181

No files matched your search

+2 -2
View File
@@ -1,6 +1,6 @@
# 美术圣经(Art Bible)— Dungeon Sweeper
> 项目:Dungeon Sweeper(扫雷 × 自动战斗 闯关 Roguelike)· 状态:**第 1–9 节定稿**(§6 环境/§7 UI/§8 资产规范/§9 参考与反参考已于 2026-09-23 v1.8 按 D1/D2/D4/D5 框架成文;D3=§5 角色已于 v1.6 落地、v1.7 抽离独立文档;框架 2026-09-22 用户拍板,原登记于中间产物修订指导,经裁决不入库,明细归状态记录 125);现行为 v3.19,历次修订明细见 git 提交史
> 项目:Dungeon Sweeper(扫雷 × 自动战斗 闯关 Roguelike)· 状态:**第 1–9 节定稿**(§6 环境/§7 UI/§8 资产规范/§9 参考与反参考已于 2026-09-23 v1.8 按 D1/D2/D4/D5 框架成文;D3=§5 角色已于 v1.6 落地、v1.7 抽离独立文档;框架 2026-09-22 用户拍板,原登记于中间产物修订指导,经裁决不入库,明细归状态记录 125);现行为 v3.20,历次修订明细见 git 提交史
>
> **Art Director Sign-Off (AD-ART-BIBLE)**:历次批均 SKIPPED(v1.8 §6–9 补全亦 SKIPPED)— Lean/Solo mode(非 PHASE-GATE;§6–9 已成文,full 门禁签核时机待用户表态)
> 风格基调(2026-09-10 用户定稿):地牢题材但**非暗黑风**——轻快明亮的幻想冒险风,全年龄;像素风;角色 2~3 头身
@@ -394,7 +394,7 @@
- **菱形灯光区(遮罩几何)**:灯光区 = 以角色所在格为中心、**曼哈顿距离 ≤ LIGHT_RADIUS** 的格集,区内照常渲染。LIGHT_RADIUS 走表值/常量参数化,**基准 8**——现行事实源「灯光区起步半径=微光环 8 格」的落码口径(半径数值沿微光「周围 8 格」的 8 起步,实测后可调)。**两圈分立注**:类型微光作用圈 = 英雄贴身 8 邻格(与可挖域同圈,现行事实源《HUD框架》「未开格类型微光」节),**不随灯光区扩**(权威文档配套拍板④)——灯光区只裁可见性,微光锚仍是可挖域,两圈几何分立、半径参数互不读写。提灯插值位:FOG_LANTERN_BONUS = **+2**(flat 整数档,权威文档配套拍板;落码常量名 `board_view.gd FOG_LANTERN_BONUS`——本条旧记 LIGHT_RADIUS_LANTERN_BONUS 系文档侧拟名,随迭代 19 卡④入库对齐实名),**已接效果入库**(2026-10-08 迭代 19 卡④:载体=秘宝·同调位 fog_lantern「魔法提灯」行,组合根每战装配链显式重算接线;呈现画法零改动——本节只管"怎么画",机制现行事实源仍归《HUD框架》)。边界随角色格位逐格重算,无半径插值动画。←现行事实源;§2 光照氛围允许域
- **区外未开格:全黑不渲染(不透明档,照抄现行事实源)**:现行事实源原文「区外**未开格=全黑不渲染**」——不透明纯黑(L=0),**非高遮蔽半透档**。理由注记(为何不用高遮蔽档):①三档信息阶梯干净——未开格不可见=零信息、记忆格=弱信息、活格=全信息,叠读不打架;②高遮蔽档下砖面纹理隐约残留,与「类型微光=未开格唯一信息通道」(§4.2/§4.6.3)冲突——纹理残影泄格面观感;③现行事实源验收线「区外未开格不可见」须二值态才能逐格断言。←现行事实源;§4.2
- **区外已开格:暗淡记忆态(灰显可读档,2026-10-06 UI 设计对齐批 P10 乙换装)**:画法 = **地板纹理原样 + 灰罩压顶**(demo 口径换装——原「程序化素色记忆板平涂」退役;纹理直画后 `FOG_MEMORY_PLATE #3A3A3A` α0.66 灰罩盖顶,素材零改动)+ 格内元素灰阶随罩隐现:**记忆墨 #C4C4C4(中性灰 L≈0.55)**;数字对合成底实测 **≈6.7:1 ≥4.5:1**(WCAG 硬指标;地板纹理均值 #453020 与灰罩合成后 #3E3731 复算,迭代 16 T0)。双峰板色牌格在记忆态**退牌归板**——牌面并入记忆态、数字以记忆墨直画。可辨性自查判据(三通道,落码后随样张/实机自检):①对全黑未开格——合成底 #3E3731(L≈0.036)对 L0,实机目检常光档可分(暗房档一并抽检);②对灯光区内活态已开格——主判据=数字墨灰度差(记忆墨 L0.55 对亮墨三档 L≥0.75 / 色牌 #F5EAD3 L≈0.83,灰度 ΔL≥0.20)+ 色相通道(记忆态近中性灰,对活态暖底暖墨);格底明度差为辅助通道;③格态三形在记忆态保持灰度可辨——形通道经纹理+灰罩形态不变,沿 §1.4 验收 2 同源判据。**旗不在记忆态面**:旗只插在未开格,区外未开格全黑——旗印记随格隐没、灯光区移回复显(纯呈现,旗数据零影响,现行事实源口径的显式推论)。←HUD框架 可访问性基线;§4.1;§1.4;§3.2
- **区外已开格:暗淡记忆态(灰显可读档,2026-10-06 UI 设计对齐批 P10 乙换装)**:画法 = **地板纹理原样 + 灰罩压顶**(demo 口径换装——原「程序化素色记忆板平涂」退役;纹理直画后 `FOG_MEMORY_PLATE #3A3A3A` α0.66 灰罩盖顶,素材零改动)+ 格内元素灰阶随罩隐现:**记忆墨 #C4C4C4(中性灰 L≈0.55)**;数字对合成底实测 **归一后(真实渲染面)三关 5.71–5.93:1 ≥4.5:1**(WCAG 硬指标;合成底 L1 #4C4038/L2 #3F4147/L3 #3E4048;行值与素材随动,测点=ui_contrast_probe 迷雾段)。**归一口径注**:装载亮度归一是现行生产路径(`board_view._normalize_floor_luma`),原图均值≠渲染面,复算须落归一后底。双峰板色牌格在记忆态**退牌归板**——牌面并入记忆态、数字以记忆墨直画。可辨性自查判据(三通道,落码后随样张/实机自检):①对全黑未开格——合成底 #3E3731(L≈0.036)对 L0,实机目检常光档可分(暗房档一并抽检);②对灯光区内活态已开格——主判据=数字墨灰度差(记忆墨 L0.55 对亮墨三档 L≥0.75 / 色牌 #F5EAD3 L≈0.83,灰度 ΔL≥0.20)+ 色相通道(记忆态近中性灰,对活态暖底暖墨);格底明度差为辅助通道;③格态三形在记忆态保持灰度可辨——形通道经纹理+灰罩形态不变,沿 §1.4 验收 2 同源判据。**旗不在记忆态面**:旗只插在未开格,区外未开格全黑——旗印记随格隐没、灯光区移回复显(纯呈现,旗数据零影响,现行事实源口径的显式推论)。←HUD框架 可访问性基线;§4.1;§1.4;§3.2
- **迷雾过渡边:硬边(逐格二值)**:灯光区边界 = **整格二值切换**(区内全渲染 / 区外全黑或记忆态),**不做渐变过渡带、不做半透明晕边**。理由:①边界是信息边界不是氛围晕——渐变中间态 =「看得见但看不清」,破数字可读硬指标与记忆态明度档;②现行事实源验收断言(边界格呈态、两态逐位一致)须格级二值可判;③与砖面整格表达(§3.2 高墙瓦片体系)、ITB 格内信息分层气质同轴。无动画,减动效无涉。←现行事实源;§1.2 原则一;§3.2
- **与结算期去饱和的叠加共存**:结算期去饱和偏移(settlement_fx_view,同族先例)与迷雾调制叠加口径 = **记忆态为终态档**——区外已开格在结算期保持记忆态档、**不再叠加**结算去饱和(灰显已含去饱和语义,二次调制无信息增量且明度不可控);灯光区内格照常吃结算去饱和;全黑格两态无差。叠加态随实施批共存校验 + 探针断言(provisional,实机目检可代拍)。←需求卡片 T3/T4
- **§2 明度禁令自查**:迷雾遮蔽与记忆态灰显属 §2 明度分层**光照氛围允许域**(洞穴举灯的空间光照呈现,与 Moonlighter 取列「亮地板/暗深渊/发光体」光照层次同族),非情绪压暗(§9.2 Darkest 反面条款不触——那禁的是情绪表达)、非状态明暗编码(格态语义仍由形+色相承载,灰度下三态可辨不受扰)。←§2;§9.1;§9.2
+3 -3
View File
@@ -10,7 +10,7 @@
主工作区(master 检出)只作合并落点,一切开发/设计改动禁止直接发生在主工作区:
1. **开工**:每批次先建独立 worktree:`git worktree add ../g-plan2-<任务名> -b <任务分支>`;所有改动与验证都在 worktree 内进行(未跟踪文件不会出现在新 worktree,需手工搬运)
2. **收尾**:迭代 loop 批次验证全绿(冒烟+场景探针)后在主工作区 `git merge --no-ff <任务分支>`,再 `git worktree remove`+删分支;合回前若 master 已被别的批次推进,先在分支里 `git merge master` 解冲突、重跑本域闸再合回。非 loop 批次合回前同样按本批改动域跑闸(见 §3.9:纯文档批跑 `--docs`);游戏类测试(冒烟/单测/MC/探针)对它默认零执行(两入口铁规,见 §4),用户点名或当场问才跑
2. **收尾**:批次收口顺序固定为**冻结 → 件核 → 并 master → 跑一次域闸 → 合回**——代码与断言改完即冻结,全仓件核 grep 查残留;master 已被别的批次推进时先 `git merge master` 解冲突(必须在跑闸之前,闸跑完再并=那次闸白跑),然后按本批改动域跑**一次** `tools/run_all_gates.sh`(见 §3.9:纯文档批跑 `--docs`),全绿后在主工作区 `git merge --no-ff <任务分支>`,再 `git worktree remove`+删分支。闸后 `game/` 面不得再改一个字节(回执作废须重跑),只允许追加 `reports/`、`design/` 等非 `game/` 提交。非 loop 批次同此顺序;游戏类测试(冒烟/单测/MC/探针)对它默认零执行(两入口铁规,见 §4),用户点名或当场问才跑
3. **豁免面**:仅 `.zcode/`(钩子与配置)与 `.qoder/`(本机 harness 配置)允许主工作区直改——两份实测均不入 git(走 worktree 反而带不进去,改动只对本机生效);其余一律走 worktree,主工作区 git commit 被钩子拦截
4. 本铁律由 PreToolUse 钩子 `.zcode/hooks/worktree-guard.sh` 强制兜底;钩子只约束 agent,用户手工改动不受限
@@ -48,8 +48,8 @@
7. **验收改动先行声明**——验收变化(基线换代/探针增改/旧断言改判)预先写进需求卡片,禁事后补
**完成**
8. **批末按域验收才合并**——在任务 worktree 内跑 `tools/run_all_gates.sh`,**按本批改动域选档**:本批改动触及 `game/`(游戏工程代码、测试、探针、场景)→ `--code`;不触及 `game/` 的一切改动(`design/`、根规则文件、`tools/` 工具脚本、`.zcode/` 配置等)→ `--docs`;同批混触 `game/` 与文档面 → 全量档不带参数。所选域全绿才合回 master。合回前独立验收审计通过(iter 技能第 5 步),未过不合回。该脚本是全部验证闸的**唯一入口、唯一清单与唯一域划分**,闸件增减、分域调整都只改它;**本文与其他文档禁另列闸件清单**(清单散落多处正是 iter27 漏跑 `probe_gate --full` 的成因)。跑完写回执 `game/tests/.gates/receipt.json`(含 `domain` 字段),合回时由 worktree-guard 按 diff 路径推域强制校验(六况拦截:缺回执/quick 模式/回执 commit ≠ HEAD/域不覆盖本次改动/含新增红/master HEAD 非回执 commit 祖先=合并将产出未测内容)。闸件(`tools/` 下机检脚本与闸壳)自身的改动不占合回全量——其质量义务=落批时人工确认闸可跑通且判据口径未变,闸真崩溃时合回闸 fail-closed(跑不出回执即拦),不以合回全量为兜底
9. **合并后主区零复跑**(2026-10-24 用户裁:合回重跑验的是与回执同一份字节,零信息)——合回落地后 code 批只做两件秒级事:`--editor --quit` 重刷类名缓存(在册坑:.godot 缓存不入 git,与合并后代码失配会假红假绿)+冒烟启动确认可开机(合计约 1 分钟);docs 批零动作。全量验证只发生在两处=worktree 批末按域闸、分支并入推进过的 master 后重跑本域闸(§1 第 2 条);「合并将产出未测内容」由合回闸祖先判定前置拦截(§3.9 第六况),master 上永不跑全量
8. **批末按域验收才合并**——在任务 worktree 内跑 `tools/run_all_gates.sh`,**按本批改动域选档**:本批改动触及 `game/`(游戏工程代码、测试、探针、场景)→ `--code`;不触及 `game/` 的一切改动(`design/`、根规则文件、`tools/` 工具脚本、`.zcode/` 配置等)→ `--docs`;同批混触 `game/` 与文档面 → 全量档不带参数。所选域全绿才合回 master。合回前独立验收审计通过(iter 技能第 5 步),未过不合回。该脚本是全部验证闸的**唯一入口、唯一清单与唯一域划分**,闸件增减、分域调整都只改它;**本文与其他文档禁另列闸件清单**(清单散落多处正是 iter27 漏跑 `probe_gate --full` 的成因)。跑完写回执 `game/tests/.gates/receipt.json`(含 `domain` 与 `dirty_game` 字段),合回时由 worktree-guard 按 diff 路径推域强制校验(六况拦截:缺回执/quick 模式/回执未覆盖分支尖=回执 commit 之后 `game/` 又有改动、或跑闸时 `game/` 带着未提交改动(`dirty_game`)/域不覆盖本次改动/含新增红/master HEAD 非回执 commit 祖先=合并将产出未测内容)。回执与分支尖的对齐判据是**代码面**不是 commit 号:回执之后只追加 `reports/`、`design/` 等非 `game/` 提交,回执照样有效,不构成复跑理由。闸件(`tools/` 下机检脚本与闸壳)自身的改动不占合回全量——其质量义务=落批时人工确认闸可跑通且判据口径未变,闸真崩溃时合回闸 fail-closed(跑不出回执即拦),不以合回全量为兜底
9. **合并后主区零复跑**(2026-10-24 用户裁:合回重跑验的是与回执同一份字节,零信息)——合回落地后 code 批只做两件秒级事:`--editor --quit` 重刷类名缓存(在册坑:.godot 缓存不入 git,与合并后代码失配会假红假绿)+冒烟启动确认可开机(合计约 1 分钟);docs 批零动作。全量验证**每批跑一次**=worktree 批末按域闸,顺序是「先并入 master、再跑闸」(§1 第 2 条);只有两种情形允许把这次跑作废重来——① 闸红且修法动了 `game/`,② 闸已开跑后 master 又被推进(合并将产出未测内容,由合回闸祖先判定拦下,§3.9 第六况)。「跑都跑了再跑一遍保险」「闸后顺手改点 `game/` 再补一跑」都不构成复跑理由;master 上永不跑全量
10. **批次完成后的登记义务**——合回 master 后按 doc-conventions §12.1 推进待办清单条目状态(做完整条删除),涉及迭代编排的在 roadmap 迭代总表与顶部「当前位」节换代——执行入口=项目技能 batch-closure(批后收尾与中间文档退役),跨会话教训写记忆库。批次过程与结论由 git 提交信息承载,禁止再写会话状态文件(见 doc-conventions 第 10 节)。`design/` 与根规则文件(`AGENTS.md`/`roadmap.md`/`待办清单.md`/`体验验证清单.md`)实现批禁写,见 §12
11. **文档同步闸(实现批禁写文档)**——实现批**禁写 `design/` 整个目录与根规则文件**,要往外交代的东西一律落 `reports/`:实现报告 `reports/iter<N>-实现报告-<日期>.md`(各卡状态+实机目检总清单+遗留读数义务)、代拍板追认单 `reports/iter<N>-代拍板-<日期>.md`、GDD 反哺点清单 `reports/iter<N>-反哺点-<日期>.md`(每条写清哪个文件哪一节、改成什么、依据是什么)。设计权威文档(GDD/art-bible)**任何批都不直改**:用户在会话中逐点裁决后,由非迭代批(工具/规则/文档批)写入 `design/`(执行入口=doc-design 技能),并把反哺条目从 `reports/` 清掉(吸收即死;退役执行=batch-closure 技能)。机械面文档(roadmap 行/术语表/README 工具注)同样归非迭代批在合并前更新。反哺点未落地期间相关 GDD 节视为待反哺,读前先查 `reports/` 与待办清单;需求卡片必列「关联文档同步面」按两层标注
12. **实机目检归用户,只登记不阻塞**——真人检测项登记进实现报告目检总清单与体验验证清单即完成批内义务;禁把等目检当停工理由或完成前置
+3 -3
View File
@@ -2,7 +2,7 @@
> **一句话定位**:本文定义这个项目的 **Alpha 版本包含哪些东西**——它是里程碑 M3 的完成标准,也是判断"还差什么"的对照表。
> **本文只列条目,不写内容**:每样东西是什么、规则怎么走,一律归各自的权威文档,本文只给指路链接。想知道某样东西的定义,请点链接,不要在本文里找解释。
> **状态**:**已定稿(v1.15)**——2026-10-13 用户令定稿,历次升版明细见 git 提交史。Alpha 的内容范围自此冻结:增删条目一律须经用户裁决。
> **状态**:**已定稿(v1.16)**——2026-10-13 用户令定稿,历次升版明细见 git 提交史。Alpha 的内容范围自此冻结:增删条目一律须经用户裁决。
> **成文**:2026-10-13。
## 本文怎么用
@@ -110,9 +110,9 @@ Alpha 内以玩法循环本身的内容与表现为主(棋盘、关卡、战
| 战斗屏 | [battle](ux/battle.md) | 在役 |
| 战斗结算总结框 | [settlement-summary](ux/settlement-summary.md) | 在役 |
| 关卡结算屏 | [level-clear](ux/level-clear.md) | 在役 |
| 三选一(奖励节点 / 通关) | [node-reward](ux/node-reward.md) | 在役 |
| 三选一(奖励节点 / 通关) | [node-reward](ux/node-reward.md) | 部分在役(在役半=通关三选一;未结半=奖励节点现为零兑付直通占位,登记面=待办清单「奖励节点三选一实装」条) |
| 商店 | [shop](ux/shop.md) | 在役 |
| 状态面板(局内) | [待办清单](../../待办清单.md) | 部分在役(在役半=面板本体——迭代 17 卡③实装、2026-10-13 由「暂停层」改名;未结半=2026-10-16 用户令瘦身——去跨关解锁内容〔秘宝匣解锁态 12 行概览 / 天赋树已购概览〕、只留本局五件〔带的秘宝 / 已获专长 / 当前属性 / 现有 GP / 钥石总量〕;登记面=待办清单「状态面板瘦身」专条;出口判据=只显示本局五件、两段跨关解锁退役、文案更新、界面探针或断言覆盖、用户目检通过) |
| 状态面板(局内) | [元进度](systems/跨局循环/元进度.md)(「解锁界面:双入口框架」节) | 在役 |
| 冒险终局面板 | —— | 在役 |
| 图例面板 | —— | 在役 |
| 设置面 | [设置与本地化](systems/表现与支撑/设置与本地化.md) | 在役 |
@@ -55,7 +55,7 @@ HUD 框架定稿时已为教学留好两个承载位,本系统的内容将来
|---|---|---|
| 行动点价目 | [行动经济](../排雷循环/行动经济.md) | 挖 / 封印各花多少、移动与连锁免费 |
| 储备池清零提示 | [行动经济](../排雷循环/行动经济.md) | 必须说清"储备行动点在战斗结束时清零",防止"攒的钱凭空没了"的误读 |
| 封印是一次性承诺的首遇提示 | [排雷玩法](../排雷循环/排雷玩法.md)(封印不可逆批 2026-09-19) | 经典扫雷玩家会习惯性右键拔除标记——本作封印印记不能拔,落子就是承诺;想改主意就左键直接挖开(安全格零奖励、危险格吃挖雷惩罚)。每场冒险提示一次,非模态 |
| 封印是一次性承诺的首遇提示 | [排雷玩法](../排雷循环/排雷玩法.md)(封印不可逆批 2026-09-19) | 经典扫雷玩家会习惯性右键拔除标记——本作封印印记不能拔,落子就是承诺;想改主意就左键直接挖开(安全格零奖励、危险格受挖掘惩罚)。每场冒险提示一次,非模态 |
| chord 不存在的首遇提示 | [HUD 框架](HUD框架.md)(承接排雷玩法的呈现义务) | 经典扫雷玩家会习惯性双击数字格——本作没有 chord,点数字格 = 移动小人。每场冒险提示一次,非模态 |
| 挖非相邻格的首次提示 | [HUD 框架](HUD框架.md) | 挖与封印都限小人 8 向相邻的格子,第一次越界操作时提示 |
| 增益叠层节奏 | [增益状态](../战斗循环/增益状态.md) | "同一轮拿满优于跨轮慢慢叠"——增益有结算次数衰减,教学要传达这个节奏 |
+1 -1
View File
@@ -103,7 +103,7 @@
### 解锁界面:双入口框架
(2026-09-18 拍板;入口拓扑随迭代 33 卡② 三入口化换代,2026-10-22 反哺写入)营地消费面(消费钥石、查看与管理永久强化)经主菜单「进入存档」→选档界面→进档/新档进入,主菜单不再设营地独立钮;局内状态面板(原称暂停层,2026-10-13 改名——游戏非实时无暂停语义)也可查看钥石余额与已解锁清单(只读)。钥石余额在 HUD 常驻展示。呈现 spec 已出生:[ux/camp.md](../../ux/camp.md) v1.0(2026-09-30 审计拍板点 4A 裁决写入文档——退役/封存件「已退役/已解锁·能力封存中」呈现语义随 spec 落位);视觉终稿已随迭代 9 9A 段落码(2026-09-30)。本节锁框架与需求,呈现细节归 spec;局内状态面板入口已实装(2026-10-06 迭代 17 卡③〔时名暂停层〕——实机目检待用户,待办清单登记条在册)。
(2026-09-18 拍板;入口拓扑随迭代 33 卡② 三入口化换代,2026-10-22 反哺写入)营地消费面(消费钥石、查看与管理永久强化)经主菜单「进入存档」→选档界面→进档/新档进入,主菜单不再设营地独立钮;局内状态面板(原称暂停层,2026-10-13 改名——游戏非实时无暂停语义)也可查看钥石余额与本局冒险信息(只读)。钥石余额在 HUD 常驻展示。呈现 spec 已出生:[ux/camp.md](../../ux/camp.md) v1.0(2026-09-30 审计拍板点 4A 裁决写入文档——退役/封存件「已退役/已解锁·能力封存中」呈现语义随 spec 落位);视觉终稿已随迭代 9 9A 段落码(2026-09-30)。本节锁框架与需求,呈现细节归 spec;局内状态面板入口已实装(2026-10-06 迭代 17 卡③〔时名暂停层〕——实机目检待用户,待办清单登记条在册)。
### 单局循环零依赖:排期边界的推论
+2 -2
View File
@@ -27,7 +27,7 @@
边界三条(均为 2026-10-06 用户裁 P4 甲):
1. **局内不放生涯入口**。冒险进行中玩家只看状态面板(迭代 17 卡③并行批——局内只读查看钥石与解锁进度);若历史回看能从局内到达,等于绕回 P-C7 退役前的形态,禁止。
1. **局内不放生涯入口**。冒险进行中玩家只看状态面板(迭代 17 卡③并行批——局内只读查看钥石与本局冒险进度);若历史回看能从局内到达,等于绕回 P-C7 退役前的形态,禁止。
2. **生涯内零跳转**。不放「去营地」之类的操作引导,生涯纯只读。
3. **与 P-C7 的关系**:生涯的成立正是 P-C7 裁决的补偿面——「冒险中无回看」的已知代价由生涯承接(待办清单条目原文口径),本文不提议在冒险中恢复任何回看入口。
@@ -70,7 +70,7 @@
| 界面 | 管什么(现状指证) | 与生涯的边界 |
|---|---|---|
| 营地([camp UX spec](../../ux/camp.md)) | 跨局成长**操作**面(花钥石买强化 / 装配 / 点树)+ 底栏「最近冒险」条带——`camp_overlay_view.gd:431` `_rebuild_recent()` 逐局拼行(`:442`「完成/放弃/失败 · 通关 N 关 · 钥石 +N · 种子 N」,无截断上限),数据源 = `camp_shop_presenter.gd:85` 投影的同一份 `recent_summaries` | 营地不改生涯只读定位;生涯不做任何购买入口,也不放「去买」按钮。营地条带的去留是本提纲必答项——见 §五 P6 |
| 状态面板(迭代 17 卡③,并行批开发中) | **局内**只读查看这一局进行中的钥石与解锁进度 | 状态面板看当局当前值,生涯看跨局累计与历史;局内无生涯入口(P4 甲) |
| 状态面板(迭代 17 卡③,并行批开发中) | **局内**只读查看这一局进行中的钥石与本局冒险进度 | 状态面板看当局当前值,生涯看跨局累计与历史;局内无生涯入口(P4 甲) |
| 结算屏([settlement-summary UX spec](../../ux/settlement-summary.md)) | 冒险收束当下的入账明细——`main.gd:537` `_on_adventure_finished` 收束时呈现摘要与钥石明细(复用终局面账行,`battle_end_overlay.gd:118-129`) | 收束当下的呈现保留不动;生涯承接的是收束之后的任意时刻回看 |
| 帮助手册(Beta 批,未实装——教学内容归 Beta 帮助手册,`ui_assembler.gd:99` 注记) | 讲「怎么玩」 | 生涯讲「我玩过什么」。图鉴条目文案与手册是否共用内容源,接口登记归 Beta 批一并裁 |
| 图例面板(legend_overlay) | 局内符号/徽标即时解码 | 不合并——图例是局内解码面,图鉴是跨局收集面 |
+2 -2
View File
@@ -1,6 +1,6 @@
# 节点奖励屏 UX spec(node-reward)
> 状态:v2.7(2026-10-15 简明技术中文用语规范(用户令)批——词面修正 1 处;池与交互形态同 v2.4)
> 状态:v2.8(池与交互形态同 v2.4;头部文案与现行渠道分离对齐)
> 事实源:`game/presentation/views/curio_pick_overlay.gd`(三选一覆盖层共用面)+ `main.gd`(奖励节点分支——`adventure.node_bonus_candidates/apply_node_bonus`)+ `battle_narrator.gd`(node_bonus_header)
> 相邻:[level-clear](level-clear.md)(通关三选一面——同一覆盖层的另一上下文)/ [level-map](level-map.md)(关卡画面)/ [秘宝](../systems/跨局循环/秘宝.md)(道具件内容权威——本批起为局外同调件,不再入三选一牌库)/ [冒险结构](../systems/冒险循环/冒险结构.md)(共享池令牌库账本)
@@ -11,7 +11,7 @@
## 布局与交互
- 载体 = 提升三选一覆盖层(CurioPickOverlay——curio_pick_overlay.gd,与 [level-clear](level-clear.md) 共用组件——零新增交互原语)。
- 头部行:「关卡奖励点 / 从提升池抽三选一(与通关三选一同池同权重同上限):选择一件带走:」(Narrator.node_bonus_header——文案「与通关三选一同池同权重同上限」滞后于迭代 15② 渠道分离,现行通关候选 = 纯专长;文案换代归内容批,已呈报)。
- 头部行:「关卡奖励点 / 从冒险牌库抽三选一(属性值提升与补给;与通关专长三选一同库分流):选择一件带走:」(Narrator.node_bonus_header)。
- 三卡点选(✓ 高亮,确认前可改选)→「确认选择」→ 兑付反馈(选中件效果 + 丢弃提示)→「继续」→ 回图选路(零自动推进同款)。
- ~~秘宝件直显/满位替换~~(v2.1 两面随池种退役——迭代 11 第①批 T7;秘宝改走营地同调装配面,见[秘宝](../systems/跨局循环/秘宝.md))。
- **三选一刷新**(v2.2 新增——P1 甲 X/Y 双源;机制现行事实源=[秘宝](../systems/跨局循环/秘宝.md)「三选一刷新双源」节,X 源承载件已随新目录批换代〔旧目录「三选一刷新件」退役→新目录「刷新练习」〕):装配「三选一刷新件」给 X 次(每次碰三选一重给、优先消耗、不结转)+ 营地「刷新升级」给 Y 次(每冒险开局注入冒险周期池、用完即无);刷新钮余量 >0 时现形,点按重抽三候选(reward_pick 既有洗牌流,池规则全保留:不放回/达上限剔牌/掷定前置直显/停点可中断)。autoplay 默认不刷(钓鱼归玩家)。
+2 -1
View File
@@ -53,7 +53,8 @@ static func validate_graph(nodes: Array) -> Array:
var well := _check_nodes_wellformed(nodes)
if not (well["errs"] as Array).is_empty():
return well["errs"]
var by_id: Dictionary = well["by_id"]
var by_id: Dictionary[int, Dictionary] = {}
by_id.assign(well["by_id"])
var edges := _check_edges(by_id, well["indeg"])
if not (edges["errs"] as Array).is_empty():
return edges["errs"]
+3
View File
@@ -12,6 +12,9 @@
- **判有效**(changed 远低于 2% 阈值):基线**留在位并在此加注一次判定记录**,不得顺手重制;
- **判失效**(changed 超阈值或换代面落在裁剪区外):按迭代 26 T6 先例**显式重制 + 呈报 + 复闸**,
禁止先动后判、禁止用「重制一下就绿了」掩盖真实视觉回归。
- **加严口径(棋盘三图)**:棋盘图 changed>0 且差异像素落在棋盘裁剪区内(900×760)一律按**判失效**
处理——占比远低于 2% 阈值也不判有效,显式呈报后由用户定是否重制。该口径只收紧棋盘三图的判读,
不改写 2% 容差本身的语义(`golden_compare.py` 判据不动);启动态菜单不适用本口径。
## 判定记录
@@ -1,33 +0,0 @@
# 迭代 36 代拍板追认单(2026-10-24)
> 白名单内代拍项备案(授权发生在卡片审问阶段,实现只执行预授权);批后追认=确认,不是事后授权。超白名单的裁断零发生(唯一例外=「路径②驱动前提不成立」的处置,见 §末单独列示——该处置落在卡C 代拍板 2 的「既有快照喂入」预授权形态内,但所涉卡片前提缺陷已升级为停机呈报级事实移交)。
## 卡C(开场后缀营地灰字迷雾测点批)
1. **迷雾三行行名与注释措辞**(白名单 1):「迷雾·记忆墨/合成底L1地牢/L2幽暗/L3深幽」——含关别与「归一后」口径 ✓。
2. **路径③断点态构造细节**(白名单 2):最终采用「既有快照喂入」形态(`save_manager.set_breakpoint` 夹具→`_resume_from_menu` 唯一消费口),非自然落盘——**约束满足**:断点=选路停点形(bonus.atk=5 已入账、bonus_pending/bonus_result 皆空、node_id=-1);bonus 回填经 `resume_adventure` :151-154 真链(探针断言 run_ledger.bonus.atk==5 在座)。形态变更的动因(原「自然落盘」链路依赖的奖励节点三选一在现行 build 不可达)已列反哺点 ③ 与停机级事实移交。
3. **三选一候选兜底循环**(白名单 3):未触发——路径②原设计停点不可达(同上);通关三选一 relic 兜底选择取 field_dressing(生存向),随驱动链一并废止。
4. **取色断言定位锚**(白名单 4):文本锚(图鉴锁文「柜台结构位预留」/秘宝匣行容器子树内「未解锁」/形态「被动|主动·充能」/档位=UiKit.TREASURE_TIER_LABELS 值域/刷新行「三选一刷新」前缀)。
5. **提交切分与分支命名**(白名单 5):单工作区 `g-plan2-iter36`、分支 `iter36`;实现一笔检查点提交+闸后产出物一笔(卡③停摆不提交)。
6. **迷雾行值 L2 条款修订**(卡C §9 L2 预授权):手填行值与探针派生首跑失配(L2/L3 偏差 ~5/255,PIL↔Godot 导入解码系统差)→ 以探针派生值为准修行值(L2 (74,79,96)/L3 (71,75,99)),读数与依据在实现报告 §3。
## 卡A(文案与禁字清扫批)
1. **u3 最终措辞**(白名单 1):「关卡奖励点\n从冒险牌库抽三选一(属性值提升与补给;与通关专长三选一同库分流):\n选择一件带走:」——三机制事实词齐、三旧话词零残留 ✓。
2. **断言名与消息措辞、定位写法**(白名单 2):全部带〔wa#/wc#/sv#〕尾缀;取色/段头定位=文本锚+成员直引混合(sweep 宿主用成员 `_feat_section` 首子 Label,探针用文本锚)。
3. **T2② 地图帽断言注值取法**(白名单 3):帽 Label 常在树(零加成隐藏不隐藏 Label 本体)——按子树文本锚直判,零注值。
4. **源扫描注释剥离**(白名单 4):行首 `#` 判定式(strip_edges 后 begins_with("#") 跳行);board_view.gd 扫描为全源 `"雷"` 字面量计数(哨兵族钉住,无注释剥离必要——实查零命中含注释)。
5. **提交切分**(白名单 5):与卡C 同笔检查点提交(ui_click_probe 断言面两卡共用文件,拆笔无净收益)。
## 卡③(状态面板瘦身批)
1. **空态句与段头措辞**(白名单 1):段头=「本局状态/带的秘宝/已获专长」(用户原话词干);空态句=「未携带秘宝」「未获专长」(:130 先例形制)✓。
2. **属性行串接序与分隔符**(白名单 2):「生命 %d/%d · 攻击 %d · 护甲 AC %d · GP %d」逐字(契约 4 钉值)✓。
3. **断言定位写法**(白名单 3):隔离档=成员直引(`_attrs_label`/`_curios_label`/`_feats_label`)+子树文本扫描(零旧段);探针=成员直引+独立 oracle 对拍。
4. **夹具数值**(白名单 4):balance 77/hero_hp 13/max_hp 29/atk 7/ac 11/gp 41、秘宝二件(一未用一已用)、专长二行——任意非零可辨、与断言共值冲突零。
5. **提交切分**(白名单 5):卡③ 一笔实现提交+风格修正一笔。
6. **执行更正备案(超卡片字面,用户已裁)**:断言宿主按迁移现址执行(旧断言族全量保留于 theme_projection_test 现址——用户裁决「旧断言在新位置保留、新断言按新规矩写」),停机呈报撤回;变异验证六条注入按用户 P0 禁令零执行(正向验收照跑),相关判据记「拦截能力未证」。
## 超白名单事项(须用户知悉)
- **路径②驱动前提不成立**(卡C):奖励节点三选一在现行 build 不可达(reward 节点直通占位、L1 零商店节点)——处置=改快照喂入形态(代拍板 2 形态内)+事实移交反哺点 ③/⑧+实现报告缺陷记录。若用户认「路径②须保留原设计」→ 需先立「奖励节点三选一实装」批,本卡 wc1 正向半随之重写卡。
-61
View File
@@ -1,61 +0,0 @@
# 迭代 36 反哺点清单(2026-10-24)
> 实现批产出物。每条=哪个文件哪一节、改成什么、依据。用户会话裁决后归文档批写入 `design/` 并把该条清掉。本批零 GDD 陈述违反——以下全部为「实现与现实差异的文档随动」与「卡片事实缺陷的登记」,逐条待裁。
## 卡C(开场后缀营地灰字迷雾测点批)
### ① `design/art/art-bible.md` §6.5 :395 迷雾记忆态在册复算值换代
- 改成:在册复算值「≈6.7:1(地板纹理均值 #453020 与灰罩合成后…)」→「归一后(真实渲染面)三关 5.71–5.93:1(合成底 L1 #4C4038/L2 #3F4147/L3 #3E4048;行值与素材随动,测点=ui_contrast_probe 迷雾段)+归一口径注(装载亮度归一是现行生产路径——board_view `_normalize_floor_luma`,原图均值≠渲染面)」。
- 依据:卡C 契约 3(甲·归一后基准)+F9/F10;**读数修正**:写卡会话 PIL 复算(5.65–5.75:1)与探针派生首跑在 L2/L3 系统性偏差约 5/255(PIL↔Godot 导入解码差),已按卡内 L2 条款以探针派生值为准修手填行值——文档应记派生口径值(5.71/5.83/5.93),不是写卡值。
### ② `待办清单.md`「qa/ 实现报告收尾·孤儿遗留七项」条目处置
- 改成:第⑥项(TG_* 装饰带)按用户 2026-10-24 裁整条注销;第②③④项随卡C 落地销号;第⑦项(商店房截图纳屏)留存——条目本体保留至 ⑦ 处置;状态推进「已写卡(本卡路径)→已实现(迭代 36)」。
- 依据:卡C §6 +来源条目状态机。
### ③ 卡C 卡片前提缺陷登记(新增反哺点——开工检查后施工中新发现)
- 改成:在「qa/ 实现报告收尾」条目或需求卡片修订记录(由文档批裁量落点)登记:**F5「属性值提升经三选一/商店兑付入 bonus(奖励节点渠道=属性值提升+补给)」中「奖励节点渠道」半句与现行 build 不符**——地图 reward 节点=零兑付直通占位(`level_runner.gd` `_enter_node` 注记「奖励点内容未定…零兑付直通」),L1 全模板零商店节点(level.tres L1 行 20 battle/5 boss/5 rest/5 reward,零 shop);现行局内 bonus 唯一可达来源=L2 商店货架(pool 面 kind_id 购买)。卡C 路径②原设计(奖励节点拿属性卡→下一关开场行)据此不可驱动,实现改快照喂入形态(代拍板 2)。
- 依据:实现实跑证据(probe24/25 选路诊断+level.tres 实查);此差异同时影响后续任何涉及「奖励节点三选一」的驱动设计。
## 卡A(文案与禁字清扫批)
### ④ `design/gdd/ux/node-reward.md` :14 旧头部全文引换代
- 改成::14 在册逐字引「关卡奖励点\n从提升池抽三选一(与通关三选一同池同权重同上限):\n选择一件带走:」→ 新头部全文「关卡奖励点\n从冒险牌库抽三选一(属性值提升与补给;与通关专长三选一同库分流):\n选择一件带走:」;并连带该节「文案换代归内容批,已呈报」句销号(本卡即该内容批)。
- 依据:卡A u3(§6 ①)。
### ⑤ `design/gdd/systems/表现与支撑/教学引导.md` :58 旧句换代
- 改成:「(安全格零奖励、危险格吃挖雷惩罚)」→「(安全格零奖励、危险格受挖掘惩罚)」;同句「插错可左键直接挖开」→「标空可左键直接挖开」(u4 全句换代——「标空」与「标中」成对)。
- 依据:卡A u4(§6 ②)。
### ⑥ `game/tests/golden/README.md` 加严口径纪律句(待用户裁)
- 改成与否待裁:本批 golden 判定采用加严口径「棋盘三图 changed>0 且差异像素落棋盘裁剪区=按判失效处理(显式呈报后定重制),不改写 2% 容差基线语义」——是否写入 README 纪律句由用户裁(严于现行「远低于阈值=有效」)。
- 依据:卡A 契约 4(§6 ③)。
### ⑦ `待办清单.md` 卡A 两条来源条目批后退役
- 改成:「现役 UI/文案两处自相冲突」(2026-10-09)+「玩家面残留禁字清扫——图例/明细/日志/字形五处」(2026-10-20)两整条随本卡落地退役;状态推进「已实现(迭代 36)」。
- 依据:卡A §6 ④。
### ⑧ 卡A 卡片前提核对补记(合并进 ③ 同一登记或分列,由文档批裁量)
- 改成:卡A T2③ 断言「三选一停点弹层头部含『冒险牌库』」在本次实跑未捕获到「关卡奖励点」停点(奖励节点直通占位——同 ③ 依据;实跑出现的唯一停点=通关三选一,头部为「第 1 层通过!…」独立文案,不经 node_curio_header)。断言保留为条件断言(拦截面=未来奖励节点停点实装后的真实头部),**拦截能力未证**如实申报(test-conventions §6 口径)。
- 依据:probe 探针实跑记录(ui_click_probe 主循环 curio 分支捕获条件)。
## 卡③(状态面板瘦身批)
### ⑨ `design/gdd/systems/跨局循环/元进度.md` 「解锁界面:双入口框架」节(:104-106)
- 改成:「局内状态面板……也可查看钥石余额与**已解锁清单**(只读)」→「……也可查看钥石余额与本局冒险信息(只读)」。
- 依据:卡③ 契约 1/2(跨关解锁概览退役——「已解锁清单」半句失效)。
### ⑩ `design/gdd/systems/跨局循环/生涯.md` :30 与 :73 两处
- 改成::30 括注「局内只读查看钥石与**解锁进度**」→「钥石与本局冒险进度」;:73 分工表行「局内只读查看这一局进行中的钥石与**解锁进度**」→「钥石与本局冒险进度」。
- 依据:卡③ 契约 1/2(同上)。
### ⑪ `design/gdd/08-Alpha版本标准.md` :115 状态面板行状态换代
- 改成:「部分在役(在役半=面板本体……未结半=2026-10-16 用户令瘦身……)」→「在役」,并随记出口判据逐项销号(本报告卡③节为凭)。
- 依据:卡③ §6 ③+D1(08 状态面板行)。
### ⑫ `体验验证清单.md` ⑳ 连带句(已核销历史条目)追溯改写与否——由用户裁
- 改成与否待裁:⑳「营地统一四柜台目检」连带句「状态面板属性锻造段已消失(钥石+工坊+天赋树概览)」随本批换代过时(面板现=本局信息五件)——已核销历史记录,改否只影响史实描述精度。
- 依据:卡③ §6 ④。
### ⑬ `待办清单.md` 卡③ 登记条批后退役
- 改成:「状态面板瘦身——局内面板去跨关解锁内容、只留本局信息」条目整条退役(状态「已实现(迭代 36)」)。
- 依据:卡③ §6 ⑤。
-137
View File
@@ -1,137 +0,0 @@
# 迭代 36 实现报告(2026-10-24)——卡C 开场后缀营地灰字迷雾测点批+卡A 文案与禁字清扫批+卡③ 状态面板瘦身批
- 工作区:`../g-plan2-iter36`(分支 `iter36`,单工作区串行);卡序=roadmap 行格内顺序(卡C→卡A→卡③)
- 卡③经过更正:实现会话曾因卡片断言宿主指认指向已退役的 `game/smoke/` 而停机呈报;**用户裁决更正**——退役迁移已把旧断言族全量保留至现址(`theme_projection_test.gd` `_status_panel_projection`,迁移账本 S61),实现按现址续接即可,无需重锚流程。原停机呈报文件已删(git 历史可考),其结论由本报告卡③节吸收。
- 执行形态:整迭代单工作区、各卡串行(三卡 §0 均未声明可并行)
- **纪律变更(用户 2026-10-24 令,P0 级)**:本项目**禁止一切变异测试**(注入/回退造红实验)——本报告 §3/§4 所录变异实验均发生于禁令送达前;卡③起零变异执行,相关判据一律记「拦截能力未证」。规则文档中「变异验证」条款的修正归文档批。
## 0. 卡C 状态总表
| 完成定义项 | 状态 | 凭据 |
|---|---|---|
| 1. 后缀条件落地+三路径断言 | **达成(②形态代拍板 2 等价)** | ui_click_probe 白板反向绿+续玩重建正向绿(bonus.atk=5 回填、pct=0、ov=0)+wc3 回归绿;theme_projection 静态半三断言绿 |
| 2. 营地六处 STONE_DEEP+零残留 | 达成 | 源 token 扫描(struct probe)绿+六处取色断言绿+contrast 探针在册两行回归绿 |
| 3. 迷雾三行+派生校验+注释随动 | 达成 | contrast 探针 40 对全绿+派生校验绿;board_cell_unit.gd:270 注释随动 |
| 4. 对照表逐行断言绿+变异表 | 达成 | §3 变异记录表 |
| 5. 批末代码域闸全绿+读数对拍+三产出物 | 见 §6 | 闸回执 |
**卡C 前提缺陷(重要)**:路径②原设计「奖励节点三选一拿属性卡→下一关开场行带后缀」在现行 build 不可驱动——L1 全模板零商店节点(level.tres L1 行:20 battle/5 boss/5 rest/5 reward,零 shop),reward 节点=零兑付直通占位(level_runner `_enter_node` 注记「奖励点内容未定…零兑付直通」,实跑选路诊断印证)。现行局内 bonus 唯一可达来源=L2 商店货架,但 autoplay 到店生存性 ~42% 量级(MC perfect 锚)不可作为验收驱动。**处置**:②③改「既有快照喂入」形态(代拍板 2 预授权:断点=选路停点形钉值——bonus.atk=5 已入账、bonus_pending/bonus_result 皆空;经 `_resume_from_menu` 唯一消费口;`resume_adventure` :151-154 真链回填由探针断言 run_ledger.bonus.atk==5 钉住)。条件加算区两项的机制面(回填→level_started→条件求值→尾接)与 fresh 路径同式全链被测;fresh 正向拦截能力未证,如实申报。已列反哺点 ③。
## 1. 卡A 状态总表
| 完成定义项 | 状态 | 凭据 |
|---|---|---|
| 1. 钉值表 12 单元落地+玩家面六词零残留 | 达成 | 六词扫 presentation/core 玩家面字面量零命中(.tres 命中均为 `;` 注释保留面);字形「危」+两哨兵同批 |
| 2. 对照表逐行断言绿+变异表 | 达成 | §4 变异记录表 |
| 3. 内部注记面零改动 | 达成 | RED_MINE 常量/注释、「雷」内部语、术语表 :128 所指全未触碰(git diff 核) |
| 4. golden 判定动作 | 见 §6 | 渲染闸读数 |
| 5. 批末闸+读数对拍+三产出物 | 见 §6 | 闸回执 |
**卡A 前提缺陷(较轻)**:wa4 探针半(三选一停点弹层头部断言)本次实跑未捕获到「关卡奖励点」停点——实跑唯一停点=通关三选一(头部=「第 1 层通过!…」独立文案,不经 `node_curio_header`)。断言保留为条件断言,**拦截能力未证**(test-conventions §6 口径);静态半(sweep 断言②+u3 变异红)拦截力已证。已列反哺点 ⑧。
## 1b. 卡③ 状态总表(状态面板瘦身批)
| 完成定义项 | 状态 | 凭据 |
|---|---|---|
| 1. 面板五件内容在位且投影一致 | 达成 | theme_projection `_status_panel_projection` 换代九断言全绿(余额徽/属性行五现值/秘宝受理序+已用尾缀/专长行串/空态句×2/提示行)——套件 162 checks 全绿 |
| 2. 跨关概览退役零残留 | 达成 | sv5 双断言(子树零旧文案+旧成员零残留);`meta.treasure_shop_status()/tree_camp_rows()/tree_fork_groups()` 三函数本体零改动(diff 核) |
| 3. 文案三处换代+标题/继续钮锚不变 | 达成 | 提示行/两角标 tooltip=「查看本局冒险进度(只读)」;全仓「永久强化进度」零命中;ui_struct_probe ⑧ 两契约绿(信号连接数=2+零动效) |
| 4. 只读/零动效契约保持 | 达成 | 同上(ui_struct/field 探针回归) |
| 5. 产出物三份 | 达成 | 本节+反哺点+代拍板追认单卡③节 |
| 对照表 sv6/sv7 探针三断言 | 达成 | ui_click_probe 状态段(真实角标信号开层):零旧段+属性行对 runner 五现值+`_status_data()` 直调八键键集+curios 独立 oracle(query_inventory×treasure_item_row)+feats 对拍——探针全绿(问题=0) |
| 变异验证 | **零执行(用户 P0 禁令)** | 卡片 T1/T2 六条注入全部未跑;相关断言记「拦截能力未证」——正向验收测试照跑(隔离档+探针) |
实现要点更正(对卡片 F4 的执行更正):`hero_hp`/`gp` 取数走 LevelRunner 属性 getter(`runner.hero_hp`/`runner.gp`——`_ledger` 直取下标的属性化封装,键缺失=致命语义不变);卡片原文 `runner.ledger[...]` 的 ledger 住在 AdventureRunner,面板开层时点的 runner=LevelRunner。
## 1c. 卡③ 实机目检总清单(登记不阻塞)
1. 面板观感:本局信息层级/文案通顺/空态句得体(08 出口判据「用户目检通过」由此承接)。
## 2. 实际改动—验收对照表(卡C)
> 与卡片 §8.2 的差异处加粗。断言尾缀可 grep。
| 行 | 改动实况 | 验收测试实况 | 真实入口实况 | 撤销/变异证明实况 |
|---|---|---|---|---|
| wc1 新开路径 | main.gd:608-616 条件扩两项(六项布尔逐字);theme_projection_test `_smoke_level_open_line` 扩段三断言;ui_click_probe 白板反向断言 | 三静态断言绿+白板反向绿〔wc1〕 | `_start_adventure_from_menu()`(:493 现址)真实开局;静态直调 | 变异:条件全项删→白板仍绿(反向钉住);正向半见 wc2 行(fresh 正向不可驱动——缺陷记录) |
| wc2 续玩路径 | 同 hunk+探针断点续玩断言 | 续玩重建开场行带后缀〔wc2〕 | `_resume_from_menu()`(:519 唯一消费口);断点=set_breakpoint 快照喂入(代拍板 2):选路停点形、bonus.atk=5、pending/result 皆空 | **撤销:回退条件 hunk→路径②③红、①仍绿(实测 mut3)** |
| wc3 既有口径回归 | 同 hunk 回归面 | run 1(滑条 400/200=局外加成)开场行带后缀〔wc3〕 | 调试滑条 pct 门控(现役 DebugOverlay) | 变异:条件旧四项全删→wc3 红(实测 mut4) |
| wc4 营地六处换色 | camp_overlay_view.gd :167/:417/:476/:509/:513/:525 换 STONE_DEEP;源内零裸 STONE | 取色六锚断言+token 扫描断言〔wc4〕 | `open_camp_via_savesel` 真实入口 | 变异::417 回 STONE→取色红(mut2 实测 12 处「未解锁」行)+struct 扫描红(mut5 实测);判别式放宽→误红(mut6 边界证明) |
| wc5 迷雾测点三行+派生校验 | ui_contrast_probe 迷雾单行→三行+`_norm_floor_avg` 派生+校验断言;**行值按探针派生首跑修值(L2 (74,79,96)/L3 (71,75,99)——卡 §9 L2 预授权)** | 三行 ≥4.5:1+行值 vs 派生 ±2/255〔wc5〕 | `UiKit.load_tex` 真装载+`BoardView._normalize_floor_luma` 生产静态直呼 | 变异①行值回原图基准→校验红;②调偏 +4→红;③target_l 0.10→0.05→红(三注入实测) |
| wc6 注释随动(非行为) | board_cell_unit.gd :270 复算值换代(5.71–5.93:1) | 件核 | — | 件核 |
| wc7 反哺点(非行为) | 反哺点清单卡C 三条+新增 ③ | 件核对表 | — | 件核 |
## 3. 卡C 变异验证记录表
| # | 注入 | 最窄闸 | 结果 |
|---|---|---|---|
| T3-① | L1 行值回原图基准 (69,48,32) | contrast 探针 headless | 红:行值失真(派生 (111,77,51))✓ |
| T3-② | L1 行值调偏 +4 (115,77,51) | 同上 | 红 ✓ |
| T3-③ | 派生 target_l 0.10→0.05 | 同上 | 红:三关全失真 ✓ |
| T3-还原 | 精确还原 | 同上 | PASS 40 对 ✓ |
| T2-①(mut3) | 条件删加算区两项 | ui_click_probe 全程 | 红:②③失守;①仍绿(反向钉住)✓ |
| T2-②(mut4) | 条件旧四项全删 | 同上 | 红:wc3 回归失守+②③失守;①绿 ✓ |
| T1-①(mut2) | camp :417 回 STONE | ui_click_probe | 红:取色断言 12 处「未解锁」行 ✓ |
| T1-②(mut5) | 同注入 | ui_struct_probe | 红:源扫描裸 STONE ✓ |
| T1-③(mut6) | 扫描判别式放宽(匹配 _DEEP) | ui_struct_probe | 误红(判别边界证明)✓ |
## 4. 实际改动—验收对照表+变异记录(卡A)
| 行 | 改动实况 | 验收测试实况 | 变异证明实况 |
|---|---|---|---|
| wa1 C 区段头×2 | hero_info_panel_view.gd :73/:93 换词 | sweep 断言①+探针 C 区断言 | u1 回退→sweep 红;u2 回退→sweep 红(批量注入实测);探针半=u1 回退→探针红(mut2 实测) |
| wa2 地图加成帽 | level_map_screen.gd :171 换词 | 探针地图段(文本锚) | u10 回退→探针红(专项 mut7 实测,唯一失败项) |
| wa3 专长卡兜底 | battle_narrator.gd :142 换词 | sweep 断言③ | u11 回退→sweep 红(专项实测) |
| wa4 奖励点头部 | battle_narrator.gd :156 换新(L1 措辞微调:注释「共享同池」→「共享同库」随动) | sweep 断言②(三事实+三旧话清零)+探针条件断言(拦截能力未证——见 §1 缺陷) | u3 回退→sweep 红(专项实测 6 断言全红) |
| wa5 图例行 | legend_overlay.gd :11 换词 | sweep 断言④+探针图例段 | u4 回退→sweep 红+探针红(批量+mut2 实测) |
| wa6 状态槽来源名 | status_slot_row.gd :40 换词 | sweep 断言⑤(tooltip 消费半) | u5 回退→sweep 红(批量实测) |
| wa7 结算明细来源名 | settlement.tres :14 换值 | sweep 断言⑥(ConfigDB 真装载+battle_log `_format_row` 行消费半) | u6 回退→sweep 红(表值半+行半双红,批量实测) |
| wa8 危险格字形族 | board_view.gd :730/:778/:782 同批换;:776 注释随动(L1) | sweep 断言⑦(glyph/plate/glyph_color 三半)+⑧源扫描 | u7 回退→glyph 红+扫描红(批量);u8 单独回退→扫描红(solo 实测——卡片预判的「glyph_color 红」未现,实际红面=扫描,如实记录);u9 单独回退→plate 红+扫描红(solo 实测) |
| wa9 字体「危」在集 | ui_font_asset_test.gd 增行 | 断言绿 | 参数换 U+20000→红(判别力实测) |
| wa10 golden 判定(非行为) | 见 §6 | 读数+结论 | 不适用 |
| wa11 反哺点(非行为) | 反哺点清单卡A 五条 | 件核对表 | 件核 |
| wa12 惊巢反制日志行 | battle_orchestrator.gd :797 换词(core 触碰面=此一行字符串) | forge 锋段⑨(step_row 采集盒)+sweep ⑩扫描 | u13 回退→forge ⑨红+扫描红(专项实测) |
卡A 变异补充记录:批量注入(u1/u2/u4/u5/u6/u7/u8/u9/u11/u13 十件同批)→sweep 12 断言红,逐件归因(u8 被 u7 掩蔽→补 solo 注入)。新宿主 `player_copy_sweep_test.gd` 入 run_all 清单(expect=0),**实跑 24 checks 全绿**;restore 后全绿复核两轮。
## 5. 实机目检总清单(登记不阻塞)
1. 开场行后缀观感:「(含面板加成)」出现时机的直觉合理性(卡C §8.2)。
2. 营地灰字观感:六处深化后的层次(卡C §8.2)。
3. 危险格「危」字观感:字形密度/可读性对「雷」的替代(卡A §8.2)。
4. 图例新句通顺:「标空…受挖掘惩罚」读感(卡A §8.2)。
## 6. 批末闸与读数对拍
- 改前读数(master HEAD 基线口径):theme_projection 153 checks/ui_contrast_probe 38 对/player_copy_sweep 无(本批新建)/其余四探针存量基线见 `game/tests/.gates/baseline.json`。
- 改后读数:theme_projection 156(+3 wc1)/player_copy_sweep 24 全绿/ui_contrast_probe 40 对(+3 迷雾行 −1 旧单行)+派生校验绿/ui_click_probe 问题=0(PROBE_SEED=7)/ui_struct_probe 全绿。
- 批末 `tools/run_all_gates.sh --code`:见闸回执(§6.1)。
- golden 判定(卡A 契约 4):见 §6.2。
### 6.1 闸回执读数
- 批末 `tools/run_all_gates.sh --code`(回执 commit=9468c70e,与分支尖对齐):**8 闸全绿**(00 冒烟/01 系统/02 单元与集成/03 探针 --click/04 探针 --full/05 渲染闸/09 静态扫描/10 熵增闸,fingerprint 全 green、changed_vs_baseline 空)。
- **11 回放确定性对拍 = NEED-APPROVAL(存量红·对基线零新增,未实跑)**——触面判定因 settlement.tres 数值/结算域文件在 diff 内;本批对该文件只改一处文案值(u6「踩雷」→「危险格」),零数值改动。按硬规(MC/模拟跑批发起前必须用户批准)未发起;是否批准补跑归用户。
- 改前改后读数对拍:见 §6 首段(theme 153→156/sweep 0→24 全绿/contrast 38→40 对+派生校验新面/click probe 问题=0/struct 全绿)。
### 6.2 golden 判定(卡A 契约 4——加严口径触发,呈报待裁)
- 渲染闸读数 ×4:棋盘 L1 **changed=0.13%**/L2 **0.11%**/L3 **0.10%**/menu_boot **0.00%**(容差 ≤16 差/≤2%,闸判 OK)。
- **加严口径触发**:三图 changed>0 且差异像素落棋盘裁剪区(L1 裁剪区内 911 px,x:239–585/y:240–394,其中 893 px 单通道差 >60=结构差非抗锯齿噪声)→ 按契约 4 加严句**本批按判失效处理**——不写 README 判有效加注(README 零改动),重制与否显式呈报待裁(反哺点 ⑥)。
- **归因证据(存量漂移,非本批引入)**:master HEAD(无本批改动)同探针同基线复测读数逐值相同(0.13/0.11/0.10%),差异像素同位同量——漂移在批前已在;且 F7 实查四基线图零 RED_MINE 雷字朱像素,本批字形改动(雷→危)不可能触及基线像素。判读:加严句针对的「本批字形差被容差吞掉」情形不成立,但按字面执行判失效呈报;是否重制基线归用户(重制件须复检雷字——F7 注)。
## 7. 遗留读数义务与申报
1. wa4 探针半与 wc1 fresh 正向:**拦截能力未证**(前提不可驱动——反哺点 ③/⑧)。
2. 卡③ 全部变异判据:**零执行**(用户 P0 禁令)——sv 断言「拦截能力未证」,正向验收照跑。
3. ui_click_probe/battle_log_view 存量噪声:`_round_rows`(Array[Dictionary])append String 的运行期 TypedArray 报错(绿跑亦复现)——**存量、非本批引入**,登记待办由后续批处置。
4. **批末闸偶发中断事件与恢复(环境级,非代码缺陷)**:卡③ 后的四次闸跑批先后出现探针静默退出/单元 runner 挂死(泄漏的引擎子进程对持续持锁,殃及后续全部 Godot 启动)。处置=清杀泄漏进程+删除并重建 `game/.godot` 缓存 → 闸全绿。同日独立运行(窗口化与 headless 直跑)八连全绿。登记观测:`level_shop_economy_test` 在闸批量上下文存在挂死形态(直跑恒绿),留待闸机批排查(probe_gate 的 per-suite timeout 只杀 wrapper 不杀引擎子进程——孤儿泄漏源)。
5. 探针断点段已埋故障指纹打印(仅「战败清断点」偶发失败时输出断点内容指纹)——留作该偶发问题下次复现时的定位面。
## 8. 独立验收审计
- 审计报告:`reports/iter36-验收审计-2026-10-24.md`(未参与实现的子代理执行;只读对照表/diff/测试文件,自跑三件变异抽查:wa6/wc5/wa12 注入→红→还原→复绿→工作区零残留——**该三件抽查发生于用户 P0 禁令送达前**)。
- **总判:通过**——wc1–wc7+wa1–wa12 共 19 对照行零缺漏;未申报削弱零(31 行删除逐行归因:27 行产品码钉值+迷雾单行换代 3 行〔§8.3 申报〕+打印消息+头注)。
- 三件例外均申报/授权在案:wc1 fresh 正向与 wa4 探针半「拦截能力未证」(前提不可驱动——反哺点 ③/⑧)、L2/L3 行值修值(卡C §9 L2)、路径②并入快照喂入形态(代拍板 2+缺陷移交)。
- 审计留档观察:`_norm_floor_avg` 对部分缺位纹理 continue 跳过(仅全缺必红)——素材齐盘态无实际削弱,备查。
- **卡③ 审计**:`reports/iter36-验收审计-卡③-2026-10-24.md`——sv1–sv9 全过+契约 1–6 成立+削弱检查零未申报+自跑 theme_projection 162 全绿/ui_struct PASS;唯一缺漏=sv10 产出物缺口,**已补齐**(本节+反哺点 ⑨–⑬+代拍板卡③节),转通过。
-93
View File
@@ -1,93 +0,0 @@
# 迭代 36 独立验收审计报告(2026-10-24)——卡C 开场后缀营地灰字迷雾测点批+卡A 文案与禁字清扫批
## 头部:范围、方法与自跑清单
- **审计对象**:迭代 36 实现提交 `9468c70e`(19 文件,+489/−31),卡C「开场后缀营地灰字迷雾测点批」(对照表 wc1–wc7)+卡A「文案与禁字清扫批」(对照表 wa1–wa12)。卡③停摆不在范围(另有停机呈报)。
- **审计人立场**:未参与实现的独立子代理,只读证据、自跑抽查、出本报告;除本报告外零写盘。审计后 `git status -- game/` 复核零残留(工作区仅余实现批四份未跟踪 reports/ 产出物,与本审计前一致)。
- **输入合同**:`reports/需求卡片-开场后缀营地灰字迷雾测点批-2026-10-24.md` v1.2 §8.2/§8.3/§9 L2/§10;`reports/需求卡片-文案与禁字清扫批-2026-10-24.md` v1.2 §8.2/§8.3。实现报告对照表与变异记录表**不采信**,全部自行核(核后与其叙述相符处才记「与报告相符」)。
- **方法**:①两张卡 §8.2 逐行核对——断言存在性(grep 尾缀〔wc#/wa#〕)+真实入口未绕改动点+报告差异项授权/申报核对;②变异抽查三件亲自复现(注入→红→`git checkout -- <file>` 还原→绿→`git status` 复核干净);③削弱检查——实现提交 diff 全部 31 行删除行逐行归因,对照两卡 §8.3 申报。
- **自跑清单**(Godot=`D:/code/godot/Godot_v4.7.2-stable_win64_console.exe`,工作目录 `D:\code\g-plan2-iter36\game`):
1. `--headless --script res://tests/unit/presentation/player_copy_sweep_test.gd`(基线绿:24 checks 全绿)
2. `--headless res://probe/ui_contrast_probe.tscn`(基线绿:40 对全绿+迷雾三关派生校验绿)
3. `--headless --script res://tests/unit/core/meta_progression_forge_test.gd`(还原后绿:135 checks)
4. 三件变异注入实跑(见变异抽查实录节)
5. 静态核:`git show 9468c70e` 逐 hunk 读;`grep` 核 `level_open_line` 签名(五参 bool,未变)、`TILE_FLOOR_FMT`/`TILE_FLOOR_VARIANTS`/`_normalize_floor_luma` 常量与静态函数在位(board_view.gd :68/:69/:998)、条件六项布尔逐字(main.gd `_on_adventure_level_started`)。
## 一、逐行核对表——卡C(wc1–wc7)
| 行 | 判定 | 依据 |
|---|---|---|
| wc1 开场行后缀·新开路径 | **通过(例外申报在案)** | ①静态半:`theme_projection_test.gd` `_smoke_level_open_line` 三断言〔wc1〕在库且绿(true 尾接/false 零后缀/种子两值带入回归);②白板反向:`ui_click_probe.gd` 开场行路径①断言在库(滑条 `reset_sliders()` 显式归零后 `_start_adventure_from_menu()` 真实开局,日志零「(含面板加成)」);③正向半:路径②原设计(奖励节点拿属性卡→下一关)经实查不可驱动,实现并入路径③快照喂入形态。**授权核对**:代拍板 2 白面字面只覆盖「路径③构造细节」,路径②形态改换超出其字面;但实现报告 §0 申报、反哺点 ③ 登记卡片 F5 前提缺陷(L1 零商店节点+reward 节点零兑付直通占位)、停机呈报随附——「或申报」口径成立,且 fresh 机制面(回填→level_started→条件求值→尾接)由续玩路径全链承载+条件 hunk 变异红(mut3,见下注)。fresh 正向拦截能力未证=如实申报事项,非缺漏。 |
| wc2 开场行后缀·续玩路径 | **通过** | 断言在库:探针构造 `bp_ol` 快照(bonus atk=5 已入账、无 bonus_pending/bonus_result 键——缺键钳 0=**选路停点形**钉值满足;node_id=-1 选路停点)→ `main.save_manager.set_breakpoint()` → `main._resume_from_menu()` 唯一消费口 → 断言 run_ledger.bonus.atk==5(resume_adventure :151-154 真链回填钉住)+重建开场行带「(含面板加成)」〔wc1 正向/wc2〕。信号链核:_resume_from_menu→resume_adventure(两键皆空走 :236→_start_current_level)→ level_started → `_on_adventure_level_started`——未绕改动点。 |
| wc3 既有口径回归 | **通过** | 探针首局(滑条 400/200=pct>0 局外加成)开场行带后缀断言〔wc3〕在库,走 `_start_adventure_from_menu()` 真实开局+日志全文本判(该局为探针首局、日志无先前行——判定面干净)。变异 mut4(条件旧四项全删→红)未亲自复现,采信实现报告记录(注入面与断言面一一对应,机制同 mut3 族)。 |
| wc4 营地六处换色 | **通过** | ①六处源位 :167/:417/:476/:509/:513/:525 全换 STONE_DEEP(diff 逐行核);②取色断言在库且读法正确——`get_theme_color("font_color") != UiKit.STONE_DEEP`,经 `open_camp_via_savesel` 真实入口开营地后取(文本锚定位=代拍板 4 白名单内;「未解锁」锚收窄到 `_workshop_holder` 子树避免误捕树行/锻造行——定位写法属 L2 自由);③源 token 扫描断言在 `ui_struct_probe.gd`(STONE 计数==STONE_DEEP 计数判别式)。变异 mut2(:417 回 STONE→取色红)/mut5(同注入→扫描红)/mut6(判别式放宽→误红边界证明)未亲自复现,采信实现报告记录+判别式静态读核(计数对判别式确能区分裸 STONE 与 _DEEP)。 |
| wc5 迷雾测点三行+派生校验 | **通过(行值修值有授权条款+实测记录在案)** | 三行在库(L1 (111,77,51)/L2 (74,79,96)/L3 (71,75,99)),派生校验 `_fog_derived_check`(±2/255)+`_norm_floor_avg`(路径经 `BoardView.TILE_FLOOR_FMT` 常量、归一经 `BoardView._normalize_floor_luma` 静态直呼——契约 3 两禁均守)在库且基线绿。L2/L3 行值与卡片钉值 (79,85,102)/(76,81,105) 不同=卡C §9 L2「手填行值与探针派生首跑失配时的行值修订」预授权,实测记录在案(反哺点 ①+实现报告 §2:PIL↔Godot 解码系统差约 5/255)。三行 ≥4.5:1 由基线跑 PASS 40 对证实。 |
| wc6 注释随动(非行为) | **通过** | `board_cell_unit.gd:270` 段注释换代实核在 diff 内:「归一后(真实渲染面)三关 5.71–5.93:1……见 ui_contrast_probe 迷雾段」——含「归一后」口径与三关值,非行为行,与迷雾绘制本体零触碰。 |
| wc7 反哺点清单(非行为) | **通过(落点形态注记)** | 反哺点清单卡C 三条在库:①art-bible §6.5 换代(含读数修正依据)、②待办清单条目处置、③卡片前提缺陷登记(新增)。卡片 §6 第三行(roadmap 迭代行编入笔)未单列落点——该义务已由 iter-plan 段编入提交(`0e9bc36f`/`30197255` 迭代行已写)履行,实现批以新增前提缺陷条置换该行,实质同步义务闭合,不判缺漏。 |
**mut3 未复现说明**:卡C 主变异(回退 main 条件 hunk→②③红、①仍绿)涉及窗口化 ui_click_probe 全程跑(约分钟级+已知 1/6 概率静默中断噪声),按审计指令采信实现报告 mut3 记录;补偿核:条件布尔与断言的依赖关系经代码读核(wc1②③ 断言的日志判定只可能因 boosted 布尔含加算区两项而绿——探针该时点 pct=0、新档 ov=0),机制依赖成立。
## 二、逐行核对表——卡A(wa1–wa12)
| 行 | 判定 | 依据 |
|---|---|---|
| wa1 C 区段头×2 | **通过** | sweep 断言①两断言〔wa1〕在库(直建 hero 面板,断 `_feat_section`/`_curio_section` 首 Label text==「专长」/「属性值提升」);探针 C 区断言〔wa1〕在库(`main.info_panel` 可见态取——真实入口);u1/u2 源位 :73/:93 在 diff 内换词。变异(u1/u2 回退→sweep 红+u1 探针红)未亲自复现,采信报告记录(与三件实跑变异同族同法)。 |
| wa2 地图加成帽 | **通过** | 探针地图段断言〔wa2〕在库(地图屏真实开屏后文本锚取「属性值提升」帽);u10 :171 在 diff 内。锚形态=文本锚(L2 定位写法自由);报告申报该断言 mut7 专项实测唯一失败项后复绿。 |
| wa3 专长卡兜底 | **通过** | sweep 断言③〔wa3〕在库:`feat_card_text({})`==「专长\n???」——数据缺行真实兜底路径直调;u11 :142 在 diff 内。 |
| wa4 奖励点头部 | **通过(拦截能力未证=如实申报)** | sweep 断言②六断言〔wa4〕在库(「冒险牌库」「属性值提升与补给」「同库分流」三事实+零「同权重/同上限/提升池」);u3 :156 在 diff 内(u3 措辞与卡片钉值逐字一致)。探针半为**条件断言**(仅捕获到含「关卡奖励点」头部时判)——实跑未捕获奖励点停点,拦截能力未证=实现报告 §1+反哺点 ⑧ 已申报(已知事实不算未申报削弱)。 |
| wa5 图例行 | **通过** | sweep 断言④五断言〔wa5〕在库(含「标空」「受挖掘惩罚」零「插错」「挖雷」);探针图例段断言在库(AP 条图例钮真实信号开层后 `legend_overlay.ENTRIES` 判);u4 :11 在 diff 内。 |
| wa6 状态槽来源名 | **通过(亲自复现变异,见实录①)** | sweep 断言⑤〔wa6〕在库:直建 status_slot_row 喂 `{"source_class":"mine_hit"}` 真实效果行结构→`_on_slot_hover`→tooltip 文本含「来源:危险格」;u5 :40 在 diff 内。 |
| wa7 结算明细来源名 | **通过** | sweep 断言⑥〔wa7〕双半在库:`_db.settlement.source_label_map["mine_hit"]`(ConfigDB 真装载)+直建 battle_log_view `_format_row` 行含「(危险格)」(生产消费路径 :133-136 同构);u6 `settlement.tres:14` 在 diff 内,与 u5 同批同值(契约 1 双源钉住成立)。 |
| wa8 危险格字形族 | **通过** | sweep 断言⑦三半+⑧源扫描〔wa8〕在库:BoardView 直建走 `board_generator.generate`→`minesweeper_rules` 真实规则路径挖掘危险格→`rebuild` 真实刷新路径(theme_projection_test :200 先例式,缺素材程序化回退态与卡片口径一致),断 glyph==「危」/plate==true/glyph_color==RED_MINE;⑧ `board_view.gd` 源零 `"雷"` 字面量(u7/u8/u9 哨兵族统一钉住);u7/u8/u9 三处 :730/:778/:782 同批在 diff 内、:776 注释随动(L1 白名单内)。u8 solo 变异红面=扫描(卡片预判 glyph_color 半红未现)=实现报告 §7.2 如实记录、判据未改,不算缺漏。 |
| wa9 字体「危」在集 | **通过** | `ui_font_asset_test.gd` 增行〔wa9〕在 diff 内;旧四字断言(攻/雷/旗/封)原样(diff 上下文行核);判别力变异(参数换 U+20000→红)采信报告记录。 |
| wa10 golden 判定(非行为) | **通过(判失效路径按契约 4 执行)** | 读数×4 在报告 §6.2(0.13/0.11/0.10/0.00%);加严口径触发→按判失效处理、README 零改动(核:git diff 无 README)、重制与否显式呈报待裁(反哺点 ⑥)+归因证据(master HEAD 复测同读数=存量漂移)。判定先于动作、未先动后判——契约 4 正序执行。 |
| wa11 反哺点清单(非行为) | **通过(落点形态注记)** | 反哺点清单卡A ④⑤⑥⑦⑧五条在库(node-reward/教学引导/golden 纪律句待裁/待办清单退役/卡片前提补记);roadmap 编入笔同 wc7 注记(iter-plan 提交已履行)。 |
| wa12 惊巢反制日志行 | **通过(亲自复现变异,见实录③)** | forge 锋段⑨双断言〔wa12〕在库:编排器真实构造(begin_battle 真实战斗上下文)+`step_row` 信号接线+直调 `_grant_routed` 减半分支,断 display_name==「惊巢反制——危险格挖掘惩罚减半(6→3)」零「挖雷」;sweep ⑩源扫描(注释剥离)在库;u13 :797 在 diff 内(core 触碰面仅此一行字符串——diff 核实)。 |
## 三、变异抽查实录(三件亲自复现)
**实录① 卡A wa6(u5 注入)**
- 注入:`game/presentation/views/status_slot_row.gd:40` `"mine_hit": "危险格"` → `"mine_hit": "踩雷"`(sed 精确替换,diff 核仅此一处)。
- 命令:`--headless --path . --script res://tests/unit/presentation/player_copy_sweep_test.gd`
- 红(输出摘录):`[FAIL] 状态槽来源注记==「危险格」(u5 换代——meta tooltip 消费半)〔wa6〕`
- 还原:`git checkout -- game/presentation/views/status_slot_row.gd` → 复跑 **all green (24 checks)**;`git status -- game/` 零残留。
**实录② 卡C wc5(L1 行值回原图基准)**
- 注入:`game/probe/ui_contrast_probe.gd:125`(`_fog_derived_check` 行值表)`Color8(111, 77, 51)` → `Color8(69, 48, 32)`。
- 命令:`--headless --path . res://probe/ui_contrast_probe.tscn`
- 红(输出摘录):`[contrast] 迷雾测点行值失真:L1地牢 行值 (69,48,32) vs 运行时归一派生 (111,77,51)(±2/255——素材更新须随动改行值)` → `[ui_contrast_probe] FAIL — 1 项越带(含静态段)`
- 还原:`git checkout -- game/probe/ui_contrast_probe.gd` → 复跑 **PASS — 对比度 40 对测点全绿……+迷雾三关派生校验绿**;`git status -- game/` 零残留。
- 评注:注入点选在派生校验行值表(行值钉值面),证明「行值回原图基准必红」的变异①判据真实有拦截力;同法覆盖卡C T3-①。
**实录③ 卡A wa12(u13 注入)**
- 注入:`game/core/battle_orchestrator.gd:797` 「危险格挖掘惩罚减半」→「挖雷惩罚减半」(sed 精确替换)。
- 命令:`--headless --path . --script res://tests/unit/core/meta_progression_forge_test.gd`
- 红(输出摘录):`[FAIL] 惊巢反制效果行==「惊巢反制——危险格挖掘惩罚减半(6→3)」零「挖雷」(u13 换代)〔wa12〕`
- 还原:`git checkout -- game/core/battle_orchestrator.gd` → 复跑 **all green (135 checks)**;`git status -- game/` 零残留。
三件均满足「注入→最窄闸见红→精确还原→复绿→零残留」闭环。未亲自复现的其余变异(卡C mut2/5/6、mut3、mut4;卡A 十二注入中未抽查件)采信实现报告记录,其判据面均经静态读核与实跑同族推断,无发现虚报痕迹。
## 四、测试削弱检查结论
实现提交全部 31 行删除行逐行归因(`git show 9468c70e | grep '^-'"`):
1. **产品码钉值行 27 行**——u1–u13 钉值表逐字+main 条件旧式三行+camp 六处 STONE+board_cell_unit 注释+board_view :776 注释随动:全部为两卡 §1 钉值表/契约明文授权的换代对象,非断言。
2. **迷雾单行 3 行**(ui_contrast_probe 旧「迷雾·记忆墨/灰罩合成底」测点)——**卡C §8.3 申报的换代删除**,替换判据更严(三关归一基准+派生一致性校验),申报成立。
3. **探针 PASS 打印行 1 行**——输出消息随断言面扩段更新,非断言、非闸判据。
4. **theme_projection 头注 1 行**——「十套」→「十一套」注释行,非断言。
**专项核**:`theme_projection_test.gd` 只增不改(新增 `_smoke_level_open_line`+调用行+头注,既有断言零触碰);`ui_font_asset_test.gd` 旧四字断言原样、只增「危」行;`adventure_feats_test.gd` 未触(不在 19 文件清单);`ui_click_probe.gd`/`ui_struct_probe.gd`/`meta_progression_forge_test.gd`/`run_all.gd` 全为纯增行;零阈值放宽、零扫描面缩小、零真实入口换下层直调(探针新增段全走 `_start_adventure_from_menu`/`_resume_from_menu`/`open_camp_via_savesel`/图例钮/选路真链/`_grant_routed` 真实链)。**未申报削弱:未发现。**
**一处观察(不判缺漏,随报告留档)**:`ui_contrast_probe._norm_floor_avg` 对缺位纹理 `continue` 跳过(仅 px==0 全缺时必红)——卡片契约 3 写「素材缺位=按闸预检处置拷贝齐盘,禁跳过派生校验」。实现仍执行派生校验、未跳过校验本体,部分缺位时以余量均值参与比对(大概率仍因均值漂移超 ±2 而红,但非构造保证)。闸预检+素材在盘现状下无实际削弱,属 L1/L2 级实现细节,登记备查。
## 五、总判
**通过。**
- 卡C wc1–wc7、卡A wa1–wa12 逐行「通过/通过(例外申报在案)」,无缺漏行。
- 例外三件均属「申报+授权在案」而非缺漏:①wc1 fresh 正向与 wa4 探针半「拦截能力未证」(前提不可驱动——反哺点 ③/⑧ 已登记);②L2/L3 行值修值(卡C §9 L2 条款+实测记录在案);③路径②形态改快照喂入(代拍板 2 授权路径③构造、路径②合并超出其字面但已申报为卡片前提缺陷,fresh 机制面由续玩路径全链承载)。
- 三件变异亲自复现全红、还原全绿、工作区零残留;削弱检查零未申报项。
- 闸回执(commit=9468c70e)8 闸 green;11 回放确定性对拍 NEED-APPROVAL 为存量红零新增、未实跑——是否补跑归用户,不在本审计判据内。
@@ -1,57 +0,0 @@
# 迭代 36 验收审计——卡③「状态面板瘦身批」(2026-10-24)
- 审计人:独立验收审计子代理(未参与本迭代实现;只读审计,唯一产出物=本报告)
- 审计对象:分支 `iter36`,diff 基线 `2931b1f2..HEAD`(477a73e7 卡③实现笔+8a37712e 静态扫描归零笔);卡片 `reports/需求卡片-状态面板瘦身批-2026-10-23.md`(v1.1)
- 断言宿主指认:按用户裁决采迁移后现址执行(`game/smoke/` 已于 `16c6f136` 退役)——sv1–sv5/sv8 隔离档现址=`game/tests/unit/presentation/theme_projection_test.gd` `_status_panel_projection`;sv6/sv7 真实入口现址=`game/probe/ui_click_probe.gd`。宿主变迁凭据=`reports/iter36-停机呈报-状态面板瘦身批-2026-10-24.md`+迁移账本 S61
- 方法:逐行核对卡片 §8.2 对照表 sv1–sv10(断言存在性+尾缀 grep+真实入口形态+契约逐条读 diff);正向自跑抽查(本项目已明令禁止变异测试,零注入零回退,只跑绿)
## 1. 对照表 sv1–sv10 逐行判定
| 行 | 判定 | 依据 |
|---|---|---|
| sv1 属性行投影 | **通过** | 断言在座且尾缀可 grep:theme_projection_test「属性行全值投影 = 契约4 钉值格式逐字(生命/上限/攻击/AC/GP 五现值)〔sv1〕」(现址 `_status_panel_projection` 段内),夹具钉值 13/29/7/11/41 全值逐字比对「生命 13/29 · 攻击 7 · 护甲 AC 11 · GP 41」,自跑绿。真实入口侧另有探针 sv6② 全值对 runner 五现值(见 sv6 行)。隔离档为八键手拼夹具直喂 `open_status`(同构口径、不依赖 runner),与卡片口径一致 |
| sv2 秘宝行投影 | **通过** | 断言两则:「秘宝行投影 = 受理序 join+已用件「(已用)」尾缀〔sv2〕」(期望串「青苔密卷 · 锈蚀怀表(已用)」——受理序+尾缀逐字)+「空秘宝态句=「未携带秘宝」〔sv2〕」,自跑绿。投影复用 `_treasure_ui.inventory_projection()`(main.gd `_status_curios` 只做 name/used 键裁剪,零第二份件名换算) |
| sv3 专长行投影 | **通过** | 断言两则:「专长行投影 = 行串 join〔sv3〕」(期望「疼痛记忆 ×2 · 双管镐 ×1」)+「空专长态句=「未获专长」〔sv3〕」,自跑绿。feats 取 `HudPresenter.feat_holdings_lines(db, runner.feats_held())` 现成行透传(main.gd `_status_data`),零第二份计数实现 |
| sv4 余额徽回归 | **通过** | 断言「余额徽投影 = 快照 balance 读数(sv4 回归锚)〔sv4〕」在座(沿旧断言族改喂夹具钉值 77),自跑绿;`open_status` 余额徽喂值逻辑零改动(diff 核:仅 `data.get("balance", 0)` 原样保留) |
| sv5 零旧段(隔离档) | **通过** | 断言两则:「面板子树零「道具工坊/天赋树」文案(跨关概览退役零残留)〔sv5〕」(`_all_labels` 递归全子树扫描)+「旧段成员退役(_workshop_holder/_tree_label 零残留——契约2 数据/成员层面清零)〔sv5〕」,自跑绿。源内核:status_panel.gd 零 `_rebuild_workshop`/`_rebuild_tree`/`_workshop_holder`/`_tree_label`(grep 零命中);段头/行构建/数据键三层面清零。**留档观察(非缺陷)**:文件头 `##` 注释第 3 行含「天赋树已购」字样——系退役去向说明句(「由营地/生涯承载,本面板不镜像」),非面板子树 UI 文案、非段头,sv5 机检扫描面(Label 文本)不含注释,判不违契约 2 |
| sv6 零旧段+投影值真链路(真实入口) | **通过** | 三断言全部在座于 `game/probe/ui_click_probe.gd` `_run_modal_probes_once` 状态面板段(:754-810 现址),且该段由 `main.board_zone.status_badge.pressed.emit()`(:763,真实按钮信号路径→组合根接线)开启面板后执行——真实入口未绕过。断言①=子树零「道具工坊/天赋树」文案(问题串带「sv6①」);断言②=属性行全串==契约 4 格式 % `run_scope.runner` 五现值(hero_hp/effective_max_hp/effective_atk/effective_ac/gp——问题串带「sv6②」,runner 空指针单独报契约 5 缺陷禁软回退);断言③=`main._status_data()` 直调八键键集+curios 逐行 {name, used} 对拍独立 oracle(`runner.treasure_inventory.query_inventory(Callable())` 行集 × `main.db.treasure_item_row().display_name`,件名换算不走被测投影)+feats 对拍 `HudPresenter.feat_holdings_lines`(问题串带「sv7」)。未实跑探针(窗口化长跑,按审计指令采信实现报告问题=0 读数;三断言代码存在性与真实入口形态已静态核成立) |
| sv7 投影零旧键 | **通过** | 承载=sv6 断言③键集恰八键(size==8+逐键 has)+键序无关;diff 核 `_status_data()` 现 return 恰 balance/hero_hp/max_hp/atk/ac/gp/curios/feats 八键,workshop/tree/fork_groups 三旧键清零;全 presentation 检索旧三键仅剩营地侧消费(camp_shop_presenter.gd/camp_overlay_view.gd——契约 2 明示营地在役件,零关联)。直调发生在探针对局中(runner 在役) |
| sv8 提示行文案 | **通过** | 断言「提示行=「查看本局冒险进度(只读)」(新定位换代)〔sv8〕」在座,自跑绿;diff 核 status_panel.gd 提示行换代逐字;标题「状态」与「继续」钮零改动(diff 核+struct/click 探针既有定位锚回归绿) |
| sv9 角标 tooltip×2 | **通过** | diff 核两处换代逐字:board_zone_view.gd:58/level_map_screen.gd:107 →「查看本局冒险进度(只读)」;全仓检索旧串「查看钥石与永久强化进度」零命中、「永久强化进度」仅剩 theme_projection_test.gd:786 一处测试注释(非玩家面文案,判不违)。sv9 断言宿主=件核+四探针回归(卡片 §8.2 原口径),四探针本批实跑全绿(实现报告 §6.1+本审计 struct 探针复跑) |
| sv10 反哺点清单(非行为改动) | **缺漏** | 见 §4——三份 `reports/` 产出物均未覆盖卡③:反哺点清单卡③节仅 ⑨ 停机呈报移交一条,卡③ §6 六条同步面(元进度①/生涯②/08-Alpha③/体验验证清单④/待办清单⑤/roadmap⑥)零落点;实现报告自记「本报告只覆盖卡C/卡A」,卡③状态总表/变异禁令申报/目检总清单「面板观感」条均缺;代拍板追认单无卡③节(§10 白名单五项——空态句措辞/属性行串接序/断言定位写法/夹具数值取值/提交切分——本批均有行使,未备案) |
## 2. 契约核查结论(读 diff 逐条)
- **契约 1(五件口径/禁第二份投影)**:成立。面板四块=钥石总量徽+「本局状态」合一行+「带的秘宝」段+「已获专长」段,零新增段;属性/GP 取数=LevelRunner `hero_hp`/`gp` 属性(level_runner.gd:30-36,getter `int(_ledger["hero_hp"])`/`int(_ledger["gp"])` 直取下标——键缺失即致命,符合「禁 .get 缺省留门」)+三 effective 访问器;秘宝=`_treasure_ui.inventory_projection()` 逐行键裁剪;专长=`HudPresenter.feat_holdings_lines` 现成行。零第二份投影/拼装。
- **契约 2(两段退役零残留)**:成立。status_panel.gd 源内 `_rebuild_workshop`/`_rebuild_tree`/`_workshop_holder`/`_tree_label` 及两段段头文案全清(grep 零命中;头注「天赋树已购」为退役去向说明句,见 sv5 行观察);`meta.treasure_shop_status()`/`tree_camp_rows()`/`tree_fork_groups()` 三投影函数本体零改动(`git diff 2931b1f2..HEAD -- game/core/meta_progression.gd` 为空);camp_overlay_view.gd 本批改动仅卡C wc4 灰字换色六处,其同名 `_rebuild_workshop`/`_rebuild_tree` 本体未动。
- **契约 3(只读快照/UiKit 工厂/零动效)**:成立。open_status 单次开层重建口径沿袭、跨开层零持有、零写调用;新三 Label 全经 `UiKit.label` 工厂产出,零裸色值;自跑 `ui_struct_probe` PASS——⑧ 只读契约(信号连接数=2,白名单 `_emit_closed`/`_on_status_closed`)与⑨ 零动效契约(子树零 AnimationPlayer+源码零 `create_tween`/`UiKit.motion`)对重写后面板仍绿。
- **契约 4(文案钉值)**:成立。提示行/两 tooltip=「查看本局冒险进度(只读)」逐字;段头「本局状态」「带的秘宝」「已获专长」逐字在座(源核);空态句「未携带秘宝」「未获专长」逐字(机检断言在座);已用尾缀「(已用)」逐字(机检断言在座);标题「状态」/「继续」钮不变。**留档观察**:三段头无正向机检断言(卡片 §8.2 断言清单未列段头项,隔离档与探针的 sv5 扫描只反向钉旧段头)——呈现层唯一载体的段头文案现仅由源核与本审计覆盖,判不违卡片断言清单,登记备查。
- **契约 5(runner 在役零软回退)**:成立。`_status_data()` 直读 `run_scope.runner`,无 null 守卫无缺省回退;探针侧 runner 空指针显式报「契约5——状态机缺陷」问题项,不掩盖。
- **契约 6(数值单一事实源)**:成立。面板与投影零数值字面量(仅文案格式串),全部实时读访问器现值;生命上限走 `effective_max_hp()` 生效上限口径。
## 3. 削弱检查(test-conventions §9.5 申报核对)
1. **theme_projection_test 删除的旧断言族即 §8.3 申报范围**:本次 diff 删除的旧内容=meta 存档夹具+工坊 12 行投影逐项断言块+天赋树聚合文案断言块;保留=开层可见断言(原样)+余额徽断言(改喂夹具钉值,sv4 回归锚)。经 `git show 16c6f136~1:game/smoke/smoke_all.gd` 调出迁移前原件逐段比对:迁移后(2931b1f2 时点)theme_projection_test 的 `_status_panel_projection` 与 smoke_all 原件内容实质逐句相同(仅 check→Kit.check 宿主化),即删除面=迁移时保留至今的 §8.3 申报两段(工坊 12 行+天赋树聚合),无额外断言被删。§8.3 申报的保留区间(开层可见+余额徽)确实保留。宿主现址执行经用户裁决(停机呈报移交),申报边界按迁移后实况成立。
2. **ui_struct_probe/ui_input_probe/shot_probe 零断言改动(卡③口径)**:成立。三文件在本批 diff 中,ui_input_probe/shot_probe 零改动;ui_struct_probe 仅 +5 行且全为卡C wc4 营地灰字源 token 扫描段(camp 域,与状态面板断言零交集)——卡③自身对三探针零改动,回归线全绿。
3. **变异验证零执行**:卡③六条注入实验(T1 三条+T2 三条)未执行——用户 P0 禁令明令禁止变异测试,本审计亦零注入。替代拦截证据=sv1–sv8 全部正向机检断言在座且自跑绿(sv6② 钉格式逐字对 runner 现值、sv7 键集+独立 oracle 对拍,值层有判别力);但「撤销该改动能让断言变红」的变异证明在卡③范围未成立,按禁令口径记「已实现,拦截能力未证(变异验证按用户 P0 禁令零执行)」。此例外须随卡③补进实现报告(并入 §4 sv10 回炉项)。
## 4. sv10 缺口明细(唯一缺漏,回炉 T2 产出物)
1. `reports/iter36-反哺点-2026-10-24.md` 卡③节现仅 ⑨ 一条(停机呈报移交);卡③ §6 六条同步面(元进度.md「已解锁清单」句①/生涯.md 两处「解锁进度」②/08-Alpha「部分在役」销号③/体验验证清单 ⑳ 追溯改写④/待办清单条目批后退役⑤/roadmap 迭代行⑥)每条须一落点,现零落点。sv10 判据「§6 六条每条有落点〔sv10〕」不满足。
2. `reports/iter36-实现报告-2026-10-24.md` 需补卡③节:状态总表(对照完成定义五项)、变异禁令申报(§3.3)、实机目检总清单「面板观感」条、改前改后读数对拍(theme 153→162 本审计实测在案,可采)。
3. `reports/iter36-代拍板追认单-2026-10-24.md` 需补卡③节:§10 白名单行使备案(空态句/段头最终措辞、属性行串接序、断言名与定位写法〔含断言宿主重锚落点选择〕、夹具数值取值 77/13/29/7/11/41 与空态夹具、提交切分两笔)。
## 5. 自跑实录(正向抽查,cwd=D:\code\g-plan2-iter36\game)
1. `Godot_v4.7.2-stable_win64_console.exe --headless --path . --script res://tests/unit/presentation/theme_projection_test.gd` → **all green (162 checks)**,含 sv1/sv2×2/sv3×2/sv4/sv5×2/sv8 九断言全 PASS(退出期 RID 泄漏告警为 headless 存量噪声,与本批无关)。改前基线 153(卡C 报告 §6)→ 162,与卡③九断言增量吻合。
2. `--headless --path . res://probe/ui_struct_probe.tscn` → **PASS — 全屏结构断言零红**(exit=0),⑧ 两契约(信号连接数=2+零动效 token)对重写后面板仍绿;输出中「Parse JSON failed/broken」为探针坏档夹具既有噪声。
3. `ui_click_probe` 未实跑(窗口化长跑,按审计指令采信实现报告「问题=0」读数;三断言代码存在性、真实入口形态〔board_zone.status_badge pressed→组合根接线→断言段〕、独立 oracle 取数面已静态核成立)。
4. 审计期间工作区存在一笔未提交改动(ui_click_probe.gd 战败断点段诊断打印,卡② T3 域,非卡③范围)——不影响本次审计结论,登记备查。
## 6. 总判
**不通过(仅因 sv10 产出物缺口;代码面与断言面全部通过)。**
- sv1–sv9 九行全部「通过」:断言在座、尾缀可 grep、真实入口未绕过、契约 1–6 逐条成立、削弱面与 §8.3 申报逐行吻合(迁移史比对成立)、隔离档与 struct 探针自跑全绿。
- 唯一回炉项=sv10:三份 `reports/` 产出物补齐卡③覆盖(§4 明细三条)后复判——补齐并经确认即可转「通过」,代码零回炉。
- 合并前置(卡 §7 T2「审计逐行通过才合并」)在本报告转通过前不满足。
@@ -0,0 +1,161 @@
# 需求卡片——S13 基线键治本(稳定身份键+恶化判据+刷新对账自检)
- 批名:S13 基线键治本|日期:2026-10-25|批次性质:非迭代批(tools/ 闸机面;改动面=tools/+game/tests/ → 代码域档)
- 估时:0.4–0.6 工作日(T0 0.2/T1 0.15/T2 0.15;软盒上限 0.6,超出按异常分级 L3 停机呈报)
- 来源:待办清单「S13 gdstyle 免名单把数字当身份——存量债改小也报『基线外新违规』」(2026-10-25 登记,来源=批次移交,设计面=工程直入)
- 验收证明口径:按 2026-10-24 用户裁定,一切验收走撤销证明。待办条目原文写「变异验证四项」,本卡以撤销证明等价覆盖同四判据(新增必红=R2/漂移不冒新=R1/恶化必红=R3/禁闸内自动重生成自检=R5+R6),不另做变异类测试。
## 1 目标与完成定义
**做什么**:三件套治本——① `tools/gdstyle_gate.py` 的违规匹配键从「文件|规则|消息全文」改为稳定身份键「文件|规则|函数名」(无函数名条目退化为「文件|规则」;解析不出数值的条目退化为现行全文键);② 新增恶化判据——同身份当前值大于基线登记值即判红(X=0,不分规则,2026-10-25 用户裁);③ `--refresh` 加对账自检(打印新旧两向清单+骤降守卫)。批内人工重生成基线(239 条→234 条),两处文案随动。
**完成定义**:验收对照表 R1–R8 全过+按改动域选档跑闸全绿+基线 234 条落盘+`reports/` 三份产出物(实现报告/代拍板追认单/反哺点清单)齐+待办清单 S13 条目状态由流水线推进。
## 2 设计事实源
工程直入证据指认(与待办条目一致,写卡会话 2026-10-25 已实查复核):
- `tools/gdstyle_gate.py:82`——`keys.add("%s|%s|%s" % (file_path, f["rule"], f.get("message", "")))`,消息全文入键,而消息文本自带具体数字(如 `function 'resume_adventure' is 104 lines long (max 50)`),数字一变即匹配失败、被判「基线外新违规」
- master 尖 `a913ad44` 实测(2026-10-25):扫描面 100 个 .gd、命中 234 条、基线内 222 条、基线外新违规 12 条(红);基线 241 行=2 行头注+239 条
- gdstyle v0.4.0(钉版)JSON 输出字段=`file/rule/message/severity/span`,无结构化指标字段——函数名与数值只能从 message 正则提取
## 3 现状事实
(全部实查,开工自行复核)
- 键构造:`tools/gdstyle_gate.py:82`(引文见上);判定段 `:103-111` 只做 `keys - base` 差集判 NEW
- `--refresh` 现状:`tools/gdstyle_gate.py:84-92`——直接覆盖写基线、零对账输出;头注 `:11-13` 自述「基线键=文件|规则|消息 三元组」
- 基线:`tools/gdstyle_baseline.txt` 241 行(2 行头注+239 条),行格式=`文件|规则|消息全文` 逐字存原句
- 调用链:`tools/run_all_gates.sh:251`(09 静态扫描段)→ `game/tests/static_scan.sh:247` → `tools/gdstyle_gate.py`;static_scan.sh `:239-246` 段头注描述三元组口径;`game/tests/README.md:64` 速查表 S13 行同口径。`tools/run_all_gates.sh` 全文无 S13 直述(待办条目预计改动面所写「run_all_gates.sh 头注随动」据此订正为 static_scan.sh 头注)
- master 尖 12 条假新增(2026-10-25 闸输出原样):`adventure_runner.gd` 5 条(分支 11/类变量 42/文件 1051 行/`_start_current_level` 53 行/`resume_adventure` 108 行)+`config_db_cross_validator.gd` 4 条(`cross_validate`:分支 21/107 行/局部变量 24/嵌套 5)+`level_runner.gd` 2 条(类变量 38/`start_level_external` 参数 7)+`main.gd` 1 条(1507 行)
- 239 条旧基线对账(写卡会话差集脚本实测):222 条现键仍命中+12 条漂移旧值(即上列 12 条的前身,如 `resume_adventure' has 10 branches`、`cross_validate' is 159 lines`)+5 条已还真债(`level_runner` 文件 1013 行、`level_table.gd` `_validate_graph` 3 条+`_validate_level_nodes` 1 条——迭代 35 当场拆四段修掉)
- 刷新后基线应=234 条:当前 234 条命中的身份全部能在旧基线中找到同身份;其中 3 条较登记值恶化(`resume_adventure` 分支 10→11、行数 104→108;`adventure_runner` 文件 1050→1051)、9 条改善(其余漂移全为改小,如 `_start_current_level` 55→53、`cross_validate` 159→107)
- 消息形态实证(数值提取依据):函数级五规则消息均含 `function '名字'`+当前值+`(max N)`(行数/分支/局部变量/参数/嵌套);类级 `class has N variables (max 15)` 与文件级 `file is N lines long (max 1000)` 无名字
## 4 设计契约(违反即返工)
- 🔴 身份键=文件|规则|函数名:函数名从消息提取 `function '([^']+)'`;类级/文件级无名字条目退化为「文件|规则」;消息解析不出「当前值+max 值」的条目退化为现行「文件|规则|消息全文」键(保守路径:任何文本变化即新违规)。基线文件行格式不变(仍存原消息全文——保持可人读、登记值可解析)
- 🔴 恶化判据 X=0(2026-10-25 用户裁):同身份「当前值>基线登记值」→ 判 WORSE 红;当前值≤登记值=基线内绿(改善可打印计数,禁止判红)
- 🔴 `--refresh` 对账自检:刷新时打印旧→新条数+逐条「新登记/消失」清单;新条数<旧条数×0.8 或旧基线文件缺失 → 拒绝写盘、退出非零,除非显式 `--allow-shrink`;闸正常判定路径零写基线文件;`--refresh` 仍只允许人工发起
- 🔴 禁动口径面:gdstyle.toml 规则与阈值、扫描面三目录(game/core、game/data、game/presentation)、钉版 v0.4.0 一律不动;12 条假新增涉及的 game/ 源文件零改动(它们的数字漂移是合法编辑的结果,不是缺陷)
## 5 范围边界
做:`gdstyle_gate.py` 三段改造(键构造/判定/refresh)+自身头注;基线重生成;`static_scan.sh:239-246` 与 `game/tests/README.md:64` 两处文案随动。
不做(去向):
- 不还 234 条存量债——免名单继续豁免,还债属后续迭代批按卡处理
- 不新增 python 单测件——tools/ 下 39 个 .py 闸件各自独立、无单测先例,验收走撤销证明,闸件自身即断言载体;若日后要求持久回归件,登记待办清单再议
- 不动 `run_all_gates.sh`(实测全文无 S13 直述,无需随动)
- 不处理其他闸(S6/S7/S8 落地等另有条目)
## 6 关联文档同步面
| 文档 | 关联点 | 同步义务 |
|---|---|---|
| `game/tests/static_scan.sh:239-246` | S13 段头注自述「文件|规则|消息 三元组……基线外新违规才红」 | 批内直改(game/tests/ 属本批改动面) |
| `game/tests/README.md:64` | 速查表 S13 行「存量基线外新违规才红」 | 批内直改(同上) |
| `tools/gdstyle_gate.py:11-13` | 闸件头注自述三元组键 | 批内直改(本批主改文件自身头注) |
| `待办清单.md` S13 条目 | 状态推进「已写卡」→ 批完结整条退役 | 流水线状态机推进(写卡段回写、批后收尾退役),实现批禁顺手改 |
design/ 全树对 gdstyle/S13 零提及(2026-10-25 grep 实证)→ 本批无设计文档反哺点,反哺点清单如实写零条。
## 7 文件结构图与落位预检
### 7.1 文件结构图
| 文件 | 职责 | 行为改动 |
|---|---|---|
| `tools/gdstyle_gate.py` | 闸件本体:键构造段改稳定身份键+数值解析(:77-90 区域);判定段加 WORSE 分支(:103-111 区域);refresh 段加对账与骤降守卫(:84-92 区域);头注随动(:11-13) | 行为改动——对照表 R1–R6 |
| `tools/gdstyle_baseline.txt` | 存量基线数据件,`--refresh` 重生成 239→234 条 | 非行为改动(数据件重排)——R7 验收 |
| `game/tests/static_scan.sh` | S13 调用段头注文案随动(:239-246) | 非行为改动——R8 |
| `game/tests/README.md` | 速查表 S13 行文案随动(:64) | 非行为改动——R8 |
### 7.2 落位与可复用性预检
- 复用面:本批零新增文件;闸件内新增两个纯函数(`build_identity`/`parse_metric`)——tools/ 39 个 .py 无共享解析模块(无 common/util 件,闸件自含是仓库现行形态),无既有件可复用
- 唯一面:身份键构造与恶化比对只落 `gdstyle_gate.py` 一处;static_scan.sh 与 README 的文案只述口径、禁止复写规则细节(口径唯一出处=闸件头注);基线登记值唯一事实源=基线行内消息文本
- 分层与交互面:纯 python 闸件,零游戏层交互;调用链=run_all_gates.sh(代码域档 09 段)→ static_scan.sh:247 → gdstyle_gate.py → gdstyle.exe(GDSTYLE_BIN 可覆盖)→ 基线读写;正常判定路径只读基线,唯 `--refresh` 写
## 8 任务卡
### T0 身份键与恶化判据(估时 0.2 工作日)
- 取用:无(首卡)
- 产出:`parse_metric(message: str) -> tuple[int, int] | None`(当前值与 max 值,解析不出返回 None);`build_identity(file_path: str, rule: str, message: str) -> str`(稳定身份键,含两级退化);判定输出新增 WORSE 行与改善计数(T2 与验收依赖)
步骤:
- [ ] 在 `gdstyle_gate.py` 落 `parse_metric` 与 `build_identity`(签名见产出块,落点=键构造段 :77-90 区域),两级退化路径齐备:无函数名退化「文件|规则」、解析不出数值退化全文键
- [ ] 判定段改为身份比对:基线行解析出身份与登记值 → 基线外身份判 NEW(现行语义不变);基线内身份且当前值>登记值判 WORSE;≤登记值判绿并计改善条数
- [ ] 闸件头注 `:11-13` 随动改写(身份键口径+恶化判据+退化路径)
- [ ] 窄确认:`PYTHONIOENCODING=utf-8 python tools/gdstyle_gate.py` → 必须得到「基线外新违规 0 条」+ WORSE 恰 3 条(`resume_adventure` 分支 11>10、`resume_adventure` 行数 108>104、`adventure_runner` 文件 1051>1050)+退出码 1(基线未刷新前恶化在红是预期态);数字不符=L3 停机
### T1 `--refresh` 对账与骤降守卫(估时 0.15 工作日)
- 取用:基线行格式约定(=现行「文件|规则|消息全文」,T0 不改格式)
- 产出:`--refresh` 对账输出(旧→新条数+逐条新登记/消失清单);骤降守卫(新<旧×0.8 或旧基线缺失 → 拒绝;`--allow-shrink` 放行)
步骤:
- [ ] refresh 段加对账:与旧基线逐行差集,打印新登记/消失两向清单与条数
- [ ] 加骤降守卫与 `--allow-shrink` 参数(用法说明行随动;拒绝状态下基线文件保持不变)
- [ ] 窄确认(夹具):临时 stub(GDSTYLE_BIN 指向一个应答 `--version` 为 0.4.0、扫描输出仅 1 条固定 JSON 的脚本)跑 `--refresh` → 拒绝、退出非零、`git diff` 基线为空;加 `--allow-shrink` → 写盘且对账打印「新登记 1/消失 239」级清单;`git checkout -- tools/gdstyle_baseline.txt` 还原(stub 为临时件,禁止入库)
### T2 基线重生成+文案随动+产出物落位(估时 0.15 工作日)
- 取用:T0 判定逻辑与预期读数;T1 refresh 对账
- 产出:基线 234 条落盘;两处文案;三份产出物
步骤:
- [ ] 正式刷新:`PYTHONIOENCODING=utf-8 python tools/gdstyle_gate.py --refresh` → 对账必须为「新登记 12/消失 17/总条数 239→234」;不符=L3 停机
- [ ] 窄确认:`python tools/gdstyle_gate.py` → 退出码 0
- [ ] 文案随动:`static_scan.sh:239-246` 头注与 `game/tests/README.md:64` 行(口径=稳定身份键+恶化判据+对账自检;禁止复写规则细节)
- [ ] 里程碑步:按改动域选档跑全套闸(本批只碰 tools/ 与 game/tests/ → 代码域档)全绿
- [ ] 验收对照表 R1–R8 逐条执行,撤销证明记录(变更点/命令/红输出摘要/还原结论)落实现报告
- [ ] 产出物落位:`reports/S13基线键治本-实现报告-<日期>.md`(含对账留档与撤销证明记录)、`reports/S13基线键治本-代拍板追认单-<日期>.md`、`reports/S13基线键治本-反哺点清单-<日期>.md`(零 design/ 反哺点+同步面四条去向闭环)——三份齐方算本卡完结
## 9 验证闸(改动—验收对照表)
证明口径=撤销证明(2026-10-24 用户裁定):变更被测面(回退改动段或更换基线夹具)→ 跑最窄闸 → 对应断言必须红 → 还原复绿。
| # | 需求点 | 改动(文件/行为) | 验收测试 | 层级 | 真实入口 | 撤销证明 |
|---|---|---|---|---|---|---|
| R1 | 数字漂移禁止再冒新违规 | gdstyle_gate.py 键构造改 build_identity | 刷新后闸跑「基线外新违规 0」 | 闸 | `python tools/gdstyle_gate.py` | 回退 T0 键构造改动段 → 12 条 NEW 复现红,还原复绿 |
| R2 | 名单外新违规仍必红 | 同上(身份匹配依赖基线在场) | 临时删基线一行无漂移条目(action_economy 类变量行)→ 该条 NEW 红、退出 1;还原复绿 | 闸 | 同上 | 删行夹具复红/还原复绿;回退 T0 改动段后同夹具仍红=拦截力保持的对照 |
| R3 | 恶化必红(X=0) | 判定段新增 WORSE 分支 | 临时把基线 `resume_adventure` 行数行的登记值 108 改 104 → WORSE 红、退出 1;还原复绿 | 闸 | 同上 | 回退 WORSE 判据改动段 → 同夹具不再红 |
| R4 | 改善禁止判红 | 同判定段 | T0 窄确认输出中 `_start_current_level`(55→53)与 `cross_validate` 四条等 9 条无 NEW 无 WORSE | 闸 | 同上 | 回退 T0 改动段后这 9 条变 NEW 红=改善判定系于 T0 |
| R5 | 骤降守卫+对账 | refresh 段 | stub 夹具:`--refresh` 拒绝且基线 git diff 为空;`--allow-shrink` 放行并打印两向清单 | 闸 | `GDSTYLE_BIN=<stub> python tools/gdstyle_gate.py --refresh` | 回退守卫改动段 → 同夹具直接写盘(不再拒绝) |
| R6 | 判定路径零写基线 | 判定段无写盘调用 | 跑闸后 `git diff --stat tools/gdstyle_baseline.txt` 为空 | 闸 | `python tools/gdstyle_gate.py` | 结构性(判定段零写调用,代码审读+行为验证双证) |
| R7 | 基线重排 234 条 | `--refresh` 正式跑 | wc -l=236(2 行头注+234 条)+对账「新 12/失 17」 | 闸 | `--refresh` | `git checkout` 基线 → 闸回到 WORSE 3 红态(绿态确实来自 234 条新基线的互证) |
| R8 | 文案两处随动 | static_scan.sh:239-246+README:64 | 人工核对与闸件口径一致,代码域档 09 段跑绿 | 文档面 | 按改动域选档跑闸 | 非行为改动,人工核对兜底 |
测试削弱申报:本批不删不放宽任何既有断言(闸自身判定逻辑更换内核,判据强度只升不降:NEW 拦截保持+新增 WORSE)。
独立验收审计:审计入口=未参与实现的会话按本表逐条抽查撤销证明记录;报告落 `reports/S13基线键治本-验收审计-<日期>.md`,未过禁合并。
## 10 异常分级
- L1 自救:对账/计数行的打印格式、排序、措辞问题——自助修
- L2 记录继续:未知规则消息形态触发全文键退化路径(设计内行为)——记进实现报告继续
- L3 停机呈报:任何窄确认预期数字不符(T0 非「NEW 0/WORSE 3」、T1 守卫未拒、T2 对账非「新 12/失 17/234 条」)——停机写呈报等用户
## 11 代拍板白名单
- 正则具体写法与转义细节(`function '([^']+)'`、当前值/max 值提取的容错)
- WORSE/改善/对账各行的输出措辞与排序
- 头注与 README 行的具体措辞(语义与判据不变)
- stub 夹具脚本的实现形态(临时件,禁止入库)
超出以上范围=呈报,禁自行拍板。
## 12 待裁点
零待裁点,开工门=U0。四点已于 2026-10-25 用户拍板(全案并列与淘汰依据留档):
1. 键形态=**B 稳定身份键**(淘汰 A 数字规范化——104→300 行的恶化被一并放过;淘汰 C 结构化输出——钉版二进制 JSON 无指标字段已实证,fork 超本批规模)
2. 恶化判据=**超登记值即红,X=0 不分规则**(淘汰 20% 宽容量——留温水通道、登记值缓慢失真;淘汰分规则给值——多一套参数面要维护)
3. 存量处置=**本批治本+批内人工刷新**(淘汰只刷新不改键——下一批再动这些文件必然重演;淘汰先冻结 S13 段——防线空窗+二次批成本)
4. 刷新自检=**加对账+骤降守卫**(淘汰不加、仅靠人工发起纪律——误跑一次即把新债静默洗进基线)
@@ -60,7 +60,7 @@
| D2 | [code-conventions](../design/engineering/code-conventions.md) §2.1 | 每个跨类信号:参数语义、发送时点、消费方依赖必须在发送方 `##` 文档注释成文(d10 依据) |
| D3 | [code-conventions](../design/engineering/code-conventions.md) §4+AGENTS.md 数值单一事实源红线 | 玩法数值只存 `data/tables/`(.tres)经 ConfigDB 单点读取(d11/d16 依据;d15 判机制常量的边界=结构常量先例 STANDEE_FOOT_MARGIN) |
| D4 | [architecture](../design/engineering/architecture/architecture.md) 架构原则 5(fail-fast) | d9 push_error 早退依据(「层必须先 register 方可 open/close」已写在 modal_stack 头注,机器强制缺口本批补) |
| D5 | [test-conventions](../design/engineering/test-conventions.md) §9.4+2026-10-24 用户 P0 令(iter36-实现报告 §纪律变更段在案) | 行为改动验收只走撤销证明(回退本批 hunk→断言红),禁注入/改值造红实验;新断言判别力随所属改动的撤销证明一并自证,证不了的一律记「拦截能力未证」 |
| D5 | [test-conventions](../design/engineering/test-conventions.md) §9.4+2026-10-24 用户 P0 令(原记录于迭代 36 实现报告,报告已退役〔git 历史可考〕) | 行为改动验收只走撤销证明(回退本批 hunk→断言红),禁注入/改值造红实验;新断言判别力随所属改动的撤销证明一并自证,证不了的一律记「拦截能力未证」 |
## 3. 现状事实(2026-10-24 写卡会话实查+2026-10-25 grilling 独立补查;开工日 T0 复核行号)
@@ -1,233 +0,0 @@
# 需求卡片:开场后缀营地灰字迷雾测点批(开场行后缀认加算区+营地六处灰字深化+迷雾测点三关扩对)
- 版本:**v1.2**(2026-10-24 v1.0 成文→同日 grilling 第一轮修订 v1.1→第二轮 grilling 后按仓库换代〔`game/smoke/` 退役〕重落断言宿主定稿;两轮复核结论见 §12)
- 来源:[待办清单](../待办清单.md)「qa/ 实现报告收尾·孤儿遗留七项」(2026-10-14 登记,来源=批次移交,设计面=工程直入,状态=待写卡(备选))第②③④项+用户 2026-10-24 会话四裁(②③④走本卡、④走甲·归一后基准、第⑥项整条注销)(唯一事实源:工程直入证据指认=本卡 §3 逐条 file:line 实查+迷雾三关对比度本机复算(§3 F10);4-1/4-2 裁=交接文档 `reports/需求澄清-工程直入九项与卡片切分-2026-10-24.md` §三口径 6/7,4-3 甲·归一后基准=2026-10-24 会话四裁)
- 归属:`game/presentation/main.gd`(开场行后缀条件)+ `game/presentation/views/camp_overlay_view.gd`(六处灰字)+ `game/probe/ui_contrast_probe.gd`(迷雾测点三行)+ `game/presentation/views/board_cell_unit.gd`(注释随动)+ 断言面(`game/tests/unit/presentation/theme_projection_test.gd` 扩段 + `game/probe/ui_click_probe.gd` 增段 + `game/probe/ui_contrast_probe.gd` 迷雾段改写)
- 排期:未编入(卡片不预占迭代号;本卡估时 ≈1.5–2.5 工作日,低于编排硬下限 5 工作日,须与其他卡同批编入——归 iter-plan 段四查③)
- 开工门:U0(用户 `/iter` 发令)+ grilling 复核门过(v1.2 已过两轮,见 §12)
## 0. 前置依赖与并行性
- **第〇步核对(2026-10-24 写卡会话)**:来源条目设计面=工程直入、状态=待写卡(备选),第②③④项现状带 file:line 证据指认(写卡会话逐处复核到行号,营地六处行号较条目原文 :116/:403/:414 已漂移订正为现行 :167/:417/:476/:509/:513/:525)→ **放行写卡**。第⑥项(TG_* 装饰带)经用户 2026-10-24 裁整条注销,不入本卡(注销动作归 §6 反哺点)。
- **仓库换代注记(2026-10-24,v1.2 立此存照)**:本卡 v1.1 合回(`5fba5efd`)六分钟后,`game/smoke/` 目录退役合并入库(`16c6f136`)——探针迁 `game/probe/`、`smoke_all.gd` 删除(断言面分流迁 `game/tests/` 各单测与 `system_test.gd`)。v1.1 的断言宿主失效,v1.2 已重落(§3 F4/F8/F11、§7)。
- 本卡与「文案与禁字清扫批」(2026-10-24 同会话卡 A)**零改动单元交叠**,可同批编入亦可分批;但**断言面共用** `game/probe/ui_click_probe.gd` 且两卡 T2 都驱动三选一停点区,两处分歧须点名:①选卡策略——卡 A 只读弹层头即离(`press_card(0)` 无条件选首件形态,:356-366 先例),本卡须专选 atk/max_hp 属性值提升卡再推进;②参数污染——卡 A 段 `set_sliders(400,200)`(:320)残值会使本卡白板反向假红(`_start_adventure` 只关窗不清值、残值跨段存活)。**同批共用时驱动参数须段内自洽、跨段显式复位**,归 iter-plan 编排注记。
- 迷雾测点值依赖素材盘上状态:本卡写卡会话已按 `_normalize_floor_luma` 同式对三关素材复算(§3 F10,两轮 grilling 独立复算吻合),实现批 T0 只对拍不复算。
## 1. 目标与完成定义
**目标**:三件玩家面可读性/信息保真缺陷收口——
1. **开场行后缀认加算区**(孤儿②):每关开场行「(含面板加成)」后缀的判断条件,从「局外加成(永久强化 flat/调试浮窗 pct)存在才带」扩为「局外加成 **或 局内加算区**(`run_ledger.bonus` 的 atk/max_hp)任一存在才带」——开局显示值来自 `effective_atk()/effective_max_hp()`(已含加算区 flat),局内拿了属性值提升却不带注记的信息失真消除;
2. **营地六处灰字深化**(孤儿③,4-2 裁 A):`camp_overlay_view.gd` 六处裸 `UiKit.STONE`(灰石,对亮板 3.59–4.02:1 越带)统一换 `UiKit.STONE_DEEP`(灰石深化,对柜台板 5.98:1/对行板 6.70:1——两对色对在对比度探针在册);
3. **迷雾测点三关扩对·甲·归一后基准**(孤儿④,用户裁甲并核订归一后基准):`ui_contrast_probe` 迷雾测点从单值行(原图 dungeon 均值 #453020)换代为三关三行,基准=**亮度归一后**(真实渲染面)的地板均值合成底,并加「行值 vs 运行时派生值一致」校验断言。
**完成定义**(全部满足才算本批完成):
1. 后缀条件落地且三条路径断言绿:白板新开 L1 无后缀(反向);局内拿 atk/max_hp 属性值提升后下一关开场行带后缀;断点续玩(断点含 bonus)重建的开场行带后缀(4-1 裁 A:菜单开新局与断点续玩两条路径分别测);
2. 营地六处全部 STONE_DEEP 且 `camp_overlay_view.gd` 源内零裸 `UiKit.STONE`(非 `_DEEP` 后缀);真实入口开营地后六处 label 取色断言绿;对比度探针既有在册两行(STONE_DEEP×两板)零改动仍绿;
3. 迷雾测点三行绿(三关合成底对比度 ≥4.5:1 全过)+派生校验断言绿(行值与运行时按生产归一函数算出的均值一致,容差 ±2/255);`board_cell_unit.gd:270` 注释的复算值随动换代;
4. §8.2 对照表逐行断言绿+变异验证记录表进实现报告;
5. 批末代码域闸全绿+改前改后读数对拍;三份 `reports/` 产出物写齐(T4)。
## 2. 设计事实源
| # | 出处 | 取用条款 |
|---|---|---|
| D1 | 工程直入证据指认(待办条目第②③④项现状+写卡会话 2026-10-24 逐处实查+两轮 grilling 独立补查,本卡 §3 F1–F13) | 三件缺陷的 file:line 现值与消费链 |
| D2 | 用户裁决(2026-10-24 会话四裁+交接文档 §三口径 6/7) | 4-1 裁 A=两条路径各自有验收;4-2 裁 A=营地六处统一 STONE_DEEP;4-3 裁甲·归一后基准(裁定点=2026-10-24 会话四裁)=三关三行、测点与真实棋盘一致 |
| D3 | `game/presentation/views/board_view.gd:951-957/:995-1021`(地板亮度归一——现行生产路径)+`game/probe/ui_contrast_probe.gd` 头注(测点对一律取 UiKit 常量实时求值,代码侧换色即闸红) | 迷雾测点基准须按归一后真实渲染面取值;探针哲学=值随真实路径派生 |
| D4 | `design/art/art-bible.md` §6.5 :395(迷雾记忆态在册复算值≈6.7:1、地板均值 #453020——**原图基准**) | 本批换代为归一后三关基准后,该在册值须同步(→§6 反哺点) |
## 3. 现状事实(2026-10-24 主区实查+两轮 grilling 独立补查;开工日 T0 复核行号)
| # | 事实 | 出处 |
|---|---|---|
| F1 | 开场行后缀条件只认局外:`_on_adventure_level_started` 内显示值取 `runner.effective_atk()/effective_max_hp()`(注释自证「表值+永久强化 flat+**加算区 flat** 后乘调试浮窗 pct」),后缀布尔=`meta.hero_override()` atk/max_hp>0 ∨ 调试浮窗 pct>0×2——**局内加算区 flat 不在条件里**,拿了属性值提升显示值变大却不带注记 | `game/presentation/main.gd:603-612` |
| F2 | 后缀词=「(含面板加成)」由 `Narrator.level_open_line(display, seed, atk, max_hp, boosted)` 尾接(battle_narrator.gd:36-38);该函数**零既有断言**(全仓检索「level_open_line/含面板加成」零命中) | `game/presentation/battle_narrator.gd:36-38` |
| F3 | 加算区账本:`run_ledger.bonus` 四键 {atk, max_hp, armor_class, ap}——冒险开始归零(:91)、断点续玩回填(:151-154,缺键钳 0);`_on_adventure_level_started` 首行已先重取 `run_scope.runner = run_scope.adventure.runner()`(main.gd:604)——条件处 runner 恒在役;`level_runner.run_ledger` 为公有成员(level_runner.gd:680),冒险模式逐关经 adventure 装配链注入 | `game/core/adventure_runner.gd:29`/:91/:151-154;`game/presentation/main.gd:604` |
| F4 | 两条验收路径的机制前提(三态分支,2026-10-24 第二轮 grilling 订正):`level_started` 信号每关含首关都发(`_start_current_level` :857/:879);**但 `resume_adventure` 对断点形态三态分流**(:211-235)——断点带 `bonus_pending`(:211-229,emit `curio_choice_presented` 后提前 return)或 `bonus_result`(:230-235 提前 return)两种**三选一停点形**根本不调 `_start_current_level`、**不发 level_started**;唯两键皆空的**选路停点形**(bonus 已入账、停在下关选路点)走 :236→`_start_current_level()`→:879 重发开场行。`has_breakpoint()` 消费口唯一=`main._resume_from_menu`(:519-521)——**生产「继续上局」钮已随三入口化撤出**(ui_click_probe:319 注记 mn8),该函数现况=探针直调中间态(main.gd:486-487 注记 mn10 同族、卡④大门待接)——路径③按「等价真实信号」形态走此唯一消费口;**路径③断点形态钉值=选路停点形**(T2③) | `game/core/adventure_runner.gd:211-235`/:857/:879;`game/presentation/main.gd:519-521`/:486-487;`game/probe/ui_click_probe.gd:319` |
| F5 | 白板局现状正确半:新开冒险 ov 全零+bonus 归零+调试关 → 无后缀(本批保回归);属性值提升经三选一/商店兑付入 bonus(奖励节点渠道=属性值提升+补给);候选池滤掉 relic/feat_ticket 后的 kind 集含 attack/max_hp/armor/gp/ap/heal/refresh/rap/time_sand(`adventure_table.gd:23` CURIO_KINDS)——armor/ap 卡选了不触发后缀,兜底须按「无 atk/max_hp 卡即推进」 | `main.gd:608-612`;`adventure_runner.gd:673-676`;`game/data/schemas/adventure_table.gd:23` |
| F6 | 营地六处裸 `UiKit.STONE`(#786E62,对亮板实测 3.59–4.02:1 越带)::167 柜台结构位锁文、:417 秘宝行「未解锁」态色、:476 工坊行状态字、:509 同调行「被动/主动·充能」、:513 同调行档位标签、:525 刷新行「三选一刷新 +%d 次/冒险」;:75 已有换色先例与理由注记(STONE 对铭牌板 3.59:1 越带,换 STONE_DEEP 5.98:1) | `game/presentation/views/camp_overlay_view.gd:167`/:417/:476/:509/:513/:525/:75 |
| F7 | 六处底板色两类:柜台板=`PANEL_DATA`(`_counter_panel` :196-197,:167 所在图鉴柜与 :509/:513/:525 同调段所在秘宝匣柜台板)与行板=`CAMP_ROW_PLATE`(`ROW_PLATE_COL` :19 常量,:417/:476 所在行卡 :459);STONE_DEEP×两板两对色对**已在对比度探针在册**(铭牌副题 5.98:1/行价格 6.70:1,`game/probe/ui_contrast_probe.gd:50/:52`) | `camp_overlay_view.gd:19`/:459/:196-197;`game/probe/ui_contrast_probe.gd:50/:52` |
| F8 | 营地真实入口先例:`game/probe/ui_click_probe.gd` `open_camp_via_savesel(main, …)`(:59-60)+`main.camp_overlay` 成员直取+`refresh_camp(main._camp_data())`(:71);营地 label 上色经 `add_theme_color_override("font_color", …)`(UiKit.label 工厂 :429-434 与 camp :422 同式)——取色断言读法须走 `get_theme_color("font_color")` | `game/probe/ui_click_probe.gd:59-82`;`camp_overlay_view.gd:422`;`ui_kit.gd:429-434` |
| F9 | 迷雾现状与基准缺陷:记忆态=地板纹理直画+`FOG_MEMORY_PLATE #3A3A3A` α.66 灰罩+`FOG_MEMORY_INK #C4C4C4` 记忆墨;探针测点单行(`game/probe/ui_contrast_probe.gd:61-64`)、地板均值取 art-bible §389 在册 #453020(**原图 PNG 均值**);但 `board_view._load_board_tiles`(:951-957)装载时对每张地板瓦片做**亮度归一**(8×8 双线性测光→k=(0.10/L)^(1/2.2) 钳 [0.6,1.8]→逐通道 sRGB 乘 k——现行瓦片原图 L≈0.036 被提亮),**真实渲染面≠原图均值** | `board_cell_unit.gd:267-275`;`ui_kit.gd:148-149`;`game/probe/ui_contrast_probe.gd:61-64`;`board_view.gd:951-957`/:995-1021 |
| F10 | 三关对比度复算(写卡会话 2026-10-24 PIL 逐像素,素材在盘、按 §3 F9 归一同式;两轮 grilling 独立复算**逐值吻合**,三关 k 值 1.05–1.62 均未触钳位;门槛=探针 `MIN_RATIO 4.5`)——**原图基准**(上一会话口径):L1 6.72:1/L2 5.95:1/L3 6.62:1;**归一后基准**(真实渲染面,本卡采用):L1 地板均值 #6F4D33→合成底 #4C4037→**5.70:1**;L2 #4F5566→#414349→**5.65:1**(最差);L3 #4C5169→#40414A→**5.75:1**——两基准均全过 4.5:1,余量充足;三关归一后收敛(归一目标同 L≈0.10,色相差为残差);复算环境(PIL)与探针运行时(Godot 导入管线+bilinear)不同源,素材 `.import` 为无损导入(compress/mode=0)佐证实际不会失配,±2/255 内差异以 T0 探针派生首跑为准(§7 T0/L2) | 素材=`game/assets/art/board/terrain_floor_{dungeon,underdark,deep_underdark}_{1..5}.png` 15 张实算 |
| F11 | 对比度探针形态(现址 `game/probe/ui_contrast_probe.gd`):门槛 4.5 无区域例外(:9);测点表 [名称, 墨色, 直背景, 墨α] 常量实时求值(头注);合成底混成式=墨/板分量按 α 在 sRGB 域线性叠加(现行迷雾行 :61-64 同式);BoardView 可直呼(`board_view.gd:4` `class_name BoardView`;:68 `TILE_FLOOR_FMT` 路径常量;:995 `static func _normalize_floor_luma(tex, target_l, lumas_out)`) | `game/probe/ui_contrast_probe.gd:9`/:61-64;`board_view.gd:4`/:68`/:995-1021` |
| F12 | 仓库换代(2026-10-24 `16c6f136`):`game/smoke/` 退役——探针迁 `game/probe/`(ui_click_probe/ui_contrast_probe/ui_struct_probe 均在)、`smoke_all.gd` 删除、断言面分流迁 `game/tests/` 各单测与 `system_test.gd`;单测 runner=`game/tests/run_all.gd` 套件清单协议(显式登记制 :91/:101);叙述行/日志行协议类断言现役宿主=`game/tests/unit/presentation/theme_projection_test.gd`(run_all 清单 :101 在册「战斗日志行协议」域)——本卡静态半断言扩段落此,无需新清单行 | `game/tests/run_all.gd:91/:101`;`game/tests/unit/presentation/theme_projection_test.gd` |
| F13 | 改前读数基线=开工日 T0 采集(单测/探针通过数对拍面)——写卡会话不跑测(测试执行两入口铁规),本卡不预写数字 | — |
## 4. 设计契约(红线,违反 = L3 停机呈报)
🔴 **契约 1 · 后缀条件钉值**:新条件=既有四项(`ov.atk>0` ∨ `ov.max_hp>0` ∨ `debug_overlay.atk_pct()>0` ∨ `debug_overlay.hp_pct()>0`)**∨ 新增两项**(`int(run_scope.runner.run_ledger.bonus.get("atk",0))>0` ∨ `int(run_scope.runner.run_ledger.bonus.get("max_hp",0))>0`);`armor_class`/`ap` 两键**不入条件**(开场行只显示 atk/max_hp 两值——不含这两轴的显示值,带了后缀反而失真);后缀词「(含面板加成)」与 `level_open_line` 签名零改动;`effective_atk()/effective_max_hp()` 本体零改动。
🔴 **契约 2 · 营地六处全换+源内零残留**:六处逐字 `UiKit.STONE`→`UiKit.STONE_DEEP`(:167/:417/:476/:509/:513/:525);换后 `camp_overlay_view.gd` 源内零裸 `UiKit.STONE`(后跟 `_DEEP` 者不计)——由源 token 扫描断言钉住;`ui_kit.gd` 的 `STONE` 常量本体与全仓他用零改动。
🔴 **契约 3 · 迷雾测点钉值(甲·归一后基准)**:单行换代三行,行值=三关归一后地板均值(L1 (111,77,51)/L2 (79,85,102)/L3 (76,81,105),写卡会话复算值〔两轮 grilling 独立复算吻合〕,行尾注出处与「素材更新随动」义务);合成底按探针既有混成式(PLATE×0.66+均值×0.34,逐通道);**派生校验断言**:探针运行时按生产归一函数(复用 `BoardView._normalize_floor_luma` 静态真函数——禁在探针内复制 k 公式)对 15 张地板素材实算归一后均值,逐关比对行值,容差 ±2/255(8-bit 量化级)——行值回原图基准或素材换代未随动均红;**素材缺位=按闸预检处置拷贝齐盘,禁跳过派生校验**(探针依赖 15 张 _1.._5 全在,闸预检只钉每关 _1 号件)。三行须全过 4.5:1。
🔴 **契约 4 · 核心层零改动**:bonus 记账/回填/兑付(`run_ledger` 全链)零触碰——缺陷在呈现条件半边,核心已闭环(F3/F4);迷雾绘制本体(`board_cell_unit` 绘制路径)与 `FOG_MEMORY_*` 常量零改动(:270 注释随动除外——非行为)。
🔴 **契约 5 · 验收闭合**:三件改动各带对照表行,断言+撤销变红双证;「条件加了就绿」不成立——两条路径(菜单开新局/断点续玩)分别断言(4-1 裁 A);**路径③断点形态钉值=选路停点形**(bonus 已入账、`bonus_pending`/`bonus_result` 皆空——F4 三态分流下唯此形态重发开场行),禁用三选一停点形断点硬凑(续玩后无开场行可判即形态选错,先排形态再谈基建缺口——L3 判据)。
🔴 **契约 6 · 断言面零未申报削弱**:既有断言零删除零放宽;对比度探针既有行(含迷雾单行)由「换代」替代而非并存——旧单行删除属换代申报(§8.3),其余行零改动。
## 5. 范围边界
**做**:main.gd 后缀条件;营地六处换色+扫描断言+取色断言;迷雾测点三行+派生校验断言+:270 注释随动;三件的新增断言(theme_projection_test 扩段/ui_click_probe 增段/ui_contrast_probe 迷雾段改写);反哺点清单(含孤儿第⑥项注销与 art-bible 换代两条)。
**不做**(明示去向):
- `armor_class`/`ap` 加成是否也上开场行显示(显示值本身扩轴)——显示面改动另立,本批只修注记失真;
- 营地 `STONE` 常量语义退役/全站 STONE→STONE_DEEP 收敛(本批只动营地六处在册缺陷位;其他屏的 STONE 用位若有越带属存量、非本批对象);
- 迷雾混成式从 sRGB 域改线性域混成(探针现行口径不动——换域是另一份判据契约);
- golden 基线(本批零视觉改动面:后缀是文本行非棋盘裁剪区、营地灰字不在 golden 四屏裁剪面——T3 渲染闸照跑作回归线,不预判失效);
- 孤儿第⑥项注销动作与待办清单状态推进(§6 反哺点——文档面);
- 商店房截图纳屏(孤儿⑦,留待办)。
## 6. 关联文档同步面
> 本批是代码实现批,禁写 `design/` 整目录与根规则文件,唯一可写目录=`reports/`。「同步义务」一律执行为:逐条列进 `reports/iter<N>-反哺点-<完成日>.md`(哪个文件哪一节、改成什么、依据),用户会话裁决后归文档批落文。
| 文档 | 关联点(本批实现会改变它的哪条陈述) | 同步义务 |
|---|---|---|
| `design/art/art-bible.md` §6.5 :395 | 在册复算值「≈6.7:1(地板纹理均值 #453020 与灰罩合成后 #3E3731 复算,迭代 16 T0)」系**原图基准**——本批测点换代归一后基准(5.65–5.75:1 三关)后该句过时 | 反哺点 · 列清单(①§6.5 复算值换代为「归一后(真实渲染面)三关 5.65–5.75:1+归一口径注+素材更新随动义务」;依据=本卡 F9/F10) |
| `待办清单.md`「qa/ 实现报告收尾·孤儿遗留七项」 | 第⑥项(TG_* 装饰带)按用户 2026-10-24 裁**整条注销**(不另立「功能性非文字检测」替代项);第②③④项随本卡销号;第⑦项留存——条目本体保留至 ⑦ 处置;条目状态推进「已写卡(本卡路径)」 | 反哺点 · 列清单(②⑥注销与②③④销号及状态推进归 batch-closure/文档批——**本写卡会话受「不改根清单」约束未执行,编排/开工前须补**) |
| `roadmap.md` | 迭代行编入笔(编入哪一迭代由 iter-plan 段发令,本卡不预占) | 反哺点 · 列清单(③) |
| `game/presentation/`、`game/probe/`、`game/tests/unit/presentation/` | 实施本体与断言面 | 实施本体(可写) |
| `design/gdd/`(全树) | **无陈述被本批改变**——开场行后缀口径、营地灰字、迷雾测点基准在 GDD 零在册(2026-10-24 实查+两轮 grilling 复核补查:全树检索「含面板加成/开场行」零命中;HUD框架 :183 只登记「数字对格底 ≥4.5:1」常量要求,本批不触) | 无关联文档(查讫) |
## 7. 任务卡
> 估时按 Claude 工作日口径;每卡出口自跑轻闸;开工日 T0 复核本卡全部行号。回归措辞模板:里程碑步(T 段)出口跑一次全套闸;波内修复只做出红最小单元的最窄确认;新增测试先行孤立验证再并入全套。
### 卡前 · 文件结构图
| 文件 | 职责 | 行为改动 |
|---|---|---|
| `game/presentation/main.gd` | 后缀条件扩两项(:608-612 段内;复用既有·修改) | 行为改动 → wc1/wc2/wc3 |
| `game/presentation/views/camp_overlay_view.gd` | 六处 STONE→STONE_DEEP(复用既有·修改) | 行为改动 → wc4 |
| `game/probe/ui_contrast_probe.gd` | 迷雾单行→三行+派生校验断言(复用既有·改写验收函数——变异伴生义务) | 行为改动(断言面)→ wc5 |
| `game/presentation/views/board_cell_unit.gd` | :270 注释复算值随动换代(非行为) | 非行为改动 → wc6 |
| `game/tests/unit/presentation/theme_projection_test.gd` | 开场行静态半断言扩段(`level_open_line` 尾接行为——战斗日志行协议域宿主,run_all 清单 :101 在册;复用既有·增段,零清单改动) | 行为改动(断言面)→ wc1 静态半 |
| `game/probe/ui_click_probe.gd` | 开场行三路径断言+营地取色断言(挂既有局中/营地段;复用既有·增段) | 行为改动(断言面)→ wc1/wc2/wc3/wc4 |
| `reports/iter<N>-实现报告/代拍板追认单/反哺点`(三份,批末写) | 产出物落位 | 非行为改动 → wc7 |
本批**零新增文件、零新增数据件、零 run_all 清单改动**(静态半落既有在册宿主扩段);新增函数仅探针内私有派生助手(见预检)。
### 接口块(全卡共用,后卡引用以此为准)
- **main 后缀条件**(`_on_adventure_level_started` 内,main.gd:608-612 段):`var boosted: bool = int(ov.get("atk", 0)) > 0 or int(ov.get("max_hp", 0)) > 0 or debug_overlay.atk_pct() > 0 or debug_overlay.hp_pct() > 0 or int(run_scope.runner.run_ledger.bonus.get("atk", 0)) > 0 or int(run_scope.runner.run_ledger.bonus.get("max_hp", 0)) > 0`——布尔直传 `Narrator.level_open_line(...)` 第五参(签名零变)。
- **ui_contrast_probe 派生助手**:`static func _norm_floor_avg(board_type: String) -> Color`(探针内私有)——纹理路径经 `BoardView.TILE_FLOOR_FMT % [board_type, i]`(`board_view.gd:68` 常量,禁复制字面量);装载 `terrain_floor_<board_type>_{1..5}` 五纹理(`UiKit.load_tex`);逐张调 `BoardView._normalize_floor_luma(tex, 0.10, null)`(:995 static func 直呼);逐像素归一后均值再五张平均,返回 sRGB Color;仅供迷雾三行行值比对与行构造共用(生产归一逻辑唯一落点仍在 board_view,探针只消费)。
- 迷雾三行行名:「迷雾·记忆墨/合成底L1地牢」「迷雾·记忆墨/合成底L2幽暗」「迷雾·记忆墨/合成底L3深幽」(名称 L1 可调,尾缀〔wc5〕)。
- 断言尾缀〔wc#〕与 §8.2 对照表互指;各断言族最窄闸(注入实验跑法):
- 单测族(theme_projection_test)=`D:\code\godot\Godot_v4.7.2-stable_win64_console.exe --headless --path game --script res://tests/unit/presentation/theme_projection_test.gd` 单件直跑;
- 探针族两件(ui_click_probe / ui_contrast_probe)=窗口化/headless 单件直跑 `…console.exe --path game res://probe/ui_click_probe.tscn`(窗口化——驱动真实 UI)与 `…console.exe --headless --path game res://probe/ui_contrast_probe.tscn`(探针自持形态,头注运行行为准)。
### 落位与可复用性预检(本批新增件逐条三问)
- **`_norm_floor_avg(board_type) -> Color`(探针私有派生助手)**——复用面:归一逻辑**复用** `BoardView._normalize_floor_luma` 生产静态函数(真渲染同源——禁探针内复制 k 公式即本条设计动机);为什么不复用「直接手填行值不派生」:派生校验是契约 3 的行值一致性断言面,手填无断言即撤销售证明缺(test-conventions §9.4)。唯一面:探针内唯一、全仓无第二处「按板型算归一后均值」实现(board_view 只逐张归一不聚合均值——聚合属探针判据面);路径经 `TILE_FLOOR_FMT` 常量取(零第二处路径字面量)。分层与交互面:探针→生产静态函数单向只读调用,零 UI 依赖、零核心写口;素材经 `UiKit.load_tex` 现成装载面;缺位处置=契约 3 齐盘条款。
- **后缀条件/营地换色/注释随动**——零新增件,改既有行;营地取色断言复用 ui_click_probe 既有营地段(F8)与 `UiKit.STONE_DEEP` 常量直比(零第二色值定义;读法走 `get_theme_color("font_color")`——F8)。
- **开场行静态半落 theme_projection_test.gd 扩段**——为什么:迁移后断言按域分文件(F12),叙述行/日志行协议域现役宿主即该文件(run_all 清单 :101「战斗日志行协议」注记);新立文件=域错位+徒增清单行。**驱动面**:三路径断言复用 `_start_adventure_from_menu()`(`game/probe/ui_click_probe.gd:323` 先例)与 `main.log_view` 成员直取(营地/弹层成员直取先例同款);log 行文本读取用现成 `log_view._log`(RichTextLabel)文本判。
### T0 事实坐实(≈0.25d)
- [ ] 复核 §3 全部 file:line;确认选路停点形断点的构造链(T2② 推进至下一关选路停点时 `adventure_runner.gd:982` `_snapshot_breakpoint` 自然落盘——「选路停点=唯一可恢复停点形态;战斗中不存」:982 注记自证);确认三选一停点确定性取卡路径(同种子同候选——`reward_pick` 封闭流)与 ui_click_probe 驱动局种子控制法(:324-325 seed_edit 钉死先例)——可核查结果:三路径驱动方案记进实现报告素材。
- [ ] 复核营地六处取色断言的 label 定位锚(文本锚/结构锚各六处;读法=`get_theme_color("font_color")`,F8);迷雾三行复算值 T0 用探针派生函数首跑对拍(行值 vs 派生值 ±2/255——复算环境 PIL 与探针运行时 Godot 不同源,失配超容差时以探针派生首跑值为准修手填行值,走 L2 不走 L3)——可核查结果:对拍读数在案。
- [ ] 改前读数基线采集(单测/探针通过数,两入口铁规下随 T1 loop 首跑取值)——可核查结果:基线读数记录在案。
### T1 后缀条件+营地换色+断言(≈0.75–1d)
- [ ] 实装 main 后缀条件(接口块钉值六项布尔)。可核查结果:条件在位、`level_open_line` 签名与后缀词零变化。
- [ ] 实装营地六处换色(契约 2 六行)。可核查结果:`camp_overlay_view.gd` 源检索 `UiKit.STONE`(非 `_DEEP`)零命中。
- [ ] 实装 theme_projection_test 开场行静态半断言(扩段):`Narrator.level_open_line("层", 1, 5, 30, true)` 含「(含面板加成)」、`(..., false)` 零后缀(尾接行为钉住——F2 零既有断言的补位)。可核查结果:该段绿。
- [ ] 实装 ui_click_probe 营地取色断言(挂 :59-82 营地段后):真实入口开营地后,按定位锚取六 label,断言 `get_theme_color("font_color") == UiKit.STONE_DEEP` ×6。可核查结果:探针该段绿。
- [ ] 实装源 token 扫描断言(挂 ui_struct_probe 营地相关段或探针静态扫描段——repo 源码 token 扫描先例=ui_struct_probe ⑧ 零动效 token 扫描):`camp_overlay_view.gd` 源码零正则命中 `UiKit\.STONE(?!_DEEP)`。可核查结果:该断言绿。
- [ ] 变异验证(注入→最窄闸见红→`git checkout` 精确还原→记录;最窄闸=接口块所列单件直跑命令):①回退 main 条件 hunk(去 bonus 两项)→wc1/wc2 正向断言红(T2 落地后跑;本卡先录注入方案);②营地任一处回 `UiKit.STONE`→取色断言红+token 扫描红;③扫描正则临时放宽为匹配 `_DEEP`→自断言误红(证明正则判别边界)。记录表进实现报告。
- [ ] 验收步骤:T 段出口跑一次全套闸(`tools/run_all_gates.sh` 按改动域选档,本批只碰 `game/` → `--code`),期望代码域全绿。
### T2 开场行三路径真实入口断言(≈0.5–1d)
- [ ] 实装 ui_click_probe 开场行三路径断言(真实入口驱动,`log_view._log` 文本判「(含面板加成)」有无):①**菜单开新局·白板反向**——`_start_adventure_from_menu()`(种子固定 :324-325 先例)开局,L1 开场行零后缀(防坑:**滑条须显式归零**——`_start_adventure`(main.gd:581)只关窗不清值,`:320` set_sliders(400,200) 残值在同探针会话跨段存活,白板反向段前须归零或独立隔离段);②**菜单开新局·局内加算区正向**——续驱动至奖励节点三选一(:356-366 先例),按同种子确定性候选选一张 atk 或 max_hp 属性值提升卡,**候选无 atk/max_hp 卡即推进至下一停点循环兜底(其余无论是补给/护甲/AP 卡都不选——选了不触发后缀)**,推进至下一关开场,断言开场行带后缀;③**断点续玩正向·选路停点形**——于路径②的下一关选路停点(bonus 已入账、`bonus_pending`/`bonus_result` 皆空——:982 自然落盘)退出落断点,经 `_resume_from_menu()` 唯一消费口驱动(F4:生产钮已撤出,此即现况唯一真实入口形态——mn10 探针直调中间态同族),断言重建开场行带后缀。可核查结果:三路径断言绿。
- [ ] 变异验证(注入→最窄闸见红→还原→记录;最窄闸=接口块探针单件直跑):①回退 main 条件 hunk→②③红、①仍绿(反向断言钉另一侧——两侧各自闭合);②条件误删 ov 四项中任一→既有局外加成路径回归断言红(补一条 ov/pct>0 带后缀的既有行为回归断言——F5 正确半保回归);还原复绿。记录表进实现报告。
- [ ] 验收步骤:T 段出口跑一次全套闸(`--code`),期望代码域全绿。
### T3 迷雾测点三行+派生校验(≈0.25–0.5d)
- [ ] 实装 `game/probe/ui_contrast_probe.gd` 迷雾段换代:单行删、三行入(契约 3 钉值三关均值+行尾出处注「写卡会话复算+素材更新随动」);`_norm_floor_avg` 派生助手(接口块钉值:路径经 `BoardView.TILE_FLOOR_FMT`、归一经 `BoardView._normalize_floor_luma` 直呼);派生校验断言(三关行值 vs 派生值 ±2/255);`board_cell_unit.gd:270` 注释随动(「≈6.7:1/#453020 复算在册」→「归一后(真实渲染面)三关 5.65–5.75:1——测点行值与素材随动,见 ui_contrast_probe 迷雾段」)。可核查结果:探针迷雾段三行绿+派生校验绿。
- [ ] 变异验证(注入→最窄闸见红→还原→记录;最窄闸=接口块 ui_contrast_probe 单件直跑):①三行任一行值回原图基准(如 L1 回原图均值)→该行对比度仍过但**派生校验红**(钉的就是基准一致性);②行值人为调偏 ±4→派生校验红;③派生助手参数误改(`target_l` 0.10→0.05——k 值真实漂移;注:三关现行 k 均未触钳位、钳位形态如「下钳改 1.2」亦可、**单纯去钳不红**)→校验红。还原复绿。记录表进实现报告。
- [ ] 验收步骤:T 段出口跑一次全套闸(`--code`),期望代码域全绿+渲染闸照跑(回归线:本批零视觉改动面,changed 读数应全 0.00% 档——超阈即存量异常呈报)。
### T4 产出物落位卡(≈0.25d,末卡)
- [ ] 轻闸全绿后、合并前写齐三份:`reports/iter<N>-实现报告-<完成日>.md`(三件状态+变异验证记录表+实机目检总清单〔开场行后缀观感/营地灰字观感两条〕+遗留读数义务)/`reports/iter<N>-代拍板追认单-<完成日>.md`(§10 白名单内代拍项留痕)/`reports/iter<N>-反哺点-<完成日>.md`(§6 三条各一落点——含孤儿⑥注销动作与待办清单状态推进的补执行清单)。可核查结果:三文件在 `reports/` 且 §6 每条有落点。
- [ ] 合并前置:独立验收审计(§8.3 末段)完成且报告 `reports/iter<N>-验收审计-<完成日>.md` 逐行「通过」——未通过不得合并。可核查结果:审计报告在 `reports/` 且逐行「通过」。
**估时合计 ≈1.5–2.5d**(T0 0.25+T1 0.75–1+T2 0.5–1+T3 0.25–0.5+T4 0.25)。切分预案:T1/T2/T3 三件相互独立可切波,建议按 T1→T2→T3 顺序(T2 驱动基建最重);超软盒预挂:T2 断点续玩驱动若超 0.5d,允许把路径③降为「路径②推进至选路停点后直接以既有断点快照喂 `_resume_from_menu`」的等价形态并记录,禁删断言、禁改用三选一停点形断点(契约 5)。**编排注记**:本卡估时低于 iter-plan 四查③硬下限 5 工作日,单独不成迭代——与其他卡(如同会话卡 A)同批编入;同批时 `ui_click_probe.gd` 挂段与三选一驱动基建与卡 A 协调共用、驱动参数段内自洽(§0 两处分歧点名)。
## 8. 验证闸
### 8.1 逐需求点验收清单
| # | 需求点 | 测什么(断言/行为) | 落点/判定手段 |
|---|---|---|---|
| V1 | 后缀认加算区(新开路径) | 白板 L1 零后缀(反向)+三选一拿属性值提升后下一关开场行带后缀 | theme_projection 静态半+ui_click_probe 路径①② |
| V2 | 后缀认加算区(续玩路径) | 选路停点形断点(含 bonus)续玩重建开场行带后缀 | ui_click_probe 路径③ |
| V3 | 既有口径回归 | 局外加成(ov/pct>0)带后缀的现行行为不回归 | ui_click_probe 回归断言(T2 变异步②) |
| V4 | 营地六处换色 | 六 label `get_theme_color("font_color")`==STONE_DEEP+源内零裸 STONE+既有探针在册两行零改动仍绿 | ui_click_probe 取色+token 扫描+ui_contrast_probe 回归 |
| V5 | 迷雾测点三关扩对 | 三行 ≥4.5:1+行值与运行时归一派生值一致(±2/255) | ui_contrast_probe 迷雾段+派生校验断言 |
| V6 | 注释随动 | :270 复算值换代 | 件核(T3) |
| V7 | 反哺点清单 | §6 三条每条有落点 | 件核对表(T4 出口) |
### 8.2 改动—验收对照表
> 各断言 desc 统一尾缀〔wc#〕(可 grep 定位);变异/撤销证明逐条对应 T1/T2/T3 变异步。
| 需求点 | 改动(文件:行/行为) | 验收测试(名称+文件+尾缀) | 层级 | 真实入口 | 撤销或变异证明 |
|---|---|---|---|---|---|
| wc1 开场行后缀·新开路径 | `main.gd:608-612` 条件扩两项+theme_projection 静态半+ui_click_probe 路径①② | level_open_line 尾接行为+白板反向+局内加成正向〔wc1〕 `theme_projection_test.gd` 扩段+`ui_click_probe.gd` 开场行段 | 单元+探针 | 静态直调+`_start_adventure_from_menu()`(:323)真实开局+三选一停点真实驱动(:356-366) | 撤销:回退 main 条件 hunk→路径②红、路径①仍绿(两侧各自闭合);变异:ov 项误删→回归断言红 |
| wc2 开场行后缀·续玩路径 | 同 wc1 条件改动(同 hunk)+ui_click_probe 路径③ | 选路停点形断点(含 bonus)续玩重建开场行带后缀〔wc2〕 `ui_click_probe.gd` 开场行段 | 探针 | `_resume_from_menu()`(:519)唯一消费口——生产钮已撤出(F4),此即现况唯一真实入口形态;断点=路径②推进至下一关选路停点 :982 自然落盘 | 撤销:回退同 hunk→路径③红 |
| wc3 既有口径回归 | 同 wc1 条件改动(回归面) | ov 局外加成存在→带后缀(现行行为不回归)〔wc3〕 `ui_click_probe.gd` 回归断言 | 探针 | 调试浮窗 pct>0(现役门控——能力验证两分法)或带 ov 的存档真实开局 | 变异:条件 ov 四项误删任一→本断言红 |
| wc4 营地六处换色 | `camp_overlay_view.gd:167/:417/:476/:509/:513/:525` 换色 | 六 label `get_theme_color("font_color")`==STONE_DEEP+源零裸 STONE〔wc4〕 `ui_click_probe.gd` 营地段+token 扫描断言 | 探针+静态扫描 | `open_camp_via_savesel`(:59-60)真实入口开营地 | 变异:任一处回 STONE→取色断言红+扫描红(T1②) |
| wc5 迷雾测点三行+派生校验(改写验收函数) | `game/probe/ui_contrast_probe.gd:61-64` 单行换代三行+`_norm_floor_avg` 派生+校验断言 | 三行 ≥4.5:1+行值 vs 派生值 ±2/255〔wc5〕 `ui_contrast_probe.gd` 迷雾段 | 探针 | 素材经 `UiKit.load_tex` 真实装载+生产归一函数真实调用(`BoardView._normalize_floor_luma`) | 变异:行值回原图基准→校验红;调偏 ±4→红;派生 target_l 0.10→0.05→红(T3①②③) |
| wc6 注释随动(**非行为改动**) | `board_cell_unit.gd:270` 复算值注释换代 | 注释含「归一后」口径与三关值〔wc6〕 件核 | 非行为改动 | — | 件核(T3 可核查结果) |
| wc7 反哺点清单(**非行为改动**) | T4 三份产出物(§6 三落点) | §6 三条每条有落点〔wc7〕 件核对表 | 非行为改动 | 反哺点清单对 §6 表件核 | 撤销:删一落点→T4 件核红 |
**测试方式两分法**:V1/V2/V4/V5 机检自动化走真实路径;V3 回归断言可用调试接口(现役 DebugOverlay pct 门控)做能力验证半。**用户目检项**(登记不阻塞):开场行后缀观感(「(含面板加成)」出现时机的直觉合理性)+营地灰字观感(深化后层次)——观测项写进实现报告实机目检总清单。
**闸口径**:轻闸每任务卡出口自跑;批末重闸=`tools/run_all_gates.sh` 按改动域选档(本批只碰 `game/` → `--code`)全绿才合并+改前改后读数对拍。回归措辞:里程碑步(T 段)出口跑一次全套闸;波内修复只做出红最小单元的最窄确认;新增测试先行孤立验证再并入全套。
**变异验证伴生**(新增/改写验收函数逐条注入实验,记录表进实现报告):theme_projection 扩段/ui_click_probe 三路径+回归+取色/token 扫描/探针迷雾段与派生校验均为新增或改写断言——注入已挂 T1(wc4×2+扫描正则边界)/T2(wc1 双侧+wc3)/T3(wc5×3);变异不红则改判据或如实标注拦截边界。
### 8.3 测试削弱申报(test-conventions §9.5)
允许改/删的旧断言清单及理由:`game/probe/ui_contrast_probe.gd:61-64` 迷雾**单行删除**——理由=该行属本批需求点的换代对象(单值→三行+派生校验),非规避拦截;替换判据比原判据更严(三关实测基准+一致性校验 vs 单值手填)。除此之外零删除、零放宽、零缩小扫描面、零换下层直调;探针其余行、单测族既有断言原样。
**独立验收审计(test-conventions §9.7)**:合并前由未参与实现的迭代 loop 内子代理(或用户点名会话)审计——只读本卡、实现报告对照表、diff 与测试文件,自跑最窄测试抽查,不采信「已全绿」;审计报告落 `reports/iter<N>-验收审计-<完成日>.md`(逐行「通过/缺漏/例外及依据」)。**审计未通过不得合并**(T4 合并前置)。
## 9. 异常分级
- **L1(自救)**:断言名与消息措辞;迷雾三行行名;`:270` 注释措辞;token 扫描挂段位置。
- **L2(记录继续)**:路径③断点构造细节(自然落盘 vs 既有快照喂入——超软盒预挂的等价形态);三选一候选兜底循环参数;取色断言 label 定位锚形态(文本锚 vs 结构锚);派生校验容差在 ±2/255 内微调;**手填行值与探针派生首跑失配时的行值修订**(以探针派生为准,F10/T0)。
- **L3(停机呈报)**:`run_scope.runner` 空指针(F3 前置被打破=状态机缺陷,禁加 null 软回退);三关任一行 <4.5:1(素材已换代——重算行值并呈报,禁放宽门槛);路径③续玩后无开场行可判——**先排除断点形态选错**(三选一停点形断点不发 level_started,F4——形态对了仍不可驱动才是基建缺口,呈报方案);禁删断言了事;发现六处之外第七处裸 STONE 越带位(存量呈报,不顺手扩面);任何顺带动 bonus 记账/迷雾绘制/STONE 常量的诉求。
## 10. 代拍板白名单(超清单必呈报)
1. 迷雾三行行名与注释措辞——约束:含关别(L1/L2/L3)与「归一后」口径。
2. 路径③断点态构造细节(自然落盘 vs 既有快照喂入)——约束:断点必须为选路停点形(bonus 已入账、bonus_pending/bonus_result 皆空)且经 `_resume_from_menu` 唯一消费口。
3. 三选一候选兜底循环的推进上限——约束:只选 atk/max_hp 属性值提升卡,补给/护甲/AP 卡都不选、候选无即推进。
4. 取色断言定位锚形态(文本锚 vs 结构锚)。
5. 提交切分与 worktree 分支命名。
## 11. 待裁点
**零待裁点,开工门=U0。**
三处灰色地带已按设计事实推导定值(用户可否决,随 T4 反哺点清单逐条列示呈报):
- **迷雾测点基准=归一后(真实渲染面)而非交接文档原图基准**——依据=用户 2026-10-24 裁甲时点名的「测点与真实棋盘一致」+F9 证据链(装载亮度归一是现行生产路径,原图均值≠渲染面);原图基准数(6.72/5.95/6.62)已复现但与渲染面系统性偏差约 1:1。
- **armor_class/ap 不入后缀条件**——依据=后缀注记的语义对象是开场行**显示的**两值(atk/max_hp),显示值不含 AC/AP(开场行无 AC/AP 字段——battle_narrator.gd:36 签名只收 atk/max_hp);备选「bonus 任一键>0 即带」淘汰依据=注记指向不存在的显示值,失真未消反扩。
- **迷雾三行保留手填行值+派生校验(而非纯运行时派生)**——依据=探针测点表全表为手填常量+行尾注出处的现行形态(审计可读),派生校验补一致性断言后手填值失真即红;备选「行值也纯派生」淘汰依据=测点表失去在册审计形态、与全表现行式失配。
## 12. 自审六查与 grilling 复核记录
**自审六查(2026-10-24 写卡会话)**:①规格覆盖——§1 三件改动/五项完成定义逐条挂 T 卡(条件+营地=T1、三路径=T2、迷雾=T3、产出物=T4),各指到对照表 wc1–wc7,无漏项;②步骤扫描——全部步骤一步一动作一可核查结果,函数体零给出(接口块只给条件布尔与助手签名);③类型一致性——接口块签名(`level_open_line` 第五参 bool、`_norm_floor_avg(board_type: String) -> Color`、`BoardView.TILE_FLOOR_FMT`/`_normalize_floor_luma(tex, 0.10, null)`)与 F11 实查及 T 卡/对照表引用逐字一致;④审查焦点+改动覆盖——补挂失败模式:既有口径回归(wc3+T2 变异步②)、基准回潮仍过阈(wc5 变异①派生校验拦截)、断点形态选错(F4 三态+契约 5+L3 先排形态)、白板反向被滑条残值污染(T2① 防坑句);文件结构图 6 个行为改动行+1 个非行为行全部指到对照表行;⑤篇幅比例——规格≈1 屏、任务卡≈实现面 1:1,零代码块(接口块布尔表达式属钉值非函数体);⑥落位与复用——唯一新增件 `_norm_floor_avg` 的「为什么不能复用既有/落点唯一/调用路径」已在预检节答清(复用生产静态归一函数与路径常量、聚合属探针判据面),静态半落既有在册宿主扩段的域理由已答(F12),与文件结构图互指一致。
**grilling 第一轮复核记录(2026-10-24,独立子代理对抗复核)**:零阻断;三应修(C-1 续玩「真实钮」失实→唯一消费口口径;C-2 兜底触发条件覆盖不全→「无 atk/max_hp 卡即推进」;C-3 变异③去钳必绿→target_l 漂移形态)+五建议(C-4 D2 引用对号;C-5 素材齐盘条款;C-6 PIL↔Godot 复算不同源走 L2;C-7 白板防坑句;C-8 取色读法)全折 v1.1。
**grilling 第二轮复核记录(2026-10-24 用户令「确保步骤明确、无灰色地带、无冲突」再开一轮,独立子代理对抗复核)**:判回炉一处【阻断】——**仓库换代**:v1.1 合回六分钟后 `game/smoke/` 退役合并(`16c6f136`),本卡断言宿主(smoke_all/ui_click_probe/ui_contrast_probe)路径整体失效、smoke_all 删除。随同一应修(Y-1 F4「续玩必重发」假泛化——`resume_adventure` 对 bonus_pending/bonus_result 形断点提前 return 不发 level_started,仓内仅有的两个续玩夹具先例恰是 bonus_pending 形、照抄必卡死→F4 补三态事实+契约 5/T2③/代拍板 2 把断点形态钉死为选路停点形+L3 先排形态判据)+五建议(S-1 最窄闸逐族命名→接口块;S-2 滑条归零防坑半句;S-3 与卡 A 的选卡策略/参数污染两处分歧点名→§0;S-4 派生助手补路径常量与静态调用形态→接口块/F11;S-5 §6 cell 语序订正)。v1.2 修订内容:①断言宿主重落——静态半=theme_projection_test.gd 扩段(战斗日志行协议域宿主,零清单改动)、探针=game/probe/ 新址;F4 三态分支事实+F11 补 BoardView 直呼三锚(:4/:68/:995);②契约 5 断点形态钉值+T2③ 选路停点形构造链(:982 自然落盘)+超软盒等价形态约束+L3 先排形态;③T2① 滑条显式归零防坑;④§0 两处分歧点名;⑤§6 语序订正(⑥注销与②③④销号)。复核结论:修订后零阻断零应修,零待裁点成立。
@@ -1,257 +0,0 @@
# 需求卡片:文案与禁字清扫批(玩家面旧术语与「雷」族禁字清零换新)
- 版本:**v1.2**(2026-10-24 v1.0 成文→同日 grilling 第一轮修订 v1.1→第二轮 grilling 后按仓库换代〔`game/smoke/` 退役〕重落断言宿主定稿;两轮复核结论见 §12)
- 来源:[待办清单](../待办清单.md)「现役 UI/文案两处自相冲突」(2026-10-09 登记,来源=审计发现,设计面=工程直入,状态=待写卡)+「玩家面残留禁字清扫——图例/明细/日志/字形五处」(2026-10-20 登记,来源=批次移交,设计面=工程直入,状态=待写卡)+清单外两处「特性」泄漏(2026-10-24 用户裁收进本卡)+第 13 处战斗日志禁字(第一轮 grilling 发现增补)(唯一事实源:工程直入证据指认=本卡 §3 逐条 file:line 实查;术语口径=[术语表](../design/gdd/术语表.md)「用语规范」节禁用字面行(:158)+用户 2026-10-24 会话四裁)
- 归属:`game/presentation/views/`(hero_info_panel_view / legend_overlay / status_slot_row / board_view / level_map_screen)+ `game/presentation/battle_narrator.gd` + `game/presentation/views/battle_log_view.gd`(消费面断言)+ `game/core/battle_orchestrator.gd`(u13 单行文案)+ `game/data/tables/settlement.tres` + 断言面(新单测 `game/tests/unit/presentation/player_copy_sweep_test.gd` + `game/tests/unit/core/meta_progression_forge_test.gd` 锋段 + `game/tests/run_all.gd` 清单行 + `game/probe/ui_click_probe.gd` + `game/tests/unit/presentation/ui_font_asset_test.gd`)+ 渲染闸 golden 判定动作
- 排期:未编入(卡片不预占迭代号;本卡估时 ≈1.5–2 工作日,低于编排硬下限 5 工作日,须与其他卡同批编入——归 iter-plan 段四查③)
- 开工门:U0(用户 `/iter` 发令)+ grilling 复核门过(v1.2 已过两轮,见 §12)
## 0. 前置依赖与并行性
- **第〇步核对(2026-10-24 写卡会话)**:两条来源条目均设计面=工程直入、状态=待写卡,条目现状带 file:line 证据指认(写卡会话逐处复核到行号,两处行号漂移已订正:narrator 旧记 :160 现行 :156、board_view 三点实核一致)→ **放行写卡**。
- **仓库换代注记(2026-10-24,v1.2 立此存照)**:本卡 v1.1 合回(`5fba5efd`)六分钟后,`game/smoke/` 目录退役合并入库(`16c6f136`/`40c14dc2`)——探针件迁 `game/probe/`、测量/驱动件迁 `game/sim/`、`smoke_all.gd` 删除(断言面分流迁入 `game/tests/` 各单测与 `game/tests/system_test.gd`)。v1.1 的断言宿主与先例指认随之失效,v1.2 已全部重落(§3 F8–F11)。
- 与「状态面板瘦身批」(2026-10-23,未开工):彼卡改 status_panel.gd、main._status_data()、两屏角标 tooltip——本卡 u10 与彼卡 tooltip 同落 `level_map_screen.gd`(彼 :107 角标、本 :171 加成帽,**同文件不同 hunk,零 hunk 交叠**);合并无冲突面,同批编入时按文件级 rebase 惯例处理。
- 本卡与「开场后缀营地灰字迷雾测点批」(2026-10-24 同会话卡 C)**零改动单元交叠**,可同批编入亦可分批;但**断言面共用** `game/probe/ui_click_probe.gd`——两卡 T2 都驱动三选一停点区:卡 A 只读弹层头即离(`:356-366` 先例 `press_card(0)` 无条件选首件形态),卡 C 须专选 atk/max_hp 属性值提升卡再推进,且卡 A 段的 `set_sliders(400,200)`(:320)残值会污染卡 C 白板反向(`_start_adventure` 只关窗不清值)——**同批共用时选卡策略与滑条参数须段内自洽、跨段显式复位**,归 iter-plan 编排注记。
- 「卡顶色带与格面微光两带统一」待办条已删除(commit `9f8beb35`),与本卡无关,不复提。
## 1. 目标与完成定义
**目标**:玩家面(玩家可见字符串与已开危险格字形)残留的旧分类词「特性」、渠道旧话「同池同权重同上限」、禁字「雷」族(挖雷/踩雷/雷字形)全部换代为现行术语与口径——共 **12 个代码改动单元+1 个断言面新增**;每个改动单元带断言与撤销变红证明;golden 按仓库纪律做「判定先于动作」。
**改动单元清单**(钉值表,🔴 契约 1):
| # | 位置 | 现值 | 新值 | 来源 |
|---|---|---|---|---|
| u1 | `hero_info_panel_view.gd:73`(`_feat_section` 段头) | 「特性」 | 「专长」 | 在册(条目 1②) |
| u2 | `hero_info_panel_view.gd:93`(`_curio_section` 段头) | 「特性」 | 「属性值提升」 | 在册(条目 1②;该段内容=`set_level_bonuses` 加算区) |
| u3 | `battle_narrator.gd:156`(`node_curio_header()`) | 「关卡奖励点\n从提升池抽三选一(与通关三选一同池同权重同上限):\n选择一件带走:」 | 「关卡奖励点\n从冒险牌库抽三选一(属性值提升与补给;与通关专长三选一同库分流):\n选择一件带走:」 | 在册(条目 1①) |
| u4 | `legend_overlay.gd:11`(封印行括注) | 「插错可左键直接挖开(安全格零奖励、危险格吃挖雷惩罚)」 | 「标空可左键直接挖开(安全格零奖励、危险格受挖掘惩罚)」 | 在册(条目 9①;「标空」与图例行前半「标中」成对) |
| u5 | `status_slot_row.gd:40`(`SOURCE_NAMES`) | `"mine_hit": "踩雷"` | `"mine_hit": "危险格"` | 在册(条目 9②) |
| u6 | `settlement.tres:14`(`source_label_map`) | `"mine_hit": "踩雷"` | `"mine_hit": "危险格"` | 在册(条目 9②;`battle_log_view.gd:136` 消费) |
| u7 | `board_view.gd:730`(已开危险格字形) | `glyph = "雷"` | `glyph = "危"` | 在册(条目 9③) |
| u8 | `board_view.gd:778`(牌载哨兵一) | `glyph != "雷"` | `glyph != "危"` | 在册(条目 9③ 同批连带) |
| u9 | `board_view.gd:782`(牌载哨兵二) | `glyph == "雷"` | `glyph == "危"` | 在册(条目 9③ 同批连带) |
| u10 | `level_map_screen.gd:171`(本关加成框帽) | 「特性」 | 「属性值提升」 | 清单外(2026-10-24 用户裁收) |
| u11 | `battle_narrator.gd:142`(`feat_card_text` 兜底) | `"特性\n???"` | `"专长\n???"` | 清单外(2026-10-24 用户裁收) |
| u12 | `ui_font_asset_test.gd:18`(字形在集断言) | 攻/雷/旗/封 | 增「危」入集(雷/旗/封保留) | 断言面新增(u7 前置:字体必含「危」) |
| u13 | `battle_orchestrator.gd:797`(惊巢反制效果日志行) | `"惊巢反制——挖雷惩罚减半(%d→%d)"` | `"惊巢反制——危险格挖掘惩罚减半(%d→%d)"` | 第一轮 grilling 发现增补(第 13 处;`_grant_routed` :771 mine_hit 减半分支,经 step_row 链进战斗日志玩家可见) |
**u3 新文案的三条机制事实**(措辞可 L1 微调,三事实不可缺):①与通关三选一**同一冒险牌库**(`bonus_deck` 混编余库,`adventure_runner.gd:661`);②**按渠道分流**——本节点(奖励节点)出属性值提升与补给,通关/Boss 渠道只出专长(`adventure_runner.gd:669-676` 渠道白名单过滤);③三选一选一件带走。禁再出现「同权重」「同上限」「提升池」字样(现行无独立权重旋钮、无共享上限语义——`adventure_runner.gd:656-668` 头注)。
**完成定义**(全部满足才算本批完成):
1. 钉值表 12 个代码改动单元落地(u12 为断言新增),**玩家面检索零残留**——检索口径钉值:六词(「踩雷」「挖雷」「插错」「同权重」「同上限」「提升池」)扫 `game/presentation/` 与 `game/core/` 的**玩家面字符串字面量**(排除 `#` 注释行)+ `game/data/tables/*.tres` 值域,零命中;契约 2 保留面(注释、内部常量名与注记、测试断言消息串)不入检索域;已开危险格渲染字形=「危」且两处哨兵同批一致;
2. §8.2 对照表逐行断言绿(每改动单元至少一行、撤销变红双证齐——u1/u2/u6/u11 注入与其余单元同等排程);变异验证记录表进实现报告;
3. 内部注记面(`ui_kit.gd:36` 常量名 `RED_MINE` 及其注释、`board_view.gd:776` 与 `board_cell_unit.gd` 及数据表注记里的「雷」内部语、`hero_info_panel_view.gd:67/:87` 等段注释、`术语表.md:128` 所指文档内部机制词)零改动;
4. 渲染闸 golden 判定动作完成且读数进实现报告(§4 契约 4);
5. 批末代码域闸全绿+改前改后读数对拍;三份 `reports/` 产出物写齐(T3)。
## 2. 设计事实源
| # | 出处 | 取用条款 |
|---|---|---|
| D1 | `design/gdd/术语表.md`(现行版)「用语规范」节禁用字面行(:158) | 「雷」及相关字面(雷格/踩雷)**禁止进入对外命名**——对外世界观=探索地下城/挖掘地下城;「插旗」「旗」全库禁用(u4 的「插错」属旗族遗留词干);:128 机制词(标中/踩雷等)在文档内部照常用=内部注记面保留的口径依据 |
| D2 | 用户 2026-10-24 会话四裁(本批收进的两条:清单外两处裁收+golden 走判定)+交接文档 `reports/需求澄清-工程直入九项与卡片切分-2026-10-24.md` §三已定口径 4/5 | 玩家面禁「雷」:用「危险格/安全格」、危险格字用「危」;「特性」不是现行术语,分类=专长/属性值提升/补给(u1/u2/u10/u11 的换词依据) |
| D3 | 工程直入证据指认(两条待办条目现状+写卡会话 2026-10-24 逐处实查+两轮 grilling 独立补查,本卡 §3 F1–F12) | 12 个代码改动单元的 file:line 现值 |
| D4 | `game/tests/golden/README.md`(时效判定纪律,迭代 29 T7 立) | golden「判定先于动作」:判有效=基线留位加注一次判定记录;判失效=按迭代 26 T6 先例显式重制+呈报+复闸 |
## 3. 现状事实(2026-10-24 主区实查+两轮 grilling 独立补查;开工日 T0 复核行号)
| # | 事实 | 出处 |
|---|---|---|
| F1 | HUD C 区两段同标「特性」:`_feat_section`(:69-76,段头 :73;内容=三选一专长兑付持有,`set_feat_holdings` :110 投喂)与 `_curio_section`(:89-96,段头 :93;内容=`set_level_bonuses` :132 投喂的关卡奖励属性提升=加算区)——同屏两段同标、分类语义撞车 | `game/presentation/views/hero_info_panel_view.gd:73`/:93 |
| F2 | 奖励节点三选一头部旧话:`node_curio_header()` 返回「……与通关三选一同池同权重同上限……」;现行实现=渠道白名单过滤(level_clear 只留 `kind=="relic"`=专长;reward_node 滤掉 relic 与 feat_ticket=属性值提升+补给),「同池同权重同上限」是落码前旧话 | `game/presentation/battle_narrator.gd:154-156`;`game/core/adventure_runner.gd:661`/:669-676 |
| F3 | 图例行旗族与雷族残留:「封印印记(呈现名·不能拔)——轮末自动判定标中;插错可左键直接挖开(安全格零奖励、危险格吃挖雷惩罚)」——「标中」在前(现行词),「插错」为旗族遗留(与「标中」失对) | `game/presentation/views/legend_overlay.gd:11` |
| F4 | 明细来源名「踩雷」双源并存:呈现层常量 `SOURCE_NAMES`(:40,`status_slot_row.gd:162` 消费——状态槽 meta 行来源注记)与 ConfigDB 表 `source_label_map`(`settlement.tres:14`,`battle_log_view.gd:136` `_source_label` 消费——战斗日志行尾来源括注);两处值同步靠人工、值层无校验器(`config_db_cross_validator.gd:49-53` 只校键集不校值) | `game/presentation/views/status_slot_row.gd:40`/:162;`game/data/tables/settlement.tres:14`;`game/presentation/views/battle_log_view.gd:133-136` |
| F5 | 已开危险格字形=「雷」,两处哨兵按字形串比对:`:730 glyph = "雷"`(rec kind=="mine" 分支)、`:778 glyph != "雷"`(牌载判定排除项)、`:782 glyph == "雷"`(牌载包含项)——三点一改,漏改哨兵=危险格牌载语义断链;`:731` 雷字墨=`UiKit.RED_MINE` | `game/presentation/views/board_view.gd:730-731`/:778/:782 |
| F6 | 随包字体=Fusion Pixel zh_hans(CJK 全量 ttf),既有断言只查 攻/雷/旗/封 四字形在集;「危」(U+5371 常用字)按字体覆盖面应然在集,但**未断言**——u7 落地前置 | `game/tests/unit/presentation/ui_font_asset_test.gd:14-19`;字体路径 `ui_kit.FONT_UI` |
| F7 | golden 基线四张(棋盘 L1/L2/L3+menu_boot);棋盘基线由 `board_shot_probe` 生成——驱动走 `auto_player` **novice 档**(`game/probe/board_shot_probe.gd:64`;novice 无处可推时回退盲挖边界格 `game/sim/auto_player.gd:47-50`——非「构造保证零踩雷」,基线无踩雷是种子事实);**四张基线图 PIL 像素级实查零 `RED_MINE` 雷字朱像素(2026-10-24 写卡会话全图扫描,第二轮 grilling 独立复扫吻合)=基线内无雷字是实查事实**;菜单基线同理无涉 | `game/probe/board_shot_probe.gd:64`;`game/sim/auto_player.gd:47-50`;`game/tests/golden/`(四图扫描读数 0 命中) |
| F8 | 既有断言面(smoke_all 迁移后现址):hero 面板 ⑦c 族现落 `game/tests/unit/core/adventure_feats_test.gd:715-722`(断言 `_feat_section.visible`/`_feat_list.get_child_count()`,按成员名引用,**不断言段头文案**——段头换词零牵连);禁字扫描族(30 行 display/desc 零「雷/旗」)现落同文件 `:443-445`(只扫 feats 表行,**不扫呈现层字符串**);`feat_card_text` desc 直读断言同段在位 | `game/tests/unit/core/adventure_feats_test.gd:443-445`/:715-722 |
| F9 | 直建与驱动先例现址:BoardView 直建=`game/tests/unit/presentation/theme_projection_test.gd:200`(`load(...board_view.gd).new()`→`rebuild`→读内部态——presentation 单测宿主);三选一弹层真实入口驱动=`game/probe/ui_click_probe.gd:356-366`(`curio_overlay.visible`→`press_card(0)`);开局=同探针 `:323` `main._start_adventure_from_menu()`;地图屏选路真链=同探针 `:327-331`(`level_screen.visible`→`press_candidate(0)`);图例真实入口=AP 条图例钮(`board_zone_view.gd:78` `ap_bar.legend_toggled` → `main._on_legend_toggled` :1385 开模态) | 上列 file:line |
| F10 | 战斗日志效果行禁字(第 13 处,第一轮 grilling 发现):持「锋」类订阅且 halve_pct>0 时 `battle_orchestrator._grant_routed` :771 的 mine_hit 减半分支(:793-797)发 `"惊巢反制——挖雷惩罚减半(%d→%d)"` 效果行——display_name 经 effect 行排版(`battle_log_view.gd:155-167` `name_` 直拼进正文)入战斗日志玩家可见;锋计数器断言现落 `game/tests/unit/core/meta_progression_forge_test.gd:654`(只断计数器、不断文案——零既有断言牵连);**编排器单测构造先例**=同文件 `:666/:696`(`battle_orchestrator.gd").new(_db, rng)`)——`_grant_routed(snap, polarity, source_class, cell, ri, …, halve_pct)` 实例方法签名干净,负向 mine_hit+halve_pct>0 分支可直调触达 | `game/core/battle_orchestrator.gd:771/:793-797`;`game/presentation/views/battle_log_view.gd:155-167`;`game/tests/unit/core/meta_progression_forge_test.gd:654/:666` |
| F11 | 仓库换代(2026-10-24 `16c6f136`):`game/smoke/` 退役——探针迁 `game/probe/`、驱动件迁 `game/sim/`、`smoke_all.gd` 删除、断言面分流迁 `game/tests/` 各单测与 `game/tests/system_test.gd`(宿主注记自证);**单测 runner=`game/tests/run_all.gd` 套件清单协议**(显式登记制,迁移行先例 `:91/:101`)——新单测文件必须登记清单行(`{path, expect:0}`)才入闸 | `game/tests/run_all.gd:91/:101`;`tools/run_system_test.py` 头注 |
| F12 | 改前读数基线=开工日 T0 采集(单测/探针通过数对拍面)——写卡会话不跑测(测试执行两入口铁规),本卡不预写数字 | — |
## 4. 设计契约(红线,违反 = L3 停机呈报)
🔴 **契约 1 · 钉值表逐字**:§1 钉值表 13 行逐字落地(u3 措辞 L1 微调仅限三机制事实不变前提);u5 与 u6 **必须同批同值**(「危险格」),禁只改一处留双源漂移;u7/u8/u9 **必须同批**,禁只改字形漏哨兵;u13 是核心层文件内的**玩家面日志文案串**(纯字符串替换——core 触碰面以此一行为限,零逻辑改动)。
🔴 **契约 2 · 内部注记面零改动**:`ui_kit.gd:36` 常量名 `RED_MINE` 与其注释原文、「雷/踩雷/挖雷/同池同权重/提升池」等**注释与内部语注记**(`board_view.gd:776`、`board_cell_unit.gd`、`hero_info_panel_view.gd:67/:87/:109/:131`、`battle_narrator.gd:136/:154`、`main.gd:627`、`curio_interact_controller.gd:114`、`adventure_runner.gd:509`、`adventure_table.gd:17`、数据表注记、测试断言消息串)全部保留不改名不重述;`术语表.md:128` 与 `战斗结算.md` 等文档内部机制词非本批对象。完成定义 1 的检索域**不含**这些保留面(口径见完成定义 1)。
🔴 **契约 3 · 验收闭合**:每个改动单元一行对照表行,断言+撤销变红双证——**注入排程覆盖全部 12 个单元**(含 u2/u6/u11,见 T1 变异步);「只改字符串就写已实现」不成立。撤销证明=精确回退该单元 hunk → 对应断言红 → 还原复绿。
🔴 **契约 4 · golden 判定先于动作**(对条目 9 原文「改字形须同步重制 C 档基准」的核订):本批**不预重制** golden。判定按 golden README 双态执行:**判有效**(changed 远低于 2% 阈值)=基线留位+README 判定记录节加注一行;**判失效**(changed 超阈值或换代面落在裁剪区外)=按迭代 26 T6 先例显式重制+呈报+复闸。核订依据=四张基线图像素级实查**零 `RED_MINE` 雷字朱像素**(F7——现行基线无雷字;注意 novice 取证含盲挖回退,**任何后续重制的基线可能含雷字、重制件须复检**)。**本批加严句**:若棋盘三图 changed>0(未超阈也在内)且差异像素落在棋盘裁剪区——本批按判失效处理(显式呈报后定重制),防字形差被 2% 容差吞掉;该加严口径严于 README「远低于阈值=有效」,随批列反哺点呈报用户裁是否写入 README 纪律句。禁止先动后判、禁止用「重制一下就绿了」掩盖真实视觉回归。
🔴 **契约 5 · 断言面零未申报削弱**:本批对既有断言**零删除零放宽**;新增=新单测文件 `game/tests/unit/presentation/player_copy_sweep_test.gd`(含 run_all.gd 清单登记行)+`meta_progression_forge_test.gd` 锋段扩一条+`ui_click_probe.gd` 增段+`ui_font_asset_test.gd` 增一行;⑦c 族与禁字扫描族现址原样保留(F8)。
🔴 **契约 6 · 数值与随机零触碰**:本批纯文案/字形/断言面,`data/tables` 只改 `settlement.tres` 一处文案值;禁顺带改任何数值、`RngService` 流、呈现结构、编排器逻辑(u13 仅字符串)。
## 5. 范围边界
**做**:§1 钉值表 13 行(12 代码单元+1 断言);新单测 `player_copy_sweep_test.gd`(直建断言族①–⑦+两处源 token 扫描⑧⑩)+run_all.gd 清单行;锋段扩展(u13 行名断言⑨);`game/probe/ui_click_probe.gd` 新段(C 区段头/地图加成帽/三选一头部/图例行真实入口断言);`ui_font_asset_test.gd` 增行(u12);渲染闸 golden 判定动作+README 加注;反哺点清单。
**不做**(明示去向):
- `RED_MINE` 常量改名或注释重述(契约 2,纪律保留);
- 状态槽与战斗日志双源 `SOURCE_NAMES`/`source_label_map` 的**合并收口**(值层同步现靠人工=既有形态;收口须动 `status_slot_row` 的 db 访问面,属结构改动另立——本批只保证两值同批同改+断言钉住两处);
- 呈现层字符串全量禁字扫描器(现行禁字扫描族只扫数据表行;扩呈现层扫描面属探针扩展另立,本批逐点断言已闭合);
- 迷雾/营地灰字/开场行后缀(同会话卡 C);
- 战斗日志行序、商店房截图纳屏(待办清单另条,不动)。
## 6. 关联文档同步面
> 本批是代码实现批,禁写 `design/` 整目录与根规则文件,唯一可写目录=`reports/`。「同步义务」一律执行为:逐条列进 `reports/iter<N>-反哺点-<完成日>.md`(哪个文件哪一节、改成什么、依据),用户会话裁决后归文档批落文。
| 文档 | 关联点(本批实现会改变它的哪条陈述) | 同步义务 |
|---|---|---|
| `design/gdd/ux/node-reward.md` :14 | 在册逐字引 u3 旧头部全文,且明写「文案换代归内容批,已呈报」——本卡即该内容批,u3 换代后该行过时 | 反哺点 · 列清单(①:14 行换代为新头部全文引文;依据=本卡 u3) |
| `design/gdd/systems/表现与支撑/教学引导.md` :58 | 在册逐字引 u4 旧句「(安全格零奖励、危险格吃挖雷惩罚)」原文——u4 换代后该句过时 | 反哺点 · 列清单(②:58 句换代为新句引文;依据=本卡 u4) |
| `design/art/art-bible.md` 与 `design/gdd/` 其余全树 | 无陈述被本批改变(雷字/RED_MINE/来源名/图例文案/C 区段头零注册行——2026-10-24 实查+两轮 grilling 复核补查) | 无关联文档(查讫) |
| `game/tests/golden/README.md` | 判定记录节加注一行(判有效读数);**加严口径与纪律句的收紧差**(契约 4——changed>0 且落裁剪区本批按失效)呈报用户裁是否入纪律句 | 实施本体(可写——测试资产;纪律句改写与否列反哺点③) |
| `待办清单.md` | 两条来源条目批后退役(条目「现役 UI/文案两处自相冲突」+「玩家面残留禁字清扫」);状态推进「已写卡(本卡路径)」 | 反哺点 · 列清单(④状态推进与批末退役归 batch-closure——**本写卡会话受「不改根清单」约束未执行状态推进,编排/开工前须补**) |
| `roadmap.md` | 迭代行编入笔(编入哪一迭代由 iter-plan 段发令,本卡不预占) | 反哺点 · 列清单(⑤) |
| `game/presentation/`、`game/core/battle_orchestrator.gd`(u13 单行)、`game/data/tables/settlement.tres`、`game/tests/`、`game/probe/ui_click_probe.gd` | 实施本体与断言面 | 实施本体(可写) |
## 7. 任务卡
> 估时按 Claude 工作日口径;每卡出口自跑轻闸;开工日 T0 复核本卡全部行号。回归措辞模板:里程碑步(T 段)出口跑一次全套闸;波内修复只做出红最小单元的最窄确认;新增测试先行孤立验证再并入全套。
### 卡前 · 文件结构图
| 文件 | 职责 | 行为改动 |
|---|---|---|
| `game/presentation/views/hero_info_panel_view.gd` | u1/u2 两段头换词(复用既有·修改) | 行为改动 → wa1 |
| `game/presentation/battle_narrator.gd` | u3 头部换新+u11 兜底换词(复用既有·修改) | 行为改动 → wa3/wa4 |
| `game/presentation/views/legend_overlay.gd` | u4 图例行换词(复用既有·修改) | 行为改动 → wa5 |
| `game/presentation/views/status_slot_row.gd` | u5 来源名换词(复用既有·修改) | 行为改动 → wa6 |
| `game/data/tables/settlement.tres` | u6 来源名换词(复用既有·数据件) | 行为改动 → wa7 |
| `game/presentation/views/board_view.gd` | u7/u8/u9 字形与哨兵同批换(复用既有·修改;`:776` 注释「雷/?维持牌载」可随动改「危」) | 行为改动 → wa8 |
| `game/presentation/views/level_map_screen.gd` | u10 加成框帽换词(复用既有·修改) | 行为改动 → wa2 |
| `game/core/battle_orchestrator.gd` | u13 惊巢反制效果日志行换词(复用既有·修改——纯字符串,core 触碰面以此一行为限) | 行为改动 → wa12 |
| `game/tests/unit/presentation/ui_font_asset_test.gd` | u12「危」字形在集断言增行(复用既有·增断言) | 行为改动(断言面)→ wa9 |
| `game/tests/unit/presentation/player_copy_sweep_test.gd` | **新增**:玩家面文案清扫直建断言族①–⑦+源 token 扫描⑧⑩(形制=SceneTree+test_kit,同 ui_font_asset_test.gd;新增·新文件) | 行为改动(断言面)→ wa1/wa3/wa4/wa5/wa6/wa7/wa8/wa12 静态半 |
| `game/tests/run_all.gd` | 新套件清单登记行(`player_copy_sweep_test.gd, expect=0`——迁移行 :91/:101 同式;复用既有·增行) | 行为改动(断言面接线)→ 新套件入闸 |
| `game/tests/unit/core/meta_progression_forge_test.gd` | u13 行名断言⑨(锋段 :654 族同段扩;编排器构造 :666 先例同构;复用既有·增断言) | 行为改动(断言面)→ wa12 行为半 |
| `game/probe/ui_click_probe.gd` | 真实入口断言新段(C 区段头/地图帽/三选一头/图例钮——F9 先例式;复用既有·增段) | 行为改动(断言面)→ wa1/wa2/wa4/wa5 |
| `reports/iter<N>-实现报告/代拍板追认单/反哺点`(三份,批末写) | 产出物落位(含 golden 判定读数) | 非行为改动 → wa10/wa11 |
### 接口块(全卡共用,后卡引用以此为准)
- 无新增产品码接口:全部产品码改动为既有函数内字符串/哨兵替换,签名零变化(`node_curio_header() -> String`、`feat_card_text(row: Dictionary) -> String`、`SOURCE_NAMES` 常量、`source_label_map` 表值、BoardView 字形赋值、`_grant_routed` 调用串)。
- **新单测文件形制**:`player_copy_sweep_test.gd`——`extends SceneTree`+`const Kit := preload("res://tests/unit/test_kit.gd")`+`_init()` 内逐断言+`quit(Kit.finish("<套件名>"))`(ui_font_asset_test.gd:7-28 逐行同构);头注写运行命令与「扫玩家面字符串字面量,注释/内部语不入域(契约 2)」。
- run_all.gd 清单行:`{"path": "res://tests/unit/presentation/player_copy_sweep_test.gd", "expect": 0}`(:91/:101 迁移行同式,含一句来源注)。
- 断言尾缀〔wa#〕与 §8.2 对照表互指;各断言族最窄闸(注入实验跑法):
- 单测族三件(player_copy_sweep_test / meta_progression_forge_test / ui_font_asset_test)=`D:\code\godot\Godot_v4.7.2-stable_win64_console.exe --headless --path game --script res://tests/unit/<相对路径>.gd` 单件直跑;
- 探针族(ui_click_probe)=窗口化单件直跑 `…console.exe --path game res://probe/ui_click_probe.tscn`(探针族现行调用形态)。
### 落位与可复用性预检(本批新增件逐条三问)
- **`player_copy_sweep_test.gd`(新单测文件)**——复用面:断言内容全部直建既有视图/静态函数(hero 面板=adventure_feats_test.gd:715-722 ⑦c 族同构、BoardView=theme_projection_test.gd:200 同构、battle_log/battle_narrator/status_slot_row 直建);为什么新文件而不能并入既有:迁移后断言按域分文件(run_all 清单 :91/:101 注记自证),本断言族横跨 hero/legend/status/narrator/board/battle_log 六视图的「玩家面文案」是独立域,任何单一现役文件都不是该域宿主;并入 adventure_feats_test(冒险域)或 theme_projection_test(呈现投影域)都域错位。唯一面:全仓唯一「玩家面字符串字面量」断言宿主;与禁字扫描族(feats 表行扫描,adventure_feats_test:443-445)扫域不同(表值 vs 码内字面量)、互不替代。分层与交互面:纯呈现层直建+静态源扫描,零核心依赖;源 token 扫描读文件文本(`FileAccess`),注释剥离=按行首 `#` 判(§10-4)。
- **run_all.gd 清单行**——为什么不并入其他 runner:套件清单协议是单测唯一入闸口(F11),登记即接线、无第二入口。
- **u13 断言挂 meta_progression_forge_test.gd 锋段**——为什么:锋段(:654 族)是「锋订阅+mine_hit」唯一在册驱动面、同文件 :666 有编排器构造先例;`_grant_routed`(:771)签名干净可直调(F10)——复用既有构造与驱动,新立=第二驱动实现。
- **为什么「危」字形断言放 ui_font_asset_test 而非新文件**:字体资产契约的唯一在册落点就是该测试(F6 先例同源),新增第二处=落点漂移。
- **产品码八件**——零新增函数/数据件;唯一面:钉值表 13 处各只有本卡一处落点(「踩雷」双源 F4 是既有形态、本批同批同改由契约 1 钉死);分层:u13 虽落 `game/core/` 但改动是编排器玩家面文案串(呈现语义,消费面=战斗日志),零逻辑零数值(契约 1)。
### T0 事实坐实(≈0.25d)
- [ ] 复核 §3 全部 file:line(含迁移后各断言宿主行号、ui_click_probe 挂段行号)+按完成定义 1 钉值口径跑一次玩家面六词检索(排除注释行/测试消息串/内部注记——契约 2 保留面),确认改动点全集无第 14 处——可核查结果:检索读数(命中清单与契约 2 保留面比对)或「零漂移」声明进实现报告素材。
- [ ] 改前读数基线采集(单测/探针通过数,两入口铁规下随 T1 loop 首跑取值)——可核查结果:基线读数记录在案。
### T1 钉值表落地+断言族(≈0.75–1d)
- [ ] 实装钉值表 u1–u11+u13(12 个代码编辑点;u7/u8/u9 同 commit;u5/u6 同 commit)。可核查结果:按完成定义 1 口径玩家面检索六词零命中;两源 `mine_hit` 值==「危险格」。
- [ ] 新建 `player_copy_sweep_test.gd`+run_all.gd 清单行,实装直建断言族:①直建 hero 面板(⑦c 族同构),断言 `_feat_section` 段头 text==「专长」、`_curio_section` 段头 text==「属性值提升」;②`Narrator.node_curio_header()` 含「冒险牌库」「属性值提升与补给」「同库分流」零「同权重」「同上限」「提升池」;③`feat_card_text({})`==「专长\n???」;④直建 LegendOverlay(`_init(rap_cost)` 现签名),断言封印行含「标空」「受挖掘惩罚」零「插错」「挖雷」;⑤直建 status_slot_row 喂 `{"source_class": "mine_hit"}` 效果行,断言 meta 来源注记==「危险格」;⑥`_db.settlement.source_label_map["mine_hit"]`==「危险格」(经 ConfigDB 真装载)+直建 battle_log_view 断言 mine_hit 来源行含「(危险格)」;⑦直建 BoardView(theme_projection_test.gd:200 先例式:`board_generator.generate(...)`→`rebuild(b, null)`)喂含已开危险格棋盘,断言该格 CellUnit `glyph=="危"`、`plate==true` 且 `glyph_color==UiKit.RED_MINE`;⑧源 token 扫描一:`board_view.gd` 源码零字面量 `"雷"` 命中(哨兵族 u7/u8/u9 统一钉住);⑩源 token 扫描二:`battle_orchestrator.gd` 玩家面字符串字面量零「挖雷」(u13 静态半;注释剥离同⑧式)。可核查结果:新套件绿、adventure_feats_test ⑦c/扫描族原样绿。
- [ ] 实装 u13 行为断言⑨(meta_progression_forge_test.gd 锋段扩):编排器构造(:666 先例同构)→ 连 `step_row` → 直调 `_grant_routed({"cell_type": <极性字典负性行类型>, "power": 10}, "negative", "mine_hit", Vector2i.ZERO, 0, "", "", 50)` → 断言效果行 display_name==「惊巢反制——危险格挖掘惩罚减半(10→5)」零「挖雷」。可核查结果:该断言绿。
- [ ] 变异验证(注入→最窄闸见红→`git checkout` 精确还原→记录;最窄闸=接口块所列单件直跑命令):①u1 段头回「特性」→断言①红;②u2 段头回「特性」→断言①红(两段头同一断言族分钉);③u4 回「插错」或「挖雷」→断言④红;④u5 回「踩雷」→断言⑤红;⑤u6 回「踩雷」→断言⑥表值半+行半双红;⑥u7 回「雷」→断言⑦ glyph 半红+⑧扫描红;⑦u8 单独回「雷」(u7/u9 保持「危」)→断言⑦ glyph_color 半红+⑧扫描红;⑧u9 单独回「雷」→断言⑦ plate 半红+⑧扫描红;⑨u3 回「同池同权重同上限」→断言②红;⑩u11 回「特性\n???」→断言③红;⑪u13 回「挖雷」→断言⑨红+⑩扫描红;⑫u12 断言参数临时换字体必无的扩展区字(如 U+20000)→断言行红(证明 has_char 判别力)。记录表进实现报告。
- [ ] 验收步骤:T 段出口跑一次全套闸(`tools/run_all_gates.sh` 按改动域选档,本批只碰 `game/` → `--code`),期望代码域全绿(新套件入单测档)。
### T2 真实入口断言(≈0.25–0.5d)
- [ ] 实装 `game/probe/ui_click_probe.gd` 新断言(挂既有段内):①局中(:323 开局后)hero 面板两段头文本==「专长」/「属性值提升」(C 区随战斗常驻=真实入口);②地图屏(选路态——:327-331 `level_screen.press_candidate` 选路真链)本关加成框帽 text==「属性值提升」(零加成隐藏态下先经真实选局产加成、受限再调试注值——取法=§10-3 代拍板项);③三选一停点(:356-366 驱动先例)弹层头部含「冒险牌库」「属性值提升与补给」;④AP 条图例钮(`legend_toggled` 真实信号)开层后封印行含「标空」零「挖雷」。可核查结果:探针全绿。
- [ ] 变异验证(回退 hunk→探针红→精确还原→记录;最窄闸=接口块所列探针单件直跑):①回退 u1 →断言①红;②回退 u10 →断言②红;③回退 u3 →断言③红;④回退 u4 →断言④红。记录表进实现报告。
- [ ] 验收步骤:T 段出口跑一次全套闸(`--code`),期望代码域全绿。
### T3 渲染闸 golden 判定+产出物落位卡(≈0.25d,末卡)
- [ ] golden 判定(契约 4):跑渲染闸读棋盘三图+菜单 changed 读数×4;判有效→`game/tests/golden/README.md` 判定记录节加注一行(含核订依据=四基线图 RED_MINE 零像素实查〔F7〕);加严口径触发(changed>0 且落裁剪区)或判失效→显式呈报后定重制+复闸(重制件复检雷字——F7 注)。可核查结果:读数与判定结论进实现报告。
- [ ] 轻闸全绿后、合并前写齐三份:`reports/iter<N>-实现报告-<完成日>.md`(各单元状态+变异验证记录表+golden 判定读数+实机目检总清单〔危险格「危」字观感/图例新句通顺两条〕+遗留读数义务)/`reports/iter<N>-代拍板追认单-<完成日>.md`(§10 白名单内代拍项留痕)/`reports/iter<N>-反哺点-<完成日>.md`(§6 五条各一落点)。可核查结果:三文件在 `reports/` 且 §6 每条有落点。
- [ ] 合并前置:独立验收审计(§8.3 末段)完成且报告 `reports/iter<N>-验收审计-<完成日>.md` 逐行「通过」——未通过不得合并。可核查结果:审计报告在 `reports/` 且逐行「通过」。
**估时合计 ≈1.5–2d**(T0 0.25+T1 0.75–1+T2 0.25–0.5+T3 0.25)。切分预案:T1 内文案与断言可两波,但断言钉的就是文案、建议同轮落;本卡无超软盒预挂面。**编排注记**:本卡估时低于 iter-plan 四查③硬下限 5 工作日,单独不成迭代——与其他卡(如同会话卡 C)同批编入;同批时 `ui_click_probe.gd` 挂段与三选一驱动基建与卡 C 协调共用、驱动参数段内自洽(§0)。
## 8. 验证闸
### 8.1 逐需求点验收清单
| # | 需求点 | 测什么(断言/行为) | 落点/判定手段 |
|---|---|---|---|
| V1 | 分类词换代(u1/u2/u10/u11) | 四处段头/帽/兜底文本==钉值新词;同屏分类撞车消除 | player_copy_sweep 断言①③+ui_click_probe①② |
| V2 | 渠道旧话换代(u3) | 头部含三机制事实词、零旧话词;停点弹层真链路一致 | player_copy_sweep②+ui_click_probe③ |
| V3 | 图例行换代(u4) | 封印行含「标空」「受挖掘惩罚」零「插错」「挖雷」;图例钮真实开层路径一致 | player_copy_sweep④+ui_click_probe④ |
| V4 | 来源名换代(u5/u6) | 双源值==「危险格」;状态槽 meta 与战斗日志行消费半各自断言 | player_copy_sweep⑤⑥+battle_log 直建断言 |
| V5 | 字形换代(u7/u8/u9) | 已开危险格 CellUnit glyph==「危」+plate==true+glyph_color==RED_MINE+`board_view.gd` 源零 `"雷"` 字面量 | player_copy_sweep⑦⑧ |
| V6 | 字体前置(u12) | 「危」字形在集 | ui_font_asset_test 增行 |
| V7 | 战斗日志行换代(u13) | 锋局 mine_hit 效果行 display_name==新串零「挖雷」+源零「挖雷」字面量 | 锋段⑨+player_copy_sweep⑩ |
| V8 | golden 判定 | 棋盘三图+菜单 changed 读数记录+判定结论(预期判有效加注) | 渲染闸+README 判定记录 |
| V9 | 反哺点清单 | §6 五条每条有落点 | 件核对表(T3 出口) |
### 8.2 改动—验收对照表
> 各断言 desc 统一尾缀〔wa#〕(可 grep 定位);变异/撤销证明逐条对应 T1/T2 变异步。
| 需求点 | 改动(文件:行/行为) | 验收测试(名称+文件+尾缀) | 层级 | 真实入口 | 撤销或变异证明 |
|---|---|---|---|---|---|
| wa1 C 区段头×2 | `hero_info_panel_view.gd:73/:93` 换词 | 段头文本==「专长」/「属性值提升」〔wa1〕 `player_copy_sweep_test.gd` 断言①+`ui_click_probe.gd` 局中段 | 单元+探针 | 单测=⑦c 族同构直建;探针=`_start_adventure_from_menu()`(:323)开局后 C 区随战斗常驻 | 变异:u1 回「特性」(T1①)/u2 回「特性」(T1②)→断言①红;T2① 回退 u1 →探针段红 |
| wa2 地图加成帽 | `level_map_screen.gd:171` 换词 | 帽 text==「属性值提升」〔wa2〕 `ui_click_probe.gd` 地图段(:327-331 选路真链) | 探针 | 地图屏随节点事件真实开屏→选路真链 | 撤销:回退 u10 hunk→本断言红(T2②) |
| wa3 专长卡兜底 | `battle_narrator.gd:142` 换词 | `feat_card_text({})`==「专长\n???」〔wa3〕 `player_copy_sweep_test.gd` 断言③ | 单元 | 静态函数直调(数据缺行时的真实兜底路径) | 变异:u11 回旧串(T1⑩)→本断言红 |
| wa4 奖励点头部 | `battle_narrator.gd:156` 换新 | 头部含三机制事实词零旧话词〔wa4〕 `player_copy_sweep_test.gd` 断言②+`ui_click_probe.gd` 停点段 | 单元+探针 | 静态直调+三选一停点真实开层(:356-366) | 变异:u3 回旧话(T1⑨/T2③)→双面红 |
| wa5 图例行 | `legend_overlay.gd:11` 换词 | 封印行含新词零旧词〔wa5〕 `player_copy_sweep_test.gd` 断言④+`ui_click_probe.gd` 图例段 | 单元+探针 | 直建(`_init(rap_cost)` 现签名)+AP 条图例钮真实信号开层 | 变异:u4 回旧词(T1③/T2④)→双面红 |
| wa6 状态槽来源名 | `status_slot_row.gd:40` 换词 | mine_hit 来源注记==「危险格」〔wa6〕 `player_copy_sweep_test.gd` 断言⑤ | 单元 | 直建状态槽喂真实效果行结构(`source_class` 键=生产消费面 :162 同构) | 变异:u5 回「踩雷」(T1④)→本断言红 |
| wa7 结算明细来源名 | `settlement.tres:14` 换值 | `source_label_map["mine_hit"]`==「危险格」〔wa7〕 `player_copy_sweep_test.gd` 断言⑥(经 ConfigDB 真装载)+battle_log `_format_row` 行含「(危险格)」 | 单元 | ConfigDB 表装载+`battle_log_view.gd:133-136` 生产消费路径直建 | 变异:u6 回「踩雷」(T1⑤)→表值半+行半双红 |
| wa8 危险格字形族 | `board_view.gd:730/:778/:782` 同批换 | glyph==「危」+plate==true+glyph_color==RED_MINE+`board_view.gd` 源零 `"雷"` 字面量〔wa8〕 `player_copy_sweep_test.gd` 断言⑦⑧(:200 直建先例式) | 单元+静态扫描 | 直建 BoardView `rebuild` 真实刷新路径(缺素材程序化回退态——fresh checkout 冒烟同纪律) | 变异:u7 回「雷」(T1⑥)→glyph 红;u8 单独回(T1⑦)→glyph_color 红+扫描红;u9 单独回(T1⑧)→plate 红+扫描红 |
| wa9 字体「危」在集(断言面新增) | `ui_font_asset_test.gd:18` 增行 | `has_char(危)`==true〔wa9〕 `ui_font_asset_test.gd` | 单元 | `UiKit.FONT_UI` 随包字体真实装载(测试现路径) | 变异:断言参数换 U+20000(T1⑫)→本断言红(判别力证明) |
| wa10 golden 判定(**非行为改动**——闸判定动作) | 判定记录加注(README)+读数落报告 | changed 读数×4+判定结论〔wa10〕 实现报告记录表 | 非行为改动 | 渲染闸真实取证段 | 不适用(判定动作非代码改动)——读数即凭据;判失效路径走显式重制+复闸 |
| wa11 反哺点清单(**非行为改动**) | T3 三份产出物(§6 五落点) | §6 五条每条有落点〔wa11〕 件核对表 | 非行为改动 | 反哺点清单对 §6 表件核 | 撤销:删一落点→T3 件核红 |
| wa12 惊巢反制日志行 | `battle_orchestrator.gd:797` 换词 | 直调 `_grant_routed` 采 step_row 效果行 display_name==新串零「挖雷」〔wa12〕 `meta_progression_forge_test.gd` 锋段⑨+`player_copy_sweep_test.gd` 扫描⑩ | 单元+静态扫描 | 编排器真实构造(:666 先例)+`_grant_routed`(:771)真实调用链(效果行=战斗日志 step_row 真实生产面) | 变异:u13 回「挖雷」(T1⑪)→断言⑨红+扫描⑩红 |
**测试方式两分法**:V1–V7 全部机检自动化;能力验证经真实路径(开局/停点/图例钮/效果链)驱动,无需调试接口改数。**用户目检项**(登记不阻塞):危险格「危」字观感(字形密度/可读性对「雷」的观感替代)+图例新句通顺——观测项写进实现报告实机目检总清单。
**闸口径**:轻闸每任务卡出口自跑;批末重闸=`tools/run_all_gates.sh` 按改动域选档(本批只碰 `game/` → `--code`)全绿才合并+改前改后读数对拍。回归措辞:里程碑步(T 段)出口跑一次全套闸;波内修复只做出红最小单元的最窄确认;新增测试先行孤立验证再并入全套。
**变异验证伴生**(新增/改写验收函数逐条注入实验,记录表进实现报告):新单测族+锋段扩展+ui_font_asset_test 增行+探针新段均为新增断言——十二注入已挂 T1(wa1×2/wa4/wa5/wa6/wa7/wa8×3/wa12×2/wa9)+四注入挂 T2(wa1/wa2/wa4/wa5 探针面 hunk 回退),**12 个改动单元注入全覆盖**;既有断言零改动零注入(回归线)。变异不红则改判据或如实标注拦截边界。
### 8.3 测试削弱申报(test-conventions §9.5)
**零削弱**:本批对既有断言零删除、零放宽、零缩小扫描面、零换下层直调。⑦c 族与禁字扫描族现址(`adventure_feats_test.gd:443-445/:715-722`)原样保留;`ui_font_asset_test` 既有四字断言保留、只增「危」。golden 基线**不预重制**(契约 4 判定先于动作——这不是削弱,是 README 纪律的正序执行;判失效时按先例显式重制并呈报)。
**独立验收审计(test-conventions §9.7)**:合并前由未参与实现的迭代 loop 内子代理(或用户点名会话)审计——只读本卡、实现报告对照表、diff 与测试文件,自跑最窄测试抽查,不采信「已全绿」;审计报告落 `reports/iter<N>-验收审计-<完成日>.md`(逐行「通过/缺漏/例外及依据」)。**审计未通过不得合并**(T3 合并前置)。
## 9. 异常分级
- **L1(自救)**:u3 措辞微调(三机制事实不变);断言名与消息措辞;`:776` 注释随动改「危」;断言段内挂段位置微调(同文件内)。
- **L2(记录继续)**:断言定位写法(子树扫描 vs 逐 label 直引);T2② 零加成隐藏态的注值取法(§10-3);BoardView 直建夹具的棋盘构造细节;u13 直调夹具的 cell_type 取值(极性字典任一负性行类型);源扫描的注释剥离实现细节(§10-4)。
- **L3(停机呈报)**:按完成定义 1 口径检索发现第 14 处玩家面残留(证据失真——订正本卡再续);golden 读数 changed>0(含加严口径触发——显式呈报后定);「危」字形不在字体集(u7 落不了地——呈报换字或字体方案,禁私自换字);`player_copy_sweep_test` 清单登记后 run_all 出现套件跳过(实跑数校验红);任何要求顺带改内部注记面/合并双源/动数值/动编排器逻辑的诉求;⑦c 族或禁字扫描族现址出红(非本批改动所致的存量红——呈报存量)。
## 10. 代拍板白名单(超清单必呈报)
1. u3 最终措辞——约束:三机制事实词齐(同库/渠道分流/属性值提升与补给)、「同权重」「同上限」「提升池」零残留。
2. 断言名与消息措辞、断言定位写法。
3. T2② 地图帽断言的加成注值取法(真实选局 vs 调试注值——倾向真实选局,受限再调试)。
4. 源扫描的注释剥离实现写法(行首 `#` 判定式 vs 正则前剥离)。
5. 提交切分与 worktree 分支命名。
## 11. 待裁点
**零待裁点,开工门=U0。**
三处灰色地带已按设计事实推导定值(用户可否决,随 T3 反哺点清单逐条列示呈报):
- **u4 新句用「标空」与「受挖掘惩罚」**——依据=交接文档 §4.1 钉值(「标空」与行内现行「标中」成对:标中=封印落危险格、标空=封印落安全格;「受挖掘惩罚」替换「吃挖雷惩罚」消雷字);备选「封错」淘汰依据=与「标中」动词失对。
- **golden 不预重制、改为判定先于动作+本批加严句**——依据=golden README 纪律+F7 像素实查(四张基线图零 RED_MINE 雷字朱像素,字形改动动不了基线像素);加严句(changed>0 且落裁剪区=本批按失效)严于 README 阈值口径,随反哺点呈报用户裁是否入纪律句;备选「按条目 9 原文直接重制」淘汰依据=违 README「不得顺手重制」,且重制会把「基线无涉」这一事实证据抹掉。**此为对登记条目原文的核订,呈报用户确认。**
- **双源(u5/u6)同批同改不合并**——依据=合并收口是结构改动(status_slot_row 需引入 db 访问面)超本批文案边界;备选「同批顺手收口」淘汰依据=范围蔓延+断言面骤增。
## 12. 自审六查与 grilling 复核记录
**自审六查(2026-10-24 写卡会话)**:①规格覆盖——§1 钉值表 13 单元逐条挂 T 卡(u1–u13=T1、真实入口=T2、golden=T3),各指到对照表 wa1–wa12,无漏项;②步骤扫描——全部步骤一步一动作一可核查结果,零函数体;③类型一致性——引用的既有签名(`node_curio_header()/feat_card_text(row)/_init(rap_cost)/_grant_routed(snap,…,halve_pct)`)与 F1–F11 实查逐字一致;④审查焦点+改动覆盖——补挂失败模式:哨兵漏改(wa8 三半断言+token 扫描)、双源漂移(wa6/wa7 双断言)、字体缺字前置(wa9)、旧话残留第三态(断言②零「提升池」词)、核心层效果行禁字(wa12 行为+扫描双半)、套件登记漏接(L3 实跑数校验兜底);文件结构图 13 个行为改动行全部指到对照表行;⑤篇幅比例——规格≈1 屏、任务卡≈实现面 1:1,零代码块;⑥落位与复用——唯一新增文件 `player_copy_sweep_test.gd` 的「为什么不能并入既有/落点唯一/分层」已在预检节答清(迁移后断言按域分文件、玩家面文案是独立域),与文件结构图互指一致。
**grilling 第一轮复核记录(2026-10-24,独立子代理对抗复核)**:判回炉一处【阻断】——钉值表漏第 13 处玩家面禁字(`battle_orchestrator.gd:797` 惊巢反制日志行经 step_row 链玩家可见且可产);随同五应修(A-2 golden 证据链张冠李戴→改挂像素实查;A-3 契约 4 补中间态;A-4 §6 漏 node-reward/教学引导两反哺点;A-5 u8 变异推演不红→wa8 升三半+token 扫描;A-6 §0 交叠措辞失实)+一建议。v1.1 全部折入。
**grilling 第二轮复核记录(2026-10-24 用户令「确保步骤明确、无灰色地带、无冲突」再开一轮,独立子代理对抗复核)**:判回炉一处【阻断】——**仓库换代**:v1.1 合回六分钟后 `game/smoke/` 退役合并(`16c6f136`)——探针迁 `game/probe/`、驱动件迁 `game/sim/`、`smoke_all.gd` 删除,本卡断言宿主与全部先例指认失效(⑦c 族/扫描族/BoardView 直建/锋段现址均已分流迁 `game/tests/`)。随同四应修(S1 玩家面全量检索与契约 2 保留面自相矛盾→检索口径钉值+保留面出域;S2 u2/u6/u11 缺注入→T1 十二注入全覆盖;S3 契约 4 与 golden README 同输入不同答案→对齐 README 双态+加严句列反哺点;S4 最窄闸未命名→接口块逐族命名)+四建议(J1 瘦身批同文件不同 hunk 表述、J2 T2② 指向 §10-3+地图段先例补引、J3 裁剪区外第三态收口〔随 S3 并入契约 4 双态表述〕、J4 :663→:661 行号订正与保留面枚举扩充)。v1.2 修订内容:①断言宿主全面重落——新单测 `player_copy_sweep_test.gd`(形制同 ui_font_asset_test+run_all 清单登记行)、锋段现址 `meta_progression_forge_test.gd`(编排器构造 :666 先例+`_grant_routed` :771 直调)、探针路径 `game/probe/`;F8/F9/F10 先例全部改指现址;②检索口径钉值(完成定义 1/T0/契约 2 三处同口径);③T1 变异步扩为十二注入(12 单元全覆盖);④契约 4 对齐 README 双态+加严句+反哺点③;⑤接口块逐族命名最窄闸。复核结论:修订后零阻断零应修,零待裁点成立。
@@ -1,222 +0,0 @@
# 需求卡片:状态面板瘦身批(局内面板去跨关解锁内容、只留本局信息)
- 版本:**v1.1**(2026-10-23 grilling 复核后定稿;自审六查+grilling 复核结论见 §12)
- 来源:[待办清单](../待办清单.md)「状态面板瘦身——局内面板去跨关解锁内容、只留本局信息」(2026-10-16 登记,来源=playnote,设计面=工程直入,状态=待写卡)(唯一事实源:[08-Alpha版本标准](../design/gdd/08-Alpha版本标准.md) v1.14「三 · 界面」状态面板行+工程直入证据=`game/presentation/views/status_panel.gd` 实查 file:line,见 §2)
- 归属:`game/presentation/views/status_panel.gd`(呈现层承载)+ `game/presentation/main.gd`(快照投影)+ 两屏入口角标 tooltip(`board_zone_view.gd`/`level_map_screen.gd`)
- 排期:未编入(卡片不预占迭代号;本卡估时 ≈1–2 工作日,低于编排硬下限 5 工作日,须与其他卡同批编入——归 iter-plan 段四查③)
- 开工门:U0(用户 `/iter` 发令)+ grilling 复核门过(零待裁点,见 §11)
## 0. 前置依赖与并行性
- **第〇步核对(2026-10-23 写卡会话)**:工程直入条目,条目现状带代码级证据指认(`status_panel.gd` 跨局镜像三段实查,本卡 §3 F1 复核扩充到行号);范围=用户原话五件套、条目自记零待裁点;目标态权威已落文(08 状态面板行,用户 2026-10-16 令「不需要讨论的写进 08」)→ **放行写卡**。
- 本卡**不依赖任何在途批**:与「营地五界面窗口化批」无关联(该批裁五功能页的窗口形态,本批面板形态不动——modal 直开现状维持);与「棋盘战斗键盘/手柄输入」批无关联(Esc 通道归彼批,本批零改动);与「现役 UI/文案两处自相冲突」条目无关联(HUD C 区两段同标「特性」是彼条的事,本批不碰 C 区)。
- 排期提示(非本卡义务):跨局解锁概览的营地/生涯承载**现役已在位**(营地柜台+生涯页),本批退役面板半边后零承载缺口。
## 1. 目标与完成定义
**目标**:局内状态面板从「跨局进度镜像」(钥石余额+秘宝匣解锁态 12 行概览+天赋树已购概览)换代为「本局信息面板」——只留钥石总量+本局四件:带的秘宝、已获专长、当前属性、现有 GP;两段跨关解锁概览整段退役;面板提示行与两屏入口角标 tooltip 文案随新定位换代。
**相对现状,改了什么**:
1. 面板内容换代:删「道具工坊 · 解锁态」段(12 行三列解锁态)与「天赋树 · 已购概览」段(聚合文案);新增「本局状态」行(生命 当前/上限 · 攻击 · 护甲 AC · GP)+「带的秘宝」段(逐件名,已用件带尾缀)+「已获专长」段(逐件「件名 ×N」行串);
2. 快照投影换代:`main._status_data()` 四键(balance/workshop/tree/fork_groups)→ 八键(balance/hero_hp/max_hp/atk/ac/gp/curios/feats),秘宝与专长全部复用现役投影函数零第二实现(契约 3);
3. 文案三处换代:面板提示行+战斗屏角标 tooltip+地图屏角标 tooltip(「永久强化进度」语义随退役失效);标题「状态」与「继续」钮不变;
4. 断言面随动:冒烟隔离档投影一致性段换代(工坊/天赋树断言族退役——削弱申报见 §8.3)+`ui_click_probe` 真实入口补三断言(零旧段+属性行全值对 runner 现值+`_status_data()` 直调投影值对拍)——`main` 侧投影代码的值层由此进断言回路(grilling 回炉订正:v1.0 仅「零旧段」时投影值层零拦截)。
**完成定义**(全部满足才算本批完成):
1. 面板五件内容在位且投影一致(冒烟隔离档断言绿:余额徽/属性行全值/秘宝行受理序与已用尾缀/专长行串/空态句×2);
2. 跨关概览退役零残留:面板子树零「道具工坊」「天赋树」文案、`_status_data()` 零 workshop/tree/fork_groups 三旧键、真实入口(角标开层)同判据绿;
3. 文案三处换代在位且标题「状态」/「继续」钮定位锚不变(四探针状态面板相关段零红);
4. 只读契约与零动效契约保持全绿(`ui_struct_probe` ⑧:信号连接数=2、源码零 tween/AnimationPlayer——非新增断言,回归线);
5. 撤销证明记录进实现报告;批末重闸按改动域选档全绿+改前改后读数对拍;三份 `reports/` 产出物写齐(T2)。
## 2. 设计事实源
| # | 出处 | 取用条款 |
|---|---|---|
| D1 | `design/gdd/08-Alpha版本标准.md` v1.14(2026-10-23 现行)「三 · 界面」状态面板行(:115) | 目标态权威:瘦身范围=「去跨关解锁内容〔秘宝匣解锁态 12 行概览/天赋树已购概览〕、只留本局五件〔带的秘宝/已获专长/当前属性/现有 GP/钥石总量〕」;出口判据=「只显示本局五件、两段跨关解锁退役、文案更新、界面探针或断言覆盖、用户目检通过」——用户 2026-10-16 令「不需要讨论的写进 08」落文(本卡完成定义与之一一对应) |
| D2 | 待办清单条目(工程直入证据,2026-10-23 复核扩充到行号) | 现行实态=跨局进度镜像:钥石余额徽+「道具工坊 · 解锁态」段+「天赋树 · 已购概览」段(`status_panel.gd:9/:22/:30/:34/:37`);范围=用户原话五件套、零待裁点 |
闭合凭据一致性:D2 与待办清单条目现状内的实查证据一致(写卡会话复核到行号);D1 为目标态权威(与 D2 同向——用户 2026-10-16 同时发两令:范围五件套+落文 08)。
## 3. 现状事实(2026-10-23 主区实查;开工日 T0 复核行号)
| # | 事实 | 出处 |
|---|---|---|
| F1 | 面板构成=标题「状态」+提示行「查看本局钥石与永久强化进度(只读——购买请回营地)」+钥石余额徽+「道具工坊 · 解锁态」段(`_rebuild_workshop` 秘宝匣 12 行三列解锁态:件名/钥石价或条件进度/已解锁态)+「天赋树 · 已购概览」段(`_rebuild_tree` 单条聚合文案,零已购=空态句)+「继续」钮;成员 `_workshop_holder`/`_tree_label` | `game/presentation/views/status_panel.gd:19`/:22/:30/:34/:37/:46-49/:68-72(open_status)/:78-109/:113-132 |
| F2 | 快照投影四键:`_status_data()` 返回 balance=`meta.keystone_balance()`+workshop=`meta.treasure_shop_status()`+tree=`meta.tree_camp_rows()`+fork_groups=`meta.tree_fork_groups()`;开层口=`_open_status_panel()`→`open_status(_status_data())`;头注锁定「快照随开随建、单次开层生命周期、零写调用」口径 | `game/presentation/main.gd:1070-1076`/:1079-1081 |
| F3 | 入口与在役前置:战斗屏角标可见判据=`run_scope.level_active and not map_on`;地图屏角标=随屏;而地图屏仅经 `open_choices(run_scope.pending_candidates, run_scope.runner)` 开启 ⇒ **两入口任一可开层时 `run_scope.runner` 恒在役** | `main.gd:1196-1197`(可见性);:695/:1006(open_choices 两调用点) |
| F4 | 本局五件数据源(全部现役访问器,零新增记账面):钥石总量=`meta.keystone_balance()`(:1071 现用);当前属性=`runner.effective_max_hp()`/`effective_atk()`/`effective_ac()`+当前生命=`runner.ledger["hero_hp"]`;现有 GP=`runner.ledger["gp"]`;带的秘宝=`_treasure_ui.inventory_projection()`(行含 name/used,主区持有 `_treasure_ui`);已获专长=`HudPresenter.feat_holdings_lines(db, runner.feats_held())`(static,行形态=逐件「件名 ×N」,空持有=空数组) | `adventure_runner.gd:28`(ledger 字段)/:295(effective_max_hp)/:453(feats_held);`hud_presenter.gd:91-102`(feat_holdings_lines)/:150-151(atk/AC 先例);`treasure_interact_controller.gd:102-127`(inventory_projection);`main.gd:101`(_treasure_ui 声明)/:240(实例化);:694/:1005(feat_holdings_lines 现用先例) |
| F5 | 秘宝投影停点安全:`inventory_projection()` 的 usable 预判回调在 settlement 为空时是空 Callable,`query_inventory → _usable_now` 对 invalid Callable 回退 true ⇒ 停点(地图屏)与战斗屏两上下文复用均安全 | `treasure_items.gd:73-75`;`treasure_interact_controller.gd:108-111`(cb 装配) |
| F6 | 既有断言面(改前基线):①冒烟隔离档 `_status_panel_projection`——余额徽读数+工坊 12 行投影逐项+天赋树聚合文案三断言族(夹具=手拼数据字典喂 `open_status`,同构口径、不依赖 runner);②`ui_struct_probe` ⑧ 只读契约(信号连接数=2,白名单=视图 `_emit_closed`/组合根 `_on_status_closed`)+零动效契约(子树零 AnimationPlayer+源码零 `create_tween`/`UiKit.motion` token);③`ui_click_probe`(角标开层+`_balance_badge` 读数+继续钮关层);④`ui_input_probe`(Esc 通道+继续钮);⑤`shot_probe`(标题「状态」几何+截图+继续钮开关) | `smoke_all.gd:5727-5779`;`ui_struct_probe.gd:295-323`/:326-340;`ui_click_probe.gd:593-621`;`ui_input_probe.gd:525-542`;`shot_probe.gd:172-188` |
| F7 | 渲染闸零 golden 锁:`shot_checker` 对 status 屏只跑屏级骨架(存在/尺寸/灰度 std≥8/唯一色数≥64),无像素基线 ⇒ 面板内容换代**不连带 golden 基线重制** | `tools/shot_checker.py:130-140`(A 屏级骨架);`tools/render_gate.sh:65`(status 屏入参) |
| F8 | 旧文案引用点全集=三处:面板提示行(`status_panel.gd:22`)+两角标 tooltip「查看钥石与永久强化进度(只读)」(`board_zone_view.gd:58`、`level_map_screen.gd:107`)——「永久强化进度」半句随两段退役失效;全仓无第三处(2026-10-23 实查) | 上列三 file:line |
| F9 | 改前读数基线=开工日 T0 采集(冒烟/单测通过数对拍面)——写卡会话不跑测(测试执行两入口铁规),本卡不预写数字 | — |
## 4. 设计契约(红线,违反 = L3 停机呈报)
🔴 **契约 1 · 五件内容口径**:面板内容=钥石总量徽+「本局状态」行(`生命 %d/%d · 攻击 %d · 护甲 AC %d · GP %d`——属性四值与 GP 合一行呈现)+「带的秘宝」段+「已获专长」段,四块 UI 承载五件信息;除此外零新增段。五件取数源=F4 访问器族——属性行取 `effective_max_hp()`/`effective_atk()`/`effective_ac()`/`ledger["hero_hp"]`/`ledger["gp"]`(ledger 直取下标,键缺失=致命,禁 `.get` 缺省值留门),秘宝取 `_treasure_ui.inventory_projection()`,专长取 `HudPresenter.feat_holdings_lines()`;禁第二份投影/拼装实现。
🔴 **契约 2 · 跨关概览退役零残留**:`status_panel.gd` 内秘宝匣解锁态段与天赋树已购概览段**整段退役**(段头+行构建函数+数据键三层面清零):`status_panel.gd` 的 `_rebuild_workshop`/`_rebuild_tree` 与 `_workshop_holder`/`_tree_label` 删除;`_status_data()` 不再喂 workshop/tree/fork_groups 三键。`meta.treasure_shop_status()`/`tree_camp_rows()`/`tree_fork_groups()` 三投影函数本体**不动**(营地柜台仍在役消费——退役仅面板半边);`camp_overlay_view.gd` 的同名 `_rebuild_workshop`(:448)/`_rebuild_tree`(:222)/`_workshop_holder`(:32)为营地在役件,与本章零关联零改动。
🔴 **契约 3 · 只读快照语义不破**:快照随开随建、单次开层生命周期、跨开层零持有、零写调用(`open_status` 重建各行现状口径沿袭);新增 UI 全部经 UiKit 工厂产出、禁裸色值(`status_panel.gd:3` 头注纪律);`ui_struct_probe` ⑧ 两契约(信号连接数=2+零动效 token 扫描)保持全绿是本批回归线——面板仍只有「继续」钮一条 pressed 连接+`closed` 外发一条。
🔴 **契约 4 · 文案钉值**:面板提示行→「查看本局冒险进度(只读)」;战斗屏与地图屏角标 tooltip→「查看本局冒险进度(只读)」;标题「状态」与「继续」钮文案**不变**(F6 四探针定位锚);段头=「本局状态」「带的秘宝」「已获专长」(词干=用户原话);空态句=「未携带秘宝」「未获专长」(现行天赋树空态句同形制,`status_panel.gd:130` 先例);已用秘宝件行尾缀=「(已用)」。
🔴 **契约 5 · runner 在役前置零软回退**:两入口开启时 `run_scope.runner` 恒在役(F3 证据链);`_status_data()` 直读 `run_scope.runner`,**禁加 null 守卫软回退**(fail-fast 红线——若出现 runner 空指针属状态机缺陷,按 L3 呈报,禁以零值显示掩盖)。
🔴 **契约 6 · 数值单一事实源**:面板显示值全部实时读访问器现值(F4),禁数值字面量(文案固定串除外);生命上限走 `effective_max_hp()`(生效上限口径——含调试浮窗 pct,与战斗内同源,`adventure_runner.gd:123/:293-296`)。
## 5. 范围边界
**做**:`status_panel.gd` 内容换代(两段退役+三段新装+提示行);`main._status_data()` 八键投影换代;两角标 tooltip 换代;冒烟隔离档断言面换代(含 §8.3 削弱申报);`ui_click_probe` 真实入口补「零旧段+GP 读数」断言;反哺点清单。
**不做**(明示去向):
- 营地侧/生涯侧任何承载面改动——跨局解锁概览的营地柜台与生涯页承载现役在位,本批零改动;
- `meta.treasure_shop_status()`/`tree_camp_rows()`/`tree_fork_groups()` 三投影函数本体(契约 2,营地仍在役);
- HUD C 区(`hero_info_panel_view.gd`)——含其在册的 `_curio_section`/`_feat_section` 同标「特性」文案冲突(待办清单另条,本批不碰);
- 面板开合机制/模态栈/角标置灰逻辑/键盘 Esc 通道(零改动;Esc 通道归键盘批);
- 面板视觉规格(窗宽 560/石板皮/零动效维持现状——呈现形态换代归「营地五界面窗口化批」口径,彼批与本批无关联,见 §0);
- HUD C 区「特性」措辞是否随本批统一为「专长」——归文案冲突条目(待办清单在册),本批只保证自家新段头用规范名「专长」;
- 体验验证清单 ⑳ 已核销历史条目的追溯改写与否——列反哺点由用户裁(§6 ④)。
## 6. 关联文档同步面
> 本批是代码实现批,禁写 `design/` 整目录与根规则文件,唯一可写目录=`reports/`。下表「同步义务」一律执行为:逐条列进 `reports/iter<N>-反哺点-<完成日>.md`(哪个文件哪一节、改成什么、依据),用户会话裁决后归文档批落文。
| 文档 | 关联点(本批实现会改变它的哪条陈述) | 同步义务 |
|---|---|---|
| `design/gdd/systems/跨局循环/元进度.md` | 「### 解锁界面:双入口框架」节(:104-106)「局内状态面板……也可查看钥石余额与**已解锁清单**(只读)」——「已解锁清单」半句随两段退役失效 | 反哺点 · 列清单(①该句换代为「钥石余额与本局冒险信息」口径;依据=本卡契约 1/2) |
| `design/gdd/systems/跨局循环/生涯.md` | :30「冒险进行中玩家只看状态面板(……局内只读查看钥石与**解锁进度**)」括注;:73 分工表行「局内只读查看这一局进行中的钥石与**解锁进度**」——「解锁进度」半句同失效 | 反哺点 · 列清单(②两处括注/表行换代;依据=契约 1/2) |
| `design/gdd/08-Alpha版本标准.md` | :115 状态面板行现标「部分在役(在役半=面板本体……未结半=2026-10-16 用户令瘦身……)」——批完成后未结半销号 | 反哺点 · 列清单(③「部分在役」→「在役」+出口判据逐项销号记载;依据=本卡完成定义) |
| `体验验证清单.md` | ⑳「营地统一四柜台目检」(已核销 2026-10-14)连带面句「状态面板属性锻造段已消失(钥石+工坊+天赋树概览)」——历史现状句随换代过时 | 反哺点 · 列清单(④追溯改写与否由用户裁——已核销历史记录,改否只影响史实描述精度) |
| `待办清单.md` | 本卡登记条状态推进「已写卡」(**本会话写卡时已执行**);实现批完成后条目整条退役 | 反哺点 · 列清单(⑤批后退役归 batch-closure) |
| `roadmap.md` | 迭代行编入笔(编入哪一迭代由 iter-plan 段发令,本卡不预占) | 反哺点 · 列清单(⑥) |
| `game/presentation/views/status_panel.gd`、`game/presentation/main.gd`、`game/presentation/views/board_zone_view.gd`、`game/presentation/views/level_map_screen.gd` | 换代本体 | 实施本体(可写) |
| `game/smoke/smoke_all.gd`、`game/smoke/ui_click_probe.gd` | 断言面随动(§8) | 实施本体(可写) |
## 7. 任务卡
> 估时按 Claude 工作日口径;每卡出口自跑轻闸;开工日 T0 复核本卡全部行号。回归措辞模板:里程碑步(T 段)出口跑一次全套闸;波内修复只做出红最小单元的最窄确认;新增测试先行孤立验证再并入全套。
### 卡前 · 文件结构图
| 文件 | 职责 | 行为改动 |
|---|---|---|
| `game/presentation/views/status_panel.gd` | 面板内容换代:两段整段退役+三段新装+提示行文案(复用既有·修改) | 行为改动 → 对照表 sv1/sv2/sv3/sv5/sv8 |
| `game/presentation/main.gd` | `_status_data()` 四键→八键投影换代(复用既有·修改) | 行为改动 → 对照表 sv1/sv2/sv3/sv7 |
| `game/presentation/views/board_zone_view.gd` | 角标 tooltip 一句换代(复用既有·修改) | 行为改动 → 对照表 sv9 |
| `game/presentation/views/level_map_screen.gd` | 角标 tooltip 一句换代(复用既有·修改) | 行为改动 → 对照表 sv9 |
| `game/smoke/smoke_all.gd` | `_status_panel_projection` 断言面换代(复用既有·改写验收函数——验收闭合对照义务) | 行为改动(断言面)→ 对照表 sv1–sv5/sv8 |
| `game/smoke/ui_click_probe.gd` | 真实入口补三断言:零旧段+属性行全值+`_status_data()` 直调对拍(复用既有·增步) | 行为改动(断言面)→ 对照表 sv6/sv7 |
| `reports/iter<N>-实现报告/代拍板追认单/反哺点`(三份,批末写) | 产出物落位 | 非行为改动 → 对照表 sv10 |
本批**零新增文件、零新增数据件**;新增成员仅 `_attrs_label`/`_curios_label`/`_feats_label` 三个面板内 Label(落位唯一性见 §7 前置「落位与可复用性预检」)。
### 接口块(全卡共用,后卡引用以此为准)
- **`main._status_data() -> Dictionary`** 八键契约:`balance:int`(=`meta.keystone_balance()`)/`hero_hp:int`(=`int(run_scope.runner.ledger["hero_hp"])` 直取下标)/`max_hp:int`(=`run_scope.runner.effective_max_hp()`)/`atk:int`(=`run_scope.runner.effective_atk()`)/`ac:int`(=`run_scope.runner.effective_ac()`)/`gp:int`(=`int(run_scope.runner.ledger["gp"])` 直取下标)/`curios:Array`(行=`{String name, bool used}`,由 `_treasure_ui.inventory_projection()` 逐行映射 `name`/`used` 两键,序=库存受理序)/`feats:Array[String]`(=`HudPresenter.feat_holdings_lines(db, run_scope.runner.feats_held())` 现成行)。
- **`StatusPanel.open_status(data: Dictionary) -> void`** 签名不变(消费键换代为八键)。
- **面板成员替换**:删 `_workshop_holder`/`_tree_label` 与 `_rebuild_workshop()`/`_rebuild_tree()`;增 `_attrs_label`/`_curios_label`/`_feats_label` 三个 `UiKit.label`(FS_HINT 档、autowrap 同 `_tree_label` 现制,`status_panel.gd:38-40`);段头沿 `_section_head()`(FS_BODY 档)现状复用。
### 落位与可复用性预检(本批新增件逐条三问)
- **`_attrs_label`/`_curios_label`/`_feats_label`(面板内三个 Label 成员)**——复用面:面板内既有 `_tree_label` 同形制(单条聚合文案+autowrap),新三件沿其形制、不另造行构建器;为什么不复用 `_tree_label` 本身:它是「天赋树已购概览」段的载体,随段整段退役(契约 2),名字与语义均已失效。唯一面:属性行/秘宝行/专长行在全仓各只有面板这一处消费(F4 投影函数是数据面唯一落点,本卡不加第二份)。分层与交互面:面板零核心依赖——数据全部由组合根 `_status_data()` 快照喂入(既有开层生命周期口径),面板不自读 runner/meta,只读契约由 `ui_struct_probe` ⑧ 巡检兜底。
- **秘宝投影复用 `_treasure_ui.inventory_projection()`**——为什么不自拼:`runner.treasure_inventory.query_inventory()` 的行是内部记录(item_id),件名换算(`db.treasure_item_row().display_name`)与受理序语义已在 `inventory_projection()` 收口(C 区四槽同源);自拼=第二份投影实现,违落点唯一。停点安全性已核(F5)。
- **专长行复用 `HudPresenter.feat_holdings_lines()`**——为什么不自拼:「件名 ×N」聚合计数逻辑已在该 static 函数收口(战斗 C 区与关卡选择页两处现役共用,`hud_presenter.gd:85-88` 头注),自拼=第二份计数实现。
- **`db` 访问**:`_status_data()` 内 `feat_holdings_lines(db, …)` 的 `db` 用组合根既有成员 `db`(`main.gd` 现役 ConfigDB 门面),零新访问器。
### T0 事实坐实(≈0.25–0.5d)
- [ ] 复核 §3 全部 file:line 与 F8 旧文案引用点全集(全仓检索「道具工坊 · 解锁态」「已购概览」「永久强化进度」仍零第三处)——可核查结果:订正记录或「零漂移」声明进实现报告素材。
- [ ] 改前读数基线采集(冒烟/单测通过数,两入口铁规下随 T1 loop 首跑取值)——可核查结果:基线读数记录在案。
### T1 面板与投影换代(≈0.5–1d)
- [ ] 实装 `main._status_data()` 八键投影(`main.gd:1070-1076` 重写;接口块八键逐字;curios 由 `_treasure_ui.inventory_projection()` 映射;feats 走 `HudPresenter.feat_holdings_lines(db, run_scope.runner.feats_held())`)。可核查结果:八键在位、workshop/tree/fork_groups 三旧键零残留。
- [ ] 实装 `status_panel.gd` 内容换代(:22 提示行文案;:33-40 两段定义删——`HSeparator` 两条(:33/:42)保留作分区线;:78-132 `_rebuild_workshop`/`_rebuild_tree` 与两成员删;`_init` 增三段头+三 Label;`open_status` 改喂八键——属性行串按契约 4 钉值格式、秘宝行=「件名(已用)」受理序 join「 · 」、专长行=现成行 join「 · 」、空态句两则)。可核查结果:面板子树零「道具工坊」「天赋树」文案;UiKit 工厂产出(零裸色值)。
- [ ] 实装两角标 tooltip 换代(`board_zone_view.gd:58`、`level_map_screen.gd:107` →「查看本局冒险进度(只读)」)。可核查结果:全仓「永久强化进度」检索零命中。
- [ ] 实装冒烟 `_status_panel_projection` 换代(`smoke_all.gd:5727-5779` 重写:夹具改八键手拼〔同构口径不变、不依赖 runner〕;断言=余额徽读数+属性行全值+秘宝行含已用尾缀+专长行串+空态句×2+面板子树零旧段文案;原工坊 12 行断言族与天赋树聚合断言按 §8.3 申报删除)。可核查结果:该段绿且含 V1/V2 全部断言。
- [ ] 验收步骤:T 段出口跑一次全套闸(`tools/run_all_gates.sh` 按改动域选档,本批只碰 `game/` → `--code`),期望代码域全绿、`ui_struct_probe` ⑧ 两契约与 click/input/shot 三探针状态面板段零红。
- [ ] 撤销证明(撤销改动→最窄闸见红→`git checkout` 精确还原→记录):①回退面板 gp 读数投影 hunk → 期望属性行断言红;②回退「(已用)」尾缀逻辑 hunk → 期望秘宝行断言红;③回退旧段退役 hunk(旧段头复现)→ 期望零旧段断言红。记录进实现报告。
### T2 真实入口断言+产出物落位卡(≈0.25–0.5d,末卡)
- [ ] 实装 `ui_click_probe` 状态面板段补三断言(`ui_click_probe.gd:593-621` 段内,角标开层后):①面板子树零「道具工坊」「天赋树」文案;②属性行全串==契约 4 格式 % `run_scope.runner` 五现值(hero_hp/`effective_max_hp()`/`effective_atk()`/`effective_ac()`/gp——`main` 侧投影值层的真链路断言);③`main._status_data()` 直调对拍——返回键集恰为接口块八键(sv7 承载)+curios 逐行 {name, used} 对拍独立oracle(`runner.treasure_inventory.query_inventory(Callable())` 行集 × `db.treasure_item_row().display_name`)+feats 对拍 `HudPresenter.feat_holdings_lines(db, runner.feats_held())`。可核查结果:探针该段绿。
- [ ] 验收步骤:T 段出口跑一次全套闸(`--code`),期望代码域全绿。
- [ ] 撤销证明(撤销改动→最窄闸见红→`git checkout` 精确还原→记录):①回退面板 workshop 段退役 hunk(旧段头复现)→ 期望断言①红(真实入口);②回退 `_status_data()` curios 映射 hunk → 期望断言③红;③回退 `_status_data()` max_hp 投影 hunk → 期望断言②红。记录进实现报告。
- [ ] 轻闸全绿后、合并前写齐三份:`reports/iter<N>-实现报告-<完成日>.md`(各卡状态+撤销证明记录+实机目检总清单〔面板观感一条〕+遗留读数义务)/`reports/iter<N>-代拍板追认单-<完成日>.md`(§10 白名单内代拍项留痕)/`reports/iter<N>-反哺点-<完成日>.md`(§6 六条每条一落点+§11 四处推导定值逐条列示供否决)。可核查结果:三文件在 `reports/` 且 §6 同步面每条有落点、§11 定值全部列示。
- [ ] 合并前置:独立验收审计(§8.2 末段声明)完成且报告 `reports/iter<N>-验收审计-<完成日>.md` 逐行「通过」——未通过不得合并,缺漏项回炉对应 T 卡。可核查结果:审计报告在 `reports/` 且逐行「通过」。
**估时合计 ≈1–2d**(T0 0.25–0.5+T1 0.5–1+T2 0.25–0.5)。切分预案:T1 内投影与面板可切,但中间态消费键断链(面板读旧键投影已换代),建议 T1 一轮同落;本卡无超软盒预挂面(批小)。**编排注记**:本卡估时低于 iter-plan 四查③硬下限 5 工作日,单独不成迭代——与其他卡同批编入。
## 8. 验证闸
### 8.1 逐需求点验收清单
| # | 需求点 | 测什么(断言/行为) | 落点/判定手段 |
|---|---|---|---|
| V1 | 本局五件投影一致 | 夹具八键手拼→面板读数逐项相等:余额徽「钥石 %d」;属性行「生命 %d/%d · 攻击 %d · 护甲 AC %d · GP %d」全值;秘宝行=受理序件名 join、已用件带「(已用)」尾缀;专长行=行串 join;空态句×2(curios/feats 空夹具各跑一遍) | 冒烟隔离档 `_status_panel_projection` 换代(`smoke_all.gd:5727-5779`) |
| V2 | 跨关概览退役零残留 | ①面板子树零「道具工坊」「天赋树」文案(隔离档);②真实入口三断言:零旧段+属性行全值对 runner 五现值+`_status_data()` 直调键集恰八键与 curios/feats 对拍(对局中直调——runner 在役前置由探针对局承担) | 冒烟①+`ui_click_probe` ②(T2 新增三断言) |
| V3 | 文案三处换代 | 面板提示行=「查看本局冒险进度(只读)」;两 tooltip 同串;标题「状态」与「继续」钮定位锚不变 | 冒烟提示行断言+四探针既有定位锚回归(零改动自证) |
| V4 | 只读与零动效契约保持 | 信号连接数=2(白名单两连接);子树零 AnimationPlayer+源码零 `create_tween`/`UiKit.motion` token | `ui_struct_probe` ⑧ 两契约(**零改动回归线**——失效即 L3) |
| V5 | 既有探针回归 | click/input/shot/struct 四探针状态面板相关段零红 | 全套闸探针档(改前改后读数对拍) |
| V6 | 反哺点清单 | §6 六条每条有落点 | 件核对表(T2 出口) |
### 8.2 改动—验收对照表
> 各断言 desc 统一尾缀〔sv#〕(本表「验收测试」列可 grep 定位);撤销证明逐条对应 T1/T2 撤销步。
| 需求点 | 改动(文件:行/行为) | 验收测试(名称+文件+尾缀) | 层级 | 真实入口 | 撤销证明 |
|---|---|---|---|---|---|
| sv1 属性行投影 | `main.gd:1070-1076` 八键投影+`status_panel.gd` 属性行串(契约 4 格式) | 属性行全值投影〔sv1〕 `smoke_all.gd` `_status_panel_projection` 换代 | 集成 | `open_status()` 直喂八键夹具(同构口径) | 撤销:回退 gp 读数投影 hunk(T1 撤销步①)→ 本断言红 |
| sv2 秘宝行投影 | `_status_data()` curios 映射+面板秘宝行(受理序+「(已用)」尾缀) | 秘宝行受理序与已用尾缀〔sv2〕 同上 | 集成 | 同 sv1 | 撤销:回退尾缀逻辑 hunk(T1 撤销步②)→ 本断言红 |
| sv3 专长行投影 | `_status_data()` feats 透传+面板专长行 join | 专长行串投影〔sv3〕 同上 | 集成 | 同 sv1 | 撤销证明:回退 feats 键接线 hunk → 本断言红 |
| sv4 余额徽回归 | `open_status` 余额徽喂值零改动(回归锚) | 余额徽读数=keystone_balance〔sv4〕 同上(沿旧断言族) | 集成 | 同 sv1 | 撤销证明:改余额徽喂值 hunk → 本断言红 |
| sv5 零旧段(隔离档) | `status_panel.gd` 两段整段退役(契约 2) | 面板子树零「道具工坊」「天赋树」文案〔sv5〕 同上 | 集成 | 同 sv1 | 撤销:回退旧段退役 hunk(T1 撤销步③)→ 本断言红 |
| sv6 零旧段+投影值真链路(真实入口) | 同 sv5 面板改动+`_status_data()` 换代+`ui_click_probe.gd:593-621` 补三断言 | 角标开层后零旧段+属性行全值对 runner 五现值+`_status_data()` 直调八键与 curios/feats 对拍〔sv6〕 `ui_click_probe.gd`(T2 新增) | 探针 | `board_zone.status_badge` pressed 真实信号路径 | 撤销:回退旧段退役 hunk→断言①红;回退 curios 映射 hunk→断言③红;回退 max_hp 投影 hunk→断言②红(T2 撤销步) |
| sv7 投影零旧键 | `_status_data()` 三旧键清零(契约 2 数据层面) | `_status_data()` 返回键集=八键〔sv7〕 `ui_click_probe.gd`(sv6 断言③承载,对局中直调) | 探针 | `main._status_data()` 直调(探针对局中,runner 在役) | 撤销证明:回退三旧键清零 hunk → 键集断言红 |
| sv8 提示行文案 | `status_panel.gd:22` 文案换代(契约 4) | 提示行=「查看本局冒险进度(只读)」〔sv8〕 `smoke_all.gd` | 集成 | 同 sv1 | 撤销证明:回退文案 hunk → 本断言红 |
| sv9 角标 tooltip×2 | `board_zone_view.gd:58`/`level_map_screen.gd:107` 文案换代 | tooltip=新串且全仓「永久强化进度」零命中〔sv9〕 件核(T1 可核查结果)+四探针定位锚回归 | 件核+探针 | 角标节点实查+全套闸 | 撤销证明:回退任一 tooltip hunk → 件核红 |
| sv10 反哺点清单(**非行为改动**——纯文档产出物) | T2 三份 `reports/` 产出物(§6 六条各一落点) | §6 六条每条有落点〔sv10〕 件核对表(T2 出口) | 非行为改动 | 反哺点清单对 §6 同步面表件核 | 撤销证明:删一落点 → T2 出口件核红 |
**测试方式两分法(2026-10-11 用户定)**:V1–V6 全部机检自动化(冒烟+探针);能力验证可经调试接口直改钥石/GP/库存/专长后开面板读数(沿用现役 DebugOverlay/DS_DEBUG 门控)。**用户目检项**:面板观感一条(信息层级/文案通顺/空态句得体)——观测项写进 `reports/iter<N>-实现报告-<完成日>.md` 实机目检总清单,登记不阻塞(08 出口判据「用户目检通过」由此承接)。
**闸口径**:轻闸每任务卡出口自跑;批末重闸=`tools/run_all_gates.sh` 按改动域选档(本批只碰 `game/` → `--code`)全绿才合并+改前改后读数对拍。回归措辞:里程碑步(T 段)出口跑一次全套闸;波内修复只做出红最小单元的最窄确认;新增测试先行孤立验证再并入全套。
**撤销证明伴生(2026-10-24 用户裁:全项目禁做变异类测试,一切验收只走撤销证明)**:`_status_panel_projection` 为改写函数——三撤销步挂 sv1/sv2/sv5(gp 投影回退/尾缀逻辑回退/旧段退役回退);`ui_click_probe` 新增断言——三撤销步挂 sv6(旧段退役回退→断言①;curios 映射回退→断言③;max_hp 投影回退→断言②)。撤销后仍绿=断言没钉在这个改动上,判缺漏。V4/V5 为既有断言回归线,零新增零改写,不设撤销步。
### 8.3 测试削弱申报(test-conventions §9.5)
允许改/删的旧断言清单及理由:`smoke_all.gd:5744-5770` 工坊 12 行投影逐项断言族与 `:5771-5777` 天赋树聚合文案断言**删除**——理由=被断言内容(跨关解锁概览的呈现)随本批需求整段退役,非规避拦截;替换判据=sv5/sv6/sv7 零残留与真链路断言。`:5741-5743` 开层可见与余额徽断言**保留**(sv4 回归锚)。除此之外的断言删除/放宽/缩小扫描面/换下层直调=未申报削弱,停卡呈报、独立审计判红。`ui_struct_probe`/`ui_input_probe`/`shot_probe` 零断言改动。
**独立验收审计(test-conventions §9.7)**:合并前由未参与实现的迭代 loop 内子代理(或用户点名会话)审计——只读本卡、实现报告实际对照表、diff 与测试文件,自跑最窄测试抽查,不采信「已全绿」;审计报告落 `reports/iter<N>-验收审计-<完成日>.md`(逐行「通过/缺漏/例外及依据」)。**审计未通过不得合并**(T2 合并前置)。
## 9. 异常分级
- **L1(自救)**:断言措辞、命名、注释、空态句与段头微调(用户原话词干「带的秘宝/已获专长」不变前提下的语气词级调整)、属性行分隔符形态(契约 4 钉值格式内)。
- **L2(记录继续)**:三 Label 的呈现细节(autowrap 形态、对齐);`_status_data()` 内部拼装形态(映射写法);冒烟夹具数值取值;探针断言的子树扫描写法选择。
- **L3(停机呈报)**:`run_scope.runner` 空指针(契约 5 前置被打破=状态机缺陷);任何保留跨关概览半段的诉求;触碰 UiKit 工厂纪律(裸色值/自建样式);发现 F8 之外的第四处旧文案引用点(证据失真——订正本卡再续);顺带改动 C 区/营地承载/面板开合机制的诉求;`ui_struct_probe` ⑧ 回归线红(只读契约破)。
## 10. 代拍板白名单(超清单必呈报)
1. 空态句与段头最终措辞——约束:词干=用户原话,空态句形制沿 `status_panel.gd:130` 先例。
2. 属性行串接序与分隔符——约束:契约 4 钉值格式逐字。
3. 断言名与消息措辞、断言定位写法(子树扫描式 vs 逐 label 直引)。
4. 冒烟夹具数值取值(任意非零可辨值——禁读 `data/tables` 现值,禁与属性行断言共值致误判掩盖)。
5. 提交切分与 worktree 分支命名。
## 11. 待裁点
**零待裁点,开工门=U0。**
四处灰色地带已按设计事实推导定值(用户可否决,随 T2 反哺点清单逐条列示呈报):
- **空态呈现=显示空态句而非隐藏段**——依据=本面板是「主动打开的可读快照」(玩家按需展开阅读,明确「无」比整段消失更可读)+现行空态句先例(`status_panel.gd:130` 天赋树空态句);备选「空态隐藏段」淘汰依据=那是 HUD C 区常驻悬浮件的先例(空间稀缺语义),与按需面板不同形。
- **提示行/tooltip 文案=「查看本局冒险进度(只读)」**——依据=新定位(本局信息为主+钥石);备选「查看本局状态(只读)」淘汰依据=与标题「状态」连读冗余。
- **GP 并入「本局状态」行而非独立段**——依据=五件呈现的最小结构(GP 是一个读数,不构成段落级信息);备选独立「资产」段淘汰依据=单行段无信息增益、徒增段头。
- **「带的秘宝」段含已用件(带「(已用)」尾缀)而非只列未用件**——依据=秘宝投影复用 `inventory_projection()` 全行集(C 区同源、零第二实现,契约 1);已用件仍在库存里「带着」,尾缀保真不撒谎;备选「过滤只列未用件」淘汰依据=须另加过滤语义(第二份行集语义),且已用件消失会让件数对不上库存。
## 12. 自审六查与 grilling 复核记录
**自审六查(2026-10-23 写卡会话)**:①规格覆盖——§1 四项改动/五项完成定义逐条挂 T 卡(投影=T1、面板=T1、tooltip=T1、断言面=T1/T2、产出物=T2),并各指到对照表行(sv1–sv10),无漏项;②步骤扫描——全部步骤一步一动作一可核查结果,函数体零给出(签名+断言已定);③类型一致性——接口块八键名与 T1/冒烟/探针引用逐字一致(balance/hero_hp/max_hp/atk/ac/gp/curios/feats);④审查焦点+改动覆盖——规格暗示的失败模式补挂:只读契约破(V4 回归线+L3)、停点开面板秘宝投影崩(F5 已核+V5 回归)、文案锚破导致探针失明(V3 定位锚不变判据);文件结构图六个行为改动行全部指到对照表行;⑤篇幅比例——规格≈1 屏、任务卡≈实现面 1:1,零函数体、零代码块;⑥落位与复用——零新增文件/数据件,三个新 Label 成员与两处投影复用的「为什么不能复用既有那一个/落点唯一」已在预检节答清,与文件结构图互指一致。
**grilling 复核记录(2026-10-23,独立子代理对抗复核,不采访用户——可推导定值写依据、真归用户列 §11)**:十审点走查——事实面(F1–F8 行号、§6 四条文档引句、旧段/旧键/旧成员消费点全集、削弱申报、机检 C1/C2)逐条实核全部成立;对照表三方闭合、落位预检互指、待裁点无泄漏均过。判回炉一处:**【阻断】`main._status_data()` 八键投影值层无验收闭合**——v1.0 的 sv1–sv3 全部直喂夹具消费侧、sv7 只断键集、sv6 断言②单盖 GP 且开局零值无判别力,投影映射写坏可全绿合入,违验收闭合红线。随同改:【应修】§11 推导定值的呈报承诺无落点(T2 反哺点产出物补「逐条列示」)、sv6 断言②无撤销证明。v1.1 修订内容:①sv6 升格三断言(零旧段+属性行全值对 runner 五现值+`_status_data()` 直调八键与 curios/feats 对拍独立 oracle)——投影值层进真链路断言回路;②sv7 落点自冒烟移探针(直调 `_status_data()` 需 runner 在役,冒烟免 boot 对局);③撤销表补 main 侧两条(curios 映射回退→断言③红、max_hp 投影回退→断言②红);④§11 增第四处推导定值(带的秘宝含已用件);⑤吹毛求疵随手带改——契约 1 加「属性与 GP 合一行」半句与 ledger 直取下标、契约 2 限定「status_panel.gd 内」并明示 camp_overlay_view 同名件零关联、F2/F3/F4/F5 行号订正(±3 行内漂移)、T1 补 HSeparator 保留句、§8.3 保留区间措辞订正。复核结论:修订后零阻断零应修,零待裁点成立。
+4 -3
View File
@@ -5,8 +5,8 @@
## 当前位(只回答「现在该做什么」;三行内随批次换代,禁止在此扩写成状态快照)
- **阶段**:M3——Alpha 版本的完整实现(2026-10-09 立规:未明令宣布完成前停留 M3,迭代只排 M3 需求,M4 不排期;根目录 stage.txt 为旧阶段开关仅存档)。
- **迭代位**:迭代 1–35 全部已完成——迭代 34 于 2026-10-24 完成批后收尾;迭代 35 两卡于 2026-10-25 合回并完成批后收尾;迭代 36 三卡已合回;迭代 37 起未编排——编入哪一迭代由用户经迭代编排段发令。
- **下一步**:迭代 36 补记迭代总表行(现仍写「待开工」,与实际不符);迭代 37 编排由用户发令(迭代编排段入口)。待编池:营地交互重做卡⑤(排卡④之后)、卡④(已退回美术设计段,美术设计闭合后重立卡)、冒险前资源配比预设(冻结备选)、迭代 30 原卡②③(2026-10-17 已剔出迭代 30 规划、退回待设计,待美术/设计定稿后重新立卡)、玩家面残留禁字清扫(待写卡)、结算明细日志行序重锚(2026-10-21 授权发起、时点另定)。
- **迭代位**:迭代 1–36 全部已完成——迭代 35 两卡于 2026-10-25 合回并完成批后收尾;迭代 36 三卡已合回并于 2026-10-25 完成批后收尾;迭代 37 已编排(四卡,2026-10-25),待开工。
- **下一步**:迭代 37 开工由用户发令(迭代实现段入口)。待编池:营地交互重做卡⑤(排卡④之后)、卡④(已退回美术设计段,美术设计闭合后重立卡)、冒险前资源配比预设(冻结备选)、迭代 30 原卡②③(2026-10-17 已剔出迭代 30 规划、退回待设计,待美术/设计定稿后重新立卡)、奖励节点三选一实装(2026-10-25 新登记)、结算明细日志行序重锚(2026-10-21 授权发起、时点另定)。
## 里程碑时间线
@@ -69,7 +69,8 @@
| 迭代 33 | 已完成(2026-10-22) | 已退役(git 历史可考) | 2026-10-21 | ≈13.25 个工作日〔用户特批 2026-10-21 超 10 个工作日〕 | 已退役(git 历史可考) |
| 迭代 34 | 已完成(2026-10-22) | 已退役(git 历史可考) | 2026-10-21 | ≈11 个工作日〔用户特批 2026-10-21 超 10 个工作日〕 | 已退役(git 历史可考) |
| 迭代 35 | 已完成(2026-10-25) | 已退役(git 历史可考) | 2026-10-21 | ≈15.25 个工作日〔用户特批 2026-10-21 超 10 个工作日〕 | 已退役(git 历史可考) |
| 迭代 36 | 待开工 | reports/需求卡片-开场后缀营地灰字迷雾测点批-2026-10-24.md<br>reports/需求卡片-文案与禁字清扫批-2026-10-24.md<br>reports/需求卡片-状态面板瘦身批-2026-10-23.md | 2026-10-24 | ≈5.25 个工作日 | — |
| 迭代 36 | 已完成(2026-10-25) | 已退役(git 历史可考) | 2026-10-24 | ≈5.25 个工作日 | 已退役(git 历史可考) |
| 迭代 37 | 待开工 | reports/需求卡片-game行为缺陷定点修批-2026-10-24.md<br>reports/需求卡片-重构main判离批-2026-10-24.md<br>reports/需求卡片-重构boardview拆件批-2026-10-24.md<br>reports/需求卡片-重构runner拆件与断点schema单点批-2026-10-24.md | 2026-10-25 | ≈8.25 个工作日 | — |
- 历史行的「—」= 该列事实不可考:迭代 1~8 早于需求卡片制;编排时点与预计周期不再回溯,细节查 git 提交史。
- 「已退役(git 历史可考)」= 需求卡片或实现报告曾存在,已按「证据只留最新」退役;已完成迭代的实现报告列只填 reports/ 现存路径或本保留字,不填「—」。
+12 -17
View File
@@ -3,12 +3,12 @@
game/core/action_economy.gd|quality/max-class-variables|class has 18 variables (max 15)
game/core/adventure_runner.gd|quality/max-branches|function '_apply_curio_pick' has 10 branches (max 8)
game/core/adventure_runner.gd|quality/max-branches|function '_draw_curio_candidates' has 11 branches (max 8)
game/core/adventure_runner.gd|quality/max-branches|function 'resume_adventure' has 10 branches (max 8)
game/core/adventure_runner.gd|quality/max-class-variables|class has 43 variables (max 15)
game/core/adventure_runner.gd|quality/max-file-length|file is 1050 lines long (max 1000)
game/core/adventure_runner.gd|quality/max-branches|function 'resume_adventure' has 11 branches (max 8)
game/core/adventure_runner.gd|quality/max-class-variables|class has 42 variables (max 15)
game/core/adventure_runner.gd|quality/max-file-length|file is 1051 lines long (max 1000)
game/core/adventure_runner.gd|quality/max-function-length|function '_draw_curio_candidates' is 85 lines long (max 50)
game/core/adventure_runner.gd|quality/max-function-length|function '_start_current_level' is 55 lines long (max 50)
game/core/adventure_runner.gd|quality/max-function-length|function 'resume_adventure' is 104 lines long (max 50)
game/core/adventure_runner.gd|quality/max-function-length|function '_start_current_level' is 53 lines long (max 50)
game/core/adventure_runner.gd|quality/max-function-length|function 'resume_adventure' is 108 lines long (max 50)
game/core/adventure_runner.gd|quality/max-local-variables|function '_draw_curio_candidates' has 26 local variables (max 10)
game/core/adventure_runner.gd|quality/max-local-variables|function 'resume_adventure' has 13 local variables (max 10)
game/core/adventure_runner.gd|quality/max-public-methods|class has 23 public methods (max 20)
@@ -45,11 +45,11 @@ game/core/board_generator.gd|quality/max-nesting-depth|function 'measure_inferab
game/core/board_generator.gd|quality/max-parameters|function '_finalize' has 6 parameters (max 5)
game/core/config_db.gd|quality/max-class-variables|class has 25 variables (max 15)
game/core/config_db.gd|quality/max-public-methods|class has 44 public methods (max 20)
game/core/config_db_cross_validator.gd|quality/max-branches|function 'cross_validate' has 31 branches (max 8)
game/core/config_db_cross_validator.gd|quality/max-function-length|function 'cross_validate' is 159 lines long (max 50)
game/core/config_db_cross_validator.gd|quality/max-local-variables|function 'cross_validate' has 39 local variables (max 10)
game/core/config_db_cross_validator.gd|quality/max-branches|function 'cross_validate' has 21 branches (max 8)
game/core/config_db_cross_validator.gd|quality/max-function-length|function 'cross_validate' is 107 lines long (max 50)
game/core/config_db_cross_validator.gd|quality/max-local-variables|function 'cross_validate' has 24 local variables (max 10)
game/core/config_db_cross_validator.gd|quality/max-local-variables|function 'validate_skill_pool_links' has 11 local variables (max 10)
game/core/config_db_cross_validator.gd|quality/max-nesting-depth|function 'cross_validate' has nesting depth 6 (max 4)
game/core/config_db_cross_validator.gd|quality/max-nesting-depth|function 'cross_validate' has nesting depth 5 (max 4)
game/core/config_db_resolver.gd|quality/max-branches|function '_resolve_progress' has 16 branches (max 8)
game/core/config_db_resolver.gd|quality/max-branches|function 'resolve_enemy_rowset' has 12 branches (max 8)
game/core/config_db_resolver.gd|quality/max-function-length|function '_resolve_progress' is 52 lines long (max 50)
@@ -71,9 +71,8 @@ game/core/effect_engine.gd|quality/max-nesting-depth|function '_cond_ok' has nes
game/core/effect_engine.gd|quality/max-nesting-depth|function 'rebuild' has nesting depth 5 (max 4)
game/core/effect_engine.gd|quality/max-returns|function '_cond_ok' has 19 return statements (max 6)
game/core/effect_engine.gd|quality/no-else-return|unnecessary 'elif' after 'return'
game/core/level_runner.gd|quality/max-class-variables|class has 40 variables (max 15)
game/core/level_runner.gd|quality/max-file-length|file is 1013 lines long (max 1000)
game/core/level_runner.gd|quality/max-parameters|function 'start_level_external' has 8 parameters (max 5)
game/core/level_runner.gd|quality/max-class-variables|class has 38 variables (max 15)
game/core/level_runner.gd|quality/max-parameters|function 'start_level_external' has 7 parameters (max 5)
game/core/level_runner.gd|quality/max-public-methods|class has 54 public methods (max 20)
game/core/level_runner.gd|quality/max-returns|function '_enter_node' has 7 return statements (max 6)
game/core/meta_progression.gd|quality/max-public-methods|class has 31 public methods (max 20)
@@ -125,10 +124,6 @@ game/data/schemas/forge_table.gd|quality/max-local-variables|function 'validate'
game/data/schemas/level_gen_params.gd|quality/max-branches|function 'validate' has 15 branches (max 8)
game/data/schemas/level_gen_params.gd|quality/max-function-length|function 'validate' is 59 lines long (max 50)
game/data/schemas/level_gen_params.gd|quality/max-local-variables|function 'validate' has 18 local variables (max 10)
game/data/schemas/level_table.gd|quality/max-branches|function '_validate_graph' has 21 branches (max 8)
game/data/schemas/level_table.gd|quality/max-branches|function '_validate_level_nodes' has 12 branches (max 8)
game/data/schemas/level_table.gd|quality/max-function-length|function '_validate_graph' is 99 lines long (max 50)
game/data/schemas/level_table.gd|quality/max-local-variables|function '_validate_graph' has 19 local variables (max 10)
game/data/schemas/meta_table.gd|quality/max-branches|function 'validate' has 14 branches (max 8)
game/data/schemas/meta_table.gd|quality/max-function-length|function 'validate' is 60 lines long (max 50)
game/data/schemas/meta_table.gd|quality/max-local-variables|function 'validate' has 14 local variables (max 10)
@@ -162,7 +157,7 @@ game/presentation/hud_presenter.gd|quality/max-parameters|function '_refresh_out
game/presentation/hud_presenter.gd|quality/max-parameters|function 'refresh' has 8 parameters (max 5)
game/presentation/hud_presenter.gd|quality/max-parameters|function 'tune_sim_report' has 10 parameters (max 5)
game/presentation/main.gd|quality/max-class-variables|class has 49 variables (max 15)
game/presentation/main.gd|quality/max-file-length|file is 1509 lines long (max 1000)
game/presentation/main.gd|quality/max-file-length|file is 1507 lines long (max 1000)
game/presentation/main.gd|quality/max-function-length|function '_build_ui' is 189 lines long (max 50)
game/presentation/playtest_logger.gd|quality/no-debug-print|debug 'print()' call found
game/presentation/treasure_interact_controller.gd|quality/max-local-variables|function 'inventory_projection' has 11 local variables (max 10)
+18 -3
View File
@@ -6,6 +6,10 @@
# 跑完写回执 game/tests/.gates/receipt.json(commit + 各闸退出码 + 存量基线比对 + 时间戳);
# .zcode/hooks/worktree-guard.sh 在主工作区 git merge 时校验本回执,缺或红即拦截。
#
# 本脚本是合回前的终局动作:跑之前先冻结(代码与断言不再改)并把 master 并入本分支;每批只跑
# 一次。回执必须覆盖住分支尖的 game/ 面——闸后再改 game/ 一点,回执即作废须重跑;跑闸时若
# game/ 还带着未提交改动,回执会标 dirty_game,合回闸拒绝采信。
#
# 用法:tools/run_all_gates.sh [--code|--docs|--quick]
# --code 只跑代码域闸(00 冒烟测试/01 系统测试/02 单元与集成测试/03 探针 --click/
# 04 探针 --full/05 渲染闸/09 静态扫描/11 回放确定性对拍+10 熵增闸)
@@ -54,6 +58,14 @@ done
# 与基线比必判「红项清单变化」假红)、末尾汇总自身崩掉打不出结论。
export PYTHONIOENCODING=utf-8
# game/ 面是否带着未提交改动(只算已跟踪文件——闸件自身产物都落在 gitignore 面)。
# 脏树跑出来的回执记的是 HEAD,验的却是别的字节,合回闸据此拒收。
DIRTY_GAME=0
if [ -n "$(git -C "$REPO" status --porcelain -uno -- game/ 2>/dev/null)" ]; then
DIRTY_GAME=1
echo "[gates] 警告:game/ 有未提交改动——本次回执将标 dirty_game,不能用于合回(先提交再跑)。"
fi
# 回执与日志是中间产物(不入库),但 .gitignore 本身必须入库——漏了就等于把它们纳入版本管理。
# 每次跑批前自愈重建,避免「清目录重跑」把 .gitignore 一起带走。
mkdir -p "$STAMP_DIR"
@@ -248,11 +260,11 @@ else
fi
# ── 与存量基线比对 ──
"$PY" - "$BASELINE" "$RECEIPT" "$QUICK" "$DOMAIN" "$REPO" "${NAMES[@]}" -- "${EXITS[@]}" -- "${LOGS[@]}" <<'PYEOF'
"$PY" - "$BASELINE" "$RECEIPT" "$QUICK" "$DOMAIN" "$REPO" "$DIRTY_GAME" "${NAMES[@]}" -- "${EXITS[@]}" -- "${LOGS[@]}" <<'PYEOF'
import hashlib, json, os, subprocess, sys
baseline_path, receipt_path, quick, domain, repo = sys.argv[1:6]
rest = sys.argv[6:]
baseline_path, receipt_path, quick, domain, repo, dirty_game = sys.argv[1:7]
rest = sys.argv[7:]
sep = rest.index("--")
names = rest[:sep]
tail = rest[sep + 1:]
@@ -338,6 +350,7 @@ with open(receipt_path, "w", encoding="utf-8") as f:
"timestamp": subprocess.run(["date", "-Iseconds"], capture_output=True, text=True).stdout.strip(),
"quick_mode": quick == "1",
"domain": domain,
"dirty_game": dirty_game == "1",
"first_baseline_run": first_run,
"gates": [{"name": n, "exit": e, "fingerprint": now[n]["fp"]} for n, e in zip(names, exits)],
"changed_vs_baseline": changed,
@@ -364,6 +377,8 @@ if not_run:
stock = [n for n, e in zip(names, exits) if e not in ("0", "SKIP")]
if stock:
print("【存量红·对基线零新增】" + "、".join(stock))
if dirty_game == "1":
print("【回执不可用于合回】跑闸时 game/ 有未提交改动——先提交到分支、再重跑这一次。")
if all_green:
print("【验收通过】闸况与基线一致,无新增红。")
sys.exit(0)
+17 -1
View File
@@ -202,7 +202,7 @@
- **四柜台并排**:树淬炼柜台=主界面(脊柱两行一线一节点行板+Fork 三行双态切换钮+脉分组头);锻造工坊柜台未点亮=锁定态、点亮=展开零交互占位面板;秘宝匣柜台未点亮=锁定态、点亮=展开(工坊六行+同调装配段+Y 升级行);图鉴常开独立位;宽度不足横向滚动。
- **树购买交互**:余额不足购买钮态、行门槛/前置拦截 toast、购买后行板即时刷新(Lv/钮禁用态)。
- **刷新双入口**:树上「刷新升级」行与秘宝匣装配段 Y 升级行都能买、同账累计(树上 Lv 读数随买走)。
- **连带面**:状态面板属性锻造段已消失(钥石+工坊+天赋树概览);生涯页两类六项(三柜台概览行已删);局内六键体感(先手首战首轮 +1AP/锋踩雷减半/守标错下轮 +AP/聚结算框 GP 即实得/散货架八折标价)。
- **连带面**:状态面板属性锻造段已消失(当时换成钥石+工坊+天赋树概览,该跨关概览后随迭代 36 状态面板瘦身退役,现只留本局信息五件);生涯页两类六项(三柜台概览行已删);局内六键体感(先手首战首轮 +1AP/锋踩雷减半/守标错下轮 +AP/聚结算框 GP 即实得/散货架八折标价)。
- 验证方式:用户实机目检(本批自动闸外唯一人闸)。
- **✅ 已核销(2026-10-14)**:用户实机目检回报完成,未呈报问题(qa 收尾批)。
@@ -378,3 +378,19 @@
| 4 | 大图完整可见观感(卡①+画布缺口) | L2/L3 生成图整幅落在 1280 屏内、节点不被裁切且都可点到——已知冻结画布公式在 L3 深度域 0–13 下可能超宽,本项同时验证该缺口是否已在实机显形 |
- **红灯信号**:第二/三关只有一个入口或第二入口不可进入;岔口候选同类型或同支路;走 A 支遇到 B 支 Boss;教学图每次开局不同;节点出屏或点不到;三关图规模不递增。
- **结论回流**:实现缺陷归待办清单登记新条目;观感与画幅问题归呈现批(待办清单「超预算图策略升级路径」条)。
---
## ㉞ 迭代 36——开场后缀/营地灰字/危险格字形/图例新句/状态面板实机目检(2026-10-25 随收尾写入登记)
> 卡C 给开场行加条件后缀、营地六处灰字深档并扩迷雾三关对比行;卡A 把玩家面禁字清零(危险格单字字形「雷」→「危」、图例换新句);卡③ 把状态面板瘦成只留本局信息。机检已覆盖后缀条件求值、取色断言与字形/文案字面;观感与人眼读感仍要人眼看。登记不阻塞(2026-10-12 真人检测立规);总收口时点=迭代 36 实现报告(已退役,git 可考)。
| # | 目检项 | 判据 |
|---|---|---|
| 1 | 开场行后缀观感(卡C) | 「(含面板加成)」只在有局外加成时出现;出现时机的直觉合理,不误读为永久加成 |
| 2 | 营地灰字观感(卡C) | 六处深化后灰字与牌底层次可读、不糊成一片 |
| 3 | 危险格「危」字观感(卡A) | 字形密度与可读性对旧「雷」字不下降,三关棋盘同屏不误读 |
| 4 | 图例新句通顺(卡A) | 「标空可左键直接挖开(安全格零奖励、危险格受挖掘惩罚)」读顺,零旧词残留 |
| 5 | 状态面板观感(卡③) | 面板只留本局信息五件(带的秘宝/已获专长/当前属性/现有 GP/钥石总量),层级与文案通顺、空态句得体,零跨关解锁段 |
- **红灯信号**:后缀在不该出现时出现或该出现时缺失;营地灰字糊到难读;「危」字糊或与旧字形误读;图例仍见旧词;面板仍出现秘宝匣/天赋树跨关概览段或五件缺失。
- **结论回流**:实现缺陷归待办清单登记新条目;观感问题归呈现面后续批。
+22 -48
View File
@@ -26,7 +26,7 @@
**归属**:game/ 呈现层与 core 域(缺陷定点修,迭代批);结构重构候选另立批次由用户裁决。切卡输入=审计报告 §二/§三
**状态**:待写卡+已写卡
**状态**:待写卡+已写卡+已编迭代 37
#### S9 类型闸正则失灵修复——R2 恒零命中+static 函数漏网(2026-10-24 登记,来源=审计发现,设计面=工程直入)
@@ -41,13 +41,13 @@
#### S13 gdstyle 免名单把数字当身份——存量债改小也报「基线外新违规」(2026-10-25 登记,来源=批次移交,设计面=工程直入)
**现状**:工程债证据=迭代 35 卡② 合回前后实测(master 合回笔 `5499eb9c`)。闸件 `tools/gdstyle_gate.py:82` 把每条违规登记成三元组「文件|规则|消息全文」,而 gdstyle 的消息文本里带具体数字(如 `function 'resume_adventure' is 104 lines long (max 50)`),基线 `tools/gdstyle_baseline.txt`(241 行)按整句逐字比对——**只要某函数的行数/分支数/变量数发生变化,老违规就匹配不上,被判「基线外新违规」并判红,改小也算新增**。卡② 一批即因此冒出 12 项假新增,逐条对基线旧值核实全是存量债的计数漂移:`config_db_cross_validator.cross_validate` 159→107 行/31→21 分支/39→24 局部/嵌套 6→5(本批按卡片删除跨表校验④整段所致,债变小)、`level_runner` 类变量 40→38 且其「文件 1013 行超长」违规已消失(债被还掉)、`start_level_external` 参数 8→7、`main.gd` 1509→1507、`adventure_runner` 类变量 43→42/文件 1050→1051/`resume_adventure` 104→108 行(本批加断点代差标记键拒绝检查多 4 行)。本批真正新写的超标仅 1 处(新函数 `validate_graph` 72 行/20 分支),已当场拆成四段修掉。**盘面后果**:卡② 按用户令零复跑合回,master 尖 5499eb9c 从未整套跑绿过代码域闸;下一次任何批跑代码域闸都会看到 S13 红这 12 项(不处理则每批重复一次「要么重生成基线、要么被红挡在合回前」)。
**现状**:工程债证据=迭代 35 卡② 合回前后实测(master 合回笔 `5499eb9c`)。闸件 `tools/gdstyle_gate.py:82` 把每条违规登记成三元组「文件|规则|消息全文」,而 gdstyle 的消息文本里带具体数字(如 `function 'resume_adventure' is 104 lines long (max 50)`),基线 `tools/gdstyle_baseline.txt`(241 行)按整句逐字比对——**只要某函数的行数/分支数/变量数发生变化,老违规就匹配不上,被判「基线外新违规」并判红,改小也算新增**。卡② 一批即因此冒出 12 项假新增,逐条对基线旧值核实全是存量债的计数漂移:`config_db_cross_validator.cross_validate` 159→107 行/31→21 分支/39→24 局部/嵌套 6→5(本批按卡片删除跨表校验④整段所致,债变小)、`level_runner` 类变量 40→38 且其「文件 1013 行超长」违规已消失(债被还掉)、`start_level_external` 参数 8→7、`main.gd` 1509→1507、`adventure_runner` 类变量 43→42/文件 1050→1051/`resume_adventure` 104→108 行(本批加断点代差标记键拒绝检查多 4 行)。本批真正新写的超标仅 1 处(新函数 `validate_graph` 72 行/20 分支),已当场拆成四段修掉。**盘面后果**:卡② 按用户令零复跑合回,master 尖 5499eb9c 从未整套跑绿过代码域闸;下一次任何批跑代码域闸都会看到 S13 红这 12 项(不处理则每批重复一次「要么重生成基线、要么被红挡在合回前」)。已写卡(2026-10-25,卡片=reports/需求卡片-S13基线键治本-2026-10-25.md):四待裁点已拍板——稳定身份键/恶化判据超登记值即红/本批治本+批内刷新基线/refresh 加对账自检与骤降守卫;验收按 2026-10-24 撤销证明口径执行。
**预计改动面(两档,第一条只治标)**:① 治标=人工跑一次 `python tools/gdstyle_gate.py --refresh` 重生成基线+一笔提交,约 5 分钟,但键形态未改,下一批再动这些文件还会重演;② 治本=改 `tools/gdstyle_gate.py` 的键构造段(:77-90,约 10–20 行)为「文件|规则|函数名」——函数名从消息里正则提取 `function 'x'`,无函数名的条目(类变量数/文件长度)退化为「文件|规则」,并**另加一条恶化判据**防新键吞掉真问题(同一函数当前指标较基线登记值恶化超阈值即判红,纯规范化数字会把 104→300 行的恶化也放过去,不可只靠数字抹平);随动=重生成 `tools/gdstyle_baseline.txt`(241 行按新键重排)、`tools/run_all_gates.sh` 头注与 `game/tests/README.md` 工具速查表的 S13 描述各一行、撤销证明四项(新增一处真超标必红/同函数改小改大的数字漂移禁止再冒新/恶化超阈值必红/禁闸内自动重生成清基线换绿的自检仍绿——各配撤销该判据见红+还原复绿)。合计约 **0.5 个工作日**,非迭代批(tools/ 闸机与文档面),零待裁点即可写卡。
**归属**:tools/ 静态扫描域(闸件批,非迭代批)——与「S9 类型闸正则失灵修复」「S6/S7/S8 静态规则落地」两条同族:规则扫描面自身失灵/失准,防线不可信即等于没有防线
**状态**:待写卡
**状态**:已写卡
#### S6/S7/S8 静态规则落地——编排唯一性/禁 await/信号纪律三闸(2026-10-24 登记,来源=审计发现,设计面=工程直入)
@@ -149,17 +149,6 @@
**状态**:待美术设计
#### 状态面板瘦身——局内面板去跨关解锁内容、只留本局信息(2026-10-16 登记,来源=playnote,设计面=工程直入)
**现状**:playnote 用户反馈:关卡界面中的"状态"面板不需要跨关解锁内容,只显示跟当前冒险有关的信息。现行实态(status_panel.gd 实查)=局内状态面板(2026-10-13 由「暂停层」改名)现为跨局进度镜像:钥石余额徽+「道具工坊 · 解锁态」段(实为秘宝匣 12 行解锁态概览)+「天赋树 · 已购概览」段——恰为用户要去掉的跨关解锁内容。范围=用户原话五件套,零待裁点:面板只留带的秘宝/已获专长/当前属性/现有 GP/钥石总量;秘宝匣解锁态 12 行概览与天赋树已购概览两段退役(跨局解锁概览由营地/生涯承载,局内不再镜像);面板标题与提示行文案随新定位换代(现行「查看本局钥石与永久强化进度」语义失效)。2026-10-16 用户令「不需要讨论的写进 08 并同步待办清单」——[08-Alpha版本标准](design/gdd/08-Alpha版本标准.md)「三 · 界面」状态面板行已换代(v1.8 起部分在役);元进度「解锁双入口框架」节的入口拓扑面已随迭代 33 反哺落文(2026-10-22 元进度.md/camp.md 换代为「进入存档→选档→进档/新档」),其局内只读入口语义仍随状态面板瘦身待用户另批裁决;camp 双入口框架句已同步换代。未排期,开工=用户发令或随 UI 批编入。
关联文档清单:
- 需求卡片 reports/需求卡片-状态面板瘦身批-2026-10-23.md(2026-10-23,零待裁点)
**归属**:status_panel.gd(呈现层承载)+ [元进度](design/gdd/systems/跨局循环/元进度.md)「解锁界面:双入口框架」节(局内只读入口句随瘦身穿改——设计权威反哺点,归文档批落文)+ [08-Alpha版本标准](design/gdd/08-Alpha版本标准.md)「三 · 界面」状态面板行(部分在役——批后销号归反哺点);原归属所记 camp.md 双入口框架句经 2026-10-23 写卡实查无状态面板陈述(系迭代 33 入口拓扑面、已落文结清),从归属移除;同步面全集见需求卡片 §6
**状态**:已写卡+已编迭代 36
#### 旧行为 MC 行为锚全数作废——重锚归数值批(2026-10-06 登记,来源=批次移交,设计面=文档轨)
**现状**:案C 地图伤害账殿后批(git 7ef18ac,状态记录 371)改变每轮结算行为序——授予段不再兑付任何伤害(伤害形态单据暂存至战斗段末,段内序=主角先手→逐敌还手→地图账),既有全部 MC 行为锚与基线逐项比对锚所锚行为已不存在,**全数作废**;新段内序断言已入冒烟闸。按 sim-data MC 缓存层规则(无数值调整禁重跑),重锚不在改动批执行;重锚前一切 MC 旧读数只作历史存档,禁止与新行为逐项比对。M4 数值批卡 v1.2 已收该义务(F19:对拍锚按案C 新序重推导、T6 四带复算按新行为首采立新锚)。
@@ -222,17 +211,6 @@
**状态**:待文档设计
#### 现役 UI/文案两处自相冲突(2026-10-09 登记,来源=审计发现,设计面=工程直入)
**现状**:①battle_narrator.gd:160 文案「与通关三选一同池同权重同上限」与现役实现不符——通关渠道自迭代15② 起=纯专长,该句系落码前旧话(玩家可见错话);②hero_info_panel_view.gd _curio_section 与 _feat_section 两段同标「特性」——现役界面文案重复。两处均系「现役码 vs 现役码」冲突,非新设计未实装的预期偏差。2026-10-09 审查批呈报 B5,用户裁「记录待办、后续迭代解决」;体量均小,随后续迭代安排修复。
关联文档清单:
- 需求卡片 reports/需求卡片-文案与禁字清扫批-2026-10-24.md(2026-10-24,零待裁点)
**归属**:①战斗叙述呈现(battle_narrator.gd,战斗表现/HUD 呈现面);②英雄信息面板(hero_info_panel_view.gd,HUD 框架)
**状态**:待写卡+已写卡+已编迭代 36
#### 棋盘战斗键盘/手柄输入(2026-10-04 登记,来源=会话提及,设计面=文档轨)
**现状**:战斗棋盘操作现行唯一输入=鼠标——左键已开格=移动/未开格=挖掘,右键=封印(封印印记一次性承诺,无移除手段),悬停承载合法性反馈(可挖域微光 + BFS 路径点迹);全仓无 InputEventKey/JoypadButton 处理,project.godot 无自定义 InputMap 动作。**可行性已核(2026-10-04):可做**——分发接缝现成,board_view `action_requested(cell, kind)`(kind ∈ {dig, move, flag_place, flag_pull})是唯一出口,键盘/手柄作第二输入前端产出同款信号即可,规则引擎合法性校验零改动;Godot InputMap 原生支持键盘与手柄绑定同一动作,与鼠标并存不冲突。用户期望操作形态:十字方向移动;挖掘/封印各一独立键;方向控制选定 8 向挖掘或封印目标(8 向恰与现行可挖域同集,十字移动与立绘 4 向既有裁决一致);键盘移动语义=逐格步进。连带设计点四条(实施批先裁):① 键盘模式需屏上光标格承载现行悬停反馈;② 键盘默认键位与手柄键位映射待定;③ 弹层界面(结算/三选一/商店/设置等)现行全鼠标,手柄全覆盖需焦点导航——是否同批待裁(2026-10-06 增补:暂停层〔现状态面板〕Esc 快捷通道并入本条随键盘批统一实施,弹层清单 +1 项);④ 键位自定义是否进设置面待裁。排期 Beta(2026-10-04 登记;可行性已核毕,立项时按 roadmap 开卡)。
@@ -579,24 +557,33 @@
### 文档与结构
#### qa/ 实现报告收尾·孤儿遗留七项(2026-10-14 登记,来源=批次移交,设计面=工程直入)
#### qa/ 实现报告收尾·孤儿遗留七项余三项(2026-10-14 登记,来源=批次移交,设计面=工程直入)
**现状**:qa 收尾批核查 iter19 系列出口报告遗留移交项时发现**不在待办清单在册**的七项(acceptance-package §三.2/card0 §5.3/followup §七.3/uibackfill §6.2-4/verify §6.1/3/7)。已结案的(tree_rules 受理闭环、X/Y 双源、S1 七项违例修复、提灯目检项、tests.yml 休眠等)已在各报告标注结案证据,不入本条。七项均为挂号备查/顺路件,无排期承诺:
**现状**:qa 收尾批核查 iter19 系列出口报告遗留移交项时发现**不在待办清单在册**的七项(acceptance-package §三.2/card0 §5.3/followup §七.3/uibackfill §6.2-4/verify §6.1/3/7)。已结案的(tree_rules 受理闭环、X/Y 双源、S1 七项违例修复、提灯目检项、tests.yml 休眠等)已在各报告标注结案证据,不入本条。2026-10-24 处置:第②③④项随迭代 36 卡C 落地销号(营地 STONE 深档六处、迷雾三关派生行、开场后缀条件加算区),第⑥项按用户 2026-10-24 裁整条注销(TG_* 装饰带非文字,不另立探针)。余三项均为挂号备查/顺路件,无排期承诺:
1. **design/diagrams 越界**(熵增闸存量红,archify 架构图批 00712d5 旧债):脚本自文「新分类先过用户拍板再改两处白名单」。修案二选一——甲=用户拍板 `design/diagrams` 入 DESIGN_SUBDIRS 白名单(archify 总图批产物归位);乙=迁出 design/ 归位合法区。**归属**:熵增闸白名单(AGENTS.md Project Layout+脚本白名单两处)
2. **开场行后缀认加算区**(iter19 卡⓪遗留):现口径=「局外加成存在才带」后缀(需求卡片字面执行);局内有加算区 flat 但无局外加成时,开场行数字含加成却不带注记——是否扩展认加算区归设计批裁定。**归属**:冒险结构/战斗开场参数面
3. **camp STONE 文字位外溢**(iter19 尾裁微批遗留):camp_overlay_view.gd:116/:403/:414 等既有 STONE 文字位对现役牌色实测 3.59-4.02:1 区间(非在册违例、机检不拦);全站收敛 STONE→STONE_DEEP 另立裁点。**归属**:呈现优化批(对比度残余位)
4. **迷雾对三关扩对**(iter19 卡②遗留):素材不入 git 致三关逐关 floor avg 实查受限,ui_contrast 迷雾测点现按在册单值 #453020;素材入库或授权读素材后,以 tools 脚本算三关逐关 avg→最亮者核合成(最坏情况判据契约 7 完整化)。**归属**:对比度探针面(前置=素材可读授权)
5. **字面量墨收测前置**(iter19 卡②遗留):bcard 属性描述/类型脚注/✓章/primary_button 字四处内联 Color8 无常量形态,收测需先在 ui_kit 立常量(呈现批顺路件,改 ui_kit 越当批面)。**归属**:呈现优化批(ui_kit 常量面)
6. **TG_* 装饰带非文字判据**(iter19 卡②遗留):卡顶类型色带为 8px Bayer 抖动装饰带(DitherBand),非文字;如需机检化(WCAG 1.4.11 非文字 3:1)另立探针段裁决。**归属**:对比度探针扩展段
7. **商店房截图纳屏**(iter19 卡①遗留):商店房截图纳屏留后续呈现批(考证结论在 shot_probe 头注)。本项原并列的「`数据配置.md:223` 历史行死指」半句已于 2026-10-21 实查核销——禁写变更记录规约生效后该文件的版本史行整段已不存在(现全文 212 行,文内零版本史行),被指对象随之消亡。**归属**:呈现批
关联文档清单:
- 需求卡片 reports/需求卡片-开场后缀营地灰字迷雾测点批-2026-10-24.md(2026-10-24,零待裁点;收第②③④项,第⑦项仍留本条)
**归属**:①熵增闸白名单 ⑤呈现优化批 ⑦呈现批——逐项见现状清单
**归属**:①熵增闸白名单 ②冒险结构/战斗开场参数面 ③⑤呈现优化批 ④⑥对比度探针面/扩展段 ⑦呈现批——逐项见现状清单
**状态**:待写卡(备选)
**状态**:待写卡(备选)+已写卡+已编迭代 36
#### 奖励节点三选一实装(2026-10-25 登记,来源=批次移交,设计面=工程直入)
**现状**:局内奖励节点现为零兑付直通占位——`game/core/level_runner.gd:462-466` `"reward"` 分支注记「奖励点内容未定…节点保留占位、零兑付直通」,实跑选路直接跳过;L1 全部模板零商店节点(`game/data/tables/level.tres` L1 行=20 battle/5 boss/5 rest/5 reward,零 shop),现行局内 bonus 唯一可达来源=L2 商店货架。而规格已定:[node-reward](design/gdd/ux/node-reward.md) v2.8=奖励节点从冒险牌库抽三选一(属性值提升与补给;与通关专长三选一同库分流),池与库存口径归[冒险结构](design/gdd/systems/冒险循环/冒险结构.md)「奖励节点三选一池」节(共享令牌库、消耗即上限)。连带影响:迭代 36 卡C 路径②原设计「奖励节点拿属性卡→下一关开场行带后缀」不可驱动,已改快照喂入形态通过;wa4 探针半(三选一停点弹层头部断言)保留为条件断言、**拦截能力未证**(test-conventions §6 口径),本条实装后须重跑该断言。
**归属**:[node-reward](design/gdd/ux/node-reward.md)(呈现)+[冒险结构](design/gdd/systems/冒险循环/冒险结构.md)(节点内容与池)——level_runner.gd 奖励节点分支+adventure 奖励节点候选
**状态**:待写卡
#### 闸与探针存量噪声两件——_round_rows 类型错与批上下文挂死(2026-10-25 登记,来源=批次移交,设计面=工程直入)
**现状**:迭代 36 批末观测到两件存量噪声(非本批引入):①`ui_click_probe` 与 `battle_log_view` 绿跑亦复现 `_round_rows`(Array[Dictionary])append String 的运行期 TypedArray 报错——日志失真但断言仍绿;②`level_shop_economy_test` 在闸批量上下文存在挂死形态(直跑恒绿),`tools/probe_gate.sh` 的 per-suite timeout 只杀 wrapper 不杀引擎子进程,孤儿泄漏会殃及后续全部 Godot 启动(批末四次闸跑批中断的根源,处置=清杀泄漏进程+删重建 `game/.godot`)。两件均登记待后续测试基建批处置。
**归属**:`game/presentation/views/battle_log_view.gd` 与 `game/probe/ui_click_probe.gd`(类型面);`tools/probe_gate.sh`(进程树回收面)——测试基建
**状态**:待写卡(备选)
#### 美术资产链路审计两项 P0 — 待用户裁决(2026-10-09 登记,来源=审计发现,设计面=双轨)
@@ -732,19 +719,6 @@
---
#### 玩家面残留禁字清扫——图例/明细/日志/字形五处(2026-10-20 登记,来源=批次移交,设计面=工程直入)
**现状**:迭代 31 卡① 已把 `game/` 的金币/插旗/雷格/惩罚格/`flag` 清零;标题里的「五处」是 2026-10-20 登记时的原述(标题为登记元数据不改),2026-10-21 逐处复查代码后**现存三处**(v3.15 命名纪律:玩家面禁「雷」,危险格对外风味=地下城陷阱/怪物巢穴):①`game/presentation/views/legend_overlay.gd:11` 图例行「插错可左键直接挖开…危险格吃**挖雷**惩罚」;②`game/presentation/views/status_slot_row.gd:40` 与 `game/data/tables/settlement.tres:14` 明细来源名 `"mine_hit": "踩雷"`;③`game/presentation/views/board_view.gd:730` 已开危险格单字字形 `glyph = "雷"`(原述 :737 系行号漂移,且文件已迁入 `views/`)。①② 原列的第③④两处(战斗日志与全屏横幅的「**完美排雷**」)已由迭代 32 卡① 换成「完美封印」,不再是残留。①② 纯文案零风险;③ 改字形会动 golden 基线,须同步重制 C 档基准。开发注记面(`game/presentation/views/ui_kit.gd:36` 常量名 `RED_MINE` 与其注释、`board_cell_unit.gd` 与数据表注记里的「雷」字内部语)属内部语,按纪律保留。
关联文档清单:
- 需求卡片 reports/需求卡片-文案与禁字清扫批-2026-10-24.md(2026-10-24,零待裁点)
**归属**:`game/presentation/views/` 与 `game/data/tables/settlement.tres`(走独立 worktree 批;③ 连带渲染基线)
**状态**:待写卡+已写卡+已编迭代 36
---
#### 结算明细日志行序重锚批(2026-10-21 登记,来源=批次移交,设计面=反哺点)
**现状**:迭代 32 卡① N7 改动互换 `seal_miss`/`insurance_used` 两行日志顺序并改写豁免态 highlight(豁免态=insurance_used 行先行且 highlight 置空;未豁免态=两行相对序不变但 `seal_miss` 发射时点后移——完整对照见 git 提交 d00f24a8 批内实现报告,报告已退役);`playtest_logger._on_step_row` 逐行落盘含 highlight 字段,与基线数据逐项比对的 JSONL sha256 校验必红,实现批按规未发起、11 号闸落 skip。**用户 2026-10-21 裁=批准另立重锚批,发起时点另定**(重锚批只能由用户发起)。