症状 (実話ベース)
Windows + Git Bash、delivery.sh set monitor codex 済み・hooks 配置済みの環境で、idle 中の codex に monitor 配送が一切届かない (実質 idle-deaf) 事象に当たりました。ターン中は codex 自身の inbox チェックで受信できてしまうため疎通確認は通り、idle に落ちて初めて顕在化します。
- agmsg version: v1.1.6 で発見、v1.1.7 のコードでも同経路を確認
- host agent: Claude Code (leader) + codex (peer)
根本原因
monitor 配送のリアルタイム性は codex を codex-shim.sh (→ codex-monitor.sh → bridge) 経由で起動することが前提ですが、その入口が PATH 順序任せになっています:
spawn.sh の boot script は素の cli= ワード (codex) を印字し、spawn された shell の PATH で再解決させる (v1.1.7 の printf '%s%s' "$MSYS_GUARD" "$CLI_BIN" でも同様)
- 本環境では npm 版 codex が
~/.agents/bin シムより PATH で先に解決される (npm=25番目、agents/bin=33番目)
- → 素の codex が直接起動、bridge は一度も起動せず、idle-deaf に
さらに codex-shim-install.sh は ~/.agents/bin が「PATH にあるか」しか見ないため、順序が負けていても無警告で、mode/hooks 設定済み = シム適用済みと誤認しやすい状態でした。shell 関数方式も boot script が非対話なので spawn 経由では保証されません。
提案: cli_wrapper= マニフェストキー (data-driven)
codex の type.conf に:
cli_wrapper=codex-shim.sh
を追加し、spawn.sh がこれを type の driver ディレクトリ内の絶対パスに解決して boot script に印字する方式です (Direct-CLI 型のみ、spawn= node launcher は無視)。シム自身がプロジェクトの delivery mode を判定するので、turn/off のプロジェクトでは従来どおり素の codex になります。
セットで必要になるのが codex の spawn_unset_env= です (#294 の機構)。monitor 親から spawn された子が AGMSG_CODEX_BRIDGE=1 を継承すると、シムを絶対パスで呼んでも shim が即 real codex へ exec して idle-deaf が再発します。AGMSG_CODEX_SHIM_* / AGMSG_REAL_CODEX / CODEX_THREAD_ID / CODEX_SANDBOX も同様に strip が必要でした (CODEX_THREAD_ID は #350 で配送先の束縛は改善済みですが、継承遮断は防御の重畳として残す価値があると考えています)。
検討して棄却した代替案 (詳細は ADR ドラフトにまとめてあり、PR にする場合は同梱します):
- ユーザー PATH の並べ替え — 環境依存で移植不能、spawn 元セッションの再起動も必要
- boot script で
~/.agents/bin を PATH prepend — optional なグローバルシムの設置が前提
- spawn 時に解決した
command -v の絶対パスを埋め込む — spawner 側 PATH が素の codex を指していた場合にシムを恒久バイパスする逆効果
codex-monitor.sh を直接起動 — monitor が delivery mode を set してしまい turn/off 指定を壊す
実装の現物
fork で実装・テスト済みです (bats 85 ok、Codex による監査 APPROVE):
chemica-tan/agmsg branch integration/v1.1.6-chemica, commit 06dbad9 (v1.1.6 基準。main は spawn.sh が大きく動いているので、議論が前向きであれば main 基準に移植して PR を出します)。
付随して codex-shim-install.sh に PATH 順序の検証 (Windows では codex.exe/.cmd/.bat も対象、警告は stderr) を足しています。
driver 契約に新キーを足す変更なので、CONTRIBUTING に従い issue-first で相談します。方向性に問題がなければ ADR + PR を用意します。
症状 (実話ベース)
Windows + Git Bash、
delivery.sh set monitor codex済み・hooks 配置済みの環境で、idle 中の codex に monitor 配送が一切届かない (実質 idle-deaf) 事象に当たりました。ターン中は codex 自身の inbox チェックで受信できてしまうため疎通確認は通り、idle に落ちて初めて顕在化します。根本原因
monitor 配送のリアルタイム性は codex を
codex-shim.sh(→codex-monitor.sh→ bridge) 経由で起動することが前提ですが、その入口が PATH 順序任せになっています:spawn.shの boot script は素のcli=ワード (codex) を印字し、spawn された shell の PATH で再解決させる (v1.1.7 のprintf '%s%s' "$MSYS_GUARD" "$CLI_BIN"でも同様)~/.agents/binシムより PATH で先に解決される (npm=25番目、agents/bin=33番目)さらに
codex-shim-install.shは~/.agents/binが「PATH にあるか」しか見ないため、順序が負けていても無警告で、mode/hooks 設定済み = シム適用済みと誤認しやすい状態でした。shell 関数方式も boot script が非対話なので spawn 経由では保証されません。提案:
cli_wrapper=マニフェストキー (data-driven)codex の type.conf に:
を追加し、
spawn.shがこれを type の driver ディレクトリ内の絶対パスに解決して boot script に印字する方式です (Direct-CLI 型のみ、spawn=node launcher は無視)。シム自身がプロジェクトの delivery mode を判定するので、turn/off のプロジェクトでは従来どおり素の codex になります。セットで必要になるのが codex の
spawn_unset_env=です (#294 の機構)。monitor 親から spawn された子がAGMSG_CODEX_BRIDGE=1を継承すると、シムを絶対パスで呼んでも shim が即 real codex へ exec して idle-deaf が再発します。AGMSG_CODEX_SHIM_*/AGMSG_REAL_CODEX/CODEX_THREAD_ID/CODEX_SANDBOXも同様に strip が必要でした (CODEX_THREAD_ID は #350 で配送先の束縛は改善済みですが、継承遮断は防御の重畳として残す価値があると考えています)。検討して棄却した代替案 (詳細は ADR ドラフトにまとめてあり、PR にする場合は同梱します):
~/.agents/binを PATH prepend — optional なグローバルシムの設置が前提command -vの絶対パスを埋め込む — spawner 側 PATH が素の codex を指していた場合にシムを恒久バイパスする逆効果codex-monitor.shを直接起動 — monitor が delivery mode を set してしまい turn/off 指定を壊す実装の現物
fork で実装・テスト済みです (bats 85 ok、Codex による監査 APPROVE):
chemica-tan/agmsgbranchintegration/v1.1.6-chemica, commit06dbad9(v1.1.6 基準。main は spawn.sh が大きく動いているので、議論が前向きであれば main 基準に移植して PR を出します)。付随して
codex-shim-install.shに PATH 順序の検証 (Windows では codex.exe/.cmd/.bat も対象、警告は stderr) を足しています。driver 契約に新キーを足す変更なので、CONTRIBUTING に従い issue-first で相談します。方向性に問題がなければ ADR + PR を用意します。