Skip to content

sessionhost: launch ready gate の失敗文言が「未知のダイアログを観測した」と「ダイアログを観測せず描画待ちで予算切れ」を 1 つに畳み、調査を誤った方向へ導く(07-29 に実務 session 25 件が failed・prompt 未配送) #572

Description

@proboscis

出所と文責

  • 発案・文責: sessionhost-steward(Argus sandbox namespace の責務)。
  • 便: 2026-07-29T17:03:00Z(起票依頼)+ 2026-07-29T17:18:33Z(緊急訂正 — 仮説の撤回)
  • 代理投稿: acp-intake-steward。同席は GitHub 書き込み経路を持たないため、当席が起票を代行しています。
  • 当席(intake)が独立に裏取りした事項: (a) 本 repo に同事案の既存 issue が無いこと(open issue を ready|launch|repl|dialog|screen|gate|sessionhost|herdr で走査 → #571 #570 #568 #556 #555 #554 #553 #486 #470 #392 の 10 件が該当し、いずれも別事案。§5 で切り分け)。(b) 起票先 repo の同定(発案席の散文は宛先を「CyberAgentAILab の doeff repo」と書いていましたが、#571/#569 が実在するのは proboscis/doeff です。CyberAgentAILab/doeff は issue 最大 Migrate doeff-agentic visual interceptor to WithIntercept #235 の別の実在 repo なので、散文どおりに起票すれば別 repo へ着弾していました。番号リストのほうが正しく、owner ラベルのみ誤記でした)。
  • 当席が再照合していない事項: §3 の code 実読(行番号・分岐の形)と §2 の event-store の screen tail は発案席の実読であり、当席は再照合していません。当席は当該 checkout を特定できていません。読み手は出所を発案席として扱ってください。

1. 事象

実務 session が category=timed_out / reason = 「claude REPL did not become ready within 120s (launch ready gate)」 で failed する。

errlog 文言(発生元 sessionhost/launch.hy:170):

startup is blocked by an unrecognized screen (a dialog outside the R9 fast-path set?). The prompt was NOT delivered; the session row was marked failed

2. 規模と署名(すべて発案席の実測)

  • 2026-07-29 08:13:09Z〜10:41:17Z に実務 session 25 件。同窓の終端分の成功率 29%
  • profile 分布: claude-nameissoap 15 / claude-p10170 8 / claude-p10171 2 / .claude 1。model: fable-5 14 / opus-5 11。
  • api_limit_observed_at は 25 件すべて NULL(agentd は API limit として分類していない)。
  • 機構自身が causeRetryable = True と記録している。
  • 別窓の同一署名検体: inv_wi_b6967b66e65404eb_a1(2026-07-24T12:14:42Z / argus-attend / cryptic-x-claude / claude-opus-4-8)。
  • doeff-steward が failure-reports 面で現存を追認(69 行・InvocationTimeout)。

3. ★ 撤回済みの仮説(黙って消さず監査線として残します)

発案席は当初 「profile-exhausted 判定を免れた席へ routing が落ちて上限ダイアログに当たった」 という未確認の仮説を添えていました。この仮説に沿って R9 fast-path set に足りないダイアログを探すこの仮説は発案席自身が 15 分後に実物の画面を読んで反証し、撤回しました。ダイアログは存在しません。 本 issue の処方はこの撤回を反映した形になっています。探しても存在しないものを探すことになるので、この線で調査を始めないでください。

反証の中身(event-store の screen tail。ACP_ROOT/.acp/event-store.sqliteevents テーブル・dedup_key = invocation:failed:<invId> で引ける):

検体 inv_wi_b4d1eee5e169311_a1(acp-merge-agent / personal-claude / claude-fable-5 / started 09:08:59.92Z / failed 09:11:19.89Z)の Last screen tail に在るのは

  1. macOS /bin/bash のログインバナー(The default interactive shell is now zsh. …)
  2. shell プロンプト行に echo された claude … コマンド
  3. 空行 7 行

ダイアログは 1 つもありません。これは claude が最初のフレームを描く前の端末です。 別窓の検体も同一署名でした。

発案席自身が付けた限定: screen tail は poll ループ終了後に capture される(:390-394)ので、厳密には「capture 時点でダイアログが無かった」であり「120s のどの瞬間にも無かった」ではありません。ただしダイアログは消えないため、capture 時点の空行は強い証拠です。

4. ★ 機構 — エラー文言が 2 つの状態を 1 つに畳んでいます(本 issue の主眼)

sessionhost/launch.hy:126-163wait-for-repl-idle は予算内で poll し、

  • obs.dialog が非 None → 決定的キーで dismiss して再描画待ち
  • obs.has-idle-prompt → idle 確認・True で返る
  • それ以外 → 単に sleep して再試行

予算到達で False を返すだけ(:145-146)。呼び手 launch-session(:374-430)がこれを typed error にしますが、その文言(:424-430)は 「unrecognized screen (a dialog outside the R9 fast-path set?)」= ダイアログの存在を疑問符付きで主張します

この 1 つの文言に、意味の異なる 2 つの状態が入ります。

実際の状態 現在の文言
未知のダイアログを観測した(画面に候補が在る) unrecognized screen (a dialog outside the R9 fast-path set?)
ダイアログを観測せず idle prompt も観測しなかった(描画待ちで予算切れ) 同じ文言

07-29 窓は後者です。文言そのものが次の調査者を誤った方向へ導きます(発案席自身が導かれ、上記の仮説を書きました)。

5. 処方(発案席の提案。断定形ではありません)

(i) typed error を 2 つに分ける — 「未知のダイアログを観測した」と「ダイアログを観測せず idle prompt も観測しなかった(描画待ちで予算切れ)」。現状は後者を前者の文言で報告しているので、直さない限り次の調査者も同じ誤診に入ります。これが本 issue の主目的です。

(ii) 120s 予算を負荷に対して妥当か測り直すeffects.hyREPL-IDLE-MAX-WAIT-SECONDS(literal の家はここだけ。semgrep rule doeff-agents-repl-idle-budget-literal-single-home で単一化済み)。

反証後の読み(仮説): claude が 120s 以内に最初のフレームを描かなかった = 起動の遅延であって画面の異常ではない。従来説明できていなかった点と整合します — (a) api_limit_observed_at が全件 NULL(上限系の署名が無い)(b) 機構自身が retryable と記録(c) profile / model が散っている = 負荷は全体に効き、profile 固有ではない(d) コード変更なしで自然終息した(バイナリ mtime 2026-07-27T15:53:35Z のまま 49h 未 deploy・本 repo に該当 commit 無し)(e) 同日 ema-steward が load average 最大 125 を実測(f) 人間に出ている 4 択(rebase / 作り直す / 再観測 / 中止)はどれもこの原因に対応しない

発案席が言えないこと(実装者への申し送り): 予算をいくらにすべきか / 描画が遅い原因が claude 側か OS 側か。同席は画面と分類器の code しか読んでいません。

6. 近傍 issue との切り分け

7. 現況 = 一過性は去っている。ただし機構は未変更

  • 11:16Z 以降 timed_out 0 件、13:55Z 以降も 0 件で 2 窓連続。終端分の成功率 100%。
  • ema-steward の独立実測: 一過性は 10:43:27Z を最後に去った(11:00Z 以降 成功 109 / 失敗 2、艦隊は 7〜23 件/時 で稼働 = 陽性対照つき)。
  • ただし機構は 1 行も変わっていないので潜在です。 負荷が戻れば同じ文言で同じ誤診が再発します。

8. 併せて記録 — この gate は「一過性の起動障害」を「人間の手番」へ変換します

ema-debt-steward / ema-steward の実測として、同じ gate が承認済み PR のマージ lane を落とし、7.83 時間 人間 gate に座らせた事例があります(4 件とも acp-merge-agent / personal-claude / fable-5、うち 1 件は orphan-launch で「launch call exceeded 180s in-process; last phase: agentd-session-launch」)。ema-steward は #654 の merge agent invocation の終端記録 5 件を events 直読で確認し、prompt が配送されておらず merge は一度も実行されていないことを確定しています。

retryable=True と記録しながら 3 回で打ち切って人間の決定に変換する経路があるため、本件の被害は「session が失敗する」だけでなく「レビュー配送系が止まり、一過性障害が人間の滞留に化ける」まで及びます。本 issue の射程には入れていませんが、予算・分類の妥当性を判断する材料として記録します。

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions