Compartment: офлайн-зашифрована пам’ять агента
Compartment шифрує пам’ять агента на вашій машині й працює без мережі. Дізнайтеся, які загрози це покриває та що станеться після втрати ключа.
Що Compartment робить інакше
Compartment — це сховище пам’яті агента, яке шифрує кожен запис на машині, де його створено, і ніколи не звертається до мережевого сервісу. Дві особливості відрізняють його від інших рішень для пам’яті агентів. Сховище — це один зашифрований файл, який відкривається лише вашою парольною фразою, а створення embedding-вектора виконується локально. Тому текст спогаду нікуди не передається для перетворення на вектор. Версію 4.6.0 опубліковано 10 August 2026, ліцензія — Apache-2.0, а встановлення виконується з PyPI. Пізніше вийшли нові релізи, і станом на 12 October 2026 остання версія на PyPI — 4.11.0 від 30 September 2026. У цьому посібнику використовується саме 4.6.0.
Це твердження про модель загроз, тому в цьому посібнику його розглянуто саме так. Шифрування даних у стані спокою та автономна робота захищають певний перелік речей. Інші речі залишаються незахищеними, і саме в цій зоні виникають проблеми під час експлуатації.
У цьому посібнику використано власну документацію проєкту для версії 4.6.0, повторно переглянуту 12 October 2026. Compartment постачається з desktop application, пунктом у menu bar на macOS та піктограмою в notification area на Windows, а також із command line tool. Запит парольної фрази неможливо обробити з автоматизованого контейнера. Наведене далі слід сприймати як задокументовану поведінку, а не як поведінку, виміряну в цьому посібнику. Запустіть це на резервній машині, перш ніж довіряти йому реальні дані.
Що насправді захищає шифрування даних у стані спокою
Сховище захищене шифром XChaCha20-Poly1305, тобто алгоритмом AEAD (authenticated encryption with associated data), а слоти ключів, у яких зберігається головний ключ, обгортаються за допомогою Argon2id — функції хешування паролів, розробленої так, щоб працювати повільно й потребувати багато пам’яті. З цього випливають два наслідки. Копія файлу на викраденому диску, у старій резервній копії або прикріплена до запиту в службу підтримки є лише набором байтів і нічим більше. А зміна навіть одного біта спричиняє помилку автентифікації під час відкриття файлу, тому пошкодження проявляється як явна помилка, а не як неправильний результат.
Вектори embedding також зашифровані, і це важливіше, ніж може здаватися. Embedding — це не хеш. Дослідження інверсії embedding показали, що з самого вектора можна відновити фрагменти вихідного тексту, які можна прочитати. Тому незашифрований індекс векторів поруч із зашифрованою базою даних майже рівнозначний тому, щоб залишити базу даних відкритою. Compartment не записує незашифрований індекс на диск.
Видалення є справжнім видаленням. Кожен запис має власний ключ, а compartment forget --shred знищує цей ключ, тому залишений шифротекст не може розшифрувати ніхто, зокрема й ви. Для порівняння, рядок, видалений із файлу бази даних, зазвичай залишається доступним для читання у вільних сторінках, доки їх не буде перезаписано.
Офлайн-режим — інша важлива складова. Дані нікуди не передаються, тому немає облікового запису постачальника, у якому зберігаються ваші спогади, і немає API key, який може їх розкрити.
Що Compartment не захищає
Захист припиняється на межі сховища, а ця межа ближча, ніж здається.
Агент читає відкритий текст. Recall розшифровує пам’ять і передає текст агенту. Якщо цей агент працює на hosted model, пам’ять передається провайдеру моделі в наступному prompt, так само як і всі інші дані у вікні контексту. Шифрування даних у стані спокою захищає файл. Воно не захищає процес отримання даних. Тому правила зберігання секретів поза AI-агентами не стають менш важливими через шифрування сховища: пароль, збережений як пам’ять, — це пароль, який ви автоматично вставляєте в prompt.
Розблоковане сховище на запущеній машині відкрите. У примітках із безпеки проєкту це прямо зазначено. Поки сховище розблоковане, master key і робочий набір перебувають у RAM, Python не може гарантувати очищення буфера, а swap або образ гібернації можуть записати ці дані на диск. Шкідливому програмному забезпеченню, яке працює від імені вашого користувача, не потрібно зламувати шифр, оскільки воно може звернутися до вже розблокованого сховища.
Ідентичність викликача задається декларативно. Дозволи namespace можна обмежити для кожного викликача, але ім’я викликача надходить від host-процесу. Тому host, який повідомляє неправдиве ім’я, отримує дозволи, на які він претендує. Дозволи namespace — це механізм організації, а не межа безпеки проти шкідливої локальної програми.
Безпечне видалення не охоплює копії. forget --shred знищує ключ усередині поточного файлу. Резервна копія, створена до безпечного видалення, все ще містить цей запис і відкривається за допомогою passphrase, яка діяла того дня.
Слабка passphrase припиняє обговорення. Argon2id робить кожну спробу дорогою. Він не захистить passphrase, яка є у списку слів.
Встановлення Compartment із зафіксованого релізу
Для Compartment потрібен Python 3.11 або новіший. Проєкт швидко розвивається: у період із 26 July до 10 August 2026 на PyPI вийшло 23 релізи, а до 12 October 2026 їх кількість зросла до 35. Тому зафіксуйте версію, а не встановлюйте ту, яка буде актуальною в день інсталяції.
python3 --version
pip install "compartment==4.6.0"
compartment --version
compartment initcompartment --version має вивести зафіксовану вами версію. Якщо shell відповідає compartment: command not found, каталог встановлення відсутній у вашому PATH. У більшості систем це ~/.local/bin. pipx install compartment==4.6.0 і uv tool install compartment==4.6.0 не мають цієї проблеми, оскільки самостійно керують власними шляхами.
compartment init двічі запитує парольну фразу та нічого не виводить під час введення. Ця парольна фраза є єдиним ключем. Проєкт не створює ані пароля, ані фрази відновлення. Це зроблено навмисно: програмне забезпечення не зберігає жодних облікових даних, яких немає у вас.
Перевірте результат, перш ніж підключати до нього будь-які компоненти.
compartment statusСправне сховище повідомляє, що його розблоковано. Якщо воно повідомляє, що заблоковане, виконайте compartment unlock і введіть парольну фразу. Після перезапуску сховище знову блокується, оскільки облікові дані, які підтримують його відкритим, залежать від секрету, створеного під час кожного завантаження. У macOS параметр compartment unlock --keychain дає змогу зберегти цей стан після перезавантаження, зберігаючи облікові дані в системному keychain.
Де фактично зберігаються дані
Сховище за замовчуванням — ~/.compartment/memory.vault. Вкажіть інший шлях за допомогою --vault PATH у будь-якій команді або змінної середовища COMPARTMENT_VAULT.
Цей один файл і є всім сховищем. На початку міститься заголовок із версією формату та keyslot Argon2id, далі — зашифрований payload, а після нього — записи журналу, які додаються в міру появи нових спогадів. Кожен запис журналу містить власну довжину та CRC (циклічну перевірку надлишковості) цієї довжини, тому запис, перерваний через збій, розпізнається як обрізаний, а не читається як дані. Під час compaction сховище серіалізується, записується до тимчасового файла, для нього виконується fsync, після чого файл перейменовується на потрібний шлях. Тому читач ніколи не бачить частково записаного сховища.
Практичний наслідок: backup script копіює лише один шлях. Незручність у тому, що виконати grep для цього файла не можна, як і виправити його в текстовому редакторі. Якщо вам потрібні спогади, які можна читати за допомогою cat і додавати до git, звичайні локальні файли пам’яті Memmy є протилежним компромісом. Обидва варіанти обґрунтовані — залежно від того, чого ви більше остерігаєтеся: викраденого ноутбука чи інструмента, який дає збій.
compartment uninstall видаляє software, але зберігає сховище. Передавайте --purge лише тоді, коли справді цього хочете.
Підключення до агента
Одна команда підключає підтримуваний клієнт.
compartment integrate --list
compartment integrate claudeДля Claude Code вона додає запис сервера MCP (model context protocol) і hook PostToolUse у ~/.claude/settings.json, попередньо створює резервну копію файлу, встановлює skill /compartmentalize у ~/.claude/skills/ і додає керований блок до ~/.claude/CLAUDE.md. Цей блок повідомляє агенту, що Compartment має пріоритет над файловою пам’яттю, яку агент використовував раніше. Перевірте обидві частини:
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 зберігає у своїх файлах пам’яті, оскільки імпорт нотаток за рік до нового сховища призводить до його заповнення даними, які ніхто не планував зберігати.
Наскільки швидке локальне сховище
Нижче наведено показники, опубліковані проєктом для сховища персонального розміру. Вони взяті з його документації, а не отримані під час запуску тут.
Дані, на яких побудовано графік
[
{
"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
}
]Збереження одного спогаду займає 40 мс, а пошук за векторами серед двадцяти тисяч записів — 0.68 мс для 95-го перцентиля. Аргумент проєкту на користь локального зберігання пам’яті ґрунтується на простому розрахунку: один мережевий обмін із розміщеним API пам’яті часто займає більше часу, ніж медіана повного гібридного пошуку тут, яка становить 11.6 мс.
Показники пошуку пояснюють дві особливості проєктування. Для сховищ менш ніж із двадцятьма тисячами записів Compartment порівнює запит із кожним вектором. Тому повнота пошуку гарантовано є точною, а не приблизною. Після перевищення цього обсягу система перемикається на HNSW (hierarchical navigable small world) — приблизний індекс, який обмінює незначне зниження повноти пошуку на вищу швидкість. Сховище також записує SHA-256 хеш моделі embedding і відмовляється відкриватися з іншою моделлю. Вектори двох різних моделей можна порівнювати без появи будь-якої помилки, але отримані оцінки не матимуть сенсу.
Резервні копії та копія, яку можна відкрити наступного року
Заблоковане сховище — це один переносний файл, тому його переміщення є копіюванням.
compartment lock
scp ~/.compartment/memory.vault other-machine:
compartment --vault memory.vault unlockСпочатку заблокуйте його. Якщо копіювати файл, поки агент записує дані, до копії може потрапити незавершений запис журналу. CRC-фреймування дає змогу пропустити цей фрагмент у кінці, але дані в ньому буде втрачено. compartment lock --sign запечатує файл маніфестом Ed25519, тому приймальна машина може перевірити цілісність копії без доступу до парольної фрази.
Оскільки файл уже запечатано, звичайне хмарне сховище є прийнятним місцем для його зберігання. Саме тут шифрування даних у стані спокою безпосередньо виправдовує себе: цільове сховище резервної копії ніколи не отримує доступу до даних пам’яті.
Є два застереження. Безпечне видалення не поширюється на резервні копії, тому запис, який ви сьогодні видалили криптографічно, залишатиметься доступним у копії за минулий тиждень для будь-кого, хто має парольну фразу за минулий тиждень. А compartment export --plaintext записує все сховище без шифрування. Це правильний інструмент для міграції на інше рішення, але такий файл не можна залишати в ~/Downloads.
Зберігайте небагато копій і додавайте до них дати. Сховище даних пам’яті стає відповідальністю, якщо його ніхто не очищає. Саме це пояснює чому застарілі спогади агента непомітно погіршують пошук.
Обробка ключів, їх ротація та другий фактор
compartment rekey
compartment 2fa enable
compartment 2fa statusrekey змінює парольну фразу, повторно обгортаючи головний ключ у keyslot поточного файла. Старі копії зберігають стару парольну фразу, оскільки ці байти було запечатано до зміни, і жоден механізм не повертається до них для редагування. Також ротуйтe копії або прийміть, що застаріла парольна фраза все ще відкриває певні дані.
2fa enable додає keyfile як другий фактор. Під час виведення ключа його комбінують із парольною фразою, тому для відкриття vault потрібні обидва компоненти. Це також удвічі збільшує кількість об’єктів, які можна втратити. Зберігайте keyfile не на тій машині, де розміщено vault.
Для скриптів і CI (continuous integration) парольна фраза може надходити через змінну середовища COMPARTMENT_PASSPHRASE, а unlock --passphrase-stdin зчитує її з pipe. Надавайте перевагу pipe. Змінні середовища доступні для читання іншим процесам, запущеним від імені того самого користувача, і часто потрапляють до журналів завдань.
Історія аудиту має ланцюжок хешів, а compartment audit verify проходить його та повідомляє про перше пошкоджене посилання. Запускайте цю перевірку після кожного відновлення, оскільки саме тоді виявляється файл, непомітно обрізаний під час копіювання.
Що станеться, якщо ви втратите парольну фразу
Нічого не станеться — так і задумано. Скидання немає, фрази відновлення немає, і немає адреси, яку можна записати, оскільки жодної копії ключа не існує поза вашою пам’яттю та необов’язковим keyfile. Сховище залишається файлом із випадковим набором байтів.
Тому план відновлення стосується не сховища, а парольної фрази. У день запуску compartment init збережіть її в password manager. Потім перевірте її: заблокуйте сховище, розблокуйте його, використовуючи лише записані дані, і після успішної перевірки дозвольте agent почати його заповнювати.
Compartment чи memory server
Compartment за задумом працює на одній машині. Обмін між машинами означає копіювання заблокованого файлу або його експорт та імпорт. Кілька агентів на одній машині можуть одночасно використовувати одне сховище, оскільки advisory file lock послідовно серіалізує їхні операції запису. У документації нічого не сказано про запис у один файл із двох машин, тому не підключайте ноутбук і робочу станцію до одного сховища через network share або sync folder.
Коли кільком машинам одночасно потрібна одна й та сама пам’ять, це завдання для сервера. Self-hosted memory server Mem0 на VPS вирішує його: один endpoint, багато клієнтів і пам’ять, яка переживає заміну ноутбука. Ціну цього рішення потрібно назвати прямо. На сервері працює процес, який може читати дані, що він зберігає, тому до вашої моделі загроз додаються VPS і всі, хто може отримати доступ до його API.
Вибирайте рішення відповідно до втрати, якої ви насправді побоюєтеся. Якщо це викрадення ноутбука або доступ постачальника до ваших нотаток, зашифроване локальне сховище є надійнішим варіантом. Якщо це агент, який забуває все одразу після переходу на іншу машину, потрібен сервер.
FAQ
Що насправді захищає шифрування Compartment?
Воно захищає файл. Сховище зашифровано за допомогою XChaCha20-Poly1305, його keyslots обгорнуто з використанням Argon2id, а embedding-вектори також зашифровано. Тому викрадений диск або стара резервна копія міститимуть лише байти, з яких неможливо прочитати дані. Шифрування не захищає розблоковане сховище на запущеній машині, оскільки під час його відкриття master key перебуває в RAM. Воно також не визначає, що агент робить зі спогадом після повернення його у відкритому вигляді.
Якщо Compartment працює автономно, чи залишаються мої спогади приватними від постачальника моделі?
Лише до моменту їхнього отримання. Зберігання та пошук виконуються без мережі, а embedding model працює локально, тому під час запису дані не залишають машину. Під час читання агент отримує дані у відкритому вигляді. Якщо цей агент використовує hosted model, спогад потрапляє в prompt і передається постачальнику так само, як решта контексту. Ніколи не зберігайте облікові дані як спогад.
Що станеться, якщо я втрачу парольну фразу Compartment?
Сховище буде невідновлюваним. Це зроблено навмисно. Compartment не створює seed або фразу відновлення та не зберігає облікових даних, яких немає у вас, тому скинути їх неможливо. Збережіть парольну фразу в password manager, тримайте будь-який 2FA keyfile поза машиною, на якій зберігається сховище, і переконайтеся, що можете розблокувати копію, перш ніж зберігати в сховищі дані, втрату яких ви б не хотіли допустити.
Чи можуть дві машини спільно використовувати одне сховище Compartment?
Не одночасно. Заблоковане сховище — це один переносний файл. Задокументований порядок дій полягає в тому, щоб заблокувати його, скопіювати, а потім розблокувати на іншій машині за допомогою --vault. У документації описано advisory file lock, який серіалізує операції запису лише між агентами на одній машині. Про запис у один файл із двох машин там нічого не сказано, тому вважайте таку конфігурацію способом втратити спогади. Якщо це потрібно, запустіть memory server.