依据(逐条回配置核实):三处配置里 id_registry / check_ids / id_known_backlog 命中数全为 0,没有任何活物再读编号登记; check_test_traceability.py 存在但没被任何配置跑;变更记录例外 清单实测只剩 5 篇。 改写要点:TC 框把「registry 带游标所以允许发」改成裁定留痕并 明写别把不报错读成允许发号;删掉探针行与自相矛盾的 7 行; §4.1.1 四处现在时(已冻结 / 越游标即拦 / 发号口已关闭 / 校验 错误级)改历史口径,中文前缀族改成「从来没有机器面」;§4.3 点明冻结前缀是档案不是闸门;§5.1 三步改成「族落在 §4.1 之 内 → 属主登记处写定义行 → 才允许引用」;§5.5 删掉「门禁已 豁免」口气并不再复述份数;§8 标题改「一道也没有」;§8.5 由 退役路线流水表整体替换为「手工普查与恢复机器面」(两条归档 命令 + 恢复成本三步 + 退役理由与 WAVE00 误拦),§8 / §8.5 编号刻意保留以免外部引用断链。 指针同步:AGENTS.md 与配置注释里的「§8.5 路线」改成新节名; id-family-semantic-migration 的 SKILL.md 与两份 reference 把 §9 事实源指针改指归档、把「门禁咬不到」措辞改成「连归档扫描 工具都咬不到」。 校验:本篇逐篇 check_doc_links --sections-strict rc=0(60 处 引用 / 58 可判定 97 % / 无法判定 0);check_skill_size rc=0; 表格列数 0 处不一致;无 BOM / CR / 乱码 / 行尾空格,单 LF 收尾; YAML 解析钩子声明数仍 51(配置只改注释)。
10 KiB
Steps(中文前缀族:连归档扫描工具都咬不到的那一路)(自 SKILL.md 外置)
本文由 id-family-semantic-migration 的 SKILL.md「Steps(中文前缀族:门禁咬不到的那一路)」一节逐字外置而来(渐进展开:主文件只留索引与指针)。步骤号沿用原文,未重编。
-
先确认连归档扫描工具也咬不到,并把这句话写进交付(两道编号门禁已退役,机器面整体消失):
scripts/archive/id_gate/check_ids.py的族 pattern 是拉丁形态、中文前缀不进语料 → id-check 的 refs / 可判定比例 / 悬空引用与本族无关;报告开头写「本族不在 check_ids 语料内,口径 = 自建扫描器」。 -
销项删行前先核证据属主(这是删行的唯一许可证):
- 先取历史口径:
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 行删除并注明证据属主)。
- 先取历史口径:
-
自建带标签正则扫描脚本——四条硬规矩,全是实测返工换来的:
- 脚本落文件(
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字节数,别信终端渲染。
# -*- 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)。 - 脚本落文件(
-
该族与形似噪声号分开计数,各自给分母:一遍扫描出
TOTAL_SITES 420 FILES 85 SCANNED 1025,必须再拆成卡族 288 处 / 56 文件 与 里程碑噪声 132 处 / 44 文件(M4/M5/M6大片落在docs/芯片手册/参考手册与料号上下文里)。两套数字各自给分母——「420 处待改」是错的:把 132 处噪声算进清退范围就会去改芯片手册原文。噪声侧一律保持原样,是否清退等用户单独裁定,不要顺手做。 -
派单前写一份 spec 文件(
ci-artifacts/card_retire_spec.md),作为各道唯一口径来源,含五块:① 背景与用户裁定原文;② 逐号映射表(旧号形态 → 语义短语 → 属主出处);③ 措辞规则(补短语时括号怎么降级、动不动字符串字面量、生成器归属、悬空引用怎么判);④ 硬约束(BOM 原样补回、行尾由.gitattributes写死、冻结历史行与原始证据不回改、代码头注释引用的设计约束章节保留、带 BOM 文件名单);⑤ 自检与交付格式(逐文件命中数、删了哪几行、残留数、门禁复跑结果)。send_message只发路径 + 关键裁定,长中文正文不要整段塞进消息(一次串多条长消息会撑爆 120s,发出 1 条后 abort,剩余未发)。 -
逐处替换断言命中数(同第 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三项)再重试同一笔,不要顺手改内容。 -
落地位置写死(这一族只有这几条兜):
docs/编号规范.md§4.1.1「已停发的族」表加一行,三列齐全,第三列直写「⚠ 这一族从来没有机器面:中文前缀不进任何编号语料(族 pattern 全是拉丁形态),而两道编号门禁已于 2026-10-28 / 29 退役 → 只有本表 + 归档换算表 + 评审三条兜;id_aliases.json刻意不登记(没有机器读者,登记等于多一张没人核的表)」;scripts/archive/id_gate/编号治理历史.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 单独开卡,别夹在清退批里顺手做。
-
替换后三道二次清洗(缺一必留疤,全部实测过):
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,会把「还有残留」读成「已归零」)。
- 同句重复短语:编号位置补上的语义短语与原句已有短语撞车 → 扫「同一行里同一短语出现 ≥2 次」(实测 12 行,如
-
收尾复跑 + 清中间产物:
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。