진행 중 · 2026년 5월 25일
Talkak
내 Claude Code / Codex를 감싸는 콕핏 — 위험한 에이전트 액션을 승인 게이트 뒤에 세우고, 'done' 주장 뒤의 명령을 다시 돌려 거짓을 잡아내며, 결정을 검색 가능한 프로젝트 메모리 그래프로 남기는 네이티브 AI 작업 운영체제. Tauri + Rust, macOS.
에이전트 액션 승인 게이트 · 'done' 주장 재실행 검증 · 결정 자동 캡처 그래프 · tmux-persistent panes · 토큰 마크업 0% · BYO Claude/Codex
- 역할
- Solo (Claude Code 페어 프로그래밍)
- 스택
- Tauri 2 · Rust · React 19 · TypeScript · xterm.js · portable-pty · tmux
내 claude / codex 바이너리를 운영 레이어로 감싸는 네이티브 macOS 앱. 워크스페이스마다 다중 터미널 페인을 띄우고 — 각 페인은 영구 tmux 세션이라 에이전트 작업이 앱 재시작 후에도 살아남음 — 거기에 raw 터미널에는 없는 세 가지를 더한다: 위험한 액션을 멈춰 세우는 승인 게이트, "done" 주장 뒤의 명령을 다시 돌려 거짓을 잡는 검증 패스, 작업을 검색 가능한 프로젝트 메모리로 만드는 append-only 이벤트/그래프 스토어. 내가 직접 쓰려고 만들었음 — 맥북 데스크톱 12개를 동시에 띄워놓고 각 에이전트가 실제로 뭘 했는지 놓치고 있었음.
무엇을 하는가
- 멀티-페인 에이전트 워크스페이스. react-mosaic + xterm.js + 페인별 PTY(
portable-pty); 각 페인은dalkkak-<id>키의 tmux 세션으로 앱보다 오래 삶. 멀티-스타트업 사이드바,⌘1..9단축키, 실행 시 자동 reattach. - 승인 게이트. 에이전트가 제안한 이메일 답장·캘린더 일정·문서 편집은 pending으로 쌓이고, 내가 승인을 눌러야만 실행된다 — "AI가 답장을 쓰고, 네가 승인을 누르거나, 아니면 안 나간다." 부수효과가 있는 동작은 무단으로 외부에 닿지 않음.
- 신뢰 대신 검증. 에이전트가 "테스트 통과 / done"이라 하면 Talkak이 그 명령을 다시 돌려 맞지 않으면 표시한다 — 자신감 있게 틀린 에이전트가 믿어지는 대신 잡힘.
- 결정은 스스로를 기억한다. 작업 항목·액션·결정·근거·승인·검증 영수증이 프로젝트별 이벤트/그래프에 append-only로 캡처돼 나중에 검색 가능 — 스크롤백 버퍼가 아니라 운영 메모리.
- 턴마다 리캡(
⌘I), Usage Pulse, 2-layer 관측: Claude Code hooks →logs/*.jsonl, Rusttracing→ daily-rolling runtime 로그.
왜
핵심 동작은 "사용자 본인의 로컬 claude 바이너리를 조작하고, 그게 뭘 했는지 검증 가능한 기록으로 남기는 것." 브라우저 탭은 프로세스 트리를 소유하거나 셸 명령을 다시 돌릴 수 없음 — web-only로는 승인+검증 레이어가 본질적으로 불가능. Tauri(Rust 백엔드 + 시스템 WebKit)로 ~10MB 번들에 파일 시스템 + 프로세스 트리 소유권 유지. Warp / iTerm가 "1 프로젝트 = 1 윈도우" 가정인 것과 달리 멀티-스타트업이 first-class라는 점이 차별화 지점.
상태
14일 로컬 앱 체험판 제공 중(macOS 13+, Apple Silicon). 토큰 마크업 0% — 본인의 Claude Code / Codex를 들고 오고, Talkak은 토큰을 되팔지 않음. 유료 결제는 준비 중: 구독 약관이 아직 출시 단계가 아님.
짚을 만한 엔지니어링 포인트
- Lifecycle decouple. 터미널 상태를 async Rust↔JS IPC로 React 생명주기에서 분리: xterm + PTY를 React 바깥 module-level registry에 두고, Mosaic split/stack remount가 실행 중인 프로세스를 건드리지 않음 — 프로세스 상태 손실 없음. VS Code Server의 터미널 호스팅 패턴. (로그)
- Subprocess env hygiene. Tauri GUI 앱은 최소 PATH + 거의 빈 환경변수를 상속. 명시적
TERM,LANG, PATH augmentation 없이는claude --resume이 15초 멈추고 tmux가 silent하게 실패함. (로그 1, 로그 2) - Bug-as-asset. 출시된 모든 버그에 6-섹션 post-mortem (symptom / root cause / fix / instruction-blame / avoidability / lessons),
CLAUDE.mdRULE #6로 강제.
프로젝트 로그
이 프로젝트를 만들면서 남긴 트러블슈팅 · 회고 · 업데이트의 시간순 기록.
2026년 7월 13일 주3 개 · 2 트러블슈팅 · 1 기술 회고
배포는 됐는데 브라우저는 백지 — curl 200이 '됨'이 아니었다
트러블슈팅2026년 7월 13일 · 4 분
진짜 Vite/React 앱을 딸깍 PaaS로 배포했다. curl로 HTML·JS 모두 200에 내용까지 정상 — '된다'고 선언. 그런데 실제 브라우저는 완전 백지였다. 원인은 자산 업로드 시 Content-Type 누락. 그리고 진짜 교훈은 내 검증이 가짜였다는 것.
인프라는 두 층이다 — Control Plane은 IaC, Data Plane은 API
기술 회고2026년 7월 13일 · 11 분
딸깍 PaaS를 '테라폼 같은 IaC로 정교하게' 만들 수 있냐는 질문에서 출발. 7개 PaaS(Vercel·Netlify·Railway·Render·Fly·Supabase·Cloudflare) 실제 방식과 1차 출처를 확인해보니 답은 '두 층으로 나눠라'였다. 우리 코드가 이미 가진 것과 빠진 것까지 정리한 학습노트.
시크릿 가드가 'work-desk'를 OpenAI 키로 오인한 날
트러블슈팅2026년 7월 13일 · 2 분
sk- 패턴에 좌측 경계가 없어 work-desk 문서 경로가 API 키로 오탐되어 커밋이 차단됐다. lookbehind 한 조각과 회귀 테스트로 수리 — 그리고 수리된 가드는 곧바로 포스트모템 속 인용 문자열을 다시 잡아냈다.
2026년 6월 15일 주2 개 · 2 기술 회고
닮은꼴 ≠ 모순: 기억 충돌 탐지를 코사인에서 LLM 심판까지 (하루치 상세 정리)
기술 회고2026년 6월 20일 · 18 분
AI 에이전트가 읽는 '운영 기억'이 서로 모순되는 걸 어떻게 막을까. 코사인 유사도로 시작해 그게 모순을 판정 못 한다는 걸 실데이터로 깨닫고, claude -p 'LLM 심판'으로 넘어간 하루. 4겹 방어, 각 층이 언제 작동하는지, 그리고 '모순을 확실히 0으로 만드는 건 불가능하다'는 정직한 결론까지.
에이전트를 운영기억(operating memory)에 연결하기 — MCP로 읽기·쓰기 루프 닫고, 왜곡을 막다
기술 회고2026년 6월 20일 · 19 분
딸깍의 기억 그래프는 이미 만들어져 있었지만, 작업 중인 에이전트(Claude·Codex)가 그걸 '읽지'를 못했다. MCP로 케이블을 잇고, 기억이 썩는 길(낡은 사실·프롬프트 인젝션)을 막은 과정을 — 아무것도 모르는 사람이 읽어도 이해되게 — 처음부터 끝까지 기록한다.