סשנים ו-Taint
סשנים הם יחידת מצב השיחה הבסיסית ב-Triggerfish. כל סשן עוקב באופן עצמאי אחר רמת Taint -- סימן מים של סיווג שרושם את הרגישות הגבוהה ביותר של נתונים שהגישו במהלך הסשן. Taint מניע את החלטות הפלט של מנוע המדיניות: אם סשן מזוהם ברמת CONFIDENTIAL, שום נתונים מסשן זה לא יכולים לזרום לערוץ המסווג מתחת ל-CONFIDENTIAL.
מודל Taint של סשן
כיצד Taint עובד
כאשר סשן ניגש לנתונים ברמת סיווג, הסשן כולו מזוהם ברמה זו. Taint מציית לשלושה כללים:
- לפי שיחה: לכל סשן יש רמת Taint עצמאית משלו
- הסלמה בלבד: Taint יכול לעלות, לעולם לא לרדת בתוך סשן
- איפוס מלא מנקה הכול: Taint והיסטוריית שיחה נמחקים יחד
אבטחה 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 | מותר |
CONFIDENTIAL | ערוץ CONFIDENTIAL | מותר |
CONFIDENTIAL | ערוץ PUBLIC | חסום |
RESTRICTED | ערוץ CONFIDENTIAL | חסום |
כלי סשנים הזמינים לסוכן:
| כלי | תיאור | השפעת 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 ימים).
