diff --git a/reports/需求卡片-架构审查P2代码面批-2026-11-03.md b/reports/需求卡片-架构审查P2代码面批-2026-11-03.md index 5dfbc0bd..02041a6f 100644 --- a/reports/需求卡片-架构审查P2代码面批-2026-11-03.md +++ b/reports/需求卡片-架构审查P2代码面批-2026-11-03.md @@ -9,7 +9,7 @@ | # | 对象 | 现状 | 终态 | |---|---|---|---| -| R1 | NODE_TYPES 词表双份 | `node_map_generator.gd:10` 与 `level_table.gd:11` 各持一份(内容同、序不同);生成器 :166 校验自产节点、schema :78 校验表行——校验双活、词表双写 | 词表单点归 schema(`LevelTable.NODE_TYPES`),生成器删本地副本改 class_name 直引;两处校验语义零变化(`.has()` 只判成员、序无关) | +| R1 | NODE_TYPES 词表双份 | `node_map_generator.gd:10` 与 `level_table.gd:11` 各持一份(内容同、序不同);生成器 :136 校验自产节点、schema :78 校验表行——校验双活、词表双写 | 词表单点归 schema(`LevelTable.NODE_TYPES`),生成器删本地副本改 class_name 直引;两处校验语义零变化(`.has()` 只判成员、序无关) | **不收件(热重载侧,2026-11-03 用户裁决)**:`config_db.gd` 门标志与两方法、`battle_orchestrator.gd` 两行开门点**原样保留**——热重载规格已在设计文档保留原状(arch51-docs 提交 e614773a 撤回本批一度摘除),代码为将来实装骨架;实装需求卡片由用户另立待办条目后于他会话编写,本卡零触碰。 @@ -26,14 +26,14 @@ ## 3. 现状事实(2026-11-03 master 工作区实查,基点 ab5d75a2;开工自行复核) - **热重载侧(不收件,保留原状)**:config_db.gd:45(`_reload_gate`)+:174-186(`set_reload_gate`/`reload`)+battle_orchestrator.gd:272/:633(两行开门点)——零触碰;实装排期归用户另立待办条目+后续实装卡。 -- **NODE_TYPES 双份**:`core/node_map_generator.gd:10`(`["battle", "boss", "reward", "rest", "shop"]`)与 `data/schemas/level_table.gd:11`(`["battle", "reward", "rest", "boss", "shop"]`+注释「关卡节点地图 v2.1」);消费点=node_map_generator.gd:166(`NODE_TYPES.has(String(n["type"]))`——生成器自产节点枚举校验)与 level_table.gd:78(表行加载校验)。全库第三处引用零命中(grep 实核——tests/sim/probe 全零)。两处消费均为 `.has()` 成员判定,词表序不参与行为(内容集相同)。 +- **NODE_TYPES 双份**:`core/node_map_generator.gd:10`(`["battle", "boss", "reward", "rest", "shop"]`)与 `data/schemas/level_table.gd:11`(`["battle", "reward", "rest", "boss", "shop"]`+注释「关卡节点地图 v2.1」);消费点=node_map_generator.gd:136(`NODE_TYPES.has(String(n["type"]))`——生成器自产节点枚举校验)与 level_table.gd:78(表行加载校验)。全库第三处引用零命中(grep 实核——tests/sim/probe 全零)。两处消费均为 `.has()` 成员判定,词表序不参与行为(内容集相同)。 - **闸面现状**:S3(core 禁表加载)对 schema class_name 直引是豁免面(warning 级人工复核口径,static_scan.sh S3 注释「schema class_name 直引豁免」)——生成器改引 `LevelTable.NODE_TYPES` 落在既有豁免形态内(同款先例=config_db 持 BoardGenTable 等四域容器);零闸件改动。 - **S13 预算**:node_map_generator 公开面与类变量零变化(删常量不涉成员账)。gdstyle 基线(tools/gdstyle_baseline.txt)对本卡触件零登记键。 ## 4. 设计契约(违反即返工红线) - 🔴 **零行为变更**:词表 `.has()` 判定集相同——零变更证明=既有套件零转红+同种子确定链零漂移(node_map_determinism 全绿)。RNG 封闭流、明细行协议、诊断状态机、存档与断点链零触碰。 -- 🔴 **R1 单点方向**:词表唯一落点=`data/schemas/level_table.gd`(表行校验 owner);生成器删本地 `const NODE_TYPES`,:166 改 `LevelTable.NODE_TYPES.has(String(n["type"]))`——core→data/schemas 前向边,schema class_name 直引(S3 豁免面在案形态);禁反向(schema 引 core);禁把词表搬进第三处(词表唯一落点不可迁)。 +- 🔴 **R1 单点方向**:词表唯一落点=`data/schemas/level_table.gd`(表行校验 owner);生成器删本地 `const NODE_TYPES`,:136 改 `LevelTable.NODE_TYPES.has(String(n["type"]))`——core→data/schemas 前向边,schema class_name 直引(S3 豁免面在案形态);禁反向(schema 引 core);禁把词表搬进第三处(词表唯一落点不可迁)。 - 🔴 **fail-fast 不破**:改动不引入任何软回退;配置加载校验路径零改动。 - 🔴 **测试纪律**:禁变异类测试、禁撤销类取证;禁删断言/放宽阈值(第 8 节申报清单之外零删改)。 @@ -66,7 +66,7 @@ ``` core 层 - game/core/node_map_generator.gd 【非行为 R1】:10 本地词表删+:166 改 LevelTable.NODE_TYPES.has(...) + game/core/node_map_generator.gd 【非行为 R1】:10 本地词表删+:136 改 LevelTable.NODE_TYPES.has(...) 测试件(随逻辑写/改) tests/unit/core/encapsulation_p2_sweep_test.gd 【非行为 R1·新增】结构性零命中扫描(非空前置+正锚) tests/run_all.gd 【非行为】manifest +1 行(sweep) @@ -80,7 +80,7 @@ core 层 取用:无(本卡起点)。产出:R1 清零+sweep 绿+批收口两件。 - [ ] 核对实现排序在案:5.1 卡(含 battle_orchestrator 触面)未合回则本批不开工 -- [ ] node_map_generator.gd::10 本地 `const NODE_TYPES` 删;:166 改 `if not LevelTable.NODE_TYPES.has(String(n["type"])):`——头注如有词表自述随改 +- [ ] node_map_generator.gd::10 本地 `const NODE_TYPES` 删;:136 改 `if not LevelTable.NODE_TYPES.has(String(n["type"])):`——头注如有词表自述随改 - [ ] 新增 tests/unit/core/encapsulation_p2_sweep_test.gd(extends SceneTree+Kit.check 主通道,全类型标注;源 token 扫描手法沿 encapsulation_sweep_test.gd〔5.1 卡新增件〕先例)断言组:①node_map_generator.gd 非空+`^const NODE_TYPES` 零命中+`LevelTable.NODE_TYPES.has(` 正锚〔架构P2 V1〕;②全仓 .gd 生产面(core/data/presentation)`NODE_TYPES :=` 定义恰好 1 处且落 data/schemas/level_table.gd〔架构P2 V2〕——两组均带扫描面非空前置 - [ ] 孤立验证:新 sweep 单件先跑绿;node_map_determinism_test 全套绿(生成链同种子逐位——R1 零行为变更主证)+关卡表加载路径(level_table 校验活检查)经既有套件覆盖零转红+冒烟零转红 - [ ] run_all.gd manifest 追加 1 行:encapsulation_p2_sweep_test(expect 0,注记「R1 结构性零命中扫描〔架构P2〕」) @@ -98,7 +98,7 @@ T1 0.25。区间合计 0.25–0.5 工作日;**精确汇总 0.25 工作日**( | 需求点 | 改动(文件:行为) | 验收测试(名称+落点+尾缀) | 层级 | 真实入口 | 判据绑定面 | 能力行 | |---|---|---|---|---|---|---| -| R1 NODE_TYPES 单点化 | node_map_generator :10 删+:166 改指 | encapsulation_p2_sweep_test〔架构P2 V1/V2〕;node_map_determinism_test 既有全套(同种子同参数必产同图逐位) | 单元+集成 | `LevelRunner` 关卡推进→节点图生成真实入口;`LevelTable` 表行加载校验 | 词表定义唯一落点(正锚计数=1);生成链同种子逐位同 | 既有:节点图生成合法性与同种子复现;既有:起关/选路/断点重生成同图(集成) | +| R1 NODE_TYPES 单点化 | node_map_generator :10 删+:136 改指 | encapsulation_p2_sweep_test〔架构P2 V1/V2〕;node_map_determinism_test 既有全套(同种子同参数必产同图逐位) | 单元+集成 | `LevelRunner` 关卡推进→节点图生成真实入口;`LevelTable` 表行加载校验 | 词表定义唯一落点(正锚计数=1);生成链同种子逐位同 | 既有:节点图生成合法性与同种子复现;既有:起关/选路/断点重生成同图(集成) | **零行为改动面的证据义务**:本卡一行均为非行为改动——零变更证明=既有套件零转红+sweep 恒零+确定性链逐位。能力行全部「既有」、零新增——判断依据:零行为变更=玩家可观测能力面零变化;能力清单零编辑(批末核对义务在 T1)。 diff --git a/待办清单.md b/待办清单.md index 00fabbab..8bd765dc 100644 --- a/待办清单.md +++ b/待办清单.md @@ -16,9 +16,9 @@ **实况**:2026-10-29 全库架构静态审计的四组待裁余项,自「架构审查优化讨论」条目迁入(该条目的 3.1+3.2 部分已随迭代 50 卡③实现合回〔合并提交 8d3a12ec〕,余项不在本卡,按未决先迁再死迁立本条)。四组余项(审计待裁点 ④⑤⑥⑦,读数为审计时点,逐项现值以仓库为准):①守卫闸面缺口——S1/S2 随机函数扫描面止步 core+presentation(sim 4 处/probe 1 处/tests 3 处自建 RNG 不在扫)、S9 类型闸与 S13 质量闸扫描面不含 sim/probe/tests、S8 是 9 文件显式清单(缺位自检只防删改不防增);②S13 质量闸豁免存废——审计时点三处豁免常态化到最大户文件(battle_orchestrator 已随拆件批收窄,余量以闸件为准);③零测试点名四件(attune_loadout/battle_fx_host/meta_state_store/slot_store);④架构文档漂移三处(architecture.md 登记的 core/hero_ledger.gd 盘上不存在且测试断言它必须不存在、行数过期、EC8 热重载门后 ConfigDb.reload() 零调用方且走 load() 拿不到磁盘新值)。凭据:reports/审计-全库架构审查-2026-10-29.md(待裁点节)+reports/处置-架构审查3.1+3.2整改-2026-11-02.md(3.1+3.2 闭合凭据,随迭代 50 合回)。 -**缺口**:四组余项中①②③ 已裁完并落地(见下 2026-11-03 记录),还差④**架构文档漂移三处**的裁决与落文(`architecture.md` 的 HeroLedger 登记行、battle_orchestrator 行数与成员数、EC8 热重载门后 `ConfigDb.reload()` 零调用方)——属审计 §5.2/待裁点⑦,需再走一次设计讨论;同族的审计 §5.1(settlement 私有成员直取,实测 105 处)/§5.3(NODE_TYPES 词表双份)/§5.4(MetaProgression 取依赖形态)尚未登记本条,随④同批处置时一并入册。 +**缺口**:四组余项中①②③ 已裁完并落地(见下 2026-11-03 记录);④**架构文档漂移三处**的落文档由并行 worktree 批(arch51-docs——HeroLedger 行拆件四件补登记+行数冻结计数摘除+MetaProgression 补登记行)承载,随其合回销号;同族审计 §5.1 已登记已写卡(arch51-card 批)、§5.3 已写卡(见下 2026-11-04 段,本 worktree)、§5.4(MetaProgression 登记零动作)已随 arch51-docs 落文——均随各自合回入册;presentation 层私取面约 227 行另开设计讨论,为本条最后余项。 -**2026-11-03 P2 部分(5.1 封装+5.2 文档漂移+5.3 词表)推进**:5.1 设计闭合+已写卡——处置记录落 arch51-docs worktree、需求卡片 v1.1(godot-master 终审七项折入,pipeline_gate PASS)落 arch51-card worktree,两件随各自合回落 master 后互见;5.2 文档漂移归真已落档(architecture.md v1.32——HeroLedger 行拆件四件补登记/冻结计数摘除/MetaProgression 补登记行/CurioStop 与 RunLedger 旧指称订正,arch51-docs worktree 提交 63fc3e74+e614773a,文档域闸全绿);**EC8 热重载侧经用户裁决撤卡**——GDD 规格恢复原状(本批一度摘除已撤回)、config_db 门与 reload+编排器两行开门点代码原样保留为将来实装骨架,实装去向=用户另立待办条目+后续实装卡(他会话写卡);5.3 已写卡——凭据=reports/需求卡片-架构审查P2代码面批-2026-11-03.md v1.1(archp2-card worktree,仅 NODE_TYPES 词表单点化,零待裁点,估时 0.25 工作日,排序在 5.1 卡后);**未闭合余项收窄**=闸面缺口(S1/S2/S9/S13 扫描面、S8 目录域)、S13 三处豁免存废、零测试点名四件、presentation 层私取面约 227 行(另开设计讨论)。 +**2026-11-03 P2 部分(5.1 封装+5.2 文档漂移+5.3 词表)推进**:5.1 设计闭合+已写卡——处置记录与需求卡片 v1.1(godot-master 终审七项折入,pipeline_gate PASS)落 arch51-card worktree、处置记录落 arch51-docs worktree,随各自合回落 master 后互见;5.2 文档漂移归真已落档(architecture.md——HeroLedger 行拆件四件补登记/冻结计数摘除/MetaProgression 补登记行/CurioStop 与 RunLedger 旧指称订正,arch51-docs worktree 提交 63fc3e74+e614773a,文档域闸全绿);**EC8 热重载侧经用户裁决撤卡**——GDD 规格恢复原状(本批一度摘除已撤回)、config_db 门与 reload+编排器两行开门点代码原样保留为将来实装骨架,实装去向=用户另立待办条目+后续实装卡(他会话写卡);5.3 已写卡——凭据=reports/需求卡片-架构审查P2代码面批-2026-11-03.md v1.1(archp2-card worktree,仅 NODE_TYPES 词表单点化,零待裁点,估时 0.25 工作日,排序在 5.1 卡后,行号已按迭代 50 合回后现址换代 :136);**未闭合余项收窄(2026-11-04 并 master 后对账)**=仅剩 presentation 层私取面约 227 行(另开设计讨论)——闸面缺口、S13 豁免存废、零测试点名三组已随 §4 批(2026-11-03 裁决+闸件落地,见上裁决段)闭合销号。 **改动面**:文档+游戏代码+工具代码