diff --git a/docs/代码规范/pre-commit使用说明.md b/docs/代码规范/pre-commit使用说明.md index bda88545..25babc5b 100644 --- a/docs/代码规范/pre-commit使用说明.md +++ b/docs/代码规范/pre-commit使用说明.md @@ -169,6 +169,36 @@ git commit 复核被改动的是不是只有你那几笔(别人在飞时跑它 = 替人改文件,比重跑生成器更危险)。 --- +### 2.5 写进提交信息与文档的每条归因,必须带可复核证据(2026-10-27 立,当天三次真实返工换来的) + +钩子拦得下**形态**错,拦不下**归因**错。下面四条没有一条是机器能自动判的,但每一条当天都真的 +发生过,代价从「别人返工」到「公开怪错一个道」都有: + +1. **数字必须钉产物身份**:写一个数,就同时写它出自哪份产物(路径)+ 哪一次构建或运行时刻 + (静态链写 `Linker run` 时刻,脚本类写日期 + 命令)。**重跑同一个报告脚本不算新测量**——产物 + 没变,数字必然不变,那只是复述;写成「我复验过」就是假凭证。 + ⚠ 本仓真实坑:`scripts/stack_report.py` 的 `REPO_ROOT` 跟着 `__file__` 走(不看 `cwd`),所以 + 「cd 进别的 worktree 再跑主仓的脚本」量的还是主仓产物。要量哪棵树,就用**那棵树自己的** + `scripts/`、从那棵树的根起跑。 +2. **hash 不是稳定身份,tree + 父提交才是**:`--amend` 与重写正文都会换 hash。出「按 hash 复核」 + 的回执之前先 `git reflog` 看一眼有没有人被重写过;反过来说,**先请别人按 hash 复算、自己再去 + 重写 hash** 是顺序错误(2026-10-26 真实发生,等于让对方的回执一出生就过期)。要证明「只换了 + 正文」,用「`git diff 旧 新` 为空 + tree hash 相同」两条,比任何口头都硬。 +3. **归因之前先确认这个数字来自哪棵树、哪一次运行**:并发时序不是谁的错。当天有过一次把「文件 + mtime 晚于构建」误判成某个道「删了实现才去注册」,实际只是两条道同时在写、构建读到中间态; + 更正时把两个道都点到名,并把这条写成硬规矩,而不是悄悄改口。 +4. **「我核过」不等于机器核过**:当天两次真实反例——「6 个文件 BOM 逐个核过」随后被 `bom-guard` + 抓到丢 BOM;自写的扫描脚本报「0 处嵌套注释」,是脚本自己有 bug 的假绿。结论一律附上**可复跑 + 的命令与退出码**(或门禁名 + 实测数字),不写「已确认无误」这种无法反驳的话。 + +**同族第二条:注释与文档必须陈述事实,而不是意图。** `ui_data_maint_ready()` 的头注释写着「页面用 +它决定这页能不能操作——未注入时按钮一律拒并按 LOCK 显示」,而**页面从来没用过它**:全仓零消费者, +只有它自己的用例在读。这条值得单列,是因为它解释了失效机制——**评审读的是意图陈述,门禁读的是 +可达路径,两者都不反驳「意图未实现」**,所以一个假接口能活过一整轮评审。写法要求:接口注释要么 +描述当前真实的消费者与真实行为,要么显式写「尚无消费者,等待某件事落地」;**禁止用将来式或能力式 +语气陈述未实现的行为**(那会让下一个人在它上面继续盖楼)。能被机器兜的那一半已经兜住了——死代码 +靠 `bsp-err` 的 consume-result 与覆盖率总闸暴露,「改了生成器没重跑生成物」靠 `generated-fresh` 拦; +但**注释里的意图陈述没有任何钩子能证伪**,只能靠写的人自觉,所以才把它写在这里。 ## 3. 日常工作流 ### 3.1 正常提交(秒级完成)