
自律型AIエージェントのためのセキュア*ランタイム。平易な英語の憲法からポリシーを生成。(*https://ironcurtain.dev)
自律型AIエージェントのためのセキュア*ランタイム。セキュリティポリシーは人間が読める憲法から導出されます。
*「セキュア」と書かれているのを見たら、すぐに疑ってください。ここで「セキュア」が意味するものは?
[!WARNING] 研究プロトタイプ。 IronCurtainは、AIエージェントを実際に有用になる程度に安全にする方法を探求する初期段階の研究プロジェクトです。API、構成形式、アーキテクチャは変更される可能性があります。貢献とフィードバックを歓迎します。
エージェントはリポジトリをクローンし、変更をプッシュするよう求められます。git_clone と git_push はどちらもポリシーエンジンによって昇格されますが、自動承認者が自動的に承認します — コマンドモード(Ctrl-A)からの信頼された入力が明確な意図を提供したため、手動の /approve は不要でした。
自律型AIエージェントは、ファイルの管理、gitコマンドの実行、メッセージの送信、APIとのやり取りをユーザーに代わって行えます。しかし、今日のエージェントフレームワークは、ファイルシステム、認証情報、ネットワークへの完全なアクセスなど、ユーザーと同じ権限をエージェントに与えています。セキュリティ研究者はこれをアンビエント権限と呼びます。これは、一度のプロンプトインジェクションやマルチターンのドリフトによって、エージェントがファイルを削除したり、データを外部に持ち出したり、悪意のあるコードをプッシュしたりする可能性があることを意味します。
一般的な対応は、エージェントを狭いサンドボックスに制限する(有用性が制限される)か、ユーザーにすべての操作の承認を求める(自律性が制限される)かのどちらかです。どちらも満足のいくものではありません。
IronCurtainは異なる道を選びます。セキュリティの意図を平易な英語で表現し、システムに強制方法を考えさせるのです。
あなたは憲法を書きます。これは、エージェントが何を許可され、何を許可されないかを記述した短い文書です。IronCurtainは、LLMパイプラインを使ってこれを決定的なセキュリティポリシーにコンパイルし、生成されたテストシナリオに対してコンパイル済みルールを検証し、実行時にすべてのツール呼び出しでポリシーを強制します。その結果、ユーザーが自然言語で定義した境界の範囲内で自律的に動作できるエージェントが得られます。
主なアイデア:
IronCurtainは、異なる信頼モデルを持つ2つのセッションモードをサポートしています:
どちらのモードでも、エージェントは信頼されていません。セキュリティはモデルが指示に従うことに依存せず、境界で強制されます。
図、レイヤーごとの信頼分析、macOSプラットフォームに関する注意事項を含む完全なアーキテクチャについては、SANDBOXING.mdを参照してください。
isolated-vmが必要とします。24と26はビルド済みバイナリをインストールし、Node 22はインストール時にソースからコンパイルするためC/C++ツールチェーンが必要です)。奇数番号のライン(23、25)は実行できますが未テストです — ironcurtain doctor が警告します。containerが代替バックエンドとして機能します(コンテナごとにVM。そのサービスが実行されているときに自動的に使用されます — ironcurtain config の containerRuntime を参照)。グローバルCLIツールとして(エンドユーザー向け):```bash npm install -g @provos/ironcurtain
**ソースから(開発):**```bash
git clone https://github.com/provos/ironcurtain.git
cd ironcurtain
npm install
1. APIキーを設定します:```bash export ANTHROPIC_API_KEY=sk-ant-...
キーはプロジェクトルートの `.env` ファイルに置くこともできます(`dotenv` により自動的に読み込まれます)。また、`ironcurtain config` で `~/.ironcurtain/config.json` に追加することもできます。環境変数は設定ファイルの値よりも優先されます。対応: `ANTHROPIC_API_KEY`、`GOOGLE_GENERATIVE_AI_API_KEY`、`OPENAI_API_KEY`。
**2. 初回起動ウィザードを実行する**(推奨の mux パスを使用する前に明示的に実行してください。非 mux の初回 `ironcurtain start` でも自動的に実行されます):```bash
ironcurtain setup
GitHubトークンの設定、Web検索プロバイダー、モデル選択、その他の設定について順を追って説明します。選択内容を保存した ~/.ironcurtain/config.json を作成します。
IronCurtainには、開発者体験を重視したデフォルトポリシーが同梱されています。読み取り専用の操作は許可され、変更(書き込み、プッシュ、PR作成)は人間の承認を求めてエスカレーションされます。セットアップ後すぐに使い始められます。
IronCurtainを使う際の推奨方法です。IronCurtainがすべてのツール呼び出しをポリシーエンジンを介して仲介する一方で、エージェントの対話型TUI(Claude CodeまたはGoose)の全機能を単一のターミナルで利用できます。```bash ironcurtain mux
**主な機能:**
- **完全なエージェントTUI** — エージェントはネットワークアクセスなしのDockerコンテナ内のPTYで実行されます。ローカルで実行しているのとまったく同じように操作できます。
- **インラインのエスカレーション処理** — ツール呼び出しが承認を必要とする場合、エスカレーションピッカーがビューポートにオーバーレイされ、単一キー操作(a/d/w で承認/拒否/ホワイトリスト登録)が可能になります。`/approve+ N` を使用すると、セッションの残り期間中、ドメインまたはパスをホワイトリストに登録できます。
- **信頼済みユーザー入力** — コマンドモード(Ctrl-A)で入力されたテキストは、コンテナに入る前にホスト側でキャプチャされます。これにより、自動承認者が利用できる検証済みの意図シグナルが生成されます。たとえば、「push my changes to origin」と入力すると、後続の `git_push` エスカレーションが自動承認されます。
- **タブ管理** — 複数の並行セッションを生成(`/new`)、切り替え(`/tab N`、Alt-1..9)、終了(`/close`)できます。複数のmuxインスタンスを並行して実行できます。
完全なウォークスルー(入力モード、信頼済み入力のセキュリティモデル、エスカレーションワークフロー、キーボードリファレンス)については [DEVELOPER_GUIDE.md](https://github.com/provos/ironcurtain/blob/master/DEVELOPER_GUIDE.md) を参照してください。
### 非muxセッション
`ironcurtain start` は、簡単な単発タスク、スクリプト、またはローカルの組み込みエージェントを明示的に使用したい場合に使います。通常のインタラクティブなDockerエージェント作業には、`ironcurtain mux` を使用してください。```bash
ironcurtain start "Summarize the files in ./src" # Single-shot mode
ironcurtain start -w ./my-project "Fix the tests" # Single-shot workspace mode
ironcurtain start --agent builtin # Local builtin REPL, no Docker
ironcurtain start --persona my-assistant "Check my email" # Use a persona
IronCurtain はセッション再開 (--resume <session-id>)、レガシーな raw PTY/デバッグモード、モバイル承認用の Signal メッセージングトランスポート、そしてスケジュールされた cron ジョブ用のデーモンモードもサポートしています。デーモンには、ブラウザベースの監視とエスカレーション処理のためのオプションの Web UI (--web-ui) があります。詳細は RUNNING_MODES.md を参照してください。
IronCurtain は構造化されたワークフローを通じて複数の AI エージェントをオーケストレーションします。同梱の 脆弱性発見 ワークフローは、段階的なハーネスパイプライン(Tier 1 単一関数 → Tier 2 複数コンポーネント → Tier 3 フルビルド)を通じてネイティブコードのメモリ安全性とロジックバグを探索し、libFuzzer/AFL++ のカバレッジゲーティング、仮説駆動型の discover/triage 状態、そして最終的な人間によるレポートレビューゲートを備えています。設計とコーディング ワークフローは、計画 / 設計 / 実装 / レビューのサイクルを実行し、こちらも人間によるゲートを備えています。各エージェントは、ロール固有のポリシー境界を持つ独自の Docker コンテナ内で実行されます。エンジンは状態遷移、成果物の受け渡し、クラッシュリジュームチェックポイントを自動的に管理します。オープンソースで、完全にあなたのマシン上で動作し、憲法ベースのポリシーエンジンを介してエージェントごとのセキュリティポリシーを強制し、あらゆる Docker コンテナ化されたエージェントと連携します — コーディングタスクにおいて Amazon Kiro や Google Jules に匹敵する規模ですが、第一級のセキュリティと拡張可能なワークフロー定義形式を備えています。

Web UI は、ワークフロー実行のための想定されたインターフェースです。 デーモンを起動し、表示された URL を開いて、Workflows ページから実行を操作します。上記のステートマシングラフはライブで、エージェントメッセージのタイムラインはマークダウンレンダリング付きでストリーミング表示され、ゲートレビューにはワークスペース + 成果物ブラウザが含まれ、過去の実行は一覧に残ります。```bash ironcurtain daemon --web-ui
CLIアクセスは、スクリプト作成、自動化、デバッグに利用できます:```bash
ironcurtain workflow start vuln-discovery \
"Find memory-safety bugs in libical" --workspace ~/src/libical
ironcurtain workflow start design-and-code \
"Build a REST API with authentication"
完全なドキュメントについては WORKFLOWS.md を参照してください。
デフォルトのポリシーは一般的な開発に適していますが、ワークフローに合わせて調整できます:
1. 憲法をカスタマイズする(任意ですが推奨されます):```bash ironcurtain customize-policy
ワークフローに合わせた憲法を生成するLLM支援の会話で、`~/.ironcurtain/constitution-user.md` に保存されます。このファイルを直接編集することもできます。
**2. ポリシーをコンパイルする:**```bash
ironcurtain compile-policy
あなたの憲法を決定的なルールに変換し、テストシナリオを生成して検証します。コンパイル済みの成果物は ~/.ironcurtain/generated/ に出力されます。
ペルソナは名前付きのポリシープロファイルです — それぞれが憲法、コンパイル済みポリシー、永続ワークスペース、セマンティックメモリをバンドルします。これらを使用して、異なるロールやアクセスレベルのエージェントを実行できます。```bash ironcurtain persona create my-assistant # Create a persona ironcurtain persona compile my-assistant # Compile its policy ironcurtain start --persona my-assistant "Check my calendar"
In mux mode, `/new my-assistant` はそのペルソナを使うタブを生成します。ペルソナは cron ジョブにも割り当てられます。スケジュールジョブの設定は [DAEMON.md](https://github.com/provos/ironcurtain/blob/master/DAEMON.md) を参照してください。
ペルソナは [web UI](https://github.com/provos/ironcurtain/blob/master/DAEMON.md#persona-policy-management) からも管理できます — 参照、作成、憲法の編集、ライブ進行でのポリシーのコンパイルが可能です。ポリシーはセキュリティ境界であるため、デーモンが `--allow-policy-mutation`(デフォルトではオフ)で起動されない限り、web UI の変更コントロールは読み取り専用です。
### スキル
SKILL.md パッケージを `~/.ironcurtain/skills/<name>/` に配置すると、目的特化のガイダンス(ヘルパースクリプト、決定的チェック、ドメイン知識)をすべての Docker エージェントセッションで利用できるようにできます。マージされたセットはバンドルごとのホストディレクトリにステージングされ、アクティブなエージェントのネイティブな検出が探索するパスにコンテナへ **読み取り専用** でバインドマウントされます — Claude Code は `--add-dir` でステージングディレクトリを指定され、Goose は `~/.config/goose/skills/<name>/SKILL.md` をスキャンします。エージェントはこれらを自動的に発見し、各スキルの frontmatter の説明に基づいて読み込むタイミングを決定します。SKILL.md _形式_ は Claude Code、Goose、Codex が採用するオープンスタンダードであり、_発見パス_ のみがエージェントごとに異なります。ワークフローはワークフローパッケージ内に状態別スキルを同梱できます — [WORKFLOWS.md](https://github.com/provos/ironcurtain/blob/master/WORKFLOWS.md#skills) を参照してください。
## ポリシー: 憲法 → 強制
あなたは意図を平易な英語で記述し、IronCurtain がそれを決定的なルールにコンパイルします:```
constitution.md → [Annotate] → [Compile] → [Resolve Lists] → [Generate Scenarios] → [Verify & Repair]
│ │ │ │ │
▼ ▼ ▼ ▼ ▼
tool-annotations compiled-policy dynamic-lists test-scenarios verified policy
.json .json .json .json (or build failure)
@list-name シンボリック参照として出力される。dynamic-lists.json に書き込まれ、ユーザーが編集可能。リストが存在しない場合はスキップされる。すべてのアーティファクトはコンテンツハッシュでキャッシュされる — 変更された入力のみが再コンパイルをトリガーする。
次のような憲法条項:```markdown
コンパイル結果:```json
[
{ "tool": "git_status", "decision": "allow", "condition": { "directory": { "within": "$SANDBOX" } } },
{ "tool": "git_diff", "decision": "allow", "condition": { "directory": { "within": "$SANDBOX" } } },
{ "tool": "git_push", "decision": "escalate", "reason": "Remote-contacting git operations require human approval" }
]
明示的な allow または escalate ルールに一致しない呼び出しは、デフォルトで拒否されます。```bash
ironcurtain annotate-tools --server filesystem # Annotate one server (merge with existing)
ironcurtain annotate-tools --all # Re-annotate all servers
ironcurtain compile-policy # Compile constitution into rules and verify
ironcurtain refresh-lists # Re-resolve dynamic lists without full recompilation
ironcurtain refresh-lists --list major-news # Refresh a single list
生成された `~/.ironcurtain/generated/compiled-policy.json` を確認してください — これらはランタイムで強制される正確なルールです。
## 設定
IronCurtain は設定とセッションデータを `~/.ironcurtain/` に保存します:```
~/.ironcurtain/
├── config.json # User configuration
├── constitution.md # User-local base constitution (overrides package default)
├── constitution-user.md # Your policy customizations (generated by customize-policy)
├── generated/ # User-compiled policy artifacts (overrides package defaults)
├── personas/ # Persona directories (constitution, policy, workspace, memory)
├── skills/ # User-global SKILL.md packages, mounted into every Docker session
├── jobs/ # Cron job definitions, workspaces, and run records
├── sessions/
│ └── {sessionId}/
│ ├── sandbox/ # Per-session filesystem sandbox
│ ├── escalations/ # File-based IPC for human approval
│ ├── audit.jsonl # Per-session audit log
│ └── session.log # Diagnostics
└── workflow-runs/ # Shared-container workflow runs (see below)
単一セッションの実行(ironcurtain start、mux タブ、cron ジョブ)は sessions/ 配下に書き込まれます。代わりに、共有コンテナワークフロー実行は workflow-runs/ 配下に書き込まれます — 次のセクションを参照してください。
ワークフロー定義は、その YAML で settings.sharedContainer: true を設定することで、共有 Docker コンテナをオプトインできます。そのモードでは、各エージェント状態は同じ長時間稼働コンテナ内で実行され、1 つのポリシーエンジンインスタンスを共有します。状態間では、オーケストレータがアクティブなポリシーをホットスワップして、各ペルソナが自身のルールを参照できるようにします。実行に関するすべてのアーティファクトは、単一のツリーに配置されます。```
~/.ironcurtain/workflow-runs//
├── audit.jsonl # Persona-tagged append-only audit
├── messages.jsonl # Orchestrator message log
├── workspace/ # Agent workspace (filesystem MCP root)
├── bundle/ # Shared container support (claude-state, orientation, sockets, escalations, system-prompt.txt)
├── states/
│ └── ./ # session.log + session-metadata.json per invocation
└── proxy-control.sock # Coordinator UDS for policy hot-swap
No per-session entries are created under `~/.ironcurtain/sessions/` for a shared-container workflow run. User-visible commands (`ironcurtain workflow start|resume|inspect|list`) are unchanged. See [WORKFLOWS.md](https://github.com/provos/ironcurtain/blob/master/WORKFLOWS.md) for authoring workflow definitions and the full lifecycle.
Edit configuration interactively:```bash
ironcurtain config
主な設定領域: モデルとAPIキー、リソース予算 (トークン/ステップ/時間/コスト制限)、自動承認エスカレーション、ウェブ検索プロバイダー、監査ログの秘匿化、メモリサーバーのLLM設定。完全なリファレンスは CONFIG.md を参照してください。
LLMトラフィックを LiteLLM や OpenRouter などのゲートウェイ経由でルーティングするには (コードモードと Docker エージェントモードの両方)、MODEL_ROUTING.md を参照してください。
Docker エージェントをモデルプロバイダープロファイル (例: OpenRouter 経由の GLM-5.2、サイドカーなし) 経由でルーティングするには、ironcurtain config → モデルプロバイダー を使用して、/new または --provider-profile でプロファイルを選択します — MODEL_ROUTING.md を参照してください。
IronCurtain には、事前設定済みの6つの MCP サーバーが同梱されています。すべてのツール呼び出し (メモリを除く) は、コンパイル済みポリシーによって管理されます。
読み取り専用操作はデフォルトポリシーで許可されます。変更操作 (書き込み、プッシュ、PR作成) は人間の承認にエスカレーションされます。ツールは server.tool 命名規則を使用します (例: filesystem.read_file、memory.recall)。独自のサーバーを追加するには ADDING_MCP_SERVERS.md を参照してください。
Docker エージェントモードでは、コンテナにはネットワークアクセスがありません。すべてのトラフィックは IronCurtain の MITM プロキシを通過します。デフォルトでは、LLM プロバイダーのドメインのみが到達可能です。エージェントは、proxy 仮想 MCP サーバー (add_proxy_domain) を介して、実行時に追加のドメインへのアクセスを要求できます。各要求は、エスカレーションフローによる人間の承認が必要です。
承認されたドメインには 生のパススルートンネル が与えられます。HTTP、HTTPS、WebSocket 接続は、コンテンツ検査や資格情報の注入なしで転送されます。これによりエージェントの有用性は高まりますが (サードパーティAPIの呼び出し、外部サービスからのデータストリーミングなど)、それらのドメインへのトラフィックは 仲介なし になります。脅威モデルについては SECURITY_CONCERNS.md のセクション 2b-i、使用上の詳細については DEVELOPER_GUIDE.md を参照してください。
IronCurtain は特定の脅威モデルを想定して設計されています: LLM が暴走する。 これは、プロンプトインジェクション (悪意のあるメールやWebページがエージェントを乗っ取る) や、マルチターンの逸脱 (長時間のセッションでエージェントがユーザーの意図から徐々に逸脱する) によって発生する可能性があります。
これは研究プロトタイプです。既知のギャップは次のとおりです。
compiled-policy.json を確認してください。詳細な脅威分析については docs/SECURITY_CONCERNS.md を参照してください。
npm test # Run all tests npm test -- test/policy-engine.test.ts # Run a single test file npm test -- -t "denies delete_file" # Run a single test by name npm run lint # Lint npm run build # TypeScript compilation + asset copy
[TESTING.md](https://github.com/provos/ironcurtain/blob/master/TESTING.md) に、統合テストのフラグと規約を含む完全なテストガイドがあります。
### プロジェクト構造```
src/
├── index.ts # Entry point
├── cli.ts # CLI command dispatcher
├── config/ # Configuration loading, constitution, MCP server definitions
├── session/ # Multi-turn session management, budgets, loop detection
├── sandbox/ # V8 isolated execution environment
├── trusted-process/ # Policy engine, MCP proxy, audit log, escalation handler
├── pipeline/ # Constitution → policy compilation pipeline
├── escalation/ # Escalation listener: session registry, TUI dashboard, state
├── mux/ # Terminal multiplexer: PTY bridge, renderer, trusted input
├── persona/ # Persona management (create, compile, resolve)
├── memory/ # Memory server integration (config, annotations, path resolution)
├── signal/ # Signal messaging transport (bot daemon, setup, formatting)
├── daemon/ # Unified daemon (Signal + cron scheduler, control socket)
├── cron/ # Cron job management (scheduler, job store, git sync, policy)
├── docker/ # Docker agent mode, PTY session, MITM proxy, registry proxy
├── workflow/ # Multi-agent workflow engine (orchestrator, state machine, gates)
├── web-ui/ # Web UI backend (JSON-RPC dispatch, event bus, workflow manager)
├── servers/ # Built-in MCP servers (fetch, web search providers)
└── types/ # Shared type definitions
packages/
└── memory-mcp-server/ # Standalone memory MCP server (publishable npm package)
| サーバー | ツール数 | 主な機能 |
|---|
| Filesystem | 14 | ファイルの読み取り、書き込み、編集、検索。ディレクトリツリー、移動、差分計算 |
| Git | 28 | 完全なgitワークフロー: status、diff、log、commit、branch、push/pull/fetch、clone、stash、blame |
| Fetch | 2 | HTMLからMarkdownへの変換を伴うHTTP GET。ウェブ検索 (Brave、Tavily、SerpAPI) |
| GitHub | 41 | Issues、PR、コード検索、レビューを ghcr.io/github/github-mcp-server 経由で実行。GitHub personal access token が必要 |
| Google Workspace | 128 | Gmail、Calendar、Drive、Docs、Sheets — ironcurtain auth によるOAuth設定が必要 |
| Memory | 5 | ハイブリッドベクター+キーワード検索、LLM要約、自動圧縮を備えた永続的なセマンティックメモリ。persona および cron セッションで有効。 |
| 問題 | ガイダンス |
|---|
| APIキーがありません | 環境変数 (ANTHROPIC_API_KEY、GOOGLE_GENERATIVE_AI_API_KEY、または OPENAI_API_KEY) を設定するか、対応するキーを ~/.ironcurtain/config.json に追加してください。 |
| サンドボックスが利用できません | OSレベルのサンドボックスには bubblewrap と socat が必要です。両方をインストールするか、開発用に MCP サーバー設定で "sandboxPolicy": "warn" を設定してください。 |
| 予算を使い切りました | ~/.ironcurtain/config.json の resourceBudget で制限を調整してください。個々の制限を null に設定すると無効になります。 |
| Nodeバージョンエラー | サポートされている Node.js のラインは 22、24、26 です。IronCurtain がテストしている偶数番号のメジャーライン (isolated-vm) です。24 と 26 はプリビルドバイナリをインストールします。Node 22 は isolated-vm をソースからコンパイルするため、C/C++ ツールチェーンが必要です。奇数番号のライン (23、25) は未テストです。ironcurtain doctor はハードフェイルではなく警告でこれらをフラグ付けします。 |
| ポリシーが意図と一致しない | 生成されたルールを確認するには compiled-policy.json を確認してください。ironcurtain customize-policy を実行して憲法を調整し、その後 ironcurtain compile-policy を実行して再コンパイルしてください。具体的な表現はより良いルールを生成します。曖昧な表現は曖昧なポリシーにつながります。 |
| 自動承認が発動しない | 自動承認機能は、ユーザーのメッセージがそのアクションを明示的に承認している場合にのみ承認します (例: git_push に対する「push to origin」)。曖昧なメッセージは常に人間によるレビューにエスカレーションされます。config.json で autoApprove.enabled が true であることを確認してください。 |
| 終了後にPTY/muxターミナルが乱れる | そのターミナルで reset を実行して通常モードに戻してください。これは、プロセスが不完全に強制終了され、raw モードが復元されない場合に必要です。 |
| Mux/リスナー: "already running" | 同時に実行できる mux または escalation-listener は 1 つだけです。~/.ironcurtain/escalation-listener.lock のロックは、前のプロセスが終了している場合は自動的にクリアされます。残っている場合は、ロックファイル内の PID を確認してください。 |
| Signal ボットが応答しない | signal-cli コンテナが実行されていることを確認してください (docker ps | grep ironcurtain-signal)。Signal が設定されていることを確認してください (ironcurtain setup-signal)。詳細なトラブルシューティングについては TRANSPORT.md を参照してください。 |