diff --git a/reports/需求卡片-状态面板瘦身批-2026-10-23.md b/reports/需求卡片-状态面板瘦身批-2026-10-23.md new file mode 100644 index 00000000..72bdfb6f --- /dev/null +++ b/reports/需求卡片-状态面板瘦身批-2026-10-23.md @@ -0,0 +1,222 @@ +# 需求卡片:状态面板瘦身批(局内面板去跨关解锁内容、只留本局信息) + +- 版本:**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-反哺点-<完成日>.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-实现报告/代拍板追认单/反哺点`(三份,批末写) | 产出物落位 | 非行为改动 → 对照表 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-实现报告-<完成日>.md`(各卡状态+变异验证记录表+实机目检总清单〔面板观感一条〕+遗留读数义务)/`reports/iter-代拍板追认单-<完成日>.md`(§10 白名单内代拍项留痕)/`reports/iter-反哺点-<完成日>.md`(§6 六条每条一落点+§11 四处推导定值逐条列示供否决)。可核查结果:三文件在 `reports/` 且 §6 同步面每条有落点、§11 定值全部列示。 +- [ ] 合并前置:独立验收审计(§8.2 末段声明)完成且报告 `reports/iter-验收审计-<完成日>.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-实现报告-<完成日>.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-验收审计-<完成日>.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 保留区间措辞订正。复核结论:修订后零阻断零应修,零待裁点成立。 diff --git a/待办清单.md b/待办清单.md index bd4be816..333ce968 100644 --- a/待办清单.md +++ b/待办清单.md @@ -66,9 +66,12 @@ **现状**: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 批编入。 -**归属**:status_panel.gd(呈现层承载)+ [元进度](design/gdd/systems/跨局循环/元进度.md)「解锁双入口框架」节与 [camp](design/gdd/ux/camp.md) 双入口框架句(局内只读入口语义随瘦身穿改——设计权威文档反哺点,待用户裁决另批;入口拓扑面已随迭代 33 反哺落文 2026-10-22)+ [08-Alpha版本标准](design/gdd/08-Alpha版本标准.md)「三 · 界面」状态面板行(v1.8 起部分在役) +关联文档清单: +- 需求卡片 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 + +**状态**:已写卡 #### 旧行为 MC 行为锚全数作废——重锚归数值批(2026-10-06 登记,来源=批次移交,设计面=文档轨)