Compartment: локальное шифрование памяти агента
Узнайте, как работает Compartment для защиты данных агента в офлайн-режиме. Разбираем модель угроз, риски потери ключа шифрования и особенности работы версии 4.6.0 на ПК.
Отличительные особенности Compartment
Compartment — это хранилище памяти агента, которое сохраняет каждую запись в зашифрованном виде на машине, где она была создана, и никогда не взаимодействует с сетевыми службами. Два решения выделяют его на фоне остальных инструментов для работы с памятью агентов. Хранилище представляет собой единый запечатанный файл, который открывается только вашей кодовой фразой, а этап создания эмбеддингов выполняется локально, поэтому текст записи никогда не отправляется на внешние ресурсы для векторизации. Версия 4.6.0 была выпущена 10 августа 2026 года, распространяется под лицензией Apache-2.0 и устанавливается из PyPI.
Это утверждение относится к модели угроз, поэтому данное руководство рассматривает его именно так. Шифрование данных в состоянии покоя в сочетании с автономной архитектурой защищают определенный перечень объектов. При этом другие аспекты остаются уязвимыми, и именно в этом разрыве возникают проблемы второго дня эксплуатации.
Данное руководство основано на документации проекта и примечаниях к релизу, изученных 11 августа 2026 года. Compartment поставляется в виде настольного приложения, элемента строки меню в macOS и значка в области уведомлений в Windows, дополняя инструмент командной строки. Запрос кодовой фразы невозможно автоматизировать в контейнере. Рассматривайте изложенное ниже как задокументированное поведение, а не как результат собственных измерений. Запустите его на тестовой машине, прежде чем доверять ему реальные данные.
Что на самом деле защищает шифрование данных в состоянии покоя
Хранилище запечатано с помощью XChaCha20-Poly1305 — шифра AEAD (аутентифицированное шифрование с ассоциированными данными), а слоты ключей, содержащие мастер-ключ, защищены Argon2id — функцией хеширования паролей, спроектированной как медленная и ресурсоемкая по памяти. Из этого следуют два вывода. Копия файла на украденном диске, в старой резервной копии или прикрепленная к тикету в техподдержку — это просто набор байтов. Кроме того, изменение даже одного бита приводит к сбою аутентификации при открытии файла, поэтому повреждение данных превращается в явную ошибку, а не в выдачу неверного результата.
Векторы эмбеддингов также зашифрованы, и это важнее, чем кажется на первый взгляд. Эмбеддинг — это не хеш. Исследования в области инверсии эмбеддингов показали, что можно восстановить читаемые фрагменты исходного текста только на основе вектора. Поэтому индекс векторов в открытом виде, лежащий рядом с зашифрованной базой данных, по сути равносилен отсутствию защиты. Compartment не записывает на диск индексы в открытом виде.
Удаление является полным. Каждая запись имеет собственный ключ, и compartment forget --shred уничтожает этот ключ, поэтому оставшийся зашифрованный текст не может быть расшифрован никем, включая вас. Сравните это со строкой, удаленной из файла базы данных: обычно она остается читаемой на свободных страницах до тех пор, пока не будет перезаписана другими данными.
Автономность — это вторая важная составляющая. Никакие данные не выгружаются в облако, поэтому нет учетной записи поставщика, хранящей ваши данные, и нет API key, утечка которого могла бы их скомпрометировать.
Что не защищает Compartment
Действие защиты ограничено границами хранилища, и эти границы ближе, чем кажется.
Агент считывает открытый текст. Recall расшифровывает данные из памяти и передает текст агенту. Если этот агент является облачной моделью, память отправляется провайдеру модели в составе следующего промпта, точно так же, как и любые другие данные в контекстном окне. Шифрование в состоянии покоя защищает файл. Оно не защищает процесс извлечения данных. Поэтому правила, описанные в как не допустить попадания секретов в AI-агенты, не теряют актуальности из-за того, что хранилище зашифровано: пароль, сохраненный в памяти, — это пароль, который вы автоматически вставляете в промпт.
Разблокированное хранилище на работающей машине открыто. В примечаниях по безопасности проекта об этом сказано прямо. Пока хранилище разблокировано, мастер-ключ и рабочий набор данных находятся в оперативной памяти. Python не может гарантировать очистку буфера, а файл подкачки или образ гибернации могут записать содержимое памяти на диск. Вредоносному ПО, запущенному от имени вашего пользователя, не нужно взламывать шифр, так как оно может обратиться к уже разблокированному хранилищу.
Идентификация вызывающего процесса декларативна. Пространства имен (namespaces) можно ограничивать для каждого вызывающего процесса, но имя вызывающего процесса поступает от хост-процесса. Поэтому хост, который сообщает ложное имя, получает те права, на которые претендует. Права доступа в пространстве имен — это способ организации, а не граница безопасности против враждебной локальной программы.
Уничтожение данных не затрагивает копии. forget --shred уничтожает ключ внутри текущего файла. Резервная копия, созданная до уничтожения, по-прежнему содержит эту запись и открывается с помощью парольной фразы, актуальной на тот день.
Слабая парольная фраза сводит защиту на нет. Argon2id делает каждый вариант перебора затратным. Однако это не спасает парольную фразу, которая присутствует в словаре.
Установка Compartment из зафиксированного релиза
Для работы Compartment требуется Python 3.11 или более поздняя версия. Проект развивается быстро: к 10 августа 2026 года на PyPI было выпущено тридцать версий, поэтому фиксируйте версию вместо использования той, что является актуальной на день установки.
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 дважды запрашивает кодовую фразу и не отображает ввод на экране. Эта фраза является единственным ключом. Проект не генерирует пароли или фразы восстановления, и это сделано намеренно: программное обеспечение не хранит никаких учетных данных, которыми не владели бы вы сами.
Проверьте результат перед тем, как подключать к нему какие-либо компоненты.
compartment statusИсправное хранилище сообщает, что оно разблокировано. Если оно сообщает, что заблокировано, выполните compartment unlock и введите кодовую фразу. Перезагрузка снова блокирует его, так как учетные данные, поддерживающие хранилище открытым, зависят от секрета, генерируемого при каждой загрузке. В macOS команда compartment unlock --keychain позволяет сохранить состояние после перезагрузки, помещая эти учетные данные в системную связку ключей.
Где фактически хранятся данные
Хранилище по умолчанию находится в ~/.compartment/memory.vault. Укажите другой путь с помощью --vault PATH в любой команде или через переменную окружения COMPARTMENT_VAULT.
Этот единственный файл является всем хранилищем. Он открывается заголовком, содержащим версию формата и ключи Argon2id, затем следует зашифрованная полезная нагрузка, а после — записи журнала, добавляемые по мере появления новых воспоминаний. Каждая запись журнала обрамляется своей длиной и CRC (циклическим избыточным кодом) этой длины, поэтому запись, прерванная из-за сбоя, распознается как усеченная, а не считывается как данные. Уплотнение (compaction) сериализует хранилище, записывает временный файл, выполняет его fsync, а затем переименовывает его на место оригинала, что означает, что читающий процесс никогда не увидит частично записанное хранилище.
Полезное следствие: скрипт резервного копирования копирует ровно один путь. Неудобное следствие: вы не можете использовать grep для поиска в нем и не можете исправить его в текстовом редакторе. Если вам нужны воспоминания, которые можно прочитать с помощью cat и закоммитить в git, обычные локальные файлы памяти Memmy представляют собой противоположный подход. Оба варианта разумны, в зависимости от того, чего вы опасаетесь больше: кражи ноутбука или поломки инструмента.
compartment uninstall удаляет программное обеспечение, сохраняя хранилище. Используйте --purge только в том случае, если вы действительно хотите удалить и данные.
Подключение к агенту
Одна команда подключает поддерживаемый клиент.
compartment integrate --list
compartment integrate claudeДля Claude Code, который записывает запись сервера MCP (model context protocol) и хук PostToolUse в ~/.claude/settings.json, предварительно создавая резервную копию файла, устанавливает навык /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 сравнивает запрос с каждым вектором, поэтому полнота поиска (recall) является точной по определению, а не приблизительной. При превышении этого порога система переключается на HNSW (hierarchical navigable small world) — индекс приближенного поиска, который жертвует незначительной долей точности ради скорости. Хранилище также записывает SHA-256 хеш модели эмбеддингов и отказывается открываться при использовании другой модели. Это необходимо, так как векторы, полученные с помощью разных моделей, можно сравнивать между собой без возникновения ошибок, однако возвращаемые при этом оценки не имеют смысла.
Резервные копии и файлы, которые можно открыть через год
Заблокированное хранилище представляет собой один переносимый файл, поэтому его перемещение — это просто копирование.
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 меняет парольную фразу путем повторного шифрования мастер-ключа в слоте текущего файла. Старые копии сохраняют прежнюю парольную фразу, так как эти байты были запечатаны до внесения изменений, и ничто не позволяет их отредактировать задним числом. Выполняйте ротацию и для копий, либо смиритесь с тем, что старая парольная фраза всё ещё открывает данные.
2fa enable добавляет файл ключа в качестве второго фактора, который объединяется с парольной фразой при деривации ключа, поэтому для открытия хранилища требуются оба компонента. Это также удваивает количество вещей, которые можно потерять. Храните файл ключа отдельно от машины, на которой находится хранилище.
Для скриптов и CI (continuous integration) парольная фраза может передаваться через переменную окружения COMPARTMENT_PASSPHRASE, а unlock --passphrase-stdin считывает её из канала (pipe). Отдавайте предпочтение каналу. Переменная окружения доступна для чтения другим процессам того же пользователя и часто попадает в логи заданий.
История аудита представляет собой хеш-цепочку, а compartment audit verify проходит по ней и сообщает о первом поврежденном звене. Запускайте эту проверку после любого восстановления, так как именно в этот момент проявляются незаметно усеченные файлы.
Что происходит при потере парольной фразы
Ничего не происходит, и это заложено в архитектуру. Функции сброса, фразы для восстановления или адреса службы поддержки не существует, так как копия ключа не хранится нигде, кроме вашей памяти и опционального файла ключа. Хранилище остаётся набором случайных байтов.
Поэтому план восстановления — это не план для хранилища. Это план для парольной фразы. Сохраните её в менеджере паролей в день выполнения compartment init. Затем протестируйте её: заблокируйте хранилище, разблокируйте его, используя только записанные данные, и только после успешной проверки разрешите агенту начать заполнение хранилища.
Compartment или сервер памяти
Compartment по своей архитектуре является одномашинным решением. Общий доступ подразумевает копирование заблокированного файла либо его экспорт и импорт. Параллельная запись не поддерживается, поэтому, если ноутбук и рабочая станция обращаются к одному файлу, они будут перезаписывать изменения друг друга.
Когда нескольким машинам требуется одновременный доступ к одной и той же памяти, возникает задача серверного уровня. Статья Собственный сервер памяти Mem0 на VPS предлагает решение: одна точка входа, множество клиентов и память, которая сохраняется после выключения ноутбука. Стоимость такого решения необходимо осознавать четко. Сервер запускает процесс, который может считывать хранимые данные, поэтому ваша модель угроз теперь включает в себя VPS и всех, кто имеет доступ к его API.
Выбирайте решение в зависимости от того, какой потери вы опасаетесь на самом деле. Если это кража ноутбука или чтение заметок провайдером, то зашифрованное локальное хранилище — более надежный вариант. Если же проблема в том, что агент «забывает» всё при переключении между устройствами, то правильным выбором будет сервер.
FAQ
Что именно защищает шифрование Compartment?
Оно защищает файл. Хранилище запечатано с помощью XChaCha20-Poly1305, его слоты ключей обернуты с использованием Argon2id, а векторы вложений также зашифрованы. В результате украденный диск или старая резервная копия будут содержать лишь нечитаемые байты. Это не защищает разблокированное хранилище на работающей машине, так как мастер-ключ находится в оперативной памяти, пока хранилище открыто. Кроме того, это не регулирует действия агента с памятью после того, как функция извлечения возвращает её в виде открытого текста.
Если Compartment работает офлайн, защищены ли мои воспоминания от провайдера модели?
Только до момента их извлечения. Хранение и поиск происходят без использования сети, а модель вложений работает локально, поэтому при записи данные не покидают машину. При чтении агент получает открытый текст. Если этот агент является облачной моделью, воспоминание попадает в промпт и передается провайдеру вместе с остальным контекстным окном. Никогда не храните учетные данные в качестве воспоминаний.
Что произойдет, если я потеряю парольную фразу от Compartment?
Хранилище невозможно восстановить, это сделано намеренно. Compartment не генерирует сид-фразу или фразу для восстановления и не хранит учетные данные, которыми не владеете вы, поэтому сбросить настройки невозможно. Сохраните парольную фразу в менеджере паролей, храните файл ключа 2FA отдельно от машины, на которой находится хранилище, и убедитесь, что можете разблокировать копию, прежде чем помещать в хранилище важные данные.
Могут ли две машины использовать одно хранилище Compartment?
Не одновременно. Заблокированное хранилище представляет собой единый переносимый файл. Документированный способ работы: заблокировать его, скопировать, а затем разблокировать на другой машине с помощью --vault. Одновременный доступ не поддерживается, поэтому при записи с двух машин в один файл воспоминания будут потеряны. Используйте сервер памяти, если вам необходим такой функционал.