هل يحمي Compartment ذاكرة الوكلاء دون اتصال؟
تعرّف إلى ما يحميه Compartment فعلياً بالتشفير المحلي، وما الذي يكشفه نموذج التهديد، ولماذا يعني فقدان عبارة المرور فقدان الذاكرة المشفّرة.
ما الذي يفعله Compartment بشكل مختلف
Compartment هو مخزن لذاكرة الوكلاء يحافظ على تشفير كل سجل على الجهاز الذي أنشأه، ولا يتصل مطلقاً بخدمة شبكية. هناك نقطتان تميزانه عن بقية مجال ذاكرة الوكلاء. الخزنة عبارة عن ملف واحد مغلق لا تفتحه إلا عبارة المرور الخاصة بك، وتعمل خطوة إنشاء التضمينات محلياً، لذلك لا يُرسل نص الذاكرة إلى أي جهة لتحويله إلى متجه. نُشر الإصدار 4.6.0 في 10 August 2026، وترخيصه Apache-2.0، ويمكن تثبيته من PyPI.
هذا ادعاء متعلق بنموذج التهديد، ولذلك يتعامل معه هذا الدليل على هذا الأساس. يحمي التشفير أثناء السكون، إلى جانب التصميم غير المتصل، قائمة محددة من الأمور. لكنه يترك أموراً أخرى مكشوفة، وتظهر مشكلات اليوم الثاني في هذه الفجوة.
يتبع هذا الدليل وثائق المشروع وملاحظات الإصدار الخاصة به، بعد قراءتها في 11 August 2026. يوفّر Compartment تطبيقاً لسطح المكتب، وعنصرًا في شريط القوائم على macOS، وأيقونة في منطقة الإعلام على Windows، إلى جانب أداة سطر الأوامر الخاصة به. ولا يمكن تشغيل مطالبة عبارة المرور من حاوية مؤتمتة. اعتبر ما يلي سلوكاً موثقاً، لا سلوكاً جرى قياسه هنا. شغّله على جهاز غير مستخدم في الإنتاج قبل أن تثق به لمعالجة أي بيانات فعلية.
ما الذي تحميه التشفير أثناء التخزين فعلياً
تُشفَّر الخزنة باستخدام XChaCha20-Poly1305، وهو تشفير AEAD (تشفير موثَّق مع بيانات مرتبطة)، بينما تُغلَّف خانات المفاتيح التي تحتوي على المفتاح الرئيسي باستخدام Argon2id، وهي دالة تجزئة كلمات مرور صُممت لتكون بطيئة وتحتاج إلى قدر كبير من الذاكرة. وينتج عن ذلك أمران. تصبح نسخة الملف الموجودة على قرص مسروق، أو في نسخة احتياطية قديمة، أو مرفقة بتذكرة دعم، مجرد وحدات بايت لا أكثر. كما يؤدي تغيير بت واحد إلى فشل المصادقة عند فتح الملف، فتظهر حالة التلف كخطأ واضح بدلاً من إنتاج إجابة خاطئة.
تُشفَّر متجهات التضمين أيضاً، وهذا أهم مما يبدو. فالتضمين ليس تجزئة. أظهرت أبحاث عكس التضمين إمكانية استعادة أجزاء قابلة للقراءة من النص الأصلي اعتماداً على متجهه وحده، ولذلك فإن وجود فهرس متجهات غير مشفَّر بجانب قاعدة بيانات مشفَّرة يشبه تقريباً ترك قاعدة البيانات مفتوحة. لا يكتب Compartment أي فهرس بنص واضح على القرص.
الحذف هو حذف فعلي. يحمل كل سجل مفتاحه الخاص، وتدمّر compartment forget --shred ذلك المفتاح، ولذلك لا يمكن لأي شخص فك تشفير النص المشفَّر المتبقي، بما في ذلك أنت. قارن ذلك بصف محذوف من ملف قاعدة بيانات، إذ يبقى عادة قابلاً للقراءة في الصفحات الحرة إلى أن تستبدله بيانات أخرى.
والعمل دون اتصال هو النصف الآخر من الحماية. لا يُرفع أي شيء، لذلك لا توجد حسابات لدى مورّد تحتفظ بذكرياتك، ولا يوجد مفتاح API يمكن أن يسرّبها.
ما الذي لا تحميه الحاوية
ينتهي هذا الادعاء عند حدود الخزنة، وهذه الحدود أقرب مما تبدو.
يقرأ الوكيل النص الواضح. يفك Recall تشفير الذاكرة ويسلّم النص إلى الوكيل. إذا كان هذا الوكيل نموذجاً مستضافاً، تنتقل الذاكرة إلى مزوّد النموذج داخل الطلب التالي، تماماً مثل كل ما يوجد في نافذة السياق. تحمي التشفيرة أثناء السكون الملف، لكنها لا تحمي عملية الاسترجاع. لذلك لا تصبح قواعد إبقاء الأسرار خارج وكلاء الذكاء الاصطناعي أقل صرامة لأن مخزن البيانات مشفّر: فكلمة المرور المحفوظة كذاكرة هي كلمة مرور رتّبتَ لصقها في الطلب تلقائياً.
الخزنة غير المقفلة على جهاز قيد التشغيل مفتوحة. توضح ملاحظات أمان المشروع ذلك صراحةً. عندما تكون الخزنة غير مقفلة، يوجد المفتاح الرئيسي ومجموعة العمل في RAM، ولا تستطيع Python ضمان محو المخزن المؤقت، وقد تكتب swap أو صورة الإسبات تلك الذاكرة إلى القرص. لا يحتاج برنامج ضار يعمل بحسابك إلى كسر التشفير، لأنه يستطيع طلب البيانات من الخزنة المفتوحة مسبقاً.
هوية المستدعي تصريحية. يمكن تقييد namespaces لكل مستدعٍ، لكن اسم المستدعي يصل من العملية المضيفة. لذلك يحصل المضيف الذي يكذب بشأن اسمه على المنح التي يدّعيها. تمثل صلاحيات namespaces تنظيماً، وليست حداً أمنياً في مواجهة برنامج محلي خبيث.
لا يمكن للإتلاف الوصول إلى النسخ. forget --shred يتلف المفتاح داخل الملف الحالي. وتظل النسخة الاحتياطية المأخوذة قبل الإتلاف تحتوي على ذلك السجل، وتظل قابلة للفتح بعبارة المرور الخاصة بذلك اليوم.
تنهي عبارة المرور الضعيفة النقاش. تجعل Argon2id كل تخمين مكلفاً. لكنها لا تنقذ عبارة مرور تظهر في قائمة كلمات.
تثبيت Compartment من إصدار محدد
يتطلب Compartment الإصدار Python 3.11 أو إصداراً أحدث. يتطور المشروع بسرعة، وقد صدر له ثلاثون إصداراً على PyPI بحلول 10 August 2026، لذلك ثبّت الإصدار بدلاً من تثبيت الإصدار المتاح وقت التثبيت.
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 عبارة مرور مرتين ولا يعرض أي محارف أثناء إدخالها. عبارة المرور هذه هي المفتاح الوحيد. لا ينشئ المشروع كلمة مرور ولا عبارة استرداد، وهذا مقصود: لا توجد بيانات اعتماد يحتفظ بها البرنامج ولا تملكها أنت.
تحقق من النتيجة قبل ربط أي شيء به.
compartment statusيشير vault السليم إلى أنه unlocked. إذا أشار إلى أنه locked، فشغّل compartment unlock وأدخل عبارة المرور. يؤدي إعادة التشغيل إلى قفله مرة أخرى، لأن بيانات الاعتماد التي تبقيه مفتوحاً تعتمد على سر خاص بكل boot. في macOS، يتيح compartment unlock --keychain استمرار فتحه بعد إعادة التشغيل عبر تخزين بيانات الاعتماد في system keychain.
أين توجد البيانات فعلياً
المخزن الافتراضي هو ~/.compartment/memory.vault. حدّد موقعاً آخر باستخدام --vault PATH مع أي أمر، أو باستخدام متغير البيئة COMPARTMENT_VAULT.
هذا الملف الواحد هو مخزن البيانات بالكامل. يبدأ برأس يحتوي على إصدار التنسيق وفتحات مفاتيح Argon2id، ثم الحمولة المختومة، ثم إدخالات السجل التي تُضاف عند وصول ذكريات جديدة. يُحاط كل إدخال في السجل بطوله وبـCRC (فحص التكرار الدوري) لهذا الطول، لذلك يُتعرّف إلى الكتابة التي قطعها تعطل على أنها إدخال مبتور، بدلاً من قراءتها كبيانات. تعمل عملية الضغط على تسلسل المخزن، ثم تكتب ملفاً مؤقتاً، وتنفّذ fsync له، ثم تعيد تسميته إلى موقعه، ما يعني أن القارئ لا يرى مخزناً مكتوباً جزئياً.
والنتيجة المفيدة هي أن برنامج النسخ الاحتياطي ينسخ مساراً واحداً بالضبط. أما الجانب غير المريح فهو أنك لا تستطيع استخدام grep عليه، ولا إصلاحه في محرر نصوص. إذا أردت ذكريات يمكنك قراءتها باستخدام cat وإيداعها في git، فإن ملفات Memmy المحلية للذكريات بنص عادي تقدم المقايضة المعاكسة. كلا الخيارين معقول، بحسب ما تخشاه: حاسوب محمول مسروق أم أداة تتعطل.
يزيل compartment uninstall البرنامج ويُبقي المخزن. مرّر --purge فقط عندما يكون ذلك مقصوداً.
ربطه بوكيل
يربط أمر واحد عميلاً مدعوماً.
compartment integrate --list
compartment integrate claudeبالنسبة إلى Claude Code، ينشئ هذا الأمر إدخال خادم MCP (بروتوكول سياق النموذج) وhook باسم 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. ويستند المشروع في تبريره للإبقاء على الذاكرة محلية إلى حساب بسيط: غالباً ما تستغرق رحلة شبكة واحدة ذهاباً وإياباً إلى واجهة برمجة ذاكرة مستضافة وقتاً أطول من الوسيط البالغ 11.6 مللي ثانية لعملية بحث هجينة كاملة هنا.
يفسّر تفصيلان في التصميم أرقام البحث. عندما يقل عدد السجلات عن عشرين ألفاً، يقارن Compartment الاستعلام بكل متجه، ولذلك يكون الاسترجاع دقيقاً بحكم التصميم وليس تقريبياً. وعندما يتجاوز العدد ذلك، ينتقل إلى HNSW (عالم صغير هرمي قابل للتنقل)، وهو فهرس تقريبي يبادل جزءاً صغيراً من دقة الاسترجاع بزيادة السرعة. كما يسجل المخزن تجزئة 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 statusيغيّر rekey عبارة المرور عبر إعادة تغليف المفتاح الرئيسي في خانة المفاتيح للملف الحالي. تحتفظ النسخ القديمة بعبارة المرور القديمة، لأن وحدات البايت فيها أُغلقت قبل التغيير، ولا توجد آلية تعود لتعديلها. دوّر النسخ أيضاً، أو تقبّل أن عبارة مرور متوقفة عن الاستخدام ما زالت تفتح شيئاً ما.
يضيف 2fa enable ملف مفتاح بوصفه عاملاً ثانياً، ويجمعه مع عبارة المرور أثناء اشتقاق المفتاح، ولذلك يلزم كلاهما لفتح الخزنة. هذا يضاعف أيضاً عدد الأشياء التي قد تفقدها. احتفظ بملف المفتاح خارج الجهاز الذي يحتوي على الخزنة.
بالنسبة إلى البرامج النصية وCI (التكامل المستمر)، يمكن أن تصل عبارة المرور عبر متغير البيئة COMPARTMENT_PASSPHRASE، ويقرأها unlock --passphrase-stdin من pipe. استخدم pipe متى أمكن. يمكن للعمليات الأخرى التي يملكها المستخدم نفسه قراءة متغير البيئة، كما ينتهي به المطاف غالباً في سجلات المهام.
يرتبط سجل التدقيق بسلسلة من قيم hash، ويمر compartment audit verify عبر السجل ويُبلغ عن أول رابط مكسور. شغّله بعد أي استعادة، لأن الملف المقتطع بصمت يظهر عندها.
ماذا يحدث عند فقدان عبارة المرور
لا يحدث شيء، وهذا مقصود في التصميم. لا توجد إعادة تعيين، ولا عبارة استرداد، ولا عنوان للكتابة إليه، لأن أي نسخة من المفتاح لا توجد خارج ذاكرتك وملف المفتاح الاختياري. تبقى الخزنة ملفاً من بايتات تبدو عشوائية.
لذلك، لا تتعلق خطة الاسترداد بالخزنة، بل بعبارة المرور. سجّلها في مدير كلمات مرور في اليوم الذي تشغّل فيه compartment init. ثم اختبرها: اقفل الخزنة، وافتحها باستخدام ما دوّنته فقط، ودع عميلاً يبدأ بملئها بعد نجاح ذلك.
الحاوية أم خادم الذاكرة
صُمِّمت Compartment للعمل على جهاز واحد. تعني المشاركة نسخ الملف المقفل، أو تصديره واستيراده. ولا يوجد كاتب متزامن، لذلك سيستبدل حاسوب محمول ومحطة عمل يشيران إلى الملف نفسه عمل أحدهما بعمل الآخر.
عندما تحتاج عدة أجهزة إلى الذاكرة نفسها في الوقت نفسه، فهذه مشكلة خادم. يجيب عنها خادم Mem0 مستضاف ذاتياً على VPS: نقطة نهاية واحدة، وعدة عملاء، وذاكرة تستمر بعد مغادرة الحاسوب المحمول. يجب توضيح التكلفة مباشرة. يشغّل ذلك الخادم عملية يمكنها قراءة البيانات التي يخزنها، لذلك يشمل نموذج التهديد الآن VPS وكل من يمكنه الوصول إلى واجهة API الخاصة به.
اختر بناءً على الخسارة التي تخشاها فعلياً. إذا كانت الخسارة المحتملة هي سرقة الحاسوب المحمول أو قراءة مورّد لملاحظاتك، فخزنة محلية مشفّرة هي الخيار الأقوى. أما إذا كانت المشكلة هي وكيل ينسى كل شيء فور انتقالك بين الأجهزة، فاختر الخادم.
FAQ
ما الذي تحميه تشفيرات Compartment فعلياً؟
تحمي الملف. تُغلَق الخزنة باستخدام XChaCha20-Poly1305، وتُغلَّف خانات مفاتيحها باستخدام Argon2id، كما تُشفَّر متجهات التضمين أيضاً. لذلك ينتج عن سرقة القرص أو نسخة احتياطية قديمة بيانات لا تحتوي على شيء قابل للقراءة. لكنها لا تحمي خزنة مفتوحة على جهاز قيد التشغيل، لأن المفتاح الرئيسي يبقى في RAM أثناء فتح الخزنة. كما أنها لا تتحكم في ما يفعله agent بالذاكرة بعد أن يستلمها كنص صريح.
إذا كان Compartment يعمل دون اتصال، فهل تبقى ذاكرتي خاصة عن مزود النموذج؟
فقط إلى أن تُستعاد. يحدث التخزين والبحث دون شبكة، ويعمل نموذج التضمين محلياً، لذلك لا يغادر أي شيء الجهاز وقت الكتابة. عند القراءة، يستلم agent النص الصريح. وإذا كان ذلك agent نموذجاً مستضافاً، تدخل الذاكرة في prompt وتنتقل إلى المزود مثل بقية محتوى نافذة السياق. لا تخزّن بيانات اعتماد كذاكرة مطلقاً.
ماذا يحدث إذا فقدت عبارة مرور Compartment؟
تصبح الخزنة غير قابلة للاسترداد، وهذا مقصود. لا ينشئ Compartment seed أو recovery phrase، ولا يحتفظ بأي بيانات اعتماد لا تملكها أنت. لذلك لا يوجد شيء يمكن إعادة ضبطه. ضع عبارة المرور في password manager، واحتفظ بأي 2FA keyfile خارج الجهاز الذي يخزن الخزنة، وتأكد من قدرتك على فتح نسخة منها قبل أن تخزن الخزنة أي شيء ستفتقده.
هل يمكن لجهازين مشاركة خزنة Compartment واحدة؟
ليس في الوقت نفسه. الخزنة المقفلة عبارة عن ملف محمول واحد. والمسار الموثق هو قفلها، ثم نسخها، ثم فتحها على الجهاز الآخر باستخدام --vault. لا يوجد وصول متزامن، ولذلك ستفقد الذاكرات إذا كتب جهازان في الملف نفسه. شغّل memory server عندما تحتاج إلى ذلك.