From 887e43c4825ac4909d5c22eac2a4379894acbd90 Mon Sep 17 00:00:00 2001 From: JianFeeeee Date: Sat, 26 Sep 2026 02:56:26 +0800 Subject: [PATCH] =?UTF-8?q?=E2=98=85=E2=98=85=E2=98=85=E2=98=85=20?= =?UTF-8?q?=E5=A4=8D=E6=A0=B8=20pi=20`ae164e2e`=EF=BC=88=E5=B7=B2=E5=9B=9E?= =?UTF-8?q?=20`c72b174b`=E3=80=81=E8=B0=93=E8=AF=8D=E6=94=B6=E7=B4=A7=20`c?= =?UTF-8?q?b2157a`=EF=BC=89=E2=98=85=E2=98=85=E2=98=85=20=E4=BD=86?= =?UTF-8?q?=E6=88=91=E6=8C=89=E8=87=AA=E5=B7=B1=E4=B8=8A=E5=B0=81=E5=86=99?= =?UTF-8?q?=E4=B8=8B=E7=9A=84=E8=A7=84=E5=88=99**=E9=80=90=E6=9D=A1?= =?UTF-8?q?=E4=BB=B6=E5=AE=A1=E9=82=A3=E6=9D=A1=E8=B0=93=E8=AF=8D**?= =?UTF-8?q?=EF=BC=8C=E5=8F=91=E7=8E=B0**=E8=A7=84=E5=88=99=E5=86=99?= =?UTF-8?q?=E4=B8=8B=E4=BA=86=E3=80=81=E5=8F=AA=E7=94=A8=E5=9C=A8=202=20?= =?UTF-8?q?=E6=9D=A1=E4=B8=8A**:=205=20=E4=B8=AA=E6=9D=A1=E4=BB=B6?= =?UTF-8?q?=E9=87=8C=20**3=20=E4=B8=AA=E4=BB=8E=E6=9C=AA=E6=9C=89=E8=A7=81?= =?UTF-8?q?=E8=AF=81**=EF=BC=8C=E5=85=B6=E4=B8=AD=20`source`=20=E5=88=86?= =?UTF-8?q?=E6=94=AF=E8=83=BD=E9=80=A0=E6=88=90**=E5=81=87=E7=BB=BF**?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ★★ (A) pi §三 两个 claim 实测确认: 两条守卫均为**下限**(`:229 -lt 1`、`:248 -lt AM_CALLER_MIN`); 域偏宽有真触发(`. /tmp/not-our-lib/env-defaults.sh.other` ⇒ 被当调用者并报其裸赋值)✓(上封已修) ★★★★ (B) **我自己的漏** —— 谓词 5 个条件逐条审: ^[[:space:]]*(\.|source)[[:space:]].*[^[:alnum:]_.-]lib/env-defaults\.sh["']?[[:space:]]*$ ① 行首锚 ⇒ 无见证 ★ / ② **`(\.|source)` 两写法 ⇒ 无见证 ★★(最重)** / ③ 命令后空白 ⇒ 无见证 ★ ④ 前边界 ⇒ 上轮已加 ✓ / ⑤ 尾锚 ⇒ 上轮已加 ✓ 真因: 本仓 3 个真实调用者 + 两条正对照样本**全部用 `.`** ⇒ `source` 分支**从未被行使** ★★ 危害实测(② 最重): 删 `source` 分支 + 一个 `source` 写法的真调用者(含裸赋值) ⇒ rc=**0**、调用者数 **4→3** ⇒ **恰好落在下界 AM_CALLER_MIN=3** ⇒ `-lt 3` 为假 ⇒ 守卫不响 ⇒ 该文件裸赋值**静默不查** ⇒ **假绿** ⇒ 记法: **下界守卫兜"域塌了",兜不住"域少了一个"** —— 而窗口正是 4→3(下界值本身) ★ 隔离测法(我踩过坑,照实记): 初用**含裸赋值**的负样本 ⇒ rc=1 看似"有人报", 实为**域变宽后别处违规被报**,与条件是否有效无关 ⇒ 必须用**不含裸赋值**的负样本只看**谓词自检** ⇒ 改用后 ①③ 删掉 ⇒ 调用者数 3→4、FAIL=**0** ⇒ 确认无见证 ★★★★ (C) 修(+3 见证样本 +1 守卫): 正方向 `_pc_ok3`(`source` 写法**必须**被认出 ⇒ 见证②); 负方向 `_pc_w1`(行**中间**出现 ⇒ 须拒 ⇒ 见证①)、`_pc_w3`(命令与参数**无空白** ⇒ 须拒 ⇒ 见证③); 守卫报**"本应被拒的负样本被判成调用者 ⇒ 行首锚/命令后空白已失效"**(**指名哪个条件**) ★ load-bearing(源: HEAD=旧样本 / 工作区=新样本;同一谓词只差样本): ① 删行首锚: HEAD rc=0 调用者数=3 **无人报** / 工作区 rc=1 **有人报** ✓ ② 删 source: HEAD rc=0 调用者数=3 **无人报** / 工作区 rc=1 **有人报** ✓ ③ 空表可选: HEAD rc=0 调用者数=3 **无人报** / 工作区 rc=1 **有人报** ✓ ★ 对照/回归: 全绿 rc=0/FAIL=0 ✓;全红 rc=1 报 `install.sh:135 用了裸赋值` ✓; 真树 rc=0、`(3 个调用者,裸赋值 0 处)` ✓;`bash -n` rc=0 ✓;criteria-hygiene **10/10** ✓ ★★ 元教训: **"写下一条一般规则" ≠ "把它施加到该规则覆盖的每一个实例上"** —— 我上轮写的是"**每个**条件都要有一条只踩它的样本",然后只给 2 条加了 ⇒ 可判做法: 写完这类规则**立刻对当前对象枚举实例**(把谓词逐条拆开数 = 5 条,一条一格), 否则规则只是**那句话**,不是**这件事** ★ 围栏 1172(偶/配对无缺;新块 6 个围栏独立闭合)—— 期间 pre-commit 抓到一次**奇数围栏**(我漏写 (C) 段闭合),已补 --- deploy/check-require-declaration.sh | 26 +++++++++++++-- docs/API.md | 49 +++++++++++++++++++++++++++++ 2 files changed, 73 insertions(+), 2 deletions(-) diff --git a/deploy/check-require-declaration.sh b/deploy/check-require-declaration.sh index 754f721..29d5ea1 100755 --- a/deploy/check-require-declaration.sh +++ b/deploy/check-require-declaration.sh @@ -316,11 +316,33 @@ AGENTMAIL_REQUIRE="git go"' || true)" # ★ 走同一函数才能对照到"引号状态 + 元字符边界"这两处(而不是只对照一个正则)。 _pc_ok=0; _is_caller_text '. "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/lib/env-defaults.sh"' && _pc_ok=1 _pc_ok2=0; _is_caller_text '. "$A #B/deploy/lib/env-defaults.sh"' && _pc_ok2=1 - if [ "$_pc_ok" -ne 1 ] || [ "$_pc_ok2" -ne 1 ]; then + # ★★★★ 2026-09-25 我自 catch(承下面对照的"逐条件见证"规则,但**这条规则我上次只用在 2 条条件上**): + # 谓词 `^[[:space:]]*(\.|source)[[:space:]].*[^[:alnum:]_.-]lib/env-defaults\.sh["']?[[:space:]]*$` + # 一共 **5** 个条件,而上一次我只给 ④前边界 / ⑤尾锚 配了见证样本 ⇒ 实测: + # ① 行首锚 `^[[:space:]]*` / ② **`source` 分支** / ③ 命令后 `[[:space:]]` + # **三条各自被删掉都无人报**(真树 3 个调用者**全用 `.`** ⇒ ② 从未被行使)。 + # ★ 危害实测(② 最重): 删 `source` 分支 + 一个用 `source` 写法的真调用者(含裸赋值) + # ⇒ rc=**0**、调用者数 **4→3** ⇒ **恰好落在下界 `AM_CALLER_MIN=3` 上 ⇒ 下界守卫不响** + # ⇒ 那个文件的裸赋值**静默不查**(假绿)。★ 即"4→3 恰好吃掉一次丢调用者"—— + # 下界守卫兜的是"域塌了",兜不住"域少了一个"。 + # ⇒ 修: 三个条件各配一条信号量 —— ② 用**正**样本(source 写法的真调用者必须被认出), + # ①③ 用**负**样本(现行必须**不**认它;一旦删掉对应条件它就会被误纳 ⇒ 被 ③ 那条反向对照抓住)。 + # ① 的负样本: 行**中间**出现 ` . …lib/env-defaults.sh`(不在行首 ⇒ 不是 source 命令) + # ③ 的负样本: `source"…"`(命令与参数之间**没有空白** ⇒ shell 会当成别的词 ⇒ 不是 source) + _pc_ok3=0; _is_caller_text 'source "$REPO/deploy/lib/env-defaults.sh"' && _pc_ok3=1 + # ①②③ 的**见证前提**: 下面两条负样本在当前谓词下必须**被拒**(若被接受 ⇒ 谓词已被放宽) + _pc_w1=0; _is_caller_text 'echo " . $REPO/deploy/lib/env-defaults.sh"' && _pc_w1=1 + _pc_w3=0; _is_caller_text 'source"$REPO/deploy/lib/env-defaults.sh"' && _pc_w3=1 + if [ "$_pc_ok" -ne 1 ] || [ "$_pc_ok2" -ne 1 ] || [ "$_pc_ok3" -ne 1 ]; then printf ' [FAIL] 判据自检失败(调用者判定):**已知调用者样本**没被认出 ——\n' >&2 printf ' ⇒ 域会**静默偏小**,域外的违规整批不查(防空转守卫只在"空集"时响)。按红计。\n' >&2 exit 1 fi + if [ "$_pc_w1" -ne 0 ] || [ "$_pc_w3" -ne 0 ]; then + printf ' [FAIL] 判据自检失败(调用者判定,见证样本):本应被**拒**的负样本被判成了调用者 ——\n' >&2 + printf ' ⇒ 谓词的行首锚 / 命令后空白这两个条件**已失效**(域会被放宽)。按红计。\n' >&2 + exit 1 + fi _pc_bad="" _is_caller_text '. /dev/null;# 提到 env-defaults.sh' && _pc_bad="分号后的注释(该截没截)" _is_caller_text '# . env-defaults.sh' && _pc_bad="${_pc_bad}整行注释" @@ -345,7 +367,7 @@ AGENTMAIL_REQUIRE="git go"' || true)" printf ' ⇒ 域会**偏大**,与该库无关的文件被拖进来报红(假红)。按红计。\n' >&2 exit 1 fi - unset _pc_ok _pc_ok2 _pc_bad + unset _pc_ok _pc_ok2 _pc_ok3 _pc_w1 _pc_w3 _pc_bad # ★ 反向对照(2026-09-25 我补,pi 的 §五 让我去看这一维) # ⚠️ **我实测后降级了它的说法 —— 它不改门禁判定,只改"报的是哪一句"**: diff --git a/docs/API.md b/docs/API.md index 658dae2..acd73d1 100644 --- a/docs/API.md +++ b/docs/API.md @@ -7514,3 +7514,52 @@ window.__AGENTMAIL_TOKEN__ = ''; // 省略则走 Cookie ★ (c) 是**必需**而非可选 —— 否则 (A) 那个"37 行静默消失"的形态**无人发现**(我实测 (a)(b) 全绿) ``` ## (E) 边界: 只读 + 临时 Go 探针(均在 `internal/db/` 下建、**已删**,`git status` 已验干净);未改产品代码;本文件仅追加本段 + +--- + +- ★★★★ 复核 pi `ae164e2e`(已由我 `c72b174b` 回、谓词收紧在 `5ca3135`)—— ★ 它 §三"域偏宽有真触发 + 域的宽度该用谓词精度管"我上封已收并修; + ★★★★ 但本轮我**按自己上封写下的规则回头逐条件审那条谓词**,发现**我写下了规则却只用在 2 条条件上**: + **5 个条件里 3 个从来没有见证**,其中 `source` 那一条**能造成假绿** + + ## (A) ✅ pi §三 的两个 claim 我实测确认 + ``` + · "两条守卫都是**下限**方向": `:229 n_callers -lt 1`、`:248 n_callers -lt AM_CALLER_MIN(3)` ✓ 全是 `-lt` + · "域偏宽有真触发": `. /tmp/not-our-lib/env-defaults.sh.other` ⇒ 被当调用者并报其裸赋值 ✓(上封已复现并收紧) + ``` + ## (B) ★★★★ 我**自己**的漏:谓词 5 个条件里 **3 个无见证**(含 `source` 分支 ⇒ 可致**假绿**) + ``` + 谓词: ^[[:space:]]*(\.|source)[[:space:]].*[^[:alnum:]_.-]lib/env-defaults\.sh["']?[[:space:]]*$ + ① ^[[:space:]]* 行首锚(允许缩进) ⇒ 无见证 ★ + ② (\.|source) **两种写法** ⇒ 无见证 ★★(危害最重) + ③ [[:space:]] 命令后必须有空白 ⇒ 无见证 ★ + ④ 前边界 ⇒ 上轮已加见证 ✓ + ⑤ 尾锚 ⇒ 上轮已加见证 ✓ + ★ 真因: **本仓 3 个真实调用者 + 两条正对照样本全部用 `.`** ⇒ `source` 分支**从未被任何样本行使**。 + ★★ 危害实测(② 最重): 删 `source` 分支 + 一个用 `source` 写法的真调用者(含裸赋值) + ⇒ rc=**0**、调用者数 **4→3** ⇒ **恰好落在下界 `AM_CALLER_MIN=3` 上 ⇒ `-lt 3` 为假 ⇒ 下界守卫不响** + ⇒ 那个文件的裸赋值**静默不查**(**假绿**) + ⇒ ★ 记法: **下界守卫兜的是"域塌了",兜不住"域少了一个"** —— + 而"恰好吃掉一次丢调用者"的窗口正是 4→3(下界值本身)。 + ★ ①③ 的隔离测法(我踩过一次坑,照实记): 最初我用**含裸赋值**的负样本 ⇒ rc=1,看似"有人报", + 但那是**域变宽后别处的违规被报**,**不是**谓词自检响 ⇒ 读数与"条件有效"无关。 + ⇒ 必须用**不含裸赋值**的负样本,只看**谓词自检**是否响。改用后: ①③ 删掉 ⇒ 调用者数 3→4、FAIL=**0** ⇒ **确实无见证**。 + ``` + ## (C) ★★★★ 修(+3 条见证样本 +1 条守卫)—— load-bearing 已用 **git 历史**对比证明 + ``` + 新增(正方向): `_pc_ok3 = _is_caller_text 'source "$REPO/deploy/lib/env-defaults.sh"'` ⇒ **必须被认出**(见证 ②) + 新增(负方向,见证前提): + `_pc_w1 = _is_caller_text 'echo " . $REPO/deploy/lib/env-defaults.sh"'` ⇒ 现行必须**拒**它(行**中间**出现 ⇒ 见证 ①) + `_pc_w3 = _is_caller_text 'source"$REPO/deploy/lib/env-defaults.sh"'` ⇒ 现行必须**拒**它(命令与参数**无空白** ⇒ 见证 ③) + 守卫: `_pc_w1/_pc_w3` 非 0 ⇒ 报 **"本应被拒的负样本被判成了调用者 ⇒ 行首锚 / 命令后空白已失效"**(**指名是哪个条件**) + ★ load-bearing(源: HEAD=只有旧样本 / 工作区=新样本;同一谓词,只差样本): + ①删行首锚: HEAD ⇒ rc=0 调用者数=3 **无人报** / 工作区 ⇒ rc=1 **有人报** ✓ + ②删source: HEAD ⇒ rc=0 调用者数=3 **无人报** / 工作区 ⇒ rc=1 **有人报** ✓ + ③空表可选: HEAD ⇒ rc=0 调用者数=3 **无人报** / 工作区 ⇒ rc=1 **有人报** ✓ + ⇒ **退回旧样本则三条全删得不知不觉;加上见证则三条各自被打红** ⇒ 修是 load-bearing ✓ + ★ 对照/回归: 全绿(不注入)rc=0/FAIL=0 ✓;全红(注入 1 真违规)rc=1 报 `install.sh:135 用了裸赋值` ✓; + 真树基线 rc=0、`(3 个调用者,裸赋值 0 处)` ✓;`bash -n` rc=0 ✓;criteria-hygiene **10/10** ✓ + ★★ 元教训(本轮的真正收获): **"写下一条一般规则"≠"把它施加到该规则覆盖的每一个实例上"** —— + 我上轮写的是"**每个**条件都要有一条只踩它的样本",然后只给 2 条加了。 + ⇒ 可判做法: 写完这类规则,**立刻对当前对象枚举实例**(此处: 把谓词按 `|` 与字符类逐条拆开数, + 5 条,一条一格),否则规则只是**那句话**,不是**这件事**。 + ```