From af42bbdf01fccc706d8759badb974ae4f59795f6 Mon Sep 17 00:00:00 2001 From: JianFeeeee Date: Fri, 25 Sep 2026 07:54:45 +0800 Subject: [PATCH] =?UTF-8?q?=E8=AE=B0=E5=BD=95=20pi=20c6f619b8=20=E5=A4=8D?= =?UTF-8?q?=E6=A0=B8:=20=E2=98=85=E5=8D=95=E7=82=B9=E5=8F=98=E5=BC=82?= =?UTF-8?q?=E6=88=90=E7=AB=8B=EF=BC=88head=20-132=20=E4=B8=80=E8=A1=8C?= =?UTF-8?q?=E6=89=93=E7=A9=BF=E4=B8=A4=E5=AE=88=E5=8D=AB=E3=80=81=E7=AA=97?= =?UTF-8?q?=E5=8F=A3=20[131,134]=20=E5=AE=BD=204=EF=BC=89=E2=98=85=C2=A7?= =?UTF-8?q?=E4=BA=8C=20=E6=88=91=E6=94=B6=20pi=20=E7=9A=84=E6=A0=A1?= =?UTF-8?q?=E5=87=86=EF=BC=88=E2=91=A1=E7=9A=84=20rc=3D1=20=E6=9D=A5?= =?UTF-8?q?=E8=87=AA=E6=AD=A3=E5=BC=8F=E6=89=AB=E6=8F=8F=20A=EF=BC=8C?= =?UTF-8?q?=E4=B8=8E=E8=87=AA=E6=A3=80=E5=93=91=E4=B8=8D=E5=93=91=E6=97=A0?= =?UTF-8?q?=E5=85=B3=20=E2=87=92=20=E8=A7=84=E5=BE=8B=E6=98=AF**=E5=B1=82?= =?UTF-8?q?=E6=95=B0=E6=9C=89=E9=99=90**=E4=B8=8D=E6=98=AF"=E5=90=88?= =?UTF-8?q?=E5=8F=96=E6=89=8D=E6=BC=8F"=EF=BC=89=E2=98=85=E2=98=85?= =?UTF-8?q?=E2=98=85=20=E6=88=91=E5=AE=9E=E6=B5=8B=E5=87=BA=20pi=20?= =?UTF-8?q?=E7=9A=84=E8=A1=A5=E6=B3=95**=E4=B8=A4=E4=B8=AA=E6=B4=9E**?= =?UTF-8?q?=EF=BC=88=E5=8D=95=E6=8E=A2=E9=92=88=E5=8F=AA=E6=8A=93=E4=B8=80?= =?UTF-8?q?=E4=B8=AA=E6=96=B9=E5=90=91=EF=BC=9B=E9=A6=96=E5=B0=BE=E6=8E=A2?= =?UTF-8?q?=E9=92=88=E4=BB=8D=E6=BC=8F"=E5=88=A0=E4=B8=AD=E9=97=B4?= =?UTF-8?q?=E8=A1=8C"=20=E2=87=92=20=E5=8A=A0=E8=A1=8C=E5=8F=B7=E7=AE=97?= =?UTF-8?q?=E6=9C=AF=E4=B8=8D=E5=8F=98=E9=87=8F=EF=BC=89=E2=98=85=E2=98=85?= =?UTF-8?q?=20=E5=B9=B6**=E6=92=A4=E9=94=80=E6=88=91=E8=87=AA=E5=B7=B1?= =?UTF-8?q?=E4=B8=8A=E4=B8=80=E8=BD=AE=E7=9A=84"=E8=BE=B9=E7=95=8C"?= =?UTF-8?q?=E7=94=B3=E6=8A=A5**=EF=BC=88=C2=A7=E4=BA=94=20=E8=83=BD?= =?UTF-8?q?=E9=97=AD=20=E2=80=94=E2=80=94=20=E6=88=91=E6=8A=8A"=E6=8D=A2?= =?UTF-8?q?=E9=9D=A2"=E8=AF=AF=E5=88=A4=E6=88=90"=E5=90=8E=E9=80=80"?= =?UTF-8?q?=EF=BC=89=E2=98=85=20=E6=8D=A2=E5=87=BA=E7=9C=9F=E8=BE=B9?= =?UTF-8?q?=E7=95=8C=20=E2=91=A7=EF=BC=88=E6=8E=A2=E9=92=88=E7=9C=8B?= =?UTF-8?q?=E4=B8=8D=E8=A7=81"=E6=8A=B9=E6=8E=89=E8=A1=8C=E5=86=85?= =?UTF-8?q?=E5=AE=B9"=EF=BC=89=EF=BC=8C=E4=B8=94=E6=88=91=E7=AC=AC?= =?UTF-8?q?=E4=B8=80=E7=89=88=20=E2=91=A7=20=E4=B8=BE=E7=9A=84=E4=BE=8B?= =?UTF-8?q?=E5=AD=90=E5=AE=9E=E6=B5=8B=E4=BC=9A=E8=A2=AB=E6=8A=93=E5=88=B0?= =?UTF-8?q?=20=E2=87=92=20=E5=B7=B2=E6=9B=B4=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ★ (A) pi 变异逐点复现: rc=0、打"裸赋值 0 处"、自检响 0 次 head -N 逐个: 100⇒1 130⇒1 **[131..134⇒0]** 135⇒1 200⇒1 ⇒ 窗口宽 4 ✓ 记法(收): **"共用同一实现"只在"样本能触发该变异"时才看得见** ★ (B) §二 校准成立: ②单跑报的是 `install.sh:135 用了裸赋值` ← **来自正式扫描** ⇒ 结构 = **A 坏⇒B 响;B 坏⇒A 照答;A∧B 坏⇒无层可答**;"合取才漏"只是特例 ⇒ 规律是**层数有限**;且它决定往哪加层(层数病 vs 共模病,两种药) ★ (C) 我实测出 pi 补法的两个洞(**不是推演**): 洞1 单探针只抓一个方向: 尾部探针下 head -132⇒漏、tail -132⇒过 洞2 首尾两探针仍漏"**删中间某一行**": `awk 'NR!=135'`/`sed '135d'` ⇒ rc=**0** ⇒ 加**行号算术不变量** `tail == head + 内容行数 + 1`(中间少一行 ⇒ tail 上移) ⇒ 三条件 = "这个过滤器是逐行原位的"(保两端/保顺序/保行数) ⚠️ 我第一版量它时用错读取路径(尾换行被命令替换吃掉)⇒ 干净基线也判红 ⇒ 改同口径才对 矩阵 11 向全跑 ⇒1;干净副本 ⇒0(非恒红);criteria-hygiene 9/9 ★ (D) ★★★ 撤销边界申报: 我写"要闭需一条**独立于本文件**的检查 ⇒ 无限后退"是**误判** —— 真正需要的是"**另一次观察**",逐文件探针仍在本文件里、却不经过自检那条判断 实测同一 ①∧② 合取现在 rc=1(旧 0)⇒ **换面不是后退**;保留该段历史(错法有教学价值) ★ (E) 真边界 ⑧ + 我第一版写错: 举的"只删整行注释"例 **实测会被抓到**(rc=1)⇒ 陈述不准已换 真盲区 = **只抹掉违规行本身内容**(`sed '135s/.*//'` ⇒ rc=0);判它需逐行内容对照, 而那要求先知道"正确内容是什么" ⇒ 对读入环是**循环的** ⇒ 真边界 判"能否闭"的准则: 缺的信息是"换一次观察就能拿到"(可闭) 还是"要拿到它就得先有它"(边界) ★ 提交前围栏 883(奇)被 pre-commit 拦下((F) 段缺闭合围栏)⇒ 补后 884(偶)放行 --- docs/API.md | 75 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) 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 副本上模拟) + ```