diff --git a/docs/门禁说明/id-check.md b/docs/门禁说明/id-check.md index 1ac0b86a..27866360 100644 --- a/docs/门禁说明/id-check.md +++ b/docs/门禁说明/id-check.md @@ -158,6 +158,45 @@ (`| v1.6 | 2026-10-25 | …`)那类表漏豁免——同一份冻结历史被两种表头拆成两种待遇,属工具缺陷, 现已补齐(要求版本号与日期两格连排,单独的版本号不算,避免普通表格被误免)。 +## 7.7 「不可判定绝对数」到底是什么:构成实测 + 每批自证没吃余量的做法(2026-10-27) + +先给一条与直觉相反的结论,它是这一节存在的理由:**给带属主登记处的族加引用,完全不吃这根护栏** +(那些引用算「可判定」)。这根护栏只统计**门禁主动豁免掉的字面量**与真·硬不可判定。 + +实测拆解(`.venv` 解释器,`import check_ids` 后取 `Checker.stats`;口径同 §7.6 的第二根护栏): + +| 项 | 数 | 是什么 | +|---|---|---| +| `refs_total` | 8,744 | 候选字面量总数(硬件位号在进分母之前就 `continue`,不计入,见 §6) | +| `decidable` | 7,582 | 落进已登记前缀族**且该族属主登记处存在** | +| 两者之差 = 护栏口径 | **1,162** | 等于下面三项之和(逐项相加精确闭合,无第四类) | +| └ `skip_bare_unmanaged` | 834 | 裸形盲区:同字母多义的裸号出现在属主登记处文档之外,按 §6 明令不判 | +| └ `noise_allowed` | 326 | 命中 `id_registry.json` 的 `noise_literals` 白名单(不是编号,但形态像) | +| └ `undecidable` | **2** | 真·硬不可判定:族仍登记着、但属主登记处已空(`cleared_2026_10_26` 那批遗留) | + +三条读法: + +1. 这 1,162 里约 **99.8% 是设计上的豁免**,不是「没登记的野号」。把它当债务余额来读会得出错误结论。 + 它与本文件打印的「校验 1 未登记前缀:0 处」不矛盾——**校验 1 报的是新增错误级**,护栏统计的是分母差; + 两者一个是行为、一个是水位,别互相替换。 +2. 真正会推高这个绝对数的只有两类动作:**在属主登记处之外新增裸形引用**,或**新增命中噪声表的连字符形态**。 + 要指代就写全号并紧邻属主文档名(写法口径见 `docs/文档规范.md` §3.5,判它的是校验 6)。 +3. ⚠ **反向错误更贵**:为了「少占余量」而把编号改写成语义短语/散文——那正是 §7.6 与这根护栏的动机要防的 + 稀释(比值会被清号动作稀释,绝对数不会)。2026-10-27 凌晨 Lead 给三条道下过这样一条错指令,已撤回; + 正确口径是:按 `docs/编号规范.md` §1 先问三句,属允许族就用号,**需要新母号时由 Lead 改 `id_registry.json` 游标**。 + +**每批自证没吃余量(可复制的做法,五项式)**: + +1. 改之前先跑一次 `./.venv/Scripts/python.exe scripts/check_ids.py`,记下三个数:字面量总数、可判定、 + 不可判定绝对数。⚠ `--strict` 只回答「有没有新错误级」,**不回答可判定占比动了没有**——别拿它当替身。 +2. 改完再跑一次,逐数比对。 +3. 若绝对数涨了,先确认是不是本批吃的账。**不要用 `git stash` / `git checkout` 去回退**(那会把别人在飞的 + 改动一起收走,本仓同日刚为此踩过):用 `git show HEAD:<路径>` 把名下文件取成临时副本,或开一棵 + `git worktree`,只回退自己名下那几个文件,再跑同一扫描器——差值就是本批的净影响。 +4. 交报告时把差值写全,形如 `refs +0 / dec +0 / und +0 / 比值 +0.00pp / 错误 +0`;**别只写「跑过没问题」**。 + 2026-10-26 的清号批次与同日三篇文档改写都是按这句式交的,读者能自己复算。 +5. 确实还掉一块之后,用 `--update-baseline` 把 `undecidable_total_ceiling` **同步下调**(脚本自己拒绝上调)。 + **手工把上限调高等于自废这道闸,任何时候都不许做。** ## 8. 改这个门禁本身 - 改族定义 = 改 `scripts/id_registry.json`,改完必须看**编号字面量总数有没有变小**: @@ -169,6 +208,7 @@ | 日期 | 变更 | |---|---| +| 2026-10-27 | 新增 §7.7:实测拆解「不可判定绝对数」的构成(裸形盲区 834 + 噪声白名单 326 + 真·硬不可判定 2 = 1,162,精确闭合),并写入每批自证没吃余量的五项式做法(含「不得用 stash/checkout 回退别人在飞改动」与 --update-baseline 只下调);同批撤回一条 Lead 错指令——「怕吃余量而把编号写成散文」恰好是 §7.6 这根护栏要防的稀释行为 | | 2026-10-26 | **方案 B(同日续批)**:登记簿系 `N-x`/`S-x`/`T-x`/`A-x` 与 UI 簇 `U1~U5` 共 20 个号停发、约 418 处引用转语义短语(字面量净减 443:8,946 → 8,503);新增第二根护栏「不可判定引用绝对数上限」(`undecidable_total_ceiling`,只减不增),并把比例基线下调——理由与实测(比例跌、绝对数不涨)见 §7.6;`CHANGELOG_ROW` 补「版本号 + 日期」表头的变更记录行 | | 2026-10-26 | **清号批次**(用户裁定:字母+数字编号太多、没人认得):全仓删除「属主已死 / 从未启用」的编号约 1,100 处,规范 §4.1 收成全活族 + §4.1.1 列已清除族,§4.2/§4.5/§7.1/§9 作废压缩。门禁口径不变(族仍登记,只拦新增引用);扫描面 / 字面量总数 / 台账 / 比例基线按本批实跑重打(见 §3、§7)。新增 §7.5 讲清"比例上升 ≠ 卫生变好"的读法 | | 2026-10-25 | 二进制工件跳过(§6 第 9 条):`iter_files` 按 gzip 魔数/头 2KB NUL 嗅探排除 gz/png 等,防乱码伪编号顶出校验 1 假新账(f3rounds gz 入库实测触发);602 处存量台账口径不变 |