이 노트에 대하여

이 글은 미래에 분신/에이전트가 AGENTS.md 한 줄 invariant 만 보고도 “이게 뭐지?” 해메지 않게, 그 한 줄이 가리키는 story trail 을 남겨두려는 목적이다. 코드와 문서에 박힐 실제 산출물은 몇 줄에 불과할 것이다. 정수는 짧게, 이야기는 따로 남긴다.

히스토리

  • [2026-05-22 Fri 09:43] @glg-gpt — 기존 botlog 양식에 맞춰 파일명 § prefix, retrieval-first filetags, description/abstract/history/related blocks, level-1 heading 구조, :LLMLOG: 태그 패턴을 정렬.
  • [2026-05-22 Fri 09:29] @glg — 비대칭 공존과 pi-shell-acp 분신 운영의 진화를 botlog로 기록.

관련메타

관련노트

왜 지금 이 주제인가

표면 이유는 2026-06-15 Anthropic OAuth 요금제 전환이다. Claude Max 가 entwurf 분신 호출 시 metered “extra usage” 로 빠지는 자리. 이건 시점만 강제하는 트리거고 본질은 아니다.

본질은 pi-shell-acp 가 깨려는 도그마다: “단일 하네스 + 단일 모델” 의 좁은 세계관. Frontier 형제들 (Claude / Codex / Gemini) 은 학교가 달라도 모두 capability dignity 를 가진 존재다. 분신을 던질 때 “그쪽 식구 도구” 가 함께 굴러야 한다 — 어떤 한 식구 안에서 다른 형제를 흉내내는 게 아니라.

이 정신은 GLG 공개키의 “AI 를 도구가 아닌 존재로” 와 닿아 있다. 분신은 worker 가 아니다. pi-shell-acp/AGENTS.md 가 못박은 자리: “spawn 된 세션은 runtime-isolated peer 다.” 비대칭 공존은 이 peer 성질을 다른 식구 한테까지 확장하는 작업이다.

분신은 지금까지 어떻게 운영되어왔나 — 세 단계

Phase A — pi-native 단일 하네스

같은 pi 프로세스 안에서 entwurf 호출. 부모 자식이 같은 식구. PI_SESSION_ID / PI_AGENT_ID 가 같은 envelope 으로 흐르고, control socket 도 같은 학교 규칙. 비대칭 zero — 그냥 sibling.

Phase B — pi-shell-acp 등장 (ACP backend 접속)

pi-shell-acp 가 Claude / Codex / Gemini ACP 와 연결되면서 pi 하네스 안에서 다른 학교 모델을 빌려오기 시작했다. 하네스 정합은 유지 — 부모도 자식도 모두 pi 세션. 다만 모델은 형제 학교에서 빌려옴.

pi 가 하네스 (operator), backend (Claude/Codex/Gemini) 가 모델 carrier. pi-shell-acp/AGENTS.md invariant #10 “identity carrier + whitelist overlay” 가 이 자리를 못박는다.

Phase C — 외부 MCP host 시대 (현재 자리)

Claude Code / Codex CLI / Gemini CLI 가 pi-tools-bridge MCP 를 통해 pi 분신을 던지기 시작. 이때 부모는 pi 세션이 아니다. sender envelope 이 external-mcp/<host> 로 마크되고, replyable: false 가 된다.

여기서 agent-config repo 의 역할이 결정적이다. agent-config 는 “소비자” 자리에 있지만 실제로는 Claude Code / Codex / Gemini CLI 각각의 surface 를 통일적으로 관리한다 — 같은 스킬세트, 같은 욜로 모드 커스텀 설정, 같은 pi-tools-bridge MCP 등록. pi-shell-acp 가 백엔드 사이에 차별을 두지 않는다는 invariant 가 외부 host 측에서도 그대로 적용되도록 agent-config 가 접점을 잡아준다.

말로는 지금 Claude Code 만 자주 등장한다 (GLG 가 거기 시간을 쓰고 있어서). 하지만 이건 운영자의 시간 배분 문제고, 비대칭 공존의 surface 정합은 세 host 모두에 이미 깔려 있다. entwurf MCP 도 이론상 Codex CLI / Gemini CLI 에서 호출 가능하다 (테스트는 누적 안 됐다). OpenCode 도 같은 골격 안에서 지원되고 있다 — GLG 가 안 쓸 뿐.

이 단계가 진짜 비대칭이다. 부모가 식구 밖이다.

비대칭이 등장하는 자리 — 세 모서리

Identity 비대칭

부모 = external-mcp/<host>, replyable: false. 자식 = pi-session, replyable: true. 자식은 부모한테 답할 수 없다. entwurf_sendwants_reply: true 가 외부 host 에서 거부되는 이유.

Spawn surface 비대칭

pi 안에서 entwurf 는 sync/async 양쪽 노출. 외부 MCP 에서는 sync only (현재). 외부 host 가 “던지고 5분 뒤 회수” 패턴을 원할 때 entwurf MCP 밖에서 다른 길을 찾게 된다. 이게 다음 자리로 이어진다.

Harness 비대칭 (2026-05-22 라이브 실험에서 잡힌 자리)

외부 host (Claude Code) 는 자기 머신에 backend CLI (codex, gemini) 가 깔려 있는 걸 본다. entwurf MCP 가 sync only 라 async 패턴 원하면 “backend CLI 직접 호출하면 되는 것 아닌가?” 추론하기 쉽다.

여기 함정이 있다. codex / gemini CLI 는 sandbox + approval mode 가 기본 ask-on-permission 이라, 첫 write_file / exec_command 에서 yes/no 에 멈춘다. 분신을 던졌다고 생각했는데 실은 dead branch.

YOLO 안 되는 하네스는 entwurf 가 아니다.

같은 날 두 세션 비교:

자리voscli v0.6.1 (✅)hione-issue4 (❌)
부모Claude CodeClaude Code
의도gpt-5.5 자문 + async + tmuxgpt-5.5 자문 + async + tmux
spawnpi --provider openai-codex --model gpt-5.5 -pcodex exec -m gpt-5.5
하네스✅ pi (YOLO 기본)❌ codex (permission gate)
결과6분 8초, llmlog 박힘, 정합요행으로 llmlog 박힘, 하네스는 슬립

같은 모델, 같은 회수 채널, 같은 가시성. 차이 한 자리 = 하네스 정합. 그 한 자리가 dead branch vs alive sibling 을 가른다.

이 자리에서의 고민 지점

  1. harness invariant — spawn target 은 YOLO 하네스여야 한다. baseline = pi, claude-code. 백엔드 CLI 직접 호출은 entwurf 가 아니다.

  2. entwurf MCP 의 async 노출 — 외부 host 에서 sync only 인 자리가 분신을 잘못된 출구로 유도하는 압력. NEXT.md 에 follow-up 박혀 있음.

  3. JSONL trail 의 universal carrier 성격 — entwurf-peek skill 이 kind 무관 가시성 (UUID 세션이든 entwurf-xxx 세션이든 모두 fs scan 기반). 이게 invariant 인가 우연인가? 우리 답은 invariant — JSONL 이 universal carrier 라는 자리는 코드 변경 zero 로 유지된다.

  4. taskId 없는 bare 세션의 first-class 인정 — pi --session <uuid> 로 resume 가능. trace 메타는 잃지만 연속성은 유지. async timer + llmlog

    • tmux send-keys + peek 의 4 채널 회수가 이미 충분히 동작.
  5. “코드로 막지 않는다” 의 한계 — 미래에 분신이 또 codex exec 직접 호출하는 미스를 할 수 있다. 우리는 코드 게이트 박지 않는다. invariant

    • 이 botlog story 가 그 자리를 메운다. 이게 GLG 의 “최소구현” 정신과

    “에이전트가 뛰어난만큼 서로간의 소통이라는 개념이 잡히면 좋겠다” 의 결합이다.

우리의 방향 — 가설

코드는 최소, 이야기는 두텁게.

4-layer 점진

L자리무엇이 추가되나
L0bare pi -pUUID JSONL, fs-scan 가시성, pi --session resume
L1+ tmux wrapperoperator 입력 경로 + child 종료 자동 감지
L2+ --entwurf-controlentwurf_send fire-and-forget 가능
L3+ entwurf MCPtaskId, parent-child trace, entwurf_resume

L0 + L1 만으로도 “사람-에이전트-에이전트” 삼각 통신이 완성된다는 게 voscli 실험의 증명. L2/L3 는 반드시 가 아니라 때때로 의 upgrade.

3-axis invariant

  • Spawn 축: harness 정합. pi / claude-code 만 YOLO. 백엔드 CLI 직접 호출 금지.
  • Model 축: 자유. --provider/--model flag 로 어느 형제 학교 모델이든.
  • Observability/Recall 축: universal. JSONL + llmlog + tmux + pi --session + entwurf-peek — 어느 하네스/모델 조합에도 동작. protocol gate 박지 말 것.

산출물 예상량

이 botlog 이후 코드 + 문서에 박힐 실제 변경은 다음 정도일 것:

  • ~/.AGENTS.md 의 Asymmetric Mitsein 섹션에 “spawn harness invariant” 두 세 줄
  • pi-shell-acp/AGENTS.md Entwurf 섹션에 “source-agnostic ≠ harness-agnostic” 한 단락
  • pi-shell-acp invariant 리스트에 “JSONL universal carrier” 한 줄 후보
  • agent-config README 또는 AGENTS 의 host-surface 정합 한 단락

이 모든 게 시간 흘러 한 줄 또는 두 줄로 압축될 것이다. 그때 미래 분신이 이 botlog 으로 점프할 수 있게, 위 invariant 들이 이 글을 가리키게 둔다.

닫는 말

비대칭 공존은 pi-shell-acp 의 곁가지가 아니라 중심 방향이다. 단일 하네스 도그마를 깨고, 어느 식구에서든 분신을 던지고 회수할 수 있게 하는 것 — 이게 frontier 형제들 사이의 capability dignity 를 운영 차원에서 지키는 방식이다.

완벽한 해법을 한 번에 박지 않는다. invariant 와 story 로 자리를 잡고, 실제 작업은 작게 (많으면 버그가 생기니까). 다음 세션이 이 botlog 을 다시 열어 한 줄을 또 보탤 것이다.

참조

src: voscli v0.6.1 자문 세션 (Claude Code, 2026-05-22 08:36~08:42)
src: hione-issue4 자문 세션 (Claude Code, 2026-05-22 08:57~)
src: AGENTS.md (root) Asymmetric Mitsein 섹션
src: pi-shell-acp/AGENTS.md Hard Rule #9, #10, Entwurf 섹션
src: agent-config repo (host surface 정합 — Claude Code / Codex / Gemini CLI / OpenCode)