chore(编号): 存量编号全量转语义短语,门禁识别面与语料同批重打

登记簿、文档与代码注释里的存量字母加数字编号(N-x / S-x / T-x / E-x / A-x / 卡号)
一律改写为语义短语,净删 2,028 处引用;删除基线与待确认、并行分道方案、排期详述、
采集保护收尾 4 篇(内容已并入 docs/任务规划/README 与登记簿)。

门禁机器与三张账同批重打:check_ids.py 新增变更记录行豁免与第二根护栏
undecidable_total_ceiling;check_test_traceability.py 只加 stdout/stderr UTF-8
reconfigure(TC_RE 未动);check_cubemx_survival.py 的 --write 固定 newline=LF;
id_registry / id_aliases(+19 条 retired-to-phrase)/ id_known_backlog 重打。

test/ 56 个文件同步 TC 标签语义化,其中 18 个 TU 改了 CHECK / printf 里的标签文字,
是本批唯一改变构建产物的文件集合。

为什么合成一笔、不拆四笔(实测撞闸,非偏好):pre-commit 跑钩子前会 stash 未 staged
部分,拆开后中间提交必然是「新规则 + 旧语料」——实跑可判定 85.15% < 基线 86.00%、
不可判定 1,453 > 上限 1,166,编号门禁直接拦下。编号识别面与它描述的语料只能同码移动。

实跑基线(工作区全量):754 文件 / 8,230 处编号字面量 / 可判定 7,079 = 86.01%
(基线 86.0%,容差 0.1pp)/ 不可判定绝对数 1,151(上限 1,166)/ 校验 1-6 错误级 0 /
告警 = 悬空 2(App/algo/freq.c 的 S2,属 §4.4 同号不同义)+ 孤儿 50。

基线从 84.0 抬到 86.0 的理由见 docs/门禁说明/id-check.md §7.6:本批真删了 2,028 处
引用,可判定面随真实内容上升,不是把分母做小。同批新增排除 docs/硬件平台/ 语料,使
识别面少 264 处——芯片手册位号与网表料号不属编号空间(registry 有 excluded_paths_note)。

⚠ 余量只剩 0.11pp(约 10 处)与绝对数 15 处:把「可判定的引用」改成散文会立刻撞第二
根护栏。另遗留一项:id_aliases 里 retired 的 N / S / T / A 别名没有 scope(U1~U5 有),
今后有人新写一个 A-4,校验 3 不会响,只能靠人,建议下批补 scope。

固件不变证据:115 个 .c/.h 剥注释并归一字符串后与 HEAD 逐字节全等,残留代码差异 0;
App / Src / Drivers 的字符串字面量零改动。@build 0 错误 0 警告;40/40 主机套件、2,889
断言全通过;覆盖率 line 89.2% / func 92.6%;pre-commit 48 钩子 --all-files 全绿;
check_doc_links --all 通过(176 文档,章节引用无法判定 0);逐字节卫生核过:14 个带
BOM 文件与 HEAD 一致、0 个 CR、0 个 U+FFFD,字符串字面量纯 ASCII。

.cubemx_survival_baseline.json 的 watchdog-module 哈希 56bf27 变 2bb051 属合法:
Src/freertos.c 的 USER CODE 区内只有注释文字随编号改写,代码未变。

同批带上体积同码凭证与 RAM 台账行(@build 之后盖戳):RW_IRAM1 79,008 B / 60.3%,
RW_CCM 57,376 B / 87.9%,阈值 92%。
This commit is contained in:
2026-10-26 12:28:14 +08:00
parent 7635480e06
commit 0f7b5a87fb
253 changed files with 2234 additions and 4541 deletions
+32 -32
View File
@@ -47,15 +47,15 @@ static void tc_roundtrip(void)
soe_rec_build(rec, (uint8_t)SOE_T_ELM_ASSERT, 2u, 0u, 12345u,
1760234567u, 0xDEADBEEFu);
rc = soe_rec_parse(rec, &out);
CHECK(rc == 0, "TC-001 parse ok");
CHECK(out.ver == SOE_REC_VER, "TC-001 ver");
CHECK(out.type == (uint8_t)SOE_T_ELM_ASSERT, "TC-001 type");
CHECK(out.elm_id == 2u, "TC-001 elm_id");
CHECK(out.flags == 0u, "TC-001 flags");
CHECK(out.seq == 12345u, "TC-001 seq");
CHECK(out.epoch_s == 1760234567u, "TC-001 epoch");
CHECK(out.value == 0xDEADBEEFu, "TC-001 value");
CHECK(out.cp56[6] == (uint8_t)((2025u - 2000u) & 0x7Fu), "TC-001 cp56 year=2025");
CHECK(rc == 0, "TC-SOE-001 parse ok");
CHECK(out.ver == SOE_REC_VER, "TC-SOE-001 ver");
CHECK(out.type == (uint8_t)SOE_T_ELM_ASSERT, "TC-SOE-001 type");
CHECK(out.elm_id == 2u, "TC-SOE-001 elm_id");
CHECK(out.flags == 0u, "TC-SOE-001 flags");
CHECK(out.seq == 12345u, "TC-SOE-001 seq");
CHECK(out.epoch_s == 1760234567u, "TC-SOE-001 epoch");
CHECK(out.value == 0xDEADBEEFu, "TC-SOE-001 value");
CHECK(out.cp56[6] == (uint8_t)((2025u - 2000u) & 0x7Fu), "TC-SOE-001 cp56 year=2025");
}
/* ---------------- TC-SOE-002 校验和/版本硬门槛 ---------------- */
@@ -76,14 +76,14 @@ static void tc_gates(void)
}
rec[i] = save;
}
CHECK(bad == 0, "TC-002 any byte flip rejected");
CHECK(soe_rec_parse(rec, &out) == 0, "TC-002 intact parses ok");
CHECK(bad == 0, "TC-SOE-002 any byte flip rejected");
CHECK(soe_rec_parse(rec, &out) == 0, "TC-SOE-002 intact parses ok");
rec[SOE_OFF_VER] = (uint8_t)(SOE_REC_VER + 1u); /* 版本篡改:sum 仍按新
* 字节算会自洽,但版本
* 门槛先拒 */
CHECK(soe_rec_parse(rec, &out) == -2, "TC-002 bad version -> -2");
CHECK(soe_rec_parse(NULL, &out) == -1, "TC-002 null args -> -1");
CHECK(soe_rec_parse(rec, &out) == -2, "TC-SOE-002 bad version -> -2");
CHECK(soe_rec_parse(NULL, &out) == -1, "TC-SOE-002 null args -> -1");
}
/* ---------------- TC-SOE-003 CP56 正确性 + 交叉往返 ---------------- */
@@ -101,24 +101,24 @@ static void tc_cp56(void)
(void)soe_rec_parse(rec, &out);
/* 显式字段:12:34:56 → ms 域 = 56*1000(秒域时基如实编码,亚秒 0) */
CHECK(((uint32_t)out.cp56[0] | ((uint32_t)out.cp56[1] << 8)) == 56000u,
"TC-003 ms field = sec*1000 (56000)");
"TC-SOE-003 ms field = sec*1000 (56000)");
rc = iec104_cp56_to_epoch_ms(out.cp56, &back);
CHECK(rc == 0, "TC-003 cross decode ok");
CHECK(back == 1791808496000ULL, "TC-003 cross roundtrip exact");
CHECK(rc == 0, "TC-SOE-003 cross decode ok");
CHECK(back == 1791808496000ULL, "TC-SOE-003 cross roundtrip exact");
/* 闰日 2024-02-29 00:00:00 UTC = 1709164800 */
soe_rec_build(rec, (uint8_t)SOE_T_SAMPLE_BLOCK, 0u, 0u, 2u, 1709164800u, 0u);
(void)soe_rec_parse(rec, &out);
CHECK(out.cp56[4] == 29u && out.cp56[5] == 2u && out.cp56[6] == 24u,
"TC-003 leap day fields");
"TC-SOE-003 leap day fields");
rc = iec104_cp56_to_epoch_ms(out.cp56, &back);
CHECK((rc == 0) && (back == 1709164800000ULL), "TC-003 leap roundtrip");
CHECK((rc == 0) && (back == 1709164800000ULL), "TC-SOE-003 leap roundtrip");
/* 2000-01-01 00:00:00 边界 */
soe_rec_build(rec, (uint8_t)SOE_T_PLATE_IN, 0u, 0u, 3u, 946684800u, 0u);
(void)soe_rec_parse(rec, &out);
rc = iec104_cp56_to_epoch_ms(out.cp56, &back);
CHECK((rc == 0) && (back == 946684800000ULL), "TC-003 year-2000 boundary");
CHECK((rc == 0) && (back == 946684800000ULL), "TC-SOE-003 year-2000 boundary");
}
/* ---------------- TC-SOE-004 IV 语义 ---------------- */
@@ -130,10 +130,10 @@ static void tc_iv(void)
soe_rec_build(rec, (uint8_t)SOE_T_ELM_ASSERT, 1u, SOE_FLG_IV, 9u, 0u, 1u);
(void)soe_rec_parse(rec, &out);
CHECK((out.cp56[2] & 0x80u) != 0u, "TC-004 cp56 IV bit set");
CHECK(out.epoch_s == 0u, "TC-004 epoch field zeroed");
CHECK((out.cp56[2] & 0x80u) != 0u, "TC-SOE-004 cp56 IV bit set");
CHECK(out.epoch_s == 0u, "TC-SOE-004 epoch field zeroed");
CHECK(iec104_cp56_to_epoch_ms(out.cp56, &back) == -2,
"TC-004 cross decoder rejects IV");
"TC-SOE-004 cross decoder rejects IV");
}
/* ---------------- TC-SOE-005 钳位 ---------------- */
@@ -146,17 +146,17 @@ static void tc_clamp(void)
soe_rec_build(rec, (uint8_t)SOE_T_ELM_ASSERT, 0u, 0u, 4u, 100u, 0u);
(void)soe_rec_parse(rec, &out);
CHECK((out.cp56[4] == 1u) && (out.cp56[5] == 1u) && (out.cp56[6] == 0u),
"TC-005 clamp low -> 2000-01-01");
"TC-SOE-005 clamp low -> 2000-01-01");
(void)iec104_cp56_to_epoch_ms(out.cp56, &back);
CHECK(back == 946684800000ULL, "TC-005 clamp low exact");
CHECK(back == 946684800000ULL, "TC-SOE-005 clamp low exact");
/* epoch_s 为 uint32 → 最大 2106-02-07(0xFFFFFFFF),恒在 CP56 域内:
* 上界钳位是防御性死分支(epoch 域扩展时生效),此处断言精确往返 */
soe_rec_build(rec, (uint8_t)SOE_T_ELM_ASSERT, 0u, 0u, 5u, 0xFFFFFFFFu, 0u);
(void)soe_rec_parse(rec, &out);
CHECK(out.cp56[6] == 106u, "TC-005 uint32 max -> year 2106 (no clamp needed)");
CHECK(out.cp56[6] == 106u, "TC-SOE-005 uint32 max -> year 2106 (no clamp needed)");
(void)iec104_cp56_to_epoch_ms(out.cp56, &back);
CHECK(back == 4294967295000ULL, "TC-005 uint32 max exact roundtrip");
CHECK(back == 4294967295000ULL, "TC-SOE-005 uint32 max exact roundtrip");
}
/* ---------------- TC-SOE-006 结构不变量 ---------------- */
@@ -167,7 +167,7 @@ static void tc_layout(void)
uint8_t s = 0u;
int zero_ok = 1;
CHECK(SOE_REC_SIZE == 64u, "TC-006 record size 64");
CHECK(SOE_REC_SIZE == 64u, "TC-SOE-006 record size 64");
soe_rec_build(rec, (uint8_t)SOE_T_SAMPLE_RESUME, SOE_ELM_NONE, 0u,
0u, 946684800u, 0u);
for (i = 23u; i <= 62u; i++) {
@@ -175,12 +175,12 @@ static void tc_layout(void)
zero_ok = 0;
}
}
CHECK(zero_ok, "TC-006 reserved [23..62] zero");
CHECK(zero_ok, "TC-SOE-006 reserved [23..62] zero");
for (i = 0u; i < SOE_OFF_SUM; i++) {
s = (uint8_t)(s + rec[i]);
}
CHECK(rec[SOE_OFF_SUM] == s, "TC-006 sum8 covers [0..62]");
CHECK(rec[SOE_OFF_ELM] == SOE_ELM_NONE, "TC-006 elm none");
CHECK(rec[SOE_OFF_SUM] == s, "TC-SOE-006 sum8 covers [0..62]");
CHECK(rec[SOE_OFF_ELM] == SOE_ELM_NONE, "TC-SOE-006 elm none");
}
/* ---------------- TC-SOE-007 序号边界 ---------------- */
@@ -190,11 +190,11 @@ static void tc_seq_edges(void)
soe_rec_t out;
soe_rec_build(rec, (uint8_t)SOE_T_ELM_ASSERT, 0u, 0u, 0u, 946684800u, 0u);
CHECK((soe_rec_parse(rec, &out) == 0) && (out.seq == 0u), "TC-007 seq 0");
CHECK((soe_rec_parse(rec, &out) == 0) && (out.seq == 0u), "TC-SOE-007 seq 0");
soe_rec_build(rec, (uint8_t)SOE_T_ELM_ASSERT, 0u, 0u, 0xFFFFFFFFu,
946684800u, 0u);
CHECK((soe_rec_parse(rec, &out) == 0) && (out.seq == 0xFFFFFFFFu),
"TC-007 seq 0xFFFFFFFF");
"TC-SOE-007 seq 0xFFFFFFFF");
}
int main(void)