docs(卡片): 测试分层与门禁语义修正批升 v2.0(三轮复查结论落文,U0 门只欠发令)

grilling 两轮+一轮只读深挖后一次性升版。首轮十一问按推荐全裁(L2 承载+2 例/parity 收编为条件闸件以守「MC 无数值改动零跑」红线/CI timeout 前提已死改铸为轻闸墙钟预算/integration 并入 run_all manifest/S9 存量豁免维持但新写测试件全类型标注〔升契约 8〕/golden 显式重制+呈报+复闸/smoke 两名不改名只加注);第二轮 N1=§2 改指针(事实面归 architecture.md 测试域三张表,禁双载体漂移)、N2=T6 收 S3 路径修正+零命中自检(+0.25d)。

事实订正四处:PASS 串判定面实为 8 件探针(非 4);game/smoke 实为 29 个 .gd(非 38);T5 的 status_container 不是零覆盖(2 单测已指名)→ 换 board_generator;README「ci-removal 批已改写门禁节」前提不成立(分支未合入)→ CI 残留 8 处改由本批 T2 清除。死引用订正:CLAUDE.md 旧节号(文件已压到 71 行)、tests.yml(已删)、golden_compare.py 行号。新增义务:批末回写 architecture.md 三硬闸矩阵与 S 表。估时 T0-T8≈6.0-7.5d,软盒 7d。active.md 快照两行同步+状态记录 504。文档三闸全绿。
This commit is contained in:
DKChan committed 2026-10-16 04:24:29 +08:00
1 parent aad2999aba
commit 849e4b1cd2
2 files changed
+168 -162

No files matched your search

+7 -4
View File
@@ -16,19 +16,19 @@
- **工程路线图**:根目录 `roadmap.md`(里程碑时间线的权威;实时状态看下方快照节)
## 当前状态快照(收口批先更新本节,再追加状态记录;≤10 行)
- **更新于**:2026-10-16(迭代 29 编入测试分层与门禁语义修正批〔roadmap 21c83f5〕;M4 数值批已废、四项欠账归 06 在册待裁)。
- **更新于**:2026-10-16(迭代 29 编入测试分层与门禁语义修正批〔roadmap 21c83f5〕;M4 数值批已废、四项欠账归 06 在册待裁;**需求卡片已升 v2.0——三轮复查定稿、零待裁点**)。
- **最新闸态**:迭代 28 批末冒烟 1125/0、run_all 27 套、probe --click 残留 0、render golden 棋盘×3+菜单 0.00%、doc 三闸与熵增对基线零新增、static_scan S9 归零(S10 存量 125 在文件头清偿批在册);MC 零跑。
- **probe --full 曾有一件红**:`t17_defer_probe`「关卡画面未出现」,用户已裁为存量红、不阻合并(合并 5b958ff6);根因是探针未隔离带断点的真实存档,该修复已随 `gatefix-20261015` 合入 master(合并 de8d28b6)。
- **迭代 28 交付**:修好启动时菜单被冒险层盖住的装配顺序,层序收敛为唯一装配合同(散落的两处 `move_child` 删除);boot 链路、九阶段生命周期、启动态菜单 golden 三组验收补全;本批新立硬规则「验收函数无变异红记录不算验收成立」,三处规约落文。
- **迭代 27 交付**:三屏壳场景与局态物化、结算五段拆分、RunLedger 单类持四账、模态编排类、类型闸、死代码退役,编排器由 1725 行降到 1325 行。
- **规约体系现状**:规则文件按领域拆为 7 份、单文件上限 150 行,CLAUDE.md 只留元信息、命令、目录、规范导航与一行一条红线;动手前按规范导航表查对应细则。
- **人闸在册两件**:迭代 27 全流程走查〔07 ㉖〕与迭代 28 启动态菜单〔07 ㉗〕,均登记不阻塞;迭代 19~26 的目检已于 2026-10-14 全部核销。
- **人闸在册两件**:迭代 27 全流程走查〔07 ㉖〕与迭代 28 启动态菜单〔07 ㉗〕,均登记不阻塞;贫矿脉目检项〔07 ⑪〕已随 2026-10-16 屏蔽令转记失效;迭代 19~26 的目检已于 2026-10-14 全部核销。
- **簿记出清**:迭代 19~26 的代拍板追认单与 GDD 反哺点已全部裁决落文,对应 14 份迭代实现报告按「证据只留最新」删除(git 历史可考)。
- **已裁在册**:M4 数值批已废(2026-10-16 用户删卡令——禁止再以该名义立批/规划/引用已删卡,四项数值欠账归 06 在册、重新归属待裁);**迭代 29=测试分层与门禁语义修正批**(2026-10-16 用户令编入·待开工——需求卡片 v1.4,开工门 U0=Q3–Q7 裁点+卡片 v2.0 重核+`/iter` 发令);迭代 27/28 位预留追加卡。
- **已裁在册**:M4 数值批已废(2026-10-16 用户删卡令——禁止再以该名义立批/规划/引用已删卡,四项数值欠账归 06 在册、重新归属待裁);**迭代 29=测试分层与门禁语义修正批**(2026-10-16 用户令编入·**待开工**——需求卡片 **v2.0**(三轮复查定稿、**零待裁点**),开工门 U0=**仅欠 `/iter` 发令**);迭代 27/28 位预留追加卡。
- **界面美化三层**:第一层三件全部交付;余第二层三件(贴图/字体/样张)与第三层其余(九宫格切片/棋盘观感)待立项。
## 未决面(进行中/待人闸/待裁点指针;现行事实源登记处=`design/gdd/06-待办清单.md`)
- 待用户裁决(06 在册):迭代 27 GDD 反哺两条;迭代 28 GDD 反哺三条;美术审计两项 P0(art-bible 死样张指涉、主角像素管线重产);去毒残留词是否清扫(「魔法道具」约 30 处、「罕见」约 18 处);喂雷流 R5 甲重启条件回落文;「通关」与「通过第 N 关」全库口径统一(约 273 处)。
- 待用户裁决(06 在册):迭代 27 GDD 反哺两条;迭代 28 GDD 反哺三条;美术审计两项 P0(art-bible 死样张指涉、主角像素管线重产);去毒残留词是否清扫(「魔法道具」约 30 处、「罕见」约 18 处);喂雷流 R5 甲重启条件回落文;「通关」与「通过第 N 关」全库口径统一(约 273 处);**贫矿脉屏蔽的设计语义面反哺五处**(地形变异.md §全局作用域型/HUD 框架三层预告/教学引导手册行/难度曲线与Boss 两行/art-bible §4.6.3 括注——均描述已撤回功能,待裁是否改写,机械面已同步)。
- 待用户追认:迭代 27 代拍板十五项、迭代 28 代拍板十三项(含四条白名单外),清单在两份现行实现报告的追认单节(`design/qa/iter27-实现报告-2026-10-14.md`、`design/qa/iter28-实现报告-2026-10-15.md`);req-card 技能的 WorkBuddy 与 ZCode 两份副本是否取齐待裁。
- 待发令:**迭代 29 测试分层与门禁语义修正批**(U0 门:Q3–Q7 裁点+卡片 v2.0 重核+`/iter` 发令);迭代 27/28 预留追加卡;黑话清扫第二波(GDD 正文流程动词族约三千处);规则文件编写 skill(按 497 批工作流提炼)。
- 在途分支未合入 master(读现状时勿当已入库):`art-standee-20261006`(artwork 独立仓 dry-run 报告+立绘定档,领先 5 笔)、`stc-norm-20261015`(GDD 用语规范批,领先 4 笔);`gatefix-20261015` 已合入 master(合并 de8d28b6);`ci-removal-20261015` **未合入**(4 项改动仍是 worktree 未提交状态——其 ADR 定位两条已被 2026-10-15「决策文档体系废除」批取代,仅 CI 清除部分对迭代 29 仍有效);`doc-adr-fixes-20261014` **方向已废**(ADR 四节重建/修订注记与用户「ADR 不需要保存」裁定相反,分支去留待用户裁)。
@@ -48,3 +48,6 @@
- **501(2026-10-15~16,简明技术中文用语规范批总收口)**:用户令对 design/gdd 全 45 文件做三层语言规范并融合词表——词面约 250 处按术语表「用语规范」A 表替换(不得→禁止/收口→完成/随批→顺带等 12 行,五子代理分四波执行+逐处语境裁决)、术语表 v1.12 新立「用语规范」节(STC 词表为权威+豁免三类+注销词义限定注)、词条五组(总线/抽屉、机能件/机制件、装板/摇号、坍塌显形、增益归一)+死链全库清零(3 处:config_fatal_probe 去向双证落 v0.4 行注、武器锻造漏改 2 处)+doc_term_audit 吸收 A 表 10 词与随批/台账补扫通道。**本批两教训**:①合回闸与「文档批零测试」铁规冲突时助手机械服从、擅跑全量测试两轮(含渲染闸),用户暴怒——正解=改闸的判断条件,现守卫已加「纯文档合入豁免」(merge diff 不触 game/ 直接放行,代码合入仍全量闸);②坑册新增:守卫按命令文本解析分支名(cd 前缀/环境变量前缀连坐误拦)、.import 边车被全局忽略致 worktree 冷检出探针 texture=null 假红。合并 af321c03(九提交,纯文档合入未跑测试,同日 4ed48b86 前例)。
- **502(2026-10-16,迭代 29 编入批——roadmap 门牌登记)**:用户令「把需求卡片写进 roadmap 的迭代 29」——此前需求卡片只存在于中间文档,roadmap 仍写「下一前沿=迭代 29+ M4 数值批」,致别的会话启动迭代 29 时跑去做 M4(该卡同日已被用户删除=死引用)。本批三改:①roadmap 迭代 29 行改写为「测试分层与门禁语义修正批」(需求卡片=`design/research/需求卡片-测试分层与门禁语义修正批-2026-10-15.md`,v1.4,T0–T8≈5.5–7d,开工门 U0=Q3–Q7 裁点+卡片 v2.0 重核+`/iter` 发令),新增「迭代 30+ 位空」行记录 M4 废除(禁止再以该名义立批/规划/引用已删卡;四项欠账归 06 在册待裁),迭代 23+ 原始泊位行加作废注仅作排期史保留;②需求卡片升 v1.5(排期行与 §5 同步行更新;登记 v2.0 重核遗留=残留 CI 措辞四处+事实基线换代〔冒烟 1086→1125/0、门禁五闸→run_all_gates.sh 编排、architecture.md 测试域节已成文、Q3 的 CI timeout 前提消失〕;订正 v1.3 版本条目尾部重复段);③本文件快照与未决面三行同步换代。文档三闸全绿(gdd_lint 0 不通过/死链 0/疑似现行 0)。提交 21c83f5。**遗留待用户裁**:06 待办清单登记一条(卡片入库纪律);`ci-removal-20261015` 分支重做(撤 ADR 两条、只保留删 .github/、rebase 现行 master)。
- **503(2026-10-16,贫矿脉屏蔽+DS_DEBUG 写死批总收口)**:用户令两项一波走完(worktree `g-plan2-shielddebug-20261016`,五提交,合并 d3356985,合并后主区冒烟 1126/0 兜底)。**①贫矿脉屏蔽**:`variation.tres` 删 skewed_veins 行(用户裁「地形变异特异关卡后续重新做设计,先屏蔽」)——Boss/精英图全局池空→`_resolve_global_variant` 空行回落→region 布置原路兜底,玩家面零横幅零角标零资源偏斜;冒烟 7 处断言换代为「全局池空→region 兜底回落」路径(行数 7→6/boss 池去 global 行/L2 boss+elite 全局决议空行/格子级恰一行且在 {magma,ash}/快照空态一致/同种子确定性含 variants 字典逐位);resource_face 机制代码(RewardEconomy 偏斜投影/schema 互锁/负样本)零触碰,重建设计直接加行即可;删行依据与首发批裁决记录改写为屏蔽注记(git 历史可溯)。**②DS_DEBUG 写死**:`main.gd:219` 环境变量读取退役、`_debug_entry` 恒 true(用户令「直接写死,不读环境变量,太麻烦」)——全库 DS_DEBUG 引用清零(含浮窗内用户可见工具提示文案);闸断言三处换代(smoke V2f 改恒开/click_probe 原「未设时不得默认开」反转为「未恒开即失守」并挪至 boot 段、设置面关闭段补 ModalStack 遮挡恢复断言/tune_probe 删自设环境变量死代码);**发布前删除事项=main.gd:219 一行**(无 CI,两道恒开断言会红兜底)。**闸面三修**(首跑抓出):冒烟跨块引用 bb/crng 出作用域 Parse Error(hoist 为 boss1_ids/variants/calls);shot_probe 截图前走 `_close_modal` 真实单口归一浮窗(写死后 boot 即开压菜单——boot 顶层检查/golden 19%/文字占比 0.00% 三处受扰;视觉契约与调试模式解耦,发布前删写死时基线不受影响);click_probe 恒开断言归位。**基线 09 指纹刷新**:静态扫描红项清单与基线不符,经主区与分支 `audit_file_headers` 输出逐行一致(128 行)证明非本批引入(漂移源于 20f4a7dc 之后主区 .gd 头注变动),按「人工确认后重生成」条款对齐指纹,红项仍为存量 127 处。**验收**:全量闸通过(存量红零新增,回执 commit=HEAD);worktree 与分支已清理。**读数义务归 M4**:Boss 图资源面分布与 region 布置读数(本批 MC 零跑,内容回落既有 region 行为)。**反哺点待裁**:设计语义面五处描述已撤回功能(地形变异.md §全局作用域型/HUD 框架三层预告/教学引导手册行/难度曲线与Boss 两行/art-bible §4.6.3 括注);机械面四件已随批同步(07 ⑪ 转记失效/architecture 行数 7→6/数据配置清单/06 战斗节点地图类型差异化条)。
- **504(2026-10-16,需求卡片升 v2.0——三轮复查结论落文,U0 门只欠发令)**:grilling 两轮+一轮只读深挖后一次性升版(用户令「实现相关的都可以用你推荐的,但重新检查一遍」)。**首轮十一问按推荐全裁**:L2 承载+2 例(Core-Core/A1×A2 随属主批增量)/parity 收编为**条件闸件**(仅 diff 触 data-tables/meta-save/rng/settlement 跑,否则 SKIP,守住「MC 无数值改动零跑」红线)/CI timeout 前提已死、改铸为轻闸墙钟预算(T0-② 实测,超用户上限才议分层或并发)/integration 并入 run_all manifest/S9 存量豁免维持、本批新写测试件全类型标注(升 🔴 契约 8)/golden 失效显式重制+呈报+复闸/smoke 两名不改名只加注。**第二轮两项亦按甲**:N1=§2 改指针(事实面归 architecture.md「测试与质量域」三张表,禁双载体漂移——ADR 教训同款防复发);N2=T6 收 S3 路径修正(core→game/core+零命中自检,+0.25d)。**事实订正四处**:PASS 串判定面实为 8 件探针(非 4)/game/smoke 实为 29 个 .gd(非 38)/T5 的 status_container 不是零覆盖(2 单测已指名)→ 换 board_generator/README「ci-removal 批已改写门禁节」前提不成立(分支未合入)→ CI 残留 8 处(README 6+run_all.gd 头注 2)改由本批 T2 清除。**死引用订正**:CLAUDE.md:21/:106/:116 与 §0 的 :102-103(文件已压到 71 行)、tests.yml(已删)、golden_compare.py:11(实际 :13)。**新增义务**:本批落地后须回写 architecture.md 的「三条判定硬闸现行状态」矩阵(缺失→在位)与 S 表。估时 T0–T8≈6.0–7.5d(+0.5d),软盒 7d 维持。**U0 现状:零待裁点+v2.0 成立,仅欠 `/iter` 发令**;唯一待补输入=轻闸墙钟上限(T0-② 前给即可)。文档三闸全绿。
@@ -1,30 +1,35 @@
# 需求卡片:测试分层与门禁语义修正批(本地闸三硬闸 · L2 集成层建承载 · L3 屏壳切换探针 · 覆盖补洞 · 术语订正 · 台账清理)
- 版本:v1.5(2026-10-15 成文 v1.0 → v1.1 → v1.2 → v1.3 → v1.4 → **v1.5**)
- 版本:v2.0(2026-10-15 成文 v1.0 → v1.1 → v1.2 → v1.3 → v1.4 → v1.5 → **v2.0**)
- 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.2(用户令后执行态):①**用户裁「CI 没有用、后面也不用、不留死配置」** ⇒ `.github/workflows/` 全数删除(分支 `ci-removal-20261015`),CLAUDE.md 硬性红线立「不建/不留/不参考 CI 配置,改门禁只改本地闸」;本卡 T1④「CI 同步对齐」、T2「CI job 改名」、Q2「是否并入 CI」、§5 同步面 CI 行**全部删除**;②**架构事实源纪律已成文**(CLAUDE.md 硬性红线 + doc-conventions);③排期订正:迭代 28 位已被「启动装配与生命周期验收补全批」占用。
- **v1.3(2026-10-15 用户令「放到迭代 29」)**:①排期定为 **迭代 29**;②新增 **§0 前置依赖与并行性**——裁决**串行**(须等 iter28 收口),四条依据,并标明**例外**(CI 清除 4 文件建议先行合并);③T0-③/T0-④ 加注「开工日重采基线 + 复核 iter28 是否已改过相关行」。
- **v1.4(2026-10-15 用户令「决策记录归 git commit log、不另存决策文档」)**:①历史决策文档体系整体废除,在效事实已由 10-15 文档批迁入 `design/dev/architecture/architecture.md`;②🔴 契约 5 改写为「架构事实唯一源」口径;③Q1 闭环、§5 同步面改写为 architecture.md;④全文引用清除。
- **v1.5(2026-10-16 roadmap 编入笔)**:roadmap 迭代 29 行改写为本批+新增「迭代 30+ 位空」行;§5 `roadmap.md` 同步行与排期行更新;订正 v1.3 条目尾部重复段。
- **v2.0(2026-10-16 三轮复查后定稿笔;用户令「实现相关的都可以用你推荐的,但重新检查一遍」)**:①**事实面改指针(N1 甲)**——§2 不再自持门禁/扫描域事实表,一律指 `design/dev/architecture/architecture.md`「测试与质量域」节(:135-178)三张表(五模块归属表/「三条判定硬闸现行状态」×5 闸矩阵/S1–S8 承接表),本卡只留**本批专属增量事实**;②**首轮 11 问按推荐案全裁**(Q1 闭环·Q2 作废·Q3–Q7 依推荐);③**第二轮 N1/N2 亦按甲**:N1=§2 改指针,N2=T6 收 S3 路径修正(+0.25d);④**订正四处事实**:PASS 串判定面实为 **8 件探针**(轻闸 4+`--full` 4,仅 `ui_click_probe` 查退出码)非 4;`game/smoke/` 实为 **29 个 `.gd`**(17 个无 `.tscn` 宿主)非 38;T5 的 `status_container` **不是零覆盖**(2 个单测已指名)→ 换 **`board_generator`**;README「门禁节已由 ci-removal 批改写」前提不成立(分支未合入)→ CI 残留 8 处改由本批 T2 清除;⑤**订正死引用**:`CLAUDE.md:21/:106/:116` 与 §0 的 `:102-103`(文件已压到 71 行,节号不存在)、`.github/workflows/tests.yml`(F3/F5/F6 直引已删文件)、`golden_compare.py:11`(实际 :13);⑥**新增架构文档回写义务**:本批落地后须把「三条判定硬闸现行状态」矩阵的「缺失」改「在位」、S 表 S3/S5 随之更新(§5)。
- 来源:[测试审计 — 单测覆盖与验收门禁标准 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 逻辑耦合,**建议先行合并**
- 排期:**迭代 29**(2026-10-15 用户令;**2026-10-16 已写入 roadmap 迭代 29 行**——原「M4 顺延 29+」行随 M4 数值批废除改写为「迭代 30+ 位空」记录)。开工门=U0,须用户 `/iter` 发令。
- **并行性前提已满足**:iter28「启动装配与生命周期验收补全批」已于 2026-10-15 入库收口(冒烟 1086→1125/0),串行裁决的阻塞条件不复存在。开工即建 worktree 分支,主区只读铁律不变。
- **卡片成立状态(2026-10-16)**:三轮复查完毕、**零待裁点**(见 §10)——**仅欠用户 `/iter` 发令即达 U0**。唯一待补输入=Q3 的轻闸墙钟上限(开工后 T0-② 实测前给即可,不阻塞开工)。
### 0. 前置依赖与并行性(2026-10-15 裁决)
### 0. 前置依赖与并行性(2026-10-15 裁决;2026-10-16 复核:前提已满足)
**不能与迭代 28「启动装配与生命周期验收补全批」并行**,四条依据:
**原裁决**:不能与迭代 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/`、改判定脚本、加新探针)。两批并行则该文档无法陈述真话 |
| 1 | **`CLAUDE.md` 汇聚文件** | iter28 T6 要在「批次工作流」加硬规则;本批可能动「硬性红线」节与闸口径句。同一汇聚文件两批改,顺序一乱即互相覆盖 |
| 2 | **`game/smoke/` 是 iter28 主战场** | iter28 改 `smoke_all.gd` / `ui_struct_probe.gd` / `main.gd`;本批 T4 要在同目录新建 `screen_flow_probe.gd/.tscn`,T7 还要给 15 个游离脚本定性 |
| 3 | **基线读数会作废** | 卡片冻结的旧读数(冒烟 1086/套件 27/探针数)在 iter28 加断言后失效——T0 白冻结,V11 改前锚失去意义 |
| 4 | **`08-Alpha版本标准` 会自相矛盾** | iter28 写「测试基建四行状态不变——只加断言不加新设施类」;本批恰恰动测试设施本身。并行则该文档无法陈述真话 |
⇒ **串行。本批在 iter28 收口合入 master 后开工,且 T0-③ 基线以 iter28 收口后的读数重新冻结**(卡片现有 1086/27 数字作废,开工日重采)。
⇒ **串行裁决维持,但阻塞已解除**(iter28 已于 2026-10-15 入库)。**T0-③ 一律以开工日 master 当读数为基线**——卡片旧数字全部作废,§2.1 只留待填空表,不再写死预估值。
**⚠ 引用订正(2026-10-16)**:原依据里 `CLAUDE.md:102-103`(批次工作流)与 `:115-116`(硬性红线)两处行号**已失效**——该文件经 2026-10-15 规则文件审计批压到 71 行,纪律节现为「硬性红线」`:52-70`、闸口径在 `:19`/`:55-57`。**本卡一律不引 CLAUDE.md 行号,只引节名。**
**例外段已作废**:原「CI 清除 4 文件先合并」的例外不再成立——`ci-removal-20261015` 分支**未合入**(其 ADR 定位两条已被 2026-10-15 决策文档体系废除取代,分支去留待用户裁)。其中 `game/tests/README.md` 的门禁节改写**改由本批 T2 自吃**(见 §2.2 F6)。**本批开工不依赖该分支。**
**例外(可先行)**:已完成的 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 方面的和场景切换相关的测试。**并且验收不能只是"冒烟"——可以是冒烟,但更重要的是逻辑正确性**
---
@@ -33,102 +38,93 @@
把验收语义从「**跑一遍没崩 = 冒烟通过**」扭转为「**三层完备 + 判定可靠**」。四件事:
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 扫描规则。
1. **门禁判定语义修正(本批第一优先)**:本地闸判定从「无超时 + 日志含 PASS 串」改为**三硬闸**——①退出码为唯一权威判据(PASS 串降级为日志);②`SCRIPT ERROR` / `Parse Error` 扫描命中即红;③断言数为零即红。
2. **L2 接口层从零建承载**:新建 `game/tests/integration/`,把现成但游离的 `parity_anchor` 确定性对拍收编为**条件闸件**;补「存档 ⇄ RNG 快照往返」集成用例(README 章程登记四类之一)。
3. **L3 补上屏壳切换**:新建屏切换探针(菜单→营地→冒险→战斗→结算→回营地),断言屏壳 `visible` 互斥与流程状态,入**轻闸默认段**。
4. **L1 补洞 + 术语订正 + 台账清理**:4 个真零指名 core 模块补单测;「冒烟」一词回归本义(秒级存活检查);`game/smoke/` 游离脚本定性、golden 基线时效判定、**S3 路径修正与零命中自检**、补 S5 扫描规则。
**完成定义**:
- 三硬闸在位且**有反例实证**(造必然失败的套件/探针,CI 判定必红——不是推断,是跑出来的证据,留档);
- 三层各有在册承载(L1 `unit/` 27+ 套、L2 `integration/` 从 0 到 ≥1 套、`smoke/` 屏切换探针入 CI);
- **本地闸**判定三硬闸在位且有反例实证(`smoke_all` 已在本地轻闸跑,本批不解决"跑不跑",只解决"判得对不对");CI 侧同步对齐(Q2 裁决后执行);
- 术语订正落到机械面(CI job 名/脚本注释/README 索引/CLAUDE.md 口径句);
- 批末四闸全绿;06 登记销号;反哺点列明待裁。
- 三硬闸在位且**有反例实证**(造必然失败的套件/探针,闸判定必红——不是推断,是跑出来的证据,留档);
- 三层各有在册承载(L1 `unit/` 27 套 + 本批新增 7 套;L2 `integration/` 从 0 到 ≥1 套入 manifest;L3 `screen_flow_probe` 入轻闸默认段);
- 判定可靠的**同类缺陷一并清零**:8 件 PASS 串探针改退出码优先、`run_all`/`test_kit` 补断言下限与错误扫描、`static_scan` S3 静默空转修复;
- 术语订正落到机械面(本地闸脚本注释/README 索引与术语小节/`run_all.gd` 头注);**README 与 `run_all.gd` 的 CI 残留全数清除**(CI 已删,文档不得继续教人配 CI);
- 重闸 `tools/run_all_gates.sh` 全量跑批**全绿且回执零新增红**(现役唯一验收入口,见 `CLAUDE.md`「运行与验证」节);06 登记销号;反哺点列明待裁。
---
## 2. 现状事实(代码级,2026-10-15 实查;开工自行复核行号)
## 2. 现状事实(2026-10-16 重核;**事实面只作指针**)
### 2.1 门禁判定面(A 类,代码直读)
> 🔴 **本节不自持门禁/扫描域事实表**(N1 裁决)。测试域的**唯一事实源 = `design/dev/architecture/architecture.md`「测试与质量域」节(:135-178)**,三张表即权威:
> ①**五模块归属表**(`run_smoke`/`run_all`/`probe_gate`/`render_gate`/`static_scan` 各自判定口径与**缺失项**);
> ②**「三条判定硬闸现行状态」×5 闸矩阵**(退出码优先/SCRIPT ERROR 扫描/断言数下限,逐闸标注**缺失**或**不适用**);
> ③**S1–S8 承接状态表**(含 S3「未落地…扫描路径 `core/` 不存在、现行实跑恒零命中」的登记)+ S9/S10 域外扩充。
> **本批落地后须回写这三张表**(§5 义务)——现在它们写着「缺失」,本批做的就是改成「在位」。
> ✅ **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」**全部作废删除**。
### 2.1 开工日实测读数区(T0-③ 填;本卡不预估值)
| 项 | 开工日 master 读数 | 出处 |
|---|---|---|
| 冒烟项数/失败数 | T0 填(参照:iter28 收口 **1125/0**) | `tools/run_smoke.py` |
| `run_all` 套件数 | T0 填(参照:**27** 套) | `run_all.gd` manifest |
| 在闸探针数 | T0 填(参照:轻闸 4+`--click` 1+`--full` 4;`game/smoke/*.tscn` 共 12) | `tools/probe_gate.sh` |
| 轻闸/重闸墙钟 | T0-② 填(参照:`--full` 四件实测 17.4/49.6/63.0/21.9s) | `tools/run_all_gates.sh` |
| 各闸存量红清单 | T0 填(参照:`baseline.json` 十一闸现全绿) | `game/tests/.gates/baseline.json` |
### 2.2 本批专属增量事实(架构文档未载;A 类直读,2026-10-16 复核)
| # | 事实 | 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` |
| F1' | **8 件探针**走「超时 → FAIL;否则 `grep -q "PASS"` → 绿」,**退出码不参与**:轻闸默认 4(ui_input/ui_struct/layout/ui_contrast)+`--full` 4(ui_probe/ui_tune/t17_defer/fx_probe);**仅 `ui_click_probe` 段查退出码**=本批对齐样板 | `tools/probe_gate.sh:54-147`(ui_click 段 :101-102) |
| F2' | `example_test.gd`(样板件)在生产 manifest 实跑;**同类摘除有先例**=`fog_lantern_wiring_test` 随载体退役已从 manifest 摘除 | `run_all.gd:29`;`run_all.gd:48` |
| F3' | core 层**真零指名** 7 个(实扫 23 个 core 文件):`board_data`/`board_generator`/`config_db_cross_validator`/`config_db_resolver`/`minesweeper_rules`/`reward_economy`/`skill_lottery`。⚠ **`status_container` 不是零覆盖**(2 个单测已指名——v1.x 选面有误,本版已更正) | `game/core/`;`game/tests/unit/` |
| F4' | 呈现层零指名(实查):`hud_presenter`、`battle_narrator`;三屏壳无直接单测(由 T4 探针覆盖) | `game/presentation/` |
| F5' | 全库 `change_scene` **零命中**(项目走三屏壳 `visible` 互斥)。T4 可沿两处现成断言源:`smoke_all._smoke_scene_split()` 与 `ui_click_probe._exit_level_screen` | `smoke_all.gd:157`;`ui_click_probe.gd:483,503` |
| F6' | **CI 残留(CI 已删,文档仍在教人配 CI)**:`game/tests/README.md` 6 处(头注 CI/gdUnit4 行、目录布局「CI 冒烟统一入口」、Running「CI 调用点」「CI 旁必须配外部 wall-clock 超时」、Static Scan「提交前双跑:本地+CI」、`## CI` 整节含 gdUnit4 安装说明)+`run_all.gd` 头注 2 处(:2「CI 侧包装外部超时」、:7「由 CI/轻闸单独步骤调用」)。README 另记「18 套件」(现 27) | `README.md:4,5,16,33,39-40,68,73-77`;`run_all.gd:2,7` |
| F7' | `integration/` **不存在**(空壳已删)。README 章程登记四类集成用例(Core-Core/回放确定性/存档⇄RNG 往返/A1×A2 端到端),并注「各 GDD 登记的 deferral 集成用例以对侧登记为生效条件」 | `game/tests/`;`README.md:20` |
| F8' | `game/smoke/` 29 个 `.gd` 中 **17 个无 `.tscn` 宿主**(除 `smoke_all`/`probe_ui_util` 外 15 个待定性):adventure_monte_carlo、auto_player、battle_driver、board_stat_probe、calibrate_boards、damage_probe、defense_scan、dump_battle、experiment_density、level_autoplay、monte_carlo、reward_expectation、rhythm_batch、skill_rhythm_probe、verifier_batch。⚠ **其中 `adventure_monte_carlo`(parity 载体)与 `verifier_batch`(balance_verifier 采集端)是 `CLAUDE.md`「运行与验证」登录在册的手动入口,禁当死件退役** | `game/smoke/`;`CLAUDE.md`「运行与验证」节 |
| F9' | golden 视觉基线冻结于 **2026-09-30**(v3.5 视觉落码后),工具头注已载「资产升档批换代时显式重制基准」 | `tools/golden_compare.py:13` |
| F10' | **S3 静默空转**:`static_scan.sh` 的 S3 扫裸路径 `core`——仓根无此目录(实际 `game/core`;iter27 T5 修过整个脚本的 cd 基线却漏此路径)⇒ 恒零命中恒绿、什么都不扫。架构文档 S 表已登记「未落地…现行实跑恒零命中」;该规则守的是**数值单一事实源**红线 | `game/tests/static_scan.sh` S3 段 |
| F11' | `parity_anchor.py` 载体=`adventure_monte_carlo.gd` 同种子 20 局×3 变体(base/attune/shop)RUNSUM+JSONL 双面字节级对拍;**不在任何闸表**;调的正是 MC 脚本(受 `CLAUDE.md`「MC/模拟:无数值改动零跑」红线管辖) | `tools/parity_anchor.py:1-23` |
### 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` 测试与质量域节 |
---
> **灾害先例(只留指针,不复制事实)**:GDScript 运行时脚本错误不改退出码、不计失败数、静默中断所在函数剩余断言——2026-09-19 实证「309 项 0 失败」实为断言未跑全,沿革见 `architecture.md:157` 与 git 提交史。这是 SCRIPT ERROR 扫描必须存在于判定层的理由。
## 3. 设计契约(红线,违反=L3 停机呈报)
🔴 **契约 1 · 零玩法行为变更**:本批只动测试、门禁、注释、文档、脚本判定。**任何「必须改被测代码才能转绿」的断言 = L3 停机呈报**(唯一例外:断言本身写错且与现行设计冲突,走 §9 白名单 7)。
🔴 **契约 2 · 三硬闸不可绕过**:退出码是唯一权威判据,PASS 串只作日志不作判据;脚本错误扫描命中即红;断言数为零即红。**不得为了让某件历史探针转绿而给它开豁免口**(需豁免=L3 呈报)。
🔴 **契约 2 · 三硬闸不可绕过**:退出码是唯一权威判据,PASS 串只作日志不作判据;脚本错误扫描命中即红;断言数为零即红。**禁止为了让某件历史探针转绿而给它开豁免口**(需豁免=L3 呈报)。
🔴 **契约 3 · 现有断言面只增不减**:27 套件 + `smoke_all` 1086 项零删减。删任何一条断言须呈报并给依据。
🔴 **契约 3 · 现有断言面只增不减**:27 套件 + 冒烟项数(开工日读数)零删减。删任何一条断言须呈报并给依据(iter28 退役 3 条把错误顺序写成期望值的裸下标断言=既有先例)。
🔴 **契约 4 · 不引入第三方测试框架**:gdUnit4 维持 deferred 状态。本批在既有双载体(`-script` + 探针场景)内解决。
🔴 **契约 4 · 不引入第三方测试框架**:gdUnit4 维持 deferred 状态。本批在既有双载体(`--script` 套件 + 探针场景)内解决。
🔴 **契约 5 · 架构事实唯一源(用户 2026-10-15 立规;v1.4 随决策文档体系废除改写口径)**:架构事实只认 `design/dev/architecture/architecture.md`。本批不得回改任何历史文档、不得另立决策文档体系;涉及历史沿革只作引用。仍在生效的架构约束如需变更,**改架构文档**。术语订正只动机械面(CI job 名 / 本地闸脚本注释 / README 索引 / CLAUDE.md 口径句);`game/smoke/` 文件名改名见 §10 Q7。
🔴 **契约 5 · 架构事实唯一源**:架构事实只认 `design/dev/architecture/architecture.md`。本批不得回改任何历史文档、不得另立决策文档体系;历史沿革只作引用。**§2 事实面只作指针**(N1 甲);本批落地后按 §5 回写该节三张表。术语订正只动机械面。`game/smoke/` 改名见 §10 Q7。
🔴 **契约 6 · 探针契约零破坏**:现存 11 个探针的挂载面与断言语义不改(T1 只改判定,不改断言内容)。
🔴 **契约 6 · 探针契约零破坏**:现存 9 个在闸探针(轻闸 4+`--click` 1+`--full` 4;`game/smoke/*.tscn` 共 12)的挂载面与断言语义不改(T1 只改判定,不改断言内容)。
🔴 **契约 7 · 测试执行两入口铁规不破**:本批跑测属「迭代 loop 开发」入口(开工后合法);**MC/对拍类跑批仍按 MC 触发细则**——无数值改动零跑,`parity_anchor` 只作收编验证用,不得借机重锚。
🔴 **契约 7 · 测试执行两入口铁规不破**:本批跑测属「迭代 loop 开发」入口(开工后合法);**对拍收编按条件触发**(Q2 甲)——`parity_anchor` 仅在本批 diff 触数值/存档/RNG/结算面时跑,其余批 SKIP;只作收编验证,**不得借机重锚**。MC/统计类跑批仍须用户批准。
🔴 **契约 8 · 本批新写测试件全类型标注**(Q5 甲):S9 对 smoke/tests 的**存量豁免维持不动**(本批不扩大范围);但本批新写的套件/探针/集成用例一律参数/返回值/容器类型齐全,并把该纪律写进 README 新区示例。
---
## 4. 范围边界
**做**(对应审计 §六 A/B/C/D/F 级):
- A 级全部(CI 三硬闸、术语订正、CI 卫生两件、`smoke_all` 入 CI 或明示不进)
- B 级(L2 建承载 + parity 收编 + 首个集成用例)
- C 级(屏壳切换探针)
- D 级(4 个 core 零覆盖模块补单测;呈现层按风险排前三位)
- F 级(游离脚本定性、golden 时效判定、补 S5 规则)
- A 级全部:三硬闸(8 件探针改退出码优先 + 错误扫描闸件 + 断言数下限);术语订正**含 README/`run_all.gd` 的 CI 残留清除 8 处**
- B 级:L2 建承载 + parity 条件收编 + 首个集成用例
- C 级:屏壳切换探针
- D 级:4 个 core 补单测(`minesweeper_rules`/`board_generator`/`config_db_resolver`/`config_db_cross_validator`);呈现层三件(`hud_presenter`/三屏壳/`battle_narrator`)
- F 级:游离脚本定性、golden 时效判定、**S3 路径修正 + 零命中自检**、补 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 人闸**(实机目检六批)——不归本批。
- **不重写 `smoke_all.gd`**——只做入闸与改名裁点,不拆不重构;拆分区登记 06。
- **不做行覆盖率度量**(Godot 无内建,第三方属新基建);补洞靠「零指名清单 + 人工判定」。
- **架构事实以 `architecture.md` 为准**,本批不回改历史文档。
- **不清理 E 级卫生件**(test_kit static var、4 套件自建断言出口、157 处 untyped 容器、76 处 lambda)——登记 06;本批只统一**新写**断言的出口。
- **不修 07 人闸**(实机目检六批)。
- **不改 `run_all_gates.sh` 的「存量红零新增不判失败」容忍机制**(2026-10-15 用户自定口径)——T0 记录当时存量红清单即可,暴露的存量红走 L3 呈报。
- **不收 S7/S8**(维持 TODO,登记 06)。
---
@@ -136,118 +132,114 @@
| 文档 | 关联点(本批会改变它的哪条陈述) | 同步义务 |
|---|---|---|
| ~~`.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` 增断言数校验 | **机械面·随批更新** |
| ~~`.github/workflows/tests.yml`~~ | —— | **已删除**(2026-10-15 用户令);本卡不再涉及 |
| `tools/probe_gate.sh` | **8 件**探针判定从「PASS 串」改为「退出码 + 错误扫描 + 断言下限」;T4 新探针加入默认段 | **机械面·随批更新** |
| `game/tests/run_all.gd` | manifest 增 7 套件 + 集成件(expect 协议扩);`_run_suite` 增断言数校验与错误扫描;`example_test` 摘除;**头注 CI 残留 2 处清除** | **机械面·随批更新** |
| `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` | 若屏切换探针把部分目检项转成机检,相关条目需改写 | **反哺点四**(待裁:哪些人闸项可转机检) |
| `game/tests/README.md` | 目录布局增 `integration/`;「逻辑冒烟」→「单元套件」;**CI 残留 6 处全清(门禁节改本地闸口径)**;断言计数双口径与「18 套件」按开工日读数;新增术语小节(冒烟=秒级存活检查)+游离脚本台账节+新区类型标注示例 | **机械面·随批更新**(T2,+0.25d) |
| `CLAUDE.md` | 「运行与验证」节轻/重闸口径句(**不引行号**——文件已压到 71 行):仅当 T4 入闸改变分级口径时才改 | **机械面·视需要更新** |
| `tools/run_all_gates.sh` | 新增「回放确定性对拍」**条件闸件**(diff 触面判定 + 未触面 SKIP 记回执) | **闸清单唯一定义处·随批更新**(禁在文档另列清单) |
| `game/tests/static_scan.sh` | **S3 路径修正 + 零命中自检**;补 S5 规则(视余量 S6) | **机械面·随批更新** |
| `design/dev/architecture/architecture.md`「测试与质量域」节 | ①**「三条判定硬闸现行状态」矩阵**:落地后把 run_all/probe_gate/render_gate 的「缺失」改「在位」;②**S1–S8 表**:S3 改「在位(路径修正后)」、S5 若落地改「在位」;③五模块归属表的判定口径列随之更新 | **必做·随批回写**(v2.0 新增义务——事实源必须在批末反映真实状态) |
| `roadmap.md` | 迭代 29 行已编入;估时/状态变化时同步 | **已完成**(v1.5 编入笔);T8 复核 |
| `design/gdd/06-待办清单.md` | 本卡登记条(**按用户 10-15 令缓行至批末统一登记**);新登记:余下 3 个 core 零指名模块、S7/S8、E 级卫生件、覆盖率度量、`smoke_all` 拆分 | **机械面·随批更新**(登记时机听用户令) |
| `active.md` | 状态快照与状态记录 | **机械面·随批更新** |
| `design/dev/code-conventions.md` | 测试纪律节 | **设计权威文档·不随批更新** → **反哺点三** |
| `design/gdd/07-体验验证清单.md` | 屏切换探针转机检的条目改写;golden 若重制登记观测项 | **反哺点四** |
---
## 6. 任务卡
> 估时按 Claude 工作日口径;每卡出口自跑轻闸,全批出口跑重闸(CLAUDE.md:116)。
> 估时按 Claude 工作日口径;每卡出口自跑轻闸,全批出口跑重闸 `tools/run_all_gates.sh`(`CLAUDE.md`「运行与验证」节)。
### 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` 相关行。
- **T0-① 反例实测(关键)**:造两个必然失败的靶子——(a) 零断言套件(走 `quit(0)` 的恒假路径/模拟脚本错误中断);(b) 探针先打印 `PASS` 再 `quit(1)`。分别跑 `run_all.gd` 与 `probe_gate.sh` 判定,**记录是否判绿**。判绿=缺陷坐实,留档作 T1 验收基准;判红=我读错了,立即回报改结论。
- **T0-② 时长预算实测**:实测 `run_all` 全套、`smoke_all`、轻闸 `--quick` 与重闸的墙钟;**并入用户给定的轻闸上限**(Q3 待补输入)作判据——超阈才议分层或并发(并发有 test_kit static var 串台风险,E-11 在册)。
- **T0-③ 填 §2.1 读数表**:冒烟项数、套件数、在闸探针数、各闸墙钟、**存量红清单**。一律以开工日 master 为准,卡片不写死预估值。
- **T0-④ 复核行号**:§2.2 全部 file:line 复核一遍,漂移即订正;外加 CI 残留 8 处行号复核,并确认 iter28 是否已改过 `game/smoke/` 相关行。
- **T0-⑤ 存量红留档**:记录当次 `baseline.json` 各闸状态——三硬闸修好后若暴露存量红,走 L3 呈报由用户定归属。
### 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-④ 确认无其他依赖后删条目,文件保留作样板)。
- **① `probe_gate.sh` 探针判定**:**8 件**探针判定从「超时 + `grep -q "PASS"`」改为「**退出码优先** + PASS 串降级为日志」,全部对齐 `ui_click_probe` 段现役口径(:101-102)。
- **② 脚本错误扫描闸**:抽成**闸件脚本**(复用 `tools/run_smoke.py` 的 `ERROR_MARKERS` 逻辑,不复制代码),同时作用于 `run_all.gd` 各子套件输出与 `probe_gate` 各探针日志。
- **③ 断言数下限闸**:`Kit.finish` 在 `checks == 0` 时判红;`run_all` 汇总校验实跑套件数 == manifest 条目数。
- **④ `example_test.gd` 退出生产 manifest**(T0-④ 确认无其他依赖后删条目,文件保留作样板;同类先例 `run_all.gd:48`)。
> **注意**:`run_smoke.py` 三闸**已完整**,不在 T1 改动范围——它是本批的**参照样板**,②的闸件逻辑从它抽,不是重写它。
### T2 术语订正(机械面)(≈0.25d)
### T2 术语订正 + CI 残留清除(机械面)(≈0.25d **+0.25d ≈0.5d**)
> 前提:历史决策文档不回改(🔴 契约 5)。本节只改机械面文本;架构事实以 `design/dev/architecture/architecture.md` 为准。
> 前提:历史决策文档不回改(🔴 契约 5)。本节只改机械面文本。
- `run_all.gd` / `README.md` / `CLAUDE.md:21` 中「逻辑冒烟」→「单元套件」。
- 定义「冒烟(smoke)」一词在项目内的**唯一保留语义**:**秒级存活检查**(能否启动、能否加载表、能否进主屏)。写进 README 术语小节。
- (CI job 改名项随 CI 删除而取消;`game/tests/README.md` 的门禁节已改为本地闸口径,由 `ci-removal` 批执行)
- 在 README 术语小节同步写明:`run_smoke.py` 之名是历史遗留,**其承载的是系统级断言面,不是冒烟**(改名与否走 Q7)。
- `run_all.gd` / `README.md` / `CLAUDE.md` 口径句中「逻辑冒烟」→「单元套件」。
- 定义「冒烟(smoke)」在项目内的**唯一保留语义=秒级存活检查**(能否启动、能否加载表、能否进主屏),写进 README 术语小节;同步写明 `run_smoke.py` 之名是历史遗留、**其承载的是系统级断言面**(改名与否走 Q7)。
- **CI 残留清除 8 处**(Q8 甲,本批自吃):`README.md` 6 处(头注 CI/gdUnit4、「CI 冒烟统一入口」、「CI 调用点」、「CI 旁必须配外部 wall-clock 超时」、「提交前双跑:本地+CI」、`## CI` 整节)+ `run_all.gd` 头注 2 处。门禁节同步改本地闸口径。**不等 `ci-removal` 分支。**
### T3 L2 接口层建承载(≈1–1.5d)
- 建 `game/tests/integration/`(README 章程早有此规划,一直空壳)。
- 把 `tools/parity_anchor.py` 收编进闸表(重闸级,周期执行),README 登记为「回放确定性」集成用例。
- 新增首个集成用例:**存档 ⇄ RNG 快照往返**(README 章程登记四类之一)——存→读→同种子续跑,输出与未存照常跑的那一路逐位一致。
- `integration/` 纳入 `run_all` manifest 或独立 runner(走 Q4 裁决)。
- 建 `game/tests/integration/`(README 章程早有规划,一直空壳)。
- 把 `tools/parity_anchor.py` 收编为**条件闸件**入 `tools/run_all_gates.sh`(Q2 甲):本批 diff 触 `data/tables`/meta/save/rng/settlement 面才跑全三变体,否则整闸 SKIP 并在回执记 skip;README 登记为「回放确定性」集成用例。**不得借机重锚。**
- 新增首个集成用例:**存档 ⇄ RNG 快照往返**——存→读→同种子续跑,输出与未存档一路逐位一致。**并入 `run_all` manifest**(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)现有断言面,不另起炉灶。
- 新建 `game/smoke/screen_flow_probe.gd/.tscn`:走 menu→camp→adventure→战斗→结算→回营地 主流程,**断言屏壳 `visible` 互斥**(任意时刻最多一屏可见)+ 每步流程状态位 + 回退路径(放弃二击→终局→回营地)。
- **入轻闸默认段**(与 ui_struct/ui_contrast 同段;若 Q3 实测超轻闸上限则改入 `--full` 段)。
- 断言源沿 F5':`ui_click_probe._exit_level_screen` 已实证路径 + `smoke_all._smoke_scene_split()`(:157)现有断言面,不另起炉灶。
### 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。
- 4 个 core 补直接单测:`minesweeper_rules`(揭示/扩散判定)、**`board_generator`**(棋盘生成——Q9 更正项,替代已被 2 个单测指名的 `status_container`)、`config_db_resolver`、`config_db_cross_validator`。
- 呈现层三件:`hud_presenter`、三屏壳(`adventure_screen`/`camp_screen`/`menu_screen`)、`battle_narrator`。
- 全部进 `run_all` manifest;**新写件全类型标注**(🔴 契约 8)。
### T6 扫描域补 S5(≈0.5d,视余量带 S6)
### T6 扫描域:S3 修复 + 补 S5(≈0.5d **+0.25d ≈0.75d**)
- 补 S5 规则(core 禁裸引用 autoload 全局标识符)——按 code-conventions「新违规案例必须先补扫描规则再修码」纪律,F10 已是真实反面案例却无规则。
- S6 视 T6 余量决定;S7/S8 仍留 TODO 并登记 06。
- **S3 路径修正**(N2 甲):`core` → `game/core`,并加**零命中自检**(规则扫描面为空即判红,防「路径写错=恒绿」的静默空转)。该规则守的是数值单一事实源红线,架构文档已登记「现行实跑恒零命中」。
- **补 S5 规则**(core 禁裸引用 autoload 全局标识符)——按 code-conventions「新违规案例必须先补扫描规则再修码」,F10 的 Parse Error 已是真实反面案例却无规则。
- S6 视余量决定;S7/S8 仍留 TODO 并登记 06。
### T7 台账与时效清理(≈0.5d)
- `game/smoke/` 15 个游离脚本逐个定性:在役的写进 README 台账(用途 + 触发方式 + 结果由谁判);失效的退役(走 doc-conventions §10 退役规则)。
- golden 基线时效判定:跑一次 render_gate 判别「三代换代面是否落在裁剪区」——判有效则留并加注,判失效则显式重制并呈报(**不擅自重制**)。
- `game/smoke/` **15 个**游离脚本逐个定性:在役的写进 README 台账(用途 + 触发方式 + 结果由谁判);失效的退役(走 doc-conventions §10 退役规则)。存疑者按**在役**登记并标注(Q10 甲)。
- golden 基线时效判定:跑一次 render_gate 判别「三代换代面是否落在裁剪区」——判有效则留并加注,判失效则显式重制并呈报(**先判再动,禁先动后判**)。
### T8 文档同步闸与全闸(≈0.5d,**末卡**)
- §5 全部**机械面**文档更新完毕(roadmap 编入须用户令)。
- §5 全部**机械面**文档更新完毕。
- **`architecture.md`「测试与质量域」三张表回写**:三硬闸矩阵「缺失」→「在位」;S 表 S3(及 S5 若落地)状态更新;五模块归属表判定口径列更新。
- **反哺点**逐条列明进实现报告(测试术语、code-conventions 测试纪律、07 人闸项转机检)。
- 06 登记销号 + 新登记三条(E 级卫生件 / 覆盖率度量 / `smoke_all` 拆分)。
- 批末四闸全绿 + 重闸周期件全绿。
- 06 登记销号 + 新登记(余下 3 个 core 零指名、S7/S8、E 级卫生件、覆盖率度量、`smoke_all` 拆分)。
- 重闸 `tools/run_all_gates.sh` 全量全绿且**回执零新增红**。
**估时合计 T0–T8 ≈ 5.5–7d**;天然切分点:**T1 末**(门禁语义已修,可单独交付见效)、**T4 末**(三层齐备)。软盒 7d,超盒按切分点拆两批。
**估时合计 T0–T8 ≈ 6.0–7.5d**(原 5.5–7d + T2 CI 清除 0.25 + T6 S3 修复 0.25);天然切分点:**T1 末**(门禁语义已修,可单独交付见效)、**T4 末**(三层齐备)。软盒 **7d 维持**,超盒按切分点拆两批——超盒时**优先切出 S6、T7 的 golden 重制、T5 呈现层第三件**。
---
## 7. 验证闸(逐需求点验收清单)
**能力验证(自动化;谁验=批末四闸闸机,全绿才合并)**
**能力验证(自动化;谁验=批末重闸闸机,全绿才合并)**
| # | 需求点 | 测什么 | 落点 |
|---|---|---|---|
| V1 | 三硬闸-退出码 | **反例实证**:探针打印 PASS 后 `quit(1)` → 闸判红 | T0-① 留档脚本 + T1 探针判定段,新增进 probe_gate 自检 |
| V1 | 三硬闸-退出码 | **反例实证**:探针打印 PASS 后 `quit(1)` → 闸判红(8 件改完后逐段验) | 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 进重闸 |
| V3 | 三硬闸-断言下限 | **反例实证**:零断言套件 → 判红 | `test_kit.finish` 断言 + `run_all` 套件数校验 |
| V4 | 术语订正(机械面) | 本地闸脚本注释 / README 术语小节 / `CLAUDE.md` 口径句 到位;「冒烟=秒级存活检查」定义小节在册;**README 与 `run_all.gd` 的 CI 措辞零命中** | 源码断言(grep 旧措辞零命中) |
| V5 | L2 承载 | `integration/` 在册 + ≥1 套进 manifest;**parity 条件闸件入 `run_all_gates.sh`,触面批实跑一次、非触面批正确 SKIP** | 新集成套进 `run_all`;条件闸件进重闸 |
| 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 |
| V7 | L3 屏切换 | 六步主流程 + 三屏壳 `visible` 互斥(任意时刻 ≤1 可见)+ 放弃回退路径 | 新探针 `screen_flow_probe`,**入轻闸默认段** |
| V8 | L1 补洞 | 4 个 core(含 `board_generator`)各 ≥3 条真值断言;呈现层三件各有断言面;**新写件类型标注全数在** | 新单测进 `run_all`(27 → 34) |
| V9 | 扫描域 | **S3 路径生效 + 零命中自检在位**(造反面案例触发);S5 规则在位且有反例 fixture | `static_scan.sh` S3 修正段 + 自检段 + S5 新段 |
| V10 | 台账与 golden | 15 个游离脚本全定性(在役入台账/失效退役);golden 时效判定结论留档 | README 台账节;render_gate 结论进实现报告 |
| V11 | 零回归 | 批末四闸全绿:冒烟 1086/0(基线复核)+ run_all 全套 + probe --click/--full + 改前改后读数对拍;render_gate golden 对基线零漂移 | 全闸 |
| V11 | 零回归 | 重闸 `run_all_gates.sh` 全量**全绿且回执零新增红**;冒烟/套件数与开工日基线对拍零漂移;render_gate golden 对基线零漂移 | 全闸 |
**测试方式两分法**:V1–V11 全部归**能力验证**(自动化闸,调试接口直改游戏数据沿用现役 DebugOverlay/DS_DEBUG 门控);本批**无用户目检项**(纯基建,不改变玩家可见行为)——若 T7 golden 判失效需重制,则该处置登记 07 观测项并呈报。
**测试方式两分法**:V1–V11 全部归**能力验证**(自动化闸,调试接口沿用现役 DebugOverlay/DS_DEBUG 门控);本批**无用户目检项**(纯基建,不改变玩家可见行为)——若 T7 golden 判失效需重制,该处置登记 07 观测项并呈报。
**闸口径**:轻闸/重闸按 CLAUDE.md:116 分级周期口径;每卡出口自跑轻闸(触碰 presentation 加跑 ui_click/ui_layout);批末四闸全绿才合并;测试执行两入口铁规不破(开工后属迭代 loop 入口,跑测合法);MC/对拍跑批仍须用户批准。
**闸口径**:轻闸=`tools/run_all_gates.sh --quick`,重闸=全量并写回执(`CLAUDE.md`「运行与验证」节);每卡出口自跑轻闸(触碰 presentation 加跑 ui_click);测试执行两入口铁规不破(开工后属迭代 loop 入口,跑测合法);MC/统计类跑批仍须用户批准,对拍按条件闸件跑(契约 7)。
---
@@ -264,26 +256,37 @@
1. 三硬闸的具体实现写法(闸件是独立 `.sh` 还是并入既有脚本;错误扫描正则沿用 `run_smoke.py` 的 `ERROR_MARKERS`)。
2. 断言数下限的具体阈值(每套件 ≥1 还是 ≥3;倾向 ≥1,防误伤小套件)。
3. `integration/` 内部目录分类方式(按系统分 vs 按用例类型分)。
4. 新集成套是并入 `run_all` manifest 还是独立 runner(Q4 裁后执行细节)。
4. 新集成套并入 `run_all` manifest 的执行细节(Q4 已裁甲,expect 协议如何扩)。
5. 新单测/新探针的文件命名与落点(不违背 code-conventions 命名纪律前提下)。
6. 4 个 core 模块单测的断言面取舍(覆盖到什么粒度)。
7. **断言本身写错且与现行设计冲突**时的修法(契约 1 的唯一例外:须在报告中逐条列明改了哪条断言、依据哪份设计)。
8. 游离脚本「在役/失效」的判定(存疑者按在役登记并标注)。
8. 游离脚本「在役/失效」的判定(存疑者按在役登记并标注;`CLAUDE.md` 在册入口禁当死件)。
9. S5 规则的正反例 fixture 构造方式。
10. 提交切分与 worktree 分支命名(走既有 worktree 纪律)。
11. **S3 零命中自检的实现形态**(如何判定「扫描面为空」:目录存在性校验 + 命中数为 0 的显式标注)。
12. **条件闸件的 diff 触面路径表**(哪些目录/文件算「触数值/存档/RNG/结算面」——写进 `run_all_gates.sh` 内,不自造第二份清单)。
---
## 10. 待裁点
## 10. 待裁点(2026-10-16 三轮复查后**全裁**)
| # | 事项 | 备选案 | 推荐 |
|---|---|---|---|
| **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** | 测试域在效架构事实的承载去向 | **已闭环**:迁入 `design/dev/architecture/architecture.md`「测试与质量域」节(:135-178) |
| ~~**Q2**~~ | ~~`smoke_all` 是否写进 CI~~ | **作废**:CI 已删;`run_smoke` 本就是轻闸首项 |
| **Q3** | 套件增长致闸超时怎么办(原问 CI `timeout 120s`) | **甲(改铸)**:CI 前提已死 → T0-② 实测轻/重闸墙钟,**超用户给定上限**才议分层或并发;并发(static var 串台)与分层归 06。**待补输入:轻闸墙钟上限**(不阻塞开工,T0-② 前给即可) |
| **Q4** | `integration/` runner 形态 | **甲**:并入 `run_all` manifest(零新机制) |
| **Q5** | S9 类型闸是否收回 smoke/tests 豁免 | **甲+**:存量豁免维持;**本批新写测试件全类型标注**(升 🔴 契约 8) |
| **Q6** | golden 基线若判失效如何处置 | **甲**:显式重制 + 呈报 + 复闸(iter26 T6 先例);**先判再动、禁先动后判** |
| **Q7** | `run_smoke.py`/`smoke_all.gd` 是否改名 | **甲**:不改名,README/CLAUDE.md 加注「名是历史遗留,实为系统级断言面」 |
| **Q8**(第二轮) | README/`run_all.gd` 的 CI 残留 8 处归谁 | **甲**:本批 T2 吸收(+0.25d);**不等 `ci-removal` 分支** |
| **Q9**(第二轮) | T5 补洞选面 | **甲+更正**:维持四 core 选面,但 `status_container` 已证非空覆盖 → 换 **`board_generator`**;余下 3 个真零指名(`board_data`/`reward_economy`/`skill_lottery`)登记 06 |
| **Q10**(第二轮) | 游离脚本存疑默认 | **甲**:存疑按在役登记并标注;`CLAUDE.md` 在册入口(`adventure_monte_carlo`/`verifier_batch`)禁当死件 |
| **Q11**(第二轮) | v2.0 重核时机 | **甲**:U0 前只读重核(已完),裁点落定后一次性升版=本版 |
| **N1**(第二轮) | 卡片 §2 自持事实表 vs 架构文档 | **甲**:§2 改指针,事实面归 `architecture.md` 三张表 |
| **N2**(第二轮) | T6 是否收 S3 路径修正 | **甲**:收(+0.25d),含零命中自检 |
**开工门**:Q1–Q6 裁决全落(零待裁点)+ 用户 `/iter` 发令 = U0。Q2 可在 T0-② 实测后裁(不阻塞 T0/T1 开工)。
**其他已裁项(首轮推荐案全采纳)**:L2 充分性=承载+2 例(Core-Core/A1×A2 随属主批增量);parity 收编=条件闸件(MC 红线不放宽);新写测试件类型标注=是;README CI 残留=本批吸收。
**开工门 U0 = 零待裁点 + 卡片 v2.0 成立 + 用户 `/iter` 发令。**
**现状(2026-10-16)**:前两项**已满足**——待裁点全清零、本版即 v2.0。**仅欠用户 `/iter` 发令。** Q3 的墙钟上限属 T0-② 所需输入,不阻塞开工。