- 「一覧に含まれていないセッションが21件見つかりました」という通知が出ました。会話の中身はもともと手元にあって、足りていなかったのは一覧のほうです。
- 会話の本文はコマンドライン側のファイルに積み上がり、一覧はアプリが別に持っています。二つは会話のIDで結ばれています。
- 通知の末尾にある「アーカイブステータスと権限付与は復元できません」は、それらが一覧の側にしか書かれていないからです。
- ターミナルから始めた会話がアプリの一覧に出てこないのも、同じ作りから来ています。
1. 一覧に出ないセッションが21件ある、と言われた
Claude のアプリを触っていたら、サイドバーの下に見慣れない通知が出ていました。

「このコンピュータ上で、セッション一覧に含まれていない 21 件の Claude Code セッションが見つかりました」。
インポートするか、キャンセルするかを選ばせる画面です1。

文面には、含まれうるものが並べてあります。
アプリの一覧から欠落しているもの、ターミナルから始めたもの、このコンピュータに入っている Claude の別のコピーのもの、他の組織のもの、前のバージョンのもの、以前削除したもの。
そして最後に、インポートしたものは会話履歴と最後の権限モードを保つが、アーカイブ状態と権限付与は戻らない、と但し書きがついています。
読んで最初に引っかかったのは、そこではありませんでした。
一覧に無いものを、どうやって21件だと数えたのか。
無いものは数えられない。
数えられたということは、アプリが見ている一覧と、会話そのものが、別の場所に置かれているということです2。
インポートを押したあとで、手元のファイルを開いて確かめました。
2. 会話の中身と、会話の一覧は別の場所にある
2.1. 本文は、作業フォルダごとのファイルに積み上がる
会話の中身は、ホームフォルダの中の .claude/projects/ に入っていました。
その下に、作業していたフォルダごとの入れ物があります。
名前は作業していたパスから作られていて、英数字でない文字がすべてハイフンに置き換わっている3。/Users/名前/仕事場 なら -Users-名前-仕事場 です。
日本語のフォルダ名で作業していると、まるごとハイフンの列に化けるので、どこの会話なのか名前からは読めなくなります。
中身は .jsonl という拡張子のファイルで、ファイル名は会話ごとのIDです。
JSON Lines(ジェイソンラインズ)という形式で、1行が1件のできごとになっています4。
発言、ツールの実行、その結果が、起きた順に下へ足されていく。
1行ずつ見ていくと、時刻、作業フォルダ、そのときのGitのブランチ名、Claude Code のバージョン、権限モードが、行ごとに書き込まれていました5。
会話を「記録」として持っているのは、こちらのファイルです。
2.2. 一覧は、アプリが自分の側で持っている
では、サイドバーに並ぶタイトルの一覧はどこから来ているのか。
こちらはアプリ側の保存場所にありました。Library/Application Support/Claude/claude-code-sessions/ の下です6。
中を開くと、会話1件につき小さなJSONファイルが1つ。
手元の環境では112個ありました。
このJSONには、会話の中身は入っていません。
入っているのは、タイトル、作業フォルダ、使ったモデル、作成日時、最後に触った日時、アーカイブしたかどうか、権限モードといった項目だけです。
そして cliSessionId という項目があって、これが先ほどの .jsonl のファイル名と一致します。
本の目次と本文が別々のファイルになっていると思うと、近い。
アプリのサイドバーは目次を読んで表示し、会話を開いたときに本文のファイルを読みにいく7。
だから「本文はあるのに目次に行が無い」という状態がありえて、アプリはそれを21件と数えられたわけです。
インポート後にファイルの作成時刻を並べてみたら、12時26分27秒から40秒までのあいだに、目次のJSONがちょうど21個作られていました。

3. 「復元できません」と書かれているものの正体
3.1. 権限モードは会話の側に書かれている
通知の但し書きは、この2階建てを知ってから読むと素直です。
インポートで保たれるものとして挙がっているのは、会話履歴と、最後に実行した権限モードの二つ8。
会話履歴が戻るのは当たり前として、権限モードまで戻るのはなぜか。.jsonl の各行を見ると、permissionMode という項目が毎回書き込まれていました。
そのときどういう権限で動いていたかが、会話の記録そのものに刻まれている。
だから目次を失っても、本文の最後の行を読めば分かります9。
作業フォルダもブランチ名も同じように行の中にあるので、目次を作り直すのに必要な材料はだいたい揃っている。
3.2. アーカイブと権限付与は一覧の側にしかない
戻らないと書かれている二つは、逆でした。
アーカイブしたかどうかを表す isArchived は、目次のJSONにはありますが、.jsonl を端から端まで探しても出てきません10。
「このコマンドは今後も許可」と答えた記録も同じで、alwaysAllowedReasons や sessionPermissionUpdates という項目は目次の側にしかない11。
アプリが自分の都合で持っている情報なので、会話の記録には書かれていないのです。
目次の行が消えたとき、本文から作り直せるのは本文に書いてあることだけ。
アーカイブも権限付与も、本文に一度も書かれていないので、作り直しようがありません。
「復元できません」は諦めの表明ではなく、どこに何を書いているかの説明でした。
これは、権限の付与が会話の外側に置かれているということでもあります。
うっかり広い権限を与えたまま忘れていた、という状態は会話に残らない。
むしろ安全側に倒した作りだと思います。
4. ターミナルで始めた会話が、アプリに出てこない理由
通知の文面に戻ります。
「ターミナルから開始したセッション」が一覧に出ないのは、ターミナルの claude が目次を書かないからです12。
ターミナルで動く Claude Code は、CLI(Command Line Interface:コマンドラインインターフェース)として単体で完結しています。
会話の本文は .claude/projects/ に積むけれど、アプリ用の目次は作らない。
アプリを介さずに使えるという長所と、アプリの一覧に出てこないという短所が、同じところから出ています。
「このコンピュータにインストールされている Claude の他のコピー」という言い方も、実物を見ると腑に落ちました。
アプリの保存場所には claude-code というフォルダがあって、その下にバージョン番号ごとの Claude Code が丸ごと置いてあります。
手元の環境では2つのバージョンが同居していました。
アプリは自分用の Claude Code を抱えていて、ターミナルに入れたものとは別物。
それでも本文の置き場は共通なので、どちらで動かしても記録は同じ場所に積まれます13。
目次のほうは、組織IDとアカウントIDでフォルダが分かれていました。
仕事用と個人用でアカウントを切り替えると、本文は混ざったまま、目次だけが別になる。
「他の組織のセッション」が拾えてしまうという注意書きは、この階層を見ると意味が分かります。
普段は気にせず使っている道具でも、通知ひとつをきっかけに中を開けてみると、なぜそう作られているかが見えてきます。
会話を残す役目と、会話を並べる役目を分けたから、ターミナルとアプリの両方から同じ記録を触れる。
そのかわり、片方にしか無い情報は片方が消えると戻らない。
どちらを取るかを決めた跡が、あの通知文の但し書きだったのだと思います。
- セッションは、プロジェクトのフォルダに結びついた保存済みの会話のことです。作業しているあいだ手元に保存され続けるので、終了したあとでも再開できます。 – Manage sessions
- 公式のドキュメントにも、デスクトップアプリ、ウェブ版、VS Code拡張は、それぞれが独自のセッション履歴を持つと明記されています。 – Manage sessions
- 作業ディレクトリのパスの、英数字以外の文字をハイフンに変換した名前が使われます。変換後が200文字を超える場合は、200文字に切り詰めたうえで元のパスのハッシュを付け足します。 – Manage sessions
- 1行に1つのJSON値をUTF-8で並べていく形式です。行ごとに独立して読めるので、全体を読み込まなくても1件ずつ処理でき、記録やログに向いています。 – JSON Lines
- 各行はメッセージ、ツールの実行、メタ情報のいずれかのJSONオブジェクトです。この形式はClaude Code内部のもので版が変わると変化するため、直接読むスクリプトは更新で壊れることがあると注意書きがあります。 – Manage sessions
- アプリが自分の支援ファイルを置く場所として、Appleがガイドで定めているディレクトリです。設定やキャッシュとは別に、アプリ固有のデータを入れておく想定になっています。 – macOS Library Directory Details
- アプリで始めた会話の本文も、同じ
projects/の下に置かれます。ただし保存期間の扱いは違い、コマンドライン側の記録は既定で30日たつと消えるのに対し、アプリで始めた記録は年齢の制限なく残ります。 – Explore the .claude directory - 権限モードには、すべての操作に確認を求めるManual、編集だけ自動で通すacceptEdits、読み取りしかしないplan、確認を飛ばすbypassPermissionsなどがあります。 – Choose a permission mode
- ターミナルから会話を再開したときも、そのセッションがいた権限モードが復元されます。ただしセッション選択の画面から選んだ場合は復元されず、新しく始めたときと同じモードになります。 – Manage sessions
- アプリでのアーカイブは、サイドバーで会話にカーソルを乗せると出るアイコンから行います。プルリクエストがマージまたはクローズされたときに自動でアーカイブする設定もあります。 – Desktop application
- このセッションだけの許可は、同じプロセスの中で会話を枝分かれさせたときは引き継がれますが、別のプロセスとして分岐させると引き継がれず、付け直しになります。 – Manage sessions
- アプリの中のClaudeが把握できるのも、アプリ自身が動かしているセッションだけです。ターミナルやVS Code拡張から始めたセッションは、同じプロジェクトのものでも見えないと説明されています。 – Desktop application
- この記録は暗号化されていません。OSのファイル権限だけが保護になるので、ツールが設定ファイルを読んだり、コマンドが認証情報を表示したりすると、その値もそのまま記録に残ります。 – Explore the .claude directory