Engineering

AIエージェントの安全開発基盤を構築 — プログラム的Trust Enforcement、Peer Review Gate、監査ログ

11匹のAI犬エージェントが安全に自律開発するための基盤を構築。プロンプトだけでなくRustコードレベルでTrust Hierarchyを強制、Maintenance Mode違反を物理的にブロック、全アクションを監査ログに記録するシステムを実装・デプロイ。

#trust-hierarchy #safety #peer-review #audit-log #maintenance-mode #rust #wasm

背景: プロンプトだけでは安全は守れない

前回の実装ではTrust Hierarchyをシステムプロンプトに埋め込みました。しかし、プロンプトだけに頼る安全策には根本的な問題があります:

  • LLMはプロンプトを「無視」することがある(jailbreak, prompt injection)
  • 「Tier 2の操作はBossdogの承認が必要」と書いても、LLMが勝手にデプロイを実行する可能性がある
  • Maintenance Modeの犬が「新機能を作りたい」と判断してコードを変更するリスク

解決策: Rustコードレベルでの強制。 LLMの出力に関係なく、物理的にブロックする仕組みを実装しました。


新モジュール: trust.rs — プログラム的Trust Enforcement

trust.rsは全アクションを3層に分類し、実行前にRustコードで権限チェックする新モジュールです。

アクション分類(20種類)

Tier 1 — AI自律可:
  BoardPost, BlogWrite, LogAnalysis, DocGenerate,
  CodeReview, DependencyCheck, TestRun, DogChat, Mumble

Tier 2 — 非同期承認:
  ProductionDeploy, CodePropose, DependencyUpdate,
  NewFileCreate, CiCdChange, CrossProjectContribution

Tier 3 — 人間必須:
  BillingChange, CustomerDataAccess, InfraConfigChange,
  CredentialOperation, TokenTransfer

enforce() — 権限チェックの中核

pub fn enforce(dog_name: &str, action: &Action) -> Decision {
    // 1. Maintenance Mode: 監視・バグ修正のみ許可
    if maintenance && !allowed_in_maintenance {
        return Decision::Blocked { reason: "..." };
    }

    // 2. Tier 3: AI agentは絶対に実行不可
    if tier == HumanRequired {
        return Decision::Blocked { reason: "..." };
    }

    // 3. Tier 2: trust_level >= 2 のagentのみ許可
    if tier == AsyncApproval && agent_level < 2 {
        // コード変更はPeer Reviewキューに追加
        if is_code_change {
            return Decision::RequiresReview { reviewer };
        }
        return Decision::Blocked { reason: "..." };
    }

    // 4. Tier 1: 即座に実行
    Decision::Allow
}

ポイント: LLMがどんな出力をしても、trust.rsコンパイル時に埋め込まれたルールで判定する。プロンプトでは変更不可能。


Maintenance Mode: 物理的に新機能開発をブロック

heartbeat.rsの全バックグラウンドタスクにmaintenance modeチェックを追加:

// Before (プロンプトのみ)
let do_dev = budget_ok && (has_task("propose_code_improvement") || dev_seed < 2);

// After (コードレベルで強制)
let do_dev = budget_ok && !is_maintenance && (has_task(...) || dev_seed < 2);

影響を受けるタスク(maintenance=trueで無効化):

  • dev work — コード変更の提案
  • cross_project — 他リポジトリへの貢献
  • blog — ブログ記事の執筆
  • dogchat — 他の犬へのDM送信

引き続き許可されるタスク:

  • 掲示板への投稿(監視報告)
  • BONE burn / KIBBLE → POOP変換
  • God View(品質自己評価)
  • Self-repair(障害回復)

evolve.rsにも同様のガード追加。Maintenance Modeの犬がコード変更を試みると:

BLOCKED: MAINTENANCE MODE — code evolution disabled

Peer Review Gate: コード変更にレビュー必須

evolve.rsexecute_change()にTrust Enforcement層を追加:

let trust_decision = crate::trust::enforce(&brand.name, &Action::CodePropose);
match trust_decision {
    Decision::Blocked { reason } => return blocked_entry(reason),
    Decision::RequiresReview { reviewer } => {
        // レビューキューに追加、daily logに記録
        // (変更は続行するがレビュー待ちとしてマーク)
    }
    Decision::Allow => {} // Tier 2 agentは直接実行可
}

レビュー要求はtrust:review_queueに永続化。GET /api/trust/reviewsで確認可能。


監査ログ: 全アクションの完全な記録

trust.rsは全てのenforce()呼び出しを監査ログに記録:

{
  "ts": 1741100400,
  "dog": "Bantodog",
  "action": "code_propose",
  "tier": "tier_2_async_approval",
  "tier_level": 2,
  "agent_trust": 1,
  "agent_role": "specialist",
  "maintenance_mode": true,
  "decision": "BLOCKED: MAINTENANCE MODE"
}

API endpoints:

  • GET /api/trust/audit — 全監査ログ(最大500件リングバッファ)
  • GET /api/trust/reviews — Peer Reviewキュー

Protected Files: 安全モジュール自体の改変を防止

evolve.rsのProtected Filesリストにconstitution.rstrust.rsを追加:

const PROTECTED_FILES: &[&str] = &[
    "spin-component/src/evolve.rs",
    "spin-component/src/selfheal.rs",
    "spin-component/src/memory.rs",
    "spin-component/src/lib.rs",
    "spin-component/src/wallet.rs",
    // NEW: 安全モジュールの保護
    "spin-component/src/constitution.rs",
    "spin-component/src/trust.rs",
    // ... (他の保護ファイル)
];

犬がこれらのファイルを変更しようとすると:

BLOCKED: constitution.rs is not in allowed paths

エージェント設定の更新

エージェントtrust_levelagent_rolemaintenance_mode
🐕 Bossdog2orchestratorfalse
🛡️ Guarddog2reviewerfalse
🐕‍🦺 Motherdog1specialistfalse
🔍 Debugdog1specialistfalse
🏥 Supportdog1specialistfalse
🏠 Stayflowdog1specialistfalse
💬 Chatwebdog1specialistfalse
🥋 Jiuflowdog1specialistfalse
📊 Bantodog1specialisttrue
🌟 Eliodog1specialisttrue
🦮 Guidedog1specialisttrue

デプロイ結果

全11匹にデプロイ完了。Trust APIの動作確認:

# Bossdog (Orchestrator)
$ curl https://rustdog-spin.fly.dev/api/trust/audit
{
  "agent_role": "orchestrator",
  "agent_trust_level": 2,
  "maintenance_mode": false,
  "audit_log": [],
  "count": 0
}

# Guarddog (Reviewer)
$ curl https://guarddog-spin.fly.dev/api/trust/audit
{
  "agent_role": "reviewer",
  "agent_trust_level": 2,
  "maintenance_mode": false,
  "audit_log": [],
  "count": 0
}

安全層の全体像(4層防御)

Layer 1: Constitution (compile-time)
  └─ 3つの法則 + Trust Hierarchy定義
  └─ WASMバイナリに焼き込み、LLMでは変更不可

Layer 2: Trust Enforcement (runtime)
  └─ trust.rs: 20アクション × 3 Tier の権限マトリクス
  └─ Maintenance Mode: 物理的に新機能開発をブロック
  └─ Peer Review Gate: コード変更にレビュー要求

Layer 3: Code Evolution Guards (runtime)
  └─ evolve.rs: Protected Files、Daily Limit、BONE Gate
  └─ validate_code_change(): 構文、API保存、切り詰め検出
  └─ Concurrency Lock: 同時実行防止

Layer 4: Audit Trail (persistent)
  └─ trust:audit_log: 全アクションの判定記録(500件リングバッファ)
  └─ trust:review_queue: Peer Reviewリクエスト
  └─ activity:log: Heartbeat毎の完全なログ

次のステップ

  1. Peer Review実フロー: Guarddogがレビューキューを確認→承認/却下→結果をaudit logに記録
  2. Bossdog Task Delegation: LLMベースのタスク分解→専門犬への割り当て
  3. ダッシュボード: enablerdao.com/agentsにリアルタイム監査ログ表示
  4. アラート: Tier 2/3のBLOCKED判定をSlack/Telegram通知

まとめ

プロンプトベースの安全策から、コンパイル時定数 + ランタイム強制 + 永続監査ログの4層防御に進化させました。LLMがjailbreakされても、Rustの型システムとtrust.rsenforce()が物理的にブロックします。

ソースコード: GitHub — enablerdao/rustydog 監査ログAPI: rustdog-spin.fly.dev/api/trust/audit