
자율 AI 에이전트를 위한 보안* 런타임. 일반 영어로 작성된 헌법에서 정책을 수립합니다. (*https://ironcurtain.dev)
자율 AI 에이전트를 위한 안전한* 런타임으로, 보안 정책은 사람이 읽을 수 있는 헌법에서 파생됩니다.
*누군가 "안전한"이라고 쓴다면 즉시 의심해야 합니다. 안전하다는 것은 무슨 의미일까요?
[!WARNING] 연구용 프로토타입. IronCurtain은 AI 에이전트가 실제로 유용할 만큼 안전해지도록 만드는 방법을 탐구하는 초기 단계 연구 프로젝트입니다. API, 구성 형식 및 아키텍처는 변경될 수 있습니다. 기여와 피드백을 환영합니다.
에이전트는 저장소를 클론하고 변경 사항을 푸시하라는 요청을 받습니다. git_clone과 git_push 모두 정책 엔진에 의해 에스컬레이션되지만, 자동 승인기가 자동으로 승인합니다. 명령 모드(Ctrl-A)에서 사용자의 신뢰된 입력이 명확한 의도를 제공했기 때문에 수동 /approve가 필요하지 않았습니다.
자율 AI 에이전트는 사용자를 대신하여 파일을 관리하고, git 명령을 실행하고, 메시지를 보내고, API와 상호작용할 수 있습니다. 그러나 오늘날의 에이전트 프레임워크는 파일시스템, 자격 증명 및 네트워크에 대한 전체 액세스와 같이 사용자와 동일한 권한을 에이전트에 부여합니다. 보안 연구자들은 이를 환경 권한(ambient authority) 이라고 부르며, 이는 단 한 번의 프롬프트 인젝션이나 다중 턴 드리프트(multi-turn drift)로 인해 에이전트가 파일을 삭제하고, 데이터를 유출하고, 악성 코드를 푸시할 수 있음을 의미합니다.
일반적인 대응은 에이전트를 좁은 샌드박스로 제한하거나(유용성을 제한), 사용자에게 모든 작업을 승인하도록 요청하는 것(자율성을 제한) 중 하나입니다. 어느 쪽도 만족스럽지 않습니다.
IronCurtain은 다른 길을 택합니다: 보안 의도를 평범한 영어로 표현하면, 시스템이 강제 실행 방법을 파악하게 하세요.
헌법(constitution) 을 작성하세요. 이는 에이전트가 수행할 수 있는 것과 없는 것을 설명하는 짧은 문서입니다. IronCurtain은 LLM 파이프라인을 사용하여 이를 결정적 보안 정책으로 컴파일하고, 생성된 테스트 시나리오에 대해 컴파일된 규칙을 검증한 다음, 런타임에 모든 도구 호출에 대해 정책을 적용합니다. 그 결과는 사용자가 자연어로 정의한 경계 내에서 자율적으로 작업할 수 있는 에이전트입니다.
핵심 아이디어:
IronCurtain은 서로 다른 신뢰 모델을 가진 두 가지 세션 모드를 지원합니다:
내장 에이전트(코드 모드) — IronCurtain 자체 LLM 에이전트가 V8 샌드박스에서 실행되는 TypeScript 스니펫을 작성합니다. IronCurtain은 에이전트, 샌드박스 및 정책 엔진을 제어합니다. 모든 도구 호출은 구조화된 MCP 요청으로 샌드박스를 빠져나와 정책 엔진(허용 / 거부 / 에스컬레이션)을 통과한 다음에만 실제 MCP 서버에 도달합니다.
Docker 에이전트 모드 — 외부 에이전트(Claude Code, Goose 등)가 네트워크 액세스가 없는 Docker 컨테이너 내부에서 실행됩니다. IronCurtain은 외부 효과를 중재합니다: LLM API 호출은 TLS 종료 MITM 프록시(호스트 허용 목록, 가짜-실제 키 교환)를 통과하고, MCP 도구 호출은 동일한 정책 엔진을 통과하며, 패키지 설치(npm/PyPI)는 검증 레지스트리 프록시를 통해 이루어집니다.
두 모드 모두 에이전트는 신뢰할 수 없습니다. 보안은 모델이 지침을 따르는 것에 의존하지 않습니다. 경계에서 강제됩니다.
다이어그램, 계층별 신뢰 분석 및 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-...
You can also place keys in a `.env` file in the project root (loaded automatically via `dotenv`), or add them to `~/.ironcurtain/config.json` via `ironcurtain config`. Environment variables take precedence over config file values. Supported: `ANTHROPIC_API_KEY`, `GOOGLE_GENERATIVE_AI_API_KEY`, `OPENAI_API_KEY`.
**2. Run the first-start wizard** (run this explicitly before using the recommended mux path; it also runs automatically on first non-mux `ironcurtain start`):```bash
ironcurtain setup
GitHub 토큰 설정, 웹 검색 제공자, 모델 선택 및 기타 설정을 안내합니다. 선택한 내용으로 ~/.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/HEAD/DEVELOPER_GUIDE.md)를 참조하세요: 입력 모드, 신뢰된 입력 보안 모델, 승격 워크플로우, 키보드 참조.
### Non-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 작업을 위한 데몬 모드를 지원합니다. 데몬은 브라우저 기반 모니터링 및 에스컬레이션 처리를 위한 선택적 웹 UI (--web-ui)를 제공합니다. 자세한 내용은 RUNNING_MODES.md를 참조하세요.
IronCurtain은 구조화된 워크플로우를 통해 여러 AI 에이전트를 오케스트레이션합니다. 번들로 제공되는 취약점 탐지 워크플로우는 계층화된 하네스 파이프라인(Tier 1 격리 함수 → Tier 2 다중 구성 요소 → Tier 3 전체 빌드)을 통해 네이티브 코드의 메모리 안전성 및 논리 버그를 추적하며, libFuzzer/AFL++ 커버리지 게이팅, 가설 기반 discover/triage 상태, 그리고 최종 인간 보고서 검토 게이트를 포함합니다. 설계 및 코딩 워크플로우는 계획 / 설계 / 구현 / 검토 주기를 실행하며, 여기에도 인간 게이트가 있습니다. 각 에이전트는 역할별 정책 경계를 가진 자체 Docker 컨테이너에서 실행됩니다. 엔진은 상태 전환, 아티팩트 전달, 크래시-재개 체크포인팅을 자동으로 관리합니다. 오픈 소스이며, 전적으로 사용자 머신에서 실행되고, 헌법 기반 정책 엔진을 통해 에이전트별 보안 정책을 적용하며, 모든 Docker 컨테이너화 에이전트와 작동합니다 — 코딩 작업 측면에서 Amazon Kiro 및 Google Jules와 비슷한 범위를 제공하지만, 최고 수준의 보안과 확장 가능한 워크플로우 정의 형식을 갖추고 있습니다.

웹 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"
mux 모드에서 `/new my-assistant`는 해당 페르소나를 사용하는 탭을 생성합니다. 페르소나는 cron 작업에도 할당할 수 있습니다. 예약 작업 구성은 [DAEMON.md](https://github.com/provos/ironcurtain/blob/HEAD/DAEMON.md)를 참조하세요.
페르소나는 [웹 UI](https://github.com/provos/ironcurtain/blob/HEAD/DAEMON.md#persona-policy-management)에서도 관리할 수 있습니다 — 컨스티튜션을 탐색·생성·편집하고, 실시간 진행 상황으로 정책을 컴파일할 수 있습니다. 정책은 보안 경계이므로, 데몬이 `--allow-policy-mutation`(기본적으로 꺼짐)으로 시작되지 않는 한 웹 UI의 변경 제어는 읽기 전용입니다.
### 스킬
`~/.ironcurtain/skills/<name>/` 아래에 SKILL.md 패키지를 배치하면 목적별 지침(헬퍼 스크립트, 결정적 검사, 도메인 지식)을 모든 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/HEAD/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 컨테이너를 선택할 수 있습니다. 해당 모드에서는 모든 에이전트 상태가 동일한 장수명 컨테이너 안에서 실행되며 하나의 정책 엔진 인스턴스를 공유합니다. 상태 사이에서 오케스트레이터는 활성 정책을 핫스왑하여 각 페르소나가 자신의 규칙을 볼 수 있도록 합니다. 실행에 대한 모든 아티팩트는 단일 트리에 저장됩니다.```
~/.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
공유 컨테이너 워크플로를 실행할 때는 `~/.ironcurtain/sessions/` 아래에 세션별 항목이 생성되지 않습니다. 사용자에게 표시되는 명령(`ironcurtain workflow start|resume|inspect|list`)은 변경되지 않았습니다. 워크플로 정의 작성 및 전체 수명 주기에 대해서는 [WORKFLOWS.md](https://github.com/provos/ironcurtain/blob/HEAD/WORKFLOWS.md)를 참조하세요.
구성을 대화형으로 편집:```bash
ironcurtain config
Key configuration areas: models and API keys, resource budgets (token/step/time/cost limits), auto-approve escalations, web search provider, audit redaction, and memory server LLM settings. See CONFIG.md for the full reference.
To route LLM traffic through a gateway like LiteLLM or OpenRouter (in both Code Mode and Docker Agent Mode), see MODEL_ROUTING.md.
Route Docker agents through model-provider profiles (e.g. GLM-5.2 via OpenRouter, no sidecar) with ironcurtain config → Model Providers, then pick a profile at /new or with --provider-profile — see MODEL_ROUTING.md.
IronCurtain ships with six pre-configured MCP servers. All tool calls (except memory) are governed by your compiled policy.
Read-only operations are allowed by default policy; mutations (writes, pushes, PR creation) escalate for human approval. Tools use server.tool naming (e.g., filesystem.read_file, memory.recall). See ADDING_MCP_SERVERS.md to add your own.
Docker Agent Mode에서 컨테이너는 네트워크에 접근할 수 없습니다. 모든 트래픽은 IronCurtain의 MITM 프록시를 통과합니다. 기본적으로 LLM 제공자 도메인만 접근 가능합니다. 에이전트는 런타임에 proxy 가상 MCP 서버(add_proxy_domain)를 통해 추가 도메인에 대한 접근을 요청할 수 있습니다. 각 요청은 에스컬레이션 흐름을 통해 사람의 승인을 받아야 합니다.
승인된 도메인은 원시 패스스루 터널을 얻습니다. HTTP, HTTPS, WebSocket 연결은 콘텐츠 검사나 자격 증명 주입 없이 전달됩니다. 이는 에이전트에 더 큰 유용성(제3자 API 호출, 외부 서비스에서 데이터 스트리밍)을 제공하지만 해당 도메인으로의 트래픽은 중재되지 않음을 의미합니다. 위협 모델은 SECURITY_CONCERNS.md 섹션 2b-i, 사용 세부 사항은 DEVELOPER_GUIDE.md를 참조하세요.
IronCurtain은 특정 위협 모델을 중심으로 설계되었습니다: LLM이 악성으로 변하는 경우. 이는 프롬프트 주입(악성 이메일이나 웹 페이지가 에이전트를 탈취) 또는 다중 턴 표류(에이전트가 긴 세션 동안 사용자의 의도에서 점차 벗어나는 것)를 통해 발생할 수 있습니다.
이것은 연구용 프로토타입입니다. 알려진 공백은 다음과 같습니다:
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/HEAD/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)
| Server | Tools | Key capabilities |
|---|
| Filesystem | 14 | 파일 읽기, 쓰기, 편집, 검색; 디렉터리 트리; 이동; diff 계산 |
| Git | 28 | 전체 git 워크플로: status, diff, log, commit, branch, push/pull/fetch, clone, stash, blame |
| Fetch | 2 | HTTP GET 및 HTML-to-markdown 변환; 웹 검색(Brave, Tavily, SerpAPI) |
| GitHub | 41 | Issues, PR, 코드 검색, 리뷰 — ghcr.io/github/github-mcp-server 사용, GitHub 개인 액세스 토큰 필요 |
| Google Workspace | 128 | Gmail, Calendar, Drive, Docs, Sheets — ironcurtain auth를 통한 OAuth 설정 필요 |
| Memory | 5 | 하이브리드 벡터+키워드 검색, LLM 요약, 자동 압축을 지원하는 영구 의미 메모리. 페르소나 및 cron 세션에서 활성화됩니다. |
| Issue | Guidance |
|---|
| 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를 실행하여 constitution을 다듬은 다음 ironcurtain compile-policy를 실행하여 다시 컴파일하세요. 구체적인 표현이 더 나은 규칙을 생성합니다. 모호한 표현은 모호한 정책으로 이어집니다. |
| 자동 승인 트리거 안 됨 | 자동 승인기는 사용자의 메시지가 해당 작업을 명시적으로 승인한 경우에만 승인합니다(예: git_push의 경우 "push to origin"). 모호한 메시지는 항상 인간 검토로 에스컬레이션됩니다. config.json에서 autoApprove.enabled가 true인지 확인하세요. |
| 종료 후 PTY/mux 터미널 깨짐 | 해당 터미널에서 reset을 실행하여 일반 모드로 복원하세요. 이는 프로세스가 비정상 종료되어 raw 모드가 복원되지 않을 때 필요합니다. |
| Mux/listener: "already running" | 한 번에 하나의 mux 또는 에스컬레이션 리스너만 실행할 수 있습니다. ~/.ironcurtain/escalation-listener.lock의 잠금은 이전 프로세스가 종료된 경우 자동으로 해제됩니다. 지속되면 잠금 파일의 PID를 확인하세요. |
| Signal 봇 응답 없음 | signal-cli 컨테이너가 실행 중인지 확인하세요(docker ps | grep ironcurtain-signal). Signal이 구성되어 있는지 확인하세요(ironcurtain setup-signal). 자세한 문제 해결은 TRANSPORT.md를 참조하세요. |