Compartment: офлайн-зашифрована пам’ять агента
Compartment шифрує пам’ять агента на вашій машині й працює без мережі. Дізнайтеся, які загрози це покриває та що станеться після втрати ключа.
Що Compartment робить інакше
Compartment — це сховище пам’яті агента, яке шифрує кожен запис на машині, де його створено, і не підключається до мережевого сервісу. Від решти систем пам’яті агентів його відрізняють два рішення. Сховище — це один зашифрований файл, який можна відкрити лише за допомогою вашої парольної фрази, а крок створення embedding виконується локально. Тому текст пам’яті нікуди не надсилається для перетворення на вектор. Версію 4.6.0 опубліковано 10 August 2026. Ліцензія — Apache-2.0. Пакет встановлюється з PyPI.
Це твердження про модель загроз, тому в цьому посібнику його розглянуто саме так. Шифрування даних у стані спокою та автономна архітектура захищають від конкретного переліку загроз. Вони не усувають інші ризики, і саме в цій області виникають проблеми під час подальшої експлуатації.
Цей посібник спирається на власну документацію та нотатки про випуски проєкту, опрацьовані 11 August 2026. Compartment постачається з настільною програмою, елементом у рядку меню macOS і піктограмою в області сповіщень Windows, а також із командним інструментом. Запит парольної фрази не можна обробити з автоматизованого контейнера. Нижче описано задокументовану поведінку, а не результати вимірювань у цьому посібнику. Спочатку запустіть програму на резервній машині, перш ніж довіряти їй реальні дані.
Що насправді захищає шифрування даних у стані спокою
Сховище захищене шифром 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 або новіший. Проєкт швидко розвивається: станом на 10 August 2026 у PyPI вже доступно тридцять версій, тому зафіксуйте версію замість встановлення поточної версії на момент інсталяції.
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 двічі запитує passphrase і нічого не виводить. Ця passphrase є єдиним ключем. Проєкт не створює password або recovery phrase. Це зроблено навмисно: програмне забезпечення не зберігає жодних облікових даних, яких немає у вас.
Перевірте результат, перш ніж підключати до нього будь-які компоненти.
compartment statusСправне сховище повідомляє, що його розблоковано. Якщо воно повідомляє, що заблоковане, виконайте compartment unlock і введіть passphrase. Після перезапуску сховище знову блокується, оскільки облікові дані, що підтримують його відкритим, залежать від секрету, створеного під час кожного boot. У 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 зберігає у своїх файлах пам’яті, оскільки імпорт нотаток за рік до нового сховища призводить до його заповнення даними, які ніхто не планував зберігати.
Наскільки швидке локальне сховище
Нижче наведено показники, опубліковані проєктом для сховища персонального розміру. Вони взяті з його документації, а не отримані під час запуску тут.
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
}
]Збереження одного спогаду займає 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 почати його заповнювати.
Компартмент чи memory server
Compartment за задумом призначений для однієї машини. Спільне використання означає копіювання зашифрованого файла або його експорт та імпорт. Паралельного запису немає, тому ноутбук і робоча станція, які працюють з одним файлом, перезаписуватимуть зміни одне одного.
Коли кільком машинам одночасно потрібна одна й та сама пам’ять, це вже завдання для сервера. Self-hosted memory server Mem0 на VPS вирішує його: одна кінцева точка, багато клієнтів і пам’ять, яка не залежить від ноутбука. Важливо чітко розуміти ціну. Цей сервер запускає процес, який може читати дані, що він зберігає. Тому до вашої моделі загроз тепер входять VPS і всі, хто може звернутися до його API.
Вибирайте варіант залежно від ризику, якого ви справді побоюєтеся. Якщо це викрадення ноутбука або читання ваших нотаток постачальником, сильнішим варіантом буде зашифроване локальне сховище. Якщо проблема полягає в тому, що агент забуває все одразу після переходу на іншу машину, потрібен сервер.
FAQ
Що саме захищає шифрування Compartment?
Воно захищає файл. Сховище захищене за допомогою XChaCha20-Poly1305, його keyslot обгорнуті за допомогою Argon2id, а embedding-вектори також зашифровані. Тому після викрадення диска або отримання старої резервної копії ви побачите лише байти, що не містять нічого читабельного. Шифрування не захищає розблоковане сховище на запущеній машині, оскільки під час його відкриття master key зберігається в RAM. Воно також не визначає, що агент робить із пам’яттю після повернення її у відкритому вигляді.
Якщо Compartment працює офлайн, чи залишаються мої спогади приватними від постачальника моделі?
Лише до моменту їх отримання. Зберігання та пошук виконуються без мережі, а embedding-модель працює локально, тому під час запису дані не залишають машину. Під час читання агент отримує відкритий текст. Якщо агент використовує hosted model, спогад потрапляє в prompt і передається постачальнику разом з рештою контекстного вікна. Ніколи не зберігайте облікові дані як спогад.
Що станеться, якщо я втрачу passphrase Compartment?
Сховище неможливо відновити — це зроблено навмисно. Compartment не генерує seed або recovery phrase і не зберігає облікових даних, яких немає у вас. Тому скинути passphrase неможливо. Збережіть passphrase у password manager, тримайте будь-який 2FA keyfile не на тій машині, де зберігається сховище, і перевірте, що можете розблокувати копію, перш ніж помістити до сховища дані, втрату яких ви не хотіли б допустити.
Чи можуть дві машини спільно використовувати одне сховище Compartment?
Не одночасно. Заблоковане сховище є одним портативним файлом. Документований порядок дій: заблокувати його, скопіювати, а потім розблокувати на іншій машині за допомогою --vault. Паралельного доступу немає, тому запис із двох машин в один файл призведе до втрати спогадів. Якщо це потрібно, запустіть memory server.