merge(master): 并入 master 新进提交(变异测试全项目清除/测试规约重编号/撤销证明口径/golden 加严/S13 基线)——本批测试面按现行规约重读复核
This commit is contained in:
commit
353c1c6bb2
39 files changed
+142
-1268
No files matched your search
@@ -43,7 +43,7 @@
|
||||
| 批次开工 / 流程纪律 | `design/engineering/process-conventions.md`——worktree 铁律、五段流水线、批次清单、测试两入口与 MC/闸机细则、像素纪律 |
|
||||
| 流水线段入口 | 技能对照——doc-design=文档设计(兼任反哺点落文)/asset-ingest=美术录入/req-card=写卡/iter-plan=迭代编排/iter=实现(五者均装于项目 `.zcode/skills/`);登记不立技能;批后收尾与中间文档退役=batch-closure(同一目录);格式与状态机权威=`design/engineering/doc-conventions.md` §12 |
|
||||
| 写代码 / 改代码前 | `design/engineering/code-conventions.md`——结构/契约/语言/数值/流程五类硬纪律(反例库 = 同目录 code-conventions-cases.md) |
|
||||
| 写测试 / 改测试前 | `design/engineering/test-conventions.md`——探针标配 / 回归断言 / 全量验证 / 验收清单落码 / 变异验证 |
|
||||
| 写测试 / 改测试前 | `design/engineering/test-conventions.md`——探针标配 / 回归断言 / 全量验证 / 验收清单落码 |
|
||||
| 写文档 / 改文档前 | `design/engineering/doc-conventions.md`——白话写作 / 载体分工 / 用语 / 结构骨架 / 会话记录与生命周期 |
|
||||
| 概念切分与互链 | `design/engineering/concept-conventions.md`——概念封装 / 跨文档引用 / 归档与事实源 |
|
||||
| 系统设计 / 增删文档 | `design/gdd/02-系统清单.md`——根索引 + 中文规范名↔英文代号对照 |
|
||||
@@ -61,8 +61,7 @@
|
||||
- 五段流水线铁律——一切工作按「登记 → 文档设计/美术设计 → 写需求卡片 → 迭代编排 → 实现」推进,段间不自动流转、每段转进由用户发令;编入迭代的卡片必须设计闭合+零待裁点,流水线闸 `tools/pipeline_gate.py` 强制(已注册进 run_all_gates.sh 文档域);实现段零裁断——卡片没写清=上游缺陷,停该卡退回上游,禁内联求裁(process-conventions §2,格式与状态机=doc-conventions §12)
|
||||
- MC/模拟:无数值改动零跑;档位硬闸见 `sim-data/README.md`「MC 采集档位表」,一档只能由用户发起
|
||||
- 闸机轮次纪律:新码先孤立验证 → 出红只跑红件最小单元 → 长批先最小参数试车 → 开工扫坑册(process-conventions §6)
|
||||
- 变异验证——新增/改写验收函数必须变异变红才算验收成立;无变异红记录只写「已实现,拦截能力未证」(test-conventions §6)
|
||||
- **验收闭合**——每个需求点与每个行为改动都要有从真实入口进入的验收断言,撤销该改动能让对应断言变红;禁删断言/放宽阈值换绿;合回前独立验收审计未过则禁止合并(细则=test-conventions §9+iter 技能第 5 步)
|
||||
- **验收闭合**——每个需求点与每个行为改动都要有从真实入口进入的验收断言,撤销该改动能让对应断言变红;禁删断言/放宽阈值换绿;合回前独立验收审计未过则禁止合并(细则=test-conventions §8+iter 技能第 5 步)
|
||||
- 规则评估——没在真实任务上评估过的规则修订,不算完成。
|
||||
- 中间产物吸收即死——结论先吸收进权威文档、未决先迁待办清单,文件即删且永不提交(doc-conventions 第 11 节)
|
||||
- **禁写变更记录**——文档与代码文件内一律禁设「版本历史/修订记录/变更记录/修改记录/更新记录/更新日志」节或表格,禁写「本版改了哪些条款」式逐版本叙述与 `# 2026-xx-xx 缺陷修批——` 式行内修订注记;沿革只进 git commit log。版本号可作文档现行身份标记留在文首状态行与正文引用中(doc-conventions 第 5 节,机检闸 gdd_lint R4 反转拦截)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -52,7 +52,7 @@
|
||||
|
||||
## 3. 测试纪律
|
||||
|
||||
已独立成文:`design/engineering/test-conventions.md`(探针标配 / 回归断言 / 提交前全量验证 / 验收清单落码规范 / 变异验证)。
|
||||
已独立成文:`design/engineering/test-conventions.md`(探针标配 / 回归断言 / 提交前全量验证 / 验收清单落码规范)。
|
||||
|
||||
---
|
||||
|
||||
|
||||
@@ -44,18 +44,17 @@
|
||||
5. **涉数值改动先采改前读数**——与改后同随机种子配对比较并写明逐项比对口径;无数值改动禁跑模拟
|
||||
|
||||
**实施**
|
||||
6. **新功能必配新测试**——新增玩法/机制必须配套新测试套件进 `tests/run_all`;没有对应测试的变更不许合并;并按 test-conventions §9 挂进改动—验收对照表,没有对照表行的行为改动同样不许合并
|
||||
6. **新功能必配新测试**——新增玩法/机制必须配套新测试套件进 `tests/run_all`;没有对应测试的变更不许合并;并按 test-conventions §8 挂进改动—验收对照表,没有对照表行的行为改动同样不许合并
|
||||
7. **验收改动先行声明**——验收变化(基线换代/探针增改/旧断言改判)预先写进需求卡片,禁事后补
|
||||
8. **验收函数变异验证**——新增/改写的验收函数(冒烟断言/探针自检/闸机判据)必须配一次变异验证:故意把被测件改坏成该类缺陷形态 → 跑最窄那道闸确认变红 → `git checkout` 精确还原;变异点/跑的闸/红输出摘要/还原结论四件记入实现报告变异验证记录表;**无变异红记录的断言不写「已验收」,只写「已实现,拦截能力未证」**(细则见 test-conventions §6);行为改动另做撤销证明(test-conventions §9.4),两类证明都记入实现报告
|
||||
|
||||
**完成**
|
||||
9. **批末按域验收才合并**——在任务 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/` 下机检脚本与闸壳)自身的改动不占合回全量——其质量义务=落批时的变异验证(test-conventions §6),闸真崩溃时合回闸 fail-closed(跑不出回执即拦),不以合回全量为兜底
|
||||
10. **合并后主区零复跑**(2026-10-24 用户裁:合回重跑验的是与回执同一份字节,零信息)——合回落地后 code 批只做两件秒级事:`--editor --quit` 重刷类名缓存(在册坑:.godot 缓存不入 git,与合并后代码失配会假红假绿)+冒烟启动确认可开机(合计约 1 分钟);docs 批零动作。全量验证**每批跑一次**=worktree 批末按域闸,顺序是「先并入 master、再跑闸」(§1 第 2 条);只有两种情形允许把这次跑作废重来——① 闸红且修法动了 `game/`,② 闸已开跑后 master 又被推进(合并将产出未测内容,由合回闸祖先判定拦下,§3.9 第六况)。「跑都跑了再跑一遍保险」「闸后顺手改点 `game/` 再补一跑」都不构成复跑理由;master 上永不跑全量
|
||||
11. **批次完成后的登记义务**——合回 master 后按 doc-conventions §12.1 推进待办清单条目状态(做完整条删除),涉及迭代编排的在 roadmap 迭代总表与顶部「当前位」节换代——执行入口=项目技能 batch-closure(批后收尾与中间文档退役),跨会话教训写记忆库。批次过程与结论由 git 提交信息承载,禁止再写会话状态文件(见 doc-conventions 第 10 节)。`design/` 与根规则文件(`AGENTS.md`/`roadmap.md`/`待办清单.md`/`体验验证清单.md`)实现批禁写,见 §12
|
||||
12. **文档同步闸(实现批禁写文档)**——实现批**禁写 `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/` 与待办清单;需求卡片必列「关联文档同步面」按两层标注
|
||||
13. **实机目检归用户,只登记不阻塞**——真人检测项登记进实现报告目检总清单与体验验证清单即完成批内义务;禁把等目检当停工理由或完成前置
|
||||
14. **中间产物吸收即死**——细则见 AGENTS.md 硬性红线与 doc-conventions 第 11 节
|
||||
15. **改动级验收闭合**——写卡期列需求侧对照表,实现期补实际对照表(测试文件:行),每个行为改动做撤销证明;合回前独立验收审计。细则=test-conventions §9
|
||||
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. **实机目检归用户,只登记不阻塞**——真人检测项登记进实现报告目检总清单与体验验证清单即完成批内义务;禁把等目检当停工理由或完成前置
|
||||
13. **中间产物吸收即死**——细则见 AGENTS.md 硬性红线与 doc-conventions 第 11 节
|
||||
14. **改动级验收闭合**——写卡期列需求侧对照表,实现期补实际对照表(测试文件:行),每个行为改动做撤销证明;合回前独立验收审计。细则=test-conventions §8
|
||||
|
||||
## 4. 测试执行两入口铁规(细则)
|
||||
|
||||
|
||||
@@ -48,52 +48,32 @@
|
||||
4. **调试注入两层(能力测试与流程体验两分法的落码面)**:自动化测试=测试代码直调核心层写口构造状态(直改数据表行/计数器/存档域,不经 UI、不走正常资源积累流程——冒烟现役做法);人工体验=DebugOverlay/DS_DEBUG 调试面,服务用户目检。清单条目的「怎么测」必须写到数据面粒度:改哪张表哪行、置哪个计数、调哪个核心写口。
|
||||
5. **换代批旧验证约束同生死**:删除旧数据行/旧实现代码的批次,必须同批摘除只验证旧实现的断言与护栏校验,由新断言替代——旧件断言残留=冒烟假绿来源;合并后冒烟全绿且全仓无旧件残留引用为证。
|
||||
|
||||
## 6. 变异验证——验收函数的拦截能力自证
|
||||
|
||||
测试绿只证明「当前代码没犯这个错」,不证明「犯了这个错会被抓住」。新增或改写的验收函数(冒烟断言/探针自检/闸机判据)必须配一次变异验证,把拦截能力自证一遍。**无变异红记录的断言不写「已验收」,只写「已实现,拦截能力未证」。**
|
||||
|
||||
行为改动的撤销证明见 §9.4。新增或改写断言用变异验证;修改既有行为用撤销证明。两者不互相代替:变异证明断言能抓这一类缺陷,撤销证明断言真的钉在这次改动上。
|
||||
|
||||
**操作四步(逐条落实现报告变异验证记录表)**:
|
||||
|
||||
1. **注入**——把被测件改坏成该类缺陷的最小形态(翻装配序、注释一行 `add_child`、把状态源取反、把层 `visible` 置 false)。一次只注入一处;可直接改源码,不必留长期开关。
|
||||
2. **跑最窄的那一道闸**——只跑能覆盖该断言的最小单元(单冒烟脚本/单探针/单比对命令),禁跑全套闸(见 process-conventions §6 闸机轮次纪律)。判据:注入后该断言**必须变红**;红在别处而目标断言仍绿=判据没打在缺陷上,按第 4 条处理。
|
||||
3. **精确还原**——`git checkout -- <文件>`(不用 `git stash`、不手工回改,防残留)。还原后复跑同一道闸确认回绿,才算本轮闭环。
|
||||
4. **记录**——变异点(文件:行)、跑的闸、红输出摘要、还原结论,逐条进实现报告记录表。
|
||||
|
||||
**变异不红怎么办(二选一,不许含糊带过)**:
|
||||
|
||||
- **改判据**——把断言打到真正的缺陷面上(例:断言「菜单标题可见」只查截图墨色占比时,把菜单层藏起来仍不红——底层棋盘透过标题框照样给出高反差像素;改查 `is_visible_in_tree` 或加 golden 逐像素比对才红)。
|
||||
- **如实标注拦截边界**——判据本身只覆盖弱面的(如「只证伪整框空白/整框糊,不证明框里是何内容」),在断言注释与报告里写明边界,并说明强判据由哪一件承担。
|
||||
|
||||
**判据强弱分层**:同一缺陷面往往需要多件配合——**可见性/状态源类**缺陷由 `is_visible_in_tree`、树序、状态源取值的**运行期断言**抓;**内容/观感类**缺陷由 **golden 逐像素比对**抓;**占比/统计类**判据(墨色占比、纹理幅度)只能兜「整框空白/整框糊/压 busy 纹理」,是补充不是主力。写卡时按此分层配齐,别指望一条断言包打。
|
||||
|
||||
## 7. 判定三硬闸——闸承载的构造义务(迭代 29 起)
|
||||
## 6. 判定三硬闸——闸承载的构造义务(迭代 29 起)
|
||||
|
||||
任何**新增或改写的闸承载**(闸脚本/批跑编排/探针入口)必须三闸齐备;现行各闸状态登记归架构文档「测试与质量域」节(本文不另列闸件清单):
|
||||
|
||||
1. **退出码为唯一权威判据**——输出里的 PASS 串只作附加判据不作判据主体;打印 PASS 后 `quit(1)` 必须判红。
|
||||
2. **SCRIPT ERROR / Parse Error 扫描面在位**——GDScript 脚本错误不改进程退出码、不计失败数(机制事实见 §8),错误标记必须扫输出,且判据必须覆盖「跑了但半途脚本错误」态——退出码 0 但输出缺预期签名同样判红(防静默退出)。
|
||||
2. **SCRIPT ERROR / Parse Error 扫描面在位**——GDScript 脚本错误不改进程退出码、不计失败数(机制事实见 §7),错误标记必须扫输出,且判据必须覆盖「跑了但半途脚本错误」态——退出码 0 但输出缺预期签名同样判红(防静默退出)。
|
||||
3. **断言数下限**——零断言的正常返回与断言失败必须区分开(现行做法:`Kit.finish` 零断言返回专用退出码 2,不与「断言失败=1」混用,否则致命类套件的期望码协议会放过空跑)。
|
||||
- 负面套件(测试目标就是产生错误输出)仅可豁免第 2 闸,且须在 manifest 显式标记,其余两闸照判。
|
||||
- 子进程输出须经系统命令解释器重定向落盘再读——`OS.execute` 的输出管道在本机恒空。
|
||||
|
||||
**新写测试件全类型标注**——新写的测试件(冒烟断言/探针/单测)参数、返回值、容器一律带类型标注,与 S9 对产品码的要求同型;存量不强制清扫,被批次触碰时顺带换代。暂不机器闸(S9 扫描面=产品码,probe/sim/tests 不在扫描面是测量面直构惯例的既有裁量)。
|
||||
|
||||
## 8. 判定可靠性优先于覆盖率(迭代 29 核心命题)
|
||||
## 7. 判定可靠性优先于覆盖率(迭代 29 核心命题)
|
||||
|
||||
- 「跑一遍没崩=通过」无效:测试绿只证明**当前代码没犯这个错**,不证明**犯了这个错会被抓住**;断言存在不等于断言执行。
|
||||
- **脚本错误会静默中断所在函数的剩余断言,而套件仍报全绿**(机制事实):GDScript 无脚本错误陷阱 API,错误不改进程退出码、不计失败数。三处实证:①2026-09-19「309 项 0 失败」实为断言未跑全(状态记录 83);②敌人表行集纪律 10 条断言因定型数组赋值错误从未执行(迭代 29 修复后两条正向见红=夹具本缺锚行);③`Callable` 形参类型写错致解析函数返回 null、后续断言整段蒸发。
|
||||
- 由此产生两条义务:**写闸件**按 §7 配三硬闸;**写验收函数**必须自证断言全数执行——变异验证(§6)为主证,反例实证(构造缺陷态改前判绿/改后判红)与零命中自检(扫描面为空即判红)为辅证。
|
||||
- 由此产生两条义务:**写闸件**按 §6 配三硬闸;**写验收函数**必须自证断言全数执行——撤销证明(§8.4)为主证,零命中自检(扫描面为空即判红)为辅证。
|
||||
- **覆盖率不是目标**:行覆盖率度量缺失(Godot 无内建,第三方属新基建,是否引入待办清单在册待裁);现行补洞=零指名单测清单+人工判定,判定可靠性靠上列自证手段,不靠覆盖率数字。
|
||||
|
||||
## 9. 改动级验收闭合(2026-10-21 立)
|
||||
## 8. 改动级验收闭合(2026-10-21 立)
|
||||
|
||||
### 9.1 验收单位是行为改动
|
||||
### 8.1 验收单位是行为改动
|
||||
|
||||
一个行为改动 = 新增或修改一条函数、一条数据、一处接线、一个生命周期行为、一条玩家可见文案。纯改名、注释、格式化不算行为改动,但必须在对照表里单独列一行写「非行为改动」及判断依据。禁止用「重构」两个字把行为改动藏起来。
|
||||
|
||||
### 9.2 四层与真实入口
|
||||
### 8.2 四层与真实入口
|
||||
|
||||
- **单元**:不依赖场景树和真实宿主的纯逻辑;测试直接调用被测函数。
|
||||
- **接口**:模块边界的公开契约——数据表加载、存档与断点、事件载荷、命令接口;测试从公开入口进出。
|
||||
@@ -102,11 +82,11 @@
|
||||
|
||||
分层不是形式。改动发生在哪一层,验收就必须从那一层的真实入口进入。测试绕过了改动点,就不算这个改动的验收——这正是「断言存在、接线坏了却不红」的来源。
|
||||
|
||||
### 9.3 改动—验收对照表
|
||||
### 8.3 改动—验收对照表
|
||||
|
||||
需求卡片列需求侧对照表;实现报告列实际对照表。每行至少六格:
|
||||
|
||||
| 需求点 | 改动(文件:行/行为) | 验收测试(名称+文件:行+尾缀) | 层级 | 真实入口 | 撤销或变异证明 |
|
||||
| 需求点 | 改动(文件:行/行为) | 验收测试(名称+文件:行+尾缀) | 层级 | 真实入口 | 撤销证明 |
|
||||
|---|---|---|---|---|---|
|
||||
|
||||
实现报告另加「结果」格(绿/红/未过及依据)。两端都要对上:
|
||||
@@ -117,23 +97,23 @@
|
||||
|
||||
**验证集清单维护锚(2026-10-22 用户裁)**:`game/tests/验证集清单.md` 是迁移断言全体的冻结参照清单(机器提取生成、只剪切禁改写、出口逐条核对,机制见该文件头注;清单自断言迁移批第 0 步建立时起存在)——清单在册后,任何断言**新增、删除或改判**必须同步该清单,与改动—验收对照表同一条纪律:清单没跟上的断言改动视同未完成。
|
||||
|
||||
### 9.4 撤销证明
|
||||
### 8.4 撤销证明
|
||||
|
||||
- **修改既有行为**:只撤销该改动(回退该 hunk 或该处接线)→ 跑能覆盖它的最窄测试 → 对应断言必须变红 → 还原 → 复绿。
|
||||
- **新增行为**:用 §6 的变异办法把新代码改坏成最小缺陷形态 → 对应断言必须变红。
|
||||
- **新增行为**:只撤销该新增(回退该 hunk 或删去该新增段)→ 跑能覆盖它的最窄测试 → 对应断言必须变红 → 还原 → 复绿。
|
||||
- **撤销后仍然绿**:说明断言没钉在这个改动上,判缺漏;不得用「代码能跑通」代替。
|
||||
- **判据绑可观测提交面**:端到端断言的判据要绑「被测改动特有的可观测提交面」(信号发射、事件、入参、绘制记录),不绑多层防御之后的终态——否则单点变异可能被下游兜底吸收,终态不变而假绿。例:探针「雾不扩可点域」首版只看屏/选路态终态,命中面放宽的变异仍绿;改绑 `route_chosen` 发射面后变异即红。
|
||||
- 每张任务卡至少一条撤销或变异记录;持久化、生命周期、存档、跨战共享这类接线逐行做。
|
||||
- **判据绑可观测提交面**:端到端断言的判据要绑「被测改动特有的可观测提交面」(信号发射、事件、入参、绘制记录),不绑多层防御之后的终态——否则改动被下游兜底吸收时终态不变、断言假绿。例:探针「雾不扩可点域」首版只看屏/选路态终态,命中面放宽后断言仍绿;改绑 `route_chosen` 发射面后即红。
|
||||
- 每张任务卡至少一条撤销证明记录;持久化、生命周期、存档、跨战共享这类接线逐行做。
|
||||
|
||||
### 9.5 禁止削弱测试
|
||||
### 8.5 禁止削弱测试
|
||||
|
||||
实现期不得为了让测试变绿而删除断言、放宽阈值、缩小扫描面、把真实入口换成下层直调。确需改判据=需求卡片没写清=上游缺陷:停该卡、呈报退回写卡段,不在实现期自行决定。卡片可预先声明允许改动的旧断言及理由;未声明的削弱由独立审计判红。
|
||||
|
||||
### 9.6 测试时机
|
||||
### 8.6 测试时机
|
||||
|
||||
不要求 TDD,不要求先红后绿。允许实现后补测试;但补的测试必须通过 §9.4 的撤销证明。实现完再补、补完就绿,不算验收。
|
||||
不要求 TDD,不要求先红后绿。允许实现后补测试;但补的测试必须通过 §8.4 的撤销证明。实现完再补、补完就绿,不算验收。
|
||||
|
||||
### 9.7 独立验收审计
|
||||
### 8.7 独立验收审计
|
||||
|
||||
合并前由没有参与实现的会话或子代理做一次审计。审计只读需求卡片、实际对照表、diff、测试文件和实现报告,自己跑最窄测试抽查,不采信报告里的「已全绿」。审计至少做三件事:
|
||||
|
||||
@@ -143,6 +123,6 @@
|
||||
|
||||
审计报告落 `reports/iter<N>-验收审计-<日期>.md`,逐行写「通过/缺漏/例外及依据」。未通过不得合并。测试执行两入口铁规不变:审计在迭代 loop 内启动的子代理算 loop;另开会话须用户点名。
|
||||
|
||||
### 9.8 生效与旧卡
|
||||
### 8.8 生效与旧卡
|
||||
|
||||
本规自 2026-10-21 起对文件名日期不早于该日的需求卡片生效;旧卡不回头改。旧卡在开工前缺对照表的,由写卡段补,补完再开工。
|
||||
@@ -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) | "同一轮拿满优于跨轮慢慢叠"——增益有结算次数衰减,教学要传达这个节奏 |
|
||||
|
||||
@@ -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 卡③〔时名暂停层〕——实机目检待用户,待办清单登记条在册)。
|
||||
|
||||
### 单局循环零依赖:排期边界的推论
|
||||
|
||||
|
||||
@@ -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) | 局内符号/徽标即时解码 | 不合并——图例是局内解码面,图鉴是跨局收集面 |
|
||||
|
||||
@@ -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 默认不刷(钓鱼归玩家)。
|
||||
|
||||
@@ -613,7 +613,7 @@ func breakpoint_snapshot() -> Dictionary:
|
||||
|
||||
# 旧隐式单档一次性迁移(Q1 甲,sv12):src 字节级原样搬运到 dst(零解析零改造——损坏/高版本
|
||||
# 旧档字节原样落槽 1,读取时由正式进档路径的兜底/拒读链接管,不静默丢数据);
|
||||
# dst 已存在不重迁(幂等判据——变异④锚点:去判据则重复迁移覆盖槽 1);迁移成功后 src 改名
|
||||
# dst 已存在不重迁(幂等判据——判别锚④:去判据则重复迁移覆盖槽 1);迁移成功后 src 改名
|
||||
# bak 留痕(不删——处置字节留痕,防再次隐式读写)。任一步失败:源保留原地,下次启动重试。
|
||||
# tmp+rename 原子形态与 write_to_disk 同纪律。生产调用=src/dst/bak 为 旧单档/槽 1/留痕名。
|
||||
func _migrate_legacy_save(src: String, dst: String, bak: String) -> void:
|
||||
|
||||
@@ -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"]
|
||||
|
||||
@@ -69,9 +69,9 @@ func _check_one(label: String, main: Node) -> void:
|
||||
elif not vr.encloses(r):
|
||||
_problems.append("[%s] %s 越视口 %s ⊄ %s" % [label, key, r, vr])
|
||||
# 判据覆盖边界(如实记录,勿当已拦截):本探针按名点名三区做几何判定,
|
||||
# 不遍历战斗屏宿主的全部后代。变异验证第二发证——向装配器注入一个全幅 ColorRect
|
||||
# (挂在 battle_root 的内层根下)时探针仍全绿:「未登记兄弟控件」这一缺陷类不在本探针
|
||||
# 拦截面内。要拦它得改为递归遍历全子树找重叠,那是另一套判据(且极易误报容器父子关系),
|
||||
# 不遍历战斗屏宿主的全部后代——「未登记兄弟控件」(如向装配器塞一个挂在
|
||||
# battle_root 内层根下的全幅 ColorRect)这一缺陷类不在本探针拦截面内,探针对此仍全绿。
|
||||
# 要拦它得改为递归遍历全子树找重叠,那是另一套判据(且极易误报容器父子关系),
|
||||
# 本探针不设此判据。
|
||||
var bv: Control = main.board_view
|
||||
if bv == null:
|
||||
|
||||
@@ -444,7 +444,7 @@ func _save_select_contract(main: Node, tpl: String) -> void:
|
||||
if not has_keystone:
|
||||
problems.append("[savesel] 槽1 钥石徽读数缺失(应=钥石 555)〔sl2〕")
|
||||
# sl3 摘要禁项:断点/种子/「继续」/停点/「 关」(关数形——「通关」无空格不误伤)零命中
|
||||
#(裁决 4——零未完冒险读数;词形覆盖=对照表 sl3 变异「断点关数拼进槽卡」的拦截面)
|
||||
#(裁决 4——零未完冒险读数;词形覆盖=对照表 sl3 缺陷形态「断点关数拼进槽卡」的拦截面)
|
||||
for needle in ["断点", "种子", "继续", "停点", " 关"]:
|
||||
for t in all_texts:
|
||||
if t.contains(needle):
|
||||
|
||||
@@ -12,6 +12,9 @@
|
||||
- **判有效**(changed 远低于 2% 阈值):基线**留在位并在此加注一次判定记录**,不得顺手重制;
|
||||
- **判失效**(changed 超阈值或换代面落在裁剪区外):按迭代 26 T6 先例**显式重制 + 呈报 + 复闸**,
|
||||
禁止先动后判、禁止用「重制一下就绿了」掩盖真实视觉回归。
|
||||
- **加严口径(棋盘三图)**:棋盘图 changed>0 且差异像素落在棋盘裁剪区内(900×760)一律按**判失效**
|
||||
处理——占比远低于 2% 阈值也不判有效,显式呈报后由用户定是否重制。该口径只收紧棋盘三图的判读,
|
||||
不改写 2% 容差本身的语义(`golden_compare.py` 判据不动);启动态菜单不适用本口径。
|
||||
|
||||
## 判定记录
|
||||
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
# 战斗结算 fresh 池攻击链回归(Bug#2——池空时按掷点档位足额兑现)
|
||||
# 协议照单元侧惯例:extends SceneTree+Kit.check 主通道;--script 模式无 autoload,
|
||||
# ConfigDB 显式实例化构造注入(各套自建 RngService——源套掷点隔离形态,宿主不持统一流);
|
||||
# 表加载失败不中止(沿被迁断言面的源语义——诊断在此展开,表值变异的红由具体断言落,承 G2/G3 同款)。
|
||||
# 表加载失败不中止(沿被迁断言面的源语义——诊断在此展开,表值走偏的红由具体断言落,承 G2/G3 同款)。
|
||||
# 运行:godot --headless --path game --script res://tests/unit/battle_settlement/roll_multiplier_test.gd
|
||||
extends SceneTree
|
||||
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
# 格面资源资格面(揭示事件 resource 标记 + 封锁格身份查询)
|
||||
# 协议照单元侧惯例:extends SceneTree+Kit.check 主通道;--script 模式无 autoload,
|
||||
# ConfigDB 显式实例化构造注入(各套自建 RngService——源套掷点隔离形态,宿主不持统一流);
|
||||
# 表加载失败不中止(沿被迁断言面的源语义——诊断在此展开,表值变异的红由具体断言落,承 G2/G3/G4 同款)。
|
||||
# 表加载失败不中止(沿被迁断言面的源语义——诊断在此展开,表值走偏的红由具体断言落,承 G2/G3/G4 同款)。
|
||||
# 运行:godot --headless --path game --script res://tests/unit/battle_settlement/seal_polarity_test.gd
|
||||
extends SceneTree
|
||||
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
# 地图战斗资源·伤害量值区间(中点锚 / 域内 / 流动 / 定值不受扰)
|
||||
# 协议照单元侧惯例:extends SceneTree+Kit.check 主通道;--script 模式无 autoload,
|
||||
# ConfigDB/RngService 显式实例化构造注入(统一流 master 种子 42 沿源);
|
||||
# 表加载失败不中止(沿被迁断言面的源语义——诊断在此展开,表值变异的红由具体断言落,承 G2 同款)。
|
||||
# 表加载失败不中止(沿被迁断言面的源语义——诊断在此展开,表值走偏的红由具体断言落,承 G2 同款)。
|
||||
# 运行:godot --headless --path game --script res://tests/unit/core/board_gen_reward_test.gd
|
||||
extends SceneTree
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
# 天赋树六键行为(先手窗/危险直觉限次/守侧五场景/财富之道聚散)
|
||||
# 协议照单元侧惯例:extends SceneTree+Kit.check 主通道;--script 模式无 autoload,
|
||||
# ConfigDB 显式实例化构造注入;表加载失败不中止(沿被迁断言面的源语义——诊断在此展开,
|
||||
# 表值变异的红由具体断言落,承 G2/G3/G4/G5 同款);全局 class_name(Attunement/EffectEngine/
|
||||
# 表值走偏的红由具体断言落,承 G2/G3/G4/G5 同款);全局 class_name(Attunement/EffectEngine/
|
||||
# EffectContext)裸用(--script 模式全局类在册,G3 先例)。
|
||||
# 运行:godot --headless --path game --script res://tests/unit/core/meta_progression_forge_test.gd
|
||||
extends SceneTree
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# tests/unit/core/save_boot_no_activate_test.gd — 卡① sv2/sv3:启动态钉死类级契约
|
||||
# (无参实例=无激活态、内存=默认合法空态、无激活写盘一律拒绝并返回 false 且盘面零触碰
|
||||
# 〔含空路径派生的裸 ".tmp" 退化写目标——拆闸变异的可判别锚〕、MetaProgression.settle_adventure
|
||||
# 〔含空路径派生的裸 ".tmp" 退化写目标——拆闸缺陷的可判别锚〕、MetaProgression.settle_adventure
|
||||
# 生产链无激活触达写盘被拒、访问器 fail-safe 合法空值、越界槽号拒绝。
|
||||
# 真实 autoload boot 链断言在冒烟 V2-s1..s4 段——--script 模式无 autoload,本套件为类级
|
||||
# 白盒面+生产链对照,双落点在实现报告实际对照表对账。)
|
||||
@@ -38,7 +38,7 @@ func _test_no_arg_instance_has_no_activation() -> void:
|
||||
|
||||
# ② 无激活态写盘一律拒绝并返回 false,盘面零触碰(sv3 类级——真实入口=冒烟 V2-s3 生产链)
|
||||
# 判别锚:空 _path 的退化写目标=裸 ".tmp"(落 res://,拆闸实验实测杂散落点)——
|
||||
# 断言先清退化目标再核零新增,闸短路变异(拒绝口旁路、写盘真实发生)必红。
|
||||
# 断言先清退化目标再核零新增,闸短路缺陷(拒绝口旁路、写盘真实发生)必红。
|
||||
func _test_write_rejected_without_target() -> void:
|
||||
var sm := SaveManagerScript.new()
|
||||
var before := {}
|
||||
|
||||
@@ -388,7 +388,7 @@ func _smoke_save_slots() -> void:
|
||||
Kit.check("sv6 删槽 2 槽 1 字节不动(位间互隔离)〔卡① sv6〕",
|
||||
FileAccess.get_file_as_bytes(slot_tpl % 1) == slot1_before)
|
||||
|
||||
# ③ 新档原语(sv4):非白板旧内容覆盖为全零可玩白板(判别锚:新档禁读旧档——变异可红),
|
||||
# ③ 新档原语(sv4):非白板旧内容覆盖为全零可玩白板(判别锚:新档禁读旧档——判据撤除即红),
|
||||
# 创建即激活并落盘(生产路径只在空槽调用;本段预置旧内容是对原语白板保证的钉死,超生产面)
|
||||
var fold := FileAccess.open(slot_tpl % 3, FileAccess.WRITE)
|
||||
fold.store_string(JSON.stringify({"version": 7, "meta": {"keystone_balance": 999,
|
||||
|
||||
@@ -119,7 +119,7 @@ func _has_cat(errs: Array, cat: String) -> bool:
|
||||
return false
|
||||
|
||||
|
||||
# 多字段变异器(lambda 单表达式装不下的用例——命名函数承载)
|
||||
# 多字段改值器(lambda 单表达式装不下的用例——命名函数承载)
|
||||
func _mut_spear_initial(t) -> void:
|
||||
t.routes[1]["initial_owned"] = true
|
||||
t.routes[1]["prereq_route"] = ""
|
||||
|
||||
@@ -70,10 +70,10 @@ func _test_negative() -> void:
|
||||
_row(2, 9, 0.5, [0.5, 0.2, 0.15, 0.15], 2, 2, 6),
|
||||
_row(3, 13, 0.7, [0.55, 0.15, 0.15, 0.15], 2, 3, 8)]
|
||||
Kit.check("合法三行域校验零错误(夹具自证)〔fv2〕", _table(base).validate().is_empty())
|
||||
# ① L1 出口改 2 → 出口恒 1 断言红(变异步同款)
|
||||
# ① L1 出口改 2 → 出口恒 1 断言红(负样本夹具)
|
||||
var bad_l1_exit := [_row(1, 6, 0.3, [0.5, 0.2, 0.2, 0.1], 1, 2, 4), base[1], base[2]]
|
||||
Kit.check("L1 出口=2 被拒(出口 L1 恒 1 已锁)〔fv2〕", not _table(bad_l1_exit).validate().is_empty())
|
||||
# ② 配比合计 0.5 → 合计 1 断言红(变异步同款)
|
||||
# ② 配比合计 0.5 → 合计 1 断言红(负样本夹具)
|
||||
var bad_ratio := [_row(1, 6, 0.3, [0.2, 0.1, 0.1, 0.1], 1, 1, 4), base[1], base[2]]
|
||||
Kit.check("配比合计 0.5 被拒(四类合计 1 已锁)〔fv2〕", not _table(bad_ratio).validate().is_empty())
|
||||
# ③ 层深低于下限
|
||||
|
||||
@@ -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 正向半随之重写卡。
|
||||
@@ -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 ⑤。
|
||||
@@ -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 产出物缺口,**已补齐**(本节+反哺点 ⑨–⑬+代拍板卡③节),转通过。
|
||||
@@ -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「审计逐行通过才合并」)在本报告转通过前不满足。
|
||||
@@ -1,7 +1,7 @@
|
||||
# 需求卡片:S9 类型闸正则修复批(R2 恒零命中+static 漏网+跨行签名盲区·存量归零)
|
||||
|
||||
- 版本:**v1.2**(2026-10-24 v1.0 成文→2026-10-25 grilling 第一轮修订 v1.1〔两阻断+三应修折入〕→第二轮复核**通过**(B-1 定界链经独立核实成立:iter36 禁令文+gdstyle 禁令后在库先例 01774323+登记口径三证据齐),一条建议级修正折入定稿;复核结论见 §12)
|
||||
- 来源:[待办清单](../待办清单.md)「S9 类型闸正则失灵修复——R2 恒零命中+static 函数漏网」(2026-10-24 登记,来源=审计发现,设计面=工程直入,状态=待写卡+已写卡)(唯一事实源:工程直入证据指认=审计报告 [reports/审计-game代码结构审查-2026-10-24.md](审计-game代码结构审查-2026-10-24.md) §二 C1〔已独立复现〕+本写卡会话逐处实查〔本卡 §3〕;规约依据=[test-conventions](../design/engineering/test-conventions.md) §6〔闸件改动的变异验证义务——gdstyle 批在库先例 01774323〕+2026-10-24 用户 P0 令〔行为改动验收只走撤销证明——本批产品码面零行为差,见 §4 契约 3 定界〕)
|
||||
- 来源:[待办清单](../待办清单.md)「S9 类型闸正则失灵修复——R2 恒零命中+static 函数漏网」(2026-10-24 登记,来源=审计发现,设计面=工程直入,状态=待写卡+已写卡)(唯一事实源:工程直入证据指认=审计报告 [reports/审计-game代码结构审查-2026-10-24.md](审计-game代码结构审查-2026-10-24.md) §二 C1〔已独立复现〕+本写卡会话逐处实查〔本卡 §3〕;规约依据=[test-conventions](../design/engineering/test-conventions.md) §8.4〔一切改动的撤销证明义务〕+2026-10-24 用户全项目 P0 禁令〔变异类测试全项目禁用、闸件改动无豁免——见 §4 契约 3 与 D4〕)
|
||||
- 归属:`tools/audit_type_hints.py`(正则修复)+ `game/core/`、`game/presentation/` 存量注解/豁免补齐(闸件批,**非迭代批**——gdstyle 批同款执行形态)
|
||||
- 排期:非迭代批不占迭代号,独立 worktree 批;估时 ≈0.75–1 工作日
|
||||
- 开工门:U0(用户发令)+ grilling 复核门过(§12);与卡①先后皆可(§0)
|
||||
@@ -11,11 +11,11 @@
|
||||
- **第〇步核对(2026-10-24 写卡会话)**:来源条目设计面=工程直入、状态=待写卡,条目现状带行号级证据(审计 §二 C1,正则两洞经 python 逐条对拍独立复现)→ **放行写卡**。
|
||||
- **与卡①(game 行为缺陷定点修批,同批写卡)**:零 hunk 交叠(grilling 实查确认:main.gd:565 vs :712/:1486、level_runner:632 vs :779/:895、unit_container:275 vs :55/:257/:270 皆同文件不同 hunk);卡① d18 已替本批消掉 `board_view.gd:998` 一件存量红——本批 T0 存量清点以**本批开工时盘面**为准(两卡先后皆可;若本批先行,卡①新增代码须全类型,其卡 §0 已注记)。
|
||||
- **与 gdstyle S13(2026-10-24 已落地,commit 01774323/8cdeb180)**:gdstyle 配置只开 quality/*、format/naming/order 全关——与 S9 类型面零重叠(其条目预告口径已兑现);本批产品码注解改动落在 S13 扫描面,禁产生基线外新违规。
|
||||
- **改动域**:本批混触 `tools/`(文档域路径)与 `game/`(代码域路径)——批末闸档按 `tools/run_all_gates.sh` 自身域划分判定执行(域划分唯一出处=脚本头注 :10-15;卡内不另列清单);闸件自身改动的质量义务=变异验证(§4 契约 3/§7 T2)。
|
||||
- **改动域**:本批混触 `tools/`(文档域路径)与 `game/`(代码域路径)——批末闸档按 `tools/run_all_gates.sh` 自身域划分判定执行(域划分唯一出处=脚本头注 :10-15;卡内不另列清单);闸件自身改动的质量义务=撤销证明(§4 契约 3/§7 T2;2026-10-24 用户全项目禁令,闸件改动无豁免)。
|
||||
|
||||
## 1. 目标与完成定义
|
||||
|
||||
**目标**:修复 `audit_type_hints.py` 的 `FUNC_DECL` 识别面三个洞,使 R2/R3 对「无返回类型带 `:` 尾的声明」「`static ` 前缀函数」「参数表折行的跨行签名」恢复命中能力;随后把浮出的全部存量红清零(补类型注解优先、`# type-hint: ignore` 带理由豁免兜底),闸退出码归 0;闸改动配变异验证(test-conventions §6)。
|
||||
**目标**:修复 `audit_type_hints.py` 的 `FUNC_DECL` 识别面三个洞,使 R2/R3 对「无返回类型带 `:` 尾的声明」「`static ` 前缀函数」「参数表折行的跨行签名」恢复命中能力;随后把浮出的全部存量红清零(补类型注解优先、`# type-hint: ignore` 带理由豁免兜底),闸退出码归 0;闸改动配撤销证明(test-conventions §8.4)。
|
||||
|
||||
**改动单元清单**(钉值表,🔴 契约 1):
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
|
||||
1. g1 三洞修复落地,规则语义零变化(R1 用独立正则 R1A/R1B 不受影响——T0 记改前 R1 读数、T2 对拍同值);
|
||||
2. g2 存量红全量清点并归零:退出码 0、逐处红清单与处置(注解/豁免+理由)成表落实现报告;
|
||||
3. 变异验证四步记录齐(§7 T2——闸件改动的拦截能力自证,gdstyle 批同款义务);无变异红记录只准写「已实现,拦截能力未证」;
|
||||
3. 撤销证明记录齐(§7 T2——闸件改动的拦截钉面自证);撤销后仍绿=断言没钉在这个改动上,判缺漏;
|
||||
4. 批末按 `run_all_gates.sh` 域口径选档全绿(S9 段 PASS 归零;S13 基线零新增)+改前改后读数对拍;产出物写齐(T3)。
|
||||
|
||||
## 2. 设计事实源
|
||||
@@ -36,9 +36,9 @@
|
||||
| # | 出处 | 取用条款 |
|
||||
|---|---|---|
|
||||
| D1 | 工程直入证据指认=审计报告 §二 C1(正则行为经 python 逐条对拍独立复现;实证存量清单)+本写卡会话实查(§3) | 两洞机理与存量下限 |
|
||||
| D2 | [test-conventions](../design/engineering/test-conventions.md) §6 | 闸机判据改写必须变异验证自证拦截能力;操作四步+记录表——**gdstyle 闸件批在库先例**(commit 01774323「变异验证:注入重复 load 红令→还原绿」同款义务与形态) |
|
||||
| D2 | [test-conventions](../design/engineering/test-conventions.md) §8.4 | 闸机判据改写必须配撤销证明钉住改动:只撤销该判据改动→最窄闸见红→精确还原→复绿记录——**gdstyle 闸件批在库先例**(commit 01774323「重复 load 红令→还原绿」同款形态) |
|
||||
| D3 | [architecture](../design/engineering/architecture/architecture.md) 测试与质量域节 S9 行+static_scan 头注 | S9 载体=`tools/audit_type_hints.py`(R1/R2/R3 判据文字=现行规则语义,本批零变化);「规则扫描面为空=恒绿」静默失效模式自警在案 |
|
||||
| D4 | 2026-10-24 用户 P0 令(iter36-实现报告 §纪律变更段在案)+用户本批任务口径「闸改动配变异验证(test-conventions §6)」 | **定界**:行为改动验收只走撤销证明、禁注入造红;**闸件改动**的拦截能力自证走 §6 变异验证(用户任务口径+gdstyle 在库先例)——两条纪律的适用面互斥不冲突,规则文本修正归文档批(§11 呈报) |
|
||||
| D4 | 2026-10-24 用户全项目 P0 禁令(变异类测试全项目禁用,**闸件改动无豁免**;一切验收只走撤销证明) | 本卡一切验证面(含闸件判据改动)一律撤销证明:只撤销该改动→最窄闸见红→`git checkout` 精确还原→复绿记录;撤销后仍绿=判据没钉在改动上,判缺漏。旧「闸件豁免」定界句作废 |
|
||||
| D5 | [code-conventions](../design/engineering/code-conventions.md) §4(语言纪律——类型闸为其机器闸) | 注解补齐的产品面纪律依据 |
|
||||
|
||||
## 3. 现状事实(2026-10-24 写卡会话实查+2026-10-25 grilling 独立补查;开工日 T0 复核)
|
||||
@@ -58,13 +58,13 @@
|
||||
|
||||
🔴 **契约 2 · 存量清零双通道纪律**:补类型注解优先(产品码可注解处一律注解——duck-typed 注入面如 `db_ref`/`panel_ref` 可注真实类型或以 `# type-hint: ignore(理由)` 豁免);每处豁免行内带理由(G4 格式);禁用「删参数/改签名」替代注解(那是行为改动,越本批权——本批产品码面**零行为差**,与 P0 令的定界依据)。
|
||||
|
||||
🔴 **契约 3 · 变异验证义务(闸件改动)**:g1 为改写闸机判据——四步变异记录齐(§7 T2,gdstyle 批同款),无变异红=「拦截能力未证」如实落报告,不得写「已验收」;**变异实验只在闸件与本批注解面上做**(注入探针函数→闸红→还原),禁在生产行为面上做。
|
||||
🔴 **契约 3 · 撤销证明义务(闸件改动)**:g1 为改写闸机判据——撤销证明记录齐(§7 T2,gdstyle 批同款形态),撤销后仍绿=「断言未钉在改动上」判缺漏,不得写「已验收」;**回退实验只在闸件与本批注解面上做**(回退该判据改动→闸红→还原),禁在生产行为面上做。
|
||||
|
||||
🔴 **契约 4 · 实证址全覆盖**:T1 清点后 G3 所列实证址(含 hud_presenter:12-13 与 tune_sim_controller:24)必须全部出现在红清单或已注解命中——任一实证址未浮出即 L3 停机呈报(第三洞拼接实现有缺陷的第一信号),禁静默放过。
|
||||
|
||||
## 5. 范围边界
|
||||
|
||||
**做**:g1 三洞+g2 存量清零+变异验证+产出物。
|
||||
**做**:g1 三洞+g2 存量清零+撤销证明+产出物。
|
||||
|
||||
**不做**(明示去向):
|
||||
- 第四类新洞(如 lambda 函数体、多行返回类型)——本批三洞为审计 C1 两洞+写卡会话静态证明必需的第三洞;再有发现走 L3 呈报;
|
||||
@@ -79,7 +79,7 @@
|
||||
| 文档 | 关联点 | 同步义务 |
|
||||
|---|---|---|
|
||||
| [architecture](../design/engineering/architecture/architecture.md) 测试与质量域节 S9 行 | 「S9 在位」陈述不变(修复是实现到位非规则增删)——写卡会话核对该节无「正则形态」级陈述 | 无关联文档(查讫) |
|
||||
| [test-conventions](../design/engineering/test-conventions.md) §6(变异验证条款) | 与 2026-10-24 P0 令的定界(闸件改动保留变异验证/行为改动只走撤销证明)需一句适用面注记——规则文本修正归文档批(iter36 报告 §纪律变更段已预告) | 反哺点 · 列清单(①:定界句草案呈用户裁决后落文) |
|
||||
| [test-conventions](../design/engineering/test-conventions.md) §6(旧条款) | 规则文本修正已由 2026-10-24 文档批完成——§6 退役、验收一律撤销证明(§8.4),闸件改动无豁免 | 已销号(随禁令落地,无需再裁) |
|
||||
| `game/tests/README.md` 工具速查表 audit_type_hints 行 | 描述为规则语义级则零改动(T0 核) | 无关联文档(预期查讫,T0 复核) |
|
||||
| `tools/audit_type_hints.py` 头注 | 规则语义未变零改动;若头注含正则形态级描述则随 g1 订正(T0 核) | 实施本体(可写) |
|
||||
|
||||
@@ -97,7 +97,7 @@
|
||||
|
||||
### 接口块
|
||||
|
||||
- g1 修复后 `FUNC_DECL` 行为规格(断言与变异引用以此为准):①`func f():`(无返回类型 `:` 尾)进入 R2/R3 扫描面;②`static func f(...)` 同普通函数进入;③参数表折行(首行 `(` 未闭合)经续行拼接后进入——hud_presenter:12-13 形态必浮出;④既有匹配面不回退(带 `->` 的普通函数声明改后仍匹配——T2③ 对拍)。
|
||||
- g1 修复后 `FUNC_DECL` 行为规格(断言与撤销证明引用以此为准):①`func f():`(无返回类型 `:` 尾)进入 R2/R3 扫描面;②`static func f(...)` 同普通函数进入;③参数表折行(首行 `(` 未闭合)经续行拼接后进入——hud_presenter:12-13 形态必浮出;④既有匹配面不回退(带 `->` 的普通函数声明改后仍匹配——T2③ 对拍)。
|
||||
- 最窄闸=`python tools/audit_type_hints.py`(直接退出码判读);全套闸=`tools/run_all_gates.sh` 按域划分选档(混触 `tools/`+`game/`)。
|
||||
|
||||
### 落位与可复用性预检
|
||||
@@ -111,23 +111,23 @@
|
||||
|
||||
### T1 正则修复+存量清点归零(≈0.25–0.5d)
|
||||
|
||||
- [ ] 实装 g1 三洞。可核查结果:临时注入探针(任选产品码文件加 `func _probe_r2():`+`return 1`、`static func _probe_r3(a):`+`return a`、跨行签名探针 `func _probe_ml(x,\n\ty):`+体)→ `python tools/audit_type_hints.py` 输出含三探针红(探针随后删除——探针即 §6 变异实验的注入件,闸件面实验合规)。
|
||||
- [ ] 实装 g1 三洞。可核查结果:临时注入探针(任选产品码文件加 `func _probe_r2():`+`return 1`、`static func _probe_r3(a):`+`return a`、跨行签名探针 `func _probe_ml(x,\n\ty):`+体)→ `python tools/audit_type_hints.py` 输出含三探针红(探针随后删除——探针件随写随删,不留在库)。
|
||||
- [ ] 全量清点红清单(G3 实证址齐全性核对——契约 4,hud_presenter:12-13 与 tune_sim_controller:24 必须浮出)→ 逐处注解/豁免 → 退出码 0。可核查结果:红清单处置表(file:line+处置+豁免理由)落实现报告。
|
||||
|
||||
### T2 变异验证(≈0.25d)
|
||||
### T2 撤销证明(≈0.25d)
|
||||
|
||||
- [ ] 四步变异记录(test-conventions §6;最窄闸直跑;实验面=闸件+本批注解,合规定界见 D4):
|
||||
①**`:` 尾洞变异**:临时回退 g1 的 `:` 尾修复半(只回退该半)→ `_probe_r2` 探针不再命中(红清单消失)→ 还原——证明 R2 命中钉在该修复半上;
|
||||
②**static 洞变异**:单独回退 `static ` 前缀半 → `_probe_r3` 探针不再命中 → 还原;
|
||||
③**既有面回归**:带 `->` 普通函数声明的匹配形态改前改后对拍同命中(防修复吞旧面)+R1 读数改前改后同值(R1 独立正则不受影响的实证)——**「改前」载体写死**=临时回退 g1 全量复现改前读数再还原(与 ①② 同为闸面回退实验,D4 定界内合规);
|
||||
- [ ] 四步撤销证明(test-conventions §8.4;最窄闸直跑;实验面=闸件+本批注解):
|
||||
①**`:` 尾修复半**:只回退 g1 的 `:` 尾修复半 → `_probe_r2` 探针不再命中(红清单消失)→ 还原——证明 R2 命中钉在该修复半上;
|
||||
②**static 修复半**:单独回退 `static ` 前缀半 → `_probe_r3` 探针不再命中 → 还原;
|
||||
③**既有面回归**:带 `->` 普通函数声明的匹配形态改前改后对拍同命中(防修复吞旧面)+R1 读数改前改后同值(R1 独立正则不受影响的实证)——**「改前」载体写死**=临时回退 g1 全量复现改前读数再还原;
|
||||
④**真实存量红**:T1 红清单任取一址临时去掉新注解 → 该址复红 → 还原。
|
||||
可核查结果:变异点(文件:行)、闸输出摘要、还原结论四行记录表进实现报告。
|
||||
可核查结果:撤销点(文件:行)、闸输出摘要、还原结论四行记录表进实现报告。
|
||||
- [ ] 验收步骤:全套闸按域划分选档跑一次,期望全绿(S9 段 PASS 归零读数+S13 基线零新增)。
|
||||
|
||||
### T3 产出物落位卡(≈0.25d,末卡)
|
||||
|
||||
- [ ] 写齐产出物:`reports/实现报告-S9类型闸正则修复批-<完成日>.md`(两单元状态+红清单处置表+变异记录表+改前改后读数对拍)+`reports/代拍板追认单-S9类型闸正则修复批-<完成日>.md`(§10 白名单内代拍项留痕)+`reports/反哺点-S9类型闸正则修复批-<完成日>.md`(§6 各条落点——查讫项写「无」)。可核查结果:三文件在 `reports/` 且逐条有落点。
|
||||
- [ ] 合并前置:**独立验收审计**(test-conventions §9.7——未参与实现的会话/子代理;只读本卡、实现报告、diff 与闸件,自跑最窄抽查不采信「已全绿」)完成且报告 `reports/S9类型闸正则修复批-验收审计-<完成日>.md` 逐行「通过」——审计面=变异记录表四步齐、实证址覆盖核对齐(含 hud_presenter/tune_sim 两补证址)、退出码 0 读数在案,缺任一项不通过;未通过不得合并。
|
||||
- [ ] 写齐产出物:`reports/实现报告-S9类型闸正则修复批-<完成日>.md`(两单元状态+红清单处置表+撤销证明记录表+改前改后读数对拍)+`reports/代拍板追认单-S9类型闸正则修复批-<完成日>.md`(§10 白名单内代拍项留痕)+`reports/反哺点-S9类型闸正则修复批-<完成日>.md`(§6 各条落点——查讫项写「无」)。可核查结果:三文件在 `reports/` 且逐条有落点。
|
||||
- [ ] 合并前置:**独立验收审计**(test-conventions §8.7——未参与实现的会话/子代理;只读本卡、实现报告、diff 与闸件,自跑最窄抽查不采信「已全绿」)完成且报告 `reports/S9类型闸正则修复批-验收审计-<完成日>.md` 逐行「通过」——审计面=撤销证明记录表四步齐、实证址覆盖核对齐(含 hud_presenter/tune_sim 两补证址)、退出码 0 读数在案,缺任一项不通过;未通过不得合并。
|
||||
|
||||
**估时合计 ≈0.75–1d**。切分预案:无超软盒预挂面(实证址未浮出→L3 呈报即停,不吞工时)。
|
||||
|
||||
@@ -135,7 +135,7 @@
|
||||
|
||||
### 改动—验收对照表
|
||||
|
||||
| 需求点 | 改动 | 验收测试(名称+落点) | 层级 | 真实入口 | 变异/撤销证明 |
|
||||
| 需求点 | 改动 | 验收测试(名称+落点) | 层级 | 真实入口 | 撤销证明 |
|
||||
|---|---|---|---|---|---|
|
||||
| wg1 `:` 尾洞 | `audit_type_hints.py:25` | 探针 `_probe_r2` 命中〔wg1〕T1 | 闸机 | 闸真实跑批路径(static_scan S9 段同命令) | T2① 单独回退 → 探针漏网 |
|
||||
| wg1 static 洞 | 同行 `static ` 前缀 | 探针 `_probe_r3` 命中〔wg1〕T1 | 闸机 | 同上 | T2② 单独回退 → 探针漏网 |
|
||||
@@ -165,13 +165,13 @@
|
||||
|
||||
三处灰色地带已推导定值(用户可否决,随 T3 反哺点呈报):
|
||||
- **第三洞(续行拼接)扩收**——超出审计 C1 两洞原文;依据=hud_presenter 实证址不修则永不浮出、契约 4 九址全覆盖必然停机(grilling 静态证明);备选「该址单行重排」淘汰依据=格式迁就闸而非闸达意;备选「移出实证址按未覆盖呈报」淘汰依据=明知的盲区留闸=再养恒绿面。
|
||||
- **闸件改动保留变异验证(与 P0 令的定界)**——依据=用户本批任务口径明文+gdstyle 闸件批在库先例(01774323 同形态实验);行为改动走撤销证明的 P0 令不受影响(本批产品码面零行为差);test-conventions §6 的适用面注记列反哺点归文档批。
|
||||
- **闸件改动同样只走撤销证明(2026-10-24 用户全项目禁令,无豁免)**——旧「闸件豁免」定界作废;行为与闸件改动的验收口径统一为撤销证明(test-conventions §8.4),旧 §6 条款已随禁令退役。
|
||||
- **存量清零以注解优先、豁免兜底**——依据=code-conventions §4 类型纪律本意;备选「全豁免快速归零」淘汰依据=闸修复后第一轮即全豁免=把 S9 再养回恒绿摆设。
|
||||
|
||||
## 12. 自审六查与 grilling 复核记录
|
||||
|
||||
**自审六查(2026-10-24 写卡会话)**:①规格覆盖——g1/g2 挂 T0–T3、指到 wg1–wg3;②步骤扫描——一步一动作一可核查结果;③类型一致性——探针形态与 G1/G2 正则行为逐字对齐;④审查焦点+改动覆盖——补挂:回归线对拍(T2③)、实证址全覆盖契约(契约 4,含两补证址)、豁免滥用防线(§11);⑤篇幅比例——两单元小卡不膨体;⑥落位与复用——零新增文件,豁免复用 G4 先例、白名单单通道。
|
||||
|
||||
**grilling 第一轮复核记录(2026-10-25,独立子代理对抗复核)**:判回炉两阻断——B-1 验证面与 2026-10-24 P0 令冲突未呈裁;B-2 hud_presenter 跨行签名静态证明永不浮出、契约 4「九址全覆盖」=预排必然停机。随同三应修(B-3 G6「R1 存量命中在役」失实——闸现状全绿零命中;B-4 hud_presenter 行号 :10-11→:12-13;B-5 tune_sim_controller:24 升实证)+三建议(含域档引用脚本行号)。v1.1 折入:B-1 经在库证据定界(D4:用户任务口径+gdstyle 先例 01774323——闸件改动保留 §6 变异验证、行为改动走撤销证明,两纪律适用面互斥;定界句列反哺点呈裁);B-2 扩第三洞续行拼接(g1/契约 4/T1 探针/T2 对应全链落位,§11 呈报超出 C1 原文);G3/G6 事实按 grilling 订正;域档引用钉脚本头注 :10-15。复核结论:两阻断闭合、三应修落位(v1.1)。
|
||||
**grilling 第一轮复核记录(2026-10-25,独立子代理对抗复核)**:判回炉两阻断——B-1 验证面与 2026-10-24 P0 令冲突未呈裁;B-2 hud_presenter 跨行签名静态证明永不浮出、契约 4「九址全覆盖」=预排必然停机。随同三应修(B-3 G6「R1 存量命中在役」失实——闸现状全绿零命中;B-4 hud_presenter 行号 :10-11→:12-13;B-5 tune_sim_controller:24 升实证)+三建议(含域档引用脚本行号)。v1.1 折入:B-1 曾按当时在库证据拟定「闸件豁免」定界(gdstyle 先例 01774323);**该定界后经用户 2026-10-24 全项目禁令推翻**——闸件改动无豁免,卡面验证义务已全量改写为撤销证明(D4/契约 3/T2 现行口径);B-2 扩第三洞续行拼接(g1/契约 4/T1 探针/T2 对应全链落位,§11 呈报超出 C1 原文);G3/G6 事实按 grilling 订正;域档引用钉脚本头注 :10-15。复核结论:两阻断闭合、三应修落位(v1.1)。
|
||||
|
||||
**grilling 第二轮复核记录(2026-10-25,同代理续核)**:总判**通过**——B-1 定界链经独立核实成立(①iter36 纪律变更段原文全域禁令无闸件豁免=冲突真实;②commit 01774323 系禁令之后(2026-10-25 00:07)的 gdstyle 闸件批,明文执行闸面变异验证并全量域闸绿合回=开门先例;③gdstyle/S9 两条目登记原文同款口径——三证据齐,卡面按呈裁机制处理正确,B-1 撤回);B-2 第三洞全链落位(探针/契约 4/撤销证明联动)。余两条建议级:T2③ 改前载体写死(v1.2 已折入)、续行拼接后 R2 体收集含参数续行但无 return 故无害(实现期知晓项)。零阻断零应修,卡进可编排态。
|
||||
**grilling 第二轮复核记录(2026-10-25,同代理续核)**:总判**通过**——B-1 定界链经独立核实成立(①iter36 纪律变更段原文全域禁令无闸件豁免=冲突真实;②commit 01774323 系 gdstyle 闸件批在库先例(同形态回退实验);③gdstyle/S9 两条目登记原文同款口径——复核时点证据齐,B-1 当时撤回;**其定界结论后经用户 2026-10-24 全项目禁令最终裁定推翻**(禁令在后、口径以此为准);B-2 第三洞全链落位(探针/契约 4/撤销证明联动)。余两条建议级:T2③ 改前载体写死(v1.2 已折入)、续行拼接后 R2 体收集含参数续行但无 return 故无害(实现期知晓项)。零阻断零应修,卡进可编排态。
|
||||
@@ -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 读数改硬编码 `0` → 期望属性行断言红;②「(已用)」尾缀逻辑删 → 期望秘宝行断言红;③面板重加「道具工坊 · 解锁态」段头 → 期望零旧段断言红。记录表进实现报告。
|
||||
|
||||
### 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 段(注入旧段头)→ 期望断言①红(真实入口);②`_status_data()` curios 映射漏 `used` 键 → 期望断言③红(main 侧注入);③`_status_data()` max_hp 错读 `ledger["hero_hp"]` → 期望断言②红(main 侧注入)。记录表进实现报告。
|
||||
- [ ] 轻闸全绿后、合并前写齐三份:`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 硬编码 0(T1 变异步①)→ 本断言红 |
|
||||
| sv2 秘宝行投影 | `_status_data()` curios 映射+面板秘宝行(受理序+「(已用)」尾缀) | 秘宝行受理序与已用尾缀〔sv2〕 同上 | 集成 | 同 sv1 | 变异:尾缀逻辑删(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 | 变异:重加工坊段头(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 真实信号路径 | 变异:旧段回插→断言①红;curios 映射漏 `used` 键→断言③红;max_hp 错读 `ledger["hero_hp"]`→断言②红(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 段)出口跑一次全套闸;波内修复只做出红最小单元的最窄确认;新增测试先行孤立验证再并入全套。
|
||||
|
||||
**变异验证伴生**(新增/改写验收函数逐条注入实验,记录表进实现报告):`_status_panel_projection` 为改写函数——三注入已挂 sv1/sv2/sv5(gp 硬编码/尾缀删除/旧段回插);`ui_click_probe` 新增断言——三注入挂 sv6(旧段回插→断言①;main 侧 curios 映射漏 `used` 键→断言③;main 侧 max_hp 错读 `ledger["hero_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 漏 `used` 键→断言③红、max_hp 错读 hero_hp→断言②红);④§11 增第四处推导定值(带的秘宝含已用件);⑤吹毛求疵随手带改——契约 1 加「属性与 GP 合一行」半句与 ledger 直取下标、契约 2 限定「status_panel.gd 内」并明示 camp_overlay_view 同名件零关联、F2/F3/F4/F5 行号订正(±3 行内漂移)、T1 补 HSeparator 保留句、§8.3 保留区间措辞订正。复核结论:修订后零阻断零应修,零待裁点成立。
|
||||
+4
-4
@@ -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,7 @@
|
||||
| 迭代 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 提交史。
|
||||
@@ -92,7 +92,7 @@
|
||||
2. **T0 开工**:建 worktree + 拷素材与导入缓存(冷检出三件套照坑速查)+ `git status` 归属核对(并行遗留只登记不触碰)——**检出工作区零测试,直接开工**(2026-10-22 频率规则;master 经合回闸保证可用)。
|
||||
3. **循环骨架**:一轮 = 一个任务卡——读卡 → 对事实源 → 实装(验收测试随对应 T 卡同轮落地;**本卡新增/改动的验收测试自己跑绿即收口,没改的不测**)→ 提交(代拍板随 commit 记录)→ 状态记录追加(查撞号)→ 下一轮。单 worktree 多点提交一次合并;轮内禁开第二个 worktree;轮内不跑闸;断点续跑 = `git log` 对任务卡定轮次。
|
||||
4. **全量闸时机(2026-10-22 频率规则,无例外)**:全量只有批末+合回两个时机,轮内零跑闸(含 `--quick` 中段自检档)——卡内只测自己改的东西;既有「验收测试随卡落地」「调试期出红只重跑红件最小单元」两条保留(闸机轮次纪律见 process-conventions §6)。
|
||||
5. **全量域闸**(批末 Tn):`tools/run_all_gates.sh` **按本批改动域跑**(触及 `game/` → `--code`,这是代码域唯一触发;不触及 `game/` 的一切路径 → `--docs`;一次改动同批混触两域 → 不带参数全量),所选域全绿——闸件清单、顺序与域划分只在该脚本里定义,本文件与 AGENTS.md/规约均不另列;改闸件自身(`tools/` 下机检脚本与闸壳)不占合回全量,质量义务=落批时的变异验证;涉核心的 MC 与基线逐位比对、素材批的机检断言另行。
|
||||
5. **全量域闸**(批末 Tn):`tools/run_all_gates.sh` **按本批改动域跑**(触及 `game/` → `--code`,这是代码域唯一触发;不触及 `game/` 的一切路径 → `--docs`;一次改动同批混触两域 → 不带参数全量),所选域全绿——闸件清单、顺序与域划分只在该脚本里定义,本文件与 AGENTS.md/规约均不另列;改闸件自身(`tools/` 下机检脚本与闸壳)不占合回全量,质量义务=落批时人工确认闸可跑通且判据口径未变;涉核心的 MC 与基线逐位比对、素材批的机检断言另行。
|
||||
6. **人闸**(停机交付):真人目检清单 + 代拍板追认清单 + 异步终审触点(样张类)——本循环内唯一必经人审。
|
||||
7. **异常分级**:L1 自救(一次重试)→ L2 记录继续(连续 3 次同红灯升级)→ L3 停机写报告等用户。
|
||||
8. **批次完成后的五步登记**:①待办清单条目状态按 doc-conventions §12.1 推进(做完整条删除)②本文件顶部「当前位」三行换代,涉及里程碑移动时同步里程碑表 ③**实现批禁写本文件与 `design/`**(代码实现批只准写 `reports/`),该改哪一行写进 `reports/iter<N>-反哺点-<日期>.md`,由文档批执行 ④阶段变更改 stage.txt ⑤批末闸序列**按本批改动域**全绿留痕(回执 commit 对齐分支尖)。
|
||||
|
||||
+12
-17
@@ -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)
|
||||
|
||||
@@ -53,7 +53,7 @@ BANNED_DOC_MARKS = ("design/", "../gdd/", "../registry/", "../research/", "../qa
|
||||
LEDGER_RULE_DATE = (2026, 10, 21)
|
||||
LEDGER_HEADING_RE = re.compile(r"^#{2,4}\s*.*(验收对照表|改动[—\-]验收)")
|
||||
LEDGER_REQUIRED = ("需求点", "改动", "验收测试", "真实入口")
|
||||
LEDGER_PROOF_MARKS = ("撤销", "变异", "证明")
|
||||
LEDGER_PROOF_MARKS = ("撤销", "证明")
|
||||
AUDIT_MARK = "验收审计"
|
||||
|
||||
DATE_RE = re.compile(r"\d{4}-\d{2}-\d{2}")
|
||||
@@ -471,7 +471,7 @@ def check_ledger(text, path, issues):
|
||||
if any(mark in cell for mark in LEDGER_PROOF_MARKS)), None)
|
||||
if proof_hit is None:
|
||||
issues.append((str(path), header_line, "验收对照表缺列",
|
||||
"缺「撤销或变异证明」列"))
|
||||
"缺「撤销证明」列"))
|
||||
return
|
||||
idx["证明"] = proof_hit
|
||||
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
# 一切非 game 改动的本域验收。
|
||||
# --quick 全量档的中段自检形态:跳过渲染闸(窗口化,需开显示器)与静态扫描;完成出库禁用。
|
||||
# 不带参数 = 全量档(两域全跑),触发条件=同批混触 game/ 与文档面。闸件(tools/ 下机检脚本
|
||||
# 与闸壳)自身的改动不占合回全量——其质量义务=落批时的变异验证(test-conventions §6);
|
||||
# 与闸壳)自身的改动不占合回全量——其质量义务=落批时人工确认闸可跑通且判据口径未变;
|
||||
# 闸真崩溃时合回闸 fail-closed(跑不出回执即拦),不以全量为兜底。
|
||||
# **域划分只在本脚本里定义一处**——文档只写「按改动域跑本脚本」,禁另列闸清单(清单散落多处
|
||||
# 正是既往漏跑 probe_gate --full 的成因)。
|
||||
|
||||
@@ -202,7 +202,7 @@
|
||||
- **四柜台并排**:树淬炼柜台=主界面(脊柱两行一线一节点行板+Fork 三行双态切换钮+脉分组头);锻造工坊柜台未点亮=锁定态、点亮=展开零交互占位面板;秘宝匣柜台未点亮=锁定态、点亮=展开(工坊六行+同调装配段+Y 升级行);图鉴常开独立位;宽度不足横向滚动。
|
||||
- **树购买交互**:余额不足购买钮态、行门槛/前置拦截 toast、购买后行板即时刷新(Lv/钮禁用态)。
|
||||
- **刷新双入口**:树上「刷新升级」行与秘宝匣装配段 Y 升级行都能买、同账累计(树上 Lv 读数随买走)。
|
||||
- **连带面**:状态面板属性锻造段已消失(钥石+工坊+天赋树概览);生涯页两类六项(三柜台概览行已删);局内六键体感(先手首战首轮 +1AP/锋踩雷减半/守标错下轮 +AP/聚结算框 GP 即实得/散货架八折标价)。
|
||||
- **连带面**:状态面板属性锻造段已消失(当时换成钥石+工坊+天赋树概览,该跨关概览后随迭代 36 状态面板瘦身退役,现只留本局信息五件);生涯页两类六项(三柜台概览行已删);局内六键体感(先手首战首轮 +1AP/锋踩雷减半/守标错下轮 +AP/聚结算框 GP 即实得/散货架八折标价)。
|
||||
- 验证方式:用户实机目检(本批自动闸外唯一人闸)。
|
||||
- **✅ 已核销(2026-10-14)**:用户实机目检回报完成,未呈报问题(qa 收尾批)。
|
||||
|
||||
@@ -305,7 +305,7 @@
|
||||
|
||||
---
|
||||
|
||||
## ㉙ 代码术语刷新与凭证件裁削批——玩家面目检(迭代 31 卡①/卡②;能力验证半=冒烟 1151 项 0 失败+单元 34 套全绿+对拍 120 局真差异 0 行+`feat_vouchers` 39 项全绿+变异六条五红)
|
||||
## ㉙ 代码术语刷新与凭证件裁削批——玩家面目检(迭代 31 卡①/卡②;能力验证半=冒烟 1151 项 0 失败+单元 34 套全绿+对拍 120 局真差异 0 行+`feat_vouchers` 39 项全绿)
|
||||
|
||||
> 卡① 是纯重命名批(行为零变化),卡② 删两件凭证、把完美保险改为专长订阅式。机检能证明词面清零、数值零漂移与验收组全绿,但玩家面「旧词是否真的不见了、贴图是否还在、豁免的实际观感」仍要人眼看。登记不阻塞(2026-10-12 真人检测立规)。
|
||||
|
||||
@@ -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/钥石总量),层级与文案通顺、空态句得体,零跨关解锁段 |
|
||||
- **红灯信号**:后缀在不该出现时出现或该出现时缺失;营地灰字糊到难读;「危」字糊或与旧字形误读;图例仍见旧词;面板仍出现秘宝匣/天赋树跨关概览段或五件缺失。
|
||||
- **结论回流**:实现缺陷归待办清单登记新条目;观感问题归呈现面后续批。
|
||||
@@ -35,7 +35,7 @@
|
||||
关联文档清单:
|
||||
- 需求卡片 reports/需求卡片-S9类型闸正则修复批-2026-10-24.md(2026-10-24 v1.2(grilling 两轮复核通过),非迭代批,零待裁点;存量清单以开工时盘面清点,实证九址为已知下限)
|
||||
|
||||
**归属**:tools/ 静态扫描域(闸件批,非迭代批——gdstyle 引入批 2026-10-24 已按同款形态收口:先摸存量、闸改动配变异验证)
|
||||
**归属**:tools/ 静态扫描域(闸件批,非迭代批——gdstyle 引入批 2026-10-24 已按同款形态收口:先摸存量、闸改动配撤销证明)
|
||||
|
||||
**状态**:待写卡+已写卡
|
||||
|
||||
@@ -43,7 +43,7 @@
|
||||
|
||||
**现状**:工程债证据=迭代 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/ 闸机与文档面),零待裁点即可写卡。
|
||||
**预计改动面(两档,第一条只治标)**:① 治标=人工跑一次 `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 静态规则落地」两条同族:规则扫描面自身失灵/失准,防线不可信即等于没有防线
|
||||
|
||||
@@ -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 裁=批准另立重锚批,发起时点另定**(重锚批只能由用户发起)。
|
||||
|
||||
Reference in new issue
Block a user