Astrid OS는 AI 에이전트와 그 도구들을 WebAssembly '캡슐'로 격리해 돌리는 Rust 기반 유저공간 마이크로커널이다. 한 문장 명제는 "믿지 못하는 에이전트도 실행할 수 있다" — 탈옥·오염된 도구·버그가 있어도, 허락하지 않은 것엔 손댈 수 없고, 무엇이 실행됐는지 사후에 증명할 수 있기 때문이다. book 레포는 그 OS의 커널·캡슐·호스트 ABI·버스·보안모델을 소스 코드 줄번호까지 짚어 설명하는 공식 기술 레퍼런스(mdBook)다. (저장소: unicity-astrid/book · "The Astrid Book" · mdBook/Markdown · Apache-2.0+MIT · ★ 2.6k · 커널 astrid ★ 9.2k · TrendShift #21)
"에이전트를 가두는 '벽'을 암호로 세운 운영체제, 그 설계 교본."
요즘 'AI 에이전트 프레임워크'는 대개 LLM을 한 겹 감싼다. Astrid는 발상을 뒤집어, 모델이 아니라 '경계(boundary)'를 중심에 둔 운영체제를 만든다. 놀랍게도 커널 안에는 모델도, 프롬프트도, 에이전트 루프도 없다. "지능은 전부 유저공간 캡슐에 산다." 커널이 하는 일은 딱 셋 — 이벤트 버스를 띄우고, 캡슐을 샌드박스에 올리고, 능력 검사를 통과한 메시지만 캡슐 사이로 중계하는 것.
왜 이렇게까지 할까? Astrid의 후기(Afterword)는 아시모프(로봇 3원칙)와 듄(Dune)을 빌려 답한다 — "법칙을 마음 속에 넣을 수는 없다. 언어모델은 지시에서 설득당해 빠져나갈 수 있기 때문이다." 그래서 Astrid는 법칙을 벽에 새긴다. "프롬프트보다 암호. 마음은 헷갈릴 수 있어도, 벽은 말로 구워삶을 수 없다."
Capsule.toml)에 "내가 쓸 권한과 주고받을 메시지"를 선언하며, 서로 직접 호출하지 못하고 오직 버스를 통해 메시지로만 소통한다.이 레포(book) 자체는 코드가 아니라 문서다 — Rust mdBook으로 만든 "The Astrid Book". 하지만 보통의 README와 달리 실제 소스의 크레이트/파일.rs:줄번호를 앵커로 달아 "주장이 어디 코드에 있는지"까지 짚는, OS 레퍼런스 매뉴얼급 문서다. 만든 곳은 Unicity Labs(unicity.ai), 저자는 Joshua J. Bouw.
"AI 안전이 화두인 시점에, '프롬프트가 아니라 구조로' 푸는 진지한 OS."
2026년 에이전트 생태계의 가장 큰 불안은 "이 에이전트가 시키지 않은 짓을 하면?"이다. 대부분은 시스템 프롬프트·가드레일로 막으려 하지만, 탈옥(jailbreak)·프롬프트 주입에 번번이 뚫린다. Astrid는 이 문제를 '설득 가능한 마음'이 아니라 '논쟁 불가능한 벽'으로 다시 정의했다는 점에서 신선하다.
"위험한 명령은 거부해"라고 시스템 프롬프트에 적어도, 공격자는 역할극·우회 지시로 모델을 구워삶아 그 법칙을 무력화한다. 도구가 오염되거나 평범한 버그가 나도, 권한이 '주변에 떠다니면' 에이전트는 손대선 안 될 파일·네트워크에 닿는다. 지능에 의존한 안전은 그 지능이 속는 순간 함께 무너진다.
Astrid에선 에이전트가 샌드박스를 벗어날 수 없다. "부탁을 잘해서가 아니라, 그렇게 할 능력 자체가 애초에 부여되지 않았고, 호스트가 서명된 토큰을 검증하기 전엔 바이트 하나도 움직이지 않기" 때문이다. 게다가 모든 행동은 변조 불가능한 감사 체인에 남아, 무슨 일이 있었는지 사후 증명까지 된다.
프롬프트 가드레일 = 경비원에게 "수상한 사람 막아"라고 말로 부탁 — 경비원이 속으면 끝.
Astrid = 애초에 열쇠 없는 문 + 모든 출입을 찍는 CCTV — 열쇠(능력)가 없으면 문이 안 열리고, 설령 무슨 일이 있어도 기록(감사 체인)이 남아 지울 수 없다. 안전이 '사람의 판단'이 아니라 '건물 구조'에 박혀 있다.
또 하나, 이건 말뿐인 비전이 아니라 진지한 엔지니어링이다. 책은 OS 레퍼런스처럼 정확한 파일·줄번호 앵커, 동결 ABI(frozen ABI) 규율, ed25519/BLAKE3 암호, "실제로 출시됨 vs 아직 스텁(stub)"의 정직한 표시까지 갖췄다. 조직 차원의 견인력도 크다 — unicity-astrid 조직은 팔로워 9.6k에 레포 33개, 커널(astrid)은 별 9.2k다.
| 구분 | 일반 에이전트 프레임워크 (LangChain류) | Astrid OS |
|---|---|---|
| 중심 | LLM(모델) | 경계(boundary)·커널 |
| 안전 방식 | 프롬프트·가드레일 | 능력(암호 서명) + WASM 샌드박스 |
| 커널 안의 지능 | 해당 없음(라이브러리) | 없음 — 전부 캡슐로 |
| 도구 실행 | 호스트에서 직접 | 격리된 캡슐 + 호스트 ABI 게이트 |
| 사후 추적 | 로그(변조 가능) | 서명된 변조 불가 감사 체인 |
물론 대가도 있다. 모든 것을 캡슐·능력·ABI로 감싸므로 구조가 복잡하고 진입 장벽이 높다. 책도 일부 기능은 아직 스텁/계획 단계(예: 권한 위임 토큰, 일부 감사 도구)라고 정직하게 밝힌다. 즉 Astrid의 매력은 "당장 가장 쉬운 에이전트 실행"이 아니라, "믿지 못하는 에이전트를 구조적으로 가둘 수 있는가"라는 어려운 문제에 대한 진지한 답이다.
두 축으로 보라 — (가) 책을 '찍어내는' 도구 vs (나) 책이 '설명하는' OS의 기술.
이 레포는 문서지만, 그 안이 설명하는 시스템은 묵직한 시스템 소프트웨어다. 그래서 스택을 (가) book을 빌드하는 문서 도구와 (나) Astrid OS 자체의 기술로 나눠 봐야 머리에 들어온다.
본문은 src/ 아래 마크다운이고, mdBook(Rust-lang, CI에 v0.5.2 고정)으로 빌드해 GitHub Pages로 배포한다. 흥미로운 건 부록이 손으로 쓴 게 아니라 '실제 소스에서 생성'된다는 점 — GitHub이 이 레포 언어를 'Perl/Shell'로 표시하는 이유다.
| 요소 | 역할 |
|---|---|
mdBook 0.5.2 | 마크다운 → 정적 사이트(테마 ayu, 검색) |
tools/gen-appendices.sh | 능력 카탈로그·에러코드·토픽 레지스트리 부록을 Astrid 소스에서 생성 |
tools/gen-see-also.pl | 챕터 간 'See also' 푸터 자동 생성 |
| GitHub Actions | deploy.yml로 Pages 배포(unicity-astrid.github.io/book) |
여기가 진짜 배울 거리다. Rust 커널(unsafe 금지) + Wasmtime 샌드박스 + WIT 계약 + tokio 버스 + 암호(서명/해시)의 조합이다.
| 레이어 | 기술 |
|---|---|
| 커널 언어 | Rust — #, 비동기 런타임 Tokio(멀티스레드 필수) |
| 캡슐 포맷 | WebAssembly Component Model, 런타임 Wasmtime. 빌드 타깃은 wasm32-unknown-unknown(WASI 임포트 0개) |
| 인터페이스 계약 | WIT(WebAssembly Interface Types) — 호스트 ABI=astrid:*, 버스 페이로드=astrid-bus:* |
| 버스 | tokio::sync::broadcast 기반 EventBus + 프린시펄별 라우팅(공정성 DRR) |
| 암호 | ed25519(능력 토큰·감사 서명) · BLAKE3(콘텐츠 해시·해시 체인) |
| 저장소 | SurrealKV(~/.astrid/state.db), 캡슐별 스코프 KV |
| OS 샌드박스 | Linux bubblewrap(bwrap) · macOS Seatbelt(sandbox-exec) |
wasm32-unknown-unknown으로 골라 WASI(파일·네트워크 등 기본 시스템 임포트)를 0개로 만든다. 그래야 "캡슐이 임포트한 목록 = 캡슐이 가진 능력 목록"이 되어, 감사에 빈틈이 없다.단 하나의 법칙에서 모든 게 갈라진다 — "커널은 멍청하다(The Kernel Is Dumb)".
Astrid의 헌법 1조는 "커널은 멍청하다"이다. 커널엔 비즈니스 로직도, 인지 루프도, 프로토콜 파서도, 도메인 지식도 없다. 유일한 임무는 ① 이벤트 버스를 띄우고 ② WASM 캡슐을 샌드박스에 올리고 ③ 능력 ACL 아래 타입이 정해진 IPC 바이트를 캡슐 사이로 중계하는 것. 모든 지능은 캡슐에 산다.
캡슐의 모든 호스트 호출은 다섯 관문을 지난다. 하나라도 거부하면 멈춘다(교집합 의미론, fail-closed). 특히 마지막 '감사'는 기록을 못 남기면 그 행동 자체를 거부로 본다.
| 층 | 관문 | 막는 것 |
|---|---|---|
| L1 | 정책(Policy) | 운영자 하드 경계(차단 도구·금지 경로·.. 탈출) |
| L2 | 능력 토큰 | ed25519 서명·URI 패턴·프린시펄 결속(없으면 거부) |
| L3 | 예산(Budget) | 세션/워크스페이스 USD 지출 한도(원자적 예약) |
| L4 | 승인(Approval) | 사람의 개입(승인/세션승인/항상승인/거부) |
| L5 | 감사(Audit) | 기록 실패 시 행동 차단(변조 불가 체인) |
호스트 ABI는 전부 WIT로 타입이 박혀 있고, 능력 검사는 호출 때마다 일어난다(그래서 세션 중간에 권한을 회수하면 다음 호출부터 즉시 막힌다). 아래는 책에 인용된 실제 WIT 조각이다.
// astrid:ipc@1.0.0 — '검증된' 프린시펄과 '주장된' 프린시펄을 타입으로 구분
variant principal-attribution {
verified(string), // 커널이 검증함 → 능력 판단에 안전
claimed(string), // 업링크가 주장함 → 입력값처럼 취급
system,
}
// astrid:sys@1.0.0 — 능력으로 게이트되는 호스트 함수 (꺾쇠는 제네릭)
random-bytes: func(length: u64) -> result<list<u8>, error-code>;
@1.0.0 인터페이스 파일은 절대 수정하지 않는다. 바꿀 게 있으면 새 버전 경로의 새 파일(@1.1.0)을 추가한다. 그러면 Component Model 링커가 (패키지, 버전)을 정확히 매칭해, 옛 캡슐과 새 캡슐이 '플래그 데이' 없이 공존한다. 하위/상위 호환을 구조로 보장하는 영리한 규율.캡슐은 서로 직접 부르지 못하고, <도메인>.v<메이저>.<동작> 형식의 토픽으로 메시지를 주고받는다(최대 깊이 20). 주의할 함정: 와일드카드 의미가 두 군데서 다르다 — 브로드캐스트/라우팅 경로의 .*는 '네임스페이스 접두사(1단계 이상)', 인터셉터 경로의 *는 '한 단계만, 단 세그먼트 수가 같아야' 매칭한다. 또 높은 팬인(fan-in)에서의 역압(backpressure)을 위해, 라우팅 경로는 구독자마다 1 MiB 바이트 예산의 독립 큐를 둔다.
레포는 mdBook 한 권 — src/ 아래 챕터가 Astrid의 계층을 그대로 따라간다.
루트엔 book.toml(mdBook 설정), 라이선스 2종, tools/(부록 생성기), 그리고 src/(본문, 마크다운 36개·약 6.9만 단어)가 있다. 챕터 묶음이 곧 Astrid의 아키텍처 지도다.
이 책 구조는 건물 도면 묶음과 같다. foundations는 기초 공사 원칙("커널은 멍청하다"), capsule-model은 입주 규칙(누가 어떤 방에 어떤 조건으로 들어오나), host-abi는 방과 복도를 잇는 유일한 출입문, bus는 건물 내부 우편 시스템, security는 경비·CCTV·출입증 체계다. 챕터를 따라가면 건물이 통째로 머릿속에 선다.
한 권으로 '능력 보안 + ABI 설계 + WASM 샌드박스 + 메시지 버스'를 한 번에.
"주변에 떠다니는 권한이 없다"가 실제로 어떻게 강제되는지 본다 — 모든 권한이 ed25519로 서명된 허가증이고, 권한은 좁아지기만(narrow) 할 뿐 넓어지지 않는다(하위 에이전트는 부모의 부분집합만 받는다). '정적 능력'과 '런타임 능력 토큰'을 왜 둘 다 두는지도 비교거리.
security/capabilities-and-tokens.md를 읽고, "내 토큰이 fs:read 한정인데 쓰기를 시도하면 어느 층(L1~L5)에서 막히나"를 표로 추적해 보라.
WIT로 타입을 박는 계약, 그리고 동결 파일 규칙(공개된 버전 파일은 수정 금지, 새 버전은 새 파일)을 배우면 "API를 깨지 않고 진화시키는 법"의 정석이 잡힌다.
가상의 astrid:foo@1.0.0 인터페이스를 한 줄 설계하고, 필드를 추가한 @1.1.0을 '동결 규칙대로' 새 파일로 만들어, 옛 캡슐이 왜 안 깨지는지 설명해 보라.
특권 코어에서 로직을 전부 밀어낸 이유(결합도·샌드박스 탈출·폭발 반경)를 foundations/kernel-is-dumb.md의 세 논증으로 학습. seL4·Mach 같은 고전 마이크로커널과 대조하면 더 선명하다.
WASI를 0개로 만들어 "임포트 목록 = 능력 목록"을 성립시키는 트릭, 자원 핸들과 호스트 소멸자, RNG 없는 타깃에서의 getrandom 백엔드 트릭까지 — 실전 WASM 보안의 정수.
브로드캐스트 vs 프린시펄 라우팅, 역압(바이트 예산·DRR), 와일드카드 함정, 상관관계 ID 요청/응답 패턴. 그리고 5중 게이트의 fail-closed·RAII 예산 환불·BLAKE3 해시 체인(변조 탐지 로그)까지 한 흐름으로 익힌다.
책을 '읽는' 데엔 아무것도 안 듦. OS를 '돌리는' 데엔 Linux/macOS + 샌드박스.
book은 그냥 웹페이지라 누구나 읽는다. 다만 내용을 제대로 이해하려면 OS·Rust·WASM·암호·pub/sub·능력 보안의 사전 지식이 있으면 좋다. 책을 로컬로 빌드하거나, 책이 설명하는 Astrid OS 자체를 실행하려면 아래가 필요하다.
| 목적 | 요구 | 비고 |
|---|---|---|
| 책 읽기 | 웹브라우저 | unicity-astrid.github.io/book (설치 0) |
| 책 로컬 빌드 | mdbook serve --open | mdBook(CI는 0.5.2 고정) |
| OS 실행 | cargo install astrid | astrid init → astrid chat |
| OS — Linux | bubblewrap 필요 | Ubuntu 24.04+는 userns sysctl 조정 필요할 수 있음 |
| OS — macOS | Seatbelt(sandbox-exec) | 기본 내장 |
| 런타임 | 멀티스레드 Tokio | 커널 부팅 시 단정(assert) |
| 캡슐 개발 | wasm32-unknown-unknown | Rust 타깃 추가 필요 |
Astrid 진영의 원칙은 "문서와 코드가 다르면, 코드가 이긴다"이다. 게다가 책은 일부 기능이 아직 구현 전(스텁/계획)임을 명시한다 — 예: StaticEngine::load는 현재 no-op, 암호적 권한 위임(서브 토큰)은 미완, 감사 인스펙터는 진행 중. "문서에 있다 = 지금 동작한다"로 착각하지 말고, 각 챕터의 '출시 vs 스텁' 표기를 확인하자.
"읽고 용어 잡기 → 로컬 빌드 → 매니페스트 해독 → ABI 설계 → 직접 실행"으로 난이도 상승.
호스팅판을 열어 커널·캡슐·호스트 ABI·버스·능력 다섯 단어를 자기 말로 한 줄씩 정의해 본다. introduction + foundations 두 장이면 충분.
cargo install mdbook → 레포 클론 → mdbook serve --open으로 책을 띄운다. 챕터 하나를 추가해 SUMMARY.md에 연결하고 라이브 리로드를 확인.
Capsule.toml 읽고 권한 예측 난이도 ★★★☆☆capsule-model 장의 매니페스트 예시를 보고, [capabilities]·[publish]·[subscribe]만으로 "이 캡슐이 무엇을 할 수 있고 무엇을 못 하는가"를 코드 한 줄 안 읽고 예측해 본다.
나만의 astrid:foo@1.0.0을 설계하고, '동결 파일 규칙'대로 @1.1.0로 진화시킨다. 옛 캡슐과 새 캡슐이 공존하는 이유를 Component Model 링커 관점에서 설명.
"오염된 캡슐이 ~/.ssh를 읽으려 한다" 같은 시나리오에서 L1~L5 중 어느 층이 막는지 추론해 표로 정리한다. 더 나아가 cargo install astrid로 실제 OS를 띄워 astrid chat을 돌리고, 능력·로그를 들여다보며 책 내용을 검증.
'OS/샌드박스 → WASM·Component Model → 능력 보안·암호 → 메시지 버스'의 4주 코스.
| 주차 | 주제 | 학습 내용 & 책 연결 |
|---|---|---|
| 1주차 | OS·프로세스·샌드박스 기초 | 프로세스/시스템콜/격리 개념, 마이크로커널(seL4) 개요. foundations/로 "커널은 멍청하다"의 세 논증을 잡는다. |
| 2주차 | WebAssembly + Component Model + WIT | WASM 샌드박스, Component Model, WIT 계약. host-abi/로 "임포트=능력" 모델과 자원 핸들을 학습. |
| 3주차 | 능력 기반 보안 & 암호 | object-capability, ed25519 서명, 해시 체인. security/ 전체로 5단계 게이트와 토큰을 정독. macaroons·SPIFFE와 비교. |
| 4주차 | 메시지 버스 & 전체 통독 | pub/sub·역압·라우팅. bus/·storage/·distribution/를 읽고, 가능하면 Astrid를 직접 설치해 한 바퀴 돌린다. |
이 책의 가장 큰 장점은 주장마다 실제 소스의 파일·줄번호가 달려 있다는 것. 한 챕터를 읽었으면, 그 앵커를 따라 astrid 커널 레포의 해당 코드를 열어 "문서가 말한 구조가 진짜 그렇게 구현됐는지"를 대조하라. 그 자체가 최고의 시스템 프로그래밍 독해 훈련이다. 프로젝트 운영·기여 규칙은 자매 문서인 handbook(이 폴더의 astrid-handbook-deep-dive.html)에서 이어 본다.
책 전반에 반복되는 용어를 한 곳에.
astrid-daemon). 타입이 정해진 버스 + 능력 ACL일 뿐, 모델도 비즈니스 로직도 없이 이벤트를 라우팅하고 경계를 강제하고 샌드박스를 소유한다.Capsule.toml로 권한과 메시지를 선언한다. .capsule tar.gz로 패키징.astrid:* WIT로 타입이 박혀 있고, 매 호출이 능력 검사·감사를 받는다. WASI 임포트는 0개.tokio::sync::broadcast 기반 채널(+ 프린시펄 라우팅). 캡슐은 오직 이 버스의 IPC 메시지로만 소통하며, 다른 직접 통로는 없다.[capabilities]·[publish]/[subscribe] ACL·[imports]/[exports] WIT 계약을 선언한다. WASM 바이트보다 먼저 읽힌다.공식 저장소·호스팅판·자매 레포.
GitHub 저장소(book) · github.com/unicity-astrid/book — "The Astrid Book" 마크다운 원본.
호스팅판(읽기) · unicity-astrid.github.io/book — 설치 없이 바로 읽기.
커널 저장소 · github.com/unicity-astrid/astrid — 실제 Rust 커널(★ 9.2k). 책의 앵커가 가리키는 코드.
RFC 저장소 · github.com/unicity-astrid/rfcs — 커널↔유저공간 계약 변경 제안.
WIT 계약 · github.com/unicity-astrid/wit — astrid:* 인터페이스 정의 원본.
자매 문서(handbook) · github.com/unicity-astrid/handbook — 운영·기여 프로세스(같은 폴더 astrid-handbook-deep-dive.html 참고).
조직/제작 · unicity.ai (Unicity Labs)
TrendShift · trendshift.io/repositories/60294