slb について
SLB は、コーディングエージェントが開始する破壊的な可能性のあるコマンドに二者承認ルールを適用する Go コマンドラインツールです。リスク分類と必要なレビューを経た後、ローカルシェルでコマンドを実行します。
主な機能
- 01リスク段階ごとにコマンドを分類
- 02リスクに応じて承認を要求
- 03実行前に承認とコマンドの完全性を検証
- 04ドライランとロールバック用状態の保存に対応
- 05セッション、レビュー、監査のコマンドを提供
- 06Claude Code hooks と連携
活用シーン
- 01コーディングエージェントの破壊的コマンドを制御
- 02複数エージェントセッション間の相互承認を調整
- 03TUI で保留中のコマンド要求をレビュー
- 04コマンドの結果と実行履歴を監査
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ dicklesworthstone/ agent_flywheel_clawdbot_skills_and_integrations --skill slbインストール後、Claude Code で/slbを入力して読み込まれたか確認します。
詳細
SLB — 同時起動ボタン
AI コーディングエージェントが破壊的な可能性のあるコマンドを実行する際に、二者承認ルールを適用する Go 製 CLI です。エージェントがリスクのある操作(例:rm -rf、git push --force、kubectl delete、DROP TABLE)を実行しようとすると、SLB は実行前にピアレビューと明示的な承認を要求します。
開発の背景
コーディングエージェントは視野が狭くなったり、幻覚を起こしたり、文脈を誤解したりすることがあります。2 人目のレビュアー(できれば異なるモデルやツールを使用するレビュアー)が、取り返しのつかない事態になる前に誤りを見つけます。
SLB は、複数のエージェントターミナルが並行して動作し、1 つの不適切なコマンドで作業、データ、インフラストラクチャが破壊される可能性があるマルチエージェントワークフロー向けに構築されています。
重要な設計:クライアント側での実行
コマンドはサーバー上ではなく、あなたのシェル環境で実行されます。 デーモンは実行者ではなく、承認を検証する NOTARY です。そのため、コマンドは次の環境を引き継ぎます。
- AWS_PROFILE、AWS_ACCESS_KEY_ID
- KUBECONFIG
- 有効化された仮想環境
- SSH_AUTH_SOCK
- データベース接続文字列
リスクレベル
| レベル | 承認数 | 自動承認 | 例 |
|---|---|---|---|
| CRITICAL | 2 以上 | なし | rm -rf /、DROP DATABASE、terraform destroy、git push --force |
| DANGEROUS | 1 | なし | rm -rf ./build、git reset --hard、kubectl delete、DROP TABLE |
| CAUTION | 0 | 30 秒後 | rm file.txt、git branch -d、npm uninstall |
| SAFE | 0 | 即時 | rm *.log、git stash、kubectl delete pod |
クイックスタート
インストール
# One-liner
curl -fsSL https://raw.githubusercontent.com/Dicklesworthstone/slb/main/scripts/install.sh | bash
# Or with go install
go install github.com/Dicklesworthstone/slb/cmd/slb@latest
プロジェクトを初期化する
cd /path/to/project
slb init
次の内容を含む .slb/ ディレクトリが作成されます。
state.db- SQLite データベース(信頼できる唯一の情報源)config.toml- プロジェクト設定pending/- 保留中のリクエスト用 JSON ファイルlogs/- 実行ログ
基本的なワークフロー
# 1. Start a session (as an AI agent)
slb session start --agent "GreenLake" --program "claude-code" --model "opus"
# Returns: session_id and session_key
# 2. Run a dangerous command (blocks until approved)
slb run "rm -rf ./build" --reason "Clean build artifacts" --session-id <id>
# 3. Another agent reviews and approves
slb pending # See what's waiting
slb review <request-id> # View full details
slb approve <request-id> --session-id <reviewer-id> --comment "Looks safe"
# 4. Original command executes automatically after approval
コマンドリファレンス
セッション管理
slb session start --agent <name> --program <prog> --model <model>
slb session end --session-id <id>
slb session resume --agent <name> --create-if-missing # Resume after crash
slb session list # Show active sessions
slb session heartbeat --session-id <id> # Keep session alive
slb session gc --threshold 2h # Clean stale sessions
リクエストと実行
# Primary command (atomic: check, request, wait, execute)
slb run "<command>" --reason "..." --session-id <id>
# Plumbing commands
slb request "<command>" --reason "..." # Create request only
slb status <request-id> --wait # Check/wait for status
slb pending --all-projects # List pending requests
slb cancel <request-id> # Cancel own request
レビューと承認
slb review <request-id> # Show full details
slb approve <request-id> --session-id <id> --comment "..."
slb reject <request-id> --session-id <id> --reason "..."
実行
slb execute <request-id> # Execute approved request
slb emergency-execute "<cmd>" --reason "..." # Human override (logged)
slb rollback <request-id> # Rollback if captured
パターン管理
slb patterns list --tier critical # List patterns by tier
slb patterns test "<command>" # Check what tier a command gets
slb patterns add --tier dangerous "<pattern>" # Add runtime pattern
デーモンと TUI
slb daemon start --foreground # Start background daemon
slb daemon stop # Stop daemon
slb daemon status # Check daemon status
slb tui # Launch interactive TUI
slb watch --session-id <id> --json # Stream events (NDJSON)
Claude Code フック
slb hook install # Install PreToolUse hook
slb hook status # Check installation
slb hook test "<command>" # Test classification
slb hook uninstall # Remove hook
履歴と監査
slb history --tier critical --status executed # Filter history
slb history -q "rm -rf" # Full-text search
slb show <request-id> --with-reviews # Detailed view
slb outcome record <request-id> --problems # Record feedback
slb outcome stats # Execution statistics
パターンマッチングエンジン
分類アルゴリズム
-
正規化:シェルを考慮したトークン化によってコマンドを解析します
- ラッパープレフィックスを除去します:
sudo、doas、env、time、nohup bash -c 'command'から内部コマンドを抽出します- パスを解決します:
./foo→/absolute/path/foo
- ラッパープレフィックスを除去します:
-
複合コマンドの処理:
;、&&、||、|を含むコマンドは分割され、各セグメントが分類されます。最も高いリスクのセグメントが適用されます。echo "done" && rm -rf /etc → CRITICAL (rm -rf /etc wins) ls && git status → SAFE (no dangerous patterns) -
シェルを考慮した分割:引用符内の区切り文字は保持されます。
psql -c "DELETE FROM users; DROP TABLE x;" → Single segment (SQL) echo "foo" && rm -rf /tmp → Two segments -
パターンの優先順位:SAFE → CRITICAL → DANGEROUS → CAUTION(最初に一致したものを適用)
-
フェイルセーフな解析処理:解析に失敗した場合、レベルが1 段階引き上げられます。
- SAFE → CAUTION
- CAUTION → DANGEROUS
- DANGEROUS → CRITICAL
デフォルトパターン
CRITICAL(2 件以上の承認):
rm -rf /...、DROP DATABASE/SCHEMA、TRUNCATE TABLE、terraform destroy、kubectl delete node/namespace/pv/pvc、git push --force、aws terminate-instances、dd ... of=/dev/
DANGEROUS(1 件の承認):
rm -rf、git reset --hard、git clean -fd、kubectl delete、terraform destroy -target、DROP TABLE、chmod -R、chown -R
CAUTION(30 秒後に自動承認):
rm <file>、git stash drop、git branch -d、npm/pip uninstall
SAFE(レビューを省略):
rm *.log、rm *.tmp、git stash、kubectl delete pod、npm cache clean
リクエストのライフサイクル
状態遷移
┌─────────────┐
│ PENDING │
└──────┬──────┘
┌───────────────┼───────────────┐───────────────┐
▼ ▼ ▼ ▼
┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐
│ APPROVED │ │ REJECTED │ │ CANCELLED│ │ TIMEOUT │
└────┬─────┘ └──────────┘ └──────────┘ └────┬─────┘
│ (terminal) (terminal) │
▼ ▼
┌──────────┐ ┌──────────┐
│EXECUTING │ │ESCALATED │
└────┬─────┘ └──────────┘
│
┌──────┴──────┬──────────┐
▼ ▼ ▼
┌────────┐ ┌─────────┐ ┌────────┐
│EXECUTED│ │EXEC_FAIL│ │TIMED_OUT│
└────────┘ └─────────┘ └────────┘
(terminal) (terminal) (terminal)
承認の有効期限
- 標準リクエスト:30 分(設定可能)
- CRITICAL リクエスト:10 分(より厳格)
実行前に承認の有効期限が切れた場合は、再承認が必要です。
実行検証(5つのセキュリティゲート)
コマンドを実行する前に、5つのゲートすべてを通過する必要があります。
| ゲート | 確認内容 |
|---|---|
| 1. ステータス | リクエストが APPROVED 状態である必要があります |
| 2. 有効期限 | 承認の TTL が経過していない必要があります |
| 3. ハッシュ | コマンドの SHA-256 ハッシュが一致する必要があります(改ざん検知) |
| 4. リスクティア | リスクティアが引き続き一致している必要があります(パターンが変更されている可能性があります) |
| 5. 初回実行者 | アトミックな取得により、競合状態を防ぎます |
ドライランとロールバック
ドライランの事前確認
対応コマンドでは、SLB は先にドライラン版を実行できます。
| コマンド | ドライラン版 |
|---|---|
terraform apply | terraform plan |
kubectl apply | kubectl diff |
git push | git diff(変更内容を表示) |
[general]
enable_dry_run = true
ロールバック状態の取得
実行前に、SLB は状態を取得できます。
[general]
enable_rollback_capture = true
max_rollback_size_mb = 100
取得される状態には、次のものが含まれます。
- ファイルシステム:影響を受けるパスの Tar アーカイブ
- Git:HEAD コミット、ブランチ、変更状態、未追跡ファイル
- Kubernetes:影響を受けるリソースの YAML マニフェスト
slb rollback <request-id> # Restore captured state
slb rollback <request-id> --force # Force overwrite
設定
設定は階層構造になっており、優先度の低いものから高いものへ順に適用されます。
- 組み込みのデフォルト値
- ユーザー設定(
~/.slb/config.toml) - プロジェクト設定(
.slb/config.toml) - 環境変数(
SLB_*) - コマンドラインフラグ
設定例
[general]
min_approvals = 2
request_timeout = 1800 # 30 minutes
approval_ttl_minutes = 30
timeout_action = "escalate" # or "auto_reject", "auto_approve_warn"
require_different_model = true # Reviewer must use different AI model
[rate_limits]
max_pending_per_session = 5
max_requests_per_minute = 10
[notifications]
desktop_enabled = true
webhook_url = "https://slack.com/webhook/..."
[daemon]
tcp_addr = "" # For Docker/remote agents
tcp_require_auth = true
[agents]
trusted_self_approve = ["senior-agent"]
trusted_self_approve_delay_seconds = 300
高度な設定
プロジェクト間レビュー
[general]
cross_project_reviews = true
review_pool = ["agent-a", "agent-b", "human-reviewer"]
競合の解決
[general]
conflict_resolution = "any_rejection_blocks" # Default
# Options: any_rejection_blocks | first_wins | human_breaks_tie
動的クォーラム
[patterns.critical]
dynamic_quorum = true
dynamic_quorum_floor = 2 # Minimum approvals even with few reviewers
デーモンアーキテクチャ
IPC 通信
Unix ドメインソケット(プロジェクトごと):
/tmp/slb-<hash>.sock
JSON-RPC プロトコル
すべてのデーモン通信で JSON-RPC 2.0 を使用します。
{"jsonrpc": "2.0", "method": "hook_query", "params": {"command": "rm -rf /"}, "id": 1}
利用可能なメソッド:hook_query、hook_health、verify_execution、subscribe
TCP モード(Docker/リモート)
[daemon]
tcp_addr = "0.0.0.0:9876"
tcp_require_auth = true
tcp_allowed_ips = ["192.168.1.0/24"]
タイムアウト処理
| アクション | 動作 |
|---|---|
escalate | ESCALATED に遷移し、人間に通知します(デフォルト) |
auto_reject | リクエストを自動的に却下します |
auto_approve_warn | CAUTION ティアを警告付きで自動承認します |
エージェントイベントのストリーミング
slb watch は、リアルタイムの NDJSON イベントストリーミングを提供します。
slb watch --session-id <id>
{"type":"request_pending","request_id":"abc123","tier":"dangerous","command":"rm -rf ./build","ts":"..."}
{"type":"request_approved","request_id":"abc123","reviewer":"BlueLake","ts":"..."}
{"type":"request_executed","request_id":"abc123","exit_code":0,"ts":"..."}
イベントタイプ:request_pending、request_approved、request_rejected、request_executed、request_timeout、request_cancelled
自動承認モード(レビュアーエージェント向け)
slb watch --session-id <id> --auto-approve-caution
リクエストへの添付ファイル
レビュアーにコンテキストを提供します。
# Attach file
slb request "DROP TABLE users" --reason "..." --attach ./schema.sql
# Attach screenshot
slb request "kubectl delete deployment" --reason "..." --attach ./dashboard.png
# Attach command output
slb request "terraform destroy" --reason "..." --attach-cmd "terraform plan -destroy"
緊急時のオーバーライド
真の緊急時には、人間が詳細なログを残してバイパスできます。
# Interactive (prompts for confirmation)
slb emergency-execute "rm -rf /tmp/broken" --reason "System emergency: disk full"
# Non-interactive (requires hash acknowledgment)
HASH=$(echo -n "rm -rf /tmp/broken" | sha256sum | cut -d' ' -f1)
slb emergency-execute "rm -rf /tmp/broken" --reason "Emergency" --yes --ack $HASH
安全対策:理由の入力必須、ハッシュの確認、詳細なログ記録、任意のロールバック状態取得。
実行結果の追跡
実行結果のフィードバックを記録して、パターン分類を改善します。
slb outcome record <request-id> # Success
slb outcome record <request-id> --problems --description "Deleted wrong files"
slb outcome stats # Statistics
TUI ダッシュボード
slb tui
┌─────────────────────────────────────────────────────────────────────┐
│ SLB Dashboard │
├─────────────────┬───────────────────────────────────────────────────┤
│ AGENTS │ PENDING REQUESTS │
│ ─────── │ ──────────────── │
│▸ GreenLake │▸ abc123 CRITICAL rm -rf /etc BlueLake 2m │
│ BlueLake │ def456 DANGEROUS git reset --hard GreenLake 5m │
├─────────────────┴───────────────────────────────────────────────────┤
│ ACTIVITY │
│ 10:30:15 GreenLake approved abc123 │
│ 10:28:42 BlueLake requested def456 (DANGEROUS) │
└─────────────────────────────────────────────────────────────────────┘
キー:Tab(パネルを切り替え)、↑/↓(移動)、Enter(表示)、a(承認)、r(却下)、q(終了)
Claude Code フックの統合
# Install hook
slb hook install
# Hook actions returned to Claude Code:
# - allow: Command proceeds
# - ask: User prompted (CAUTION tier)
# - block: Blocked with message to use `slb request`
IDE 連携を生成します。
slb integrations claude-hooks > ~/.claude/hooks.json
slb integrations cursor-rules > .cursorrules
セキュリティ設計の原則
多層防御(6層)
- パターンベースの分類
- ピアレビューの必須化
- コマンドハッシュのバインディング(SHA-256)
- 承認 TTL
- 実行検証ゲート
- 監査ログ
暗号学的な保証
- コマンドのバインディング:実行時に SHA-256 ハッシュを検証します
- レビュー署名:セッションキーを使用した HMAC
- セッションキー:セッションごとに生成し、平文では保存しません
フェイルクローズ動作
- デーモンに接続できない → 危険なコマンドをブロックします(フック)
- 解析エラー → ティアを1段階引き上げます
- 承認の期限切れ → 新たな承認を要求します
- ハッシュの不一致 → 実行を却下します
終了コード
| コード | 意味 |
|---|---|
0 | 成功 |
1 | 一般エラー |
2 | 無効な引数 |
3 | リクエストが見つかりません |
4 | 権限がありません |
5 | タイムアウト |
6 | レート制限 |
環境変数
| 変数 | 説明 |
|---|---|
SLB_MIN_APPROVALS | 最小承認数 |
SLB_REQUEST_TIMEOUT | リクエストのタイムアウト(秒) |
SLB_TIMEOUT_ACTION | タイムアウト時の動作 |
SLB_DESKTOP_NOTIFICATIONS | デスクトップ通知を有効にする |
SLB_WEBHOOK_URL | Webhook 通知 URL |
SLB_DAEMON_TCP_ADDR | TCP リッスンアドレス |
SLB_TRUSTED_SELF_APPROVE | 信頼するエージェント(カンマ区切り) |
トラブルシューティング
「デーモンが実行されていません」という警告
SLB はデーモンなしでも動作します(ファイルベースのポーリング)。リアルタイムで使用するには起動します。
slb daemon start
「アクティブなセッションはすでに存在します」
slb session resume --agent "YourAgent" --create-if-missing
承認の期限切れ
再リクエストします。
slb run "<command>" --reason "..."
コマンドハッシュの不一致
承認後にコマンドが変更されました。変更後のコマンドを再リクエストしてください。
安全に関する注意
SLB は、危険な操作に対して慎重な対応と相互レビューを追加します。以下の代わりにはなりません。
- 最小権限の認証情報
- 環境の安全対策
- 適切なアクセス制御
- バックアップ戦略
SLB は唯一の保護策ではなく、多層防御として使用してください。
Flywheel との連携
| ツール | 連携 |
|---|---|
| Agent Mail | 受信トレイ経由でレビュアーに通知し、監査証跡を追跡します |
| BV | SLB リクエストを beads として追跡します |
| CASS | セッションを横断して過去の SLB の判断を検索します |
| DCG | DCG が自動的にブロックし、SLB が相互レビューのレイヤーを追加します |
| NTM | エージェントのターミナル間でレビューを調整します |