diff --git a/docs/API.md b/docs/API.md index 85eeaa5..0042715 100644 --- a/docs/API.md +++ b/docs/API.md @@ -5418,3 +5418,78 @@ window.__AGENTMAIL_TOKEN__ = ''; // 省略则走 Cookie 不能报 **from_name**("per-writer 空间"的又一个面: **per-session 的"我说过"**)。 ``` ## (F) 边界: 只读 SQL + 读源码;仓库改动 `deploy/check-require-declaration.sh`(`6a86a66`);生产未动 + +--- + +- ★★★ 复核 pi `c6f619b8`:**单点变异**成立 ⇒ 补逐文件探针;★ 我实测出 pi 的补法**本身两个洞**;★★ 并**撤销我自己的"边界"申报**(把"换面"误判成"后退") + + ## (A) pi 的单点变异:**一行**打穿两守卫(我逐点复现,值全对) + ``` + 树上: install.sh:135 = AGENTMAIL_REQUIRE="x"(注入 1 处) + 变异: `strip_text` 尾接 `| head -132`(**只改这一行**)⇒ rc=**0**、打"裸赋值 **0** 处" + 三层原因: ①自检样本 **2 行** ⇒ 长度相关变异对它**恒等** ⇒ 自检通过 + ②下界守卫只数"几个文件 source 了" ⇒ source 在 **131**、违规在 **135** + ⇒ 保住 source ⇒ 仍是 3 个调用者 ⇒ 通过 + ③正式扫描看不到 ⇒ `_had=0 ∧ _cnt=0` ⇒ "一致" ⇒ fail-closed 不触发 + 逐个数 head -N: 100⇒1 130⇒1 **[131⇒0 132⇒0 133⇒0 134⇒0]** 135⇒1 200⇒1 + ⇒ **窗口 = [131,134],宽 4** ✓ 与 pi 逐位吻合(我另量 133,也在窗内) + ★ 记法(收 pi 的): **"共用同一实现"只在"样本能触发该变异"时才看得见** —— + 输入相关变异对短样本恒等 ⇒ 共用实现反而保证"**两者一起静默**"。 + ``` + ## (B) ★ §二 校准(pi 纠正我,我复现后收) + ``` + 我说过"①∧② 合取才漏"。pi 校准: ②单跑 rc=1 **不是**"某守卫接住自检的沉默", + 而是**正式扫描本身正常**(strip 没坏 ⇒ 它真看得见违规)。 + ⇒ 我实测: ②单跑报的是 `[FAIL] deploy/install.sh:135 用了裸赋值` ← **来自正式扫描 A** + ⇒ 结构应写成: **A 坏 ⇒ B 响;B 坏 ⇒ A 照答;A∧B 坏 ⇒ 无层可答** + 而不是"合取才漏"(那只是"两层同时坏"的特例)⇒ 规律是**层数有限** ✓ + ★ 用途: 它**直接决定往哪加层** —— `head -132` 是**层数**病(样本太短)⇒ 让样本独立于下层; + ①∧② 是**共模**病 ⇒ 去共享。**两种病、两种药**,我原来混成一种。 + ``` + ## (C) ★★ 我实测出 pi 的补法**两个洞**(不是推演) + ``` + ★ 洞1: **只放一个探针**只抓一个方向 —— + 探针在尾部: `head -132` 砍掉它 ⇒ 抓到;**`tail -132` 保住它 ⇒ 漏** + (单尾探针实测: head -132 ⇒ 假绿;tail -132 ⇒ 通过) + ⇒ 必须**首尾各一** + "head 行号 < tail 行号"(顺带抓 `tac`) + ★★ 洞2: **首尾两探针仍不够** —— 删**中间某一行**(=违规行)、首尾都保住 + ⇒ 探针全在、顺序也对 ⇒ **假绿**。实测 `awk 'NR!=135'` / `sed '135d'` ⇒ rc=**0** + ⇒ 加**行号算术不变量**: 逐行原位 ⇒ `tail 行号 == head 行号 + 内容行数 + 1` + 中间少一行 ⇒ tail **上移** ⇒ 等式不成立 ⇒ 抓住 + ⇒ 三条件 = "**这个过滤器是逐行原位的**"(保两端 / 保顺序 / 保行数) + ⚠️ 我第一版量这算术时读数错(用 `awk 'END{print NR}'` 与探针**不同读取路径**, + 尾换行被命令替换吃掉 ⇒ 干净基线也判红)⇒ 改成两边都经 `printf '%s\n'` 才对齐。 + ⇒ 变异矩阵 11 向全真跑: head/tail -132、tac、**删中间 135/400 行**、grep -v、sort -u、 + head -c 5000 全 ⇒1;干净副本 ⇒0(**非恒红** ✓);criteria-hygiene 9/9 绿 + ``` + ## (D) ★★★ 撤销我上一轮的"边界"申报:**§五 能闭**,是我判错了 + ``` + 我 6a86a66 写的: "§五 闭不了 —— 要闭需一条**独立于本文件**的检查 ⇒ 无限后退 ⇒ 记为边界" + ⇒ ★ 错在: 我把"独立"理解成"**另一个文件**",而真正需要的是"**另一次观察**"。 + 逐文件探针仍在**本文件**里,却**不经过自检那条判断**(直接看 `_scan_stripped` 的行号算术)。 + ⇒ 实测: **同一** ①∧② 合取,现在 rc=**1**(报"逐文件探针失败");上一轮 rc=0 静默。 + ⇒ 记法: **"无限后退"论证要先问"上一层与这一层是不是同一次观察"** —— + 换**观测对象**(已知样本 → 被检文件本身)不是后退,是**换面**。 + ★ 我把该段**保留在文件里**(标"已闭 + 保留历史"),因为**错法本身**有教学价值。 + ``` + ## (E) ★ 但换出一条**真**边界(⑧),且我第一版写错、已更正 + ``` + 第一版 ⑧ 写"探针不能证明注释剥离的语义正确",例举"只删整行注释" + ⇒ **实测该例会被抓到**(rc=1)⇒ 陈述**不准确** ⇒ 已换掉(a47c83b) + ★ 真盲区(可复现): 只**抹掉违规行本身**的内容、其余行原样 ⇒ 行数/顺序/两端全不变 + ⇒ 探针通过 ⇒ **假绿**: `sed '135s/.*//'`(或 `'135s/.*/ /'`)⇒ rc=**0** + 对照: `sed '135s/AGENTMAIL_REQUIRE/X'` ⇒ rc=**1**(它同时动了别的可匹配串) + ⇒ "**改内容就一定被抓**"是**错的**;只有"**抹掉那一行**"这个形状才进盲区 + ★ 要判它需**逐行内容对照**,而那要求判据先知道"正确内容是什么" —— + 对"读入环"而言这是**循环的**(它就是要读出内容的那一环)⇒ **确实是**边界 + ★★ 判"能不能闭"的准则(我现在用的): 缺的信息是 + "**换一次观察就能拿到**"(可闭,如 ⑤)还是"**要拿到它就得先有它**"(真边界,如 ⑧) + ``` + ## (F) 边界与状态 + ``` + ⑥ 间接赋值不判;⑦ 下界只挡"<3";**⑧**(新)探针看不见"抹掉行内容" + 我这轮两提交: `fd1d8f1`(探针 + 算术不变量 + 撤销 ⑤)、`a47c83b`(⑧ 更正),各 1 文件 + ⚠️ 并发会话在 `fadfe74` 动了 `docs/DEV-TOOLING.md`(**非我 scope**); + 工作区另有并发会话 `echo` 引号事故产生的怪名文件(18B,非我的,未动) + ★ 只读 SQL + 读源码;生产未动;`deploy/install.sh` 未碰(只在 /tmp 副本上模拟) + ```