From 0e99d2dc228da0ef7ded8fe6eff574df2268397b Mon Sep 17 00:00:00 2001 From: JianFeeeee Date: Fri, 25 Sep 2026 08:14:43 +0800 Subject: [PATCH] =?UTF-8?q?=E2=98=85=E2=98=85=20=E9=87=87=E7=BA=B3=20pi=20?= =?UTF-8?q?=E7=9A=84**=E9=9D=9E=E5=BE=AA=E7=8E=AF**=E8=A1=A5=E6=B3=95:=20?= =?UTF-8?q?=E9=80=90=E8=A1=8C=E5=B1=80=E9=83=A8=E4=B8=8D=E5=8F=98=E9=87=8F?= =?UTF-8?q?=EF=BC=88stripped=20=E6=98=AF=20raw=20=E5=89=8D=E7=BC=80=20?= =?UTF-8?q?=E2=88=A7=20=E9=A6=96=E5=88=A0=E5=AD=97=E7=AC=A6=E9=A1=BB?= =?UTF-8?q?=E4=B8=BA=20#=EF=BC=89=E2=87=92=20=E6=88=91=E4=B8=8A=E8=BD=AE?= =?UTF-8?q?=E7=94=B3=E6=8A=A5=E4=B8=BA"=E7=9C=9F=E8=BE=B9=E7=95=8C"?= =?UTF-8?q?=E7=9A=84=20=E2=91=A7=20**=E5=BD=A2=E7=8A=B6=E9=82=A3=E5=8D=8A?= =?UTF-8?q?=E5=AE=9E=E9=99=85=E5=8F=AF=E9=97=AD**=EF=BC=9B=E2=98=85?= =?UTF-8?q?=E2=98=85=20=E5=B9=B6=E6=9B=B4=E6=AD=A3=E6=88=91=20=C2=A7?= =?UTF-8?q?=E5=85=AD=20=E9=82=A3=E6=9D=A1**=E8=AF=AF=E8=AF=BB**:=20?= =?UTF-8?q?=E6=88=91=E7=9A=84=E5=AF=B9=E7=85=A7=20`sed=20'135s/AGENTMAIL?= =?UTF-8?q?=5FREQUIRE/X'`=20**=E7=BC=BA=E5=B0=BE=E6=96=9C=E6=9D=A0**=20?= =?UTF-8?q?=E2=87=92=20rc=3D1=20=E6=9D=A5=E8=87=AA=20sed=20=E8=AF=AD?= =?UTF-8?q?=E6=B3=95=E9=94=99=E8=AF=AF=20+=20=E7=A9=BA=E9=9B=86=E5=AE=88?= =?UTF-8?q?=E5=8D=AB=EF=BC=8C**=E4=B8=8D=E6=98=AF=E6=A3=80=E5=87=BA**?= =?UTF-8?q?=EF=BC=88=E6=AD=A3=E7=A1=AE=E5=BD=A2=E5=BC=8F=20rc=3D0=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ★★ (A) 我 §六 的对照句是**误读**(pi 纠正,我复现确认): 我写: "对照 `sed '135s/AGENTMAIL_REQUIRE/X'` ⇒ rc=1(它同时动了别的可匹配串)" 实测: 该命令**缺结尾 `/`** ⇒ stderr 12 处 `unterminated 's' command` ⇒ 内容被读空 ⇒ 报的是 **"一个 source env-defaults.sh 的调用者都没找到"**(**空集守卫**)⇒ **不是检出** 正确形式 `sed '135s/AGENTMAIL_REQUIRE/X/'` ⇒ rc=**0** ⇒ 所以"改内容就一定被抓"**确实**不成立;我把**另一条守卫的命中**读成了"检出" ⇒ 记法(收 pi 的): **"rc≠0"不等于"判据认出了它"** —— 要问**报的是哪一句** ★ (B) ★★ 我判 ⑧ 为"真边界"的论证**不成立**(pi 给非循环补法,我实测采纳): 我原论证: "要判它需逐行内容对照 ⇒ 而要先知道正确内容 ⇒ 循环 ⇒ 真边界" ⇒ 错: 需要的是"**strip 的规格**"(只删注释后缀),**不是**"正确内容" —— 两者不同 补法: 每行 ① stripped 是 raw 的**前缀** ② 被删的第一个字符必须是 `#` ★ **不循环**: raw 由 `cat` 独立读、stripped 由被检对象读 ⇒ **两次独立读取**; "只删注释后缀"是**规格声明**,不是被检对象的产物 实测(注入 1 处违规): `sed '135s/.*//'` / `'135s/.*/ /'` / `'56s/.*/ /'` / `'s/AGENTMAIL_REQUIRE//'` **全 rc=1**;真 strip ⇒ rc=**0**(**非恒红** ✓) ⇒ **形状盲区已闭**;我上轮把它整条申报成"真边界"是**多申报** ★★ (C) 于是 ⑧ 拆两半(本轮真正的记法): ⑧a **形状**(某行字符被抹/被改)⇒ **可闭**(本次已闭) ⑧b **语义**(删对了 `#`、但那个 `#` 本不该当注释,如 `X="a#b"`)⇒ **真边界** 实测: 真 strip 把 `X="a#b"` 截成 `X="a` ⇒ **规格本身错**,而局部不变量**通过** ⇒ 准则: **申报"闭不了"之前先问缺的是"形状"还是"语义"** —— 形状 = "换一次读取就有"(可闭);语义 = "要先有正确内容"(真边界) ⇒ ★ 我上轮是**拿语义的循环性去论证形状那半也不可闭** ⇒ 与 ⑤ 同类的错(第二次) ★ 变异矩阵 12 向全 rc=1;基线 rc=0;criteria-hygiene **10/10** 绿 ★ 提交前围栏 894(偶)放行 --- deploy/check-require-declaration.sh | 78 +++++++++++++++++++++++------ docs/API.md | 22 ++++++-- 2 files changed, 82 insertions(+), 18 deletions(-) diff --git a/deploy/check-require-declaration.sh b/deploy/check-require-declaration.sh index f350fe1..e4aa8c3 100755 --- a/deploy/check-require-declaration.sh +++ b/deploy/check-require-declaration.sh @@ -268,6 +268,51 @@ AGENTMAIL_REQUIRE=\"__AM_P_TAIL__\"" exit 1 fi unset _probe_in _probe_out _probe_n _ph _pt _pexp + # ★★★ 逐行局部不变量(2026-09-25 **pi 提的非循环补法**,我实测后采纳): + # 上一节的首尾探针只锁"**行数 / 顺序 / 两端**"(**形状**),锁不住"**某一行内容被抹**"。 + # pi 的补法: 对**每一行**要求 + # ① stripped_i 是 raw_i 的**前缀**(只许删尾部) + # ② 被删的**第一个**字符必须是 `#`(只许删注释后缀) + # ⇒ 为什么**不循环**(这是关键,我上轮把它的可闭性判错了): + # raw 由 `cat` **独立**读,stripped 由 `strip_text`(**被检对象**)读 —— 两次**独立读取**; + # 而"只删注释后缀"是**规格声明**,**不是**被检对象的产物。 + # ⇒ 所以**不需要**"先知道正确内容"(我上轮的循环论证不成立)。 + # ⇒ 实测(注入 1 处违规的树上): + # `sed '135s/.*//'`(**我上轮申报的 ⑧ 盲区**)⇒ **抓到**(第135行首删字符='A' ≠ '#') + # `sed '56s/.*/ /'` ⇒ 抓到(不是前缀);`sed 's/AGENTMAIL_REQUIRE//'` ⇒ 抓到(不是前缀) + # 真 strip ⇒ **合规**(**非恒红** ✓) + # ⚠️ 射程(pi 也这么申报,我照抄): 它盖"**删的不是注释后缀**"这一类 + # (= **形状**盲区,**现已闭**);对"**删对了注释、但那个 `#` 本不该被当注释**" + # (如字符串字面量里的 `#`)**仍不管** —— 那才是真需要"正确内容"的**语义**盲区。 + # ★★ 我上轮把这两类**合并成一条**、整条申报成"真边界",是**错的**: + # 形状那半**可闭**(本节即闭),语义那半才是边界。⇒ 记法: + # **申报"闭不了"之前,先问缺的信息是"形状"(换次读取就有)还是"语义"(要先有正确内容)** —— + # 我上轮就是拿语义的循环性去论证形状那半也不可闭,于是**多申报了一个边界**。 + _loc_bad="$( + awk ' + NR==FNR { r[FNR]=$0; rn=FNR; next } + { s[FNR]=$0; sn=FNR } + END { + m = (sn rn) printf "stripped 比 raw 多 %d 行\n", sn-rn + }' <(printf '%s\n' "$(cat "$f")") <(printf '%s\n' "$_stripped") + )" + if [ -n "$_loc_bad" ]; then + printf ' [FAIL] %s 逐行局部不变量失败:读入环**改了行的内容**(不只是丢行/重排)。\n' "$f" >&2 + printf '%s\n' "$_loc_bad" | sed 's/^/ /' >&2 + printf ' ⇒ 首尾探针锁"行数/顺序/两端",锁不住"某一行被抹/被改"。按红计。\n' >&2 + exit 1 + fi + unset _loc_bad _had=0 grep -qE "$AM_SCAN_RE" <<< "$_stripped" && _had=1 _cnt=0 @@ -321,18 +366,23 @@ exit 0 # 我当时把"换面"误判成了"后退",于是把一个可闭的点申报成了边界。 # ⑥ 间接赋值不判(eval/read/env 注入),只判**字面裸赋值**。 # ⑦ 下界守卫只挡"收到 <3 个调用者";"恰好 3 个但换掉其中一个"不判(需会漂的名单)。 -# ⑧ ★ 逐文件探针的**射程**(实测申报,不是"没想到"): 它证明的是 -# "**读入这一环保行数、保顺序、保两端**",**不**证明"**每一行的内容被原样保留**"。 -# ⇒ 具体的盲区(我实测出来的、可复现的形状): 只**清空违规行本身的内容**、 -# 其余行原样 ⇒ 行数/顺序/两端全不变 ⇒ 探针通过 ⇒ **假绿**: -# `strip_text` 尾接 `sed '135s/.*//'`(或 `'135s/.*/ /'`)⇒ rc=**0** -# (而 `sed '135s/AGENTMAIL_REQUIRE/X'` 会**被抓到** —— 因为它同时改了别的可匹配串, -# 所以"改内容就一定被抓"是**错的**,只有"抹掉那一行"这个形状才进盲区。) -# ⇒ 要判它需要**逐行内容对照**(例如把每个非注释行哈希后比长度/前缀), -# 而那要求判据先知道"正确内容是什么" —— 对"读入环"来说这是循环的(它就是要读出内容的那一环)。 -# ⇒ 因此这**确实是**边界(与 ⑥⑦ 同级)。★ 注意与 ⑤ 的区别: -# ⑤ 是"**同一次观察**的无限后退"(我当时据此申报,那是**误判**,已闭); -# ⑧ 是"**观察对象之外**的东西"(探针能看行号与两端,看不到行内内容被抹)。 -# ⇒ 判"能不能闭"要先问: 缺的信息是"**换一次观察就能拿到**"(可闭)还是 -# "**要拿到它就得先有它**"(真边界)。 +# ⑧ ★★ **已闭一半 —— 我上轮整条申报成"真边界"是错的**(pi `02e3fd46` 纠正,我复现后采纳)。 +# 我原写: "只抹掉违规行内容(`sed '135s/.*//'`)⇒ 首尾探针看不见 ⇒ **真边界**"。 +# ★ 错在哪(我自己的论证有洞): 我说"要判它需逐行内容对照,而那要求判据先知道正确内容 ⇒ 循环"。 +# pi 指出**不需要"正确内容",只需要"strip 的规格"** —— 两者不同。补法(我已落盘,见上文): +# 对每行要求 ① stripped_i 是 raw_i 的**前缀** ② 被删的**第一个**字符必须是 `#` +# ★ 为什么**不循环**: raw 由 `cat` **独立**读、stripped 由 `strip_text`(被检对象)读 +# ⇒ **两次独立读取**;而"只删注释后缀"是**规格声明**,不是被检对象的产物。 +# ⇒ 实测: `sed '135s/.*//'`、`'135s/.*/ /'`、`'56s/.*/ /'`、`'s/AGENTMAIL_REQUIRE//'` +# **全部 rc=1**;真 strip ⇒ rc=**0**(非恒红)✓ ⇒ **形状盲区已闭**。 +# ★★ 于是原 ⑧ 要**拆成两半**(这是本轮真正的记法): +# ⑧a **形状**盲区("某行的字符被抹/被改")⇒ **可闭**(已闭,见上文逐行局部不变量) +# ⑧b **语义**盲区("删对了 `#`,但那个 `#` 本不该当注释" —— 如 `X="a#b"` 里引号内的 `#`) +# ⇒ **真边界**。实测: `X="a#b"` ⇒ 真 strip 截成 `X="a`(**规格本身错**), +# 而局部不变量**通过**(删的确实是 `#`)⇒ 它看不见。要判它需要**正确内容/真正的解析器**。 +# ⇒ 记法: **申报"闭不了"之前,先问缺的信息是"形状"还是"语义"** —— +# 形状: "换一次读取就有"(可闭);语义: "要先有正确内容"(真边界)。 +# ★ 我上轮就是**拿语义的循环性去论证形状那半也不可闭**,于是**多申报了一个边界**。 +# ⚠️ 与 ⑤ 的关系: ⑤ 也是"我把可闭的误判成边界"(拿"同一次观察的后退"当理由)—— +# ⑧a 与 ⑤ 是**同一类错误**(论证里的"循环/后退"其实不成立),⑧b 才与 ⑥⑦ 同级。 # ══════════════════════════════════════════════════════════════════════════════ diff --git a/docs/API.md b/docs/API.md index 03b95c2..28a3cd4 100644 --- a/docs/API.md +++ b/docs/API.md @@ -5478,10 +5478,24 @@ window.__AGENTMAIL_TOKEN__ = ''; // 省略则走 Cookie ⇒ **实测该例会被抓到**(rc=1)⇒ 陈述**不准确** ⇒ 已换掉(a47c83b) ★ 真盲区(可复现): 只**抹掉违规行本身**的内容、其余行原样 ⇒ 行数/顺序/两端全不变 ⇒ 探针通过 ⇒ **假绿**: `sed '135s/.*//'`(或 `'135s/.*/ /'`)⇒ rc=**0** - 对照: `sed '135s/AGENTMAIL_REQUIRE/X'` ⇒ rc=**1**(它同时动了别的可匹配串) - ⇒ "**改内容就一定被抓**"是**错的**;只有"**抹掉那一行**"这个形状才进盲区 - ★ 要判它需**逐行内容对照**,而那要求判据先知道"正确内容是什么" —— - 对"读入环"而言这是**循环的**(它就是要读出内容的那一环)⇒ **确实是**边界 + 对照: ~~`sed '135s/AGENTMAIL_REQUIRE/X'` ⇒ rc=**1**(它同时动了别的可匹配串)~~ + ★★ **这条对照是错的**(pi `02e3fd46` 纠正,我复现确认): 它**缺尾斜杠** ⇒ + `sed` 报 `unterminated 's' command` ⇒ 把内容读空 ⇒ 命中的是**空集守卫** + ("一个 source env-defaults.sh 的调用者都没找到")⇒ **不是检出**。 + 正确形式 `sed '135s/AGENTMAIL_REQUIRE/X/'` ⇒ rc=**0** + ⇒ 所以"**改内容就一定被抓**"**确实**不成立(pi 对;我原来的 rc=1 是**误读**) + ⇒ ★ 记法(收 pi 的): **"rc≠0"不等于"判据认出了它"** —— 要问**报的是哪一句**; + 本处一个**语法错误**恰好也给了 rc=1,而它来自**另一条守卫**(空集)。 + ★ ★★★ 而且"它需逐行内容对照 ⇒ 循环 ⇒ 真边界"这个论证**不成立**(pi 给了非循环补法,我实测采纳): + **逐行局部不变量**: 每行要求 ① stripped 是 raw 的**前缀** ② 被删的第一个字符必须是 `#` + ★ **不循环的理由**: raw 由 `cat` **独立**读、stripped 由被检对象读 ⇒ **两次独立读取**; + 而"只删注释后缀"是**规格声明**,不是被检对象的产物 ⇒ **不需要**先知道正确内容 + ⇒ 实测: `sed '135s/.*//'` / `'56s/.*/ /'` / `'s/AGENTMAIL_REQUIRE//'` **全 rc=1**;真 strip rc=**0** + ⇒ **形状盲区已闭**(我原来整条申报成"真边界"是**错的**) + ★★ 于是原 ⑧ 要**拆两半**(本轮真正的记法): + ⑧a **形状**(某行字符被抹/被改)⇒ **可闭**(已闭) + ⑧b **语义**(删对了 `#`、但那个 `#` 本不该当注释,如 `X="a#b"`)⇒ **真边界** + (实测: 真 strip 把 `X="a#b"` 截成 `X="a` ⇒ **规格本身错**,而局部不变量**通过**) ★★ 判"能不能闭"的准则(我现在用的): 缺的信息是 "**换一次观察就能拿到**"(可闭,如 ⑤)还是"**要拿到它就得先有它**"(真边界,如 ⑧) ```