なぜセッションファイルのコピーが機能しないのか
Claude Codeのセッションは、プロジェクトディレクトリに関連付けられて保存された会話です。デフォルトでは、トランスクリプトは ~/.claude/projects/<project>/<session-id>.jsonl にJSONL形式で保存されます。ここで、プロジェクトセグメントは、作業ディレクトリのパスの英数字以外の文字をハイフンに置き換えたものです。
そのため、ファイルは目の前にあり、それをコピーすれば解決するように見えます。しかし、コピーした際のドキュメントに記載されている挙動は以下の通りです。
"プロジェクトをまたぐ検索は、そのIDに対するメッセージを含むトランスクリプトを保持しているプロジェクトが「正確に1つ」だけ存在する場合にのみIDを解決します。そのため、手動でコピーした重複ファイルが存在すると、Claude Codeは任意のコピーを再開するのではなく、見つからない(not-found)と報告します。"
これをよく読んでみてください。検索処理は、コピーを見つけられずに失敗しているわけではありません。2つの候補が見つかったため、どちらか一方を勝手に推測して選択することを拒否しているのです。ファイルをコピーすること自体が再開を妨げる原因であり、元ファイルを安全に残すために「移動」ではなく「コピー」するという慎重な行動をとるほど、確実にこの失敗に陥ります。
このファイルに依存すべきではない2つ目の理由も、同様に明確に述べられています。
"エントリのフォーマットはClaude Codeの内部仕様であり、バージョン間で変更される可能性があるため、これらのファイルを直接解析するスクリプトは、リリースごとに破損する可能性があります。セッションデータを活用する場合は、代わりに /export またはスクリプトインターフェースを使用してください。"また、このファイルを前提とした計画を立てる前に知っておくべき3つ目の事実として、トランスクリプトには有効期限があります。デフォルトでは30日間の保持期間が設定されており、設定キーで調整可能ですが、クリーンアップ処理によって削除されます。トランスクリプトは一時的な作業成果物であり、アーカイブではありません。
これは、1台のマシンと1つのセッション内で完結するセッションを以前の時点に巻き戻す問題や、ツールによってコピーが作成され適切に登録されるClaudeアプリからリモートセッションをフォークする問題とは異なります。ここでの課題は、会話の実体を、それを一度も保持したことのない別のマシンにどのように届けるかです。
人々が代わりに試みること
JSONLをコピーしてIDで再開する。 上述の通りです。重複が存在することが「見つからない」原因になります。
~/.claude/projects 配下のプロジェクトディレクトリ全体をコピーする。 メカニズムは同じですが、影響範囲が広がります。同じIDのメッセージを含むトランスクリプトを保持するディレクトリが2つ存在することになります。
JSONLを解析して要約を作成するスクリプトを書く。 次のリリースまでは機能するかもしれません。しかし、フォーマットは明示的に内部仕様であり、バージョン間で変更されることがドキュメントに記載されています。
再開時に起動設定も一緒に引き継がれると期待する。 引き継がれません。再度渡す必要があるもののリストは具体的です。「セッションが --mcp-config、--settings、--plugin-dir、--fallback-model、または --add-dir で追加されたディレクトリに依存していた場合は、再開時にそれらを再度指定してください。」セッションの途中で add-directory コマンドを使用して追加されたディレクトリも復元されません。設定ファイルは起動時に再読み込みされるため、そこに記述されている内容は反映されます。
会話内のすべてが維持されると仮定する。 ほとんどは維持されます。再開されたセッションは、ツールの呼び出しや結果を含む完全な履歴を復元します。しかし、前のプロセスが終了した時点でまだ実行中だったツールは「再開時に完了したり再実行されたりすることはありません。Claudeはその出力を得られないまま続行します。」最後の操作が時間のかかるビルドだった場合、その結果は再開された会話には含まれません。
意図しない要約に依存する。 ProまたはMaxプランでは、約1時間以上非アクティブで、かつ100,000トークンを超えるセッションを再開すると、最初にダイアログが表示されます。選択肢の1つは、すぐに圧縮(compaction)を実行し、「履歴を要約、最新のやり取り、および最近読み込まれた最大5つのファイルに置き換える」というものです。これはデフォルトの挙動としては合理的ですが、アーカイブとしては不十分です。その理由は、圧縮後に何を残すかを意図的に選択する必要があるのと同じです。
解決策:読み取り可能な記録をエクスポートし、決定事項は個別に持ち運ぶ
2つの成果物はそれぞれ異なる役割を果たします。エクスポートは会話をドキュメントとして提供します。その中の決定事項は、トランスクリプトとしてではなく、「事実(ファクト)」として持ち運ぶ必要があります。
Step 1: セッションが開いている間に会話をエクスポートする
セッション内でエクスポートコマンドを実行します。メニューが表示され、会話をクリップボードにコピーするか、プレーンテキストファイルとして保存できます。メッセージやツールの出力は読み取り可能なテキストとしてレンダリングされます。ファイル名を指定して実行すると、メニューをスキップしてそのファイルに直接書き込まれます。
得られるものは正確に説明されています。「/export は、人間が読むためにレンダリングされたトランスクリプトを生成します。」これが正しい期待値です。これは、あなたや同僚がどのマシンでも、どのエディタでも、Claude Codeのバージョンに依存せずに読めるドキュメントです。
一日の作業を終えた後ではなく、終える前にこれを行ってください。エクスポートは実行中の会話に対して行われます。保持期間のクリーンアップや圧縮ダイアログが実行されてしまうと、このステップは一気に難しくなります。
Step 2: エクスポートから決定事項を抽出し、独立した事実にする
エクスポートされたファイルを開き、経緯ではなく「結論」を読み取ります。明日誰かが行う作業に影響を与えるような、少数の重要な行を探します。
抽出する価値があるのは次の3種類です。議論の末に決定した事項(例:バックフィルの前に移行を実行する理由)、苦労して発見した制約(例:ジョブの実行中はこのテーブルを変更できない)、次のセッションで誤解される可能性のある用語(例:チームにおける「テナント」の定義)。
それぞれを、会話を参照しなくても単独で成立する1つの文章として書き出します。「最初に移行を実行することに決定した」では不十分です。「バックフィルは新しいカラムを読み込むため、バックフィルの前に移行を実行する必要がある」であれば再利用可能です。基準は、そのセッションを一度も見ていない人にとってもその文章が意味をなすかどうかです。これは、何が起きたかのインデックス付きログと、実用的なメモリを分ける基準と同じです。
Step 3: 元のマシンではIDで再開し、新しいマシンでは新規に開始する
セッションを実行したマシンでは、任意のディレクトリからIDを指定して再開します。検索処理は、まず現在のプロジェクトとそのワークツリーを検索し、次にマシン上の他のすべてのプロジェクトを検索するため、別の場所で開始されたセッションや移動されたセッションであっても、正確に1つのトランスクリプトがそのメッセージを保持していれば解決されます。セッションが依存していた起動フラグを指定して実行してください。
新しいマシンでは、再開を試みないでください。新しいセッションを開始し、ステップ2で作成した事実(ファクト)を渡します。引き継ぎ作業はこれだけです。事実は簡潔にまとめられているため、思ったよりも短時間で終わります。
エクスポートファイル自体を両方のマシンで利用できるようにしたい場合は、作業ドキュメントを保管している場所に保存してください。ただし、~/.claude/projects には絶対に置かないでください。2つ目のプロジェクトディレクトリにトランスクリプトのコピーが存在すること自体が、「見つからない」エラーを引き起こす重複の原因となるからです。
MemoryLakeでの設定方法
ステップ2では、次にどのマシンの前に座っても読み取れるようにする必要がある、1文で表された事実のセットが作成されます。MemoryLakeは、同期を忘れる心配のあるファイルに依存することなく、これらの事実を保管できる場所です。
エントリは、あなた自身の言葉で自分で書き込みます。Claude Codeのトランスクリプトファイル、~/.claude、またはベンダーのストアから何かが読み取られたり、書き込まれたり、削除されたりすることはありません。
Step 1: APIキーを作成する
サインインし、ダッシュボードからキーを生成します。このキーを使用することで、どのマシンのエージェントからでもエントリを読み取ることができます。これは、ファイルをコピーするだけでは実現できない部分です。

Step 2: 最初のメモリをアップロードする
上記のステップ2で抽出した決定事項、制約、用語を、1つのエントリにつき1つの事実として追加します。エクスポートしたトランスクリプトは詳細な記録として保管し、これらのエントリは次のセッションの開始時に読み込む必要がある部分として扱います。

Step 3: AIとエージェントを接続する
両方のマシンのエージェントが同じワークスペースを指すように設定します。これにより、開くことのできない会話から無理に再開しようとする代わりに、決定済みの事項がすでに利用可能な状態で新しいセッションを開始できます。

実務において何が変わるのか
最初の変化は、引き継ぎがファイル操作ではなくなることです。あるマシンのローカル状態を別のマシンに再現しようとする必要がなくなります。これは、ツールが意図的に解決を拒否している問題です。
2つ目は、2つの成果物が競合しなくなることです。エクスポートは、どのようにしてその結論に至ったかの読み取り可能な記録であり、プルリクエストの説明、引き継ぎメモ、またはインシデント報告書に役立ちます。事実は、次のセッションに読み込ませる必要があるものです。1つの成果物に両方の役割を持たせようとすると、誰も読まない巨大なトランスクリプトと、何も知らない新しいセッションが生まれる原因になります。
3つ目は、バージョンの変更が気にならなくなることです。レンダリングされたエクスポートは、永久にプレーンテキストのままです。JSONLトランスクリプトは内部フォーマットであり、リリース間で変更されることがドキュメントに記載されているため、それに依存して構築したものは、意図しないメンテナンスの負担になります。
また、エクスポートすべき内容自体が変わるため、プライバシーの側面についても言及しておく価値があります。トランスクリプトの書き込みは環境変数によって完全に抑制でき、単発の非インタラクティブな実行ではセッションを永続化しないように設定できます。会話をディスクに残すべきではない環境で作業している場合、これらのスイッチが存在します。つまり、エクスポートのステップが唯一の記録となるため、意図的に行う必要があります。これは、CLIのローカルなトランスクリプトではなく、コンシューマー向けアプリを対象としたClaudeにリクエストするアカウントレベルのデータエクスポートとは異なる成果物です。
ノートPCとデスクトップPCを併用して作業するチームは、この問題に最も早く直面しがちです。解決策は、マシンを変更したときにコンテキストが失われるのを防ぐ方法と同じです。つまり、永続化すべき部分は、どちらのマシンも所有していない場所に存在しなければならないということです。
マシン間で作業を移動するためのベストプラクティス
次のセッションの開始時ではなく、作業セッションの終了時にエクスポートする。 エクスポートは、現在の会話に対するリアルタイムの操作です。保持期間のクリーンアップ、圧縮ダイアログ、そして単純な物忘れなどが、あなたと昨日のセッションの間に立ちはだかります。
トランスクリプトのコピーを2つ目のプロジェクトディレクトリ内に絶対に配置しない。 これは、再開が失敗する最も大きな原因です。エクスポートはドキュメントと一緒に保管してください。
エクスポートの横に起動フラグを書き留めておく。 再開されたセッションは、開始時の設定フラグを復元しません。セッションにどのフラグが必要だったかを1行メモしておくだけで、ツールが見つからない原因を突き止めるための20分間を節約できます。
30日間の保持期間を本当の期限として扱う。 デフォルトのクリーンアップは30日であり、これは設定キーであって保証ではありません。6ヶ月後にも必要なものは、トランスクリプトではなく、エクスポートまたは事実(ファクト)として残しておく必要があります。
セッションに名前を付ける。 名前の付いたセッションは、リポジトリとそのワークツリー全体で名前によって解決されるため、元のマシンでの再開が非常に簡単になり、メモも読みやすくなります。名前のないセッションは、見覚えのないIDになってしまいます。
「決定したこと」と「議論したこと」を分ける。 前者は簡潔であり、引き継ぎに含まれます。後者は長く、エクスポートに含まれます。文脈を見失ってしまうセッションは、通常、プロジェクトの決定事項が会話以外の場所に書き残されていなかったことが原因です。
パーサーではなく、要約リクエストを使用する。 古いセッションから構造化された出力を得たい場合は、IDを指定してフォローアップのプロンプトを送信し、構造化された応答をキャプチャします。これはサポートされているインターフェースです。JSONLを解析することはサポートされていません。
結論
Claude Codeは会話を目に見えるファイルに保存するため、それをコピーすることが作業を移動する当然の方法のように感じられます。しかし、それはこのツールが拒否するように設計されている唯一のアプローチであり、検証できないコピーを再開するのではなく、「見つからない」と報告することで拒否します。
サポートされている方法は、より軽量で耐久性があります。セッションが開いている間に、会話を読み取り可能なドキュメントとしてエクスポートします。そこから、いくつかの決定事項、制約、用語を独立した文章として抽出します。トランスクリプトがあるマシンではIDで再開し、トランスクリプトがないマシンでは、事実がすでにロードされた状態で新しく開始します。
この分割は、複数人で作業を引き継ぐことを可能にする方法でもあります。これは、セッション間でコンテキストを共有することは、ツールの問題である前に記述(ライティング)の問題であるのと同じ理由です。