「no saved transcript」の対処 — Claude Codeバックグラウンドセッションの復旧
claude attachが「This session has no saved transcript」を出す条件と、claude respawnでの復旧手順、v2.1.211〜v2.1.214の挙動の違いをまとめます。
「This session has no saved transcript」は、claude attachで出るエラーです。最初の応答が終わる前にバックグラウンド化されたセッションへ戻ろうとしたときに出ます。会話そのものは失われていません。元のセッション側にまだ残っています。対処は元の会話にclaude --resumeで戻るか、claude respawn <id>で停止したセッションを再起動するかの二択です。
「no saved transcript」が出る条件
このエラーが出るのは、←キーまたは/backgroundで会話をバックグラウンド化した直後、その最初の応答がまだ完了していない状態で、そのセッションにclaude attachしようとしたときです。最初の応答が終わるまで、会話は「バックグラウンド化した元のセッション」の中にしか存在しません。claude attachは、同じセッションIDで空の会話を始めるのではなく、この状態を拒否します。
This session has no saved transcript — it was stopped before its first response finished. If it was backgrounded from another conversation, that one is still intact; `claude respawn <id>` starts this one fresh.エージェントビュー(claude agents)でこのセッションの行を開いた場合、表示は違います。メッセージの代わりに、リストの下へ「Press enter again to restart this session fresh」と出ます。
症状から選ぶ復旧の手順
どの手順を選ぶかは、取り戻したいものが何かで決まります。バックグラウンド化する前の会話を取り戻したいなら手順1と2、停止した側のセッションをやり直したいなら手順3と4です。
no saved transcriptからの復旧
- 1
バックグラウンド化した直後の画面に戻る
←で切り替えた直後のエージェントビューには「Your conversation moved to the background」と出ており、Enterで会話を開き直せます。Escを押すと切り替えを取り消して元の会話に戻ります。 - 2
claude --resumeで元の会話を探す
ターミナルを閉じてしまった場合は
claude --resumeでセッション一覧から選びます。バックグラウンド化する前の会話は、元のセッション側に残っています。 - 3
エージェントビューで再起動する
claude agentsを開き、停止した行でEnterを2回押します。1回目は案内が出るだけで、2回目で空の会話として再起動します。 - 4
シェルからclaude respawn <id>を実行する
IDはエラーメッセージか
claude agentsの一覧にあります。スクリプトから拾うならclaude agents --jsonの出力も使えます。
手順1でバックグラウンド側の会話を開けないときは、Claude Codeが終了してclaude --resumeのコマンドを表示する仕様です。その表示に従えば元の会話へ戻れます。
v2.1.287の--helpが示すstopとrespawnの約束
手元のclaude(v2.1.287)で、バックグラウンドセッションを操作するサブコマンドのヘルプを見ると、この問題の前提になる約束が分かります。
claude stop --help
claude respawn --help出力は次のとおりです。
Usage: claude stop <id>
Stop a background session. Its conversation is kept; resume it later with `claude attach <id>`.Usage: claude respawn <id>|--all
Restart a background session (or all of them) so it picks up the current Claude binary.stopのヘルプは「会話は保たれ、あとでclaude attach <id>で再開できる」と書いています。「no saved transcript」は、この約束が成り立たない例です。respawnのヘルプに「空の会話で始める」という説明はなく、目的は現行のClaude Codeバージョンへの載せ替えと書かれています。
claude respawnは空の会話になるのか、元のプロンプトを再実行するのか
claude respawn <id>の結果は、公式ページごとに書き方が違います。エラー一覧のページはrespawnを「新しく始める(fresh)」と書きます。エージェントビューのページは、Enterでの再起動を「空の会話」と書きます。
一方、エージェントビューのコマンド表では、respawnは停止中のセッションにも使える再起動で、保存された会話があればそれを再開すると説明されています。保存された会話がディスクに無いときは、元のプロンプトを新しい会話として再実行します。
保存された会話が無いセッションにrespawnした結果は、公式では「fresh」「元のプロンプトの再実行」と書き分けられています。元のプロンプトがコミットやデプロイなら、再起動後の最初の画面を確認してから進めます。
バックグラウンドサービスの停止中に終わったセッションでは、別のエラーが出ることがあります。トランスクリプトが削除されて会話が消えていると、「This session's saved conversation is no longer on disk」と出ます。
マシンの停止で止まったセッションは、最後に進捗があってから48時間以内ならfailedと表示されます。過ぎるとstoppedになり、「ended while the background service was off」と出ます。どちらも保存された会話から再開できます。
その後、cleanupPeriodDaysの保持期間に基づくクリーンアップでトランスクリプトが消えると、上のエラーになります。
このときclaude respawn <id>は元のプロンプトをもう一度実行し、claude rm <id>は行を削除します。「no saved transcript」とは原因が逆です。保存されるはずだった会話が、後から消えた場合にあたります。
バージョンでどう挙動が変わったか
このエラーへの対処手段そのものが、v2.1.211からv2.1.214にかけて段階的に整備されています。
停止済みセッションを開いたときの挙動
- v2.1.211より前無言で空の会話が始まる
拒否そのものが存在せず、停止済みセッションを開くと空の会話が始まりました。そのセッションの元のプロンプトを再実行することもありました。
- v2.1.211拒否メッセージが導入された
エージェントビューの行を開くと拒否メッセージが出ます。ただし、そこから再起動する手段はありませんでした。
- v2.1.212エージェントビューから再起動できる
行に「Press enter again to restart this session fresh」と出て、その場から再起動できます。
- v2.1.214読み取れないフォルダを許容する
~/.claude/projects内に読み取れないフォルダがあっても、トランスクリプトのスキャンを続けます。
保存されているのに誤って表示されるケース
このエラーは、最初の応答が終わっていないとき以外にも出ました。v2.1.214より前では、応答が完了して保存済みでも、~/.claude/projects配下に読み取れないフォルダがあると、同じ拒否メッセージが返ることがありました。スキャンがその会話を見落とすためです。
応答が終わったはずなのにエラーが出るなら、まずバージョンを確認します。
claude --version
claude updateなぜ「最初の応答」がカギになるのか
Claude Codeはトランスクリプトを~/.claude/projects/<プロジェクト名>/<セッションID>.jsonlというセッションIDごとのファイルに保存します。<プロジェクト名>は、作業ディレクトリのパスの英数字以外を-に置き換えた名前です。
似たバックグラウンドセッションのエラーとの見分け方
バックグラウンドセッション関連のエラーは、公式のエラー一覧で1つのカテゴリにまとまっています。文字列だけで見分けると遠回りになるため、発生条件で見分けます。
| エラー | 発生条件 | 会話は残るか |
|---|---|---|
| no saved transcript | 発生条件最初の応答が終わる前に停止したセッションへattachした | 会話は残るか残る(元のセッション側) |
| Session agent no longer available | 発生条件--agentで指定したカスタムエージェントが見つからない | 会話は残るか残る(デフォルトのツール・プロンプトで再開) |
| Commands refused in a background session | 発生条件/install-github-appなど対話ダイアログの要るコマンドを、端末が接続されていないセッションで実行した | 会話は残るか残る(attachして再実行する) |
| Session isn't responding | 発生条件開いたセッションから約10秒間、出力が届かなかった | 会話は残るか残る(保存済みで、再起動すると再開する) |
| saved conversation is no longer on disk | 発生条件保存済みの会話がトランスクリプト削除で消えた | 会話は残るか消えている(respawnは元のプロンプトを再実行) |
「no saved transcript」は、会話が存在するのにattachという操作だけが拒否される点で特徴的です。
放置しても会話が消えないケースとの違い
バックグラウンドセッションは、応答を終えて約1時間誰も接続していないと、サービス側がプロセスを止めて資源を空けます。会話はディスクに残り、次にattachするか返信したときに続きから再開します。Ctrl+Tでピン留めしたセッションは、プロセスが動いたままです。
この「止まっても再開できる」挙動は、保存された会話が前提です。「no saved transcript」は、保存される前に止まったセッションで起きます。しばらく放置したセッションが開けないときは、まず最初の応答が終わっていたかを思い出すと原因を絞れます。
アップデート後の扱いも同じ考え方です。サービスは新しいバージョンへ自分を載せ替え、待機中のセッションをバックグラウンドで移します。作業中・入力待ち・接続中のセッションは中断されません。すぐに新しいバイナリへ移したいセッションにはclaude respawn <id>が使え、--allを付ければ動いているセッションすべてを一度に移せます。
切り分けと確認のコマンド
/statusを実行すると、いま自分がどの種類のセッションにいるかをSession kindの行で確認できます。バックグラウンドセッションなら、端末が接続中はbackground job · attached、未接続はbackground job · unattendedです。通常の対話セッションではinteractiveと出ます。この行はv2.1.221から表示されます。
よくあるつまずき
- バックグラウンド化した会話をターミナルの
killなどで自分で終了させると、そのセッションは再起動されず「stopped」のまま残ります。通常、プロセスが予期せず終了するとバックグラウンドサービスが再起動しますが、←や/backgroundで自分がバックグラウンド化したセッションは例外です ←を押した瞬間にツールが実行中なら、Claude Codeは終わるまで最大10秒ほど待ってからバックグラウンド化します。待たずにもう一度←を押すと即座にバックグラウンド化され、最初の応答が未完了のまま止まる状況を作りやすくなります- 同じIDは
claude attach・claude logs・claude stopでも共通して使えます。IDを忘れたときは、エラーメッセージのclaude respawn <id>か、claude agentsの一覧から拾えます - 停止したセッションの会話が別のターミナルで開かれていると、行は「Can't open — this session is running in another terminal」で拒否されます。そのターミナルで続けるか、終了してから開き直します。このメッセージはv2.1.248からで、それより前は、ターミナルでresumeした会話の行を開くと、同じ会話に書き込む2本目のプロセスが起動していました
- 「already open in another running Claude session」と出る場合もあります。同じ会話のバックグラウンドセッションのプロセスがまだ終了していないなど、別の非対話のClaude Codeプロセスがその会話を握っているときです
claude rm <id>は行を削除するコマンドです。ヘルプには「stopと違い、すでに終了したセッションにも使える」とあります。未pushのコミットや未コミットの変更があるときは、セッションとworktreeを残し、理由を示します。トランスクリプト自体はclaude --resumeから引き続き開けます
まとめ
respawnは保存された会話が無いと元のプロンプトを再実行しうるので、コミットやデプロイを含むセッションでは、先にclaude --resumeで元の会話を確かめます。応答が終わったはずなのに出るなら、アップデートでv2.1.214以降かを確認します。