docs(规范): 立两条协作纪律——归因必须带可复核证据、注释必须陈述事实而非意图

§2.4 讲的是「抢跑之前自己该跑哪些等价门禁」,那一节管形态;这一节管另一类钩子拦不住的东西:
**归因与陈述的正确性**。今天一天里,这类错误造成的代价不比任何一个编译错误小,所以四条规则
每条都配着当天真实发生过的一次返工:

1. 数字必须钉产物身份(路径 + 构建/运行时刻);**重跑同一个报告脚本不算新测量**——产物没变、
   数字必然不变,写成「我复验过」就是假凭证。附带本仓实测坑:stack_report.py 的 REPO_ROOT 跟着
   __file__ 走,cd 进别的 worktree 跑主仓脚本量的还是主仓产物(今天就栽过一次,据此错怪了一笔
   清白的提交,公开更正了两次)。
2. hash 不是稳定身份,tree + 父提交才是;出回执前先核 reflog,**先请人按 hash 复算、自己再重写
   hash** 是顺序错误(今天真发生过,让队友的回执一出生就过期)。
3. 归因前先确认数字来自哪棵树、哪一次运行——并发时序不是谁的错。当天把「文件 mtime 晚于构建」
   误判成某个道「删实现后注册」,实际只是两条道同时在写、构建读到中间态;更正时两个道都点到名。
4. 「我核过」不等于机器核过:「6 个文件 BOM 逐个核过」被 bom-guard 证伪;自写扫描脚本报「0 处
   嵌套注释」是脚本自身 bug 的假绿。结论必须附可复跑的命令与退出码。

同族第二条是「**注释与文档必须陈述事实,而不是意图**」:ui_data_maint_ready() 的头注释写着「页面用
它决定这页能不能操作」,而页面从没用过它(全仓零消费者)。它解释了为什么假接口能活过一整轮评审:
**评审读意图陈述,门禁读可达路径,两者都不反驳「意图未实现」**。写法要求与机器兜底的分界也写清了:
死代码有 bsp-err 的 consume-result 与覆盖率总闸兜,**意图陈述没有任何钩子能证伪**,只能靠写的人,
所以才必须落在文档里。

自查:check_doc_links.py --all exit 0(186 个文档)、本篇 --sections-strict exit 0(新增引用全部写成
可校验形式);check_ids.py --strict exit 0,不可判定绝对数 1162 **未变**(本笔没吃余量、没新增编号);
字节卫生 bom=false / CRLF=0 / U+FFFD=0 / 结尾换行齐,新增行最长 79 字符。

看板:本笔收口 task-35。其余任务仍在五条道手上,我只暂存本篇。
This commit is contained in:
2026-10-27 02:06:14 +08:00
parent c90380bf9c
commit 563737f39c
@@ -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 正常提交(秒级完成)