part 5 修复 1:单元内 health 恒 false——default_codex_bin() 回落 shutil.which

RETEST4 新发现 1:单元内无 CODEX_BIN、无 HERE/bin/codex 时
default_codex_bin() 返回裸 "codex",run_health_check 的
os.path.exists("codex") 以相对路径判恒为 False,health 的 ok
恒 False(execpath4、p2_7v4、P1 resident_health、P1B 两 call
全因此失败;定界探针证实单元内 which codex 就是
/usr/local/bin/codex,加 CODEX_BIN 前缀即 rc=0 且 ok=true)。

三选一取 (c) 回落 shutil.which("codex"):
- (a) CODEX_BIN 进 FORWARD_ENV_ALLOWLIST:要执行器与 chv-cell
  两边接线、还得在客机环境里定一个单元内路径,改动面大,且
  只修执行器驱动的调用,直接跑 host.py 的 health 修不到。
- (b) _guest_host_command 显式加 --codex-bin:把客机镜像路径
  硬编码进执行器,同样只修执行器驱动的调用。
- (c) 单点修 host.py:health、Server、automations 全部调用方
  直接受益;PATH 里找得到即返回绝对路径,找不到仍返回裸
  "codex"(行为与旧代码一致,零回归面);不硬编码任何路径。

新测试 tests/test_host.py::DefaultCodexBinTest(4 项):模拟
单元内环境(PATH 含 codex、cwd 不含 codex、无 CODEX_BIN)
断言返回绝对路径、CODEX_BIN 优先、处处无 codex 时仍返回裸
"codex"、以及该解析下的 run_health_check ok=true。
This commit is contained in:
host committed 2026-11-07 12:06:20 +00:00
1 parent c4661b64db
commit 39084ce2bf
2 files changed
+110

No files matched your search

+17
View File
@@ -50,6 +50,7 @@ import os
import queue
import re
import shlex
import shutil
import subprocess
import sys
import threading
@@ -201,6 +202,22 @@ def default_codex_bin():
paired = os.path.join(HERE, "bin", "codex")
if os.path.exists(paired):
return paired
# part 5(RETEST4 新发现 1):单元内既无 CODEX_BIN 又无
# HERE/bin/codex 时,旧代码返回裸 "codex",run_health_check
# 的 os.path.exists("codex") 以相对路径判恒为 False,
# health 的 ok 恒 False(单元内 which codex 明明是
# /usr/local/bin/codex)。回落到 shutil.which("codex"):
# PATH 里找得到即返回绝对路径,health 与 Server 都直接
# 受益;找不到时仍返回裸 "codex",行为与旧代码一致。
# 不选 (a) CODEX_BIN 进 FORWARD_ENV_ALLOWLIST:要执行器
# 与 chv-cell 两边接线、还得在客机环境里定一个单元内路径,
# 改动面大,且只修执行器驱动的调用;不选 (b) 执行器显式
# 加 --codex-bin:把客机镜像路径硬编码进执行器,且直接
# 跑 host.py 的 health 同样修不到。单点修 host.py 改动
# 最小、覆盖全部调用方。
found = shutil.which("codex")
if found:
return found
return "codex"