收尾(合回闸关联档+闸机编排快速失败批): 待办清单两条目完成整条删除的收尾报告落 reports/——改动文件清单、关联档选闸算法说明(三件保险恒跑/02 申报∪推导并集/横切回落全量/回执 scope 字段)、快速失败行为、孤立验证证据(沙箱七场景+闸源选跑 9/65+2s 连击中止)、闸机证据与存量债记账(9 套件+S 域红=迭代 41 在册债非本批新增;指纹 pid 归一化;基线 02/09 实测重生成凭据=用户 2026-10-29 带红合并裁;master 推进作废重做经过;最终回执 tree 与 master^{tree} 校验一致)——报告接收方=已删除的两条待办条目,随批入库

This commit is contained in:
DKChan committed 2026-10-29 05:28:30 +08:00
1 parent 8bb3541c5c
commit 6dea23729b
1 file changed
+61
@@ -0,0 +1,61 @@
# 工程改动报告——合回闸关联档+闸机编排快速失败(2026-10-29)
**接收方**:待办清单原「合回闸关联档——收口跑批按改动关联面选测」「闸机编排快速失败——连续套件超时中止整轮」两条目(两 entry 已随本批完成整条删除,本报告为其收尾凭据与算法说明存放处)。
**改动面**:工具代码+游戏代码(run_all.gd 属代码面,走 worktree 批)+文档(规则同步)。
**执行**:worktree `gaterel-20261029`(自 master 6abaf67d 分出),合并提交 8bb3541c,回执树校验通过后工作区与分支已删除。
## 一、改动文件清单
| 文件 | 改动 | 提交 |
|---|---|---|
| tools/run_all_gates.sh | 关联档选闸(三件保险恒跑+02 选套件+横切回落)+回执 scope/scope_terms 字段+红项指纹 pid 归一化 | 9f94c9e1、117a37e2 |
| game/tests/run_all.gd | 连续超时快速失败+--only-source=gates 闸机来源标记 | 9f94c9e1 |
| AGENTS.md | 「交付前验收」句与硬性红线改关联档口径;规范导航行「全量验证」→「提交前验证」 | 9f94c9e1 |
| design/engineering/process-conventions.md | §3 第 8 条合回闸细则同步(选测算法句+scope 字段+全量回归由用户自发) | 9f94c9e1 |
| design/engineering/test-conventions.md | §4 标题改「提交前验证」,正文同步关联档口径 | 9f94c9e1 |
| design/engineering/code-conventions.md | §3 主题行「提交前全量验证」→「提交前验证」 | 9f94c9e1 |
| game/tests/README.md | 工具速查 run_all.gd 行(快速失败+闸机关联档选跑+manifest 实数 65)、挂死防护注、门禁与本地闸回执字段句 | 9f94c9e1 |
| 待办清单.md | 上述两条目整条删除 | 9f94c9e1 |
| game/tests/.gates/baseline.json | 02/09 两键存量红按实测重生成(记账见第五节) | 80b49c0f |
## 二、关联档选闸算法(定义处=tools/run_all_gates.sh 脚本中部,文档不另列)
1. **三件保险恒跑不降**:00 冒烟、01 系统测试、09 静态扫描在代码域恒实跑(测量面批不再免 00);10 熵增闸照旧两域都跑;11 回放确定性触面判定照旧。
2. **03/04 探针、05 渲染闸**:维持原影响面口径——本批 game/ 改动全在测量面(game/tests/、game/sim/)时记 SKIP。
3. **02 单元与集成改「选套件跑」**:套件集=**申报 ∪ 推导**取并集。
- 申报:在册需求卡片(本批 diff 触及的 reports/需求卡片*.md ∪ roadmap「进行中」迭代行登记的卡片)对照表「验收测试」列提到的测试文件名,逐名作为 --only 子串词;找不到在册卡片则申报集为空并在跑批输出注明。
- 推导:脚本内 `suite_terms_for()` 映射表(game/ 文件前缀 → 套件族词,族=测试目录名 data_config/core/battle_settlement/contracts/presentation/integration)按本批 diff(merge-base master..HEAD 的 game/ 非 .md 文件,剔除测量面)归族;一个文件可映射多族(如 minesweeper_rules.gd → core+battle_settlement)。
- 横切回落全量:命中 game/data/tables/**、公共件前缀(config_db*/rng_service*/save_manager*/meta_progression*/main*)、autoload 注册面(game/project.godot)、PARITY 触面表(gate 11 现行清单,已上移与横切判定共用单点定义)任一,或映射不到 → 02 跑全部套件。
- 测量面批:02 照旧全套件跑,不加过滤。
4. **回执加 scope 字段**:full|related(02 跑子集=related),随带 scope_terms 记选跑词清单;worktree-guard 校验逻辑不动(只验域覆盖与全绿)。
5. **闸机传参**:02 闸经 `-- --only=<词表逗号串> --only-source=gates` 传入;无选跑参数时 run_all.gd 行为与现状完全一致。
## 三、快速失败行为(game/tests/run_all.gd)
- 连续 **3** 个套件超时(可调常量 `CONSECUTIVE_TIMEOUT_ABORT`,初值 3)=判定红树整批挂死,**中止整轮**:打印「已见超时/已见失败(非超时)」两清单+中止时进度,退出码非 0。
- 不连续的超时照旧逐个回收(taskkill /T 整树回收+10 秒等死确认不变);任何非超时结局(通过或快速失败)重置连续计数。
- `_run_suite` 返回值从裸失败数改为 `{"fail": int, "timed_out": bool}`,编排层据此计连击;判定三硬闸(退出码/脚本错误扫描/断言数下限)口径不变。
## 四、孤立验证证据(闸机轮次纪律第 1 条,先最小试车再入闸)
- 推导沙箱七场景(对脚本 scope 段原文+mock git 实测):行为面两文件归族 → related[--only=core presentation];damage_math 触面 → 横切 full;测量面批 → 03/04/05 SKIP+02 全量;main* 组合根拆件 → 横切;project.godot → 横切;申报卡片并集 → [--only=core damage_math_test.gd hud_presenter_test.gd system_test.gd];横切优先于申报 → full。
- run_all.gd 闸源选跑:`--only=battle_settlement --only-source=gates` 实跑 9/65 套件全绿 exit 0,横幅「GATE FILTERED RUN」不带开发期免责句。
- 快速失败机制:`RUN_ALL_SUITE_TIMEOUT_SEC=2` 下首个套件 2 秒内跑完(连续计数归零),随后 3 套件连击超时 → 第 3 个即 ABORT,汇总清单+「中止时进度 4/9」,exit 1。
## 五、闸机证据与存量债记账(重要)
收口全量闸(不带参数,域=full)共跑四轮,前两轮红均**非本批新增**:
1. **首轮(9f94c9e1)**:02 现红 exit 1(9 套件失败)+09 红项指纹变化。逐项核对=待办清单「迭代 41 测试债修复」条在册清单(config_db 解析错 cattr/config_db_fatal_oob 退出码 2≠1/table_structure_guard 缺 meta_state/treasure_items 缺 crossrun/standee_fx_sweep set_trans 空引用/forge_workbench 120 秒超时挂死/tree_requires_level 空基址/save_manager_domain 缺 _migrate_legacy_save/theme_projection 缺 _recent_list;S9 类型闸 24 处+S10 文件头 4 处+S11 adventure_table.gd:55)——全部为迭代 41 遗留债,该条目已载 2026-10-29 用户裁「带红合并,代码域现存红全部由本条目承接」。基线滞后成因=迭代 41 两卡特许直接合回未重跑代码域闸(合回 its 回执为 docs 域),基线 02 键停在绿、09 键停在旧红项构成。
2. **指纹修正(117a37e2)**:02 的 forge_workbench 超时行内嵌 pid=NNNN,逐轮变化使存量红指纹不可复现——fingerprint 对 pid 归一化(pid=N)后再入哈希;判定口径(FAIL 行集合)不变。
3. **基线记账(80b49c0f)**:02/09 两键按 run A 实测重生成(02 记存量红 fp f9865f1a5a44,09 改记现行指纹 1a9ad773489f),记账注记全文写入 baseline.json note;人工确认凭据=上述用户裁。
4. **Run B(80b49c0f)全绿**:存量红·对基线零新增,exit 0。
5. **master 推进处置**:收口期间 master 落了 60c1a962(尾波清偿批登记,文档域)。首轮合并未按「先并入分支、重跑全量」流程执行,已作废重做:master reset 回 60c1a962 → 分支并入 master(0f9d1c85)→ Run C 重跑全量全绿 → 再合回。
6. **Run C/最终回执(0f9d1c85)**:域=full、scope=full(本批 game/ 改动仅 run_all.gd=测量面批:03/04/05 SKIP、02 全套件 65 跑 56 绿 9 存量红、00/01/09 实跑绿)、dirty_game=false、all_green=true、changed_vs_baseline=[]、tree=284448b47385cff50fe782fdf2ba0c4f77846d69。
7. **合回校验**:master^{tree}=284448b4…=回执 tree,一致;合并提交 8bb3541c;合并后主区两件秒级事已做(--editor --quit 刷缓存+冒烟 15 项 0 失败)。
## 六、边界与移交
- 本批自身是测量面批,02 过滤路径的端到端闸内形态由沙箱七场景+run_all.gd 直跑证据承载;首个行为面批收口时闸会实际走 related 路径(输出「关联档选闸:02 选套件跑」),如映射表归族与卡片申报有出入,按批修映射表(表只在 run_all_gates.sh 一处)。
- 存量债(9 套件+S 域红)归待办清单「迭代 41 测试债修复」条;该批修复实测归绿后需再换代基线 02/09 两键(红→绿走「改善」记账或重生成)。
- 全量回归自此由用户自发发起(合入后无自动兜底,2026-10-29 用户裁)。