Files
gplan-2/reports/需求卡片-架构审查P2代码面批-2026-11-03.md
T

15 KiB
Raw Blame History

需求卡片:架构审查 P2 代码面批(2026-11-03)

来源:待办清单「架构审查优化讨论——全库架构审计读数的逐条裁决与整改分批(2026-10-29 登记,来源=审计发现)」条目 P2 部分(唯一事实源:reports/审计-全库架构审查-2026-10-29.md §5.3 NODE_TYPES 项+2026-11-03 设计讨论会话用户授权〔实现层事项按代码规则与架构文档决策〕;热重载侧经用户裁决撤卡——规格保留原状、死开关代码保留为将来实装骨架,实装去向=用户另立待办条目+后续实装卡〔他会话写卡〕)。 状态:已写卡(v1.1,2026-11-03 修订——原 R1〔EC8 热重载代码链退役〕经用户裁决撤下,本卡收敛为仅 NODE_TYPES 词表单点化)。改动面:游戏代码(含随逻辑写/改的测试代码)。

1. 目标与完成定义

这批做什么:一处零行为变更的词表单点化——审计 §5.3 的 P2 代码遗留:

# 对象 现状 终态
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 撤回本批一度摘除),代码为将来实装骨架;实装需求卡片由用户另立待办条目后于他会话编写,本卡零触碰。

什么状态算完:词表改指落码、第 8 节对照表配对的验收断言在当轮真实跑批中通过;零行为变更证明=既有套件零转红(node_map_determinism/关卡表校验链/冒烟)+结构性 sweep 恒零(第 8 节 V1/V2);代码域闸全绿;两份 reports/ 产出物(实现报告+反哺点清单)写齐。

排序义务:本卡实现排队在 reports/需求卡片-架构审查5.1封装修复批-2026-11-03.md 之后——battle_orchestrator.gd 虽不再被本卡触碰,排序惯例照旧(同批架构审查卡顺次实现)。

2. 设计事实源

  • 审计读数:reports/审计-全库架构审查-2026-10-29.md §5.3(NODE_TYPES 词表双份)。
  • 裁决凭据:2026-11-03 设计讨论会话用户授权(实现层事项按代码规则与架构文档决策)+热重载侧撤卡裁决(规格保留、代码保留、实装另卡)。
  • 架构登记:design/engineering/architecture/architecture.md——:119 行「NODE_TYPES 词表双份」表述随本卡单点化由反哺点订正。

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: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,:136 改 LevelTable.NODE_TYPES.has(String(n["type"]))——core→data/schemas 前向边,schema class_name 直引(S3 豁免面在案形态);禁反向(schema 引 core);禁把词表搬进第三处(词表唯一落点不可迁)。
  • 🔴 fail-fast 不破:改动不引入任何软回退;配置加载校验路径零改动。
  • 🔴 测试纪律:禁变异类测试、禁撤销类取证;禁删断言/放宽阈值(第 8 节申报清单之外零删改)。

5. 范围边界

收件=R1 词表单点化+一件新 sweep 测试+既有套件回归确认。

不收件(去向已指认):

  • 热重载全侧(config_db 门与 reload、编排器两行开门点、GDD 规格)——原样保留,实装去向=用户另立待办条目+后续实装卡;本卡零触碰。
  • architecture.md :119 行「NODE_TYPES 词表双份」表述——反哺点清单承载(实现批禁写 design/,第 6 节)。
  • 闸面缺口(S1/S2/S9/S13 扫描面扩 sim/probe/tests、S8 目录域)与 S13 三处豁免存废——审计 P1 项,不在本卡(待办清单条目未闭合余项,后续讨论段)。

6. 关联文档同步面

实现批禁写 design/ 整个目录与根规则文件;下表每条的落文义务全部进 reports/iter<N>-反哺点-<日期>.md(N=编排段定),由用户裁决后归文档批落文:

文档 关联点(本批实现会改变它的哪条陈述) 同步义务(反哺点清单逐条承载)
design/engineering/architecture/architecture.md :119 行「各持一份 NODE_TYPES 词表(内容同、顺序不同)」表述随单点化删句、改「词表单点归 LevelTable」 反哺点清单逐条列行号与改后登记内容——机械面文档禁直改
design/gdd/systems/表现与支撑/数据配置.md 无陈述变化(热重载规格保留原状——零反哺确认行) 反哺点清单写「零反哺」确认行
术语表 无新术语 确认行「零新增术语」

(机检口径:本表同步义务格无一条写「随批」。)

7. 任务卡 T1..T2

卡前·文件结构图

全部行为面=非行为改动(零行为变更批),行标【非行为】+对照表 R 行号;测试件为随逻辑写/改的测试代码。

core 层
  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)
文档件
  game/tests/README.md              写卡段判断=零编辑(第 8 节能力行判断依据)——实现批禁写,批末只核对能力名引用一致

T1 NODE_TYPES 单点化+批收口(估时 0.25 工作日;区间 0.25–0.5) 取用:无(本卡起点)。产出:R1 清零+sweep 绿+批收口两件。

  • 核对实现排序在案:5.1 卡(含 battle_orchestrator 触面)未合回则本批不开工
  • 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〕」)
  • 实现报告 reports/iter<N>-实现报告-<日期>.md:各卡状态+S13 键改前改后对账(node_map_generator 现场读数)+实现决定记录
  • 反哺点清单 reports/iter<N>-反哺点-<日期>.md:第 6 节同步面逐条落点(architecture.md :119 一处、GDD/术语确认行)
  • 批末核对:README 能力名引用一致(本卡零编辑);独立验收审计(第 8 节末)未过不合并;.uid 收口=--editor --quit 一次后确认新测试件 .uid 随批提交

估时汇总

T1 0.25。区间合计 0.25–0.5 工作日;精确汇总 0.25 工作日(超 0.5 工作日=超卡面估时域,须用户确认后方可续批)。

8. 验证闸(改动—验收对照表)

测试方式两分法:下表全部走调试接口验证;正常流程体验验证=零项(零行为变更批)。判据绑被测改动特有的可观测提交面(源码零命中带非空前置与正锚/确定链同种子逐位)。

需求点 改动(文件:行为) 验收测试(名称+落点+尾缀) 层级 真实入口 判据绑定面 能力行
R1 NODE_TYPES 单点化 node_map_generator :10 删+:136 改指 encapsulation_p2_sweep_test〔架构P2 V1/V2〕;node_map_determinism_test 既有全套(同种子同参数必产同图逐位) 单元+集成 LevelRunner 关卡推进→节点图生成真实入口;LevelTable 表行加载校验 词表定义唯一落点(正锚计数=1);生成链同种子逐位同 既有:节点图生成合法性与同种子复现;既有:起关/选路/断点重生成同图(集成)

零行为改动面的证据义务:本卡一行均为非行为改动——零变更证明=既有套件零转红+sweep 恒零+确定性链逐位。能力行全部「既有」、零新增——判断依据:零行为变更=玩家可观测能力面零变化;能力清单零编辑(批末核对义务在 T1)。

闸口径:重闸=tools/run_all_gates.sh 按本批改动域选档(改动含 game/ 下非 .md 行为载体 → --code);所选域全绿才合并。卡内不写死闸件名单。回归措辞:里程碑卡出口跑一次全套闸;卡内修复只做出红最小单元的最窄确认;新增测试先行孤立验证再并入全套。

测试削弱申报:零条——本批零删改既有断言(grep 实核:tests 对 NODE_TYPES 零引用,无断言需要迁移)。

独立验收审计:入口=批末 T1 后、合并前;报告=reports/iter<N>-验收审计-<日期>.md;由没参与实现的会话或子代理执行,核对:对照表逐行断言真实存在且当轮通过、sweep 非空前置在案、零删改核对、S13 键只降不升对账。未过不合并。

9. 异常分级

  • L1 自救:改指行错位、sweep 正则笔误、注释错字——就地改,记录进实现报告。
  • L2 记录继续:行号 ±5 行内漂移(grep 符号锚定位后继续)。
  • L3 停机写报告等用户:①实现中发现 NODE_TYPES 出现卡面未登记的第三处消费面(现状事实失实=上游缺陷,禁代裁);②改指后任一既有套件转红(零行为变更契约被破=停卡,禁就地调和);③机检键与卡片契约互斥=停卡呈报,禁自造第三条路。

10. 代拍板白名单

  • sweep 正则具体写法与断言消息措辞(尾缀〔架构P2 Vn〕与判别词保留)。
  • 逐卡内「孤立验证→出红最小单元→并入全套」执行顺序细节。 超清单的决断记入实现报告「实现决定记录」节。

11. 待裁点

零待裁点,开工门=U0——词表单点化方向由审计读数+2026-11-03 会话授权导出;热重载侧经用户裁决撤卡(规格保留、代码保留为实装骨架、实装另卡)。单点落点、T 卡分解、验收断言由写卡期实查定死(第 3/7 节)。本卡未新增备选案。

12. 落位与可复用性预检

新增文件(1 件,测试件):

  • tests/unit/core/encapsulation_p2_sweep_test.gd——为什么不能复用 5.1 卡的 encapsulation_sweep_test.gd:两卡独立 worktree 独立实现批(合回顺序未定,并件会让扫描面归属与尾缀语义跨批纠缠);本卡 sweep 仅两组四处、体量小;扫描手法同源(源 token 扫描先例),合回后如需并件归后续纯测试维护批裁决。grep 同名零命中。

新增函数/成员:零(纯删除+一处改指——无任何新增生产函数/成员/数据件)。

复用既有:源 token 扫描手法=encapsulation_sweep_test/player_copy_sweep_test 先例;manifest 登记=run_all.gd 既有条目族;schema class_name 直引形态=config_db 域容器四先例。

分层与交互面:R1 前向边 core→data/schemas=S3 豁免面在案形态(同 config_db 持表容器方向);零新增跨域路径、零新依赖;RngService 红线零触碰;Core 零 UI 红线零触碰;数值单一事实源零触碰(零表改动)。

13. 禁为机检文本保留无效成员

本卡为收敛类卡:词表删除后生成器禁留本地副本或镜像常量。机检键与卡片契约互斥时实现段一律停卡呈报,不得自造第三条路。

14. 实现规范预算

新增 .gd 仅 1 个测试件(SceneTree 脚本,全类型标注、零公开生产面)。生产代码全部落既有件,按「存量触面一查」对账(S13 默认阈值):

  • 零成员变化件:node_map_generator 公开面与类变量零变化(常量删+一处改指)。
  • 存量触面 S13 预期:触件一件 S13 键较现场基线只降不升;gdstyle 基线零登记键,T1 现场读数即对账基线。
  • 指标例外申报:无。

15. 拆分边界纪律

本卡零新拆件——触件全部架构在册既有件,只做词表单点化;逐件职责语句不变(node_map_generator=关卡节点图生成域唯一承载〔词表消费方身份不变、定义权归 schema owner〕)。单一变化原因=单一事实源(词表归一),非阈值驱动。禁凑计数袋:本卡无成员打包面。