★ 修本文件自己的大假绿: ③b 的 AGENTMAIL_REQUIRE 检查**只在 source 期跑**,而三个调用者都是**先 source 后赋值** ⇒ 那张表从未被检查过
★ 缺陷(pi b6e24606 实测报回,dsh 独立复核成立):
install.sh source 131 / 赋值 135
redeploy-gateway.sh source 42 / 赋值 46
redeploy-plugin.sh source 52 / 赋值 56
⇒ source 那一刻表是**空的** ⇒ `if [ -n "${AGENTMAIL_REQUIRE:-}" ]` 直接跳过 ⇒ 整张表从未生效
★ dsh 独立 A/B(同一台同一 shell):
AGENTMAIL_REQUIRE=__no_such_cmd . env-defaults.sh ⇒ rc=2(检查本身是好的)
. env-defaults.sh; AGENTMAIL_REQUIRE=__no_such_cmd ⇒ rc=0(**漏过**)✓ 与 pi 一致
★ 这正是本文件头反复记的那件事落在**本文件自己**身上: **判据在,但走不到**
—— 与我 60d59f9 造出一个走不到的判据是同一形状,只是这次是"判据在库文件里、而调用相位错开"
★ 修法: 把检查提成 `agentmail_env_check_require()`,**两处都挂**:
· source 期一次 —— 接"表由**环境**提供"(父进程 export / CI 注入)
· `agentmail_env_report()` 内再一次 —— 接"表由**调用者**赋值"(本仓三个都是这种)
不选"改三个调用者的相位": 要改三处,且下一个新调用者还会犯同样的错。
★ ⚠️ 残留缺口(如实申报,不写成"已修好一切"): 若某调用者**既不 export 表、又忘了调
`agentmail_env_report`**,两次都不跑 ⇒ 仍会漏。闭合它要求本文件知道调用者的控制流,做不到。
★ 验证:
· A/B 三向: 赋值在 source 后+调 report ⇒ rc=2 ✓/赋值在 source 前 ⇒ rc=2 ✓/命令都在 ⇒ rc=0(非恒红)✓
· 变异: 删掉 report 体内那次复检 ⇒ rc=0 **退回漏过** ⇒ 证明那次调用**承重** ✓
· 真调用者端到端: 就地在 redeploy-gateway.sh 表里注入 `__no_such_cmd_zz`
⇒ 实跑 rc=2 且报出该名字 ✓;还原后 `缺少命令` 命中 0 ✓(已确认工作区干净)
· pi 的 env-guard 17/17 绿;四个脚本 bash -n 全过;生产未动
This commit is contained in:
@ -405,8 +405,27 @@ unset _am_avail_kb
|
||||
# 但**诊断是错的**,而照着它做的是"等另一个部署结束":**永远等不到**。
|
||||
# 即"**表与被表的东西不同步**":新能力自带的依赖没有登记回表。
|
||||
# 所以每次给部署路径加一个新命令,都要回来加一个词。
|
||||
if [ -n "${AGENTMAIL_REQUIRE:-}" ]; then
|
||||
_am_missing=""
|
||||
# ★★ 相位缺陷(pi 2026-09-25 实测报回,dsh 独立复核成立 —— 本文件自己的一个大假绿):
|
||||
# 上面这段**原先只在 source 期执行**,而三个调用者**都是先 source 后赋值**:
|
||||
# install.sh source 131 / 赋值 135
|
||||
# redeploy-gateway.sh source 42 / 赋值 46
|
||||
# redeploy-plugin.sh source 52 / 赋值 56
|
||||
# ⇒ source 那一刻 `AGENTMAIL_REQUIRE` 还是**空的** ⇒ **整张表从未被检查过**。
|
||||
# dsh 实测 A/B(本机,同一台同一 shell):
|
||||
# `AGENTMAIL_REQUIRE=__no_such_cmd . deploy/lib/env-defaults.sh` ⇒ rc=2(能抓到)
|
||||
# `. deploy/lib/env-defaults.sh; AGENTMAIL_REQUIRE=__no_such_cmd` ⇒ rc=0(**漏过**)
|
||||
# ⇒ 这正是本文件头反复记的那件事落在**本文件自己**身上:**判据在,但走不到**。
|
||||
# ⇒ 修法不是"让三个调用者改相位"(要改三处,且下一个新调用者还会犯),
|
||||
# 而是把检查**同时**挂到"表被赋值之后必然经过的那一步":`agentmail_env_report`
|
||||
# (三个调用者都在赋值后**立刻**调它)。两处都留,因为两条路都要接住:
|
||||
# · source 期那次 —— 接"表由**环境**提供"(父进程 export / CI 注入)
|
||||
# · report 期那次 —— 接"表由**调用者**赋值"(本仓三个调用者都是这一种)
|
||||
# ⚠️ 残留缺口(如实申报,不假装已闭合):若某个调用者**既不 export 表、又忘了调
|
||||
# `agentmail_env_report`**,则两次都不跑 ⇒ 仍会漏。闭合它需要"report 没被调也要红",
|
||||
# 而那要求本文件知道调用者的控制流 —— 做不到。⇒ 记为已知边界,不写成"已修好一切"。
|
||||
agentmail_env_check_require() {
|
||||
[ -n "${AGENTMAIL_REQUIRE:-}" ] || return 0
|
||||
local _am_missing="" _am_c
|
||||
for _am_c in $AGENTMAIL_REQUIRE; do
|
||||
command -v "$_am_c" >/dev/null 2>&1 || _am_missing="$_am_missing $_am_c"
|
||||
done
|
||||
@ -416,11 +435,14 @@ if [ -n "${AGENTMAIL_REQUIRE:-}" ]; then
|
||||
printf ' 前者会让下游把"工具缺失"读成"检查通过"。)\n' >&2
|
||||
exit 2
|
||||
fi
|
||||
unset _am_missing _am_c
|
||||
fi
|
||||
}
|
||||
agentmail_env_check_require
|
||||
|
||||
# 调用者打一行,让"兜了什么"**可见**(也是"忘了 source"的信号 —— 少了这行就不对)。
|
||||
agentmail_env_report() {
|
||||
# ★ 在这里**再跑一次** ③b(见上 ★★ 相位缺陷):调用者的 `AGENTMAIL_REQUIRE=` 是
|
||||
# source **之后**才赋的,source 期那次看不到它。三个调用者都在赋值后立刻调本函数。
|
||||
agentmail_env_check_require
|
||||
if [ -n "$AGENTMAIL_ENV_DEFAULTS" ]; then
|
||||
printf ' 环境兜底:%s\n' "$AGENTMAIL_ENV_DEFAULTS"
|
||||
else
|
||||
|
||||
Reference in New Issue
Block a user