diff --git a/deploy/check-require-declaration.sh b/deploy/check-require-declaration.sh index 1263dcc..307915a 100755 --- a/deploy/check-require-declaration.sh +++ b/deploy/check-require-declaration.sh @@ -80,7 +80,12 @@ LIB_REL='deploy/lib/env-defaults.sh' # ⇒ 修法: 去注释收敛到**这一个函数**,匹配收敛到 `_scan_stripped`, # 正向对照与正式扫描**都经由它们** ⇒ 任一层漂移都同时影响两者 ⇒ 自检必响。 strip_text() { sed 's/#.*$//' <<< "$1"; } -AM_SCAN_RE='^[[:space:]]*AGENTMAIL_REQUIRE=' +# ★★ 谓词里带一个**可选的 `export` 前缀**(2026-09-25 我发现的行首锚定 gap,见文末"申报的边界"⑨): +# `export AGENTMAIL_REQUIRE="…"` **是字面裸赋值**(⑥ 声明的射程之内), +# 但 `^[[:space:]]*AGENTMAIL_REQUIRE=` **不认前缀** ⇒ 它落在**谓词之外** ⇒ 假绿。 +# ⚠️ 这里**只**放宽"同一行内 token **前面**的词法"(安全); +# **没有**放宽到"能看见 `;` / `&&`" —— 那要求跨 token 的**语句结构**,实测会引入假红(见 ⑨)。 +AM_SCAN_RE='^[[:space:]]*(export[[:space:]]+)?AGENTMAIL_REQUIRE=' # 对**已 strip** 的文本做匹配(唯一的匹配实现) _scan_stripped() { grep -nE "$AM_SCAN_RE" <<< "$1"; } # 文本 ⇒ 违规行号(= 去注释 + 匹配),供**正向对照**用 @@ -574,4 +579,26 @@ exit 0 # 我原来说"⑧b 是语义边界",其实里面**掺着一处没必要的耦合**(调用者判定依赖 strip)。 # 判法: 申报边界前问一句 **"这个信息真的只能由被检对象给出吗,还是我顺手复用了它?"** # ⇒ ⑧a 是"换错观察对象"、⑧c 是"**多余的依赖**" —— 两次都把可闭的说成了边界。 +# ⑨ ★★★★ **违规扫描的"行首锚定"**(2026-09-25 我核 pi `02e3fd46` 时撞出;pi 没报、我也没记): +# 我原写 `AM_SCAN_RE='^[[:space:]]*AGENTMAIL_REQUIRE='` ⇒ 只认"行首形态"。 +# ★ 而**本判据 `:18` 自己举的缺陷形态就不是行首**: +# `. env-defaults.sh; AGENTMAIL_REQUIRE=__no_such_cmd ⇒ rc=0(**漏过**)` +# ⇒ 同一件事**分行**写 ⇒ 抓到;按 `:18` 那样**同行**写 ⇒ **假绿**。实测: +# `. …/env-defaults.sh; AGENTMAIL_REQUIRE=__no_such_cmd` ⇒ rc=0 ★假绿(分行则 rc=1 ✓) +# `export AGENTMAIL_REQUIRE="h"`(source 之后) ⇒ rc=0 ★假绿 +# `true; AGENTMAIL_REQUIRE="h"` / `true && AGENTMAIL_REQUIRE="h"` ⇒ rc=0 ★假绿 +# ★★ 两种失效**不同**,不要混成一条: +# ⑨a `export X=` ⇒ 行内**是**字面裸赋值,但谓词不认前缀 ⇒ 落在**谓词之外** +# ⇒ **已闭**(上面的 `(export[[:space:]]+)?`)—— 且实测**不引入假红** +# ⑨b `; X=` / `&& X=` ⇒ 该行**算调用者**(调用者数 4)却**不判违规** +# ⇒ 同一行两种规则不一致 ⇒ **申报为边界**(今天不判) +# ⚠️ ⑨b 为什么**不顺手放宽**: 我实测过一个"能看见分隔符"的候选 +# `(^|[;&|][[:space:]]*)[[:space:]]*(export[[:space:]]+)?AGENTMAIL_REQUIRE=` +# ⇒ 它把 **`echo "a; AGENTMAIL_REQUIRE=x"`**(**合法**行,token 在字符串字面量里)判成违规 +# = **假红** ⇒ 不可用。要让 ⑨b 可用,必须先有**引号感知** ⇒ 那就撞回 ⑧b 那条真边界。 +# ⇒ ★★★ 记法: **"放宽谓词"与"放宽到能看见分隔符"是两件事** —— +# 前者只动**同一行内 token 前面**的词法(安全、可闭); +# 后者要求**跨 token 的语句结构**(会撞上 `⑧b`,且先用假红付账)。 +# ⚠️ 射程: 真仓里**无**此类活缺陷(`grep -E '(^|[^[:space:]]);[[:space:]]*AGENTMAIL_REQUIRE=|export AGENTMAIL_REQUIRE=|&&[[:space:]]*AGENTMAIL_REQUIRE=' deploy/*.sh` = 0) +# ⇒ 这是**判据域**的 gap,不是生产缺陷。 # ══════════════════════════════════════════════════════════════════════════════