refactor(编号): 16 个测试模块码单词化 + 门禁识别面连带放宽

批 2(用户授权改名 + 「新名要一眼看懂」裁定)
- 16 个有歧义模块码单词化,共 1,146 处随 scripts/rename_ids.py 改写:
  AI→ADCIN、AH→ADCHEALTH、PS→PROTSET、PE→PROTELEM、PH→PHASOR、
  TS→TIMESYNC、VL→VOLLOCK、NP→NANDPORT、CFG→CONFIG、CLK→SYSCLK、
  WD→WATCHDOG、STO→STORAGE、SH→SHA256、FA→FTPAUTH、FR→FREQ、104→IEC104
- 不动 NET/GD5F/RTC/SOE/UI/ADC/LOG/RS485/TOOL(已是单词、芯片名或业界通用词,
  改了纯属 churn)
- 别名按全局登记:这批字面量已完全限定(TC-<码>-<nnn>),不存在裸形多义
- 映射表存档 scripts/rename_maps/batch2.json 作审计轨迹;§6 模块码表同步

连带修门禁(关键教训)
- 模块码涨到 9 位(ADCHEALTH/WATCHDOG)后,候选正则与族正则的 {0,4} 上界
  会让改名后的号**整批从门禁眼里消失**:实测编号字面量从 8271 掉到 7315、
  悬空假降 490 处。已放宽到 {0,9} 并写进 §6 注记
- 结论:改名批次必须连带复核识别面,只改数据不改判据 = 静默放行;
  这次是靠「可判定比例跌破基线即失败」那条线拦下来的

现状与遗留
- 校验 1 未登记前缀 0 处;可判定比例 82.71%(基线 82.6%,只涨不跌成立)
- 遗留:7 个模块的「单元测试说明.md」仍缺(PROTSET 116、NANDPORT 109、
  PROTELEM 65、FREQ 48、FTPAUTH 45、SHA256 25、SOE 14 处悬空)——改名不解决
  缺文档,处置方式待议
- 遗留:T-2/T-3/T-4/T-6 历史任务号悬空(别名表未收全,属本工具批次漏项)
- 未改任何 C/H 可编译语义(仅注释与宏名内的编号),故不需 @build
This commit is contained in:
2026-10-21 09:53:28 +08:00
parent 301c3e5183
commit bda7ab2b50
45 changed files with 3706 additions and 1295 deletions
+1 -1
View File
@@ -63,7 +63,7 @@ TRACE_SCRIPT = REPO_ROOT / "scripts" / "check_test_traceability.py"
# 候选池:任何「1~4 位大写字母 + 连字符 + 数字」先进来,再判是否登记过。
# 三段式(TC-NET-1501 / TRAP-NET-18)单独一条——中段可能含数字(GD5F),
# 只用两段式正则会截出 "NET-1501" 这种假前缀。
CAND_MOD = re.compile(r"(?<![\w./\\-])([A-Z][A-Z0-9]{0,3})-([A-Z][A-Z0-9]{0,4})-(\d{1,4}[A-Za-z]?)(?![\w-])")
CAND_MOD = re.compile(r"(?<![\w./\\-])([A-Z][A-Z0-9]{0,3})-([A-Z][A-Z0-9]{0,9})-(\d{1,4}[A-Za-z]?)(?![\w-])")
CAND_HYPH = re.compile(r"(?<![\w./\\-])([A-Z][A-Z0-9]{0,3})-(\d{1,4}[A-Za-z]?)(?![\w-])")
CAND_BARE = re.compile(r"(?<![\w.\-/])([A-Z])(?:\.(\d))?(1[0-9]|[0-9])(?![\w.\-])")
+2376 -1
View File
File diff suppressed because it is too large Load Diff
+10 -8
View File
@@ -373,7 +373,7 @@
"name": "TC",
"class": "TC",
"title": "测试用例(§4.1 在册保留,机器解析族)",
"pattern": "\\bTC-[A-Z][A-Z0-9]{0,4}-[0-9]{2,4}[a-z]?\\b",
"pattern": "\\bTC-[A-Z][A-Z0-9]{0,9}-[0-9]{2,4}[a-z]?\\b",
"owner_docs_glob": [
"docs/测试说明/*_Test_Guide.md",
"docs/测试说明/*单元测试说明.md",
@@ -396,13 +396,14 @@
"用例",
"指南",
"说明"
]
],
"module_code_note": "2026-10-20 批 2 模块码单词化后码长可达 9 位(ADCHEALTH/WATCHDOG),{0,4} 放宽到 {0,9};不放宽会让改名后的号整批从门禁眼里消失(实测漏 950 处)"
},
{
"name": "TC-UPPER",
"class": "TC",
"title": "测试用例(大写后缀形态,§7.1 待统一小写)",
"pattern": "\\bTC-[A-Z][A-Z0-9]{0,4}-[0-9]{2,4}[A-Z](?![A-Za-z])\\b",
"pattern": "\\bTC-[A-Z][A-Z0-9]{0,9}-[0-9]{2,4}[A-Z](?![A-Za-z])\\b",
"owner_docs_glob": [
"docs/测试说明/*.md"
],
@@ -410,7 +411,8 @@
"frozen": true,
"cursor": null,
"check_dangling": false,
"malformed": "大写后缀非法:§4.1 规定后缀只允许 -<小写字母>(§7.1 统一为小写)"
"malformed": "大写后缀非法:§4.1 规定后缀只允许 -<小写字母>(§7.1 统一为小写)",
"module_code_note": "2026-10-20 批 2 模块码单词化后码长可达 9 位(ADCHEALTH/WATCHDOG),{0,4} 放宽到 {0,9};不放宽会让改名后的号整批从门禁眼里消失(实测漏 950 处)"
},
{
"name": "TC-NOMOD",
@@ -431,7 +433,7 @@
"name": "TM",
"class": "TM",
"title": "测试阶段(§4.1 在册保留,模块码取 §6)",
"pattern": "\\bTM-[A-Z][A-Z0-9]{0,4}-[0-9]{2}\\b",
"pattern": "\\bTM-[A-Z][A-Z0-9]{0,9}-[0-9]{2}\\b",
"owner_docs_glob": [
"docs/测试说明/*.md"
],
@@ -452,7 +454,7 @@
"name": "DP",
"class": "DP",
"title": "测试设计原则(§4.1 目标形态带模块码)",
"pattern": "\\bDP-[A-Z][A-Z0-9]{0,4}-[0-9]{2}\\b",
"pattern": "\\bDP-[A-Z][A-Z0-9]{0,9}-[0-9]{2}\\b",
"owner_docs_glob": [
"docs/测试说明/*.md"
],
@@ -492,7 +494,7 @@
"name": "TRAP",
"class": "TRAP",
"title": "陷阱记录(§4.2 保留原号,历史证词高频锚点)",
"pattern": "\\bTRAP-[A-Z][A-Z0-9]{0,4}-[0-9]{2}\\b",
"pattern": "\\bTRAP-[A-Z][A-Z0-9]{0,9}-[0-9]{2}\\b",
"owner_docs_glob": [
"docs/问题记录/*_Trap_Records.md"
],
@@ -516,7 +518,7 @@
"name": "FEAT",
"class": "FEAT",
"title": "网络层功能/驱动改进项 F-<MOD>-<nn>(§4 总表缺这一族)",
"pattern": "\\bF-[A-Z][A-Z0-9]{0,3}-[0-9]{1,2}\\b",
"pattern": "\\bF-[A-Z][A-Z0-9]{0,9}-[0-9]{1,2}\\b",
"owner_docs": [
"docs/网络/网络自愈架构设计.md"
],
+10 -4
View File
@@ -88,12 +88,16 @@ def match_files(patterns, candidates):
def render(template, groups):
"""按模板渲染新号。**只有模板带格式说明符时**才把数字组转 int——
否则 `TC-PROTSET-011` 会被渲染成 `TC-PROTSET-11`(丢前导零,实测差点毁掉整批补零形态)。"""
vals = {}
for k, v in groups.items():
if v is None:
vals[k] = ""
elif v.isdigit() and re.search(r"\{%s:[^}]+\}" % re.escape(k), template):
vals[k] = int(v)
else:
vals[k] = int(v) if v.isdigit() else v
vals[k] = v
return template.format(**vals)
@@ -149,18 +153,20 @@ def merge_aliases(new_aliases, batch):
"""把本批 `旧号 → 新号` 并进 id_aliases.json,带 scope(同字面量多义的关键)。"""
doc = json.loads(ALIASES_FILE.read_text(encoding="utf-8"))
table = doc.setdefault("aliases", {})
scope = [norm(x) for x in batch.get("files", [])]
# 已**完全限定**的字面量(如 `TC-PROTSET-011`)可以全局认别名;裸形(`S3`)必须带 scope
scope = [] if batch.get("global_alias") else [norm(x) for x in batch.get("files", [])]
added = 0
for old, news in sorted(new_aliases.items()):
scope_txt = ("旧号仅在本批 scope 内指向新号;scope 外同字面量属其它族,不受本条影响"
if scope else "全库生效(本批无 scope)")
if scope else "全库生效(本批字面量已完全限定,无歧义)")
entry = {
"to": sorted(news)[0] if len(news) == 1 else sorted(news),
"status": "renamed",
"scope": scope,
"note": "%s(scripts/rename_ids.py 批:族 %s)|%s"
% (batch.get("note", "批量改名"), batch.get("family"), scope_txt),
}
if scope:
entry["scope"] = scope
cur = table.get(old)
if cur is None:
table[old] = entry
+25
View File
@@ -0,0 +1,25 @@
{
"schema": 1,
"batch": "批 2(模块码单词化,16 个有歧义的码)",
"applied_by": "scripts/rename_ids.py",
"record": "docs/编号规范.md §6 模块码表 + §8.3 迁移批次记录",
"note": "字面量已完全限定(TC-<旧码>-<nnn>),故别名全局生效;裸形族才需要 scope",
"batches": [
{"family": "TC-ADCIN", "old": "\\bTC-AI-(?P<n>[0-9]{1,4}[a-zA-Z]?)\\b", "new": "TC-ADCIN-{n}", "global_alias": true, "files": ["*", "*/*", "*/*/*", "*/*/*/*", "*/*/*/*/*", "*/*/*/*/*/*"], "note": "批 2:模块码 AI → ADCIN(App/algo/adc_input;与 AH 只差一个字母)"},
{"family": "TC-ADCHEALTH", "old": "\\bTC-AH-(?P<n>[0-9]{1,4}[a-zA-Z]?)\\b", "new": "TC-ADCHEALTH-{n}", "global_alias": true, "files": ["*", "*/*", "*/*/*", "*/*/*/*", "*/*/*/*/*", "*/*/*/*/*/*"], "note": "批 2:模块码 AH → ADCHEALTH(App/algo/adc_health)"},
{"family": "TC-PROTSET", "old": "\\bTC-PS-(?P<n>[0-9]{1,4}[a-zA-Z]?)\\b", "new": "TC-PROTSET-{n}", "global_alias": true, "files": ["*", "*/*", "*/*/*", "*/*/*/*", "*/*/*/*/*", "*/*/*/*/*/*"], "note": "批 2:模块码 PS → PROTSET(App/algo/prot_set 保护定值)"},
{"family": "TC-PROTELEM", "old": "\\bTC-PE-(?P<n>[0-9]{1,4}[a-zA-Z]?)\\b", "new": "TC-PROTELEM-{n}", "global_alias": true, "files": ["*", "*/*", "*/*/*", "*/*/*/*", "*/*/*/*/*", "*/*/*/*/*/*"], "note": "批 2:模块码 PE → PROTELEM(App/algo/prot_elm 保护元件/判据)"},
{"family": "TC-PHASOR", "old": "\\bTC-PH-(?P<n>[0-9]{1,4}[a-zA-Z]?)\\b", "new": "TC-PHASOR-{n}", "global_alias": true, "files": ["*", "*/*", "*/*/*", "*/*/*/*", "*/*/*/*/*", "*/*/*/*/*/*"], "note": "批 2:模块码 PH → PHASOR(App/algo/phasor + sample_ring)"},
{"family": "TC-TIMESYNC", "old": "\\bTC-TS-(?P<n>[0-9]{1,4}[a-zA-Z]?)\\b", "new": "TC-TIMESYNC-{n}", "global_alias": true, "files": ["*", "*/*", "*/*/*", "*/*/*/*", "*/*/*/*/*", "*/*/*/*/*/*"], "note": "批 2:模块码 TS → TIMESYNC(App/sync/time_sync;TS 与 test suite / 时间戳 撞义)"},
{"family": "TC-VOLLOCK", "old": "\\bTC-VL-(?P<n>[0-9]{1,4}[a-zA-Z]?)\\b", "new": "TC-VOLLOCK-{n}", "global_alias": true, "files": ["*", "*/*", "*/*/*", "*/*/*/*", "*/*/*/*/*", "*/*/*/*/*/*"], "note": "批 2:模块码 VL → VOLLOCK(App/fs/vol_lock 卷锁)"},
{"family": "TC-NANDPORT", "old": "\\bTC-NP-(?P<n>[0-9]{1,4}[a-zA-Z]?)\\b", "new": "TC-NANDPORT-{n}", "global_alias": true, "files": ["*", "*/*", "*/*/*", "*/*/*/*", "*/*/*/*/*", "*/*/*/*/*/*"], "note": "批 2:模块码 NP → NANDPORT(dhara NAND 移植层;原名看不出是移植层)"},
{"family": "TC-CONFIG", "old": "\\bTC-CFG-(?P<n>[0-9]{1,4}[a-zA-Z]?)\\b", "new": "TC-CONFIG-{n}", "global_alias": true, "files": ["*", "*/*", "*/*/*", "*/*/*/*", "*/*/*/*/*", "*/*/*/*/*/*"], "note": "批 2:模块码 CFG → CONFIG(App/cfg + Drivers/BSP/NETCFG)"},
{"family": "TC-SYSCLK", "old": "\\bTC-CLK-(?P<n>[0-9]{1,4}[a-zA-Z]?)\\b", "new": "TC-SYSCLK-{n}", "global_alias": true, "files": ["*", "*/*", "*/*/*", "*/*/*/*", "*/*/*/*/*", "*/*/*/*/*/*"], "note": "批 2:模块码 CLK → SYSCLK(App/util/sys_clock;CLK 也泛指任何时钟信号)"},
{"family": "TC-WATCHDOG", "old": "\\bTC-WD-(?P<n>[0-9]{1,4}[a-zA-Z]?)\\b", "new": "TC-WATCHDOG-{n}", "global_alias": true, "files": ["*", "*/*", "*/*/*", "*/*/*/*", "*/*/*/*/*", "*/*/*/*/*/*"], "note": "批 2:模块码 WD → WATCHDOG(App/util/task_watchdog;WD 也读作『喂狗动作』)"},
{"family": "TC-STORAGE", "old": "\\bTC-STO-(?P<n>[0-9]{1,4}[a-zA-Z]?)\\b", "new": "TC-STORAGE-{n}", "global_alias": true, "files": ["*", "*/*", "*/*/*", "*/*/*/*", "*/*/*/*/*", "*/*/*/*/*/*"], "note": "批 2:模块码 STO → STORAGE(存储栈 FTL+FatFs+App/fs;STO 易读成 stop)"},
{"family": "TC-SHA256", "old": "\\bTC-SH-(?P<n>[0-9]{1,4}[a-zA-Z]?)\\b", "new": "TC-SHA256-{n}", "global_alias": true, "files": ["*", "*/*", "*/*/*", "*/*/*/*", "*/*/*/*/*", "*/*/*/*/*/*"], "note": "批 2:模块码 SH → SHA256(App/util/sha256;算法名应写全)"},
{"family": "TC-FTPAUTH", "old": "\\bTC-FA-(?P<n>[0-9]{1,4}[a-zA-Z]?)\\b", "new": "TC-FTPAUTH-{n}", "global_alias": true, "files": ["*", "*/*", "*/*/*", "*/*/*/*", "*/*/*/*/*", "*/*/*/*/*/*"], "note": "批 2:模块码 FA → FTPAUTH(Drivers/BSP/NET/lftpd 鉴权)"},
{"family": "TC-FREQ", "old": "\\bTC-FR-(?P<n>[0-9]{1,4}[a-zA-Z]?)\\b", "new": "TC-FREQ-{n}", "global_alias": true, "files": ["*", "*/*", "*/*/*", "*/*/*/*", "*/*/*/*/*", "*/*/*/*/*/*"], "note": "批 2:模块码 FR → FREQ(App/algo/freq L2.5 测频)"},
{"family": "TC-IEC104", "old": "\\bTC-104-(?P<n>[0-9]{1,4}[a-zA-Z]?)\\b", "new": "TC-IEC104-{n}", "global_alias": true, "files": ["*", "*/*", "*/*/*", "*/*/*/*", "*/*/*/*/*", "*/*/*/*/*/*"], "note": "批 2:数字模块码 104 → IEC104(§6 表里本就写 I104,代码写成纯数字 104;纯数字不是模块码)"}
]
}