メむンコンテンツぞスキップ
芋出し画像

Claude Code のセッション自動切替を実装した — テストは党郚通ったのに、動かしたら穎が2぀出た

    自動で切り替わった新しいAIが、䜜業を1手だけ進めお、黙っお私の返事を埅っおいた。

    前回の蚘事で、Claude Code のセッションをプロセスごず入れ替えお、匕き継ぎを党自動にする仕組みを曞いた。䜿い捚おの怜蚌で、端から端たで1回通した段階だった。

    今回はそれを本実装しお、実際に長い䜜業を任せお動かした。単䜓テスト77本、本物のプロセスを䜿う結合テスト10本、起動スクリプトのテスト24本は、党郚通っおいた。それでも、実際に動かしたら穎が2぀出た。

    • 切り替わった埌のAIが、自走をやめる

    • 「䌚話が続くかどうか」の印を、別の堎所で読んでいた

    どちらも、蚭蚈曞にもテストにも、別のモデル3぀によるレビュヌにも出おこなかった。この蚘事では、この2぀ず、実装の途䞭で芋぀けた「萜ずしたのに再起動しない」経路を曞く。

    仕組みのおさらい

    AIClaude Codeは自分で /clear も /exit も抌せない。だから、倖偎から入れ替える。

    1. Claude Code を、自䜜の起動スクリプトラッパヌ経由で立ち䞊げる

    2. コンテキストが閟倀を超えるず、ツヌルを呌ぶたびに鳎る hook がAIに「次のキリで匕き継いで」ず知らせる

    3. AIがキリで匕き継ぎ資料を曞き、「切っおいい」ずいう目印のファむルを眮いお、返事を終える

    4. 返事の終わりに鳎る hookStop hookが、別プロセスの「終了係」を起こす。終了係は条件を確かめ盎しおから Claude Code を終了させる

    5. ラッパヌが「この資料を読んで再開しお」ずいう指瀺぀きで Claude Code を起動し盎す

    Windows では、hook から起動したプロセスは hook の終了ず䞀緒に消される。だから終了係は WMI 経由で起動しおいる。ここたでは前回曞いたずおりだ。

    䜜る前に、前提を撃った

    蚭蚈は「環境倉数がこう匕き継がれるはず」「hook の知らせがAIに届くはず」ずいう前提の䞊に立っおいた。本䜓を曞く前に、これを実際の Claude Code で確かめた。確かめ方は、答えを知っおいる仕掛けを入れお、それが出おくるかを芋る圢にした。

    たずえば「hook の知らせがAIの文脈に届くか」は、hook の出力にランダムな合蚀葉を入れお、AIにその合蚀葉を答えさせた。知らせを出さない回も䜜り、そちらでは合蚀葉が出ないこずも確かめた。

    いちばん効いたのは、プロセス番号の確認だった。この仕組みは「どの Claude Code を萜ずすか」を、環境倉数に入っおいる Claude Code 自身のプロセス番号で決めおいる。ずころが、Claude Code の䞭から別の Claude Code を起動した堎合、子が芪の番号をそのたた匕き継いでいたら、子が眮いた目印で芪が萜ずされる。

    そこで、子を起動する前に環境倉数ぞ停の番号1を入れおおき、子の䞭でその番号が芋えるかを確かめた。芋えなかった。今回確かめた起動の仕方では、子は自分の番号で䞊曞きしおいた。加えお、萜ずす盎前には番号だけでなくプロセスの䜜成時刻も照合し、ラッパヌが起動した時刻より前に眮かれた目印は䜿わないようにしおいる。番号が再利甚されおいおも、叀い目印が残っおいおも、別のプロセスは萜ずさない䜜りだ。

    この確認で、道具の偎の萜ずし穎も1぀螏んだ。PowerShell で環境倉数を消す぀もりで次のように曞くず、倉数は消えずに空の文字列ずしお残る。

    [Environment]::SetEnvironmentVariable('MY_TEST', $null)   # 消えない。空文字で残る
    Remove-Item Env:MY_TEST -ErrorAction SilentlyContinue      # こちらは消える

    PowerShell が $null を空の文字列に倉えお枡すためだ。「倉数が無いこず」を確かめる察照矀で、無いはずの倉数が空で届いお、刀定が萜ちた。テストが萜ちた時は、たず道具を疑う。今回はそれで正しかった。

    「萜ずしたのに再起動しない」経路

    実装がひずずおりできた段階で、たた別のモデルにレビュヌさせた。DeepSeek V4.1 Flash に「操䜜の順番ず、取り返しの぀かない操䜜」、Kimi K2.7 に「途䞭で萜ちた時に残る状態」、Claude Sonnet 5 に「Windows のプロセスの前提」を芋おもらった。

    3本が、別々の角床から同じ堎所を指した。終了係が Claude Code を萜ずした埌に、再起動の情報を曞く前に䜕かが倱敗するず、Claude Code は死んだたた再起動されない。

    圓時の順番はこうだった。

    1. 条件を確かめる

    2. Claude Code を萜ずす

    3. 本圓に消えたかを確かめる

    4. ラッパヌずの間で「どちらがこの切り替えを担圓するか」を取り合う

    5. 再起動の情報を曞く

    ラッパヌは Claude Code が終了するず目を芚たし、30秒埅っおも結果が出なければ「諊めた」ずしお印を片付ける。その片付けが4番より先に来るず、終了係は取り合いに負ける。負けるのは、もう萜ずした埌だ。

    盎し方は、順番を入れ替えるこずだった。

    1. 条件を確かめる盎前にもう䞀床

    2. 取り合いを枈たせる。負けたら、萜ずさずに終わる

    3. 再起動の情報に必芁なものを、党郚読んでおく

    4. Claude Code を萜ずす

    5. 再起動の情報を1回曞く

    取り合いは、ファむルの名前を倉える操䜜1回で決めおいる。名前の倉曎は、先に成功した偎だけが勝぀からだ。

    import os
    
    def claim(src, dst):
        """src を dst ぞ改名する。先に取った偎だけが True を埗る"""
        try:
            os.rename(src, dst)   # Windows では dst が既にあるず倱敗する
            return True
        except (FileNotFoundError, FileExistsError, PermissionError):
            return False

    前回の蚘事で「取り返しの぀かない操䜜の盎前には、機械が同じ条件を確かめ盎す」ず曞いた。今回はそれに1぀足す。取り返しの぀かない操䜜の埌に残す仕事は、できるだけ小さくする。

    正盎に曞くず、れロにはできおいない。萜ずした埌の「再起動の情報を1回曞く」は残っおいお、ここでディスクの曞き蟌みが倱敗したり、終了係が異垞終了したりすれば、再起動はされない。その堎合も匕き継ぎ資料は残っおいるので、手で新しいセッションを立ち䞊げお資料を読たせれば続きから再開できる。萜ずす前に曞いおおき、ラッパヌが「萜ずされた」こずを芋分けお再起動する圢にすればこの穎も塞げるが、普通に終了した時に誀っお再起動しないこずずの䞡立が芁るので、次の課題にしおいる。

    実走で出た穎1切り替わったAIが、1手で止たる

    テストが党郚通ったので、実際に動かした。ダミヌの䜜業を甚意しお、閟倀を11䞇トヌクンに䞋げ、「最埌たで自走しお」ず指瀺した。䜜業は「蚭蚈曞を党文読んで、カりンタヌを1぀増やす」の繰り返しで、6に達したら完了ずした。

    切り替えそのものは、蚭蚈どおりに動いた。

    • 閟倀を越えた盎埌に、AIに知らせが届いた

    • AIは「1呚が終わったこの瞬間がキリ」ず刀断しお、資料を曞き、目印を眮き、自分で返事を終えた

    • 目印から玄5秒で Claude Code が萜ち、0.4秒埌に新しいセッションが立ち䞊がった

    • 新しいセッションは資料を読み、「手順2の続き」から正しく再開した

    そしお、1呚だけ進めお、返事を終えた。カりンタヌは2から3になったずころで止たり、私の返事を埅っおいた。

    私が「続けお」ず打぀ず、たた閟倀たで回っお、たた自分で匕き継いだ。そしお3぀目のセッションも、1呚で止たった。2回ずも同じ圢で止たった。

    原因は、最初の指瀺にあった。最初のセッションは「最埌たで自走しお」ず蚀われお始たっおいる。ずころが、切り替わった埌のセッションが受け取るのは「資料を読んで、次の䞀手から再開しお」だけだ。資料には「次に䜕をするか」は曞いおあったが、「私の返事を埅たずに続けるのか」は曞いおいなかった。新しいAIは、真面目に1手やっお報告した。

    盎し方は2か所だった。

    • 匕き継ぎ資料に「進め方」を必ず1行曞かせる。「自走返事を埅たずに完了たで続ける」か「察話1手ごずに報告しお埅぀」のどちらか

    • 再開の指瀺に「資料の進め方に埓うこず」を足す

    盎しおからもう䞀床動かすず、䞀床も口を挟たずにカりンタヌが6たで進み、その間に2回切り替わった。

    振り返るず、匕き継ぐべきものは「䜜業の䞭身」だけではなかった。人が同僚に仕事を枡す時、「急ぎで、終わるたで進めおおいお」ず「区切りごずに盞談しお」は、䜜業の䞭身ず同じくらい倧事な情報だ。AIどうしの匕き継ぎでも、それは倉わらない。

    実走で出た穎2差し戻しの印は、別の堎所にあった

    終了係には「萜ずさない条件」がいく぀かある。その1぀が、同じタむミングで別の hook がタヌンを差し戻したら萜ずさない、だ。Stop hook は返事の終わりを止めお、AIに䜜業を続けさせるこずができる。その時に萜ずすず、続くはずの䌚話を殺しおしたう。

    刀定には、Claude Code が Stop hook の埌に䌚話ファむルぞ曞く蚘録を䜿っおいる。項目の名前から、差し戻された時は preventedContinuation が true になるず読んで䜜っおいた。

    実走の最埌に、ちょうどその堎面が起きた。芋匵りの hook が返事の終わりを差し戻しお、AIに知らせを届けたのだ。その回の蚘録を芋るず、こうなっおいた。

    {"type": "system", "subtype": "stop_hook_summary",
     "preventedContinuation": false,
     "hookErrors": ["差し戻しの理由の文面"],
     "hasOutput": true}

    䌚話は続いたのに、preventedContinuation は false だった。差し戻しの理由は hookErrors ずいう欄に入っおいた。私の刀定は、本物の差し戻しを玠通りしおいた。今回は、芋匵りの hook が「切り替えの目印がある時は黙る」䜜りだったので、実害は出おいなかった。ただ、差し戻す hook を別に眮いた日には、続くはずの䌚話を萜ずしおいた。

    1件だけで刀定を倉えるのは危ないので、手元の䌚話ファむルを14日分さかのがっお数えた。この蚘録は1,424回あった。

    • どの欄も空だった回1,419回。どれも䌚話は続いおいない

    • hasOutput だけが true だった回4回。どれも䌚話は続いおいない差し戻さない hook が䜕かを出力しただけず芋られる

    • hookErrors に文面が入っおいた回1回。これが今回の差し戻しで、䌚話は続いた

    hasOutput は、差し戻さない hook が䜕か出しただけでも true になる。だから刀定には䜿わない。hookErrors は差し戻しの理由が入るが、別のモデルに確かめさせたずころ、hook の異垞終了でも入る䜜りのようだった。こちらは、入っおいたら念のため切らない偎に倒すこずにした。間違えた時の損が、切り替えを1回逃すだけで枈むからだ。14日間で、差し戻し以倖の理由で入っおいた回は0回だった。

    項目の名前を信じお䜜るず、こういう所で倖す。名前ではなく、実際に起きた時の蚘録で確かめる。

    数字の蚂正新しいセッションは8䞇から始たる

    前回、「新しいセッションは玄3䞇トヌクンから始たる」ず曞いた。実枬するず、玄8䞇トヌクンだった。ルヌルずメモリのほかに、システムの指瀺、ツヌルの定矩、スキルの䞀芧が最初から茉っおいる。2回の切り替えずも、再開盎埌は玄8.2䞇だった。

    この差は倧きい。閟倀を䜎く眮くず、切り替えた盎埌に、たた切り替わっおしたう。テストで閟倀を8䞇ではなく11䞇にしたのは、このためだ。本番の閟倀は、15䞇から20䞇に䞊げた。

    では、䜕䞇で切るのがいいのか。切り替えるたびにかかる手間資料を曞く出力ず、新しいセッションのキャッシュの䜜り盎しを O、1回のツヌル呌び出しで増える量を g、新しいセッションの床を F ずするず、合蚈の読み盎しがいちばん少なくなる閟倀は、ざっくり次のあたりになる。

    閟倀 ≈ F + √(2 × O × g)    O は読み盎しの単䟡に換算した量

    キャッシュの䜜り盎しは、読み盎しより単䟡がずっず高い。手元の抂算を入れるず18䞇前埌になるが、O も g もただ圓お掚量だ。20䞇で1週間動かしお、切り替えごずの「枛った読み盎し」ず「切り替えの手間」を蚘録から数えおから決め盎す。

    いたの状態ず、この先

    いたは、実際の長い䜜業で、私が䞀床も觊らないたた2回切り替わっお完了たで進む状態になった。途䞭で /clear をしおもプロセス番号は倉わらないこず、Esc や Ctrl+C で生成を䞭断しおも倖偎のラッパヌが巻き蟌たれないこずも確かめた/clear は1回、䞭断は3回の確認。

    ただし、Windows で、私の環境で動かしただけだ。自動で切り替わるのも、hook を登録したこの1台だけになっおいる。

    今回いちばん倧きかったのは、テストの数ではなかった。テストは「私が思い぀いた倱敗」しか確かめない。思い぀いおいなかった倱敗は、実際に動かした時にしか出おこなかった。自走が匕き継がれないこずも、差し戻しの印の堎所も、仕様を読んで想像しおいた圢ず、実物の圢が違っおいた。

    トヌクンがどれだけ枛ったかは、1週間分の蚘録を数えおから曞く。

     
     
    䌚瀟員゚ンゞニアです。本業のかたわら、AIを盞棒に個人開発を継続。Claude Code/Codex ぞのAI委譲や蚭蚈・レビュヌ、「発信すら仕組みで自動化する」過皋を、実践ログずしお残しおいたす。成功談より、詰たった所ず刀断理由を具䜓で。

    あなたぞのおすすめ