docs(编号): 瘦身——58 KB/473 行 → 22 KB/222 行,过程记录进归档

用户裁定 A 方案:这份文档的「规范体系」部分已随门禁退役而死,但四件仍活着的东西
只有这里写着——① §1 政策(默认不发号 / 先问三句);② §3.3 语义标识怎么写;
③ §4.1 族总表 + §4.1.1 已停发栏(现行门禁白名单的机器投影源头);
④ §4.4 这些不是编号(防把 YX15 / 元件位号当垃圾清)。再留 §5.5 销项、
§8 门禁现状与 §8.5 退役路线、§10 速查。

其余 16 节逐字搬进 scripts/archive/id_gate/编号治理历史.md(40 KB):
1.2 / 2 八条原则 / 4.2 / 4.5 / 6 模块码表 / 7+7.1~7.3 / 8.1 基线 / 8.3 批次 /
8.4 台账 / 9+9.1~9.3(含「数据可信」任务卡号换算表),以及原变更记录 17 行流水。
归档文件带「这不是现行口径」横幅 + 归档目录,写清哪些节对应哪段历史。

两处刻意的选择:
- 节号沿用旧编号、不重排——外部文档与脚本引的是 §4.1 / §8.5 这些号,重排等于
  制造一批假链接;文首加「本文范围」说明跳号去哪了。
- 文首那段「机器面才是事实源」改写:现行机器面是 check_ids_new.py 的两张
  前缀级白名单(KNOWN_DASH / KNOWN_BARE),旧的 registry / 别名表 / 八项校验脚本
  已随全库审计退役进归档,只在手工复查存量时才用。

引用重修(6 份文档、10 处):AGENTS 的 §9.3 换算表、数据可信 §9.3 ×2、
门禁说明 id-check 与 host-unit-tests、docs/README 的 §4.5、技能手册的 §9、
以及正文里 §4.2 / §4.5 / §8.1 / §8.3 / §8.4 / §1.2 的裸引用。

验证:doc-links --all --sections-strict 通过(195 文档);mojibake / bom-guard /
git diff --check 全 rc=0;新门禁 --worktree 自查通过;钩子数仍 51。
This commit is contained in:
2026-10-28 12:51:17 +08:00
parent 967d29e633
commit 89b6132c1f
9 changed files with 338 additions and 294 deletions
@@ -32,7 +32,7 @@ version: 1.1.0
## Steps(字母+数字族:门禁看得见的那一路)
1. **确认范围与定调**:先按开头的表判识别面(无识别面 → 走下一节);再读 `docs/编号规范.md` §4.1(族总表,穷举)、§4.1.1(已停发栏)与 §9(存量与批次),明确本族属主登记处(`owner_docs_glob`)与判据「有脚本按字面量匹配它」。清退 = 全仓改语义;停发 = 游标冻结、只减不增。
1. **确认范围与定调**:先按开头的表判识别面(无识别面 → 走下一节);再读 `docs/编号规范.md` §4.1(族总表,穷举)、§4.1.1(已停发栏),存量与批次见 `scripts/archive/id_gate/编号治理历史.md` §9,明确本族属主登记处(`owner_docs_glob`)与判据「有脚本按字面量匹配它」。清退 = 全仓改语义;停发 = 游标冻结、只减不增。
2. **按族实测三口径(字面量 / 站点 / 文件),不用 grep 估数**。`Checker.refs` 是 **dict(字面量 → 文件集合)不是方法**,`ck.refs(fam)` 这种写法会 `TypeError`;站点数门禁不直接给,用族正则重扫它自己的语料:
```python
import sys; sys.path.insert(0, "scripts")
+2 -2
View File
@@ -153,7 +153,7 @@
## 文档与图形
- **登记簿类文档「完成即销项」**:`docs/任务规划/README.md` 这类待办登记簿,事项修复/关闭后**直接从表中删除该行**(不保留"已消化"行)——结论与证据应已沉淀进对应模块文档/问题记录。销项时必须:① 先核对目标文档确已含完整记录 ② 同步清理其他文档对该编号的引用 ③ 改完跑 `check_doc_links.py --all` + pre-commit。**新条目标识(用户裁定 2026-10-14)**:`#` 列填**语义短语**(如 `沉降窗 800ms 上限只留痕`),**不再新增字母+数字编号**——"编号不回收"只写规则却不留痕迹就不可执行(销项删行后仓库里毫无痕迹,2026-10-14 实测就发生过「销项号被重新取走」的撞号事故),语义标识自带唯一性;**存量编号(登记簿 N-x / S-x / T-x 与专项 A-x)已于 2026-10-26 全部转成语义短语**,旧号进 `scripts/archive/id_gate/id_aliases.json` 标 `retired-to-phrase`、不得再指;**「数据可信」任务卡号(中文前缀「卡」+ 数字,14 个)已于 2026-10-27 随卡销项整族清退**,换算表 `docs/编号规范.md` §9.3——这一族**刻意不进 `id_aliases.json`**:中文前缀不进 check_ids 语料,登记了机器也看不见,**没有机器识别面**,停发只靠规范与评审;**已随销项消失的号永久作废**、不得复用 → `docs/任务规划/README.md` §0
- **登记簿类文档「完成即销项」**:`docs/任务规划/README.md` 这类待办登记簿,事项修复/关闭后**直接从表中删除该行**(不保留"已消化"行)——结论与证据应已沉淀进对应模块文档/问题记录。销项时必须:① 先核对目标文档确已含完整记录 ② 同步清理其他文档对该编号的引用 ③ 改完跑 `check_doc_links.py --all` + pre-commit。**新条目标识(用户裁定 2026-10-14)**:`#` 列填**语义短语**(如 `沉降窗 800ms 上限只留痕`),**不再新增字母+数字编号**——"编号不回收"只写规则却不留痕迹就不可执行(销项删行后仓库里毫无痕迹,2026-10-14 实测就发生过「销项号被重新取走」的撞号事故),语义标识自带唯一性;**存量编号(登记簿 N-x / S-x / T-x 与专项 A-x)已于 2026-10-26 全部转成语义短语**,旧号进 `scripts/archive/id_gate/id_aliases.json` 标 `retired-to-phrase`、不得再指;**「数据可信」任务卡号(中文前缀「卡」+ 数字,14 个)已于 2026-10-27 随卡销项整族清退**,换算表 `scripts/archive/id_gate/编号治理历史.md` §9.3——这一族**刻意不进 `id_aliases.json`**:中文前缀不进 check_ids 语料,登记了机器也看不见,**没有机器识别面**,停发只靠规范与评审;**已随销项消失的号永久作废**、不得复用 → `docs/任务规划/README.md` §0
- 图形走 **`draw-diagram` skill**:精确布局图用 `tools/arch_diagram/gen_*.py` 生成器(产物放 `docs/images/`,**脚本与产物同一笔提交**:改生成器没重跑,下一个碰巧重跑的人会看到一段「不是我改的」diff——已机械化 `generated-fresh`,重跑到临时目录逐字节比对 → `docs/文档规范.md` §4.4);拓扑图用 Mermaid;**勿手绘 ASCII 框图**。文件引用关系图走 `tools/refgraph`(`& 'tools\refgraph\gen_refgraph.bat'`)
- **改名 / 挪目录一律走 `scripts/rename_ref.py`(先 dry-run,确认后 `--apply`)**:`git mv` + 自动改写全库引用(反引号引用 / Markdown 链接 / 图片 `../` 层级换算 / `#include` / `uvprojx` `<FilePath>` / `CMakeLists.txt`),落盘后自动跑 `check_doc_links --all` 复核——手工扫引用既慢又漏(一次改名历史上波及 10~30 文件)。引用章节用「`路径.md` §N.M」**紧邻写法**(`doc-links` 校验编号是否还在:紧邻/裸名/前缀/别名/自引用**全部拦提交**(钩子带 `--sections-strict`);每次跑打印「可判定比例」,`--section-todo` 出待改清单,昵称歧义就登记 `scripts/section_aliases.json` 或写清楚)→ `docs/文档规范.md` §3.5 / §3.6。**编号改名走 `scripts/rename_ids.py`**(映射表驱动、**显式 scope**、干跑默认、自动写 `scripts/archive/id_gate/id_aliases.json` 的 scoped 旧号→新号条目;`[示例]`/`[计划]` 行与变更记录表不改写;**绝不全局查找替换**——同一裸形字面量可能同时属多个族,全局替换等于造新撞号,实测 `S3` 三义)
- 文档写作规范(编码/BOM/链接/表格/一致性钩子)→ `docs/文档规范.md`;全量索引与推荐阅读顺序 → `docs/README.md`
@@ -176,7 +176,7 @@
| 存储栈(FatFs / dhara / lftpd / 两条 FatFs 陷阱) | `docs/架构设计/STM32F4-Base存储架构说明.md` |
| RAM / 栈预算 / 容量台账 | `docs/内存管理/RAM使用分析与优化方案.md`、`内存内容分配策略.md` |
| **每个提交门禁一篇详解**(查什么 / 拦下过什么真事 / 限制与盲区 / 基线口径) | `docs/门禁说明/README.md`(51 个钩子 → 28 篇索引,其中 1 篇是退役留档 + 1 指针) |
| **要不要给某个东西发编号**(默认:不发,写语义短语)/ 允许用号的 7 个族(`TC-*` 已停发——「停发」不等于「暂缓」,也不等于「可以清号」)/ 编号门禁现状(`id-check-new`:只查新增行;旧的八项校验已退役) | `docs/编号规范.md`(§1 先问三句、§4.1 族总表〔穷举〕与『已停发』栏、§8 门禁与实测基线) |
| **要不要给某个东西发编号**(默认:不发,写语义短语)/ 允许用号的 7 个族(`TC-*` 已停发——「停发」不等于「暂缓」,也不等于「可以清号」)/ 编号门禁现状(`id-check-new`:只查新增行;旧的八项校验已退役) | `docs/编号规范.md`(§1 先问三句、§4.1 族总表〔穷举〕与『已停发』栏、§8 门禁现状与退役路线) |
| 提交门禁通用机制(阶段 / stash 陷阱 / 触发面 / 增量拦截三段式) | `docs/代码规范/pre-commit使用说明.md` §2 |
| 代码规范 V1.0 / cppcheck 口径 | `docs/代码规范/嵌入式C语言代码规范_V1.0.md`、`cppcheck使用说明.md` |
| 自动化测试 / 实机测试 / 板级套件 | `docs/测试说明/自动化测试流程.md`、`实机测试实施指南.md`、`board-test-suite` skill |
+1 -1
View File
@@ -228,7 +228,7 @@ docs/
> 未闭环项 → [`任务规划/登记簿.md`](任务规划/登记簿.md);内存与 Flash 结论(含整簇暂缓的**重开条件**)
> → [`内存管理/RAM使用分析与优化方案.md`](内存管理/RAM使用分析与优化方案.md) §2.5 / §2.6.4 / §4;
> UI 侧硬约束 → [`UI设计/UI_设计架构.md`](UI设计/UI_设计架构.md) §1.4;
> 六个自有编号族 → [`编号规范.md`](编号规范.md) §4.5(属主文档已删,只能删号留事实,别再引用那些号)。
> 六个自有编号族(属主文档已删的那批)→ `scripts/archive/id_gate/编号治理历史.md` §4.5(只能删号留事实,别再引用那些号)。
### 9.2 环境与部署
| 文档 | 内容 |
+2 -2
View File
@@ -14,7 +14,7 @@
> 它们是现行规范、不是"已完成记录",不要当历史删掉。
> ⚠ **原任务卡编号(形态 = 中文「卡」+ 数字:0、0b、1~12 共 14 个)整族已于 2026-10-27 清退**
> (用户裁定:已完成内容销项删除、去除相关编号);代码头注释与文档里的引用全改成语义短语,
> **换算表见 `docs/编号规范.md` §9.3**——旧号永久作废、不得再指,也不得重新取走
> **换算表见 `scripts/archive/id_gate/编号治理历史.md` §9.3**——旧号永久作废、不得再指,也不得重新取走
> (销项后不留痕迹曾导致撞号,见 `docs/任务规划/README.md` §0)。
> 上游分析见
> `docs/问题记录/采集与数据处理短板评测.md`。
@@ -224,7 +224,7 @@ typedef struct {
> 状态:⬜ 未开始 · 🟦 进行中。**已闭环 = 直接删行**(2026-10-27 起取消"被代码注释指称就保留行"的
> 例外——引用侧已全部改成语义短语,删行不再会让任何注释失去出处)。
> **新条目一律用语义标识,不新增字母+数字编号**(规则见 `docs/任务规划/README.md` §0)。
> 上面那种「卡」+ 数字的形态已整族清退(换算表 `docs/编号规范.md` §9.3),旧号永久作废、不得重新取走。
> 上面那种「卡」+ 数字的形态已整族清退(换算表 `scripts/archive/id_gate/编号治理历史.md` §9.3),旧号永久作废、不得重新取走。
> **顺序:已知电压注入验证(✅ 已闭环 → 已删行)→ 端子/子板变比确认 → 两点标定**;注入验证是
> M4 ①、两点标定与 B10 送检的前置,**2026-10-27 已解除**;**下一步做变比确认**(等子板实物或原理图)。
> 已闭环那张卡的台架执行步骤(注入点清单、期望码值、五步流程与现场记录表)在
+33 -284
View File
@@ -1,20 +1,26 @@
# 编号规范:默认**不**用编号
> **一句话:语义标识是唯一默认形态,编号是例外。** 例外只留给**有脚本按字面量匹配**的那几种
> (§4.1 的「允许继续发号」一栏);同一张表里还有一栏是**已停发、存量待清**的族(§9.1 给清点与批次)。
> (§4.1 的「允许继续发号」一栏);同一张表里还有一栏是**已停发、存量待清**的族(`编号治理历史.md` §9.1 给清点与批次)。
> 除此之外一律写语义短语(§3.3)。
>
> 这条不是洁癖,是用户 2026-10-27 的明确要求:**「不要用字母加数字的编号,简直太难以理解了,语义标识是最好的」**。
> 依据也很硬:规划 / 待办 / 审计 / 差距 / 阶段这些给人看的东西,历史上全发过号,也全都变成了没人认得的代号。
> 2026-10-26 起两批清理把编号字面量从 **10,956 压到 8,230 处**,2026-10-27 复测为 **7,828 处**(§8.1 有口径说明);
> 而清掉的号里绝大多数从来没被任何脚本读过一次。沿革与教训留在 §8.3 与 git log,正文不复述。
> 2026-10-26 起两批清理把编号字面量从 **10,956 压到 8,230 处**,2026-10-27 复测为 **7,828 处**(`编号治理历史.md` §8.1 有口径说明);
> 而清掉的号里绝大多数从来没被任何脚本读过一次。沿革与教训留在 `编号治理历史.md` §8.3 与 git log,正文不复述。
>
> **机器面才是事实源**:族注册表 `scripts/archive/id_gate/id_registry.json`、旧号别名 `scripts/archive/id_gate/id_aliases.json`、
> 门禁 `scripts/archive/id_gate/check_ids.py`(八项校验,详解 `docs/门禁说明/id-check.md`)。本文与机器面冲突时
> **以机器面为准,并回来改本文**。
> **机器面才是事实源**:现行门禁 `scripts/check_ids_new.py` 的两张**前缀级白名单**(`KNOWN_DASH` / `KNOWN_BARE`)
> 是 §4.1 的机器投影;本文与白名单冲突时以白名单为准,回来改本文(详解 `docs/门禁说明/id-check-new.md`)。
> 旧的族注册表 / 别名表 / 八项校验脚本已随全库审计退役进 `scripts/archive/id_gate/`,只在手工复查存量时用。
---
> **本文范围**:这里只留**现在还生效**的口径。跳号的节(`编号治理历史.md` §2 八条原则 / `编号治理历史.md` §4.2 / `编号治理历史.md` §4.5 / `编号治理历史.md` §6 模块码表 /
> `编号治理历史.md` §7 改号与迁移 / `编号治理历史.md` §8.1 基线 / `编号治理历史.md` §8.3 批次 / `编号治理历史.md` §8.4 台账 / `编号治理历史.md` §9 存量清点与换算表)是编号治理的**过程记录**,
> 2026-10-28 已整体移入 `scripts/archive/id_gate/编号治理历史.md`——要查历史判据、批次流水、
> 「数据可信」任务卡号换算表,去那里;**改现在的做法只看本文**。
> 节号沿用旧编号,故意不重排:外部文档与脚本引的是 `§4.1` / `§8.5` 这些号,重排等于制造一批假链接。
## 1. 决定要不要发号之前,先问三句
| 问自己 | 答"否"的结论 |
@@ -30,27 +36,6 @@
重新取走"撞过两次。
- **引用必须带语义**:号旁边要有人话,裸号不许独担信息(读者不该被迫查表才看懂一句话)。
### 1.2 这四类事故就是上面三条的由来
1. **同一字母多义**:`P1` 五义、`L1` 四义、`U1` 四义、`D7` 与元器件位号同形 → 前缀必须按**事物类别**
分配(§2)。
2. **属主文档一删,号全体成孤儿**:审计报告删除后,全仓几百处引用再也查不到定义 → 号越少,这种
"集体失效"的爆炸半径越小(§4.5)。
3. **语义塞进号里**:条目事后降级,改号则引用全断、不改则号实不符 → 号不承载语义(P-2)。
4. **销项号被复用**:登记簿删行后仓库里毫无痕迹,下一个条目顺手取走同号 → 不回收、不复用,
改用**语义标识**(短语自带唯一性)。
---
## 2. 八条设计原则(一句话版)
**P-8 语义优先**压过其余七条:**给人看的条目一律不发号**。其余七条只在"确实要发号"时生效——
P-1 前缀 = 事物类别(不是来源文档 / 审计轮次)· P-2 号不承载语义 · P-3 一个事实一个号 ·
P-4 规范形态唯一(连字符与补零不承载语义,写法只许一种)· P-5 只增不复用,新增先取游标 ·
P-6 号必须能反查到定义(属主登记处得存在)· P-7 编号不语义、**引用必语义**。
---
## 3. 三种指代方式,按这个顺序挑
| 优先 | 方式 | 用在 |
@@ -82,9 +67,9 @@ P-6 号必须能反查到定义(属主登记处得存在)· P-7 编号不语
### 4.1 允许用号的族(**穷举**——这张表以外一律不许发号)
**允许继续发号**——**恰好下面 5 行**,判据 = 有脚本按字面量匹配它(现状实测 2026-10-27 见 §9.1)。
**允许继续发号**——**恰好下面 5 行**,判据 = 有脚本按字面量匹配它(现状实测 2026-10-27 见 `编号治理历史.md` §9.1)。
`TC-*` **不在本表**:它的发号已按用户裁定 2026-10-27 停掉(别把那句裁定读成「暂缓」——防误读的三条对照在
本节末的框里,清点的来龙去脉在 §9.1 批次三)。
本节末的框里,清点的来龙去脉在 `编号治理历史.md` §9.1 批次三)。
| 族 | 形态 | 属主登记处 | 用途 |
|---|---|---|---|
@@ -92,7 +77,7 @@ P-6 号必须能反查到定义(属主登记处得存在)· P-7 编号不语
| `FR-*` | 需求 | `docs/产品需求/产品需求设计文档.md` §5 | 需求↔测试追溯 |
| `CODE-RULE-<nn>` | 代码规范条款 | `scripts/check_coding_standard.py` | 门禁按条款号报错并统计存量 |
| `MENU-STATE-<nn>` | UI 状态机键 | `simulator/tests/check_menu_rows.py` | 像素回归脚本按它取状态行 |
| `P-<n>` | **本文的设计原则** | 本文 §2 | 就是本文自己的条目 |
| `P-<n>` | **本文的设计原则** | 本文 `编号治理历史.md` §2 | 就是本文自己的条目 |
> ⚠ **「批次三不做了」只有一层意思:不去清这个族,同时把它的发号口关死。** 它**不是**「TC 族维持原状、
> 新用例照旧配号」——维持原状的是**存量号**,关掉的是**发号口**。三条对照,防止往任何一边读过头:
@@ -101,7 +86,7 @@ P-6 号必须能反查到定义(属主登记处得存在)· P-7 编号不语
> 不再配 TC 号;指认**既有**用例仍可引用现存号(旧号只读,不是许可新配)。
> - ❌「停发 = 这族要废了,顺手清掉、把号腾出来复用」——**也错**。现存号与它在 `scripts/archive/id_gate/id_registry.json`
> 里的登记,是 `check_test_traceability.py` 与 40 套 `run_unit_test.py` **按字面量读的追溯把手**,
> 清它等于换机制(§9.1);号不回收、不复用是 §1 的硬规矩。
> 清它等于换机制(`编号治理历史.md` §9.1);号不回收、不复用是 §1 的硬规矩。
> - ❌「registry 里 TC 族还带着活游标,所以门禁允许我发」——**不成立:这条缺口已于 2026-10-27 同日关掉**。
> 37 个 TC 类族现在**全部** `frozen: true`,其中 **34 个 `TC-HOST-*` 子族的 `cursor` 冻结在裁定日该套件存量
> 最高号**(5 个游标低于存量的已抬到水位:`TC-PROTELEM-013→015`、`TC-SYSLOG-108→137`、`TC-ADCHEALTH-011→023`、
@@ -112,48 +97,45 @@ P-6 号必须能反查到定义(属主登记处得存在)· P-7 编号不语
> **还剩一处空白,别把这条机械化读成无死角**:主族 `TC`(没有专属子族的模块码,如 `TC-ADCIN-*`)的 `cursor`
> 仍为 `null`——一个游标表达不了每个模块码的水位,写全族最高号反而放行低号,所以按空白登记(探针实测:
> 给无专属子族的模块码(如 `TC-ADCIN-` 段)写一个新号,门禁不响)。这一面由三条兜:① §8 校验 3——新号没进属主登记处 = 悬空引用(错误级);
> ② §9.1 末段的**冻结水位**(只减不增,涨了就要问「这号是谁在停发之后发的」);③ 评审。**所以给这些模块
> ② `编号治理历史.md` §9.1 末段的**冻结水位**(只减不增,涨了就要问「这号是谁在停发之后发的」);③ 评审。**所以给这些模块
> 补号,即使在文档表格里一并补了定义行,一样违反本裁定。** 要把这面也钉死(按模块码克隆子族,或给族级加
> 字面量上限)与「真要清退」同属追溯机制改造,按 §7.3 单独开卡,别夹在本批里顺手做。
> 字面量上限)与「真要清退」同属追溯机制改造,按 `编号治理历史.md` §7.3 单独开卡,别夹在本批里顺手做。
> - **唯一的重启入口**:先由用户裁定 → 再回到本节把族放回上面那 7 行、并指出按它做字面量匹配的脚本 →
> 才谈得上发号。顺序倒过来就是 §1.2 那四类事故的由来。
> 才谈得上发号。顺序倒过来就是 `编号治理历史.md` §1.2 那四类事故的由来。
**已停发、存量待清**(一律**不得再新增引用**;下表除 `TC-*` 外,登记未删只是为了让历史行不报「未登记前缀」,
清点见 §9.1。`TC-*` 是这一栏的**特例**:登记与现存号都要留着,它是机器把手而不是待清对象,见 §9.1 批次三):
清点见 `编号治理历史.md` §9.1。`TC-*` 是这一栏的**特例**:登记与现存号都要留着,它是机器把手而不是待清对象,见 `编号治理历史.md` §9.1 批次三):
| 族 | 状态 | 依据 |
|---|---|---|
| `TC-*` | **保留现存号、即日停发(机器已冻结)**:34 个 `TC-HOST-*` 子族 `frozen: true`、游标钉在 2026-10-27 存量水位,越游标即 §8 校验 5 错误级;现存号只减不增,新用例改用语义化测试函数名 + 文档表格行名(主族 `TC` 的空白面见上方框) | 用户裁定 2026-10-27「批次三,不坐」;本族是 §4.1 判据唯一真被脚本按字面量读的族,清它等于换追溯机制,详见 §9.1 批次三 |
| `TC-*` | **保留现存号、即日停发(机器已冻结)**:34 个 `TC-HOST-*` 子族 `frozen: true`、游标钉在 2026-10-27 存量水位,越游标即 §8 校验 5 错误级;现存号只减不增,新用例改用语义化测试函数名 + 文档表格行名(主族 `TC` 的空白面见上方框) | 用户裁定 2026-10-27「批次三,不坐」;本族是 §4.1 判据唯一真被脚本按字面量读的族,清它等于换追溯机制,详见 `编号治理历史.md` §9.1 批次三 |
| 族 | 形态 | 存量 | 为什么该清 |
|---|---|---|---|
| `L<n>-<nn>` | 保护功能号 | **批次二已整族转功能名,即日停发**:活引用 0,只剩一处**原始串口日志**(冻结证据、永久保留)与本文/技能文档的形态举例;属主文档表首格写功能名,不再配号 | 用户 2026-10-27 定调「语义标识是最好的」+ 本轮指令「把能清的族清掉一批」;探针(Checker _check_dangling):写一个新号(字母 L + 段号 + 连字符 + 两位数、从未定义过的形态)→ §8 校验 3 悬空引用**错误级** → 发号口已机器关闭。**不冻结数值游标**:L1/L2/…各段最高号不同,单一数字游标反而放行低号 |
| `F-<MOD>-<nn>` | 网络设计条目 | **批次一已转「§7 条目名」,即日停发**:代码与测试侧 0 处;属主文档 §7 编号列 13 条仅作历史对照(定义行不算引用) | 同上;探针:写一个新号(F 前缀 + 模块码 + 从未出现过的序号)→ 校验 3 **错误级**;引用旧号命中小写别名表 retired-to-phrase = **只读**,不构成发号许可 |
| `F-<MOD>-<nn>` | 网络设计条目 | **批次一已转「`编号治理历史.md` §7 条目名」,即日停发**:代码与测试侧 0 处;属主文档 `编号治理历史.md` §7 编号列 13 条仅作历史对照(定义行不算引用) | 同上;探针:写一个新号(F 前缀 + 模块码 + 从未出现过的序号)→ 校验 3 **错误级**;引用旧号命中小写别名表 retired-to-phrase = **只读**,不构成发号许可 |
| `N-*` | 登记簿 `N-<nn>` | 4 处 / 3 个字面量 | 登记簿已于 2026-10-26 全面改语义短语,残留的是漏网的旧引用 |
| `TM-*` | 阶段/里程碑 `TM-<code>-<nn>` | 1 处 | 阶段号本就属 §3.3 明令不许写号的那类 |
| `T-TEST` | 台架阶段 **裸形**(字母 T 紧跟一位数字) | 活引用 0(批次一清零;余下是本文自述与技能文档的形态举例) | 裸形最危险(同字母多义),且改「台架阶段一」即可 |
| `F-*` | 网络设计条目 `F-<MOD>-<nn>` | 动手前 38 处 / 12 个 → **2026-10-27 批次一收口**:正文 9 处(含一个从来没有定义行的 DRV 段孤儿号,删号)+ 主机侧单测注释 1 处改「条目名」,仅属主文档 §7 历史对照表留 12 条编号 | 代码注释按号回指设计条目,但没有任何脚本匹配它 |
| `F-*` | 网络设计条目 `F-<MOD>-<nn>` | 动手前 38 处 / 12 个 → **2026-10-27 批次一收口**:正文 9 处(含一个从来没有定义行的 DRV 段孤儿号,删号)+ 主机侧单测注释 1 处改「条目名」,仅属主文档 `编号治理历史.md` §7 历史对照表留 12 条编号 | 代码注释按号回指设计条目,但没有任何脚本匹配它 |
- **新增族的唯一正当条件**:有脚本要按字面量匹配它。顺序固定:先改 `id_registry.json`(含属主登记处)
→ 再写属主文档 → 最后才允许在别处引用。反过来做必然造出悬空号。
- 模块码是既定缩写,事实源 = registry 的族 pattern 与属主文档标题行,**别自创**(§6)。
- 模块码是既定缩写,事实源 = registry 的族 pattern 与属主文档标题行,**别自创**(`编号治理历史.md` §6)。
### 4.1.1 已停发的族(别再指,更别再"复用"这些号)
| 停发族 | 现在怎么写 | 旧号去哪查 |
|---|---|---|
| 登记簿 `N-x` / `S-x` / `T-x`、专项 `A-x`、已删报告的 UI 簇 `U1~U5`(2026-10-26 方案 B) | 语义短语——**登记簿表首格本身就是短语**,如「双转换器无共同采样触发」「CI 远端闭环未验证」 | `scripts/archive/id_gate/id_aliases.json` 标 `retired-to-phrase` |
| 网络设计条目 `F-NET/F-DRV/F-MS-<nn>`(12 个,2026-10-27 批次一) | 「§7 + 条目名」短语,如 `(§7「全局读即清搁浅事件」)`;条目名的权威清单 = `docs/网络/网络自愈架构设计.md` §7「条目名」列;那个 DRV 段孤儿号按本节末句**删号留事实**、未补定义 | `scripts/archive/id_gate/id_aliases.json` 标 `retired-to-phrase`(13 条)+属主文档 §7 编号列仅作历史对照 |
| 「数据可信」任务卡号(中文前缀「卡」+ 数字,形态见 §9.3;2026-10-27 批次五) | §5 表的**标识列直接写任务名**(「端子/子板变比确认」「两点标定与精度验收」),代码注释与文档写语义短语(「标定折算落地」「未标定闭锁」「遥测快照发布」…);**逐号换算表见本文 §9.3** | ⚠ **机器面空白**:中文前缀不进 `scripts/archive/id_gate/check_ids.py` 语料(族 pattern 全是拉丁形态)→ 门禁咬不到,今天只有本表 + §9.3 + 评审三条兜;`id_aliases.json` 刻意不登记(登记了机器也看不见,只多一张没人核的表) |
| 网络设计条目 `F-NET/F-DRV/F-MS-<nn>`(12 个,2026-10-27 批次一) | 「`编号治理历史.md` §7 + 条目名」短语,如 `(`编号治理历史.md` §7「全局读即清搁浅事件」)`;条目名的权威清单 = `docs/网络/网络自愈架构设计.md` `编号治理历史.md` §7「条目名」列;那个 DRV 段孤儿号按本节末句**删号留事实**、未补定义 | `scripts/archive/id_gate/id_aliases.json` 标 `retired-to-phrase`(13 条)+属主文档 `编号治理历史.md` §7 编号列仅作历史对照 |
| 「数据可信」任务卡号(中文前缀「卡」+ 数字,形态见 `编号治理历史.md` §9.3;2026-10-27 批次五) | §5 表的**标识列直接写任务名**(「端子/子板变比确认」「两点标定与精度验收」),代码注释与文档写语义短语(「标定折算落地」「未标定闭锁」「遥测快照发布」…);**逐号换算表见本文 `编号治理历史.md` §9.3** | ⚠ **机器面空白**:中文前缀不进 `scripts/archive/id_gate/check_ids.py` 语料(族 pattern 全是拉丁形态)→ 门禁咬不到,今天只有本表 + `编号治理历史.md` §9.3 + 评审三条兜;`id_aliases.json` 刻意不登记(登记了机器也看不见,只多一张没人核的表) |
| `E-xx` 审计发现、`P0-x`~`P3-x` 审计条目、报告六族 `D/R/F/N/U/S`、复审残号 `S1~S14`/`A-x`/`B1~B10`/`T-x`、模拟器差距 `H-x`/`L-x`、`TM-*` 阶段号、`DP-*`、`gen`/`round`/会话临时号 | 写条目本身("原子快照取数"、"队头阻塞"、"台架日志代次 288"、"第 3 轮台架") | 别名表标 `void`;**部分死号故意不进别名表**,好让门禁继续咬残留引用 |
| 规范曾规划却从未启用的前缀族(`DEF`/`WI`/`DR`/`OQ`/`RSK`/`GAP`/`SC`/`GEN`/`MS`/`UL`/`LAT`/`CS` 等) | 同上,写事实 | 无定义,本就不该存在 |
> 想知道某个号还活着吗:跑 `scripts/archive/id_gate/check_ids.py --top 0`,或直接查 `id_aliases.json`——命中 `void` /
> `retired-to-phrase` 就是死号。**看到查不到的号,正确动作是删号留事实,不是补一个定义。**
### 4.2 目标前缀(作废)
2026-10-26 删除:那批"改名后才启用"的前缀族从未有属主登记处,留着只会把读者带到一张不存在的登记表前。
### 4.3 冻结前缀(历史快照,正文不回改)
族还在注册表里、但属主登记处已删的:**只为让冻结历史行不报"未登记前缀"而保留登记**,游标一律冻结,
不得新增、不得复用。
@@ -169,12 +151,6 @@ P-6 号必须能反查到定义(属主登记处得存在)· P-7 编号不语
> ② **唯一已知误判**:`docs/算法/傅氏算法详解.md` 里的数学记号 `N-1`(「一个周波 N 个点」的求和上界)会被
> `N-x` 族命中,属可判定引用、不影响两根护栏,**不清**——清了反而破坏公式。
### 4.5 已删报告的自有族
《项目审查与优化建议报告》2026-10-25 已删除,它自造的六族随之失去定义,且与登记簿同字母不同义。
看到「报告 + 登记簿旧号」这类写法一律按死号处理:删号留事实——各条目原本指向的设计文档就是现在的出处。
---
## 5. 分配、引用、销项
### 5.1 新增编号
@@ -198,70 +174,17 @@ P-6 号必须能反查到定义(属主登记处得存在)· P-7 编号不语
---
## 6. 模块码表
`TC` 与 `TRAP` 共用模块码。唯一事实源是 `scripts/archive/id_gate/id_registry.json` 的族 pattern 与属主文档标题行;
**本文故意不再抄一份**——抄一份就多一处会过期的地方(历史上这张表就长期与代码不同步)。
要加模块码:先改 registry,再在属主文档出现,最后才在别处引用。
## 7. 改号与迁移
### 7.1 映射规则(作废)
"按审计报告把某族整体迁到另一族"那套映射已作废。2026-10-26 的实测结论是:**绝大多数号该删不该迁**。
### 7.2 孤儿编号处置(已完成)
代码有号、文档无号那批已按同一口径处理完:能对上属主表的补模块码,对不上的删号留事实;
**绝不为了少报孤儿而凭空补定义行**(那等于把账做平、把问题藏起来)。
### 7.3 改号操作规程(要动号就照这个走,一步都别省)
1. 走 `scripts/rename_ids.py`:映射表驱动、**显式 scope**、默认干跑、自动写别名条目;
**绝不全局查找替换**——同一裸形字面量可能同属多个族(实测 `S3` 三义),全局替换等于造新撞号。
2. 改完复核**所有识别面**:`check_ids.py` 与 `check_test_traceability.py` 的候选正则上界都要还能匹配新
形态;判据是"编号字面量总数有没有真的变小"(曾经因为正则上界太窄,改完号静默隐形 339 个)。
3. **逐号做语义复核**,不能只看 dry-run 命中数:最阴的失效是"字面改对、意思改错"。
4. 登记表 / 映射表类文件**不得当引用语料**,否则自家审计表里的旧形态会被判成新账。
5. 收尾重打台账 `--prune-backlog`(只减不增),并确认新错误级为 0。
---
## 8. 门禁(2026-10-28 起:只有一道)
**现行门禁 = `id-check-new`**(钩子同名):只查 `git diff` 的**新增行**里有没有未登记形态的
「字母+数字」标识;零语料、零维护。判据、白名单与盲区 → `docs/门禁说明/id-check-new.md`。
本节以下(§8.1~§8.4)是**已退役**的全库语料审计(`id-check`,八项校验)的留档:
本节以下(`编号治理历史.md` §8.1~`编号治理历史.md` §8.4)是**已退役**的全库语料审计(`id-check`,八项校验)的留档:
脚本与两份语料已整体移入 `scripts/archive/id_gate/`,不再进提交门禁,
只在你手工复查「存量编号现状」时才跑。退役理由与判据替换见 §8.5;
八项校验一句话版(历史口径):① 未登记前缀 ② 形态不合规 ③ 悬空引用 ④ 重复定义
⑤ 冻结族越游标 ⑥ 编号未紧邻文档名 ⑦ 孤儿条目(告警)⑧ 可判定比例 + 两根护栏。
### 8.1 当前基线(2026-10-26 编号迁移批次后重打)
| 项 | 数值 |
|---|---|
| 扫描文件 / 编号字面量 | 784 个 / **7,828 处**(2026-10-27 复测;两批清理前 10,956 → 8,230,此后新代码与新文档回涨 553 处,其中测试用例族占大头,见 §9.1) |
| **护栏 1**(报告值,不拦提交):可判定比例下限 `decidable_ratio_baseline` | **86.0%**(2026-10-28 实跑 87.15%;容差 0.1pp) |
| **护栏 2**(报告值,不拦提交):不可判定引用绝对数上限 `undecidable_total_ceiling` | **1,166 处**(2026-10-28 实跑 **1,033** 处;构成拆解见 `docs/门禁说明/id-check.md` §7.7) |
| 校验 1/2/3/4/5/6 错误级 | **0**;债务台账 0 条指纹 → `--strict` 实为**全量拦截** |
| 告警 | 悬空 2(`App/algo/freq.c` 的正序 / 负序记号,属 §4.4 误判面)+ 孤儿 50(陷阱条目这类本就允许无人引用) |
> ⚠ **读这些数字的口径**:跨批次**不可直接相减**。方案 B 把"本可判定的引用"换成散文,分子分母同缩,
> 比例反而从 86.7% 掉到 85.98%,而**不可判定绝对数一处没涨**——护栏 2 就是这么来的。
> **2026-10-28 起两根护栏都只报告、不拦提交**(用户裁定:语料维护的成本已经高过它买到的一致性——
> 近 80 笔提交里 61 笔被编号体系牵连)。数字照样打,但不再决定一笔提交能不能过;
> 硬拦的只剩校验 1~6 的台账外新账。判断"编号有没有变坏"仍看绝对数与字面量总数。退役路线见 §8.5。
### 8.3 改号与清号批次(只留要点)
2026-10-21 五批统一改名(陷阱号归范、主机侧单测认代码为属主登记处、追溯器三档口径对齐);
2026-10-26 两批清号(A:删死号约 1,557 处文本实删;B:登记簿系 20 个号转语义短语约 418 处)。
逐批动机与影响只在 git log 与 `scripts/rename_maps/`,**本文不维护流水账**。要记住的只有两条教训:
门禁曾经把"政策上禁止回改的变更记录行"当活账拦提交;也曾经用比值当唯一护栏而**惩罚清号动作本身**
——两处都在 2026-10-26 修掉了,别再往回改。
### 8.4 台账与 `--strict`
错误级问题按「文件 + 校验项 + 字面量 + 次数」记指纹进 `scripts/archive/id_gate/id_known_backlog.json`,`--strict` 只拦
**台账之外**的新账,台账只减不增。本批台账已还清到 **0 条**——从现在起任何一条新错误级问题都会当场
拦提交,**别指望还有豁免面**可钻。
### 8.5 门禁退役路线(2026-10-28 裁定)
目标不是"关掉检查",而是把成本从**养 99 族语料**降到**禁止新编号**。三步,每步可独立回滚:
@@ -277,196 +200,22 @@ P-6 号必须能反查到定义(属主登记处得存在)· P-7 编号不语
---
## 9. 还剩什么:存量清点与批次(2026-10-27 实测)
**批次一与批次二已于 2026-10-27 执行完毕**,下表保留的是**动手前的清点基线**(用来解释为什么这么分批),
不是当前存量。当前状态:
| 批次 | 范围 | 结果 |
|---|---|---|
| 一 | 登记簿旧号 / 阶段号 / 台架阶段裸形 / 网络条目号 | 活文档清零;顺带清 3 处裸形;位号目录整目录排除 |
| 二 | 保护功能号 28 个 | 代码与测试 215 处 + 文档 194 处 + 配置注释 3 处 + 入口文档 2 处;活文档只剩
**冻结的变更记录行 40 处**与**一处原始串口日志**(真机抓包证据,改它等于篡改现场,永久保留) |
| 三 | 测试用例族 561 站点 | **用户裁定不做**:该族保留,但**即日停发**(游标冻结,新用例不再配号) |
| 五 | 「数据可信」任务卡号 14 个(中文前缀「卡」+ 数字),随注入验证卡销项整族清退 | 全仓 288 站点 / 56 文件改语义短语(代码与测试 191 / 文档 56 / 门禁配置与本文 41),活引用收口 **0**;门禁字面量与不可判定绝对数**零变化**(本族从不在计数内)——换算表与机器面空白见 §9.3(批次四记在上面的复测段,未进本表) |
| 六 | 2026-10-28 复测:在册旧号**活引用归零**,账面**不动基线** | 按 「retired-to-phrase」 与 「void」 两类别名当探针全库复扫(排除门禁自身语料与硬件位号目录):剩余命中面**全部**落在变更记录行(§4.3 不回改)、元器件位号与 Socket 状态组合(§4.4 判非编号,清它等于改硬件资料)、以及属主文档的历史对照列;真编号活引用为 **0**。本笔不重打 §8.1 两根护栏基线(那些数随在飞改动漂移,属各自批次的收口),当日实测三项与命中清单写入 `ci-artifacts/id-metrics-batch-six.txt`(不进语料的口径台账),正文只留结论:剩余命中面另含讲编号的文档里的形态自述,本笔自身两行正文带来个位数增量、远低于护栏上限,两根本基线**均未下调**、零编号增删 |
编号字面量 **8,787 → 7,828**;不可判定绝对数 **1,161 → 982**(上限 1,166,余量从 5 格宽到 184 格)。
比值 86.79% → 87.46% 属**纯稀释**(删的都是可判定引用,分子分母同缩),**基线不下调**,见本节末裁定。
先回答「还有多少号可以清」。下面是**用门禁自己的接口跑出来的**存量(`check_ids.py` 的 Checker,按族统计
「活引用站点 / 不同字面量 / 涉及文件数」;只统计非冻结族、且排除属主登记处的定义位):
| 族 | 引用站点 | 字面量 | 文件 | 集中处 | 处置 |
|---|---:|---:|---:|---|---|
| `TC-*`(含各模块子族)〔动手前基线,非当前存量〕 | **561** | 472 | 77 | 测试用例与断言标签、`test/host/**` | **保留、即日停发**(用户裁定 2026-10-27,见 §9.1 批次三) |
| `L-PROT`(保护功能号) | **184** | 28 | 58 | 保护规划与各模块说明 | 批次二:转语义 |
| `TRAP-*` | **134** | 25 | 51 | 踩坑记录与驱动注释 | 保留(可检索锚点,用户已裁定) |
| `F-*`(网络设计条目) | **38** | 12 | 20 | 动手前 `ch395f.h`、`net_events.c`;**收口后代码侧 0 处** | 批次一:**已转语义**(§7 保留 12 条历史对照 + 新增「条目名」列) |
| `CODE-RULE-*` | **35** | 20 | 13 | 代码规范门禁 | 保留(门禁按号报错) |
| `MENU-STATE-*` | 少量 | — | — | 像素回归脚本 | 保留(脚本按它取状态行) |
| `T-TEST`(台架阶段裸形) | **19** | 4 | 12 | 串口/台架脚本与测试流程 | 批次一:转语义 |
| `N-*`(登记簿旧号残留) | **4** | 3 | 3 | 规范自身与两处脚本注释 | 批次一:清 |
| `TM-*` | **1** | 1 | 1 | 规范自身 | 批次一:清 |
合计:**26 个族仍有引用、565 个不同字面量、1,108 个引用站点**(其余 73 个登记族已零引用或冻结)。
**批次四复测(2026-10-27 14:1x 实测,工作区时点值,含别道在飞改动;口径 = 门禁 `Checker`,属主登记处定义位已排除)**:
| 处置 | 族 | 门禁 refs / 站点 / 字面量 / 文件 |
|---|---|---|
| **保留**(机器把手或用户裁定) | `TC-*` 类 39 个族 | 字面量 **497** / 文件 **81**(对 §9.1 冻结水位 497/81 **持平**,未涨) |
| 保留 | `TRAP-*` | 134 / 282 / 25 / 51 |
| 保留 | `CODE-RULE-*` | 35 / 51 / 20 / 13 |
| 保留 | `MENU-STATE-*` | 7 / 8 / 6 / 2 |
| **已清零**(仅剩「讲编号」的形态自述) | `N-*` `TM-*` | **0 / 0 / 0 / 0**(批次一后无残留) |
| 已清零 | `T-TEST`(台架阶段裸形) | 活引用 **0**;命中全部落在本文与 `.dsh/skills/` 的形态举例里 |
| 已清零 | `L-PROT` 保护功能号 | 活引用 **0**;剩原始串口日志 1 处(冻结证据、永久保留)+ 技能文档形态举例 |
| 已清零 | `FEAT` 网络条目号 | 活引用 **0**;属主文档 §7 编号列 13 条是历史对照,不是引用 |
| **非编号误判**(§4.4,不清) | 版本记号 CMSIS-RTOS 的那个(字母 V 紧跟数字 2)**66 站点 / 31 文件**、幅值记号与 MAC 字节对的 A 形、活表代号 E 形、Socket 状态组合 U 形、测频正/负序记号 S 形、傅氏求和上界 N 形 | 合计约 **1,100** 站点被宽松正则顺伤 |
| **冻结历史波次号**(§4.3 正文不回改) | 字母 B/C/D/W/M/R/G/O + S-REVIEW/E-EXP/A-AUDIT/D-DOC 等 16 个已冻结族 | 合计约 1,500 站点;**无连字符 → 按 §4.4 判据本就不是编号** |
合计:**44 个族仍有命中站点**,其中真编号活引用只剩上面「保留」四行;批次一/二涉及的四个族活引用均已归零。
**批次四做了三件事**(本轮指令:「把能清的族清掉一批」):
1. **关掉已清退族的发号口**:`L<n>-<nn>` 与 `F-<MOD>-<nn>` 从 §4.1『允许继续发号』**整行移出**(7 行 → 5 行),在『已停发、存量待清』各补一行硬口径——留着那两行,扫表的人照样照着发号(同 `TC-*` 那次的教训)。**机器面已探针复核**:`_check_dangling` 对「L 段号形态的新号」与「F 条目号形态的新号」各写一个,全部命中 §8 校验 3 **错误级**(台账 0 指纹 → 等于拦提交),所以不需要再冻结数值游标(各段最高号不同,单一数字游标反而放行低号)。
2. **本文自述形态化**:把本文里 4 处「字母 T 紧跟数字」与 2 处 DRV 段孤儿号的**字面量写法**改成形态描述(lesson 不丢),使这四个族的门禁命中数真正归零,而不是停在「只有规范自己在引用」。
3. **登记机器面还空着的那一面**:`scripts/archive/id_gate/id_registry.json` 给 `L-PROT`/`FEAT` 补 `retired` 字段;给 `T-TEST` 补 `cursor_note` 写明——它的 pattern 最高只到数字 3,**即使 `frozen: true` 校验 5 也碰不到任何新写法**(探针实测写 4 不响),所以该族停发今天只有 §3.3 禁令 + 评审两道兜底,**别把「存量已清零」读成「机器已关闭」**。
> ⚠ 本轮执行期间另有一道并行改动落地:`docs/测试说明/boot_log_data/README.md`(登记簿旧号「启动日志固化流程」)与 `docs/测试说明/m2_data/README.md`(审计发现 E 族一处死号)已由该道改为语义短语——**本笔不重复改这两处、也不替它收口**;复测两处死号引用均为 0。
§8.1 的 7,828 是当日更早时点值;本轮 14:1x 复测 **791 文件 / 7,931 字面量 / 不可判定 982(上限 1,166,余量 184)/ 可判定 87.61%**——增量全部来自别道在飞的新代码与新文档,本笔净效果是**只减不增**。
### 9.1 三批计划(按「值不值得动门禁」排序)
**批次一 · 现在就能清(约 62 个站点 / 20 个字面量,不碰任何门禁)**:`N-*`、`TM-*`、`T-TEST`、`F-*`。
> `F-*` 已于 2026-10-27 收口:映射 `scripts/rename_maps/batch7-f-net-semantic.json`(10 条**带上下文**的定点改写),`docs/网络/网络自愈架构设计.md` §7 加「条目名」列作权威对照,13 个旧号进 `scripts/archive/id_gate/id_aliases.json` 标 `retired-to-phrase`。
> 作用域刻意只列 2 个文件、且 `old` 全部带上下文——同树里 `docs/硬件平台/` 的 **变压器位号(字母 T 紧跟数字)**(网表 ~4200 处 R/C/D/J/X/U/T 位号,本就不在门禁语料内)、`docs/芯片手册/` 的时序记号,以及各文档 Mermaid 图的**单字母节点名**(`F -->`、`EV`、`LN`…)都会被宽松正则顺伤;变更记录行(`BSD_Socket_API_使用指南.md` 的 `| 2026-10-13 |`)按 §8.1 豁免不改写。
这四族**没有任何脚本按字面量匹配**,纯人读,正是「语义标识最好」的适用面;台架阶段族还是裸形(字母 T 紧跟一位数字),
最容易与别的字母撞义。改法:号 → 短语(「台架阶段一」「网络自愈:监听生命周期」),残留引用同步清,
别名表标 `void`,台账 `--prune-backlog`。
**批次二 · 文档为主、量大(约 184 个站点 / 28 个字面量)**:`L-PROT` 保护功能号。它**曾有**明确价值
(功能复现规划逐条对齐),但用户已裁定字母号难认 ⇒ 改成功能名本身(「过流Ⅰ段」「零序过流」),
规划表首格写功能名、不再配号。要点:必须**按功能逐个改**,不能全局替换(同一号在不同文档指同一功能,
但句子结构不同);改完用追溯器复核代码侧没有残留号引用。
**批次三 · 用户裁定 2026-10-27「不做」:`TC-*`(561 个站点 / 472 个字面量 / 77 个文件)保留现状**。
裁定记录(原话:「**批次三,不坐**」,即批次三不做)。留着的理由与今天的定调并不矛盾,而是它的前提:
`TC-*` 是本规范 §4.1 那条判据**唯一真正满足它的族**——`check_test_traceability.py` 与 40 套 `run_unit_test.py`
**按字面量读它**,C 断言标签、测试函数名、文档用例表三处同一号,是「代码 ↔ 文档」双向核对的机器把手。
清它的代价不是改文本,而是**换掉追溯机制**:候选方案「用例名即标识」(`test_xxx_yyy()` ↔ 文档表格行名,
脚本按名字比对)要把追溯门禁重写并重打基线,收益是字母号一次少掉一半以上,代价是**期间测试与文档的
对应关系处于断裂态**——本仓测试是提交门禁(`test-coverage` 跑全部 40 套并守覆盖率基线回退),拿它做
不可逆试验不值。**结论:机器面自解释的族可以保留;字母号的痛在「人读」侧,解法是别再造给人读的号,
而不是把机器面的把手也拆掉。**
「不做」之后跟着三条硬口径(否则裁定会被当成默许继续扩族):
① **本族即日停发**:现存号只减不增,**新用例一律用语义化测试函数名 + 文档表格行名,不再配 `TC-` 号**
(机器口径已同批落地:见本节末「机器口径已落地」与 §4.1 框内第三条);
同一笔把 `TC-*` 从 §4.1『允许继续发号』表里**整行移出**(只在『已停发』栏留一行)——留在那张表里,
脚注写得再重,扫表的人照样照着发号;
② **停发 ≠ 待清**:现存号与 registry 登记一律保留、不清、不复用(机器追溯把手 + §1「不回收、不复用」);
引用既有用例仍可用旧号,新用例不配新号;
③ 若将来真要清,按 `scripts/rename_ids.py` + §7.3 五步**单独开卡**,前提是先让追溯器同时认两种形态
(新旧并行核对通过,再谈切换),**不许先改文档再改代码**(会凭空造出悬空号,§8 校验 3 会当场拦)。
**这条裁定的机器口径已落地(2026-10-27 同日补;上一版这里写「停发今天只有规范效力」,那是当日的实测记录,不是笔误,留作历史)**:
`scripts/archive/id_gate/id_registry.json` 的 **37 个 TC 类族已全部 `frozen: true`**,其中 **34 个 `TC-HOST-*` 子族带游标**,冻结在
裁定日该套件存量最高号;5 个游标低于存量的已抬到水位(`TC-PROTELEM-013→015`、`TC-SYSLOG-108→137`、
`TC-ADCHEALTH-011→023`、`TC-ADCCAL-017→023`、`TC-I104SRV-041→053`),裁定理由记在 registry 顶层
`tc_freeze_2026_10_27`。落地的直接诱因是本族在裁定当天还在长大:另一道在飞的 `time_sync` 改动新增了
`TC-TIMESYNC-0xx`(撞的是 §8 校验 3 悬空引用而非校验 5——那个模块码没有专属子族,正落在主族 `TC` 的空白面上)。
**冻结水位(只减不增)**:TC 类族按门禁 refs 口径(字面量 × 文件去重,属主登记处与本文写法示例不计)——
动手前基线 **561 站点 / 472 个字面量 / 77 个文件**;本笔落地时工作区实测 **590 / 497 / 81**(站点 / 字面量 / 文件)。
**差出来的 29 站点全部是裁定之后仍在配号的在飞改动**(`time_sync` 一道的 `TC-TIMESYNC-` 新号),这正是水位
必须落到纸面的理由:**从本笔起任何一次上涨都要问「这号是谁在停发之后发的」**。重测:跑 `check_ids` 的 Checker,
取 `ck.refs`(注意它是**属性**不是方法),把字面量按 `class == "TC"` 各族 `pattern` 归族后聚合。
⚠ 上面两个数都是**工作区时点值**(本笔 = 2026-10-27 12:40,含别人在飞的改动)——提交收口时按当时工作区**重打一次**,
别把这个数当长期基线;**也不要为了把数字压回 561 去改别道在飞的文件**。
**门禁侧复核**:`check_ids.py --only 5` 校验 5 = 0 处(冻结没有误伤存量);plain 与 `--strict` 的错误级 findings
与本笔之前逐条相同;`id_known_backlog.json` 台账 0 条;可判定比例 87.67%(基线 86.0%)、不可判定绝对数 979(上限
1,166)。本笔零语料增删,**不动 §8.1 两根护栏基线**(§8.1 的 7,828 处字面量会随在飞改动漂移,那属各自批次的收口)。
**还剩下的那一面(别把「机器已冻结」读成全族无死角)**:主族 `TC` 的 `cursor` 仍为 `null`——一个游标表达不了每个
模块码的水位,写全族最高号反而放行低号,所以按空白登记;这一面由校验 3(新号无定义位 = 悬空,错误级)、上面的
冻结水位、以及评审三条兜住。**「反正门禁主族咬不到我」不是发号许可。** 要把这面也机械化(按模块码克隆子族,或给
族级加字面量上限),与「真要清退」一样属追溯机制改造,按 §7.3 单独开卡。
### 9.2 别再做什么
「编号说明」这件事本身应该继续变薄:每多一个族,就多一处需要有人记得它的地方;每多发一个号,就多一个
将来没人敢删的字符串。要新增族之前,请把 §4.1 的「允许继续发号」那 5 行当作反对你的第一手证据。
### 9.3 批次五换算表:「数据可信」任务卡号(2026-10-27 整族清退)
用户指令(2026-10-27):「**数据可信.md 已经完成的内容请进行销项删除,去除相关编号**」。两件事同做:
1. **销项**:`docs/任务规划/数据可信.md` §5 里 2026-10-27 台架闭环的「已知电压注入验证」行**删行**。
上一笔曾特意标 ✅ 保留,理由是该行被 `App/task/adc_task.c` 的 v3.3 修订行按卡号当口径出处引用;
引用侧改成语义短语后该理由不再成立 → **例外撤销**。判据与实测记录的属主 =
`docs/硬件平台/ADC通道映射说明.md` §8.1(六项判据全 PASS、斜率 6544.2 码/V、偏差 −0.14 %),
执行侧 = `docs/测试说明/ADC前端注入验证流程.md`(含两项残留口径与残差表)。
2. **整族清退**:「卡」+ 数字 1~11 那 11 行早在 2026-10-25 就删完了,代码注释里剩下的这种形态今天
**查无此行**——按 §4.1.1 末句,正确动作是**删号留事实**(换成语义短语),不是回去补一个定义。
| 旧号形态 | 语义短语 | 现行口径出处 |
|---|---|---|
| 「卡」+ 数字 0 | 已知电压注入验证 | `docs/硬件平台/ADC通道映射说明.md` §8.1(✅ 2026-10-27,已销项删行) |
| 「卡」+ 数字 0b | 端子/子板变比确认 | `docs/任务规划/数据可信.md` §5;缺口面 = `docs/硬件平台/ADC通道映射说明.md` §7.1 链路分段表 ④ 行 |
| 「卡」+ 数字 1 | 量程口径冻结 | `docs/任务规划/数据可信.md` §2.1 |
| 「卡」+ 数字 2 | 标定折算落地 | `docs/任务规划/数据可信.md` §4.1 |
| 「卡」+ 数字 3 | 有符号零点类型(CFG_VAL_INT) | `docs/任务规划/数据可信.md` §4.4 |
| 「卡」+ 数字 4 | 标定落盘与整定入口 | `docs/任务规划/数据可信.md` §4.4 |
| 「卡」+ 数字 5 | 未标定即闭锁 | `docs/任务规划/数据可信.md` §4.3 |
| 「卡」+ 数字 6 | 下游常数按工程量重定 | `docs/任务规划/数据可信.md` §2.3 |
| 「卡」+ 数字 7 | 量纲回归用例 | `docs/任务规划/数据可信.md` §3 退出判据第 ⑥ 条;用例在 `test/host/prot_dim` |
| 「卡」+ 数字 8 | 遥测快照发布 | `docs/任务规划/数据可信.md` §4.5 |
| 「卡」+ 数字 9 | 104 改读快照 | `docs/任务规划/数据可信.md` §4.5 |
| 「卡」+ 数字 10 | 运行参数段 | `App/algo/run_par.h` 头注释 + `docs/子系统设计/IEC104上行设计说明.md` |
| 「卡」+ 数字 11 | 频率点绑定 | `docs/子系统设计/IEC104上行设计说明.md` 的 `0x401D` 行 |
| 「卡」+ 数字 12 | 两点标定 | `docs/任务规划/数据可信.md` §5(未开始,等标准源) |
**本表把形态写成「卡」+ 数字、不复述字面量**:本文是门禁语料,复述形态会把"讲规则的文档"变成
自己的引用站点(§9.1 批次四第 2 条同一条教训);要查旧号,看左列形态 + 属主文档的历史行。
- **旧号永久作废、不得重新取走**:这一族**没有机器识别面**(中文前缀不进语料),停发今天只有
§4.1.1 本行 + 本表 + 评审兜住。要机械化,得先给"中文前缀 + 数字"设计候选形态——那与 §9.1 末尾
「族级加字面量上限」同属追溯机制改造,**按 §7.3 单独开卡**,别夹在清退批里顺手做。
- **同形态不同属主**:`docs/任务规划/UI补齐.md` 的条目现在写「第 N 项」,历史上被别处写成同一形态的
4 处(其实指已入库的 `[comm]` 段前置项)已随本批改成不带号的语义形态。同一裸形态跨两个属主文档,
正是 §4.1「别拿同形当同族」的实证——清号必须**按属主文档逐处判语义**,不许全局查找替换。
- **不在本批的**:里程碑号(字母 M + 数字)与并行道号(道A/道D/道G)一律保持原样,是否清退等用户
单独裁定,**不要顺手做**。
## 10. 速查
- 看到一个不认识的号 → 先查 `id_aliases.json` 与属主登记表;查不到就**删号留事实**,不要补定义。
- 想给待办 / 缺陷 / 差距 / 风险发号 → 不许,写短语(§3.3)。
- 想知道「还有多少号可清」→ 看 §9 的存量表与三批计划。
- 想知道「还有多少号可清」→ 看 `编号治理历史.md` §9 的存量表与三批计划。
- 想给文档内步骤或测试阶段发号 → 不许,写「步骤 3」「阶段 7」(§3.3)。
- 想新增前缀族 → 先回答"哪个脚本要按字面量匹配它"(§4.1);答不出就别建。
- 要改号 → `scripts/rename_ids.py` + §7.3 五步。
- 要改号 → `scripts/rename_ids.py` + `编号治理历史.md` §7.3 五步。
- 门禁报错读不懂 → `docs/门禁说明/id-check.md`。
---
## 变更记录
> 2026-10-28 以前的流水(编号族清退的每一批、每批的实测数字)已移入
> `scripts/archive/id_gate/编号治理历史.md` 的「变更记录」节——要查某个号是哪一批退的,去那里。
| 日期 | 变更 | 说明 |
|---|---|---|
| 2026-10-28 | **编号门禁第三步收口:全库语料审计退役(钩子 52 → 51)** | 用户裁定跳过观察期直接做。`check_ids.py` 与两份语料(`id_registry.json` 87.6 KB / `id_aliases.json` 187 KB)+ 债务台账整体移入 `scripts/archive/id_gate/`(附归档 README,含"为什么退役 / 现在用什么 / 怎么手工跑");`id-check` 钩子摘除,现役编号门禁只剩 `id-check-new`(只查新增行)。连带改:`rename_ids.py` 的别名表路径指向归档、新门禁排除面加 `scripts/archive/`、`doc-links` 跳过 `.mnemon/` 与 `ci-artifacts/`(本地状态与草稿,非项目文档)、`id-check.md` 加退役横幅、`门禁说明/README` 与 `AGENTS` 的钩子数三数对齐(声明 51 / commit 阶段 50 + gitlint 1)。归档脚本从新路径实跑:811 文件 / 8,051 字面量、`--strict` rc=0。 |
| 2026-10-28 | **编号门禁第二步落地:新增行拦截(零语料)** | `scripts/check_ids_new.py` + 钩子 `id-check-new`:只看新增行,破折形态未知前缀 FAIL、已停发族只 WARN、单字母+数字放行(元件位号同形,见该门禁 §6 盲区)。白名单是**前缀级**两张表(活族 11 条 / 器件与协议约 90 条),不是字面量账本——后者会退化成 `id_aliases.json` 的老路。调参依据:最近 80 笔真实提交回放,未知形态 15 种(12 种是设备与协议名、3 种是停发族),调好后误报 0;自检 5 正例 + 29 反例。与 `id-check` **双跑**一个观察期后再按 §8.5 ③ 退役旧语料。 |
| 2026-10-28 | **编号门禁减负第一步:两根护栏转报告制** | 用户裁定「编号门禁每次浪费很多时间」→ 先摘掉语料审计的强制面。护栏 1(可判定比例基线)与护栏 2(不可判定绝对数上限)自此**只打印、不拦提交**;实测把基线调到 99.9%、上限调到 1 处,退出码仍为 0。硬拦只剩校验 1~6 的台账外新账(同一实测:新文件里写一个自造前缀 + 数字,校验 1 与增量拦截照旧 FAIL)。退役路线 ①②③ 写进 §8.5;减负依据 = 近 80 笔提交有 61 笔被编号体系牵连、语料共 99 族(78 族已冻结)。 |
| 2026-10-28 | **变更记录行里已停发/作废族的示例编号改形态描述;并用门禁自身计数器把「这一笔能不能压下不可判定绝对数」钉死为零** | 用户指令:把变更记录行里已停发族的那几枚示例编号改成语义形态描述,并确认它让不可判定引用绝对数净减、不是只算自己这一笔。**实测裁定:净减 = 0**。门禁把「表格首格是日期」的行整行豁免于编号判定(registry 侧的变更记录豁免,本笔前全库已豁免 198 处站点),本表的示例编号从来不进引用总数分母,改它必然不动绝对数——改前改后同一个计数器均为 **1003**(上限 1166;可判定 87.43%,三项都是 2026-10-28 本回合实测)。唯一移动的是那行豁免计数本身(本文件少 1 处站点),把它当清退成果就是把自记账成全局减量,正是本笔要排除的错法。本文对该计数器的全部贡献 **6** 处,逐文件集合差实测:全是「非编号」判定栏里既定的噪声名与裸形盲区(哈希算法名、总线名、严重度档位、硬件位号),不是编号,不清。本笔动的 3 处只是写法:作废的网络条目孤儿号(F 前缀 + 模块码段 + 数字序号三段)与已删报告的 UI 簇(字母 U 紧跟一位数字,区间两端即该簇首尾两枚);事实本体仍在别名表、registry 游标备注与 git 历史,一处没丢。刻意不动:硬件位号形态的举例(判非编号)、保留现存号族的冻结游标数字(冻结水位的证据本体)、其它文档与注册表里的同名字段(各自写域)。§5.5 同步写死该例外的硬口径。零代码、零编号增删、两根护栏基线均未调整。 |
| 2026-10-27 | **批次五:「数据可信」任务卡号整族清退 + 注入验证卡销项删行** | 用户指令「数据可信.md 已经完成的内容请进行销项删除,去除相关编号」。实测 **288 站点 / 56 文件**(代码与测试 191 / 文档 56 / 门禁配置与本文 41)全改语义短语;§5 表首列由「序」改「标识(任务名)」、14 个旧号进 §9.3 换算表;顺带按属主文档判语义清掉同形态的悬空引用 4 处(「UI 补齐」波次的 `[comm]` 段前置项)。门禁面:编号字面量与不可判定绝对数**零变化**(中文前缀不在语料),收口复跑 `check_ids.py --strict` 与 `check_doc_links.py --all --sections-strict` |
| 2026-10-27 | **批次四:`L-PROT` / `FEAT` 发号口关闭(§4.1 七行→五行)+ 本文自述形态化 + 登记 `T-TEST` 机器面空白** | 用户指令「语义标识已定为默认形态,看看还有哪些编号族仍被引用、各自还剩多少,把能清的族清掉一批」。按门禁 `Checker` 实测三口径重打 §9 存量表:**真编号活引用只剩 `TC-*`(保留、水位 497/81 未涨)、`TRAP-*`、`CODE-RULE-*`、`MENU-STATE-*` 四族**,批次一/二涉及的 `N-*`/`TM-*`/`T-TEST`/`L-PROT`/`FEAT` 活引用均已归零。本笔:① §4.1 把 `L<n>-<nn>`、`F-<MOD>-<nn>` 从『允许继续发号』整行移出并在『已停发』栏各写一行(含探针证据:新形态号 → 校验 3 错误级);② 本文 6 处形态自述改「字母+数字」描述,使四个族门禁命中归零、lesson 不丢;③ registry 给 `L-PROT`/`FEAT` 补 `retired`、给 `T-TEST` 补 cursor_note(pattern 上限即 3 → 冻结游标是空操作,停发今天只有规范效力);④ 分类登记 §4.4 误判面(版本记号 / 活表代号 / 状态组合 / 位号)与 §4.3 冻结波次号两类**不清**的理由。未改门禁判定逻辑、未动冻结历史与原始串口日志、未新增任何号。 |
| 2026-10-27 | **批次一 `F-*` 收口:网络设计 12 个条目号转「条目名」语义短语,§7 表加「条目名」列为权威对照** | 用户指令「把网络设计里的 `F-*` 条目号换成语义短语,别改坏硬件资料的 T1/T2/T3 位号和 Mermaid 节点名」。走 `scripts/rename_ids.py`(映射 `scripts/rename_maps/batch7-f-net-semantic.json`,`--no-alias` 后手工写别名),10 处定点改写=属主文档正文 9 处(含 1 处孤儿号删号留事实)+ `test/host/net_socket/net_socket_test.c` 注释 1 处;孤儿号(F 前缀 + 模块码段 + 数字序号的三段形态;§7 从无定义行)删号留事实、不补定义;13 个旧号标 `retired-to-phrase`。刻意不动:§7 编号列(历史对照)、`BSD_Socket_API_使用指南.md` 变更记录行、`docs/硬件平台/` 位号、Mermaid 节点名。`scripts/archive/id_gate/id_registry.json` FEAT `cursor_note` 改记停发口径(三模块各有最高号 → 不冻结游标的理由写在里面)。零代码语义变更。 |
| 2026-10-27 | **停发机械化落地:34 个 `TC-HOST-*` 子族游标冻结,§8 校验 5 开始咬新配的 TC 号** | 上一笔把缺口登记为「停发今天只有规范效力」并写明机械化怎么做;本笔照它落地、把话兑现:`scripts/archive/id_gate/id_registry.json` 37 个 TC 类族全部 `frozen: true`,34 个子族的 `cursor` 冻结在裁定日存量最高号(字符串形态——整型比较静默不生效;5 个低于存量的已抬:`TC-PROTELEM-013→015`、`TC-SYSLOG-108→137`、`TC-ADCHEALTH-011→023`、`TC-ADCCAL-017→023`、`TC-I104SRV-041→053`),理由记在顶层 `tc_freeze_2026_10_27`。探针(Checker `_check_frozen`):在 `TC-PROTSET-` 段存量最高号之上再加一号 → 命中 1 条校验 5,写存量最高号本身 → 零误伤;`check_ids.py --only 5` = 0 处;plain 与 `--strict` 的错误级 findings 与本笔前逐条相同(**12 条 `TC-TIMESYNC-0xx` 悬空引用属另一道在飞的 time_sync 改动,不在本笔写域,也没替它改**);台账 0 条、可判定 87.67%、不可判定 979 / 上限 1,166,不动 §8.1。**没有把主族 `TC` 说成已冻结**:它 `cursor` 仍为 `null`,§4.1 框内第三条与 §9.1 末段把这块空白及其兜底(校验 3 + 冻结水位 564/474/79 只减不增 + 评审)写明,并规定「给这些模块补号即使在文档里补了定义行也算违令」。§9.1 末段由「效力边界」改写为「机器口径已落地」,当日实测留作历史不抹。零代码、零编号增删。 |
| 2026-10-27 | **停发口径收口:`TC-*` 从『允许继续发号』表整行移出,并登记「机器面还没冻结」这个缺口** | 裁定上一笔已入档,但效力写在了会被扫表读过的地方:`TC-*` 仍占着「允许继续发号」表第一行、用途列还写着「要进 C 断言标签」,那句"注意它已停发"只是表前的脚注;而那张表连表头行都在早先瘦身时丢了(GFM 里表格不能紧跟段落,整张塌成正文)。本笔:① 移出该行、补回表头与空行,『允许继续发号』写成**恰好 7 行**;② 表下加防误读框,把「不做了」的两条误读各钉一次——「维持原状所以还能发」与「停发所以顺手清掉/复用号」,并写明唯一重启入口 = 先裁定再回本节改表;③ 实测登记效力边界:registry 37 个 TC 类族仍有 35 个 `frozen: false` 带活游标,§8 第 5 项碰不到它们(且 `cursor` 为空时该校验直接跳过),所以停发今天只有规范效力,机械化单独开卡走 §7.3;④ §5.1 补「不在 7 行内第 ① 步就走不通」、§9.1 两条硬口径扩成三条(新增「停发 ≠ 待清」)并补效力边界段、§9.2 计数 8 → 7。同步:`AGENTS.md` 索引行、`docs/测试说明/测试文档模板规范.md` §6.3、`docs/门禁说明/host-unit-tests.md` §7 号段行(那里原文写着「新增用例要带号」,是最直接的误读源头)。零代码、零编号增删。 |
| 2026-10-27 | **批次三裁定「不做」:`TC-*` 保留现状但即日停发** | 用户原话「批次三,不坐」(即不做)。裁定写进 §9.1 批次三(含理由与两条硬口径)、§4.1『已停发』栏加一行、§9 结果表同步。停发的硬口径:游标冻结、现存号只减不增、**新用例一律用语义化测试函数名 + 文档表格行名,不再配 `TC-` 号**;真要清则先让追溯器同时认新旧两种形态、核对通过后单独开卡,不许先改文档再改代码(会造悬空号)。留着的判据依据:`TC-*` 是 §4.1 那条判据(有脚本按字面量匹配)唯一真满足的族,字母号的痛在「人读」侧,解法是不再造给人读的号,而不是拆掉机器面的把手。 |
| 2026-10-27 | **语义标识定为唯一默认形态;编号收窄为「机器按字面量匹配」的例外,并首次给出现量清点与三批计划** | 用户原话:「不要用字母加数字的编号,简直太难以理解了,语义标识是最好的」。本笔:① 标题下的一句话从「允许用号的族只有 8 个」改成「语义标识是唯一默认、编号是例外」,并把 §4.1 拆成『允许继续发号』8 族与『已停发、存量待清』4 族(`N-*` / `TM-*` / 台架阶段裸形 / `F-*`)——原表自称穷举,实际漏登记了这三类在用族,属真缺陷。② 新增 §9 存量清点(用门禁自身接口实测:26 族仍有引用、565 个字面量、1,108 个引用站点)与三批计划:批次一 62 站点不碰门禁即可清、批次二保护功能号 184 站点转功能名、批次三 `TC-*` 561 站点需先换追溯机制(等用户裁定)。③ §8.1 基线按 2026-10-27 复测重打:784 文件 / 7,828 字面量、护栏 2 实跑 1,161 / 上限 1,166。 |
| 2026-10-26 | **编号治理收口:清死号 → 停发活号 → 本文重写为短版(用户三次裁定)** | 全仓字母+数字编号 10,956 → 8,230 处。① **清死号**:属主登记处已删或从未启用的号一律就地删号留事实、禁补号(文本实删约 1,557 处)。② **停发活号**:登记簿 `N-x`/`S-x`/`T-x`、专项(A 前缀 + 数字)、已删报告的 UI 簇(字母 U 紧跟一位数字,区间两端即该簇首尾两枚)共 20 个号转成语义短语(约 418 处)——登记簿表首格就是短语,旧号进 `scripts/archive/id_gate/id_aliases.json` 标 `retired-to-phrase`;已销项的死号**故意不进别名表**,让门禁继续咬残留引用。③ **本文瘦身**:619 行 → 229 行,删掉八原则长表、迁移映射表、模块码表与门禁细节(那些各有事实源:registry / 别名表 / `docs/门禁说明/id-check.md`),改成「先问三句再决定要不要发号」+ §4.1 允许用号的族**穷举 = 8 个**。④ **门禁配套**:`check_ids.py` 加变更记录行豁免与第二根护栏 `undecidable_total_ceiling`(比值会被清号动作稀释,绝对数不会),债务台账还清到 0 条 → `--strict` 实为全量拦截,比例基线重打为 86.0%。**本表按用户 2026-10-26 的明确指示只保留最近一条**,更早沿革看 `git log` 与 `docs/门禁说明/id-check.md` §7.5(含其后的方案 B 一节);这是**本文档的例外**,不改变 §5.5对其他文档「冻结历史不回改」的约束。 |
| 2026-10-28 | **门禁三步退役 + 本文瘦身** | ① 两根护栏(可判定比例 / 不可判定绝对数)转报告制,不再拦提交;② 全库语料审计换成「只查新增行」的 `id-check-new`(零语料);③ 99 族语料与脚本移入 `scripts/archive/id_gate/`,钩子 52 → 51。本文同步从 36 节 / 58 KB 瘦到只留现行口径(约 150 行),过程记录与换算表进归档。 |
+1 -1
View File
@@ -129,7 +129,7 @@
现存号只读、不清、不复用。追溯器只双向比对已有集合,**不会**因为新用例没号而报错——别把它当"要带号"。
**机器口径同日已落地**:`scripts/archive/id_gate/id_registry.json` 37 个 TC 类族全部 `frozen: true`,34 个子族游标冻结在 2026-10-27 存量最高号,
在号段上再加新号 = `id-check` 校验 5 错误级;无专属子族的模块码落在主族 `TC`(游标仍为空),那一面由校验 3 + 冻结水位 + 评审兜住
→ `docs/编号规范.md` §4.1 末框与 §9.1 末段。
→ `docs/编号规范.md` §4.1 末框与 `scripts/archive/id_gate/编号治理历史.md` §9.1 末段。
## 8. 改这套门禁本身(新增一个模块的宿主单测)
+2 -2
View File
@@ -132,7 +132,7 @@
- **可判定比例为什么上涨**:这些族的属主登记处已删 → 字面量原本**进分母、不进分子**。删掉这类"判不了"
的引用,分母缩小,比例自然上升。⚠ **这不等于"编号卫生变好了"**——真证据是**编号字面量绝对数下降**
(清理前 10,956 → 现在 8,230)**且**校验 2/3/6 的存量同时下降。只报比例不报绝对数,就是自欺。
- **族不是越多越好**:`docs/编号规范.md` §4.1 现在只列「有属主登记处、且全仓真有引用」的族;原 `docs/编号规范.md` §4.2 那 15 个
- **族不是越多越好**:`docs/编号规范.md` §4.1 现在只列「有属主登记处、且全仓真有引用」的族;原 `scripts/archive/id_gate/编号治理历史.md` §4.2 那 15 个
「改名后才启用」的目标前缀已作废——**空族会骗人**:读者看到 `DR-001` 就会去找一张根本不存在的登记表。
- 要加一族:先改 `docs/编号规范.md` §4.1,再改 `id_registry.json`,两处同一批提交(`docs/编号规范.md` §5.1 第 1 步)。
- **本批顺带补了「变更记录行」豁免**(`CHANGELOG_ROW`:表格首格是日期、或「(规划稿)」):
@@ -148,7 +148,7 @@
对门禁的三件事:
1. **族保留登记、只停发**(游标冻结不前进)。不为"看着干净"而删族:删族后历史行与别名表里的旧号会立刻
报「未登记前缀」,等于把清理变成制造新账(与 `docs/编号规范.md` §8.3 记的「快照族先补定义位」同一方向的教训)。
报「未登记前缀」,等于把清理变成制造新账(与 `scripts/archive/id_gate/编号治理历史.md` §8.3 记的「快照族先补定义位」同一方向的教训)。
2. **旧号进 `id_aliases.json` 标 `status: retired-to-phrase`**(不是 `void`)——区别在于条目还活着,
只是不再用号指它。门禁两者都只当"可解析",**都不许再被活文档引用**。
⚠ 反过来,那批**故意不进别名表的死号**(FTP 鉴权那个旧号):进了就等于把残留引用永久洗白;
+1 -1
View File
@@ -32,7 +32,7 @@
| 脚本 | 作用 |
|---|---|
| `rename_ids.py` | **编号(字面量)批量改名**:映射表 JSON 驱动,`files` 显式 scope(同一裸形字面量可能属多族,实测 `S3` 三义 → 全局替换必造新撞号);默认干跑,`--apply` 落盘并自动写 `id_aliases.json` 的 scoped 旧号→新号条目;`[示例]`/`[计划]` 行与变更记录表不改写;按原字节读写(保 BOM 与行尾)。用法与批次记录 → `docs/编号规范.md` §8.3 |
| `rename_ids.py` | **编号(字面量)批量改名**:映射表 JSON 驱动,`files` 显式 scope(同一裸形字面量可能属多族,实测 `S3` 三义 → 全局替换必造新撞号);默认干跑,`--apply` 落盘并自动写 `id_aliases.json` 的 scoped 旧号→新号条目;`[示例]`/`[计划]` 行与变更记录表不改写;按原字节读写(保 BOM 与行尾)。用法与批次记录 → `scripts/archive/id_gate/编号治理历史.md` §8.3 |
| `rename_ref.py` | **改名/挪目录 + 全库引用自动改写**:默认 dry-run 预览,`--apply` 才落盘(`git mv` → 改写引用 → 自动跑 `check_doc_links --all` 复核)。覆盖反引号引用、Markdown 链接、图片 `../` 层级换算、`#include`、`uvprojx`/`CMakeLists.txt` 源列表。固定动作与边界 → `docs/文档规范.md` §3.6 |
> `check_doc_links.py` 除链接存在性外,还校验 **`§N.M` 章节引用**是否指向目标文档真实存在的编号标题(口径见 `docs/文档规范.md` §3.5)。
@@ -0,0 +1,295 @@
# 编号治理历史(2026-10-28 归档)
> 这是 `docs/编号规范.md` 在瘦身前(36 节 / 58 KB)的**过程记录**部分,逐字搬迁、未改写。
> **不是现行口径**:现在的做法只看 `docs/编号规范.md`(约 120 行);
> 门禁也已换代(全库语料审计 → 只查新增行),见 `docs/门禁说明/id-check-new.md`。
> 留它的唯一理由:批次清点、换算表、改号规程这些东西,将来要复查时还找得到原文。
## 归档目录
- `§1` 这四类事故就是上面三条的由来
- `§2` 八条设计原则(一句话版)
- `§4` 目标前缀(作废)
- `§4` 已删报告的自有族
- `§6` 模块码表
- `§7` 改号与迁移
- `§7` 映射规则(作废)
- `§7` 孤儿编号处置(已完成)
- `§7` 改号操作规程(要动号就照这个走,一步都别省)
- `§8` 当前基线(2026-10-26 编号迁移批次后重打)
- `§8` 改号与清号批次(只留要点)
- `§8` 台账与 `--strict`
- `§9` 还剩什么:存量清点与批次(2026-10-27 实测)
- `§9` 三批计划(按「值不值得动门禁」排序)
- `§9` 别再做什么
- `§9` 批次五换算表:「数据可信」任务卡号(2026-10-27 整族清退)
---
### 1.2 这四类事故就是上面三条的由来
1. **同一字母多义**:`P1` 五义、`L1` 四义、`U1` 四义、`D7` 与元器件位号同形 → 前缀必须按**事物类别**
分配(§2)。
2. **属主文档一删,号全体成孤儿**:审计报告删除后,全仓几百处引用再也查不到定义 → 号越少,这种
"集体失效"的爆炸半径越小(§4.5)。
3. **语义塞进号里**:条目事后降级,改号则引用全断、不改则号实不符 → 号不承载语义(P-2)。
4. **销项号被复用**:登记簿删行后仓库里毫无痕迹,下一个条目顺手取走同号 → 不回收、不复用,
改用**语义标识**(短语自带唯一性)。
---
## 2. 八条设计原则(一句话版)
**P-8 语义优先**压过其余七条:**给人看的条目一律不发号**。其余七条只在"确实要发号"时生效——
P-1 前缀 = 事物类别(不是来源文档 / 审计轮次)· P-2 号不承载语义 · P-3 一个事实一个号 ·
P-4 规范形态唯一(连字符与补零不承载语义,写法只许一种)· P-5 只增不复用,新增先取游标 ·
P-6 号必须能反查到定义(属主登记处得存在)· P-7 编号不语义、**引用必语义**。
---
### 4.2 目标前缀(作废)
2026-10-26 删除:那批"改名后才启用"的前缀族从未有属主登记处,留着只会把读者带到一张不存在的登记表前。
### 4.5 已删报告的自有族
《项目审查与优化建议报告》2026-10-25 已删除,它自造的六族随之失去定义,且与登记簿同字母不同义。
看到「报告 + 登记簿旧号」这类写法一律按死号处理:删号留事实——各条目原本指向的设计文档就是现在的出处。
---
## 6. 模块码表
`TC` 与 `TRAP` 共用模块码。唯一事实源是 `scripts/archive/id_gate/id_registry.json` 的族 pattern 与属主文档标题行;
**本文故意不再抄一份**——抄一份就多一处会过期的地方(历史上这张表就长期与代码不同步)。
要加模块码:先改 registry,再在属主文档出现,最后才在别处引用。
## 7. 改号与迁移
### 7.1 映射规则(作废)
"按审计报告把某族整体迁到另一族"那套映射已作废。2026-10-26 的实测结论是:**绝大多数号该删不该迁**。
### 7.2 孤儿编号处置(已完成)
代码有号、文档无号那批已按同一口径处理完:能对上属主表的补模块码,对不上的删号留事实;
**绝不为了少报孤儿而凭空补定义行**(那等于把账做平、把问题藏起来)。
### 7.3 改号操作规程(要动号就照这个走,一步都别省)
1. 走 `scripts/rename_ids.py`:映射表驱动、**显式 scope**、默认干跑、自动写别名条目;
**绝不全局查找替换**——同一裸形字面量可能同属多个族(实测 `S3` 三义),全局替换等于造新撞号。
2. 改完复核**所有识别面**:`check_ids.py` 与 `check_test_traceability.py` 的候选正则上界都要还能匹配新
形态;判据是"编号字面量总数有没有真的变小"(曾经因为正则上界太窄,改完号静默隐形 339 个)。
3. **逐号做语义复核**,不能只看 dry-run 命中数:最阴的失效是"字面改对、意思改错"。
4. 登记表 / 映射表类文件**不得当引用语料**,否则自家审计表里的旧形态会被判成新账。
5. 收尾重打台账 `--prune-backlog`(只减不增),并确认新错误级为 0。
---
### 8.1 当前基线(2026-10-26 编号迁移批次后重打)
| 项 | 数值 |
|---|---|
| 扫描文件 / 编号字面量 | 784 个 / **7,828 处**(2026-10-27 复测;两批清理前 10,956 → 8,230,此后新代码与新文档回涨 553 处,其中测试用例族占大头,见 §9.1) |
| **护栏 1**(报告值,不拦提交):可判定比例下限 `decidable_ratio_baseline` | **86.0%**(2026-10-28 实跑 87.15%;容差 0.1pp) |
| **护栏 2**(报告值,不拦提交):不可判定引用绝对数上限 `undecidable_total_ceiling` | **1,166 处**(2026-10-28 实跑 **1,033** 处;构成拆解见 `docs/门禁说明/id-check.md` §7.7) |
| 校验 1/2/3/4/5/6 错误级 | **0**;债务台账 0 条指纹 → `--strict` 实为**全量拦截** |
| 告警 | 悬空 2(`App/algo/freq.c` 的正序 / 负序记号,属 `docs/编号规范.md` §4.4 误判面)+ 孤儿 50(陷阱条目这类本就允许无人引用) |
> ⚠ **读这些数字的口径**:跨批次**不可直接相减**。方案 B 把"本可判定的引用"换成散文,分子分母同缩,
> 比例反而从 86.7% 掉到 85.98%,而**不可判定绝对数一处没涨**——护栏 2 就是这么来的。
> **2026-10-28 起两根护栏都只报告、不拦提交**(用户裁定:语料维护的成本已经高过它买到的一致性——
> 近 80 笔提交里 61 笔被编号体系牵连)。数字照样打,但不再决定一笔提交能不能过;
> 硬拦的只剩校验 1~6 的台账外新账。判断"编号有没有变坏"仍看绝对数与字面量总数。退役路线见 `docs/编号规范.md` §8.5。
### 8.3 改号与清号批次(只留要点)
2026-10-21 五批统一改名(陷阱号归范、主机侧单测认代码为属主登记处、追溯器三档口径对齐);
2026-10-26 两批清号(A:删死号约 1,557 处文本实删;B:登记簿系 20 个号转语义短语约 418 处)。
逐批动机与影响只在 git log 与 `scripts/rename_maps/`,**本文不维护流水账**。要记住的只有两条教训:
门禁曾经把"政策上禁止回改的变更记录行"当活账拦提交;也曾经用比值当唯一护栏而**惩罚清号动作本身**
——两处都在 2026-10-26 修掉了,别再往回改。
### 8.4 台账与 `--strict`
错误级问题按「文件 + 校验项 + 字面量 + 次数」记指纹进 `scripts/archive/id_gate/id_known_backlog.json`,`--strict` 只拦
**台账之外**的新账,台账只减不增。本批台账已还清到 **0 条**——从现在起任何一条新错误级问题都会当场
拦提交,**别指望还有豁免面**可钻。
## 9. 还剩什么:存量清点与批次(2026-10-27 实测)
**批次一与批次二已于 2026-10-27 执行完毕**,下表保留的是**动手前的清点基线**(用来解释为什么这么分批),
不是当前存量。当前状态:
| 批次 | 范围 | 结果 |
|---|---|---|
| 一 | 登记簿旧号 / 阶段号 / 台架阶段裸形 / 网络条目号 | 活文档清零;顺带清 3 处裸形;位号目录整目录排除 |
| 二 | 保护功能号 28 个 | 代码与测试 215 处 + 文档 194 处 + 配置注释 3 处 + 入口文档 2 处;活文档只剩
**冻结的变更记录行 40 处**与**一处原始串口日志**(真机抓包证据,改它等于篡改现场,永久保留) |
| 三 | 测试用例族 561 站点 | **用户裁定不做**:该族保留,但**即日停发**(游标冻结,新用例不再配号) |
| 五 | 「数据可信」任务卡号 14 个(中文前缀「卡」+ 数字),随注入验证卡销项整族清退 | 全仓 288 站点 / 56 文件改语义短语(代码与测试 191 / 文档 56 / 门禁配置与本文 41),活引用收口 **0**;门禁字面量与不可判定绝对数**零变化**(本族从不在计数内)——换算表与机器面空白见 §9.3(批次四记在上面的复测段,未进本表) |
| 六 | 2026-10-28 复测:在册旧号**活引用归零**,账面**不动基线** | 按 「retired-to-phrase」 与 「void」 两类别名当探针全库复扫(排除门禁自身语料与硬件位号目录):剩余命中面**全部**落在变更记录行(`docs/编号规范.md` §4.3 不回改)、元器件位号与 Socket 状态组合(`docs/编号规范.md` §4.4 判非编号,清它等于改硬件资料)、以及属主文档的历史对照列;真编号活引用为 **0**。本笔不重打 §8.1 两根护栏基线(那些数随在飞改动漂移,属各自批次的收口),当日实测三项与命中清单写入 `ci-artifacts/id-metrics-batch-six.txt`(不进语料的口径台账),正文只留结论:剩余命中面另含讲编号的文档里的形态自述,本笔自身两行正文带来个位数增量、远低于护栏上限,两根本基线**均未下调**、零编号增删 |
编号字面量 **8,787 → 7,828**;不可判定绝对数 **1,161 → 982**(上限 1,166,余量从 5 格宽到 184 格)。
比值 86.79% → 87.46% 属**纯稀释**(删的都是可判定引用,分子分母同缩),**基线不下调**,见本节末裁定。
先回答「还有多少号可以清」。下面是**用门禁自己的接口跑出来的**存量(`check_ids.py` 的 Checker,按族统计
「活引用站点 / 不同字面量 / 涉及文件数」;只统计非冻结族、且排除属主登记处的定义位):
| 族 | 引用站点 | 字面量 | 文件 | 集中处 | 处置 |
|---|---:|---:|---:|---|---|
| `TC-*`(含各模块子族)〔动手前基线,非当前存量〕 | **561** | 472 | 77 | 测试用例与断言标签、`test/host/**` | **保留、即日停发**(用户裁定 2026-10-27,见 §9.1 批次三) |
| `L-PROT`(保护功能号) | **184** | 28 | 58 | 保护规划与各模块说明 | 批次二:转语义 |
| `TRAP-*` | **134** | 25 | 51 | 踩坑记录与驱动注释 | 保留(可检索锚点,用户已裁定) |
| `F-*`(网络设计条目) | **38** | 12 | 20 | 动手前 `ch395f.h`、`net_events.c`;**收口后代码侧 0 处** | 批次一:**已转语义**(§7 保留 12 条历史对照 + 新增「条目名」列) |
| `CODE-RULE-*` | **35** | 20 | 13 | 代码规范门禁 | 保留(门禁按号报错) |
| `MENU-STATE-*` | 少量 | — | — | 像素回归脚本 | 保留(脚本按它取状态行) |
| `T-TEST`(台架阶段裸形) | **19** | 4 | 12 | 串口/台架脚本与测试流程 | 批次一:转语义 |
| `N-*`(登记簿旧号残留) | **4** | 3 | 3 | 规范自身与两处脚本注释 | 批次一:清 |
| `TM-*` | **1** | 1 | 1 | 规范自身 | 批次一:清 |
合计:**26 个族仍有引用、565 个不同字面量、1,108 个引用站点**(其余 73 个登记族已零引用或冻结)。
**批次四复测(2026-10-27 14:1x 实测,工作区时点值,含别道在飞改动;口径 = 门禁 `Checker`,属主登记处定义位已排除)**:
| 处置 | 族 | 门禁 refs / 站点 / 字面量 / 文件 |
|---|---|---|
| **保留**(机器把手或用户裁定) | `TC-*` 类 39 个族 | 字面量 **497** / 文件 **81**(对 §9.1 冻结水位 497/81 **持平**,未涨) |
| 保留 | `TRAP-*` | 134 / 282 / 25 / 51 |
| 保留 | `CODE-RULE-*` | 35 / 51 / 20 / 13 |
| 保留 | `MENU-STATE-*` | 7 / 8 / 6 / 2 |
| **已清零**(仅剩「讲编号」的形态自述) | `N-*` `TM-*` | **0 / 0 / 0 / 0**(批次一后无残留) |
| 已清零 | `T-TEST`(台架阶段裸形) | 活引用 **0**;命中全部落在本文与 `.dsh/skills/` 的形态举例里 |
| 已清零 | `L-PROT` 保护功能号 | 活引用 **0**;剩原始串口日志 1 处(冻结证据、永久保留)+ 技能文档形态举例 |
| 已清零 | `FEAT` 网络条目号 | 活引用 **0**;属主文档 §7 编号列 13 条是历史对照,不是引用 |
| **非编号误判**(`docs/编号规范.md` §4.4,不清) | 版本记号 CMSIS-RTOS 的那个(字母 V 紧跟数字 2)**66 站点 / 31 文件**、幅值记号与 MAC 字节对的 A 形、活表代号 E 形、Socket 状态组合 U 形、测频正/负序记号 S 形、傅氏求和上界 N 形 | 合计约 **1,100** 站点被宽松正则顺伤 |
| **冻结历史波次号**(`docs/编号规范.md` §4.3 正文不回改) | 字母 B/C/D/W/M/R/G/O + S-REVIEW/E-EXP/A-AUDIT/D-DOC 等 16 个已冻结族 | 合计约 1,500 站点;**无连字符 → 按 `docs/编号规范.md` §4.4 判据本就不是编号** |
合计:**44 个族仍有命中站点**,其中真编号活引用只剩上面「保留」四行;批次一/二涉及的四个族活引用均已归零。
**批次四做了三件事**(本轮指令:「把能清的族清掉一批」):
1. **关掉已清退族的发号口**:`L<n>-<nn>` 与 `F-<MOD>-<nn>` 从 `docs/编号规范.md` §4.1『允许继续发号』**整行移出**(7 行 → 5 行),在『已停发、存量待清』各补一行硬口径——留着那两行,扫表的人照样照着发号(同 `TC-*` 那次的教训)。**机器面已探针复核**:`_check_dangling` 对「L 段号形态的新号」与「F 条目号形态的新号」各写一个,全部命中 `docs/编号规范.md` §8 校验 3 **错误级**(台账 0 指纹 → 等于拦提交),所以不需要再冻结数值游标(各段最高号不同,单一数字游标反而放行低号)。
2. **本文自述形态化**:把本文里 4 处「字母 T 紧跟数字」与 2 处 DRV 段孤儿号的**字面量写法**改成形态描述(lesson 不丢),使这四个族的门禁命中数真正归零,而不是停在「只有规范自己在引用」。
3. **登记机器面还空着的那一面**:`scripts/archive/id_gate/id_registry.json` 给 `L-PROT`/`FEAT` 补 `retired` 字段;给 `T-TEST` 补 `cursor_note` 写明——它的 pattern 最高只到数字 3,**即使 `frozen: true` 校验 5 也碰不到任何新写法**(探针实测写 4 不响),所以该族停发今天只有 `docs/编号规范.md` §3.3 禁令 + 评审两道兜底,**别把「存量已清零」读成「机器已关闭」**。
> ⚠ 本轮执行期间另有一道并行改动落地:`docs/测试说明/boot_log_data/README.md`(登记簿旧号「启动日志固化流程」)与 `docs/测试说明/m2_data/README.md`(审计发现 E 族一处死号)已由该道改为语义短语——**本笔不重复改这两处、也不替它收口**;复测两处死号引用均为 0。
§8.1 的 7,828 是当日更早时点值;本轮 14:1x 复测 **791 文件 / 7,931 字面量 / 不可判定 982(上限 1,166,余量 184)/ 可判定 87.61%**——增量全部来自别道在飞的新代码与新文档,本笔净效果是**只减不增**。
### 9.1 三批计划(按「值不值得动门禁」排序)
**批次一 · 现在就能清(约 62 个站点 / 20 个字面量,不碰任何门禁)**:`N-*`、`TM-*`、`T-TEST`、`F-*`。
> `F-*` 已于 2026-10-27 收口:映射 `scripts/rename_maps/batch7-f-net-semantic.json`(10 条**带上下文**的定点改写),`docs/网络/网络自愈架构设计.md` §7 加「条目名」列作权威对照,13 个旧号进 `scripts/archive/id_gate/id_aliases.json` 标 `retired-to-phrase`。
> 作用域刻意只列 2 个文件、且 `old` 全部带上下文——同树里 `docs/硬件平台/` 的 **变压器位号(字母 T 紧跟数字)**(网表 ~4200 处 R/C/D/J/X/U/T 位号,本就不在门禁语料内)、`docs/芯片手册/` 的时序记号,以及各文档 Mermaid 图的**单字母节点名**(`F -->`、`EV`、`LN`…)都会被宽松正则顺伤;变更记录行(`BSD_Socket_API_使用指南.md` 的 `| 2026-10-13 |`)按 §8.1 豁免不改写。
这四族**没有任何脚本按字面量匹配**,纯人读,正是「语义标识最好」的适用面;台架阶段族还是裸形(字母 T 紧跟一位数字),
最容易与别的字母撞义。改法:号 → 短语(「台架阶段一」「网络自愈:监听生命周期」),残留引用同步清,
别名表标 `void`,台账 `--prune-backlog`。
**批次二 · 文档为主、量大(约 184 个站点 / 28 个字面量)**:`L-PROT` 保护功能号。它**曾有**明确价值
(功能复现规划逐条对齐),但用户已裁定字母号难认 ⇒ 改成功能名本身(「过流Ⅰ段」「零序过流」),
规划表首格写功能名、不再配号。要点:必须**按功能逐个改**,不能全局替换(同一号在不同文档指同一功能,
但句子结构不同);改完用追溯器复核代码侧没有残留号引用。
**批次三 · 用户裁定 2026-10-27「不做」:`TC-*`(561 个站点 / 472 个字面量 / 77 个文件)保留现状**。
裁定记录(原话:「**批次三,不坐**」,即批次三不做)。留着的理由与今天的定调并不矛盾,而是它的前提:
`TC-*` 是本规范 `docs/编号规范.md` §4.1 那条判据**唯一真正满足它的族**——`check_test_traceability.py` 与 40 套 `run_unit_test.py`
**按字面量读它**,C 断言标签、测试函数名、文档用例表三处同一号,是「代码 ↔ 文档」双向核对的机器把手。
清它的代价不是改文本,而是**换掉追溯机制**:候选方案「用例名即标识」(`test_xxx_yyy()` ↔ 文档表格行名,
脚本按名字比对)要把追溯门禁重写并重打基线,收益是字母号一次少掉一半以上,代价是**期间测试与文档的
对应关系处于断裂态**——本仓测试是提交门禁(`test-coverage` 跑全部 40 套并守覆盖率基线回退),拿它做
不可逆试验不值。**结论:机器面自解释的族可以保留;字母号的痛在「人读」侧,解法是别再造给人读的号,
而不是把机器面的把手也拆掉。**
「不做」之后跟着三条硬口径(否则裁定会被当成默许继续扩族):
① **本族即日停发**:现存号只减不增,**新用例一律用语义化测试函数名 + 文档表格行名,不再配 `TC-` 号**
(机器口径已同批落地:见本节末「机器口径已落地」与 `docs/编号规范.md` §4.1 框内第三条);
同一笔把 `TC-*` 从 `docs/编号规范.md` §4.1『允许继续发号』表里**整行移出**(只在『已停发』栏留一行)——留在那张表里,
脚注写得再重,扫表的人照样照着发号;
② **停发 ≠ 待清**:现存号与 registry 登记一律保留、不清、不复用(机器追溯把手 + `docs/编号规范.md` §1「不回收、不复用」);
引用既有用例仍可用旧号,新用例不配新号;
③ 若将来真要清,按 `scripts/rename_ids.py` + §7.3 五步**单独开卡**,前提是先让追溯器同时认两种形态
(新旧并行核对通过,再谈切换),**不许先改文档再改代码**(会凭空造出悬空号,`docs/编号规范.md` §8 校验 3 会当场拦)。
**这条裁定的机器口径已落地(2026-10-27 同日补;上一版这里写「停发今天只有规范效力」,那是当日的实测记录,不是笔误,留作历史)**:
`scripts/archive/id_gate/id_registry.json` 的 **37 个 TC 类族已全部 `frozen: true`**,其中 **34 个 `TC-HOST-*` 子族带游标**,冻结在
裁定日该套件存量最高号;5 个游标低于存量的已抬到水位(`TC-PROTELEM-013→015`、`TC-SYSLOG-108→137`、
`TC-ADCHEALTH-011→023`、`TC-ADCCAL-017→023`、`TC-I104SRV-041→053`),裁定理由记在 registry 顶层
`tc_freeze_2026_10_27`。落地的直接诱因是本族在裁定当天还在长大:另一道在飞的 `time_sync` 改动新增了
`TC-TIMESYNC-0xx`(撞的是 `docs/编号规范.md` §8 校验 3 悬空引用而非校验 5——那个模块码没有专属子族,正落在主族 `TC` 的空白面上)。
**冻结水位(只减不增)**:TC 类族按门禁 refs 口径(字面量 × 文件去重,属主登记处与本文写法示例不计)——
动手前基线 **561 站点 / 472 个字面量 / 77 个文件**;本笔落地时工作区实测 **590 / 497 / 81**(站点 / 字面量 / 文件)。
**差出来的 29 站点全部是裁定之后仍在配号的在飞改动**(`time_sync` 一道的 `TC-TIMESYNC-` 新号),这正是水位
必须落到纸面的理由:**从本笔起任何一次上涨都要问「这号是谁在停发之后发的」**。重测:跑 `check_ids` 的 Checker,
取 `ck.refs`(注意它是**属性**不是方法),把字面量按 `class == "TC"` 各族 `pattern` 归族后聚合。
⚠ 上面两个数都是**工作区时点值**(本笔 = 2026-10-27 12:40,含别人在飞的改动)——提交收口时按当时工作区**重打一次**,
别把这个数当长期基线;**也不要为了把数字压回 561 去改别道在飞的文件**。
**门禁侧复核**:`check_ids.py --only 5` 校验 5 = 0 处(冻结没有误伤存量);plain 与 `--strict` 的错误级 findings
与本笔之前逐条相同;`id_known_backlog.json` 台账 0 条;可判定比例 87.67%(基线 86.0%)、不可判定绝对数 979(上限
1,166)。本笔零语料增删,**不动 §8.1 两根护栏基线**(§8.1 的 7,828 处字面量会随在飞改动漂移,那属各自批次的收口)。
**还剩下的那一面(别把「机器已冻结」读成全族无死角)**:主族 `TC` 的 `cursor` 仍为 `null`——一个游标表达不了每个
模块码的水位,写全族最高号反而放行低号,所以按空白登记;这一面由校验 3(新号无定义位 = 悬空,错误级)、上面的
冻结水位、以及评审三条兜住。**「反正门禁主族咬不到我」不是发号许可。** 要把这面也机械化(按模块码克隆子族,或给
族级加字面量上限),与「真要清退」一样属追溯机制改造,按 §7.3 单独开卡。
### 9.2 别再做什么
「编号说明」这件事本身应该继续变薄:每多一个族,就多一处需要有人记得它的地方;每多发一个号,就多一个
将来没人敢删的字符串。要新增族之前,请把 `docs/编号规范.md` §4.1 的「允许继续发号」那 5 行当作反对你的第一手证据。
### 9.3 批次五换算表:「数据可信」任务卡号(2026-10-27 整族清退)
用户指令(2026-10-27):「**数据可信.md 已经完成的内容请进行销项删除,去除相关编号**」。两件事同做:
1. **销项**:`docs/任务规划/数据可信.md` `docs/编号规范.md` §5 里 2026-10-27 台架闭环的「已知电压注入验证」行**删行**。
上一笔曾特意标 ✅ 保留,理由是该行被 `App/task/adc_task.c` 的 v3.3 修订行按卡号当口径出处引用;
引用侧改成语义短语后该理由不再成立 → **例外撤销**。判据与实测记录的属主 =
`docs/硬件平台/ADC通道映射说明.md` §8.1(六项判据全 PASS、斜率 6544.2 码/V、偏差 −0.14 %),
执行侧 = `docs/测试说明/ADC前端注入验证流程.md`(含两项残留口径与残差表)。
2. **整族清退**:「卡」+ 数字 1~11 那 11 行早在 2026-10-25 就删完了,代码注释里剩下的这种形态今天
**查无此行**——按 `docs/编号规范.md` §4.1.1 末句,正确动作是**删号留事实**(换成语义短语),不是回去补一个定义。
| 旧号形态 | 语义短语 | 现行口径出处 |
|---|---|---|
| 「卡」+ 数字 0 | 已知电压注入验证 | `docs/硬件平台/ADC通道映射说明.md` §8.1(✅ 2026-10-27,已销项删行) |
| 「卡」+ 数字 0b | 端子/子板变比确认 | `docs/任务规划/数据可信.md` `docs/编号规范.md` §5;缺口面 = `docs/硬件平台/ADC通道映射说明.md` §7.1 链路分段表 ④ 行 |
| 「卡」+ 数字 1 | 量程口径冻结 | `docs/任务规划/数据可信.md` §2.1 |
| 「卡」+ 数字 2 | 标定折算落地 | `docs/任务规划/数据可信.md` `docs/编号规范.md` §4.1 |
| 「卡」+ 数字 3 | 有符号零点类型(CFG_VAL_INT) | `docs/任务规划/数据可信.md` `docs/编号规范.md` §4.4 |
| 「卡」+ 数字 4 | 标定落盘与整定入口 | `docs/任务规划/数据可信.md` `docs/编号规范.md` §4.4 |
| 「卡」+ 数字 5 | 未标定即闭锁 | `docs/任务规划/数据可信.md` `docs/编号规范.md` §4.3 |
| 「卡」+ 数字 6 | 下游常数按工程量重定 | `docs/任务规划/数据可信.md` §2.3 |
| 「卡」+ 数字 7 | 量纲回归用例 | `docs/任务规划/数据可信.md` `docs/编号规范.md` §3 退出判据第 ⑥ 条;用例在 `test/host/prot_dim` |
| 「卡」+ 数字 8 | 遥测快照发布 | `docs/任务规划/数据可信.md` §4.5 |
| 「卡」+ 数字 9 | 104 改读快照 | `docs/任务规划/数据可信.md` §4.5 |
| 「卡」+ 数字 10 | 运行参数段 | `App/algo/run_par.h` 头注释 + `docs/子系统设计/IEC104上行设计说明.md` |
| 「卡」+ 数字 11 | 频率点绑定 | `docs/子系统设计/IEC104上行设计说明.md` 的 `0x401D` 行 |
| 「卡」+ 数字 12 | 两点标定 | `docs/任务规划/数据可信.md` `docs/编号规范.md` §5(未开始,等标准源) |
**本表把形态写成「卡」+ 数字、不复述字面量**:本文是门禁语料,复述形态会把"讲规则的文档"变成
自己的引用站点(§9.1 批次四第 2 条同一条教训);要查旧号,看左列形态 + 属主文档的历史行。
- **旧号永久作废、不得重新取走**:这一族**没有机器识别面**(中文前缀不进语料),停发今天只有
`docs/编号规范.md` §4.1.1 本行 + 本表 + 评审兜住。要机械化,得先给"中文前缀 + 数字"设计候选形态——那与 §9.1 末尾
「族级加字面量上限」同属追溯机制改造,**按 §7.3 单独开卡**,别夹在清退批里顺手做。
- **同形态不同属主**:`docs/任务规划/UI补齐.md` 的条目现在写「第 N 项」,历史上被别处写成同一形态的
4 处(其实指已入库的 `[comm]` 段前置项)已随本批改成不带号的语义形态。同一裸形态跨两个属主文档,
正是 `docs/编号规范.md` §4.1「别拿同形当同族」的实证——清号必须**按属主文档逐处判语义**,不许全局查找替换。
- **不在本批的**:里程碑号(字母 M + 数字)与并行道号(道A/道D/道G)一律保持原样,是否清退等用户
单独裁定,**不要顺手做**。
---
## 变更记录(2026-10-28 瘦身以前的全量流水)
| 日期 | 变更 | 说明 |
|---|---|---|
| 2026-10-28 | **编号门禁第三步收口:全库语料审计退役(钩子 52 → 51)** | 用户裁定跳过观察期直接做。`check_ids.py` 与两份语料(`id_registry.json` 87.6 KB / `id_aliases.json` 187 KB)+ 债务台账整体移入 `scripts/archive/id_gate/`(附归档 README,含"为什么退役 / 现在用什么 / 怎么手工跑");`id-check` 钩子摘除,现役编号门禁只剩 `id-check-new`(只查新增行)。连带改:`rename_ids.py` 的别名表路径指向归档、新门禁排除面加 `scripts/archive/`、`doc-links` 跳过 `.mnemon/` 与 `ci-artifacts/`(本地状态与草稿,非项目文档)、`id-check.md` 加退役横幅、`门禁说明/README` 与 `AGENTS` 的钩子数三数对齐(声明 51 / commit 阶段 50 + gitlint 1)。归档脚本从新路径实跑:811 文件 / 8,051 字面量、`--strict` rc=0。 |
| 2026-10-28 | **编号门禁第二步落地:新增行拦截(零语料)** | `scripts/check_ids_new.py` + 钩子 `id-check-new`:只看新增行,破折形态未知前缀 FAIL、已停发族只 WARN、单字母+数字放行(元件位号同形,见该门禁 §6 盲区)。白名单是**前缀级**两张表(活族 11 条 / 器件与协议约 90 条),不是字面量账本——后者会退化成 `id_aliases.json` 的老路。调参依据:最近 80 笔真实提交回放,未知形态 15 种(12 种是设备与协议名、3 种是停发族),调好后误报 0;自检 5 正例 + 29 反例。与 `id-check` **双跑**一个观察期后再按 `docs/编号规范.md` §8.5 ③ 退役旧语料。 |
| 2026-10-28 | **编号门禁减负第一步:两根护栏转报告制** | 用户裁定「编号门禁每次浪费很多时间」→ 先摘掉语料审计的强制面。护栏 1(可判定比例基线)与护栏 2(不可判定绝对数上限)自此**只打印、不拦提交**;实测把基线调到 99.9%、上限调到 1 处,退出码仍为 0。硬拦只剩校验 1~6 的台账外新账(同一实测:新文件里写一个自造前缀 + 数字,校验 1 与增量拦截照旧 FAIL)。退役路线 ①②③ 写进 `docs/编号规范.md` §8.5;减负依据 = 近 80 笔提交有 61 笔被编号体系牵连、语料共 99 族(78 族已冻结)。 |
| 2026-10-28 | **变更记录行里已停发/作废族的示例编号改形态描述;并用门禁自身计数器把「这一笔能不能压下不可判定绝对数」钉死为零** | 用户指令:把变更记录行里已停发族的那几枚示例编号改成语义形态描述,并确认它让不可判定引用绝对数净减、不是只算自己这一笔。**实测裁定:净减 = 0**。门禁把「表格首格是日期」的行整行豁免于编号判定(registry 侧的变更记录豁免,本笔前全库已豁免 198 处站点),本表的示例编号从来不进引用总数分母,改它必然不动绝对数——改前改后同一个计数器均为 **1003**(上限 1166;可判定 87.43%,三项都是 2026-10-28 本回合实测)。唯一移动的是那行豁免计数本身(本文件少 1 处站点),把它当清退成果就是把自记账成全局减量,正是本笔要排除的错法。本文对该计数器的全部贡献 **6** 处,逐文件集合差实测:全是「非编号」判定栏里既定的噪声名与裸形盲区(哈希算法名、总线名、严重度档位、硬件位号),不是编号,不清。本笔动的 3 处只是写法:作废的网络条目孤儿号(F 前缀 + 模块码段 + 数字序号三段)与已删报告的 UI 簇(字母 U 紧跟一位数字,区间两端即该簇首尾两枚);事实本体仍在别名表、registry 游标备注与 git 历史,一处没丢。刻意不动:硬件位号形态的举例(判非编号)、保留现存号族的冻结游标数字(冻结水位的证据本体)、其它文档与注册表里的同名字段(各自写域)。`docs/编号规范.md` §5.5 同步写死该例外的硬口径。零代码、零编号增删、两根护栏基线均未调整。 |
| 2026-10-27 | **批次五:「数据可信」任务卡号整族清退 + 注入验证卡销项删行** | 用户指令「数据可信.md 已经完成的内容请进行销项删除,去除相关编号」。实测 **288 站点 / 56 文件**(代码与测试 191 / 文档 56 / 门禁配置与本文 41)全改语义短语;`docs/编号规范.md` §5 表首列由「序」改「标识(任务名)」、14 个旧号进 §9.3 换算表;顺带按属主文档判语义清掉同形态的悬空引用 4 处(「UI 补齐」波次的 `[comm]` 段前置项)。门禁面:编号字面量与不可判定绝对数**零变化**(中文前缀不在语料),收口复跑 `check_ids.py --strict` 与 `check_doc_links.py --all --sections-strict` |
| 2026-10-27 | **批次四:`L-PROT` / `FEAT` 发号口关闭(`docs/编号规范.md` §4.1 七行→五行)+ 本文自述形态化 + 登记 `T-TEST` 机器面空白** | 用户指令「语义标识已定为默认形态,看看还有哪些编号族仍被引用、各自还剩多少,把能清的族清掉一批」。按门禁 `Checker` 实测三口径重打 §9 存量表:**真编号活引用只剩 `TC-*`(保留、水位 497/81 未涨)、`TRAP-*`、`CODE-RULE-*`、`MENU-STATE-*` 四族**,批次一/二涉及的 `N-*`/`TM-*`/`T-TEST`/`L-PROT`/`FEAT` 活引用均已归零。本笔:① `docs/编号规范.md` §4.1 把 `L<n>-<nn>`、`F-<MOD>-<nn>` 从『允许继续发号』整行移出并在『已停发』栏各写一行(含探针证据:新形态号 → 校验 3 错误级);② 本文 6 处形态自述改「字母+数字」描述,使四个族门禁命中归零、lesson 不丢;③ registry 给 `L-PROT`/`FEAT` 补 `retired`、给 `T-TEST` 补 cursor_note(pattern 上限即 3 → 冻结游标是空操作,停发今天只有规范效力);④ 分类登记 `docs/编号规范.md` §4.4 误判面(版本记号 / 活表代号 / 状态组合 / 位号)与 `docs/编号规范.md` §4.3 冻结波次号两类**不清**的理由。未改门禁判定逻辑、未动冻结历史与原始串口日志、未新增任何号。 |
| 2026-10-27 | **批次一 `F-*` 收口:网络设计 12 个条目号转「条目名」语义短语,§7 表加「条目名」列为权威对照** | 用户指令「把网络设计里的 `F-*` 条目号换成语义短语,别改坏硬件资料的 T1/T2/T3 位号和 Mermaid 节点名」。走 `scripts/rename_ids.py`(映射 `scripts/rename_maps/batch7-f-net-semantic.json`,`--no-alias` 后手工写别名),10 处定点改写=属主文档正文 9 处(含 1 处孤儿号删号留事实)+ `test/host/net_socket/net_socket_test.c` 注释 1 处;孤儿号(F 前缀 + 模块码段 + 数字序号的三段形态;§7 从无定义行)删号留事实、不补定义;13 个旧号标 `retired-to-phrase`。刻意不动:§7 编号列(历史对照)、`BSD_Socket_API_使用指南.md` 变更记录行、`docs/硬件平台/` 位号、Mermaid 节点名。`scripts/archive/id_gate/id_registry.json` FEAT `cursor_note` 改记停发口径(三模块各有最高号 → 不冻结游标的理由写在里面)。零代码语义变更。 |
| 2026-10-27 | **停发机械化落地:34 个 `TC-HOST-*` 子族游标冻结,`docs/编号规范.md` §8 校验 5 开始咬新配的 TC 号** | 上一笔把缺口登记为「停发今天只有规范效力」并写明机械化怎么做;本笔照它落地、把话兑现:`scripts/archive/id_gate/id_registry.json` 37 个 TC 类族全部 `frozen: true`,34 个子族的 `cursor` 冻结在裁定日存量最高号(字符串形态——整型比较静默不生效;5 个低于存量的已抬:`TC-PROTELEM-013→015`、`TC-SYSLOG-108→137`、`TC-ADCHEALTH-011→023`、`TC-ADCCAL-017→023`、`TC-I104SRV-041→053`),理由记在顶层 `tc_freeze_2026_10_27`。探针(Checker `_check_frozen`):在 `TC-PROTSET-` 段存量最高号之上再加一号 → 命中 1 条校验 5,写存量最高号本身 → 零误伤;`check_ids.py --only 5` = 0 处;plain 与 `--strict` 的错误级 findings 与本笔前逐条相同(**12 条 `TC-TIMESYNC-0xx` 悬空引用属另一道在飞的 time_sync 改动,不在本笔写域,也没替它改**);台账 0 条、可判定 87.67%、不可判定 979 / 上限 1,166,不动 §8.1。**没有把主族 `TC` 说成已冻结**:它 `cursor` 仍为 `null`,`docs/编号规范.md` §4.1 框内第三条与 §9.1 末段把这块空白及其兜底(校验 3 + 冻结水位 564/474/79 只减不增 + 评审)写明,并规定「给这些模块补号即使在文档里补了定义行也算违令」。§9.1 末段由「效力边界」改写为「机器口径已落地」,当日实测留作历史不抹。零代码、零编号增删。 |
| 2026-10-27 | **停发口径收口:`TC-*` 从『允许继续发号』表整行移出,并登记「机器面还没冻结」这个缺口** | 裁定上一笔已入档,但效力写在了会被扫表读过的地方:`TC-*` 仍占着「允许继续发号」表第一行、用途列还写着「要进 C 断言标签」,那句"注意它已停发"只是表前的脚注;而那张表连表头行都在早先瘦身时丢了(GFM 里表格不能紧跟段落,整张塌成正文)。本笔:① 移出该行、补回表头与空行,『允许继续发号』写成**恰好 7 行**;② 表下加防误读框,把「不做了」的两条误读各钉一次——「维持原状所以还能发」与「停发所以顺手清掉/复用号」,并写明唯一重启入口 = 先裁定再回本节改表;③ 实测登记效力边界:registry 37 个 TC 类族仍有 35 个 `frozen: false` 带活游标,`docs/编号规范.md` §8 第 5 项碰不到它们(且 `cursor` 为空时该校验直接跳过),所以停发今天只有规范效力,机械化单独开卡走 §7.3;④ `docs/编号规范.md` §5.1 补「不在 7 行内第 ① 步就走不通」、§9.1 两条硬口径扩成三条(新增「停发 ≠ 待清」)并补效力边界段、§9.2 计数 8 → 7。同步:`AGENTS.md` 索引行、`docs/测试说明/测试文档模板规范.md` §6.3、`docs/门禁说明/host-unit-tests.md` §7 号段行(那里原文写着「新增用例要带号」,是最直接的误读源头)。零代码、零编号增删。 |
| 2026-10-27 | **批次三裁定「不做」:`TC-*` 保留现状但即日停发** | 用户原话「批次三,不坐」(即不做)。裁定写进 §9.1 批次三(含理由与两条硬口径)、`docs/编号规范.md` §4.1『已停发』栏加一行、§9 结果表同步。停发的硬口径:游标冻结、现存号只减不增、**新用例一律用语义化测试函数名 + 文档表格行名,不再配 `TC-` 号**;真要清则先让追溯器同时认新旧两种形态、核对通过后单独开卡,不许先改文档再改代码(会造悬空号)。留着的判据依据:`TC-*` 是 `docs/编号规范.md` §4.1 那条判据(有脚本按字面量匹配)唯一真满足的族,字母号的痛在「人读」侧,解法是不再造给人读的号,而不是拆掉机器面的把手。 |
| 2026-10-27 | **语义标识定为唯一默认形态;编号收窄为「机器按字面量匹配」的例外,并首次给出现量清点与三批计划** | 用户原话:「不要用字母加数字的编号,简直太难以理解了,语义标识是最好的」。本笔:① 标题下的一句话从「允许用号的族只有 8 个」改成「语义标识是唯一默认、编号是例外」,并把 `docs/编号规范.md` §4.1 拆成『允许继续发号』8 族与『已停发、存量待清』4 族(`N-*` / `TM-*` / 台架阶段裸形 / `F-*`)——原表自称穷举,实际漏登记了这三类在用族,属真缺陷。② 新增 §9 存量清点(用门禁自身接口实测:26 族仍有引用、565 个字面量、1,108 个引用站点)与三批计划:批次一 62 站点不碰门禁即可清、批次二保护功能号 184 站点转功能名、批次三 `TC-*` 561 站点需先换追溯机制(等用户裁定)。③ §8.1 基线按 2026-10-27 复测重打:784 文件 / 7,828 字面量、护栏 2 实跑 1,161 / 上限 1,166。 |
| 2026-10-26 | **编号治理收口:清死号 → 停发活号 → 本文重写为短版(用户三次裁定)** | 全仓字母+数字编号 10,956 → 8,230 处。① **清死号**:属主登记处已删或从未启用的号一律就地删号留事实、禁补号(文本实删约 1,557 处)。② **停发活号**:登记簿 `N-x`/`S-x`/`T-x`、专项(A 前缀 + 数字)、已删报告的 UI 簇(字母 U 紧跟一位数字,区间两端即该簇首尾两枚)共 20 个号转成语义短语(约 418 处)——登记簿表首格就是短语,旧号进 `scripts/archive/id_gate/id_aliases.json` 标 `retired-to-phrase`;已销项的死号**故意不进别名表**,让门禁继续咬残留引用。③ **本文瘦身**:619 行 → 229 行,删掉八原则长表、迁移映射表、模块码表与门禁细节(那些各有事实源:registry / 别名表 / `docs/门禁说明/id-check.md`),改成「先问三句再决定要不要发号」+ `docs/编号规范.md` §4.1 允许用号的族**穷举 = 8 个**。④ **门禁配套**:`check_ids.py` 加变更记录行豁免与第二根护栏 `undecidable_total_ceiling`(比值会被清号动作稀释,绝对数不会),债务台账还清到 0 条 → `--strict` 实为全量拦截,比例基线重打为 86.0%。**本表按用户 2026-10-26 的明确指示只保留最近一条**,更早沿革看 `git log` 与 `docs/门禁说明/id-check.md` §7.5(含其后的方案 B 一节);这是**本文档的例外**,不改变 `docs/编号规范.md` §5.5对其他文档「冻结历史不回改」的约束。 |