سياسة الأمان
يخزّن FactLane حقائق دائمة قد تبقى بعد انتهاء جلسة الوكيل. وقد صُممت حدوده الأمنية لإبقاء المساهمات غير المتحقَّق منها منفصلة عن الحقائق الحالية، ومنع المستدعين من منح أنفسهم صلاحية الوصول أو الكتابة.
الإبلاغ عن ثغرة أمنية
أبلغ عن المشكلات الأمنية بشكل خاص إلى مالك المستودع. لا تنشر بيانات الاعتماد، أو الذكريات الخام، أو النصوص المنسوخة للمحادثات، أو مسارات الملفات الخاصة، أو حزم الأدلة في issue عامة. قدّم أصغر إعادة إنتاج اصطناعية تُظهر السلوك، مع الإصدار/الـcommit المتأثر وإصدارات بيئة التشغيل ذات الصلة.
حدود الثقة
- هوية المضيف: يربط مشغّل موثوق هوية مضيف مستقرة ببوابة MCP المحلية عبر
stdio. وتُرفض هوية النقل التي يقدّمها المستدعي وهويات النطاق المربوطة بالمضيف عند تعارضها. ولا يُعد ربط المشغّل مصادقةً تشفيرية على العملية؛ فالمضيف وإعداد تشغيله جزء من البيئة الموثوقة. - صلاحية الكتابة: يكون الاتصال للقراءة فقط ما لم يحدد المشغّل صراحة ملف تعريف
للكتابة. يمكن للوكلاء المفوَّضين المساهمة بسجلات
CANDIDATE، لكنهم لا يستطيعون التحقق منها بتغيير حقول الطلب أو إعادة استخدام مفتاح idempotency ذي صلاحيات مميزة. يتطلب التحقق من الحالة الحالية سياق launcher/operator موثوقًا بصورة مستقلة. - عزل النطاق: تعمل عمليات القراءة والكتابة ضمن نطاق مطابق بدقة. لا يقبل
CROSS_PROJECT_WORKFLOWمفاتيح لهوية المشروع أو worktree أو workflow أو الوكيل، ولا ينسخ السجلات ضمنيًا إلى نطاق آخر. - اتساق التخزين: تستخدم تحديثات المراجعات compare-and-swap محليًا داخل المعاملة.
يرفض عقد التخزين v2 عمليات الكتابة القديمة الخام إلى سجلات الـadapter، وللعمليات المدعومة
سلوك rollback ذري وإعادة محاولة idempotent عند حدود المعاملة الموثقة. يفشل اتصال SQLite
خام غير مسجَّل في وضع مغلق أثناء حل دالة التفويض المحلية للاتصال
factlane_contract_v2_writer؛ لذلك يبلغ SQLite عنno such function: factlane_contract_v2_writerبدل العلامة الداخلية للمشغّلFACTLANE_STORAGE_V2_WRITER_REQUIRED. ولا يمنح هذا الاختلاف التشخيصي مسار كتابة. تُترجم حالة نفاد سعة SQLite المبلّغ عنها على أنهاSQLITE_FULLعند حد FactLane إلىBACKEND_UNAVAILABLEقابلة لإعادة المحاولة؛ وتظل عملية التعديل الفاشلة transactional ولا تترك سجلًا دائمًا جزئيًا. - المزوّدون المحليون: يتصل مزوّد التضمين المرفق بـOllama عبر loopback؛ ولا تُدعم نقاط نهاية تضمين غير محلية أو fallbacks بعيدة تلقائية. ويُتحقق من هوية نموذج التضمين، وإمكاناته، وأبعاده، وحدود الإدخال مقابل ملف التعريف المحدد.
يقتصر سطح MCP العام على memory_search وmemory_get وmemory_store و
memory_update وmemory_status. ولا توجد أداة عادية للوكيل للحذف أو الاستعادة أو
الإدارة أو الجمع في الخلفية أو الدمج الذاتي المستقل.
استعادة الذاكرة الحساسة
مشغّل الصيانة المحلي في factlane.recovery منفصل عن MCP ويتطلب
تفويضًا صريحًا للمشغّل. وهو مخصص لحادث مؤكد يتعلق بذاكرة حساسة،
وليس لصيانة السجل التاريخي الروتينية.
قبل تعديل قاعدة بيانات، تتحقق الاستعادة من مجموعة الأهداف الدقيقة وربط قاعدة البيانات/ملف التعريف،
ومن المخطط والحالة المادية المدعومين، وغياب استخدام متنافس لقاعدة البيانات،
ومن إمكانات التخزين/FTS المطلوبة. توقف بيئة SQLite مرتبطة غير مدعومة (أقل من
3.42.0) العملية قبل الحصول على maintenance lease أو إنشاء حالة استعادة
أو receipts. ويتحقق المشغّل بصورة منفصلة من FTS5 secure-delete؛ ولا يُعد رقم
الإصدار وحده كافيًا.
تحتفظ مرفقات وقت التشغيل العادية لـSQLiteVecEngine بقفل استشاري مشترك من نوع flock على
inode قاعدة البيانات نفسها بعد حلها طوال عمر المحرك. وتأخذ استعادة الذاكرة الحساسة
قفلًا حصريًا على inode قاعدة البيانات الحالية قبل أول فحص quiescence. وقبل استبدال
قاعدة البيانات تلك بالصورة المنقحة، تأخذ الاستعادة أيضًا قفلًا حصريًا على inode الصورة البديلة
المنقحة؛ ثم يعمل os.replace() بينما يظل كل من inode قاعدة البيانات القديمة والجديدة مقفلاً.
وتبقى أقفال inode القديمة وinode المرقّاة محفوظة حتى postflight على المحرك الحقيقي. يمنع ذلك
بيئات تشغيل FactLane العادية من شطر العزل عبر hard-link aliases أو عبر قفل sidecar مشتق من
pathname. وتفشل محاولة إرفاق بيئة تشغيل عادية بأي من inode المحميين في وضع مغلق مع
MAINTENANCE_IN_PROGRESS؛ كما تفشل الاستعادة قبل أي تعديل إذا ظل محرك وقت تشغيل عادي
مرفقًا.
إذا فشل تنظيف قاعدة البيانات بعد postflight أو أُلغي بينما قد يظل مقبض SQLite حيًا، يحتفظ FactLane عمدًا بأقفال inode الحصرية المملوكة للعملية في وضع مغلق بدل إعادة فتح الخدمة العادية. ويغلق خروج العملية تلك descriptors المحتفظ بها مع ما تبقى من مقابض SQLite المملوكة للعملية؛ ويظل الحادث بحاجة إلى تسوية من المشغّل قبل إعادة تشغيل الخدمة.
بعد التزام purge منطقي لذاكرة حساسة، يسجل FactLane أيضًا recovery interlock داخل
قاعدة البيانات نفسها. ويتحقق بدء وقت التشغيل العادي من ذلك interlock الدائم قبل خدمة الـbackend
ويعيد MAINTENANCE_IN_PROGRESS ما دام sealing/recovery غير مكتمل. ولأن العلامة مخزنة
في قاعدة البيانات، فإنها تبقى بعد خروج/إعادة تشغيل العملية وتتبع inode قاعدة البيانات عبر
hard-link aliases ومسار ترقية الصورة المنقحة. ويكون وصول صيانة الاستعادة هو مسار
بدء التشغيل الوحيد المسموح له بتجاوزه، وتمسحه الاستعادة الناجحة المتحقَّق منها.
ينحصر ضمان العزل هذا في أنظمة ملفات POSIX المحلية المدعومة ذات دلالات flock
الموثوقة. ولا يمثل ادعاءً بشأن Windows أو سلوك قفل NFS/SMB/FUSE غير المتحقق منه؛
وتظل الاستعادة الحية على مثل هذا التخزين خارج عقد الاستعادة المقبول.
وهو أيضًا عقد تعاوني لبيئة تشغيل FactLane، وليس حماية من عملية عشوائية ذات صلاحيات مميزة
تستبدل مسارات قاعدة البيانات أو تتجاوز FactLane بعمليات كتابة خام إلى نظام الملفات/قاعدة البيانات؛
ويظل جرد quiescence الحالي وإجراء الإيقاف الكامل للحادث مطلوبين في تلك الحالات.
يؤدي فشل قبل commit إلى rollback للـpurge المنطقي. وإذا تم commit للـpurge المنطقي ثم فشل sealing اللاحق، فيجب ألا تُعاد فتح قاعدة البيانات للخدمة العادية أو تُستعاد من نسخة تحتوي payload الحساس حتى تكتمل الاستعادة الآمنة. ولا تنشئ العملية نسخة احتياطية plaintext افتراضيًا. وأي forensic snapshot أو تعامل مع نسخ خارجية أو استعادة إنتاج حي يتطلب تفويضه وخطة الاحتواء الخاصة به.
لا تضمن الاستعادة المحلية المحو المادي أو الإزالة من النسخ الاحتياطية أو snapshots
أو السجلات أو الأنظمة الخارجية. ولا تُعد memory_update العادية أو compaction للسجلات
التي جرى supersede لها أو housekeeping اليدوية بدائل لاستعادة الحوادث.
الحد الأمني للترقية والتراجع
التراجع عن الحزمة والتراجع عن البيانات الدائمة عمليتان مختلفتان. احتفظ بنسخة احتياطية يملكها المشغّل قبل انتقال إصدار قد يؤثر في البيانات المخزنة. لا تشغّل بيئة FactLane أقدم مقابل قاعدة بيانات قد يكون إصدار أحدث قد رحّلها أو جعلها غير متوافقة ما لم يوثق الإصدار الأحدث صراحة أن هذا downgrade آمن. وإلا فإن استعادة الحالة الدائمة تتطلب reverse migration موثقًا أو استعادة نسخة احتياطية متوافقة متحققًا منها.
v0.1.3 هو أول إصدار إنتاج رسمي ولا يوجد له هدف تراجع إنتاجي رسمي أقدم.
يمكن استبدال حزمته العامة ميكانيكيًا في بيئة معزولة،
لكن ذلك لا يثبت مسار downgrade لقاعدة بيانات إنتاج. راجع
عمليات الإصدار للتحقق من artifacts المرتبطة بالإصدارات و
قائمة تحقق انتقال المشغّل.
الحدود المعروفة
FactLane خدمة محلية وليست نظام distributed consensus. الإصدار 0.1.3 مؤهّل للإنتاج لملف تعريف النشر المحلي الموثق، بما يشمل توافق النسخ الاحتياطي/الاستعادة ذي المرجعية، والتشغيل المتزامن المحدود، وrollback بعد crash/restart، وتكامل مضيف stdio المضبوط، وفحوص الاسترجاع المستمدة من الإنتاج. ولا يزال على المشغّلين توفير سياساتهم الخاصة للاحتفاظ بالنسخ الاحتياطية، وإجراءات الاستعادة، والمراقبة، وخطة الاستعادة الخاصة بالنشر.
لا يثبت التأهيل سلوكًا عامًا لأنظمة ملفات network/FUSE العشوائية، أو لكل عميل MCP، أو للحمل غير محدود المدة، أو لكل أعباء عمل اللغة والترتيب. جرى اختبار نفاد سعة SQLite الحتمي وسلوك read-only الناتج عن الأذونات؛ أما حالة kernel ENOSPC حقيقية وmount فعلي بحالة EROFS فهما خارج نطاق تلك الأدلة. وتظل الدقة الدلالية للعربية/المحتوى متعدد اللغات مرتبطة بعبء العمل. ولا يسمح أي من هذه الحدود بتجاوز سياسة النطاق أو الصلاحية أو الحداثة أو التحقق.
راجع البنية و متطلبات البيئة لتفاصيل التنفيذ وبيئة التشغيل، و عمليات الإصدار للتثبيت/الترقية/التراجع المرتبط بالإصدارات.