GITHUB 레포 딥다이브 · 2026-08-03 · YC-SOFTWARE/QM · 회사 전체가 함께 쓰는 "멀티플레이어" 에이전트 하네스

qm 딥다이브
— 개인 비서가 아니라 회사가 함께 고용하는 에이전트

qm은 Y Combinator가 공개한 멀티플레이어 에이전트 하네스(multiplayer agent harness)다. 대부분의 AI 에이전트는 "나 한 명의 비서"로 설계되지만, qm은 스타트업/회사 전체를 위해 설계됐다. 직원마다 자기만의 격리된 작업공간을 갖고 서로 방해 없이 일하다가, 슬랙 채널·그룹 메시지·프로젝트에서는 같은 에이전트와 협업한다.

핵심은 두 가지다. 첫째, 사람과 방(room) 각각이 자기만의 범위(scope)를 갖는다 — 메모리, 파일, 열쇠고리(keychain), 권한, 크론, 웹앱, 그리고 지워지지 않는 durable 샌드박스(자기 전용 컴퓨터)까지 전부 scope별로 분리된다. 둘째, 모델도 하네스도 갈아끼운다 — Pi·OpenCode·Codex·Claude Code가 전부 같은 코어를 구동하므로, 한 배포가 특정 벤더에 묶이지 않는다. 슬랙과 웹에서 동일한 신원·설정이 그대로 이어진다.

(저장소 yc-software/qm · ★ 11,581 · 포크 739 · 이슈 86 · 언어 TypeScript · MIT · 2026-07-29 생성 → 며칠 만에 ★7k · src/7.5만 줄 / 47개 서브시스템 · Node 24 · 홈페이지 qm.ycombinator.com · TrendShift Daily #1)
목차
  1. 한 줄 정체
  2. 왜 주목받는가 — "개인 비서"에서 "회사 동료"로
  3. 기술 스택 전체 지도
  4. 아키텍처 심화 — 헤드리스 코어 + scope별 durable 샌드박스
  5. 디렉토리 구조 해부
  6. 학습 포인트 — 기술별 배울 것
  7. 시스템 / 배포 요구사항
  8. 직접 해볼 수 있는 실습 과제
  9. 관련 기술 심화 로드맵 (주차별)
  10. 핵심 키워드 사전
  11. 참고 링크

1한 줄 정체

이 프로젝트가 정확히 무엇인지 한 문장으로

qm은 "한 회사 안에서 모든 직원이 각자 격리된 작업공간으로 쓰면서 슬랙·웹에서 함께 협업하는, 모델·하네스를 자유롭게 갈아끼울 수 있는 셀프호스팅 조직용 AI 에이전트 코어"다. 개인 비서형 에이전트(ChatGPT, Claude 앱)와 다르게, qm의 기본 단위는 "사람 한 명"이 아니라 범위(scope)다. 나의 개인 scope, 우리 팀 채널 scope, 특정 프로젝트 scope, 회사 전체(org) scope — 각 scope가 자기만의 기억과 파일과 컴퓨터를 갖는다.

한 장의 비유

"직원마다 자기 책상과 사물함을 주는 회사, 그런데 그 직원이 AI"

보통의 AI 비서는 모두가 공유하는 안내데스크 직원 한 명 같다. 편하지만 내 메모와 옆자리 동료의 메모가 뒤섞이고, 누가 무슨 권한으로 뭘 했는지 흐릿하다. qm은 정반대다 — 입사하면 각자에게 잠긴 책상, 개인 사물함(keychain), 전용 작업용 컴퓨터(durable 샌드박스)를 준다. 내 컴퓨터에 설치한 도구는 내 것으로 남고, 내 자격증명으로 로그인한 서비스는 나만 쓴다.

그러면서도 회의실(슬랙 채널·프로젝트)에 들어가면 같은 AI 동료가 그 방의 공유 기억을 갖고 함께 일한다. 관리자는 어떤 모델·하네스를 쓸지, 보안 수위를 어디까지 열지를 회사 차원에서 정하고, 각 scope는 그 기준을 더 조일 수만 있다(느슨하게는 못 한다). "개인화"와 "협업"과 "거버넌스"를 동시에 잡으려는 설계다.

용어
에이전트 하네스(agent harness)
LLM을 "실제로 일하는 에이전트"로 굴리기 위한 바깥 골격 — 대화 루프, 도구 실행, 승인 게이트, 메모리, 세션 저장을 묶은 실행 환경을 말한다. qm은 이 골격을 벤더 중립으로 만들어, 안쪽에 들어가는 코딩 에이전트(Pi·Codex·Claude Code·OpenCode)를 바꿔 끼울 수 있게 했다. "누가 운전하든 차대(車臺)는 그대로"인 구조.
용어
범위(scope)
qm이 격리·공유의 단위로 삼는 "소유권 경계". 개인 scope(사람마다), 방 scope(슬랙 채널·그룹 메시지·프로젝트), 조직 scope(org)로 나뉜다. 각 scope는 메모리·파일·keychain 뷰·권한·크론·웹앱·durable 샌드박스를 독립적으로 갖는다. 상위(org)에서 정한 정책을 하위 scope가 상속하되, 보안은 더 조이는 방향으로만 조정된다.

사용자가 슬랙에서 한 줄 던졌을 때 qm 안에서 벌어지는 일을 압축하면 이렇다:

직원 A (슬랙 DM): "지난주 회의록 요약해서 김대리한테 초안 메일 써줘" │ ▼ ① 신원·scope 판정 누가(=A), 어느 방에서 보냈나 → A의 개인 scope로 라우팅 ② 정책·예산 확인 보안 posture, 명령 정책, 요금 예산(budget) 통과? ③ 코어가 턴 시작 시스템 프롬프트 + A scope의 메모리·히스토리 로드 ④ 하네스 루프 Pi / Codex / Claude Code 중 승인된 하네스가 응답 생성 ⑤ execute 도구 A의 durable 샌드박스에서 실제 명령 실행(파일·메일·검색) └ 외부 데이터·결과는 auto posture면 분류기가 먼저 검열 ⑥ 지속화 세션 히스토리·메모리·감사 로그를 Postgres에 durable 저장 ⑦ 응답 슬랙에 답 + 필요한 승인은 사람에게 되물음(strict면 매번)

2왜 주목받는가 — "개인 비서"에서 "회사 동료"로

며칠 만에 ★7,000과 TrendShift #1에 오른 이유

타이밍이 절묘하다. 2026년 중반은 "조직용 에이전트(agent for work)"가 격전지가 된 시점이다. Anthropic이 Cowork를 내놨고, 같은 트렌딩 목록에 different-ai/openwork("오픈소스 Claude Cowork 대안")가 나란히 올라와 있다. 이 흐름에서 qm의 각도는 뚜렷하다 — "개인용"이 아니라 처음부터 "멀티플레이어". 게다가 만든 곳이 Y Combinator(홈페이지 qm.ycombinator.com)라, 공개 며칠 만에 신뢰와 관심이 폭발했다.

둘째 이유는 벤더 중립이다. 대부분의 조직용 에이전트 제품은 특정 모델 회사에 묶인다(OpenAI면 OpenAI, Anthropic이면 Anthropic). qm은 하네스와 모델을 배포 설정 한 줄로 갈아끼운다. 오늘 Claude Code로 굴리다 내일 Codex로, 팀별로 다른 모델을 승인할 수도 있다. "AI 회사에 종속되지 않는 사내 에이전트 인프라"라는 포지션은 규제·비용·리스크를 신경 쓰는 조직에 특히 매력적이다.

비유

사내 메신저를 자체 서버에 까는 것과 같은 결정. 슬랙(SaaS)을 쓰면 편하지만 데이터·정책·요금이 남의 손에 있다. 어떤 회사는 그래서 Mattermost를 자기 서버에 깐다. qm은 에이전트 판의 그 선택지다 — 우리 클라우드 계정(Fly.io나 AWS)에 우리가 깔고, 자격증명도 감사 로그도 샌드박스도 우리 안에 둔다. 대신 "클릭 한 번 가입"의 편함은 포기한다.

다른 조직용 에이전트와 뭐가 다른가

항목ChatGPT Team / EnterpriseClaude Cowork보통의 슬랙 봇이 레포(qm)
기본 단위개인 비서 공유개인 데스크톱봇 1개(무상태)scope별 격리 + 공유
호스팅벤더 SaaS벤더 호스팅대개 SaaS내 클라우드(Fly/AWS)
모델·하네스OpenAI 고정Anthropic 고정제각각Pi·Codex·Claude·OpenCode 교체
메모리·파일계정 단위로컬 단위보통 없음scope별 durable 샌드박스
거버넌스관리자 콘솔제한적직접 구현3단 보안 posture + 명령 정책 + 감사
협업 표면웹 앱데스크톱슬랙슬랙 + 웹(동일 신원)

셋째 이유는 엔지니어링의 진지함이다. README와 AGENTS.md를 읽으면 이게 데모가 아니라 운영을 전제로 짜였음이 드러난다: 코어는 blue-green·멀티 인스턴스로 돌아가고, "프로세스 메모리에 상태를 두지 말라(durable by default)"를 대원칙으로 못박았으며, 에이전트는 사람의 자격증명·권한으로 행동하되 모든 것이 감사(audit)된다. 보안 수위를 셋(Strict/Auto/Dangerous)으로 나누고, 어떤 수위에서도 "재귀 삭제·파괴적 SQL 같은 것은 하드 차단"하는 명령 정책은 절대 못 끄게 했다. 에이전트 인프라를 실제로 회사에 들이려는 사람이 볼 만한 설계다.

균형 잡기
읽기 전에 알아둘 것 — 아주 이른 v0.1.x, 그리고 운영 부담

분석 시점 기준 이 레포는 공개 며칠 된 v0.1.0이었다(현재 v0.1.4, ★1.1만+). 별점은 7천을 넘겼지만 상당 부분 "YC + 시의성"의 힘이고, 오픈 이슈 86개가 말해주듯 API와 내부 구조는 아직 빠르게 흔들린다. 지금 프로덕션에 얹는 건 얼리어답터의 영역이다.

운영 부담도 실재한다. 이건 "가입하면 끝"인 SaaS가 아니라 내 클라우드에 직접 깔고 굴리는 인프라다 — Postgres, 샌드박스 이미지 빌드, 시크릿 관리, 슬랙 앱 매니페스트까지 챙겨야 한다. 또 하나 특이점: 기여를 코드가 아니라 "사람이 쓴 글"로만 받는다(adrs/에 원하는 변경을 서술 → 정렬되면 메인테이너가 구현). 커뮤니티 PR로 코드가 쌓이는 보통의 오픈소스와는 결이 다르니, "함께 만든다"를 기대하고 오면 어긋난다. 그리고 에이전트가 사용자 본인으로서 행동하는 모델은 강력하지만, Dangerous posture로 잘못 열면 그만큼 위험하다.

3기술 스택 전체 지도

package.json·소스·docs에서 읽어낸 실제 구성

스택 선택이 인상적으로 절제돼 있다. 코어는 빌드 스텝 없이 TypeScript를 Node가 직접 실행한다(node src/index.ts). 트랜스파일 파이프라인이 없어 배포·디버깅이 단순해지는 대신, Node 24라는 비교적 최신 런타임을 요구한다. 무거운 프레임워크 대신 Fastify·Postgres·pg-boss 같은 검증된 조각들을 얇게 엮었다.

① 코어 런타임 — TypeScript on Node 24

② 하네스 — 코딩 에이전트 4종 + mock

이 레포의 정체성. src/harness/가 서로 다른 코딩 에이전트를 하나의 Harness 인터페이스 뒤로 통일한다.

하네스패키지비고
pi (기본값)@earendil-works/pi-coding-agentHARNESS=pi가 디폴트. qm이 직접 관리하는 보안 빌드 tgz를 고정 참조
claude@anthropic-ai/claude-agent-sdkClaude Code 계열 루프
codex@openai/codexOpenAI Codex. app-server 모드 어댑터(codex-app-server.ts) 포함
opencode@opencode-ai/sdk · pluginOpenCode. 자체 플러그인 훅
mock테스트용 결정적 하네스

harness-router.tsresolveRuntimeChoice()가 "org이 승인한 하네스 목록 → scope별 선택 → 요청별 오버라이드"를 순서대로 해석해 최종 (하네스, 모델) 조합을 정한다. context-compaction.ts(긴 대화 압축)와 replay.ts·tape-fold.ts(세션을 "테이프"로 기록·재생)가 하네스 공통 기능으로 붙는다.

③ 지속화 · 큐 · 스케줄

④ 샌드박스 백엔드 3종 (scope의 "durable 컴퓨터")

백엔드구현언제
Locallocal-sandbox.ts + docker-exec.ts개발·자체 호스트. 도커 컨테이너로 격리
AWSaws-sandbox.ts + aws-microvm-api.ts프로덕션. microVM(파이어크래커 계열) 격리
Fly.iosprites-sandbox.ts (@fly/sprites)Fly 배포. 스프라이트 기반 격리

세 백엔드 모두 같은 샌드박스 인터페이스를 구현하고, sandbox-migrate.ts가 백엔드/이미지 교체 시 마이그레이션을 담당한다. 파일 입출력은 tar 스트림으로 오간다.

⑤ 표면(플러그인) — 슬랙 · 웹 · admin · portal

⑥ 클라우드 · 배포 · 개발 품질

4아키텍처 심화 — 헤드리스 코어 + scope별 durable 샌드박스

소스를 직접 읽고 재구성한 구조

qm의 아키텍처를 한 문장으로 요약하면 "작고 고정된 코어 + 그 위에 꽂는 교체 가능한 조각들"이다. 모든 턴은 중앙 코어를 통과하고, 코어는 여러 모델·하네스로 응답을 만든다. 사용자 데이터·세션·durable 상태는 Postgres에 있고, 에이전트가 실제로 명령을 실행하는 곳은 scope 전용 샌드박스다.

┌──────────────────────────── 표면(선택 플러그인) ────────────────────────────┐ │ Slack(인프로세스) Web UI(Vite+Lit) Admin Portal(공개 SSO) │ └───────────────┬───────────────┬──────────────────┬────────────────┬────────┘ └───────────────┴───── HTTP API ────┴────────────────┘ │ ┌────────────────────────────▼────────────────────────────┐ │ 헤드리스 코어(Node/TS) │ │ API: 신원 · 정책 · 스케줄러 │ │ ▲ │ │ ▼ │ │ 에이전트 루프 (Pi / OpenCode / Codex / Claude Code) │ │ │ 작고 고정된 도구 집합 — 그중 하나가 execute │ └────────┼───────────────────────────────┬────────────────┘ │ │ ┌─────────────▼─────────────┐ ┌───────────▼───────────────────┐ │ Postgres │ │ scope 전용 샌드박스 │ │ 세션 · 메모리 · 큐 │ │ 파일 · 도구 · 로그인된 서비스 │ │ 감사 · 설정 · 자격증명 │ │ = 지워지지 않는 durable 컴퓨터 │ └───────────────────────────┘ └───────────────────────────────┘

주목할 설계 선택: 에이전트가 쓰는 도구는 작고 고정돼 있고, 그중 하나가 execute(소스에선 exec)다. 파일 읽기/쓰기, 웹 검색, 메일 처리 같은 무한히 많은 능력은 도구를 늘려서가 아니라 execute가 scope 샌드박스 안에서 명령을 돌려 얻는다. 그 샌드박스는 durable이라, 한 번 설치한 도구는 다음 턴에도 그대로 있다. "에이전트에게 컴퓨터 한 대를 주는" 발상이다.

용어
헤드리스 코어(headless core)
화면(UI)을 스스로 갖지 않고 HTTP API만 노출하는 본체. 슬랙·웹·admin·portal은 전부 이 API를 소비하는 선택적 플러그인이다. 덕분에 표면을 갈아끼우거나 빼도 코어는 그대로다. 반대로 슬랙만은 성능·수명주기 때문에 예외적으로 코어가 인프로세스로 직접 띄워 감독한다.

substrate 인터페이스 + 단 하나의 wiring 파일

이 코드베이스에서 반복되는 패턴: 모든 기반요소(substrate)가 인터페이스 뒤에 있다. 하네스, 세션 저장소, 샌드박스, 메모리 — 전부 추상 인터페이스로 선언되고, 프로덕션 구현은 src/wiring.ts 한 파일에서 갈아끼운다. 테스트는 mock 구현을, 프로덕션은 Postgres·AWS 구현을 wiring에서 선택할 뿐, 코어 로직은 어느 구현인지 모른다. "무엇을 쓸지"와 "어떻게 동작할지"를 분리한 의존성 주입의 교과서적 적용이다.

코어 로직 ──의존──▶ [ 인터페이스 ] ◀──구현── wiring.ts가 선택 Harness pi / codex / claude / opencode / mock SessionStore Postgres / in-memory(테스트) Sandbox local(docker) / aws(microVM) / fly(sprites) Memory Postgres notebook / mock

코어는 generic, 회사별 특수성은 "배포 레이어"로

또 하나의 큰 결정: 코어 트리는 회사가 누구든 바이트 단위로 동일하게 유지하고, 조직 고유의 것(org 설정, 커스텀 도구·스킬, 샌드박스 이미지, 인프라)은 전부 deploy/layers/<org>/ 한 디렉토리에 가둔다. 회사는 qm을 private fork(깃허브 Fork 버튼이 아니라 순수 clone)로 운영하고, update-qm·upstream-pr 두 스킬이 상류와의 경계를 양방향으로 지킨다. 코어가 상류와 동일하게 유지되니 업스트림 병합이 항상 작게 끝난다.

보안 — 사용자로서 행동하되, 전부 감사한다

qm의 보안 모델은 로컬 코딩 에이전트(OpenCode·Codex·Claude Code)의 그것을 따른다: 에이전트는 자기가 일해주는 사람의 자격증명·권한으로 행동하고, 하는 모든 일이 감사된다. org은 하나의 보안 posture를 고르고, 하위 scope는 그걸 더 조이기만 할 수 있다.

posture동작성격
Strict모든 하네스 도구 호출이 사람 승인에서 멈춘다(효과 없는 턴 종료 2개만 예외)가장 안전 · 가장 느림
Auto (기본)출처 라벨이 붙은 외부 데이터·도구 결과를 분류기가 먼저 검열한 뒤 모델에 전달(자체 검열 프록시로 교체 가능)균형 · 디폴트
Dangerous내용 검열 없음, 도구 호출 사이 멈춤 없음가장 빠름 · 가장 위험
항상 켜짐
명령 정책은 Dangerous에서도 못 끈다

세 posture와 별개로, 미리 선언된 명령 정책(승인 규칙 + 재귀 삭제·파괴적 SQL 같은 것에 대한 하드 차단)이 모든 posture에서 항상 적용된다 — Dangerous 포함. "속도를 위해 검열을 끄더라도, 돌이킬 수 없는 파괴는 원천 차단"이라는 이중 안전망이다. 위협 모델·운영자 가정·알려진 한계는 SECURITY.md에 문서화돼 있다.

durable by default — RAM에 상태를 두지 말 것

AGENTS.md가 대원칙으로 못박은 규율. 코어는 blue-green·멀티 인스턴스로 돌기 때문에, 프로세스 메모리의 Map이나 링버퍼는 인스턴스마다 다르고 배포 때마다 날아간다. 그래서 나중에 읽어야 하는 것(감사·로그·큐·해석된 설정)은 무조건 Postgres에 둔다. RAM은 durable 저장소 앞의 캐시이거나, 다시 만들어낼 수 있는 진짜 일회성 상태일 때만 허용된다. "에이전트가 실수로 회사 상태를 프로세스에 숨기는" 흔한 사고를 아키텍처 차원에서 막은 것.

감상 포인트
코드에 주석이 0줄 — 대신 이름·구조·테스트로 말한다

AGENTS.md의 코딩 규율이 독특하다: 레포에 주석을 절대 남기지 않는다(설명 주석·TODO·타입 억제 지시문·주석처리된 코드 전부 금지). 의도는 이름과 구조와 테스트로 표현하고, 이유는 커밋 메시지·PR에 쓴다. "모든 경로가 지나는 층에서 고쳐라", "보고된 한 곳만이 아니라 같은 패턴 전부를 고쳐라", "머지 전엔 반드시 새 컨텍스트의 리뷰어가 변경을 깨보라(자기 리뷰 금지)" 같은 규율과 함께, 이 레포 자체가 "에이전트가 함께 일하기 좋은 코드베이스를 어떻게 만드는가"의 사례집이다.

5디렉토리 구조 해부

git clone 직후 보이는 것들 (src만 47개 서브시스템 · 약 7.5만 줄 TS)
qm/ ├── README.md / AGENTS.md ★ 소개 + 코딩 규율 (CLAUDE.md는 AGENTS.md 심볼릭 링크) ├── SECURITY.md 위협 모델 · 운영자 가정 · 알려진 한계 ├── package.json Node 24 · 하네스 4종 · fastify · pg · pg-boss ├── src/ ★ 헤드리스 코어 (47개 서브시스템) │ ├── index.ts 진입점: config → buildApp → server │ ├── wiring.ts substrate 구현을 갈아끼우는 단 하나의 파일 │ ├── api/ (64) HTTP API 표면 — 최대 서브시스템 │ ├── slack/ (32) 슬랙 인프로세스 플러그인 연동 │ ├── core/ (18) 오케스트레이터 + 턴 수명주기(turn-*.ts) │ ├── sandbox/ (17) local(docker)·aws(microVM)·fly(sprites) │ ├── runs/ (17) 백그라운드 실행 워커 + pg-boss 큐 │ ├── admin/ (16) 거버넌스(명령 정책·SOUL·egress) │ ├── harness/ (13) Pi·Codex·Claude·OpenCode + router + replay │ ├── skills/ (13) scope 소유 · 공유 가능 · 관리자 승격 스킬 │ ├── credentials/ (10) keychain(자격증명 금고) │ ├── memory/ (10) scope별 메모리 + notebook 문법 │ ├── resolution/ (9) 설정 scope 해석(org→scope 상속) │ ├── auth/ persistence/ cron/ 신원 · Postgres · 스케줄 │ └── triggers/ connectors/ … 와치 · 외부 커넥터 … ├── plugins/ ★ 표면 플러그인 (코어와 물리적 분리) │ ├── chassis/ 공유 배관 — 코어를 절대 import 안 함 │ ├── auth/ portal/ OIDC 인가 서버 · 공개 SSO 정문 │ ├── admin/ web-ui/ 거버넌스 UI · Vite+Lit 채팅 셸 │ └── onboarding/ ├── cli/ @yc-software/qm — qm init(배포 디렉토리 생성) ├── deploy/layers/<org>/ ★ 회사별 특수성이 사는 유일한 곳 ├── skills-seed/ 배포에 딸려가는 기본 스킬 씨앗(20+) ├── aws/ fly/ local/ 타깃별 샌드박스 이미지 · Dockerfile ├── scripts/ smoke 테스트 · 라이브테스트 · 벤치 ├── test/ node --test (postgres-*.test.ts만 30+) └── adrs/ ★ 기여가 코드가 아니라 "글"로 들어오는 곳

구조가 곧 아키텍처다. src/의 47개 서브디렉토리가 도메인별로 또렷이 갈려 있고(신원·정책·샌드박스·하네스·메모리·크론…), 표면은 plugins/로 물리적으로 떨어져 코어를 import하지 못한다. 회사 고유의 모든 것은 deploy/layers/<org>/ 하나로 격리된다. "코어는 공용, 커스터마이징은 한 폴더"라는 원칙이 디렉토리 배치에 그대로 박혀 있어, 이 트리를 읽는 것만으로 시스템의 경계가 보인다.

감상 포인트
api(64) · slack(32)이 가장 크다는 사실이 말해주는 것

가장 큰 서브시스템이 화려한 AI 로직이 아니라 HTTP API 표면과 슬랙 연동이라는 점에 주목. 이 레포의 무게중심은 "똑똑한 프롬프트"가 아니라 여러 사람·여러 표면·여러 하네스를 안전하게 엮는 통합·거버넌스에 있다. 에이전트를 조직에 들이는 진짜 어려움이 어디인지를 코드 분량이 정직하게 보여준다.

6학습 포인트 — 기술별 배울 것

이 레포에서 뽑아 갈 수 있는 다섯 가지
배울 것 ①

조직용(멀티테넌트) 에이전트를 "제품"으로 설계하는 법

개인 비서 데모 수백 개와 갈라지는 지점이 여기다. scope라는 소유권 경계 하나로 격리(개인)와 협업(방)과 거버넌스(org)를 동시에 잡는 모델, 상위 정책을 하위가 "조이기만" 할 수 있는 상속 규칙, 에이전트가 사용자로서 행동하되 전부 감사되는 신뢰 모델 — 멀티테넌트 SaaS를 설계해 본 사람에게도 "AI 에이전트판 멀티테넌시"는 새로운 문제다. src/resolution/(설정 scope 해석)과 src/acl/·src/credentials/가 그 답안이다.

배울 것 ②

substrate 인터페이스 + 단일 wiring — 벤더 중립을 코드로 만드는 법

"모델에 종속되지 않는다"를 슬로건이 아니라 구조로 구현한 표본. 하네스·세션저장소·샌드박스·메모리를 전부 인터페이스로 선언하고 src/wiring.ts 한 곳에서 구현을 주입한다. harness-router.ts가 org 승인 목록 → scope 선택 → 요청 오버라이드를 해석하는 방식은, 다양한 백엔드를 런타임에 고르는 어떤 시스템에도 이식 가능한 뼈대다. 여기에 mock 구현까지 나란히 두어 테스트가 실물 없이 돈다.

배울 것 ③

durable-by-default 분산 설계

blue-green·멀티 인스턴스에서 "상태를 프로세스에 두지 말라"를 규율로 삼고, 세션·메모리·큐·감사·심지어 리더 선출과 락까지 Postgres로 내린다. pg-boss 큐로 백그라운드 작업을 돌리고, 어드바이저리 락으로 중복 실행을 막는 실제 코드(test/leader-lease.test.ts, advisory-lock.test.ts)를 읽으면, "무상태 서비스 여러 대 + 하나의 durable 저장소"라는 정석을 에이전트 문맥에서 어떻게 지키는지가 보인다.

배울 것 ④

에이전트에게 "durable 컴퓨터"를 주는 샌드박스 설계

도구를 무한정 늘리는 대신 작고 고정된 도구 집합 + execute로 능력을 확장한다는 발상. 그 execute가 도는 scope 샌드박스는 durable이라 설치한 도구가 남는다. 같은 인터페이스를 local(docker)·AWS(microVM)·Fly(sprites) 셋으로 구현한 src/sandbox/는, 격리 기술(컨테이너 vs 마이크로VM)의 트레이드오프를 한 인터페이스 아래에서 비교하며 공부하기 좋은 교재다.

배울 것 ⑤

코어/커스터마이징 경계를 "코드가 아니라 프로세스"로 강제하는 법

회사별 커스터마이징을 deploy/layers/<org>/ 하나로 가두고, 코어는 상류와 바이트 동일하게 유지하는 private fork 전략. update-qm(상류→포크 병합)·upstream-pr(조직 정보 유출 없이 포크→상류 기여) 두 스킬과, 플러그인이 코어를 import하지 못하게 한 chassis 규칙까지 — "오픈소스를 사내에서 divergence 없이 오래 운영하는" 소프트웨어 공급망 규율을 통째로 배울 수 있다.

7시스템 / 배포 요구사항

package.json·.env.example·getting-started 기준
구성요소요구비고
런타임Node ≥ 24.15 · npm ≥ 11.10빌드 스텝 없이 TS 직접 실행. .node-version=24.18
DBPostgres세션·메모리·큐·감사·설정·자격증명 전부 여기
모델 키ANTHROPIC / OPENAI / OPENROUTER 중선택한 하네스가 쓰는 provider 키
샌드박스Docker(로컬) / AWS microVM / Fly sprites배포 타깃에 따라 하나
배포 타깃Fly.io 또는 AWS운영자 본인 클라우드 계정에서 실행
슬랙(선택)Bot Token + App Tokenxoxb-… / xapp-…. 웹만 써도 됨
시크릿CORE_SIGNING · CAPABILITY · PORTAL_IDENTITY · CONNECTOR · SKILL_SIGNING서명·capability용 비밀들(.env.example에 목록)

배포 (권장 경로) — 소스 체크아웃 없이

# qm init이 배포 디렉토리를 게시된 패키지에서 통째로 만들어 준다
npm exec --yes --package=@yc-software/qm@latest -- \
  qm init . --org acme --target fly     # 또는 --target aws
npm install
# → 배포용 스킬을 에이전트에게 넘기면 인프라·웹 로그인·커넥터·
#   (선택)슬랙·배포·라이브 점검까지 안내대로 진행된다

기본 하네스는 HARNESS=pi, 기본 보안은 HARNESS_SECURITY_POSTURE=auto. 예산 가드레일도 env에 있다 — 창(window)당 요금 상한(BUDGET_USD_PER_WINDOW), org 단위 상한, 레이트리밋까지 기본값이 잡혀 있어 폭주 비용을 구조적으로 막는다.

8직접 해볼 수 있는 실습 과제

쉬운 것부터 — 읽기 → 로컬 실행 → 배포 순
과제 1 난이도 ●○○○○

clone → README·AGENTS·SECURITY 3종 정독 → src 트리 훑기

git clone --depth 1 후 README의 mermaid 아키텍처를 손으로 다시 그려 보고, src/ 47개 서브디렉토리 이름만 훑으며 "무엇이 도메인 경계인지"를 지도로 만들어 보자. AGENTS.md의 코딩 규율(주석 0줄, 모든 경로가 지나는 층에서 고치기)이 왜 나왔을지 추측해 보는 게 관전 포인트.

과제 2 난이도 ●●○○○

.env.example 읽고 로컬 dev-instance 띄우기

.env.example을 복사해 Postgres 접속과 provider 키를 채우고, npm run dev-instance로 로컬 인스턴스를 올려 보자(HARNESS=pi, 로컬 도커 샌드박스). 웹 UI로 접속해 한 턴을 돌리고, npm run dev-instance:doctor로 무엇이 빠졌는지 진단 리포트를 읽는다.

과제 3 난이도 ●●●○○

하네스를 갈아끼워 보기 — pi → claude/codex

HARNESS를 바꾸고 같은 요청을 던져 응답 차이를 관찰. 그다음 src/harness/harness-router.tsresolveRuntimeChoice()를 읽으며 "org 승인 목록 → scope 선택 → 요청 오버라이드"의 우선순위가 코드로 어떻게 표현됐는지 따라가 보자. src/harness/harness.tsHarnessTurnInput 인터페이스가 모든 하네스가 지켜야 하는 계약임을 확인.

과제 4 난이도 ●●●●○

scope 격리 체감 — 개인 vs 채널 메모리 분리

개인 DM에서 "내 이름은 X"를 기억시키고, 공유 채널에서 같은 걸 물어 보자. scope가 다르면 기억이 새지 않아야 한다. src/memory/의 notebook 문법과 src/resolution/의 설정 해석을 읽으며, "어디까지가 내 것이고 어디부터가 우리 것인지"를 코드가 어떻게 가르는지를 추적한다.

과제 5 난이도 ●●●●●

Fly/AWS에 배포하고 보안 posture를 실험

qm init으로 배포 디렉토리를 만들어 본인 Fly/AWS 계정에 올리고(테스트 org), 슬랙 앱을 연결한다. 그다음 posture를 strict → auto → dangerous로 바꿔 가며 같은 파괴적 명령(예: 재귀 삭제)이 어느 posture에서도 하드 차단되는지를 직접 확인해 보자. 명령 정책이 posture와 독립임을 몸으로 이해하는 게 이 과제의 목표 — 단, 반드시 격리된 테스트 환경에서.

9관련 기술 심화 로드맵 (주차별)

이 레포를 계기로 공부 계획을 짠다면
주차주제구체적으로
1주조직용 에이전트·멀티테넌시테넌트 격리, RBAC, scope/상속 모델, 감사 로그 설계. qm의 resolution/·acl/·audit/를 표본으로
2주에이전트 하네스 4종Claude Agent SDK · OpenAI Codex · OpenCode · Pi 각각의 루프/도구 모델. 공통 인터페이스로 추상화하는 법(harness/)
3주durable 분산 시스템Postgres 중심 상태, pg-boss 작업 큐, blue-green 배포, 리더 선출/어드바이저리 락, 멱등성(idempotency)
4주샌드박스·격리 기술도커 격리 vs Firecracker microVM vs Fly sprites. 파일 tar 전송, durable 볼륨, 이미지 마이그레이션
5주(선택)보안·거버넌스OIDC + PKCE(내장 auth), provenance 라벨링과 콘텐츠 검열, 명령 정책(allow/deny), capability 서명(jose)

10핵심 키워드 사전

이 문서에 나온 개념 압축 정리
용어
멀티플레이어 에이전트 하네스
한 명이 아니라 조직 전체가 함께 쓰는 에이전트 실행 골격. 사람마다 격리된 작업공간을 주면서 방(채널·프로젝트)에서는 공유 협업하게 한다. qm의 정체성 그 자체.
용어
범위(scope)
격리·공유의 단위이자 소유권 경계. 개인/방/조직 scope 각각이 메모리·파일·keychain·권한·크론·웹앱·durable 샌드박스를 독립적으로 갖는다.
용어
헤드리스 코어
UI 없이 HTTP API만 노출하는 본체. 슬랙·웹·admin·portal은 이 API를 소비하는 선택적 플러그인이다(슬랙만 예외적 인프로세스).
용어
작은 고정 도구 집합 + execute
에이전트가 쓰는 도구를 적게 고정하고, 무한한 능력은 execute가 scope 샌드박스 안에서 명령을 돌려 얻는 설계. 도구 폭발을 막는다.
용어
durable 샌드박스
scope 전용의, 지워지지 않는 격리 컴퓨터. 한 번 설치한 도구·로그인 상태가 다음 턴에도 유지된다. local(docker)·AWS(microVM)·Fly(sprites)로 구현.
용어
하네스 라우터
resolveRuntimeChoice() — org이 승인한 하네스·모델 목록에서 scope 선택과 요청 오버라이드를 해석해 이번 턴의 (하네스, 모델)을 결정하는 로직.
용어
substrate 인터페이스 / wiring
하네스·세션저장소·샌드박스·메모리를 전부 인터페이스로 두고, 프로덕션 구현을 src/wiring.ts 한 파일에서 주입하는 의존성 주입 패턴.
용어
보안 posture (Strict/Auto/Dangerous)
org이 고르는 하나의 보안 수위. Strict=매 도구 호출 승인, Auto=외부 데이터 분류기 검열(기본), Dangerous=검열·멈춤 없음. 하위 scope는 더 조이기만 가능.
용어
명령 정책(command policy)
posture와 독립으로 항상 적용되는 승인 규칙 + 하드 차단(재귀 삭제·파괴적 SQL 등). Dangerous에서도 못 끄는 최후 안전망.
용어
durable by default
blue-green·멀티 인스턴스 전제. 나중에 읽어야 할 상태는 프로세스 메모리가 아니라 반드시 Postgres에 둔다. RAM은 캐시이거나 재생성 가능한 것만.
용어
private fork / deploy layers
회사가 qm을 순수 clone(깃허브 Fork 아님)으로 운영하고, 조직 고유의 모든 것을 deploy/layers/<org>/에 가두는 전략. 코어는 상류와 바이트 동일.
용어
keychain
scope별 자격증명 금고. 에이전트가 "사용자로서" 서비스에 로그인·행동하되, 각 scope는 자기 뷰의 자격증명만 본다(src/credentials/).
용어
tape / replay
세션을 "테이프"로 기록해 결정적으로 재생하는 하네스 공통 기능. 디버깅·회귀 테스트·shadow 실행에 쓰인다(harness/replay.ts·tape-fold.ts).

11참고 링크

더 파고들 때