wandering1
|
c0d7bb9c8e
|
docs(门禁): mem-budget 第 6 节补一条盲区——同码凭证按 git 索引生成,多人同树时必红
今天道G 报出 `check_size_gate.py --local` 单跑 exit 1(代码指纹与体积测量指纹不一致),我复核后确认这不是
预算问题、也不是谁改坏了台账,而是**该凭证的定义在多人同树下必然不成立**:代码指纹取的是 **git 索引里的
blob**,而此刻工作区里有别的任务在飞、尚未入索引的改动 ⇒ 两边算出来的东西本来就不是同一份内容。
写进 §6 的三点判据:
· 它**只挂在 `scripts/ci_local.py` 的 L0c,不在这 51 条 pre-commit 钩子内** ⇒ 红它不等于提交
会被拦,别在
提交被拦的清单里找它;
· 报错若同时列出「未入索引的文件」而那些文件正被别的任务改 ⇒ 等它们入库后统一 `@build` →
`ram_baseline.py --update` 补凭证;**绝不为把它调绿去 `git add` 别人在飞的改动**(这条比前两条更要紧,
今天就这样发生过一次:别人已 staged 的文件会被我的 add 顺手卷进我这一笔);
· 本节写作时凭证**仍是红的**(回填发生在通讯卡入库之后)——我只写成因与判据,**不预告还没发生的结果**,
这正是 `pre-commit使用说明.md` §2.5 那条「注释陈述事实不陈述意图」在同一天的第二次应用。
自查:`check_doc_links --all` exit 0(198 篇)、本篇 `--sections-strict` 通过、noBOM
/ LF / U+FFFD=0 / 结尾
换行齐;`id-check` 未受影响(本笔零编号)。本笔零代码,且此刻两条道正在写 `Drivers/BSP/UI/` 与
`App/algo/`,故只提这一只文档文件。
|
2026-10-27 09:47:23 +08:00 |
|
wandering1
|
0f7b5a87fb
|
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%。
|
2026-10-26 12:28:14 +08:00 |
|
wandering1
|
13ef0715bb
|
docs(销项): 批 1 登记簿收口 + A-5 口径联动到三处门禁文档
销项(登记簿删行 + 结论沉淀指针):
- 数据可信.md:卡 1~7 行删除,表下补销项记录(merge 231dc81/d39e5c9/
59da40b);§2.1 口径冲突注改 ✅ 已定死;§6 顺序图与失效预警改写为
"批1 已销项 + 批2 在途"现状;卡 0/0b/12 与 M4①⑤台架面保留待跑
- 测试与架构专项.md:未闭环一览删 S12 / A-5 两行;§1 标题 1 项→0 项,
P1-10 剩余两条改已销项记录(5 档构建 + f3 PASS,数字正文在
test/board/ch395f_test.h);§2.1 S12、§2.3 A-5 标题 ⬜→✅ 带落点
- README.md:一览删 P1 收步行;网络/结构/UI 行加 🟦批2 在途标记;
测试基础设施 5→3;数据可信行改"在途 7 卡";验证常态两处删
P1-10/S12/A-5
口径联动(A-5 已落地,文档追平):
- CI 远程CI完整指南.md §0.0 整节重写(盲区→同码凭证强制 + 三项仍
守不住 + 变更记录行);CI README 索引行同步
- 门禁说明/mem-numbers.md §1/§6、mem-budget.md §6 第 4 条:远端缺口
已由 check_size_gate.py 关闭,唯一正文 = 其 docstring
|
2026-10-25 08:36:44 +08:00 |
|
wandering1
|
6505cef9df
|
feat(门禁): coding-standard 加 CODE-RULE-20 禁 C 库堆分配(销 §4.8 空白 ②)
规则:在**掩码后**的文本上匹配 malloc/calloc/realloc/strdup/strndup/
free/aligned_alloc 调用。三条判据都是踩过坑之后定的——
- 大小写敏感:pvPortMalloc / vPortFree(唯一允许的配对)不会误报;
- 词边界 \b:dhara_nand_is_free(、buf_alloc( 这类同形后缀不误报;
- 用掩码:注释与字符串字面量里写 malloc 不报(规范示例就踩过这种)。
覆盖名比 AGENTS 列的五枚多带上 strndup / aligned_alloc——同族同类,
漏一个就等于留后门。
出处不在规范 V1.0,在平台约束:MicroLIB 的 C 堆由 startup_stm32f407xx.s
的 Heap_Size EQU 0x200 只有 512 B,KB 级分配必返 NULL,而模拟器(宿主
CRT 堆)完全正常、**照不出来**——配置引擎 2026-09-18 那次堆分配纠偏与
lftpd 的 malloc 隐患都是**先上线才发现**的那类,靠评审等于没管。
落地前按 门禁说明/coding-standard.md §8 的纪律先全库普查:钩子范围内
C/H 共 151 个文件,命中**只有** simulator/sim/cfg_file_store_sim.c 两行,
即 cfg_store_alloc/cfg_store_free = **平台分配后端的宿主侧实现**(设计依据
写在 docs/子系统设计/配置文件设计说明.md 的"MCU 端 = pvPortMalloc、
模拟器端 = 宿主 CRT")。所以零基线、直接硬拦截;豁免用脚本里的
HEAP_ALLOC_ALLOWLIST(**文件路径 + 函数名**双条件),刻意不做目录级豁免:
下次谁要碰 C 堆就得往这张表加一行,评审看得见。
自证:临时样例文件里 malloc/calloc/free 各报一处,pvPortMalloc/vPortFree/
buf_alloc(、注释、字符串五种陷阱形态全部不误报;
pre-commit run coding-standard --all-files → **Passed**(= 全库零存量)。
顺带修三处口径不一致:
- 规范 V1.0 §6.1 的示例自己写着 malloc/free(通用 C 模板遗留)→ 已在示例
下加"本仓例外,别照抄"批注,事实源指向 AGENTS.md 平台约束;
- docs/门禁说明/mem-budget.md 里"这条纪律只靠 AGENTS 铁律与评审"已过期 →
更正为由 CODE-RULE-20 机器拦截;
- AGENTS.md 平台约束条加"已机器拦截 + 唯一豁免"一句;scripts/README.md
补登 check_test_coverage.py(上一个提交漏登记)。
另:本次一并修好上一处编辑事故——报告 §4.8 曾被我的脚本调用截成半句
(只落第一行、丢掉 malloc 那半句),已重写为"两处空白均已闭合"。
自查:pre-commit run --files(9 个改动文件)适用项全 Passed;
check_doc_links.py --all = 35 处,与主干同数(本分支贡献 0);
check_ids.py --strict 通过(裸编号 P0-1 改平实说法,避免记成新账);
9 个文件 BOM/CR/U+FFFD/行尾与 HEAD 逐项一致。本轮零 .c/.h 改动,未跑
@build、未占 build/bench 锁;分支已 rebase 到 v2-on-ui,覆盖率脚本全量
回归仍 16/16、line=2552/2893 不变。
|
2026-10-23 23:44:46 +08:00 |
|
wandering1
|
6822726b2c
|
docs(门禁说明): 手册 §2 收敛为通用机制与查号表,逐项详解归一到 23 篇
用户一句"现在门禁都在干什么,我一概不知"引出的收尾。原手册 §2 有 27 个逐钩子小节,只回答
"拦了什么、怎么配",回答不了"什么时候会骗我";docs/门禁说明/ 已把逐项详解(含"限制与盲区"
一节)建好,本笔做收敛:同一事实只留一处(docs/文档规范.md 的要求)。
**先搬后删**(否则收敛等于丢事实):旧 §2 里独有条目逐篇折回,共 18 处插入、15 篇受益。折回的
东西包括:六套主机单测的来历与用例规模(13/36/82/46/32/149 断言,含 nand-port 的"与旧算法
对照")与"改动公共骨架 unit_test_harness.py 会同时触发 16 个钩子";UI 页面**两层注册**(构建
注册 vs 框架注册:枚举 + s_defs[] 描述符表)与"豁免不整目录一刀切";lv-conf-sync 首次落地清掉
26 个 LVGL 9.3 不存在的选项、3 处重复定义、10 项隐式开关显式化,以及 ALLOW_DIFF 端专属白名单
与必须穿过 lv_conf_internal.h 里那层 KCONFIG 包裹;cubemx-survival 的 16 项清单、断言前先剥
C 注释(本仓注释刻意引用历史代码,不剥就恒定误报)、旧手册"自造标记区"建议与看门狗文档实测
教训之间的优先级;id-check 顺带收编 check_test_traceability.py、裸形同字母多义属**显式承认的
盲区**、--update-baseline 只许涨;layer-deps 的注入自证与报错时三条修法(注入回调 / 上层递数据
/ 才谈 ALLOW);coding-standard **nand_ftl.* 也在排除清单**(我先前那篇漏了);test-suite-switch
的剥注释判定与派生宏白名单;mem-budget 两类软提醒不拦、退出码 2 是解析失败不是通过;doc-links
的排除目录与状态词 ±40 字符距离;task-table 改栈三步;gitlint 报错样例;no-mojibake 的修复路径。
**顺带抓到旧文档两处错**(记进文档,不悄悄改):一是 check-added-large-files 的阈值旧手册写
"单个文件 > 1MB",按本机安装的钩子源码实测是 --maxkb 默认 **500**(500 KB)——已更正,并把
"本目录任何默认值都以实测或安装的钩子源码为准"写进 end-of-file-fixer 当反面教材;二是
**ui-golden 在旧手册里连小节都没有**,只活在配置注释里:除了"有基线不等于有门禁",这是另一种
失踪——有钩子、没文档。
手册 §2 改写为三节:迁移说明 / **旧编号 → 新文档 查号表**(历史引用靠它读,旧号按"冻结历史不
回改"保留)/ **跨钩子通用机制**:两阶段与换机必须重装 hooks 才带 commit-msg、stash 陷阱、
always: true 已废、改写型与只读型豁免不对称、增量拦截三段式且刻意没有 --write、没有 .map 是
"跳过"不是"通过"、改配置的验收是看目标钩子出现在输出里且不是 Skipped、新增门禁三步必须做
注入自证且"限制与盲区"不许留空,另有快速自查入口。手册 707 行 → 273 行。
引用**按内容**重指(只核编号存在与否不够,同号小节会被当本文自引用静默放过):编号规范、
scripts/README(顺带更正那里过时的 warn-only 说法,早已关闸为增量拦截)、RAM 使用分析与优化
方案、测试开发标准流程、lvgl-simulator skill、AGENTS 文档表(拆成"每门禁一篇详解"与"通用
机制"两行)、.pre-commit-config.yaml 头注释、docs/README.md 描述、手册自身 §5.5 与 §6 的两处
内部引用。另:表格里的裸节号会被 doc-links 判成本文自引用,查号表统一写成不带 § 的形态。
写说明过程又被自家门禁拦一次:gitlint 篇里引用报错样例时写了两个规则号字面量,被判形态不合规
→ 改成中文描述,没有往台账里塞 reason 解决。
验证:纯文档与注释改动,不动代码,Program Size 不变,故不跑 @build/@test;
check_doc_links --all --sections-strict **171 篇 0 问题**;id-check 增量拦截通过;
pre-commit run **RC=0 / 13 项 Passed**;28 个改动文件字节卫生 **0 异常**(无 BOM、无 CR、
无 U+FFFD、均 LF、无行尾空白)。
|
2026-10-23 11:44:21 +08:00 |
|
wandering1
|
dc44c1e54e
|
docs(门禁说明): 补齐 23 篇逐项门禁文档,每种门禁一篇含限制与盲区
用户诉求原话:"现在门禁都在干什么,我一概不知。" 原有文档回答"有哪些钩子、怎么配",回答不了
"这一条到底在拦什么、什么时候会骗我"。本目录按**每种门禁一篇**补齐 23 篇(39 个 hook id 全覆盖:
16 个主机单测是同机制 16 实例合一篇;cppcheck 与 test-cppcheck 是同工具两套范围合一篇),
文件名用 hook id,与提交输出里的名字一致、可 grep。
八段固定结构:查什么 / 为什么要它(拦下过什么真事)/ 触发面 / 报错怎么读 / 好处 /
**限制与盲区** / 豁免与基线口径 / 改门禁本身要注意什么。最后一节是这批文档存在的理由——
只看"拦了什么"的文档会让人以为绿就是对的;本仓三个增量拦截门禁(layer-deps 6 条、bsp-err 38 条、
id-check 台账 640 处)的绿灯含义只是"没比上次更差"。README 另立"三种拦截姿态"一节:改写型 /
硬拦截 / 增量拦截,分清才知道报错时该改代码还是该还基线。
有实证的地方全部带数字,没实证的地方直接写"预防性、未记录到实际拦截案例"(不编故事):
· cppcheck:把 simulator/ 纳入受检后立刻揪出 sim_syslog.c 真实空指针;test/ 曾有 s_rx_buf
使用先于声明;**并记入两条实测负结果**——它对 14 处丢弃 HAL_SPI_* 返回值与"未初始化局部量
进 P_FAIL 判定"一条不报(这正是 consume-result 的由来)。
· lv-conf-sync:漂移导致 64,576 B 死代码入库(旧镜像的 23.5%),且 golden 跑的是模拟器那份配置。
· cubemx-survival:2026-09-29 一次重生成覆盖 4 处定制(P0×1+P1×2+P2×1),且不报编译错。
· registration-check:rs485_task.c、lftpd_log.c 两处都没注册 = 从不参与编译的死代码;第四类
"页面描述了但没接进 s_defs[] 表"编译链接全过,前三类完全照不出。
· test-suite-switch:实测已提交的 HEAD 里 TEST_SUITE_CH395F 就是开着的,.map 含 34 处 test 代码。
· task-table:2026-09 两张表都比源码落后一大截(写 2048/4096/…/16384,实际 1024…512)。
· mem-numbers:2026-09-26 复核,文档写 82,048 B / 62.6%,实际 87,040 B / 66.4%;Flash 写
249,432 / 23.8%,实际 261,932 / 25.0%。
· ui-golden:注入 .top_y +3 像素 → golden FAIL 点名"1366 px 差异"、退出码 1;并把"有基线
≠ 有门禁"与"逼人 --no-verify 的门禁等于没有门禁"两条选型依据写进去。
· check-yaml:本仓已移除的 always 键只告警 Unexpected key(s) 然后忽略——配置"看起来生效其实没
生效"而本门全绿,所以验收方式是实跑看目标钩子是 Passed 还是 Skipped。
· no-mojibake:types: [c] 只管 C/H,**文档侧乱码无人管**——覆盖面与需求错配定性写进限制一节。
盲区写法示例(每篇都要求写真实限度,不留空):layer-deps 只查直接 include、按 basename 匹配、
不查是否真的用到;font-charset 管不到运行期拼出来的字符串与配置文件里的字;host-unit-tests 用宿主
编译器、桩是第二份真相、include_dirs 手写、没有对应钩子的模块等于零回归;mem-budget 的 92% 是管理
阈值不是安全余量、.map 缺失即"通过式跳过";registration-check 不看条件编译与注册指向是否正确;
coding-standard 的 CODE-RULE-17 在无配对头时跳过、规则编号 14 作废不回收。
写文档过程自己被自家门禁拦了两轮,都按规矩改而不是绕过:
① doc-links 拦下我自己——我在解释"写 §数字 而没紧邻文档名会被判成本文自引用"这段话里,正好
就犯了这个写法(两处),另有一处示例输出未标记;改成正例写法 + [示例] 标记。
② id-check 拦下 7 类新账:示例报错行里的号、档号引用未紧邻文档名、说明"裸形不合规"时自己写了
裸形。全部改成平实描述或补文档名、给样例加 [示例],没有一条是往台账里塞 reason 解决的。
这两次本身已写进相关篇目的"限制/变更记录",是这套文档最实在的注脚。
同步:手册 pre-commit使用说明.md 的 §2 顶部加指针(逐项详解已迁往本目录;两处收敛为"通用机制 +
总览 + 指针"排在 docs/门禁说明/README.md §4 的下一步,并注明收敛要按内容重指既有引用——只核编号
存在与否不够);README 索引 23 行状态全部置为已写、文档列改为可达链接。
验证:纯文档,不动代码与构建产物;check_doc_links --all --sections-strict **171 篇 0 问题**
(新目录 24 个文件的内部链接与跨文档引用都纳入判定);id-check --strict 增量拦截通过;本次受影响
文件 pre-commit run **RC=0**;24 个文件字节卫生 0 异常(无 BOM、无 CR、无 U+FFFD、均有尾换行)。
|
2026-10-23 10:54:33 +08:00 |
|