记录 pi 抓到我"只修了一半"(95e50126 → 5d9a41c);★ 且我第二版第一次尝试**仍有洞**,补了 fail-closed 才闭

★ (A) 我在同文件 :65 写下警告、:102 却没照做(仍是 `sed | grep -nE` 管道)
     它不出事只因"恰好选了不早退的 -n";pi 实验: 改成 -q ⇒ 3 个违规**全漏**、rc 由 1 变 0 ⇒ 我复现 ✓
     ⇒ **"恰好选了不早退的选项"不是正确性,是运气**
★ (B) ★ 我第二版做两样(去管道 + 两条独立通道)后**实测仍有洞**:
     [C] 把取行号那处改成 -q ⇒ 报 0 个、rc=0 —— 因为 `fails` **计数**仍由行号输出驱动
     ⇒ 补 ③ **不一致时 fail-closed**(退出码说有 ∧ 行号通道没给 ⇒ 按"有违规"计 + 报出矛盾)
       ⇒ 补后 [C] rc=1 且 fail-closed 报出 3 次 ✓
     ⇒ 记法: **"计数"与"证据"走同一条通道时,那条通道静音就等于"没有"** ——
       要么分通道,要么规定**静音=失败侧**。我"做了两样以为够了"正是把这条漏在自己身上
★ (C) pi 的机制细化我收: 决定 SIGPIPE 的是**匹配点之前的字节数**(8525⇒141 / 3180⇒0 / 2954⇒141)
     ⇒ "不稳定"其实是确定性,阈值(~4-8KB)藏在数据里 ⇒ **改改注释或挪挪那行,rc 就翻面**
     我的补充: 单巨行 sed(一次读全再写)⇒ rc=0,与"生产者还有没有东西要写"一致
★ (D) 验证: 三变异全 rc=1 + fail-closed×3;每变异后还原复测 rc=0;仅 add 我的文件
     (并发会话在改 check-deploy-drift.mjs,未 add 它的改动);criteria-hygiene 7/7、env-guard 17/17
This commit is contained in:
2026-09-25 07:01:49 +08:00
parent 4598095b17
commit 302a447a90

View File

@ -5023,3 +5023,50 @@ window.__AGENTMAIL_TOKEN__ = '<user_key>'; // 省略则走 Cookie
· criteria-hygiene **7/7** 绿(新 check-*.sh 已被 install.sh 真调用);pi 的 env-guard **17/17** 绿
```
## (E) 边界: 判据盖"**字面**裸赋值",**不盖间接赋值**(经 eval/read/env 注入)—— 已写进判据头
---
- ★★★ **pi 抓到我"只修了一半"**(`95e50126` 指出,我复现成立;第二版 `930985a`)
同一个文件里,我写下警告却**没有在自己身上执行** —— 这是本会话第四次"我断言、我错"
## (A) 它指的那处与我复现
```
我写的规则(本文件 :65): "不要写 `strip_comments "$f" | grep -q …`(pipefail 下 SIGPIPE)"
同一个文件 :102(第一版): `hits="$(strip_comments "$f" | grep -nE '…' || true)"` ← **仍是管道**
★ 它**目前**不出事,只因为选了 `-n`(`grep -n` 要读完全部输入才退出 ⇒ 无早退 ⇒ 无 SIGPIPE)
pi 的可判实验(我照做复现): 把 `-n` 改成 `-q`
现行 `-n` ⇒ 报 **3** 个违规 / rc=**1**
变异 `-q` ⇒ 报 **0** 个违规 / rc=**0**(3 个**全部静默漏掉**)
⇒ ★ **"恰好选了不早退的那个选项"不是正确性,是运气。**
```
## (B) ★ 我的第二版**第一次尝试仍然有洞**(这一点必须记住)
```
我做了两样: ① 去管道(`<<<`)② 两条独立通道(`-q` 判有没有 / `-n` 取行号)
再测 [C] 把"取行号"那处改成 `-q` ⇒ 报 **0** 个违规、rc=**0** —— **又是全漏**
⇒ 原因: 我的 `fails` **计数**仍由**行号输出**驱动 —— 两样都做了,**判定还是落在输出通道上**
⇒ 补第三样 ③ **不一致时 fail-closed**: "退出码说有"∧"行号通道没给出行号"
⇒ 判据**内部自相矛盾** ⇒ **按"有违规"计**并报出该矛盾
⇒ 补后 [C] ⇒ rc=**1**,且 **fail-closed 报出 3 次** ✓
⇒ ★ 记法: **"计数"与"证据"若走同一条通道,那条通道静音就等于"没有"** ——
要么**分通道**,要么**规定静音=失败侧**(本处取后者)。
我"做了两样以为够了"的那一步,正是把这条记法**漏在自己身上**。
```
## (C) pi 另给的机制细化(我收)
```
pi: 决定 SIGPIPE 的不是**文件大小**,是**匹配点之前的字节数**
install.sh 匹配@135 行、其前 8525 字节 ⇒ rc=141
plugin.sh 匹配@56 行、其前 3180 字节 ⇒ rc=0
gateway.sh 匹配@46 行、其前 2954 字节 ⇒ rc=141
⇒ 即"不稳定"其实是**确定性**的,阈值(约 4–8KB)藏在数据里
⇒ 更准的说法: **同样的代码,改一改注释或挪一挪那行,rc 就翻面**
★ 我实测的补充: 用巨量多行输入复现 141;而**单巨行**(sed 一次读全再写)⇒ rc=0
⇒ 与 pi 的"匹配点之前的字节数"一致:条件是**生产者还有没有东西要写**
```
## (D) 验证(三变异 + 两套件)
```
· 基线 rc=0(3 个调用者,裸赋值 0 处)
· [A] 注入 3 处裸赋值 ⇒ rc=1 ✓/[B] 判"有没有"处 -q→-n ⇒ rc=1 ✓/[C] 取行号处 -n→-q ⇒ rc=1 ✓ + fail-closed×3
· 每变异后还原复测 rc=0;`git diff --numstat` 仅剩我的文件
(★ 同目录另有**并发会话**在改 `check-deploy-drift.mjs`(它的 ⑬″ 守护格)—— 我**未 add** 它的改动)
· criteria-hygiene 7/7 绿;pi 的 env-guard 17/17 绿;生产未动
```