آموزش کار با Compartment برای رمزنگاری حافظه Agent
ابزار Compartment حافظه Agent را به صورت کاملا آفلاین و محلی رمزنگاری میکند. در این راهنما مدل تهدید نسخه 4.6.0 و پیامدهای فراموشی رمز عبور در این سیستم را بررسی میکنیم.
تفاوت عملکرد Compartment
Compartment یک حافظهٔ جانبی برای agent است که تمام رکوردها را روی همان ماشینی که ایجاد شدهاند رمزنگاری میکند و هرگز با هیچ سرویس شبکهای ارتباط برقرار نمیکند. دو ویژگی، این ابزار را از سایر حافظههای agent متمایز میکند. مخزن (vault) یک فایل مهر و موم شده است که فقط با رمز عبور شما باز میشود و مرحلهٔ embedding بهصورت محلی اجرا میگردد؛ بنابراین متن حافظه برای تبدیل به بردار (vector) هرگز به جایی ارسال نمیشود. نسخه 4.6.0 در تاریخ 10 August 2026 منتشر شد، مجوز آن Apache-2.0 است و از طریق PyPI نصب میشود.
این یک ادعا در مدل تهدید است، بنابراین این راهنما با آن به عنوان یک ادعا برخورد میکند. رمزنگاری در حالت سکون (at rest) به همراه طراحی آفلاین، از لیست مشخصی از موارد محافظت میکند. این طراحی موارد دیگری را باز میگذارد و همین شکاف، محل بروز مشکلات روز دوم (day two) است.
این راهنما از مستندات و یادداشتهای انتشار خود پروژه پیروی میکند که در تاریخ 11 August 2026 مطالعه شدهاند. Compartment یک اپلیکیشن دسکتاپ، یک آیتم در نوار منوی macOS و یک آیکون در ناحیه اعلان (notification area) ویندوز، در کنار ابزار خط فرمان خود ارائه میدهد و درخواست رمز عبور (passphrase prompt) را نمیتوان از یک کانتینر خودکار مدیریت کرد. آنچه در ادامه میآید را به عنوان رفتار مستندشده در نظر بگیرید، نه رفتاری که در اینجا اندازهگیری شده است. پیش از آنکه به آن اعتماد کنید و دادههای واقعی را به آن بسپارید، آن را روی یک ماشین اضافی تست کنید.
آنچه رمزنگاری در حالت سکون (at rest) واقعاً محافظت میکند
این vault با استفاده از XChaCha20-Poly1305، که یک الگوریتم رمزنگاری AEAD (رمزنگاری احراز هویتشده با دادههای مرتبط) است، مهر و موم میشود. کلیدهای اصلی در بخش keyslots با Argon2id بستهبندی شدهاند؛ تابعی برای هش کردن رمز عبور که بهگونهای طراحی شده تا کند باشد و به حافظه زیادی نیاز داشته باشد. دو نتیجه از این موضوع حاصل میشود: نخست، کپی فایل روی یک دیسک سرقتی، در یک نسخه پشتیبان قدیمی یا پیوستشده به یک تیکت پشتیبانی، چیزی جز تعدادی بایت بیمعنی نیست. دوم، تغییر حتی یک بیت باعث شکست در احراز هویت هنگام باز کردن فایل میشود؛ بنابراین خرابی دادهها بهجای ارائه پاسخ اشتباه، به یک خطای صریح تبدیل میشود.
بردارهای تعبیه (embedding vectors) نیز رمزنگاری میشوند که اهمیت آن بیش از چیزی است که به نظر میرسد. یک embedding یک هش نیست. تحقیقات در زمینه معکوسسازی embedding نشان داده است که میتوان قطعات خوانایی از متن اصلی را تنها از روی بردار آن بازیابی کرد؛ بنابراین وجود یک ایندکس برداری به صورت متن ساده (plaintext) در کنار یک دیتابیس رمزنگاریشده، تقریباً به معنای باز گذاشتن دیتابیس است. Compartment هیچ ایندکس متنی سادهای را روی دیسک نمینویسد.
حذف دادهها، حذف واقعی است. هر رکورد کلید مخصوص به خود را دارد و compartment forget --shred آن کلید را نابود میکند؛ بنابراین متن رمزنگاریشده باقیمانده توسط هیچکس، حتی خود شما، قابل رمزگشایی نیست. این را با یک ردیف حذفشده از یک فایل دیتابیس مقایسه کنید که معمولاً تا زمانی که داده جدیدی روی آن نوشته نشود، در صفحات آزاد (free pages) قابل خواندن باقی میماند.
آفلاین بودن، نیمه دیگر ماجراست. هیچ دادهای آپلود نمیشود، بنابراین هیچ حساب کاربری نزد فروشنده وجود ندارد که خاطرات شما را نگه دارد و هیچ API key وجود ندارد که بتواند باعث نشت آنها شود.
آنچه Compartment از آن محافظت نمیکند
ادعای امنیتی در مرز vault متوقف میشود و این مرز از آنچه به نظر میرسد، نزدیکتر است.
عامل (agent) متن ساده (plaintext) را میخواند. Recall حافظه را رمزگشایی کرده و متن را به عامل تحویل میدهد. اگر آن عامل یک مدل میزبانیشده باشد، حافظه دقیقاً مانند هر چیز دیگری در پنجره context، در prompt بعدی به ارائهدهنده مدل ارسال میشود. رمزنگاری در حالت سکون (at rest) از فایل محافظت میکند، اما از بازیابی (retrieval) محافظت نمیکند. بنابراین، قوانین موجود در دور نگه داشتن اسرار از عاملهای هوش مصنوعی با رمزنگاری مخزن (store) کاهش نمییابند: رمز عبوری که به عنوان حافظه ذخیره شده، رمزی است که شما ترتیبی دادهاید تا بهطور خودکار در یک prompt جایگذاری شود.
vault قفلنشده روی یک ماشین در حال اجرا، باز است. یادداشتهای امنیتی پروژه این موضوع را بهصراحت بیان میکنند. تا زمانی که vault قفلنشده است، کلید اصلی و مجموعه کاری در RAM قرار دارند؛ Python نمیتواند تضمین کند که یک بافر پاکسازی میشود و swap یا image مربوط به hibernation میتواند آن حافظه را روی دیسک بنویسد. بدافزاری که با کاربر شما اجرا میشود، هرگز نیازی به شکستن رمز ندارد، زیرا میتواند از vault که از قبل باز شده است، درخواست کند.
هویت فراخواننده (caller) اظهاری است. Namespaceها را میتوان به ازای هر فراخواننده محدود کرد، اما نام فراخواننده از پردازش میزبان میآید؛ بنابراین میزبانی که درباره نام خود دروغ میگوید، مجوزهایی را که ادعا کرده دریافت میکند. مجوزهای Namespace یک سازماندهی است، نه یک مرز امنیتی در برابر یک برنامه محلی مخرب.
تکه کردن (shredding) به نسخههای کپی نمیرسد. forget --shred کلید داخل فایل فعلی را از بین میبرد. نسخهای که پیش از تکه کردن تهیه شده، همچنان آن رکورد را نگه میدارد و همچنان با رمز عبور آن روز باز میشود.
رمز عبور ضعیف، بحث را خاتمه میدهد. Argon2id هر حدس را پرهزینه میکند، اما از رمز عبوری که در لیست کلمات (word list) وجود دارد، محافظت نمیکند.
نصب Compartment از یک نسخه مشخص (Pinned)
نرمافزار Compartment به Python 3.11 یا جدیدتر نیاز دارد. این پروژه با سرعت بالایی توسعه مییابد و تا تاریخ 10 August 2026، سی نسخه مختلف در PyPI منتشر شده است؛ بنابراین به جای نصب آخرین نسخه موجود در روز نصب، حتماً نسخه مورد نظر خود را مشخص (pin) کنید.
python3 --version
pip install "compartment==4.6.0"
compartment --version
compartment initدستور compartment --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 تنها کلید دسترسی شماست. این پروژه هیچ رمز عبور یا عبارت بازیابی تولید نمیکند و این یک تصمیم آگاهانه است: هیچ اعتبارنامهای توسط نرمافزار نگهداری نمیشود که شما به آن دسترسی نداشته باشید.
پیش از اتصال هر چیزی به آن، نتیجه را بررسی کنید.
compartment statusیک vault سالم وضعیت خود را unlocked گزارش میدهد. اگر وضعیت locked گزارش شد، دستور compartment unlock را اجرا کرده و passphrase را وارد کنید. با هر بار راهاندازی مجدد (restart)، vault دوباره قفل میشود، زیرا اعتبارنامهای که آن را باز نگه میدارد به یک secret در هر boot وابسته است. در سیستمعامل macOS، دستور compartment unlock --keychain با ذخیره آن اعتبارنامه در keychain سیستم، امکان باز ماندن vault پس از reboot را فراهم میکند.
محل واقعی ذخیرهسازی دادهها
مخزن پیشفرض در ~/.compartment/memory.vault قرار دارد. با استفاده از --vault PATH در هر دستوری، یا با متغیر محیطی COMPARTMENT_VAULT، میتوانید مسیر دیگری را تعیین کنید.
همان یک فایل، کل مخزن شماست. این فایل با یک هدر شامل نسخه فرمت و کلیدهای Argon2id باز میشود؛ سپس payload رمزنگاریشده قرار دارد و در نهایت، ورودیهای ژورنال با اضافه شدن خاطرات جدید به انتهای فایل الحاق میشوند. هر ورودی ژورنال با طول آن و یک CRC (بررسی افزونگی چرخشی) برای آن طول محصور شده است؛ بنابراین اگر عملیات نوشتن به دلیل کرش ناتمام بماند، به عنوان یک ورودی ناقص شناسایی میشود و به اشتباه به عنوان داده خوانده نمیشود. عملیات فشردهسازی (Compaction)، مخزن را سریالسازی کرده، در یک فایل موقت مینویسد، آن را با fsync همگامسازی میکند و سپس با تغییر نام جایگزین فایل اصلی میکند؛ این یعنی خواننده هرگز با یک مخزن نیمهنوشته مواجه نمیشود.
نتیجه کاربردی این است که اسکریپت پشتیبانگیری شما فقط باید از یک مسیر کپی تهیه کند. نتیجه دشوار این است که نمیتوانید با grep در آن جستجو کنید و امکان تعمیر آن در ویرایشگر متن وجود ندارد. اگر به دنبال حافظهای هستید که بتوانید با cat آن را بخوانید و در git کامیت کنید، فایلهای حافظه محلی ساده Memmy انتخاب متضاد و مناسبی هستند. هر دو رویکرد منطقیاند و بستگی به این دارد که نگرانی اصلی شما سرقت لپتاپ باشد یا خرابی ابزار.
دستور compartment uninstall نرمافزار را حذف میکند اما مخزن را نگه میدارد. تنها زمانی از --purge استفاده کنید که واقعاً قصد حذف کامل دادهها را دارید.
Wiring it into an agent
One command wires a supported client.
compartment integrate --list
compartment integrate claudeFor Claude Code that writes an MCP (model context protocol) server entry and a PostToolUse hook into ~/.claude/settings.json, backing the file up first, installs a /compartmentalize skill under ~/.claude/skills/, and adds a managed block to ~/.claude/CLAUDE.md telling the agent that Compartment supersedes the file based memory it was using. Confirm both halves:
compartment hook status
compartment recentTo register the server by hand instead:
claude mcp add --scope user compartment -- \
compartment --vault ~/.compartment/memory.vault --caller claude-code serveAny other MCP capable host takes the same server with its own caller name.
{ "mcpServers": { "compartment": {
"command": "compartment",
"args": ["--vault", "/path/to/memory.vault",
"--caller", "your-agent-name", "serve"] } } }Give each host a different --caller value. It is the label the audit log records and the key that namespace grants are written against, so a shared name makes both useless.
If Claude Code has already been writing facts to its own memory files, compartment import-claude --dry-run shows what would move before anything moves. Read what Claude Code keeps in its memory files first, because importing a year of notes into a fresh vault is how a memory store fills up with things nobody meant to keep.
سرعت یک 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
}
]ذخیرهسازی یک حافظه، 40 میلیثانیه و جستجوی برداری در میان بیست هزار رکورد، 0.68 میلیثانیه برای صدک 95 اعلام شده است. استدلال پروژه برای محلی نگهداشتن حافظه، محاسباتی است: یک رفتوبرگشت شبکه به یک API حافظه میزبانیشده، اغلب هزینهای بیش از 11.6 میلیثانیه (میانه یک جستجوی ترکیبی کامل در اینجا) دارد.
دو جزئیات طراحی، اعداد مربوط به جستجو را توضیح میدهند. زیر بیست هزار رکورد، Compartment پرسوجو را با تکتک بردارها مقایسه میکند، بنابراین بازیابی (recall) بهجای تقریبی بودن، بهطور ساختاری دقیق است. بالای این تعداد، سیستم به HNSW (دنیای کوچک قابل پیمایش سلسلهمراتبی) تغییر وضعیت میدهد؛ یک ایندکس تقریبی که کمی از دقت بازیابی را فدای سرعت میکند. این vault همچنین هش SHA-256 مدل embedding را ثبت میکند و در صورت استفاده از مدل متفاوت، از باز شدن خودداری میکند؛ زیرا بردارها از دو مدل مختلف میتوانند بدون بروز هیچ خطایی با هم مقایسه شوند، اما امتیازات حاصل از آن فاقد معنا خواهند بود.
پشتیبانگیری و نسخهای که سال آینده هم باز میشود
یک vault قفلشده، یک فایل قابلحمل است؛ بنابراین جابهجایی آن، همان کپیکردن است.
compartment lock
scp ~/.compartment/memory.vault other-machine:
compartment --vault memory.vault unlockابتدا آن را قفل کنید. کپیکردن در حالی که agent در حال نوشتن است، ممکن است باعث شود یک ورودی journal در میانهٔ الحاق (append) کپی شود. اگرچه فریمبندی CRC به خواننده اجازه میدهد آن قطعهٔ انتهایی ناقص را نادیده بگیرد، اما حافظهٔ درون آن از دست میرود. compartment lock --sign فایل را با یک manifest از نوع Ed25519 مهر و موم میکند، بنابراین دستگاه مقصد میتواند بدون نیاز به داشتن passphrase، سالم رسیدن کپی را تأیید کند.
از آنجا که فایل از قبل مهر و موم شده است، فضای ذخیرهسازی ابری معمولی مکان مناسبی برای آن است. این همان نقطهای است که رمزنگاری در حالت سکون (encryption at rest) مستقیماً به نفع شما عمل میکند: مقصد پشتیبانگیری هرگز حافظه را نمیبیند.
دو هشدار: عملیات Shredding به پشتیبانها دسترسی ندارد؛ بنابراین رکوردی که امروز به صورت رمزنگاریشده حذف (crypto shredded) کردهاید، در کپی هفتهٔ گذشته برای هر کسی که passphrase هفتهٔ گذشته را داشته باشد، قابل خواندن باقی میماند. همچنین compartment export --plaintext کل vault را به صورت رمزنگارینشده مینویسد که ابزار مناسبی برای مهاجرت به سیستمهای دیگر است، اما فایلی اشتباه برای باقیماندن در ~/Downloads محسوب میشود.
تعداد کمی کپی نگه دارید و آنها را تاریخگذاری کنید. یک حافظهٔ ذخیرهسازی (memory store) وقتی کسی آن را پاکسازی (prune) نکند، به یک بدهی تبدیل میشود؛ این همان استدلالی است که در چرا حافظههای قدیمی agent به آرامی بازیابی را مسموم میکنند مطرح شده است.
مدیریت، چرخش و عامل دوم کلیدها
compartment rekey
compartment 2fa enable
compartment 2fa statusrekey عبارت عبور (passphrase) را با رمزنگاری مجدد کلید اصلی در keyslot فایل فعلی تغییر میدهد. نسخههای قدیمی، عبارت عبور قبلی خود را حفظ میکنند؛ زیرا آن بایتها پیش از تغییر مهر و موم شدهاند و هیچ فرآیندی برای ویرایش آنها به عقب بازنمیگردد. نسخهها را نیز بچرخانید (rotate کنید)، یا بپذیرید که یک عبارت عبور بازنشسته همچنان میتواند بخشی را باز کند.
2fa enable یک فایل کلید (keyfile) را به عنوان عامل دوم اضافه میکند که در حین استخراج کلید با عبارت عبور ترکیب میشود، بنابراین برای باز کردن vault به هر دو نیاز است. این کار همچنین تعداد مواردی که ممکن است گم کنید را دو برابر میکند. فایل کلید را روی دستگاهی که vault را نگه میدارد، ذخیره نکنید.
برای اسکریپتها و CI (یکپارچهسازی مداوم)، عبارت عبور میتواند از طریق متغیر محیطی COMPARTMENT_PASSPHRASE ارسال شود و unlock --passphrase-stdin آن را از یک pipe میخواند. استفاده از pipe را ترجیح دهید. متغیر محیطی توسط سایر فرآیندهایی که متعلق به همان کاربر هستند قابل خواندن است و معمولاً در لاگهای job ثبت میشود.
تاریخچه حسابرسی (audit history) به صورت زنجیره هش است و compartment audit verify آن را پیمایش کرده و اولین پیوند شکسته را گزارش میدهد. پس از هر بازیابی (restore)، این دستور را اجرا کنید؛ زیرا در این زمان است که یک فایل که بیسروصدا ناقص شده است، خود را نشان میدهد.
اگر رمز عبور (passphrase) خود را فراموش کنید چه اتفاقی میافتد
هیچ اتفاقی نمیافتد و این دقیقاً مطابق با طراحی سیستم است. هیچ راهی برای بازنشانی (reset)، هیچ عبارت بازیابی (recovery phrase) و هیچ مرجعی برای مکاتبه وجود ندارد، زیرا هیچ نسخهای از کلید خارج از حافظه شما و فایل کلید اختیاریتان موجود نیست. مخزن (vault) به صورت فایلی از بایتهای تصادفی باقی میماند.
بنابراین، برنامه بازیابی برای مخزن نیست، بلکه برنامهای برای رمز عبور است. آن را در همان روزی که compartment init را اجرا میکنید، در یک مدیریتکننده رمز عبور (password manager) ثبت کنید. سپس آن را آزمایش کنید: مخزن را قفل کنید، با استفاده از آنچه یادداشت کردهاید آن را باز کنید و پس از اطمینان از عملکرد صحیح، اجازه دهید یک عامل (agent) شروع به پر کردن آن کند.
Compartment یا یک سرور حافظه
Compartment ذاتاً برای استفاده روی یک ماشین طراحی شده است. اشتراکگذاری به معنای کپی کردن فایل قفلشده یا عملیات export و import است و هیچ قابلیت نوشتن همزمان (concurrent writer) وجود ندارد؛ بنابراین اگر یک لپتاپ و یک ایستگاه کاری (workstation) به یک فایل واحد اشاره کنند، تغییرات یکدیگر را بازنویسی خواهند کرد.
زمانی که چندین ماشین به صورت همزمان به حافظه یکسانی نیاز دارند، این یک مسئله مربوط به سرور است. یک سرور حافظه Mem0 خودمیزبان روی یک VPS پاسخ این نیاز است: یک نقطه پایانی (endpoint)، کلاینتهای متعدد و حافظهای که طول عمری فراتر از لپتاپ شما دارد. هزینه این کار باید بهصراحت بیان شود. آن سرور فرآیندی را اجرا میکند که میتواند دادههای ذخیرهشده را بخواند، بنابراین مدل تهدید (threat model) شما اکنون شامل VPS و هر کسی که به API آن دسترسی دارد، میشود.
بر اساس خسارتی که واقعاً از آن میترسید، انتخاب کنید. اگر نگرانی شما سرقت لپتاپ یا خوانده شدن یادداشتها توسط یک فروشنده (vendor) است، vault محلی رمزنگاریشده پاسخ قویتری است. اگر نگرانی شما عاملی است که به محض تغییر ماشین، همه چیز را فراموش میکند، سرور گزینه مناسب است.
FAQ
رمزنگاری Compartment دقیقاً از چه چیزی محافظت میکند؟
این ابزار از فایل محافظت میکند. Vault با استفاده از XChaCha20-Poly1305 مهر و موم شده، کلیدهای آن با Argon2id بستهبندی شدهاند و بردارهای جاسازی (embedding vectors) نیز رمزنگاری میشوند؛ بنابراین در صورت سرقت دیسک یا دسترسی به یک نسخه پشتیبان قدیمی، تنها بایتهایی غیرقابل خواندن در اختیار مهاجم قرار میگیرد. این رمزنگاری از یک Vault باز در سیستم در حال اجرا محافظت نمیکند، زیرا کلید اصلی (master key) تا زمانی که Vault باز است در RAM باقی میماند. همچنین این رمزنگاری بر نحوه عملکرد Agent پس از بازیابی اطلاعات به صورت متن ساده (plaintext) نظارتی ندارد.
اگر Compartment آفلاین باشد، آیا خاطرات من از ارائهدهنده مدل هوش مصنوعی مخفی میمانند؟
فقط تا زمانی که فراخوانی (recall) شوند. ذخیرهسازی و جستجو بدون نیاز به شبکه انجام میشود و مدل embedding بهصورت محلی اجرا میگردد، بنابراین در زمان نوشتن، هیچ دادهای از دستگاه خارج نمیشود. در زمان خواندن، Agent متن ساده را دریافت میکند؛ اگر آن Agent یک مدل میزبانیشده (hosted model) باشد، خاطره وارد prompt شده و مانند سایر بخشهای context window به سمت ارائهدهنده ارسال میشود. هرگز اطلاعات حساس (credential) را بهعنوان خاطره ذخیره نکنید.
اگر رمز عبور (passphrase) Compartment خود را فراموش کنم چه میشود؟
Vault بهصورت عمدی غیرقابل بازیابی است. Compartment هیچ seed یا عبارت بازیابی تولید نمیکند و هیچ اطلاعاتی که شما در اختیار ندارید را نگه نمیدارد، بنابراین چیزی برای بازنشانی وجود ندارد. رمز عبور را در یک مدیریتکننده رمز عبور (password manager) ذخیره کنید، فایل کلید 2FA را در دستگاهی جدا از دستگاهی که Vault در آن قرار دارد نگهداری کنید و پیش از ذخیره اطلاعات مهم، اطمینان حاصل کنید که میتوانید یک نسخه کپی از Vault را باز کنید.
آیا دو دستگاه میتوانند از یک Vault مشترک در Compartment استفاده کنند؟
نه بهصورت همزمان. یک Vault قفلشده، یک فایل واحد و قابلحمل است و روش استاندارد این است که آن را قفل کرده، کپی کنید و سپس در دستگاه دیگر با استفاده از --vault باز کنید. دسترسی همزمان وجود ندارد، بنابراین اگر دو دستگاه همزمان روی یک فایل بنویسند، خاطرات از بین خواهند رفت. در صورت نیاز به دسترسی همزمان، از یک memory server استفاده کنید.