docs(迭代33反哺写入+收尾批): 16 项反哺点按 2026-10-22 用户裁决全部落文+三卡与四件产出物退役+账面换代
- 存档序列化.md:三存档位承载段(#1)+负责表/读写时机图换代+无激活拒写(#2)+P2 多存档槽位后置条注销(#3)+旧单档一次性迁移段(#4)+消费面纪律补窥视读器返回结构与 has_file 口径(#10) - 生涯.md v1.1:信息架构三入口结构树+定位改营地平级(#7/#11);camp.md v1.6:营地入口改「进入存档→选档→进档/新档」+双入口框架句同步(#12) - 08-Alpha版本标准.md v1.13:「三 · 界面」增选档界面行(#8)+主菜单行换代与入口拓扑注记(#13)——两条均 2026-10-22 用户裁批准;营地交互重做五卡行按实态同步(部分实装) - art-bible.md v3.18:§7.4 豁免清单 excision「主菜单分组 overline×2」两片段、余清单不动(#15) - 体验验证清单:新增 ㉛ 迭代 33 实机目检总清单五项+⑯/⑲ 旧入口引述按三钮换代(#14) - 账面:待办清单增「迭代 33 反哺点写入」专条(状态=已写入)+营地五卡条推进(①②③ 落地、④⑤ 未编排,去「已编迭代 33」段)(#5/#9/#16);roadmap 迭代 33 行「已完成(2026-10-22)」+卡片/报告列退役保留字+当前位三行换代(#6) - 退役七件(吸收即死+证据只留最新,引用面已改写):iter33 实现报告/反哺点清单/验收审计/代拍板追认单+三张需求卡片;代拍板 12 项随专条备案(veto 窗口开放至用户明示) 〔迭代 33 收口登记:卡① ebf40947/卡③ 5c2a7bcf/卡② 508f190b/总收口 6e8f72b2〕
This commit is contained in:
1 parent
fa9ec8a883
commit
1864f157b4
15 files changed
+74
-1330
No files matched your search
@@ -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.17,历次修订明细见 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.18,历次修订明细见 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 头身
|
||||
@@ -428,7 +428,7 @@
|
||||
- **字体**:全局一套像素字——拉丁候选 Kenney Fonts(CC0)、中文候选缝合像素字体 Fusion Pixel(OFL)(清单 §3.6);墨色走主墨系(§7.2);换字体 = 全局决策。
|
||||
- **字号**:像素字体**整数倍缩放,禁非整数缩放**(像素模糊);下限(1280×800 基座;2026-09-29 v3.0 对齐 ux-designer PC 规范):棋盘数字 ≥18px(公式 = max(18, ceil(格边长 × 0.5))不变)、**正文/明细 ≥16px、tooltip ≥14px**(旧 14/13px 下限退役——1280×800 低于 1080p 基准,同字号实际更小)。
|
||||
- **字号档位表(2026-10-06 UI 设计对齐批 P3 甲——WB G1 六档)**:全站 UI 文字字号只经 `UiKit.FS_*` 单点取值,裸数字字号退役——`FS_CAPTION 12`/`FS_HINT 14`/`FS_BODY 16`/`FS_SUB 18`/`FS_TITLE 24`/`FS_H1 34`。旧 15 实测档按就近归档收编(10/11/12→CAPTION、13/14→HINT、15/16→BODY、17/18/20→SUB、21/22/24/26→TITLE、32/40→H1;T0 普查 107 静态位点全归档,数据驱动动态字号位点除外);棋盘数字公式 `maxi(18, ceil(格边长×0.5))` 与站桩血数 11px(条带内读数豁免)不入表。注:六档相邻比 12→14→16→18 三段 <1.25×,系 P3 裁决值优先于字重纪律的档差参考线,档差参考线对新层级设计仍有效。
|
||||
- **小字号豁免条款(2026-10-06 UI 设计对齐批 P11+Q5 甲,合并单条不开两口子)**:下款两类**豁免于本节下限**——①**条带内读数**:压在窄条带(血条/进度条等 ≤12px 高带)内居中的数字,受条带高度物理约束,维持 11px 下限,且必须按 §7.2 垫素色牌后计对比(实装=B 区站桩血数 11px 压 HP_BAR_BACK 牌 14.3:1);②**装饰性 overline/caption**:不承载须精确读取的信息、仅作分区标题或氛围小字者,可至 **12px**。**两类豁免逐处清单(2026-10-06 T6 判定落定)**:条带内读数=B 区站桩血数一处;装饰 caption 档(FS_CAPTION)在册面=主菜单分组 overline×2(「── 冒 险 ──」「── 营地与系统 ──」)/棋盘底操作提示条/营地柜台说明文与结构位预留注记/图例 RAP 词条说明/设置警示文两处/关卡地图底栏组标(生命/属性/特性)与分隔系/站桩消散提示/B 区状态槽微计数(×N●○)/bcard 脚注/RAP 反馈行/刷新余量徽标——清单外 11-13px 文字一律按正文/tooltip 下限提档,新增 caption 位须同批增补本清单。
|
||||
- **小字号豁免条款(2026-10-06 UI 设计对齐批 P11+Q5 甲,合并单条不开两口子)**:下款两类**豁免于本节下限**——①**条带内读数**:压在窄条带(血条/进度条等 ≤12px 高带)内居中的数字,受条带高度物理约束,维持 11px 下限,且必须按 §7.2 垫素色牌后计对比(实装=B 区站桩血数 11px 压 HP_BAR_BACK 牌 14.3:1);②**装饰性 overline/caption**:不承载须精确读取的信息、仅作分区标题或氛围小字者,可至 **12px**。**豁免逐处清单(2026-10-06 T6 判定落定,2026-10-22 随迭代 33 卡② 主菜单三入口化撤除「主菜单分组 overline×2」两处——组帽随旧钮组退役,余清单不动)**:条带内读数=B 区站桩血数一处;装饰 caption 档(FS_CAPTION)在册面=棋盘底操作提示条/营地柜台说明文与结构位预留注记/图例 RAP 词条说明/设置警示文两处/关卡地图底栏组标(生命/属性/特性)与分隔系/站桩消散提示/B 区状态槽微计数(×N●○)/bcard 脚注/RAP 反馈行/刷新余量徽标——清单外 11-13px 文字一律按正文/tooltip 下限提档,新增 caption 位须同批增补本清单。
|
||||
- **字重纪律(2026-09-29 v3.0 修订)**:层级手段解禁为三件——**字号档差(相邻层级 ≥1.25×)+ 墨色深浅 +(字体支持时)字重两档**;数字禁描边/阴影伪加粗不变(字形为唯一数值载体,§4.1 同源纪律)。
|
||||
|
||||
### 7.5 营地界面
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
> **一句话定位**:本文定义这个项目的 **Alpha 版本包含哪些东西**——它是里程碑 M3 的完成标准,也是判断"还差什么"的对照表。
|
||||
> **本文只列条目,不写内容**:每样东西是什么、规则怎么走,一律归各自的权威文档,本文只给指路链接。想知道某样东西的定义,请点链接,不要在本文里找解释。
|
||||
> **状态**:**已定稿(v1.12)**——2026-10-13 用户令定稿,此后十二次升版的明细见 git 提交史。Alpha 的内容范围自此冻结:增删条目一律须经用户裁决。
|
||||
> **状态**:**已定稿(v1.13)**——2026-10-13 用户令定稿,历次升版明细见 git 提交史。Alpha 的内容范围自此冻结:增删条目一律须经用户裁决。
|
||||
> **成文**:2026-10-13。
|
||||
|
||||
## 本文怎么用
|
||||
@@ -100,10 +100,11 @@ Alpha 内以玩法循环本身的内容与表现为主(棋盘、关卡、战
|
||||
|
||||
| 条目 | 事实源 | 现状 |
|
||||
|---|---|---|
|
||||
| 主菜单 | —— | 在役 |
|
||||
| 主菜单 | —— | 在役(迭代 33 卡②三入口化:进入存档/设置/退出游戏——入口拓扑=进入存档→选档界面→进档/新档→营地覆盖层→〔迭代 34 卡④〕营地场景图与生涯笔记本;2026-10-22 用户裁换代〔反哺 #13〕) |
|
||||
| 开始覆盖层 | —— | 在役 |
|
||||
| 选档界面(3 存档位) | —— | 在役(迭代 33 卡③——空槽新档/有档进档/删档二次确认+摘要三项;2026-10-22 用户裁增行〔反哺 #8〕) |
|
||||
| 营地(天赋树 / 锻造工坊 / 秘宝匣 / 图鉴) | [camp](ux/camp.md) | 在役(锻造柜台占位面板注已解除;柜台贴图占位随营地交互重做列入 Alpha,见下行) |
|
||||
| 营地交互重做(五卡:存档制数据层/主菜单三入口/选档界面/营地场景图/Esc 浮窗与营地顶栏) | [camp](ux/camp.md)+[需求澄清](../../reports/需求澄清-营地交互重做-2026-10-18.md) | 待做(2026-10-21 用户裁:五卡整体列入 Alpha,含营地表现优化——可点击场景图/顶栏/Esc 浮窗。五卡已写、待编排;卡④营地场景图为最大件,挂三个用户侧前置未销号:美术渠道 A/B、点选反馈设计稿、参照物。出口=五卡各自验收标准通过+营地屏用户目检通过) |
|
||||
| 营地交互重做(五卡:存档制数据层/主菜单三入口/选档界面/营地场景图/Esc 浮窗与营地顶栏) | [camp](ux/camp.md)+[需求澄清](../../reports/需求澄清-营地交互重做-2026-10-18.md) | 部分实装(卡①②③ 已随迭代 33 实装合回,2026-10-22;卡④营地场景图 2026-10-21 用户令退回美术设计段、挂三个用户侧前置未销号:美术渠道 A/B、点选反馈设计稿、参照物;卡⑤ Esc 浮窗随卡④ 代码波同行、未编排。2026-10-21 用户裁:五卡整体列入 Alpha。出口=五卡各自验收标准通过+营地屏用户目检通过) |
|
||||
| 生涯页 | [生涯](systems/跨局循环/生涯.md) | 在役(期一) |
|
||||
| 关卡地图屏 | [level-map](ux/level-map.md) | 在役 |
|
||||
| 战斗屏 | [battle](ux/battle.md) | 在役 |
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
|
||||
| 负责 | 说明 |
|
||||
|---|---|
|
||||
| 存档契约 | 单档 JSON 存档的域划分与读写约定(域清单见核心规则) |
|
||||
| 存档契约 | 3 存档位 JSON 存档的域划分与读写约定(域清单见核心规则;槽位承载见下「三存档位」段) |
|
||||
| 版本迁移 | 版本字段 + 读档时链式迁移 + 高版本拒读禁写 |
|
||||
| 读写时机 | 启动读盘;正式冒险收束写盘;原子写盘原语 |
|
||||
| 元进度的持久化承载 | 归档登记的职责口径:"元进度持久化框架"——钥石与解锁进度由本系统落盘 |
|
||||
@@ -58,7 +58,7 @@ SaveManager 不依赖任何玩法系统就能工作:它是被动的承载方
|
||||
|
||||
**唯一豁免 = `breakpoint` 断点域**(2026-09-29 迭代 8 卡①顺带修订):断点是冒险进行中的瞬态快照,不是跨局携带——里面的生命/GP/道具库存只在「续玩上局」时还原进局内,冒险收束(通关/失败/放弃)即整域清除,永远不会渗进永久进度。反面清单的管辖对象因此收窄为 `meta` 永久进度域(冒烟域界扫描顺带收窄到 meta 域);断点域自身的字段口径归[冒险结构](../冒险循环/冒险结构.md)登记。
|
||||
|
||||
存档是单文件 JSON(`user://save.json`),字典键一律字符串。数据模型(现行 = v6;示例值全为零值默认态):
|
||||
**三存档位(迭代 33 卡①,2026-10-22 反哺写入)**:存档是 3 个独立的 JSON 文件(`user://save_slot_1/2/3.json`,槽文件名只经 `slot_path()` 单点派生,槽 1 禁复用旧单档名),字典键一律字符串。写盘目标=当前激活槽的文件;启动(boot)不读任何槽文件——启动态=无激活态,不读写;激活态由选档界面的「新档」(`create_slot`)或「进档」(`activate_slot`)建立(选档界面归迭代 33 卡③)。数据模型(现行 = v6;示例值全为零值默认态):
|
||||
|
||||
```json
|
||||
{
|
||||
@@ -107,14 +107,15 @@ SaveManager 不依赖任何玩法系统就能工作:它是被动的承载方
|
||||
|
||||
v4/v5/v6 各域缺键由读取方按默认值补齐(空集合/0),旧档零迁移损失;收束自增域(通关次数/Boss 计数/终身计数/真视使用计数)的唯一入账点 = `apply_adventure_summary`(vision_used 走 `add_vision_used` 收束)。**v6 域后扩列不升版先例**:`vision_used`(迭代 22,2026-10-12——迭代 21 同款口径;断点随件 `vision_counter_used` 同批新增;旧断点随件键 `bonus_aux_carry` 已随替换子交互拆除退役,迭代 22 T5)。
|
||||
|
||||
消费面纪律:其他系统只经 SaveManager 的类型化访问器(读余额/加钥石/花钥石、读写树等级等)与域更新原语(`apply_adventure_summary`)操作存档,不碰内部数据结构。
|
||||
消费面纪律:其他系统只经 SaveManager 的类型化访问器(读余额/加钥石/花钥石、读写树等级等)与域更新原语(`apply_adventure_summary`)操作存档,不碰内部数据结构。三条槽位纪律(迭代 33 卡①):一、无激活态下一切写盘路径拒绝并返回 false(boot 后未进档/未新档即结算或购买=不落盘,激活后照常);二、槽文件名单点派生——消费方禁各自拼槽文件名,测试与探针的隔离走注入口(`attach_slot_template`/`peek_summary_at`);三、UI 读别槽摘要只走窥视 API `peek_slot_summary(slot)`(不激活、不写内存、零盘面副作用),返回结构 `{"readable", "has_file", "keystone", "cleared", "total"}`——`readable`=槽文件可读(空槽=零值合法态可读;损坏/高版本/缺版本字段=不可读标记),`has_file`=槽主文件在盘与否(空槽/有档的操作集二分判定来处;非摘要第四项、零 UI 语义),三项摘要值(`keystone`/`cleared`/`total`)只在 `readable=true` 时有意义。
|
||||
|
||||
### 读写时机
|
||||
|
||||
```
|
||||
启动 ──▶ 读盘(load_from_disk:新档/损坏兜底/迁移链/高版本拒读,见下两节)
|
||||
正式冒险收束(adventure_finished)──▶ apply_adventure_summary 入账 ──▶ 原子写盘
|
||||
营地钥石消费(元进度实现批接线)──▶ 每笔变更后即时写盘
|
||||
启动 ──▶ 不读盘(boot 无激活态,不读写任何槽;只做一次旧单档迁移,见「版本与迁移」节)
|
||||
选档界面「新档」/「进档」──▶ create_slot / activate_slot(读盘=该槽文件,建立激活态;迭代 33 卡①/卡③)
|
||||
正式冒险收束(adventure_finished)──▶ apply_adventure_summary 入账 ──▶ 原子写盘(落当前激活槽)
|
||||
营地钥石消费(元进度实现批接线)──▶ 每笔变更后即时写盘(落当前激活槽)
|
||||
冒险停点(choices_presented 选路停点)──▶ 断点快照写盘(迭代 8 卡①)
|
||||
冒险三结局收束(通关/失败/放弃)──▶ 清除断点 + 原子写盘(迭代 8 卡①/T3 退出口径)
|
||||
```
|
||||
@@ -139,6 +140,8 @@ v4/v5/v6 各域缺键由读取方按默认值补齐(空集合/0),旧档零
|
||||
|
||||
迁移函数经 `register_migration(旧版本号, 函数)` 注册:函数把数据从「旧版本」改写成「旧版本 + 1」。生产迁移链现行六件(v2 起自注册):v1→v2 = 断点域补空;v2→v3 = 断点附随件与摘要 keystone_drops 补键(读取方 .get 兜底);v3→v4 = 同调三域补键;v4→v5 = 树域两键补齐(原挂接的「三体系迁移」体已随迭代 21 T5 攻防所有权切分删除——`save_manager.gd:96-98`、`meta_progression.gd:294-295` 实证;forge_levels 旧域同批清退,加载时按默认模型键集白名单收窄,`save_manager.gd:399-401`);v5→v6 = 生涯两终身计数域补零;**v6→v7 = 锻造工坊域 forge_routes 缺键补齐(迭代 23 T5——无结构迁移体,版本号推进仅为 schema_version 对齐;解锁态派生不落档:初始持有〔表 initial_owned〕∨ 直购〔unlocked 清单〕∨ 练满前一档〔levels[prereq]≥cap〕)**。任一步失败按损坏兜底处理。
|
||||
|
||||
旧单档一次性迁移(迭代 33 卡①,用户裁决 Q1 甲):本系统从单档制换代为 3 存档位制时,盘上残留的旧单档 `user://save.json` 在启动时被处理——文件**字节级原样搬运**进槽 1(`user://save_slot_1.json`,零解析零改造:损坏或高版本的旧档也原样迁入,之后由该槽进档时的损坏兜底/高版本拒读接管,不静默丢数据),源文件改名 `user://save.json.migrated.bak` 留痕不删;槽 1 文件已存在则不重迁(幂等,二次启动零操作);迁移失败(拷贝或改名失败)源文件保留、下次启动重试。留痕与结果记在启动日志(开发者向,非玩家面)。
|
||||
|
||||
### 损坏兜底
|
||||
|
||||
档案读不开(文件损坏、JSON 解析失败、结构出域、缺版本字段)时:原文件改名为 `<路径>.corrupt.bak`(已有同名备份则覆盖)留下现场,游戏用默认新档继续运行,并留下警告日志。两条底线:不静默丢档(坏档永远可人工找回)、不崩溃(坏档不挡玩)。
|
||||
@@ -162,7 +165,7 @@ MVP 不要求本系统的闭环([不做清单](../../05-不做清单.md)把单
|
||||
| 优先级 | 内容 | 后置原因 |
|
||||
|---|---|---|
|
||||
| ~~P1~~ | ~~快照与复盘的持久化承接~~ | **已兑现**(2026-09-29 迭代 8 卡①:断点域承载 + rng「主种子+计数器」快照契约回填面 `restore_adventure`) |
|
||||
| P2 | 多存档槽位 | 单档 MVP(2026-09-21 裁决);多档等有真实需求再立项 |
|
||||
| ~~P2~~ | ~~多存档槽位~~ | **已实现**(2026-10-22 迭代 33 卡①——3 存档位三文件制落地,口径见「三存档位」段;原「单档 MVP(2026-09-21 裁决)」后置条随兑现注销) |
|
||||
|
||||
## 调参表
|
||||
|
||||
|
||||
@@ -1,25 +1,28 @@
|
||||
# 生涯
|
||||
|
||||
> **一句话定位**:主菜单里与营地平级的**局外只读界面**——营地管「花」(花钥石买永久强化),生涯管「看」(看自己跨局攒下的一切:累计战绩、历史冒险、图鉴收集)。冒险进行中不给任何数据回看(2026-10-04 用户裁决 P-C7 的延续),生涯是历史数据唯一的家。
|
||||
> **状态**:期一已实装(2026-10-07 迭代 18 卡④生涯界面实装批·期一——跨局汇总页+主菜单入口+终身计数域存档 v6 落地;期二/期三另行立项,本文不预占排期)。
|
||||
> **一句话定位**:营地里与三柜台平级的**局外只读界面**——营地管「花」(花钥石买永久强化),生涯管「看」(看自己跨局攒下的一切:累计战绩、历史冒险、图鉴收集)。冒险进行中不给任何数据回看(2026-10-04 用户裁决 P-C7 的延续),生涯是历史数据唯一的家。
|
||||
> **状态**:期一已实装(2026-10-07 迭代 18 卡④生涯界面实装批·期一——跨局汇总页+主菜单入口+终身计数域存档 v6 落地;期二/期三另行立项,本文不预占排期)。入口拓扑已随迭代 33 卡② 三入口化换代、营地里经笔记本接入归迭代 34 卡④(信息架构节 v1.1,2026-10-22 反哺写入)。
|
||||
> **来源**:[待办清单「『生涯』界面——冒险中数据回看的唯一承接处」条](../../../../待办清单.md)(2026-10-04 用户裁决 P-C7——冒险中不给数据回看,历史战报与结算明细的查看去向 = 新「生涯」界面)。
|
||||
|
||||
## 一、信息架构
|
||||
|
||||
生涯入口是主菜单一级按钮,与营地平级(2026-10-06 用户裁,备选案与淘汰依据见需求卡片 P1)。现行主菜单按钮组由 `build_start_overlay` 构造(`game/presentation/ui_assembler.gd:103`):「冒险」组(继续上局 / 开始冒险)与「营地与系统」组(营地 / 生涯〔期一已落位,营地钮与设置钮之间〕 / 设置 / 退出游戏)。具体行序排版属实装细节顺带落位(本文不画布局稿)。
|
||||
生涯入口经营地接入(目标结构=营地笔记本,迭代 34 卡④承载;迭代 33 卡② 三入口化后主菜单无生涯钮,现期无玩家可见入口,内部路径直调可达)。现行主菜单按钮组由 `build_start_overlay` 构造(`game/presentation/ui_assembler.gd:97`),只有三个一级钮(迭代 33 卡②,用户裁决 1):「进入存档」「设置」「退出游戏」——「进入存档」为唯一进度入口,点击打开选档界面(3 存档位,迭代 33 卡③)。
|
||||
|
||||
```
|
||||
主菜单(开始覆盖层)
|
||||
├─ 冒险组:继续上局 · 开始冒险
|
||||
└─ 营地与系统组:营地 · 生涯(期一已实装) · 设置 · 退出游戏
|
||||
主菜单(开始覆盖层,三入口)
|
||||
├─ 进入存档 → 选档界面(3 存档位;空槽「新档」/有档「进档」/「删档」二次确认)
|
||||
│ └─ 进档/新档 → 营地(迭代 34 卡④改为营地场景图;现期暂行落点=营地覆盖层)
|
||||
├─ 设置
|
||||
└─ 退出游戏
|
||||
|
||||
调试浮窗(迭代 18 卡⑦ P2 甲——入口迁宿主:开始层零调试入口;DS_DEBUG=1 会话浮窗启动即开,
|
||||
战斗屏 HUD 与关卡地图屏各一枚「调试」角标可再开)
|
||||
|
||||
生涯(局外只读面)
|
||||
├─ 跨局汇总(累计战绩与解锁总览)
|
||||
├─ 历史冒险回看(逐局摘要与单局明细)
|
||||
└─ 图鉴(敌人优先,秘宝/奇物随后)
|
||||
营地(存档内,进档/新档落点)
|
||||
└─ 生涯(局外只读面;入口=营地笔记本,迭代 34 卡④承载)
|
||||
├─ 跨局汇总(累计战绩与解锁总览)
|
||||
├─ 历史冒险回看(逐局摘要与单局明细)
|
||||
└─ 图鉴(敌人优先,秘宝/奇物随后)
|
||||
```
|
||||
|
||||
边界三条(均为 2026-10-06 用户裁 P4 甲):
|
||||
|
||||
@@ -1,13 +1,13 @@
|
||||
# 营地覆盖层 UX spec(camp)
|
||||
|
||||
> 状态:v1.5(2026-10-15 简明技术中文用语规范批:文头状态行按实态订正;spec 基线=2026-09-30 审计拍板点 4A 用户裁决落文〔乙案新建 ux spec+元进度配套更改〕;视觉终稿已随迭代 9 9A 段落码,本 spec 成文其呈现规则)
|
||||
> 状态:v1.6(2026-10-22 迭代 33 反哺写入批:营地入口拓扑按三入口化实态换代;spec 基线=2026-09-30 审计拍板点 4A 用户裁决落文〔乙案新建 ux spec+元进度配套更改〕;视觉终稿已随迭代 9 9A 段落码,本 spec 成文其呈现规则)
|
||||
> 事实源:`game/presentation/views/camp_overlay_view.gd`(CampOverlay——9A 视觉终稿后实态)
|
||||
> 机制权威:[元进度](../systems/跨局循环/元进度.md)(营地三柜台/钥石/永久强化——营地=界面壳、机制主语=永久强化)
|
||||
> 相邻:[settlement-summary.md](settlement-summary.md)(最近冒险摘要数据同源)/ [level-map.md](level-map.md)(主菜单语境)
|
||||
|
||||
## 定位
|
||||
|
||||
营地是存档内消费钥石的枢纽场所(界面壳,非机制实体——裁定见元进度):主菜单营地独立入口进入,玩家在此用钥石换永久强化、查看秘宝匣解锁与最近冒险。本 spec 只锁呈现;机制(定价/解锁/入账)全部归元进度。**循环层级:存档级(大循环/局外)呈现面**——本层只在存档语境可达(主菜单入口),冒险进行中不可达。
|
||||
营地是存档内消费钥石的枢纽场所(界面壳,非机制实体——裁定见元进度):主菜单「进入存档」→选档界面→进档/新档进入(迭代 33 卡②/卡③三入口化后,主菜单不再有营地独立钮),玩家在此用钥石换永久强化、查看秘宝匣解锁与最近冒险。本 spec 只锁呈现;机制(定价/解锁/入账)全部归元进度。**循环层级:存档级(大循环/局外)呈现面**——本层只在存档语境可达(经选档界面进档/新档进入),冒险进行中不可达。
|
||||
|
||||
## 布局与交互
|
||||
|
||||
@@ -22,7 +22,7 @@
|
||||
|
||||
- 呈现数据源 = MetaProgression 只读投影经组合根喂入;本层不持有系统资源、不算价。
|
||||
- 退役/封存件呈现语义已随旧目录整体退役消解(探宝罗盘/显影尘/地穴全图卷等状态行已删——迭代 22 旧 12 行删除后目录内零 deferred/retired 态,2026-10-12);
|
||||
- 双入口框架(主菜单入口+局内状态面板只读入口〔2026-10-13 由「暂停层」改名——游戏非实时无暂停语义〕)的需求面归元进度「解锁双入口框架」节;状态面板入口已实装(2026-10-06 迭代 17 卡③〔时名暂停层〕——实机目检待用户,待办清单登记条在册),其呈现面不归本 spec。
|
||||
- 双入口框架(存档内入口〔经选档界面,迭代 33 卡②/卡③换代——原主菜单独立入口〕+局内状态面板只读入口〔2026-10-13 由「暂停层」改名——游戏非实时无暂停语义〕)的需求面归元进度「解锁双入口框架」节;状态面板入口已实装(2026-10-06 迭代 17 卡③〔时名暂停层〕——实机目检待用户,待办清单登记条在册),其呈现面不归本 spec。
|
||||
|
||||
## 秘宝匣柜台呈现细则(迭代 22 实装态,2026-10-12)
|
||||
|
||||
|
||||
@@ -1,36 +0,0 @@
|
||||
# 迭代 33 代拍板追认单(2026-10-21)
|
||||
|
||||
> 累积文档:各卡 §9 白名单内的代拍项随卡施工留痕于此;用户在会话中追认(veto 窗口开放至用户明示)。授权性质:卡片审问阶段的预授权执行,本单为备案确认,非事后授权。
|
||||
|
||||
## 卡① 存档制数据层改造批
|
||||
|
||||
| # | 代拍项(卡片 §9 条目) | 取法 | 约束核对 | veto 影响 |
|
||||
|---|---|---|---|---|
|
||||
| 1 | 槽位存储机制与文件命名(§9-1) | **三文件制** `user://save_slot_1/2/3.json` | 每槽与现行 v7 逐键同构 ✓;迁移链按槽独立成立 ✓(sv9 冒烟段);坏档兜底按槽 ✓(.corrupt.bak 按槽文件名派生);槽 1 禁复用 `user://save.json` ✓(独立派生名) | 改单文件三键=承载面重写,回炉 T1 |
|
||||
| 2 | 启动激活态机制(§9-2) | **纯内存态,不持久化**(`_active_slot` 字段) | 卡③ Q1 裁甲「每轮回选档」——裁甲则本条按卡① 契约作废持久化需求 ✓ | 若用户改裁卡③ Q1 乙,本条需重开(激活位持久化补建) |
|
||||
| 3 | 类 API 命名与文件落点(§9-3) | `slot_path`/`active_slot`/`has_write_target`/`activate_slot`/`create_slot`/`delete_slot`/`peek_slot_summary`/`peek_summary_at`/`attach_slot_template`;承载面不拆(696 行单文件) | 词族 save_slot_*/activate_*/peek_* ✓;禁裸名 slots(同调位已占)✓;测试隔离注入口镜像 attach_path 哲学 | 改名=接口面重排,牵连卡③ 消费面 |
|
||||
| 4 | 删档边界(§9-4) | 激活槽可删;删后回合法空态+指针连清除;**`.corrupt.bak` 损坏备份不追删**(用户数据留盘可考,同槽再损坏时兜底流按槽覆盖同名备份) | 禁崩禁误写 ✓;激活态生命周期终点=显式清除/进程结束/该槽被删 ✓;回主菜单不清除 ✓(内存态) | 追删备份=删档语义扩一步,改 delete_slot 一处 |
|
||||
| 5 | 提交切分与 worktree 命名(§9-5) | worktree `iter33card1-save`/分支 `iter33-card1-save`;两笔:T1+T2+T3 实现(6a7c2575)+T4 产出物 | 单 worktree 单分支 ✓;定义面(迭代行/卡片)不入本批提交 ✓ | 仅过程命名,veto 无实质影响 |
|
||||
| 6 | Q1 甲执行取法(实现取法,超出字面处陈明) | 旧档迁移取「字节级原样搬运、零解析零改造」——损坏/高版本旧档字节原样落槽 1(「原样落入槽 1」字面成立),读取时兜底/拒读链接管;未走 §8 L3 呈报(意外形态不再触发承诺失效) | 不静默丢数据 ✓;源改名 `.migrated.bak` 留痕不删 ✓;失败源保留重试 ✓ | 若用户裁「损坏旧档应 L3 停机」——则补迁移前预检解析、损坏即停的分支 |
|
||||
|
||||
## 卡③ 选档界面新建批
|
||||
|
||||
| # | 代拍项(卡片 §9 条目) | 取法 | 约束核对 | veto 影响 |
|
||||
|---|---|---|---|---|
|
||||
| 1 | 槽卡布局(§9-1) | **纵列三行**(页壳内容列内每槽一行:槽名+摘要+动作钮)——career 页行族同构,等宽纪律零豁免 | 三槽全显一屏(契约 1 禁滚动)✓;1440 宽内单行容纳 | 改横列三卡=视图布局重排(L2 域) |
|
||||
| 2 | 槽位编号呈现(§9-2) | 「存档位 1/2/3」 | 用户原话口径直用 | 改措辞=视图一处 |
|
||||
| 3 | 三钮文案(§9-3) | 「新档」/「进档」/「删档」(动词钮,对齐现役动词钮先例;进档=primary 主操作钮、删档=danger_button 危险钮 `ui_kit.gd:695`) | 裁决 3/4 语义直用 ✓ | 改文案=视图常量 |
|
||||
| 4 | 与开始层互斥方式(§9-4) | career 同款(`_start_overlay.visible=false`+模态栈单口;关闭恢复) | 仿先例域内参数选择 ✓ | — |
|
||||
| 5 | 提交切分与 worktree 命名(§9-5) | worktree `iter33card3-saveselect`/分支 `iter33-card3-saveselect`;三笔:T1+T2+T3 实现+变异伴生强化+T4 产出物 | — | — |
|
||||
| 6 | ConfirmDialog 消费方编排机制(§9-6,卡片预授权取法照录) | **open 前设消费方状态量(`_confirm_consumer`)、confirmed/cancelled 后按量分派(`_on_confirm_accepted`/`_on_confirm_declined` match 路由)**;双钮签名未动(`confirm_dialog.gd:36-38`);分派面=match 分支可扩展(卡④ 第三消费方直接加分支) | 禁双常驻静态接线 ✓(变异m4 拦截在役);本批消费方=删档确认+现役新冒险确认(随卡②撤出) | 机制重选=分派层重写 |
|
||||
| 7 | 窥视读器 has_file 位(实现期接口补全——超出 §9 清单单项,按 T0 对齐授权补记待追认) | `peek_slot_summary` 返回结构加 `has_file: bool`(空/有档操作集二分判定来处;卡③ 6.0「槽态唯一来处=卡① 窥视 API 返回值」的接口闭环——交付面缺该位则二分不可实现) | 非摘要第四项(契约 5 三项不变)✓;向后兼容(既有断言零改)✓;卡① 侧 sv7/sv8 断言复跑绿 ✓ | 若裁「二分判定改走他口」(如独立 has_slot API)——save_manager 增一访问器+组合根改一行 |
|
||||
|
||||
## 卡② 主菜单三入口化批
|
||||
|
||||
| # | 代拍项(卡片 §9 条目) | 取法 | 约束核对 | veto 影响 |
|
||||
|---|---|---|---|---|
|
||||
| 1 | 组帽与左列布局(§9-1) | **双组帽全撤**(冒险帽=组内零钮退化态不留;营地与系统帽=指称失义——「营地」已非菜单入口),三钮纵列原左列骨(布局零重构——契约 7) | v1.1「保留原样=留指称不可达地点文案,禁」✓ | 恢复任一组帽=视图一处 |
|
||||
| 2 | _refresh_resume_button 去留(§9-2) | **净删除**+消费点全清(main 五处/camp ctx 载体/presenter 三处/probe_ui_util 参数/pacing_queue/V2d 族——T0 清点口径 grep 零残留) | 卡④ 不复用已证 ✓ | — |
|
||||
| 3 | 进入存档钮命名(§9-3) | 「进入存档」primary_button 主操作钮(原主黄钮位),tooltip=「选择一个存档位进入(新档 / 进档 / 删档)」 | 裁决 1 原话 ✓ 动词化 ✓ | 改文案=装配器一处 |
|
||||
| 4 | 探针中间态写法(§9-4) | 营地=open_camp_via_savesel 助手(选档层新档钮真实信号路径,槽模板清场防真实槽污染、swap=true 整链落槽文件保持久化核验同源);生涯/冒险=函数直调(mn10 登记实现报告「已知中间态」) | 契约 5 中间态合法交付 ✓ 禁假路径 ✓ | 卡④ 落地后代换 |
|
||||
| 5 | 提交切分与 worktree 命名(§9-5) | worktree `iter33card2-menu`/分支 `iter33-card2-menu`;四笔(T1+T2/golden/变异强化+报告/T4) | — | — |
|
||||
@@ -1,34 +0,0 @@
|
||||
# 迭代 33 GDD 反哺点清单(2026-10-21)
|
||||
|
||||
> 累积文档:实现与设计权威文档的差异/缺口逐条登记于此;用户在会话中裁决后由文档批写入 `design/`(实现批禁写 design/,2026-10-10 用户立规)。每条写清:哪个文件哪一节、改成什么、依据是什么。
|
||||
|
||||
## 卡① 存档制数据层改造批
|
||||
|
||||
| # | 文档与落点 | 现行陈述 | 应改成 | 依据 |
|
||||
|---|---|---|---|---|
|
||||
| 1 | `design/gdd/systems/表现与支撑/存档序列化.md` `:61`(现行口径节) | 「存档是单文件 JSON(user://save.json)」 | 三存档位承载:`user://save_slot_1/2/3.json` 三文件制,写盘目标=当前激活槽文件;boot 启动态无激活不读写;激活态经选档界面进档/新档建立(卡③) | 卡① 完成定义 1/3+契约 1/6 实装(`save_manager.gd` SLOT_COUNT=3) |
|
||||
| 2 | 同上 `:20`/`:16`(系统范围负责表) | 「单档 JSON 存档的域划分与读写约定」 | 「3 存档位 JSON 存档的域划分与读写约定」;消费面纪律补「无激活态一切写盘路径拒绝并返回 false」 | 卡① 契约 6(sv3 断言在役) |
|
||||
| 3 | 同上 `:165`(P2 后置表「多存档槽位」行) | 「单档 MVP(2026-09-21 裁决);多档等有真实需求再立项」 | 该条注销(去向=迭代 33 卡① 已落地)——后置表此行删除或标「已实现(迭代 33)」 | 卡① F7:本批即该条预写的「真实需求」 |
|
||||
| 4 | 同上(新增条款建议) | 无旧档迁移记载 | 补一段旧单档一次性迁移口径:`user://save.json` 首次启动字节迁入槽 1、源改名 `.migrated.bak` 留痕、槽 1 已存在不重迁(幂等) | 卡① Q1 裁甲+sv12 实装(契约 4 旧档不静默丢失的机制化) |
|
||||
| 5 | `待办清单.md` 营地交互重做条目 | 状态「…已编迭代 33」 | 卡① 完工后条目状态推进(归流水线登记段/文档批按 §12.1 执行) | doc-conventions §12.1;实现批禁写两份流程清单 |
|
||||
| 6 | `roadmap.md` 迭代 33 行与顶部「当前位」 | 状态「待开工」 | 卡① 合并后行内状态换代(归文档批) | 同上 |
|
||||
|
||||
## 卡③ 选档界面新建批
|
||||
|
||||
| # | 文档与落点 | 现行陈述 | 应改成 | 依据 |
|
||||
|---|---|---|---|---|
|
||||
| 7 | `design/gdd/systems/跨局循环/生涯.md` `:11-23`(信息架构结构树) | 主菜单六钮组直达营地/生涯 | 结构树补「进入存档→选档界面→进档→营地」一级层级;生涯入口改挂营地笔记本(卡④) | 卡③ 完成定义 1+裁决 1 三入口实装 |
|
||||
| 8 | `design/gdd/08-Alpha版本标准.md` 「三 · 界面」表 | 无选档界面行 | **增行请求(须用户裁——08 头注纪律)**:新增「选档界面」行(在役,迭代 33 卡③) | 卡③ §5 统一口径 |
|
||||
| 9 | `待办清单.md`/`roadmap.md` | 迭代 33 进行中 | 卡③ 完工状态推进(归文档批) | doc-conventions §12.1 |
|
||||
| 10 | `design/gdd/systems/表现与支撑/存档序列化.md` 消费面纪律节 | 窥视读器未记载(卡① 反哺点 4 补迁移口径时顺带) | 补 `peek_slot_summary` 返回结构(readable/has_file/三值)与「has_file=占档判定、非摘要项」口径 | 卡③ T0 对齐补充(二分判定来处的文档化) |
|
||||
|
||||
## 卡② 主菜单三入口化批
|
||||
|
||||
| # | 文档与落点 | 现行陈述 | 应改成 | 依据 |
|
||||
|---|---|---|---|---|
|
||||
| 11 | `design/gdd/systems/跨局循环/生涯.md` `:9`/`:11-23` | 主菜单六钮组(冒险组+营地与系统组)记述+生涯入口=开始层生涯钮 | 信息架构改三钮组(进入存档/设置/退出游戏);生涯入口改挂营地笔记本(卡④ 承载) | 卡② 实装(mn1/mn2) |
|
||||
| 12 | `design/gdd/ux/camp.md` `:10` | 「主菜单营地独立入口进入」 | 营地入口改挂存档内(选档→进档→营地场景图) | 同上 |
|
||||
| 13 | `design/gdd/08-Alpha版本标准.md` `:102-105` 三·界面表 | 主菜单/开始覆盖层等四行 | 状态列换代+入口拓扑注记(增删行须用户裁) | 卡② §5 统一口径 |
|
||||
| 14 | `体验验证清单.md` `:170`/`:192` | 左操作列(冒险/营地与系统两组)/营地与系统组生涯钮 | 主菜单形态引述换代(三钮)+目检项并入迭代 33 实机目检总清单(实现报告) | 卡② F13 |
|
||||
| 15 | `design/art/art-bible.md` `:433` | 小字号豁免合并条款含「主菜单分组 overline×2」枚举片段 | excision 两片段(组帽双撤——**禁整行删**) | 卡② mn11 实装 |
|
||||
| 16 | `待办清单.md`/`roadmap.md` | 迭代 33 进行中 | 卡② 完工状态推进+当前位换代(归文档批) | doc-conventions §12.1 |
|
||||
@@ -1,230 +0,0 @@
|
||||
# 迭代 33 实现报告(2026-10-21)
|
||||
|
||||
> 累积文档:卡①→卡③→卡② 依序施工,各卡收口时在本文追加该卡章节;随各卡合并提交进 master。三卡全部合并且总收口完成后本文即为迭代终稿。
|
||||
> 基线复读(T0,2026-10-21,master=7280070f):冒烟 **1156 项 / 0 失败**;单元 **35 套件全绿**;probe_gate `--click` **全绿**(残留 Godot=0)。
|
||||
|
||||
---
|
||||
|
||||
## 卡① 存档制数据层改造批(隐式单档 → 3 存档位)——已合并(见合并记录)
|
||||
|
||||
**状态**:T0–T4 完成;批末重闸 --code 全绿(回执见合并提交信息);独立验收审计两轮——首轮未过(sv3 拆闸实验判「拒写断言无判别力+生产链零对照面」、sv4 申报变异未执行且无判别力,两行缺漏回炉),回炉后断言强化(sv3 退化写目标锚+生产链对照面、sv4 旧内容判别锚)并补执行变异⑥⑦,复审通过(`reports/iter33-验收审计-2026-10-21.md` 卡① 节)。
|
||||
|
||||
### 一、实际改动—验收对照表(§7.1 需求侧表的执行对账,六列+结果)
|
||||
|
||||
> 断言尾缀族〔sv#〕均可 grep 定位。落点行号=合并时点实值。
|
||||
|
||||
| 需求点 | 改动实值(文件:行) | 验收测试实值(落点+尾缀) | 层级 | 真实入口 | 撤销或变异证明 | 结果 |
|
||||
|---|---|---|---|---|---|---|
|
||||
| sv1 三槽承载+位间隔离 | `save_manager.gd:15-27` 常量与字段(SLOT_COUNT/SLOT_PATH_TEMPLATE/_slot_template);`:77` slot_path 唯一派生口;`:66` attach_slot_template 注入口 | 冒烟 `_smoke_save_slots` ①段 `smoke_all.gd:6858` 起〔sv1 往返×3+位间隔离〕+单元 `save_slot_isolation_test.gd`〔sv1〕(22 检查) | 接口 | `SaveManagerCore` 实例按槽 API 读写往返,不经 UI | 变异①=slot_path 派生写死 `% 1` → 三槽往返一致断言红(已执行,见变异表) | 通过 |
|
||||
| sv2 启动态不读盘 | `save_manager.gd:29` `_init` 默认参改 `""`+`:48-53` `_ready` 只做旧档迁移、零读槽 | 冒烟 V2-s1/V2-s2(`smoke_all.gd:273-278`)〔sv2〕真实 boot 链+单元 `save_boot_no_activate_test.gd`(12 检查)类级白盒+生产链对照 | 冒烟+单元 | 组合根 boot 链 `/root/SaveManager`(真实入口=冒烟);单元为 --script 无 autoload 环境的类级对照面+settle 生产链(**双落点对账:计划仅列单元,实测拆为冒烟真实链+单元类级/链级**) | 变异④=_ready 偷调 activate_slot(1) → V2-s1/V2-s3 红(已执行) | 通过 |
|
||||
| sv3 无激活写盘拒绝 | `save_manager.gd:354-358` `write_to_disk` 入口 `_path == ""` 判定 | 冒烟 V2-s3(`smoke_all.gd:278`)+单元〔sv3〕「拒写+返 false+三槽快照全等+**退化写目标(裸 .tmp)零新增**+**MetaProgression.settle_adventure 生产链触达后盘面零触碰**」(`save_boot_no_activate_test.gd`,12 检查) | 接口 | `MetaProgression.settle_adventure()`(`meta_progression.gd:275`,写盘 :282)无激活态触达写盘被拒——生产链对照面在单测 ③段实测(真表 db 驱动全链) | 变异⑦=闸短路(`if false and _path == ""`)→ 退化写目标两断言红(类级+链级,已执行;首轮断言无判别力经审计判缺漏后强化) | 通过(回炉后) |
|
||||
| sv4 新档原语 | `save_manager.gd:116-137` `create_slot`(创建即激活+落盘+失败回退) | 冒烟 ③段〔sv4〕非白板旧内容(999/5)覆盖为全零白板+盘面核验非旧值 | 接口 | 空槽调新档 API 后按域读回+盘面文件内容核验 | 变异⑥=create 改读旧档(`load_from_disk()` 代 `_default_data()`)→ 白板两断言红(已执行) | 通过(回炉后) |
|
||||
| sv5 进档原语 | `save_manager.gd:94-114` `activate_slot`(激活+读盘+失败恢复切换前三态) | 冒烟 ①④段〔sv5〕+单元〔sv5〕 | 接口 | 槽 N 有档 → activate_slot → 读回=该槽内容 | 变异⑤=activate 漏更新 _path → 写盘受理断言红(已执行) | 通过 |
|
||||
| sv6 删档原语 | `save_manager.gd:140-161` `delete_slot`(文件删除+.tmp 清偿+激活指针连清除+.corrupt.bak 不追删) | 冒烟 ②段〔sv6〕文件系统存在性断言 | 集成 | 激活/非激活槽调删档 API+盘面核查 | 变异②=漏删文件 → 在盘断言红(已执行) | 通过 |
|
||||
| sv7 摘要三项按槽窥视 | `save_manager.gd:163-168` `peek_slot_summary`+`:170-172` peek_summary_at 注入口+`:174-205` 只读解析 | 单元 `save_slot_summary_test.gd`〔sv7〕(12 检查:三槽异值/空槽/三不可读态)+冒烟 ⑥段 | 单元+接口 | 窥视 API 按槽调用(不激活不写盘——套件内断言 active_slot==0) | 变异③=窥视改读激活态内存 → 跨槽摘要红(已执行) | 通过 |
|
||||
| sv8 窥视三态零副作用 | 同上(窥视路径零 `_corrupt_fallback` 触达——`:616` 迁移/`:315` 正式读盘均不在窥视调用链) | 冒烟 ⑥段〔sv8〕字节+mtime 双比对+零 .corrupt.bak 改名+.tmp 按空槽 | 接口 | 盘上坏槽/高版本夹具 → 窥视 API | 变异=窥视改走正式 load 路径 → 坏槽字节/在盘断言红(.corrupt.bak 改名主文件消失——sv8 断言族覆盖) | 通过 |
|
||||
| sv9 迁移链各槽成立 | 迁移链零改动(`SAVE_FORMAT_VERSION=7`+六件自注册不动),执行面按槽独立 | 冒烟 ⑤段〔sv9〕三槽各喂 v5 旧档→各自激活读回+写盘 version=7;既有迁移段(v1/v2/v5 旧档)全数复跑绿 | 接口 | 各槽 `load_from_disk` | 变异=迁移只跑激活槽 → 他槽读回断言红(⑤段按槽独立喂档,共享化即异值不成立) | 通过 |
|
||||
| sv10 切槽同实例整体替换 | `activate_slot` 内 `_data` 与路径整体替换+失败恢复;`MetaProgression.save` 引用零触碰(meta_progression.gd 零改动) | 单元 `save_slot_isolation_test.gd` ③段〔sv10〕宿主链引用同一性+写盘落当前槽+盘面核验 | 集成 | `MetaProgression.new(null, sm)` 真实宿主链驱动切槽 | 变异=切槽新建实例 → 同一性断言红(meta.save == t 断言锚);写成落错槽 → 位间隔离红(变异⑤已证) | 通过 |
|
||||
| sv11 测试隔离面保留 | `attach_path`(`:56-64`)语义保持「注入即激活+重读」+`attach_slot_template`(`:66-75`)新增隔离注入口;既有调用面零改(见 T0 清点) | 既有冒烟/探针段全数复跑绿(冒烟 1201/0 含全部既有段;probe_gate --click 重闸复跑)〔sv11〕 | 集成 | 各探针 `isolate_save()`(`.new(path)`+`load_from_disk`)与 `attach_path` 现有 8 处直接消费 | 撤销=注入路径改成忽略 → 依赖隔离的既有断言成片红(成片红即本行证明;实测既有段全绿=语义保持) | 通过 |
|
||||
| sv12 旧档处置 Q1 甲 | `save_manager.gd:616-631` `_migrate_legacy_save(src,dst,bak)` 字节级搬运+幂等判据+源改名 `.migrated.bak` 留痕;`_ready`(`:48-53`)生产接线 | 冒烟 V2-s4 迁移不变式(真实链)+⑦段夹具断言〔sv12〕(逐域相等/留痕/幂等/他槽零触碰) | 接口 | 盘上旧档夹具跑迁移+真实 boot 链(V2-s4) | 变异=去掉幂等判据 → 预置 777 覆盖断言红(⑦段夹具:槽 1 预置异值档+二次迁移) | 通过 |
|
||||
| sv13 不升 schema 版本 | `SAVE_FORMAT_VERSION := 7`(`save_manager.gd:9`)与 `_normalize` 零改动(diff 核实) | 既有版本/高版本拒读断言复跑绿(既有段+④段高版本槽)〔sv13〕 | 单元 | 既有冒烟版本段 | 判断依据=本行不改任何行为;升版即撞既有高版本拒读断言 | 通过(零改动核实) |
|
||||
| sv14 反哺点清单 | §5 所列文档口径(存档序列化.md `:61`/`:20`/`:16`/`:165`、待办清单条目、roadmap 行)列点不落文 | 件核对表〔sv14〕落 `reports/iter33-反哺点-2026-10-21.md` | 件核 | 收口前逐条指认落点 | 判断依据=产出物件核不产码 | 通过(见反哺点清单卡① 节) |
|
||||
|
||||
### 二、变异验证记录表(注入 → 最窄闸见红 → git checkout 精确还原 → 复绿)
|
||||
|
||||
| # | 注入点 | 预期 | 实测红 | 最窄闸 | 还原后 |
|
||||
|---|---|---|---|---|---|
|
||||
| ① | `slot_path` 派生写死 `_slot_template % 1`(三槽同一文件) | 三槽往返一致断言红 | sv1 三槽往返一致·槽 1/2 红(`save_slot_isolation_test`) | 单元套件直跑 | all green (22 checks) |
|
||||
| ② | `delete_slot` 文件删除分支短路(`if false and …`,漏删文件) | 在盘断言红 | sv6 删后文件不在盘红+sv6 非激活槽红+sv7 空槽窥视连带红(冒烟) | `run_smoke.py` 全量 | 1201/0 全绿 |
|
||||
| ③ | `peek_slot_summary` 改读激活态内存 | 跨槽摘要红 | sv7 窥视三项逐槽正确·槽 1/2 红(`save_slot_summary_test`) | 单元套件直跑 | all green (12 checks) |
|
||||
| ④ | `_ready` 偷调 `activate_slot(1)`(偷复激活) | boot 断言红 | V2-s1 boot 后无激活态红+V2-s3 写盘拒绝红(冒烟) | `run_smoke.py` 全量 | 1201/0 全绿 |
|
||||
| ⑤ | `activate_slot` 漏更新 `_path`(写盘落旧目标) | 写盘落错槽红 | sv3 激活态写盘受理·槽 1/2 红(`save_slot_isolation_test`——无激活态拒写路径被触发) | 单元套件直跑 | all green (22 checks) |
|
||||
| ⑥ | `create_slot` 改读旧档(`load_from_disk()` 代 `_default_data()`,首轮审计 sv4 缺漏回炉) | 全零白板断言红 | sv4 白板态红+sv4 盘面核验红(999 旧值带入;冒烟) | `run_smoke.py` 全量 | 1201/0 全绿 |
|
||||
| ⑦ | `write_to_disk` 无激活闸短路(首轮审计 sv3 缺漏回炉——拆闸实验证实原断言无判别力) | 拒写盘面零触碰断言红 | sv3 退化写目标零触碰红+sv3 生产链盘面零触碰红(`save_boot_no_activate_test`——杂散 game/.tmp 真实落盘被两锚抓获) | 单元套件直跑 | all green (12 checks) |
|
||||
|
||||
### 三、T0 产物:隔离面全清单清点(sv11 件核)
|
||||
|
||||
逐点确认三槽化后仍可隔离到单槽(判定准则=契约 7 单路径语义「注入路径=激活槽文件,无激活态时注入即激活并重读」):
|
||||
|
||||
| 隔离面 | 位点 | 三槽化后判定 |
|
||||
|---|---|---|
|
||||
| `attach_path` 直接消费 | `ui_tune_probe.gd:167/:171`、`t17_defer_probe.gd:21`(注释引)、`probe_ui_util.gd:111`、`pacing_queue_test.gd:28`、`smoke_all.gd:276/:320/:462/:593` | 语义零变化(注入即激活+重读+写盘落注入路径)——实测既有段全绿 |
|
||||
| `isolate_save`(`.new(path)`+显式读盘) | `probe_ui_util.gd:104-106`(tag 族 10 探针 15 处间接消费) | `.new(path)` 显式传路径形态保持(默认参改 `""` 零波及——全仓无 `.new()` 零参消费) |
|
||||
| `_META_SMOKE_PATHS` 18 条 | `smoke_all.gd:5697-5704`(T0 订正值),消费=`_meta_new_save(path)` 独立实例 | 与槽位承载正交(独立实例直构),零影响 |
|
||||
| boot/lifecycle 四段 | `smoke_all.gd:276/:320/:462/:593` | 段内先 attach 后消费,V2d-2 起全部在激活态下运行,零影响 |
|
||||
| presenter lambda 注入面 | `main.gd:317`(camp ctx) | 未触碰 save 引用,零影响 |
|
||||
| 真实档红线 | 探针纪律「绝不碰 user://save.json」 | 保持:生产迁移在 autoload `_ready`(玩家 boot 语义),探针注入路径不经过 `user://save.json`;新增槽模板注入口保证测试夹具落 `user://smoke_*` 命名空间 |
|
||||
|
||||
### 四、Q1 执行留痕(sv12 生产实证)
|
||||
|
||||
- **裁定执行**:Q1 甲(迁 1 号存档位)——`_ready` 一次性 `_migrate_legacy_save(user://save.json, user://save_slot_1.json, user://save.json.migrated.bak)`。
|
||||
- **本机真实迁移已发生**(批内首次 godot boot 时):源= v7 空进度档(钥石 0、无断点),已字节迁入 `user://save_slot_1.json`,原件留痕 `user://save.json.migrated.bak`。`save.json.quarantined-20261020`(10-19 隔离件)非迁移对象,原样未动。
|
||||
- **损坏/高版本旧档路由**:实现取「字节级原样搬运、零解析零改造」——损坏/高版本旧档字节原样落槽 1,「原样落入槽 1」按字面成立;读取该槽时由正式进档路径兜底链(`.corrupt.bak` 改名留盘)/拒读链接管,数据不静默丢失。与本卡 §10 Q1「执行前置检查」的 L3 路由相比,本实现使该意外形态不再触发承诺失效(字节未变),故未走 L3 呈报;此口径已在追认单登记(§9 白名单域内的实现取法,veto 窗口开放)。
|
||||
- **幂等判据**:槽 1 已存在不重迁;迁移成功后源已改名,二次启动源不存在=天然无操作。双重保险,sv12 ⑦段夹具断言钉死。
|
||||
|
||||
### 五、已知中间态(批内事实,随卡③/卡② 合并消除)
|
||||
|
||||
1. **无激活态真空窗口**(卡① 合并后、卡③ 合并前):boot 后无激活态,主菜单「开始冒险/继续上局/营地/生涯」旧钮仍可点——冒险可玩但结算写盘被拒(`settle_adventure` 忽略返回值→进度不落盘)、营地购买写盘被拒。此为卡① Q2 裁甲明知且接受的批内中间态;卡③ 同迭代内随后合并(进档即激活),卡② 再撤旧钮,终态无此窗口。
|
||||
2. **boot 态 first_adventure_done=false**:无激活态下 `is_first_adventure_done()` 返回默认 false——窗口期内直开冒险会走首局教学脚本模式(旧档玩家的一次性观感差异);卡③ 合并后生产路径必经进档(激活后读回该槽真实值),窗口外无影响。
|
||||
3. **V2d-1 改写**(削弱申报在案):「续玩钮 boot 态==真实档断点态」关系判据 → 「boot 态恒隐(无激活态)」;卡② mn8 撤钮时整族承接。
|
||||
|
||||
### 六、读数对照
|
||||
|
||||
| 闸 | 基线(T0) | 末态(卡① 收口) |
|
||||
|---|---|---|
|
||||
| 冒烟 | 1156 / 0 | **1201 / 0**(+45:V2-s1..s4 四断言+_smoke_save_slots 段 41 断言) |
|
||||
| 单元 | 35 套件全绿 | **38 套件全绿**(+3:isolation 22 / boot 12〔回炉+4〕/ summary 12) |
|
||||
| probe --click | 全绿 | 全绿(重闸复跑) |
|
||||
| 重闸 --code | — | 全绿(回执随合并提交留痕) |
|
||||
|
||||
---
|
||||
|
||||
## 卡③ 选档界面新建批(3 存档位 · 新档/进档/删档)——已合并(见合并记录)
|
||||
|
||||
**状态**:T0–T4 完成;独立验收审计两轮——首轮未过(批末重闸回执 all_green=false:静态扫描两处卡③新增 R1 裸容器注解 `main.gd:1176`/`save_select_overlay.gd:58`,收口时点只核回执 commit 未核 verdict、报告「全绿」表述失实——回炉改推断形态+`Array[Variant]`+`assign()`、重跑重闸实测全绿);复审通过(`reports/iter33-验收审计-2026-10-21.md` 卡③ 节)。
|
||||
|
||||
### 一、实际改动—验收对照表(§7.1 需求侧表的执行对账,六列+结果)
|
||||
|
||||
> 断言尾缀族〔sl#〕均可 grep 定位(探针 problems 文本与对照表同名)。落点行号=合并时点实值。
|
||||
|
||||
| 需求点 | 改动实值(文件:行) | 验收测试实值(落点+尾缀) | 层级 | 真实入口 | 撤销或变异证明 | 结果 |
|
||||
|---|---|---|---|---|---|---|
|
||||
| sl1 三槽呈现 | 新建 `views/save_select_overlay.gd`(`_init`:19 页壳+`open_save_select`:53 喂入重建) | `ui_struct_probe` 选档段〔sl1〕槽卡行数==3+滚动容器计数==0(`ui_struct_probe.gd:80` 起段) | 探针 | `main._open_save_select()` 真实开层子树(「进入存档」钮归卡② mn3——函数直调中间态在案) | 变异m7=套 ScrollContainer → 计数+零尺寸双红(已执行) | 通过 |
|
||||
| sl2 摘要三项逐槽读数 | 槽卡消费喂入三键(视图 `_build_slot_row`:72;组合根 `_save_select_data`:1173 经卡① 窥视 API) | struct 段〔sl2〕异值夹具(钥石 555/通关 2 局/冒险 7 局)逐字断言 | 探针 | 开层后各槽卡 label 实取值(渲染面) | 变异m2=摘要改读激活位 → 两行红(已执行) | 通过 |
|
||||
| sl3 摘要禁项 | 槽卡只消费三键,零断点字段进视图 | struct 段〔sl3〕禁词断言(断点/种子/继续/停点/「 关」零命中——label 全集枚举) | 探针 | 选档层真实 Label 文本全集 | 变异m9=断点关数拼进槽卡副标题 → sl3 红(已执行;词形表随变异补「 关」) | 通过 |
|
||||
| sl4 操作集二分 | 槽卡按 occupied 分支渲染钮集(视图 `_build_slot_row` occupied 分支) | struct 段〔sl4〕**渲染面按钮文本扫描**(空/坏槽零删档钮含置灰形态、有档槽零新档钮) | 探针 | 真实开层子树按钮枚举 | 变异m3=空槽渲染删档钮 → 红(已执行;首轮断言走簿记缝被变异暴露盲区,强化为渲染面扫描后复红) | 通过 |
|
||||
| sl5 空槽新档链 | `main.gd:1187` `_on_save_select_new`:create_slot→暂行开 CampOverlay(Q3 乙) | `ui_click_probe` 选档段〔sl5〕真实点击(pressed.emit)断言 active==1+白板落盘 | 集成 | 真实按钮信号路径 | 撤销=去掉 create_slot 调用 → 激活/落盘断言红 | 通过 |
|
||||
| sl6 有档槽进档链 | `main.gd:1193` `_on_save_select_load`:activate_slot→暂行 CampOverlay | click 段〔sl6〕 | 集成 | 真实点击进档钮 → active==2 | 变异=进档读成当前激活槽 → active 断言红 | 通过 |
|
||||
| sl7 删档二次确认链 | `main.gd:1200` `_on_save_select_delete`:open 前设消费方→弹窗;confirmed 才删、cancelled 只关窗 | click 段〔sl7〕双路径(一击只开窗/取消文件在/确认删+槽回空+就地刷新) | 集成 | 真实点删档钮 → 确认窗 → 两支(cancelled/confirmed 信号同源) | 变异m1=删档直连删除 → 「一击未只开确认窗(直删形态)」红(已执行) | 通过 |
|
||||
| sl8 消费方编排机制 | `main.gd:361-362` 单口分派接线+`:495` new_adventure 消费方设置+`:1200` delete_slot 消费方设置;双常驻静态接线撤除 | click 段〔sl8〕确认后/取消后消费方状态量清零+删档确认不误触发开局(`run_scope.is_adventure` 断言);现役断点确认段(既有 ui_click_probe 二轮 A 段)复跑绿=分派对 new_adventure 消费方行为零变化 | 集成 | 两个开窗路径共用同一弹窗实例 | 变异m4=注入双常驻静态接线(confirmed 再连 _start_adventure)→ 「删档确认误触发开局」红(已执行) | 通过 |
|
||||
| sl9 重启不预选(Q1 甲) | 视图零选中态字段+组合根零持久化(boot 无激活=卡① sv2 面承接) | struct 段〔sl9〕fresh-boot 开层前 active_slot()==0+「已选」标记文本零命中 | 探针 | 探针每 run 全新 boot main.tscn=重启链;V2-s1(卡①)钉 boot 级 | 变异m8=视图加预选标记 → 红(已执行) | 通过 |
|
||||
| sl10 返回路径与 ESC 语境 | 返回钮→closed 信号→`main.gd:1164` `_on_save_select_closed`(_close_modal+开始层恢复);视图零 ESC 处理 | `screen_flow_probe` 选档步〔sl10〕(`screen_flow_probe.gd:129` 起步函数):返回后恢复+合成 ESC 层不关 | 探针 | 真实点击返回钮+viewport.push_input 合成 ESC | 变异m5=返回钮只隐不关 → 恢复断言红;变异m-ESC=main 加 ESC 处理 → 不响应断言红(均已执行) | 通过 |
|
||||
| sl11 层序与模态纪律 | `main.gd:48` LAYER_CONTRACT 加行(生涯同档)+`:434` 层查表+`:297` 构造 | 既有 `_modal_registry_contract`(登记序=合同序逐位)+V1d(move_child 单口)复跑自动覆盖新层〔sl11〕;ui_tune_probe 树序断言复跑 | 冒烟/探针 | `smoke_all.gd:146` 起源码合同段+struct 登记契约 | 变异=视图内散落 move_child → V1d 散落判红(新层零散落=合同表行即全部落位) | 通过 |
|
||||
| sl12 动线序不回闪 | `main.gd:1187/:1193` 先落点开层(open_camp 内藏开始层)再不关选档(栈记账挂起) | click 段〔sl12〕逐帧可见性采样+**栈遮挡记账断言**(select ∈ camp._occluded——被挂起非关闭) | 探针 | 真实点击新档钮后逐帧采样 | 变异m6=改成先关后开 → 「被关闭而非栈记账挂起」红(已执行;回闪一帧前提经 ModalStack 源码核实不成立〔close 只还原登记层、start 为壳不登记〕,判别面钉在记账态) | 通过 |
|
||||
| sl13 公共件复用零新素材零新色值(非行为改动) | 视图全用 UiKit 工厂(page_shell/label/button/danger_button/primary_button/keystone_badge)+现行色 token(WARM/WARM_SOFT/CANDLE/WARM_FAINT) | struct `_audit("savesel")` 结构族+`ui_contrast_probe` 对比度全绿复跑〔sl13〕;diff 核实零新 `Color8(` 字面量/素材路径 | 件核 | 本批 diff 文件枚举 | 判断依据=不改行为;变异=引入新色值 → 对比度探针红 | 通过(diff 核实) |
|
||||
| sl14 反哺点清单(非行为改动) | §5 所列(待办清单、生涯.md 结构树、08 增行请求、roadmap)列点不落文 | 件核对表〔sl14〕落 `reports/iter33-反哺点-2026-10-21.md` 卡③ 节 | 件核 | 收口前逐条指认落点 | 判断依据=产出物件核不产码 | 通过(见反哺点清单卡③ 节) |
|
||||
|
||||
### 二、变异验证记录表(注入 → 最窄闸见红 → git checkout 精确还原 → 复绿)
|
||||
|
||||
| # | 注入点 | 实测红 | 最窄闸 | 还原后 | 伴生断言强化 |
|
||||
|---|---|---|---|---|---|
|
||||
| m1 | `_on_save_select_delete` 直连删除(跳过确认窗) | sl7 一击未只开确认窗(直删形态) | ui_click_probe | 问题=0 | — |
|
||||
| m2 | `_save_select_data` 三值改读激活位现值 | sl2 摘要读数两行红 | ui_struct_probe | 零红 | — |
|
||||
| m3 | 空槽分支渲染删档钮 | 首轮零红→**暴露断言盲区**(簿记字典缝未含该钮);sl4 改渲染面按钮文本扫描后复红 | ui_struct_probe | 零红 | sl4 渲染面化 |
|
||||
| m4 | confirmed 再连 `_start_adventure`(双常驻静态接线忠实形态) | sl8 删档确认误触发开局 | ui_click_probe | 问题=0 | — |
|
||||
| m5 | 返回钮改只隐不关不恢复 | sl10 返回后开始层未恢复 | screen_flow_probe | PASS | — |
|
||||
| m6 | 新档回调先 `_close_modal` 再开营地 | sl12 被关闭而非栈记账挂起(**首轮帧采样零红**——ModalStack 源码核实「close 恢复开始层」前提不成立,判别面改钉遮挡记账) | ui_click_probe | 问题=0 | sl12 记账判别 |
|
||||
| m7 | 槽卡容器套 ScrollContainer | sl1 滚动容器计数红+zero_size 红 | ui_struct_probe | 零红 | — |
|
||||
| m8 | 槽名拼「(已选)」预选标记 | sl9 预选标记文本命中 | ui_struct_probe | 零红 | — |
|
||||
| m9 | 槽卡副标题拼断点关数 | sl2 精确匹配红+sl3 禁词红(**首轮仅 sl2 红**——禁词表缺关数词形,补「 关」形后双红) | ui_struct_probe | 零红 | sl3 词形表 |
|
||||
| m-ESC | main 加选档语境 ESC 处理 | sl10 ESC 关闭了选档层 | screen_flow_probe | PASS | — |
|
||||
|
||||
### 三、T0 产物:confirm_dialog 断言面清点(§7.2 申报位点核对)
|
||||
|
||||
| 位点 | 卡③ 处置后实况 |
|
||||
|---|---|
|
||||
| `ui_struct_probe.gd:71`(结构采样——confirm open/audit) | 分派口变化后行为不变(open 直开保留)——采样复跑绿,零改写 |
|
||||
| `smoke_all.gd:226`(最顶层候选) | 弹窗实例数与树序未变——复跑绿,零改写 |
|
||||
| `ui_click_probe.gd:508-527`(断点确认交互段) | 分派重构初版曾红(「确认开新冒险后未开局」——`_start_adventure_from_menu` 开窗未设消费方),补设后复跑绿;该段即 sl8 的 new_adventure 侧活体回归 |
|
||||
| `ui_tune_probe.gd:52`(树序断言) | 弹窗构建位未动——复跑绿,零改写 |
|
||||
| 申报小结 | §7.2 四位点**零改写**(判据未放宽);新增断言见对照表 |
|
||||
|
||||
### 四、已知中间态(随卡②/卡④ 合并消除或换代)
|
||||
|
||||
1. **选档层无生产入口**(卡③ 合并后、卡② 合并前):「进入存档」钮属卡②——探针经 `main._open_save_select()` 函数直调(mn10 同款中间态,对照表 sl1/sl5-sl7 真实入口列在案);卡② mn3 补钮与点击链后闭环。
|
||||
2. **进档/新档暂行落点 CampOverlay**(Q3 裁乙):卡④ 重立卡后改挂场景图(其 T3 承载改挂与二次验证面)。
|
||||
3. **选档层营地段被栈挂起不关闭**(sl12 钉死态):camp 关闭时栈还原选档层(玩家回选档面)+`_on_camp_closed` 恢复开始层(被选档页遮挡不可见)——卡④ T3 同口径换代点。
|
||||
4. **窥视读器 has_file 位**(T0 对齐补充):空/有档操作集二分判定来处,非摘要第四项;已在卡① 交付面、卡③ 消费面两侧文档(卡③ §2 对齐附注)留痕。
|
||||
|
||||
### 五、读数对照
|
||||
|
||||
| 闸 | 基线(卡① 合并态) | 末态(卡③ 收口) |
|
||||
|---|---|---|
|
||||
| 冒烟 | 1201 / 0 | **1201 / 0**(卡③ 断言全在探针层,冒烟零新增) |
|
||||
| 单元 | 38 套件全绿 | **38 套件全绿** |
|
||||
| probe --click | 全绿 | 全绿(struct/click/flow 三件新段全绿+ui_contrast 等既有件零回归) |
|
||||
| 重闸 --code | — | 首轮 all_green=false(R1×2 新增)→ 回炉后**全绿**(回执随合并提交留痕——收口流程订正:回执须核 verdict 非仅 commit) |
|
||||
|
||||
---
|
||||
|
||||
## 卡② 主菜单三入口化批(6 钮 → 3 钮)——已合并(见合并记录)
|
||||
|
||||
**状态**:T0–T4 完成;批末全量闸全绿(回执随合并提交留痕);独立验收审计通过(`reports/iter33-验收审计-2026-10-21.md` 卡② 节)。
|
||||
|
||||
### 一、实际改动—验收对照表(§7.1 需求侧表的执行对账,六列+结果)
|
||||
|
||||
| 需求点 | 改动实值(文件:行) | 验收测试实值(落点+尾缀) | 层级 | 真实入口 | 撤销或变异证明 | 结果 |
|
||||
|---|---|---|---|---|---|---|
|
||||
| mn1 三钮在位 | `ui_assembler.gd:126-137` build_start_overlay 三钮(进入存档 primary/设置/退出)+组帽双撤 | 冒烟 V2(`smoke_all.gd:162` 三钮在位)+V2d 渲染面计数==3(`smoke_all.gd:292`)〔mn1〕 | 冒烟 | 真实 MenuScreen 经装配器构建后读句柄+渲染面枚举 | 变异A=生涯钮接回三钮集 → 渲染面计数红(已执行;句柄缝盲区由变异暴露后强化) | 通过 |
|
||||
| mn2 四旧钮彻底撤出 | `menu_screen.gd:9-12` 句柄面撤 4 留 3;assembler 返回字典换代 | 冒烟 V2d 四旧钮句柄零命中×4+渲染面计数锚〔mn2〕 | 冒烟 | 菜单场景句柄枚举+渲染面 | 变异A 同锚 | 通过 |
|
||||
| mn3 进入存档可达选档 | `main.gd:323` entersavebtn.pressed→_open_save_select | `screen_flow_probe` 选档步〔mn3〕:合成点击进入存档钮→选档层可见且开始层隐藏 | 探针 | 真实按钮信号路径(卡③ 直调中间态就此闭环) | 变异B=接错层(连营地)→ sl10 屏级互斥 5 处红(已执行) | 通过 |
|
||||
| mn4 设置钮零行为变化 | settingsbtn 接线保持 | 冒烟 V3g settings 模态段复跑〔mn4〕 | 冒烟 | settingsbtn 句柄 pressed | 撤销=断线 → V3g 红 | 通过 |
|
||||
| mn5 退出接线正确 | quitbtn→_quit_game 保持 | ui_click 退出游戏按钮存在断言(D1 二轮段)复跑〔mn5〕 | 探针 | MenuScreen.quitbtn | 变异=改连空函数 → 连接断言红 | 通过 |
|
||||
| mn6 断点确认零残留 | `main.gd:489-497` 确认分支摘除+分派器 new_adventure 臂退役(机制保留) | ui_struct confirm 采样复跑+mn10 直调段绿(确认链不可达=直调直启)〔mn6〕 | 探针 | 主菜单路径确认链已无触发入口(钮撤+分支摘) | 撤销=接线复现 → 申报内 ui_click 断点段(已按 §7.2 删除移交卡④)原断言红 | 通过 |
|
||||
| mn7 _refresh_resume_button 删除+消费点清零 | 函数删除+main.gd 五处+camp_flow_context 载体+camp_shop_presenter 三处+probe_ui_util 参数+pacing_queue+V2d 族 | T0 清点口径全仓 grep 零命中件核(本表随附清点)+冒烟/探针全绿 | 集成 | 真实消费链已全部拆除 | 变异=漏删一处 ctx 字段 → 解析错/调用错红(camp_flow_context 参数摘除即证) | 通过 |
|
||||
| mn8 废止断言族有改写承接 | smoke V2 三钮/V2d 族重写(`smoke_all.gd:160-166`/`:281-293`)/V3g camp 新路径(`:411-449`)/V3i 钮断言摘(`:474-481`)/resume_vis 键退役(`_stage_faces`) | 改写后断言〔mn8〕逐族承接(渲染面计数+V3g 新路径+V2d 四旧钮零命中) | 冒烟 | boot 与回菜单生命周期段真实入口 | 撤销=只删不写承接 → 「每个废止族须有承接」计数断言红 | 通过 |
|
||||
| mn9 营地/生涯入口探针段改走新路径 | ui_probe/ui_struct/screen_flow/shot/ui_click 营地=进档开层新路径(open_camp_via_savesel 助手——槽模板清场防真实槽污染);生涯=函数直调中间态(卡④ 笔记本改挂前) | 各探针自身绿+新路径断言〔mn9〕 | 探针 | 选档层新档钮真实信号路径(持久化核验同源落槽文件) | 撤销=入口段留旧句柄 → 取不到钮即红(助手返回 false 即问题行) | 通过 |
|
||||
| mn10 冒险段探针直调中间态 | `_start_adventure_from_menu`/`_resume_from_menu` 保留仅摘接线/确认分支;直调位点=screen_flow 选档后冒险步、shot 关卡段、fx_shot、t17、ui_input、layout、ui_tune、smoke ×4、pacing_queue、ui_struct resume 专项 | 各该段复跑绿〔mn10〕+本节「已知中间态」逐位点登记 | 探针 | 函数直调(如实标中间态,卡④ 到位换代) | 撤销=删函数 → 直调段运行即红 | 通过 |
|
||||
| mn11 组帽撤除+左列几何不破 | `ui_assembler.gd` 两枚 overline 删除+三钮纵列(左列布局原骨) | ui_struct `_start_columns_contract`+`_audit("start")` 复跑〔mn11〕 | 探针 | 真实菜单构建后几何审计 | 变异=左列改单列致相交 → 不相交合同红 | 通过 |
|
||||
| mn12 menu golden 重制 | `game/tests/golden/menu_boot.png` 重采(三钮形态;golden_baseline_refresh --menu,触发原因=钮集换代) | render_gate 菜单 golden 逐像素段〔mn12〕 | golden | render_gate 驱动 shot_probe 真机渲染比对 | 撤销=拿旧基线跑 → 钮集区差红 | 通过(重闸渲染闸绿) |
|
||||
| mn13 pacing_queue 套件连带改造 | `pacing_queue_test.gd` 钮依赖行摘除(宿主链驱动保持) | 该套件自身绿(40 套件全绿内)〔mn13〕 | 单元 | run_all 真实套件入口 | 变异=裸调下层 → 宿主链断言红 | 通过 |
|
||||
| mn14 反哺点清单(非行为改动) | §5 所列(生涯.md/camp.md/08/体验验证清单/art-bible :433 excision/待办清单/roadmap)列点不落文 | 件核对表〔mn14〕落反哺点清单卡② 节 | 件核 | 收口前逐条指认 | 产出物件核不产码 | 通过 |
|
||||
|
||||
### 二、变异验证记录表
|
||||
|
||||
| # | 注入点 | 实测红 | 最窄闸 | 还原后 | 伴生强化 |
|
||||
|---|---|---|---|---|---|
|
||||
| A | 生涯钮接回三钮集(渲染面,无句柄) | 首轮 ui_struct/冒烟均零红——**句柄缝盲区暴露**(V2 只查三钮在位、V2d 只查句柄);补渲染面计数锚后冒烟红(1 项失败) | run_smoke | 1213/0 | V2d 渲染面计数锚 |
|
||||
| B | 进入存档钮接错层(连 _camp_pres.open_camp) | screen_flow 5 处红(sl10 屏级互斥失守+营地/冒险同屏) | screen_flow_probe | PASS | — |
|
||||
|
||||
### 三、已知中间态(mn10 逐位点登记——卡④ 到位换代)
|
||||
|
||||
生涯页与冒险入口无 UI 路径(生涯=营地笔记本、冒险=大门两分支,均卡④ 承载):`_open_career`/`_start_adventure_from_menu`(确认链已摘,直启形态)/`_resume_from_menu` 三函数保留为探针直调中间态,直调位点=ui_struct resume 专项、screen_flow 冒险步、shot 关卡段、fx_shot、t17_defer、ui_input、layout、ui_tune、smoke 四处、pacing_queue。ui_click 断点段②③(续玩全链+互斥确认两分支)按 §7.2 申报删除,卡④ 大门 T5 接收两头登记。
|
||||
|
||||
### 四、读数对照
|
||||
|
||||
| 闸 | 基线(卡③ 合并态) | 末态(卡② 收口) |
|
||||
|---|---|---|
|
||||
| 冒烟 | 1201 / 0 | **1213 / 0**(+12:V2 三钮+V2d 承接族+渲染面锚) |
|
||||
| 单元 | 38 套件全绿 | **40 套件全绿**(+2=平行迭代34 批次合入所带来的套件,非本批新增) |
|
||||
| 探针 | 全绿 | 全绿(struct/click/flow/ui_probe/tune/layout/input/t17 直跑;fx/shot 归窗口化闸件) |
|
||||
| golden | 六钮基线 | 三钮基线重制(渲染闸复跑绿) |
|
||||
|
||||
---
|
||||
|
||||
## 迭代 33 总收口(2026-10-22)
|
||||
|
||||
### 三卡状态总表
|
||||
|
||||
| 卡 | 状态 | 合并提交 | 独立验收审计 |
|
||||
|---|---|---|---|
|
||||
| 卡① 存档制数据层改造批(隐式单档→3 存档位) | 完成 | ebf40947 | 两轮(首轮 sv3/sv4 缺漏回炉) |
|
||||
| 卡③ 选档界面新建批(3 存档位 新档/进档/删档) | 完成 | 5c2a7bcf | 两轮(首轮 R1×2+回执核验失实回炉) |
|
||||
| 卡② 主菜单三入口化批(6 钮→3 钮) | 完成 | 508f190b | 一轮(无缺漏,三条不阻塞例外注记) |
|
||||
|
||||
卡④(营地场景图)2026-10-21 已退回美术设计段(非有效卡)、卡⑤(Esc 浮窗)随卡④ 代码波同行——均不在本迭代范围。
|
||||
|
||||
### 批末闸序列
|
||||
|
||||
全量闸(domain=full)全绿 @ 卡②分支尖 94f8614(冒烟 1213/0/单元 40 套件/探针全件/静态扫描/渲染闸(golden 三钮基线)/熵增闸+文档域六闸);卡①③ 合并各自回执对齐分支尖;合并后 master 冒烟复跑 1213/0。MC 零跑(三卡零数值零玩法行为——承载面与 UI 面改造,同板同序列结算逐位一致由既有 parity 面承接)。
|
||||
|
||||
### 实机目检总清单(真人检测只登记不阻塞——实机目检=生命周期末步统一进行)
|
||||
|
||||
1. 主菜单三钮观感(左列布局是否失衡)——卡② 目检项
|
||||
2. 选档界面三槽观感与删档确认文案——卡③ 目检项
|
||||
3. 旧档首次启动迁移提示行为(push_warning 留痕——开发者向,非玩家面)——卡① 附带观察项(可选)
|
||||
|
||||
### 已知中间态索引(均以卡④/文档批落地为换代点)
|
||||
|
||||
- 卡① §五:无激活态真空窗口(卡③ 已闭合)/boot first_adventure_done 语义/V2d-1 改写
|
||||
- 卡③ §四:进档/新档暂行落点 CampOverlay(卡④ 改挂)/选档层营地段栈挂起不关闭
|
||||
- 卡② §三:生涯/冒险入口无 UI 路径(探针直调)——卡④ 大门/笔记本承载;ui_click 断点段②③移交卡④ T5
|
||||
|
||||
### 收口核对
|
||||
|
||||
- [x] 三卡 T4 产出物齐(实现报告/代拍板追认单 12 项/反哺点 16 条/验收审计四节)
|
||||
- [x] 批末闸按改动域全绿留痕(回执 commit 对齐各分支尖)
|
||||
- [x] 独立验收审计三卡全过
|
||||
- [x] 中间产物零残留(变异注入与审计操作均 git checkout 精确还原,game/ 零污染)
|
||||
- [x] 追认单 veto 窗口开放至用户明示(12 项代拍备案)
|
||||
- [ ] roadmap 当前位/迭代行换代+待办清单状态推进=**归文档批**(反哺点 6/16 条目,本批禁写根清单)
|
||||
@@ -1,275 +0,0 @@
|
||||
# 迭代 33 独立验收审计(2026-10-21)
|
||||
|
||||
> 审计人:未参与实现的独立会话,只采信盘面证据与自跑实测,不采信任何报告的「已全绿」。
|
||||
> 被审计对象:卡① 存档制数据层改造批(worktree `D:\code\g-plan2-iter33card1-save`,分支 `iter33-card1-save`,实现提交 `6a7c2575`+`074cfe27`,基线 `7280070f`;首轮审计后回炉提交 `4a8558a0`,见文末复审小节)。卡③ 选档界面新建批审计见文末「卡③」节(worktree `D:\code\g-plan2-iter33card3-saveselect`)。
|
||||
> 审计材料:需求卡片 §7.1/§7.2、实现报告卡① 节实际对照表与变异记录表、`git diff 7280070f..HEAD`、三个新单元套件+冒烟新段+run_all 注册、闸回执。
|
||||
> 审计自跑基线(首轮,HEAD=074cfe27):冒烟 **1201 项 / 0 失败**(`python tools/run_smoke.py`,三闸全过);单元 **38 套件全绿**(`--script res://tests/run_all.gd`)——与实现报告读数一致。
|
||||
> 复审自跑基线(回炉后,HEAD=4a8558a0):冒烟 **1201 项 / 0 失败**(三闸全过);单元 **38 套件全绿**;boot 套件 **12 检查全绿**——均为审计自跑实测,见复审小节。
|
||||
|
||||
## 卡① 存档制数据层改造批
|
||||
|
||||
### ① 逐行核对表(sv1–sv14,对实现报告实际对照表逐行复核)
|
||||
|
||||
| # | 判定 | 依据(审计自查实录) |
|
||||
|---|---|---|
|
||||
| sv1 三槽承载+位间隔离 | 通过 | 两落点在盘:单元 `save_slot_isolation_test.gd` ①段+冒烟 `_smoke_save_slots` ①段;〔sv1〕尾缀 grep 命中(冒烟 4 处、单元多处)。真实入口=卡片申报面(SaveManagerCore 按槽 API 直调,不经 UI)未绕过。变异①(slot_path 写死 `% 1`)机理静态复核成立:三槽同名文件则槽 2/3 异值读回必不成立。 |
|
||||
| sv2 启动态不读盘 | 通过 | 真实入口在位:冒烟 V2-s1/V2-s2 挂真实 autoload boot 链(`main.get_node("/root/SaveManager")`,`_smoke_boot_chain` 内)。单元为类级白盒面——计划落点仅单元、实测拆双落点,报告已如实对账(非隐瞒)。变异④机理成立:`_ready` 偷激活则 V2-s1 `active_slot()==0` 直接判红。 |
|
||||
| sv3 无激活写盘拒绝 | **缺漏**(首轮判;回炉后复审通过,见文末复审小节) | 见结论缺漏 1。两点:申报真实入口(`MetaProgression.settle_adventure` 链触达写盘被拒)零对照面——单测与冒烟 V2-s3 均裸调 `write_to_disk`,无任何 MetaProgression 链在无激活态下触达写盘的断言;撤销证明经审计实测**不成立**(拆闸后全部 sv3 断言仍绿,详②-2)。报告 sv3 行「代码评审可证」的撤销主张被实验推翻。 |
|
||||
| sv4 新档原语 | **缺漏(轻)**(首轮判;回炉后复审通过,见文末复审小节) | 断言在盘(冒烟 ③段)且入口合规;但申报变异「新档写成读旧档」未执行,且经流程点推演**无判别力**:冒烟段序为②段先删槽 3、③段才 create_slot(3),此时槽 3 无文件——「读旧档」变体读不存在文件=回默认态,全零断言仍绿。报告以推理代实测(「与 sv5 读回断言同族必红」),未按 test-conventions §6 标「拦截能力未证」。见结论缺漏 2。 |
|
||||
| sv5 进档原语 | 通过 | 冒烟 ①④段+单元多落点;〔sv5〕grep 命中。变异⑤已执行且机理成立:激活不落 `_path` 则首槽写盘受理返回 false,「sv3 激活态写盘受理」判红——与报告变异表⑤一致。 |
|
||||
| sv6 删档原语 | 通过 | 冒烟 ②段直接盘面断言(文件不在盘+无 .tmp+指针清除+他槽字节不动)。变异②(短路文件删除)经审计**静态推演**成立:在盘断言直查 `FileAccess.file_exists`,短路即红;⑥段空槽窥视连带红(与报告变异表②的红集一致)。未实测(报告已申报全量冒烟实测),推演记录于②-3。 |
|
||||
| sv7 摘要三项按槽窥视 | 通过 | 单元 12 检查+冒烟 ⑥段双落点;窥视不激活不写内存有专断言(active_slot==0)。**变异③审计实测复现**:注入读激活态 → `save_slot_summary_test` 红(sv7 逐槽·槽 3+坏槽/高版本/缺版本三不可读态,详②-1)→ 还原 → 12 检查全绿。 |
|
||||
| sv8 窥视三态零副作用 | 通过 | 冒烟 ⑥段+单元 ③段字节+mtime 双比对+零 `.corrupt.bak` 改名+.tmp 按空槽。变异未实测;静态推演成立:窥视改走正式 `load_from_disk` → `_corrupt_fallback` 改名主文件消失 → 「零改名」断言红。判据面(字节+mtime)实测在案于双落点。 |
|
||||
| sv9 迁移链各槽成立 | 通过 | 冒烟 ⑤段三槽各喂 v5 旧档逐槽读回+写盘 version=7;既有迁移段(v1/v2/v5)全数复跑绿(审计自跑基线在案)。变异「迁移只跑激活槽」机理静态成立:他槽激活读回值必不成立。 |
|
||||
| sv10 切槽同实例整体替换 | 通过 | 单元 ③段宿主链:`MetaProgressionScript.new(null, t)` 真实宿主链、`meta.save == t` 引用同一、读数随槽(533→644)、写盘 650 落槽 2 并盘面核验、高版本槽激活失败恢复切换前三态。变异⑤覆盖「写盘落错槽」半面;「新建实例」半面为 API 形状所禁(方法内无从换实例),推理可证。meta_progression.gd 零改动(diff 核实)。 |
|
||||
| sv11 测试隔离面保留 | 通过(附注) | 非新断言行——卡片申报即「既有段全数复跑」,无代码尾缀可 grep 属申报内形态,非缺漏。凭据:审计自跑基线冒烟 1201/0(含全部既有段)+单元 38 套件绿+回执探针 --click/--full 绿;T0 隔离面清点在实现报告§三(18+15 条、attach_path 8 处、tag 族、boot/lifecycle 四段、presenter lambda、真实档红线逐点判定)。attach_path「注入即激活+重读」语义在代码核实保持(注入槽名记账激活号、注入任意路径写盘目标照旧)。 |
|
||||
| sv12 旧档处置 Q1 甲 | 通过(附注) | ⑦段夹具四断言钉死语义:逐域相等(1234)、源改名留痕、幂等(预置 777 零覆盖+源保留)、他槽字节不动;幂等变异静态成立(去 `dst` 存在判据 → 二次迁移覆盖 777 → 断言红)。V2-s4 挂真实 boot 链。附注:V2-s4 不变式(旧档在则槽 1 必在)在本机已迁移态下为空真——生产接线面的机检强度依赖盘面状态,但语义面已由夹具钉死,接线面拆毁在有旧档的盘面上仍会红,判可接受。⑦段直调 `_migrate_legacy_save` 为被测私有件本身,有 V2-s4 生产链对照面在,不判绕过。 |
|
||||
| sv13 不升 schema 版本 | 通过 | **diff 核实零改动**:`SAVE_FORMAT_VERSION := 7` 行基线/HEAD md5 一致(`101adcd0ebe1a18f2004b454a8c85bb8`);`_normalize` 函数体逐字节一致(diff 空输出);迁移链函数零触碰(新窥视路径只读调用二者)。既有版本/高版本拒读断言复跑绿(基线在案+冒烟 ④段高版本槽断言)。 |
|
||||
| sv14 反哺点清单 | 通过 | `reports/iter33-反哺点-2026-10-21.md` 在盘,六条全覆盖 §5:存档序列化.md :61/:20/:16/:165 四落点+新增迁移条款建议+待办清单+roadmap,各条有「现行陈述/应改成/依据」。件核不产码,合规。 |
|
||||
|
||||
### ② 撤销证明抽查记录(审计自跑实测,命令与输出摘要)
|
||||
|
||||
**②-1 变异③复现(报告变异表③,实测)**
|
||||
- 注入:`game/core/save_manager.gd` `peek_slot_summary` 函数体首行插 `return {"readable": true, "keystone": keystone_balance(), "cleared": adventure_cleared(), "total": adventure_total()}`。
|
||||
- `--headless --path . --script res://tests/unit/core/save_slot_summary_test.gd` → **FAIL**(窗内 4 条:`sv7 窥视三项逐槽正确·槽 3`+`sv7 坏槽窥视=显式损坏标记`+`sv7 高版本槽窥视=不可读标记`+`sv7 缺版本字段槽窥视=不可读标记`;更早 FAIL 行被输出窗口截断)——跨槽摘要与不可读态两面均被抓,拦截力实测成立。
|
||||
- `git checkout -- game/core/save_manager.gd` → `git status --porcelain` 空 → 复跑 **all green (12 checks)**。与报告变异表③一致。
|
||||
|
||||
**②-2 自选变异:sv3 撤销证明检验(审计设计,实测——发现缺漏)**
|
||||
- 注入:`write_to_disk` 无激活闸 `if _path == "":` 改 `if false and _path == "":`(即 sv3 行申报的撤销操作「去掉判定放行旧入口」)。
|
||||
- 跑 `save_boot_no_activate_test.gd` → **仍 all green (8 checks)——申报的红未出现**。
|
||||
- 原因查实:拒写断言锚在返回值 `false`,而空路径下游 `FileAccess.open(".tmp", WRITE)` 对 `"" + ".tmp"` 相对路径**打开成功并真实写盘**(实测运行在 worktree `game/` 落杂散文件 `.tmp`,657 字节,内容为序列化默认档 JSON),随后改名到空目标失败才返回 false——「闸拒绝」与「空路径写失败」在全部 sv3 断言(返回值+三槽存在性/字节/mtime)上不可区分;杂散 .tmp 落在项目根不在三槽扫描面内,零断言可抓。
|
||||
- 还原:`git checkout --` → 复跑 **all green (8 checks)**;杂散 `game/.tmp` 已删除(审计产物清理,git-ignored 件,删后 `git status` 干净)。
|
||||
- 判定:sv3 断言批对「拆闸」无判别力,撤销证明不成立。
|
||||
|
||||
**②-3 变异②(删档漏删)静态推演(审计设计,未实测——报告已申报全量冒烟实测)**
|
||||
- 注入设定:`delete_slot` 文件删除分支短路(`if false and FileAccess.file_exists(p) and not _remove_file(p)`),返回 true、文件留盘。
|
||||
- 推演:冒烟 ②段 `check(not FileAccess.file_exists(slot_tpl % 3) ...)` 直查文件系统 → 段内文件仍在 → 判红;`sv6 删非激活槽:文件不在盘` 同理红;⑥段 `delete_slot(3)` 后空槽窥视读到残file值 600 → `sv7 空槽窥视=零值合法态` 连带红。红集与报告变异表②一致,拦截面成立。
|
||||
|
||||
### ③ 测试削弱检查表(diff 全部删改逐处 vs 卡片 §7.2 申报)
|
||||
|
||||
| diff 改动处 | 定性 | vs §7.2 申报 |
|
||||
|---|---|---|
|
||||
| `smoke_all.gd` 删 5 行:V2d-1「boot 态==断点在档态」关系判据整块 | 既有断言改写(唯一一处) | **申报内**(§7.2 唯一允许面=boot 链 V2d-1)。判据**收紧非放宽**:原=关系判据 `visible == has_breakpoint`;新=钉死两事实 `not has_breakpoint() and not visible`。断言文本带「卡① sv2 改写」标识与「卡② mn8 再承接」注记,禁判据空转的条件满足。 |
|
||||
| `save_manager.gd` 删 8 行:6 行注释+2 处生产代码(`_init` 默认参 `"user://save.json"`→`""`、`_ready` 删 `load_from_disk()`) | 生产改动本体 | 非断言删改;两处均=卡片 §7.1 sv2 行申报的改动本体(「_init 默认参取消」+启动态钉死),非测试削弱面。 |
|
||||
| `smoke_all.gd` 其余 +176 行 | 纯新增(`_smoke_save_slots` 新段+V2-s1..s4) | 不属削弱面;既有段零触碰(game/ 删除行逐行清点:合计 13 行=上两行所列,无其他)。 |
|
||||
| `run_all.gd` +3 行 | 纯新增三套件注册 | 既有注册零删改、顺序与 expect 域未动——无削弱。 |
|
||||
|
||||
**小结**:除申报内 V2d-1 改写外,diff 中不存在任何未申报的既有断言删改、阈值放宽、扫描面缩小或入口替换。
|
||||
|
||||
### ④ 回执核验(`game/tests/.gates/receipt.json`)
|
||||
|
||||
- `commit` = `074cfe27a4b4cc6c67d359c033729243e86ce4eb` == 分支尖 HEAD —— **一致**;
|
||||
- `all_green` = **true**;`domain` = **"code"**(本批只碰 game/ 代码与断言面,选档正确);`quick_mode` = false(非快闸)。
|
||||
- 闸明细:01 冒烟全量/02 单元套件/03 探针 --click/04 探针 --full/05 渲染闸/09 静态扫描/10 熵增闸均 green;`11 回放确定性对拍` = NEED-APPROVAL 未跑(`not_run` 在案;与卡片「MC 零跑、纯承载改造」口径相容,此处只记录不另裁);`inherited_red` 注记 09 静态扫描「基线红→现绿(改善)」。
|
||||
- 审计对回执的独立支撑:冒烟 1201/0 与单元 38 套件全绿均为审计自跑复现(见文首基线)。
|
||||
|
||||
## 结论(首轮审计,盘面=074cfe27)——未通过(两缺漏已回炉,终审见文末复审小节)
|
||||
|
||||
首轮缺漏清单(保留存档,回炉事实见复审小节):
|
||||
|
||||
1. **sv3(必回炉,缺漏)**:
|
||||
- **撤销证明不成立(实测)**:拆除 `write_to_disk` 无激活闸后,单测 2 条断言+冒烟 V2-s3 全部仍绿——拒写断言锚在返回值 false,与空路径下游写失败不可区分;拆闸运行实测在项目根落杂散 `.tmp`(写盘真实发生),而「盘面零触碰」断言只扫三槽路径,抓不到该副作用通道。报告 sv3 行「撤销=去掉判定 → 拒写断言红(代码评审可证)」经实验推翻,变异记录表亦无此条实测。
|
||||
- **申报真实入口零对照面**:卡片与报告均申报真实入口=`MetaProgression.settle_adventure()`(`meta_progression.gd:275`,写盘 :282)链触达写盘被拒,但两个测试落点均裸调 `write_to_disk`(单元类级+真实 autoload 直调),无任何 MetaProgression 链在无激活态下触达写盘的断言。
|
||||
- 回炉方向(供实现段参考,非裁断):断言加掃描空路径写失败的实际副作用面(如杂散 .tmp 不在盘),并补一条 MetaProgression 链(或等价生产链)无激活触达写盘被拒的断言;补做拆闸变异实测留红。
|
||||
2. **sv4(须回炉,缺漏·轻)**:申报变异「新档写成读旧档」未执行,且在现有冒烟段序下(②段先删槽 3、③段才新档)无判别力——读旧档变体读到空档=默认态,全零断言仍绿;报告以推理代实测且未按 test-conventions §6 降格标注「已实现,拦截能力未证」。回炉方向:新档断言前预置带异值的残档夹具(或调整段序),补做该变异实测留红;或按 §6 如实降格标注。
|
||||
|
||||
其余 sv1/sv2/sv5–sv14 共 12 行逐行**通过**(其中 sv8/sv9/sv12 的变异为审计静态推演补证、sv11/sv12 附注见逐行表);测试削弱检查无未申报删改;回执三项核验全过。首轮审计未合并任何提交、未改 `game/` 下任何文件(两处变异注入均已 `git checkout` 精确还原,审计产物杂散 `.tmp` 已删,`git status` 干净)。
|
||||
|
||||
## 复审(2026-10-21,回炉提交 4a8558a0)
|
||||
|
||||
**回炉 diff 核验**(`git diff 074cfe27..4a8558a0`,仅两测试文件+实现报告对账,生产代码 `game/core/` 零触碰):
|
||||
- `save_boot_no_activate_test.gd` 8→12 检查,**纯新增**(删除行逐行清点=仅 3 行文件头注释,零既有断言删改):②段加「拒写退化写目标零触碰」锚——空 `_path` 派生的裸 `.tmp`/`.tmp.tmp` 夹具清场后断言零新增(正是首轮拆闸实验实测的杂散落点通道);新增 ③段 `_test_settle_chain_write_rejected`:真表 ConfigDB+`MetaProgression.settle_adventure` 生产链全段驱动(`mark_first_adventure_done`→`apply_adventure_summary`→`refresh_treasure_unlocks`→`write_to_disk`),断言落账内存(adventure_total=1)而写盘无目标+链触达后退化写目标零新增——首轮「生产链零对照面」缺漏的对照面成立,卡片 sv3 申报真实入口自此有机检面。
|
||||
- `smoke_all.gd` ③段**段内改写**:`create_slot` 前预置非白板 v7 旧内容(keystone 999/adventure_total 5/adventure_cleared 2);白板断言加 `adventure_total()==0` 合取项;旧「文件在位」检查升格为「盘面文件内容核验非 999」(解析落盘文件取 `keystone_balance==0`——文件缺失或不可解析时哨兵 -1 必红,存在性被其子集化)。两处被换断言均系本批新增断言(非卡片 §7.2 辖区的批前既有断言),且为升格收紧非放宽;段内检查数 3→3,冒烟总数保持 1201。
|
||||
- 实现报告 sv2/sv3/sv4 行与变异表补⑥⑦两行对账更新,sv3 行撤销主张改写为实测执行——与审计实测结果一致。
|
||||
|
||||
**复审自跑实录**(命令同首轮;每次变异后 `git checkout -- game/core/save_manager.gd` 精确还原并确认 `git status --porcelain -- game/` 为空):
|
||||
- 基线:`save_boot_no_activate_test.gd` → **all green (12 checks)**;单元全量 `run_all.gd` → **38 套件全绿**;全量冒烟 → **1201 项 / 0 失败三闸过**(回炉后基线独立复现)。
|
||||
- **变异⑦复现**(=首轮审计的拆闸实验原样重放):`write_to_disk` 闸改 `if false and _path == ""` 注入 → boot 套件**恰两锚红**——「sv3 拒写退化写目标零触碰(裸 .tmp 零新增——拒绝口可判别锚)」+「sv3 生产链盘面:结算触达后退化写目标零新增(链上真实入口的盘面核验)」,且杂散 `.tmp`(845 字节,链上结算落账数据)真实落盘被两锚抓获 → 还原清理 → 复跑 **all green (12 checks)**。首轮「拆闸不红」的缺漏自此闭合。
|
||||
- **变异⑥复现**:`create_slot` 内 `_data = _default_data()` 改 `load_from_disk()`(读旧档)注入 → 全量冒烟**恰 sv4 两行红**——「sv4 新档=全零可玩合法白板态(旧内容 999/5 零带入)」+「sv4 新档落盘=白板内容(盘面核验非 999 旧值)」,1201 项 2 失败 → 还原 → 复跑 **1201/0 全绿三闸过**。sv4 盘面核验断言「真能抓读旧档」经**实测**证实(非静态推演),与报告变异表⑥逐行一致。
|
||||
- 回执核验(复审轮,盘面刷新件):`receipt.json` `commit`==`4a8558a0`==HEAD、`all_green`=true、`domain`="code"、`quick_mode`=false;`not_run` 同首轮(11 回放确定性对拍 NEED-APPROVAL,记录不另裁)。
|
||||
|
||||
**复审削弱检查**:回炉 diff 删除行逐行清点=boot 套件 3 行文件头注释+smoke ③段 1 行注释与 2 行本批新增断言;零批前既有断言删改、零阈值放宽、零扫描面缩小、零入口替换——**未引入新的未申报削弱**。
|
||||
|
||||
**复审判定**:sv3、sv4 两缺漏回炉后断言均经实测具备判别力(变异⑦/⑥注入见红、还原复绿),sv3 申报真实入口已有生产链对照面(链级断言实测在役),处置未引入新削弱——两行改为**通过**。
|
||||
|
||||
## 卡① 结论(终审)
|
||||
|
||||
**通过**——sv1–sv14 全部 14 行通过(sv3/sv4 回炉后复审通过,凭据见复审小节;首轮未过记录保留于上,回炉事实=提交 `4a8558a0`)。独立验收审计合并前置达成。复审全程零 commit、`game/` 零残留(两处变异注入均已精确还原,杂散件已清)。
|
||||
|
||||
## 卡③ 选档界面新建批(3 存档位 · 新档/进档/删档)
|
||||
|
||||
> 审计人:同一独立协议(未参与实现、只采信盘面证据与自跑实测、不采信报告「已全绿」)。
|
||||
> 被审计对象:worktree `D:\code\g-plan2-iter33card3-saveselect`,分支 `iter33-card3-saveselect`,实现提交 `a6614a3b`+`52dd1ad2`+`54bde367`,基线 merge-base=`ebf40947`(卡① 合并态)。
|
||||
> 审计材料:卡③ 需求卡片 §7.1/§7.2/§2 T0 对齐附注、实现报告卡③ 节(对照表+变异表十条+confirm 断言面清点)、`git diff ebf40947..HEAD`、三探针新段、闸回执。
|
||||
> 审计自跑基线(HEAD=54bde367):冒烟 **1201/0 三闸过**;单元 **38 套件全绿**;探针三件 exit=0(struct **PASS 全屏结构断言零红**/click **问题=0**/flow **PASS**);ui_contrast_probe **PASS(38 对测点)**;卡① `save_slot_summary_test` **12 检查全绿**(has_file 向后兼容面)。
|
||||
|
||||
### ① 逐行核对表(sl1–sl14,对实现报告实际对照表逐行复核)
|
||||
|
||||
| # | 判定 | 依据(审计自查实录) |
|
||||
|---|---|---|
|
||||
| sl1 三槽呈现 | 通过 | `ui_struct_probe` 选档段+`_save_select_contract` 在盘:槽卡行数==3+`_count_scroll` 零滚动容器断言;〔sl1〕grep 命中。真实入口=`main._open_save_select()` 函数直调——**中间态登记核实**:实现报告「已知中间态」#1+对照表 sl1/sl5–sl7 真实入口列均在案;全仓 `_open_save_select` 调用方=探针 6 处+定义 1 处,生产零调用、无死钮预埋(「进入存档」钮属卡② mn3,本批未提前接线)——合法中间态成立。变异m7(ScrollContainer)注入点与红项(滚动计数+zero_size 结构族)桌核自洽。 |
|
||||
| sl2 摘要三项逐槽读数 | 通过 | struct 段夹具按槽直写(槽1=钥石 555/通关 2 局/冒险 7 局)逐字断言+钥石徽全树枚举;真实入口=开层后渲染面 label 实取值。变异m2(`_save_select_data` 改读激活位)桌核自洽:槽1 两断言(摘要行+钥石徽)必红。 |
|
||||
| sl3 摘要禁项 | 通过 | 禁词表=断点/种子/继续/停点/「 关」(label 全集 `contains` 扫描——「通关」无空格不误伤,词形注记在案);变异m9 双红记录(sl2 精确匹配+sl3 禁词)与词形表强化历史自洽(首轮缺「 关」被变异暴露后补齐=收紧)。 |
|
||||
| sl4 空/有档操作集二分 | 通过 | **渲染面实测**:`_collect_button_texts` 逐行枚举 visible Button 文本(行1=进档+删档零新档;行2/3=仅新档零进档删档含置灰形态)+簿记 occ 判定保留;变异m3 **审计实测复现**(详②-1)。 |
|
||||
| sl5 空槽新档链 | 通过 | click 段真实按钮信号路径(`new_btn.pressed.emit()`):active==1+槽1 白板落盘(盘面解析 keystone==0)+逐帧采样;中间态登记同 sl1。撤销机理成立(去 `create_slot` 调用→激活/落盘断言红)。 |
|
||||
| sl6 有档槽进档链 | 通过 | click 段槽2 进档→active==2+落点营地层可见+选档隐藏。变异(进档读成当前激活槽)桌核自洽:active 断言红。 |
|
||||
| sl7 删档二次确认链 | 通过 | 双路径全链:一击只开窗(`is_open`+文件在盘)→取消只关窗文件仍在(含消费方状态量清零)→再开窗确认删+槽回空+就地刷新(occupied_flags 翻转断言);变异m1 **审计实测复现**(详②-2)。 |
|
||||
| sl8 消费方编排机制 | 通过 | 分派单口三断言(取消后/确认后 `_confirm_consumer` 清零+删档确认不误触发开局 `run_scope.is_adventure`);现役断点确认段(`ui_click_probe.gd:604` 起,行号较申报漂移)零改写复跑绿=new_adventure 侧活体回归;变异m4(confirmed 再连 `_start_adventure`)桌核自洽。生产接线核验:`_start_adventure_from_menu` open 前设消费方、`_on_confirm_accepted` match 路由、旧双常驻静态接线撤除(diff 删除行=申报的生产改动本体)。 |
|
||||
| sl9 重启不预选(Q1 甲) | 通过 | struct 段开层前 `active_slot()==0` 断言+「已选」标记文本零命中+视图零选中态字段(文件核);boot 级由卡① V2-s1 承接。变异m8(预选标记)桌核自洽。 |
|
||||
| sl10 返回路径与 ESC 语境 | 通过 | `screen_flow_probe` 新步:返回钮真实信号→选档隐藏+开始层恢复断言+屏级互斥采样;合成 ESC 键(viewport.push_input)层不关断言。变异m5(只隐不关)与 m-ESC(加 ESC 处理)桌核自洽(申报已执行)。 |
|
||||
| sl11 层序与模态纪律 | 通过(无新码尾缀——申报形态=既有段复跑,同卡① sv11 先例) | 凭据:`LAYER_CONTRACT` 加行+`_layer_node` 查表+构造三处在 diff 核实;`ui_struct_probe` 全屏 PASS 含 `_modal_registry_contract`(登记序==合同序,新层在册);冒烟 1201/0(V1d 源码合同段,审计自跑);ui_tune_probe 树序断言(:52 原样在位)经回执 04 --full 绿。变异(视图散落 move_child→V1d 判红)为既有闸机理,无新断言需变异。 |
|
||||
| sl12 动线序不回闪 | 通过 | 逐帧三断言(落点帧选档隐藏/营地层可见/开始层保持隐藏)+**栈遮挡记账判别**(select ∈ `camp._occluded`);变异m6 红项与报告一致。强化历史核实:首轮帧采样对 m6 零红(close-then-open 形态在帧采样下不可判别)→52dd1ad2 **纯新增**记账断言(帧采样保留零删)——收紧非放宽。 |
|
||||
| sl13 零新素材零新色值(非行为改动) | 通过(件核+复跑) | diff 核实:新视图文件零 `Color8(`/`Color(`/`preload`/素材路径,main.gd 新增行零色值素材(grep 计数=0);ui_contrast_probe **PASS(38 对测点+裸色白名单/preload 红线静态段绿)**(审计自跑)。无新码尾缀=件核行申报形态(同卡① sv13 先例)。 |
|
||||
| sl14 反哺点清单(非行为改动) | 通过 | `reports/iter33-反哺点-2026-10-21.md` 卡③ 节 4 条(#7 生涯.md 结构树补层/#8 08 增行请求-明示须用户裁/#9 待办清单+roadmap 推进/#10 存档序列化消费面纪律补 has_file 口径)覆盖卡片 §5 全部落点。 |
|
||||
|
||||
### ② 撤销/变异证明抽查记录(审计自跑实测)
|
||||
|
||||
**②-1 变异m3 复现(空槽渲染删档钮——按簿记缝盲区形态注入:渲染但不注册簿记字典)**
|
||||
- 注入:`save_select_overlay.gd` `_build_slot_row` 空槽分支尾加 `row.add_child(UiKit.danger_button("删档", "MUTATION m3"))`(不写 `_delete_btns`)。
|
||||
- `ui_struct_probe` → **exit=1,恰两行红**:「行2 操作集失守(空/坏槽应=仅新档、零进档删档含置灰形态)〔sl4〕」+「行3 ……〔sl4〕」——首轮走簿记缝的盲区(字典未含该钮)被渲染面扫描闭合,实测证实强化有效。
|
||||
- `git checkout --` 还原 → 复跑 **PASS 全屏结构断言零红** → `git status` 干净。
|
||||
- 强化本身核查(52dd1ad2 diff 逐行):sl4 由簿记字典缝改为真实钮文本枚举(扫描面扩大、occ 簿记保留、零检查删除);sl3 词形表扩充;sl12 记账断言纯新增——**未引入未申报削弱**。
|
||||
|
||||
**②-2 变异m1 复现(删档直连删除,跳过确认窗)**
|
||||
- 注入:`main.gd` `_on_save_select_delete` 改直连 `save_manager.delete_slot(slot)`+就地刷新,原确认链 `if false` 短路。
|
||||
- `ui_click_probe` → **exit=1,sl7 面如期红**:「sl7 一击未只开确认窗(直删形态)」。同轮另现一条连带红「断点段:战败结算后断点未清」——该段在变异前基线与还原后复跑均 0 红,判为变异扰动的对局段偶发(预算帧漂移 9781→9749→6619),非基线不稳,记录备查。
|
||||
- 还原 → 复跑 **问题=0** → `git status` 干净。
|
||||
|
||||
**②-3 变异表十条逐条桌核**:m1/m3 实测如上;m2(读激活位→sl2 两断言红)、m4(双常驻接线→`run_scope.is_adventure` 红)、m5(只隐不关→恢复断言红)、m6(先关后开→记账判别红,帧采样不可判别的机理说明与 ModalStack 语义核实一致)、m7(ScrollContainer→滚动计数+zero_size 结构族双红)、m8(预选标记→文本命中红)、m9(拼关数→sl2+sl3 双红)、m-ESC(ESC 关层红)——注入点、断言面、红项记录逐条与盘面代码对得上,自洽。
|
||||
|
||||
### ③ 测试削弱检查表(diff 全部删改逐处 vs 卡片 §7.2 申报)
|
||||
|
||||
| diff 改动处 | 定性 | 判定 |
|
||||
|---|---|---|
|
||||
| `smoke_all.gd` | **零改动**(del=0/add=0) | 与对照表「卡③断言全在探针层,冒烟零新增」一致 ✓ |
|
||||
| `ui_struct_probe.gd`/`ui_click_probe.gd`/`screen_flow_probe.gd` | **纯新增**(del=0;+103/+96/+41) | 既有段零触碰 ✓;批内强化提交 52dd1ad2 为批内新断言的演进(m3/m9/m6 盲区修正),全部收紧零删(详②-1) |
|
||||
| §7.2 申报四位点(按内容定位,行号已漂移) | 逐一核实 | `ui_struct_probe` confirm 结构采样(:103-106)、`smoke_all` `_topmost_visible_layer` 候选表(:226 区)、`ui_click_probe` 断点确认交互段(:604-623)、`ui_tune_probe` 树序断言(:52)——**全部原样在位零改写**(申报允许改写而实际未改,优于申报) |
|
||||
| `main.gd` 删 9 行 | 生产改动本体 | 旧双常驻静态接线(`_on_confirm_new_adventure`/`_on_confirm_cancelled` 及两条 connect)撤除=卡片契约 3/§9 第 6 条+sl8 申报的改动本体,非断言削弱;新分派行为与旧 handler 逐句等价(new_adventure 分支对照核实) |
|
||||
| `save_manager.gd` 删 4 行 | 接口补全 | 注释 2 行+peek 返回字典字面量 2 处加 `has_file` 键——向后兼容扩展,卡① 断言零触碰(详⑤) |
|
||||
|
||||
**小结**:零未申报削弱;零批前既有断言删改;零阈值放宽;零扫描面缩小;零入口替换。
|
||||
|
||||
### ④ 回执核验(`game/tests/.gates/receipt.json`,盘面工作件)
|
||||
|
||||
- `commit` = `54bde3678ab8707872c2a117d75e7a9e8abcb91f` == HEAD ✓;`domain` = "code" ✓;`quick_mode` = false;`not_run` = 11 回放确定性对拍(NEED-APPROVAL,同卡① 口径)。
|
||||
- **`all_green` = false ✗**:`09 静态扫描` exit=1,且 `changed_vs_baseline` 记录红项清单较基线变化(基线 4354b2aa72a7 → 现 2b71884ec242;卡① 合并态该闸为绿/改善,存量基线记录的旧红清单已被卡① 清零)。其余 01 冒烟/02 单元/03 探针 --click/04 探针 --full/05 渲染闸/10 熵增闸 green(其中 01/02/03+struct/flow/contrast 探针经审计自跑复现)。
|
||||
- 审计现场复现红项:`python tools/audit_type_hints.py` → **存量 2 处 R1(裸 Dictionary/Array 注解)**——`main.gd:1176`(`var p: Dictionary`,`_save_select_data` 内)+`save_select_overlay.gd:58`(`var slots: Array`);两处均为卡③新增代码行(diff `+` 行核实),即本批新引入的类型闸红。
|
||||
- **与实现报告矛盾**:卡③ 状态行与读数对照声称「批末重闸 --code 全绿(回执见合并提交信息)」——盘面回执 `all_green=false` 且红闸为本批新引入,报告表述失实。按硬性红线「`run_all_gates.sh` 所选域全绿才合回 master」,本批当前态**不可合并**。
|
||||
|
||||
### ⑤ has_file 接口补全专项
|
||||
|
||||
- diff 核实:`save_manager.gd` 仅 4 删 6 增=窥视读器注释改写+peek 返回字典(越界分支与 `out` 初始化)加 `has_file` 键+主文件在盘置位一行——**纯返回键扩展,向后兼容**。
|
||||
- 卡① 侧断言零触碰:`save_slot_summary_test.gd` 零 diff;审计直跑 **all green (12 checks)** ✓。
|
||||
- 三处留痕一致:卡③ §2 T0 对齐附注(has_file=空/有档操作集二分判定来处、非摘要第四项、零 UI 语义)=实现报告已知中间态 #4=追认单卡③ #7(列为待追认单项、veto 影响写明)——三处口径逐字一致 ✓。
|
||||
- 消费面核验:`_save_select_data` `occupied = has_file ∧ readable`(Q2 甲坏槽按空呈现)✓;视图零自判(槽态唯一来处=喂入数据)✓。
|
||||
|
||||
### 卡③ 结论(首轮)——未通过(已回炉,终审见文末卡③复审小节)
|
||||
|
||||
**首轮缺漏清单(1 项,阻塞合并;保留存档)**:
|
||||
1. **批末重闸未全绿+报告失实**:回执 `09 静态扫描` 红(2 处 R1 类型闸存量,均在卡③新增代码行:`main.gd:1176` 裸 `Dictionary`、`save_select_overlay.gd:58` 裸 `Array`;红项清单较基线变化),`all_green=false`;实现报告「批末重闸 --code 全绿」与盘面矛盾。回炉方向(供实现段参考,非裁断):两处容器注解参数化(如 `Dictionary[String, Variant]`/`Array[Dictionary]`)或按闸机规程报用户裁;重跑批末重闸取全绿回执(回执 commit 须对新 HEAD);更正实现报告「全绿」表述按盘面实况。回炉后按本协议复审。
|
||||
|
||||
其余全部通过:sl1–sl14 逐行核对 14 行通过(含中间态登记与无死钮核实、has_file 专项、三处留痕一致);变异 m1/m3 实测复现红→还原→绿,十条变异表自洽;52dd1ad2 强化纯收紧未引入削弱;§7.2 四位点零改写;smoke_all 零改动。审计全程零 commit、`game/` 零残留(两处变异注入均已 `git checkout` 精确还原)。
|
||||
|
||||
### 卡③ 复审(2026-10-22,回炉提交 b673ced)
|
||||
|
||||
**回炉 diff 核验**(`git show b673ced`,仅两处代码修+实现报告更正,共 5 增 4 删):
|
||||
- `main.gd:1176`:`var p: Dictionary = save_manager.peek_slot_summary(i)` → `var p := save_manager.peek_slot_summary(i)`(推断形态,行内注记写明取舍依据:裸注解触 R1、参数化 `Dictionary[String, Variant]` 赋值被运行期严格类型拒——实测 SCRIPT ERROR 实证过)。变量仍持同一窥视返回 Dictionary,下游 `.get()` 消费零变化。
|
||||
- `save_select_overlay.gd:58`:`var slots: Array = ...` → `var slots: Array[Variant] = []`+`slots.assign(data.get("slots", []))`(typed 容器纪律)。`assign()` 逐元素拷贝后迭代内容不变,`for sd: Dictionary in slots` 原样——零行为改动。
|
||||
- 两处均为审计申报缺漏的定点修除,容器注解形态变化(声明面),零逻辑改动——无未申报削弱可言(行为不变佐证:sl2 摘要读数断言、sl5/sl7 数据链断言复审全绿,见下)。
|
||||
- 实现报告更正核实:卡③ 状态行改为两轮记录(首轮未过原因含「收口时点只核回执 commit 未核 verdict」的流程订正);读数表「重闸 --code」行改为「首轮 all_green=false(R1×2 新增)→ 回炉后全绿」——首轮审计指出的「报告失实」已消除。
|
||||
|
||||
**复审自跑实录**(HEAD=b673ced):
|
||||
- `python tools/audit_type_hints.py` → **PASS,产品码类型闸归零(R1/R2/R3)**,exit=0(首轮红项 `main.gd:1176`/`save_select_overlay.gd:58` 均已消)。
|
||||
- `ui_struct_probe` → **PASS 全屏结构断言零红**——含 sl2 摘要读数断言(555/2 局/7 局逐字)绿=`_save_select_data` 改推断形态后喂入数据面零行为变化的实测佐证。
|
||||
- `ui_click_probe` → **exit=0,问题=0**——sl5/sl7 数据链与 `open_save_select` 的 `Array[Variant]`+`assign()` 消费面(每次开层走该口)零行为变化的实测佐证。
|
||||
- 回执核验(复审轮):`commit`==`b673cedd…`==HEAD ✓、`all_green`=**true** ✓、`domain`="code" ✓、`quick_mode`=false;`09 静态扫描` exit=0 green(fingerprint green)——首轮红闸闭合;`not_run` 同前(11 回放确定性对拍 NEED-APPROVAL);回执时间戳(06:11:28)在回炉提交(06:04:59)之后=修后重闸实测。
|
||||
|
||||
**复审判定**:缺漏 1(批末重闸未全绿+报告失实)回炉后闭合——类型闸归零、回执全绿且对上 HEAD、报告更正为两轮实况。零未申报削弱。卡③ sl1–sl14 全部 14 行通过。
|
||||
|
||||
### 卡③ 结论(终审)
|
||||
|
||||
**通过**——卡③ 选档界面新建批 14 行(sl1–sl14)全部通过(首轮未过记录保留于上,回炉事实=提交 `b673ced`)。独立验收审计合并前置达成。复审全程零 commit、`game/` 零残留、`git status` 仅本报告工作件。
|
||||
|
||||
## 卡② 主菜单三入口化批(6 钮 → 3 钮)
|
||||
|
||||
> 审计人:未参与卡② 实现的独立会话,只采信盘面证据与自跑实测,不采信任何报告的「已全绿」。
|
||||
> 被审计对象:worktree `D:\code\g-plan2-iter33card2-menu`,分支 `iter33-card2-menu`,卡② 提交 `3661689a`+`93d0e679`+`5a39b116`+`821a2eae`,基线 `5c2a7bcf`(卡③ 合并态);区间内非本批改动(迭代34 卡④ 合并 `16a7ec80`、锻造工坊死链修 `4bc6b366`/`a10d15c7`)已按提交拓扑剔除,卡② 本体 diff 取 `a10d15c7..HEAD`(20 件:presentation 5+smoke 12+golden+pacing 单测+reports 3)。
|
||||
> 审计材料:需求卡片 §7.1 对照表 mn1-mn14+§7.2 七条申报+§2 F10 全量位点表、实现报告卡② 节(实际对照表+变异表 A/B+已知中间态)、卡② 本体 diff、闸回执。
|
||||
> 审计自跑:变异 B 注入→`screen_flow_probe` 红→还原→复绿全程实测(见②);另按改动域复跑最窄面与清点口径 grep(见各节)。
|
||||
|
||||
### ① 逐行核对表(mn1–mn14,对实现报告实际对照表逐行复核)
|
||||
|
||||
| # | 判定 | 依据(审计自查实录) |
|
||||
|---|---|---|
|
||||
| mn1 三钮在位 | 通过 | 断言在盘可 grep:冒烟 V2 三钮非空(`smoke_all.gd:162-163`,〔卡② mn1〕尾缀)+V2d 渲染面可见按钮计数==3(`:292-293`,5a39b116 强化件)。真实入口未绕过:`menu_screen.tscn` 真实实例化经 `UiAssembler.build_start_overlay` 构建后读句柄+渲染面递归枚举。变异 A 已执行(报告变异表 A+提交 5a39b116 提交信息在案)。 |
|
||||
| mn2 四旧钮彻底撤出 | 通过 | V2d 四旧句柄零命中×4(`smoke_all.gd:297-299` 循环断言)+渲染面计数锚(接回钮在渲染面出现即计数红——句柄缝盲区已由变异 A 暴露并闭合)。句柄面 diff 核实:`menu_screen.gd` 撤 `lvbtn/resumebtn/campbtn/careerbtn` 四字段、增 `entersavebtn`,装配器返回字典同步换代。 |
|
||||
| mn3 进入存档可达选档 | 通过 | `screen_flow_probe` 选档步在盘:`find_button(_start_overlay, "进入存档")` → `pressed.emit()`(真实按钮信号路径)→ 屏级互斥断言;钮缺失即 `_problems.append("[savesel] mn3 进入存档钮缺失")`(`screen_flow_probe.gd:165-172`,mn3 尾缀可 grep)。**审计实测变异 B 闭合**(见②-1):接线改连 `_camp_pres.open_camp()` → 5 处红含 `[savesel] sl10 屏级互斥失守`——与报告变异表 B 逐字一致。 |
|
||||
| mn4 设置钮零行为变化 | 通过 | settingsbtn→`_open_settings` 接线 diff 核实零触碰(`main.gd:328`);V3g settings 模态段冒烟生命周期矩阵原样复跑(该分支 diff 零改动=纯复跑,申报形态即「复跑」,无削弱)。 |
|
||||
| mn5 退出接线正确 | 通过 | quitbtn→`_quit_game` 接线 diff 核实零触碰(`main.gd:329`);对照面在盘:ui_click D1 二轮段「开始菜单有退出游戏钮+设置面无」双断言(`ui_click_probe.gd:288-292`)复跑。 |
|
||||
| mn6 断点确认主菜单零残留 | 通过(例外见注) | diff 核实两处摘除:`_start_adventure_from_menu` 确认分支整段删除(直启形态)+`_on_confirm_accepted` 分派器 `"new_adventure"` 臂退役(match 机制保留——V5 口径)。ui_struct 既有 confirm 采样在盘复跑(`ui_struct_probe.gd:100-103`)。注:本行撤销证明依赖的 ui_click 断点段原断言已按 §7.2 申报移交卡④(申报内删除)——残留拦截力由 mn2 四钮零命中+mn10 直调直启绿(直启不经确认框)组合承接,属间接面非专项断言;卡④ 落地后须补大门侧专项。 |
|
||||
| mn7 `_refresh_resume_button` 删除+消费点清零 | 通过 | 净删除 diff 核实:`main.gd` 函数体+五处调用+`camp_flow_context` 载体字段/构造参+`camp_shop_presenter` 三处+`probe_ui_util` 参数+`pacing_queue_test` 一处全清。**F10 表尾清点口径全仓 grep 复核**(口径照卡片):`_refresh_resume_button` 零命中;其余命中逐条归类——`start_overlay`(未退役件,合法在役)、两函数定义(契约 5 保留)、直调位点(全部为批前既有或已登记中间态,见 mn10)、注释引述与 mn2 零命中断言字面量(`smoke_all.gd:297`)——**表外新位点:零**。 |
|
||||
| mn8 废止断言族有改写承接 | 通过 | 逐族核对 diff:V2 六钮断言→三钮改写+〔mn1〕尾缀;V2d 续玩钮族→三钮在位+四旧零命中+渲染锚承接(卡① sv2 boot 态断言保留);V3g campbtn 直呼→进档开层新路径(`smoke_all.gd:411-449`);V3i 钮断言两行摘除+`_stage_faces` 的 `resume_vis` 键退役(键处理分支同步删)——逐族均有承接断言顶上,非裸删。生命周期其余阶段断言键 diff 核实零删改。 |
|
||||
| mn9 营地/生涯入口探针段改走新路径 | 通过 | 五件营地段全改 `open_camp_via_savesel` 新路径(ui_probe/ui_struct/screen_flow/shot/ui_click),该助手驱动=选档层新档钮 `pressed.emit()` 真实信号路径(`probe_ui_util.gd:126-137`),非绕过直调;槽模板注入隔离命名空间(真实档红线保持)。生涯段改函数直调——契约 5 中间态(登记见 mn10 注)。 |
|
||||
| mn10 冒险段探针直调中间态 | 通过(附注) | 契约 5 形态核实:两函数保留仅摘接线。直调位点全仓 grep 逐条对账——**本批新转直调 4 处全部已登记**(screen_flow 冒险步 `:181`、shot 关卡段 `:135`、fx_shot `:36`、t17_defer `:29`,实现报告「已知中间态」逐位点列名);批前既有直调位点(ui_input `:35`、layout `:27`、ui_tune `:96`、smoke ×4 `:338/:465/:620/:650`、pacing_queue `:32`、ui_struct 冒险簇 `:115`、ui_probe `:59`、ui_click 冒险段 `:323`)diff 核实零触碰或仅随 mn7 摘刷钮行。注(登记粒度微瑕,不判缺漏):生涯直调 3 处(ui_struct `:57`/ui_click `:296`/shot `:105`)与 smoke `_resume_from_menu` `:497` 为函数级登记(「已知中间态」明列 `_open_career`/`_resume_from_menu` 两函数保留+mn9 行「生涯=函数直调中间态」),未逐位点列名——实质已登记、粒度粗于冒险段。 |
|
||||
| mn11 组帽撤除+左列几何不破 | 通过 | diff 核实两枚 overline 整行删除(「── 冒 险 ──」「── 营地与系统 ──」);ui_struct `_audit("start")`(`:31`)+`_start_columns_contract`(`:32`/`:675`)在盘复跑,真实菜单构建后几何审计。组帽撤除处置与 §9 第 1 条一致且追认单留痕(reports/iter33-代拍板追认单卡② 节在盘)。F12 两处注释引述(main.gd:289、career_overlay.gd:3)按卡片「实施本体内可自理」保留。 |
|
||||
| mn12 menu golden 重制 | 通过 | 提交 `93d0e679` 提交信息完整记载触发原因(主菜单钮集换代)与重制入口(`golden_baseline_refresh --menu` 重采);二进制 diff 仅 `menu_boot.png` 一件(319500→319749 字节);`tools/golden_baseline_refresh.sh` 与 `tools/render_gate.sh` diff 核实零触碰(只跑不改——契约 6);复闸绿以回执 05 渲染闸 green 为准(fx/shot 探针窗口化形态,headless 直跑属预期 harness 形态不另直跑)。 |
|
||||
| mn13 pacing_queue 套件连带改造 | 通过(例外见注) | diff 核实仅摘 `_refresh_resume_button()` 一行(mn7 连带);`_start_adventure_from_menu` 直调保留。注:卡片 mn13 改动列写「去掉 _refresh_resume_button 与菜单直调依赖」,直调依赖未去掉——但契约 5(红线)+§9.4 白名单明定卡④ 未到位批内冒险段探针维直调合法,实现报告 mn13 行已如实对账「钮依赖行摘除(宿主链驱动保持)」并登记进「已知中间态」(pacing_queue 位点在列)——按契约优先于卡片行文判通过,非隐瞒偏差。 |
|
||||
| mn14 反哺点清单 | 通过 | `reports/iter33-反哺点-2026-10-21.md` 卡② 节在盘,第 11-16 条全覆盖 §5:生涯.md/camp.md/08/体验验证清单/art-bible :433 excision(禁整行删口径在案)/待办清单+roadmap,各条有现行陈述/应改成/依据。件核不产码,合规。 |
|
||||
|
||||
### ② 撤销证明抽查记录(审计自跑实测)
|
||||
|
||||
**②-1 变异 B 复现(报告变异表 B,实测全程)**
|
||||
|
||||
- 注入:`game/presentation/main.gd:318` `_menu_screen.entersavebtn.pressed.connect(_open_save_select)` → `_menu_screen.entersavebtn.pressed.connect(func() -> void: _camp_pres.open_camp())`(进入存档钮接错层——mn3 行申报的变异本体)。
|
||||
- `timeout 120 Godot_console.exe --headless --path . res://smoke/screen_flow_probe.tscn` → **FAIL — 5 处问题**:`[savesel] sl10 开层后屏级互斥失守(选档=false)`+⑤冒险内切换两条(营地/冒险同屏)+⑦终局→菜单两条(菜单/营地同屏)——与报告变异表 B「screen_flow 5 处红(sl10 屏级互斥失守+营地/冒险同屏)」一致,**mn3 断言拦截力实测成立**。
|
||||
- `git checkout -- game/presentation/main.gd` → `git status --porcelain` 空(零残留)→ 复跑 **PASS — 六步主流程+回退路径全绿**。注入→红→还原→复绿闭环。
|
||||
- 附核:探针全程走 `isolate_save` 隔离面,真实档 `user://save.json` 零触碰(探针纪律在案)。
|
||||
|
||||
**②-2 变异 A 处置历史核对(盘面凭据,未重放)**
|
||||
|
||||
- 首轮零红证据:报告变异表 A 原文「首轮 ui_struct/冒烟均零红——句柄缝盲区暴露(V2 只查三钮在位、V2d 只查句柄)」。
|
||||
- 伴生强化实证:提交 `5a39b116` diff 全量=`smoke_all.gd` +10 行零删——`_count_visible_buttons` 递归助手+渲染面计数==3 一条 check,**纯收紧**(只增断言不改旧断言不放宽阈值),提交信息同步记载盲区成因与两变异闭合实况。
|
||||
- 强化后拦截力推演:接回钮只要可见即计数 >3 必红,与句柄面无关——句柄缝盲区在锚面上不可再穿透。m-A 处置链(零红→补锚→复红)凭据齐、强化纯收紧,判成立。
|
||||
|
||||
### ③ 测试削弱检查表(卡② 本体 diff 全部删改逐处 vs 卡片 §7.2 七条申报)
|
||||
|
||||
| diff 改动处 | 定性 | vs §7.2 申报 |
|
||||
|---|---|---|
|
||||
| `smoke_all.gd` V2d 续玩钮族(旧 :266-290 六断言+boot 态断言改写+`_refresh_resume_button` 调用三处) | 既有断言废止/改写 | **申报内**(§7.2 行 1「钮已撤判据失去对象——废止」)。承接断言在盘:三钮在位+四旧零命中+渲染锚+卡① sv2 boot 态断言保留;卡① V2d-1 改写批内已申报「卡② mn8 再承接」——两代申报链闭合。 |
|
||||
| `smoke_all.gd` V3g campbtn 直呼(旧 :322/:326/:411-415) | 驱动路径换代 | **申报内**(行 2)。新路径=选档层新档钮真实信号→进档开营地,非直调开层——入口真实性与卡③ Q3 乙落点一致;camp 段后新增选档层闭合/attach 恢复/槽文件清理三步为路径换代伴生机械(非断言削弱)。 |
|
||||
| `smoke_all.gd` V3i 阶段⑨(旧 :470-478/:565-567) | 钮断言摘除+`resume_vis` 键退役 | **申报内**(行 3)。`_resume_from_menu` 全链断言保留(run_scope 换代+is_inside_tree),只摘钮可见性断言与 `_stage_faces` 键;生命周期其余阶段 diff 核实零删改。 |
|
||||
| `ui_click_probe.gd` resume_btn0 两断言(旧 :319-324,卡片 :224-228 行号漂移) | 既有断言删除 | **申报内**(行 4 前半——F10 表明列「resumebtn 断言+断点段」双位点)。行号漂移成因=卡③ savesel 段插入使基线行号后移,位点实质对应无疑义。 |
|
||||
| `ui_click_probe.gd` 断点段②③(旧 :555-616 约 73 行,卡片 :462-518) | 既有断言段删除 | **申报内**(行 4,约 80 行口径吻合)。两头登记核实:卡② 侧=卡片 T2+§7.2+实现报告「已知中间态」明列「卡④ 大门 T5 接收两头登记禁静默删除」;卡④ 接收侧=卡④ 未重立,登记义务随其重立卡兑现(现状为申报明文的待办形态,非静默删除)。段①(战斗收口断点写盘断言)保留在盘。 |
|
||||
| `shot_probe.gd` career/camp 段(旧 :103-133) | 生涯改直调+营地改新路径 | **申报内**(行 5「归卡④」的卡② 侧处置+行 7)。**七屏链存在性自检未降档**:`:192`「七件存在且非零字节」自检段 diff 零触碰;career 截图段保留(直调驱动)。 |
|
||||
| `ui_struct_probe.gd` resume 专项(旧 :86/:163-183) | 刷钮行摘除 | **申报内**(行 6)。`_resume_from_menu` 专项链与结构断言保留,仅摘 `_refresh_resume_button()` 调用(mn7 净删除连带)。 |
|
||||
| 冒险段探针入口路径断言(fx_shot/t17/screen_flow④/shot③) | 降级为函数直调 | **申报内**(行 7)。逐位点登记核实(见①-mn10),无「为凑绿改假路径」形态——直调目标=`_start_adventure_from_menu` 本体,下游断言(关卡画面出现/停点出图/冒险屏互斥)原样保留。 |
|
||||
| `probe_ui_util.gd` `isolate_save` 签名换代+`open_camp_via_savesel` 新增+ui_click camp 段 swap=false→true | 测试基建换代 | 非断言削弱:refresh_resume 参数随 mn7 退役(参数槽位语义由 swap_save 承接,全部调用点逐一同步换代——diff 逐处核对无错位);swap 翻转为写盘路径与槽文件断言同源化(注释在案),判据面对齐非放松。 |
|
||||
| `pacing_queue_test.gd` 删 1 行+`ui_probe.gd`/`ui_struct_probe.gd` 营地/生涯段改写 | 申报内改写 | 见①-mn7/mn9/mn10 对应行,申报面内。 |
|
||||
|
||||
**其余既有断言零删改核验**:卡② 本体 diff 逐 hunk 清点——ui_probe 秘宝匣 12 行断言原样在盘(`:48-49`);smoke 生命周期其余阶段断言键零删改;三探针既有段(sl1-sl9、设置面段、D1 段、ui_struct 各 `_audit` 面)零触碰;golden 两工具零触碰。**除 §7.2 申报面外,未发现任何删断言、放宽阈值、缩小扫描面或真实入口换下层直调**。
|
||||
|
||||
### ④ 回执核验(`game/tests/.gates/receipt.json`)
|
||||
|
||||
- `commit`=`821a2eae82664ab51fe00c6b6e639f55b60a0660`=HEAD(`821a2eae`)✓
|
||||
- `all_green`=**true** ✓;`domain`=**"full"** ✓(本批同触 game/ 与文档面,全量档选档正确)
|
||||
- 闸序:01 冒烟全量/02 单元套件/03 探针 --click/04 探针 --full/05 渲染闸(fx_shot/shot 两窗口化探针的绿以本闸记录为准,headless 直跑挂起属预期 harness 形态未直跑)/06-10 各文档闸全 green;11 回放确定性对拍 SKIP(SKIP 件非红);`quick_mode`=false;回执时间戳(2026-10-22T22:49:41+08:00)晚于末提交(22:41:58)=修后重闸实测。
|
||||
- 读数对照:实现报告冒烟 1213/0(+12 与 V2/V2d/渲染锚新增量吻合);单元 40 套件(+2 系迭代34 并行批合入非本批新增——diff 核实 `level_map_*_test` 两件属 16a7ec80)。
|
||||
|
||||
### ⑤ V5 专项(断点确认零残留)
|
||||
|
||||
- 全仓 grep「开新冒险将覆盖旧断点」:`game/` **零命中**;命中仅两处非码面——`待办清单.md:648`(2026-10-18 卫生批历史登记条,记述批前缺陷实况)+`reports/需求卡片-…md` F4 行(申报本体)。弹窗文案随消费方退役已不在任何生产代码。
|
||||
- 分派器机制保留核实:`_on_confirm_accepted` match 机制在盘(卡④ 第三消费方接入面),`"delete_slot"` 臂在役(卡③ 删档确认);`"new_adventure"` 臂整段退役(diff 在案)——代码与实现报告「机制保留、消费方退役」口径一致。
|
||||
- `rng_service.new_adventure`/`adventure_runner` 等同名散点为 RNG 会话入口,与确认消费方无关(grep 逐条判别非残留)。
|
||||
- 主菜单写档路径清零佐证:mn2 四钮零命中(无入口)+`_start_adventure_from_menu` 直启形态(无确认链)+`open_camp_via_savesel` 写盘只落隔离槽文件——主菜单无任何写档路径(契约 4)。
|
||||
|
||||
### 卡② 结论
|
||||
|
||||
**通过**——卡② 主菜单三入口化批 14 行(mn1–mn14)全部通过(mn6/mn10/mn13 三行附例外注记,均有申报或契约依据,非缺漏)。变异 B 审计实测闭合(注入→5 红→还原→复绿),变异 A 处置链凭据齐且强化纯收紧;§7.2 七条申报外的既有断言零删改;回执 commit/all_green/domain 三项全对上。独立验收审计合并前置达成。
|
||||
|
||||
**例外注记汇总(不阻塞合并,随卡④ 落地消解)**:
|
||||
|
||||
1. mn6:断点确认残留的拦截力现由 mn2+mn10 组合间接承接,卡④ 大门落地时应补大门侧专项残留断言(该断言原属卡④ 接收清单,两头登记在案)。
|
||||
2. mn10:生涯直调 3 处与 smoke `_resume_from_menu` 1 处为函数级登记、未逐位点列名——登记粒度微瑕,实质已登记。
|
||||
3. mn13:卡片「去掉菜单直调依赖」字面未兑现,按契约 5/§9.4 判中间态合法,报告已如实对账。
|
||||
|
||||
审计全程零 commit;变异注入经 `git checkout` 精确还原,`game/` 零残留(`git status` 仅本报告工作件)。
|
||||
@@ -1,239 +0,0 @@
|
||||
# 需求卡片:主菜单三入口化批(6 钮 → 3 钮)· 营地交互重做卡②
|
||||
|
||||
- 版本:**v1.3**(现行身份:零待裁点+含 §7.1 改动—验收对照表〔按 test-conventions §9.3 六列与 §9.8 旧卡开工前补表口径〕+§7.2 测试削弱申报。既有定性:契约 5 中间态因卡④回设计段延长为工程批交付后的稳态)
|
||||
- 来源:[需求澄清-营地交互重做-2026-10-18.md](需求澄清-营地交互重做-2026-10-18.md)(唯一事实源:④结构树「主菜单(需改动:6 钮 → 3 钮)」、⑤裁决 1、②反参照、⑦切批原则②)
|
||||
- 归属:呈现层/组合根(`game/presentation/`)——营地交互重做五卡之二
|
||||
- 排期:未编入(2026-10-18 用户令:需求卡片不预占迭代号,批次归属按工作量另裁)
|
||||
- 开工门:U0(用户 `/iter` 发令);**零待裁点**;硬依赖卡③、中间态依赖卡④(见 §0/契约 5)
|
||||
|
||||
## 0. 前置依赖与并行性
|
||||
|
||||
- **硬依赖卡③(选档界面)**:「进入存档」钮的落点=选档界面。**本卡与卡③必须同批交付或卡③在先**(卡内推导,防死钮——澄清⑦只定切批原则,「同批或在先」是本卡的防死钮推导,非用户裁决)——禁以死钮/占位钮形态合并(违契)。
|
||||
- **卡④(营地场景图)依赖(v1.1 补明;v1.2 注:卡④已回设计段)**:冒险入口探针段的新路径是「进入存档→选档→进档→营地→大门两分支→开局」——卡③同批到位也解决不了这批探针(卡④未到位时无路可走)。中间态处置见契约 5。**卡④ 2026-10-18 回设计段(美术设计定稿未过前置闸)**——契约 5 的中间态将从「批内临时」延长为「工程批交付后的稳态」,直至卡④重新立卡落地;实现报告「已知中间态」节按此登记。
|
||||
- 卡④(营地场景图)承接本卡撤出的「开始冒险/继续上局/营地/生涯」四功能入口;本卡只负责主菜单侧撤出与接线,不负责落点实现。
|
||||
- 卡①(存档制数据层)是卡③的前置,间接构成本批链的数据面底。
|
||||
|
||||
## 1. 目标与完成定义
|
||||
|
||||
**目标(澄清④照录)**:主菜单 6 钮 → 3 钮——**进入存档 / 设置 / 退出游戏**(裁决 1:用户原话「主菜单界面应该只有 3 个入口:①进入一个存档 ②游戏的设置 ③退出游戏。开始冒险,和营地相关的都应该是一个存档内的东西」)。
|
||||
|
||||
**相对现状,新增了什么**:
|
||||
1. 主菜单按钮组从 6 钮(继续上局/开始冒险/营地/生涯/设置/退出游戏)砍到 3 钮;
|
||||
2. 「进入存档」新钮接线到卡③选档界面;
|
||||
3. 撤出钮的功能去向显式化:开始冒险/继续上局 → 营地大门(卡④,裁决 5 两分支);营地 → 存档内场景图(卡④);生涯 → 营地床铺旁笔记本(卡④);
|
||||
4. 主菜单侧断点互斥确认路径(现居开始冒险)整体移交卡④大门,主菜单禁残留。
|
||||
|
||||
**完成定义**:
|
||||
1. 主菜单有且仅有三钮:进入存档/设置/退出游戏;四旧钮与两组组帽的处理按 §9 落定;
|
||||
2. 「进入存档」可点到选档界面(卡③交付物);
|
||||
3. 设置/退出游戏两钮行为零变化(澄清④:「设置(已实现 · 不动)」「退出游戏(已实现 · 不动)」);
|
||||
4. 冒烟/探针/golden 随批迁移完毕(§2 F10 全量位点表逐点过),批末重闸按改动域选档全绿;
|
||||
5. 三份 `reports/` 产出物写齐(T3)。
|
||||
|
||||
## 2. 现状事实(2026-10-18 实查;开工日 T0 复核行号)
|
||||
|
||||
| # | 事实 | 出处 |
|
||||
|---|---|---|
|
||||
| F1 | 开始覆盖层构建=六钮+两组组帽:「── 冒 险 ──」组(继续上局/开始冒险)、「── 营地与系统 ──」组(营地/生涯/设置/退出游戏);续玩钮初始 `visible=false`(有断点才亮,可见性与文案归组合根刷新) | `game/presentation/ui_assembler.gd:128`/:130-138/:141-153 |
|
||||
| F2 | 菜单屏壳持有六句柄(`lvbtn/resumebtn/campbtn/careerbtn/settingsbtn/quitbtn`),取值在 `_ready` | `game/presentation/scenes/menu_screen.gd:9-16`/:27-31 |
|
||||
| F3 | 组合根接线:lvbtn→`_start_adventure_from_menu`;resumebtn→`_resume_from_menu`;campbtn→`_camp_pres.open_camp`;careerbtn→`_open_career`;settingsbtn→`_open_settings`;quitbtn→`_quit_game` | `game/presentation/main.gd:307-309`/:331-334 |
|
||||
| F4 | 开始冒险的断点互斥确认:有断点先出 ConfirmDialog(「已有未完冒险(第 N 关)——开新冒险将覆盖旧断点」),确认才弃旧断点写盘开局——该路径整体移交卡④大门(澄清④:「断点弹窗保留移位」) | `main.gd:475-497` |
|
||||
| F5 | 续玩钮可见性刷新=断点在档态(`_refresh_resume_button`)。**消费面(v1.1 补全)**:main.gd:194(boot)/:319(注入 CampShopPresenter ctx)/:704/:1063/:1101;camp_shop_presenter.gd:19/36/55(ctx 字段+on_camp_closed 调用);probe_ui_util.gd:117-120(isolate_save 的 refresh_resume 参数,多探针传 true);pacing_queue_test.gd:30 及 F10 表全部探针位点 | `main.gd:507-514` 及上列各处 |
|
||||
| F6 | 冒烟 V2 断言六钮非空(`menu.start_overlay != null and menu.lvbtn != null and …`) | `game/smoke/smoke_all.gd:163` |
|
||||
| F7 | 生涯.md 信息架构记载现行六钮组(「冒险」组+「营地与系统」组)与生涯入口=开始层生涯钮 | `design/gdd/systems/跨局循环/生涯.md:9`/:11-23 |
|
||||
| F8 | camp.md 定位句载「主菜单营地独立入口进入」 | `design/gdd/ux/camp.md:10` |
|
||||
| F9 | 08「三 · 界面」表载主菜单/开始覆盖层/营地/生涯页四行(均在役);08 头注纪律=增删条目须用户裁,状态列可改 | `design/gdd/08-Alpha版本标准.md:102-105`/:5 |
|
||||
| F10 | **探针/单测/闸机影响面全量清单(v1.1 重列——初查「五探针」严重不全)**:见下表 | 全仓 grep 实证 |
|
||||
| F11 | menu golden 基线在役:`game/tests/golden/menu_boot.png`(迭代 28 新增);对比段=render_gate.sh「菜单 golden 逐像素」节;重制入口=`tools/golden_baseline_refresh.sh --menu`(该脚本守卫素材齐盘,缺位拒跑) | `game/tests/golden/` 实查;`tools/render_gate.sh`(菜单 golden 节);`tools/golden_baseline_refresh.sh` 头注 |
|
||||
| F12 | art-bible §7.4 小字号豁免为**一条合并条款**(条带内读数+装饰 caption 两类,:433),主菜单分组 overline×2(「── 冒 险 ──」「── 营地与系统 ──」)只是枚举中两个片段——禁整行删,只能 excision 片段;注销以 §9 第 1 条裁定为条件。另有两处代码注释引述组帽名(main.gd:287、career_overlay.gd:3,实施本体内可自理) | `design/art/art-bible.md:433`;`main.gd:287`;`career_overlay.gd:3` |
|
||||
| F13 | 体验验证清单有两处引述主菜单形态(:170「左操作列(冒险/营地与系统两组)」、:192「营地与系统组出现生涯钮」)——随本批入口拓扑改 | `体验验证清单.md:170`(仓库根)/:192 |
|
||||
|
||||
### F10 全量影响位点表(20+ 位点,按闸归类)
|
||||
|
||||
| 位点 | 依赖内容 | 所属闸 | 本批处置 |
|
||||
|---|---|---|---|
|
||||
| `ui_probe.gd:28-55` | 营地钮驱动+余额+秘宝匣 12 行断言 | probe_gate | 改走「进入存档→选档→进档→营地」新路径 |
|
||||
| `ui_click_probe.gd:59-127` | 营地购买合成点击全链(campbtn 驱动) | probe_gate --click | 同上 |
|
||||
| `ui_click_probe.gd:224-228`、:462-518 | resumebtn 断言+整条「断点段」(中断→续玩全链+互斥确认两分支,约 80 行) | probe_gate --click | **断点确认段随弹窗移交卡④**(契约 4);卡② T1 只摘钮后保留函数直调中间态(契约 5) |
|
||||
| `ui_struct_probe.gd:41-45` | camp 结构审计(营地钮驱动) | probe_gate 默认 | 改新路径 |
|
||||
| `ui_struct_probe.gd:54-56/:69` | careerbtn 生涯入口链 | probe_gate 默认 | 改走卡④笔记本路径 |
|
||||
| `ui_struct_probe.gd:86`、:163-183 | `_start_adventure_from_menu`+resume 专项(:168 刷钮、:170 续玩) | probe_gate 默认 | resume 专项随钮退役改写;冒险段见契约 5 |
|
||||
| `screen_flow_probe.gd:53`、:109-123 | 营地可见态+营地开合段 | probe_gate 默认 | 入口段归卡②;营地键语义/开合/篝火段归卡④(分界写入两卡 T 卡) |
|
||||
| `screen_flow_probe.gd:130-136` | ④菜单→冒险 lvbtn 步 | probe_gate 默认 | 契约 5 中间态;终态归卡④ |
|
||||
| `shot_probe.gd:103-119`、:138-145、:193 | careerbtn 生涯截图段+lvbtn 关卡截图段(render_gate 七屏链三段的入口在本批被拆) | render_gate | 生涯段归卡④;关卡段契约 5 中间态、终态归卡④ |
|
||||
| `shot_probe.gd:126-133` | camp 截图+关闭钮查找 | render_gate | 归卡④(营地键/收闭改缆) |
|
||||
| `fx_shot_probe.gd:36-40`、:47 | lvbtn 查找+点击,零命中即 `_fail` | render_gate | 契约 5 中间态 |
|
||||
| `t17_defer_probe.gd:29-33` | lvbtn 查找+点击 | probe_gate --full | 契约 5 中间态 |
|
||||
| `ui_tune_probe.gd:96` | `main._start_adventure_from_menu()` 直调 | probe_gate --full | 契约 5 中间态 |
|
||||
| `ui_input_probe.gd:35` | 同上 | probe_gate **默认必跑** | 契约 5 中间态 |
|
||||
| `layout_probe.gd:27` | 同上 | probe_gate **默认必跑** | 契约 5 中间态 |
|
||||
| `smoke_all.gd:163` | V2 六钮非空断言 | smoke_all | 改三钮断言 |
|
||||
| `smoke_all.gd:266-290` | V2d 续玩钮六断言(boot/回菜单态) | smoke_all | 随钮退役改写/注销 |
|
||||
| `smoke_all.gd:322/:326`、:411-415 | V3g campbtn 直呼驱动营地模态开合 | smoke_all | 改新路径 |
|
||||
| `smoke_all.gd:470-478`、:565-567 | V3i 生命周期阶段⑨(`_resume_from_menu` 全链)+`_stage_faces` 的 `resume_vis` 键 | smoke_all | 随续玩入口迁卡④改写 |
|
||||
| `smoke_all.gd:328/:439/:598/:628` | `_start_adventure_from_menu` 直调 ×4 | smoke_all | 契约 5 中间态 |
|
||||
| `pacing_queue_test.gd:30/:33` | `_refresh_resume_button`+`_start_adventure_from_menu` | 单测(33 套之一) | 函数去留按 §9 第 2 条 |
|
||||
| `probe_ui_util.gd:117-120` | `isolate_save` 的 `refresh_resume` 参数→`main._refresh_resume_button()`,多探针传 true | 全部探针共用 | 函数去留按 §9 第 2 条连带 |
|
||||
|
||||
**T0 清点口径(v1.1 定死)**:全仓 grep `lvbtn|campbtn|careerbtn|resumebtn|_start_adventure_from_menu|_resume_from_menu|_refresh_resume_button|start_overlay`,零意外命中才收口;清点结果写成文(T0 产物),作为 T2 迁移清单的基线。
|
||||
|
||||
## 3. 设计契约(红线,违反 = L3 停机呈报)
|
||||
|
||||
🔴 **契约 1 · 三钮且仅三钮**:进入存档/设置/退出游戏(裁决 1)。主菜单禁留任何存档内功能入口——开始冒险/继续上局/营地/生涯四钮彻底撤出(禁隐藏态残留、禁置灰态残留)。
|
||||
|
||||
🔴 **契约 2 · 设置与退出零行为变化**:两钮已实现不动(澄清④结构树原文);本批只保留其接线,禁借机改设置面或退出路径。
|
||||
|
||||
🔴 **契约 3 · 「进入存档」落点唯一**:只接卡③选档界面;禁直连营地/冒险(存档语境选择先行——澄清④结构树层级)。
|
||||
|
||||
🔴 **契约 4 · 断点确认路径整体移交**:主菜单侧禁残留「开新冒险覆盖旧断点」确认逻辑(main.gd:475-497 段随迁卡④大门,裁决 5 两分支);移交后主菜单无任何写档路径。断点确认探针段(ui_click_probe:462-518 等)随弹窗移交卡④ T5 接收,本卡 T2 明列移交项。
|
||||
|
||||
🔴 **契约 5 · 硬依赖卡③+卡④中间态条款(v1.1 补)**:本卡与卡③同批或卡③在先,禁死钮合并。**卡④未到位批内**:`_start_adventure_from_menu`/`_resume_from_menu` 两函数保留在 main.gd、仅摘菜单接线(T1 现文「只摘除主菜单侧调用」即此路),冒险段探针暂维直调旧函数、卡④到位再迁——该中间态是合法交付态,须在实现报告「已知中间态」节登记;禁为凑绿而把探针断言弱化成假路径。
|
||||
|
||||
🔴 **契约 6 · 探针/golden 契约**(属仓库既有测试纪律的卡内成文,非用户裁决):入口路径迁徒的探针段随批显式改写并留痕;menu golden 漂移按「核热区限预期面→显式重制+呈报→复闸」流程执行,超预期=L3。
|
||||
|
||||
🔴 **契约 7 · 不做形态重设计**:本卡只砍钮不重排菜单形态(双列布局/立绘看台不动——砍钮后的布局适配属 §9 代拍板微调圈)。反参照纪律(澄清②:拒「各种框框」)的兑现归卡④营地场景图,本卡不借尸还魂。
|
||||
|
||||
## 4. 范围边界
|
||||
|
||||
**做**:`build_start_overlay` 钮集砍到 3(含组帽与左列布局适配);`menu_screen` 句柄面;组合根接线(撤 4 接 1,含 camp_shop_presenter.gd 的 `_refresh_resume_button` ctx 摘除——v1.1 补列实施本体);冒烟 V2 断言改写;F10 全量位点表逐点迁移;menu golden 重制+呈报;反哺点清单。
|
||||
|
||||
**不做**(明示去向):
|
||||
- 选档界面本体 → 卡③;
|
||||
- 营地场景图/大门动线/生涯改挂 → 卡④;
|
||||
- ESC 浮窗与营地顶栏 → 卡⑤;
|
||||
- 设置面/退出路径的行为改动 → 无(契约 2);
|
||||
- 主菜单视觉形态重设计(换底/新素材/布局重构)→ 不在本批;如用户要形态级重做,另立裁点。
|
||||
|
||||
## 5. 关联文档同步面
|
||||
|
||||
> **v1.3 口径**:本批禁写 `design/` 整目录与根规则文件,唯一可写目录 = `reports/`;下表一律执行为列进反哺点清单。08 写入权限三卡统一口径(v1.1 对齐):**状态列可改;注记改写列反哺点随清单呈报;增删行须用户裁**。
|
||||
|
||||
| 文档 | 关联点 | 同步义务 |
|
||||
|---|---|---|
|
||||
| `design/gdd/systems/跨局循环/生涯.md` | :9 信息架构「现行主菜单按钮组……『冒险』组……『营地与系统』组」+:11-23 结构树——六钮组记述整体失义;生涯入口从开始层迁营地笔记本 | 反哺点 · 信息架构节改三钮组+生涯入口位改挂 |
|
||||
| `design/gdd/ux/camp.md` | :10「主菜单营地独立入口进入」——营地入口改挂存档内场景图 | 反哺点 · 定位句改挂 |
|
||||
| `design/gdd/08-Alpha版本标准.md` | :102-105 三·界面表四行——状态列可改;入口拓扑注记列反哺点 | 反哺点 · 列清单(统一口径见上) |
|
||||
| `体验验证清单.md`(仓库根) | :170/:192 两处引述主菜单形态(左操作列两组/营地与系统组生涯钮) | 反哺点 · 列清单(该件属设计文档,实现批禁写) |
|
||||
| `design/art/art-bible.md` | :433 小字号豁免合并条款中「主菜单分组 overline×2」枚举片段——组帽撤后 excision(禁整行删),以 §9 第 1 条裁定为条件 | 反哺点 · 列清单 |
|
||||
| `待办清单.md`(仓库根,流水线唯一登记处) | 本卡登记条 | 反哺点 · 列清单 |
|
||||
| `roadmap.md` | 迭代行编入/状态刷新 | 反哺点 · 列清单 |
|
||||
| `game/presentation/ui_assembler.gd`、`scenes/menu_screen.gd`、`main.gd`、`camp_shop_presenter.gd`(v1.1 补)、`game/smoke/*`、`game/tests/golden/*`、`tools/golden_baseline_refresh.sh`(重制入口,只跑不改) | 实现与断言/基线本体 | 实施本体(可写) |
|
||||
|
||||
## 6. 任务卡
|
||||
|
||||
> 估时按 Claude 工作日口径;每卡出口自跑轻闸;开工日 T0 复核全部行号。
|
||||
|
||||
### 6.0 落位与可复用性预检(req-card 必备结构第 12 项,定义 T 卡前置)
|
||||
|
||||
本卡零新增文件——改的全是既有承载面。逐件核查:
|
||||
|
||||
| 新增件/改动 | 复用面(既有实现) | 落点唯一性 | 分层与跨层出口 |
|
||||
|---|---|---|---|
|
||||
| 三钮钮集(改 `ui_assembler.gd:128-153`) | 钮全用 `UiKit` 工厂件(现役即 `primary_button`/`button`/`verb_button`),零新素材零新色值 | 主菜单钮集唯一构建口=`build_start_overlay`,盘上无第二处构建菜单钮的实现 | 装配层只产树与句柄,不持业务态 |
|
||||
| 「进入存档」句柄(改 `scenes/menu_screen.gd:9-16`/`:27-31`) | 沿用屏壳句柄暴露形态(六句柄现制),只换钮名不改形态 | 屏壳句柄唯一暴露口=menu_screen,禁在装配层与组合根各存一份 | 屏壳→组合根只经 `pressed` 信号 |
|
||||
| 组合根开层函数(新增 `_open_save_select`) | **复用同层先例 `_open_career`(`main.gd:1092-1095`:取数+开层+喂视图)**+模态栈单口 `_open_modal`/`_close_modal`(`:458-462`)+层序合同 `LAYER_CONTRACT`(`:34-53`,career 行见 `:47`) | 开层函数唯一在组合根,禁在屏壳或视图内自开层 | 呈现层禁直连数据层,取数一律在组合根完成后传入视图 |
|
||||
| 删除 `_refresh_resume_button` | 无(净删除) | 删除即清掉一处散落 helper——消费点 12 处全清单见 §2 F5 与 mn7,漏删=留下第二处刷新口 | — |
|
||||
| menu golden 重采 | **复用既有重制入口 `tools/golden_baseline_refresh.sh --menu`(F11)与 `tools/render_gate.sh` 菜单 golden 段** | 禁新写采图脚本、禁在探针里复制比对逻辑(逐像素比对唯一落点=golden 段) | 代码域闸统一入口,卡内不列闸件名单 |
|
||||
| 断言与探针位点改写 | 全部改写既有段(smoke 与 F10 表内既有探针) | 禁新建同职责探针文件——同一入口的可达性只在一处断言 | 测试执行两入口铁规 |
|
||||
|
||||
### T0 事实坐实(≈0.5–1d)
|
||||
|
||||
- 复核 §2 全部行号;按 F10 表尾清点口径全仓 grep,清点结果写成文(T0 产物);
|
||||
- 与卡③对齐:「进入存档」钮的目标句柄与选档界面开层函数名先定(跨卡接口);与卡④对齐断点确认探针段的移交/接收分界(契约 4)。
|
||||
|
||||
### T1 钮集砍伐与接线(≈0.5–1d)
|
||||
|
||||
- `build_start_overlay`:六钮→三钮;组帽去留与左列布局适配按 §9 拍板(冒险组帽必撤——组内零钮;见 §9 第 1 条);
|
||||
- `menu_screen` 句柄面随裁(撤 4 留 3+新增进入存档钮句柄);
|
||||
- 组合根:撤 lvbtn/resumebtn/campbtn/careerbtn 四线,接「进入存档」→选档界面;`_start_adventure_from_menu`/`_resume_from_menu` 按契约 5 保留(摘接线不删函数);
|
||||
- `_refresh_resume_button` 去留按 §9 第 2 条:**卡④大门不复用该函数**(卡④ T4 已明示——两分支直读 `has_breakpoint`,无钮可刷),故只剩删除一路;删函数同批清全部消费点(main.gd 五处+camp_shop_presenter.gd ctx 字段与 on_camp_closed 调用+probe_ui_util 参数+pacing_queue_test+各探针传 true 位点);
|
||||
- 断点确认段(main.gd:475-497)的移交:本批只摘除主菜单侧调用,弹窗本体与两分支逻辑落卡④大门。
|
||||
|
||||
### T2 断言、探针与 golden 迁移批(≈1.5–2d)
|
||||
|
||||
- smoke V2 六钮断言→三钮断言(进入存档/设置/退出游戏非空;四旧钮句柄零命中);
|
||||
- F10 全量位点表逐点迁移:入口路径段本卡改;断点确认段/生涯截图段按契约 4 移交卡④(本卡 T2 明列移交项,卡④ T5 接收);冒险段探针按契约 5 中间态处理(卡④到位再迁);
|
||||
- menu golden:核漂移热区限钮集区→显式重制 `menu_boot.png`+呈报→复闸;
|
||||
- **变异验证伴生**:新断言段定注入实验——例:把四旧钮之一接回(预期三钮断言红)、进入存档钮接错层(预期探针路径红);注入→最窄闸见红→精确还原→记录。
|
||||
|
||||
### T3 产出物落位卡(≈0.5d,末卡)
|
||||
|
||||
三份 `reports/` 写齐(实现报告含 golden 重制呈报记录、变异记录表、「已知中间态」节〔契约 5〕、**实际改动—验收对照表**〔§7.1 需求侧表的执行对账,另加「结果」格,F10 位点逐段指到行号〕/代拍板追认单/反哺点清单)。**合并前置**:独立验收审计(§7.1 末段声明)完成且 `reports/iter33-验收审计-<完成日>.md` 逐行「通过」;§7.2 申报外的削弱由审计判红,未过不得合并。
|
||||
|
||||
**估时合计 ≈2.5–4d**(v1.1 上调:探针面从「五探针」扩到 20+ 位点,T2 清点后重估)。切分预案:T1 出口可切(砍钮先落、断言迁移后落)——但契约 5 硬依赖卡③,实际切分价值低,建议与卡③同批单跑。
|
||||
|
||||
## 7. 验证闸(逐需求点验收清单)
|
||||
|
||||
| # | 需求点 | 测什么 | 落点/判定手段 |
|
||||
|---|---|---|---|
|
||||
| V1 | 三钮在位+既有断言族改写 | 进入存档/设置/退出游戏三钮非空且可点;四旧钮(开始冒险/继续上局/营地/生涯)在主菜单零命中;被本批废止/改写的既有断言族(smoke V2d 续玩钮态、V3g campbtn 驱动、V3i 阶段⑨续玩全链、`_stage_faces` 的 `resume_vis` 键)逐族有改写后断言承接 | 冒烟 V2 改写段+V2d/V3g/V3i 改写段+ui_struct_probe 结构断言 |
|
||||
| V2 | 设置零行为变化 | 设置钮开合路径与既有断言一致 | 冒烟 V3g settings 模态段复跑 |
|
||||
| V3 | 退出接线正确 | quitbtn → `_quit_game` 连接存在(headless 不可真退——接线断言代偿) | 源码/结构断言 |
|
||||
| V4 | 进入存档可达选档 | 点击链路通到卡③选档界面(层可见+菜单隐藏) | ui_click_probe/screen_flow_probe 新路径段(依赖卡③) |
|
||||
| V5 | 断点确认零残留 | 「开新冒险覆盖断点」确认路径仅存于卡④大门;ConfirmDialog 允许多消费方(卡③删档确认在役——切换机制见卡③ 契约 3) | 源码断言+ui_struct_probe 既有采样复跑 |
|
||||
| V6 | golden 与七屏链 | menu golden 漂移限钮集区、重制有呈报、复闸绿;shot_probe 七屏截图链存在性自检全绿(career/camp/level 三入口迁移后仍七件非空) | render_gate golden 段+shot_probe 自检段复跑 |
|
||||
| V7 | 左列布局几何不破 | 砍钮后双列不相交合同与按钮几何族(互压/等宽/出屏/零尺寸)复跑 | ui_struct_probe `_start_columns_contract`+`_audit("start")` 段复跑(v1.1 补机检项) |
|
||||
| V8 | 反哺点清单 | §5 每条有落点 | 件核对表 |
|
||||
|
||||
**测试方式两分法**:V1–V7 机检自动化;**用户目检项=主菜单三钮观感(钮集砍伐后左列布局是否失衡)**——登记 07(实机目检=生命周期最后一步统一进行,不阻塞迭代,澄清⑥口径)。
|
||||
|
||||
**闸口径**:轻闸每卡出口自跑;批末重闸按改动域选档(本批碰 `game/` 代码/断言/golden → `--code`)全绿才合并;MC 零跑(零数值零行为)。
|
||||
|
||||
### 7.1 改动—验收对照表(test-conventions §9.3 六列;§7 的 V 号在各需求点格内括注)
|
||||
|
||||
> 断言尾缀族=〔mn#〕,实现期逐条 grep 定位。落点文件为计划落点,实现期在 `reports/iter33-实现报告-<完成日>.md` 的实际对照表里按真实行号对账(§9.3 双端对上)。本卡是断言迁移卡,F10 全量位点表的每一段都必须能指到本表某一行——指不到的在实现报告标「由第 X 行覆盖」。
|
||||
|
||||
| 需求点 | 改动(文件:行/行为) | 验收测试(名称+落点+尾缀) | 层级 | 真实入口 | 撤销或变异证明 |
|
||||
|---|---|---|---|---|---|
|
||||
| mn1 三钮在位(契约1、V1、T1) | `game/presentation/ui_assembler.gd:128-153` `build_start_overlay` 六钮+两组帽 → 三钮(进入存档/设置/退出游戏) | 冒烟 V2 三钮非空段〔mn1〕落 `game/smoke/smoke_all.gd:163` 改写 | 接口 | 真实 `MenuScreen` 经 `UiAssembler.build_start_overlay()` 构建后读句柄 | 变异=把「生涯」钮接回三钮集 → 三钮断言红(T2 变异①) |
|
||||
| mn2 四旧钮彻底撤出(契约1、V1、T1) | `game/presentation/scenes/menu_screen.gd:9-16`/`:27-31` 句柄面撤 `lvbtn`/`resumebtn`/`campbtn`/`careerbtn`、留 3+新增进入存档句柄 | 冒烟〔mn2〕四旧句柄名零命中+`ui_struct_probe` 结构断言 | 探针 | 菜单场景实例的句柄枚举(禁隐藏态、禁置灰态残留) | 撤销=恢复 `lvbtn` 字段 → 零命中断言红 |
|
||||
| mn3 进入存档可达选档(契约3、V4、T1/T2) | `game/presentation/main.gd:307-309`/`:331-334` 接线区新增进入存档 → 开卡③选档层(开层函数名 T0 与卡③对齐) | `ui_click_probe` 新路径段〔mn3〕+`screen_flow_probe` 开合段 | 探针 | 合成点击进入存档钮 → 选档层可见且开始层隐藏 | 变异=接到营地层 → 层可见断言红(T2 变异②) |
|
||||
| mn4 设置钮零行为变化(契约2、V2) | `settingsbtn` 接线保持不动(`main.gd:331-334`) | 冒烟 V3g settings 模态段复跑〔mn4〕 | 冒烟 | `settingsbtn` 句柄 `pressed` 驱动 | 撤销=断线 → V3g settings 段红 |
|
||||
| mn5 退出接线正确(V3) | `quitbtn` → `_quit_game` 连接保持(`main.gd:331-334`) | 源码/结构断言〔mn5〕 | 单元 | `MenuScreen.quitbtn.pressed` 的连接目标名 | 变异=改连空函数 → 连接目标断言红 |
|
||||
| mn6 断点确认主菜单零残留(契约4、V5、T1) | `main.gd:475-497` 摘除主菜单侧调用(弹窗本体与两分支逻辑落卡④大门) | 源码断言〔mn6〕+`ui_struct_probe` 既有 confirm 采样复跑 | 探针 | 主菜单路径上「开新冒险覆盖断点」确认链不可达 | 撤销=接线复现 → 残留断言红 |
|
||||
| mn7 `_refresh_resume_button` 删除+消费点清零(T1、§9 第2条) | 函数删除(`main.gd:507-514`)+调用五处(`:194`/`:319`/`:704`/`:1063`/`:1101`)+`camp_shop_presenter.gd:19`/`:36`/`:55` ctx 字段与 `on_camp_closed` 调用+`probe_ui_util.gd:117-120` 参数+`pacing_queue_test.gd:30` | 单元〔mn7〕+表尾清点口径全仓 grep 零命中件核(T0 产物) | 集成 | 真实消费链:探针 `isolate_save()` 与营地关层回调 | 变异=漏删一处 ctx 字段 → grep 计数断言红 |
|
||||
| mn8 废止断言族有改写承接(V1、T2) | `smoke_all.gd:266-290` V2d 续玩钮六断言、`:322`/`:326`+`:411-415` V3g campbtn 驱动营地开合、`:470-478`+`:565-567` V3i 阶段⑨续玩全链与 `_stage_faces.resume_vis` 键 | 改写后的三钮/新路径断言〔mn8〕逐族承接,同落点 | 冒烟 | boot 与回菜单生命周期段真实入口 | 撤销=只删不写承接 → 「每个废止族须有承接」计数断言红 |
|
||||
| mn9 营地/生涯入口探针段改走新路径(V1、T2) | `ui_probe.gd:28-55`、`ui_click_probe.gd:59-127`、`ui_struct_probe.gd:41-45`/`:54-56`/`:69`、`screen_flow_probe.gd:53`/`:109-123` | 各探针自身绿+新路径断言〔mn9〕 | 探针 | 探针档默认跑各件,驱动路径=进档后开营地/生涯 | 撤销=入口段留旧句柄 → 取不到钮即 `_fail` 红 |
|
||||
| mn10 冒险段探针直调中间态(契约5、V1、T2) | `_start_adventure_from_menu`/`_resume_from_menu` 保留函数仅摘接线;直调位点=`fx_shot_probe.gd:36-40`/`:47`、`t17_defer_probe.gd:29-33`、`ui_tune_probe.gd:96`、`ui_input_probe.gd:35`、`layout_probe.gd:27`、`smoke_all.gd:328`/`:439`/`:598`/`:628`、`screen_flow_probe.gd:130-136`、`shot_probe.gd:138-145`/`:193` | 各该段复跑绿〔mn10〕+实现报告「已知中间态」节逐位点登记 | 探针 | 函数直调(本行如实标为中间态入口,卡④到位后换代) | 撤销=删函数 → 直调段运行即红(红证明入口真落在该函数上) |
|
||||
| mn11 组帽撤除+左列几何不破(V7、T1、§9 第1条) | `ui_assembler.gd:128`/`:141` 两枚 overline 与左列重排(「冒 险」帽必撤,「营地与系统」帽按 §9 处置并追认单留痕) | `ui_struct_probe` `_start_columns_contract`+`_audit("start")` 段复跑〔mn11〕 | 探针 | 真实菜单构建后的按钮几何审计(互压/等宽/出屏/零尺寸) | 变异=左列改单列致两列相交 → 不相交合同断言红 |
|
||||
| mn12 menu golden 重制(V6、T2、契约6) | `game/tests/golden/menu_boot.png` 重采,走 `tools/golden_baseline_refresh.sh --menu`(脚本只跑不改) | `render_gate.sh` 菜单 golden 逐像素段〔mn12〕 | 探针/golden | render_gate 驱动 shot_probe 真机渲染出图逐像素比对 | 撤销=拿旧基线跑 → 钮集区差红;差区越出钮集区=触契约7 越界,路由 §8 L3 |
|
||||
| mn13 `pacing_queue_test` 套件连带改造(V1、T1) | `game/tests/unit/presentation/pacing_queue_test.gd:30`/`:33` 去掉 `_refresh_resume_button` 与菜单直调依赖 | 该套件自身绿〔mn13〕 | 单元 | `game/tests/run_all.gd` 真实套件入口 | 变异=改成裸调下层队列函数 → 该套件的宿主链断言红(证明入口未绕过改动点) |
|
||||
| mn14 反哺点清单(V8)——非行为改动 | §5 所列(生涯.md、camp.md、08、体验验证清单、art-bible `:433` excision、待办清单、roadmap)随批列点不落文 | 件核对表〔mn14〕落 `reports/iter33-反哺点-<完成日>.md` | 件核 | 收口前逐条指认落点 | 判断依据=产出物件核不产码;§5 任一条缺落点即 T3 收口不过 |
|
||||
|
||||
### 7.2 测试削弱申报(test-conventions §9.5)
|
||||
|
||||
本批结构性拆入口,必然动到既有断言——下列为**已申报**的改/删项,逐条写明判据去向,实现期未申报的削弱由独立验收审计判红:
|
||||
|
||||
| 旧断言位点 | 处置 | 承接判据 |
|
||||
|---|---|---|
|
||||
| `smoke_all.gd:266-290` V2d 续玩钮六断言 | 钮已撤,判据失去对象——废止 | 由〔mn8〕三钮/新路径承接断言顶上;卡① sv2 boot 态断言另钉「boot 后无激活态」 |
|
||||
| `smoke_all.gd:322`/`:326`/`:411-415` V3g campbtn 直呼驱动 | 驱动路径换代 | 〔mn8〕+〔mn9〕新路径段(营地经进档开层) |
|
||||
| `smoke_all.gd:470-478`/`:565-567` V3i 阶段⑨与 `_stage_faces.resume_vis` 键 | 键随钮退役 | 〔mn8〕承接改写;生命周期其余阶段断言不许动 |
|
||||
| `ui_click_probe.gd:224-228`/`:462-518` 断点段(约 80 行) | 随弹窗移交卡④大门 | 本卡 T2 明列移交项+卡④重立卡时的接收清单两头登记;禁静默删除 |
|
||||
| `shot_probe.gd:103-119`/`:126-133` career/camp 截图段 | 归卡④ | 七屏链存在性自检不许降档——V6 判据仍要求七件非空,缺件即红 |
|
||||
| `ui_struct_probe.gd:86`/`:163-183` resume 专项 | 随钮改写 | 〔mn2〕〔mn8〕 |
|
||||
| 冒险段探针的入口路径断言 | 降级为函数直调中间态 | 〔mn10〕逐位点登记在实现报告「已知中间态」节,卡④到位后代换——契约 5 明禁为凑绿把断言改成假路径 |
|
||||
|
||||
**独立验收审计(test-conventions §9.7)**:合并前由未参与实现的迭代 loop 内子代理(或用户点名会话)审计——只读本卡、实现报告实际对照表、diff 与测试文件,自跑最窄测试抽查,不采信「已全绿」;审计报告落 `reports/iter33-验收审计-<完成日>.md`,逐行写「通过/缺漏/例外及依据」。**审计未通过不得合并**(T3 合并前置)。
|
||||
|
||||
## 8. 异常分级
|
||||
|
||||
- **L1(自救)**:断言写法、探针路径选择、布局微调。
|
||||
- **L2(记录继续)**:组帽去留与左列布局适配(§9 域内)、`_refresh_resume_button` 删除的消费点清理顺序、探针迁移中的中间态处理(契约 5 登记)、T2 估时随清点重估。
|
||||
- **L3(停机呈报)**:卡③ 未同批到位导致「进入存档」无落点(停线等批,禁死钮合并);menu golden 漂移越出钮集区(形态面被波及=超出本批契约 7);发现设置/退出路径被意外触碰;F10 清点出现表外新位点且无法随批迁移。
|
||||
|
||||
## 9. 代拍板白名单(超清单必呈报)
|
||||
|
||||
1. 组帽与左列布局适配:**「── 冒 险 ──」帽必撤(组内零钮——退化态不留);「营地与系统」帽去留/改文案属代拍板,改名须追认单留痕**(v1.1 明写——保留原样=留一句指称不可达地点的文案,禁)。
|
||||
2. `_refresh_resume_button` 去留:卡④不复用(卡④ T4 已证),默认删;删时同批清全部消费点(T1 列明)。
|
||||
3. 「进入存档」钮的动词化命名与 tooltip 文案(对齐现役动词钮先例)。
|
||||
4. 探针迁移中的中间态写法(路径分段断言 vs 端到端)+卡④未到位批内冒险段探针维直调(契约 5)。
|
||||
5. 提交切分与 worktree 分支命名。
|
||||
|
||||
## 10. 待裁点
|
||||
|
||||
**零待裁点**(裁决 1 三钮结构、四功能去向均由澄清④结构树锁定;布局适配与组帽文案归 §9 代拍板+追认单留痕)。开工门 = U0(用户 `/iter` 发令)+ 卡③同批到位+ 契约 5 中间态条款随卡④排期一并确认。
|
||||
|
||||
---
|
||||
|
||||
**审查回写要点**:v1.0→v1.1(2026-10-18 grilling 子 Agent 对抗审查回写)——事实订正:F10 探针影响面从「五探针」重列为 20+ 位点全量表(漏列 fx_shot/t17_defer/ui_tune/ui_input/layout/ui_click 断点段/ui_struct resume 专项/shot_probe career+level 段/smoke V2d/V3g/V3i 等);F5 `_refresh_resume_button` 消费面补全并补列 camp_shop_presenter.gd 实施本体;F12 art-bible :433 合并条款 excision 表述订正;F11 补 render_gate 菜单 golden 段与 golden_baseline_refresh.sh --menu;新增 F13(07 两处引述)。自扩标注:契约 5「同批或在先」标卡内推导、契约 6 标仓库纪律成文。卡内可收:契约 5 补卡④中间态条款、§9 第 1 条组帽必撤明写、§9 第 2 条删除面订正(卡④不复用)、V5 ConfirmDialog 多消费方表述、V 表补既有断言族/左列几何/七屏链三项。用户面裁决(裁决 1)零改动。
|
||||
@@ -1,235 +0,0 @@
|
||||
# 需求卡片:存档制数据层改造批(隐式单档 → 3 存档位)· 营地交互重做卡①
|
||||
|
||||
- 版本:**v1.3**(现行身份:零待裁点+含 §7.1 改动—验收对照表〔按 test-conventions §9.3 六列与 §9.8 旧卡开工前补表口径〕。v1.2 裁定:Q1 旧档归属甲〔迁 1 号位,代拍板留痕〕、Q2 交付序列甲〔推荐案,用户令按推荐执行〕;卡④回设计段不影响本卡链路——卡③在工程批内)
|
||||
- 来源:[需求澄清-营地交互重做-2026-10-18.md](需求澄清-营地交互重做-2026-10-18.md)(唯一事实源:④结构树「选档界面:3 存档位,新档/进档/删档」、⑤裁决 2/3/4、⑦切批原则①)+ [存档序列化](../design/gdd/systems/表现与支撑/存档序列化.md) P2 后置条
|
||||
- 归属:数据层承载面(`game/core/save_manager.gd`)——营地交互重做五卡之一;用户可见面由卡③(选档界面)承载
|
||||
- 排期:未编入(2026-10-18 用户令:需求卡片不预占迭代号,批次归属按工作量另裁)
|
||||
- 开工门:U0(用户 `/iter` 发令)+ 待裁点已裁(Q1/Q2 均裁定,见 §10)+ grilling 复核门过
|
||||
|
||||
## 0. 前置依赖与并行性
|
||||
|
||||
- 卡③(选档界面)依赖本卡数据层;卡②(主菜单三入口化)的「进入存档」钮经卡③落到本卡的激活态。
|
||||
- **交付序列待裁(Q2)**:卡③未到位前,全游戏无任何生产激活路径(卡③ 契约 8「进档即激活」是唯一激活入口)——旧入口在无激活态下写盘全被拒,且 `settle_adventure`(meta_progression.gd:275,忽略写盘返回值的写盘在 :282)忽略写盘返回值→进度静默丢失。冒烟探针走 attach_path 隔离不会红,机检放控不住。本卡「可先行」以 Q2 裁甲(与卡③同批或卡③在先)为前提;裁乙/丙须按 Q2 表执行过渡态。
|
||||
- 与在役结构的关系:SaveManager/MetaProgression 已是 autoload(迭代 27 T1 裁点①),本批只改承载面(文件组织与激活态),不改升格结构、不改 autoload 链。
|
||||
|
||||
## 1. 目标与完成定义
|
||||
|
||||
**目标(澄清④照录)**:存档制数据层改造——隐式单档 → 3 存档位(save_manager + 存档格式)。裁决 2「多存档制,**3 个存档位**」;裁决 3「删档:**要**,且必须**二次确认**」;裁决 4「档槽摘要=**钥石余额、通关次数、冒险次数(总局数)**三项,不含未完冒险进度」。
|
||||
|
||||
**相对现状,新增了什么**:
|
||||
1. 三存档位承载与当前激活位(现=单路径单实例,`user://save.json` 一档到底);
|
||||
2. 新档/进档/删档三个数据层原语(删档=档案文件删除+盘面即时生效〔卡内工程规定,非澄清裁决语〕;二次确认弹窗归卡③承载);
|
||||
3. 档槽摘要窥视读器(三项——只读、不激活、不写盘、零副作用);
|
||||
4. 旧档 `user://save.json` 的显式处置(待裁 Q1)。
|
||||
|
||||
**完成定义**(全部满足才算本批完成):
|
||||
1. SaveManagerCore 承载 3 存档位;位间互隔离(读写/删除/坏档兜底均按位);
|
||||
2. 新档/进档/删档原语齐备且断言全绿;摘要三项读器按位正确;
|
||||
3. 启动态钉死:`_ready` 不读任何槽(内存=默认合法空态)、无激活态一切写盘路径拒绝并返回 false、`_path` 不留 `user://save.json` 为隐式写目标;
|
||||
4. 存档格式版本迁移链零破坏(v1→v7 照旧);本批不升 schema 版本——执行中确需新键时按「v6 域后扩列不升版」先例(vision_used,存档序列化.md:108)处理并登记;
|
||||
5. 探针/冒烟隔离面(`attach_path` 与 smoke 注入路径)保留且行为零变化;
|
||||
6. Q1 旧档归属按裁定执行并留痕;
|
||||
7. 批末重闸按改动域选档全绿;三份 `reports/` 产出物写齐(T4)。
|
||||
|
||||
## 2. 现状事实(2026-10-18 实查;开工日 T0 复核行号)
|
||||
|
||||
| # | 事实 | 出处 |
|
||||
|---|---|---|
|
||||
| F1 | 存档唯一实现=JSON 单档:`_path` 默认 `user://save.json`;`_init(path)` 可注入路径(冒烟隔离用);类头注自述「Core 层零 UI 零玩法依赖……禁 preload/import 任何玩法脚本」 | `game/core/save_manager.gd:15`/:21/:1-5 |
|
||||
| F2 | 读写原语齐备:`load_from_disk`(新档/损坏兜底/迁移链/高版本拒读四路)、`write_to_disk`(tmp+rename 原子写;拒读禁写态拒绝)、`_corrupt_fallback`(坏档改名 `.corrupt.bak`)、`attach_path`(换路径+回默认数据+重读盘——迭代 27 T1 探针隔离面;注释明载「对象引用恒定,MetaProgression 持有的 save 引用零失效」) | `save_manager.gd:150-183`/:188-202/:443-450/:42-46/:40-41 |
|
||||
| F3 | 版本与迁移:`SAVE_FORMAT_VERSION := 7`(v7=锻造工坊域 forge_routes);生产迁移链 v1→v7 六件自注册;`_normalize` 缺键补齐+退役域清退 | `save_manager.gd:9`/:25-30/:458-471 |
|
||||
| F4 | 摘要三项的读取源已在役(单档):`keystone_balance()`、`adventure_cleared()`(三关全通才计 1)、`adventure_total()`(开局即计含放弃与失败)——按槽窥视读器=本批 T2 交付物 | `save_manager.gd:214`/:264/:258 |
|
||||
| F5 | SaveManager 为 autoload(工程序 ConfigDB→RngService→SaveManager→MetaProgression);MetaProgression 持有 `var save: SaveManagerCore`,`_ready` 取 `/root/SaveManager` 一次——消费面对存档的引用是单实例单引用;全部访问器为 `save.xxx()` 动态分发、无缓存 | `game/project.godot:21`;`game/core/meta_progression.gd:9`/:21-25/:54 |
|
||||
| F6 | 探针/冒烟隔离机制在役且面比初查大:`_META_SMOKE_PATHS` 注入清单 **18 条**(smoke_all.gd:5697-5704);另有 `user://smoke_save_*` 15 条(:6543-6553)〔T0 行号订正 2026-10-21〕、boot/lifecycle/lifecycle_resume/run_lifecycle 段(:277/:321/:463/:594)、`test_pacing_queue_save`(pacing_queue_test.gd:28)、`smoke_tune_probe_*`(ui_tune_probe.gd:167/:171)、probe tag 族(probe_ui_util.gd:98-121,10 探针 15 处调用);`attach_path` 直接消费 8 处+isolate_save 间接 15 处 | `game/smoke/smoke_all.gd:5697-5704`/:6543-6553 等;`game/smoke/probe_ui_util.gd:98-121` |
|
||||
| F7 | 文档侧早已预写多档去向:存档序列化.md P2 后置表载「多存档槽位|单档 MVP(2026-09-21 裁决);多档等有真实需求再立项」——本批即该条预写的「真实需求」落地;同文 :61 现行口径=「存档是单文件 JSON(user://save.json)」;:20 系统范围负责表载「单档 JSON 存档的域划分与读写约定」 | `design/gdd/systems/表现与支撑/存档序列化.md:165`/:61/:20/:16 |
|
||||
| F8 | 近期闸基线:冒烟 1151/0、单测 51/51(34 套件),载于迭代 30 卡① 合并提交 `7ffd1dc0` 的回执读数(实现报告已退役,git 历史可考);T0 复测(2026-10-21):冒烟 1156/0、单测 35 套件全绿、probe --click 全绿 | git 提交 `7ffd1dc0`(迭代 30 卡① 合并) |
|
||||
|
||||
## 3. 设计契约(红线,违反 = L3 停机呈报)
|
||||
|
||||
🔴 **契约 1 · 三存档位且仅三位**:用户原话「多存档可以让它有三个存档位」——位数写死 3;批内禁以「将来扩位」名义参数化,扩位=新裁点另立。
|
||||
|
||||
🔴 **契约 2 · 位间互隔离**:任一槽位的新建/进入/删除/损坏兜底不得波及其他槽位文件字节;删档只删该槽文件;坏档 `.corrupt.bak` 按槽生成。
|
||||
|
||||
🔴 **契约 3 · 迁移链与版本号零破坏**:`SAVE_FORMAT_VERSION=7` 与 v1→v7 链不动。槽位改造是承载面(文件组织+激活态)改造,不是 schema 改造;每槽档案结构与现行 v7 逐键同构。
|
||||
|
||||
🔴 **契约 4 · 旧档不静默丢失**:现行 `user://save.json` 必须按 Q1 裁定显式处置(迁 1 号位/保留不载/废弃三选一,用户裁);禁无声忽略、禁默认行为。
|
||||
|
||||
🔴 **契约 5 · 摘要三项且仅三项**:钥石余额/通关次数/冒险总局数;禁在摘要面露出未完冒险进度(裁决 4 明示「不需要显示有无未完成的冒险;只要我提到的那三个就够了」)。
|
||||
|
||||
🔴 **契约 6 · 消费面纪律不破**:其他系统只经 SaveManager 类型化访问器操作存档(存档序列化.md 消费面纪律);切槽=**同一 autoload 实例内 `_data` 与路径整体替换**(attach_path 先例:对象引用恒定,`save_manager.gd:40-41`)——禁每槽实例化+换 `MetaProgression.save` 引用(`_ready` 一次捕获会静默过期),禁 SaveManager 回写 MetaProgression.save;写盘目标=当前激活槽文件,无激活态时一切写盘路径拒绝并返回 false;「凡钥石发生变动的时刻都要落盘」纪律按位保持(存档序列化.md:121)。
|
||||
|
||||
🔴 **契约 7 · 测试隔离面保留**:`attach_path` 与 smoke 注入路径机制原样保留——槽位化后探针仍能隔离到单槽;单路径语义定义为「注入路径=激活槽文件(无激活态时注入即激活并重读)」,既有调用面零改;测试执行两入口铁规不破。若 §9 第 1 条选定单文件三键致该语义不可守,本契约显式降格为「最小改+探针修改清单留痕」并呈报(L3)。
|
||||
|
||||
🔴 **契约 8 · 删档原语正确性**:删除后该槽回合法空态(新档合法态=全零可玩,`_default_data` 纪律)、文件不在盘、无 `.tmp` 残留;删档的玩家侧必经二次确认(裁决 3,弹窗归卡③),本卡只保证原语正确;删激活槽时激活指针连清除(该槽不再可写)。
|
||||
|
||||
🔴 **契约 9 · 窥视读器三态**:可读槽=摘要三项零副作用;**不可读槽(损坏/高版本/缺版本字段)=显式损坏标记返回,禁触发 `_corrupt_fallback` 改名副作用**(窥视只读零副作用——.corrupt.bak 改名只发生在正式进档路径);`.tmp` 残留按空槽处理。坏档/高版本槽在选档面的呈现与操作集=卡③ Q2(第三态),两卡接口在各自 T0 对齐。
|
||||
|
||||
## 4. 范围边界
|
||||
|
||||
**做**:三槽承载(路径派生/当前激活位/激活与切位 API);新档/进档/删档原语;摘要三项窥视读器;旧档按 Q1 处置;断言批(冒烟+单测);反哺点清单。
|
||||
|
||||
**不做**(明示去向):
|
||||
- 选档界面 UI、删档二次确认弹窗 → 卡③;
|
||||
- 主菜单砍钮 → 卡②;营地场景图 → 卡④;ESC 浮窗与营地顶栏 → 卡⑤;
|
||||
- 存档内容域口径(钥石怎么得、摘要记什么)→ 各 owner 文档(元进度/冒险结构/生涯),本批只承载不定义(存档序列化.md 系统范围纪律);
|
||||
- schema 升版(确需新键时按先例登记,不主动升);
|
||||
- 重裁多档策略本身(裁决 2 已裁三位)。
|
||||
|
||||
## 5. 关联文档同步面
|
||||
|
||||
> **v1.3 口径(2026-10-17 文档同步闸 v3)**:本批是代码实现批,禁写 `design/` 整目录与根规则文件,唯一可写目录 = `reports/`。下表「同步义务」一律执行为「列进 `reports/iter<N>-反哺点-<完成日>.md`:哪个文件哪一节、改成什么、依据,用户会话裁决后归文档批落文」。
|
||||
|
||||
| 文档 | 关联点(本批实现会改变它的哪条陈述) | 同步义务 |
|
||||
|---|---|---|
|
||||
| `design/gdd/systems/表现与支撑/存档序列化.md` | :61「存档是单文件 JSON(user://save.json)」→ 三槽承载;:20/:16 系统范围「单档 JSON 存档」;:165 P2 后置「多存档槽位|单档 MVP……多档等有真实需求再立项」——本批即该真实需求 | 反哺点 · 单文件→三槽口径改写+P2 条注销(去向=本批) |
|
||||
| `待办清单.md`(仓库根,流水线唯一登记处) | 本卡登记条(卡片名/文件指针/状态) | 反哺点 · 列清单 |
|
||||
| `roadmap.md` | 迭代行编入笔与批内状态刷新 | 反哺点 · 列清单 |
|
||||
| `game/core/save_manager.gd`、`game/core/meta_progression.gd` | 承载面改造本体 | 实施本体(可写) |
|
||||
| `game/smoke/*`、`game/tests/*` | 断言与隔离面 | 实施本体(可写) |
|
||||
|
||||
## 6. 任务卡
|
||||
|
||||
> 估时按 Claude 工作日口径;每卡出口自跑轻闸;开工日 T0 复核本卡全部行号。
|
||||
|
||||
### 6.0 落位与可复用性预检(req-card 必备结构第 12 项,定义 T 卡前置)
|
||||
|
||||
盘上普查(2026-10-21 实查,开工日 T0 复核):`user://save` 全仓命中 12 处——`save_manager.gd:15`/`:21` 是默认路径与注释,其余十处全是探针隔离纪律注释(`probe_ui_util.gd:89`、`screen_flow_probe.gd:23`、`smoke_all.gd:272`/`:588`/`:5696`/`:6539`、`ui_click_probe.gd:53`、`ui_input_probe.gd:30`、`ui_probe.gd:24`、`verifier_batch.gd:19`),**盘上不存在第二处存档路径派生**;`slot` 词已被同调位占用(`attunement.gd:10 static func slots(db, save)`、`config_db.gd:273`、`treasure_items.gd:56-57`)。
|
||||
|
||||
| 新增件 | 复用面(既有实现) | 为什么不能整件复用 | 唯一落点 | 跨层出口 |
|
||||
|---|---|---|---|---|
|
||||
| 三槽路径派生与槽位枚举 | 无同类实现可复用(普查见上,现承载面只有单 `_path`) | 新内容本身 | 只落 `save_manager.gd:15`/`:21` 承载面一处;探针面禁各自拼槽文件名,仍走注入口 | Core 层零 UI,禁 preload 玩法脚本(类头注 `:1-5`) |
|
||||
| 激活位的设置/读取/清除 | `attach_path()`(`:42-46`)的「换路径+回默认数据+重读、对象引用恒定」正是切槽要复用的动作 | 该函数不带「哪一位被激活」的状态语义,需在其上加状态量而非另写一套换盘逻辑 | 激活态唯一在 SaveManagerCore 内存态;Q1 甲=不落盘,禁在 `meta_progression.gd` 或呈现层另记第二份 | 消费面经 `MetaProgression.save` 动态分发(`meta_progression.gd:21-25`/`:54`),禁回写引用(契约 6) |
|
||||
| 新档/进档/删档三原语 | 读盘迁移链 `load_from_disk`(`:150-183`)、原子写 `write_to_disk`(`:188-202`)、坏档兜底 `_corrupt_fallback`(`:443-450`)、空态 `_default_data`——三原语=按槽复用这些件 | 现件全部单路径语义,需按槽参数化,不是重写 | 文件删除只落承载面,呈现层禁 `DirAccess` 直删 | 玩家侧二次确认弹窗归卡③,本卡只出原语 |
|
||||
| 摘要三项按槽窥视读器 | 读源访问器在役:`keystone_balance()`(`:214`)、`adventure_total()`(`:258`)、`adventure_cleared()`(`:264`) | 现访问器读内存 `_data`(即激活态),窥视要按槽直读文件且零副作用(契约 9) | 三项口径唯一在本卡;卡③ 视图禁自算或加第四项(契约 5) | 只返回结构体,不带 UI 语义 |
|
||||
| 三个新单元套件(`game/tests/unit/core/save_slot_*_test.gd`) | 既有 `test_kit.gd` 断言出口与 `unit/core/` 12 套件分层;存档往返先例 `game/tests/integration/save_rng_roundtrip_test.gd` | 既有件只证单实例单路径,位间隔离/启动态/跨槽摘要无对应件 | 一职责一文件、落 `unit/core` 与既有分层一致;禁把断言散写进 `smoke_all.gd`(该文件拆分在册=待办清单工程债第 6 条) | `game/tests/run_all.gd` 真实入口 |
|
||||
| 承载面文件本体不拆 | `save_manager.gd` 现 481 行,本批改动集中于同一承载面 | — | 判据=req-card「库内大文件不擅自拆」;拆分归工程债批 | — |
|
||||
|
||||
标识符纪律:本批新增 API 词族取 `save_slot_*`/`activate_*`/`peek_*`,**禁复用裸名 `slots`**(同调位已占,`attunement.gd:10`),命名细节仍属 §9 第 3 条代拍板域。
|
||||
|
||||
### T0 事实坐实与裁点执行(≈0.5–1d)
|
||||
|
||||
- 复核 §2 全部行号与读数,漂移即订正本卡;
|
||||
- Q1 旧档归属裁定执行(迁/留/废弃的动作落地,实现报告留痕);执行前置检查逐项过(见 §10 Q1 表「执行前置」行);
|
||||
- 槽位存储机制与启动激活态按 §9 代拍板拍板(启动激活态的玩家侧行为以卡③ Q1 裁定为约束);
|
||||
- **隔离面全清单清点**(v1.1 补):`_META_SMOKE_PATHS` 18 条+`smoke_save_*` 15 条+boot/lifecycle 四段+pacing_queue/tune_probe 两条+probe tag 族 15 处+`attach_path` 8 处直接消费+presenter lambda 注入面(main.gd:317)——逐点确认三槽化后仍可隔离到单槽,判定准则=契约 7 单路径语义;清点结果写成文(T0 产物),漏口恰是卡④要迁的探针面;
|
||||
- 与卡③ T0 互列对齐:窥视读器签名/命名/返回结构/空槽与坏槽表示法(契约 9 三态)。
|
||||
|
||||
### T1 三槽位承载(≈1–1.5d)
|
||||
|
||||
- 槽位路径派生与三槽枚举(存储机制按 §9:三文件 vs 单文件三键——硬约束=每槽档案结构与现行 v7 同构、迁移链按槽独立成立、坏档兜底按槽;**槽 1 文件名禁复用 `user://save.json`**(Q1 乙案前提,防旧档被新流程误读));
|
||||
- 当前激活位:设置/读取/清除;激活切换=同一实例内 `_data` 与路径整体替换(契约 6,attach_path 先例);
|
||||
- **启动态钉死**(v1.1 补):`_ready` 不读任何槽(`_data`=默认合法空态);无激活态一切写盘路径拒绝并返回 false;`_path` 不留 `user://save.json` 为隐式写目标。启动行为「不隐式激活」的条件表述=卡③ Q1 裁甲/乙-预选时的默认实现;**裁乙-一键直入则本段随裁定改写**(卡③ Q1 连带,本卡不自定);
|
||||
- 无激活态时访问器 fail-safe(返回合法空态/拒绝写,禁崩禁误写——同未知计数键先例,meta_progression.gd:54)。
|
||||
|
||||
### T2 档操作原语(≈1d)
|
||||
|
||||
- 新档:空槽创建=合法白板态(`_default_data` 全零可玩纪律);
|
||||
- 进档:激活+读盘(复用 `load_from_disk` 迁移/兜底链,按槽成立);
|
||||
- 删档:文件删除+该槽回合法空态+无 `.tmp` 残留+激活指针连清除(契约 8);「盘面即时生效」为卡内工程规定(挪用现役断点覆盖流注释语义,非澄清裁决语);
|
||||
- 摘要三项窥视读器:钥石余额/通关次数/冒险总局数——只读、不激活、不写盘;空槽摘要=零值合法态;坏槽按契约 9 返回显式损坏标记;
|
||||
- 写盘目标=当前激活槽文件(契约 6);激活标记自身落盘时机与 §9 第 2 条同一拍板(切槽即时写 or 进档时写)。
|
||||
|
||||
### T3 断言批(≈1.5–2d)
|
||||
|
||||
- 冒烟:三槽各自写入非默认值→写盘→新实例按位读回逐域相等(往返一致×3);删档后文件不在盘+该槽空态+激活指针清除;坏档按槽兜底;高版本拒读禁写按槽;迁移链 v1→v7 **各槽**成立(三槽各喂旧版本档→各读回相等——既有段只证单实例,本批补各槽断言);窥视三态(可读/坏/高版本)零副作用(窥视前后坏槽文件字节与 mtime 不变);
|
||||
- 单测(`game/tests/`):摘要三读器跨槽读数正确;位间隔离(改 A 槽、B 槽字节不动);`attach_path` 隔离到单槽的行为保持;
|
||||
- **启动态断言**(v1.1 补,原缺):boot 后无激活态(无激活访问器返回合法空态、写盘被拒);既有 boot 链 V2d-1(续玩钮恒隐)在新启动态下的处置显式化(改写为「boot 态续玩钮恒隐」或注明由卡② V2 改写时注销——禁判据空转);
|
||||
- **旧档处置机检**(v1.1 补,原仅件核):按 Q1 裁定案补——甲=迁移前后逐域相等+槽 2/3 空+旧档处置字节留痕;乙=旧文件字节不动;丙=旧文件按定处置;
|
||||
- **变异验证伴生**(新断言段逐条定注入实验):切槽写成只换路径不换数据(预期位间串味断言红)、删档漏删文件(预期在盘断言红)、摘要读激活位代替窥视位(预期跨槽摘要红)、`_ready` 偷复激活(预期 boot 断言红)、切槽后写盘落错槽(预期位间隔离断言红);实现期逐条执行「注入→最窄闸见红→`git checkout` 精确还原→记录」,记录表进实现报告。
|
||||
|
||||
### T4 产出物落位卡(≈0.5d,末卡——三份 `reports/` 文件写齐才算收口)
|
||||
|
||||
轻闸全绿后、合并前:`reports/iter<N>-实现报告-<完成日>.md`(各卡状态+变异验证记录表+**实际改动—验收对照表**〔§7.1 需求侧表的执行对账,另加「结果」格,test-conventions §9.3〕)/`reports/iter<N>-代拍板追认单-<完成日>.md`(§9 白名单内代拍项留痕)/`reports/iter<N>-反哺点-<完成日>.md`(§5 每条一落点)。**合并前置**:独立验收审计(§7.1 末段声明)完成且 `reports/iter<N>-验收审计-<完成日>.md` 逐行「通过」——未通过不得合并,缺漏项回炉对应 T 卡。
|
||||
|
||||
**估时合计 ≈4.5–5.5d**(v1.1 上调:隔离面全清单+启动态/窥视三态断言增量)。切分预案:T1/T2 后可切(承载层先落、操作原语后落)——但本卡零用户可见面,切分价值低,建议单批跑完。
|
||||
|
||||
## 7. 验证闸(逐需求点验收清单)
|
||||
|
||||
| # | 需求点 | 测什么 | 落点/判定手段 |
|
||||
|---|---|---|---|
|
||||
| V1 | 三存档位+启动态 | 三槽独立承载、位间零串扰;boot 后无激活态、无激活写盘被拒 | 冒烟往返一致×3+启动态断言+单测位间隔离 |
|
||||
| V2 | 新档 | 空槽创建=全零可玩合法态 | 冒烟(`_default_data` 纪律同款) |
|
||||
| V3 | 进档 | 激活+读回=该槽内容 | 冒烟 |
|
||||
| V4 | 删档 | 删后文件不在盘+槽回空态+激活指针清除+他槽零影响 | 冒烟+文件系统断言 |
|
||||
| V5 | 摘要三项 | 钥石余额/通关次数/冒险总局数按位正确;空槽零值;坏槽损坏标记;窥视前后文件字节/mtime 不变 | 单测+冒烟(判定手段写死:字节+mtime 双比对) |
|
||||
| V6 | 迁移链零破坏 | v1→v7 链在各槽成立(三槽各喂旧版本档);既有断言不破 | 冒烟既有迁移段复跑+各槽新断言 |
|
||||
| V7 | 隔离面保留 | `attach_path`/注入路径机制行为不变(18+15+族清单逐点) | 既有冒烟/探针复跑+T0 清点件核 |
|
||||
| V8 | 旧档处置 | Q1 裁定执行+机检(甲=逐域相等留痕/乙=字节不动/丙=按定处置) | 冒烟/单测按裁定案+件核 |
|
||||
| V9 | 反哺点清单 | §5 每条有落点 | 件核对表 |
|
||||
|
||||
**测试方式两分法(2026-10-11 用户定)**:V1–V8 机检自动化;能力验证可经调试接口直改槽位/钥石状态(沿用现役 DebugOverlay/DS_DEBUG 门控,不走正常资源积累流程)。**本卡零用户目检项**(无用户可见面)——选档界面目检归卡③ V 表。
|
||||
|
||||
**闸口径**:轻闸每任务卡出口自跑;批末重闸 = `tools/run_all_gates.sh` 按改动域选档(本批只碰 `game/` 代码与断言面 → `--code`)全绿才合并;MC 零跑(零数值零行为——纯承载改造,同板同序列结算逐位一致由既有 parity 面承接)。
|
||||
|
||||
### 7.1 改动—验收对照表(test-conventions §9.3 六列;§7 的 V 号在各需求点格内括注)
|
||||
|
||||
> 断言尾缀族=〔sv#〕,实现期逐条 grep 定位。落点文件为计划落点,实现期在 `reports/iter33-实现报告-<完成日>.md` 的实际对照表里按真实行号对账(§9.3 双端对上:正向每需求点一行、反向每行为改动一行、测试侧每条新断言挂一行)。层级取值见 §9.2 四层。
|
||||
|
||||
| 需求点 | 改动(文件:行/行为) | 验收测试(名称+落点+尾缀) | 层级 | 真实入口 | 撤销或变异证明 |
|
||||
|---|---|---|---|---|---|
|
||||
| sv1 三槽承载+位间隔离(契约1/2、V1、T1) | `game/core/save_manager.gd:15` `var _path` 单路径 → 三槽路径派生+当前激活位字段(机制取 §9 第 1 条) | 冒烟 `save_slot_roundtrip`〔sv1〕落 `game/smoke/smoke_all.gd` + 单元 `game/tests/unit/core/save_slot_isolation_test.gd`〔sv1〕 | 接口 | `SaveManagerCore` 实例的按槽 API 读写往返,不经 UI | 变异=三槽路径派生写成同一文件 → 三槽往返一致断言红(T3 变异①) |
|
||||
| sv2 启动态不读盘(完成定义3、V1、T1) | `save_manager.gd:21` `_init` 默认参 `"user://save.json"` 取消+初态 `_data`=`_default_data` | 单元 `game/tests/unit/core/save_boot_no_activate_test.gd` boot 三断言〔sv2〕 | 单元 | 组合根 boot 链起的 `/root/SaveManager`(`game/project.godot:21` autoload 序) | 变异=`_ready` 内偷调 `load_from_disk` → boot 断言红(T3 变异④) |
|
||||
| sv3 无激活态写盘一律拒绝并返回 false(契约6、V1、T1/T2) | `save_manager.gd:188-202` `write_to_disk` 入口加激活态判定 | 单元〔sv3〕「拒写+返 false+盘面无新文件」三断言,同上落点 | 接口 | `MetaProgression.settle_adventure()`(`meta_progression.gd:275`,写盘 :282)无激活态触达写盘 | 撤销=去掉判定放行旧入口 → 拒写断言红 |
|
||||
| sv4 新档原语(完成定义2、V2、T2) | 新增空槽创建,初值取 `_default_data` 全零可玩纪律 | 冒烟段〔sv4〕落 `smoke_all.gd` 新档子段 | 接口 | 空槽调新档 API 后按域读回 | 变异=新档写成读旧档 → 全零可玩断言红 |
|
||||
| sv5 进档原语(V3、T2) | 进档=激活+读盘,复用 `load_from_disk`(`save_manager.gd:150-183`)按槽成立 | 冒烟段〔sv5〕 | 接口 | 槽 N 有档 → 进档 API → 读回=该槽档案内容 | 变异=进档只置激活指针不读盘 → 读回断言红 |
|
||||
| sv6 删档原语(契约8、V4、T2) | 新增删除:文件删除+该槽回合法空态+激活指针连清除+无 `.tmp` 残留 | 冒烟段〔sv6〕含文件系统存在性断言 | 集成 | 激活槽调删档 API,再经访问器读该槽+盘面核查 | 变异=漏删文件 → 在盘断言红(T3 变异②) |
|
||||
| sv7 摘要三项按槽窥视(契约5、V5、T2) | 新增按槽窥视读器,读源=`keystone_balance()`/`adventure_cleared()`/`adventure_total()`(`save_manager.gd:214`/`:264`/`:258`) | 单元 `game/tests/unit/core/save_slot_summary_test.gd`〔sv7〕三槽异值+空槽零值 | 单元 | 窥视 API 按槽调用(不激活不写盘) | 变异=摘要读激活位代替窥视位 → 跨槽摘要红(T3 变异③) |
|
||||
| sv8 窥视三态零副作用(契约9、V5、T2) | 窥视对损坏/高版本槽返回显式损坏标记,禁触发 `_corrupt_fallback`(`:443-450`)改名 | 冒烟段〔sv8〕窥视前后文件字节与 mtime 双比对 | 接口 | 盘上坏槽夹具 → 窥视 API | 变异=窥视改走正式 load 路径 → 字节/mtime 断言红 |
|
||||
| sv9 迁移链各槽成立(契约3、V6、T1/T3) | v1→v7 六件迁移链(`:25-30` 自注册)不动,执行面按槽独立成立 | 冒烟段〔sv9〕三槽各喂旧版本档→各读回相等 | 接口 | 各槽 `load_from_disk` | 变异=迁移只跑激活槽 → 他槽读回断言红 |
|
||||
| sv10 切槽=同实例整体换 `_data` 与路径(契约6、V1、T1) | 激活切换取 `attach_path` 先例(`:42-46`);`MetaProgression.save` 引用(`meta_progression.gd:21-25`/`:54`)禁换实例 | 单元〔sv10〕切槽前后引用同一性+写盘落当前槽 | 集成 | `MetaProgression` 真实宿主链驱动切槽 | 变异=切槽新建实例 → 同一性断言红;写成落错槽 → 位间隔离断言红(T3 变异⑤) |
|
||||
| sv11 测试隔离面保留(契约7、V7、T0/T3) | `attach_path` 与注入路径语义钉为「注入=激活槽文件,无激活态时注入即激活并重读」——`smoke_all.gd:5697-5704` 18 条、`:6543-6553` 15 条、`probe_ui_util.gd:98-121` tag 族行为零变化 | 既有冒烟/探针段全数复跑〔sv11〕+T0 隔离面清点成文件核 | 集成 | 各探针 `isolate_save()` 与 `attach_path` 现有调用面 | 撤销=注入路径改成忽略 → 依赖隔离的既有断言成片红(成片红即本行证明) |
|
||||
| sv12 旧档处置 Q1 甲(契约4、V8、T0) | 首次启动把 `user://save.json` 原样迁入槽 1;幂等=槽 1 已存在不重迁;旧档处置按 §10 Q1「执行前置检查」列逐项 | 冒烟段〔sv12〕迁移前后逐域相等+槽 2/3 空+处置字节留痕件核 | 接口 | 盘上放旧档夹具跑启动链迁移 | 变异=去掉幂等判据 → 二次启动重复迁移断言红;损坏+高版本叠加等意外形态路由 §8 L3 呈报 |
|
||||
| sv13 不升 schema 版本(契约3、完成定义4)——非行为改动 | `SAVE_FORMAT_VERSION := 7`(`:9`)与 `_normalize`(`:458-471`)零改动;确需新键按「v6 域后扩列不升版」先例登记 | 既有版本与高版本拒读断言复跑〔sv13〕 | 单元 | 既有冒烟版本段 | 判断依据=本行不改任何行为;撤销它=升版即撞既有高版本拒读断言(该断言已由 sv9 面钉住) |
|
||||
| sv14 反哺点清单(V9)——非行为改动 | §5 所列文档陈述(存档序列化.md `:61`/`:20`/`:165` 等)随实现换代,本批只列点不落文 | 件核对表〔sv14〕落 `reports/iter33-反哺点-<完成日>.md` | 件核 | 收口前逐条指认落点 | 判断依据=产出物件核不产码;§5 任一条缺落点即 T4 收口不过 |
|
||||
|
||||
**测试削弱申报(test-conventions §9.5)**:本卡允许改写的既有断言=boot 链 V2d-1(续玩钮恒隐)——按 T3 明列处置改写为「boot 态续玩钮恒隐」或注明由卡② V2 改写承接,禁判据空转;sv11 清单内既有段只许复跑不许动。除本段申报,实现期任何删除断言、放宽阈值、缩小扫描面、换下层直调,由独立验收审计判红。
|
||||
|
||||
**独立验收审计(test-conventions §9.7)**:合并前由未参与实现的迭代 loop 内子代理(或用户点名会话)审计——只读本卡、实现报告实际对照表、diff 与测试文件,自跑最窄测试抽查,不采信「已全绿」;审计报告落 `reports/iter33-验收审计-<完成日>.md`,逐行写「通过/缺漏/例外及依据」。**审计未通过不得合并**(T4 合并前置)。
|
||||
|
||||
## 8. 异常分级
|
||||
|
||||
- **L1(自救)**:断言写法、命名、文件落点。
|
||||
- **L2(记录继续)**:存储机制细节(三文件 vs 单文件三键,§9 域内)、激活态内存换栈写法、摘要窥视读器的缓存细节、激活标记落盘时机。
|
||||
- **L3(停机呈报)**:槽位化与现行 autoload 生命周期不可兼容且修复超出承载面;Q1 执行中发现旧档结构意外(损坏+高版本叠加等)需用户裁;任何触碰 `SAVE_FORMAT_VERSION`/迁移链的诉求;§9 第 1 条选单文件三键致契约 7 不可守(隔离面须改)。
|
||||
|
||||
## 9. 代拍板白名单(超清单必呈报)
|
||||
|
||||
1. 槽位存储机制与文件命名(三文件 `user://save_slot_N.json` vs 单文件三键+激活索引)——约束:每槽结构与现行 v7 同构、迁移链按槽成立、坏档兜底按槽、**槽 1 文件名禁复用 `user://save.json`**。
|
||||
2. 启动激活态的数据层机制(激活位持久化位置)——约束:玩家侧行为以卡③ Q1 裁定为准;**仅卡③ Q1 裁乙才需持久化,裁甲则作废**(连同卡③ 契约 8 父注一并按裁定回写)。
|
||||
3. 类 API 命名(槽位/激活/窥视词族)与文件落点。
|
||||
4. 删档边界(激活态槽可删性)——约束:禁崩禁误写,删后回合法空态+激活指针连清除;激活态生命周期终点=持续至显式清除/进程结束/该槽被删,**回主菜单不清除**(卡③ Q1 乙案「记忆上次激活槽」读持久化点而非内存态)。
|
||||
5. 提交切分与 worktree 分支命名。
|
||||
|
||||
## 10. 待裁点
|
||||
|
||||
### Q1 · 旧档 `user://save.json` 的归属(必裁,未裁不开工)
|
||||
|
||||
**背景**:现行单档在开发机可能已有进度(钥石/天赋树/锻造/断点等)。槽位化后旧档必须有明确去向。三案并列,**无推荐**(用户令:不代裁):
|
||||
|
||||
| 案 | 内容 | 代价 | 执行前置检查 |
|
||||
|---|---|---|---|
|
||||
| 甲 | 迁为 1 号存档位:首次启动一次性迁移,v7 结构原样落入槽 1,槽 2/3 空 | 一次性迁移代码+迁移失败兜底面 | 旧档不存在=无操作(陈明);旧档损坏/高版本=「原样落入槽 1」承诺失效,路由 §8 L3 呈报;迁移后 `user://save.json` 处置(删/改名留痕)+幂等判据(槽 1 已存在不重迁)须在实现报告写明 |
|
||||
| 乙 | 原样保留、不自动加载:旧文件留盘但新流程不读,自行处置 | 旧档成孤儿文件——盘面出现「看得见拿不到」的档 | 槽 1 文件名禁复用 `user://save.json`(否则「不自动加载」落空);.tmp 残留清理或陈明 |
|
||||
| 丙 | 开发阶段破坏性废弃:按迭代 21 T5 树域废弃先例(禁迁移禁折算)弃旧档,从空三槽开始 | 开发机现有进度全清 | 旧文件按定处置(删/归档)写明 |
|
||||
|
||||
裁决方式:随卡片评审一并定案;裁定落 T0 执行+实现报告留痕。
|
||||
|
||||
**裁定(2026-10-18)**:**甲**——迁 1 号存档位。代拍板留痕(用户令「事项按推荐的来」,本项无推荐案,取默认甲=不丢开发机进度;追认单可 veto)。执行按「执行前置检查」列逐项过,迁移后旧档处置与幂等判据写实现报告。
|
||||
|
||||
### Q2 · 交付序列:本卡可否先于卡③落地(必裁,未裁不定排期)
|
||||
|
||||
**背景**:见 §0。卡③未到位前无生产激活入口;旧入口在无激活态下写盘全被拒且 `settle_adventure` 忽略写盘返回值(meta_progression.gd:275,写盘 :282)→进度静默丢失;冒烟探针走隔离路径不会红,机检放控不住。
|
||||
|
||||
| 案 | 内容 | 代价 |
|
||||
|---|---|---|
|
||||
| 甲(推荐) | 与卡③同批交付或卡③在先(改 §0「可先行」表述,仿卡② 契约 5 硬依赖先例) | 排期自由度下降 |
|
||||
| 乙 | 批内留临时隐式激活:旧入口首次触达存档时激活槽 1,卡③到位后摘除留痕 | 临时代码+摘除时的二次验证面 |
|
||||
| 丙 | 接受中间态:登记 L2 已知缺口(激活入口真空),合入前呈报用户知晓 | 中间态进度丢失风险靠用户知情兜底 |
|
||||
|
||||
裁决方式:随卡片评审定案;裁甲则 §0 改写,裁乙/丙则按表执行并在实现报告「已知缺口」节登记。
|
||||
|
||||
**裁定(2026-10-18)**:**甲**——与卡③同批交付或卡③在先(推荐案,用户令按推荐执行)。§0「可先行」表述按裁甲维持;卡④(2026-10-18 回设计段)不影响本链路——卡③在工程批内,激活入口不真空。
|
||||
|
||||
---
|
||||
|
||||
**审查回写要点**:v1.0→v1.1(2026-10-18 grilling 子 Agent 对抗审查回写)——事实订正:F6 注入路径 6→18 条并补全清单面、F8 出处改引 iter30 实现报告、F7 行号 :16→:20;启动激活态闭环:_ready 初态钉死(T1/完成定义 3)、切槽实例同一性(契约 6)、写盘目标与无激活拒绝(契约 6/T2);新增契约 9 窥视三态;S-1「启动不隐式激活」降格条件化、S-2「盘面即时生效」标卡内工程规定;隔离面清点扩为全清单(T0);Q1 补执行前置检查列;验收补启动态/各槽迁移/旧档机检三类断言与两类变异注入;新增待裁点 Q2 交付序列。用户面裁决(裁决 2/3/4)零改动。
|
||||
@@ -1,246 +0,0 @@
|
||||
# 需求卡片:选档界面新建批(3 存档位 · 新档/进档/删档)· 营地交互重做卡③
|
||||
|
||||
- 版本:**v1.3**(现行身份:零待裁点+含 §7.1 改动—验收对照表〔按 test-conventions §9.3 六列与 §9.8 旧卡开工前补表口径〕+§7.2 测试削弱申报。裁定记录:Q1 甲〔每轮回选档;本项无推荐案,取默认甲代拍板留痕、追认单可 veto〕、Q2 甲〔坏槽按空槽,推荐案〕、Q3 乙〔进档暂行接现役 CampOverlay,卡④回设计段迫使〕;契约 3 的本批形态按 §9 第 6 条钉在双钮+消费方编排上;用户面裁决照录澄清文档不变)
|
||||
- 来源:[需求澄清-营地交互重做-2026-10-18.md](需求澄清-营地交互重做-2026-10-18.md)(唯一事实源:④结构树「选档界面(完全没有 · 新建):3 存档位,新档/进档/删档」、⑤裁决 2/3/4、⑦切批原则③)
|
||||
- 归属:呈现层/组合根(`game/presentation/`)——营地交互重做五卡之三
|
||||
- 排期:未编入(2026-10-18 用户令:需求卡片不预占迭代号,批次归属按工作量另裁)
|
||||
- 开工门:U0(用户 `/iter` 发令)+ 待裁点已裁(Q1/Q2/Q3 均裁定,见 §10)+ grilling 复核门过
|
||||
|
||||
## 0. 前置依赖与并行性
|
||||
|
||||
- 前置卡①(存档制数据层改造批):三槽承载、新档/进档/删档原语、摘要三项窥视读器——本卡只做界面与接线,不碰数据层实现。
|
||||
- 后接卡④(营地场景图):进档/新档的落点。**卡④已于 2026-10-21 用户令退回美术设计段**(美术轨凭据缺 P1–P5 未销号,现卡 v2.3 非有效卡——见卡④ 卡头回退声明),故 Q3 裁定乙:本卡随①②③工程批先行时,进档/新档**暂行接现役 CampOverlay**(现役在役面,复用合法,非「发明占位」),卡④设计定稿重新立卡后改挂场景图(卡④ T3 承载)。
|
||||
- 卡②(主菜单三入口化)的「进入存档」钮以本卡为落点,两卡硬耦合(卡② 契约 5:同批或卡③在先)。
|
||||
- 卡⑤(ESC 浮窗)在本卡语境不响应(卡⑤ 契约 2:ESC 范围=营地语境)——选档语境的键盘行为零裁定、零实现。
|
||||
|
||||
## 1. 目标与完成定义
|
||||
|
||||
**目标(澄清④照录)**:新建选档界面——3 存档位,新档/进档/删档。裁决 2「多存档制,3 个存档位」;裁决 3「删档:要,且必须二次确认」;裁决 4「档槽摘要=钥石余额、通关次数、冒险次数(总局数)三项,不含未完冒险进度」。
|
||||
|
||||
**相对现状,新增了什么**:选档界面整体(澄清④判定「完全没有 · 新建」)——三槽呈现+摘要三项+空/有档操作集+删档二次确认链+进档激活接线。
|
||||
|
||||
**完成定义**:
|
||||
1. 选档界面经「进入存档」钮可达,呈现 3 个存档位;
|
||||
2. 每槽摘要=钥石余额/通关次数/冒险总局数三项;空槽=合法零值态;坏槽/高版本槽按 Q2 裁定呈现;**摘要面无未完冒险进度**(裁决 4);
|
||||
3. 空槽可新档(创建=激活=**暂行接现役 CampOverlay**——卡④回设计段,Q3 裁定乙);有档槽可进档(激活该档=暂行接现役 CampOverlay);
|
||||
4. 删档必经二次确认(裁决 3):第一次点击只出确认窗,确认才删、取消不删;删后该槽回空态;
|
||||
5. 新屏/新层入 `LAYER_CONTRACT`(层序纪律),冒烟合同断言绿;
|
||||
6. 批末重闸按改动域选档全绿;三份 `reports/` 产出物写齐(T4)。
|
||||
|
||||
## 2. 现状事实(2026-10-18 实查;开工日 T0 复核行号)
|
||||
|
||||
| # | 事实 | 出处 |
|
||||
|---|---|---|
|
||||
| F1 | 选档界面完全不存在(澄清④判定);现主菜单直接进营地/生涯/冒险,无存档语境选择面 | `需求澄清-营地交互重做-2026-10-18.md` §④ |
|
||||
| F2 | 通用确认弹窗在役:`ConfirmDialog.open(text, confirm_label, cancel_label)` 双钮外发 `confirmed/cancelled`(**信号零 payload、无调用方标识**),零业务触碰;现役唯一生产消费=组合根静态常驻接线;打开走 `confirm_dialog.open()` **直开,不经 `_open_modal`**(全仓唯一绕栈模态) | `game/presentation/views/confirm_dialog.gd:36-38`/:7-8/:55-60;`main.gd:347-348`/:480 |
|
||||
| F3 | 全屏页壳先例在役:`UiKit.page_shell`(暖亮底+石纹+暗角+56px 通栏顶条+内容列),生涯页即此形制(直开直关零动效;页壳自带「返回」钮) | `game/presentation/views/career_overlay.gd:18-31`/:62-72 |
|
||||
| F4 | 钥石徽工厂件在役:`UiKit.keystone_badge`(状态面板/生涯页/营地三处消费先例;迭代 17 卡③ Q10 甲工厂化) | `career_overlay.gd:54`;`camp_overlay_view.gd:82`;`status_panel` 同族 |
|
||||
| F5 | 层序唯一事实源=`main.gd` `LAYER_CONTRACT`(16 层+float 类),`_apply_layer_contract` 为全仓唯一落位口;冒烟 V1d 源码断言判红散落 `move_child` | `main.gd:34-53`/:430-455;`smoke_all.gd:146-154` |
|
||||
| F6 | 模态栈单口在役:`_open_modal`/`_close_modal`(登记层开合一律走栈;T3 收口批纪律) | `main.gd:458-462` |
|
||||
| F7 | 摘要三项读源:现役访问器(`keystone_balance`/`adventure_total`/`adventure_cleared`;卡① 合并后 :385/:429/:435〔T0 订正 2026-10-22,成文时 :214/258/264〕)+**按槽窥视读器=卡① 已交付**(`peek_slot_summary` :164,含 `has_file` 位——T0 对齐补充);「通关次数」口径=**通关局数 `adventure_cleared`**(同生涯页行,卡① F4 已锁——禁与「各关通关次数 clear_count」混义) | `save_manager.gd:385`/:429/:435/:164;卡① §6 T2 |
|
||||
| F8 | UI 公共件纪律先例(迭代 17 卡③):「复用现行公共件与色板,零新素材零新色值」——本卡同类批,照此执行 | `roadmap.md` 迭代 17 ③行 |
|
||||
|
||||
**T0 对齐结论(2026-10-21,卡① 实测交付形态,消契约 9 落空项)**:窥视读器=`peek_slot_summary(slot: int) -> Dictionary`(另有路径注入口 `peek_summary_at(path)` 供探针隔离,契约 7 同款);返回结构=`{"readable": bool, "keystone": int, "cleared": int, "total": int}`;返回结构另含 `has_file: bool`(主文件在盘与否——T0 对齐补充 2026-10-22:空/有档操作集二分判定来处,非摘要第四项、零 UI 语义);空槽(主文件不在盘,含仅 .tmp 残留)=`readable=true`+`has_file=false`+三项零值;不可读态(损坏/高版本/缺版本字段/越界槽号)=`readable=false`(Q2 裁甲:UI 一律按空槽呈现,禁自设第三态)。激活与档操作 API:`active_slot() -> int`(0=无激活态)、`create_slot(slot)`/`activate_slot(slot) -> bool`(失败自动恢复切换前三态)/`delete_slot(slot) -> bool`;位数常量=`SaveManagerCore.SLOT_COUNT=3`;槽路径唯一派生口=`slot_path(slot)`,视图/组合根禁自拼槽文件名;测试夹具隔离走 `attach_slot_template(template)` 注入口。
|
||||
|
||||
## 3. 设计契约(红线,违反 = L3 停机呈报)
|
||||
|
||||
🔴 **契约 1 · 三存档位且仅三位**:界面呈现 3 槽(裁决 2);禁参数化槽位列表、禁滚动长列表形态。
|
||||
|
||||
🔴 **契约 2 · 摘要三项且仅三项**:钥石余额/通关次数(=通关局数 `adventure_cleared`)/冒险总局数(裁决 4)。**禁显示有无未完冒险**(用户原话「不需要显示有无未完成的冒险;只要我提到的那三个就够了」)——断点相关读数(关数/种子/停点)零露出。
|
||||
|
||||
🔴 **契约 3 · 删档必经二次确认+ConfirmDialog 消费方编排机制**:第一次点击只出确认窗(复用 ConfirmDialog 类),确认才删、取消不删;禁长按删、禁一次点击即删、禁撤销式软删。**本批内该类的形态钉在现役双钮签名**(`confirm_dialog.gd:36-38` `open(text, confirm_label, cancel_label)`,信号零 payload 单实例)——三钮形态与第三钮语义属卡④(v2.3 非有效卡,Q5 裁定甲的落点在那张卡重立卡后的批),本批禁预支类签名变更。**编排机制取 §9 第 6 条代拍板**:组合根按「open 前设消费方状态量、confirmed/cancelled 后按该状态量分派」实现,**禁双常驻静态接线**(现役 `main.gd:347` 形态禁复制——双线必致删档确认误触发开局)。本批该类的消费方=卡③删档确认一处(现役新冒险确认入口随卡②撤出),但分派面禁写死单一目标,须让卡④到位后直接接入第三消费方而不返工。
|
||||
|
||||
🔴 **契约 4 · 空/有档操作集二分**:空槽只有「新档」;有档槽有「进档」+「删档」(澄清④语义)。**禁给空槽配删档**(含置灰残留——置灰=配删档);「想在这个位开新局」的玩家路径=先删档(二次确认)→槽回空→新档,两步即达,卡内记载备查(实现期禁自发加「覆盖」钮——覆盖式新档用户未裁);坏槽/高版本槽的操作集=Q2 裁定,不属本二分。
|
||||
|
||||
🔴 **契约 5 · 选档面零存档内功能**:选档界面只做存档语境选择——禁从此面进营地/冒险/生涯(结构树层级:选档 → 进档 → 营地);禁在选档面放任何购买/查看入口。
|
||||
|
||||
🔴 **契约 6 · 层序与模态纪律**:新层入 `LAYER_CONTRACT`(改层序只改合同表);开合走模态栈单口。**豁免(v1.1 补)**:ConfirmDialog 沿用现役直开先例(main.gd:480——登记在册:输入锁与树序顶位已由 LAYER_CONTRACT 表达),不强制改走 `_open_modal`。
|
||||
|
||||
🔴 **契约 7 · 公共件复用**:UiKit 工厂件+现行色板,零新素材零新色值(迭代 17 卡③ 先例同款);场景图归卡④,本卡不碰美术产出。
|
||||
|
||||
🔴 **契约 8 · 进档即激活**:进档/新档动作=卡①激活位设置+落点卡④营地;激活态是否持久化以 Q1 裁定为准(裁乙才需,裁甲无「当前档选择」可持久——v1.1 条件化,原「拔电源不丢当前档选择」父注删除);写盘时机由卡①在 T0 对齐时定义。
|
||||
|
||||
## 4. 范围边界
|
||||
|
||||
**做**:选档界面视图(三槽卡+摘要+操作钮+空/有档/坏槽态);组合根接线(进入存档→选档;新档/进档→激活+营地;删档→确认→卡①删除原语→刷新);层序登记;断言批;反哺点清单。
|
||||
|
||||
**不做**(明示去向):
|
||||
- 三槽承载/删档原语/摘要读器实现 → 卡①;
|
||||
- 「进入存档」钮与主菜单砍钮 → 卡②;
|
||||
- 营地场景图(进档落点) → 卡④;
|
||||
- 档位自定义命名/备注/排序 → 用户未裁,批内禁加(澄清④只给三槽+三项摘要);
|
||||
- 存档导入/导出/云同步 → 不在澄清范围,禁自扩。
|
||||
|
||||
## 5. 关联文档同步面
|
||||
|
||||
> **v1.3 口径**:本批禁写 `design/` 整目录与根规则文件,唯一可写目录 = `reports/`;下表一律执行为列进反哺点清单。08 写入权限统一口径:**状态列可改;注记改写列反哺点随清单呈报;增删行须用户裁**。
|
||||
|
||||
| 文档 | 关联点 | 同步义务 |
|
||||
|---|---|---|
|
||||
| `待办清单.md`(仓库根,流水线唯一登记处) | 本卡登记条;存档序列化 P2 多档条(卡①反哺)与本条的交叉注记 | 反哺点 · 列清单 |
|
||||
| `design/gdd/systems/跨局循环/生涯.md` | :11-23 信息架构结构树——新增「进入存档→选档界面」一级层级(生涯入口随卡④改挂笔记本) | 反哺点 · 结构树补层 |
|
||||
| `design/gdd/08-Alpha版本标准.md` | 「三 · 界面」表新增「选档界面」行(在役)——增行须用户裁(08 头注纪律) | 反哺点 · 增行请求随清单呈报 |
|
||||
| `roadmap.md` | 迭代行编入/状态刷新 | 反哺点 · 列清单 |
|
||||
| `game/presentation/views/*`(新建选档视图)、`main.gd`、`game/smoke/*` | 实现与断言本体 | 实施本体(可写) |
|
||||
|
||||
## 6. 任务卡
|
||||
|
||||
> 估时按 Claude 工作日口径;每卡出口自跑轻闸;开工日 T0 复核全部行号。
|
||||
|
||||
### 6.0 落位与可复用性预检(req-card 必备结构第 12 项,定义 T 卡前置)
|
||||
|
||||
本卡只有一个新增文件与一个新增开层函数,其余全部复用。盘上形制先例=生涯页 `CareerOverlay`(`game/presentation/views/career_overlay.gd` 全屏页壳+`open_career(data: Dictionary)` 收数据+`_emit_closed` 关闭;组合根四处登记面见 `main.gd:47` 层序合同行、`:116` 字段、`:288-290` 构造与接线、`:419` 层查找表、`:1092-1095` 开层函数)。
|
||||
|
||||
| 新增件 | 复用面(既有实现) | 为什么不能整件复用 | 唯一落点 | 分层与跨层出口 |
|
||||
|---|---|---|---|---|
|
||||
| 新文件 `game/presentation/views/save_select_overlay.gd`(`SaveSelectOverlay`) | 页壳工厂 `UiKit.page_shell`(`career_overlay.gd:18-31` 同款先例)、紧凑返回钮先例(`:26-31`)、关闭链 `signal closed`+`_emit_closed`(`:75-79`) | 生涯页是只读跨局汇总、零存档操作集——**复用它的页壳形制与工厂件,不复用它本体**(澄清④判选档面「完全没有·新建」) | 视图文件只落 `views/` 一处,禁把槽卡构建 helper 散进 `ui_assembler.gd` 或 `main.gd` | 视图零数据层依赖:槽摘要由组合根取好传入(照 `open_career(_career_data())` 先例),视图内禁出现 `load()`/`DirAccess`/存档路径 |
|
||||
| 三槽卡与槽态判定 | 钥石徽工厂件 `UiKit.keystone_badge`(F4 三处消费先例) | 现无「按槽」呈现件 | 槽数量与槽态(空/有档/坏槽)唯一来处=卡① 窥视 API 返回值,视图禁自己数文件、禁硬编码三槽判定 | 呈现层→Core 只经卡① 类型化访问器(卡① 契约 6) |
|
||||
| 开层函数(组合根) | 模态栈单口 `_open_modal`/`_close_modal`(`main.gd:458-462`)+`LAYER_CONTRACT` 登记(`:34-53`)+开始层互斥仿设置面先例 | 现无选档层可复用 | 新层只在 `LAYER_CONTRACT` 加一行(改层序只改合同表,散写 `move_child` 由冒烟 V1d 判红) | 开合走栈单口;ConfirmDialog 按契约 6 豁免沿用直开先例 |
|
||||
| 删档确认弹窗 | 复用 `ConfirmDialog` 类(F2)+现役直开先例(`main.gd:480`) | 类本体够用,缺的是多消费方分派 | 消费方状态量唯一落点在组合根,禁在视图与弹窗各存一份 | 弹窗类零业务触碰(现役纪律),禁反向依赖玩法 |
|
||||
| 探针与夹具 | 既有 `ui_struct_probe`/`ui_click_probe`/`screen_flow_probe` 各加段;隔离存档夹具 `probe_ui_util.gd:98-121 isolate_save` | 三槽异值夹具经卡① 槽位 API 直写(能力验证口径),禁在视图侧开调试口 | 同一入口的可达性断言只在一处,禁新建同职责探针文件 | 测试执行两入口铁规 |
|
||||
|
||||
零新增清单(契约 7 同源):不新增素材、不新增色值、不新增弹窗类、不新增存档路径派生、不新增槽位数量常量(位数唯一在卡① 承载面)。
|
||||
|
||||
### T0 事实坐实与接口对齐(≈0.5–1d)
|
||||
|
||||
- 复核 §2 行号;与卡①对齐窥视读器签名/命名/返回结构/空槽与坏槽表示法(卡① 契约 9 三态——对齐结论写成文附 §2,消 L3 落空项);
|
||||
- 与卡②对齐「进入存档」钮句柄;进档/新档落点=现役 CampOverlay 的开层函数(Q3 乙),其签名与本卡激活调用在 T0 与卡①的激活 API 对齐;ConfirmDialog 消费方编排机制按契约 3+§9 第 6 条实现,卡④重立卡后按同一机制接入第三消费方(本批禁与卡④对接签名——卡④ v2.3 非有效卡)。
|
||||
- 清点既有 confirm_dialog 断言面(ui_struct_probe.gd:71 结构采样、smoke_all.gd:226 最顶层候选、ui_click_probe:508-527、ui_tune_probe.gd:52 树序断言)——机制或实例数若变,这些点受影响;
|
||||
- Q1 重启初始态与 Q2 坏档第三态裁定执行。
|
||||
|
||||
### T1 选档界面视图(≈1.5–2d)
|
||||
|
||||
- 全屏页壳(`UiKit.page_shell` 先例):标题+三槽卡横列+**页壳返回钮(生涯先例)→ `_close_modal`+开始层恢复**(v1.1 补——原只写「标题+三槽卡」漏了可退路径);
|
||||
- 槽卡内容:槽位编号+摘要三项(钥石余额/通关局数/冒险总局数)+操作钮;空槽=「空存档位·新档」态;有档槽=摘要+「进档」+「删档」;坏槽/高版本槽按 Q2 裁定态;
|
||||
- 钥石徽用工厂件;零新素材零新色值(契约 7);
|
||||
- 删除钮形态:危险钮先例;**空槽禁渲染删档钮、禁置灰残留**(v1.1 订正原「禁用态纪律」——与契约 4 字面冲突);
|
||||
- Q1 裁乙时补「预选」高亮态(选中槽卡视觉态——v1.1 补,原 T1 未含)。
|
||||
|
||||
### T2 组合根接线(≈1d)
|
||||
|
||||
- 「进入存档」→开选档界面(模态栈单口;与开始层互斥仿设置面先例);
|
||||
- 新档:卡①空槽创建→激活→**暂行接现役 CampOverlay 开层**(Q3 裁定乙;卡④重新立卡后改挂场景图);
|
||||
- 进档:卡①激活→**暂行接现役 CampOverlay 开层**(同上);
|
||||
- 删档:ConfirmDialog 消费方编排(契约 3:open 前设消费方=删档、confirmed 后删、cancelled 后只关窗)→卡①删除原语→选档界面就地刷新(该槽回空态);
|
||||
- 开层时摘要三读器按槽窥视(不激活不写盘);
|
||||
- **动线序(v1.1 补)**:进档/新档时「先落点开层/开始层保持隐藏,再关选档」——禁先关后开(`_close_modal` 会恢复被遮挡的开始层=回闪一帧);营地开层后选档层被模态栈遮挡隐藏、不关闭(卡④ T3 同口径)。
|
||||
|
||||
### T3 断言批(≈1–1.5d)
|
||||
|
||||
- 探针:三槽呈现+摘要三项读数(**夹具按槽直写**——经卡①槽位 API/隔离面实现同会话三槽异值注入,v1.1 补任务落点);空/有档操作集断言(空槽零删档钮/有档槽零新档钮);坏槽按 Q2 态断言;删档确认链(第一次点击只开窗、取消后文件仍在、确认后槽回空);
|
||||
- 冒烟:层序登记(`LAYER_CONTRACT` 合同断言);选档面零存档内功能入口(结构禁词断言);选档面返回钮开合(screen_flow_probe 型);
|
||||
- **变异验证伴生**:删档钮直连删除(预期确认链断言红)、摘要读激活位(预期跨槽摘要红)、空槽渲染删档钮(预期操作集断言红)、**ConfirmDialog 双常驻接线**(注入后预期「删档确认误触发开局」断言红——新契约伴生,v1.1 补);注入→最窄闸见红→精确还原→记录。
|
||||
|
||||
### T4 产出物落位卡(≈0.5d,末卡)
|
||||
|
||||
三份 `reports/` 写齐(实现报告含**实际改动—验收对照表**〔§7.1 需求侧表的执行对账,另加「结果」格〕、变异记录表、「已知中间态」节〔Q3 乙的暂行接线与卡④改挂的二次验证面〕/代拍板追认单〔含 §9 第 6 条编排机制留痕〕/反哺点清单)。**合并前置**:独立验收审计(§7.1 末段声明)完成且 `reports/iter33-验收审计-<完成日>.md` 逐行「通过」;§7.2 申报外的削弱由审计判红,未过不得合并。
|
||||
|
||||
**估时合计 ≈4.5–5.5d**(v1.1 上调:ConfirmDialog 机制+坏槽态+返回路径+夹具注入增量)。切分预案:T1/T2 后可切(视图先落、接线后落)——切分价值低,建议与卡②同批单跑。
|
||||
|
||||
## 7. 验证闸(逐需求点验收清单)
|
||||
|
||||
| # | 需求点 | 测什么 | 落点/判定手段 |
|
||||
|---|---|---|---|
|
||||
| V1 | 三槽呈现 | 3 槽卡在位且编号稳定;无滚动长列表 | ui_struct_probe 结构断言 |
|
||||
| V2 | 摘要三项 | 钥石余额/通关局数/冒险总局数逐槽读数正确(夹具按槽直写三槽不同值);空槽零值;坏槽按 Q2 态 | ui_probe 型探针段(夹具经卡①槽位 API 直写,能力验证口径) |
|
||||
| V3 | 摘要禁项 | 摘要区无断点/未完冒险相关读数(关数/种子/「继续」字样零命中) | 探针禁词断言 |
|
||||
| V4 | 操作集二分 | 空槽零删档钮(含置灰);有档槽零新档钮 | 探针结构断言 |
|
||||
| V5 | 空槽新档 | 空槽点新档→创建+激活+落点营地 | ui_click_probe 合成点击路径 |
|
||||
| V6 | 有档槽进档 | 点进档→激活该槽(摘要=该槽值)→落点营地 | 同上 |
|
||||
| V7 | 删档二次确认 | 一击只开确认窗;取消=文件仍在;确认=删+槽回空 | ui_click_probe 双路径段 |
|
||||
| V8 | Q1 重启初始态 | 甲=重启回主菜单不预选;乙=预选/直入均可机检 | 探针重启链段(按 Q1 裁定案) |
|
||||
| V9 | 返回路径 | 页壳返回钮→选档隐藏+开始层恢复;选档语境 ESC 不响应 | screen_flow_probe 型断言 |
|
||||
| V10 | 层序纪律 | 新层入 LAYER_CONTRACT;登记序=树序=z 序 | 冒烟 V1d 合同断言 |
|
||||
| V11 | 反哺点清单 | §5 每条有落点 | 件核对表 |
|
||||
|
||||
**测试方式两分法**:V1–V10 机检自动化(能力验证经夹具直写槽位/钥石/计数状态——经卡①槽位 API 或隔离存档实例,不走正常资源积累流程);**用户目检项=三槽观感与删档确认文案**——登记 07(生命周期末步统一目检,不阻塞迭代,澄清⑥口径)。
|
||||
|
||||
**闸口径**:轻闸每卡出口自跑;批末重闸按改动域选档(本批碰 `game/` 代码与断言面 → `--code`)全绿才合并;MC 零跑。
|
||||
|
||||
### 7.1 改动—验收对照表(test-conventions §9.3 六列;§7 的 V 号在各需求点格内括注)
|
||||
|
||||
> 断言尾缀族=〔sl#〕,实现期逐条 grep 定位。落点文件为计划落点,实现期在 `reports/iter33-实现报告-<完成日>.md` 的实际对照表里按真实行号对账(§9.3 双端对上)。本卡全部取数只走卡① 交付的按槽 API,夹具按槽直写=能力验证口径(§7 两分法)。
|
||||
|
||||
| 需求点 | 改动(文件:行/行为) | 验收测试(名称+落点+尾缀) | 层级 | 真实入口 | 撤销或变异证明 |
|
||||
|---|---|---|---|---|---|
|
||||
| sl1 三槽呈现(契约1、V1、T1) | 新建 `game/presentation/views/save_select_overlay.gd`(`SaveSelectOverlay._init` 按 `career_overlay.gd:18-31` 页壳先例)渲染三槽卡 | `ui_struct_probe` 新段〔sl1〕槽卡计数=3+零滚动容器 | 探针 | 点「进入存档」开层后的真实子树 | 变异=槽列表参数化成四槽或套 ScrollContainer → 计数与禁滚动断言红 |
|
||||
| sl2 摘要三项逐槽读数(契约2、V2、T1/T2) | 槽卡内容读卡① 按槽窥视 API(三值+零值空槽) | 探针段〔sl2〕夹具按槽直写三槽异值后逐槽断言 | 探针 | 开层后各槽卡 label 实取值 | 变异=摘要改读激活槽代替窥视槽 → 异值夹具下断言红 |
|
||||
| sl3 摘要禁项(契约2、V3、T1) | 槽卡只消费三项键,零断点字段(关数/种子/停点不进视图) | 探针禁词断言〔sl3〕 | 探针 | 选档层真实 label 文本全集枚举 | 变异=把断点关数拼进槽卡副标题 → 禁词断言红 |
|
||||
| sl4 空/有档操作集二分(契约4、V4、T1) | 槽卡按槽态分支渲染钮集;空槽禁渲染删档钮(含置灰形态) | 结构断言〔sl4〕空槽零删档钮+有档槽零新档钮 | 探针 | 真实开层子树的钮枚举 | 变异=空槽渲染删档钮(哪怕 `visible=false`)→ 操作集断言红 |
|
||||
| sl5 空槽新档链(完成定义3、V5、T2) | 组合根新档回调:卡① 空槽创建→激活→暂行开现役 CampOverlay(Q3 乙) | `ui_click_probe` 合成点击段〔sl5〕 | 集成 | 真实点击空槽「新档」钮 | 撤销=去掉激活调用 → 激活槽位断言红 |
|
||||
| sl6 有档槽进档链(契约8、V6、T2) | 组合根进档回调:卡① 激活→暂行开现役 CampOverlay | `ui_click_probe` 段〔sl6〕 | 集成 | 真实点击有档槽「进档」钮 | 变异=进档读成当前激活槽 → 该槽摘要与激活位断言红 |
|
||||
| sl7 删档二次确认链(契约3、V7、T2) | 删档回调经 ConfirmDialog 编排:`main.gd:480` 直开先例+消费方状态量,confirmed 才调卡① 删除原语,cancelled 只关窗 | `ui_click_probe` 双路径段〔sl7〕(一击只开窗/取消后文件仍在/确认后删+槽回空) | 集成 | 真实点删档钮 → 确认窗 → 确认与取消两支 | 变异=删档钮直连删除原语 → 确认链断言红(T3 变异①) |
|
||||
| sl8 消费方编排机制(契约3、V7、T2、§9 第6条) | `main.gd:347-348`/`:480` 静态常驻接线改为「open 前设消费方状态量、confirmed/cancelled 后按该量分派」,弹窗类签名不动 | 结构断言〔sl8〕单口分派+变异注入双常驻接线 | 集成 | 三个开窗路径共用同一弹窗实例(本批两个:删档确认与现役新冒险确认随卡②撤出) | 变异=保留双常驻静态接线 → 「删档确认误触发开局」断言红(T3 变异④) |
|
||||
| sl9 重启不预选(Q1 甲、V8、T1/T2) | 视图与组合根零激活位持久化(卡① §9 第 2 条随 Q1 甲作废),boot 后三槽均未选 | 探针重启链段〔sl9〕 | 集成 | 重启后走「进入存档」开层 | 变异=加一条持久化预选指针 → 不预选断言红 |
|
||||
| sl10 返回路径与 ESC 语境(V9、T1/T2) | 页壳返回钮 → `_close_modal`+开始层恢复(`career_overlay.gd:75-79` 先例);选档语境 ESC 不响应(卡⑤ 契约 2 范围外,零实现) | `screen_flow_probe` 型段〔sl10〕 | 探针 | 真实点击返回钮+选档态按 ESC 键 | 变异=返回钮改成 `queue_free` 不恢复开始层 → 恢复断言红;给 ESC 加处理 → 不响应断言红 |
|
||||
| sl11 层序与模态纪律(契约6、V10、T1/T2) | 新层入 `main.gd:34-53` `LAYER_CONTRACT`(仿 `:47` career 行)+开合走 `:458-462` 模态栈单口 | 冒烟 V1d 合同断言〔sl11〕+`ui_tune_probe.gd:52` 树序断言复跑 | 冒烟 | `smoke_all.gd:146-154` 源码合同段 | 变异=在视图内散落 `move_child` → 散落判红 |
|
||||
| sl12 动线序不回闪(T2) | 进档/新档时先落点开层(开始层保持隐藏)再关选档 | 探针段〔sl12〕逐帧可见性次序(选档隐藏时营地层已可见) | 探针 | 真实点击进档钮后的可见性采样 | 变异=改成先关后开 → 开始层恢复一帧断言红 |
|
||||
| sl13 公共件复用零新素材零新色值(契约7、V1)——非行为改动 | 只用 `UiKit.page_shell`/`UiKit.keystone_badge`/现行色板;不新增素材与色值 | 静态扫描+结构断言〔sl13〕零新 `Color(` 字面量与素材路径 | 件核 | 本批 diff 文件枚举 | 判断依据=不改行为;变异=引入新色值 → 静态扫描红 |
|
||||
| sl14 反哺点清单(V11)——非行为改动 | §5 所列(待办清单、生涯.md 结构树、08 增行请求、roadmap)列点不落文 | 件核对表〔sl14〕落 `reports/iter33-反哺点-<完成日>.md` | 件核 | 收口前逐条指认落点 | 判断依据=产出物件核不产码;08 增行须用户裁,本批禁直改 |
|
||||
|
||||
### 7.2 测试削弱申报(test-conventions §9.5)
|
||||
|
||||
本卡接线会让 ConfirmDialog 的开窗形态变化,下列四点为**已申报**的可改写位点(改写须按新形态收紧,禁放宽):`ui_struct_probe.gd:71` 结构采样、`smoke_all.gd:226` 最顶层候选、`ui_click_probe.gd:508-527` 确认弹窗交互段、`ui_tune_probe.gd:52` 树序断言。改写条件=实例数或分派口变化时同步更新判据;不许把判据放宽成「任意弹窗在顶」。其余既有断言本卡不许动,实现期未申报的删除断言、放宽阈值、缩小扫描面、换下层直调由独立验收审计判红。
|
||||
|
||||
**独立验收审计(test-conventions §9.7)**:合并前由未参与实现的迭代 loop 内子代理(或用户点名会话)审计——只读本卡、实现报告实际对照表、diff 与测试文件,自跑最窄测试抽查,不采信「已全绿」;审计报告落 `reports/iter33-验收审计-<完成日>.md`,逐行写「通过/缺漏/例外及依据」。**审计未通过不得合并**(T4 合并前置)。
|
||||
|
||||
## 8. 异常分级
|
||||
|
||||
- **L1(自救)**:断言写法、槽卡布局微调、命名。
|
||||
- **L2(记录继续)**:槽卡横列/纵列布局取舍(契约 1 内)、确认文案措辞、空态呈现细节。
|
||||
- **L3(停机呈报)**:进档落点在卡④重新立卡前被要求改挂场景图(Q3 裁定乙=暂行现役 CampOverlay,提前改挂=越批);卡① 交付签名与 T0 对齐结论不符(v1.1 订正原「与本节假设不符」——本节无签名假设);删档确认链被要求简化(触裁决 3);ConfirmDialog 编排机制在本批内出现两个分派目标互相冲突(冲突时停机呈报,禁为实现方便退回双常驻静态接线)。
|
||||
|
||||
## 9. 代拍板白名单(超清单必呈报)
|
||||
|
||||
1. 槽卡布局(横列三卡 vs 纵列三行)与尺寸档取值(UiKit 现行件域内)。
|
||||
2. 槽位编号呈现(「存档位 1/2/3」vs 其他措辞)。
|
||||
3. 新档/进档/删档三钮的文案与动词化命名(对齐现役动词钮先例)。
|
||||
4. 选档界面与开始层的互斥方式(仿设置面先例内的参数选择)。
|
||||
5. 提交切分与 worktree 分支命名。
|
||||
6. ConfirmDialog 消费方编排机制的取法:**取「open 前设消费方状态量、confirmed/cancelled 后按该量分派」**(约束:不破现役双钮签名 `confirm_dialog.gd:36-38`,禁双常驻静态接线,分派面须可容纳卡④到位后的第三消费方)——代拍板留痕,追认单可 veto。
|
||||
|
||||
## 10. 待裁点
|
||||
|
||||
### Q1 · 重启后选档界面的初始态(必裁,未裁不开工)
|
||||
|
||||
**背景**:澄清④结构树只到「选档界面 → 营地场景图」,未覆盖退出游戏再启动后的行为。两案并列,**无推荐**(用户令:不代裁):
|
||||
|
||||
| 案 | 内容 | 代价 |
|
||||
|---|---|---|
|
||||
| 甲 | 每次启动都回主菜单→进入存档→选档界面,不自动进档、不预选 | 每轮开局多两次点击;语义最简(无「上次档」隐含状态) |
|
||||
| 乙 | 记忆上次激活槽:重启后选档界面预选该槽(或一键直入) | 多一个激活位持久化状态(卡①承载);「默认进哪档」成为隐含决策;**「一键直入」变体绕选档层,与澄清④「选档=必经层」存在张力,若裁须一并确认层级关系**(v1.1 补注);「预选」需槽卡高亮态(T1 已列);持久化指针指向已删槽的重启语义须注明 |
|
||||
|
||||
连带:卡① §9 第 2 条激活位持久化仅裁乙才需;卡① T1 启动行为条件化同源。裁决方式:随卡片评审定案;裁定落 T0 执行+实现报告留痕。
|
||||
|
||||
**裁定(2026-10-18)**:**甲**——每次启动回主菜单→进入存档→选档界面,不自动进档、不预选。代拍板留痕(用户令「事项按推荐的来」,本项无推荐案,取默认甲=语义最简、无「上次档」隐含状态;追认单可 veto)。连带:卡① §9 第 2 条激活位持久化**作废**(无「当前档选择」需持久);T1 预选高亮态条目不做。
|
||||
|
||||
### Q2 · 坏档/高版本槽在选档面的呈现与操作集(必裁,未裁不开 T1 坏槽态)
|
||||
|
||||
**背景**:盘上任一槽文件可损坏或高版本;卡①窥视读器对不可读槽返回显式损坏标记(契约 9,peek 禁触发 `.corrupt.bak` 改名)——坏槽既非空亦非正常有档,契约 4 二分无第三态。两案并列:
|
||||
|
||||
| 案 | 内容 | 代价 |
|
||||
|---|---|---|
|
||||
| 甲(推荐) | 窥视对坏档/高版本槽返回零值,UI 按空槽呈现(新档/进档均经卡①兜底链接管——进档时走正式 load 触发兜底/拒读) | 坏档在选档面「看不见」,用户可能不知哪槽坏 |
|
||||
| 乙 | 显式第三态(坏档标记+仅允许删档/进档) | 多一套 UI 态与断言 |
|
||||
|
||||
裁决方式:随卡片评审定案;裁定落 T0+T1 坏槽态实现。
|
||||
|
||||
**裁定(2026-10-18)**:**甲**——窥视对坏档/高版本槽返回零值,UI 按空槽呈现(推荐案,用户令按推荐执行);新档/进档均经卡①兜底链接管(进档时走正式 load 触发兜底/拒读)。T1 坏槽态=空槽态,无独立第三态 UI。
|
||||
|
||||
### Q3 · 卡③先行交付时,进档/新档的过渡落点(必裁,未裁不定排期)
|
||||
|
||||
**背景**:v1.0「建议本卡与卡②同批、卡④随后」与完成定义 3(进档落点=卡④)+§8 L3(落点未到位停线呈报)三句互斥——按 L3,「②③先合批、④随后」这条建议路径不可合并。三案并列:
|
||||
|
||||
| 案 | 内容 | 代价 |
|
||||
|---|---|---|
|
||||
| 甲(推荐) | 卡③与卡④同批(完成定义原样成立) | 两卡合并工作量大,单批周期长 |
|
||||
| 乙 | 卡③先行,进档/新档暂行接**现役 CampOverlay**(卡④到位改挂——复用现役面,非「发明占位」) | 临时代码+卡④改挂时的二次验证面;CampOverlay 在卡④前仍是在役面,复用合法 |
|
||||
| 丙 | 进档/新档暂行置灰,完成定义 3 拆两阶段 | 交付面砍残,选档界面半成品 |
|
||||
|
||||
裁决方式:随卡片评审定案;裁定落 §0/完成定义/§8 三处同步改写。
|
||||
|
||||
**裁定(2026-10-18)**:**乙**——本卡随①②③工程批先行,进档/新档暂行接现役 CampOverlay,卡④设计定稿重新立卡后改挂。**迫使原因**:卡④于同日回设计段(美术设计定稿未过设计前置闸),甲案(③④同批)失去对象;丙案(置灰)砍残交付面不取。暂行接线与后续改挂的二次验证面在 T2 明列、实现报告「已知中间态」节登记。
|
||||
|
||||
---
|
||||
|
||||
**审查回写要点**:v1.0→v1.1(2026-10-18 grilling 子 Agent 对抗审查回写)——事实订正:F6 行号 :458-461→:458-462;F2 补 ConfirmDialog 形态实证(零 payload/直开绕栈/静态常驻接线);F7 窥视读器标卡①未实现交付物+「通关次数」口径锁定;自扩订正:契约 8「拔电源不丢」父注按 Q1 条件化、Q1 乙案「一键直入」补层级张力注。卡内可收:契约 3 立 ConfirmDialog 消费方机制(禁双常驻接线)、契约 6 补直开豁免、契约 4 补两步路径记载、T1 补返回钮/禁置灰残留/预选高亮态、T2 补动线序与开层互斥、T3 补夹具注入与 ConfirmDialog 变异注入、T0 补既有断言面清点、V 表补三行、§8 L3 落空项订正。跨卡对齐:ConfirmDialog 机制卡③立卡④守、营地开层互斥与卡④ T3 同口径、断点确认探针段归卡④ T5 接收(卡② T2 明列移交)。新增待裁点 Q2 坏档第三态、Q3 先行落点过渡态。用户面裁决(裁决 2/3/4)零改动。
|
||||
+3
-3
@@ -5,8 +5,8 @@
|
||||
## 当前位(只回答「现在该做什么」;三行内随批次换代,禁止在此扩写成状态快照)
|
||||
|
||||
- **阶段**:M3——Alpha 版本的完整实现(2026-10-09 立规:未明令宣布完成前停留 M3,迭代只排 M3 需求,M4 不排期;根目录 stage.txt 为旧阶段开关仅存档)。
|
||||
- **迭代位**:迭代 1–32 全部已完成或已终止;迭代 33、34、35 已编排(均待开工,卡片见迭代总表);迭代 36 起未编排——编入哪一迭代由用户经迭代编排段发令。
|
||||
- **下一步**:`/iter 33` 发令开工(实现段,由用户发令,段间不自动流转)。待编池:营地交互重做卡⑤(排卡④之后)、卡④(已退回美术设计段,美术设计闭合后重立卡)、冒险前资源配比预设(冻结备选)、迭代 30 原卡②③(2026-10-17 已剔出迭代 30 规划、退回待设计,待美术/设计定稿后重新立卡)、玩家面残留禁字清扫(待写卡)、结算明细日志行序重锚(2026-10-21 授权发起、时点另定)。
|
||||
- **迭代位**:迭代 1–33 全部已完成或已终止——迭代 33 三卡合回并于 2026-10-22 总收口+反哺落文,迭代 34 两卡已合回、批后收尾未做;迭代 35 已编排(待开工,卡片在 reports/);迭代 36 起未编排——编入哪一迭代由用户经迭代编排段发令。
|
||||
- **下一步**:迭代 33/34 批后收尾(收口登记与遗留读数义务清册,由用户发令)→ `/iter 35` 发令开工(实现段,段间不自动流转)。待编池:营地交互重做卡⑤(排卡④之后)、卡④(已退回美术设计段,美术设计闭合后重立卡)、冒险前资源配比预设(冻结备选)、迭代 30 原卡②③(2026-10-17 已剔出迭代 30 规划、退回待设计,待美术/设计定稿后重新立卡)、玩家面残留禁字清扫(待写卡)、结算明细日志行序重锚(2026-10-21 授权发起、时点另定)。
|
||||
|
||||
## 里程碑时间线
|
||||
|
||||
@@ -66,7 +66,7 @@
|
||||
| 迭代 30 | 已完成(2026-10-17) | 已退役(git 历史可考) | 2026-10-16 | — | 已退役(git 历史可考) |
|
||||
| 迭代 31 | 已完成(2026-10-19) | 已退役(git 历史可考) | 2026-10-18 | ≈7.5 个工作日 | 已退役(git 历史可考) |
|
||||
| 迭代 32 | 已完成(2026-10-21) | 已退役(git 历史可考) | 2026-10-20 | ≈8.75 个工作日 | 已退役(git 历史可考) |
|
||||
| 迭代 33 | 待开工 | reports/需求卡片-存档制数据层改造批-2026-10-18.md<br>reports/需求卡片-选档界面新建批-2026-10-18.md<br>reports/需求卡片-主菜单三入口化批-2026-10-18.md | 2026-10-21 | ≈13.25 个工作日〔用户特批 2026-10-21 超 10 个工作日〕 | — |
|
||||
| 迭代 33 | 已完成(2026-10-22) | 已退役(git 历史可考) | 2026-10-21 | ≈13.25 个工作日〔用户特批 2026-10-21 超 10 个工作日〕 | 已退役(git 历史可考) |
|
||||
| 迭代 34 | 待开工 | reports/需求卡片-敌人表深度带换代批-2026-10-21.md<br>reports/需求卡片-信息迷雾可见性批-2026-10-21.md | 2026-10-21 | ≈11 个工作日〔用户特批 2026-10-21 超 10 个工作日〕 | — |
|
||||
| 迭代 35 | 待开工 | reports/需求卡片-节点图生成器核心批-2026-10-21.md<br>reports/需求卡片-节点图消费侧换代批-2026-10-21.md | 2026-10-21 | ≈15.25 个工作日〔用户特批 2026-10-21 超 10 个工作日〕 | — |
|
||||
|
||||
|
||||
@@ -167,7 +167,7 @@
|
||||
### ⑯ UI 结构批复验(2026-10-05 ui-struct-probe mini-loop 顺带登记——标题屏双列修复+按钮宽度纪律,约 2 分钟)
|
||||
|
||||
- **背景**:实机目检抓到标题屏立绘/帮助牌叠压操作行牌(M2 双列接线缺陷,ui_assembler.gd 右列误挂 MarginContainer)+全站按钮宽度无纪律(UiKit 工厂无宽度约束)。已修复:右列挂回 HBox 第二列;UiKit.button 全站最小宽度基准 216+SIZE_FILL(行板/角标/图标钮 9 处豁免);全 UI 屏结构探针入轻闸。
|
||||
- **看什么(实机目检约 2 分钟)**:①标题屏应为左右双列——左操作列(冒险/营地与系统两组)与右立绘看台+玩法速览牌并排,互不遮挡,「退出游戏」按钮完整可见;②同组按钮等宽(菜单列/确认弹窗),按钮不再宽窄参差;③营地屏三柜台+底栏不出屏、不重叠。
|
||||
- **看什么(实机目检约 2 分钟)**:①标题屏应为左右双列——左操作列(进入存档/设置/退出游戏三钮——迭代 33 卡② 主菜单三入口化后形态,目检按新钮组验)与右立绘看台+玩法速览牌并排,互不遮挡,「退出游戏」按钮完整可见;②同组按钮等宽(菜单列/确认弹窗),按钮不再宽窄参差;③营地屏三柜台+底栏不出屏、不重叠。
|
||||
- **红灯信号**:任何屏出现控件叠压/按钮宽窄不一回潮/内容超出屏幕——结构探针已拦机检面,红灯=探针盲区,报批补断言。
|
||||
|
||||
### ⑰ 奇物渠道分离与凭证目检(2026-10-05 奇物词族对齐与渠道分离批顺带登记——迭代15②号卡)
|
||||
@@ -189,7 +189,7 @@
|
||||
|
||||
### ⑲ 生涯页目检(迭代 18 卡④生涯界面实装批·期一顺带登记——主菜单新增一级只读页+存档 v6)
|
||||
|
||||
- **入口与开合**:主菜单「营地与系统」组出现「生涯」钮(营地钮与设置钮之间);点击开全屏页、点「返回」回主菜单(继续上局钮可见性随开合正确恢复)。
|
||||
- **入口与开合**:〔入口已换代——迭代 33 卡② 撤主菜单生涯钮后无玩家可见入口,待迭代 34 卡④ 营地笔记本接入;接入前本项验到页内容即可〕点开全屏页、点「返回」回上层(开始层钮可见性随开合正确恢复)。
|
||||
- **页呈现两类六项**:组一·冒险战绩(冒险总局数 / 通关局数〔括注「三关全通」〕 / 各关通关次数〔一行三关,关名带层号〕 / Boss 首杀〔X/3 关〕 / Boss 总击杀);组二·资源(钥石余额徽)——数值与存档实况一致(对照:玩几局后总局数含放弃与失败、三关全通才计通关)。〔原「属性锻造已购合计」「天赋树已购概览」两观测项随生涯页三投影删除摘除——2026-10-12 用户裁⑧,天赋树实装批顺带〕
|
||||
- **旧档载入**:v5 现役档(升级前存档)载入后生涯页正常显示,总局数/通关局数从 0 起计(终身计数域 v6 新增,缺省补零),钥石等既有进度原样。
|
||||
- **零跳转与局内零入口**:页内除「返回」外无任何前往他处的按钮;冒险进行中(战斗屏/关卡地图屏/状态面板)无生涯入口。
|
||||
@@ -332,3 +332,19 @@
|
||||
| 3 | 高光行与横幅 | 对外高光行「完美封印!清图奖励 ×2」与全屏横幅「完美封印 ×2」显示正确、零「雷」字 |
|
||||
| 4 | 天赋树锋/守限次 | 同一关内第 3 次起踩危险格不再伤害减半、第 3 次标错不再返还行动点(每战限 2 → 每关限 2 的实际手感) |
|
||||
| 5 | 旧档续玩 | 含改名前 counter 键的旧断点存档正常进入不崩(崩溃面已由 V13 自动化覆盖,此处目检手感) |
|
||||
|
||||
---
|
||||
|
||||
## ㉛ 迭代 33——主菜单三入口、选档界面与旧档迁移实机目检(2026-10-22 随反哺写入登记)
|
||||
|
||||
> 三卡换代玩家入口拓扑(主菜单 6 钮→3 钮、新增选档界面、隐式单档→3 存档位+旧档迁槽 1)。机检已覆盖钮集/读回/写盘拒绝与链路面(〔mn〕〔sl〕〔sv〕断言族),左列观感失衡、删档确认文案观感与迁移实际行为仍要人眼看。登记不阻塞(2026-10-12 真人检测立规);总收口时点=迭代 33 实现报告(已退役,git 可考)。
|
||||
|
||||
| # | 目检项 | 判据 |
|
||||
|---|---|---|
|
||||
| 1 | 主菜单三钮观感 | 左列只剩「进入存档/设置/退出游戏」三钮,布局不失衡、无旧钮残留(卡② 目检项) |
|
||||
| 2 | 选档界面三槽观感 | 从「进入存档」进入:三槽逐行呈现、槽卡只显示摘要三项(钥石/通关局数/冒险总局数),无断点/种子等第四项(卡③ 目检项) |
|
||||
| 3 | 删档确认文案 | 点「删档」先出二次确认窗,文案读顺、取消不删、确认才删且槽就地回空(卡③ 目检项) |
|
||||
| 4 | 旧档首次启动迁移(可选——开发者向) | 盘上留有旧 `save.json` 时首次启动:旧档内容出现在槽 1(摘要三项=旧档进度),源改名 `.migrated.bak` 留盘,其余两槽呈白板(卡① 附带观察项,push_warning 留痕非玩家面) |
|
||||
| 5 | 空槽新档链 | 空槽点「新档」→进入营地,槽卡就地翻为有档形态(进档+删档钮) |
|
||||
- **红灯信号**:主菜单出现旧六钮任何一枚;选档层摘要读出别槽值;删档一击直删;旧档迁移后槽 1 白板(迁移没跑)。
|
||||
- **结论回流**:观感问题归迭代 34 卡④(营地场景图重立卡顺带复核入口观感);数据层缺陷归待办清单营地交互重做条。
|
||||
@@ -568,11 +568,8 @@
|
||||
|
||||
#### 营地交互重做·五张需求卡片(2026-10-18 登记,来源=会话提及,设计面=文档轨)
|
||||
|
||||
**现状**:2026-10-17~18 需求讨论澄清会话产出结论文档,用户令按工作内容维度拆卡、卡片不预占迭代号。五卡已写(顺序=执行顺序):①存档制数据层改造批 ②主菜单三入口化批 ③选档界面新建批 ④营地场景图新建批 ⑤Esc 浮窗与营地顶栏批(各卡估时与内容见卡片自身)。三道复核:grilling 子 Agent 对抗审查(五卡各一)→v1.1;用户裁定「事项按推荐的来」→v1.2;用户两次订正(**卡④留在批内不踢出**;前置归用户自立批,Agent 不代跑不代产——曾越权起草的点选反馈设计稿 v0.1 已撤回删除)→卡④ v2.2;**卡④ 2026-10-21 用户令退回美术设计段(v2.3,非有效卡,美术设计闭合后重立卡)**。①②③⑤ 零待裁点可编工程波次:②③ 硬耦合同波(「进入存档」钮落点=选档界面),① 是 ③ 前置;⑤ 随 ④ 代码波同行。Alpha 出口裁决(2026-10-21 用户裁):五卡整体列入 Alpha——08「三 · 界面」已开条目,Alpha 出口依赖五卡完工与卡④三个用户侧前置销号。关联文档:
|
||||
**现状**:2026-10-17~18 需求讨论澄清会话产出结论文档,用户令按工作内容维度拆卡、卡片不预占迭代号。五卡已写(顺序=执行顺序):①存档制数据层改造批 ②主菜单三入口化批 ③选档界面新建批 ④营地场景图新建批 ⑤Esc 浮窗与营地顶栏批(各卡估时与内容见卡片自身)。三道复核:grilling 子 Agent 对抗审查(五卡各一)→v1.1;用户裁定「事项按推荐的来」→v1.2;用户两次订正(**卡④留在批内不踢出**;前置归用户自立批,Agent 不代跑不代产——曾越权起草的点选反馈设计稿 v0.1 已撤回删除)→卡④ v2.2;**卡④ 2026-10-21 用户令退回美术设计段(v2.3,非有效卡,美术设计闭合后重立卡)**。①②③⑤ 零待裁点可编工程波次:②③ 硬耦合同波(「进入存档」钮落点=选档界面),① 是 ③ 前置;⑤ 随 ④ 代码波同行。Alpha 出口裁决(2026-10-21 用户裁):五卡整体列入 Alpha——08「三 · 界面」已开条目,Alpha 出口依赖五卡完工与卡④三个用户侧前置销号。**工程波次一已落地(2026-10-22)**:卡①②③ 随迭代 33 实现批合回 master(合并提交 ebf40947/5c2a7bcf/508f190b,总收口 6e8f72b2),三卡需求卡片与批次产出物已按「吸收即死」退役(设计口径已吸收进 存档序列化.md/生涯.md/camp.md/08-Alpha版本标准.md v1.13/art-bible.md v3.18,反哺落文见本清单「迭代 33 反哺点写入」条);卡④(营地场景图)退回美术设计段待重立卡、卡⑤(Esc 浮窗)随卡④ 代码波同行,两卡未编排——编入哪一迭代由用户经迭代编排段发令。关联文档:
|
||||
- 设计澄清定稿:reports/需求澄清-营地交互重做-2026-10-18.md(v1.0:目标体验原话/目标结构树+纵深稿/10 条交互裁决/验收口径/切批原则/遗留待裁)
|
||||
- 卡①:reports/需求卡片-存档制数据层改造批-2026-10-18.md(v1.3)
|
||||
- 卡②:reports/需求卡片-主菜单三入口化批-2026-10-18.md(v1.3)
|
||||
- 卡③:reports/需求卡片-选档界面新建批-2026-10-18.md(v1.3)
|
||||
- 卡④:reports/需求卡片-营地场景图新建批-2026-10-18.md(v2.3,**2026-10-21 用户令退回美术设计段,非有效卡**,美术设计闭合后重立卡,见缺口)
|
||||
- 卡⑤:reports/需求卡片-ESC浮窗与营地顶栏批-2026-10-18.md
|
||||
|
||||
@@ -580,7 +577,7 @@
|
||||
|
||||
**归属**:营地交互重做(数据层+呈现层+美术线;五卡路径见现状清单,批次归属与波次由用户按工作量另裁)
|
||||
|
||||
**状态**:文档设计已闭合+待美术设计+已写卡+已写卡+已写卡+已写卡+已编迭代 33
|
||||
**状态**:文档设计已闭合+待美术设计+已写卡+已写卡
|
||||
|
||||
#### 需求卡片入库纪律未登记——502 批遗留的悬空待办(2026-10-18 登记,来源=批次移交,设计面=反哺点)
|
||||
|
||||
@@ -747,3 +744,22 @@
|
||||
|
||||
|
||||
|
||||
|
||||
---
|
||||
|
||||
#### 迭代 33 反哺点写入(2026-10-22 登记,来源=批次移交,设计面=反哺点)
|
||||
|
||||
**现状**:清单原载 reports/iter33-反哺点-2026-10-21.md(16 项,卡① #1–#6/卡③ #7–#10/卡② #11–#16),16 项已于 2026-10-22 全部落文、清单文件已删除(git 可考);落文面:
|
||||
- 存档序列化:design/gdd/systems/表现与支撑/存档序列化.md(2026-10-22 写入,落节见下)——三存档位承载段(#1)、系统范围负责表与读写时机图换代+无激活拒写口径(#2)、P2「多存档槽位」后置条注销(#3)、旧单档一次性迁移段(#4)、消费面纪律补窥视读器返回结构与 has_file 口径(#10)
|
||||
- 生涯:design/gdd/systems/跨局循环/生涯.md v1.1(信息架构节,2026-10-22 写入)——一句话定位改营地平级、信息架构节改三入口结构树(#7/#11)
|
||||
- 营地 spec:design/gdd/ux/camp.md v1.6(2026-10-22 写入)——营地入口改「进入存档→选档→进档/新档」+双入口框架句同步换代(#12)
|
||||
- Alpha 标准:design/gdd/08-Alpha版本标准.md v1.13——「三 · 界面」新增选档界面行(#8,2026-10-22 用户裁批准增行)+主菜单行状态换代与入口拓扑注记(#13,同日用户裁批准)+营地交互重做五卡行状态按实态同步(部分实装)
|
||||
- 美术圣经:design/art/art-bible.md v3.18——§7.4 小字号豁免清单 excision「主菜单分组 overline×2」两片段(组帽双撤,禁整行删条款本体在位)(#15)
|
||||
- 目检入册:体验验证清单.md 新增 ㉛ 迭代 33 实机目检总清单五项+⑯ 左操作列引述与 ⑲ 生涯入口按三钮形态换代(#14)
|
||||
- 账面:待办清单本五卡条现状与状态推进+本条登记(#5/#9/#16);roadmap.md 迭代 33 行「已完成(2026-10-22)」+卡片与实现报告列填退役保留字+顶部「当前位」三行换代(#6)
|
||||
- 代拍板追认:12 项(卡① 6+卡③ 7〔含 has_file 单项〕+卡② 5)随实现批备案于本条与追认单(追认单文件已删除,git 可考);授权性质=卡片审问阶段预授权执行,veto 窗口开放至用户明示
|
||||
- 遗留去向:卡② 审计例外注记 mn6(断点段②③移交面)随迭代 34 卡④ T5 承接在册(实现报告已知中间态索引,git 可考);中间态换代点=迭代 34 卡④(营地场景图)与文档批,均已在 生涯.md/camp.md/08 行内标注
|
||||
|
||||
**归属**:design/gdd/systems/表现与支撑/存档序列化.md+design/gdd/systems/跨局循环/生涯.md+design/gdd/ux/camp.md+design/gdd/08-Alpha版本标准.md+design/art/art-bible.md+体验验证清单.md+roadmap.md(文档域)
|
||||
|
||||
**状态**:已写入
|
||||
Reference in new issue
Block a user