الجلسات و Taint
الجلسات هي الوحدة الأساسية لحالة المحادثة في Triggerfish. كل جلسة تتبع بشكل مستقل مستوى taint -- علامة مائية للتصنيف تسجل أعلى حساسية للبيانات التي تم الوصول إليها خلال الجلسة. يقود Taint قرارات محرك السياسات للمخرجات: إذا كانت الجلسة ملوثة بمستوى CONFIDENTIAL، لا يمكن لأي بيانات من تلك الجلسة أن تتدفق إلى قناة مُصنفة أقل من CONFIDENTIAL.
نموذج Taint للجلسة
كيف يعمل Taint
عندما تصل جلسة إلى بيانات بمستوى تصنيف، تُلوث الجلسة بالكامل بذلك المستوى. يتبع Taint ثلاث قواعد:
- لكل محادثة: كل جلسة لها مستوى taint مستقل خاص بها
- التصعيد فقط: يمكن لـ taint أن يزداد، ولا ينخفض أبداً ضمن جلسة
- إعادة التعيين الكاملة تمسح كل شيء: يُمسح taint وسجل المحادثة معاً
SECURITY لا يمكن أبداً تقليل taint بشكل انتقائي. لا توجد آلية
لـ"إزالة تلوث" جلسة دون مسح سجل المحادثة بالكامل. هذا يمنع تسرب السياق -- إذا تذكرت الجلسة رؤية بيانات سرية، يجب أن يعكس taint ذلك. :::
لماذا لا يمكن لـ Taint أن ينخفض
حتى لو لم تعد البيانات المصنفة معروضة، لا تزال نافذة سياق LLM تحتويها. قد يشير النموذج إلى معلومات مصنفة أو يلخصها أو يرددها في استجابات مستقبلية. الطريقة الآمنة الوحيدة لخفض taint هي إزالة السياق بالكامل -- وهو بالضبط ما تفعله إعادة التعيين الكاملة.
أنواع الجلسات
يدير Triggerfish عدة أنواع من الجلسات، كل منها مع تتبع taint مستقل:
| نوع الجلسة | الوصف | Taint الأولي | يستمر عبر إعادات التشغيل |
|---|---|---|---|
| رئيسي | المحادثة المباشرة الرئيسية مع المالك | PUBLIC | نعم |
| قناة | واحدة لكل قناة متصلة (Telegram, Slack، إلخ.) | PUBLIC | نعم |
| خلفية | تُنشأ للمهام المستقلة (cron, webhooks) | PUBLIC | مدة المهمة |
| وكيل | جلسات لكل وكيل للتوجيه متعدد الوكلاء | PUBLIC | نعم |
| مجموعة | جلسات محادثة جماعية | PUBLIC | نعم |
جلسات الخلفية تبدأ دائماً بـ taint PUBLIC، بغض النظر عن مستوى taint
الجلسة الأم. هذا بالتصميم -- لا ينبغي لمهام cron والمهام المُشغلة بـ webhook أن ترث taint أي جلسة صادف أنها أنشأتها. :::
مثال على تصعيد Taint
إليك تدفقاً كاملاً يوضح تصعيد taint وحظر السياسة الناتج:
آلية إعادة التعيين الكاملة
إعادة تعيين الجلسة هي الطريقة الوحيدة لخفض taint. إنها عملية مقصودة ومدمرة:
- أرشفة سجلات النسب -- جميع بيانات النسب من الجلسة تُحفظ في تخزين التدقيق
- مسح سجل المحادثة -- تُمسح نافذة السياق بالكامل
- إعادة تعيين taint إلى PUBLIC -- الجلسة تبدأ من جديد
- طلب تأكيد المستخدم -- يتطلب hook
SESSION_RESETتأكيداً صريحاً قبل التنفيذ
بعد إعادة التعيين، الجلسة لا يمكن تمييزها عن جلسة جديدة تماماً. ليس لدى الوكيل أي ذاكرة للمحادثة السابقة. هذه هي الطريقة الوحيدة لضمان عدم تسرب البيانات المصنفة من خلال سياق LLM.
الاتصال بين الجلسات
عندما يرسل وكيل بيانات بين الجلسات باستخدام sessions_send، تنطبق نفس قواعد منع الكتابة للأسفل:
| Taint جلسة المصدر | قناة الجلسة المستهدفة | القرار |
|---|---|---|
PUBLIC | قناة PUBLIC | ALLOW |
CONFIDENTIAL | قناة CONFIDENTIAL | ALLOW |
CONFIDENTIAL | قناة PUBLIC | BLOCK |
RESTRICTED | قناة CONFIDENTIAL | BLOCK |
أدوات الجلسة المتاحة للوكيل:
| الأداة | الوصف | تأثير Taint |
|---|---|---|
sessions_list | سرد الجلسات النشطة مع مرشحات | لا تغيير في taint |
sessions_history | استرجاع نص الجلسة | Taint يرث من الجلسة المُشار إليها |
sessions_send | إرسال رسالة إلى جلسة أخرى | يخضع لفحص منع الكتابة للأسفل |
sessions_spawn | إنشاء جلسة مهمة خلفية | الجلسة الجديدة تبدأ بـ PUBLIC |
session_status | فحص حالة الجلسة الحالية وبياناتها الوصفية | لا تغيير في taint |
نسب البيانات
كل عنصر بيانات يعالجه Triggerfish يحمل بيانات وصفية للمنشأ -- سجل كامل لمصدر البيانات وكيف تم تحويلها وأين ذهبت. النسب هو مسار التدقيق الذي يجعل قرارات التصنيف قابلة للتحقق.
هيكل سجل النسب
json
{
"lineage_id": "lin_789xyz",
"content_hash": "sha256:a1b2c3d4...",
"origin": {
"source_type": "integration",
"source_name": "salesforce",
"record_id": "opp_00123ABC",
"record_type": "Opportunity",
"accessed_at": "2025-01-29T10:23:45Z",
"accessed_by": "user_456",
"access_method": "plugin_query"
},
"classification": {
"level": "CONFIDENTIAL",
"reason": "source_system_default",
"assigned_at": "2025-01-29T10:23:45Z",
"can_be_downgraded": false
},
"transformations": [
{
"type": "extraction",
"description": "Selected fields: name, amount, stage",
"timestamp": "2025-01-29T10:23:46Z",
"agent_id": "agent_123"
},
{
"type": "summarization",
"description": "LLM summarized 3 records into pipeline overview",
"timestamp": "2025-01-29T10:23:47Z",
"input_lineage_ids": ["lin_789xyz", "lin_790xyz", "lin_791xyz"],
"agent_id": "agent_123"
}
],
"current_location": {
"session_id": "sess_456",
"context_position": "assistant_response_3"
}
}قواعد تتبع النسب
| الحدث | إجراء النسب |
|---|---|
| قراءة بيانات من تكامل | إنشاء سجل نسب مع المصدر |
| تحويل بيانات بواسطة LLM | إضافة تحويل، ربط نسب المدخلات |
| تجميع بيانات من مصادر متعددة | دمج النسب، التصنيف = max(inputs) |
| إرسال بيانات إلى قناة | تسجيل الوجهة، التحقق من التصنيف |
| إعادة تعيين الجلسة | أرشفة سجلات النسب، مسح من السياق |
تصنيف التجميع
عندما تُجمع بيانات من مصادر متعددة (مثل ملخص LLM لسجلات من تكاملات مختلفة)، ترث النتيجة المُجمعة أقصى تصنيف لجميع المدخلات:
المدخل 1: INTERNAL (ويكي داخلي)
المدخل 2: CONFIDENTIAL (سجل Salesforce)
المدخل 3: PUBLIC (API الطقس)
تصنيف المخرج المُجمع: CONFIDENTIAL (الأقصى من المدخلات)يمكن لعمليات النشر المؤسسية تكوين قواعد خفض اختيارية للتجميعات الإحصائية
(المتوسطات، الأعداد، المجاميع لـ 10+ سجلات) أو البيانات المُجهلة المُعتمدة. جميع عمليات الخفض تتطلب قواعد سياسات صريحة، تُسجل مع مبرر كامل، وتخضع لمراجعة التدقيق. :::
قدرات التدقيق
يمكّن النسب من أربع فئات من استعلامات التدقيق:
- التتبع الأمامي: "ما حدث لبيانات سجل Salesforce X؟" -- يتبع البيانات للأمام من المصدر إلى جميع الوجهات
- التتبع الخلفي: "ما المصادر التي ساهمت في هذا المخرج؟" -- يتتبع مخرجاً رجوعاً إلى جميع سجلات مصدره
- مبرر التصنيف: "لماذا هذا مُعلم كـ CONFIDENTIAL؟" -- يُظهر سلسلة سبب التصنيف
- تصدير الامتثال: سلسلة الحفظ الكاملة للمراجعة القانونية أو التنظيمية
استمرارية Taint
يُخزن taint الجلسة عبر StorageProvider تحت مساحة الاسم taint:. هذا يعني أن taint ينجو من إعادات تشغيل daemon -- الجلسة التي كانت CONFIDENTIAL قبل إعادة التشغيل لا تزال CONFIDENTIAL بعدها.
تُخزن سجلات النسب تحت مساحة الاسم lineage: مع احتفاظ مدفوع بالامتثال (افتراضي 90 يوماً).
