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 条,一条一格),否则规则只是**那句话**,不是**这件事**。 + ```