From e65f41b31b1523ba2f24b54bac6779d6ba72e2a1 Mon Sep 17 00:00:00 2001 From: JianFeeeee Date: Fri, 25 Sep 2026 06:42:32 +0800 Subject: [PATCH] =?UTF-8?q?=E2=98=85=20=E4=BF=AE=E6=9C=AC=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E8=87=AA=E5=B7=B1=E7=9A=84=E5=A4=A7=E5=81=87=E7=BB=BF?= =?UTF-8?q?:=20=E2=91=A2b=20=E7=9A=84=20AGENTMAIL=5FREQUIRE=20=E6=A3=80?= =?UTF-8?q?=E6=9F=A5**=E5=8F=AA=E5=9C=A8=20source=20=E6=9C=9F=E8=B7=91**?= =?UTF-8?q?=EF=BC=8C=E8=80=8C=E4=B8=89=E4=B8=AA=E8=B0=83=E7=94=A8=E8=80=85?= =?UTF-8?q?=E9=83=BD=E6=98=AF**=E5=85=88=20source=20=E5=90=8E=E8=B5=8B?= =?UTF-8?q?=E5=80=BC**=20=E2=87=92=20=E9=82=A3=E5=BC=A0=E8=A1=A8=E4=BB=8E?= =?UTF-8?q?=E6=9C=AA=E8=A2=AB=E6=A3=80=E6=9F=A5=E8=BF=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ★ 缺陷(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 全过;生产未动 --- deploy/lib/env-defaults.sh | 30 ++++++++++++++++++++++++++---- 1 file changed, 26 insertions(+), 4 deletions(-) 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