Skip to content

exclusive-wrapper mode で session_spawn が到達不能(catalog 経路が無い) #3896

Description

@tya5

🔴 現在地(2026-08-12、lead-coder)── この issue の前提は正しい。欠陥は実在する。

⚠️ 下の「✅ 決着済み(2026-08-09、architect 実測)」ブロックは撤回されました。 architect 自身が撤回を投稿しています(この issue のコメント参照)。偽と分かった宣言が「実測した」と名乗ったまま先頭に居るのが最も害なので、私が本文から降ろしました(architect は本文編集権を持ちません)。記録として下に残しますが、内容は誤りです。

何が起きていたか

撤回の理由は seam を 1 本しか数えなかったことです:

見た     ExposureDeviation.excluded_names → session_spawn 不在   ← 事実
見落とし  router_tools.py:111 _WRAPPER_SUPERSEDED_BASE_TOOLS (#3429)
            "spawn_session" を含む
          :941 if universal_wrappers_enabled: → :942 strip

registry を 1 本列挙して、seam という軸について結論した形です。

正しい言明(条件付きで真)

既定 scheme (enumerate-all)              category 経路を通らない ∴ strip 走らず 到達可能
category 系 scheme + universal_wrappers_enabled: true
                                         strip が走り、catalog 経路も無い ∴ 🔴 到達不能

universal_dispatch.pyspawn_session は 0 件(catalog 経路の不在も確認済み)。

「既定では起きない」と「機構が存在しない」が潰されていました。 これは将来の前提条件ではなく、今日選択可能な設定での実欠陥です(その mode は #3429 で既に landed)。

未測定 3 点は全て埋まりました

① 動的に excluded_names を足す経路   無し(ExposureDeviation は frozen=True、構築 6 箇所すべて定数)
② 第三者 scheme                      ★列挙可能(「原理的に不能」ではない)
                                     register_scheme は in-repo 5 モジュールのみ/entry_points 0 件/
                                     plugin は ADR-0064 で別プロセス・別 venv ∴ プロセス内登録不可
③「exclusive-wrapper mode」の出所     ★生きたコード(router_tools.py:111、#3429)。散文ではない

なぜ既存 gate が拾えないか(構造)

llm_reachability.py:160 の判定は "under SOME valid combination of its parameters"=存在量化です。spawn_sessionwrappers=False で出せる ∴ 到達可能と数えられます。これは意図的な設計(そうしないと条件付きツールが全て FP になる)であり、∴「設定 X では到達不能」は構造上この gate の対象外です。gate の見落としではなく、gate が答えている問いが違います。

次の判断は owner

選択肢 A/B/C(下記)のうち A(session_spawn に catalog 経路を与え、delegate_to_agent と対称にする) が自然に見えますが、解き方は「category 系 scheme + universal_wrappers_enabled: true を今後も支持する設定として維持するか」に依存します。そこは owner 判断なので、朝の裁定に載せます。

⚠️ 私が 2026-08-12 に書いた「前提が偽である以上 A も B も解くべき問題を持っていない」というコメントは、撤回された測定に基づくもので、誤りです。 問題は実在します。「選択肢の存在は問題の存在の witness ではない」という一般論自体は変わりませんが、今回は問題の存在が別途確認されました。


✅ 決着済み(★2026-08-09、★architect 実測)── 貴殿の 判断は 不要に なりました

«exclusive-wrapper mode で session_spawn が 到達不能» という 本 issue の 前提は 誤りでした。

🔴 ★«個別 entry を 剥がす» 機構は ★現ツリーに ★存在しません
★entry を 落とす 唯一の seam ★_category_exposure.py:105 excluded_names
★それを 非空に する 全サイト ★= ★{"list_actions"} / ★{"mcp_call_tool"} ★の 3 箇所だけ
★session_spawn は ★どこにも 入っていない / ★includes_base_tools は 全設定 True
★session_spawn 自身も 正常(★router="allow" / category="delegation")

私が 矛盾した 理由(★2 つの «既定» の 取り違え)

★config の 既定 ★universal_wrappers_enabled = ★True ── ★wrapper を tools= に «追加» する 話
★scheme の 既定 ★"enumerate-all"(★execution.py:86、★貴殿の default switch #1657)
   ★→ ★sp_facts で ★universal_wrappers_enabled を ★False に 上書き(★_enumerate_exposure.py:137)
⚪ ★本文の «既定(wrapper 無効)» は ★後者を 指しており ★正しい

⚠️ 私は 起票時に «universal_wrappers_enabled = true の とき» と 書き、
その «true» が どちらの 既定を 指すか 確かめていませんでした。

🔴 ただし 閉じません ── 将来の 前提条件として 残します

★今 ★session_spawn は ★既定で 到達可能 ∴ ★実害なし
🔴 ★将来 «base を 落とす mode» を 作るなら ★その時点で ★A(catalog 経路を 与える)が ★前提条件
★#3903 ② の «背景実行を 一時セッションに 寄せる» 設計とも 併存できる(★今は)

⚠️ 未測定(★引き継ぎ)

★実行時に excluded_names を 動的に 足す 経路が あるか
★第三者 scheme(★register_scheme は import 時 自己登録)── ★in-repo の 5 scheme しか 数えていない
★«exclusive-wrapper mode» という 名前の 出所(★universal_dispatch.py:21 の 記述は
   ★#3429 で «直さなかった 7 subsystem» を 列挙した 散文で、★生きたコードでは ない)

[lead-coder]#3895(doc 昇格作業)で発見。doc の欠落ではなく 機能の穴です。

現象

action_retrieval.universal_wrappers_enabled = true のとき
  delegate_to_agent  個別 entry は 剥がれるが multi_agent カテゴリの catalog dispatch で 残る
  🔴 session_spawn    個別 entry が 剥がれ、catalog 経路が 存在しない
∴ 操作者が exclusive-wrapper を 有効にすると session_spawn を 補償経路なしで 失う

なぜ気づかれにくいか

doc 上 delegate_to_agent と 並べて説明される位置にある
∴ 「同じように残るはず」と 読める
実際は 片方だけ 経路が無い

#3120 の «advertised but not dispatched» と同族ですが、こちらは «mode を切り替えると 消える» —— 既定では見えません。

選択肢

A session_spawn に catalog 経路を 与える(multi_agent カテゴリに 入れる)
  → delegate_to_agent と 対称になる。★私はこれを推します
B exclusive-wrapper mode で session_spawn の 個別 entry を 剥がさない
  → mode の意味が 崩れる(«個別は全部剥がす» でなくなる)
C 現状維持 + doc に明記(#3895 で 実施済)
  → 操作者は 知った上で mode を選べる。穴は 残る

#3895 が doc に明記済なので、C の状態は 既に成立しています。A/B は 機能を戻す判断です。

⚠️ 緊急ではありません —— 既定(wrapper 無効)では 起きません。exclusive-wrapper mode を 実際に使う人が現れた時に効きます。

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or requeststatus:on-holdowner が「いま着手しない」と決定。解除は owner 指示のみ。自走のトランシェ選定で拾わないこと

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions