From f9fa8d85fac5bc0faa517ab101075f67c43868eb Mon Sep 17 00:00:00 2001 From: DKChan <524912269@qq.com> Date: Fri, 30 Oct 2026 04:05:02 +0800 Subject: [PATCH 01/11] =?UTF-8?q?=E7=99=BB=E8=AE=B0(=E5=B7=A5=E7=A8=8B?= =?UTF-8?q?=E6=89=B9):=20=E5=9C=BA=E6=99=AF=E6=8E=A2=E9=92=88=E9=97=B8?= =?UTF-8?q?=E5=90=88=E5=B9=B6=E2=80=94=E2=80=9403/04=E4=B8=A4=E9=97=B8?= =?UTF-8?q?=E5=B9=B6=E4=B8=80=E8=A1=8C=EF=BC=8B=E9=97=B8=E5=90=8D=E6=8D=A2?= =?UTF-8?q?=E4=BB=A3=EF=BC=88probe=5Fgate.sh=E9=9B=B6=E6=94=B9=E5=8A=A8,?= =?UTF-8?q?=E5=85=AC=E5=85=B1=E4=BA=94=E4=BB=B6=E5=8E=BB=E9=87=8D=E5=A4=8D?= =?UTF-8?q?=E8=B7=91=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 待办清单.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/待办清单.md b/待办清单.md index 0b1cb2f6..5ae04e52 100644 --- a/待办清单.md +++ b/待办清单.md @@ -2,6 +2,14 @@ 本清单是流水线的唯一登记处:要做的事先在此登记一条,随流水线段推进改状态,做完整条删除;各系统文档的「待办」节只留一行指路存根,不再自建条目。条目格式(标题=登记元数据含可选优先级,正文=实况/缺口/改动面/状态四属性)与状态机以 [doc-conventions §12.1](design/engineering/doc-conventions.md) 为权威。 +#### 场景探针闸合并——03/04 两闸并一行+闸名换代(2026-10-30 登记,来源=会话提及) + +**实况**:闸机上场景探针占两行回执——03 探针 --click=默认五件+click 走查件、04 探针 --full=默认五件+四件断言件,公共五件每次验收跑两遍。证据=`tools/run_all_gates.sh:422`(两行 gate 调用各带一个扩展段参数,probe_gate.sh 同脚本跑两遍)。用户裁决:并成一闸、公共件只跑一遍、闸名改探针语义直名。probe_gate.sh 零改动(参数与语义不动,--click/--full 保留为开发期单跑开关)。 + +**改动面**:文档+工具代码 + +**状态**:待执行 + #### 迭代 42 批末移交小件——工具与注释四条(2026-10-30 登记,来源=批次移交) **实况**:证据=迭代 42 实现报告 §5-1/§5-5/§5-6 与验收审计报告表述性瑕疵 3/4(已按吸收即死退役,git 历史可考)。逐条: From 55a8f270266f9d3a4ab8a2057630ea5e25939784 Mon Sep 17 00:00:00 2001 From: DKChan <524912269@qq.com> Date: Fri, 30 Oct 2026 04:08:48 +0800 Subject: [PATCH 02/11] =?UTF-8?q?=E5=B7=A5=E7=A8=8B(=E5=9C=BA=E6=99=AF?= =?UTF-8?q?=E6=8E=A2=E9=92=88=E9=97=B8=E5=90=88=E5=B9=B6):=2003/04?= =?UTF-8?q?=E4=B8=A4=E9=97=B8=E5=B9=B6=E4=B8=80=E8=A1=8C=E3=80=8C03=20?= =?UTF-8?q?=E5=9C=BA=E6=99=AF=E6=8E=A2=E9=92=88=E3=80=8D=E2=80=94=E2=80=94?= =?UTF-8?q?gate=E8=B0=83=E7=94=A8probe=5Fgate.sh=20--click=20--full?= =?UTF-8?q?=E4=B8=80=E6=AC=A1=E8=B7=91=E9=BD=90=E5=8D=81=E4=BB=B6(?= =?UTF-8?q?=E5=85=AC=E5=85=B1=E4=BA=94=E4=BB=B6=E5=8F=AA=E8=B7=91=E4=B8=80?= =?UTF-8?q?=E9=81=8D,=E7=AA=84=E8=AF=95=E8=BD=A62m22s=E5=8D=81=E6=AE=B5exi?= =?UTF-8?q?t0),04=E5=8F=B7=E8=AE=A9=E7=A9=BA=E4=B8=8D=E9=87=8D=E6=8E=92;?= =?UTF-8?q?=E5=BD=B1=E5=93=8D=E9=9D=A2SKIP=E5=9D=97=E4=B8=8E=E5=A4=B4?= =?UTF-8?q?=E6=B3=A8/=E5=BD=B1=E5=93=8D=E9=9D=A2=E6=B3=A8=E9=87=8A?= =?UTF-8?q?=E5=90=8C=E6=AD=A5;README=E9=97=B803/04=E6=8F=90=E6=B3=95?= =?UTF-8?q?=E4=B8=8Eprocess-conventions=E5=BD=B1=E5=93=8D=E9=9D=A2?= =?UTF-8?q?=E5=8F=A5=E6=8D=A2=E4=BB=A3;probe=5Fgate.sh=E9=9B=B6=E6=94=B9?= =?UTF-8?q?=E5=8A=A8(--click/--full=E4=BF=9D=E7=95=99=E4=B8=BA=E5=BC=80?= =?UTF-8?q?=E5=8F=91=E6=9C=9F=E5=8D=95=E8=B7=91=E5=BC=80=E5=85=B3)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- design/engineering/process-conventions.md | 2 +- game/tests/README.md | 2 +- tools/run_all_gates.sh | 21 +++++++++------------ 3 files changed, 11 insertions(+), 14 deletions(-) diff --git a/design/engineering/process-conventions.md b/design/engineering/process-conventions.md index 727fc342..04273dd3 100644 --- a/design/engineering/process-conventions.md +++ b/design/engineering/process-conventions.md @@ -48,7 +48,7 @@ 7. **验收改动先行声明**——验收变化(基线换代/探针增改/旧断言改判)预先写进需求卡片,禁事后补 **完成** -8. **批末按域验收才合并(worktree 批;直改车道无批末动作,验收在 commit 点由 git 钩子执行,见 §1 第 3 条)**——在任务 worktree 内跑 `tools/run_all_gates.sh`,**按本批改动域选档**:按文件性质判——代码面=`game/` 下非 `.md` 的行为载体(代码、测试脚本、探针、场景、数据表、素材)→ `--code`;文档件=`game/` 内 `.md`(README、生成清单)与 `game/` 外一切路径(`design/`、根规则文件、`tools/` 工具脚本、`.zcode/` 配置等)→ `--docs`;两类同批都有 → 全量档不带参数。代码域按**关联档选测**(2026-10-29 用户裁):02 单元与集成只跑「需求卡片申报 ∪ diff 推导」并集的套件——申报=在册需求卡片对照表「验收测试」列提到的测试文件名,推导=闸脚本内套件族映射表按改动文件归族;改动命中公共件/数据表/autoload/数值·存档·RNG·结算触面或映射不到 → 横切回落全部套件;00 冒烟/01 系统测试/09 静态扫描三件保险恒跑不降;03/04 探针与 05 渲染闸维持影响面口径(本批 game/ 改动全在测量面 game/tests、game/sim 时记 SKIP)。所选域全绿即可合回 master,全量回归由用户自发发起(合入后无自动兜底)。合回前独立验收审计通过(iter 技能第 5 步),未过不合回。该脚本是全部验证闸的**唯一入口、唯一清单与唯一域划分(含选闸算法与套件族映射表)**,闸件增减、分域调整都只改它;**本文与其他文档禁另列闸件清单**(清单散落多处正是 iter27 漏跑 `probe_gate --full` 的成因)。跑完写回执 `game/tests/.gates/receipt.json`(含 `domain`、`scope`(full|related,02 跑子集=related)与 `dirty_game` 字段),合回时由 worktree-guard 按 diff 文件性质推域强制校验(六况拦截:缺回执/quick 模式/回执未覆盖分支尖=回执 commit 之后代码面又有改动、或跑闸时代码面带着未提交改动(`dirty_game`)/域不覆盖本次改动/含新增红/master HEAD 非回执 commit 祖先=合并将产出未测内容;guard 只验域覆盖与全绿,不复核选套件清单)。回执与分支尖的对齐判据是**代码面**不是 commit 号:回执之后只追加文档件(`game/` 内 `.md`、`reports/`、`design/` 等)提交,回执照样有效,不构成复跑理由。闸件(`tools/` 下机检脚本与闸壳)自身的改动不占合回全量——其质量义务=落批时人工确认闸可跑通且判据口径未变,闸真崩溃时合回闸 fail-closed(跑不出回执即拦),不以合回全量为兜底 +8. **批末按域验收才合并(worktree 批;直改车道无批末动作,验收在 commit 点由 git 钩子执行,见 §1 第 3 条)**——在任务 worktree 内跑 `tools/run_all_gates.sh`,**按本批改动域选档**:按文件性质判——代码面=`game/` 下非 `.md` 的行为载体(代码、测试脚本、探针、场景、数据表、素材)→ `--code`;文档件=`game/` 内 `.md`(README、生成清单)与 `game/` 外一切路径(`design/`、根规则文件、`tools/` 工具脚本、`.zcode/` 配置等)→ `--docs`;两类同批都有 → 全量档不带参数。代码域按**关联档选测**(2026-10-29 用户裁):02 单元与集成只跑「需求卡片申报 ∪ diff 推导」并集的套件——申报=在册需求卡片对照表「验收测试」列提到的测试文件名,推导=闸脚本内套件族映射表按改动文件归族;改动命中公共件/数据表/autoload/数值·存档·RNG·结算触面或映射不到 → 横切回落全部套件;00 冒烟/01 系统测试/09 静态扫描三件保险恒跑不降;03 场景探针与 05 渲染闸维持影响面口径(本批 game/ 改动全在测量面 game/tests、game/sim 时记 SKIP)。所选域全绿即可合回 master,全量回归由用户自发发起(合入后无自动兜底)。合回前独立验收审计通过(iter 技能第 5 步),未过不合回。该脚本是全部验证闸的**唯一入口、唯一清单与唯一域划分(含选闸算法与套件族映射表)**,闸件增减、分域调整都只改它;**本文与其他文档禁另列闸件清单**(清单散落多处正是 iter27 漏跑 `probe_gate --full` 的成因)。跑完写回执 `game/tests/.gates/receipt.json`(含 `domain`、`scope`(full|related,02 跑子集=related)与 `dirty_game` 字段),合回时由 worktree-guard 按 diff 文件性质推域强制校验(六况拦截:缺回执/quick 模式/回执未覆盖分支尖=回执 commit 之后代码面又有改动、或跑闸时代码面带着未提交改动(`dirty_game`)/域不覆盖本次改动/含新增红/master HEAD 非回执 commit 祖先=合并将产出未测内容;guard 只验域覆盖与全绿,不复核选套件清单)。回执与分支尖的对齐判据是**代码面**不是 commit 号:回执之后只追加文档件(`game/` 内 `.md`、`reports/`、`design/` 等)提交,回执照样有效,不构成复跑理由。闸件(`tools/` 下机检脚本与闸壳)自身的改动不占合回全量——其质量义务=落批时人工确认闸可跑通且判据口径未变,闸真崩溃时合回闸 fail-closed(跑不出回执即拦),不以合回全量为兜底 9. **合并后主区零复跑**(2026-10-24 用户裁:合回重跑验的是与回执同一份字节,零信息)——合回落地后 code 批只做两件秒级事:`--editor --quit` 重刷类名缓存(在册坑:.godot 缓存不入 git,与合并后代码失配会假红假绿)+冒烟启动确认可开机(合计约 1 分钟);docs 批零动作。全量验证**每批跑一次**=worktree 批末按域闸,顺序是「先并入 master、再跑闸」(§1 第 2 条);只有两种情形允许把这次跑作废重来——① 闸红且修法动了 `game/`,② 闸已开跑后 master 又被推进(合并将产出未测内容,由合回闸祖先判定拦下,§3.9 第六况)。「跑都跑了再跑一遍保险」「闸后顺手改点 `game/` 再补一跑」都不构成复跑理由;master 上永不跑全量 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/game/tests/README.md b/game/tests/README.md index 574f7ee5..3fb51ccf 100644 --- a/game/tests/README.md +++ b/game/tests/README.md @@ -33,7 +33,7 @@ tests/ | **单元测试** | 领域类的原子行为对不对(公式/状态机/纯逻辑)——从对外方法进、断言钉对外可观测面(写法判据见 test-conventions §8.2) | `tests/unit/` | `run_all.gd` manifest(闸 02) | | **集成测试** | 跨系统的闭环对不对 | `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/04)、`render_gate.sh`(闸 05) | +| **UI 探针+渲染 golden** | 跑起来之后 UI 与场景切换对不对;画面基线 | `game/probe/*.tscn` 探针 | `probe_gate.sh`(闸 03)、`render_gate.sh`(闸 05) | > **integration/ 已建承载**(迭代 29 T3——此前只有章程句无实体,空壳曾于迭代 19 卡① T4 删过一次)。 > 首个集成用例 = `save_rng_roundtrip_test.gd`(存档⇄RNG 快照往返)。章程登记的四类集成用例里, diff --git a/tools/run_all_gates.sh b/tools/run_all_gates.sh index 05885698..86c5dbfc 100644 --- a/tools/run_all_gates.sh +++ b/tools/run_all_gates.sh @@ -11,11 +11,11 @@ # 回执即作废须重跑;跑闸时若代码面还带着未提交改动,回执会标 dirty_game,合回闸拒绝采信。 # # 用法:tools/run_all_gates.sh [--code|--docs|--quick] -# --code 只跑代码域闸(00 冒烟测试/01 系统测试/02 单元与集成测试/03 探针 --click/ -# 04 探针 --full/05 渲染闸/09 静态扫描+10 熵增闸) +# --code 只跑代码域闸(00 冒烟测试/01 系统测试/02 单元与集成测试/03 场景探针/ +# 05 渲染闸/09 静态扫描+10 熵增闸) # ——本批改动含 game/ 下非 .md 的行为载体(代码/测试脚本/探针/场景/数据表/素材)时用。 # 关联档选闸(2026-10-29 用户裁,推广自 2026-10-28 影响面选闸):00 冒烟/01 系统测试/ -# 09 静态扫描三件保险恒跑不降;03/04 探针与 05 渲染闸维持影响面口径(本批 game/ 改动 +# 09 静态扫描三件保险恒跑不降;03 场景探针与 05 渲染闸维持影响面口径(本批 game/ 改动 # 全在测量面 game/tests、game/sim 时记 SKIP);02 单元与集成改「选套件跑」——套件集= # 需求卡片申报 ∪ diff 推导并集(算法与套件族映射表见脚本中部),横切面(公共件/数据表/ # autoload/数值·存档·RNG·结算触面)回落全套件;回执 scope 字段记 full|related。 @@ -218,7 +218,7 @@ suite_terms_for() { # suite_terms_for <仓库相对路径> → stdout: 套件 # ── 关联档选闸(2026-10-29 用户裁,推广自 2026-10-28 影响面选闸)── # 三件保险恒跑不降:00 冒烟/01 系统测试/09 静态扫描(10 熵增闸照旧两域都跑)。 -# 03/04 探针与 05 渲染闸维持影响面口径:本批 diff 相对 master 分叉点的 game/ 改动若全部落在 +# 03 场景探针与 05 渲染闸维持影响面口径:本批 diff 相对 master 分叉点的 game/ 改动若全部落在 # 测量面(game/tests/**、game/sim/**——测试与模拟驱动件,不触场景树与渲染输出)则记 SKIP。 # 02 单元与集成改「选套件跑」:套件集=申报 ∪ 推导 取并集—— # 申报:在册需求卡片(本批 diff 触及的 reports/需求卡片*.md ∪ roadmap「进行中」迭代行登记的 @@ -241,7 +241,7 @@ 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/04 探针/05 渲染闸 → SKIP(00/01/09 三件保险恒跑)" + echo "[gates] 影响面选闸:game/ 改动全在测量面(tests/sim)——03 场景探针/05 渲染闸 → SKIP(00/01/09 三件保险恒跑)" fi # ── 02 选套件推导(只对行为面代码文件做——测量面文件不进推导,其验证就是 02/09 自身)── _codefiles="$(echo "$_gfiles" | grep -viE '\.md$' | grep -vE '^(game/tests/|game/sim/)' || true)" @@ -412,15 +412,12 @@ gate "00 冒烟测试" "smoke_boot.log" "$PY" "$REPO/tools/run_smoke.py" gate "01 系统测试" "system_test.log" "$PY" "$REPO/tools/run_system_test.py" # ── 2. 单元与集成测试 ── gate_unit -# ── 3. 场景探针 · 行为走查段 ── -# ── 4. 场景探针 · 断言段(iter27 漏跑的就是这一段)── +# ── 3. 场景探针(走查+断言十件一次跑齐;iter27 漏跑断言段事故后固化为无条件整闸)── if [ $NONBEHAVIOR -eq 1 ]; then - NAMES+=("03 探针 --click"); EXITS+=("SKIP"); LOGS+=("") - NAMES+=("04 探针 --full"); EXITS+=("SKIP"); LOGS+=("") - echo ""; echo "[gates] 03/04 探针 → SKIP(影响面选闸:测量面改动不触场景树与探针断言面)" + NAMES+=("03 场景探针"); EXITS+=("SKIP"); LOGS+=("") + echo ""; echo "[gates] 03 场景探针 → SKIP(影响面选闸:测量面改动不触场景树与探针断言面)" else - gate "03 探针 --click" "probe_click.log" bash "$REPO/tools/probe_gate.sh" "$GAME" --click - gate "04 探针 --full" "probe_full.log" bash "$REPO/tools/probe_gate.sh" "$GAME" --full + gate "03 场景探针" "probe.log" bash "$REPO/tools/probe_gate.sh" "$GAME" --click --full fi # ── 5. 渲染面(窗口化,依赖 PIL)── if [ $QUICK -eq 1 ] || [ $NONBEHAVIOR -eq 1 ]; then From cfb528b9175ad8a5ade595ecc5ab6e9ed5f890fc Mon Sep 17 00:00:00 2001 From: DKChan <524912269@qq.com> Date: Fri, 30 Oct 2026 04:20:46 +0800 Subject: [PATCH 03/11] =?UTF-8?q?=E5=B7=A5=E7=A8=8B(=E5=9C=BA=E6=99=AF?= =?UTF-8?q?=E6=8E=A2=E9=92=88=E9=97=B8=E5=90=88=E5=B9=B6=C2=B7=E5=9F=BA?= =?UTF-8?q?=E7=BA=BF=E6=8D=A2=E4=BB=A3):=20baseline.json=E5=88=A0=E3=80=8C?= =?UTF-8?q?03=20=E6=8E=A2=E9=92=88=20--click=E3=80=8D=E3=80=8C04=20?= =?UTF-8?q?=E6=8E=A2=E9=92=88=20--full=E3=80=8D=E4=B8=A4=E6=97=A7=E9=94=AE?= =?UTF-8?q?=E3=80=81=E9=A2=84=E7=BD=AE=E3=80=8C03=20=E5=9C=BA=E6=99=AF?= =?UTF-8?q?=E6=8E=A2=E9=92=88=E3=80=8Dgreen=E9=94=AE(=E5=AE=9E=E6=B5=8B?= =?UTF-8?q?=E7=9C=9F=E5=80=BC=3D=E6=9C=ACworktree=E5=85=A8=E9=87=8F?= =?UTF-8?q?=E9=97=B803=E5=9C=BA=E6=99=AF=E6=8E=A2=E9=92=88exit0=E5=8D=81?= =?UTF-8?q?=E4=BB=B6=E5=85=A8=E8=B7=91);02/05/09=E5=AD=98=E9=87=8F?= =?UTF-8?q?=E7=BA=A2=E9=94=AE=E6=9C=AA=E5=8A=A8=E2=80=94=E2=80=94=E5=BD=92?= =?UTF-8?q?=E3=80=8C=E9=97=B8=E5=9F=BA=E7=BA=BF=E4=B8=A4=E9=94=AE=E6=8D=A2?= =?UTF-8?q?=E4=BB=A3=E3=80=8D=E5=9C=A8=E5=86=8C=E6=9D=A1=E7=9B=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- game/tests/.gates/baseline.json | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/game/tests/.gates/baseline.json b/game/tests/.gates/baseline.json index fc904fe3..95e64f41 100644 --- a/game/tests/.gates/baseline.json +++ b/game/tests/.gates/baseline.json @@ -13,13 +13,9 @@ "exit": "1", "fp": "f9865f1a5a44" }, - "03 探针 --click": { - "exit": "1", - "fp": "8a3cae0d0446" - }, - "04 探针 --full": { - "exit": "1", - "fp": "591b27250b36" + "03 场景探针": { + "exit": "0", + "fp": "green" }, "05 渲染闸": { "exit": "1", From 9154f03b487eae1b1e5f25f4cc9641984741a90a Mon Sep 17 00:00:00 2001 From: DKChan <524912269@qq.com> Date: Fri, 30 Oct 2026 04:29:01 +0800 Subject: [PATCH 04/11] =?UTF-8?q?=E6=94=B6=E5=B0=BE(=E5=9C=BA=E6=99=AF?= =?UTF-8?q?=E6=8E=A2=E9=92=88=E9=97=B8=E5=90=88=E5=B9=B6=E6=89=B9):=20?= =?UTF-8?q?=E5=BE=85=E5=8A=9E=E6=9D=A1=E7=9B=AE=E5=AE=8C=E6=88=90=E6=95=B4?= =?UTF-8?q?=E6=9D=A1=E5=88=A0=E9=99=A4=E2=80=94=E2=80=9403/04=E5=B9=B6?= =?UTF-8?q?=E3=80=8C03=20=E5=9C=BA=E6=99=AF=E6=8E=A2=E9=92=88=E3=80=8D?= =?UTF-8?q?=E4=B8=80=E8=A1=8C,=E7=AA=84=E8=AF=95=E8=BD=A6=E5=8D=81?= =?UTF-8?q?=E6=AE=B5exit0=202m22s,worktree=E5=85=A8=E9=87=8F=E9=97=B8all?= =?UTF-8?q?=5Fgreen=3DTrue=203m25s,=E5=9F=BA=E7=BA=BF=E4=B8=A4=E9=94=AE?= =?UTF-8?q?=E9=9A=8F=E6=89=B9=E6=8D=A2=E4=BB=A3(b1e0f29f);=E5=BC=95?= =?UTF-8?q?=E7=94=A8=E9=9D=A2=E4=B8=89=E5=A4=84=E5=90=8C=E6=AD=A5(README/p?= =?UTF-8?q?rocess-conventions/iter=E6=8A=80=E8=83=BD)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 待办清单.md | 8 -------- 1 file changed, 8 deletions(-) diff --git a/待办清单.md b/待办清单.md index 5ae04e52..0b1cb2f6 100644 --- a/待办清单.md +++ b/待办清单.md @@ -2,14 +2,6 @@ 本清单是流水线的唯一登记处:要做的事先在此登记一条,随流水线段推进改状态,做完整条删除;各系统文档的「待办」节只留一行指路存根,不再自建条目。条目格式(标题=登记元数据含可选优先级,正文=实况/缺口/改动面/状态四属性)与状态机以 [doc-conventions §12.1](design/engineering/doc-conventions.md) 为权威。 -#### 场景探针闸合并——03/04 两闸并一行+闸名换代(2026-10-30 登记,来源=会话提及) - -**实况**:闸机上场景探针占两行回执——03 探针 --click=默认五件+click 走查件、04 探针 --full=默认五件+四件断言件,公共五件每次验收跑两遍。证据=`tools/run_all_gates.sh:422`(两行 gate 调用各带一个扩展段参数,probe_gate.sh 同脚本跑两遍)。用户裁决:并成一闸、公共件只跑一遍、闸名改探针语义直名。probe_gate.sh 零改动(参数与语义不动,--click/--full 保留为开发期单跑开关)。 - -**改动面**:文档+工具代码 - -**状态**:待执行 - #### 迭代 42 批末移交小件——工具与注释四条(2026-10-30 登记,来源=批次移交) **实况**:证据=迭代 42 实现报告 §5-1/§5-5/§5-6 与验收审计报告表述性瑕疵 3/4(已按吸收即死退役,git 历史可考)。逐条: From 3607271575a6ce50cff94efeb7ae6fe3633b924b Mon Sep 17 00:00:00 2001 From: DKChan <524912269@qq.com> Date: Fri, 30 Oct 2026 04:30:19 +0800 Subject: [PATCH 05/11] =?UTF-8?q?=E6=B3=A8=E9=94=80(=E5=BE=85=E5=8A=9E):?= =?UTF-8?q?=20=E5=9C=A8=E9=80=94=E8=8D=89=E7=A8=BF=E6=95=B4=E7=90=86?= =?UTF-8?q?=E6=89=B9(3349=20=E5=A4=B1=E7=AE=A1=E8=8D=89=E7=A8=BF)=E6=95=B4?= =?UTF-8?q?=E6=9D=A1=E5=88=A0=E9=99=A4=E2=80=94=E2=80=94=E5=AE=A1=E8=AE=A1?= =?UTF-8?q?=20P2-1=20=E5=8F=A3=E5=BE=84=E9=94=99=E9=85=8D:ui-reuse-2026-09?= =?UTF-8?q?-23=20=E7=B3=BB=E4=B8=8B=E8=BD=BD=E7=9A=84=E7=AC=AC=E4=B8=89?= =?UTF-8?q?=E6=96=B9=20CC0/OFL=20=E7=B4=A0=E6=9D=90=E5=8C=85(=E5=8D=A0=203?= =?UTF-8?q?043/91%),vN=20=E5=91=BD=E5=90=8D=E7=8E=87=E4=B8=8E=E5=86=97?= =?UTF-8?q?=E4=BD=99=E9=87=8F=E6=B3=95=E5=AF=B9=E7=AC=AC=E4=B8=89=E6=96=B9?= =?UTF-8?q?=E5=8C=85=E4=B8=8D=E9=80=82=E7=94=A8,=E5=AE=9E=E6=B5=8B?= =?UTF-8?q?=E9=87=8D=E5=A4=8D=E6=96=87=E4=BB=B6=E4=BB=85=E6=B5=AA=E8=B4=B9?= =?UTF-8?q?=200.1MB;artwork/=20=E4=B8=8E=20archive/=20=E5=9D=87=20gitignor?= =?UTF-8?q?ed,=E4=B8=8D=E8=BF=9B=E6=8F=90=E4=BA=A4/=E6=9E=84=E5=BB=BA/?= =?UTF-8?q?=E4=BA=A4=E4=BB=98,=E4=B8=8D=E6=9E=84=E6=88=90=E7=BB=B4?= =?UTF-8?q?=E6=8A=A4=E6=88=90=E6=9C=AC;=E7=94=A8=E6=88=B7=E8=A3=81?= =?UTF-8?q?=E4=B8=8D=E5=A4=84=E7=90=86=E3=80=82=E7=95=99=E6=A1=A3=E7=BA=A6?= =?UTF-8?q?=E6=9D=9F:=E8=AF=A5=E5=8C=85=E4=B8=8D=E5=8F=AF=E6=95=B4?= =?UTF-8?q?=E5=88=A0=E2=80=94=E2=80=94quantize=5Fui=5Fskin/render=5Fsample?= =?UTF-8?q?=5Fsheet/render=5Fsample=5Fsheet=5Fv3/render=5Flevel=5Fmap=5Fsh?= =?UTF-8?q?eet=20=E5=9B=9B=E4=B8=AA=E5=B7=A5=E5=85=B7=E8=84=9A=E6=9C=AC?= =?UTF-8?q?=E6=8C=89=E8=B7=AF=E5=BE=84=E5=BC=95=E7=94=A8=E5=85=B6=E4=B8=AD?= =?UTF-8?q?=E7=9A=84=E5=AD=97=E4=BD=93/=E9=9D=A2=E6=9D=BF/=E5=9B=BE?= =?UTF-8?q?=E6=A0=87/=E7=9F=B3=E7=BA=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 待办清单.md | 9 --------- 1 file changed, 9 deletions(-) diff --git a/待办清单.md b/待办清单.md index 0b1cb2f6..ce666f5c 100644 --- a/待办清单.md +++ b/待办清单.md @@ -364,15 +364,6 @@ **状态**:待美术设计(备选) -#### 在途草稿整理批——3349 个失管草稿(2026-10-06 登记,来源=审计发现) - -**实况**:审计 P2-1——`artwork/ui-reuse-2026-09-23/` 独占 3043 个草稿(91%),vN 命名率 0%,冗余 41 文件,残留非素材文件(.url ×8 / .ogg ×6 / .ai ×2 / .swf ×1);根因=脚本链覆盖「生成→验证」但**缺「草稿整理」段**。整理涉及**批量文件移动/删除**,按用户惯例须先 dry-run 呈报清单、经确认再分批执行。执行窗口随实现批;开工=用户点名。 -- 相关文档:[art-bible](design/art/art-bible.md) §8.3 归档纪律(原则已写入)· 资产管线批(工具+文件操作) - -**改动面**:美术素材+工具代码 - -**状态**:待写卡 - #### 战斗区背景图替换——B 区舞台插画 + 临时光柱退役(2026-10-07 登记,来源=会话提及) **实况**:B 区舞台现行=程序化平色底(`UiKit.STAGE_BG`,`battle_stage_view.gd:47`)+ **顶光柱氛围层**(`:55-63` 四柱,x 基准 110/900/1055/1210@1280,60 段叠层矩形自顶向下渐宽窄渐隐〔顶 α26→0〕,层序=bg < 光柱 < 世界)——二者均系 §6.1 方向稿的**临时占位**,用户口径「光柱只是临时方案,换正式战斗背景后效果更好」。正式件已立资产契约:`stage/stage_bg.png`(源 1280×270,B 区全高含明细带底;三关换挡走 §4.3 `wall_ambient` tint 槽,不按板出三张),属审计 P1-2 查得的「B 区舞台背景插画 0 张」缺口。**光柱在背景到位后顺带退役或吸收进背景绘制**(不再作为独立程序层)。**与立绘探顶解耦**:大体档「允许向上溢出盒顶 N px」的判定(2026-10-07 用户裁甲案)**不依赖光柱是否存在**,换背景零返工。 From 2a5174d2a9a198f2efc5546aca68456757451ec9 Mon Sep 17 00:00:00 2001 From: DKChan <524912269@qq.com> Date: Fri, 30 Oct 2026 04:52:50 +0800 Subject: [PATCH 06/11] =?UTF-8?q?=E6=96=87=E6=A1=A3=E8=AE=BE=E8=AE=A1(?= =?UTF-8?q?=E7=BE=8E=E6=9C=AF=E5=87=BA=E5=9B=BE=E7=99=BB=E8=AE=B0=E8=BD=BB?= =?UTF-8?q?=E9=87=8F=E5=8C=96):=20=E5=87=BA=E5=9B=BE=E7=99=BB=E8=AE=B0?= =?UTF-8?q?=E4=B9=89=E5=8A=A1=E5=9B=9B=E5=AD=97=E6=AE=B5(=E6=A8=A1?= =?UTF-8?q?=E5=9E=8B=E5=90=8D/=E5=88=86=E8=BE=A8=E7=8E=87/seed/=E5=AF=B9?= =?UTF-8?q?=E8=AF=9D=E6=97=A5=E6=9C=9F)=E7=BC=A9=E4=B8=BA=E5=BF=85?= =?UTF-8?q?=E6=B3=A8=E4=B8=A4=E9=A1=B9=E3=80=8C=E7=94=A8=E9=80=94=EF=BC=8B?= =?UTF-8?q?=E7=94=9F=E6=88=90=E6=97=B6=E9=97=B4(YYYY-MM-DD=20HH:MM)?= =?UTF-8?q?=E3=80=8D,=E5=8F=82=E6=95=B0=E6=9C=89=E5=88=99=E8=AE=B0?= =?UTF-8?q?=E3=80=81=E6=97=A0=E5=88=99=E4=B8=8D=E5=A1=AB,=E7=99=BB?= =?UTF-8?q?=E8=AE=B0=E4=B8=8D=E5=86=8D=E4=BD=9C=E6=AD=A3=E7=A8=BF=E9=81=B4?= =?UTF-8?q?=E9=80=89=E5=89=8D=E7=BD=AE=E2=80=94=E2=80=94=E6=97=A7=E5=8F=A3?= =?UTF-8?q?=E5=BE=84=E5=8D=A1=E4=BD=8F=E7=94=A8=E6=88=B7=E5=9C=A8=E9=80=94?= =?UTF-8?q?=E5=87=BA=E5=9B=BE=E7=AE=A1=E7=BA=BF(=E7=BA=BF=E4=B8=8A?= =?UTF-8?q?=E5=AF=B9=E8=AF=9D=E5=BC=8F=E7=94=9F=E5=9B=BE=E6=8B=BF=E4=B8=8D?= =?UTF-8?q?=E5=88=B0=E6=A8=A1=E5=9E=8B=E5=90=8D=E4=B8=8Eseed,=E5=88=86?= =?UTF-8?q?=E8=BE=A8=E7=8E=87=E4=B8=8E=E6=97=B6=E9=97=B4=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E5=B1=9E=E6=80=A7=E8=87=AA=E5=B8=A6);=E7=AB=8B=E8=A7=84?= =?UTF-8?q?=E5=A4=84remote-gen-prompts=E5=A4=B4=E6=B3=A8=E6=94=B9=E5=86=99?= =?UTF-8?q?(=E6=A0=87=E9=A2=98=E5=A4=8D=E7=8E=B0=E6=80=A7=E2=86=92?= =?UTF-8?q?=E5=87=BA=E5=A4=84=E5=A4=87=E6=9F=A5),=E8=BD=AC=E6=8A=84?= =?UTF-8?q?=E4=B8=A4=E5=A4=84=E5=90=8C=E6=AD=A5(art-assets-checklist=20?= =?UTF-8?q?=C2=A73.5/art-prompts=20=C2=A75=E6=B5=81=E7=A8=8B=E6=B3=A8),?= =?UTF-8?q?=E6=89=8B=E7=BB=98=E4=BB=B6=E7=99=BB=E8=AE=B0=E9=A1=B9(?= =?UTF-8?q?=E6=89=8B=E7=BB=98=E8=80=85/=E6=97=A5=E6=9C=9F/=E6=BA=90?= =?UTF-8?q?=E6=A1=A3=E5=B0=BA=E5=AF=B8)=E5=B9=B6=E5=85=A5=E5=90=8C?= =?UTF-8?q?=E4=B8=80=E8=BD=BB=E9=87=8F=E5=8F=A3=E5=BE=84(=E4=BD=9C?= =?UTF-8?q?=E8=80=85=E6=9C=89=E5=88=99=E8=AE=B0);art-prompts=E7=89=88?= =?UTF-8?q?=E6=9C=AC=E5=8F=B7v2.10=E2=86=92v2.11;=E5=BE=85=E5=8A=9E?= =?UTF-8?q?=E6=B8=85=E5=8D=95=E6=9D=A1=E7=9B=AE=E5=90=8C=E6=89=B9=E7=99=BB?= =?UTF-8?q?=E8=AE=B0=E5=B9=B6=E5=88=A0=E9=99=A4(net-zero)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- design/art/art-assets-checklist.md | 2 +- design/art/art-prompts.md | 6 +++--- design/art/remote-gen-prompts.md | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/design/art/art-assets-checklist.md b/design/art/art-assets-checklist.md index b6a3e98f..2aac8c7f 100644 --- a/design/art/art-assets-checklist.md +++ b/design/art/art-assets-checklist.md @@ -131,7 +131,7 @@ ### 3.5 营地场景图 - **要什么**:营地场景图 9 张——`scene_camp_bg`(背景)+ `scene_camp_gate / forge / chest / notebook / dummy / board / campfire`(七个可点物件)+ `scene_camp_tent`(承载件)。钥石顶栏图标沿用现役 `icon_keystone`。 -- **来源/规格**:**✦ 插画级**(作者自跑远程生图管线);烛光黄 `#F6C667` + 木色 `#8A5A34`(art-bible §6.2);2× 源档出图、最近邻降采样到 1280×800;后处理=抠底/降采样/色板量化/描边统一。**每张出图须登记模型名+分辨率+seed+对话/日期**。 +- **来源/规格**:**✦ 插画级**(作者自跑远程生图管线);烛光黄 `#F6C667` + 木色 `#8A5A34`(art-bible §6.2);2× 源档出图、最近邻降采样到 1280×800;后处理=抠底/降采样/色板量化/描边统一。**出图登记照 [remote-gen-prompts](remote-gen-prompts.md) 头注轻量口径执行:用途+生成时间必注,其余参数有则记。** - **排期**:营地交互重做**美术自立批**(不占迭代位;UI 贴图重构批已搁置)。终稿落 `game/assets/art/scene/`,消费常量 `UiKit.TEX_CAMP_*`。 - **现状**:全占位。 diff --git a/design/art/art-prompts.md b/design/art/art-prompts.md index 76348109..ca2d2c3e 100644 --- a/design/art/art-prompts.md +++ b/design/art/art-prompts.md @@ -1,4 +1,4 @@ -# 生图提示词卡(角色级资产)v2.10 +# 生图提示词卡(角色级资产)v2.11 > **性质**:美术清单生图通道(✦ 用户自跑,现走线上 API)的执行侧文件——每资产一段**自包含完整提示词**:正向 = 通用底座+主体+动作已拼妥、负向 = 通用底座+增补已并妥,整段复制直接贴进工作流即可,**不需要读其他文件、不需要拼装**。人物规格转写自 [character-design.md](character-design.md)(人物设计 v1.0,自 art-bible §5 迁出,圣经 §5 为存根),风格/色彩条款转写自 [art-bible](art-bible.md)(§4.1 主色板 / §4.2 语义色规则);冲突时人物规格以 character-design 为准、色彩以 art-bible 为准。 > **边界**:本文件只管**角色级**资产的生图通道。图标/格面/样张走脚本管线(⚙ 代理出),规格在 art-bible §4.6 与 [art-assets-checklist](art-assets-checklist.md),不需要提示词。**场景级资产(营地场景图的背景层与八个物件层)另立 [camp-scene-prompts](camp-scene-prompts.md),本文件不覆盖**;两卡的角色/场景分工以「谁的资产谁出卡」为界,同一段提示词不两处维护。战斗舞台的场景级两件与护甲类型图标三枚的**出图工单**登记在本文件 §5(camp-scene-prompts 只管营地场景图,战斗屏这两类无处可落);§5 只把各权威节的定值收进逐件工单,不立新值。意图动画三档是动画资产,等一屏样张锁方案后另立规格卡,本文件不覆盖。 @@ -289,7 +289,7 @@ Seamless tileable pixel art texture of dry dirt ground, top-down, for a dungeon > **范围注**:本文件原定位角色级(见文件头边界句),§4bis 已有「地形类同库登记」的先例,本节循同一先例补登记战斗屏两类——战斗舞台的场景级两件(① ②)与护甲类型图标三枚(③),两组在营地卡与清单里都无处落工单;角色级立绘重产(④)是本文件的本职。四组的规格定值清单 §4 已有登记,本节补的是「逐件照着就能出件」那一层。 > **定值纪律(§8 头注 定值单点纪律)**:本节**指路不立值**——色值 = 圣经 §4.1(含场景环境子板)、尺寸与缩放 = §8.2、明度带 = §2、甲档 = character-design §5.3、命名 = §8.3 + asset-path-map。本节新增零定值;凡圣经未定的值,一律进本节 §5.5 缺口,不在本节填空。 > **验收标注纪律**:逐条按三档标 `←机检: <断言>` / `←目检: <判据>` / `←方向性`,照圣经头注 2026-10-06 用户拍板的写法。 -> **流程**:出图前后一律走 §0 五步;出图登记义务(模型名 + 分辨率 + seed + 对话/日期)照 remote-gen-prompts 头注,随候选图存 `artwork/candidates/<资产名>/`,缺登记的候选不入正稿遴选。 +> **流程**:出图前后一律走 §0 五步;出图登记义务照 remote-gen-prompts 头注轻量口径(用途+生成时间必注,其余参数有则记),随候选图存 `artwork/candidates/<资产名>/`;登记不作正稿遴选前置。 > **产出状态**:组二地台件与组三护甲三枚已按各节 ⑤「程序化产出即终稿」产出入包(`scene_stage_plaza.png` 48×12、`ui_armor_light/ward/heavy.png` 24×24,路径见各组 ① 字段;登记=战斗一屏样张批,合并提交 3b66d1a6);组一背景插画与组四立绘重产仍待出图。 ### 5.1 组一 · B 区舞台背景插画(1 件) @@ -445,7 +445,7 @@ Do not add any of the following: realistic, photorealistic or 3D rendering; pain 1. 出件顺序 = 先主角、再三 Boss(Alpha 范围 = 主角 + 三 Boss 重产,其余敌种当前可读则保留到 Beta)。 2. **源密度判据 = 三判据②**:显示 96–188px 下脸、铲、旗、物种可认——照这条反推源档即可,逐键定档已完成(§8.2),本批不必再猜档位。 3. 手绘起稿顺序 = 剪影(§5.1 archetype)→ 体块主色 → 暗部与受光 → 描边 → 落影底盘。 -4. 逐件 2–3 版候选;登记义务项 = 手绘者 / 日期 / 源档尺寸(手绘件无模型名与 seed,按此三项替换 §0 的登记项),随候选图存 `artwork/candidates/<资产名>/`。 +4. 逐件 2–3 版候选;登记照 remote-gen-prompts 头注轻量口径(用途+生成时间必注,手绘作者有则记),随候选图存 `artwork/candidates/<资产名>/`。 5. 候选评审 = 并排横评,**隐去文件名与来源后按三判据逐条判读**(§0 五步第 1 步「便于横评」的手绘侧落法),不靠记忆与印象拍板。 6. 出件 = 透明 PNG(Alpha 直出,禁先出白底图再抠);入包前过 §8.3 色板检查器(报新增色 / 近色告警 / 超 48 上限拦截)。 diff --git a/design/art/remote-gen-prompts.md b/design/art/remote-gen-prompts.md index 29ed0880..394440d0 100644 --- a/design/art/remote-gen-prompts.md +++ b/design/art/remote-gen-prompts.md @@ -2,7 +2,7 @@ > **渠道定位**:生图渠道 = **远程对话式生图为主,本地 ComfyUI 为备选**;本文件是**对话操作单**(怎么开对话/贴什么参考图/怎么续写),提示词正文词库归 [art-prompts](art-prompts.md)——分工:词库改词库、操作单改流程,同一段正文不双处维护。 > **冲突优先级**:画法与色彩以 [art-bible](art-bible.md) 为准,人物规格以 [character-design](character-design.md) 为准;本单为执行侧操作单,不另立规格。 -> **出图登记义务(复现性)**:每张产出登记 **模型名 + 分辨率 + seed(可取则取)+ 对话/日期**,随候选原图同存 `artwork/candidates/<资产名>/`;缺登记的候选不入正稿遴选。 +> **出图登记义务(出处备查)**:每张产出随图注明 **用途**(备选/参考/其他什么用)与 **生成时间**(YYYY-MM-DD HH:MM 格式),随候选原图同存 `artwork/candidates/<资产名>/`;模型名、seed、分辨率等参数有则随手记、无则不填,分辨率这类文件属性里自带的值不必抄。登记不作正稿遴选前置——缺注明不落选,遴选时问清用途即可。 > 开新对话出图:同一角色 2–3 版候选各开新对话(同对话续写=修图);同角色换姿势在同对话续写。分辨率开大档;候选原图存 `artwork/candidates/<资产名>/`。 ## 1. 主角战斗立绘 From a2ec3e8b949a88eea5da0c2c1d8af19d06a1e1e6 Mon Sep 17 00:00:00 2001 From: DKChan <524912269@qq.com> Date: Fri, 30 Oct 2026 05:39:33 +0800 Subject: [PATCH 07/11] =?UTF-8?q?=E5=B7=A5=E7=A8=8B(=E6=B8=B2=E6=9F=93?= =?UTF-8?q?=E9=97=B8=E8=84=9A=E6=9C=AC=E9=94=99=E8=AF=AF=E6=89=AB=E6=8F=8F?= =?UTF-8?q?):=20=E4=B8=89=E6=AE=B5=E6=8E=A2=E9=92=88=E6=97=A5=E5=BF=97?= =?UTF-8?q?=E9=80=90=E6=AE=B5=E8=BF=87=20tools/error=5Fscan.py=20=E8=A1=A5?= =?UTF-8?q?=E4=B8=89=E7=A1=AC=E9=97=B8=E4=B9=8B=E4=BA=8C=E2=80=94=E2=80=94?= =?UTF-8?q?shot=EF=BC=88shot=5Fchecker=20=E4=B9=8B=E5=90=8E=EF=BC=89/fx/bo?= =?UTF-8?q?ard=20=E5=90=84=E4=B8=80=E6=AC=A1=EF=BC=8C=E5=91=BD=E4=B8=AD?= =?UTF-8?q?=E6=88=96=E6=97=A5=E5=BF=97=E4=B8=8D=E5=8F=AF=E8=AF=BB=E5=8D=B3?= =?UTF-8?q?=E7=BA=A2=EF=BC=8C=E6=A0=87=E8=AE=B0=E4=B8=8E=20run=5Fsmoke=20?= =?UTF-8?q?=E5=90=8C=E6=BA=90=EF=BC=9B=E5=A4=B4=E6=B3=A8=E8=A1=A5=E2=91=A4?= =?UTF-8?q?=E4=B8=8E=E3=80=8C=E6=96=B0=E5=A2=9E=E6=97=A5=E5=BF=97=E6=AE=B5?= =?UTF-8?q?=E5=BF=85=E9=A1=BB=E5=90=8C=E6=AD=A5=E5=8A=A0=E6=89=AB=E6=8F=8F?= =?UTF-8?q?=E3=80=8D=E7=BA=AA=E5=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 验证=合成日志三分支(clean 0/命中 1/不可读 2)+真跑 render_gate exit=0 全绿(三段零命中、残留 Godot=0、golden changed 0.00%)+文档域闸五件 PASS。 文档同步=architecture 测试域两处「SCRIPT ERROR 扫描缺失」换代、game/tests/README.md 工具行补判定面。 清单=「测试域遗留」整条删除(第 1 项被能力清单模型取代/第 3 项与 test-conventions §6 存量不清扫口径冲突且多进程分片后前提消失/第 4 项行覆盖率用户裁无意义/第 2 项即本批);基线条目扩为 02/05/09 三键(05 主区实测绿,baseline 红键属代码面,随下一代码批在 worktree 内重生成) --- .../engineering/architecture/architecture.md | 4 ++-- game/tests/README.md | 2 +- tools/render_gate.sh | 16 ++++++++++++++++ 待办清单.md | 19 ++----------------- 4 files changed, 21 insertions(+), 20 deletions(-) diff --git a/design/engineering/architecture/architecture.md b/design/engineering/architecture/architecture.md index a169a01a..fd60bb59 100644 --- a/design/engineering/architecture/architecture.md +++ b/design/engineering/architecture/architecture.md @@ -238,7 +238,7 @@ | **run_system_test**(系统测试运行器) | `tools/run_system_test.py` | 系统测试总入口:headless 跑真实玩法路径断言面(宿主=`res://tests/system_test.gd`)+ 三闸判定(口径同 run_smoke,摘要行兼容两种宿主格式) | 进程退出码(0=PASS / 1=FAIL) | 三闸齐备(同 run_smoke:退出码/摘要失败数/脚本错误扫描;wall-clock 超时在位) | | **run_all**(单元与集成测试) | `game/tests/run_all.gd` | 64 套统一入口(61 单元+3 集成,2026-10-28 实数):套件 manifest 逐条「套件 → 期望退出码」,致命类 expect=1 独立子进程实跑;`negative` 字段标负面套件(仅豁免错误扫描一闸);选跑态 `--only=<词[,词…]>`(直跑形态对套件路径子串匹配只跑命中套件,零命中=用法错 quit(2),仅供开发期最窄确认——不产闸回执、不作验收凭据,批末全量闸不经选跑分支) | 逐套件结果 + 汇总退出码(任一套件失败 quit(1)) | 套件级退出码协议在位;三硬闸齐备(入口内扫子套件输出 + 编排层扫 `unit.log`;`Kit.finish` 零断言返回专用码 2)。子进程输出须经系统命令解释器重定向落盘再读——`OS.execute` 的输出管道在本机恒空 | | **probe_gate**(场景探针) | `tools/probe_gate.sh` | headless 场景探针段编排:默认段 ui_input_probe / ui_struct_probe / layout_probe / ui_contrast_probe / **screen_flow_probe**(屏壳切换),`--click` 加跑 ui_click_probe,`--full` 加跑 ui_probe / ui_tune_probe / t17_defer_probe / fx_probe;孤儿 Godot 预清 + 批末残留清点(必须 0) | 段级 FAIL 输出 + 汇总退出码 | 每段 timeout 守卫在位(挂死 124/137 = FAIL,不静默);判定统一走 `verdict` 函数——退出码为唯一权威判据,PASS 串降级为附加判据,逐段跑 `tools/error_scan.py` | -| **render_gate**(视觉 golden) | `tools/render_gate.sh` | 窗口化渲染闸:①shot_probe 七屏截图 → shot_checker A-D 语义断言;②fx_shot_probe / board_shot_probe 取证(超时/零字节/文件缺失任一 = FAIL);③棋盘 golden 逐像素容差比对(差 ≤16 / changed ≤2%,provisional)+ 菜单 golden;④批末孤儿残留清零 | 段级 FAIL 输出 + 汇总退出码 | 查退出码在位(每段 timeout 守卫 + 退出码/取证文件双检);**SCRIPT ERROR 扫描缺失**;断言数下限不适用(判定主体 = golden 容差与取证文件存在性,非断言计数) | +| **render_gate**(视觉 golden) | `tools/render_gate.sh` | 窗口化渲染闸:①shot_probe 七屏截图 → shot_checker A-D 语义断言;②fx_shot_probe / board_shot_probe 取证(超时/零字节/文件缺失任一 = FAIL);③棋盘 golden 逐像素容差比对(差 ≤16 / changed ≤2%,provisional)+ 菜单 golden;④批末孤儿残留清零;⑤三段探针日志逐段脚本错误扫描 | 段级 FAIL 输出 + 汇总退出码 | 查退出码在位(每段 timeout 守卫 + 退出码/取证文件双检);SCRIPT ERROR 扫描在位(逐段 `tools/error_scan.py`,标记与 run_smoke 同源);断言数下限不适用(判定主体 = golden 容差与取证文件存在性,非断言计数) | | **static_scan**(静态扫描域) | `game/tests/static_scan.sh` | 静态扫描域 S1–S10 可执行载体(grep 规则 + `tools/audit_type_hints.py`〔S9〕+ `tools/audit_file_headers.py`〔S10〕) | fail 聚合退出码(任一硬失败规则命中即 exit 1) | 查退出码在位;SCRIPT ERROR 扫描与断言数下限不适用(逐规则命中即红,无运行时错误面与断言计数);S3 现为 warning 级、不参与 fail 判定(见下表) | ### 改动域划分(2026-10-17 用户裁「代码批只跑代码闸、文档批只跑文档闸」) @@ -267,7 +267,7 @@ | 硬闸 | run_smoke | run_system_test | run_all | probe_gate | render_gate | static_scan | |---|---|---|---|---|---|---| | **退出码优先** | 已落实(闸①) | 已落实(闸①,口径同 run_smoke) | 已落实(套件 manifest expect 协议) | 已落实(`verdict` 函数逐段判退出码,PASS 串不作判据) | 已落实(段级退出码 + 取证双检) | 已落实(fail 聚合退出) | -| **SCRIPT ERROR 扫描** | 已落实(闸③,外部扫描——GDScript 无脚本错误陷阱 API,闸设在外部包装) | 已落实(闸③,标记清单与 run_smoke 同源) | 已落实(入口内扫子套件输出;子进程的 stdout/stderr 须先落盘——`OS.execute` 管道在本机恒空) | 已落实(逐探针段 `tools/error_scan.py`,标记与 run_smoke 同源) | **缺失**(本批未收——判定主体是 golden 容差与取证存在性;登记待办清单) | 不适用(静态域无运行时错误面) | +| **SCRIPT ERROR 扫描** | 已落实(闸③,外部扫描——GDScript 无脚本错误陷阱 API,闸设在外部包装) | 已落实(闸③,标记清单与 run_smoke 同源) | 已落实(入口内扫子套件输出;子进程的 stdout/stderr 须先落盘——`OS.execute` 管道在本机恒空) | 已落实(逐探针段 `tools/error_scan.py`,标记与 run_smoke 同源) | 已落实(三段探针日志逐段 `tools/error_scan.py`,标记与 run_smoke 同源) | 不适用(静态域无运行时错误面) | | **断言数下限** | 无独立下限(闸②摘要行必须在案,防「跑一半仍 PASS」;脚本错误吞断言路径由闸③兜住) | 同 run_smoke(过渡期宿主摘要行必须在案) | 已落实(`Kit.finish` 零断言返回专用退出码 2——与「断言失败=1」区分,防致命类套件的 expect 协议放过) | 已落实(退出码 0 但无该探针签名标记亦判红——防静默退出) | 不适用(golden 容差 + 取证存在性判定) | 不适用(逐规则命中判定;另有扫描面为空即判红的零命中自检) | 背景事实(run_smoke 头注在案):GDScript 运行时脚本错误不改进程退出码、不计入冒烟失败数、且静默中断所在函数剩余断言——2026-09-19 状态记录 83 实证「309 项 0 失败」实为断言未跑全。这是 SCRIPT ERROR 扫描必须存在于判定层的原因。 diff --git a/game/tests/README.md b/game/tests/README.md index 3fb51ccf..0fc9073e 100644 --- a/game/tests/README.md +++ b/game/tests/README.md @@ -194,7 +194,7 @@ tests/ | `tools/run_system_test.py`(系统测试) | 真实玩法路径的行为断言面(推理→战斗→结算→进度推进) | 退出码+脚本错误扫描 | 玩法链路改动的调试期确认 | | `tests/run_all.gd`(单元与集成) | 公式/状态机/契约/跨系统闭环(65 套件 manifest) | 退出码+三硬闸(见下);每套件子进程带截止时间守护——超时先 taskkill /T 整树回收再判该套件 FAIL、批继续(默认 120s,环境变量 `RUN_ALL_SUITE_TIMEOUT_SEC` 可覆盖);连续 3 个套件超时=红树整批挂死,第 3 个即中止整轮、汇总已见失败与超时清单后非 0 退出(阈值=可调常量,不连续的超时照旧逐个回收) | 新套件单跑调试;逻辑改动的最小单元复跑;开发期选跑——追加 `-- --only=<词[,词…]>` 只跑路径命中词的套件(零命中=用法错 exit 2;此形态仅供开发期最窄确认,不产闸回执、不作验收凭据);闸机关联档选跑——同一过滤机制加 `-- --only-source=gates`,由 `tools/run_all_gates.sh` 在 02 闸传入(回执 scope=related,是验收跑批本体) | | `tools/probe_gate.sh`(场景探针,`--click`/`--full` 两模式) | UI 可达性、可见性、状态——真实实例化场景+真实输入路径 | 探针自检+退出码 | 新增 UI 区域的配套探针直跑与断言复核 | -| `tools/render_gate.sh`(渲染 golden) | 画面基线——截图与基线图逐像素容差比对 | golden 比对脚本(依赖 PIL) | 主题/素材/排版类改动;窗口化运行,需开显示器 | +| `tools/render_gate.sh`(渲染 golden) | 画面基线——截图与基线图逐像素容差比对 | golden 比对脚本(依赖 PIL)+退出码/取证双检/三段探针日志脚本错误扫描(`error_scan.py`) | 主题/素材/排版类改动;窗口化运行,需开显示器 | | `game/tests/static_scan.sh`(S 域) | 项目纪律+第三方质量规则:RNG 单点/core 纯度/类型标注/文件头/注释禁词/旧符号残留;S13=gdstyle 质量规则(重复 load、循环内 await、循环内分配、不可达代码等真缺陷类;基线键=文件|规则|函数名(类/文件级=文件|规则,无数字条目带消息),数字漂移不假红,同键指标恶化超基线登记值即红) | 退出码(逐规则 FAIL 行) | 改产品码前后的快速自检;新增纪律先补扫描规则再修码 | | 测量件(`game/sim/`,逐件见下「游离脚本台账」) | 期望/分布读数——只给读数,不判对错 | 人工读 stdout 或配套工具脚本 | 调参与归因;MC 类一律用户发起(档位表见 `sim-data/README.md`「MC 采集档位表」) | diff --git a/tools/render_gate.sh b/tools/render_gate.sh index b39e209a..d6443f25 100644 --- a/tools/render_gate.sh +++ b/tools/render_gate.sh @@ -18,6 +18,10 @@ # ④ 基准档 1280 单档(Q4)。1920 档注记:16:9 全屏下 stretch=canvas_items/aspect=keep 等比 # 1.35×+左右黑边各 96px,构图与基准档一致(分辨率案甲)——分辨率维度不重复建闸。 # (1920 布局机检面现无承载,待补。) +# ⑤ 脚本错误扫描(三硬闸之二):shot/fx/board 三段 Godot 日志逐段过 tools/error_scan.py, +# 命中 SCRIPT ERROR/Parse Error 即红(标记与 run_smoke.py 同源);python 工具自身输出不扫。 +# 此类错误不改退出码、不计失败数,且会中断所在函数的剩余断言——只能由外部扫日志。 +# 新增日志段必须同步加扫描调用,漏加=该段静默错误漏网。 # 过程产物纪律(Q2):一切截图 PNG 落 mktemp 临时区,闸毕即弃——任何过程 PNG 禁入 git; # 例外=game/tests/golden/ 基线(测试资产入库,.gitignore 已核不挡)。 # 窗口化运行会短暂弹 Godot 窗口(本机可开窗口径);禁改 --headless 跑本闸 @@ -41,6 +45,15 @@ kill_orphans() { local p; for p in $(orphans); do taskkill //F //PID "$p" >/dev/null 2>&1; done } +scan_log() { # scan_log <段名> <日志>——脚本错误扫描;日志不可读(error_scan exit 2)同判红 + local name="$1" log="$2" + if ! python "$REPO/tools/error_scan.py" "$log" >"$TMP/err_scan.txt" 2>&1; then + echo "[render_gate] FAIL — $name 脚本错误扫描未通过(命中或日志不可读):" + sed -n '1,6p' "$TMP/err_scan.txt" | sed 's/^/ /' + _rc=1 + fi +} + # 冷检出刷导入(.godot 不入 git,fresh worktree 首跑一次性付) if [ ! -f "$GAME/.godot/uid_cache.bin" ]; then echo "[render_gate] 冷检出:editor --quit 刷导入(一次性,可到 1-2 分钟)" @@ -66,6 +79,7 @@ if [ "$_rc" -eq 0 ]; then _rc="${PIPESTATUS[0]}" [ "$_rc" -ne 0 ] && echo "[render_gate] FAIL — shot_checker A-D 断言存在红(S1 停机点:首跑存量 FAIL 全量呈报登记待办清单)" fi +scan_log "shot_probe" "$TMP/shot.log" echo "======== fx_shot_probe 三时刻取证(Q7) ========" FX="$TMP/fxshots" @@ -77,6 +91,7 @@ if [ "$st" -eq 124 ] || [ "$st" -eq 137 ]; then elif [ "$st" -ne 0 ]; then echo "[render_gate] FAIL — fx_shot_probe 退出码=$st(取证失败=闸红)"; _rc=1 fi +scan_log "fx_shot_probe" "$TMP/fx.log" fx_evidence() { # 取证双检:模式文件存在且非零字节(零字节/缺失任一即 FAIL——Q7) local pat="$1" min="$2" n=0 f for f in "$FX"/$pat; do @@ -101,6 +116,7 @@ if [ "$st" -eq 124 ] || [ "$st" -eq 137 ]; then elif [ "$st" -ne 0 ]; then echo "[render_gate] FAIL — board_shot_probe 退出码=$st(取证失败=闸红)"; _rc=1 fi +scan_log "board_shot_probe" "$TMP/bd.log" for b in board_L1_dungeon.png board_L2_underdark.png board_L3_deep_underdark.png board_meta.json; do if [ ! -s "$BD/$b" ]; then echo "[render_gate] FAIL — 取证缺失/零字节: $b"; _rc=1; fi done diff --git a/待办清单.md b/待办清单.md index ce666f5c..19268654 100644 --- a/待办清单.md +++ b/待办清单.md @@ -92,9 +92,9 @@ **状态**:待执行 -#### 闸基线 02/09 两键换代——存量红指纹已随迭代 41 测试债批归绿(2026-10-29 登记,来源=批次移交) +#### 闸基线 02/05/09 三键换代——存量红指纹已消除或现行不复现(2026-10-29 登记、2026-10-30 并入 05,来源=批次移交) -**实况**:证据=迭代 41 测试债批代码域闸实测(worktree 分支 `testdebt-20261029`,回执 commit afd1a41f、域=code、scope=full、零新增红),02 单元与集成与 09 静态扫描两闸判「基线红 → 现绿(改善)」;基线 `game/tests/.gates/baseline.json` 里这两键仍记着已消除的存量红指纹(02 fp f9865f1a5a44=9 套件失败;09 fp 1a9ad773489f=S9 24 处+S10 4 处+S11 1 处),留着不动的后果=日后同类红回归会被判「存量红·对基线零新增」静默放行。待做=两键按归绿实测重生成(写 exit=0/绿指纹),改的是 `game/` 下非 .md 文件=代码面,须随下一个代码批在 worktree 内一并落、禁主区直改;人工确认凭据=上述回执与 reports/迭代41测试债批-实现报告-2026-10-29.md 第三节。本条目无设计段(机械重锚),不走写卡与编排。 +**实况**:证据=迭代 41 测试债批代码域闸实测(worktree 分支 `testdebt-20261029`,回执 commit afd1a41f、域=code、scope=full、零新增红),02 单元与集成与 09 静态扫描两闸判「基线红 → 现绿(改善)」;05 渲染闸在 2026-10-30 脚本错误扫描批主区真跑 `bash tools/render_gate.sh` exit=0 全绿(shot/fx/board 三段扫描零命中、残留 Godot=0、golden changed 0.00%),其红键在现行主区不复现。基线 `game/tests/.gates/baseline.json` 里这三键仍记着历史红指纹(02 fp f9865f1a5a44=9 套件失败;05 fp de89589e49ed;09 fp 1a9ad773489f=S9 24 处+S10 4 处+S11 1 处),留着不动的后果=日后同类红回归会被判「存量红·对基线零新增」静默放行。待做=三键按归绿实测重生成(写 exit=0/绿指纹),改的是 `game/` 下非 .md 文件=代码面,须随下一个代码批在 worktree 内一并落、禁主区直改;05 须在素材齐盘预检后跑出真值(冷检出空盘态下的渲染红不作数)。人工确认凭据=上述回执、reports/迭代41测试债批-实现报告-2026-10-29.md 第三节与本批提交说明。本条目无设计段(机械重锚),不走写卡与编排。 **改动面**:游戏代码 @@ -473,21 +473,6 @@ **状态**:待写卡(备选) -#### 测试域遗留(2026-10-16 登记,来源=批次移交) - -**实况**:证据=迭代 29 批内未收余量(交付报告与验收审计申报,报告已按吸收即死退役、git 历史可考)。迭代 29 把验收语义从「跑一遍没崩=通过」扭到「三层完备+判定可靠」,三硬闸(退出码/脚本错误扫描/断言数下限)已落地,L2/L3 从零建起承载。本批未收的余量集中登记在此,均不阻塞、不排期: - -| # | 事项 | 落点与要点 | -|---|---|---| -| 1 | **余下 3 个 core 模块仍零指名单测**:`board_data`/`reward_economy`/`skill_lottery` | 测试基建批。本批补了 minesweeper_rules/board_generator/config_db_resolver/config_db_cross_validator 四件;余三件按同一手法补(判据=能否在 `--script` 模式不加载 autoload 验完) | -| 2 | **render_gate 的 SCRIPT ERROR 扫描仍缺失** | 测试基建批。判定主体是 golden 容差与取证文件存在性,脚本错误不改退出码时无扫描面;本批只把矩阵状态如实记为「缺失」,收它的写法待裁 | -| 3 | **E 级卫生件**(test_kit static var 串台风险、4 套件自建断言出口、157 处 untyped 容器、76 处 lambda) | 工程债批。本批只统一了**新写**断言的出口,存量未动;test_kit 的 static var 是「并发跑批」的前置障碍(并发分层方案的前提) | -| 4 | **行覆盖率度量缺失** | 基建评估项。Godot 无内建、第三方属新基建;现行补洞靠「零指名清单 + 人工判定」,是否引入度量待裁 | - -**改动面**:游戏代码 - -**状态**:待写卡(备选) - #### 营地交互重做·五张需求卡片(2026-10-18 登记,来源=会话提及) **实况**:2026-10-17~18 需求讨论澄清会话产出结论文档,用户令按工作内容维度拆卡、卡片不预占迭代号。五卡已写(顺序=执行顺序):①存档制数据层改造批 ②主菜单三入口化批 ③选档界面新建批 ④营地场景图新建批 ⑤Esc 浮窗与营地顶栏批(各卡估时与内容见卡片自身)。三道复核:grilling 子 Agent 对抗审查(五卡各一)→v1.1;用户裁定「事项按推荐的来」→v1.2;用户两次订正(**卡④留在批内不踢出**;前置归用户自立批,Agent 不代跑不代产——曾越权起草的点选反馈设计稿 v0.1 已撤回删除)→卡④ v2.2;**卡④ 2026-10-21 用户令退回美术设计段(v2.3,非有效卡,美术设计闭合后重立卡)**。①②③⑤ 零待裁点可编工程波次:②③ 硬耦合同波(「进入存档」钮落点=选档界面),① 是 ③ 前置;⑤ 随 ④ 代码波同行。Alpha 出口裁决(2026-10-21 用户裁):五卡整体列入 Alpha——08「三 · 界面」已开条目,Alpha 出口依赖五卡完工与卡④三个用户侧前置销号。**工程波次一已落地(2026-10-22)**:卡①②③ 随迭代 33 实现批合回 master(合并提交 ebf40947/5c2a7bcf/508f190b,总收口 6e8f72b2),三卡需求卡片与批次产出物已按「吸收即死」退役(设计口径已吸收进 存档序列化.md/生涯.md/camp.md/08-Alpha版本标准.md v1.13/art-bible.md v3.18,反哺落文凭据=文档批 git 提交 1864f157+9f7b3e8a);卡④(营地场景图)退回美术设计段待重立卡、卡⑤(Esc 浮窗)随卡④ 代码波同行,两卡未编排——编入哪一迭代由用户经迭代编排段发令。关联文档: From 30fdec1a624c33f43a625d5662f0757958356271 Mon Sep 17 00:00:00 2001 From: DKChan <524912269@qq.com> Date: Fri, 30 Oct 2026 05:52:44 +0800 Subject: [PATCH 08/11] =?UTF-8?q?=E5=86=99=E5=8D=A1(=E8=BF=AD=E4=BB=A3=204?= =?UTF-8?q?4=20=E5=8D=A1=E2=91=A2=E6=B5=8B=E9=80=9F=E5=BE=AA=E7=8E=AF?= =?UTF-8?q?=E6=89=B9=20v1.1=20=E5=81=9C=E5=8D=A1=E9=87=8D=E8=A3=81):=20?= =?UTF-8?q?=E5=AE=9E=E7=8E=B0=E6=AE=B5=20T0=20=E4=B8=89=E9=87=8D=E8=AF=81?= =?UTF-8?q?=E6=8D=AE=E5=AE=9A=E8=B0=B3=E5=8D=A1=E2=91=A2=E6=A0=B8=E5=BF=83?= =?UTF-8?q?=E5=89=8D=E6=8F=90=E5=B7=B2=E8=A2=AB=E8=BF=AD=E4=BB=A3=2041=20?= =?UTF-8?q?=E6=B5=8B=E8=AF=95=E5=80=BA=E6=89=B9=E6=B6=88=E5=8C=96=E2=80=94?= =?UTF-8?q?=E2=80=94215da315=20=E6=8F=90=E4=BA=A4=E4=BF=A1=E6=81=AF?= =?UTF-8?q?=E6=98=8E=E8=BD=BD=E3=80=8Ctune=5Fsim=20=E8=BF=90=E8=A1=8C?= =?UTF-8?q?=E6=80=81=E6=94=B6=E5=B0=BE=E5=BD=92=E8=BF=98=20run=E3=80=8D?= =?UTF-8?q?=EF=BC=8Bwd8=20=E4=B8=89=E6=96=AD=E8=A8=80=EF=BC=88=E7=8E=B0?= =?UTF-8?q?=E4=BD=8D=20:145-147=EF=BC=89=E4=B8=8E=20ui=5Ftune=5Fprobe=20?= =?UTF-8?q?=E5=85=A8=E9=93=BE=E8=B7=AF=E5=AE=9E=E8=B7=91=E4=B8=A4=E9=9D=A2?= =?UTF-8?q?=E5=85=A8=E7=BB=BF=EF=BC=88=E5=81=9C=E5=8D=A1=E5=91=88=E6=8A=A5?= =?UTF-8?q?=3Diter44=20worktree=20reports/iter44-=E5=AE=9E=E7=8E=B0?= =?UTF-8?q?=E6=8A=A5=E5=91=8A-2026-10-30.md=20=C2=A75=EF=BC=89=EF=BC=8C?= =?UTF-8?q?=E6=8C=89=E5=81=9C=E5=8D=A1=E5=91=88=E6=8A=A5=E5=BB=BA=E8=AE=AE?= =?UTF-8?q?=E6=A1=88=E9=87=8D=E5=86=99=E5=8D=A1=E7=89=87=E2=80=94=E2=80=94?= =?UTF-8?q?=E5=89=A5=E7=A6=BB=E5=B7=B2=E7=94=B3=E6=8A=A5=E8=A1=8C=E4=B8=BA?= =?UTF-8?q?=E6=94=B9=E5=8A=A8=20V3=EF=BC=88=E6=94=B6=E5=B0=BE=E7=BD=AE?= =?UTF-8?q?=E5=81=87=E8=BF=98=E5=8E=9F=E6=97=A0=E5=AF=B9=E8=B1=A1=EF=BC=8C?= =?UTF-8?q?=E8=BF=98=E5=8E=9F=E5=B7=B2=E7=94=B1=E8=BF=AD=E4=BB=A3=2041=20?= =?UTF-8?q?=E5=AE=8C=E6=88=90=E5=B9=B6=E7=94=B3=E6=8A=A5=EF=BC=9B=E5=AE=8C?= =?UTF-8?q?=E6=88=90=E5=AE=9A=E4=B9=89=E6=94=B9=E3=80=8Cdiff=20=E4=B8=AD?= =?UTF-8?q?=E8=A1=8C=E4=B8=BA=E6=94=B9=E5=8A=A8=E9=9B=B6=E5=A4=84=E3=80=8D?= =?UTF-8?q?=EF=BC=8C=E5=AF=B9=E7=85=A7=E8=A1=A8=20V3=20=E8=A1=8C=E6=94=B9?= =?UTF-8?q?=E5=AE=9A=E4=B9=89=E4=B8=BA=E9=9D=9E=E8=A1=8C=E4=B8=BA=E6=94=B9?= =?UTF-8?q?=E5=8A=A8=E8=A1=8C=EF=BC=9D=E6=94=B6=E5=B0=BE=E5=9B=9B=E8=AF=AD?= =?UTF-8?q?=E5=8F=A5=E5=90=8C=E5=B8=A7=E5=90=8C=E7=9B=B8=E4=BD=8D=E8=BF=81?= =?UTF-8?q?=E5=85=A5=20=5Ffinish=5Fbatch=20=E7=9A=84=E5=9B=9E=E5=BD=92?= =?UTF-8?q?=E9=94=9A=E9=9D=A2=EF=BC=8Cwd8/probe=20=E5=88=A4=E6=8D=AE?= =?UTF-8?q?=E3=80=8C=E9=9B=B6=E6=94=B9=E5=8A=A8=E8=BD=AC=E7=BB=BF=E3=80=8D?= =?UTF-8?q?=E6=94=B9=E3=80=8C=E9=9B=B6=E6=94=B9=E5=8A=A8=E4=BF=9D=E6=8C=81?= =?UTF-8?q?=E7=BB=BF=E3=80=8D=EF=BC=89=EF=BC=8CT0=20=E4=B9=89=E5=8A=A1?= =?UTF-8?q?=E6=94=B9=E7=8E=B0=E7=8A=B6=E5=A4=8D=E6=A0=B8=EF=BC=88=E4=B8=A4?= =?UTF-8?q?=E9=9D=A2=E5=AE=9E=E8=B7=91=E5=BA=94=E7=BB=BF=E2=80=94=E2=80=94?= =?UTF-8?q?=E7=BB=BF=3D=E6=8C=89=E6=97=A0=E8=A1=8C=E4=B8=BA=E6=94=B9?= =?UTF-8?q?=E5=8A=A8=E5=BD=A2=E6=80=81=E5=BC=80=E5=B7=A5=EF=BC=8C=E7=BA=A2?= =?UTF-8?q?=3D=E5=81=9C=E5=8D=A1=E5=91=88=E6=8A=A5=EF=BC=89=EF=BC=8C?= =?UTF-8?q?=E5=A4=B9=E5=85=B7=EF=BC=9D=E7=8E=B0=E8=A1=8C=E4=BA=A7=E5=93=81?= =?UTF-8?q?=E7=A0=81=20await=20=E5=BD=A2=E6=80=81=E9=80=90=E5=AD=97?= =?UTF-8?q?=E5=89=AF=E6=9C=AC=E3=80=81=E4=B8=8E=E4=BA=A7=E5=93=81=E7=A0=81?= =?UTF-8?q?=E6=96=B0=E5=BD=A2=E6=80=81=E7=94=B3=E6=8A=A5=E5=B7=AE=E5=BC=82?= =?UTF-8?q?=E4=B8=A4=E5=A4=84=E5=87=8F=E4=B8=80=E5=A4=84=EF=BC=88=E5=8F=AA?= =?UTF-8?q?=E4=BD=99=E5=A4=B9=E5=85=B7=E6=9A=B4=E9=9C=B2=20stats=20?= =?UTF-8?q?=E4=BE=9B=E5=AF=B9=E6=8B=8D=EF=BC=89=EF=BC=8C=E5=85=A8=E9=83=A8?= =?UTF-8?q?=20file:line=20=E6=8C=89=202026-10-30=20master=20=E9=87=8D?= =?UTF-8?q?=E9=94=9A=EF=BC=88run=20:36-54=EF=BC=8F=5Frun=5Fone=5Flevel=20:?= =?UTF-8?q?58-68=20=E5=B0=BE=E9=83=A8=E5=AE=9E=E4=B8=BA=E8=B4=A5=E5=B1=80?= =?UTF-8?q?=E8=AE=B0=E8=B4=A6=EF=BC=8Fwd8=20:139-147=EF=BC=8F=E5=9F=BA?= =?UTF-8?q?=E7=BA=BF=E9=94=AE=20:15=EF=BC=9BS8=20=E4=B9=9D=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E6=BC=82=E7=A7=BB=E8=AE=A2=E6=AD=A3=E5=8D=81=E6=96=87?= =?UTF-8?q?=E4=BB=B6=EF=BC=89=EF=BC=8Carchitecture=20v1.25=20S13=20?= =?UTF-8?q?=E6=B3=A8=E9=94=80=E5=8F=A5=E4=BF=9D=E6=8C=81=EF=BC=88=E6=B3=A8?= =?UTF-8?q?=E9=94=80=E5=AF=B9=E8=B1=A1=E6=98=AF=20await=20=E8=B1=81?= =?UTF-8?q?=E5=85=8D=E4=B8=8D=E4=BE=9D=E8=B5=96=E8=A1=8C=E4=B8=BA=E6=94=B9?= =?UTF-8?q?=E5=8A=A8=E7=94=B3=E6=8A=A5=EF=BC=8C=E5=8F=A5=E5=86=85=E7=94=B3?= =?UTF-8?q?=E6=8A=A5=E5=8D=8A=E5=8F=A5=E9=9A=8F=E5=AE=9E=E7=8E=B0=E6=89=B9?= =?UTF-8?q?=E7=8E=B0=E7=8A=B6=E5=8C=96=E2=80=94=E2=80=94=E5=90=8C=E6=AD=A5?= =?UTF-8?q?=E9=9D=A2=E6=B3=A8=E8=AE=B0=EF=BC=89=EF=BC=8C=C2=A716/=C2=A717/?= =?UTF-8?q?=C2=A713=20=E9=9A=8F=E5=8A=A8=EF=BC=9B=E5=BE=85=E5=8A=9E?= =?UTF-8?q?=E6=B8=85=E5=8D=95=E6=9D=A1=E7=9B=AE=E5=AE=9E=E5=86=B5=E5=90=8C?= =?UTF-8?q?=E6=89=B9=E8=AE=A2=E6=AD=A3=E8=AF=A5=E5=A4=B1=E6=95=88=E7=94=B3?= =?UTF-8?q?=E6=8A=A5=E5=8F=A5=E5=B9=B6=E7=99=BB=E8=AE=B0=E9=87=8D=E8=A3=81?= =?UTF-8?q?=E5=87=AD=E6=8D=AE=EF=BC=88=E7=8A=B6=E6=80=81=E8=A1=8C=E7=BB=B4?= =?UTF-8?q?=E6=8C=81=E5=B7=B2=E5=86=99=E5=8D=A1=EF=BC=8B=E5=B7=B2=E7=BC=96?= =?UTF-8?q?=E8=BF=AD=E4=BB=A3=2044=E2=80=94=E2=80=94v1.1=20=E8=90=BD?= =?UTF-8?q?=E5=AE=9A=E5=8D=B3=E9=87=8D=E7=AB=8B=EF=BC=89=EF=BC=8Croadmap?= =?UTF-8?q?=20=E8=BF=AD=E4=BB=A3=2044=20=E8=A1=8C=E4=B8=8D=E5=8A=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- reports/需求卡片-测速循环批-2026-10-29.md | 94 +++++++++++------------ 待办清单.md | 4 +- 2 files changed, 49 insertions(+), 49 deletions(-) diff --git a/reports/需求卡片-测速循环批-2026-10-29.md b/reports/需求卡片-测速循环批-2026-10-29.md index c7748f9a..98b32a9b 100644 --- a/reports/需求卡片-测速循环批-2026-10-29.md +++ b/reports/需求卡片-测速循环批-2026-10-29.md @@ -1,36 +1,36 @@ # 需求卡片——测速循环批(tune_sim_controller 循环内 await 真实消除) -> **版本状态**:v1.0 定稿——零待裁点(2026-10-29 用户裁:信号步进状态机形态、收尾置假还原作为已申报行为改动、双实现对拍入批、错误路径差异接受并文档化)。 +> **版本状态**:v1.1 定稿——零待裁点(2026-10-30 停卡重裁:实现段 T0 三重证据定谳 v1.0 的「潜伏红」前提已被迭代 41 测试债批消化〔215da315——运行态收尾归还 run〕,按停卡呈报建议案剥离已申报行为改动 V3、T0 义务改现状复核、夹具申报差异两处减一处;2026-10-29 原四点裁决中②作废,①③④仍有效——裁决记录见第 15 节)。 > **接收方**:待办清单条目「零豁免五键清偿批——S13 余量五键真修四卡(2026-10-29 登记,来源=会话提及)」——本卡为其四卡中的测速循环批卡。 -> **来源**:reports/设计-测速循环去await-2026-10-29.md(2026-10-29 设计闭合)。**唯一事实源**:`reports/设计-测速循环去await-2026-10-29.md` + `design/engineering/architecture/architecture.md` v1.25「测试与质量域」S13 测量面豁免注销句(2026-10-29 零豁免裁:原循环内 `await` 豁免〔2026-10-27〕注销——tune_sim_controller 改 process_frame 信号常驻连接+步进状态机,每帧一局、帧相位逐点对齐;随批申报行为改动一处:运行态收尾由「每局置假」还原为「整批收尾单次置假」,消除与 wd8/ui_tune_probe 断言面的静态矛盾)。 +> **来源**:reports/设计-测速循环去await-2026-10-29.md(2026-10-29 设计闭合;§2.3 潜伏红推演与 §10 待裁点 1 的「还原」申报已随停卡重裁作废,§3–§7 形态与等价性论证仍有效)。**唯一事实源**:`reports/设计-测速循环去await-2026-10-29.md` + `design/engineering/architecture/architecture.md` v1.25「测试与质量域」S13 测量面豁免注销句(2026-10-29 零豁免裁:原循环内 `await` 豁免〔2026-10-27〕注销——tune_sim_controller 改 process_frame 信号常驻连接+步进状态机,每帧一局、帧相位逐点对齐;注销对象是 await 豁免、不依赖行为改动申报,句保持;句内「随批申报行为改动一处」半句已失效,随实现批现状化时一并修正——见第 6 节)+ 停卡呈报三重证据(iter44 worktree 分支 `reports/iter44-实现报告-2026-10-30.md` §5——重裁依据)。 ## 1. 目标与完成定义 -这批做什么:把 S13 静态质量闸(gdstyle)在册裸键 `game/presentation/tune_sim_controller.gd|quality/await-in-loop` 真实消除——`run(n)` 的 for 循环内 `await process_frame` 改为 process_frame 信号常驻连接+步进状态机(每帧回调执行一局、步尽次帧收尾断连),`run()` 只留函数级一次 `await _batch_finished` 保持协程身份;改后全文件零 for/while,该键从文本形态根除、此文件对这个键结构性免疫。随批执行两项已裁事项:把「每局置假」还原为「整批收尾单次置假」(已申报行为改动——消除与两个在库断言面的静态矛盾);新增双实现对拍套件,把帧相位等价论证变成当轮真实执行证据。 +这批做什么:把 S13 静态质量闸(gdstyle)在册裸键 `game/presentation/tune_sim_controller.gd|quality/await-in-loop` 真实消除——`run(n)` 的 for 循环内 `await process_frame` 改为 process_frame 信号常驻连接+步进状态机(每帧回调执行一局、步尽次帧收尾断连),`run()` 只留函数级一次 `await _batch_finished` 保持协程身份;改后全文件零 for/while,该键从文本形态根除、此文件对这个键结构性免疫。随批执行一项已裁事项:新增双实现对拍套件,把帧相位等价论证变成当轮真实执行证据。**本批零行为改动**——收尾置假已在 run() 尾每批一次执行(迭代 41 测试债批 215da315 归还后的现行形态),本批收尾四语句同帧同相位迁入 `_finish_batch()`,语句集与语义零变化(第 3、4 节)。 什么状态算完: 1. `tune_sim_controller.gd` 全文件零循环、`await` 仅 `run()` 函数级一处;`python tools/gdstyle_gate.py` 对账该裸键消失(消失键不参与红判定)、无基线外新键。 -2. 测量语义逐点等价(第 4 节四判据)经双实现对拍在当轮真实跑批中证明——五面对拍全等;wd8 三断言与 ui_tune_probe ⑤ 零改动转绿。 -3. diff 中已申报行为改动恰一处(收尾置假还原,对照表 V3 行),无第二处行为改动。 +2. 测量语义逐点等价(第 4 节四判据)经双实现对拍在当轮真实跑批中证明——五面对拍全等;wd8 三断言与 ui_tune_probe ⑤ 零改动保持绿。 +3. diff 中行为改动零处——收尾四语句迁移为非行为改动(同帧同相位、语义零变化,对照表 V3 行),无任何行为漂移。 4. 脚本错误中断路径差异作为声明缺口写入实现报告(禁静默)。 5. 批末代码域闸全绿;实现报告与反哺点清单写齐方算收口。 ## 2. 设计事实源 -设计依据唯一出处=`reports/设计-测速循环去await-2026-10-29.md`(2026-10-29 设计闭合,零待裁点):§4 推荐案(process_frame 信号步进状态机伪代码结构)、§5 等价性证明清单(四判据+已声明缺口)、§6 键账预期、§7 行为零变化风险点。架构面凭据=`design/engineering/architecture/architecture.md` v1.25「测试与质量域」S13 测量面豁免注销句(2026-10-29 零豁免裁落文)——豁免注销、行为改动申报面与本卡一致。待办清单条目「零豁免五键清偿批」状态=文档设计已闭合+待写卡(本卡即其中一卡的写卡段产出)。 +设计依据唯一出处=`reports/设计-测速循环去await-2026-10-29.md`(2026-10-29 设计闭合,零待裁点):§3 形态评估(process_frame 信号步进状态机采纳)、§4 推荐案(伪代码结构)、§5 等价性证明清单(四判据+已声明缺口)、§6 键账预期——以上各节不受前提消化影响、仍是本卡依据;该文档 §2.3 潜伏红推演与 §10 待裁点 1「还原」申报已作废(前提消化证据见停卡呈报)。架构面凭据=`design/engineering/architecture/architecture.md` v1.25「测试与质量域」S13 测量面豁免注销句(2026-10-29 零豁免裁落文)——豁免注销句保持,句内行为改动申报半句随实现批现状化修正(第 6 节同步面)。前提消化与重裁凭据=iter44 worktree 分支 `reports/iter44-实现报告-2026-10-30.md` §5 停卡呈报(git 历史证据 215da315+T0 两面实跑绿)。待办清单条目「零豁免五键清偿批」状态=已写卡+已编迭代 44(本卡 v1.1 重裁段产出)。 -## 3. 现状事实(代码级,2026-10-29 实查;开工 T0 按当轮 master 重测重锚——行号基线为本日 master) +## 3. 现状事实(代码级,2026-10-30 实查;开工 T0 按当轮施工基面重锚——行号基线为本日 master) -- `game/presentation/tune_sim_controller.gd`(全件 68 行):`run(n)` 在 :36-52——:37 置运行态真、:40-42 开共享 JSONL 日志会话、:43 `panel.set_sim_running(true)`、:44 进度 0/n、:45 建 stats 六键束、:46 取自动策略驱动、:47-50 for 循环体(`_run_one_level` → 进度串 → :50 `await panel.get_tree().process_frame`——命中键的语句)、:51-52 收尾(close_session+报告注入)。`_run_one_level` 在 :56-68(5 参),**尾部两行 :67 `panel.set_sim_running(false)`/:68 `_running = false` 每局执行一次**(潜伏红本体,见下)。类成员 5(db/panel/_base_hp/_driver/_running)+常量 2(:7 SEED_BASE=4200、:8 PlaytestLogger preload);头注 4 行。 -- 断言面一〔wd8〕`game/tests/unit/presentation/standee_fx_sweep_test.gd:126-134`:FakePanel(内类 Node,:20-40——setter 面并入树供 get_tree)+FakeDriver(:44-55——`run_level` 回调内读 `ctrl.is_running()` 逐局记 `seen`);:129 直构控制器(字典夹具 db)、:131 `await ctrl.run(2)`(run 必须可等待、挂起至整批完成的契约)、:132-134 三断言——`drv.seen == [true, true]`/收尾 `not ctrl.is_running() and not panel.running`/报告非空。套件在 run_all.gd manifest 在册(res://tests/unit/presentation/standee_fx_sweep_test.gd,expect 0)。 -- 断言面二〔探针 ⑤〕`game/probe/ui_tune_probe.gd:63-83`::65-66 设滑条与 N=10、:67 `press_simulate_for_probe()`(真实按钮 pressed 信号链)、:68-71 守卫环(`while main.debug_overlay.is_running()` 逐帧等——SIM_GUARD_FRAMES=1800 在 :16)、:72-73 预算内未完成判红、:74-83 输出四串断言(关卡完成率/关卡完成剩余 HP 均〔口径换代 V7〕/败北节点/N=10)。面板语义面 `debug_overlay.gd`:`set_sim_running` :81-83 → `_sync_sim_button` :107-110(模拟与两层调试两钮禁用+「模拟中…」文案——浮窗运行态贯穿整批的可见面)、`is_running` :77-79。 -- 调用面 `game/presentation/main_debug_flow.gd`:`_on_tune_simulate` :72-77——守卫(活跃结算/冒险早退)后 `root._tune_sim.run(n)` **不 await 调用**(返回的协程态丢弃——新形态必须保持此调用形态可用、零改动);`_start_debug_levels` :84 守卫读 `root._tune_sim.is_running()`(两层调试入口互查守卫)。 -- 静态矛盾推演(设计文档 §2.3——T0 实跑定谳)::67-68 每局执行 → wd8 首局完成即把两个运行态置假 → `drv.seen` 实测 `[true, false]` 必红;探针按下返回后首局已在同一同步段内跑完、运行态已假 → 守卫环立即退出 → 输出停在进度串 → 四串断言全红。推断这两行原在循环之后(「循环体提函数」搬运时被卷入提取体——设计文档 §2.3),wd8 写于 d8 批且当时必绿可反证;两面均不在近期批次的关联档选测覆盖内(套件名与涉案文件无字面关联、probe_gate --full 非恒跑三保险),潜伏红因此未暴露。 -- 键账:`tools/gdstyle_baseline.txt:15` = 该文件唯一在册键(await-in-loop 裸键,基线 16 键之一)。S13 扫描面=产品码三目录(game/core+data+presentation——probe/sim/tests 不在面,`game/tests/static_scan.sh` S13 头注在案);S8 文件集=九文件显式清单(static_scan.sh :317——不含本件);S9/S10 扫描面同不含 game/tests/。 +- `game/presentation/tune_sim_controller.gd`(全件 68 行):`run(n)` 在 :36-54——:37 置运行态真、:40-42 开共享 JSONL 日志会话、:43 `panel.set_sim_running(true)`、:44 进度 0/n、:45 建 stats 六键束、:46 取自动策略驱动、:47-50 for 循环体(`_run_one_level` → 进度串 → :50 `await panel.get_tree().process_frame`——命中键的语句)、:51-54 收尾四语句(`close_session()` :51 → 报告注入 :52 → `panel.set_sim_running(false)` :53 → `_running = false` :54)——**收尾置假在 run() 尾、for 循环外、每批恰一次**。`_run_one_level` 在 :57 注释/:58-68(5 参),尾部 :66-68 为败局节点记账(defeat 分支)——非置假。类成员 5(db/panel/_base_hp/_driver/_running)+常量 2(:7 SEED_BASE=4200、:8 PlaytestLogger preload);头注 4 行。 +- 前提消化定谳(v1.0「静态矛盾推演」作废依据):git 历史——迭代 41 测试债批提交 215da315(2026-10-29 合回)提交信息明载「两个产品回归随批修(……tune_sim 运行态收尾归还 run)」,收尾置假两行由该批归还 run() 尾并随该批申报;v1.0 成文(2026-10-29)与该批合回同日,其「现状考证」被上游批施工消化变质(读法 A;读法 B「考证当时即误读」与 215da315 提交信息矛盾,停卡呈报 §5 不采)。T0 实跑三重证据(iter44 worktree,停卡呈报 §5):wd8 三断言(现位 :145-147)全 PASS(套件 18 checks 全绿);ui_tune_probe 全链路 PASS(⑤ 守卫环 1800 帧预算内退出+输出四串在)。**潜伏红不存在**——两面现行全绿,「零改动转绿」改「零改动保持绿」。 +- 断言面一〔wd8〕`game/tests/unit/presentation/standee_fx_sweep_test.gd:139-147`:FakePanel(内类 Node,:20-40——setter 面并入树供 get_tree)+FakeDriver(:44-55——`run_level` 回调内读 `ctrl.is_running()` 逐局记 `seen`);:142 直构控制器(字典夹具 db)、:144 `await ctrl.run(2)`(run 必须可等待、挂起至整批完成的契约)、:145-147 三断言——`drv.seen == [true, true]`/收尾 `not ctrl.is_running() and not panel.running`/报告非空。套件在 run_all.gd manifest 在册(res://tests/unit/presentation/standee_fx_sweep_test.gd,expect 0,manifest :188)。 +- 断言面二〔探针 ⑤〕`game/probe/ui_tune_probe.gd:63-83`::65-66 设滑条与 N=10、:67 `press_simulate_for_probe()`(真实按钮 pressed 信号链)、:68-71 守卫环(`while main.ui.modals.debug_overlay.is_running()` 逐帧等——SIM_GUARD_FRAMES=1800 在 :16)、:72-73 预算内未完成判红、:74-83 输出四串断言(关卡完成率/关卡完成剩余 HP 均〔口径换代 V7〕/败北节点/N=10)。面板语义面 `debug_overlay.gd`:`set_sim_running` :81-83 → `_sync_sim_button` :107-110(模拟与两层调试两钮禁用+「模拟中…」文案——浮窗运行态贯穿整批的可见面)、`is_running` :77-79。 +- 调用面 `game/presentation/main_debug_flow.gd`:`_on_tune_simulate` :72-77——守卫(活跃结算/冒险早退)后 :77 `root._tune_sim.run(n)` **不 await 调用**(返回的协程态丢弃——新形态必须保持此调用形态可用、零改动);`_start_debug_levels` :84 守卫读 `root._tune_sim.is_running()`(两层调试入口互查守卫)。 +- 键账:`tools/gdstyle_baseline.txt:15` = 该文件唯一在册键(await-in-loop 裸键,基线 16 键之一)。S13 扫描面=产品码三目录(game/core+data+presentation——probe/sim/tests 不在面,`game/tests/static_scan.sh` S13 头注在案);S8 文件集=**十文件**显式清单(static_scan.sh :317 现行实查——不含本件);S9/S10 扫描面同不含 game/tests/。 - 产品码 process_frame 订阅面(T0 实查项):本件 :50(循环内 await)+`settlement_fx_view.gd:94`(play_damage_number 内一次性 await 等文本度量——战斗结算呈现期,与模拟批不并存)。现库无「run 途中新增订阅者」场景。 - 报告渲染面 `game/presentation/hud_presenter.gd` :197-218 `tune_sim_report`(静态函数,零触碰计划):空数组 `_mean`/`_p90` 双守卫(:221-227/:230-235)、完成率分母 `maxi(1, n)`(:206)——n=0 退化路径渲染安全(本批对拍 n=0 案的前提,实查在案)。 -- 能力表现状:`game/tests/README.md` 能力表零 tune_sim/调试浮窗行;锚到本批断言宿主套件的唯一既有行=「站桩敌人呈现与结算演出落点」(代表用例 `standee_fx_sweep_test.gd:_init`——wd8 断言所在函数)。 +- 能力表现状:`game/tests/README.md` 能力表「调参测速批量模拟(逐帧步进与统计读数)」行已入表(:131——写卡段 v1.0 同批义务,真实入口=批量模拟入口,代表用例=对拍套件);断言宿主 wd8 套件锚既有行「站桩敌人呈现与结算演出落点」(:130)。 ## 4. 设计契约(违反即返工的红线条款,标 🔴 触碰=L3 停机呈报) @@ -40,30 +40,30 @@ ③ 终止条件与终止时读数不变——终止=计数走满 n;close_session/运行态复位/报告注入在同帧执行; ④ 输出逐字不变——报告=未触碰的 `HudPresenter.tune_sim_report`;stats 是 (种子, atk_pct, hp_pct) 的纯函数、帧时点不进测量值;JSONL 由未触碰的自动策略逐行写、close 时点同帧。 违反即返工;等价性对拍失败=L3 停机呈报。 -- 🔴 **行为改动唯一=收尾置假还原**(已申报——对照表 V3 行):`_run_one_level` 尾部两行(:67-68)删除,运行态复位收进 `_finish_batch()` 收尾单次执行;禁任何其他行为漂移——`_on_tune_simulate` 不加运行态早退守卫(设计文档待裁点 3 备选否决)、发布态零触碰、探针①–④⑥–⑩ 段零触碰、`HudPresenter`/`PlaytestLogger`/`sim/level_autoplay.gd`/`debug_overlay.gd` 零触碰。 +- 🔴 **行为改动零处(收尾语义零变化)**:收尾置假已在 run() 尾每批一次执行(:53-54,215da315 归还后的现行形态)——本批 `_run_one_level`(:58-68)零触碰、运行态复位语义零变化;收尾四语句(:51-54)迁入 `_finish_batch()` 为同帧同相位语句迁移(判据③承载——非行为改动,对照表 V3 行)。禁任何行为漂移——`_on_tune_simulate` 不加运行态早退守卫(设计文档待裁点 3 备选否决)、发布态零触碰、探针①–④⑥–⑩ 段零触碰、`HudPresenter`/`PlaytestLogger`/`sim/level_autoplay.gd`/`debug_overlay.gd` 零触碰。 - 🔴 **脚本错误中断路径差异=声明缺口**(设计文档 §5 缺口 1,接受并文档化):GDScript 无错误陷阱 API、差异不可消除——旧形态步进体内脚本错误=协程死亡静默停摆(运行态永真、报告永不落);新形态=计数未推进、次帧重试同一步(确定性错误逐帧重试,探针 1800 帧守卫可抓;生产态=持续重试的可见坏,与旧「静默卡死」同级不同形)。实现报告文档化义务(T3),禁静默、禁造第三条路(错误陷阱/守卫兜底均已否决);测量批遇错本就整批作废,两形态都不产出可用读数。 -- 🔴 **S8 结算路径 await 零命中面不触碰**:本件不在 S8 文件集(九文件显式清单实查不含本件);本批零触碰 S8 文件集与一切闸件。 +- 🔴 **S8 结算路径 await 零命中面不触碰**:本件不在 S8 文件集(十文件显式清单实查不含本件);本批零触碰 S8 文件集与一切闸件。 - 🔴 **拆分边界纪律**(判据权威=code-conventions §1.1,卡内执行条款):本批零拆出单元——步进状态机收编本件(职责语句与不拆理由见第 8 节);①拆出单元须有可陈述职责语句与单一变化原因;②命不出名字、只能说「剩下的成员」的打包=凑计数袋,禁;③「过阈值」只作发现信号——本批键消除靠形态根除、不靠拆件凑数;④按纪律拆不出内聚单元→停卡呈报;⑤禁沿阈值轴拆。 - 🔴 **RNG 与种子零触碰**:SEED_BASE=4200 与逐局种子切分(SEED_BASE+i)零变化——stats 是种子纯函数是等价性论证的前提。 - 🔴 **注释纪律**:新增头注/注释零变更叙事(「由 await 改为信号」类句禁——沿革归 git);S11 注释禁词由术语表解析供给,新增注释用白话描述现行形态与信号契约。 ## 5. 范围边界 -做什么:第 3 节四件事——T0 现状定谳(实跑两断言面)、`tune_sim_controller.gd` 步进状态机改造+收尾还原、双实现对拍套件、键账对账与收口。 +做什么:第 3 节四件事——T0 现状复核(两面实跑应绿)、`tune_sim_controller.gd` 步进状态机改造(收尾语义零变化)、双实现对拍套件、键账对账与收口。 不做什么(明示去向): - 零豁免其余四键(main.gd 类变量 49、battle_orchestrator 类变量 38、board_cell_unit 30、standee_body 19)——各归组合根注册面批/战斗编排归约批/呈现层状态件批(同条目四卡,待办清单在册)。 - `tools/gdstyle_baseline.txt` 禁实现批中途刷新——批末由用户人工重生成(第 6 节)。 - `_on_tune_simulate` 运行态早退守卫——不收件(+1 行为面、system_test 前置断言随之需复核,代价大于收益,设计文档待裁点 3 否决)。 -- `design/` 整个目录、两份根流程清单——实现批禁写;该改的点列反哺点清单。`game/tests/README.md`:测量面专属能力行已随本卡写卡段同批入表(「调参测速批量模拟」行——写卡同批义务,grilling 复核订正),实现批禁写红线不变。 +- `design/` 整个目录、两份根流程清单——实现批禁写;该改的点列反哺点清单。`game/tests/README.md`:测量面专属能力行已随本卡 v1.0 写卡段同批入表(「调参测速批量模拟」行),实现批禁写红线不变。 - 探针其余段与套件其余断言族(standee_fx_sweep 的 wd2/wd4/wd5/wd12 面)零触碰;`architecture.md` 其余豁免条目(battle_orchestrator 第三条注销句现状化归战斗编排归约批反哺点)零触碰。 ## 6. 关联文档同步面 | 文档 | 关联点(本批实现会改变它的哪条陈述) | 同步义务 | |---|---|---| -| design/engineering/architecture/architecture.md | 「测试与质量域」S13 测量面豁免注销句(v1.25——「设计闭合、实现批建件」批后现状化;随批申报行为改动句随之成为已实施事实) | 设计权威文档——实现批禁直改;逐条列进 `reports/iter-反哺点-<日期>.md`(豁免注销句现状化),用户裁决后归文档批落文 | +| design/engineering/architecture/architecture.md | 「测试与质量域」S13 测量面豁免注销句(v1.25——「设计闭合、实现批建件」批后现状化;句保持——注销对象是 await 豁免、不依赖行为改动申报;句内「随批申报行为改动一处(收尾置假还原)」半句已失效〔前提被迭代 41 消化、申报已剥离〕,现状化时一并修正为收尾现行陈述) | 设计权威文档——实现批禁直改;逐条列进 `reports/iter44-反哺点-2026-10-30.md`(豁免注销句现状化,该清单 #6 已登记暂停点、随本卡 v1.1 恢复),用户裁决后归文档批落文 | | game/tests/README.md | 能力表——测量面专属能力行「调参测速批量模拟(逐帧步进与统计读数)」已随本卡写卡段同批入表(真实入口=批量模拟入口,代表用例=本卡对拍套件);manifest 计数行随套件增减浮动(自助声明,零义务) | 机械面文档——实现批禁写;入表已完成于写卡段(本卡 v1.0 同批),实现期零改动 | | tools/gdstyle_baseline.txt | tune_sim await-in-loop 裸键(:15,该文件唯一在册键)随键消失成死键 | 重生成为人工专用——批末由用户执行 `python tools/gdstyle_gate.py --refresh`(键数 16→15,降幅 <10% 不需 --force);禁实现批中途刷新 | | design/gdd/(全目录) | 无关联文档——测量工具私有机制改造,不改游戏规则与玩家可见行为(tune_sim 全链路发布态不可达,设计文档 §7.3) | 无修订预期;契约句被触碰=停卡呈报走反哺点通道 | @@ -72,18 +72,18 @@ | 文件 | 新增/复用 | 职责 | 行为改动 | |---|---|---|---| -| game/presentation/tune_sim_controller.gd | 复用(改造) | 批量模拟控制器——process_frame 信号常驻连接+步进状态机;收尾单点 `_finish_batch`;全文件零循环 | 行为改动一处(V3 收尾还原)+结构改形(V1——零漂移由对拍证) | -| game/tests/unit/presentation/tune_sim_batch_parity_test.gd | 新增 | 双实现对拍配对套件——遗留 await 形态夹具(内类)+五面对拍断言 | 非行为改动(测试面) | +| game/presentation/tune_sim_controller.gd | 复用(改造) | 批量模拟控制器——process_frame 信号常驻连接+步进状态机;收尾单点 `_finish_batch`(四语句同帧同相位迁入);全文件零循环 | 非行为改动(结构改形——收尾语义零变化,零漂移由对拍证;回归锚面=对照表 V3 行) | +| game/tests/unit/presentation/tune_sim_batch_parity_test.gd | 新增 | 双实现对拍配对套件——现行 await 形态夹具(内类,收尾在 run() 尾的现行形态)+五面对拍断言 | 非行为改动(测试面) | | game/tests/run_all.gd | 复用(改造) | manifest 增一行(新套件注册,expect 0) | 非行为改动(测试基建) | -结构图与第 8 节互指:新增件一件(对拍套件),其「为什么不能复用/落点唯一」理由见第 8 节;其余两行均为既有文件改造。 +结构图与第 8 节互指:新增件一件(对拍套件),其「为什么不能复用/落点唯一」理由见第 8 节;其余两行均为既有文件改造。行为改动列全为零——每行的验收落点见对照表 V1/V2/V3 行。 ## 8. 落位与可复用性预检 - **步进状态机不引入新文件(本件内改造)——为什么不拆新件**:单一职责已在件内——`tune_sim_controller` 的职责就是批量模拟控制,步进机制(每帧一局的节律与帧相位承载)是它的私有运行机制,随批生灭(run 期活成员,批末失效下次 run 重写),没有独立于批量模拟的存在意义;拆出「步进机」件命不出独立职责语句=凑计数袋(code-conventions §1.1 判据②④禁)。复用面核查:全仓 grep 无信号步进机同职责实现可复用;其余四形态(SceneTreeTimer 链/Timer 节点/递归协程/线程)已被设计文档 §3 逐一否决(相位不同或键不消)。 -- **对拍套件落 `game/tests/unit/presentation/` 的唯一性与命名**:落点唯一——与断言宿主 wd8 同目录同协议(extends SceneTree+Kit 收尾),单元层承载;命名 `tune_sim_batch_parity_test.gd`(领域命名、无 ID 前缀);grep 同名与同义标识符实查无第二处。**遗留 await 形态副本全仓只许此一份**——产品码禁留第二实现(旧形态只活在测试夹具内);tests/ 不在 S13/S8/S9/S10 扫描面(扫描面=产品码三目录与 B1 九文件清单,实查在案),夹具内循环 await 合法在册。 +- **对拍套件落 `game/tests/unit/presentation/` 的唯一性与命名**:落点唯一——与断言宿主 wd8 同目录同协议(extends SceneTree+Kit 收尾),单元层承载;命名 `tune_sim_batch_parity_test.gd`(领域命名、无 ID 前缀);grep 同名与同义标识符实查无第二处。**遗留 await 形态副本全仓只许此一份**——产品码禁留第二实现(旧形态只活在测试夹具内);tests/ 不在 S13/S8/S9/S10 扫描面(扫描面=产品码三目录与 S8 文件集,实查在案),夹具内循环 await 合法在册。 - **复用面**:夹具的假面板/假驱动复用 wd8 的形态先例(FakePanel/FakeDriver 同形——代码在各套件内自建,不跨套件共享 helper,禁散落);收尾复用 `test_kit.gd` 的 Kit.finish(零断言专用退出码协议)。 -- **分层与交互**:控制器保持 RefCounted、零 Node 入树;process_frame 连接经 `panel.get_tree()` 取树(与现状同一出口);对拍套件 `--script` 模式零 autoload 依赖(db 用字典夹具,同 wd8 :129 先例);零新增跨层出口、零数值表读取、零随机。 +- **分层与交互**:控制器保持 RefCounted、零 Node 入树;process_frame 连接经 `panel.get_tree()` 取树(与现状同一出口);对拍套件 `--script` 模式零 autoload 依赖(db 用字典夹具,同 wd8 :142 先例);零新增跨层出口、零数值表读取、零随机。 ## 9. 实现规范预算(gdstyle 默认阈值对账:公开方法 ≤20、类变量 ≤15、单函数分支 ≤8、返回 ≤6、参数 ≤5、局部 ≤10、函数 ≤50 行) @@ -93,7 +93,7 @@ |---|---|---| | quality/await-in-loop(裸键,本案标的) | **消除** | 全文件零 for/while;await 仅 `run()` 函数级一处(`await _batch_finished`)——结构性免疫 | | quality/allocation-in-loop | 不命中 | 文件零循环;`PlaytestLogger.new()` 在 run 顶层(现状即如此) | -| max-function-length ≤50 | 达标 | run 约 22 行、`_step_frame` 约 12 行、`_run_one_level` 删两行后约 10 行 | +| max-function-length ≤50 | 达标 | run 约 22 行、`_step_frame` 约 12 行、`_finish_batch` 约 6 行、`_run_one_level` 现行 11 行零触碰 | | max-branches ≤8 | 达标 | `_step_frame` 一个 if/else;run 一个 if/else | | max-local-variables ≤10 | 达标 | run 局部 3(logger/stats/autoplay——余者转成员);`_step_frame` 局部 1 | | max-returns ≤6 | 达标 | 全 void | @@ -108,15 +108,15 @@ ## 11. 任务卡 T0..T3(估时为区间;工作量限制只属迭代层——合计 1–1.5 工作日) -**T0 现状定谳与读数重锚(0.25 工作日)** +**T0 现状复核与读数重锚(0.25 工作日)** -- [ ] 实跑 wd8 单套件(开发期最窄确认,不作验收凭据):`godot --headless --path game --script res://tests/run_all.gd -- --only=standee_fx_sweep`——记录 :132-134 三断言实况;红=潜伏红定谳成立。套件若因在册无关缺陷先红于 wd8 断言(待办清单「迭代 41 测试债修复」在册的 set_trans 一类),先核该债修复状态、不得借本批顺手修非申报面——读数以「wd8 断言可达性」为准呈报(L2 记录) -- [ ] 实跑 ui_tune_probe 单探针:`…console.exe --headless --path game res://probe/ui_tune_probe.tscn`——记录 ⑤ 守卫环与输出四串实况 -- [ ] 判读:两面按第 3 节静态推演红=前提成立开工;两面实跑全绿=潜伏红证伪=设计前提崩塌——L3 停卡呈报(第 13 节) -- [ ] 按当轮 master 重锚第 3 节全部 file:line 与成员计数;漂移处就地改卡并记录 +- [ ] 实跑 wd8 单套件(开发期最窄确认,不作验收凭据):`godot --headless --path game --script res://tests/run_all.gd -- --only=standee_fx_sweep`——记录 :145-147 三断言实况,**应绿**(绿=前提已被迭代 41 测试债批消化,按无行为改动形态开工)。套件若因在册无关债先红于 wd8 断言,先核该债修复状态、不得借本批顺手修非申报面——读数以「wd8 断言可达性」为准呈报(L2 记录) +- [ ] 实跑 ui_tune_probe 单探针:`…console.exe --headless --path game res://probe/ui_tune_probe.tscn`——记录 ⑤ 守卫环与输出四串实况,**应在** +- [ ] 判读:两面实跑全绿=重裁前提成立开工;任一面红=现状与重裁前提失配(迭代 41 修复被回退或新潜伏红)——L3 停卡呈报(第 13 节) +- [ ] 按当轮施工基面重锚第 3 节全部 file:line 与成员计数;漂移处就地改卡并记录(本卡行号基线=2026-10-30 master;同迭代卡①改址过 main_debug_flow/ui_tune_probe——两件相关行实测未漂移,仍以 T0 重锚为准) - [ ] 实查产品码 process_frame 订阅面——预期两处(本件 :50+settlement_fx_view.gd:94);出现 run 途中新增订阅者场景=L2 记录+代码评审注记(设计文档 §5 缺口 2) -产出:潜伏红定谳读数(改动前基线证据,独立验收审计要核对);重锚后行号。 +产出:现状复核读数(两面绿——前提消化链条的当轮证据,独立验收审计要核对);重锚后行号。 **T1 步进状态机改造(0.25–0.5 工作日)** @@ -124,16 +124,16 @@ - [ ] 增 `signal _batch_finished` 与 6 个 run 期活成员(名字按设计文档 §4.1 逐字:`_sim_n: int`/`_sim_i: int`/`_sim_stats: Dictionary`/`_sim_autoplay`/`_sim_logger`/`_finished: bool`) - [ ] `run(n)` 改形:setup 段(:37-46 语句逐字保持);n>0 分支——`is_connected` 守卫 connect `panel.get_tree().process_frame`(恰好连接一次,迭代 39 先例)→ `_step_frame()` 首步同步执行(与 await 形态「第 0 局在调用栈内跑完」对齐)→ `await _batch_finished`(函数级单次 await——键消除落点);n=0 分支直调 `_finish_batch()`(循环零进同步收尾,与 await 形态一致不挂起) - [ ] 新增 `_step_frame() -> void`(0 参):`_sim_i < _sim_n` 分支——`_run_one_level(_sim_autoplay, _sim_stats, _sim_i, panel, _sim_logger)`+`panel.set_sim_progress("模拟中:%d/%d …" % [_sim_i + 1, _sim_n])`(串逐字保持现码 :49)+`_sim_i += 1`;else 分支——先 disconnect(防再入)→ `_finish_batch()` → `_batch_finished.emit()` -- [ ] 新增 `_finish_batch() -> void`(0 参):`_finished = true` → `close_session()` → `panel.set_sim_running(false)` → `_running = false` → `panel.set_sim_report(HudPresenter.tune_sim_report(_sim_n, panel.atk_pct(), panel.hp_pct(), _sim_stats, _base_hp))`(四语句相对次序按此草图,对两断言面不可观测——白名单 5) -- [ ] `_run_one_level` 删尾部两行(:67-68),其余逐字保持(5 参签名不变) -- [ ] 孤立验证:`--only=standee_fx_sweep` 全绿(wd8 三断言零改动转绿=潜伏红消除实证)+ui_tune_probe 单探针绿(probe_gate --full 段承载) +- [ ] 新增 `_finish_batch() -> void`(0 参):收尾四语句由 run() 尾 :51-54 迁入(`close_session()`→报告注入→`panel.set_sim_running(false)`→`_running = false`,同帧同相位——判据③;`_finished = true` 置位为新增首句,对两断言面不可观测——白名单 5) +- [ ] `_run_one_level` **零触碰**(:58-68 逐字保持——败局节点记账非置假;本批行为零改动的锚面) +- [ ] 孤立验证:`--only=standee_fx_sweep` 全绿(wd8 三断言零改动保持绿=收尾语义零变化实证)+ui_tune_probe 单探针绿(probe_gate --full 段承载) - [ ] 自检:新增头注/注释零变更叙事、S11 禁词零命中 -取用:T0 重锚行号。产出:`_batch_finished` 信号与 `_step_frame`/`_finish_batch` 签名(T2 对拍新形态即产品码本体);wd8 转绿读数。 +取用:T0 重锚行号。产出:`_batch_finished` 信号与 `_step_frame`/`_finish_batch` 签名(T2 对拍新形态即产品码本体);wd8 保持绿读数。 **T2 双实现对拍夹具(0.25–0.5 工作日)** -- [ ] 建 `game/tests/unit/presentation/tune_sim_batch_parity_test.gd`(extends SceneTree,Kit 收尾,全类型标注):内类 FakePanel(Node——wd8 同形 setter 面,另带进度串/报告记录数组)+FakeDriver(RefCounted——固定返回值两档〔victory/defeat,同 wd8 :53-55 取值〕,零随机;逐局记录帧索引与运行态读数,帧索引经宿主注入的计数 Callable 读取)+AwaitLoopRunner(RefCounted——现 `run()` await 形态逐字副本,含自身 `is_running()` 镜像;**与产品码的申报差异仅两处**:尾部两行按还原语义置收尾、批末把 stats 六键束存夹具成员供对拍读取) +- [ ] 建 `game/tests/unit/presentation/tune_sim_batch_parity_test.gd`(extends SceneTree,Kit 收尾,全类型标注):内类 FakePanel(Node——wd8 同形 setter 面,另带进度串/报告记录数组)+FakeDriver(RefCounted——固定返回值两档〔victory/defeat,同 wd8 :53-55 取值〕,零随机;逐局记录帧索引与运行态读数,帧索引经宿主注入的计数 Callable 读取)+AwaitLoopRunner(RefCounted——现 `run()` await 形态逐字副本,含循环内 await 与收尾四语句在 run() 尾的现行形态(:47-54 语句逐字),含自身 `is_running()` 镜像;**与产品码新形态的申报差异仅一处**:批末把 stats 六键束存夹具成员供对拍读取——产品码 stats 经报告公开面观测,第 17 节直查受控例外申报) - [ ] 对拍驱动:两形态各经 `run(n)` 真实入口驱动(新形态=真 TuneSimScript 直构,旧形态=夹具直构;同参假面板/假驱动各自实例);拓扑钉死——测试宿主先连 process_frame 帧计数、后启动两形态(两形态下「计数先于步进体」相对次序同构,序列可比);n=3 常规+n=0 退化两案 - [ ] 五面对拍断言(落点 `_init`,尾缀〔测速 V1〕..〔测速 V5〕):V1 帧索引序列——两形态逐局记录序列逐位相等(每步恰一帧+相位同点的执行证据);V2 运行态序列——驱动内 `is_running()` 读数序列逐位相等+收尾双运行态假相等;V3 进度串序列——面板记录的 set_sim_progress 串序列逐位相等;V4 stats 六键逐位——夹具暴露 stats 与测试内按假驱动固定返回值重算的六键期望(wins/dmg_all/hp_left_win/hp_boss/rounds_all/death_nodes)逐键相等;V5 报告全文逐字——两形态面板记录的 set_sim_report 串逐字相等,n=3 案含「关卡完成率/关卡完成剩余 HP 均/败北节点/N=」渲染面(n=0 案只断逐字相等——空 stats 渲染无剩余 HP 行,`_mean`/`_p90` 空守卫实查在案) - [ ] `run_all.gd` manifest 增行 `{"path": "res://tests/unit/presentation/tune_sim_batch_parity_test.gd", "expect": 0}` @@ -147,27 +147,27 @@ - [ ] 关联档复跑:`--only=standee_fx_sweep,tune_sim_batch_parity`+ui_tune_probe(probe_gate --full 段)全绿 - [ ] 批末代码域闸全绿:`tools/run_all_gates.sh --code`(改动含 game/ 下非 .md 行为载体——`--code` 档) - [ ] 错误路径声明缺口写入实现报告(第 4 节 🔴 条全文迁入——禁静默) -- [ ] 产出物落位卡:`reports/iter-实现报告-<日期>.md`(各卡状态+实机目检总清单〔本批零目检项〕+遗留读数义务+实现决定记录)与 `reports/iter-反哺点清单-<日期>.md`(第 6 节同步面逐条落点)写齐,方算收口 +- [ ] 产出物落位卡:`reports/iter44-实现报告-2026-10-30.md`(各卡状态+实机目检总清单〔本批零目检项〕+遗留读数义务+实现决定记录)与 `reports/iter44-反哺点清单-2026-10-30.md`(第 6 节同步面逐条落点)写齐,方算收口 -编队注记:本卡与零豁免其余三卡无产品码触面交集(本卡触面=tune_sim_controller.gd+game/tests/ 两件);run_all.gd manifest 行与并行批可能交叠——编队归编排段(待办清单条目口径:编队待迭代 42 合回)。 +编队注记:本卡与零豁免其余三卡无产品码触面交集(本卡触面=tune_sim_controller.gd+game/tests/ 两件);run_all.gd manifest 行与并行批可能交叠——编队归编排段。本卡在 iter44 worktree 施工(卡①卡② 已收口冻结在分支),T0 重锚以 worktree 基面为准。 ## 12. 验证闸——改动—验收对照表 -域口径:本批改动全为 `game/` 下非 .md 行为载体——批末跑代码域闸;里程碑步(T 段)出口跑一次全套闸,波内修复只做出红最小单元的最窄确认,新增测试先行孤立验证再并入全套(测试执行两入口铁规不破)。三件保险(冒烟/系统测试/静态扫描)恒跑;02 单元与集成按关联档选套件——**本卡显式申报套件:standee_fx_sweep_test(wd8——套件名与涉案文件无字面关联,diff 推导可能漏选,特此申报)+tune_sim_batch_parity_test(新增)**。测试方式两分法:本批全部调试接口自动化(假驱动/假面板直构+真实按钮信号链探针),零用户目检项(tune_sim 全链路发布态不可达——登记不阻塞条款零登记项)。**静态判据申报(不入对照表,test-conventions §8.4 出口)**:S13 await-in-loop 裸键消除无独立运行期提交面——判据=`python tools/gdstyle_gate.py` 与 `game/tests/static_scan.sh` 退出码(T3 执行),属静态判据+评审注记申报观测面局限;对拍夹具不在 S13/S8/S9/S10 扫描面的声明同此口径(扫描面=产品码三目录与 B1 九文件清单,static_scan.sh 实查在案)。**声明缺口(不入对照表——证明做不出出口)**:脚本错误中断路径差异不可消除,见第 4 节 🔴 条,实现报告文档化(T3)。**能力清单**:本批新增能力一行「调参测速批量模拟(逐帧步进与统计读数)」已随本卡写卡段同批入表(写卡同批义务,grilling 复核订正原「既有名锚定+后续入表」悬置形态)——对照表三行能力列改锚该行;manifest 计数行随套件增减浮动。 +域口径:本批改动全为 `game/` 下非 .md 行为载体——批末跑代码域闸;里程碑步(T 段)出口跑一次全套闸,波内修复只做出红最小单元的最窄确认,新增测试先行孤立验证再并入全套(测试执行两入口铁规不破)。三件保险(冒烟/系统测试/静态扫描)恒跑;02 单元与集成按关联档选套件——**本卡显式申报套件:standee_fx_sweep_test(wd8——套件名与涉案文件无字面关联,diff 推导可能漏选,特此申报)+tune_sim_batch_parity_test(新增)**。测试方式两分法:本批全部调试接口自动化(假驱动/假面板直构+真实按钮信号链探针),零用户目检项(tune_sim 全链路发布态不可达——登记不阻塞条款零登记项)。**静态判据申报(不入对照表,test-conventions §8.4 出口)**:S13 await-in-loop 裸键消除无独立运行期提交面——判据=`python tools/gdstyle_gate.py` 与 `game/tests/static_scan.sh` 退出码(T3 执行),属静态判据+评审注记申报观测面局限;对拍夹具不在 S13/S8/S9/S10 扫描面的声明同此口径(扫描面=产品码三目录与 S8 文件集,static_scan.sh 实查在案)。**声明缺口(不入对照表——证明做不出出口)**:脚本错误中断路径差异不可消除,见第 4 节 🔴 条,实现报告文档化(T3)。**能力清单**:本批新增能力一行「调参测速批量模拟(逐帧步进与统计读数)」已随本卡 v1.0 写卡段同批入表(README :131)——对照表三行能力列锚该行;manifest 计数行随套件增减浮动。 | 行 | 需求点 | 改动(文件:行/行为) | 验收测试(名称+落点+尾缀) | 层级 | 真实入口 | 判据绑定面 | 能力行 | |---|---|---|---|---|---|---|---| -| V1 | 步进状态机改造(循环内 await 消除的落码面) | tune_sim_controller.gd :36-52 改形(run 函数级单次 `await _batch_finished`,全文件零循环)+:56-68 拆出 `_step_frame`/`_finish_batch` | 复用 wd8 驱动形态 `await ctrl.run(2)`(:131——run 协程身份契约,零改动);新增对拍 V4/V5(stats 六键逐位+报告逐字,落点 tune_sim_batch_parity_test.gd:_init,尾缀〔测速 V4/V5〕) | 单元 | TuneSimScript 直构(字典夹具 db+假面板+假驱动,wd8 :129 同款)经 `run(n)` 真实入口;对拍两形态同入口 | run 可等待(await 挂起=整批完成放行)+stats 六键逐位+报告全文逐字 | 新增:调参测速批量模拟(逐帧步进与统计读数) | +| V1 | 步进状态机改造(循环内 await 消除的落码面) | tune_sim_controller.gd :36-54 改形(run 函数级单次 `await _batch_finished`,全文件零循环;收尾四语句 :51-54 迁入 `_finish_batch`)+:58 起新增 `_step_frame`/`_finish_batch` | 复用 wd8 驱动形态 `await ctrl.run(2)`(:144——run 协程身份契约,零改动);新增对拍 V4/V5(stats 六键逐位+报告逐字,落点 tune_sim_batch_parity_test.gd:_init,尾缀〔测速 V4/V5〕) | 单元 | TuneSimScript 直构(字典夹具 db+假面板+假驱动,wd8 :142 同款)经 `run(n)` 真实入口;对拍两形态同入口 | run 可等待(await 挂起=整批完成放行)+stats 六键逐位+报告全文逐字 | 新增:调参测速批量模拟(逐帧步进与统计读数) | | V2 | 双实现对拍(帧相位等价的执行化证据) | tune_sim_batch_parity_test.gd 新建+run_all.gd manifest 增行 | 新增五面对拍断言〔测速 V1–V3〕:帧索引序列/运行态序列/进度串序列逐位相等(落点 tune_sim_batch_parity_test.gd:_init) | 单元 | 两形态各经 `run(n)` 真实入口(n=3 常规+n=0 退化);帧索引经测试宿主 process_frame 计数 | 两形态五面记录序列逐位相等(每步恰一帧+相位同点的当轮执行证据——判据本体) | 新增:调参测速批量模拟(逐帧步进与统计读数) | -| V3 | 行为改动——收尾置假还原(已申报唯一行为改动) | tune_sim_controller.gd :67-68 删(每局置假)→ `_finish_batch` 收尾单次置假 | 复用 wd8 三断言〔wd8〕(`drv.seen == [true, true]`/收尾 `ctrl.is_running()` 假+`panel.running` 假/报告非空——零改动)+ui_tune_probe ⑤ 守卫环与输出四串(:63-83——零改动) | 单元+探针 | wd8 假驱动回调读 `is_running()`(`await ctrl.run(2)`);探针 `press_simulate_for_probe()` → 按钮 pressed 信号链 → `run(10)` → 守卫环逐帧复查 | 驱动逐局运行态读数序列 [true, true]+收尾双运行态假+守卫环 1800 帧预算内退出+`output_text()` 四关键串(浮窗运行态贯穿整批的可观测提交面) | 新增:调参测速批量模拟(逐帧步进与统计读数) | +| V3 | 运行态语义零变化(收尾迁移的回归锚面——非行为改动行) | 收尾四语句(:51-54)迁入 `_finish_batch` 同帧同相位——非行为改动判断依据:语句集与语义零变化、对两断言面不可观测,等价证据由对拍 V2/V5 承载;`_run_one_level` :58-68 零触碰 | 复用 wd8 三断言〔wd8〕(:145-147——`drv.seen == [true, true]`/收尾双运行态假/报告非空——零改动**保持绿**)+ui_tune_probe ⑤ 守卫环与输出四串(:63-83——零改动保持绿) | 单元+探针 | wd8 假驱动回调读 `is_running()`(`await ctrl.run(2)`);探针 `press_simulate_for_probe()` → 按钮 pressed 信号链 → `run(10)` → 守卫环逐帧复查 | 驱动逐局运行态读数序列 [true, true]+收尾双运行态假+守卫环 1800 帧预算内退出+`output_text()` 四关键串(浮窗运行态贯穿整批的可观测提交面——绿=保持绿,非转绿) | 新增:调参测速批量模拟(逐帧步进与统计读数) | -反向核对:diff 中行为改动共一处(V3 行);其余为非行为改动——V1 结构改形(零漂移判据=对拍五面全等+wd8/probe 零改动转绿)、V2 测试面新增、manifest 增行(测试基建)。孤儿断言:对拍五断言挂 V1/V2 两行,无孤儿。 +反向核对:diff 中行为改动共零处;其余为非行为改动——V1 结构改形(零漂移判据=对拍五面全等+wd8/probe 零改动保持绿)、V2 测试面新增、V3 回归锚面行(非行为改动)、manifest 增行(测试基建)。孤儿断言:对拍五断言挂 V1/V2 两行,wd8/probe 既有断言挂 V3 行,无孤儿。 ## 13. 异常分级 - **L1 自救**:编译错、断言尾缀措辞、夹具记录数组名笔误——就地修复,重跑最窄单元确认。 - **L2 记录继续**:T0 套件因在册无关债先红于 wd8 断言(记录可达性事实,不借批顺手修);行号重锚漂移(就地改卡记录);产品码 process_frame 订阅面发现第三处(记录+评审注记——非 run 途中新增场景不红)。 -- **L3 停机写报告等用户**:①T0 潜伏红证伪——两面实跑全绿=「每局置假系搬运卷入」前提崩塌,停卡退回写卡段重裁行为改动申报面;②等价性对拍失败——五面任一不等=测量语义漂移,设计前提崩塌;③机检预算互斥——改造后实测键超第 9 节预算或基线外新键=上游缺陷停卡退回写卡段(含禁为机检保留无效成员条款冲突);④S13 对账 await 键未消或冒新键;⑤判据绑不上可观测提交面(证明做不出=停卡呈报,禁自造注入破坏或回退取证)。 +- **L3 停机写报告等用户**:①T0 两面任一红=现状与重裁前提失配(迭代 41 修复被回退或新潜伏红),停卡呈报;②等价性对拍失败——五面任一不等=测量语义漂移,设计前提崩塌;③机检预算互斥——改造后实测键超第 9 节预算或基线外新键=上游缺陷停卡退回写卡段(含禁为机检保留无效成员条款冲突);④S13 对账 await 键未消或冒新键;⑤判据绑不上可观测提交面(证明做不出=停卡呈报,禁自造注入破坏或回退取证)。 ## 14. 代拍板白名单(逐条列,超清单记实现报告「实现决定记录」) @@ -175,20 +175,20 @@ 2. 头注 `_batch_finished` 契约行措辞(信号语义与发射时点不变)。 3. `_finished` 成员零读者确认后删去(成员 11→10——键账只降不升,行为与断言面零变化)。 4. 夹具假面板/假驱动成员命名微调(记录语义不变;与 wd8 同形自建、不跨套件共享)。 -5. `_finish_batch` 收尾段四语句相对次序按第 11 节 T1 草图次序落码(对两个断言面不可观测——实现期查 git 历史原序可进一步对齐)。 +5. 收尾段语句相对次序——现行 run() 尾次序(close→报告→置假→_running)与设计草图次序(close→置假→_running→报告)对两个断言面均不可观测,两种皆可落码(实现期查 git 历史原序可进一步对齐);`_finished = true` 置位为新增首句(成员写,不可观测)。 6. 排版机械改写(空行、preload 顺序、注释换行)。 ## 15. 待裁点 -零待裁点,开工门=U0。(裁决记录:2026-10-29 用户裁四点——①信号步进状态机形态采纳〔SceneTreeTimer 链/Timer 节点/递归协程/线程四形态淘汰依据见设计文档 §3〕;②收尾置假还原作为已申报行为改动随批实施;③双实现对拍入批;④脚本错误中断路径差异接受并文档化。) +零待裁点,开工门=U0。(裁决记录:2026-10-29 用户裁四点——①信号步进状态机形态采纳〔SceneTreeTimer 链/Timer 节点/递归协程/线程四形态淘汰依据见设计文档 §3〕;②收尾置假还原作为已申报行为改动随批实施【已作废——前提被迭代 41 测试债批 215da315 消化,v1.1 剥离】;③双实现对拍入批;④脚本错误中断路径差异接受并文档化。2026-10-30 停卡重裁(用户裁,按停卡呈报建议案逐条落卡):剥离行为改动申报 V3、T0 义务改现状复核、夹具申报差异两处减一处;重裁沿用 2026-10-29 grilling 复核门结论(reports/复核-grilling-零豁免五卡-2026-10-29.md,修正全落),重裁差异面未新增设计裁决。) ## 16. 测试削弱申报 -无申报项——wd8 三断言与 ui_tune_probe ⑤ 零改动零削弱;对拍五断言为新增非改判;夹具与产品码的两处申报差异(收尾还原语义+stats 暴露成员)系新增件自身设计、设计文档 §5 在案,非既有断言削弱。禁删断言、禁放宽阈值、禁缩小扫描面、禁把真实入口换成下层直调;未申报的削弱由独立验收审计判红。 +无申报项——wd8 三断言与 ui_tune_probe ⑤ 零改动零削弱(保持绿);对拍五断言为新增非改判;夹具与产品码新形态的申报差异仅一处(夹具暴露 stats 供对拍读取)系新增件自身设计、设计文档 §5 在案,非既有断言削弱。禁删断言、禁放宽阈值、禁缩小扫描面、禁把真实入口换成下层直调;未申报的削弱由独立验收审计判红。 ## 17. 独立验收审计 -合并前由未参与实现的会话或子代理执行;报告落 `reports/iter-验收审计-<日期>.md`,未过不得合并。审计至少做五件事:①逐行核对第 12 节对照表(测试存在、真的执行、尾缀可 grep、真实入口未绕过改动点);②抽查判据绑定面——帧索引序列是否真从 process_frame 发射点记录、对拍拓扑两形态是否同构可比、V3 行判据是否钉在运行态提交面而非终态兜底;③核对 T0 定谳证据在案(改动前 wd8/probe 红读数——潜伏红链条完整,缺 T0 读数=审计不过);④核对行为改动唯一性——diff 中除 V3 外无第二处行为改动;⑤检查测试削弱(对照第 16 节零申报)与内部字段直查受控例外(本批零直查——新形态 stats 经报告公开面观测)。 +合并前由未参与实现的会话或子代理执行;报告落 `reports/iter44-验收审计-2026-10-30.md`,未过不得合并。审计至少做五件事:①逐行核对第 12 节对照表(测试存在、真的执行、尾缀可 grep、真实入口未绕过改动点);②抽查判据绑定面——帧索引序列是否真从 process_frame 发射点记录、对拍拓扑两形态是否同构可比、V3 行判据是否钉在运行态提交面(保持绿证据,非终态兜底);③核对现状复核证据在案(T0 两面实跑绿读数+停卡呈报三重证据引注〔215da315 提交信息〕——前提消化链条完整,缺 T0 复核读数=审计不过);④核对行为改动零处——diff 中任何行为改动(含收尾四语句语义漂移)=审计不过,收尾迁移的等价性由对拍 V2 运行态序列+V5 报告逐字承载;⑤检查测试削弱(对照第 16 节零申报)与内部字段直查受控例外(本批零直查——新形态 stats 经报告公开面观测)。 ## 18. MC/数值与 RNG 零触碰声明 diff --git a/待办清单.md b/待办清单.md index 19268654..1457a836 100644 --- a/待办清单.md +++ b/待办清单.md @@ -110,12 +110,12 @@ #### 零豁免五键清偿批——S13 余量五键真修四卡(2026-10-29 登记,来源=会话提及) -**实况**:用户 2026-10-29 裁「不允许任何豁免」——S13 三条豁免注销(architecture.md v1.25 落文),五键真实修复至阈值内:main.gd 类变量 49→15(组合根注册面:ui_registry 一门面+三域容器,约 867 处探针/系统测试引用改址 `main.ui.<域>.<句柄>`,7 别名/转发成员消灭)/battle_orchestrator 类变量 38→15(RoundCycle+BattleFacts 两件,叠加迭代 42 轴丙 BoardInstaller;encounter 归 BattleFacts、attune 改判状态两成员随件)/board_cell_unit 类变量 30→10+standee_body 类变量 19→10(各拆两独立文件,gdstyle inner-class 展平计数口径)/tune_sim 循环内 await 消除(process_frame 信号步进状态机;含**申报行为改动**一处:运行态收尾由每局置假还原为整批收尾单次置假——消除与 wd8/ui_tune_probe 断言面的静态矛盾,T0 实证定谳)。设计闭合凭据=architecture.md v1.25+五份设计文档(reports/ 下五件 设计-组合根注册面-2026-10-29.md/设计-战斗编排类变量归约-2026-10-29.md/设计-单格绘制状态件-2026-10-29.md/设计-站桩状态件-2026-10-29.md/设计-测速循环去await-2026-10-29.md)。四卡已成文(均零待裁点开工门 U0): +**实况**:用户 2026-10-29 裁「不允许任何豁免」——S13 三条豁免注销(architecture.md v1.25 落文),五键真实修复至阈值内:main.gd 类变量 49→15(组合根注册面:ui_registry 一门面+三域容器,约 867 处探针/系统测试引用改址 `main.ui.<域>.<句柄>`,7 别名/转发成员消灭)/battle_orchestrator 类变量 38→15(RoundCycle+BattleFacts 两件,叠加迭代 42 轴丙 BoardInstaller;encounter 归 BattleFacts、attune 改判状态两成员随件)/board_cell_unit 类变量 30→10+standee_body 类变量 19→10(各拆两独立文件,gdstyle inner-class 展平计数口径)/tune_sim 循环内 await 消除(process_frame 信号步进状态机;**零行为改动**——v1.0 申报的收尾置假还原已被迭代 41 测试债批 215da315 先行完成并申报,2026-10-30 实现段按卡片预设停机点停卡、三重证据定谳前提已消化,按停卡呈报建议案重裁剥离行为改动申报:iter44 worktree 分支 reports/iter44-实现报告-2026-10-30.md §5)。设计闭合凭据=architecture.md v1.25+五份设计文档(reports/ 下五件 设计-组合根注册面-2026-10-29.md/设计-战斗编排类变量归约-2026-10-29.md/设计-单格绘制状态件-2026-10-29.md/设计-站桩状态件-2026-10-29.md/设计-测速循环去await-2026-10-29.md)。四卡已成文(均零待裁点开工门 U0;测速循环批卡 2026-10-30 停卡重裁 v1.1——前提消化后剥离行为改动申报、T0 改现状复核、夹具申报差异两处减一处,仍零待裁点): 关联文档清单: - 组合根注册面批 reports/需求卡片-组合根注册面批-2026-10-29.md - 呈现层状态件批 reports/需求卡片-呈现层状态件批-2026-10-29.md(单格+站桩两设计并一卡) -- 测速循环批 reports/需求卡片-测速循环批-2026-10-29.md +- 测速循环批 reports/需求卡片-测速循环批-2026-10-29.md(v1.1,2026-10-30 停卡重裁) - 战斗编排归约批 reports/需求卡片-战斗编排归约批-2026-10-29.md(接收方=在册条目「战斗域结构深拆批」宿主瘦身子项,不在本条目记账) 编队待迭代 42 合回(battle_orchestrator/board_view 触面碰撞约束),具体迭代归属归编排段;编入前置=各卡过 grilling 复核门。gdstyle inner-class 计数截断缺陷已在册(architecture v1.25)——基线登记值欠估,各批按真实口径施工;各批全部合回后一次人工 --refresh --force 收账(一并清迭代 42 归绿 6 键离账——批末实测已归绿而基线仍记 16 键:board_view 四键+level_runner `_enter_node`+battle_orchestrator 文件长;各留债键按重锚时实测重登记,冻结禁恶化口径不变)。2026-10-29 编排(用户裁编法):卡 A 组合根注册面批+卡 B 战斗编排归约批+卡 D 测速循环批编入**迭代 44**(≈7.875 个工作日,中值合计);卡 C 呈现层状态件批编入**迭代 45**(与补件批同批,卡 C 先于其 board_hover 半边施工)。grilling 复核门已过(reports/复核-grilling-零豁免五卡-2026-10-29.md,五卡有条件成立、修正全落,提交 9855bf0a)。 From 0caa2f5b7c1ae9398d5002de75ae69f0f8fce1a3 Mon Sep 17 00:00:00 2001 From: DKChan <524912269@qq.com> Date: Fri, 30 Oct 2026 05:54:45 +0800 Subject: [PATCH 09/11] =?UTF-8?q?=E5=88=B7=E6=96=B0(=E5=BE=85=E5=8A=9E):?= =?UTF-8?q?=20=E6=8A=80=E6=9C=AF=E5=80=BA=E8=A7=82=E5=AF=9F=E6=9D=A1?= =?UTF-8?q?=E7=9B=AE=E9=95=BF=E5=87=BD=E6=95=B0=E5=8D=8A=E8=BE=B9=E6=A0=B8?= =?UTF-8?q?=E9=94=80=E2=80=94=E2=80=94=E7=82=B9=E5=90=8D=E5=9B=9B=E4=BB=B6?= =?UTF-8?q?(level=5Fmap=5Fscreen=E9=80=89=E8=B7=AF=E8=A3=85=E9=85=8D?= =?UTF-8?q?=E5=8E=9F155=E8=A1=8C/camp=5Foverlay=5Fview=E5=8E=9F152?= =?UTF-8?q?=E8=A1=8C/debug=5Foverlay=E5=8E=9F114=E8=A1=8C/treasure=5Fitem?= =?UTF-8?q?=5Ftable=20schema=E6=A0=A1=E9=AA=8C=E7=BE=A4)=E5=AE=9E=E6=B5=8B?= =?UTF-8?q?=E7=8E=B0=E5=90=84=E6=96=87=E4=BB=B6=E6=9C=80=E9=95=BF=E5=87=BD?= =?UTF-8?q?=E6=95=B0=E4=BB=8525-44=E8=A1=8C=E5=85=A8=E9=83=A8=E6=B6=88?= =?UTF-8?q?=E8=A7=A3,S13=E8=B4=A8=E9=87=8F=E9=97=B8=E6=89=AB=E9=9D=A2?= =?UTF-8?q?=E8=A6=86=E7=9B=96core+data+presentation=E5=9F=BA=E7=BA=BF?= =?UTF-8?q?=E5=86=BB=E7=BB=93=E7=A6=81=E6=81=B6=E5=8C=96=E5=B7=B2=E6=8E=A5?= =?UTF-8?q?=E7=AE=A1=E9=98=B2=E5=9B=9E=E5=BD=92;=E6=9D=A1=E7=9B=AE?= =?UTF-8?q?=E7=BC=A9=E4=B8=BAlambda=E8=BF=9E=E6=8E=A5=E8=A7=82=E5=AF=9F(76?= =?UTF-8?q?=E5=A4=84=E8=AF=BB=E6=95=B0=E5=BD=92=E5=B1=9E2026-10-15,?= =?UTF-8?q?=E6=B5=8B=E8=AF=95=E9=9D=A2=E5=85=B6=E5=90=8E=E5=A4=9A=E8=BD=AE?= =?UTF-8?q?=E9=87=8D=E7=BB=84=E5=88=86=E5=B8=83=E5=8F=A3=E5=BE=84=E6=9C=AA?= =?UTF-8?q?=E9=87=8D=E6=B5=8B)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 待办清单.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/待办清单.md b/待办清单.md index 1457a836..c82a6cf4 100644 --- a/待办清单.md +++ b/待办清单.md @@ -465,9 +465,9 @@ **状态**:待美术设计 -#### 技术债观察登记——长函数余量与 lambda 连接防回归(2026-10-15 登记,来源=批次移交) +#### 技术债观察登记——lambda 连接防回归(2026-10-15 登记,来源=批次移交) -**实况**:证据=迭代 27 需求卡片两项「登记待办清单观察」义务批内漏登、卡片核对时补登——①**长函数 17 个**中非结算段的装配/校验函数(`level_map_screen.gd` 选路装配 155 行/`camp_overlay_view.gd` 152 行/`debug_overlay.gd` 114 行/`treasure_item_table.gd` schema 校验群等;`main._build_ui` 已随场景拆分自然解体、`_settle`/`_resolve_hero_attack` 已随波二拆段=17 中 3 件已消解,余 14 件);②**lambda 连接 76 处**(presentation 6/smoke 62/tests 8——实读无泄漏,登记防回归)。长函数拆分无独立需求驱动不动;lambda 连接数若有审计工具化需求归类型闸后续。 +**实况**:证据=迭代 27 需求卡片「登记待办清单观察」义务批内漏登、卡片核对时补登。原两条观察,长函数半边已核销(2026-10-30 核:点名四件——`level_map_screen.gd` 选路装配原 155 行/`camp_overlay_view.gd` 原 152 行/`debug_overlay.gd` 原 114 行/`treasure_item_table.gd` schema 校验群——现各文件最长函数仅 25–44 行,全部消解;S13 质量闸扫描面覆盖 core+data+presentation 全部 .gd、基线冻结禁恶化,防回归义务已由机器闸接管)。余 **lambda 连接 76 处**(2026-10-15 读数:presentation 6/smoke 62/tests 8——实读无泄漏,登记防回归;其后测试面多轮重组,原分布口径未重测)。lambda 连接数若有审计工具化需求归类型闸后续。 **改动面**:游戏代码 From fbed817fbec7c42d7d7207170564170e3dcf0633 Mon Sep 17 00:00:00 2001 From: DKChan <524912269@qq.com> Date: Fri, 30 Oct 2026 06:00:04 +0800 Subject: [PATCH 10/11] =?UTF-8?q?=E6=B3=A8=E9=94=80(=E5=BE=85=E5=8A=9E):?= =?UTF-8?q?=20qa/=E6=94=B6=E5=B0=BE=E5=AD=A4=E5=84=BF=E9=81=97=E7=95=99?= =?UTF-8?q?=E4=BD=99=E4=BA=8C=E9=A1=B9=E6=95=B4=E6=9D=A1=E5=88=A0=E9=99=A4?= =?UTF-8?q?=E2=80=94=E2=80=94=E7=AC=AC5=E9=A1=B9=E5=AD=97=E9=9D=A2?= =?UTF-8?q?=E9=87=8F=E5=A2=A8=E6=94=B6=E6=B5=8B=E5=89=8D=E7=BD=AE=E7=99=BB?= =?UTF-8?q?=E8=AE=B0=E4=B8=A4=E5=A4=B4=E5=A4=B1=E6=95=88:=E4=B8=BB?= =?UTF-8?q?=E4=BB=BB=E5=8A=A1(iter19=E5=8D=A1=E2=91=A1=E5=A2=A8=E8=89=B2?= =?UTF-8?q?=E6=94=B6=E6=B5=8B)=E9=9A=8F=E5=8D=A1=E9=80=80=E5=BD=B9?= =?UTF-8?q?=E6=97=A0=E7=8E=B0=E5=BD=B9=E6=89=BF=E6=8E=A5,=E5=89=8D?= =?UTF-8?q?=E7=BD=AE=E7=AB=8B=E5=B8=B8=E9=87=8F=E4=B8=8D=E6=88=90=E7=AB=8B?= =?UTF-8?q?(=E5=AE=9E=E6=B5=8Bbcard=E5=9B=9B=E5=A4=84=E8=89=B2=E5=80=BC?= =?UTF-8?q?=E4=BB=85=E9=80=89=E4=B8=AD=E5=BA=95#8A5A34=E5=9C=A8art-bible?= =?UTF-8?q?=E8=89=B2=E6=9D=BF=E5=9C=A8=E5=86=8C[=E6=9C=A8=E8=89=B2=C2=A77.?= =?UTF-8?q?2],=E2=9C=93=E7=AB=A0#3A2A08/=E6=8F=8F=E8=BF=B0#4A3A28/?= =?UTF-8?q?=E8=84=9A=E6=B3=A8#6E4534=E4=B8=89=E5=A4=84=E6=B8=B8=E7=A6=BB?= =?UTF-8?q?=E8=89=B2=E6=9D=BF=E5=A4=96,=E7=9C=9F=E8=A6=81=E5=8A=A8?= =?UTF-8?q?=E7=AC=AC=E4=B8=80=E6=AD=A5=E6=98=AF=E7=BE=8E=E6=9C=AF=E7=BA=BF?= =?UTF-8?q?=E8=89=B2=E6=9D=BF=E5=87=86=E5=85=A5/=E6=8D=A2=E8=89=B2?= =?UTF-8?q?=E5=90=88=E5=B9=B6=E9=9D=9Eui=5Fkit=E5=B8=B8=E9=87=8F=E5=8C=96)?= =?UTF-8?q?;=E7=AC=AC7=E9=A1=B9=E5=95=86=E5=BA=97=E6=88=BF=E6=88=AA?= =?UTF-8?q?=E5=9B=BE=E7=BA=B3=E5=B1=8F=E8=AF=89=E6=B1=82=E5=89=A9=E4=BD=99?= =?UTF-8?q?=E9=9D=A2=E5=8F=AA=E5=89=A9=E5=83=8F=E7=B4=A0=E7=BA=A7(?= =?UTF-8?q?=E7=BB=93=E6=9E=84=E9=9D=A2ui=5Fstruct=5Fprobe=20=5Faudit(shop)?= =?UTF-8?q?=E4=B8=8E=E4=BA=A4=E4=BA=92=E9=9D=A2ui=5Fclick=5Fprobe=E5=B7=B2?= =?UTF-8?q?=E8=A6=86=E7=9B=96),=E5=83=8F=E7=B4=A0=E9=9D=A2shot=5Fprobe?= =?UTF-8?q?=E5=A4=B4=E6=B3=A8=E5=B7=B2=E5=AE=9A=E8=B0=B3=E4=B8=8D=E7=BA=B3?= =?UTF-8?q?=E5=B1=8F(=E7=9C=9F=E5=AE=9E=E8=B7=AF=E5=BE=84=E4=B8=8D?= =?UTF-8?q?=E5=8F=AF=E8=BE=BE+=E5=90=88=E6=88=90=E6=8A=95=E5=96=82?= =?UTF-8?q?=E8=BF=9D=E5=8F=8D=E8=AF=A5=E6=8E=A2=E9=92=88=E5=8F=A3=E5=BE=84?= =?UTF-8?q?),=E7=9C=9F=E7=BC=BA=E5=8F=A3(=E5=95=86=E5=BA=97=E5=B1=8F?= =?UTF-8?q?=E6=96=87=E5=AD=97=E5=AF=B9=E6=AF=94=E5=BA=A6=E6=97=A0=E6=9C=BA?= =?UTF-8?q?=E6=A3=80)=E6=8C=89=E6=9C=AA=E5=AE=9E=E6=B5=8B=E4=B8=8D?= =?UTF-8?q?=E5=90=AF=E7=94=A8=E4=B8=8D=E7=AB=8B=E6=96=B0=E6=9D=A1,?= =?UTF-8?q?=E8=AF=95=E7=8E=A9=E5=87=BA=E8=A7=82=E6=84=9F=E9=97=AE=E9=A2=98?= =?UTF-8?q?=E5=86=8D=E6=8C=89=E5=BD=93=E6=97=B6=E5=BD=A2=E6=80=81=E7=99=BB?= =?UTF-8?q?=E8=AE=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 待办清单.md | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/待办清单.md b/待办清单.md index c82a6cf4..e644de88 100644 --- a/待办清单.md +++ b/待办清单.md @@ -444,17 +444,6 @@ ### 文档与结构 -#### qa/ 实现报告收尾·孤儿遗留七项余二项(2026-10-14 登记,来源=批次移交) - -**实况**:qa 收尾批核查 iter19 系列出口报告遗留移交项时发现**不在待办清单在册**的七项(acceptance-package §三.2/card0 §5.3/followup §七.3/uibackfill §6.2-4/verify §6.1/3/7)。已结案的(tree_rules 受理闭环、X/Y 双源、S1 七项违例修复、提灯目检项、tests.yml 休眠等)已在各报告标注结案证据,不入本条。2026-10-24 处置:第②③④项随迭代 36 卡C 落地销号(营地 STONE 深档六处、迷雾三关派生行、开场后缀条件加算区),第⑥项按用户 2026-10-24 裁整条注销(TG_* 装饰带非文字,不另立探针)。余二项均为挂号备查/顺路件,无排期承诺(第①项 design/diagrams 越界 2026-10-28 实查核销——目录磁盘与 git 均已不存在,越界实体消失,白名单甲/乙两案失去对象): - -5. **字面量墨收测前置**(iter19 卡②遗留):bcard 属性描述/类型脚注/✓章/primary_button 字四处内联 Color8 无常量形态,收测需先在 ui_kit 立常量(呈现批顺路件,改 ui_kit 越当批面)。落点=呈现优化批(ui_kit 常量面) -7. **商店房截图纳屏**(iter19 卡①遗留):商店房截图纳屏留后续呈现批(考证结论在 shot_probe 头注)。本项原并列的「`数据配置.md:223` 历史行死指」半句已于 2026-10-21 实查核销——禁写变更记录规约生效后该文件的版本史行整段已不存在(现全文 212 行,文内零版本史行),被指对象随之消亡。落点=呈现批 - -**改动面**:游戏代码+工具代码 - -**状态**:待写卡(备选) - #### 主角棋盘小人像素管线重产——原「美术资产链路审计两项 P0」之 P0②(2026-10-09 登记,来源=审计发现) **实况**:主角棋盘小人未走像素管线(插值糊图),重产事项未在任何登记处在册;审计报告 HTML 件从未进版本库、现已删除,现状以本条正文为准。2026-10-13 用户令随「UI 美化三层诊断」登记:本条属第三层「观感提升」,Alpha 阶段需完成。原 P0①(文档面:两处引用已丢失的冻结样张路径)2026-10-28 按用户裁乙销号——art-bible §1.4 冻结记录与 art-status-checklist P0 样张行删路径、留「产物原件已丢失」,机检报告凭据(git 提交 7a847c7)保留。 From ab3b4a9d802d5cc9232d9bac4490734f6025f071 Mon Sep 17 00:00:00 2001 From: DKChan <524912269@qq.com> Date: Fri, 30 Oct 2026 06:10:21 +0800 Subject: [PATCH 11/11] =?UTF-8?q?=E5=90=8C=E6=AD=A5(=E5=B7=A5=E7=A8=8B?= =?UTF-8?q?=E6=89=B9=E6=94=B6=E5=B0=BE):=20test-conventions=20=C2=A77?= =?UTF-8?q?=E8=A6=86=E7=9B=96=E7=8E=87=E5=8F=A5=E4=B8=A4=E5=A4=84=E6=97=A7?= =?UTF-8?q?=E5=8F=A3=E5=BE=84=E9=9A=8Fa2ec3e8b=E8=A3=81=E5=86=B3=E6=8D=A2?= =?UTF-8?q?=E4=BB=A3=E2=80=94=E2=80=94=E3=80=8C=E6=98=AF=E5=90=A6=E5=BC=95?= =?UTF-8?q?=E5=85=A5=E5=BE=85=E5=8A=9E=E6=B8=85=E5=8D=95=E5=9C=A8=E5=86=8C?= =?UTF-8?q?=E5=BE=85=E8=A3=81=E3=80=8D=E6=94=B9=E7=9B=B4=E9=99=88=E4=B8=8D?= =?UTF-8?q?=E5=BC=95=E5=85=A5(=E6=9D=A1=E7=9B=AE=E5=B7=B2=E5=88=A0?= =?UTF-8?q?=E8=A3=81=E5=86=B3=E5=B7=B2=E8=90=BD),=E3=80=8C=E7=8E=B0?= =?UTF-8?q?=E8=A1=8C=E8=A1=A5=E6=B4=9E=3D=E9=9B=B6=E6=8C=87=E5=90=8D?= =?UTF-8?q?=E5=8D=95=E6=B5=8B=E6=B8=85=E5=8D=95=E3=80=8D=E6=94=B9=E8=83=BD?= =?UTF-8?q?=E5=8A=9B=E6=B8=85=E5=8D=95=E8=A6=86=E7=9B=96=E5=9F=9F=E8=A1=A8?= =?UTF-8?q?(=E9=9B=B6=E6=8C=87=E5=90=8D=E6=9C=BA=E5=88=B6=E5=B7=B2?= =?UTF-8?q?=E8=A2=AB=E8=83=BD=E5=8A=9B=E6=B8=85=E5=8D=95=E6=A8=A1=E5=9E=8B?= =?UTF-8?q?=E5=8F=96=E4=BB=A3);=E8=A7=84=E7=BA=A6=E4=BF=AE=E8=AE=A2?= =?UTF-8?q?=E7=BB=8Fdoc-design=E5=85=A5=E5=8F=A3=E8=90=BD=E7=AC=94,?= =?UTF-8?q?=E9=9B=B6=E5=BE=85=E8=A3=81=E7=82=B9,=E7=94=A8=E6=88=B7?= =?UTF-8?q?=E5=B7=B2=E5=8F=91=E4=BB=A4;=E6=96=AD=E9=93=BE=E9=9D=A2?= =?UTF-8?q?=E5=B7=B2=E6=A0=B8=E4=BB=85=E6=AD=A4=E4=B8=80=E5=A4=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- design/engineering/test-conventions.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/design/engineering/test-conventions.md b/design/engineering/test-conventions.md index c89d61a8..f82fde02 100644 --- a/design/engineering/test-conventions.md +++ b/design/engineering/test-conventions.md @@ -67,7 +67,7 @@ - 「跑一遍没崩=通过」无效:测试绿只证明**当前代码没犯这个错**,不证明**犯了这个错会被抓住**;断言存在不等于断言执行。 - **脚本错误会静默中断所在函数的剩余断言,而套件仍报全绿**(机制事实):GDScript 无脚本错误陷阱 API,错误不改进程退出码、不计失败数。三处实证:①2026-09-19「309 项 0 失败」实为断言未跑全(状态记录 83);②敌人表行集纪律 10 条断言因定型数组赋值错误从未执行(迭代 29 修复后两条正向见红=夹具本缺锚行);③`Callable` 形参类型写错致解析函数返回 null、后续断言整段蒸发。 - 由此产生两条义务:**写闸件**按 §6 配三硬闸;**写验收函数**必须自证断言全数执行——真实入口断言在当轮执行并通过(§8.4)为主证,零命中自检(扫描面为空即判红)为辅证。 -- **覆盖率不是目标**:行覆盖率度量缺失(Godot 无内建,第三方属新基建,是否引入待办清单在册待裁);现行补洞=零指名单测清单+人工判定,判定可靠性靠上列自证手段,不靠覆盖率数字。 +- **覆盖率不是目标**:不引入行覆盖率度量(Godot 无内建,第三方属新基建);现行补洞=能力清单覆盖域表+人工判定,判定可靠性靠上列自证手段,不靠覆盖率数字。 ## 8. 改动级验收闭合(2026-10-21 立)