From 65115744c6266b477c14757240deeb189fe603de Mon Sep 17 00:00:00 2001 From: DKChan <524912269@qq.com> Date: Thu, 5 Nov 2026 02:32:36 +0800 Subject: [PATCH] =?UTF-8?q?=E5=B7=A5=E7=A8=8B(=E9=97=B8=E5=90=8D=E5=8E=BB?= =?UTF-8?q?=E7=BC=96=E5=8F=B7=C2=B7=E7=94=A8=E6=88=B7=E4=BB=A4):=2015?= =?UTF-8?q?=E9=97=B8=E6=B3=A8=E5=86=8C=E5=90=8D=E4=B8=8E=E5=9F=BA=E7=BA=BF?= =?UTF-8?q?=E9=94=AE=E5=8E=BB00=E2=80=9310=E7=BC=96=E5=8F=B7=E5=89=8D?= =?UTF-8?q?=E7=BC=80,=20=E8=84=9A=E6=9C=ACusage/=E6=B3=A8=E9=87=8A/?= =?UTF-8?q?=E8=BE=93=E5=87=BA=E4=B8=8Egate=5Funit=E5=90=8D=E5=85=A8?= =?UTF-8?q?=E6=8D=A2=E4=BB=A3=E9=97=B8=E5=90=8D;=20=E6=96=87=E6=A1=A3?= =?UTF-8?q?=E4=BA=94=E4=BB=BD=E4=B8=8E.gd=E4=B8=89=E4=BB=B6/run=5Fall.gd?= =?UTF-8?q?=E6=B3=A8=E9=87=8A=E7=BC=96=E5=8F=B7=E6=8D=A2=E9=97=B8=E5=90=8D?= =?UTF-8?q?;=20AGENTS.md=E6=A0=B8=E5=BF=83=E5=8E=9F=E5=88=99=E7=AB=8B?= =?UTF-8?q?=E7=AC=AC5=E6=9D=A1=E5=AF=B9=E8=AF=9D=E5=91=88=E6=8A=A5?= =?UTF-8?q?=E9=97=B8=E5=86=B5=E4=B8=80=E5=BE=8B=E7=94=A8=E9=97=B8=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AGENTS.md | 5 +- .../engineering/architecture/architecture.md | 8 +- design/engineering/code-conventions.md | 2 +- design/engineering/process-conventions.md | 2 +- design/engineering/test-conventions.md | 2 +- game/tests/.gates/baseline.json | 34 +++--- game/tests/README.md | 20 ++-- game/tests/run_all.gd | 2 +- game/tests/smoke_boot.gd | 2 +- game/tests/system_test.gd | 6 +- tools/ci/domain_route.sh | 2 +- tools/palette_check.py | 2 +- tools/pipeline_gate.py | 2 +- tools/render_gate.sh | 2 +- tools/run_all_gates.sh | 106 +++++++++--------- 15 files changed, 99 insertions(+), 98 deletions(-) diff --git a/AGENTS.md b/AGENTS.md index 074f9a3d..c196e398 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -53,12 +53,13 @@ ## 回答风格规则(只管对话输出;文档写作归 doc-conventions §2–§4) -### 四条核心原则(按优先级) +### 核心原则(按优先级) 1. **用词封闭**:对话里可用的词=日常汉语+用户先用过的+当场展开过的。展开=先完整描述再给短说法,描述交代三样:指什么对象、怎么运作、带来什么后果。短说法只认两个来源:用户用过的直接跟用;自己提议的必须等用户回话里用过一次才成立。项目文档定过名的词不豁免,对话里首次出现照样先展开。同物同名:同一东西从头到尾一个叫法,不换词;一个词不指两个东西。起名的固定顺序=先描述、再命名、后沿用,禁止颠倒。 2. **判断挂依据**:判断=「X 是/不是/造成了/应该」类陈述;每个判断后面必须跟依据。依据只认三种:仓库文件+行号或逐字引用(给行号就必须真读过那几行);本对话的消息号或原话;外部链接。三种都拿不出的判断必须当场标「这是推测」;说不出依据就答「不知道/没查过」,禁止编造。答复形状=结论行→依据清单→细节。 3. **简洁**:同一意思只说一遍;能用一句不说两句。硬约束、数字、前提条件不参与压缩;信息完整与简洁冲突时保信息。 4. **多角度**:介绍一个物体、一个概念、一个问题,多角度讲清楚;每角度信息点 ≤3 个,禁止违背第 3 条。 +5. **闸况呈报用闸名**:对话里报验证闸的跑批结果一律用闸名(冒烟测试/系统测试/单元与集成测试/场景探针/渲染闸等),不裸报编号。 ### 简洁细则 @@ -106,7 +107,7 @@ - 车道铁律(2026-10-31 用户裁恢复)——主工作区只作合并落点,一切开发/设计改动走独立 worktree:`git worktree add ../g-plan2-<任务名> -b <任务分支>`(建区即跑 `tools/setup_worktree_userdir.sh`),收口=冻结→件核→并 master→重塑→主区 `git merge --no-ff`→删区(合回即删,2026-09-19 原裁),CI 红不回滚合并——新开修复 worktree(`fix-<任务名>` 分支,免重塑免数卡)修复合回追绿;会话单区(2026-11-04 用户裁)——同一时刻每会话至多一个 worktree 在役,同会话追加事项并入在役区、只做一次合入(一次 CI),合回后用户再发令=新回合另开区,迭代实现批独占回合(细则见 process-conventions §1 第 5 条);主区唯一合法写动作=合并,agent 侧由 worktree-guard 拦主区 Edit/Write 与非 merge 提交;豁免面仅 `.zcode/`、`.qoder/`(不入 git,主区直改);commit 点零钩子检查(pre-commit 直改闸已退役),全量验证归合回后远端 CI(post-merge 钩子推送触发,见「运行与验证」首条);`--no-verify` 仅属用户,agent 禁用(细则见 process-conventions §1) - **仓库根禁止设会话状态文件**(`active.md` 已废除)——现状看 roadmap「当前位」,待办看待办清单,过程看 git 提交信息,产出物看 `reports/`;任何文档禁止另设「当前状态快照」节,两处记同一件事必然漂移(细则见 doc-conventions 第 10 节) - 测试执行两入口铁规——只有迭代 loop 开发与用户点名两个触发入口;其余会话零测试,需测试支撑先请示并注明未跑测 -- 合回后验证 = 远端 CI 闸全绿(唯一强制验证点;唯一入口、唯一闸清单、唯一域划分与选闸算法仍只在 `tools/run_all_gates.sh`,禁在文档另列;触发与追绿语义见「运行与验证」首条与 process-conventions §1)。开发期手动跑批按需选档(`--code` 关联档选测——02 跑「卡片申报 ∪ diff 推导」并集套件、三件保险恒跑、横切面回落全量——算法只在闸脚本内定义),手动跑不构成验收;全量回归由用户自发发起。远端按改动域分流:文档面批走文档域秒级闸,代码面批走两域全量(分流算法单点=`tools/ci/domain_route.sh`) +- 合回后验证 = 远端 CI 闸全绿(唯一强制验证点;唯一入口、唯一闸清单、唯一域划分与选闸算法仍只在 `tools/run_all_gates.sh`,禁在文档另列;触发与追绿语义见「运行与验证」首条与 process-conventions §1)。开发期手动跑批按需选档(`--code` 关联档选测——单元与集成测试跑「卡片申报 ∪ diff 推导」并集套件、三件保险恒跑、横切面回落全量——算法只在闸脚本内定义),手动跑不构成验收;全量回归由用户自发发起。远端按改动域分流:文档面批走文档域秒级闸,代码面批走两域全量(分流算法单点=`tools/ci/domain_route.sh`) - **改动四类**——**需求改动**(游戏代码,含随逻辑写/改的测试代码):唯一走「写需求卡片+编入迭代批次」通道;迭代实现批禁写 `design/` 整个目录、两份根流程清单(`待办清单.md`/`体验验证清单.md`)与 `game/tests/README.md`(能力清单,归写卡段维护)(含新增/修改/删除),设计文档对它只读、是写测试与实现代码的输入依据;两份流程清单的条目状态只由流水线各段推进,实现批禁止顺手改;产出物只准写 `reports/`;合回后由远端 CI 验证(红项修复合回追绿,process-conventions §1)。**工程改动**(tools/、闸件、模拟测量工具、纯测试维护——不改变游戏行为的配套代码)、**文档设计改动**、**美术素材改动**:不写需求卡片、不编迭代批次,由用户发令走独立 worktree 直改+合回(车道铁律,commit 点零钩子检查);大体量改动(含触及代码面的工程改动如纯测试维护)同车道无特殊通道;文档设计类写入走 doc-design 技能(登记条目格式由流水线闸强制) - 五段流水线铁律——**需求改动**(游戏代码)按「登记 → 文档设计/美术设计 → 写需求卡片 → 迭代编排 → 实现」五段推进,段间不自动流转、每段转进由用户发令;编入迭代的卡片必须设计闭合+零待裁点——需求卡片任何工作量皆可写、皆可编入迭代,工作量限制只属迭代层(迭代估时总量 <5 个工作日=「冻结待凑批」、不可开工);流水线闸 `tools/pipeline_gate.py` 强制(已注册进 run_all_gates.sh 文档域);实现段零裁断——卡片没写清=上游缺陷,停该卡退回上游,禁内联求裁(process-conventions §2,格式与状态机=doc-conventions §12)。工程/文档设计/美术素材三类改动不走写卡与编排段:(如需设计讨论)→ 用户发令 → 独立 worktree 直改 → 合回 CI(车道细则=process-conventions §1) - MC/模拟:无数值改动零跑;档位硬闸见 `sim-data/README.md`「MC 采集档位表」,一档只能由用户发起 diff --git a/design/engineering/architecture/architecture.md b/design/engineering/architecture/architecture.md index a708064b..436ec801 100644 --- a/design/engineering/architecture/architecture.md +++ b/design/engineering/architecture/architecture.md @@ -305,11 +305,11 @@ S11/S12 扫描面覆盖全域,故 sim/probe/tests 的术语与旧件面**在 | 层 | 判什么 | 承载 | 入闸 | |---|---|---|---| -| 冒烟测试 | 这版活着吗(零逻辑判定) | `game/tests/smoke_boot.tscn/.gd` | `run_smoke.py`(闸 00) | -| 单元测试 | 领域类的原子行为对不对(从对外方法进、钉对外可观测面——写法判据归 test-conventions §8.2) | `game/tests/unit/` | `run_all.gd`(闸 02) | +| 冒烟测试 | 这版活着吗(零逻辑判定) | `game/tests/smoke_boot.tscn/.gd` | `run_smoke.py`(冒烟测试闸) | +| 单元测试 | 领域类的原子行为对不对(从对外方法进、钉对外可观测面——写法判据归 test-conventions §8.2) | `game/tests/unit/` | `run_all.gd`(单元与集成测试闸) | | 集成测试 | 跨系统闭环对不对 | `game/tests/integration/` | 同上(同一入口同一协议) | -| 系统测试 | 真实玩法路径断言面 | `game/tests/system_test.gd` | `run_system_test.py`(闸 01) | -| UI 探针+渲染 golden | 场景切换与观感 | `game/probe/*.tscn` 探针 | `probe_gate.sh`(闸 03/04)、`render_gate.sh`(闸 05) | +| 系统测试 | 真实玩法路径断言面 | `game/tests/system_test.gd` | `run_system_test.py`(系统测试闸) | +| UI 探针+渲染 golden | 场景切换与观感 | `game/probe/*.tscn` 探针 | `probe_gate.sh`(场景探针闸)、`render_gate.sh`(渲染闸) | **判定原则**:验收不能只是「跑一遍没崩」。三硬闸(退出码/脚本错误扫描/断言数下限)是判定的底线, 缺一即判定有洞;「日志里写着 PASS」不作判据。另有两类静默失效必须机制性防范——规则扫描面为空 diff --git a/design/engineering/code-conventions.md b/design/engineering/code-conventions.md index 0e56f8fe..2efb9934 100644 --- a/design/engineering/code-conventions.md +++ b/design/engineering/code-conventions.md @@ -78,7 +78,7 @@ 10. **`# rng-seed-exempt` 标记豁免通道**——S1/S2 随机函数扫描对该行豁免;限定用途=非玩法 RNG 消费面的引擎熵(现行例:组合根种子编辑框空态取 `randi()`——建种子不进玩法封闭流);非产品码三目录自建随机源的定种要求见第 13 条。 11. **`--script` 模式禁裸 autoload 标识符**——`ConfigDB`/`RngService` 等 autoload 名在 `--headless --script` 模式编译器不解析(parse error);产品码与测试夹具一律经节点路径取用(`get_node("/root/…")`/`AUTOLOAD_PATH_*` 常量);静态扫描域 S5 硬失败承载在位。 12. **Variant 参数化现行口径**——账本类字典/数组标注 `Dictionary[Variant, Variant]`/`Array[Variant]` 即合格(满足 R1);元素类型精化列后续事项、不入硬纪律,口径变更须用户裁决后续批次另行写入。 -13. **静态扫描适用域按来源分档(2026-11-03 架构审查 P1 余项裁)**——S 系静态扫描(S1–S13)的扫描面一律止于产品码三目录,`game/tests`/`game/probe`/`game/sim` 不进任何 S 系扫描面;这三目录的可靠性由运行期通道承接,各通道是:`game/tests`=闸 00/01/02(冒烟·单元与集成·系统测试)、`game/probe`=闸 03/04/05(场景探针与渲染 golden;同目录内 `type_glow_shot_probe` 是人工取证件、`probe_ui_util` 是探针共用面,两者不入闸)、`game/sim`=不入 CI,属用户手动发起的调参与数值测量批量。三目录**允许**自建 `RandomNumberGenerator`,条件=**必须显式定种**(改前改后读数要用同种子对拍,这是全项目测量口径);三目录真正禁止的形态是不定种随机——`randomize()` 与全局 `randi()`/`randf()`/`randf_range()`,一旦命中那次运行结果不可复现,读数与取证一并失效。这条对三目录的部分目前**无机器闸**(S1/S2 扫描面不含它们):扩面需给每处合法定种挂 `rng-seed-exempt` 注记、只拦得住新增,2026-11-03 用户裁不扩,改由本条文字+批末独立验收审计的人工评审承载。术语口径:`tools/run_all_gates.sh` 里的「测量面」指 `game/tests`+`game/sim`(影响面选闸用语,`game/probe` 不在其中——改探针必须跑 03/05),与本条分档无关;本文不再用「测量面」统称这三个目录。 +13. **静态扫描适用域按来源分档(2026-11-03 架构审查 P1 余项裁)**——S 系静态扫描(S1–S13)的扫描面一律止于产品码三目录,`game/tests`/`game/probe`/`game/sim` 不进任何 S 系扫描面;这三目录的可靠性由运行期通道承接,各通道是:`game/tests`=冒烟·单元与集成·系统测试三闸、`game/probe`=场景探针与渲染 golden 两闸(同目录内 `type_glow_shot_probe` 是人工取证件、`probe_ui_util` 是探针共用面,两者不入闸)、`game/sim`=不入 CI,属用户手动发起的调参与数值测量批量。三目录**允许**自建 `RandomNumberGenerator`,条件=**必须显式定种**(改前改后读数要用同种子对拍,这是全项目测量口径);三目录真正禁止的形态是不定种随机——`randomize()` 与全局 `randi()`/`randf()`/`randf_range()`,一旦命中那次运行结果不可复现,读数与取证一并失效。这条对三目录的部分目前**无机器闸**(S1/S2 扫描面不含它们):扩面需给每处合法定种挂 `rng-seed-exempt` 注记、只拦得住新增,2026-11-03 用户裁不扩,改由本条文字+批末独立验收审计的人工评审承载。术语口径:`tools/run_all_gates.sh` 里的「测量面」指 `game/tests`+`game/sim`(影响面选闸用语,`game/probe` 不在其中——改探针必须跑场景探针与渲染闸),与本条分档无关;本文不再用「测量面」统称这三个目录。 --- diff --git a/design/engineering/process-conventions.md b/design/engineering/process-conventions.md index e5d9cfa6..119f5049 100644 --- a/design/engineering/process-conventions.md +++ b/design/engineering/process-conventions.md @@ -49,7 +49,7 @@ 7. **验收改动先行声明**——验收变化(基线换代/探针增改/旧断言改判)预先写进需求卡片,禁事后补 **完成** -8. **合回后 CI 验证(唯一强制验证点)**——主工作区 `git merge --no-ff <任务分支>` 落地后 post-merge 钩子自动推送 origin master 触发远端 CI;远端按改动域分流(§1 第 3 条),游戏码批跑全量域闸(不带参数档,02 全套件),判定与红项用 `tools/ci_check.sh <合并提交>` 按需现查(读 run 终局态,只呈报不落盘)。全量是游戏码批的强制档:跨卡触面、探针与未申报套件的消费漏网只有全量闸能抓(迭代 44 实证),关联档选测的盲区由它兜底。合回前独立验收审计通过(iter 技能第 5 步),未过不合回。`tools/run_all_gates.sh` 是全部验证闸的**唯一入口、唯一清单与唯一域划分(含选闸算法与套件族映射表)**,闸件增减、分域调整都只改它;**本文与其他文档禁另列闸件清单**(清单散落多处正是 iter27 漏跑 `probe_gate --full` 的成因)。开发期手动跑批按需选档(按文件性质判域:代码面→`--code`,文档件→`--docs`,两类都有→全量;`--code` 关联档选测——02 只跑「需求卡片申报 ∪ diff 推导」并集套件、00 冒烟/01 系统测试/09 静态扫描三件保险恒跑、横切面回落全量——算法见闸脚本),手动跑不构成验收。闸件(`tools/` 下机检脚本与闸壳)自身的改动不占 CI 全量——其质量义务=落批时人工确认闸可跑通且判据口径未变;闸真崩溃时远端 CI 判红在案(job 失败=verdict 红,fail-closed 语义保留) +8. **合回后 CI 验证(唯一强制验证点)**——主工作区 `git merge --no-ff <任务分支>` 落地后 post-merge 钩子自动推送 origin master 触发远端 CI;远端按改动域分流(§1 第 3 条),游戏码批跑全量域闸(不带参数档,单元与集成测试全套件),判定与红项用 `tools/ci_check.sh <合并提交>` 按需现查(读 run 终局态,只呈报不落盘)。全量是游戏码批的强制档:跨卡触面、探针与未申报套件的消费漏网只有全量闸能抓(迭代 44 实证),关联档选测的盲区由它兜底。合回前独立验收审计通过(iter 技能第 5 步),未过不合回。`tools/run_all_gates.sh` 是全部验证闸的**唯一入口、唯一清单与唯一域划分(含选闸算法与套件族映射表)**,闸件增减、分域调整都只改它;**本文与其他文档禁另列闸件清单**(清单散落多处正是 iter27 漏跑 `probe_gate --full` 的成因)。开发期手动跑批按需选档(按文件性质判域:代码面→`--code`,文档件→`--docs`,两类都有→全量;`--code` 关联档选测——单元与集成测试只跑「需求卡片申报 ∪ diff 推导」并集套件、冒烟测试/系统测试/静态扫描三件保险恒跑、横切面回落全量——算法见闸脚本),手动跑不构成验收。闸件(`tools/` 下机检脚本与闸壳)自身的改动不占 CI 全量——其质量义务=落批时人工确认闸可跑通且判据口径未变;闸真崩溃时远端 CI 判红在案(job 失败=verdict 红,fail-closed 语义保留) 9. **重跑语义(2026-10-30 用户裁)**——同一份字节禁止第二次人手跑;允许的重跑只剩两类:① CI 红后的修复合回(post-merge 钩子再推再验,每轮修复至多触发一轮);② 用户自发发起的全量回归。「跑都跑了再跑一遍保险」「顺手改点再补一跑」都不构成重跑理由。导入缓存刷新由远端工作流「导入缓存刷新」步接管,合并后无手工动作 10. **批次完成后的登记义务**——合回 master 后按 doc-conventions §12.1 推进待办清单条目状态(做完整条删除),涉及迭代编排的在 roadmap 迭代总表与顶部「当前位」节换代——执行入口=项目技能 batch-closure(批后收尾与中间文档退役),跨会话教训写记忆库。批次过程与结论由 git 提交信息承载,禁止再写会话状态文件(见 doc-conventions 第 10 节)。`design/` 与根规则文件(`AGENTS.md`/`roadmap.md`/`待办清单.md`/`体验验证清单.md`)实现批禁写,见 §12 11. **文档同步闸(实现批禁写文档)**——实现批**禁写 `design/` 整个目录与根规则文件**,**另禁写 `game/tests/README.md`(能力清单,归写卡段维护,test-conventions §8.9)**,要往外交代的东西一律落 `reports/`:实现报告 `reports/iter-实现报告-<日期>.md`(各卡状态+实机目检总清单+遗留读数义务+实现决定记录——超白名单/超卡片明列范围事项逐条记「决了什么/为什么/代价/撤销方式」,全部按卡执行时只写一行「零拍板」)、GDD 反哺点清单 `reports/iter-反哺点-<日期>.md`(每条写清哪个文件哪一节、改成什么、依据是什么)。设计权威文档(GDD/art-bible)**任何批都不直改**:用户在会话中逐点裁决后,由工程/文档设计改动批(直改类)写入 `design/`(执行入口=doc-design 技能),并把反哺条目从 `reports/` 清掉(吸收即死;退役执行=batch-closure 技能)。机械面文档(roadmap 行/术语表/README 工具注)同样归工程/文档设计改动批在合并前更新。反哺点未落地期间相关 GDD 节视为待反哺,读前先查 `reports/` 与待办清单;需求卡片必列「关联文档同步面」按两层标注 diff --git a/design/engineering/test-conventions.md b/design/engineering/test-conventions.md index 84be4ed0..9b1bd547 100644 --- a/design/engineering/test-conventions.md +++ b/design/engineering/test-conventions.md @@ -27,7 +27,7 @@ ## 4. 验证时机(合回后远端 CI 制,2026-11-03 换代) -开发期窄测义务不变:每批开发中,本批新增/改动的验收测试自己跑绿即收口(卡内只测自己改的东西,process-conventions §6)。全量验证归合回后的远端 CI:git merge 合回 master 落地后 post-merge 钩子推送 origin master,远端按改动域分流跑 `tools/run_all_gates.sh`(游戏码批=不带参数档两域全量、02 全套件——跨卡触面与关联档选测的盲区由全量兜底;文档批=文档域秒级闸;分流算法单点=`tools/ci/domain_route.sh`),远端结果用 `tools/ci_check.sh <合并提交>` 按需现查(读 run 自身 `status`/`conclusion`,只呈报、不落盘——合回不等待、不唤醒,process-conventions §1 第 3 条);CI 红态下修复合回落地即再推再验追绿(修复走新开 `fix-<任务名>` 修复 worktree,process-conventions §1)。同一份字节禁止第二次人手跑。该脚本是全部验证闸的唯一入口与唯一清单,域划分与选闸算法只写在脚本里,本文禁另列闸件清单。 +开发期窄测义务不变:每批开发中,本批新增/改动的验收测试自己跑绿即收口(卡内只测自己改的东西,process-conventions §6)。全量验证归合回后的远端 CI:git merge 合回 master 落地后 post-merge 钩子推送 origin master,远端按改动域分流跑 `tools/run_all_gates.sh`(游戏码批=不带参数档两域全量、单元与集成测试全套件——跨卡触面与关联档选测的盲区由全量兜底;文档批=文档域秒级闸;分流算法单点=`tools/ci/domain_route.sh`),远端结果用 `tools/ci_check.sh <合并提交>` 按需现查(读 run 自身 `status`/`conclusion`,只呈报、不落盘——合回不等待、不唤醒,process-conventions §1 第 3 条);CI 红态下修复合回落地即再推再验追绿(修复走新开 `fix-<任务名>` 修复 worktree,process-conventions §1)。同一份字节禁止第二次人手跑。该脚本是全部验证闸的唯一入口与唯一清单,域划分与选闸算法只写在脚本里,本文禁另列闸件清单。 行为探针使用随机化玩家行为(封印/停手/刷新/无效点击)——自动玩家不做的动作就是测试盲区。 ## 5. 测试函数怎么写——验收清单条目的落码规范 diff --git a/game/tests/.gates/baseline.json b/game/tests/.gates/baseline.json index 657cbc6d..0b6694a2 100644 --- a/game/tests/.gates/baseline.json +++ b/game/tests/.gates/baseline.json @@ -1,65 +1,65 @@ { - "note": "存量基线·首次自动生成;闸况变化时本脚本会判红,需人工确认后重生成", + "note": "存量基线·闸名去编号批同步改键(原键带 00–10 编号前缀,与脚本注册名一并换代);闸况变化时本脚本会判红,需人工确认后重生成", "gates": { - "00 冒烟测试": { + "冒烟测试": { "exit": "0", "fp": "green" }, - "01 系统测试": { + "系统测试": { "exit": "0", "fp": "green" }, - "02 单元与集成测试": { + "场景探针": { "exit": "0", "fp": "green" }, - "03 场景探针": { + "渲染闸": { "exit": "0", "fp": "green" }, - "05 渲染闸": { + "色板闸": { "exit": "0", "fp": "green" }, - "05b 色板闸": { + "gdd_lint": { "exit": "0", "fp": "green" }, - "06 gdd_lint": { + "变更记录节": { "exit": "0", "fp": "green" }, - "06b 变更记录节": { + "doc_link": { "exit": "0", "fp": "green" }, - "07 doc_link": { + "doc_term": { "exit": "0", "fp": "green" }, - "08 doc_term": { + "流水线闸": { "exit": "0", "fp": "green" }, - "08c 流水线闸": { + "引用可核": { "exit": "0", "fp": "green" }, - "08d 引用可核": { + "能力审计": { "exit": "0", "fp": "green" }, - "08e 能力审计": { + "静态扫描": { "exit": "0", "fp": "green" }, - "09 静态扫描": { + "熵增闸": { "exit": "0", "fp": "green" }, - "10 熵增闸": { + "单元与集成测试": { "exit": "0", "fp": "green" } } -} \ No newline at end of file +} diff --git a/game/tests/README.md b/game/tests/README.md index 5721225e..28addd2d 100644 --- a/game/tests/README.md +++ b/game/tests/README.md @@ -17,8 +17,8 @@ tests/ unit/ # 单元测试(公式/状态机/纯逻辑,隔离断言)——extends SceneTree + quit(code) integration/ # 集成测试(跨系统闭环——与 unit/ 同一入口同一协议,见下「测试层级」节) - smoke_boot.tscn/.gd # 冒烟测试——极小启动场景(真实开机路径存活检查,闸 00) - system_test.gd # 系统测试宿主薄壳(SceneTree+构造注入;断言迁移批后承接 smoke_all.gd,闸 01) + smoke_boot.tscn/.gd # 冒烟测试——极小启动场景(真实开机路径存活检查) + system_test.gd # 系统测试宿主薄壳(SceneTree+构造注入;断言迁移批后承接 smoke_all.gd) smoke/ # critical-paths.md——人工 gate 清单(/smoke-check 读取) evidence/ # 截图与人工签核记录 run_all.gd # 单元与集成测试统一入口(套件 manifest 协议,D2 AC-2b) @@ -29,11 +29,11 @@ tests/ | 层 | 判什么 | 承载 | 入闸方式 | |---|---|---|---| -| **冒烟测试** | 这版活着吗——能否启动、能否加载表、能否进主屏。零逻辑判定 | `tests/smoke_boot.tscn/.gd`(以项目运行目标拉起=真实开机路径) | `run_smoke.py`(闸 00) | -| **单元测试** | 领域类的原子行为对不对(公式/状态机/纯逻辑)——从对外方法进、断言钉对外可观测面(写法判据见 test-conventions §8.2) | `tests/unit/` | `run_all.gd` manifest(闸 02) | +| **冒烟测试** | 这版活着吗——能否启动、能否加载表、能否进主屏。零逻辑判定 | `tests/smoke_boot.tscn/.gd`(以项目运行目标拉起=真实开机路径) | `run_smoke.py`(冒烟测试闸) | +| **单元测试** | 领域类的原子行为对不对(公式/状态机/纯逻辑)——从对外方法进、断言钉对外可观测面(写法判据见 test-conventions §8.2) | `tests/unit/` | `run_all.gd` manifest(单元与集成测试闸) | | **集成测试** | 跨系统的闭环对不对 | `tests/integration/` | 同上(与单元测试同一入口、同一协议) | -| **系统测试** | 启动真实工程走真实玩法路径 | 过渡期 `game/probe/smoke_all.gd`(断言迁移批后=`tests/system_test.gd`) | `run_system_test.py`(闸 01) | -| **UI 探针+渲染 golden** | 跑起来之后 UI 与场景切换对不对;画面基线 | `game/probe/*.tscn` 探针 | `probe_gate.sh`(闸 03)、`render_gate.sh`(闸 05) | +| **系统测试** | 启动真实工程走真实玩法路径 | 过渡期 `game/probe/smoke_all.gd`(断言迁移批后=`tests/system_test.gd`) | `run_system_test.py`(系统测试闸) | +| **UI 探针+渲染 golden** | 跑起来之后 UI 与场景切换对不对;画面基线 | `game/probe/*.tscn` 探针 | `probe_gate.sh`(场景探针闸)、`render_gate.sh`(渲染闸) | > **integration/ 已建承载**。 > 首个集成用例 = `save_rng_roundtrip_test.gd`(存档⇄RNG 快照往返)。章程登记的四类集成用例里, @@ -243,15 +243,15 @@ tests/ ## Running Tests ```bash -# 冒烟测试(闸 00)——极小启动场景,秒级 +# 冒烟测试——极小启动场景,秒级 python tools/run_smoke.py -# 单元与集成测试(闸 02)——Windows 须用 console 版 exe 取 stdout;工作目录 = game/(含 project.godot 那一层) -godot --headless --script tests/run_all.gd # 统一入口(本地闸 02 闸调用点) +# 单元与集成测试——Windows 须用 console 版 exe 取 stdout;工作目录 = game/(含 project.godot 那一层) +godot --headless --script tests/run_all.gd # 统一入口(本地单元与集成测试闸调用点) godot --headless --script tests/run_all.gd -- --only=battle_settlement # 选跑态——只跑路径含该词的套件(开发期最窄确认;零命中=用法错 exit 2,不产闸回执) godot --headless --script tests/unit/example_test.gd -# 系统测试(闸 01)——过渡期宿主 smoke_all.gd;分钟级 +# 系统测试——过渡期宿主 smoke_all.gd;分钟级 python tools/run_system_test.py # 场景探针(UI 探针层)——以探针场景为运行目标,走完整项目引导(autoload 在位) diff --git a/game/tests/run_all.gd b/game/tests/run_all.gd index 92a10f55..7fe8ac74 100644 --- a/game/tests/run_all.gd +++ b/game/tests/run_all.gd @@ -211,7 +211,7 @@ func _suites() -> Array: {"path": "res://tests/unit/battle_settlement/settlement_wiring_snapshot_test.gd", "expect": 0}, # 结算接线同种子逐项 golden 对拍主证〔封装5.1〕(架构审查 5.1 封装修复——段类束注入改造零行为变更基线) {"path": "res://tests/unit/battle_settlement/seal_polarity_test.gd", "expect": 0}, # 封印与极性宿主(末点 AP 封印/封印不可逆四情况/清图奖励双份与弱形式/刷新 provenance 守卫/极性路由与封印溢价/负向字典/格面资源资格——批 B 自 smoke_all 迁入) {"path": "res://tests/unit/battle_settlement/round_flow_skill_pool_test.gd", "expect": 0}, # 轮内流与技能池宿主(全战斗回放/轮内刷新与 V5 快照单源/遭遇区间骰/结算五段全序/技能池数据面·回放独立·EV 锚·死亡打断·校验拒绝/妨害附加/四桶计数——批 B 自 smoke_all 迁入) - {"path": "res://tests/unit/battle_settlement/refresh_feats_test.gd", "expect": 0}, # 换图系专长七件宿主(迭代 46 卡A——基座产 RAP 与折价同源/成功事实恰一次/全局受伤四路径恰一次/石层缓冲/崩壁延迟/蓄力周转/坑道小憩/矿道红利 GP/七件数据与牌库/无专长基线;原经卡片申报走 02 关联档选跑,卡片退役后补登记由 02 全套件承接) + {"path": "res://tests/unit/battle_settlement/refresh_feats_test.gd", "expect": 0}, # 换图系专长七件宿主(迭代 46 卡A——基座产 RAP 与折价同源/成功事实恰一次/全局受伤四路径恰一次/石层缓冲/崩壁延迟/蓄力周转/坑道小憩/矿道红利 GP/七件数据与牌库/无专长基线;原经卡片申报走关联档选跑,卡片退役后补登记由单元与集成测试全套件承接) {"path": "res://tests/unit/battle_settlement/variant_placement_test.gd", "expect": 0}, # 变异布置宿主(战内布置段门控与数量公式/全局变异兜底回落与资源面偏斜——批 B 自 smoke_all 迁入) {"path": "res://tests/unit/battle_settlement/skill_unlock_test.gd", "expect": 0}, # Boss 半血解锁技·容器机制(门谓词/闩不可逆/双面过滤/保底不逼锁定/零扰动) {"path": "res://tests/unit/battle_settlement/extended_row_violation_test.gd", "expect": 1, "negative": true}, # 卡④ wr2-np 扩展行必载 effect_id 负路径(行协议运行期违约面首个负面套件——独立进程豁免错误扫描) diff --git a/game/tests/smoke_boot.gd b/game/tests/smoke_boot.gd index 25f1960a..2220633a 100644 --- a/game/tests/smoke_boot.gd +++ b/game/tests/smoke_boot.gd @@ -3,7 +3,7 @@ # 全局字体与主题可加载、主屏场景实例化、启动态菜单可见。 # 断言只查存在性与可见性,不做任何玩法逻辑判定;断言完打印摘要并以退出码收口, # 判定三闸(退出码+摘要失败数+脚本错误扫描)由外部运行器 tools/run_smoke.py 承担。 -# 运行:python tools/run_smoke.py(本地闸 00 冒烟测试) +# 运行:python tools/run_smoke.py(本地冒烟测试闸) extends Node const MAIN_SCENE_PATH: String = "res://presentation/main.tscn" diff --git a/game/tests/system_test.gd b/game/tests/system_test.gd index 6adb2c54..6ed2d0d5 100644 --- a/game/tests/system_test.gd +++ b/game/tests/system_test.gd @@ -1,9 +1,9 @@ # tests/system_test.gd — 系统测试宿主薄壳(SceneTree+构造注入) -# 系统测试 = 启动真实工程走真实玩法路径的断言面(标准四级测试层之一,闸 01)。 -# 本件为系统测试宿主(标准四级测试层之一,闸 01)。(原过渡期自述作废——, +# 系统测试 = 启动真实工程走真实玩法路径的断言面(标准四级测试层之一)。 +# 本件为系统测试宿主(标准四级测试层之一)。(原过渡期自述作废——, # 本批只落宿主薄壳,跑通即绿)。迁移完成后 tools/run_system_test.py 缺省 --script 改指本件。 # 协议照单元侧惯例:extends SceneTree 获得 quit(code);--script 模式不加载 autoload, -# 运行形态=--script 直跑+autoload 分派闸(ConfigDB/SaveManager 在座才进主断言面——闸 01 实跑 65 项 0 失败实证在案);摘要行由 tools/run_system_test.py 三闸判定 +# 运行形态=--script 直跑+autoload 分派闸(ConfigDB/SaveManager 在座才进主断言面——本闸实跑 65 项 0 失败实证在案);摘要行由 tools/run_system_test.py 三闸判定 # (退出码+摘要失败数+脚本错误扫描)。 # 运行:python tools/run_system_test.py --script res://tests/system_test.gd extends SceneTree diff --git a/tools/ci/domain_route.sh b/tools/ci/domain_route.sh index 98f2803e..b30a878a 100644 --- a/tools/ci/domain_route.sh +++ b/tools/ci/domain_route.sh @@ -10,7 +10,7 @@ # 质量义务=落批人工确认可跑通(run_all_gates.sh 头注既有口径,不在远端重复烧引擎)。 # 3. diff 空 → skip。 # 判定面说明:game/tests/** 与 game/sim/** 属 game/ 行为载体(.md 除外)→ full, -# 与 run_all_gates.sh 关联档口径一致(测量面批 02 照跑全套件)。 +# 与 run_all_gates.sh 关联档口径一致(测量面批单元与集成测试照跑全套件)。 set -u base="${1:-}" head="${2:-HEAD}" diff --git a/tools/palette_check.py b/tools/palette_check.py index 9a0575ee..4b80c8e7 100644 --- a/tools/palette_check.py +++ b/tools/palette_check.py @@ -25,7 +25,7 @@ 门①语义检查属设计面人工核对(§4.2 色相语义判域),不在本器执法面。 用法: - # 主用法(闸机 05b 色板闸承载):扫目录,新增色相对 --baseline 判定 + # 主用法(闸机色板闸承载):扫目录,新增色相对 --baseline 判定 python tools/palette_check.py <目录> --baseline <基线目录> # 无基线:只出读数(单张色数/ 近色对计数),不判红 python tools/palette_check.py <目录> diff --git a/tools/pipeline_gate.py b/tools/pipeline_gate.py index 0250a681..ff76d229 100644 --- a/tools/pipeline_gate.py +++ b/tools/pipeline_gate.py @@ -8,7 +8,7 @@ r"""pipeline_gate.py — 工作流程流水线闸(待办清单条目状态机 分档放行)/需求卡片口径(C1 文档义务/C2 设计事实源/C3 改动—验收对照表/C4 验收档申报)+一次交叉核。 约束:每红项一行「文件:行号 判据名 一句白话说明」,exit 0=全绿 / 1=有红 / 2=输入件缺失; 卡片与报告存在性相对 --repo-root 解析(缺省=本文件上两级);待办清单与 roadmap 均已为新格式 - (2026-10-18 数据整改批),本闸已注册进 tools/run_all_gates.sh 文档域(08c 流水线闸)。 + (2026-10-18 数据整改批),本闸已注册进 tools/run_all_gates.sh 文档域(流水线闸)。 用法:python tools/pipeline_gate.py [--todo PATH] [--roadmap PATH] [--repo-root PATH] """ import argparse diff --git a/tools/render_gate.sh b/tools/render_gate.sh index 4cb690b6..8e1a7b8a 100755 --- a/tools/render_gate.sh +++ b/tools/render_gate.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash # 渲染闸正主——窗口化自动闸。 # 范围(渲染五闸的机器面:shot_probe/golden_compare/board_shot 三件入闸; -# fx_probe 逻辑层归 03 场景探针闸;1920 档布局机检面待补)。 +# fx_probe 逻辑层归场景探针闸;1920 档布局机检面待补)。 # 骨架复用 probe_gate:①每段 timeout 守卫(挂死=FAIL 不静默)②段前预清+段后清本 game 目录孤儿 # Godot(按命令行精确匹配本 game 路径,不误杀其他 worktree 会话)③末尾残留清点=批末闸(必须 0)。 # 段: diff --git a/tools/run_all_gates.sh b/tools/run_all_gates.sh index 978fc223..2b2474cd 100755 --- a/tools/run_all_gates.sh +++ b/tools/run_all_gates.sh @@ -9,16 +9,16 @@ # 跑闸时代码面带着未提交改动,回执会标 dirty_game(验的不是 HEAD 字节)。 # # 用法:tools/run_all_gates.sh [--code|--docs|--quick] -# --code 只跑代码域闸(00 冒烟测试/01 系统测试/02 单元与集成测试/03 场景探针/ -# 05 渲染闸/09 静态扫描+10 熵增闸) +# --code 只跑代码域闸(冒烟测试/系统测试/单元与集成测试/场景探针/ +# 渲染闸/静态扫描+熵增闸) # ——本批改动含 game/ 下非 .md 的行为载体(代码/测试脚本/探针/场景/数据表/素材)时用。 -# 关联档选闸(2026-10-29 用户裁,推广自 2026-10-28 影响面选闸):00 冒烟/01 系统测试/ -# 09 静态扫描三件保险恒跑不降;03 场景探针与 05 渲染闸维持影响面口径(本批 game/ 改动 -# 全在测量面 game/tests、game/sim 时记 SKIP);02 单元与集成改「选套件跑」——套件集= +# 关联档选闸(2026-10-29 用户裁,推广自 2026-10-28 影响面选闸):冒烟测试/系统测试/ +# 静态扫描三件保险恒跑不降;场景探针与渲染闸维持影响面口径(本批 game/ 改动 +# 全在测量面 game/tests、game/sim 时记 SKIP);单元与集成测试改「选套件跑」——套件集= # 需求卡片申报 ∪ diff 推导并集(算法与套件族映射表见脚本中部),横切面(公共件/数据表/ # autoload/数值·存档·RNG·结算触面)回落全套件;回执 scope 字段记 full|related。 -# --docs 只跑文档域闸(06 gdd_lint/07 doc_link/08 doc_term/08c 流水线闸/08d 引用可核/ -# 08e 能力审计+10 熵增闸) +# --docs 只跑文档域闸(gdd_lint/doc_link/doc_term/流水线闸/引用可核/ +# 能力审计+熵增闸) # ——本批改动只有文档件时用:game/ 内的 .md(README、生成清单)、design/、根规则文件、 # tools/ 工具脚本、.zcode/ 配置等一切非代码面改动。 # --quick 全量档的中段自检形态:跳过渲染闸(窗口化,需开显示器)与静态扫描;完成出库禁用。 @@ -70,7 +70,7 @@ if [ "$DOMAIN" = "code" ] || [ "$DOMAIN" = "full" ]; then fi # 控制台编码:本仓库闸件输出中文与 ✅/✗ 符号。Windows GBK 控制台下 python 打印这些字符会抛 -# UnicodeEncodeError——待办清单/10 两闸直接崩(假红)、09 的 FAIL 行被写成乱码字节(指纹漂移, +# UnicodeEncodeError——待办清单/熵增两闸直接崩(假红)、静态扫描的 FAIL 行被写成乱码字节(指纹漂移, # 与基线比必判「红项清单变化」假红)、末尾汇总自身崩掉打不出结论。 export PYTHONIOENCODING=utf-8 @@ -207,10 +207,10 @@ suite_terms_for() { # suite_terms_for <仓库相对路径> → stdout: 套件 } # ── 关联档选闸(2026-10-29 用户裁,推广自 2026-10-28 影响面选闸)── -# 三件保险恒跑不降:00 冒烟/01 系统测试/09 静态扫描(10 熵增闸照旧两域都跑)。 -# 03 场景探针与 05 渲染闸维持影响面口径:本批 diff 相对 master 分叉点的 game/ 改动若全部落在 +# 三件保险恒跑不降:冒烟测试/系统测试/静态扫描(熵增闸照旧两域都跑)。 +# 场景探针与渲染闸维持影响面口径:本批 diff 相对 master 分叉点的 game/ 改动若全部落在 # 测量面(game/tests/**、game/sim/**——测试与模拟驱动件,不触场景树与渲染输出)则记 SKIP。 -# 02 单元与集成改「选套件跑」:套件集=申报 ∪ 推导 取并集—— +# 单元与集成测试改「选套件跑」:套件集=申报 ∪ 推导 取并集—— # 申报:在册需求卡片(本批 diff 触及的 reports/需求卡片*.md ∪ roadmap「进行中」迭代行登记的 # 卡片)对照表「验收测试」列提到的测试文件名,按文件名作为 --only 子串词归套件; # 找不到在册卡片则申报集为空并输出注明。 @@ -218,9 +218,9 @@ suite_terms_for() { # suite_terms_for <仓库相对路径> → stdout: 套件 # 映射不到的文件一律按横切处理。 # 横切回落全量:diff 命中 game/data/tables/**、公共件前缀(config_db*/rng_service*/ # save_manager*/meta_progression*/main*——main* 覆盖组合根拆件与主场景)、 -# autoload 注册面(game/project.godot)、或下方横切触面表任一 → 02 跑全部套件。 -# 测量面批(game/ 改动全在 tests/sim):02 照旧全套件跑(不加过滤)。 -# 回执 scope 字段:full|related(02 跑子集=related);映射表只在本脚本一处定义。 +# autoload 注册面(game/project.godot)、或下方横切触面表任一 → 单元与集成测试跑全部套件。 +# 测量面批(game/ 改动全在 tests/sim):单元与集成测试照旧全套件跑(不加过滤)。 +# 回执 scope 字段:full|related(单元与集成测试跑子集=related);映射表只在本脚本一处定义。 NONBEHAVIOR=0 SCOPE="full" ONLY_TERMS="" @@ -231,9 +231,9 @@ if in_domain code; then _behavior="$(echo "$_gfiles" | grep -vE '^(game/tests/|game/sim/)' || true)" if [ -n "$_gfiles" ] && [ -z "$_behavior" ]; then NONBEHAVIOR=1 - echo "[gates] 影响面选闸:game/ 改动全在测量面(tests/sim)——03 场景探针/05 渲染闸 → SKIP(00/01/09 三件保险恒跑)" + echo "[gates] 影响面选闸:game/ 改动全在测量面(tests/sim)——场景探针/渲染闸 → SKIP(冒烟测试/系统测试/静态扫描三件保险恒跑)" fi - # ── 02 选套件推导(只对行为面代码文件做——测量面文件不进推导,其验证就是 02/09 自身)── + # ── 选套件推导(只对行为面代码文件做——测量面文件不进推导,其验证就是单元与集成测试/静态扫描自身)── _codefiles="$(echo "$_gfiles" | grep -viE '\.md$' | grep -vE '^(game/tests/|game/sim/)' || true)" if [ -n "$_codefiles" ]; then CROSSCUT=0 @@ -269,7 +269,7 @@ if in_domain code; then done if [ "$CROSSCUT" -eq 1 ]; then SCOPE="full" - echo "[gates] 关联档选闸:diff 命中横切面(公共件/数据表/autoload/数值·存档·RNG·结算触面)——02 回落全部套件" + echo "[gates] 关联档选闸:diff 命中横切面(公共件/数据表/autoload/数值·存档·RNG·结算触面)——单元与集成测试回落全部套件" else # 并集去重:推导族词 ∪ 申报测试文件名;并集非空才过滤(映射表保证族词非空,此处双保险)。 _union="$(printf '%s\n' $_family_terms $_declared_names | sed '/^$/d' | sort -u | tr '\n' ' ' || true)" @@ -285,12 +285,12 @@ if in_domain code; then echo "[gates] 关联档选闸·申报:未找到在册需求卡片(diff 与 roadmap 进行中行均无),申报集为空——仅按 diff 推导" fi if [ "$SCOPE" = related ]; then - echo "[gates] 关联档选闸:02 选套件跑(--only=${ONLY_TERMS})" + echo "[gates] 关联档选闸:单元与集成测试选套件跑(--only=${ONLY_TERMS})" fi fi fi -# ── 代码域起手自检(闸承载:只省烧闸,不做合回判定——真判定在 00–11 与合回 guard)── +# ── 代码域起手自检(闸承载:只省烧闸,不做合回判定——真判定在各闸与合回 guard)── if in_domain code; then # worktree 素材同步:素材走 gitignore 不入 git,worktree 冷检出缺件=呈现断言红的环境成因; # 主工作区直跑=脚本内自动无操作。 @@ -332,7 +332,7 @@ gate() { # gate <名称> <日志名> <命令...> } gate_unit() { # run_all 是 --script 模式,退出码为唯一判据;分片态=多 Godot 进程各跑一片 - local name="02 单元与集成测试" + local name="单元与集成测试" # 关联档选跑:把套件词列表经 --only= 传给 run_all(闸机来源标记 --only-source=gates, # 入口据此打关联档横幅、不落「仅供开发期」免责句);全量态不传任何选跑参数。 local -a _user_args=() @@ -396,63 +396,63 @@ gate_unit() { # run_all 是 --script 模式,退出码为唯一判据;分 return 0 } -# ══ 代码域(0–5)══ +# ══ 代码域 ══ if in_domain code; then -# ── 0. 冒烟测试(极小启动场景:真实开机路径存活检查,零逻辑判定,秒级)── -# 三件保险之一(00/01/09):恒跑不降——测量面批也不免(关联档选闸,2026-10-29 用户裁)。 -gate "00 冒烟测试" "smoke_boot.log" "$PY" "$REPO/tools/run_smoke.py" -# ── 1. 系统测试(真实玩法路径断言面;宿主=game/tests/system_test.gd,缺省 --script 由 run_system_test.py 持有)── -gate "01 系统测试" "system_test.log" "$PY" "$REPO/tools/run_system_test.py" -# ── 2. 单元与集成测试 ── +# ── 冒烟测试(极小启动场景:真实开机路径存活检查,零逻辑判定,秒级)── +# 三件保险之一(冒烟测试/系统测试/静态扫描):恒跑不降——测量面批也不免(关联档选闸,2026-10-29 用户裁)。 +gate "冒烟测试" "smoke_boot.log" "$PY" "$REPO/tools/run_smoke.py" +# ── 系统测试(真实玩法路径断言面;宿主=game/tests/system_test.gd,缺省 --script 由 run_system_test.py 持有)── +gate "系统测试" "system_test.log" "$PY" "$REPO/tools/run_system_test.py" +# ── 单元与集成测试 ── gate_unit -# ── 3. 场景探针(走查+断言十件一次跑齐;iter27 漏跑断言段事故后固化为无条件整闸)── +# ── 场景探针(走查+断言十件一次跑齐;iter27 漏跑断言段事故后固化为无条件整闸)── if [ $NONBEHAVIOR -eq 1 ]; then - NAMES+=("03 场景探针"); EXITS+=("SKIP"); LOGS+=("") - echo ""; echo "[gates] 03 场景探针 → SKIP(影响面选闸:测量面改动不触场景树与探针断言面)" + NAMES+=("场景探针"); EXITS+=("SKIP"); LOGS+=("") + echo ""; echo "[gates] 场景探针 → SKIP(影响面选闸:测量面改动不触场景树与探针断言面)" else - gate "03 场景探针" "probe.log" bash "$REPO/tools/probe_gate.sh" "$GAME" + gate "场景探针" "probe.log" bash "$REPO/tools/probe_gate.sh" "$GAME" fi -# ── 5. 渲染面(窗口化,依赖 PIL)── +# ── 渲染闸(窗口化,依赖 PIL)── if [ $QUICK -eq 1 ] || [ $NONBEHAVIOR -eq 1 ]; then - NAMES+=("05 渲染闸"); EXITS+=("SKIP"); LOGS+=("") - echo ""; echo "[gates] 05 渲染闸 → SKIP(--quick 或 影响面选闸:测量面改动不触渲染输出)" + NAMES+=("渲染闸"); EXITS+=("SKIP"); LOGS+=("") + echo ""; echo "[gates] 渲染闸 → SKIP(--quick 或 影响面选闸:测量面改动不触渲染输出)" else - gate "05 渲染闸" "render.log" bash "$REPO/tools/render_gate.sh" "$GAME" + gate "渲染闸" "render.log" bash "$REPO/tools/render_gate.sh" "$GAME" fi -# ── 5b. 色板闸(§4.1 新色双门②:素材新增色 vs 基线〔token∪素材快照〕近色判红; +# ── 色板闸(§4.1 新色双门②:素材新增色 vs 基线〔token∪素材快照〕近色判红; # 门①语义检查属设计面人工核对不入机检;基线刷新=tools/gen_palette_baseline.py,素材批收尾动作)── if [ $QUICK -eq 1 ] || [ $NONBEHAVIOR -eq 1 ]; then - NAMES+=("05b 色板闸"); EXITS+=("SKIP"); LOGS+=("") - echo ""; echo "[gates] 05b 色板闸 → SKIP(--quick 或 影响面选闸:素材色板面不随测量面改动开闸)" + NAMES+=("色板闸"); EXITS+=("SKIP"); LOGS+=("") + echo ""; echo "[gates] 色板闸 → SKIP(--quick 或 影响面选闸:素材色板面不随测量面改动开闸)" else - gate "05b 色板闸" "palette.log" "$PY" "$REPO/tools/palette_check.py" "$GAME/assets/art" --baseline "$REPO/game/tests/golden/palette_baseline" + gate "色板闸" "palette.log" "$PY" "$REPO/tools/palette_check.py" "$GAME/assets/art" --baseline "$REPO/game/tests/golden/palette_baseline" fi fi -# ══ 文档域(6–8e)══ +# ══ 文档域 ══ if in_domain docs; then # 全量档(CI 与手动档同判定面) - gate "06 gdd_lint" "gdd_lint.log" "$PY" "$REPO/tools/gdd_lint.py" - gate "06b 变更记录节" "changelog.log" "$PY" "$REPO/tools/gdd_lint.py" --changelog-only - gate "07 doc_link" "doc_link.log" "$PY" "$REPO/tools/doc_link_audit.py" --strict - gate "08 doc_term" "doc_term.log" "$PY" "$REPO/tools/doc_term_audit.py" --strict - gate "08c 流水线闸" "pipeline.log" "$PY" "$REPO/tools/pipeline_gate.py" - gate "08d 引用可核" "doc_ref.log" "$PY" "$REPO/tools/doc_ref_audit.py" --strict - gate "08e 能力审计" "capability.log" "$PY" "$REPO/tools/capability_audit.py" --strict + gate "gdd_lint" "gdd_lint.log" "$PY" "$REPO/tools/gdd_lint.py" + gate "变更记录节" "changelog.log" "$PY" "$REPO/tools/gdd_lint.py" --changelog-only + gate "doc_link" "doc_link.log" "$PY" "$REPO/tools/doc_link_audit.py" --strict + gate "doc_term" "doc_term.log" "$PY" "$REPO/tools/doc_term_audit.py" --strict + gate "流水线闸" "pipeline.log" "$PY" "$REPO/tools/pipeline_gate.py" + gate "引用可核" "doc_ref.log" "$PY" "$REPO/tools/doc_ref_audit.py" --strict + gate "能力审计" "capability.log" "$PY" "$REPO/tools/capability_audit.py" --strict fi -# ── 7. 静态扫描(代码域)+ 熵增闸(两域都跑:它查顶层目录/根文件/图像白名单/退役路径, +# ── 静态扫描(代码域)+ 熵增闸(两域都跑:它查顶层目录/根文件/图像白名单/退役路径, # 文档批新增或挪动 design/ 下的文件同样会绊它;纯文本扫描,秒级)── if [ $QUICK -eq 0 ]; then if in_domain code; then - gate "09 静态扫描" "static_scan.log" bash "$GAME/tests/static_scan.sh" + gate "静态扫描" "static_scan.log" bash "$GAME/tests/static_scan.sh" fi - gate "10 熵增闸" "entropy.log" "$PY" "$REPO/tools/repo_structure_audit.py" + gate "熵增闸" "entropy.log" "$PY" "$REPO/tools/repo_structure_audit.py" else if in_domain code; then - NAMES+=("09 静态扫描"); EXITS+=("SKIP"); LOGS+=("") + NAMES+=("静态扫描"); EXITS+=("SKIP"); LOGS+=("") fi - NAMES+=("10 熵增闸"); EXITS+=("SKIP"); LOGS+=("") - echo ""; echo "[gates] 09 静态扫描(代码域)/ 10 熵增闸 → SKIP(--quick)" + NAMES+=("熵增闸"); EXITS+=("SKIP"); LOGS+=("") + echo ""; echo "[gates] 静态扫描(代码域)/ 熵增闸 → SKIP(--quick)" fi # ── 与存量基线比对 ──