From 21c83f573673cce6f8ec1159e121f87c3eeeee66 Mon Sep 17 00:00:00 2001 From: DKChan <524912269@qq.com> Date: Fri, 16 Oct 2026 03:09:34 +0800 Subject: [PATCH] =?UTF-8?q?docs(roadmap):=20=E8=BF=AD=E4=BB=A3=2029=20?= =?UTF-8?q?=E7=BC=96=E5=85=A5=E6=B5=8B=E8=AF=95=E5=88=86=E5=B1=82=E4=B8=8E?= =?UTF-8?q?=E9=97=A8=E7=A6=81=E8=AF=AD=E4=B9=89=E4=BF=AE=E6=AD=A3=E6=89=B9?= =?UTF-8?q?=EF=BC=882026-10-16=20=E7=94=A8=E6=88=B7=E4=BB=A4=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit roadmap:迭代 29 行改写为「测试分层与门禁语义修正批」——需求卡片=design/research/需求卡片-测试分层与门禁语义修正批-2026-10-15.md(v1.4,T0-T8≈5.5-7d,开工门=U0〔Q3-Q7 裁点+卡片 v2.0 重核+/iter 发令〕);新增「迭代 30+ 位空」行——原 M4 数值批已废(2026-10-16 用户删卡令「它就不是一个应该存在的东西」),禁止再以该名义立批/规划/引用已删卡,四项数值欠账归 06 在册、重新归属待用户裁;当前位置节迭代进度与近期主战场两处换代(下一前沿=迭代 29);迭代 23+ 行(M4 原始泊位)追加作废注,仅作排期史保留。 需求卡片 v1.5:排期行与 §5 roadmap 同步行更新;登记 v2.0 重核遗留项(残留 CI 措辞四漏网点+事实基线换代:冒烟 1086→1125/0、门禁五闸→run_all_gates.sh 编排、architecture.md 测试域节已成文、Q3 的 CI timeout 前提消失);订正 v1.3 版本条目尾部重复段。文档三闸全绿(gdd_lint 0 不通过/死链 0/疑似现行 0)。 --- ...‚卡片-测试分层与门禁语义修正批-2026-10-15.md | 289 ++++++++++++++++++ roadmap.md | 11 +- 2 files changed, 295 insertions(+), 5 deletions(-) create mode 100644 design/research/需求卡片-测试分层与门禁语义修正批-2026-10-15.md diff --git a/design/research/需求卡片-测试分层与门禁语义修正批-2026-10-15.md b/design/research/需求卡片-测试分层与门禁语义修正批-2026-10-15.md new file mode 100644 index 00000000..4262e706 --- /dev/null +++ b/design/research/需求卡片-测试分层与门禁语义修正批-2026-10-15.md @@ -0,0 +1,289 @@ +# 需求卡片:测试分层与门禁语义修正批(本地闸三硬闸 · L2 集成层建承载 · L3 屏壳切换探针 · 覆盖补洞 · 术语订正 · 台账清理) + +- 版本:v1.5(2026-10-15 成文 v1.0 → v1.1 → v1.2 → v1.3 → v1.4 → **v1.5**) + - v1.1:①**CI 从未执行**(`git remote -v` 无输出)⇒ T1 主体由 CI 改为本地闸;②**用户立规:历史决策文档只是变更记录、不是架构文档** ⇒ 🔴 契约 5 重写为「历史决策文档不回改」,Q1 由「是否改决策文档」改为「在役架构事实如何**迁出**」,新增 Q7;③修正「smoke_all 不被执行」的错误表述(它本就在本地轻闸首项)。 + - v1.2(用户令后执行态):①**用户裁「CI 没有用、后面也不用、不留死配置」** ⇒ `.github/workflows/` 全数删除(分支 `ci-removal-20261015`),CLAUDE.md 硬性红线立「不建/不留/不参考 CI 配置,改门禁只改本地闸」;本卡 T1④「CI 同步对齐」、T2「CI job 改名」、Q2「是否并入 CI」、§5 同步面 CI 行**全部删除**;②**架构事实源纪律已成文**:CLAUDE.md 硬性红线 + `design/dev/doc-conventions.md`(架构事实唯一源=`design/dev/architecture/architecture.md`);③排期订正:迭代 28 位已被「启动装配与生命周期验收补全批」占用。 + - **v1.3(2026-10-15 用户令「放到迭代 29」)**:①排期由「迭代号待定」定为 **迭代 29**;②新增 **§0 前置依赖与并行性**——裁决**串行**(须等 iter28 收口),四条依据(CLAUDE.md 汇聚文件、`game/smoke/` 是 iter28 主战场、基线读数会作废、08-Alpha 测试基建四行会自相矛盾),并标明**例外**:CI 清除 4 文件不与 iter28 触碰面重叠,**建议先行合并**;③T0-③/T0-④ 加注「开工日重采基线 + 复核 iter28 是否已改过相关行」。 +- **v1.4(2026-10-15 用户令「决策记录归 git commit log、不另存决策文档」)**:①用户裁历史决策文档体系整体废除——七份决策文件删除(沿革归 git 历史),在效事实已由 10-15 文档批迁入 `design/dev/architecture/architecture.md`;②🔴 契约 5 改写为「架构事实唯一源」口径;③Q1(迁出去向)闭环、§5 同步面改写为 architecture.md;④全文引用清除。 +- **v1.5(2026-10-16 roadmap 编入笔,用户令「把需求卡片写进 roadmap 的迭代 29」)**:①roadmap 迭代 29 行已改写为本批、新增「迭代 30+ 位空」行(原 M4 数值批已废记录)、当前位置节两处换代;②§5 `roadmap.md` 同步行与排期行随之更新;③**遗留待 v2.0 重核项登记在案**:卡片残留 CI 措辞(§1 完成定义第 3/4 条、T4「入轻 CI」、V4「CI job 名」、V7「入轻 CI」——v1.2 删 CI 任务时的漏网点)+事实基线换代(冒烟 1086→1125/0、门禁五闸→`tools/run_all_gates.sh` 编排、architecture.md「测试与质量域」节已成文、Q3 的 CI timeout 120s 前提消失)——U0 开工门前一并重核升版;④版本史订正:v1.3 条目尾部重复段(上次修 v1.2 覆盖时误留的 v1.2 内容,致同一条目内「排期定迭代 29」与「顺延 29+」自相矛盾)已删除,v1.3 条目恢复为三事=排期定迭代 29+§0 串行裁决+T0-③/T0-④ 加注。 +- 来源:[测试审计 — 单测覆盖与验收门禁标准 v1.1](../qa/测试审计-单测与验收门禁标准-2026-10-15.md)(`design/qa/`,2026-10-15;加载 `godot-builder` + `godot-auditor` 双技能审计产出) +- 归属:**测试基建批**(req-card §3:缺陷修复/工程债/**测试基建**/重构类工程需求凭 bug 证据或 06 在册条目直接写卡,**无设计定稿前置要求**——本批凭据即审计报告 A 类证据) +- 排期:**迭代 29**(2026-10-15 用户令:迭代 28 进行中,本批顺延至 29;**2026-10-16 已写入 roadmap 迭代 29 行**——原「M4 顺延 29+」行随 M4 数值批废除改写为「迭代 30+ 位空」记录)。开工门=U0,须用户 `/iter` 发令。 +- **并行性裁决:串行,须等迭代 28 收口**(依据见下 §0,2026-10-15 实查)。已完成的 CI 清除部分(4 文件小批)不与 iter28 逻辑耦合,**建议先行合并** + +### 0. 前置依赖与并行性(2026-10-15 裁决) + +**不能与迭代 28「启动装配与生命周期验收补全批」并行**,四条依据: + +| # | 冲突面 | 具体情况 | +|---|---|---| +| 1 | **`CLAUDE.md` 汇聚文件** | iter28 T6 要在「批次工作流」第 7/8 条(:102-103)旁加硬规则;本批已在「硬性红线」节(:115-116)加两条、后续可能改批末四闸口径句(:106/:116)。同一汇聚文件两批改,顺序一乱即互相覆盖 | +| 2 | **`game/smoke/` 是 iter28 主战场** | iter28 正在改 `smoke_all.gd` / `ui_struct_probe.gd` / `main.gd`(worktree 脏件实证);本批 T4 要在同目录新建 `screen_flow_probe.gd/.tscn`,T7 还要给 15 个游离脚本定性 | +| 3 | **基线读数会作废** | 本批 T0-③ 冻结的基线(冒烟 1086 / run_all 27 套 / 探针 11)在 iter28 收口加断言后全部失效——T0 白冻结,V11「改前改后读数对拍」的改前锚也失去意义 | +| 4 | **`08-Alpha版本标准` 会自相矛盾** | iter28 卡片 §5 明确写「测试基建四行状态不变——本批只加断言不加新设施类」;**本批恰恰就是动测试设施本身**(建 `integration/`、改判定脚本、加新探针)。两批并行则该文档无法陈述真话 | + +⇒ **串行。本批在 iter28 收口合入 master 后开工,且 T0-③ 基线以 iter28 收口后的读数重新冻结**(卡片现有 1086/27 数字作废,开工日重采)。 + +**例外(可先行)**:已完成的 CI 清除 4 文件改动(删 `.github/` + CLAUDE.md 两条红线 + doc-conventions §9.1 + README 门禁节)**不与 iter28 触碰面重叠**(iter28 碰的是 `main.gd`/`smoke_all.gd`/`ui_struct_probe.gd`/code-conventions/roadmap/06/07/active),且两条红线是"规则"性质,越早生效越好。⇒ **建议先提交并合入 master**,不等 iter28。 +- 用户原始诉求(本批要兑现的三条):①最单元的逻辑代码有它的单元测试;②整体的模块有它的接口测试;③整体的系统在执行之后,也有它 UI 方面的和场景切换相关的测试。**并且验收不能只是"冒烟"——可以是冒烟,但更重要的是逻辑正确性** + +--- + +## 1. 目标与完成定义 + +把验收语义从「**跑一遍没崩 = 冒烟通过**」扭转为「**三层完备 + 判定可靠**」。四件事: + +1. **门禁判定语义修正(本批第一优先)**:CI 判定从「无超时 + 日志含 PASS 串」改为**三硬闸**——①退出码为唯一权威判据(PASS 串降级为日志);②`SCRIPT ERROR` / `Parse Error` 扫描命中即红;③断言数为零即红。 +2. **L2 接口层从零建承载**:重建 `game/tests/integration/`,把现成但游离的 `parity_anchor` 确定性对拍收编入闸表;补「存档 ⇄ RNG 快照往返」集成用例(README 章程已登记四类之一)。 +3. **L3 补上屏壳切换**:新建屏切换探针(菜单→营地→冒险→战斗→结算→回营地),断言屏壳 `visible` 互斥与流程状态,入轻 CI。 +4. **L1 补洞 + 术语订正 + 台账清理**:4 个零覆盖 core 模块补单测;「冒烟」一词回归其本义(秒级存活检查),不再作为验收主词;`game/smoke/` 游离脚本定性、golden 基线时效判定、补 S5 扫描规则。 + +**完成定义**: +- 三硬闸在位且**有反例实证**(造必然失败的套件/探针,CI 判定必红——不是推断,是跑出来的证据,留档); +- 三层各有在册承载(L1 `unit/` 27+ 套、L2 `integration/` 从 0 到 ≥1 套、`smoke/` 屏切换探针入 CI); +- **本地闸**判定三硬闸在位且有反例实证(`smoke_all` 已在本地轻闸跑,本批不解决"跑不跑",只解决"判得对不对");CI 侧同步对齐(Q2 裁决后执行); +- 术语订正落到机械面(CI job 名/脚本注释/README 索引/CLAUDE.md 口径句); +- 批末四闸全绿;06 登记销号;反哺点列明待裁。 + +--- + +## 2. 现状事实(代码级,2026-10-15 实查;开工自行复核行号) + +### 2.1 门禁判定面(A 类,代码直读) + +> ✅ **CI 已删除(2026-10-15 用户令,本卡 v1.2 据此修订)**:用户裁「CI 是没有用的,后面也不打算去用它,把 CI 相关的东西都清除掉,不要留着死代码」⇒ `.github/workflows/` **全数删除**(分支 `ci-removal-20261015`),CLAUDE.md 硬性红线同步立规「**不建、不留、不参考任何 CI 配置;改门禁只改本地闸**」。 +> ⇒ **验收门禁 = 本地闸**,唯一一套(`run_smoke.py` / `run_all.gd` / `probe_gate.sh` / `render_gate.sh` / `static_scan.sh`),由 CLAUDE.md 纪律驱动人工执行。 +> ⇒ **本卡所有改造对象均为本地闸**;原 T1 第④项「CI 同步对齐」、T2「CI job 改名」、Q2「是否并入 CI」**全部作废删除**。 + +| # | 事实 | file:line | +|---|---|---| +| F1 | 单元 runner 只判「退出码 ≠ 期望」,**无断言数校验、无脚本错误扫描** | `game/tests/run_all.gd:60-75`(`_run_suite`) | +| F2 | 断言出口在 `failures==0` 时即 `all green (%d checks)` 并 `quit(0)`——**checks 为 0 同样绿** | `game/tests/unit/test_kit.gd:41-49` | +| F3 | 四件入 CI 探针判定 =「超时(124/137) → FAIL;否则 `grep -q "PASS"` → 绿」,**退出码完全不参与**;全库仅 `ui_click_probe` 段查退出码 | `tools/probe_gate.sh` ui_input/ui_struct/ui_contrast 各段;`.github/workflows/tests.yml:59-75`(`run_probe`) | +| F4 | `run_smoke.py` 有**三闸**(退出码 + 摘要失败数 + `SCRIPT ERROR`/`Parse Error` 扫描),但**只跑本地,CI 零调用** | `tools/run_smoke.py:22-30`(RECOMMEND 头注 + 三闸实现) | +| F5 | CI 只跑 `run_all.gd`,`smoke_all.gd`(6128 行 / 967 处 check / 运行期 1086 项)**完全不在 CI** | `.github/workflows/tests.yml` smoke job;`game/smoke/smoke_all.gd` | +| F6 | CI workflow 注释 L52/L55 写「轻闸**三**探针」,实际 L72-75 跑**四个** | `.github/workflows/tests.yml:52,55,72-75` | +| F7 | `example_test.gd`(26 行 / 2 断言,样板件)登记在生产 manifest 里实跑 | `game/tests/run_all.gd:29` | + +### 2.2 灾害先例(B 类,仓库登记可查) + +| # | 事实 | 出处 | +|---|---|---| +| F8 | 「GDScript 运行时脚本错误不改变退出码、不计失败数、静默中断所在函数剩余断言——首跑『309 项 0 失败』实为断言未跑全」 | `CLAUDE.md:21`、`tools/run_smoke.py` 头注 | +| F9 | 迭代 21 基线冒烟 864/0,但 `run_smoke` 判 FAIL(SCRIPT ERROR 51 行) | `active.md` 476 条 | +| F10 | `--script` 模式编译器不解析裸 autoload 标识符 → **`pacing_queue_test` 实证 Parse Error** | `active.md` 494 条坑册② | + +⇒ F10 尤其要紧:**Parse Error 就发生在 CI 会跑到的套件里**。有 `run_smoke` ③闸时当场抓住;无③闸的 CI 上只表现为「断言少跑一截、退出码仍是 0」。 + +### 2.3 三层承载面(A 类) + +| 层 | 现状 | 出处 | +|---|---|---| +| L1 单元 | 27 套件 / 412 处断言 / manifest 全登记零孤儿;**core 层 4 模块零直接指名**、呈现层 49 件中约 38 件零指名 | `game/tests/unit/`;审计 §2.3 / §2.4 | +| L2 接口 | `integration/` 空壳已删,**零承载**;契约面仅 `system_contracts_test.gd` 15 断言(单元级,非集成) | `game/tests/README.md` 章程段 | +| L2 现成零件 | `tools/parity_anchor.py` + `game/tests/evidence/parity/anchor.json`(三变体×RUNSUM+JSONL 双面、字节级逐位一致)——**不入任何闸表、README 未登记** | `tools/parity_anchor.py:1-25` | +| L3 屏切换 | 全库 `change_scene` **零命中**;项目改走三屏壳 + `visible` 互斥。**CI 上屏切换断言 = 0**;`ui_click_probe` 有 `_exit_level_screen` 走查但归 `--click` 不入 CI | `game/presentation/main.gd:51-53`;`game/smoke/ui_click_probe.gd` | + +### 2.4 台账与扫描域(A/B 类) + +| # | 事实 | file:line | +|---|---|---| +| F11 | `game/smoke/` 38 个 `.gd` 中 **17 个无 `.tscn` 宿主**(除 `smoke_all`/`probe_ui_util` 定位清楚外,15 个游离:MC 模拟、defense_scan、rhythm_batch、calibrate_boards、verifier_batch 等),无闸无登记 | `game/smoke/` 目录实查 | +| F12 | golden 视觉基线冻结于 **2026-09-30**,经历 iter25(全局主题)/iter26(按钮五态、Nearest 过滤、换墨、光柱)两次呈现层换代,仍记「0.00%(登记即结未重制)」 | `tools/golden_compare.py:11`;`active.md` 492 条 | +| F13 | 登记八条扫描域,**S5/S6/S7/S8 四条从未实现**(TODO 段);其中 S5 恰是 F10 踩过的坑 | `game/tests/static_scan.sh` 末 TODO 段 | +| F14 | S9 类型闸**显式豁免 smoke/tests**,测量面 untyped 容器 157 处无闸管(tests 24 + smoke 133) | `tools/audit_type_hints.py:5` 注释、`:20` SCAN_DIRS | +| F15 | 术语:「冒烟」一词同时指代最强面(`smoke_all`)、单元面(`run_all`)、CI job 名;「逻辑冒烟」标题即其术语表,全文无单元/集成/系统三层概念 | `design/dev/architecture/architecture.md` 测试与质量域节 | + +--- + +## 3. 设计契约(红线,违反=L3 停机呈报) + +🔴 **契约 1 · 零玩法行为变更**:本批只动测试、门禁、注释、文档、脚本判定。**任何「必须改被测代码才能转绿」的断言 = L3 停机呈报**(唯一例外:断言本身写错且与现行设计冲突,走 §9 白名单 7)。 + +🔴 **契约 2 · 三硬闸不可绕过**:退出码是唯一权威判据,PASS 串只作日志不作判据;脚本错误扫描命中即红;断言数为零即红。**不得为了让某件历史探针转绿而给它开豁免口**(需豁免=L3 呈报)。 + +🔴 **契约 3 · 现有断言面只增不减**:27 套件 + `smoke_all` 1086 项零删减。删任何一条断言须呈报并给依据。 + +🔴 **契约 4 · 不引入第三方测试框架**:gdUnit4 维持 deferred 状态。本批在既有双载体(`-script` + 探针场景)内解决。 + +🔴 **契约 5 · 架构事实唯一源(用户 2026-10-15 立规;v1.4 随决策文档体系废除改写口径)**:架构事实只认 `design/dev/architecture/architecture.md`。本批不得回改任何历史文档、不得另立决策文档体系;涉及历史沿革只作引用。仍在生效的架构约束如需变更,**改架构文档**。术语订正只动机械面(CI job 名 / 本地闸脚本注释 / README 索引 / CLAUDE.md 口径句);`game/smoke/` 文件名改名见 §10 Q7。 + +🔴 **契约 6 · 探针契约零破坏**:现存 11 个探针的挂载面与断言语义不改(T1 只改判定,不改断言内容)。 + +🔴 **契约 7 · 测试执行两入口铁规不破**:本批跑测属「迭代 loop 开发」入口(开工后合法);**MC/对拍类跑批仍按 MC 触发细则**——无数值改动零跑,`parity_anchor` 只作收编验证用,不得借机重锚。 + +--- + +## 4. 范围边界 + +**做**(对应审计 §六 A/B/C/D/F 级): +- A 级全部(CI 三硬闸、术语订正、CI 卫生两件、`smoke_all` 入 CI 或明示不进) +- B 级(L2 建承载 + parity 收编 + 首个集成用例) +- C 级(屏壳切换探针) +- D 级(4 个 core 零覆盖模块补单测;呈现层按风险排前三位) +- F 级(游离脚本定性、golden 时效判定、补 S5 规则) + +**不做**(明示去向): +- **不重写 `smoke_all.gd`**(它是对的,只是名字错+不在 CI)——只做入 CI 与改名裁点,不拆不重构。拆分区归后续批,登记 06。 +- **不做行覆盖率度量**(Godot 无内建;引入第三方工具属新基建,登记 06 另议)。本批的覆盖补洞靠「零指名清单 + 人工判定」。 +- **架构事实以 `design/dev/architecture/architecture.md` 为准**(历史决策文档已废,正文不回改)。 +- **不清理 E 级卫生件**(test_kit static var、4 套件自建断言出口、157 处 untyped 容器、76 处 lambda)——**登记 06 归后续批**;本批只统一新写断言的出口。 +- **不修 07 人闸**(实机目检六批)——不归本批。 + +--- + +## 5. 关联文档同步面 + +| 文档 | 关联点(本批会改变它的哪条陈述) | 同步义务 | +|---|---|---| +| ~~`.github/workflows/tests.yml`~~ | —— | **已删除(2026-10-15 用户令,分支 `ci-removal-20261015`);本卡不再涉及** | +| `tools/probe_gate.sh` | 四件探针判定从「PASS 串」改为「退出码 + 错误扫描 + 断言下限」 | **机械面·随批更新** | +| `game/tests/run_all.gd` | manifest 条目数(example_test 去留);`_run_suite` 增断言数校验 | **机械面·随批更新** | +| `game/tests/unit/test_kit.gd` | `finish()` 零断言判红 | **机械面·随批更新** | +| `game/tests/README.md` | 目录布局(增 `integration/`);「逻辑冒烟」措辞;断言计数双口径 | **机械面·随批更新** | +| `CLAUDE.md` | :21 冒烟入口描述;:106 批末四闸口径;:116 轻闸/重闸定义(若 `smoke_all` 入 CI 则轻闸定义变) | **机械面·随批更新** | +| `roadmap.md` | **迭代 29 行已编入(2026-10-16 用户令)**+「迭代 30+ 位空·M4 数值批已废」记录行新增;原「M4 顺延 29+」表述作废 | **已完成(编入笔=v1.5)**;批内 T8 仍负 roadmap 同步义务(估时/状态/切分变化时) | +| `design/gdd/06-待办清单.md` | 本卡登记条(写卡后登记,收口销号);E 级卫生件 + 覆盖率度量 + smoke_all 拆分 三条新登记 | **机械面·随批更新** | +| `active.md` | 状态快照与台账 | **机械面·随批更新** | +| `game/tests/static_scan.sh` | 增 S5 规则 | **机械面·随批更新** | +| `design/dev/architecture/architecture.md`「测试与质量域」节 | **已承接**(v1.4 前由 10-15 文档批完成):双载体边界、S1–S8 扫描域、外部 wall-clock 超时、gdUnit4 deferred 现以架构文档为唯一记载 | **反哺点一已闭环** | +| `design/dev/architecture/architecture.md` | **反哺点二已闭环**(v1.4):「测试与质量域」节已成文为测试域事实源,文档状态立「事实源地位」条(架构唯一事实源);原文档漂移句随两节删除清除 | —— | +| `design/dev/code-conventions.md` | 测试纪律节(提交前全量、探针标配) | **设计权威文档·不随批更新** → **反哺点三** | +| `design/gdd/07-体验验证清单.md` | 若屏切换探针把部分目检项转成机检,相关条目需改写 | **反哺点四**(待裁:哪些人闸项可转机检) | + +--- + +## 6. 任务卡 + +> 估时按 Claude 工作日口径;每卡出口自跑轻闸,全批出口跑重闸(CLAUDE.md:116)。 + +### T0 证据坐实与基线冻结(≈0.5–1d,**必先做**) + +审计报告的核心结论目前是**推断(C 类)**。本卡的第一步是把它们坐实成证据,否则后面所有改动都建立在推断上。 + +- **T0-① 反例实测(关键)**:造两个必然失败的靶子——(a) 单元套件:断言恒假但退出码走 0 的路径(模拟脚本错误中断场景);(b) 探针:先打印 `PASS` 再 `quit(1)`。分别跑 `run_all.gd` 判定与 `probe_gate.sh` 判定,**记录是否判绿**。判绿 = 缺陷坐实,留档作为 T1 的验收基准;判红 = 我读错了,立即回报改结论。 +- **T0-② 时长预算实测**:实测 `run_all` 全套(27 子进程)与 `smoke_all` 的墙钟时长,对照 CI 的 `timeout 120s` 与 `--import 300s` 余量。结论进 Q2/Q3 裁决依据。 +- **T0-③ 冻结基线读数**:冒烟项数(预期 1086)、run_all 套件数(27)、探针数(11 / 本地轻闸 4)、static_scan 域状态。⚠ **开工日须重新採样**——上述数字是 iter28 收口前的旧读数,若本批在 iter28 之后开工,一律以 master 当期读数为准(见 §0)。 +- **T0-④ 复核行号**:§2 全部 file:line 开工日复核一遍,漂移即订正卡片(审计会话的行号未经二次复核)。**外加**:复核时须确认 iter28 是否已改过 `game/smoke/` 与 `CLAUDE.md` 相关行。 + +### T1 本地闸判定三硬闸(≈0.5–0.75d,**本批改造成效最大的一卡**) + +> **主体是本地闸**(CI 未通电,见 §2.1 前提)。CI 侧只在第 ④ 项做同义对齐,不单独开工——只改 CI 等于给一台没插电的机器换零件。 + +- **① `probe_gate.sh` 探针判定**(**现役缺陷**,每天在跑):四件探针判定从「超时 + `grep -q "PASS"`」改为「**退出码优先** + PASS 串降级为日志」,全部对齐 `ui_click_probe` 段现有口径。 +- **② 脚本错误扫描闸**(**现役缺陷**):抽成一个**闸件脚本**(复用 `tools/run_smoke.py` 的 `ERROR_MARKERS` 逻辑,不复制代码),同时作用于 `run_all.gd` 各子套件输出与 `probe_gate` 各探针日志。 +- **③ 断言数下限闸**(**现役缺陷**):`Kit.finish` 在 `checks == 0` 时判红;`run_all` 汇总校验实跑套件数 == manifest 条目数。 +- ~~**④ CI 同步对齐**~~ —— **v1.2 删除**:CI 已全数移除,无对象可对齐。 +- **④ `example_test.gd` 退出生产 manifest**(T0-④ 确认无其他依赖后删条目,文件保留作样板)。 + +> **注意**:`run_smoke.py` 三闸**已完整**,不在 T1 改动范围——它是本批的**参照样板**,②的闸件逻辑从它抽,不是重写它。 + +### T2 术语订正(机械面)(≈0.25d) + +> 前提:历史决策文档不回改(🔴 契约 5)。本节只改机械面文本;架构事实以 `design/dev/architecture/architecture.md` 为准。 + +- `run_all.gd` / `README.md` / `CLAUDE.md:21` 中「逻辑冒烟」→「单元套件」。 +- 定义「冒烟(smoke)」一词在项目内的**唯一保留语义**:**秒级存活检查**(能否启动、能否加载表、能否进主屏)。写进 README 术语小节。 +- (CI job 改名项随 CI 删除而取消;`game/tests/README.md` 的门禁节已改为本地闸口径,由 `ci-removal` 批执行) +- 在 README 术语小节同步写明:`run_smoke.py` 之名是历史遗留,**其承载的是系统级断言面,不是冒烟**(改名与否走 Q7)。 + +### T3 L2 接口层建承载(≈1–1.5d) + +- 建 `game/tests/integration/`(README 章程早有此规划,一直空壳)。 +- 把 `tools/parity_anchor.py` 收编进闸表(重闸级,周期执行),README 登记为「回放确定性」集成用例。 +- 新增首个集成用例:**存档 ⇄ RNG 快照往返**(README 章程登记四类之一)——存→读→同种子续跑,输出与未存照常跑的那一路逐位一致。 +- `integration/` 纳入 `run_all` manifest 或独立 runner(走 Q4 裁决)。 + +### T4 L3 屏壳切换探针(≈1–1.5d) + +- 新建 `game/smoke/screen_flow_probe.gd/.tscn`:走 menu→camp→adventure→战斗→结算→回营地 主流程,**断言屏壳 `visible` 互斥**(任意时刻三屏壳最多一屏可见)+ 每步流程状态位 + 回退路径(放弃二击→终局→回营地)。 +- 入轻 CI(与 ui_struct/ui_contrast 同段)。 +- 断言源:沿 `ui_click_probe` 已实证的 `_exit_level_screen` 路径与 `smoke_all:_smoke_scene_split()`(:147)现有断言面,不另起炉灶。 + +### T5 L1 覆盖补洞(≈1–1.5d) + +- 4 个 core 零指名模块补直接单测:`minesweeper_rules`(揭示/扩散判定)、`status_container`(状态生命周期)、`config_db_resolver`、`config_db_cross_validator`。 +- 呈现层按风险取前三:`hud_presenter`、三屏壳(`adventure_screen`/`camp_screen`/`menu_screen`)、`battle_narrator`。 +- 全部进 `run_all` manifest。 + +### T6 扫描域补 S5(≈0.5d,视余量带 S6) + +- 补 S5 规则(core 禁裸引用 autoload 全局标识符)——按 code-conventions「新违规案例必须先补扫描规则再修码」纪律,F10 已是真实反面案例却无规则。 +- S6 视 T6 余量决定;S7/S8 仍留 TODO 并登记 06。 + +### T7 台账与时效清理(≈0.5d) + +- `game/smoke/` 15 个游离脚本逐个定性:在役的写进 README 台账(用途 + 触发方式 + 结果由谁判);失效的退役(走 doc-conventions §10 退役规则)。 +- golden 基线时效判定:跑一次 render_gate 判别「三代换代面是否落在裁剪区」——判有效则留并加注,判失效则显式重制并呈报(**不擅自重制**)。 + +### T8 文档同步闸与全闸(≈0.5d,**末卡**) + +- §5 全部**机械面**文档更新完毕(roadmap 编入须用户令)。 +- **反哺点**逐条列明进实现报告(测试术语、code-conventions 测试纪律、07 人闸项转机检)。 +- 06 登记销号 + 新登记三条(E 级卫生件 / 覆盖率度量 / `smoke_all` 拆分)。 +- 批末四闸全绿 + 重闸周期件全绿。 + +**估时合计 T0–T8 ≈ 5.5–7d**;天然切分点:**T1 末**(门禁语义已修,可单独交付见效)、**T4 末**(三层齐备)。软盒 7d,超盒按切分点拆两批。 + +--- + +## 7. 验证闸(逐需求点验收清单) + +**能力验证(自动化;谁验=批末四闸闸机,全绿才合并)** + +| # | 需求点 | 测什么 | 落点 | +|---|---|---|---| +| V1 | 三硬闸-退出码 | **反例实证**:探针打印 PASS 后 `quit(1)` → 闸判红 | T0-① 留档脚本 + T1 探针判定段,新增进 probe_gate 自检 | +| V2 | 三硬闸-脚本错误 | **反例实证**:注入一处 `Parse Error` 的套件 → 闸判红(而非绿) | 新增闸件单测(进 `run_all`) | +| V3 | 三硬闸-断言下限 | **反例实证**:零断言套件 → 判红 | `test_kit.finish` 断言 + `run_all` 套件数校验,新增进 `run_all` | +| V4 | 术语订正(机械面) | 本地闸脚本注释 / README 术语小节 / `CLAUDE.md` 口径句 / CI job 名 四处措辞到位;「冒烟=秒级存活检查」定义小节在册 | 源码断言(grep 旧措辞零命中) | +| V5 | L2 承载 | `integration/` 目录在册 + ≥1 套进闸;parity_anchor 入闸表且 README 登记 | 新集成套进 `run_all`;parity check 进重闸 | +| V6 | L2 存档往返 | 存→读→同种子续跑,与未存档一路输出逐位一致 | 新集成套断言 | +| V7 | L3 屏切换 | 六步主流程 + 三屏壳 `visible` 互斥(任意时刻 ≤1 可见)+ 放弃回退路径 | 新探针 `screen_flow_probe`,入轻 CI | +| V8 | L1 补洞 | 4 个 core 模块各有 ≥3 条真值断言;呈现层三件各有断言面 | 新单测进 `run_all`(27 → 27+7) | +| V9 | S5 扫描规则 | 规则在位且有反面案例触发 | `static_scan.sh` 新段 + 反例 fixture | +| V10 | 台账与 golden | 15 个游离脚本全定性(在役入台账/失效退役);golden 时效判定结论留档 | README 台账节;render_gate 结论进实现报告 | +| V11 | 零回归 | 批末四闸全绿:冒烟 1086/0(基线复核)+ run_all 全套 + probe --click/--full + 改前改后读数对拍;render_gate golden 对基线零漂移 | 全闸 | + +**测试方式两分法**:V1–V11 全部归**能力验证**(自动化闸,调试接口直改游戏数据沿用现役 DebugOverlay/DS_DEBUG 门控);本批**无用户目检项**(纯基建,不改变玩家可见行为)——若 T7 golden 判失效需重制,则该处置登记 07 观测项并呈报。 + +**闸口径**:轻闸/重闸按 CLAUDE.md:116 分级周期口径;每卡出口自跑轻闸(触碰 presentation 加跑 ui_click/ui_layout);批末四闸全绿才合并;测试执行两入口铁规不破(开工后属迭代 loop 入口,跑测合法);MC/对拍跑批仍须用户批准。 + +--- + +## 8. 异常分级 + +- **L1(自救)**:断言拼写错、反例 fixture 没造对、manifest 条目漏登记、注释订正漏处——立红即修。 +- **L2(记录继续)**:探针判定改法的具体写法、`integration/` 目录内部分类、新单测文件命名与落位、游离脚本定性存疑(先按"在役"登记并标注存疑)——登记随批内消化。 +- **L3(停机呈报)**:触碰 §3 任一红线;**T0-① 反例实测判定为「判红」**(即我读错了,缺陷不成立,须重估全批范围);`smoke_all` 入 CI 后超时撞墙且无解;golden 基线判失效;新探针与 `ui_click_probe` 走查路径冲突到必须改现有探针契约;改判定后现有某探针/套件暴露**真实存量红**(不是本批引入的)——须呈报由用户定归属。 + +--- + +## 9. 代拍板白名单(超清单必呈报) + +1. 三硬闸的具体实现写法(闸件是独立 `.sh` 还是并入既有脚本;错误扫描正则沿用 `run_smoke.py` 的 `ERROR_MARKERS`)。 +2. 断言数下限的具体阈值(每套件 ≥1 还是 ≥3;倾向 ≥1,防误伤小套件)。 +3. `integration/` 内部目录分类方式(按系统分 vs 按用例类型分)。 +4. 新集成套是并入 `run_all` manifest 还是独立 runner(Q4 裁后执行细节)。 +5. 新单测/新探针的文件命名与落点(不违背 code-conventions 命名纪律前提下)。 +6. 4 个 core 模块单测的断言面取舍(覆盖到什么粒度)。 +7. **断言本身写错且与现行设计冲突**时的修法(契约 1 的唯一例外:须在报告中逐条列明改了哪条断言、依据哪份设计)。 +8. 游离脚本「在役/失效」的判定(存疑者按在役登记并标注)。 +9. S5 规则的正反例 fixture 构造方式。 +10. 提交切分与 worktree 分支命名(走既有 worktree 纪律)。 + +--- + +## 10. 待裁点 + +| # | 事项 | 备选案 | 推荐 | +|---|---|---|---| +| **Q1** | **测试域在效架构事实(双载体边界/S1–S8 扫描域/外部 wall-clock 超时/gdUnit4 deferred)的承载去向?**(v1.4 注:**已闭环**——事实已由 10-15 文档批迁入 `design/dev/architecture/architecture.md`「测试与质量域」节;七份历史决策文件已删,沿革归 git commit log) | —— | **已闭环**:并入 `design/dev/architecture/architecture.md` 增「测试与质量域」节(先于 Q1 裁断、由用户令直接执行) | +| ~~**Q2**~~ | ~~`smoke_all` 是否写进 CI 配置~~ | —— | **v1.2 作废**:CI 已删除;且 `run_smoke` 本就是本地轻闸首项(`CLAUDE.md:116`),不存在"要不要跑"的问题 | +| **Q3** | `run_all` 若因套件增长撞 CI `timeout 120s` 怎么办? | 甲=提 timeout 值;乙=改并发执行(有 test_kit static var 串台风险,见 E-11);丙=分层,L1 入 CI、慢件归重闸 | **甲**(先提值,最省事);并发与分层归后续批登记 06 | +| **Q4** | `integration/` 是并入 `run_all` manifest 还是独立 runner? | 甲=并入 manifest(统一入口,但致命类 expect=1 语义要扩);乙=独立 runner(CI 加一步) | **甲**——沿用既有 manifest 协议,零新机制 | +| **Q5** | S9 类型闸是否收回对 smoke/tests 的豁免(157 处 untyped 容器)? | 甲=维持豁免(项目既有裁决,本批不动);乙=收回并清偿存量 | **甲**——本批不扩大范围,清偿归后续批登记 06 | +| **Q6** | golden 基线若判失效如何处置? | 甲=显式重制并呈报;乙=维持旧基线 + 加失效注记 | **甲**(沿 iter26 T6 先例:核热区限预期面→显式重制+呈报→复闸),但**须先判再动,禁先动后判** | +| **Q7** | `tools/run_smoke.py` 与 `game/smoke/smoke_all.gd` 是否改名?(它们承载的是**系统级断言面**,名却叫 smoke——术语倒挂的源头之一) | 甲=不改名,只在 README/CLAUDE.md 加注「名是历史遗留,实为系统级断言面」;乙=改名(牵 `run_smoke.py` 调用点、CLAUDE.md 三处口径句、active.md 大量历史行文) | **甲**——历史行文中「冒烟 N 项」出现几十次,改名会把成本转嫁给所有历史记录的比对;加注即可纠正认知 | + +**开工门**:Q1–Q6 裁决全落(零待裁点)+ 用户 `/iter` 发令 = U0。Q2 可在 T0-② 实测后裁(不阻塞 T0/T1 开工)。 diff --git a/roadmap.md b/roadmap.md index 330691a4..c1300c83 100644 --- a/roadmap.md +++ b/roadmap.md @@ -21,11 +21,11 @@ | 2026-09-28 | **M-2 关卡画面独立化完成(迭代 3+4 已入库,出口闸目检通过)**:独立屏 LevelMapScreen+独立性断言(状态记录 224)/关卡画面样张 v1 机检 11/11 冻结+节点图标组接线+终稿落码+换层挂点(art-bible v2.14,状态记录 225);出口检查单 `design/qa/m2-exit-gate-checklist-2026-09-28.md` 用户八项目检通过(状态记录 227) | | 2026-09-29 | **迭代重排(用户裁决「内容逻辑闭环先于验收」)**:M-3 更名「数值标定与 Alpha 创建」——战斗演出完善前移迭代 6、魔法道具+元进度标定编入迭代 7、Alpha 验收后移迭代 8;M-4 转 Alpha 后深化与内容扩展(本批,状态记录 242) | -## 当前位置(2026-10-15 刷新) +## 当前位置(2026-10-16 刷新) - **里程碑语义(2026-10-09 立规换代,详见下方里程碑表的换代注)**:现行里程碑 = **M3「Alpha 版本的完整实现」**——用户未明令宣布完成前停留 M3,迭代只排 M3 需求;M4=Beta 版本的完整实现,一律不排期。下文里程碑表的旧编号(M-3/M-4)保留作历史序列,语义以本节为准。 -- **迭代进度**:迭代 19 五卡全部已入库(2026-10-08);**迭代 20=专长实装批 ✅ 已入库**(2026-10-11,出口闸全绿;残留人闸=实机目检五件+V20/V21/V22 人工核对半,07 在册);**迭代 21=天赋树实装批 ✅ 已入库(2026-10-12 U0 开工单会话交付,T0-T7 全绿;残留人闸=实机目检四柜台)**;**迭代 22=秘宝体系实现重构落地批 ✅ 已入库(2026-10-12 单会话交付,T1-T7 全绿;残留人闸=实机目检秘宝解锁-装配流程)**;**迭代 23=锻造工坊实装批 ✅ 已入库(2026-10-12 单会话交付,T0-T7 全绿;残留人闸=实机目检工作间形态与购买交互)**;**迭代 24=敌人表内容修批(三关)✅ 已入库(2026-10-13 /goal+iter U0 开工单会话交付——N1 (1,2) 降档 hp22/ac2·N2 毒吐盾击两行六池·N3 敌方 attack_type 轴全填 normal+敌方结算克制消费点;冒烟 949/0+run_all 25 套+重闸全绿+MC 同种子配对 40 局×both 位移在带;实现报告=design/qa/iter24-实现报告-2026-10-13.md;残留人闸=实机目检三观测〔07 ㉓〕;代拍板追认单+GDD 反哺点五条待用户;**本迭代位仍预留后续追加卡——用户将把其他需求陆续编入本迭代**);;**迭代 25=UI 全局主题批 ✅ 已入库**(2026-10-13 用户令编入,/goal+iter U0 单会话交付:全局主题资源 main_theme.tres 挂载+两处局部做法退役+冒烟 V1-V6 断言 38 条,冒烟 987/0+重闸全绿;实现报告=design/qa/iter25-实现报告-2026-10-13.md;残留人闸=实机目检全屏巡检〔07 ㉔〕);**迭代 26=UI 交互与观感批已编入待开工**(2026-10-14 用户令;需求卡片 v1.2 零待裁点;开工门=U0——用户新会话 /iter 26 发令;本迭代位预留后续追加卡,同迭代 24 先例);**迭代 27=代码架构技术债修复批 ✅ 已入库**(2026-10-14 /goal+iter U0 开工单会话交付:三屏场景化+会话物化+五段 Segment+RunLedger+ModalFlow+类型闸+卫生件五波全落;逐位一致对拍三变体五跑全同;实现报告=design/qa/iter27-实现报告-2026-10-14.md;残留人闸=实机目检五件〔07 ㉖〕;代拍板追认单十五项+GDD 反哺点两条待用户);**迭代 28=启动装配与生命周期验收补全批 ✅ 已入库**(2026-10-15 用户令编入并预批连做全批,单会话交付:T1 装配语义合同 `LAYER_CONTRACT` 单点化+冒险屏先挂/菜单屏后挂的顺序修复+V1a-d 断言重写/T2 `_smoke_boot_chain` boot 链路十断言/T3 `_smoke_lifecycle_matrix` 九阶段×五引用面/T4 渲染面三件(shot_probe 两自检+shot_checker 墨色判据+启动态菜单 golden)/T5 变异验证六次注入全见红并精确还原/T6 规范三处落文;冒烟 **1086/0→1125/0**(+39=新增 42−退役裸下标断言 3);实现报告=design/qa/iter28-实现报告-2026-10-15.md;残留人闸=实机目检启动态菜单〔07 ㉗〕;代拍板追认单+GDD 反哺点待用户裁决);**迭代 29+**=M4 数值批(Beta 位·未排期——用户令 2026-10-07:后续新迭代一律不先做 M4;迭代 24/25/26/27/28 占位后本批顺延)。 -- **近期主战场**:迭代 20/21/22/23/24/25/26 残留人闸(实机目检六批,07 在册);**下一前沿=迭代 29+ M4 数值批**(Beta 位·未排期——用户令 2026-10-07:后续新迭代一律不先做 M4;迭代 28 已于 2026-10-15 入库收口,各批 provisional 终值归 M4 统一标定;迭代 20~28 残留人闸八批 07 在册)。 +- **迭代进度**:迭代 19 五卡全部已入库(2026-10-08);**迭代 20=专长实装批 ✅ 已入库**(2026-10-11,出口闸全绿;残留人闸=实机目检五件+V20/V21/V22 人工核对半,07 在册);**迭代 21=天赋树实装批 ✅ 已入库(2026-10-12 U0 开工单会话交付,T0-T7 全绿;残留人闸=实机目检四柜台)**;**迭代 22=秘宝体系实现重构落地批 ✅ 已入库(2026-10-12 单会话交付,T1-T7 全绿;残留人闸=实机目检秘宝解锁-装配流程)**;**迭代 23=锻造工坊实装批 ✅ 已入库(2026-10-12 单会话交付,T0-T7 全绿;残留人闸=实机目检工作间形态与购买交互)**;**迭代 24=敌人表内容修批(三关)✅ 已入库(2026-10-13 /goal+iter U0 开工单会话交付——N1 (1,2) 降档 hp22/ac2·N2 毒吐盾击两行六池·N3 敌方 attack_type 轴全填 normal+敌方结算克制消费点;冒烟 949/0+run_all 25 套+重闸全绿+MC 同种子配对 40 局×both 位移在带;实现报告=design/qa/iter24-实现报告-2026-10-13.md;残留人闸=实机目检三观测〔07 ㉓〕;代拍板追认单+GDD 反哺点五条待用户;**本迭代位仍预留后续追加卡——用户将把其他需求陆续编入本迭代**);;**迭代 25=UI 全局主题批 ✅ 已入库**(2026-10-13 用户令编入,/goal+iter U0 单会话交付:全局主题资源 main_theme.tres 挂载+两处局部做法退役+冒烟 V1-V6 断言 38 条,冒烟 987/0+重闸全绿;实现报告=design/qa/iter25-实现报告-2026-10-13.md;残留人闸=实机目检全屏巡检〔07 ㉔〕);**迭代 26=UI 交互与观感批已编入待开工**(2026-10-14 用户令;需求卡片 v1.2 零待裁点;开工门=U0——用户新会话 /iter 26 发令;本迭代位预留后续追加卡,同迭代 24 先例);**迭代 27=代码架构技术债修复批 ✅ 已入库**(2026-10-14 /goal+iter U0 开工单会话交付:三屏场景化+会话物化+五段 Segment+RunLedger+ModalFlow+类型闸+卫生件五波全落;逐位一致对拍三变体五跑全同;实现报告=design/qa/iter27-实现报告-2026-10-14.md;残留人闸=实机目检五件〔07 ㉖〕;代拍板追认单十五项+GDD 反哺点两条待用户);**迭代 28=启动装配与生命周期验收补全批 ✅ 已入库**(2026-10-15 用户令编入并预批连做全批,单会话交付:T1 装配语义合同 `LAYER_CONTRACT` 单点化+冒险屏先挂/菜单屏后挂的顺序修复+V1a-d 断言重写/T2 `_smoke_boot_chain` boot 链路十断言/T3 `_smoke_lifecycle_matrix` 九阶段×五引用面/T4 渲染面三件(shot_probe 两自检+shot_checker 墨色判据+启动态菜单 golden)/T5 变异验证六次注入全见红并精确还原/T6 规范三处落文;冒烟 **1086/0→1125/0**(+39=新增 42−退役裸下标断言 3);实现报告=design/qa/iter28-实现报告-2026-10-15.md;残留人闸=实机目检启动态菜单〔07 ㉗〕;代拍板追认单+GDD 反哺点待用户裁决);**迭代 29=测试分层与门禁语义修正批(2026-10-16 用户令编入·待开工)**:需求卡片=`design/research/需求卡片-测试分层与门禁语义修正批-2026-10-15.md`(v1.4,T0–T8≈5.5–7d,开工门=U0〔Q3–Q7 裁点+卡片 v2.0 重核+`/iter` 发令〕);**迭代 30+ 位空·无批次**(原 M4 数值批已废——2026-10-16 用户删卡令「它就不是一个应该存在的东西」,禁止再以该名义立批/规划/引用已删卡;四项数值欠账归 06 在册、重新归属待用户裁)。 +- **近期主战场**:迭代 20/21/22/23/24/25/26 残留人闸(实机目检六批,07 在册);**下一前沿=迭代 29 测试分层与门禁语义修正批**(2026-10-16 用户令编入·待开工——开工门=U0〔Q3–Q7 裁点+卡片 v2.0 重核+`/iter` 发令〕;各批 provisional 终值的统一标定义务随 M4 数值批废除归 06 在册、重新归属待裁;迭代 20~28 残留人闸八批 07 在册)。 - **实时状态**:以根目录 [active.md](active.md) 顶部「当前状态快照」节为准(`stage.txt` 已定性为旧阶段开关,仅存档)。 ## 主线路线(里程碑 × 迭代序列) @@ -78,14 +78,15 @@ | 迭代 20 | **专长实装批(奇物)**——需求卡片=design/research/需求卡片-专长实装批-2026-10-11.md(v1.1)。范围:T0-T10(效果引擎词表扩签/池结构案D 实装/专长 27 件换代/凭证五件/Boss 兑付换代〔已裁换代〕/状态账/断点扩容/MC 新基线/迁出行删除/空配置验收闸)。候选 B-F 留档不变。**✅ 已入库(2026-10-11 goal 会话 U0 开工——A/B/C 三段 T0-T10 全落 master:T1 词表扩签 a57489e/T2 案D 池 0640b0c/T3 29 行换代 54ab330/T4 凭证五件 1387aed/V4 补齐 5ebd05d/C 段收尾 3333187;冒烟 864/0+run_all 21 套+MC 同种子重放逐位复现;29 行件数口径+四级配额 104+疼痛记忆同战消费放宽+时沙/弃图兑换落法映射系代拍板追认单待用户)** | ✅ 已入库(出口闸全绿+实机目检归用户 07 在册) | T0-T10 ✅ | | 迭代 21 | **天赋树实装批(2026-10-11 用户令编入——整卡不切分,迭代容量放宽容纳全卡)**:按 [天赋树](design/gdd/systems/跨局循环/天赋树.md) **v0.8** 设计权威文档实装——**33→12 节点**结构换代(三轮换代:攻防所有权切分 29→21〔树零攻防来源=红线,攻/AC 唯一入口=锻造工坊路线〕/一线一节点 21→15〔生命·命中淬炼各一节点×4 级、row 字段退役〕/Fork 一节点双态 15→12〔开局姿态·危险直觉·财富之道三组各一节点、购买解锁后 A/B 零币切换〕;schema=Fork 词表 4→3 组/规则键词表 2→6 键、「等级阈值前置」形态去留=R1 开放待裁点〔推荐裁撤,**不阻开工门**〕)+三组 Fork 真效果(开局姿态每关首轮窗/危险直觉与财富之道·限次计数随冒险持久按关重置)+营地统一案甲(树=营地主界面/属性升级唯一入口/工作间钥匙模型/图鉴常开/占位面板零副作用硬要求)+注入公式换代(基础值+树淬炼+锻造路线加值位预留+局内加算)+旧属性柜台退役+旧档废弃与旧逻辑删除(开发阶段无迁移,Q3 裁决)+同调位槽位判定源切树节点(旧条件删除随批清扫)+树上刷新升级接线(双入口并存写同账)。需求卡片=design/research/需求卡片-天赋树实装批-2026-10-11.md(**v1.7**——grilling 五裁+歧义扫描六裁+**2026-10-12 完备性/跨系统歧义审查十一裁**全落;零阻塞待裁点);锻造工坊(原「武器锻造」)**17 裁点已清零**(2026-10-12 逐裁落文 v0.5,06 在册),Q5 排期前置已满足、默认本批先行;T0 的「标错机制存在性」与「boss_kill_count 消费面」两项**已预查结案**(标错机制查实存在且有代价,守侧 contingency 作废) | ✅ **已入库(2026-10-12,/goal+iter U0 开工令——T0-T7 全量交付;R1 按既定默认裁撤案执行;实现报告=design/qa/iter21-实现报告-2026-10-12.md;残留人闸=实机目检营地四柜台〔07 在册〕)** | T0-T7≈7.0-8.0d(整卡单迭代——实际 2026-10-12 单会话交付) | | 迭代 22 | **秘宝体系实现重构落地批**——需求卡片=design/research/需求卡片-秘宝体系实现重构落地批-2026-10-11.md(v1.3 C1-C6 全裁);**2026-10-11 用户令编入**:新目录 12 件实装+解锁混合制(逐件分配锁定表在卡)+装配不可变(冒险中零更换)+旧数据行清理+效果引擎接入;槽位来源不在本批(树接口接缝——迭代 21 已实装树点亮数槽位源,本批直接消费)+装配档位格约束;估时 6d(区间 5-7d)——**✅ 已入库(2026-10-12,/goal+iter U0 开工单会话交付:T1 数据层 12 行换代+schema 扩签/T2 解锁服务+工坊面退役+档位格约束/T3 效果引擎接入+扩签+常时参数面+试炼镐积点口+充能周期/T4 呈现换代+呈现桥+试炼镐 HUD 入口/T5 替换子交互拆除+库存保留注记/T6 验收闸断言;冒烟 898/0+run_all 22 套+重闸全绿;实现报告=design/qa/iter22-实现报告-2026-10-12.md;残留人闸=实机目检秘宝解锁-装配正常流程〔07 ㉑〕)** -| 迭代 23+ | **M4 数值批(**原 22+;迭代 21 已编入天赋树实装批、迭代 22 已编入秘宝实装批,均 2026-10-11 用户令**——**Alpha 收官位·未排期**〔2026-10-09 语义换代:M4=Beta 阶段、非 Alpha 收官位,M3 未由用户明令关闭前不排期维持〕——2026-10-05 用户令编入迭代 17 卡②;2026-10-06 用户令移出独立成批并定序「Alpha 阶段最后——内容补全先行、统一数值调整殿后」〔当日曾被编入迭代 18 为收官卡,2026-10-07 用户令撤回〕;**2026-10-07 用户令二次后移:后续新迭代(迭代 20 起)一律不先做 M4,除非用户明确要求启动 M4 批次**)**:四件数值欠账合一批——①削弱档位终值(weaken 现值 −65/duration 2/refresh 考证在册;叠层改续时语义已定案,差 duration 终值+当量锚复算)②调参批数值点评(06 条目现行登记五条——任务口径「八条」与条目五条不符,需求卡片 §2.2 已呈报差异以条目为准)③迭代 10 奖励重构联动欠账①②(钥石产出重标 boss_keystone 首杀 3/3/3·复杀 2/2/3 provisional + 通关率带重扫〔通关回血 20%+AP 件首轮 +1〕)④元进度定价剩余面(forge base 20/比 150 考证在册——06 条目文本「base 10」滞后于 2026-09-22 对齿批已呈报;Boss 两档终值)。读数义务随批=迭代 14 两件后置复算(T6 MC 四带复算+T7 技能池节奏重测,均挂 07);顺路修复 damage_probe A1 改前既有红灯(判式换代批出口报告 §四.7 在册)。**硬约束:一切 MC/verifier 跑批发起前须用户批准;调参联动禁独立调参网络(β 带 [1.2,2.5] 逐 u 检算)**。需求卡片=`design/research/需求卡片-M4数值批-2026-10-05.md`(**v1.2 2026-10-06 案C 增补+联审修订**:v1.1 三事实与第五推算件照旧;联审=P3 转正顺延至重扫读数后/检算工具 WEAKEN_PCT 入同步面/F11 两句死文本全刷/T3·T5 四带复算并账一次跑批双认账/R5 改前锚=本批新立案C 锚/估时段一勘误 4.25d;案C 增补内容照旧=§2.6 三事实〔行为换代/锚全作废/难度预判〕+T0 推算稿第五件=对拍锚按新序重推导+T6 四带复算按案C 新行为首采;T0-T8≈6.25d,天然切分点 T4 末;🔴 契约 5 条含跑批批准制;**✅ 裁点全裁(2026-10-06 用户令:P1甲=维持 2 场·magnitude [60,85] 带内当量锚复算、具体值随出口 provisional 追认/P2甲 不对称有意/P3甲 3-3-3·2-2-3 维持、转正顺延至重扫读数到账且带内(Q4 二裁)/P4甲 不立直购价);开工=U0**) | 迭代 18 全部内容卡(③④⑤⑦)出口+全部内容批行为变更落定+**用户发令(未排期)**——重锚窗口须收尽全部内容批行为变更 | T0-T8≈6.25d(超软盒预挂,段一 T0-T4≈4.25d〔v1.2 勘误,原 4.5 系加总错误〕/段二 T5-T8≈2.0d) | +| 迭代 23+ | **M4 数值批(**原 22+;迭代 21 已编入天赋树实装批、迭代 22 已编入秘宝实装批,均 2026-10-11 用户令**——**Alpha 收官位·未排期**〔2026-10-09 语义换代:M4=Beta 阶段、非 Alpha 收官位,M3 未由用户明令关闭前不排期维持〕——2026-10-05 用户令编入迭代 17 卡②;2026-10-06 用户令移出独立成批并定序「Alpha 阶段最后——内容补全先行、统一数值调整殿后」〔当日曾被编入迭代 18 为收官卡,2026-10-07 用户令撤回〕;**2026-10-07 用户令二次后移:后续新迭代(迭代 20 起)一律不先做 M4,除非用户明确要求启动 M4 批次**)**:四件数值欠账合一批——①削弱档位终值(weaken 现值 −65/duration 2/refresh 考证在册;叠层改续时语义已定案,差 duration 终值+当量锚复算)②调参批数值点评(06 条目现行登记五条——任务口径「八条」与条目五条不符,需求卡片 §2.2 已呈报差异以条目为准)③迭代 10 奖励重构联动欠账①②(钥石产出重标 boss_keystone 首杀 3/3/3·复杀 2/2/3 provisional + 通关率带重扫〔通关回血 20%+AP 件首轮 +1〕)④元进度定价剩余面(forge base 20/比 150 考证在册——06 条目文本「base 10」滞后于 2026-09-22 对齿批已呈报;Boss 两档终值)。读数义务随批=迭代 14 两件后置复算(T6 MC 四带复算+T7 技能池节奏重测,均挂 07);顺路修复 damage_probe A1 改前既有红灯(判式换代批出口报告 §四.7 在册)。**硬约束:一切 MC/verifier 跑批发起前须用户批准;调参联动禁独立调参网络(β 带 [1.2,2.5] 逐 u 检算)**。需求卡片=`design/research/需求卡片-M4数值批-2026-10-05.md`(**v1.2 2026-10-06 案C 增补+联审修订**:v1.1 三事实与第五推算件照旧;联审=P3 转正顺延至重扫读数后/检算工具 WEAKEN_PCT 入同步面/F11 两句死文本全刷/T3·T5 四带复算并账一次跑批双认账/R5 改前锚=本批新立案C 锚/估时段一勘误 4.25d;案C 增补内容照旧=§2.6 三事实〔行为换代/锚全作废/难度预判〕+T0 推算稿第五件=对拍锚按新序重推导+T6 四带复算按案C 新行为首采;T0-T8≈6.25d,天然切分点 T4 末;🔴 契约 5 条含跑批批准制;**✅ 裁点全裁(2026-10-06 用户令:P1甲=维持 2 场·magnitude [60,85] 带内当量锚复算、具体值随出口 provisional 追认/P2甲 不对称有意/P3甲 3-3-3·2-2-3 维持、转正顺延至重扫读数到账且带内(Q4 二裁)/P4甲 不立直购价);开工=U0**) | 迭代 18 全部内容卡(③④⑤⑦)出口+全部内容批行为变更落定+**用户发令(未排期)**——重锚窗口须收尽全部内容批行为变更 | T0-T8≈6.25d(超软盒预挂,段一 T0-T4≈4.25d〔v1.2 勘误,原 4.5 系加总错误〕/段二 T5-T8≈2.0d)。**⚠ 2026-10-16 作废注:本行所载「M4 数值批」需求卡片已由用户删除、批次名义废除(四项数值欠账归 06 在册·重新归属待用户裁)——本行仅作排期史保留,不再是任何在途批次;现行空位记录见「迭代 30+」行** | | 迭代 23 | **锻造工坊实装批(2026-10-12 用户令编入——设计面 v0.6 就绪)**:按 [锻造工坊](design/gdd/systems/跨局循环/锻造工坊.md) **v0.6** 设计权威文档实装——迁移面:①新建锻造路线行族(现役 `meta.tres` forge_products 已随迭代 21 T5 退役、无改造对象;钥石定价历史考古 20/150%、投值归 M4)②两根类型轴所有权移交(默认值归锻造工坊配置常驻持有、hero.tres 静态表两轴删除、选中态写存档域+冒险开始参数面注入)③存档域 forge_routes(已预登记存档序列化.md v7 计划行)④满级特效本期不实装(只留扩展位)⑤敌方 attack_type 填值归敌人系统/战斗结算侧(非本批——敌方定义数据、与名字血量同时读写、无独立时序)⑥术语登记(v0.6 已做完:术语表+registry)⑦数值验证义务=改前/改后同种子配对读数。解锁通道=并联双通道;一次冒险=一武器类型+一甲型。**✅ 已全批入库(2026-10-12,/goal+iter U0 开工单会话交付——worktree g-plan2-iter23-forge 七提交;T1 行族+T2 两轴移交+T3 写口族+T5 存档 v7(序调先行)+T4 注入链+T6 工作间 UI+T7 收口;冒烟 938/0+run_all 24 套+probe click/full+render_gate+doc 三闸/熵增对基线零新增+MC 同种子配对零漂移;实现报告=design/qa/iter23-实现报告-2026-10-12.md;残留人闸=实机目检工作间形态与购买交互〔07 在册〕;代拍板追认单+GDD 反哺点待用户)** | ✅ 已入库(出口闸全绿+实机目检归用户 07 在册) | 估时随需求卡片立项(实际单会话) | | 迭代 24 | **①敌人表内容修批(三关)(2026-10-13 用户令编入;**本迭代位预留后续追加卡**——用户将把其他需求陆续编入本迭代)**:需求卡片=`design/research/需求卡片-敌人表内容修批-2026-10-13.md`(**v1.1**——grilling 复核九问 Q1-Q9 已全裁、零待裁点、开工门=U0)。三件事合一:**N1** 第一关 (1,2) 降档(`enemy.tres:48` 改两值:`hp` 50→22、`armor_class` 3→2;**敌种 `bugbear` 不动**——`enemy.tres:594-600` 注释载明该行 50 血系 2026-09-24 用户裁决的设计而非填错,且 `hobgoblin` 无立绘,故「改敌种」案已否决;本批定性=阶名化解方案实机未达预期按 2026-10-13 体验反馈重裁)· **N2** 第二/三关普通敌技能投放(`skills.tres` 12→14 行:新增 `venom_spit` 毒吐 damage 1.6/CD2 挂 (2,5)/(2,6)/(2,7) 巨蜘蛛族、`shield_bash` 盾击 damage 1.7/CD3 挂 (3,0)/(3,5)/(3,7) 灰矮人族;**首遇教学位 (2,4) 池不动**,venom_spit 自 (2,5) 起投;两新行均不带 `rider_mult`——低 atk 下恒被 `damage_floor` 兜成 1 与 0.75 档等效)· **N3** 敌方 `attack_type` 加列并全填 `normal`(挂**敌种行**、20 行同值,不做差异化;`enemy_table.gd` 加枚举校验 + `unit_container.gd:119` 加单位快照 + `battle_orchestrator.gd:1406` 第 9 参由 `""` 改传值;全局平移=穿重甲受伤 −1 / 魔法护甲 +1 / 轻甲 0,使锻造甲路线首次具备战斗意义)。**契约要点**:池与敌种键属**契约级**,改必同步 `smoke_all.gd:3211` `expect_pools`(N1 因键值不变零改动、N2 同步 6 键);节点图拓扑零触碰(A1 关卡节点图重构的地盘);(1,1) 地精一伙不在本批范围(「第二个节点」字面偏差已登记 06)。**收口去向**:06「第一关遭遇表数值异常」「第二关技能池与投放」与锻造工坊条迁移面⑥ 三条一并销号;08「二·内容量」敌种池行注摘除 | ✅ 已入库(2026-10-13 单会话交付,出口闸全绿:冒烟 949/0+run_all 25 套〔485 批基线漂移 24→25 在案〕+探针 click/full+render_gate golden 0.00%+doc 三闸/熵增对基线零新增+MC 配对三组读数;实现报告=design/qa/iter24-实现报告-2026-10-13.md;残留人闸=实机目检三观测 07 ㉓) | | 迭代 25 | **①UI 全局主题批(引擎原生控件接管皮肤)(2026-10-13 用户令编入;UI 美化三层诊断 · 第一层第一条)**:**✅ 已全批入库(2026-10-13 /goal+iter U0 开工单会话交付,worktree g-plan2-iter25-theme 分支 iter25-theme-20261013)**——**T0 主题资源**:新建 `game/assets/theme/main_theme.tres` 挂 `project.godot` `gui/theme/custom`(15 类型全覆盖:V/HScrollBar·ScrollContainer·H/VSlider·TooltipPanel/Label·LineEdit·SpinBox·H/VSeparator + 预盖 CheckBox/CheckButton/OptionButton/PopupMenu 弹层;`default_font` 显式指向现役同字体文件=V6 中文字形防御;位图由 `tools/gen_theme_icons.py` 一次性生成落 `game/assets/art/ui/gen/`,色值溯源表落 `game/assets/theme/README.md`)· **T1 换代退役**:`ui_kit.gd` 的 `tooltip_theme()`/`_tip_theme` 与 `styled_slider()` 样式段、`ui_assembler.gd` 挂载行同批删除(禁新旧并存),settings_overlay 几何内联+debug_overlay `_slider_row` 双轨消隐· **T2 断言与文档同步闸**:冒烟新增 V1-V6 主题词条断言 38 条。**顺手销号**=06 第三层「UI 元素细节修」之①(音量滑轨两段对比度重配=已填充段 BG_ROOT #3A2E22 对暖石 #B8A582 实测 5.49:1)。**契约遵守**:🔴 Button 类型词条零接触(冒烟断言在闸)· 🔴 focus 族词条零定义(全主题扫描断言)· 🔴 零新增美术素材(位图=脚本生成纯色/几何)· 🔴 全局纹理过滤未动。**引擎事实订正(呈报追认)**:Godot 4.7.2 源码+默认主题链双查实证——①CheckButton 图标词条名与 CheckBox 同套 `checked`/`unchecked`(卡片 v1.2 注③「CheckButton 用 on/off」不成立,按引擎事实落位)②Slider 无 `grabber_pressed` 图标槽(冻结表「柄·按」值 GOLD_DEEP 留档未落位)③ScrollBar 柄是 StyleBox 非 Icon(无需位图)④4.7 导入参数已无逐贴图 filter 标志(位图原生尺寸消费无滤波伪影)。**闸**:冒烟 987/0(基线 949+本批 38 断言)+run_all 25 套+probe click/full+render_gate golden 0.00%+doc 三闸/熵增对基线零新增;MC 零跑(零数值零行为=纯呈现)。**收口去向**:06「UI 全局主题资源缺失」条移除+「UI 元素细节修」①销号;08 升 v1.3(三·界面主题行→在役、五·表现细节修行注①销号);07 ㉔ 全屏巡检登记;实现报告=design/qa/iter25-实现报告-2026-10-13.md。**待用户**:实机目检全屏巡检+专项观察点二(07 ㉔,登记不阻塞)+代拍板追认单(位图不入 git 政策口径/CheckButton 词条名订正等)+GDD 反哺点(组件规格是否立条款入 art-bible §7 等)。↓ 原任务登记:三件事合一——**T0** 新建 `game/assets/theme/main_theme.tres` 并挂 `project.godot` 的 `gui/theme/custom`,覆盖滚动条 / 滑轨 / 悬停气泡 / 输入件 / 分隔线等引擎原生控件,并预盖 CheckBox / CheckButton / OptionButton 及其弹层 PopupMenu(须在新主题内显式设 `default_font`=现役同一字体文件;新增小位图落 `game/assets/art/ui/gen/`,色值溯源表落 `game/assets/theme/README.md`)· **T1** 退役 `ui_kit.gd` 的 `tooltip_theme()` 与 `styled_slider()` 两处局部做法、消 `debug_overlay._slider_row` 双轨(🔴 旧实现同批删除)· **T2** 断言与文档同步闸。契约要点:🔴 Button 类型词条零接触 · 🔴 focus 族词条零定义 · 🔴 不新增美术素材、不改美术圣经 §7 · 🔴 全局纹理过滤不动 | ✅ 已入库(出口闸全绿+实机目检归用户 07 ㉔ 在册) | T0-T2≈0.5–1d(实际单会话) | | 迭代 26 | **①UI 交互与观感批(2026-10-14 用户令编入;UI 美化三层诊断 · 第一层第二/三条+第三层四件;本迭代位预留后续追加卡,同迭代 24 先例)**:需求卡片=`design/research/需求卡片-UI交互与观感批-2026-10-13.md`(**v1.2**——grilling 两轮八裁全落、零待裁点、卡片成立)。六项:**T1 按钮五态矩阵**(悬停=乙案 modulate 提亮〔与 primary_button 现行 `CANDLE.lightened(0.06)` 同纪律〕/禁用=本族底+α0.45 幽灵化/焦点=INK 2px 内缩 1px/危险钮补本族 pressed;走逐实例 override,迭代 25 两条主题红线断言维持不换代)· **T2 全局纹理过滤**(`project.godot` `default_texture_filter=0`+vignette/gradient_base/beams 显式 LINEAR 白名单+翻转面全枚举)· **T3 <4.5:1 换墨**(站桩顺位/护甲徽标换同族亮档+RAP 行 STONE_DEEP,机检断言锚定)· **T4 光柱连续 alpha 渐变**(0→0.05→0 横向+纵向衰减)· **T5 元素细节余②③**(BCard 图标槽明度差降档/商店卡片区垂直居中/营地四栏等高)· **T5b 诊断转储钮移调试浮窗**(`dump_diagnosis` 功能保留)。🔴 契约 5 条(主题层零新增词条/零新美术素材/棋盘零触碰/对比度 ≥4.5:1/旧实现同批清理);验证闸 V1-V7;代拍板白名单八项;反哺点四条;**渲染闸 golden 面处置**=T6 第 4 步(徽标换墨落 board golden 裁剪区:闸红→核热区限预期面→显式重制基线+呈报→复闸,超预期=L3)。**范围订正**(grilling 实查,iter25 滑轨条同款先例):②垫块仅三选一 BCard(商店卡实为纯文字行卡)/③仅商店+营地(三选一已居中)/危险钮「无按下态」订正为「在但皮肤错配」。估时 T0-T6≈2–2.5d | **✅ 已全批入库(2026-10-14 /goal+iter U0 开工单会话交付,worktree g-plan2-iter26-ui 分支 iter26-ui-20261014 七提交)**——T0 基线+枚举(含卡片 §2.2 枚举漏项勘误)/T1 按钮五态(悬停 modulate 提亮/禁用 α0.45 幽灵化/焦点 INK 2px 内缩 1px/危险钮本族按压态)/T2 全局 Nearest+平滑渐变件 LINEAR 白名单/T3 三处换墨(GOLD_BRIGHT/HERO_BLUE_BRIGHT/STONE_DEEP,6.47/5.88/5.98:1)/T4 光柱连续 alpha/T5 图标槽柔和档+商店居中+营地四栏等高/T5b 诊断钮迁调试浮窗;冒烟 987→1055/0(+68 断言)+run_all 25 套+probe click/full+render_gate golden 0.00%(登记即结未重制)+doc 三闸/熵增对基线零新增;MC 零跑(零数值零行为=纯呈现);实现报告=design/qa/iter26-实现报告-2026-10-14.md;残留人闸=实机目检五项(07 ㉕);待用户=代拍板追认单十三项+GDD 反哺点四条 | T0-T6≈2–2.5d(实际单会话) | | 迭代 27 | **①代码架构技术债修复批(2026-10-14 用户令编入;来源=[代码架构与实现质量审计报告-2026-10-14](design/research/代码架构与实现质量审计报告-2026-10-14.md),双席审计基线 97de02c,已逐条复核)**:需求卡片=`design/research/需求卡片-代码架构技术债修复批-2026-10-14.md`(**v1.2——三点全裁零待裁〔2026-10-14 用户三裁全按推荐案:①第三个 autoload/②单类持四账/③审计五段〕,卡片成立**)。五波:· **波一 场景拆分+局生命周期物化(≈4-5d)**〔P0-1/P0-2:屏容器 .tscn 切分=开始菜单根场景+营地场景+冒险场景〔内含 level_map/battle 两容器〕,视图代码原样搬、**40+ views 不转 .tscn**;SaveManager/MetaProgression 升格跨场景持有者;「一局」物化为可整体 `queue_free()` 的节点,`main.gd:647-657`/`:555-559` 手工清单消亡;13 个 smoke 探针挂载假设同批迁移〕· **波二 `_settle` 拆段(≈1.5d)**〔P1-1:五段 Segment 类 grant/aura/combat/decay/verdict,24 处 kind 分派随段归位,姊妹病灶 `damage_controller.gd:272` 148 行同批拆〕· **波三 账本收口(≈1.5d)**〔P1-4 共享四账 Ledger 类化+P1-2 刷新双账删 main 副本+P1-3 summary 增 `gp_final` 键、删 `gp_shadow_ledger.gd`〕· **波四 组合根可测化抽取+模态协议内聚(≈1.5-2d)**〔P1-5/P2-7;**须在波一落地后重估抽取面再动**〕· **波五 类型闸收尾+卫生件包(≈3d)**〔P1-6 拉闸+存量 73 处收口,**须在其他重构全部落地后**;P2 七组顺手带〕。🔴 契约 6 条(**零行为变更·重构前后同种子完整局输出逐位一致**/只拆不重写/views 不转 .tscn/探针契约零破坏/信号纪律不变/执行顺序锁+渲染零漂移);**核心验收=逐位一致对拍**(RngService 单盐流在役);验证闸 V1-V9;代拍板白名单九项;反馈点两条(architecture/code-conventions)。 | **✅ 已全批入库(2026-10-14 /goal+iter U0 开工单会话交付,worktree g-plan2-iter27-techdebt 分支 iter27-techdebt-20261014 七提交)**——波一 三屏场景化+run_scope 会话物化+双 autoload(7a0d57d)/波二 _settle 五段 Segment+英雄攻击拆步(26301ba)/波三 RunLedger 单类四账+刷新双账删副本+gp_final 删影子账(6fd7d78)/波四 ModalFlow+互斥域 tags+双 context(8b9e556)/波五a 类型闸 368 参数化+审计器+warning 配置(b605022)/波五b 卫生件 13 死代码+FeatsEngine 退役+Callable 换装+状态机 enum 化+ConfigDB 归根+resolver 解耦(T6 笔)/T7 文档同步(本笔)。**闸**:逐位一致对拍三变体五跑全同(V1 核心验收)+冒烟 1055→1081/0(+V2 屏壳 11+V3 两连局 11+V4 段类 16+V6 模态 19+V5 快照 3+V7 2 断言)+run_all 25→27 套+probe click+render golden 0.00%+static_scan S1/S2/S4/S9 全绿(历史 cd 静默空转顺修);MC 对拍=parity_anchor 三变体×40 局×RUNSUM+JSONL 双面(工具入库 tools/parity_anchor.py);实现报告=design/qa/iter27-实现报告-2026-10-14.md(代拍板追认单十五项+GDD 反哺点两条);残留人闸=实机目检五件(07 ㉖);审计报告本体按退役规则 git rm | T0-T7≈12-14d(实际单会话) | | 迭代 28 | **①启动装配与生命周期验收补全批(2026-10-15 用户令编入)**:需求卡片=design/research/需求卡片-启动装配与生命周期验收补全批-2026-10-15.md(v1.0——零待裁点,用户预批连做全批)。六任务:T1 装配语义合同单点化+装配顺序修复+V2 断言重写/T2 boot 链路时序后置条件(_smoke_boot_chain 六断言)/T3 生命周期存活性矩阵(_smoke_lifecycle_matrix 十阶段×五引用面)/T4 渲染面内容断言(shot_probe 两自检+shot_checker 墨色占比+启动态菜单 golden)/T5 变异验证(横切随批)/T6 规范落文+文档同步闸+收口;修复坏事实三件(main.gd:207-210 装配序错致 F5 见战斗界面、smoke_all.gd:176 V2 断言保护 bug、菜单截图无内容断言)。🔴 契约 7 条(零玩法行为变更/合同单点化/断言禁裸下标/测试先行/变异验证门槛/只加不重构/闸机轮次纪律) | ✅ 已入库(2026-10-15 单会话交付:T0-T6 全绿;冒烟 1125/0、run_all 全套、probe_gate --click/--full、render_gate 四闸全绿;变异验证六次注入全见红;实现报告=design/qa/iter28-实现报告-2026-10-15.md;残留人闸=实机目检启动态菜单〔07 ㉗〕) | 实耗≈1 会话(原估 T0-T6≈5.25d) | -| 迭代 29+ | **M4 数值批(**原 22+;迭代 21 已编入天赋树实装批、迭代 22 已编入秘宝实装批(均 2026-10-11 用户令)、迭代 23 已编入锻造工坊实装批(2026-10-12 用户令)**;迭代 24 已由用户令编入敌人表内容修批、迭代 25 已由用户令编入 UI 全局主题批(2026-10-13)、迭代 26 已由用户令编入 UI 交互与观感批(2026-10-14)、**迭代 27 已由用户令编入代码架构技术债修复批(2026-10-14)、迭代 28 已由用户令编入启动装配与生命周期验收补全批(2026-10-15)**,本批顺延 29+**——**Alpha 收官位·未排期**〔2026-10-09 语义换代:M4=Beta 阶段、非 Alpha 收官位,M3 未由用户明令关闭前不排期维持〕——2026-10-05 用户令编入迭代 17 卡②;2026-10-06 用户令移出独立成批并定序「Alpha 阶段最后——内容补全先行、统一数值调整殿后」〔当日曾被编入迭代 18 为收官卡,2026-10-07 用户令撤回〕;**2026-10-07 用户令二次后移:后续新迭代(迭代 20 起)一律不先做 M4,除非用户明确要求启动 M4 批次**)**:四件数值欠账合一批——①削弱档位终值(weaken 现值 −65/duration 2/refresh 考证在册;叠层改续时语义已定案,差 duration 终值+当量锚复算)②调参批数值点评(06 条目现行登记五条——任务口径「八条」与条目五条不符,需求卡片 §2.2 已呈报差异以条目为准)③迭代 10 奖励重构联动欠账①②(钥石产出重标 boss_keystone 首杀 3/3/3·复杀 2/2/3 provisional + 通关率带重扫〔通关回血 20%+AP 件首轮 +1〕)④元进度定价剩余面(forge base 20/比 150 考证在册——06 条目文本「base 10」滞后于 2026-09-22 对齿批已呈报;Boss 两档终值)。读数义务随批=迭代 14 两件后置复算(T6 MC 四带复算+T7 技能池节奏重测,均挂 07);顺路修复 damage_probe A1 改前既有红灯(判式换代批出口报告 §四.7 在册)。**硬约束:一切 MC/verifier 跑批发起前须用户批准;调参联动禁独立调参网络(β 带 [1.2,2.5] 逐 u 检算)**。需求卡片=`design/research/需求卡片-M4数值批-2026-10-05.md`(**v1.2 2026-10-06 案C 增补+联审修订**:v1.1 三事实与第五推算件照旧;联审=P3 转正顺延至重扫读数后/检算工具 WEAKEN_PCT 入同步面/F11 两句死文本全刷/T3·T5 四带复算并账一次跑批双认账/R5 改前锚=本批新立案C 锚/估时段一勘误 4.25d;案C 增补内容照旧=§2.6 三事实〔行为换代/锚全作废/难度预判〕+T0 推算稿第五件=对拍锚按新序重推导+T6 四带复算按案C 新行为首采;T0-T8≈6.25d,天然切分点 T4 末;🔴 契约 5 条含跑批批准制;**✅ 裁点全裁(2026-10-06 用户令:P1甲=维持 2 场·magnitude [60,85] 带内当量锚复算、具体值随出口 provisional 追认/P2甲 不对称有意/P3甲 3-3-3·2-2-3 维持、转正顺延至重扫读数到账且带内(Q4 二裁)/P4甲 不立直购价);开工=U0**) | 迭代 18 全部内容卡(③④⑤⑦)出口+全部内容批行为变更落定+**用户发令(未排期)**——重锚窗口须收尽全部内容批行为变更 | T0-T8≈6.25d(超软盒预挂,段一 T0-T4≈4.25d〔v1.2 勘误,原 4.5 系加总错误〕/段二 T5-T8≈2.0d) | +| 迭代 29 | **①测试分层与门禁语义修正批(2026-10-16 用户令编入)**:把验收语义从「跑一遍没崩=冒烟通过」扭转为「**三层完备+判定可靠**」——兑现用户三条诉求(①最单元的逻辑代码有单元测试 ②整体模块有接口测试 ③整体系统有 UI 方面与场景切换相关的测试)且验收不止于冒烟。四件事:**①本地闸三硬闸**(退出码为唯一权威判据·PASS 串降级为日志;`SCRIPT ERROR`/`Parse Error` 扫描命中即红;断言数为零即红——`probe_gate.sh` 四探针判定改退出码优先、`test_kit.finish` 零断言判红、`run_all` 汇总校验实跑套件数,全部反例实证留档);**②L2 接口层从零建承载**(建 `game/tests/integration/`+`parity_anchor` 收编入闸表+存档⇄RNG 快照往返首个集成用例);**③L3 屏壳切换探针**(新建 `screen_flow_probe`:六步主流程+三屏壳 `visible` 互斥+放弃回退路径,入轻闸);**④L1 补洞+术语订正+状态记录清理**(4 个 core 零指名模块+呈现层风险前三补单测;「冒烟」唯一保留语义=秒级存活检查;15 个游离脚本逐个定性、golden 基线时效判定、补 S5 扫描规则)。🔴 契约 7 条(零玩法行为变更/三硬闸不可绕过/现有断言面只增不减/不引入第三方测试框架/架构事实唯一源=architecture.md/探针契约零破坏/测试执行两入口铁规);验证闸 V1–V11;代拍板白名单 10 项;**无用户目检项(纯基建)**。需求卡片=`design/research/需求卡片-测试分层与门禁语义修正批-2026-10-15.md`(**v1.4**——v1.1 CI 从未通电/v1.2 CI 全删后 T1 主体改本地闸/v1.3 排期定迭代 29+§0 串行裁决(iter28 入库后开工)/v1.4 随决策文档体系废除改契约 5 口径;T0–T8≈5.5–7d)。**⚠ 卡片事实基线待 v2.0 重核**:v1.4 冻结于 iter28 入库前(冒烟 1086/0·run_all 27 套·探针 11),master 当期=冒烟 1125/0+`tools/run_all_gates.sh` 重闸编排另立(轻闸=`run_all_gates.sh --quick`)+architecture.md「测试与质量域」节已成文——U0 须先重核升版再开工 | 迭代 28 出口(✅ 已满足——2026-10-15 已入库)+**U0 开工门**:Q3–Q7 五项裁点全落+卡片 v2.0 重核+用户 `/iter` 发令(Q1 已闭环·Q2 已作废) | T0–T8≈5.5–7d(软盒 7d;天然切分点 T1 末/T4 末,超盒拆两批) | +| 迭代 30+ | **(位空·无批次——原「M4 数值批」已废)**:2026-10-16 用户令删除需求卡片(原话「它就不是一个应该存在的东西」)⇒ **禁止再以「M4 数值批」名义立批、再规划、再引用已删卡片**。四件数值欠账本身仍在册——①削弱档位终值 ②调参批数值点评(06 条目现行五条)③钥石产出重标+通关率带重扫(迭代 10 奖励重构联动欠账)④元进度定价剩余面(forge 定价·Boss 两档终值)——连同各批 provisional 终值标定义务,**一律归 `design/gdd/06-待办清单.md` 跟踪,重新归属待用户裁**;随批读数义务(迭代 14 两件后置复算)仍挂 07,damage_probe A1 既有红灯在册。M4=Beta 阶段口径不变(M3 未由用户明令关闭前不排期);本迭代位留空待用户令编入 | 用户发令编入(未排期) | —— | ## 执行纪律(2026-09-27 用户立规)