背景: プロンプトだけでは安全は守れない
前回の実装では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.rsのexecute_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.rsとtrust.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_level | agent_role | maintenance_mode |
|---|---|---|---|
| 🐕 Bossdog | 2 | orchestrator | false |
| 🛡️ Guarddog | 2 | reviewer | false |
| 🐕🦺 Motherdog | 1 | specialist | false |
| 🔍 Debugdog | 1 | specialist | false |
| 🏥 Supportdog | 1 | specialist | false |
| 🏠 Stayflowdog | 1 | specialist | false |
| 💬 Chatwebdog | 1 | specialist | false |
| 🥋 Jiuflowdog | 1 | specialist | false |
| 📊 Bantodog | 1 | specialist | true |
| 🌟 Eliodog | 1 | specialist | true |
| 🦮 Guidedog | 1 | specialist | true |
デプロイ結果
全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毎の完全なログ
次のステップ
- Peer Review実フロー: Guarddogがレビューキューを確認→承認/却下→結果をaudit logに記録
- Bossdog Task Delegation: LLMベースのタスク分解→専門犬への割り当て
- ダッシュボード: enablerdao.com/agentsにリアルタイム監査ログ表示
- アラート: Tier 2/3のBLOCKED判定をSlack/Telegram通知
まとめ
プロンプトベースの安全策から、コンパイル時定数 + ランタイム強制 + 永続監査ログの4層防御に進化させました。LLMがjailbreakされても、Rustの型システムとtrust.rsのenforce()が物理的にブロックします。
ソースコード: GitHub — enablerdao/rustydog 監査ログAPI: rustdog-spin.fly.dev/api/trust/audit