Compartmentのオフライン暗号化は何を守る?鍵を失うとどうなる
Compartmentは自分のマシンだけでエージェントメモリを暗号化し、外部送信を防ぎます。Version 4.6.0の脅威モデル、守れる範囲、鍵を失った場合の扱いを確認します。
Compartment が異なる点
Compartment は、すべてのレコードを作成元のマシン上で暗号化して保持し、ネットワークサービスとは一切通信しないエージェント用メモリストアです。エージェント用メモリの分野で、他の製品と異なる点は2つあります。Vault は、パスフレーズでのみ開ける封印された1つのファイルです。また、埋め込み処理はローカルで実行されるため、メモリのテキストがベクトル化のために外部へ送信されることはありません。Version 4.6.0 は 10 August 2026 に公開され、ライセンスは Apache-2.0 です。PyPI からインストールできます。
これは脅威モデルに関する主張であるため、このガイドではその前提で扱います。保存時の暗号化とオフライン設計によって保護される対象は、明確に限定されています。一方で、保護されない対象もあります。その差が、運用開始後の問題につながります。
このガイドは、11 August 2026 に確認したプロジェクト独自のドキュメントとリリースノートに基づいています。Compartment にはデスクトップアプリケーション、macOS のメニューバー項目、Windows の通知領域アイコンがあり、コマンドラインツールも提供されています。パスフレーズのプロンプトは、自動化されたコンテナから操作できません。以下の内容は、ここで測定した動作ではなく、ドキュメントに記載された動作として扱ってください。実際のデータを任せる前に、予備のマシンで実行してください。
保存時の暗号化で実際に保護されるもの
Vault は XChaCha20-Poly1305 で封印されています。これは AEAD(associated data 付き認証暗号)方式の暗号です。マスターキーを保持する keyslot は Argon2id でラップされています。Argon2id は、処理に時間と大量のメモリを必要とするよう設計されたパスワードハッシュ関数です。
ここから2つのことが分かります。盗難されたディスク上のファイルのコピー、古いバックアップ、サポートチケットに添付されたファイルは、意味を持たないバイト列にすぎません。また、ファイルを開く際に1ビットでも反転していれば認証に失敗します。そのため、破損は誤った結果として現れるのではなく、明確なエラーになります。
Embedding ベクトルも暗号化されます。これは見た目以上に重要です。Embedding はハッシュではありません。Embedding inversion に関する研究では、ベクトルだけから元のテキストの読める断片を復元できることが示されています。そのため、暗号化されたデータベースの横に平文のベクトルインデックスを置くことは、データベースを開いたままにすることに近い状態です。Compartment は平文のインデックスをディスクに書き込みません。
削除は実際の削除です。各レコードは固有のキーを持ち、compartment forget --shred がそのキーを破棄します。そのため、残された暗号文は、あなた自身を含めて誰にも復号できません。これに対して、データベースファイルから削除した行は、通常、何かに上書きされるまで空きページに残り、読み取り可能です。
オフラインであることも、もう一つの重要な要素です。何もアップロードされないため、あなたの記憶を保持するベンダーアカウントは存在しません。また、それらを漏えいさせる可能性のある API key もありません。
Compartment が保護しないもの
この主張は vault の境界までしか及びません。その境界は、見た目より近い位置にあります。
エージェントは平文を読み取ります。 Recall はメモリを復号し、そのテキストをエージェントに渡します。そのエージェントがホスト型モデルの場合、メモリは、コンテキストウィンドウ内の他の情報と同様に、次の prompt に含まれてモデルプロバイダーへ送られます。保存時の暗号化によってファイルは保護されますが、取得処理は保護されません。そのため、AI エージェントから秘密情報を遠ざけるためのルールは、store が暗号化されているからといって緩和できません。メモリとして保存した password は、prompt へ自動的に貼り付けるよう設定した password と同じです。
実行中のマシンでロック解除された vault は開いています。 プロジェクトのセキュリティノートにも明記されています。vault のロックが解除されている間、master key と作業データは RAM に置かれます。Python はバッファが確実に消去されたことを保証できず、swap や hibernation image によってそのメモリがディスクへ書き出される場合もあります。ユーザー権限で動作する malware は暗号を破る必要がありません。すでにロック解除された vault にアクセスできるためです。
呼び出し元の識別情報は宣言に基づきます。 呼び出し元ごとに namespace を制限できますが、呼び出し元の名前は host process から渡されます。そのため、名前を偽る host には、申告した権限が付与されます。Namespace の権限は整理のための仕組みであり、悪意のあるローカルプログラムに対するセキュリティ境界ではありません。
コピーには shredding が及びません。 forget --shred は現在のファイル内にある key を破棄します。shred を実行する前に取得した backup には、そのレコードが残り、その時点の passphrase で引き続き開くことができます。
弱い passphrase では対策になりません。 Argon2id は、推測を1回行うためのコストを高くします。しかし、word list に含まれる passphrase を保護することはできません。
固定したリリースから Compartment をインストールする
Compartment には Python 3.11 以降が必要です。2026年8月10日時点で PyPI には30個のバージョンが公開されているなど、プロジェクトの更新は速いため、インストール時点の最新版を使うのではなく、バージョンを固定してください。
python3 --version
pip install "compartment==4.6.0"
compartment --version
compartment initcompartment --version で、固定したバージョンが表示されます。シェルが compartment: command not found と返す場合、インストール先のディレクトリが PATH に含まれていません。多くのシステムでは、そのディレクトリは ~/.local/bin です。pipx install compartment==4.6.0 と uv tool install compartment==4.6.0 は、それぞれ独自にパスを管理するため、この問題を回避できます。
compartment init では、パスフレーズを2回入力します。入力内容は表示されません。このパスフレーズだけが鍵です。プロジェクトはパスワードもリカバリーフレーズも生成しません。これは意図的な仕様です。ソフトウェアが保持し、利用者が把握していない認証情報は存在しません。
他の処理と接続する前に、結果を確認してください。
compartment status正常な vault では、ロック解除済みと表示されます。locked と表示された場合は、compartment unlock を実行してパスフレーズを入力してください。再起動すると、vault は再びロックされます。開いた状態を維持する認証情報が、ブートごとに生成される Secret に依存しているためです。macOS では、compartment unlock --keychain により、その認証情報をシステムキーチェーンに保存して再起動後も維持できます。
データが実際に保存される場所
デフォルトの vault は ~/.compartment/memory.vault です。任意のコマンドで --vault PATH を指定するか、COMPARTMENT_VAULT 環境変数を設定して別の場所を指定できます。
この 1 ファイルだけで、データストア全体を構成します。先頭には、フォーマットのバージョンと Argon2id の keyslot を含むヘッダーがあります。続いて暗号化された payload があり、その後ろに新しい memory が追加されるたびに journal エントリが追記されます。各 journal エントリには長さと、その長さに対する CRC (cyclic redundancy check) が付加されます。そのため、クラッシュによって書き込みが途中で中断されても、データとして読み込まず、途中で切れたエントリとして認識できます。compaction では vault をシリアライズして一時ファイルに書き込み、fsync してから所定の場所へ rename します。これにより、reader が書き込み途中の vault を読み取ることはありません。
実用上の利点は、バックアップスクリプトでコピーするパスが 1 つだけになることです。一方、grep で検索できず、テキストエディターで修復もできません。cat で読めて git に commit できる memory が必要なら、Memmy のプレーンなローカル memory ファイル が正反対の選択肢です。盗難された laptop を懸念するのか、壊れるツールを懸念するのかによって、どちらも妥当な選択です。
compartment uninstall は software を削除しますが、vault は保持します。明確な意図がある場合にだけ --purge を渡してください。
エージェントへの組み込み
1 つのコマンドで、対応クライアントを接続できます。
compartment integrate --list
compartment integrate claudeClaude Code の場合、MCP(model context protocol)サーバーのエントリと PostToolUse フックを ~/.claude/settings.json に書き込みます。先にファイルをバックアップします。続いて /compartmentalize スキルを ~/.claude/skills/ にインストールし、Compartment がエージェントの従来のファイルベースのメモリより優先されることを伝える管理ブロックを ~/.claude/CLAUDE.md に追加します。両方の結果を確認してください。
compartment hook status
compartment recentサーバーを手動で登録する場合は、次のコマンドを実行します。
claude mcp add --scope user compartment -- \
compartment --vault ~/.compartment/memory.vault --caller claude-code serveその他の MCP 対応ホストでも、ホスト固有の呼び出し元名を指定して同じサーバーを使用できます。
{ "mcpServers": { "compartment": {
"command": "compartment",
"args": ["--vault", "/path/to/memory.vault",
"--caller", "your-agent-name", "serve"] } } }各ホストには異なる --caller 値を指定してください。これは監査ログに記録されるラベルであり、名前空間の許可が関連付けられるキーでもあります。同じ名前を共有すると、どちらも役に立たなくなります。
Claude Code がすでに独自のメモリファイルへ事実を書き込んでいる場合、compartment import-claude --dry-run で、移行前に移行対象を確認できます。まず Claude Code がメモリファイルに保存する内容 を読んでください。1 年分のメモを新しいボールトへインポートすると、誰も残すつもりのなかった情報でメモリストアが満杯になるためです。
ローカル vault の処理速度
以下は、個人利用規模の vault についてプロジェクトが公開している数値です。ここで実行して得た結果ではなく、プロジェクトのドキュメントに基づいています。
The data behind this chart
[
{
"label": "Store one memory, end to end",
"latency_ms": 40
},
{
"label": "Embed one memory, bundled model",
"latency_ms": 25
},
{
"label": "Hybrid search, median",
"latency_ms": 11.6
},
{
"label": "Vector search at 20k records, p95",
"latency_ms": 0.68
}
]1 件のメモリの保存にかかる時間は 40 ms、20,000 件のレコードを対象とするベクトル検索は、95 パーセンタイルで 0.68 ms とされています。メモリをローカルに保持する理由について、プロジェクトは算術的な根拠を示しています。ホスト型のメモリ API へのネットワーク往復 1 回にかかる時間は、ここでの完全なハイブリッド検索の中央値である 11.6 ms を超えることが多いためです。
検索結果の数値は、2 つの設計によって説明できます。20,000 件未満のレコードでは、Compartment はすべてのベクトルとクエリを比較します。そのため、再現率は近似ではなく、設計上正確です。20,000 件を超えると、HNSW (hierarchical navigable small world) に切り替わります。これは近似インデックスで、再現率をわずかに下げて速度を上げます。vault は埋め込みモデルの SHA-256 ハッシュも記録し、異なるモデルでは開けないようにします。異なるモデルのベクトルを比較してもエラーが発生しない場合があり、返されるスコアが意味を持たなくなるためです。
バックアップと、来年も開けるコピー
ロック済みの vault は持ち運び可能な単一ファイルなので、移動することはコピーすることと同じです。
compartment lock
scp ~/.compartment/memory.vault other-machine:
compartment --vault memory.vault unlockまずロックしてください。agent が書き込み中にコピーすると、ジャーナルエントリの追記途中を取得する可能性があります。CRC のフレーミングにより、読み取り側は末尾の不完全な断片をスキップできますが、その中のメモリ内容は失われます。compartment lock --sign は Ed25519 マニフェストでファイルを封印するため、受信側のマシンはパスフレーズを知らなくても、コピーが完全な状態で届いたことを検証できます。
ファイルはすでに封印されているため、通常のクラウドストレージに保存しても問題ありません。ここで保存時暗号化の効果が直接現れます。バックアップ先がメモリ内容を見ることはありません。
注意点が2つあります。Shredding はバックアップには及ばないため、今日 crypto shred したレコードも、先週のパスフレーズを持つ人には先週のコピーから読み取れます。また、compartment export --plaintext は vault 全体を暗号化されていない状態で書き出します。これは別のシステムへ移行する場合には適切なツールですが、~/Downloads に残しておくファイルとしては不適切です。
コピーは少数に抑え、日付を付けてください。誰も整理しなくなると、メモリストアは負債になります。これは、古い agent メモリが検索結果を気付かないうちに汚染する理由を説明しています。古い agent メモリが気付かないうちに検索結果を汚染する理由
鍵の扱い、ローテーション、第 2 要素
compartment rekey
compartment 2fa enable
compartment 2fa statusrekeyは、現在のファイルの keyslot に master key を再ラップして、passphrase を変更します。変更前に作成した古いコピーでは、古い passphrase が引き続き使われます。変更前にそのバイト列が封印されており、後から編集されないためです。コピーもローテーションするか、廃止した passphrase で開けるコピーが残ることを受け入れてください。
2fa enableは keyfile を第 2 要素として追加します。keyfile は鍵導出時に passphrase と組み合わせられるため、vault を開くには両方が必要です。ただし、紛失する可能性のあるものも 2 つになります。keyfile は vault を保持するマシンとは別の場所に保管してください。
スクリプトや CI (continuous integration) では、passphrase を COMPARTMENT_PASSPHRASE 環境変数経由で渡し、unlock --passphrase-stdinは pipe から読み取れます。pipe を優先してください。環境変数は、同じユーザーが所有する他のプロセスから読み取れるうえ、job のログに残りやすいためです。
audit history は hash chain になっており、compartment audit verifyはそこをたどって最初に壊れたリンクを報告します。restore の後に実行してください。サイレントに切り詰められたファイルは、その時点で初めて判明するためです。
パスフレーズを失うとどうなるか
何も起こりません。それが設計上の動作です。リセット機能も、リカバリーフレーズも、書き留めるアドレスもありません。これは、鍵のコピーが記憶と任意の keyfile の外部に存在しないためです。vault は、ランダムに見えるバイト列のファイルとして残ります。
したがって、復旧計画は vault の計画ではありません。パスフレーズの計画です。compartment init を実行する日に、パスフレーズを password manager に記録してください。次にテストします。vault をロックし、書き留めた情報だけを使ってロックを解除します。解除できたら、agent に入力を開始させてください。
Compartment またはメモリサーバー
Compartment は、設計上 1 台のマシンで使用するものです。共有するにはロックされたファイルをコピーするか、エクスポートしてインポートする必要があります。ファイルへの同時書き込みには対応していないため、1 つのファイルを参照する laptop と workstation があると、互いの変更を上書きします。
複数のマシンで同じメモリを同時に使用する必要がある場合、それはサーバーの問題です。VPS 上に自己ホストする Mem0 メモリサーバーがこの要件に対応します。1 つのエンドポイントを複数のクライアントで利用でき、メモリは laptop を切り替えても保持されます。ただし、コストは明確に理解しておく必要があります。このサーバーでは、保存したデータを読み取れるプロセスが動作します。そのため、脅威モデルには VPS と、その API に到達できるすべてのユーザーが含まれます。
実際に避けたい損失を基準に選択してください。laptop の盗難や、ベンダーによるメモの読み取りが懸念であれば、暗号化されたローカルボルトの方が適しています。マシンを切り替えた瞬間にすべてを忘れるエージェントが問題であれば、サーバーを選択します。
FAQ
Compartmentの暗号化で実際に保護されるものは何ですか?
ファイルが保護されます。VaultはXChaCha20-Poly1305で封印され、keyslotはArgon2idでラップされます。embedding vectorも暗号化されるため、ディスクを盗まれたり古いバックアップが流出したりしても、読み取れるデータは残りません。ただし、実行中のマシンでロック解除されたVaultは保護されません。Vaultを開いている間はmaster keyがRAM上に存在するためです。また、recallの結果としてメモリがplaintextで返された後に、agentがそのメモリをどう扱うかも制御しません。
Compartmentがオフラインの場合、model providerからメモリを非公開にできますか?
recallされるまでに限り、非公開にできます。保存と検索はネットワーク接続なしで実行され、embedding modelもローカルで動作するため、書き込み時にデータがマシンの外へ出ることはありません。読み取り時にはagentがplaintextを受け取ります。そのagentがホスト型モデルの場合、メモリはpromptに入り、ほかのcontext windowの内容と同様にproviderへ送信されます。credentialをメモリとして保存しないでください。
Compartmentのpassphraseを失うとどうなりますか?
Vaultは意図的に復旧不能になります。Compartmentはseedやrecovery phraseを生成せず、利用者が保持していないcredentialも保持しないため、リセットする方法はありません。passphraseはpassword managerに保存してください。Vaultを保存するマシンとは別の場所に2FA keyfileを保管し、Vaultに失いたくないデータを入れる前に、コピーのロックを解除できることを確認してください。
2 台のマシンで1つのCompartment vaultを共有できますか?
同時には共有できません。ロックされたVaultは単一のportable fileです。文書化されている手順は、Vaultをロックし、コピーしてから、もう一方のマシンで--vaultを使用してロックを解除する方法です。並行アクセスには対応していないため、2 台のマシンから1つのファイルに書き込むとメモリが失われます。その場合はmemory serverを実行してください。