feat(门禁): id-check 关闸——按债务台账增量拦截,warn-only 时代结束
机制(--strict 不再「有错就失败」,而是只拦台账外的新账) - scripts/id_known_backlog.json:340 条指纹覆盖 710 处存量(②167 类 / ⑥135 / ③38) - 指纹 = (文件, 校验号, 字面量) → 计数,故意不含行号:行号每改必漂, 用它当指纹会让台账天天假新增,三天后没人敢看 strict,台账失效比没台账更糟 - 带计数而非集合:同一文件里同一个号多出现一次也算新账(复制粘贴式扩散 正是编号烂掉的主路径,只按「出现过没有」判会放过它) - 新增 --write-backlog 与 --prune-backlog(只减不增;台账内条目变多当场点名); --strict 缺台账返回 2,绝不退化成一次性拦死存量;--only 与 --strict 互斥 - 钩子 entry 加 --strict;--only 与 --strict 互斥 - 顺带修 _scan_malformed 的反向 bug:原条件 (skip and name != "空格形 Trap") 语义正好写反,带 [示例] 的行反而专被 Trap 规则咬;改为示例行全部不判 - 第一次提交就被自己的台账咬住(id_known_backlog.json 里当然写着 P1-3 等号, 被当成新引用)→ 台账加入 excluded_paths:登记号的表不是引用号的文档, 与 id_aliases.json / id_registry.json 同一条道理 为什么不照「清零再升 strict」的原节奏(§8.4 详述) - 存量 710 处清完要数周,这期间新债一条都不拦,而新增才是烂掉主因 - 「等清零」让人习惯「报红但照样提交」,真关闸那天没人再信门禁; 本仓已有 mem-budget / mem-numbers 走 --no-verify 的先例,不再开第二个口子 关闸验收三例(临时件当场还原、git diff 干净) - A 全新前缀 Z-99 → exit 1 点名 ✅ 咬 - B 同号计数 1→2 → exit 1 点名 ✅ 咬 - C 干净态 710 处 → exit 0 放行 ✅ 放(放不住存量就会逼出 --no-verify) 验证:--strict 干净态 exit 0;可判定比例 82.74%(基线 82.6%); doc-links 失效/待确认 0;未改 C/H 不需 @build。 文档:编号规范 §8 上线节奏改写 + 新增 §8.4 机制表;pre-commit使用说明 §2.25; AGENTS.md 门禁行由 warn-only 改为已关闸增量拦截。
This commit is contained in:
@@ -90,7 +90,7 @@
|
||||
|
||||
## 提交门禁(pre-commit)
|
||||
|
||||
- 任一失败即拦截,共 **37 个钩子**(逐个详解 → `docs/代码规范/pre-commit使用说明.md`):通用 5 + `gitlint` + `cppcheck` / `test-cppcheck` + `no-mojibake` + `coding-standard` + 文档三件套 `doc-links` / `task-table` / `mem-numbers` + `id-check`(**编号门禁**,`docs/编号规范.md` §8 八项校验;**当前 warn-only**,可判定比例跌破 `id_registry.json` 基线才失败)+ `lv-conf-sync`(两份 `lv_conf.h` 特性子集一致)+ `cubemx-survival` + 主机侧单测 16 个(`-unit-test` 后缀)+ `test-suite-switch` + `registration-check`(双端注册反向校验 + UI 页面描述符表接线,N-23/U4)+ `mem-budget`(RAM 92% 预算门禁,N-27)+ `font-charset`(UI 字符集差集检查,防缺字白框,U4)+ `ui-golden`(UI 像素回归,菜单 8 状态 + 内容页 11 页黄金参考,U4)
|
||||
- 任一失败即拦截,共 **37 个钩子**(逐个详解 → `docs/代码规范/pre-commit使用说明.md`):通用 5 + `gitlint` + `cppcheck` / `test-cppcheck` + `no-mojibake` + `coding-standard` + 文档三件套 `doc-links` / `task-table` / `mem-numbers` + `id-check`(**编号门禁**,`docs/编号规范.md` §8 八项校验;**已关闸为【增量拦截】**:只拦 `scripts/id_known_backlog.json` 台账之外的新错误级问题,存量按指纹豁免、台账只减不增;另有一根恒生效的线——可判定比例跌破 `id_registry.json` 基线即失败)+ `lv-conf-sync`(两份 `lv_conf.h` 特性子集一致)+ `cubemx-survival` + 主机侧单测 16 个(`-unit-test` 后缀)+ `test-suite-switch` + `registration-check`(双端注册反向校验 + UI 页面描述符表接线,N-23/U4)+ `mem-budget`(RAM 92% 预算门禁,N-27)+ `font-charset`(UI 字符集差集检查,防缺字白框,U4)+ `ui-golden`(UI 像素回归,菜单 8 状态 + 内容页 11 页黄金参考,U4)
|
||||
- **范围 = 项目代码**:第三方(`Lib/`、`Middlewares/`、CMSIS、HAL、`lftpd`、`dhara`、`MDK-ARM`)排除;`cppcheck`/`coding-standard` 另排除 `test/`,规范检查再排除 CubeMX 生成的 `Src/`/`Inc/`。**`simulator/` 已纳入全部钩子**(2026-10-11)——生成物只靠 `.gitignore` 挡,**不在 `exclude` 里写目录名**(教训见 `docs/代码规范/pre-commit使用说明.md` §5.5)
|
||||
- ⚠ **pre-commit 4.x 已移除 `always: true`**(实测对 `local` 钩子只告警 `Unexpected key(s)` 并跳过)→ 想"总是跑"的钩子**必须让 `files:` 覆盖到所有会触发它的文件**,没有兜底开关
|
||||
- **改写型钩子(`trailing-whitespace` + `end-of-file-fixer`)豁免 CubeMX/Keil 生成文件**(配置里 YAML 锚点 `&cubemx-generated`);⚠ **只读检查不受影响**:`cppcheck` / 乱码 / `cubemx-survival` / `task-table` / `mem-numbers` 仍覆盖 `Src/`、`Inc/`
|
||||
|
||||
Reference in New Issue
Block a user