diff --git a/reports/iter35-卡②-实现报告-2026-10-24.md b/reports/iter35-卡②-实现报告-2026-10-24.md index d43ebd74..b514e133 100644 --- a/reports/iter35-卡②-实现报告-2026-10-24.md +++ b/reports/iter35-卡②-实现报告-2026-10-24.md @@ -48,12 +48,35 @@ | T 卡 | 状态 | |---|---| | T0 事实坐实与卡① 接口对齐 | 待做——接口四件已可由卡① 定稿直读(`generate(params, seed)` 不收 level_index、`{nodes,entries,terminals}`、节点 `id/type/depth/next`、参数档字段名),本段只需核 §3 行号漂移 | -| T1 加载校验换代(四检+良构) | 完成(提交随本报告末笔)——`LevelTable.validate_graph(nodes)` 静态单点在位,表加载期图校验与旧六判据退役,新宿主 `level_table_validate_test`〔v1〕15 条+manifest 登记,run_all 全绿 59 套件 | +| T1 加载校验换代(四检+良构) | 完成(提交 `c0dd4420`,明细见 §二·五)——`LevelTable.validate_graph(nodes)` 静态单点在位,表加载期图校验与旧六判据退役,新宿主〔v1〕17 条+manifest 登记,run_all 全绿 59 套件,四条变异注入均见目标尾缀红 | | T2 消费侧切源与行进/定位/确定性换代 | 未开工——任务见分支待办 #3 | | T3 模板清理与 S1–S8 断言换代 | 未开工(S5/V11 覆盖断言已由 §一 提前落位)——任务见分支待办 #4 | | T4 产出物 | 本报告即起始件;代拍板单与反哺点清单随收口补 | +## 二·五 T1 加载校验换代(已完成·提交 `c0dd4420`) + +**改动**:`LevelTable.validate_graph(nodes: Array) -> Array` 静态单点承载四检+良构基底(契约 1 原口径:①入口(无入边)≥1 且终点(无出边)≥1;②全员从某入口可达且可达某终点;③终点恒 Boss 且 Boss 无出边;④出边目标深度严格大于源=无环。良构=句柄唯一·出边全命中·type 五类枚举·battle/boss 带深度)。表加载期不再校验图:旧六判据(Boss 恰一/战斗≥2/单链末 Boss/前三位纯战斗/出度≤2/Boss 编号最大)+模板池校验分支+BFS 层宽≤5 一并删除,行级校验(level_index 唯一/display_name/rest_heal_pct/info_visible_layers)保留。商店位与入口终点个数按「勿扩勿缩」不入本检。 + +**新宿主**:`game/tests/unit/core/level_table_validate_test.gd`〔v1〕17 条断言(正例三形/负例八类/范围反证三条/②④ 关系实证三条)+ `run_all.gd` manifest 一行;闸 02 实跑 59 套件全绿。 + +**撤销(变异)证明**——逐条注入→本宿主见红→`git checkout` 还原,注入前实现已入库: + +| 注入 | 目标尾缀 | 实测 | +|---|---|---| +| 注掉「终点恒为 Boss」判据 | 〔v1〕终点非 Boss 负例 | RED-OK:`负例:终点非 Boss 命中「终点恒为 Boss」〔v1〕` 红 | +| 注掉前进方向判据 | 〔v1〕回边/环两负例 | RED-OK:`回边(目标深度不严格大于源)…` 与 `环(2→1 回边)…` 双红 | +| 注掉句柄唯一登记 | 〔v1〕dup_key 负例 | RED-OK:`负例:句柄重复报 dup_key〔v1〕` 红 | +| 注掉入口收集分支(附带做) | 〔v1〕正例 | RED-OK:多入口/含岔口正例双红(入口集空→可达性全断) | +| 前两轮注错语法(`if false and if …`)致解析错 | — | 已作废重跑,未计入红证;教训=注入必须保持可编译,否则「红」是解析失败给的 | + +**判据②与④在 DAG 上互斥(新发现,拟入反哺点)**:无环图每个源点都是入口、每条极长路都止于终点,故「孤儿/断头」构造不出独立负例;② 的真实定位是 ④ 失效时的纵深防御面。测试据此改为两独立链正证不误伤+自环先被 ④ 拦的实证。文档(关卡节点地图 v2.1 :51 走图三句/关卡节点图生成 v1.1 结构铁律)宜注明这一兜底定位,免得后续批误判 ② 有独立拦截能力。 + +**件核**:全仓 grep 六判据消息文本 → 零残留;唯一余留是 `game/data/tables/level.tres:22` 表尾模板生成史注释,随 T3 模板清出一并消失。 + +**本段旧断言随动(四条,声明)**:`level_shop_economy` ③ 段整段改走 `validate_graph`,其中「入口唯一违例」随设计换代翻为多入口合法正例、「孤儿」条改为非 Boss 终点;`level_map_type_vis` 夹具注释订正;`round_flow_skill_pool` 敌表池清单 20→28 行补覆盖批八行池克隆键;`board_gen_reward`「(2,3) ceil 上取」改判精确命中并以「临时摘该行」的夹具面保留 ceil 能力判据。(前两条属本卡 §9.5① S 随动族;后两条属 §一 覆盖批的键域随动,先前漏跑整套未暴露,本轮 run_all 抓出。) + ## 三、遗留读数义务 + - 覆盖数据为 provisional 插值,未跑 MC/对拍——数值面既动,卡② 收口前须请用户裁定是否发起 11 回放确定性对拍与 `balance_verifier` 重跑(本批目前只跑到「覆盖断言绿」,未测难度观感)。 - 待办清单 06 条目「覆盖批未立卡」缺口段现况已过期(覆盖数据已随本批落地),状态回写归文档批。