文档(架构审查P1余项·裁决落文): 第四节四条定案进规约与审计报告标注——①code-conventions §4 新增第13条按来源分档(S系扫描面一律止于产品码三目录;tests/probe/sim 各由运行期通道承接:闸00/01/02、闸03/04/05〔含同目录 type_glow_shot_probe 人工取证件与 probe_ui_util 共用面两件不入闸〕、不入CI的手动调参批量;三目录允许自建 RandomNumberGenerator 条件=必须显式定种,禁的是不定种形态;该禁止无机器闸、由文字纪律+独立验收审计人工评审承载;并废止「测量面」一词对本文件统称用途,保留 run_all_gates 选闸原义)②architecture S 表补齐登记面(标题 S1–S8→S1–S13、S11/S12/S13 三行入表、S1/S2 加适用域注、S3 加维持warning裁定、S9/S10 缺空面自检查登记为已知偏差)、版本1.31→1.32 ③test-conventions §8.3 新增「新增core件的覆盖登记义务」(点名或申报经宿主链覆盖,明示非覆盖率要求;立每core件点名闸与补11件空套件两案裁否,凭 test-conventions §7「覆盖率不是目标」)+process-conventions §3 第6条加承接指向 ④审计报告四处标注:4.1不扩面裁定与读数订正(8处→7处,experiment_density 随迭代50 T9 退役;randomize() 两处命中均在注释、实际调用零命中)、4.2三面不扩(三层存量实跑≈2162处:S9 1070/S10 117/S13 975,其中禁调试打印274与循环内await70属工具码功能需要;产品码面归零不可换存量红)+S8现14文件非9+纯目录域方案证伪(四件结算码在core根下)+待执行清单三项归工程改动批零卡片、4.3结案(三处豁免2026-10-31迭代44已清偿,基线现5键)、4.4定性改判为「无按文件登记惯例」+读数4件→11件(后一档三件全是迭代44/46/49拆件产物=复发模式)。待办清单与roadmap按用户裁不动(整份审计未闭合),报告顶部加禁退役注记防收尾误删

This commit is contained in:
DKChan committed 2026-11-03 19:52:03 +08:00
1 parent 942b23cda8
commit abfd70549b
5 files changed
+39 -9

No files matched your search

@@ -3,6 +3,7 @@
> **性质**:设计讨论段过程稿(审计读数)。`game/` 全目录只读架构审查的发现清单与证据,作为写卡段、工程改动批与文档设计批的输入材料;结论被吸收进权威文档与修复批后按「吸收即死」退役。
> **范围**:core 44 件、presentation 71 件、data 24 schema + 19 表、sim 15 件、probe 19 件、tests 69 件、`tools/` 闸件。判据双轨=项目自有规范(`design/engineering/architecture/architecture.md` v1.24 + 五份工程规约)+ Godot 4.7 最佳实践。
> **方式**:分层依赖方向/数据管线/测试覆盖三路并行静态取证+机械 grep 复核。**零测试执行、零引擎运行、零闸执行**(测试两入口铁规),全部结论来自静态读盘;下文每条命中均给 文件:行号,抽查原文已核。
> **处置状态(2026-11-03 更新)**:§三 P0(3.1/3.2)已随迭代 50 三卡合回(合并提交 8d3a12ec);§四 P1 四条已裁,逐条裁决与读数订正见各节标注;§五 P2 四项**未处置**、§六待裁点⑦未落文——**本报告禁退役**(「吸收即死」判据未满足:结论未全吸收进权威文档)。
---
@@ -108,6 +109,10 @@ core 内干净,绕过点全在 core 之外:
全部绕过点均显式定种、无 `randomize()`(全库零命中),确定性尚存;问题在于**没有任何闸防它扩散**——S1/S2 扫描面只有 `DIR_CORE` + `DIR_PRES`(`static_scan.sh:20-21, 88-91`)。
**2026-11-03 裁(不扩扫描面,改为写说明)**:
- **裁决**:S1/S2 扫描面**保持产品码两目录**,不扩 sim/probe/tests。这三目录自建且显式定种的随机源是**合法测量口径**(改前改后读数要用同种子对拍,属全项目测量前提),把它们判进「玩法代码禁自建 RNG」的闸面,等于给每处合法用法挂 `rng-seed-exempt` 注记、只拦得住新增——不值其成本。落文=`design/engineering/code-conventions.md` §4 新增第 13 条(按来源分档:三目录各由哪条运行期通道承接、允许自建的条件是不定种禁止、以及该禁止目前无机器闸只由文字纪律+批末独立验收审计人工评审承载),架构文档 S 表 S1 行加同口径注。
- **读数订正(2026-11-03 复核)**:①自建点由本节记的「8 处」降到**7 处**——`game/sim/experiment_density.gd` 已随迭代 50 卡片 T9 删除(sim 现 3 处:calibrate_boards/damage_probe/level_autoplay;probe 1 处 ui_click_probe;tests 3 处 board_gen_reward/player_copy_sweep/theme_projection)。②「无 `randomize()`」要加限定:`randomize()` 在 `game/` 字面命中 2 处,两处均在注释里(`core/rng_service.gd:3`、`presentation/main.gd:756`),**实际调用零命中**,结论不变。③按 S1 原判据(裸 `randi()`/`randf()`/`randf_range()`)扫这三目录,非注释命中 **0 处**。
### 4.2 静态闸扫描面结构性缺口
`game/tests/static_scan.sh` 的 S1–S13 扫描面实况:
@@ -127,6 +132,15 @@ core 内干净,绕过点全在 core 之外:
净效果:**sim / probe / tests 三层除 S11/S12 外,零类型闸、零质量闸、零 RNG 闸、零 await 闸。**
**2026-11-03 裁(三面不扩;两处机制修与两处本轮新查)**:
- **S9/S10/S13 不扩到三层**(裁决)。2026-11-03 只读数实跑(三个静态扫描脚本对三层,未修文件、未写基线)给出现存总量 **≈2162 处**:S9 类型 1070(sim 158/probe 130/tests 782,其中无类型容器 859)、S10 文件头 117、S13 质量 975(其中「禁调试打印」274+「循环内 await」70——这两类在测试与探针码里是功能需要,不是债)。产品码面 S9/S10 现行**归零**,扩面即把「归零」这一执法前提换成 1187 项存量红;为三层另建欠账基线会把账从 1 份变 3 份。落文=code-conventions §4 第 13 条写明适用域止于产品码并给出三目录的运行期承接通道。
- **读数是**:S8 现行 **14 文件**显式清单(`static_scan.sh:317`),非本节所记 9 文件;同口径 14 文件清单在 S7 另抄一份(`:361`),两份靠人工同步;绿文案仍报「B1 文件集 10 个 .gd」(`:337`)与头注 `:311` 的「共 14 文件」自相矛盾;S8 自检只防「清单内文件缺位」(`:319-324`)不防「该进的没进」——纯目录域方案已证伪:装板/授予/效果端口/掷格四件结算码在 `game/core` 根下而非 `settlement/` 目录内。
- **本轮新查两处**(审计未列):①S9/S10 **无扫描面空转自检**(`tools/audit_type_hints.py:82-83`、`tools/audit_file_headers.py:64-65` 目录不存在即静默 PASS),违背本文「三层承载与判定原则」的零命中自检要求与脚本前言自立的防空转纪律(`static_scan.sh:18-19`);②S3 是半闸(命中只打 WARNING、不置 fail,`static_scan.sh:110`)——**但这条不是洞**:架构文档 S 表 S3 行早已登记「warning 级——class_name 直引误报需人工复核」,属已在册状态。2026-11-03 裁**维持 warning 不升硬**(升硬前提是先有可靠的直引误报排除判据,该判据未立)。
- **待执行清单(登记处=本节;车道=工程改动批,用户发令走独立 worktree 直改+合回 CI,零需求卡片;估 <0.5 工作日)**:
1. `game/tests/static_scan.sh`:S8 新增「`game/core/settlement/` 实有文件 ⊆ 清单」反向对账(新段类未登记即红),并把 S7 的 `S7_B1_SET` 与 `S8_FILES` 两份抄本合一为单点变量,订正 `:337` 的「10 个 .gd」文案;
2. `tools/audit_type_hints.py`/`tools/audit_file_headers.py`:补扫描面空转自检(目录缺失或 `.gd` 数为零即红,口径仿 `static_scan.sh:27-36`);
3. 上述两条落地后,架构文档 S 表 S8 行与「S9/S10 缺空面自检」的偏差登记句随同批改写(禁文档跑在码前,本轮只登记现状)。
### 4.3 S13 豁免常态化
三处豁免全落在体量最大、风险最高的文件上:
@@ -137,6 +151,8 @@ core 内干净,绕过点全在 core 之外:
| `presentation/main.gd` | 46 个句柄成员 | 同上 |
| `presentation/tune_sim_controller.gd` | await 使用 | 同上 |
**2026-11-03 结案(待裁点⑤已无对象,读数过期)**:本节所记三处豁免已于 **2026-10-31 迭代 44 批后收尾**清偿(commit 9eedf896「gdstyle 基线 refresh 收账 16→5 键:消失=main.gd49/orchestrator38+文件长 1035/tune_sim await…五键清偿」)。现行基线只剩 5 条键,全在 `adventure_runner`/`level_runner`/`board_view`(`tools/gdstyle_baseline.txt:8-12`),判定机制是「基线外新键红、同键数值恶化红、只准因还债下降」(同文件 :5)。零动作,不再叠清偿期限——「只降不升+refresh 骤降/抬升双守卫」已在位,加期限属重复建设。
### 4.4 四个 core 文件零测试点名
判定口径:文件名与 `class_name` 在 `game/tests/` 全域 grep 均零命中。
@@ -152,6 +168,13 @@ core 内干净,绕过点全在 core 之外:
低覆盖(仅 1 个测试文件点名)另计:`hero_stats`、`skill_lottery`、`shop_session`、`curio_deck`。
**2026-11-03 裁(定性改判+读数订正为 11 件;落文=规约登记义务,不建闸不补空套件)**:
- **定性改判**:本节「零测试点名」的风险叙述不成立——四件都有有针对性断言,只是不经文件名的通道:MetaStateStore 经 `meta_state.` 键散布 14 个测试文件、SlotStore 经 `.slots.attach_path/attach_slot_template` 在 system_test 与 save_slot_isolation/summary/boot_no_activate 四套件、BattleFxHost 经 `fx_host()` 在 adventure_feats_test.gd:584-661、AttuneLoadout 经 `_loadout.set_attunement` 在 feat_vouchers_test.gd:80-83。真缺口是**没有「按文件登记覆盖」的惯例**,不是没测。
- **读数订正**:按本节同口径(`game/tests/**/*.gd` 全域 grep basename 与 class_name)复跑,core 现 52 件里零点名是 **11 件**,不是 4 件。分三档:纯零 6 件(attune_loadout 117 行/slot_store 189 行/config_domain_combat·crossrun·presentation·run 四件 7–12 行纯持有容器);只在闸清单出现 4 件(battle_fx_host 232 行〔本节记 179,已涨〕/reward_roller 245/round_cycle 106/battle_refresh_flow 43);只在能力清单文字出现 1 件(meta_state_store 176)。**成因读数**:后一档三件全是迭代 44/46/49 的拆件产物——「拆件产新件不登记」是复发模式,不是一次性欠账。
- **裁否两案**:①「立每个 core 件必须被点名一次的覆盖闸」——与本文档族的 `test-conventions.md` §7「覆盖率不是目标:不引入行覆盖率度量;现行补洞=能力清单覆盖域表+人工判定」正面冲突,且会把为点名而点名的空套件逼出来;②「给 11 件补点名套件」——同既有断言重复,属为登记而写码。
- **落文**:`design/engineering/test-conventions.md` §8.3 新增「新增 core 件的覆盖登记义务」(新 core 件要么被 tests 面点名、要么在能力行申报「经宿主链覆盖(宿主=<件>)」,两者都无=收尾核对补登;明示本条不是覆盖率要求),`design/engineering/process-conventions.md` §3 第 6 条加承接指向(拆件套的覆盖登记归该义务,核对动作归收尾提交)。
- **落笔约束**:能力清单 `game/tests/README.md` 本体归写卡段维护、实现批禁写(`test-conventions.md` §8.3),所以申报行由写卡段入表,本轮规约文字不代写清单内容。
---
## 五、P2 — 封装与漂移
@@ -190,6 +213,8 @@ GDScript 无编译期访问检查,私有成员改名不会有任何闸报错
以下均需用户裁定,Agent 不代裁:
**2026-11-03 状态**:①②③ 已裁、已写卡、已随迭代 50 三卡合回(凭据=`reports/处置-架构审查3.1+3.2整改-2026-11-02.md` 与合并提交 8d3a12ec);④⑤⑥ 已裁,裁决、读数订正与待执行清单见 §四 的 4.1/4.2/4.3/4.4 各节「2026-11-03」标注;⑦ **未处置**——属 §五 P2,讨论段未开工,因此本报告整体尚未闭合。
1. **A 类硬编码 18 处怎么修**——按改动四类归属,其中 `core/` 与 `presentation/` 的玩法数值入表属**需求改动**(写卡 + 编排),`sim/` 两处模拟口径常量属**工程改动**。两类不能混一批。
2. **B 类结构常量要不要入表**——`MAX_WIDTH` / `CHARGE_LAYER_CAP` / `SPAWN_AREA_CELLS` / `node_map_generator` 的域字面量四组,代码自标「非玩法表值」,但 `SPAWN_AREA_CELLS` 已被 data 侧校验反向引用,是否算玩法数值需裁。
3. **sim 平行实现的处置口径**——是收敛(sim 调 core 的推理与掷点)还是承认双口径并显式登记(避免读数混用)。四组里①②影响数值验证可信度,③④影响可维护性。