diff --git a/reports/iter33-代拍板追认单-2026-10-21.md b/reports/iter33-代拍板追认单-2026-10-21.md index d1d55170..0b4d90cf 100644 --- a/reports/iter33-代拍板追认单-2026-10-21.md +++ b/reports/iter33-代拍板追认单-2026-10-21.md @@ -12,3 +12,15 @@ | 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 增一访问器+组合根改一行 | diff --git a/reports/iter33-反哺点-2026-10-21.md b/reports/iter33-反哺点-2026-10-21.md index cea3310f..694414de 100644 --- a/reports/iter33-反哺点-2026-10-21.md +++ b/reports/iter33-反哺点-2026-10-21.md @@ -12,3 +12,12 @@ | 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 对齐补充(二分判定来处的文档化) | diff --git a/reports/iter33-实现报告-2026-10-21.md b/reports/iter33-实现报告-2026-10-21.md index 3807ead6..947bc5d6 100644 --- a/reports/iter33-实现报告-2026-10-21.md +++ b/reports/iter33-实现报告-2026-10-21.md @@ -76,3 +76,71 @@ | 单元 | 35 套件全绿 | **38 套件全绿**(+3:isolation 22 / boot 12〔回炉+4〕/ summary 12) | | probe --click | 全绿 | 全绿(重闸复跑) | | 重闸 --code | — | 全绿(回执随合并提交留痕) | + +--- + +## 卡③ 选档界面新建批(3 存档位 · 新档/进档/删档)——已合并(见合并记录) + +**状态**:T0–T4 完成;批末重闸 --code 全绿(回执见合并提交信息);独立验收审计通过(`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 | — | 全绿(回执随合并提交留痕) | diff --git a/reports/需求卡片-选档界面新建批-2026-10-18.md b/reports/需求卡片-选档界面新建批-2026-10-18.md index dd2309e1..8d9d708a 100644 --- a/reports/需求卡片-选档界面新建批-2026-10-18.md +++ b/reports/需求卡片-选档界面新建批-2026-10-18.md @@ -37,10 +37,10 @@ | 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`,save_manager.gd:214/258/264)+**按槽窥视读器=卡① T2 交付物(未实现)**;「通关次数」口径=**通关局数 `adventure_cleared`**(同生涯页行,卡① F4 已锁——禁与「各关通关次数 clear_count」混义) | `save_manager.gd:214`/:258/:264;卡① §6 T2 | +| 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}`;空槽(主文件不在盘,含仅 .tmp 残留)=`readable=true`+三项零值;不可读态(损坏/高版本/缺版本字段/越界槽号)=`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)` 注入口。 +**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 停机呈报)