记录采纳 pi 反提案(d562f55)+ 判据自身两个 bug;★ 新记法: 假绿可以来自"判据读输入的那一步"(管道层)
★ (A) 采纳: 声明动作化 agentmail_require ⇒ "声明了但没检查"从表示上消失(我原判"记为边界",pi 换掉了前提)
★ (B) 判据 bug① 假红: 我按 `deploy/**/*.sh` 划范围 ⇒ 把 `agentmail_require()` 体内的
`AGENTMAIL_REQUIRE="$*"`(**动作自己的实现**)判成违规
⇒ 改为按性质划: "调用者"= **真的 source 了本库**的文件(身份由 source 定义,不由目录猜)
★ (C) 判据 bug② **假阴且不稳定**: `sed | grep -q` 在 pipefail 下 ⇒ grep 早退 ⇒ sed 收 SIGPIPE(141)
⇒ 管道整体 141 ⇒ if 判假 ⇒ 文件被静默漏掉;实测两次分别 2 个/1 个调用者(实际 3 个)
⇒ 集合偏少且不稳 ⇒ "裸赋值 0 处"是**假绿**;改为收集到变量再 grep <<< ⇒ 修后 10 次稳定 3
★ 但机制不是"凡管道皆危险"(实测): 多行 sed ⇒ 141;单巨行 sed ⇒ 0;
tr/cat/awk/sort ⇒ 不是 141;grep -o 作生产者 ⇒ 141
⇒ 真条件 = **"生产者还有东西要写" ∧ "消费者早退"**
★ (C') 本仓已有同族先例(非我发现): check-sandbox.sh:57 注释写着同形状("'被拒'和'被拒判据本身炸了'长得一模一样")
⇒ 记为**同一族的第二个实例**(那次在沙箱判据,这次在集合枚举)
★ 记法: ⑨ 是**命令层**(命令不在≠输出为空);这条是**管道层**(判据读输入那一步可以是假绿来源)——
不报错、不稳定、且**偏向"看起来更干净"的那一侧**
★ 验证: 四向变异 + 累积通道隔离测(未中止 + RC=1 + 后续诊断在)+ criteria-hygiene 7/7 + env-guard 17/17
This commit is contained in:
58
docs/API.md
58
docs/API.md
@ -4965,3 +4965,61 @@ window.__AGENTMAIL_TOKEN__ = '<user_key>'; // 省略则走 Cookie
|
||||
⇒ 我建议并进清单: **报"某一行与实测不符"前,先把那一行的样本逐字节复现出来**。
|
||||
```
|
||||
## (D) 边界: 只读 SQL + 只读文件;仓库与生产未动
|
||||
|
||||
---
|
||||
|
||||
- ★★ **采纳 pi 反提案(`aec7f5c`)** + **判据自身的两个 bug**(第二个是"假绿的新来源")
|
||||
|
||||
## (A) 采纳: 声明动作化 —— "声明了但没检查"从表示上消失
|
||||
```
|
||||
我原判: "调用者既不 export 表、又忘了调 report ⇒ 仍会漏" ⇒ **记为边界**(理由: 控制流不可知)
|
||||
pi 指出前提可换(我复核采纳): 病根不是"控制流不可知",
|
||||
而是"**声明(赋值)**与**检查(调用)**是可分离的两个动作"
|
||||
⇒ `agentmail_require <命令…>` = 赋值 + 立刻检查 ⇒ 该状态**不存在**
|
||||
落地: env-defaults.sh 加动作;三个调用者各改 1 行;新判据 `deploy/check-require-declaration.sh`;
|
||||
install.sh 接线走 `CHECK_GATE_RC` **累积**通道(同 check-file-modes.sh 的既有做法)
|
||||
```
|
||||
## (B) ★ 判据自己的 bug ①:**按目录划范围 ⇒ 假红**
|
||||
```
|
||||
我第一版: 扫 `deploy/**/*.sh` 全部 ⇒ 立刻把 `env-defaults.sh:449`
|
||||
(`agentmail_require()` 函数体里的 `AGENTMAIL_REQUIRE="$*"` —— **动作自己的实现**)
|
||||
判成违规。
|
||||
⇒ 改为按**性质**划: "调用者" = **真的 source 了本库**的文件,减去定义动作的那个库。
|
||||
⇒ 记法: **"调用者"这个身份由 source 这个动作定义,不由目录或文件名猜** ——
|
||||
与"类要由真的机制划"(③)同源,只是这次对象是"哪些文件算这个判据的调用者"。
|
||||
```
|
||||
## (C) ★★★ 判据自己的 bug ②:**假阴且不稳定** —— 假绿可以来自"读输入的那一步"
|
||||
```
|
||||
写法: strip_comments "$f" | grep -qE '…' (set -o pipefail 已在文件头)
|
||||
机制: `grep -q` **一命中就退出** ⇒ 关掉管道 ⇒ 左侧 `sed` 收 **SIGPIPE(rc=141)**
|
||||
⇒ **管道整体返回 141** ⇒ `if` 判**假** ⇒ 该文件被**静默漏掉**
|
||||
实测: 同一条命令两次分别找到 **2** 个与 **1** 个调用者(实际 **3** 个);`rc=141` 被 if 吞掉
|
||||
⇒ 集合**偏少且不稳** ⇒ "裸赋值 0 处"照样打印 ⇒ **假绿**
|
||||
修法: 先把去注释结果**收集到变量**,再 `grep <<< "$body"`(无管道)⇒ 修后**重复 10 次稳定 3**
|
||||
★ 但机制**不是"凡管道皆危险"**(我实测过,避免过度推广):
|
||||
生产者 | 输入形态 | rc
|
||||
sed(多行) | 400k 行、首行即命中 | **141** ★
|
||||
sed(单巨行) | 一行、首字符即命中 | 0
|
||||
tr / cat / awk / sort | 同尺寸输入 | 0 / 1(不是 141)
|
||||
grep -o(作生产者) | 同尺寸输入 | **141** ★
|
||||
⇒ 真正的条件是: **"生产者还有东西要写" ∧ "消费者早退"** ——
|
||||
不是"用了 sed"、也不是"用了管道"。
|
||||
⇒ ★ 记法(我建议与 ⑨ 并列): ⑨ 是**命令层**("命令不在≠输出为空");
|
||||
这条是**管道层**: **判据读输入的那一步本身可以是假绿的来源** ——
|
||||
它**不报错**(141 被 if 吞)、**不稳定**(取决于缓冲/退出时机)、
|
||||
且**偏向"看起来更干净"的那一侧**(漏文件 ⇒ 违规更少 ⇒ 更容易绿)。
|
||||
★ 本仓已有**同一条**的先例(不是我发现的): `deploy/check-sandbox.sh:57` 注释里
|
||||
写着同一形状("grep -q 命中后立刻退出、把管道关掉,左侧沙箱进程拿到 EPIPE;
|
||||
在 pipefail 下整条管道判失败 —— **'被拒'和'被拒判据本身炸了'长得一模一样**")。
|
||||
⇒ 我把这次记为**同一族的第二个实例**(那次在沙箱判据、这次在集合枚举)。
|
||||
```
|
||||
## (D) 验证(四向 + 累积通道隔离 + 两个既有套件)
|
||||
```
|
||||
· 基线 rc=0(3 个调用者,裸赋值 0 处);修 SIGPIPE 后**重复 10 次稳定 3**
|
||||
· 变异①裸赋值 ⇒ rc=1 ✓/②少一个调用者(剩2) ⇒ rc=0 ✓ 非空转/③三 source 全注释 ⇒ rc=1 ✓ **防空转**
|
||||
· 每个变异后还原复测 rc=0;`git diff --numstat` 确认只有预期行
|
||||
· ★ 累积通道隔离测: `CHECK_ONLY=1` + 注入裸赋值 ⇒ 报 [FAIL] 且 **set -e 下未中止**、
|
||||
`CHECK_GATE_RC=1`、**后续诊断仍打印** ✓
|
||||
· criteria-hygiene **7/7** 绿(新 check-*.sh 已被 install.sh 真调用);pi 的 env-guard **17/17** 绿
|
||||
```
|
||||
## (E) 边界: 判据盖"**字面**裸赋值",**不盖间接赋值**(经 eval/read/env 注入)—— 已写进判据头
|
||||
|
||||
Reference in New Issue
Block a user