fix(字体门禁): 35 个"未知冗余"字成组并入 KEEP_EXTRA,钉死"按 extract 重写=洗字形"

本笔不改任何代码行为,只补一条**已存在的保护洞**(Lead 裁定 2026-10-25 随道E task-15 顺手提
独立提交)。

现象:font-charset 门禁的"未知冗余"WARN 清单(txt 有、源码无、且不在 KEEP_EXTRA)实测正好
35 字——一位公分合外已年度延态总接显最月未求温状电示秒请跳载近道部配重长间闸障。这批字是
2026-09 窗口固件写进 /log/selftest.log 与 /log/run.log 定长 64 B 记录的中文描述用字(那批
源码文案后来整体改写成 ASCII,字面量已不在)。

为什么要登记而不是当冗余删掉:
- extract_cn.py 只认"当前源码字面量"(实测 144 字),而 ui_cn_chars.txt 现有 183 字。谁按
  extract 的输出重写 txt(font-regen 流程的第 2 步就是这么用的),这 39 字(含此前逐字登记的
  异/常/片/芯 4 字)会被静默洗掉,下次 make_font 生成的字体不再有这些字形;
- 后果不在本机、在**现场翻旧账**时:2026-09 那批历史自检/运行记录渲染成空白方块,无日志无
  报错,只能肉眼发现;字形不可再生,等于不可逆毁历史审计证据;
- 代价:约 35 字 × 27 B ≈ 1 KB RO。收益/代价不对称(同本目录"收益不抵风险"整簇暂缓的判据)。

诚实处理:这 35 字**逐字出处已不可靠复原**(能确认来源是落盘记录用字,指不到单条 commit)。
故按"成组 + 一条共同理由"登记,不给每个字编一条看起来可信的理由;删除前置条件写明(确认设备
上已无该窗口落盘记录,或产品侧接受历史记录部分空白),并把成因与事故路径实名写进门禁说明。

改动
- scripts/check_font_charset.py:KEEP_EXTRA 4 → 39 字(新增 _KEEP_HIST_SELFTEST 成组
  理由 + update 并入 35 字);A 段按"必需字"处理,缺字即 GAP FAIL 并逐字打印理由
  (--strict 同样拦)
- docs/门禁说明/font-charset.md:新增 §6.1「按 extract 输出重写字符集 = 洗字形」(实测数字
  144/183/39、事故路径、机械化拦截点、删除前置条件);§5/§6/§7 与变更记录联动
- .dsh/skills/font-regen/SKILL.md:第 2 步的保留字提示不再逐字列举(列举必然过期),改为指向
  KEEP_EXTRA 字典与门禁说明 §6.1——**共享基建文件,越界自加,见回报申报**

验证(本笔零代码、零像素、零体积,钩子全绿未跳):
- check_font_charset.py:rc=0,打印 [KEEP] 刻意保留 39 个;--strict 亦 rc=0(原 35 项 WARN 归零)
- 钩子(staged 全量):空白/EOF/乱码/doc-links/id-check/font-charset 全 Passed,体积两条
  钩子因无相关触发面自动 Skipped;@build 未跑(无源码改动,台账不受影响)
- 编码自查:三文件均无 BOM(与本目录现状一致)、CR = 0、U+FFFD = 0
This commit is contained in:
2026-10-25 11:13:02 +08:00
parent 4cba2eae02
commit 30ebbe0c26
3 changed files with 55 additions and 5 deletions
+19
View File
@@ -79,6 +79,25 @@ KEEP_EXTRA = {
"片": "同 \"时钟芯片异常\"(9eb1bd63 写入,落盘持久)",
}
# 2026-10-25 道E task-15 补充:**成组保留**的历史落盘记录用字(35 字)。
# 发现方式:本钩子的「未知冗余」WARN 清单(txt 有、源码无、且不在 KEEP_EXTRA)实测正好
# 35 字——全部是 2026-09 窗口固件写进 /log/selftest.log(与 /log/run.log)定长 64 B 记录
# 里的中文描述用字。那批源码文案后来被改写(串口侧改 ASCII),**逐字出处已不可靠复原**:
# 能确认来源是落盘记录用字(不是美术字、也不是手工修 cmap),但指不到「这个字出自哪条
# commit」。两难取其下——字形不可再生(删了就永久白框)而保留成本极低(35 字 ≈ 1 KB RO)
# → 整组保留并在此**点名成组**,而不是给每个字编一条看起来可信的理由。
# 删除前置条件:确认设备上已无该窗口的落盘记录(或已接受历史记录部分渲染白框)。
# ⚠ 本组真正的价值是把一条路径钉死:**「按 extract_cn 输出重写 ui_cn_chars.txt」= 洗字形**
# (extract 只认当前源码字面量,实测 144 字,而 txt 现在 183 字)——谁按它的输出覆盖
# txt,就会把这 35 字连同上面 4 字一起洗掉,且只在渲染历史日志时才暴露、无日志无报错。
# 成因与判据详述 → docs/门禁说明/font-charset.md §6.1
_KEEP_HIST_SELFTEST = ("历史落盘记录用字(2026-09 窗口固件写入 /log/selftest.log 与"
" /log/run.log 的定长 64 B 中文描述;源码文案已改写、逐字出处不可靠"
" 复原,故整组保留——删任一即让对应历史行永久渲染空白且不可逆;"
" 成因与删除前置条件见 docs/门禁说明/font-charset.md §6.1)")
KEEP_EXTRA.update({c: _KEEP_HIST_SELFTEST for c in
"一位公分合外已年度延态总接显最月未求温状电示秒请跳载近道部配重长间闸障"})
def load_tool(name):
"""按文件路径加载 tools/font_gen/<name>.py(无包结构,importlib 直载)。