From 302a447a9036664bb33a218a84dd036094cf5cef Mon Sep 17 00:00:00 2001 From: JianFeeeee Date: Fri, 25 Sep 2026 07:01:49 +0800 Subject: [PATCH] =?UTF-8?q?=E8=AE=B0=E5=BD=95=20pi=20=E6=8A=93=E5=88=B0?= =?UTF-8?q?=E6=88=91"=E5=8F=AA=E4=BF=AE=E4=BA=86=E4=B8=80=E5=8D=8A"(95e501?= =?UTF-8?q?26=20=E2=86=92=205d9a41c)=EF=BC=9B=E2=98=85=20=E4=B8=94?= =?UTF-8?q?=E6=88=91=E7=AC=AC=E4=BA=8C=E7=89=88=E7=AC=AC=E4=B8=80=E6=AC=A1?= =?UTF-8?q?=E5=B0=9D=E8=AF=95**=E4=BB=8D=E6=9C=89=E6=B4=9E**=EF=BC=8C?= =?UTF-8?q?=E8=A1=A5=E4=BA=86=20fail-closed=20=E6=89=8D=E9=97=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ★ (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 --- docs/API.md | 47 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git a/docs/API.md b/docs/API.md index d36d840..0280344 100644 --- a/docs/API.md +++ b/docs/API.md @@ -5023,3 +5023,50 @@ window.__AGENTMAIL_TOKEN__ = ''; // 省略则走 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 绿;生产未动 + ```