feat(门禁): 批 9 位号规则扩展到引脚名 + 修 --prune-backlog 丢 reason 的 bug
规则扩展(scripts/check_ids.py,两处共用同一正则)
- 原:^[RCDJXUT][0-9]{1,3}(单字母位号)
- 现:再加 ^[A-Z]{2,3}[0-9]{1,2}(-[0-9]{1,2})? → 收掉硬件语料里的**引脚名 / 总线名 /
网名 / 引脚区间**:PB12-15、PG0-15、PF13-15、DB0-15、OS0-2、KEY1-3、AIN1 这类
- 关键边界:带连字符的一字母形态(C-10 / A-9 / N-18 / D-7)与 TC-206、TC1003 **不落在
新形状里**,照旧判定 → 报告自有条目号这类真编号没被顺手挡掉(实测台账仍留 21 类真债)
- 位号与引脚名都不进 refs_total:错误级 661 → **651**,refs_total 8807 → 8797(同步 −10),
可判定比例 82.84% → **82.94%**(分母没被噪声灌水,涨幅来自噪声出清而非真进展)
修自己的 bug:--prune-backlog 会静默丢掉 reason 字段
- 症状:收账一次后,那 28 类硬件存量条目的「这笔债为什么该存在」说明全部消失
- 根因:prune 用 dict 字面量重建条目,只写了 file/code/literal/count 四个键
- 修法:改为从原始 JSON 取整条再覆盖 count,其它字段原样保留;已实测幂等
(再跑一次「还清 0 条、剩 313 条、带 reason 仍 21 类」)
- 21 类真债的 reason 已重新写回,内容含一条判断:器件料号 FOC-817 **不做**形状规则,
因为 [A-Z]{3}-\d{3} 与真家族 DEF-* 撞形,宁可留一条记账也不制造盲区
验证:id-check --strict 通过(存量 651 全在台账内、无未登记新账);
doc-links --all 失效与待确认均 0;未改 C/H 不需 @build;台账只减不增
This commit is contained in:
+13
-4
@@ -261,7 +261,7 @@ class Checker(object):
|
||||
# (约 4200 处位号若进 refs_total,会把分母灌水、掩盖真实变化)
|
||||
_rx = getattr(type(self), "_desig_rx", None)
|
||||
if _rx is None:
|
||||
_rx = type(self)._desig_rx = re.compile(r"[RCDJXUT][0-9]{1,3}")
|
||||
_rx = type(self)._desig_rx = re.compile(r"(?:[RCDJXUT][0-9]{1,3}|[A-Z]{2,3}[0-9]{1,2}(?:-[0-9]{1,2})?)")
|
||||
type(self)._desig_paths = ("docs/硬件平台/", "docs/芯片手册/")
|
||||
if rel.startswith(type(self)._desig_paths) and _rx.fullmatch(literal):
|
||||
self.stats["designator_skipped"] = self.stats.get("designator_skipped", 0) + 1
|
||||
@@ -365,7 +365,7 @@ class Checker(object):
|
||||
# 所以 D-7 / N-18 / TC-206 / TC1003 这类真编号或违规形态都不受影响。
|
||||
_rx = getattr(type(self), "_desig_rx", None)
|
||||
if _rx is None:
|
||||
_rx = type(self)._desig_rx = re.compile(r"[RCDJXUT][0-9]{1,3}")
|
||||
_rx = type(self)._desig_rx = re.compile(r"(?:[RCDJXUT][0-9]{1,3}|[A-Z]{2,3}[0-9]{1,2}(?:-[0-9]{1,2})?)")
|
||||
type(self)._desig_paths = ("docs/硬件平台/", "docs/芯片手册/")
|
||||
if rel.startswith(type(self)._desig_paths) and _rx.fullmatch((literal or "").strip()):
|
||||
self.stats["designator_skipped"] = self.stats.get("designator_skipped", 0) + 1
|
||||
@@ -723,8 +723,17 @@ def main():
|
||||
return 2
|
||||
paid = [k for k in led if groups.get(k, 0) == 0]
|
||||
grew = [(k, led[k], groups.get(k, 0)) for k in led if groups.get(k, 0) > led[k]]
|
||||
kept = [{"file": k[0], "code": k[1], "literal": k[2], "count": groups[k]}
|
||||
for k in sorted(led) if groups.get(k, 0) > 0]
|
||||
# ⚠ 必须保留原条目的**全部字段**(尤其 reason):早先这里用 dict 字面量重建条目,
|
||||
# 把 reason 静默丢掉,等于把「这笔债为什么该存在」的审计说明清掉了(实测一次丢掉 21 类)。
|
||||
raw = json.loads(BACKLOG_FILE.read_text(encoding="utf-8"))
|
||||
orig = {(e["file"], int(e["code"]), e["literal"]): e for e in raw.get("entries", [])}
|
||||
kept = []
|
||||
for k in sorted(led):
|
||||
if groups.get(k, 0) <= 0:
|
||||
continue
|
||||
e = dict(orig.get(k, {"file": k[0], "code": k[1], "literal": k[2]}))
|
||||
e.update({"file": k[0], "code": k[1], "literal": k[2], "count": groups[k]})
|
||||
kept.append(e)
|
||||
BACKLOG_FILE.write_text(
|
||||
json.dumps(backlog_doc(kept, err_total, ratio), ensure_ascii=False, indent=2) + "\n",
|
||||
encoding="utf-8", newline="\n")
|
||||
|
||||
Reference in New Issue
Block a user