★★★ 闭 ⑨a(违规扫描的"谓词之外"): AM_SCAN_RE 加可选 export 前缀;★★ 并把 ⑨a/⑨b **分开申报** —— ⑨b(;/&&)是**真边界**,因为"能看见分隔符"的候选会引入**假红**
★ 由来: 我核 pi `02e3fd46` 时撞出的 gap(pi 没报、我也没记)——
`AM_SCAN_RE` **行首锚定**,而判据 `:18` 自举的缺陷形态是**行内连接**
(`. env-defaults.sh; AGENTMAIL_REQUIRE=__no_such_cmd ⇒ 漏过`)⇒ 分行写抓到、同行写假绿。
★★ 两种失效**分开**(不混成一条):
⑨a `export AGENTMAIL_REQUIRE="h"` ⇒ 行内**是**字面裸赋值,谓词不认前缀 ⇒ **谓词之外** ⇒ **本次已闭**
⑨b `true; AGENTMAIL_REQUIRE="h"` / `true && …` ⇒ 该行**算调用者**(数=4)却**不判违规** ⇒ **申报为边界**
★ ⑨b 为什么不顺手放宽(**实测代价**): 候选 `(^|[;&|][[:space:]]*)[[:space:]]*(export…)?AGENTMAIL_REQUIRE=`
会把 **`echo "a; AGENTMAIL_REQUIRE=x"`**(**合法**行,token 在字符串字面量里)判成违规 = **★假红** ⇒ 不可用。
要让它可用必须先有**引号感知** ⇒ 撞回 ⑧b 那条真边界。
⇒ ★★★ 记法: **"放宽谓词"与"放宽到能看见分隔符"是两件事** —— 前者只动**同一行内 token 前面**的词法
(安全可闭);后者要求**跨 token 的语句结构**(先用假红付账)。
★ 验证(全部在**提交对象**快照上跑,不读工作区):
① 行为表 5/5 符合: ⑨a export⇒rc=1 ✓/字面正对照⇒rc=1 ✓/走动作⇒rc=0 ✓/⑨b⇒rc=0(边界)✓/
引号内 token(合法)⇒rc=0 ✓
② **假红扫描**: 遍历全部 `deploy/*.sh`,旧谓词命中 2、新谓词命中 2 ⇒ **无新增命中** ✓
③ 真树基线 rc=0、FAIL=0、"裸赋值 0 处" ✓;`bash -n` rc=0 ✓;criteria-hygiene **10/10** ✓
④ **承重性(变异测试)**: 撤回 `(export…)?` ⇒ ⑨a 重新 rc=0 假绿 ⇒ **修是承重的** ✓
⚠️ 射程: 真仓**无**此类活缺陷(grep = 0)⇒ 这是**判据域** gap,不是生产缺陷
This commit is contained in:
@ -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,不是生产缺陷。
|
||||
# ══════════════════════════════════════════════════════════════════════════════
|
||||
|
||||
Reference in New Issue
Block a user