docs(编号): 已停发族的示例编号改形态描述;技能手册按有无机器识别面分两条路
口径变更(用户裁定 2026-10-28,写进《编号规范》§5.5):销项冻结的历史行一般不回改, 唯一例外是「变更记录行里已停发 / 作废族的示例编号」——把字面号改写成形态描述, 事实、结论与数字一律不动。本次随之形态化三处:F 前缀三段形态(原写作孤儿号字面量)、 A 前缀 + 数字、字母 U 紧跟一位数字(区间两端即该簇首尾两枚)。§9 加当日变更行。 技能 id-family-semantic-migration 扩写(+147/−44):Steps 按族的「机器识别面」拆 成两条路 ——字母+数字族走门禁计数与映射表,中文前缀族(如已清退的「数据可信」任务卡号)门禁 咬不到,必须自建带标签扫描器并落地 §4.1.1 一行 + §9.3 换算表 + 叙述同步三处; 另加「三套计数都要挑明」与「不可判定绝对数涨点的净室归因」两节。 验证(实测):check_ids --strict 校验 1~6 无错误,可判定 7006/8036 = 87.18%(基线 86.0%), 不可判定 1030 处(上限 1166);check_doc_links --all --sections-strict 通 过(210 文档); check_bom_drift / check_mojibake / check_coding_standard / git diff --check 均 rc=0。 归属说明:这两处的语义出自并行的 RS485 / 屏板道(用户在另一会话里裁定), Lead 按「整理并收工提交」指令代提交,未改动其口径与结论;文件在提交前后字节一致。
This commit is contained in:
@@ -1,49 +1,62 @@
|
||||
---
|
||||
name: id-family-semantic-migration
|
||||
description: 编号族整族清退/停发 playbook:把一个「字母+数字」编号族(如保护功能号 L1-x~L5-x、网络条目号 F-*、登记簿旧号 N-x、台架阶段裸形 T1~T3、用例号 TC-*)在全仓代码注释、测试、活文档与门禁配置里改成语义短语,或把「不清退」裁定写成硬口径入档。触发语:清退某族编号、编号改成语义名/语义短语、还有多少号可清、批次二/批次三、id-check 报悬空引用或不可判定超限、"这一族不做了"。
|
||||
whenToUse: 用于**整族**处理:清点存量 → 逐族分类 → 分批派单清退 → 用门禁自身计数收口 → 回写 docs/编号规范.md 与变更记录。单条待办行销项写 void 别名用 ledger-row-retire-void-id;某个事实数(页数/叶数/钩子数)变了要同步全仓用 stale-doc-count-sweep;单个文件改名/挪目录用 scripts/rename_ref.py。本技能不覆盖这三类。
|
||||
version: 1.0.0
|
||||
description: 编号族整族清退/停发 playbook:把一个编号族(字母+数字如保护功能号 L1-x~L5-x、网络条目号 F-*、登记簿旧号 N-x、台架阶段裸形 T1~T3、用例号 TC-*,或中文前缀「卡」+ 数字这类门禁语料里**没有机器识别面**的族)在全仓代码注释、测试、活文档与门禁配置里改成语义短语(含销项删行与逐号换算表入档),或把「不清退」裁定写成硬口径入档。触发语:清退某族编号、编号改成语义名或语义短语、还有多少号可清、残留多少、批次二/批次三/批次五、「卡 0」「卡 0b」「卡 1~12」、销项删行并去除相关编号、id-check 报悬空引用或不可判定超限、不可判定引用绝对数涨点、「这一族不做了」。
|
||||
whenToUse: 用于**整族**处理:先判这一族有没有机器识别面 → 清点存量 → 逐族分类 → 分批派单清退 → 收口 → 回写 docs/编号规范.md 与变更记录。单条待办行销项并写 void 别名用 ledger-row-retire-void-id;某个事实数(页数、叶数、钩子数)变了要同步全仓用 stale-doc-count-sweep;单个文件改名或挪目录用 scripts/rename_ref.py;跑 HEAD 版对照组用 task-worktree 的净室 worktree。这四类不由本技能覆盖,但「涨点归因」一节会用到净室 worktree。
|
||||
version: 1.1.0
|
||||
---
|
||||
|
||||
# 编号族清退成语义标识
|
||||
|
||||
口径的唯一来源是仓库自带的编号门禁 `scripts/check_ids.py` 与规范 `docs/编号规范.md`。**不要凭 grep 估数、不要凭印象决定改哪几处、不要把「不做」只划掉一行。**
|
||||
**动手前先判这一族有没有「机器识别面」**——它决定计数口径的来源与落地去处,两条路的做法**正好相反**:
|
||||
|
||||
## 口径:两套计数都要挑明,先问再比
|
||||
| 族形态 | 计数口径来源 | 改名手段 | `scripts/id_aliases.json` |
|
||||
|---|---|---|---|
|
||||
| 字母+数字,且在 `scripts/check_ids.py` 语料内(`id_registry.json` 有族、族 pattern 能匹配它) | 门禁自身计数(`ck.refs` / `ck.stats` / 报告行) | `scripts/rename_ids.py`(映射表 + 显式 scope + 默认干跑) | **要登记**:死号 `void`、转短语 `retired-to-phrase` |
|
||||
| 中文前缀(「卡」+ 数字)、纯散文里的号、圈号 ①②③ | **自建带标签正则扫描器**(门禁看不见它,id-check 报告与本族无关) | 逐处替换 + 断言命中数(`rename_ids.py` 靠族 pattern 驱动,这里用不上) | **刻意不登记**:登记了机器也看不见,只多一张没人核的表;停发只靠规范 + 评审 |
|
||||
|
||||
门禁 `ck.refs` 与逐行站点数是**两套合法口径**,谁都没算错:
|
||||
怎么判(三条,任一为否即无识别面):① `grep -nE '"name"|"pattern"' scripts/id_registry.json`,没有任何族 pattern 能匹配该形态;② `./.venv/Scripts/python.exe scripts/check_ids.py --top 0` 的任何校验里找不到它;③ registry 的 `blind_spots` 已明写不判(圈号与正常列举无法机械区分、裸形同字母多义只在属主登记处判)。实测:「卡」+ 数字**没有族**(中文形态只有 `malformed` 里 `陷阱 ?[0-9]` 那条禁令,管的是陷阱编号不是卡号),该族真实站点 288 处 / 56 文件,而门禁对它贡献 0。
|
||||
|
||||
判错的代价是双向的:拿门禁计数当中文字面量族的口径 → 得出「0 处待改」的**假归零**;给无识别面的族登记别名 → 制造「有机器兜底」的错觉,真正生效的两条(§4.1.1 停发行、§9.3 换算表)反而没人写。
|
||||
|
||||
其余铁律照旧:**不要凭 grep 估数、不要凭印象决定改哪几处、不要把「不做」只划掉一行。**
|
||||
|
||||
## 口径:三套计数都要挑明,先问再比
|
||||
|
||||
| 口径 | 怎么数 | 用途 |
|
||||
|---|---|---|
|
||||
| 门禁 refs(去重) | 字面量 × 文件 去重 | 门禁趋势、批次验收线 |
|
||||
| 逐行站点 | 每行每次出现 | **排工作量、拆单** |
|
||||
| 门禁 refs(去重) | `ck.refs`:字面量 → 文件集合,**只记属主登记处文档之外**的引用 | 门禁趋势、批次验收线 |
|
||||
| 逐行站点 | 按族正则重扫 `ck.iter_files()` 语料,**含属主文档的定义行** | **排工作量、拆单** |
|
||||
| 自建扫描器站点 | 无识别面族:带标签正则全仓 walk(排除 `.git`) | 该族唯一口径,**不能拿 id-check 输出代替** |
|
||||
|
||||
实测例:保护功能号一族「字面量 28 / 站点 184 / 文件 58」(`ck.refs`)与队友报的「219 站点 / 38 文件」并存且都对。队友报任何合并数(指纹、站点数)之前**先问口径**,不要拿自己的数去否他的数。
|
||||
实测例:保护功能号一族「字面量 28 / 站点 184 / 文件 58」(`ck.refs`)与队友报的「219 站点 / 38 文件」并存且都对。队友报任何合并数(指纹、站点数)之前**先问口径**,不要拿自己的数去否他的数。**每个数字标明是本回合实测、动手前基线还是沿用昨日值**;**形似噪声号另立分母**(中文族一节第 4 步),绝不与待清族合并成一个总数。
|
||||
|
||||
## Steps
|
||||
## Steps(字母+数字族:门禁看得见的那一路)
|
||||
|
||||
1. **确认范围与定调**:先读 `docs/编号规范.md` §4.1(族总表,穷举)与 §9(存量与批次),明确本族属主登记处(`owner_docs_glob`)与判据「有脚本按字面量匹配它」。清退 = 全仓改语义;停发 = 游标冻结、只减不增。
|
||||
2. **按族实测三口径(字面量 / 站点 / 文件),不用 grep 估数**:
|
||||
```bash
|
||||
cd "D:/Code/DTU Code/STM32F4-Base" && ./.venv/Scripts/python.exe -c "
|
||||
import sys; sys.path.insert(0, 'scripts')
|
||||
1. **确认范围与定调**:先按开头的表判识别面(无识别面 → 走下一节);再读 `docs/编号规范.md` §4.1(族总表,穷举)、§4.1.1(已停发栏)与 §9(存量与批次),明确本族属主登记处(`owner_docs_glob`)与判据「有脚本按字面量匹配它」。清退 = 全仓改语义;停发 = 游标冻结、只减不增。
|
||||
2. **按族实测三口径(字面量 / 站点 / 文件),不用 grep 估数**。`Checker.refs` 是 **dict(字面量 → 文件集合)不是方法**,`ck.refs(fam)` 这种写法会 `TypeError`;站点数门禁不直接给,用族正则重扫它自己的语料:
|
||||
```python
|
||||
import sys; sys.path.insert(0, "scripts")
|
||||
import check_ids as ci
|
||||
reg = ci.load_json(ci.REGISTRY_FILE, 'r'); al = ci.load_json(ci.ALIASES_FILE, 'a')
|
||||
ck = ci.Checker(reg, al, verbose=False); ck.run()
|
||||
# 族名以 scripts/id_registry.json 的登记名为准(如 'L-PROT'、'FEAT'、'TC'、'N')
|
||||
for fam in reg['families']:
|
||||
ck.refs(fam['name']) # 站点数 / 字面量数 / 文件数 + 逐字面量落点
|
||||
"
|
||||
reg = ci.load_json(ci.REGISTRY_FILE, "r"); al = ci.load_json(ci.ALIASES_FILE, "a")
|
||||
ck = ci.Checker(reg, al); ck.run() # run() 填充 refs / stats / findings
|
||||
for name in ("N", "S-LDG", "TC", "FEAT"): # 族名以 id_registry.json 的 "name" 为准
|
||||
rx = next(f for f in ck.families if f["name"] == name)["_re"]
|
||||
lits = {l for l in ck.refs if rx.fullmatch(l)} # 字面量(属主文档之外)
|
||||
files = {r for l in lits for r in ck.refs[l]} # 文件
|
||||
sites = sum(len(rx.findall(line))
|
||||
for rel in ck.iter_files() # 与门禁同一语料
|
||||
for line in ck.read(rel).splitlines()) # 含属主文档定义行
|
||||
print(name, "literals", len(lits), "sites", sites, "files", len(files))
|
||||
```
|
||||
把活族清单与每族数字记下来作为**动手前基线**(拆批次与派单依据)。新测试套件发号导致 `id-check` 校验 3 报悬空引用时,**先按号前缀聚合**定位是哪个套件/哪个族(`check_ids.py 2>&1 | grep -a '悬空引用' | ...` 前缀计数),别逐条读。
|
||||
全库扫一遍不便宜(数十秒量级):可丢后台 job,不要和别的长活串在同一个 120s 预算里。把活族清单与每族数字记下来作为**动手前基线**(拆批次与派单依据)。新测试套件发号导致 `id-check` 校验 3 报悬空引用时,**先按号前缀聚合**定位是哪个套件/哪个族(`check_ids.py 2>&1 | grep -a '悬空引用' | ...` 前缀计数),别逐条读。
|
||||
3. **逐族先分类再动手**——不是每个命中的裸形都是编号,四类分治(实测 T1/T2/T3 的 41 处里只有部分是编号):
|
||||
- 真编号 → 语义短语 / 功能名;
|
||||
- 硬件位号(变压器 T1~T3 等)→ 把目录整目录登记进 `check_ids` 的 `excluded_paths`(如 `excluded_paths += tools/netlist_semantics/`),**不逐处改位号名**;
|
||||
- Mermaid 流程图节点名 → 改语义名但**节点数与连线关系不变**,图结构不动;
|
||||
- 数学记号 → 进噪声表;门禁自身的规则名(gitlint `T2 Title has trailing whitespace`)→ 不改。
|
||||
分类前先把剩余每处原文打出来看(`grep -F` 逐文件),否则会把硬件资料改坏。
|
||||
4. **映射表由属主文档生成**:从属主文档取「编号 → 功能名/语义短语」全表(实测 42 个定义 / 28 个在用),改名走 `scripts/rename_ids.py`(映射表驱动 + **显式 scope** + **默认干跑** + 自动往 `scripts/id_aliases.json` 写 scoped 旧号→新号条目)。**绝不全局查找替换**:同一裸形字面量可能同时属多个族(实测 `S3` 三义),全局替换等于造新撞号。
|
||||
5. **按写域拆道并行派单**(代码与测试半 / 文档半 / 某功能面各一条道),同笔用 `send_message` 下发**统一改写口径**(措辞、是否动字符串字面量、生成器归属、冻结历史行怎么处理),避免各道自定措辞。看板任务只认 `team_task_update` 的 `task_id` / `expected_revision` / `action=reassign` / `owner` 四个字段。
|
||||
4. **映射表由属主文档生成**:从属主文档取「编号 → 功能名/语义短语」全表(实测 42 个定义 / 28 个在用),改名走 `scripts/rename_ids.py`(映射表驱动 + **显式 scope** + **默认干跑** + 自动往 `scripts/id_aliases.json` 写 scoped 旧号→新号条目,状态 `renamed` / `retired-to-phrase` / `void`)。**绝不全局查找替换**:同一裸形字面量可能同时属多个族(实测 `S3` 三义),全局替换等于造新撞号。
|
||||
5. **按写域拆道并行派单**(代码与测试半 / 文档半 / 某功能面各一条道),同笔用 `send_message` 下发**统一改写口径**(措辞、是否动字符串字面量、生成器归属、冻结历史行怎么处理),避免各道自定措辞;口径长就先落成 spec 文件(中文族一节第 5 步的做法同样适用)。看板任务只认 `team_task_update` 的 `task_id` / `expected_revision` / `action=reassign` / `owner` 四个字段。
|
||||
6. **门禁配置注释也是本族写入面**:`.pre-commit-config.yaml` 的注释里会挂着功能号(实测 `7h) ADC 采样有效性校验(L1-6)`、`7i) 保护定值模型(P1 / L5-1 载体)`、`规划 §3.3 L3-5`)。配置属 Lead 写域,Lead 自己改(注释不占钩子行为、不影响 51 条钩子口径),但**必须计入批次范围并在提交正文写清是 Lead 改的 config**。
|
||||
7. **每处替换断言命中数**,不做整文件正则批量改写(批量改写会静默漏改):
|
||||
```python
|
||||
@@ -54,7 +67,7 @@ version: 1.0.0
|
||||
t = t.replace(old, new)
|
||||
p.write_text(t, encoding='utf-8')
|
||||
```
|
||||
**token 取最小形态**:文档里被反引号/加粗包住的号,替换单位取反引号形(`` `T4` ``)而**不含 `**` 标记**(第 225 行是 `**裸形 `T4`**`,按「裸形 `T4`」替就命中 0)。讲编号的文档改成**形态描述**(如「字母 T 紧跟数字 4」)能把不可判定绝对数还回余量:实测 4 处 → 982 降到 978,且 lesson 不丢。
|
||||
**token 取最小形态**:文档里被反引号/加粗包住的号,替换单位取反引号形(```T4```)而**不含 `**` 标记**(第 225 行是 `**裸形 `T4`**`,按「裸形 `T4`」替就命中 0)。讲编号的文档改成**形态描述**(如「字母 T 紧跟数字 4」)能把不可判定绝对数还回余量:实测 4 处 → 982 降到 978,且 lesson 不丢。
|
||||
8. **同步更新门禁侧配置**:`check_ids` 的 `excluded_paths` 与噪声表按第 3 步的分类结果改,使剩余命中不再是「假编号」;新测试套件发号的悬空引用要先定**定义位**:
|
||||
- 定义位**只能落一处**——注册表族(`scripts/id_registry.json`)或该套件说明文档,**两处并存比没有定义位更坏**;文档真写出来了(含判据与上板清单)就以文档为准、**撤族**;
|
||||
- 要建族就照现有同类族克隆(`pattern` / `digit_width` / `owner_docs_glob` / `scope` / `cursor`),别自造字段;
|
||||
@@ -62,50 +75,139 @@ version: 1.0.0
|
||||
9. **生成器文本改动必须同笔重跑产物**:`tools/arch_diagram/gen_*.py` 里的 docstring/文案会进产物,`generated-fresh` 把生成器拷到临时目录重跑逐字节比对,**只改源不改产物必红**。这类站点整包转给生成器属主,「谁改谁跑生成器」,脚本 + 全部 svg 产物同一笔:
|
||||
```bash
|
||||
./.venv/Scripts/python.exe tools/arch_diagram/gen_net_instability_svg.py 2>&1 | tail -3
|
||||
python scripts/ci_local.py --only generated-fresh # PASS 后再目检 diff:只应文字变长、框宽自适应(526→551、右缘未越界、画布不变)
|
||||
pre-commit run generated-fresh --all-files # 单钩子复跑必须带 --all-files 或 --files
|
||||
```
|
||||
不把该站点从批次里悄悄丢掉:登记为「待未完成半批」,收口时核对。
|
||||
⚠ **不带这两个参数的裸 `pre-commit run` 会进 staged_files_only 上下文并 stash 别道在飞的改动**(`docs/门禁说明/generated-fresh.md` §2);`pre-commit` 不在 PATH 时改用 `& '.venv\Scripts\python.exe' -m pre_commit run generated-fresh --all-files`。PASS 后再目检 diff:只应文字变长、框宽自适应(526→551、右缘未越界、画布不变)。不把该站点从批次里悄悄丢掉:登记为「待未完成半批」,收口时核对。
|
||||
10. **核队友交付**(按写域并行后必做):
|
||||
- 文件清单**先展开真实路径再比**:按简称匹配会误报丢失(作者列 `phasor.py`/`adc_health.py` 等 8 个,实为 `test/host/<模块>/run_unit_test.py`);用 `git -c core.quotepath=false diff --name-only` 取全路径做集合差。
|
||||
- 合并指纹对不上先问口径:作者按**自定义顺序**算的数 Lead 侧复现不了(`d0a289b7` vs 报的 `a45e7e2b`)。改建 **Lead 自有逐文件 16 位基线**存 `ci-artifacts/lead_lane_b_files.json`,并把**跨道文件单列**(实测 `App/algo/README.md`)——autostash 后按逐文件比对,不假称对上别人的合并数。
|
||||
11. **分笔提交走真实 pre-commit 钩子**:`git add` 用显式清单。坑:`git add -- App/algo` 把文档道的 `App/algo/README.md`(26 处)带上车,正文按 48 只文件写就不准了 → 该笔未 push 时 `--amend` 挪到文档笔并补一句归属说明;`git add -A` 会把别道在飞文件卷进来(覆盖率钩子在他编译不过的半成品上报红)→ 撤出他人域后重跑。提交正文每行 ≤80(gitlint B1),别把 ASCII 双引号写成正文首字符。
|
||||
12. **收口只认门禁自身计数**,并核**只减不增**:
|
||||
12. **收口只认门禁自身计数**(**仅限语料内的族**;无识别面族见下一节第 8~9 步),并核**只减不增**:
|
||||
```bash
|
||||
./.venv/Scripts/python.exe scripts/check_ids.py 2>&1 | grep -aE '扫描|可判定 |不可判定引用' | head -4
|
||||
./.venv/Scripts/python.exe scripts/check_ids.py --strict 2>&1 | tail -1 # [OK] 校验 1~6 无错误
|
||||
```
|
||||
报告「字面量 8787→8299→7828」「不可判定绝对数 1161→984→982→978(上限 1166)」「可判定比例 88.14%(基线 86.0%,容差 0.1pp)」。**绝对数与比例两根线都要报**:把可判定引用改成散文会稀释比值,所以另有不可判定绝对数上限。
|
||||
13. **回写 `docs/编号规范.md`**:§4.1 族表(停发/待清栏)、§9 存量表与批次结果表(只减不增)、§9 清点数字按最终实测同步;表格若保留动手前的清点数,**明确标注「不是当前存量,是动手前基线」**,否则就是拿旧数当现状。变更记录加一行(含用户裁定原文)。
|
||||
报告「字面量 8787→8299→7828」「不可判定绝对数 1161→984→982→978(上限 1166)」「可判定比例 88.14%(基线 86.0%,容差 0.1pp)」。**绝对数与比例两根线都要报**:把可判定引用改成散文会稀释比值,所以另有不可判定绝对数上限。涨点归因见「净室归因」一节。
|
||||
13. **回写 `docs/编号规范.md`**:§4.1 族表(停发/待清栏)、§4.1.1 已停发栏、§9 存量表与批次结果表(只减不增)、§9 清点数字按最终实测同步;表格若保留动手前的清点数,**明确标注「不是当前存量,是动手前基线」**,否则就是拿旧数当现状。变更记录加一行(含用户裁定原文)。
|
||||
14. **裁定「不做」也要写成可执行硬口径入档**(不是只划掉一行——「不做」最容易被读成「那还可以继续发号」):
|
||||
- §4.1「已停发」栏新增该族一行:**游标冻结、现存号只减不增、新用例改用语义化测试函数名 + 文档表格行名**,并写清与「允许继续发号」栏为何不打脸;
|
||||
- §4.1.1「已停发」栏新增该族一行:**游标冻结、现存号只减不增、新用例改用语义化测试函数名 + 文档表格行名**,并写清与「允许继续发号」栏为何不打脸;
|
||||
- §9.1 批次段落写明裁定原文与理由(该族是唯一真被脚本按字面量匹配的族:C 断言标签 + 测试函数名 + 文档用例表三处同一号),并给出**将来真要清退的前置条件**:追溯器(`check_test_traceability.py`)先同时认新旧两种形态、并行核对通过,**不许先改文档再改代码**;
|
||||
- 全文核「等你裁定 / 需你裁定」悬空表述残留数归 0。
|
||||
- 全文核「等你裁定 / 需你裁定」悬空表述残留数归 0;
|
||||
- 无机器识别面的族落地面不同(§4.1.1 一行 + §9.3 换算表 + 叙述同步三处),见下一节第 7 步。
|
||||
|
||||
## Steps(中文前缀族:门禁咬不到的那一路)
|
||||
|
||||
1. **先确认门禁咬不到,并把这句话写进交付**:`scripts/check_ids.py` 的族 pattern 是拉丁形态、中文前缀不进语料 → **id-check 的 refs / 可判定比例 / 悬空引用与本族无关**;报告开头写「本族不在 check_ids 语料内,口径 = 自建扫描器」。
|
||||
2. **销项删行前先核证据属主**(这是删行的唯一许可证):
|
||||
- 先取历史口径:`git log --oneline -20 -- <文档>`、`git show <rev>:<文档> | sed -n '/^## 5/,/^## 6/p'` 找回被删的卡表与当初「完成即销项删行 / 标 ✅ 保留行」的理由;
|
||||
- 核对判据与实测记录**已完整沉淀进属主章节**(实测:「已知电压注入验证」六项判据全 PASS、斜率 6544.2 码/V、偏差 −0.14 % 全在 `docs/硬件平台/ADC通道映射说明.md` §8.1,执行侧在 `docs/测试说明/ADC前端注入验证流程.md`);
|
||||
- **删的是任务规划侧的行与结论块,不是证据本体**;被代码头注释指称的设计约束章节(§2~§4 那类)**原样保留**,只删已完成记录;
|
||||
- 该行若当初是被「代码头注释按号引用」当例外保住的(实测 `App/task/adc_task.c` 的 v3.3 修订行按卡号当口径出处),必须**先把引用侧改成语义短语**,例外才成立撤销,并在规范里写明撤销理由(上一笔「完成即保留行」的例外就是这么随引用侧改动被撤掉的);
|
||||
- 删完逐行通读被改小节,报**行数变化**,不留孤立残句(实测 J7 dropped line 234 len=639、J13 闭环结论块 6 行删除并注明证据属主)。
|
||||
3. **自建带标签正则扫描脚本**——四条硬规矩,全是实测返工换来的:
|
||||
- 脚本**落文件**(`ci-artifacts/scan_ka_refs.py`)再跑,**不用 bash heredoc**(heredoc 里的 `\s` 被多层引号咬坏:`SyntaxWarning: invalid escape sequence` + 语法错);
|
||||
- 正则**一律 raw 字符串**、汉字写 `\uXXXX`:`KA = r"\u5361"`。非 raw 串里 `"\b"` 会先被 Python 解成退格符(0x08)→ 正则**静默失配且不报错**;`"\s"` 只是警告还能跑,`"\b"` 是真错;
|
||||
- **排除 `.git`**(连同 `.venv`、`ci-artifacts`、`__pycache__`、`node_modules`)——实测扫进 `.git/COMMIT_MSG_*.txt`,一堆 GBK 乱码历史被当成残留,越清越多;
|
||||
- 报告**写 UTF-8 文件**(`ci-artifacts/ka_refs.txt`)再本地解析,别靠控制台输出(Windows 控制台按 GBK 渲染中文 = 乱码);判乱码统计 `EF BF BD` 字节数,别信终端渲染。
|
||||
|
||||
```python
|
||||
# -*- coding: utf-8 -*-
|
||||
"""扫描中文前缀任务卡号与同期形似噪声号;报告写 UTF-8 文件。"""
|
||||
import io, os, re
|
||||
KA = r"\u5361" # 卡
|
||||
PATS = [("CARD_ANY", re.compile(KA + r"\s*[0-9]")),
|
||||
("KA0B", re.compile(KA + r"\s*0b")),
|
||||
("KA12", re.compile(KA + r"\s*12")),
|
||||
("M4", re.compile(r"\bM4\b")),
|
||||
("M5", re.compile(r"\bM5\b")),
|
||||
("M6", re.compile(r"\bM6\b"))]
|
||||
SKIP = {".git", ".venv", "ci-artifacts", "__pycache__", "node_modules"}
|
||||
out = io.open("ci-artifacts/ka_refs.txt", "w", encoding="utf-8")
|
||||
for root, dirs, names in os.walk("."):
|
||||
dirs[:] = [d for d in dirs if d not in SKIP]
|
||||
for n in names:
|
||||
p = os.path.join(root, n)
|
||||
try:
|
||||
txt = io.open(p, encoding="utf-8", errors="ignore").read()
|
||||
except OSError:
|
||||
continue
|
||||
for i, line in enumerate(txt.splitlines(), 1):
|
||||
for tag, rx in PATS:
|
||||
if rx.search(line):
|
||||
out.write("===== %s\n" % p) # 同一行可命中多标签 → 按标签分别计数
|
||||
out.write("%d [%s] %s\n" % (i, tag, line.strip()[:200]))
|
||||
out.close()
|
||||
```
|
||||
末尾打 `TOTAL_SITES / FILES / SCANNED / 各标签计数`;**带标签**才拆得开噪声(同一行可同时命中 `CARD_ANY` 与 `KA12`)。
|
||||
4. **该族与形似噪声号分开计数,各自给分母**:一遍扫描出 `TOTAL_SITES 420 FILES 85 SCANNED 1025`,必须再拆成**卡族 288 处 / 56 文件** 与 **里程碑噪声 132 处 / 44 文件**(`M4/M5/M6` 大片落在 `docs/芯片手册/` 参考手册与料号上下文里)。两套数字各自给分母——**「420 处待改」是错的**:把 132 处噪声算进清退范围就会去改芯片手册原文。噪声侧一律保持原样,是否清退等用户单独裁定,**不要顺手做**。
|
||||
5. **派单前写一份 spec 文件**(`ci-artifacts/card_retire_spec.md`),作为各道唯一口径来源,含五块:① 背景与**用户裁定原文**;② 逐号映射表(旧号形态 → 语义短语 → 属主出处);③ 措辞规则(补短语时括号怎么降级、动不动字符串字面量、生成器归属、悬空引用怎么判);④ 硬约束(BOM 原样补回、行尾由 `.gitattributes` 写死、冻结历史行与原始证据不回改、代码头注释引用的设计约束章节保留、带 BOM 文件名单);⑤ 自检与交付格式(逐文件命中数、删了哪几行、残留数、门禁复跑结果)。`send_message` 只发路径 + 关键裁定,长中文正文不要整段塞进消息(一次串多条长消息会撑爆 120s,发出 1 条后 abort,剩余未发)。
|
||||
6. **逐处替换断言命中数**(同第 7 步的 `rep(tag, old, new, want)`),且 `old` 串**从原文取、不凭记忆敲**:本仓中文引号与 ASCII 双引号混用(实测某文档里的「中文引号」其实是 ASCII `"`),凭印象写 `old` 必 `got=0`;断言抛错后先 `git status --porcelain=v1 -- <文件>` 自证文件未被别道改动,再回读该行真身重跑。删行类改动单独记 tag 并打印删了几行、行号与原行长度。多道并行时同一文件常被别道改过:`edit` 报 `file changed since it was read` → 重新 `read` 再改;报 `ReplaceFileW EIO (Win32 1175)` → 先自证文件字节完好(BOM / CRLF / `EF BF BD` 三项)再重试同一笔,不要顺手改内容。
|
||||
7. **落地位置写死(这一族只有这几条兜)**:
|
||||
- `docs/编号规范.md` **§4.1.1「已停发的族」表加一行**,三列齐全,第三列直写「⚠ **机器面空白**:中文前缀不进 `scripts/check_ids.py` 语料 → 门禁咬不到,只有本表 + §9.3 + 评审三条兜;`id_aliases.json` 刻意不登记(登记了机器也看不见,只多一张没人核的表)」;
|
||||
- `docs/编号规范.md` **§9.3 逐号换算表**(旧号形态 → 语义短语 → 现行口径出处;本族实测 14 行 = 0、0b、1~12)+ §9 批次段落 + 变更记录各一行,**写明旧号永久作废、不得重新取走**;
|
||||
- 表内**把形态写成「卡」+ 数字而不复述字面量**:规范本身是门禁语料,复述字面量会把「讲规则的文档」变成自己的引用站点;
|
||||
- **同步叙述**:`AGENTS.md`「文档与图形」的销项条目、`docs/README.md`(例:`数据可信.md = 三项阻塞任务` → 两项)、`docs/任务规划/README.md`、`docs/任务规划/登记簿.md`——「剩余三项」这类旧口径实测归零;
|
||||
- **与有识别面族的判别写进同一张表**:能被脚本按字面量匹配 → 走 `rename_ids.py` + 别名登记;匹配不到(中文前缀、纯散文号、圈号)→ 走规范换算表,**不登记别名**;
|
||||
- 要机械化怎么办:得先给「中文前缀 + 数字」设计候选形态,属追溯机制改造,按 §7.3 单独开卡,**别夹在清退批里顺手做**。
|
||||
8. **替换后三道二次清洗**(缺一必留疤,全部实测过):
|
||||
```bash
|
||||
git grep -c -F '端子 / 子板变比确认' -- . ; git grep -c -F '端子/子板变比确认' -- . # 先数各形态再归一
|
||||
git grep -nE '卡[ ]*[0-9]' -- . ; echo "rc=$?" # 裸跑读 rc;1 = 归零
|
||||
```
|
||||
- **同句重复短语**:编号位置补上的语义短语与原句已有短语撞车 → 扫「同一行里同一短语出现 ≥2 次」(实测 12 行,如 `.pre-commit-config.yaml:401`「运行参数段(「数据可信」运行参数段交付)」、`App/algo/README.md:110`「遥测快照发布(L2 发布侧,「数据可信」遥测快照发布)」)→ 改法是**把括号里的引用降级**成不含该短语的写法(「道D 交付项」「波次」「该点 DoD 原句」),逐处断言命中 = 1,别删信息;
|
||||
- **空格与引号形态归一**:同一语义短语可能有 `端子 / 子板变比确认` 与 `端子/子板变比确认` 两种形态 → **先 `git grep -c -F` 分别数**(实测带空格 8 处),再整文件归一,归一后复扫到 0(残留常藏在表格单元格里,逐行打印定位);引号形态同理;
|
||||
- **固定正则复扫**:`卡[ ]*[0-9]` 全仓无输出。⚠ 判 rc 时**不要把命令接在 `| head` 之后再读 `$?`**(那拿到的是 `head` 的 0,会把「还有残留」读成「已归零」)。
|
||||
9. **收尾复跑 + 清中间产物**:`check_ids.py`(plain 与 `--strict`)、`check_doc_links.py --all`、bom 与乱码两道(`pre-commit run bom-guard --files <改过的文件>`、`pre-commit run no-mojibake --files <改过的文件>`)、`git diff --check`;**纯注释/纯文档改动不算免编译**——仍跑一次 `@build` 取「0 错误 0 警告」且 `Program Size` 与改前同数(**本回合真跑**,引用历史提交正文自报的四个数不算),受影响的主机组单测照跑。最后**删掉 spec 与全部扫描中间产物**,别往 `ci-artifacts/` 再堆 log/txt。
|
||||
|
||||
## 不可判定引用绝对数涨点的净室归因
|
||||
|
||||
「不可判定引用绝对数」比今日低点涨了 N 处时:
|
||||
|
||||
1. **禁止**用「对提交新增行 grep 字母+数字形态」归因:`git diff -U0` 的加行里绝大多数文本是从旧行搬来的**存量上下文**(注释整段重写、表格加一列、Markdown 重新折行),形态匹配数出来的是「哪段文字最近被搬动」,不是「哪里涨了 N 处」——用它归因必然把老引用算成增量。`diff -U0` 只在**已定位到文件之后**用来绑笔次与行号。
|
||||
2. **正解 A(首选,同一计数器相减)**:在**仓外 detached worktree 跑 HEAD 版**(`task-worktree` skill 的净室测量仪;不 stash、不碰在飞工作区),两边都用同一个 `check_ids.py` 计数器导出 `(rel, literal)` 多重集(`ck.findings` 或 `err_groups(ck)`),做**逐文件集合差**,落差的 N 处直接指向具体文件与字面量。
|
||||
3. **正解 B(逐文件注入)**:一次只把一个文件换成在飞版跑计数器——涨点在哪个文件上,就只在注入它时出现;文件多时按 `git diff --name-only` 折半。
|
||||
4. **当轮跑不完就如实说**:本轮未跑净室归因时,只报「现值需要重新实测」并说明**需要跑净室归因**,**不得**给出候选归因对象,**不得**把上一轮的现值或余量当本回合实测值报出(每个数标明来源与时刻)。
|
||||
5. 与其它交付口径冲突的差值**登记为待查项**(两套计数可能都对),不当场判谁对谁错。
|
||||
|
||||
## Pitfalls
|
||||
|
||||
- **拿 grep 计数跟人吵口径**:先跑 Checker 拿实测三口径,再谈拆单;两套计数不一致不是有人算错(见上表)。
|
||||
- **全局查找替换**:跨族撞号(`S3` 三义)。必走 `rename_ids.py` 映射表 + 显式 scope + 干跑。
|
||||
- **拿门禁计数当中文字面量族的口径** → 得出「0 处待改」的假归零(实测该族真实站点 288 处 / 56 文件);先跑自建扫描器报「站点 / 文件」,并在交付里写明该族不在语料内、门禁判不到。
|
||||
- **给无机器识别面的族登记 `id_aliases.json`** → 中文前缀不进语料,登记了机器也看不见,只制造「有门禁兜底」的错觉;执行面是 §4.1.1 停发行 + §9.3 换算表 + 评审。反过来,有识别面的族不登记别名 → 门禁把旧号引用判成悬空。
|
||||
- **拿 grep 计数跟人吵口径**:先拿实测三口径,再谈拆单;两套计数不一致不是有人算错(见上表)。**形似噪声号并进总数** → 把 132 处里程碑噪声算进 420 处待改,动手就改坏 `docs/芯片手册/` 原文。
|
||||
- **heredoc 里嵌 Python 正则 / 中文** → `invalid escape sequence` 与语法错;脚本落文件再跑。中文正则用 **raw 串 + `\uXXXX`**:非 raw 串的 `"\b"` 会被解成退格符,正则**静默失配不报错**。
|
||||
- **扫描没排除 `.git`** → `.git/COMMIT_MSG_*.txt` 的 GBK 乱码历史被当残留,越清越多;**靠控制台看中文** → 一律写 UTF-8 报告文件再解析,判乱码统计 `EF BF BD` 字节数。
|
||||
- **凭记忆敲 `old` 串** → 中文引号与 ASCII 双引号形态不同,命中 0;回读原文取真身,断言前先看 `git status` 自证文件未变。
|
||||
- **替换后不做同句重复检测** → 留下「运行参数段(「数据可信」运行参数段交付)」这类句子(实测 12 行);**同一短语两种空格形态不归一** → 全仓口径漂移(归一前先 `git grep -c -F` 数各形态)。
|
||||
- **换算表里复述字面量** → 讲规则的文档变成自己的引用站点(规范本身在门禁语料里)。
|
||||
- **`| head` 之后读 `$?`** → 永远是 0,把「还有残留」当「已归零」。
|
||||
- **占位符泄漏**:为躲转义把反引号写成 `«` / `»` 再全文替换,落盘后**必须核占位符残留 = 0**(实测 22 行泄漏到本节之外,含不是自己写的行)。
|
||||
- **删行前不核证据属主、不查当初为什么保留** → 要么删掉唯一记录,要么把已撤销的「✅ 保留行」例外当常态。
|
||||
- **涨点归因拿 diff 新增行 grep 形态** → 把存量上下文当增量;**把上一轮现值当本回合实测**、未跑净室归因就报具体归因对象 = 猜测。
|
||||
- **全局查找替换**:跨族撞号(`S3` 三义)。必走 `rename_ids.py` 映射表 + 显式 scope + 干跑;无识别面族则逐处手写 + 断言命中数。
|
||||
- **未分类就动手**:把变压器位号、Mermaid 节点名、数学记号、gitlint 规则名当编号改坏硬件资料;位号目录进 `excluded_paths`,记号进噪声表。
|
||||
- **按简称匹配文件清单** → 误报 8 个文件丢失;比对前展开真实路径。
|
||||
- **复现不了队友的合并指纹就怀疑丢文件**:先问口径(自定义顺序不可复现),改落自有逐文件 16 位基线并把跨道文件单列。
|
||||
- **替换 token 含 `**` 加粗标记** → 命中数断言 0;取反引号最小形态。
|
||||
- **只改生成器文案不重跑产物** → `generated-fresh` 必红(实证 `0f7b5a87` 同类);「反正就是注释,不影响图」是错的,该文本进产物。
|
||||
- **`grep 'A\|B'` 空返回当文件干净**:交替竖线在多层 bash 引号里被吃掉,是探针坏不是文件干净 → 反证为空的搜索必须换 `grep -F` 复测。
|
||||
- **bash heredoc 里嵌 Python 单引号 / 多层引号** → `SyntaxError: unterminated`;长中文 python 一律 `fs` 落盘 `ci-artifacts/*.py` 再跑。
|
||||
- **一次 run_code 串 `5 × wait_agent(118000)` ≈ 590s 整段 abort、进度全丢**;且一次串多条长中文 `send_message` 也撑爆 120s(发出 1 条后 abort,剩余未发)。轮询上限 4×118s,长消息拆开发。
|
||||
- **游标整型比较静默不生效**(字符串形态);抬完用 `--strict` 与 plain 双验。
|
||||
- **`git add` 目录路径带进别道文件**、`git add -A` 卷进在飞改动;撤销自己的改动只按文件点名 `git restore scripts/id_registry.json`,不碰同树其它道文件。
|
||||
- **amend 被 gitlint B1 拦**:正文行 >80,别把 ASCII 双引号写成正文首字符。
|
||||
- **改「只动注释」要拿机器证据**:`@build` 0 错 0 警且 `Program Size` 与改前**逐字节同数**(实测三方互证),别口头承诺。
|
||||
- **改「只动注释」要拿机器证据**:`@build` 0 错 0 警且 `Program Size` 与改前**逐字节同数**(本回合真跑,引用历史提交正文自报的数字不算证据),别口头承诺。
|
||||
- **冻结历史与原始证据不改**:boot 串口日志等采集现场是冻结证据,改了就是篡改;历史「修改记录」行按裁定保持改名后形态(号已全仓退役,留一个查无此号的引用比留改过名的条目更坏)。
|
||||
- **`*.uvprojx` 抖动不入库**。
|
||||
- **`*.uvprojx` 抖动不入库**;`ci-artifacts/` 里的 spec 与扫描中间产物收尾删掉,别当交付物留下。
|
||||
|
||||
## Verification
|
||||
|
||||
1. `scripts/check_ids.py --strict` 与 plain **均 rc=0**(`[OK] 校验 1~6 无错误`),悬空引用为 0。
|
||||
2. 编号字面量与**不可判定引用绝对数**只降不升、不超 `undecidable_total_ceiling`;可判定比例不低于 `id_registry.json` 基线(86.0%)。
|
||||
3. 本族剩余站点复扫归零(`ck.refs` 逐字面量打印);除冻结历史/原始证据行外无残留。
|
||||
4. `python scripts/ci_local.py --only generated-fresh` PASS + 目检 svg diff 只有文案与框宽自适应;`check_doc_links.py --all` 通过。
|
||||
5. `@build`:`BUILD=0`、0 错 0 警、`Program Size` 与改前同数(零行为改动证据);相关主机组(如 `net_socket 457/457`)全绿。
|
||||
3. 本族剩余站点复扫归零:有识别面族从 `ck.refs` 按族正则过滤字面量逐条打印;除冻结历史/原始证据行外无残留。
|
||||
4. `pre-commit run generated-fresh --all-files` PASS + 目检 svg diff 只有文案与框宽自适应(只在动过生成器时适用);`check_doc_links.py --all` 通过。
|
||||
5. `@build`:`BUILD=0`、0 错 0 警、`Program Size` 与改前同数(零行为改动证据,**本回合真跑**);相关主机组(如 `net_socket 457/457`)全绿。
|
||||
6. 真实 pre-commit 钩子全绿(如 `passed=33 failed=0`);提交笔内不含他道文件。
|
||||
7. 规范与台账已回写并复跑核数:自己先前写进规范的清点数字要么按最终实测改对,要么标明为动手前基线;「等你裁定」残留 = 0;「不做」裁定已在 §4.1 + §9.1 + 变更记录三处落地。
|
||||
7. 规范与台账已回写并复跑核数:自己先前写进规范的清点数字要么按最终实测改对,要么标明为动手前基线;「等你裁定」残留 = 0;「不做」裁定已在 §4.1.1 + §9.1 + 变更记录三处落地。
|
||||
8. **无识别面族**:`git grep -nE '卡[ ]*[0-9]' -- .` 无输出(裸跑读 rc);自建扫描器的站点/文件数与提交正文一致;交付里明写「本族不在 check_ids 语料内、门禁判不到」与「刻意不进 `id_aliases.json`」的理由;§4.1.1 停发行 + §9.3 换算表 + 变更记录三处齐全,换算表行数 = 该族字面量数(实测 14),且写明旧号永久作废、不得重新取走。
|
||||
9. **二次清洗三道各有实测数**:同句重复短语 0 行、各空格形态先计数后归一(复扫 0)、固定正则残留 0;被代码头注释引用的设计约束章节仍在(`git diff` 里没被动过)。
|
||||
10. **叙述同步**:`AGENTS.md` / `docs/README.md` / `docs/任务规划/README.md` / `docs/任务规划/登记簿.md` 里旧口径(「三项」「卡 N」类)实测归零;`ci-artifacts/` 里本次 spec 与中间产物已删。
|
||||
11. 门禁复跑清单齐:`check_ids.py` plain + `--strict`、`check_doc_links.py --all`、`bom-guard`、`no-mojibake`、`git diff --check`、`@build` 或受影响单测——**每个数字标明是本回合实测**。
|
||||
|
||||
+4
-3
@@ -190,7 +190,7 @@ P-6 号必须能反查到定义(属主登记处得存在)· P-7 编号不语
|
||||
|
||||
### 5.5 销项与归档
|
||||
删登记行 + **同步清掉全仓引用**(清引用是销项的一部分,不是"以后再说")+ 别名表标 `void`。
|
||||
冻结的历史(变更记录行、`[示例]` / `[计划]` 行)不回改,门禁对它们已豁免。
|
||||
冻结的历史(变更记录行、`[示例]` / `[计划]` 行)不回改,门禁对它们已豁免。**唯一例外**(用户裁定 2026-10-28):这类行里**已停发 / 作废族的示例编号**可改成形态描述(写成「字母紧跟数字」这类说法)——改的是示例的写法,不是历史事实;**保留现存号**族的游标数字与硬件位号举例不在例外内,形态化等于毁证据。
|
||||
|
||||
### 5.7 语义标识的登记与别名
|
||||
短语就是登记处的行名,不需要别名表;**只有"号转短语"**时才在别名表留一条 `retired-to-phrase`,
|
||||
@@ -440,11 +440,12 @@ P-6 号必须能反查到定义(属主登记处得存在)· P-7 编号不语
|
||||
|
||||
| 日期 | 变更 | 说明 |
|
||||
|---|---|---|
|
||||
| 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-DRV-9`(§7 从无定义行)删号留事实、不补定义;13 个旧号标 `retired-to-phrase`。刻意不动:§7 编号列(历史对照)、`BSD_Socket_API_使用指南.md` 变更记录行、`docs/硬件平台/` 位号、Mermaid 节点名。`scripts/id_registry.json` FEAT `cursor_note` 改记停发口径(三模块各有最高号 → 不冻结游标的理由写在里面)。零代码语义变更。 |
|
||||
| 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/id_registry.json` FEAT `cursor_note` 改记停发口径(三模块各有最高号 → 不冻结游标的理由写在里面)。零代码语义变更。 |
|
||||
| 2026-10-27 | **停发机械化落地:34 个 `TC-HOST-*` 子族游标冻结,§8 校验 5 开始咬新配的 TC 号** | 上一笔把缺口登记为「停发今天只有规范效力」并写明机械化怎么做;本笔照它落地、把话兑现:`scripts/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-x`、已删报告的 UI 簇 `U1~U5` 共 20 个号转成语义短语(约 418 处)——登记簿表首格就是短语,旧号进 `scripts/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-26 | **编号治理收口:清死号 → 停发活号 → 本文重写为短版(用户三次裁定)** | 全仓字母+数字编号 10,956 → 8,230 处。① **清死号**:属主登记处已删或从未启用的号一律就地删号留事实、禁补号(文本实删约 1,557 处)。② **停发活号**:登记簿 `N-x`/`S-x`/`T-x`、专项(A 前缀 + 数字)、已删报告的 UI 簇(字母 U 紧跟一位数字,区间两端即该簇首尾两枚)共 20 个号转成语义短语(约 418 处)——登记簿表首格就是短语,旧号进 `scripts/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对其他文档「冻结历史不回改」的约束。 |
|
||||
|
||||
Reference in New Issue
Block a user