# 方案:配表异常告警 > 日期:2026-09-09 > 入口:`TableAnomaly`(`assets/script/game/TableAnomaly.ts`) ## 1. 目的 配表与实现契约对不上、或行内自相矛盾时,**只暴露、不兜底**。策划在控制台搜 `【配表异常】` 即可看到表名、id、字段和原因。 禁止用默认值、猜间隔、按单体顶替未知 `atk_type` 等把错误跑通。 ## 2. 打印格式 ``` 【配表异常】 Skill id= 20501 cd 主动技能 cd≤0,实现不会编造间隔 0 ``` 同 key(表+id+字段+原因)只打一次,避免局内刷屏。热更重新扫会先 `reset`。 ## 3. 何时检查 | 时机 | 行为 | |------|------| | Boot / Deferred / 全表加载完成 | `TableAnomaly.scan` | | 配表热更写入后 | 再扫一遍 | | 运行时发现(如主动 `cd≤0`、未知 `atk_type` 进表现) | `TableAnomaly.warn`,不补逻辑 | ## 4. 加载扫描范围 - **Skill**:`type` 非 1/2;主动 `cd≤0`;`atk_type` 头无索敌实现;`skill` 额外头未落地;主动既无 `atk_type` 也无额外效果 - **Hero**:`herotype` 非法;`atk_id` / `act_skill` 指向不存在的 Skill;武器 id 无 Weapon 行;合成武将 `startweapon` 的 `Weapon.type` 与 `Hero.weapon` 不一致;`atk_id` 长度小于 `level_limit` - **Weapon**:`type` 非 1–4;`act_skill` 无 Skill;`heroid` 无 Hero 或该英雄 `personalweapon` 不是本武器;战斗武器 `skin` 为空 新契约(新 `atk_type` / 额外效果头)落地后,须同步改 `TableAnomaly` 里的实现集,否则会误报。 ## 5. 调用约定 运行时发现配表问题一律: ```ts TableAnomaly.warn('Skill', skillId, 'cd', '主动技能 cd≤0,不编造连放间隔', baseCd); ``` 然后中止或保持空结果,**不要**再写 `?? 默认值` / 编造 CD / 改成已实现的 atk_type。