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:
@@ -15,7 +15,7 @@
|
||||
| B | `ui_cn_chars.txt` vs `ui_font_cn_12.c` 的 cmap | txt 有而字体无 → **GAP FAIL**(转换器对缺字形/低码位会**静默丢字**) |
|
||||
|
||||
A 通过 + B 通过 ⟹ 字体覆盖"源码在用"与"刻意保留"的每一个字。
|
||||
`KEEP_EXTRA` 的存在理由:防止将来 `extract_cn.py` 按"源码已不用"静默删掉**已落盘记录里还在用**的字。
|
||||
`KEEP_EXTRA` 的存在理由:防止将来 `extract_cn.py` 按"源码已不用"静默删掉**已落盘记录里还在用**的字(这条路径的实际形态与实测数字见 §6.1)。
|
||||
|
||||
- **单一规则源**:本脚本不自创第二套"从源码里找汉字"的规则,而是复用 `tools/font_gen/extract_cn.py`
|
||||
的 `SCAN` 清单与 `collect()` 状态机(跳过注释与字符常量、只取双引号字符串)。**两处各写一套解析,
|
||||
@@ -55,6 +55,34 @@ A 通过 + B 通过 ⟹ 字体覆盖"源码在用"与"刻意保留"的每一个
|
||||
2. 必需集来自"源码里出现的汉字",**运行期拼出来的字符串**(格式化进来的字、外部配置文件里的字、
|
||||
记录内容回显)完全在视野外——那类白框本门照不到。
|
||||
3. 只校验**码位覆盖**,不校验字形是否美观/是否为所需点阵尺寸。
|
||||
|
||||
### 6.1 「按 extract 输出重写字符集」= 洗字形(实名登记的事故路径)
|
||||
|
||||
`tools/font_gen/extract_cn.py` 只认**当前源码里的字符串字面量**,照不出运行期数据里的字——
|
||||
典型是 2026-09 窗口固件写进 `/log/selftest.log`、`/log/run.log` 的定长 64 B 中文描述记录
|
||||
(跨固件持久,自检/运行记录页直接渲染 `desc`)。实测口径(2026-10-25):extract 扫出
|
||||
**144 字**,而 `ui_cn_chars.txt` 现有 **183 字**,差的 39 字全部由 `KEEP_EXTRA` 兜住:
|
||||
|
||||
- **逐字登记 4 字**(异/常/片/芯):出处可指到 `9eb1bd63`(2026-09-14 中文自检描述)
|
||||
与 `6f51c62a`(2026-09-20 串口侧改 ASCII),脚本里逐字写了理由;
|
||||
- **成组登记 35 字**(2026-10-25 道E task-15 并入):正是本门禁「未知冗余」WARN 的全部
|
||||
条目(一位公分合外已年度延态总接显最月未求温状电示秒请跳载近道部配重长间闸障)。来源
|
||||
能确认是那批落盘记录的用字,**但逐字出处已不可靠复原**(文案被整体改写,指不到某个
|
||||
字来自哪条 commit)→ 选择整组保留并在脚本里点名成组,**而不是给每个字编一条看起来
|
||||
可信的理由**。判据:字形不可再生(删了永久白框、无日志无报错,只在渲染历史记录时暴露),
|
||||
保留成本约 35 字 × 27 B ≈ 1 KB RO——收益与代价不对称(同本目录"收益不抵风险"暂缓)。
|
||||
|
||||
**事故路径**:有人跑 `extract_cn.py`,把输出当"权威清单"直接覆盖 `ui_cn_chars.txt` →
|
||||
39 字被静默洗掉 → 下次 font-regen 生成的字体不再有这些字形 → 现场翻到 2026-09 那批历史
|
||||
记录时相关行渲染成空白方块,且没有任何地方报错。
|
||||
|
||||
**机械化拦截**:`KEEP_EXTRA` 按"必需字"参与 A 段判定——txt 缺任一保留字直接 GAP FAIL
|
||||
并逐字打印保留理由(`--strict` 同样 FAIL)→ "洗字形"在**下一次提交**就响,不靠人记性。
|
||||
配套流程约束:font-regen 第 3 步(重生成字体)之前必须把 `KEEP_EXTRA` 并回 txt。
|
||||
|
||||
**删除前置条件**(满足后才可删条目,删后下次 font-regen 自然瘦身):确认设备上已无该窗口
|
||||
的落盘记录,或产品侧明确接受历史记录部分渲染空白。只删 txt/字体里的字而不删本清单 =
|
||||
本门禁立刻 FAIL(刻意:清单是唯一真相源)。
|
||||
4. 拉丁字母、数字、标点不在本门范围(另有字体与布局约定)。
|
||||
5. `--strict` 不在钩子默认档位里(默认只拦 GAP):冗余字形长期靠人自觉清理。
|
||||
6. 字体文件本身若被手工编辑(不跑生成器),A/B 两段仍可能同时"通过"而与实际 cmap 不符——
|
||||
@@ -62,8 +90,8 @@ A 通过 + B 通过 ⟹ 字体覆盖"源码在用"与"刻意保留"的每一个
|
||||
|
||||
## 7. 豁免与基线
|
||||
|
||||
- `KEEP_EXTRA` 是**刻意保留清单**(存量 + 逐条理由),性质同 `registration-check` 的已知缺口表;
|
||||
新增要写理由,删掉等于放弃保护。
|
||||
- `KEEP_EXTRA` 是**刻意保留清单**(存量 + 理由;出处可考者逐字登记,出处不可考者成组登记,
|
||||
见 §6.1),性质同 `registration-check` 的已知缺口表;新增要写理由,删掉等于放弃保护。
|
||||
- 没有"只减不增"的债务基线。
|
||||
|
||||
## 8. 改这个门禁本身
|
||||
@@ -76,3 +104,4 @@ A 通过 + B 通过 ⟹ 字体覆盖"源码在用"与"刻意保留"的每一个
|
||||
| 日期 | 变更 |
|
||||
|---|---|
|
||||
| 2026-10-23 | 首篇逐项文档(两段链条判定口径 + 生成期校验覆盖不到的那一环) |
|
||||
| 2026-10-25 | 新增 §6.1:实名登记「按 extract 输出重写字符集 = 洗字形」这条事故路径;把当时「未知冗余」WARN 的 35 字**成组**并入 `KEEP_EXTRA`(实测 extract 144 字 vs 清单 183 字,差 39 字 = 逐字 4 + 成组 35),并写清删除前置条件(道E task-15) |
|
||||
|
||||
Reference in New Issue
Block a user