记录 pi b6e24606 报回的活缺陷(已修 e65f41b): ③b 的 AGENTMAIL_REQUIRE 检查从未跑过 —— 三调用者都先 source 后赋值

★ 缺陷 + 我的独立 A/B(与 pi 逐值一致):
     赋值在 source 前 ⇒ rc=2(检查本身好);赋值在 source 后 ⇒ rc=0(**漏过**)
     install.sh source 131/赋值 135;redeploy-gateway 42/46;redeploy-plugin 52/56
★ 性质: 本文件头记的四种历史事故,而 ③b 专写"新增命令要回来登记"并附 flock 事故 ——
     那条检查**从来没跑过** ⇒ 事故症状被归因成"忘了登记",修的是另一半 ⇒ 这一半至今未修
     ★ 与我 60d59f9 同一形状(判据在但走不到),我那次错在**没有入口**,这次错在**相位错开**
★ 修法: 提成 agentmail_env_check_require(),source 期 + report 内**两处都挂**;
     不选"改三个调用者相位"(要改三处,且下一个新调用者还会犯)
★ ⚠️ 残留缺口如实申报: 若调用者既不 export 表、又忘了调 report ⇒ 仍会漏;闭合它要求知道调用者控制流
★ 验证: A/B 三向(2/2/0,非恒红) + 变异(删 report 内复检 ⇒ 退回 rc=0 ⇒ 那次调用承重)
     + 真调用者端到端(就地注入 __no_such_cmd_zz ⇒ 实跑 rc=2 报出名字;还原本干净)
     + env-guard 17/17 绿 + 四脚本 bash -n 过 + local 不泄漏
This commit is contained in:
2026-09-25 06:42:57 +08:00
parent 5b06f7cbec
commit fe03898220

View File

@ -4867,3 +4867,57 @@ window.__AGENTMAIL_TOKEN__ = '<user_key>'; // 省略则走 Cookie
⇒ 与 ⑬′("清单必须写负向项")合起来给出第二层: **清单写了 ≠ 那些项被守住了**
```
## (D) 边界: 只读(git show / grep / read);仓库与生产未动
---
- ★★★ **pi `b6e24606` 报回的一处活缺陷 —— 在我的 scope 里,而且是本文件自己的大假绿**(已修 `fa27e15`)
"调用者表"那句检查**只在 source 期跑**,而**三个调用者都是先 source 后赋值**
## (A) 缺陷与我的独立复核
```
deploy/lib/env-defaults.sh ③b: if [ -n "${AGENTMAIL_REQUIRE:-}" ]; then …
三个调用者的相位(实测行号):
install.sh source 131 / 赋值 135 / report 136
redeploy-gateway.sh source 42 / 赋值 46 / report 47
redeploy-plugin.sh source 52 / 赋值 56 / report 57
⇒ source 那一刻表**是空的** ⇒ `[ -n … ]` 为假 ⇒ **整张表从未被检查过**
★ 我的独立 A/B(同一台同一 shell,两种相位):
赋值**在 source 之前**: AGENTMAIL_REQUIRE=__no_such_cmd . env-defaults.sh ⇒ rc=**2**(检查本身是好的)
赋值**在 source 之后**: . env-defaults.sh; AGENTMAIL_REQUIRE=__no_such_cmd ⇒ rc=**0**(**漏过**)
⇒ 与 pi 报的逐值一致 ✓ 它这次是对的,而且这是我改过的文件(我上一轮动过它却没看见这个)
```
## (B) ★ 性质: 这正是本文件头反复记的那件事 —— 落在**本文件自己**身上
```
本文件头写着四种"环境问题被报成代码问题"的历史,而 ③b 一节**专门**写着
"新增任何外部命令时,回到调用者的 AGENTMAIL_REQUIRE 登记",还附了 flock 那次事故。
⇒ 而那条检查**从来没跑过** ⇒ 事故的**症状**("登记了也不看")被归因成"忘了登记",
修的是**另一半** —— 这一半至今未修(pi 的历史实证,我核实了 4c2bf26 只动了"补登记")
⇒ ★ 与我 `3f312de` 那个错是**同一形状**("判据在,但走不到"),
只是我那次错在**没有入口**,这次错在**相位错开** —— 判据在库里,调用者在它之后才给参数
```
## (C) 修法与**为什么没选另一种**
```
提成 `agentmail_env_check_require()`,**两处都挂**:
· source 期一次 —— 接"表由**环境**提供"(父进程 export / CI 注入)
· report 内再一次 —— 接"表由**调用者**赋值"(本仓三个调用者都是这一种)
★ 没选"改三个调用者的相位": 那要改三处,且**下一个新调用者还会犯同样的错** ——
把判据挂在"调用者必然经过的那一步"上,才对下一个调用者免疫。
```
## (D) ⚠️ 残留缺口(如实申报,不写成"已修好一切")
```
若某调用者**既不 export 表、又忘了调 `agentmail_env_report`** ⇒ 两次都不跑 ⇒ 仍会漏。
闭合它要求本文件知道**调用者的控制流**("report 没被调也要红")—— 本文件做不到。
⇒ 记为本文件的已知边界。
```
## (E) 验证(四向 + 变异 + 真调用者)
```
① 赋值在 source 后 + 调 report(真实形态) ⇒ rc=2 ✓ 修好了
② 赋值在 source 前(父进程 export 形态) ⇒ rc=2 ✓ 两条路都接住
③ 命令都在 ⇒ rc=0 ✓ **非恒红**
④ ★ 变异: 删掉 report 体内那次复检 ⇒ rc=**0**(**退回漏过**)⇒ 证明那次调用**承重** ✓
⑤ ★ 真调用者端到端: 就地在 `redeploy-gateway.sh` 表里注入 `__no_such_cmd_zz`
⇒ 实跑 rc=2 且**报出该名字** ✓;**还原后** `缺少命令` 命中 0、`git status` 只剩我一个文件 ✓
⑥ pi 的 env-guard **17/17** 绿;四个脚本 `bash -n` 全过
★ 变量不泄漏: `_am_missing`/`_am_c` 用 `local` ⇒ 实测 source 后两者均 `<未泄漏>` ✓
```
## (F) 边界: 改动只在本文件;**未改**三个调用者(那是"相位"之外的另一个选择,见 C);生产未动