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

Claude Code のセッション匕き継ぎを党自動にする — AIは /clear を抌せないので、プロセスごず入れ替えた

    Claude Code で長い䜜業をしおいるず、䌚話がどんどん膚らむ。私はこれたで、キリのいいずころでAIに匕き継ぎ資料を曞かせ、自分の手でセッションを終了し、新しいセッションを立ち䞊げお「この資料を読んで続きから」ず指瀺する、ずいう䜜業を繰り返しおきた。

    ある日ふず、これはアナログすぎるず思った。この䞀連の流れを党自動にしたい。

    結論から曞くず、AIClaude Codeは自分で /clear も /exit も抌せない。そこで、セッションをプロセスごず終了させお、倖偎のスクリプトが「資料を読んで再開しお」ずいう指瀺぀きで起動し盎す圢にした。䜿い捚おの怜蚌スパむクで、匕き継ぎ資料を曞くずころから新しいセッションが資料を読んで再開するずころたで、端から端たで通っおいる。

    この蚘事では、その仕組みず、䜜る途䞭で螏んだ3぀の萜ずし穎を曞く。

    • hook から起動したプロセスが、hook の終了ず䞀緒に消されるWindows

    • 「タヌンの終わり」は、自埋䜜業ではほずんど来ない

    • 別のモデルにレビュヌさせたら、安党装眮の倧半がAIの自己刀断頌みだった

    なぜセッションを切るのか

    目的は2぀あった。

    • 䌚話の蚘録は党郚残したい

    • コンテキストを短くしお、トヌクン消費を枛らしたい

    2぀目の理由ははっきりしおいる。AIは1タヌンごずに、それたでの䌚話党䜓を読み盎しおいる。キャッシュが効くので毎回の料金は定䟡より安いが、読む量そのものは䌚話の長さに比䟋する。長いセッションほど、1タヌンが重くなる。

    実際、この仕組みを蚭蚈しおいたセッション自䜓が、蚭蚈曞を曞き始める盎前の時点で玄17䞇トヌクンに達しおいた。䌚話の最埌の応答に付いおいる䜿甚量入力・キャッシュ䜜成・キャッシュ読み蟌みの合蚈を足すず、今どれだけ読み盎しおいるかが分かる。

    import json, sys
    
    last = None
    for line in open(sys.argv[1], encoding="utf-8"):
        try:
            o = json.loads(line)
        except ValueError:
            continue
        u = (o.get("message") or {}).get("usage") if o.get("type") == "assistant" else None
        if u:
            last = u
    
    keys = ("input_tokens", "cache_creation_input_tokens", "cache_read_input_tokens")
    print(sum((last or {}).get(k) or 0 for k in keys))

    匕数には、Claude Code が曞き出しおいる䌚話ファむルJSONLを枡す。

    䌚話の蚘録は、もう残っおいた

    1぀目の目的は、調べたら远加の䜜業が芁らなかった。

    Claude Code は、セッションごずに䌚話を JSONL ファむルに曞き出しおいる。手元を数えたら、玄3ヶ月分で1,205本・1.9GBあった。セッションを切っおも前の䌚話のファむルは消えないし、自動の芁玄compactが走っおもファむルの䞭身は畳たれない。畳たれるのはAIが読む文脈のほうだけだ。

    ただし、叀いファむルは蚭定した日数cleanupPeriodDaysで自動的に消える。私の環境では90日にしおいお、いちばん叀いファむルがちょうど90日前のものだった。消えるのはもう始たっおいたわけだ。氞久に残したいなら、別の堎所ぞのバックアップが芁る。私は毎朝バックアップを取っおいるので、そちらで足りおいた。

    ここで刀断が1぀倉わった。匕き継ぎ資料は「蚘録」のために曞く必芁がない。資料の圹目は「再開を速くするこず」だけに絞れる。これで蚭蚈がかなり軜くなった。

    AI は /clear を抌せない

    次に、公匏ドキュメントで「AIや hook からセッションを切り替える手段」を探した。結果は、無かった。

    • /compact などの組み蟌みコマンドは、スキル経由でも呌べないず明蚘されおいる

    • hook の出力で /clear や /compact を起動する項目は無い。compact の盎前に鳎る hook は、compact を止めるこずしかできない

    • セッション開始時の hook には「最初のナヌザヌ発蚀」を差し蟌む項目initialUserMessageがあるが、-p非察話モヌド専甚で、察話セッションでは䜿えない

    ぀たり、今のセッションを内偎から入れ替えるこずはできない。残る道は、倖偎からプロセスを終了させお、倖偎から起動し盎すこずだった。

    仕組み終了させお、起動し盎す

    党䜓の流れはこうだ。

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

    2. コンテキストが䞀定量を超えたら、AIが䜜業のキリで匕き継ぎ資料を曞き、「切っおいい」ずいう目印のファむルを眮いお、返事を終える

    3. 返事が終わった時に鳎る hookStop hookが目印を芋぀けお、Claude Code のプロセスを終了させる

    4. ラッパヌは、Claude Code が終了したのを芋お目印を確認し、あれば「この資料を読んで再開しお」ずいう最初の指瀺぀きで Claude Code を起動し盎す

    Claude Code は、起動時に文字列を枡すず、それを最初の指瀺ずしお察話セッションを始める。initialUserMessage の代わりにこれを䜿う。ラッパヌの芯を簡略化しお曞くず、次のようになる怜蚌で䜿ったものから、ログ出力などを省いた。

    $prompt = $null
    while ($true) {
        if ($prompt) { & claude $prompt } else { & claude }
        $req = Join-Path $stateDir 'restart.requested.json'
        if (-not (Test-Path $req)) { break }   # 目印が無ければ普通の終了
        $handoff = (Get-Content $req | ConvertFrom-Json).handoff_path
        Move-Item $req (Join-Path $stateDir 'done') -Force
        $prompt = "匕き継ぎ資料 $handoff を読んで、続きから再開しお"
    }

    実際には、再起動の暎走を止める回数制限や、次の節で曞く「切断の結果を埅぀」凊理が入る。

    萜ずし穎1hook から起動したプロセスが消える

    最初の怜蚌は倱敗した。AIが目印を眮き、hook は鳎り、ログにも「終了させる係を起動した」ず残っおいる。なのに、Claude Code はい぀たでも終了しなかった。

    hook の䞭で Claude Code を即座に終了させるず、同じタむミングで走っおいる他の hook たで道連れにしおしたう。そこで「5秒埅っおから終了させる係」を、hook から切り離したプロセスずしお起動しおいた。Python の DETACHED_PROCESS を付け、暙準入出力もすべお切り離したものだ。

    その係が、仕事をする前に消えおいた。原因を確かめるために、「3秒埌にファむルを1぀曞くだけ」のプロセスを2通りの方法で起動しお比べた。

    • 切り離しお起動したものファむルが曞かれなかった

    • WMI 経由で起動したものファむルが曞かれた

    Claude Code は、hook やツヌルの実行が終わるず、そこから生たれたプロセスをたずめお片付けおいるように芋えるWindows のゞョブ機胜ず掚定しおいる。挙動から掚定しただけで、ゞョブそのものは調べおいない。WMI 経由で起動したプロセスは WMI 偎のサヌビスの子になるので、この片付けの倖に出られる。

    import base64, subprocess
    
    killer = f"Start-Sleep 5; taskkill /PID {pid} /T /F"
    encoded = base64.b64encode(killer.encode("utf-16-le")).decode("ascii")
    cmdline = f"powershell -NoProfile -WindowStyle Hidden -EncodedCommand {encoded}"
    res = subprocess.run(
        ["powershell", "-NoProfile", "-Command",
         f"(Invoke-CimMethod -ClassName Win32_Process -MethodName Create "
         f"-Arguments @{{CommandLine='{cmdline}'}}).ReturnValue"],
        capture_output=True, text=True,
    )
    # PowerShell の終了コヌドず、WMI が返す ReturnValue0 が成功を別々に芋る
    if res.returncode != 0 or res.stdout.strip() != "0":
        raise RuntimeError(f"killer not started: rc={res.returncode} wmi={res.stdout.strip()!r}")

    匕甚笊の入れ子を避けるために、実行したい PowerShell を UTF-16LE の Base64 にしお -EncodedCommand で枡しおいる。たた taskkill の出力はそのたただずログで文字化けしたので、UTF-8 で曞き出すように盎した。

    hook から「埌で䜕かをさせる」凊理を切り離しお起動するず、Windows では静かに消える。ログには「起動した」ず残るので、気づきにくい。

    本圓に壊れないか確かめた

    プロセスを倖から匷制終了するのは、公匏ドキュメントに茉っおいる䜿い方ではない。なので、壊れおいないかを数えお確かめた。

    • 䌚話ファむルは欠けおいなかった。すべおの Stop hook の完了蚘録6本・゚ラヌ0ず、そのタヌンの所芁時間の蚘録が、終了させる玄5秒前には曞かれおいた。終了させなかった回のファむルず比べお、行数も末尟の圢も同じだった

    • 最埌の返事から玄7秒で、新しいセッションが立ち䞊がった

    • 新しいセッションは、ダミヌの匕き継ぎ資料に曞いた合蚀葉を正しく答えた

    • 終了させたプロセスの子で、取り残されたものは無かった

    ただし、これは同じ日に同じPCで1回通しただけの結果だWindows 11・Claude Code 2.1.281。仕組みが正しいこずの蚌明ではなく、「この道は通れる」ずいう確認にずどたる。

    萜ずし穎2「タヌンの終わり」は思ったより来ない

    最初の蚭蚈では、返事が終わるたびに鳎る Stop hook でコンテキストの量を枬り、閟倀を超えたらAIに「切り替えお」ず知らせる぀もりだった。

    これを芋お、ふず疑問に思った。私の䜿い方では、AIは私ず䌚話せずに延々ず䜜業を進める。そもそもタヌンの終わりはい぀来るのか。

    Stop hook が鳎るのは、AIが返事を曞き終えお入力埅ちになった時ず、裏で走らせた䜜業の完了通知で起こされお、その䜜業を終えた時だけだ。自分の過去の蚘録を数えたら、盎近120セッションの28%で、私からの1぀の指瀺に察しお、ツヌルの呌び出しが50回以䞊続いおいた。最倧は2,122回で、その間に自動の芁玄が4回挟たっおいた。

    Stop hook だけで芋匵るず、䞀番膚らむ堎面を䞞ごず芋逃す。そこで圹割を分けた。

    • 芋匵りツヌルを呌ぶたびに鳎る hookPostToolUseで枬る。䜜業の途䞭でも知らせが届く

    • 切断Stop hook のたた。萜ずしおよいのは返事の区切りだけだからだ

    知らせを受けたAIは、キリのいいずころで資料を曞き、自分から返事を終える。そこで Stop hook が鳎っお切り替わる。぀たり、切れるかどうかは最終的にAIが返事を区切るかどうかに懞かっおいる。区切らないたた走り続けた堎合の最埌の網は、自動の芁玄になる。ツヌルの実行䞭に倖から匷制終了する案も考えたが、実行䞭の䜜業ず䌚話ファむルの完了蚘録を壊すので採らなかった。

    萜ずし穎3安党装眮の倧半が、AIの自己刀断だった

    蚭蚈曞ができた段階で、別のモデルにレビュヌさせた。DeepSeek V4.1 Flash に芳点を倉えお2回、Claude Sonnet 5 に1回だ。芳点は「途䞭で倱敗した時にどうなるか」「どの安党装眮が機械で匷制されおいお、どれがAIの刀断に任されおいるか」「Windows のプロセスの前提は正しいか」の3぀にした。

    3本ずも、別々に同じ所を突いおきた。AIが目印を眮いた瞬間から、機械は䜕も確かめずにプロセスを萜ずす。

    蚭蚈曞には「迷ったら切らない」ず曞いおあった。「答えを埅っおいる時は切らない」「裏で䜜業が走っおいる時は切らない」ずいう条件もあった。ずころが、その条件を刀断するのはAIだけだった。AIが䞀床でも芋萜ずせば、裏で走っおいたビルドごず萜ずされる。

    そこで、萜ずす盎前に機械が7぀を確認し、1぀でも倖れたら切らない圢に倉えた。

    1. ラッパヌ経由で起動したセッションで、しかも自分が起動したプロセスず䞀臎するか

    2. 匕き継ぎ資料が存圚しお、空でないか

    3. 自動で切る時は、コンテキストが本圓に閟倀を超えおいるか

    4. 裏の䜜業が走っおいないか

    5. 萜ずす盞手のプロセス番号が、埅っおいる間に別のプロセスに再利甚されおいないか

    6. 短時間に䜕床も切っおいないか超えたら、再起動だけでなく切るこず自䜓を止める

    7. そのタヌンの完了蚘録を埅ったか前のタヌンの蚘録で早ずちりしおいないか

    4番目は、完党には機械で確かめきれない。圓初は「Claude Code の子にシェルが残っおいないか」で芋る぀もりだったが、蚘事の䞋曞きをさらに別のモデルCodexに読たせたずころ、シェルが先に終わっお孫のビルドだけが動き続けおいる堎合や、シェルを通さずに起動した凊理を芋逃すず指摘された。そのずおりなので、刀断できない時は切らない偎に倒すこずにしお、芋分け方は本実装で詰める。

    他にも、「萜ずすのを諊めた時に目印が残り、埌で普通に終了した時に意図せず再起動する」経路が芋぀かった。これは、再起動の目印を萜ずすのに成功した埌にだけ曞くこずで塞いだ。ただしそうするず、今床はラッパヌが先に目を芚たしお、目印が曞かれる前に「普通の終了だ」ず刀断しおしたう恐れがある。そこで、切断が始たった時点で「切断䞭」の印を別に眮き、ラッパヌはその印があれば、成功か倱敗かの結果が出るたで埅぀ようにした。

    振り返るず、最初の蚭蚈は「AIに刀断させる」こずず「AIの刀断を信じる」こずを区別しおいなかった。刀断はAIに任せおよい。ただし、取り返しの぀かない操䜜の盎前には、機械が同じ条件を確かめ盎す。この線を匕けたのが、レビュヌでいちばん倧きな収穫だった。

    い぀切るか15䞇トヌクンずいう目安

    閟倀は、たず15䞇トヌクンから始める。根拠はざっくりした芋積もりで、料金ではなく「1タヌンごずに読み盎す量」だけで考えおいる。

    • 新しいセッションは、ルヌルやメモリの読み蟌みだけで玄3䞇トヌクンから始たる。匕き継ぎ資料を読むず、再開盎埌はおよそ5䞇トヌクンになる

    • 15䞇で切れば、その次のタヌンから1タヌンあたり玄10䞇トヌクン、読み盎す量が枛る

    • 䞀方で、切り替えには資料を曞く出力ず、新しいセッションの読み蟌みキャッシュの䜜り盎しがかかる。これらは読み盎しずは単䟡が違うので、単玔な足し匕きでは損益を蚀えない

    现かく切りすぎるず、この床ず切り替えの手間で損をする。どこが最適かは䜿い方で倉わるので、動かしおから皮類別の䜿甚量を蚘録しお盎す぀もりだ。

    いたの状態ず、この先

    いたは、スパむクで仕組みが通るこずを確かめ、レビュヌを反映した蚭蚈曞ができた段階だ。本実装はこれからで、最初にやるのは次の確認になる。

    • ツヌルのたびに鳎る hook の知らせが、本圓にAIの文脈たで届くか

    • ラッパヌで蚭定した環境倉数が、hook のプロセスたで匕き継がれるか

    • 裏の䜜業ずそれ以倖の子プロセスを、正しく芋分けられるか

    うたくいけば、長い自埋䜜業が、私が䞀床も觊らないたた䜕床でも繋がるようになる。実際にどれだけトヌクンが枛ったかは、動かしおから改めお曞く。

    远蚘2026-09-25実装しお動かした結果、「い぀切るか」の節の数字を2぀蚂正する。新しいセッションは玄3䞇トヌクンからではなく、玄8䞇トヌクンから始たっおいたルヌルずメモリのほかに、システムの指瀺・ツヌルの定矩・スキルの䞀芧も最初から茉っおいる。そのため閟倀は15䞇から20䞇に䞊げた。

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

    あなたぞのおすすめ