docs(规范,门禁): 卷锁五态去裸形——本仓第一次真正还第二根护栏的债,并写清还债的算法

最反直觉的是结果里的差值:36 处裸形态号全部清零,绝对数只从 1,162 降到 1,156(−6,余量 4 → 10 格)。
作者没把差值糊过去而是查到底:check_ids 只在字面量**落不进任何已登记族**时才计不可判定,撞进已登记族的
23 处本来就记在可判定侧,删它们分子分母同缩、比例反而从 86.74% 涨到 86.77%;真正在盲区里的只有族外
7 处,其中 1 处还被变更记录行豁免 ⇒ 账面 −6,算式对平(±1 属同窗别道在飞)。**这四条机制我写进
docs/门禁说明/id-check.md §6.10 并署名作者**——它是「怎么还这根护栏的债」的第一份操作口径。

改动面:App/fs/vol_lock.c 10 处、.h 6 处、vol_lock_test.c 14 处、卷锁单元测试说明.md 3 处 ⇒ 同口径
改后 0 处。四态语义只留 vol_lock.h 的 vol_lock_stats_t 注释一处,其余三处只描述断言并指回头文件,
不抄第二真源。除 4 行声明外全是注释文字,代码行为零改动。顺带消掉一个**同形两义**的撞号源。

实测:1,162(03:15:08)→ 1,156(03:21:56),写变更记录后复量仍 1,156(本笔没吃余量);--strict exit
0;vol_lock 套件 45/45;**上限未动、刻意不跑 --update-baseline**(作者反对成立:重锚会把只减不增的线
按这次 −6 重画,白丢一次真还债的账面记录);未改 id_registry.json / 台账,未跑 --all-files。
This commit is contained in:
2026-10-27 05:14:11 +08:00
parent b1494eb10c
commit f1d0b5c2d9
5 changed files with 41 additions and 26 deletions
+8 -8
View File
@@ -32,9 +32,9 @@
* TC-VOLLOCK-014 wait(0) 的 timeout 透传为 0(defaultTask 的 try 语义)
* —— 观测计数(道G task-17「卷锁 5 态可观测性」)——
* TC-VOLLOCK-015 成功路径只涨 acquired,三个异常计数必须为 0
* TC-VOLLOCK-016 timeout=0 未取到 -> 只进 try_timeout(T2,没等)
* TC-VOLLOCK-017 timeout=100 未取到 -> 只进 blk_timeout(T3,等了没等到),
* 与 T2 互不冒领
* TC-VOLLOCK-016 timeout=0 未取到 -> 只进 try_timeout(try 超时态,压根没等)
* TC-VOLLOCK-017 timeout=100 未取到 -> 只进 blk_timeout(分片退让态,等了没等到),
* 与 try 超时态互不冒领
* TC-VOLLOCK-018 ⭐ fail-open 仍返 1(口径不变)但 failopen 计数自增并可累加
* —— 把"谎报成功"那一态变成事后可查的证据
* TC-VOLLOCK-019 观测口:NULL 无害、重复读取不消耗证据
@@ -222,8 +222,8 @@ static void tc_release(void) {
/* ===================== TC-VOLLOCK-015..019:观测计数(道G task-17) =====================
* 这一组是"5 态可观测性"的机器证据:
* T-a acquired / T2 try_timeout / T3 blk_timeout / T4 failopen 各自独立自增,
* T2 与 T3 不许互相冒领(那是本卡唯一"语义合并"风险),T4 从"谎报成功"变成可查。
* 四态 acquired / try_timeout / blk_timeout / failopen 各自独立自增(定义只在 vol_lock.h),
* try 超时态与分片退让态不许互相冒领(本卡唯一"语义合并"风险);零互斥态从"谎报成功"变成可查。
*/
static void tc_stats(void) {
vol_lock_stats_t st;
@@ -237,7 +237,7 @@ static void tc_stats(void) {
&& (st.failopen == 0u),
"TC-VOLLOCK-015b acquired only: a successful lock never inflates any anomaly counter");
/* 016 T2:timeout=0 的 try 失败 -> 只进 try_timeout */
/* 016 try 超时态:timeout=0 的 try 失败 -> 只进 try_timeout */
fakes_reset();
(void)vol_lock_init();
s_wait_ok = 0;
@@ -246,7 +246,7 @@ static void tc_stats(void) {
CHECK((st.try_timeout == 1u) && (st.blk_timeout == 0u) && (st.acquired == 0u),
"TC-VOLLOCK-016b timeout=0 miss counts as try_timeout and NOT as blk_timeout (feed point never waited)");
/* 017 T3:timeout>0 的分片等待超时 -> 只进 blk_timeout(与 T2 分道) */
/* 017 分片退让态:timeout>0 的分片等待超时 -> 只进 blk_timeout(与 try 超时态分道) */
fakes_reset();
(void)vol_lock_init();
s_wait_ok = 0;
@@ -255,7 +255,7 @@ static void tc_stats(void) {
CHECK((st.blk_timeout == 1u) && (st.try_timeout == 0u),
"TC-VOLLOCK-017b slice timeout counts as blk_timeout and NOT as try_timeout (waited-but-missed is a different fact)");
/* 018 T4 核心:锁不存在时 wait 仍返 1(TC-VOLLOCK-008 的口径),但现在必须留下
/* 018 零互斥态(本组核心):锁不存在时 wait 仍返 1(TC-VOLLOCK-008 的口径),但现在必须留下
* 可查证据 —— 这一态此前被谎报成"取到锁",整机没有任何地方能发现它 */
fakes_reset();
s_new_fail = 1;