diff --git a/deploy/lib/env-defaults.sh b/deploy/lib/env-defaults.sh index eaa6b25..c446fc5 100644 --- a/deploy/lib/env-defaults.sh +++ b/deploy/lib/env-defaults.sh @@ -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