セッションとTaint
セッションはTriggerfishshの会話状態の基本単位です。すべてのセッションは独立して taintレベルを追跡します — セッション中にアクセスされたデータの最高感度を記録する 分類の透かしです。Taintはポリシーエンジンの出力決定を駆動します:セッションが CONFIDENTIALにtaintされている場合、そのセッションのデータはCONFIDENTIAL以下に 分類されたチャンネルに流れることができません。
セッションTaintモデル
Taintの仕組み
セッションが分類レベルのデータにアクセスすると、セッション全体がそのレベルで taintされます。Taintは3つのルールに従います:
- 会話ごと: 各セッションは独自の独立したtaintレベルを持ちます
- エスカレートのみ: Taintはセッション内で増加することはできますが、低下することはありません
- 完全リセットですべてをクリア: Taintと会話履歴は一緒にクリアされます
セキュリティ Taintは選択的に低下させることができません。会話履歴全体を
クリアせずにセッションを「アンtaint」するメカニズムはありません。これはコンテキスト 漏洩を防ぎます — セッションが機密データを見たことを記憶している場合、taintはそれを 反映する必要があります。 :::
Taintが低下できない理由
分類されたデータがもはや表示されていなくても、LLMのコンテキストウィンドウにはまだ それが含まれています。モデルは将来のレスポンスで分類された情報を参照・要約・エコー する可能性があります。Taintを安全に下げる唯一の方法はコンテキストを完全に排除する ことです — それが完全リセットの実行内容です。
セッションタイプ
Triggerfishshはいくつかのセッションタイプを管理しており、それぞれが独立したtaint追跡を持ちます:
| セッションタイプ | 説明 | 初期Taint | 再起動後も永続 |
|---|---|---|---|
| メイン | オーナーとのプライマリな直接会話 | PUBLIC | はい |
| チャンネル | 接続チャンネルごとに1つ(Telegram、Slackなど) | PUBLIC | はい |
| バックグラウンド | 自律タスク用に生成(cron、webhook) | PUBLIC | タスクの期間 |
| エージェント | マルチエージェントルーティング用のエージェントごとのセッション | PUBLIC | はい |
| グループ | グループチャットセッション | PUBLIC | はい |
バックグラウンドセッションは、親セッションのtaintレベルに関係なく、常に
PUBLIC taintで開始します。これは設計によるものです — cronジョブとwebhookトリガー タスクはそれらを生成したセッションのtaintを継承すべきではありません。 :::
Taintエスカレーションの例
taintエスカレーションと結果的なポリシーブロックを示す完全なフローです:
完全リセットメカニズム
セッションリセットはtaintを下げる唯一の方法です。意図的で破壊的な操作です:
- 系譜レコードをアーカイブ — セッションのすべての系譜データが監査ストレージに 保存されます
- 会話履歴をクリア — コンテキストウィンドウ全体が消去されます
- taintをPUBLICにリセット — セッションが新鮮に開始されます
- ユーザーの確認を要求 —
SESSION_RESEThookは実行前に明示的な確認を要求します
リセット後、セッションは新しいセッションと区別がつきません。エージェントは以前の 会話の記憶を持ちません。これが分類されたデータが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変更なし |
データ系譜
Triggerfishshが処理するすべてのデータ要素はプロベナンスメタデータを持ちます — データがどこから来て、どのように変換され、どこに行ったかの完全な記録です。系譜は 分類決定を検証可能にする監査証跡です。
系譜レコードの構造
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": "選択されたフィールド: name、amount、stage",
"timestamp": "2025-01-29T10:23:46Z",
"agent_id": "agent_123"
},
{
"type": "summarization",
"description": "LLMが3つのレコードをパイプライン概要に要約",
"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(入力) |
| チャンネルにデータを送信 | 宛先を記録し、分類を確認 |
| セッションリセット | 系譜レコードをアーカイブし、コンテキストから削除 |
集約分類
複数のソースからのデータが結合された場合(例:異なる統合からのレコードのLLMサマリー)、 集約された結果はすべての入力の最高分類を継承します:
入力1: INTERNAL (内部wiki)
入力2: CONFIDENTIAL (Salesforceレコード)
入力3: PUBLIC (天気API)
集約出力の分類: CONFIDENTIAL (入力の最大値)エンタープライズデプロイメントでは、統計的集計(10+レコードの平均、カウント、
合計)または認証された匿名化データに対するオプションのダウングレードルールを設定 できます。すべてのダウングレードは明示的なポリシールールを必要とし、完全な正当化と ともにログ記録され、監査レビューの対象となります。 :::
監査機能
系譜は4つのカテゴリの監査クエリを可能にします:
- フォワードトレース: 「Salesforceレコード X のデータに何が起こりましたか?」— 起点からすべての宛先へデータを追跡
- バックワードトレース: 「この出力にどのソースが貢献しましたか?」— 出力を すべてのソースレコードに遡る
- 分類の正当化: 「なぜこれはCONFIDENTIALとマークされているのですか?」— 分類理由のチェーンを表示
- コンプライアンスエクスポート: 法的または規制上のレビュー用の完全な監護連鎖
Taintの永続性
セッションtaintはtaint:名前空間のStorageProviderを通じて永続化されます。これは taintがデーモンの再起動後も存続することを意味します — 再起動前にCONFIDENTIALだった セッションは再起動後もCONFIDENTIALです。
系譜レコードはlineage:名前空間の下に保存され、コンプライアンス主導の保持期間 (デフォルト90日)があります。
