fix(编号): 批 6 追溯器分档 + 板级 NET 用例号标注归一
步骤 1:追溯器分两档(不改数据,改判据) - BENCH:文档**定义行**(标题行或表格首格)带「(硬件层)」或其所属章节带的号 → 人工台架用例,不期望有 C 代码载体;NOTIMPL:定义行标了未实现/待补/暂缓/已取消 - 两档**单列示数恒打印**、明细进 --verbose,不是静默豁免;也不等于"已验证" - 两个实测坑写在脚本注释里:① 按"任意行出现即算"实现时 BENCH 收 14 个号却只消掉 1 处差异(同一号被别处引用一次就复活)→ 改为只认定义行 + 从文档全集整体减档; ② 载体类型必须由定义处决定,引用行不影响判断 - 另把 has_intent() 收窄到同号所在行(原先整文件任意位置有人话就算过关) 步骤 2:板级 NET 用例标注归一(真债,改名 109 处 / 5 文件) - 取证发现"文档声明却无载体"绝大多数是**标注形态烂**:实现体里写的是 TC204 / TC-201 / TC 703 / TC1501 / TC1502b(三种畸形),文档写 TC-NET-204 等 - 序号一位不改、只补模块码(§7.1);作用域限定 5 个真载体文件: test/board/ch395f_test_task.c(67) net_test_task.c(37) net_test_task.h(1) test/host/ch395f_socket_test.py(3) Drivers/BSP/CH395F/ch395f.c(1) - 审计轨迹 scripts/rename_maps/batch6-net-annotate.json;别名自动登记(scoped) 实测 - DOC-ONLY 29 → 15:701~704 的 NET 层实现体一直存在(net_test_task.c), 此前因裸形标注被误判成"未实现";1501~1503 属硬件层人工 + 同样裸形 - 交集 260 不变、代码侧 578 不减(识别面没缩);BENCH 14 个号 / NOTIMPL 1 个 - 台账 --prune-backlog 还清 6 条(只减不增);@build 0 错误 0 警告 (Program Size 与改前逐字节相同:Code=213356 RO=18580 RW=1184 ZI=131480 → 证实只动了注释与日志串);7 个改动文件 BOM/CR/U+FFFD 与 HEAD 逐项一致 剩余 15 处 DOC-ONLY 的组成(步骤 3 未完,下轮处理) - 4 处文档侧无模块码形态(TC-1003/206/501/704)→ 属 ② 大批 - TC-NET-607 一条是历史指称(原文"原 607/608/609,现 701/702/703") - 真未实现 10 条:TC-NET-101/102/601/606/801/802/901/902/1006/1101 ——其中 801/802/901/902 曾在 2026-08 的代码里有载体、后被重构丢掉,最值得补
This commit is contained in:
@@ -27,6 +27,7 @@
|
||||
② 代码有、母号不在文档、**且号旁边没写人话意图** → CODE-ONLY(真未登记);
|
||||
③ 代码有、靠"旁边有意图"放过 → 单独打印为 IN-CODE,**弱于文档**,不算已登记。
|
||||
小写子项后缀(`TC-XXX-003b`)按母号算(`subitem_ok`),与编号门禁同口径。
|
||||
**批 6 再分两档**:硬件层人工用例(标题/章节含「(硬件层)」)记为 `BENCH`、文档已标未实现/待补/暂缓/已取消的记为 `NOTIMPL`,两者**单列示数**不进差异——但也不是「已覆盖」,只是「不该在这里期望代码」。
|
||||
**2026-10-21 第二次口径修正(批 5)**:变更记录行与 `[示例]`/`[计划]` 行**不参与比对**
|
||||
(冻结历史按编号规范 §8.1 不回改,旧号靠 `id_aliases.json` 解析;这条豁免另三支脚本早有,本脚本是最后缺它的一个,`DOC-ONLY` 因此 38 → 29、交集不变);被豁免的号存进 `frozen_ids`,`--verbose` 全量列出——**豁免不等于已对应**,别拿它当收敛。
|
||||
|
||||
@@ -74,6 +75,22 @@ PLACEHOLDER_PREFIXES = {"XXX"}
|
||||
# 该号在批 2 已随代码改名成 TC-ADCIN-*,历史行不该回改,拿它去代码里找同号必然落空。
|
||||
SKIP_LINE = re.compile(r"\[示例\]|\[计划\]|^\s*\|\s*20\d\d-\d\d-\d\d\s*\|")
|
||||
frozen_ids: set = set() # 只在 --verbose 里列:被豁免的号(历史/示例),不是"已对应"
|
||||
# 2026-10-21 批 6:`DOC-ONLY` 里混着两种"不是缺口"的号,一律**单列示数**而不是塞进差异,
|
||||
# 也**不静默消失**——数量恒打印,明细 `--verbose` 可查:
|
||||
# BENCH 硬件层人工用例(标题或所属章节含「(硬件层)」):本来就没有代码载体,
|
||||
# 属主是人工台架步骤,不是 C 代码(例:§12.5 阶段 15「自愈驱动原语(硬件层,无需 PC)」)。
|
||||
# NOTIMPL 文档已显式标了状态词(未实现 / 待补 / 暂缓 / 已取消):是**已登记的欠账**,
|
||||
# 不是"查无此号"的假警报。
|
||||
# ⚠ 反过来别把 BENCH 当"已覆盖":它只说明"不该期望代码里有",不证明人工真做过。
|
||||
BENCH_RX = re.compile(r"[((]\s*硬件层")
|
||||
NOTIMPL_RX = re.compile(r"未实现|待补|暂缓|已取消")
|
||||
# 定义行(决定这个号的**载体类型**):markdown 标题行,或表格里号在**首格**的行。
|
||||
# 引用行(正文里"同 TC-NET-601"、"参见 TC-NET-302")不改变载体判断——否则一个人工
|
||||
# 用例只要在别处被提一次,就又被要求"代码里必须有"(2026-10-21 实测:按"任意行都算"
|
||||
# 实现时,BENCH 收了 16 个号却只消掉 1 处差异,等于没生效)。
|
||||
DEF_LINE_RX = re.compile(r"^(?:#{2,6}\s|\|\s*\*{0,2}\s*TC-)")
|
||||
bench_ids: set = set()
|
||||
notimpl_ids: set = set()
|
||||
|
||||
|
||||
def _prefix(tc: str) -> str:
|
||||
@@ -110,7 +127,8 @@ def collect(paths, label, want_intent=False):
|
||||
"""返回 (ids_set, per_prefix_counts[, intent_set])。逐文件扫描,缺文件不致命。"""
|
||||
ids = set()
|
||||
intents = set()
|
||||
global frozen_ids
|
||||
global frozen_ids, bench_ids, notimpl_ids
|
||||
in_bench_section = False
|
||||
for p in paths:
|
||||
try:
|
||||
text = p.read_text(encoding="utf-8", errors="replace")
|
||||
@@ -118,6 +136,11 @@ def collect(paths, label, want_intent=False):
|
||||
print(f"[ERR] 无法读取 {p}: {e}", file=sys.stderr)
|
||||
return (None, None, None) if want_intent else (None, None)
|
||||
for line in text.splitlines():
|
||||
if re.match(r"^#{2,6}\s+\S", line): # markdown 章节:记住是否硬件层
|
||||
in_bench_section = bool(BENCH_RX.search(line))
|
||||
is_def = bool(DEF_LINE_RX.search(line))
|
||||
bench = bool(BENCH_RX.search(line)) or (in_bench_section and is_def)
|
||||
notimpl = bool(NOTIMPL_RX.search(line))
|
||||
skip = bool(SKIP_LINE.search(line))
|
||||
for m in TC_RE.findall(line):
|
||||
if _prefix(m) in PLACEHOLDER_PREFIXES:
|
||||
@@ -125,6 +148,13 @@ def collect(paths, label, want_intent=False):
|
||||
if skip: # 冻结历史 / 示例行:不参与双向比对,只留痕
|
||||
frozen_ids.add(m)
|
||||
continue
|
||||
if label == "doc" and is_def:
|
||||
# 只对文档侧分类:载体类型由**文档里的定义行**说了算,
|
||||
# 且必须从全集里整体减掉(见上面注释的实测坑)
|
||||
if bench:
|
||||
bench_ids.add(m) # 硬件层人工 → 不期望代码载体
|
||||
if notimpl:
|
||||
notimpl_ids.add(m) # 已标未实现/待补 → 已登记的欠账
|
||||
ids.add(m)
|
||||
if want_intent and has_intent(line, m):
|
||||
intents.add(m)
|
||||
@@ -173,6 +203,9 @@ def main():
|
||||
if code_ids is None or doc_ids is None:
|
||||
return 2
|
||||
|
||||
# 文档侧的两个单列档整体从文档全集里减掉后再比差异(数量已在上面打印,
|
||||
# --verbose 有明细):BENCH = 人工台架定义,NOTIMPL = 已显式登记未实现
|
||||
doc_ids -= bench_ids | notimpl_ids
|
||||
doc_bases = {_base(i) for i in doc_ids}
|
||||
# 真差异定义(B 层口径 2026-10-21,docs/编号规范.md §8.1):
|
||||
# ① 文档声明了、代码里没有 → 未实现/未标注(保留,这是硬断链);
|
||||
@@ -189,7 +222,11 @@ def main():
|
||||
print(f"代码侧:{len(code_files)} 个文件,{len(code_ids)} 个 TC")
|
||||
print(f"文档侧:{len(doc_files)} 个文件,{len(doc_ids)} 个 TC")
|
||||
print(f"交集:{len(code_ids & doc_ids)}")
|
||||
# 注意:交集/文档侧计数在减档之前打印,这里补一行减档后的口径
|
||||
print(f"(减 BENCH/NOTIMPL 后参与比对:文档 {len(doc_ids)}、交集 {len(code_ids & doc_ids)})")
|
||||
print(f"豁免:变更记录/[示例]/[计划] 行的号 {len(frozen_ids)} 个(口径同 check_ids.py,见 §8.1)")
|
||||
print(f"单列 BENCH(硬件层人工用例,不期望有代码载体):{len(bench_ids)} 个")
|
||||
print(f"单列 NOTIMPL(文档已标未实现/待补/暂缓/已取消):{len(notimpl_ids)} 个")
|
||||
|
||||
if args.verbose:
|
||||
print("--- 各前缀 TC 计数(代码 / 文档)---")
|
||||
@@ -211,6 +248,12 @@ def main():
|
||||
for i in code_only_in_code:
|
||||
print(f" {i}")
|
||||
|
||||
for name, bag in (("BENCH 硬件层人工", bench_ids), ("NOTIMPL 已登记未实现", notimpl_ids)):
|
||||
if args.verbose and bag:
|
||||
print("--- %s:不参与差异比对,但**不等于已验证**(共 %d 个)---" % (name, len(bag)))
|
||||
for i in sorted(bag):
|
||||
print(" ", i)
|
||||
|
||||
if args.verbose and frozen_ids:
|
||||
print("--- 被豁免的号(变更记录 / [示例] / [计划] 行,共 %d 个)**不是已对应**,"
|
||||
"历史旧号靠 id_aliases.json 解析 ---" % len(frozen_ids))
|
||||
|
||||
Reference in New Issue
Block a user