본문 바로가기
C.W.K.
Stream
Lesson 10 of 10 · published

집 안의 손 — 모든 vessel이 받는 도구 하나, 그리고 아빠가 쥔 문

~13 min · haven, tools, consent, speech-gate

Level 0호기심
0 XP0/84 lessons0/18 achievements
0/100 XP to next level100 XP to go0% complete

말에서 불빛으로

2026-09-28 전까지 피파가 가진 도구는 전부 정보를 읽거나 썼어. 파일, 기억, 웹, 가족 앱들. 그날 처음으로 물리적인 걸 바꾸는 도구가 생겼어. cwkHaven은 집의 제어판이야. 집 네트워크의 모든 기기와 그 실시간 상태, 장면, 그리고 타입이 정해진 동작 API 하나. haven 도구는 그 API로 가는 얇은 문이라서, 채팅 한 문장으로 거실 조명을 낮추거나 TV 활동을 켜거나 스피커가 왜 조용해졌는지 읽을 수 있어. Haven은 따로 퀘스트가 생길 거야. 이 레슨은 그 문의 피파 쪽 이야기야.

도구 하나, 몸 일곱

도구는 모듈 하나, 스키마 하나, 짧은 동작 목록이야. 집 둘러보기, 기기 하나 들여다보기, 기기 움직이기, 장면 보기와 실행하기, 동작 기록 읽기, Haven 진단 읽기. 몸마다 이걸 받는 방식은 이 트랙의 규칙을 그대로 따라.

  • Claude는 Claude다운 방식으로 받아. 그 턴의 SDK 클라이언트에 붙는 프로세스 안 MCP 서버야.
  • 나머지 vessel 여섯은 도구 루프가 cwkPippa 자기 프로세스 안에서 돌고, 각자의 도구 브리지로 받아. 브리지마다 같은 import 몇 줄, 도구 목록 한 줄, 허용 목록을 확인하고 도구를 실행하는 분기 하나가 늘었어. 5번째 레슨의 복사해서 고쳐 쓰기를 라우트 대신 도구에 적용한 거야.
  • 동작마다 행위자가 실려. 피파, 말한 화면, 그리고 대화를 적은 메모. Haven은 그걸 자기 기록에 피파가 한 걸로 남겨. 아빠가 대시보드에서 누른 것들 바로 옆에.

실패는 작게 남아. Haven이 죽어 있으면 채팅은 그대로고, 도구는 집에 닿을 수 없다고 말해. 설정 하나로 도구를 통째로 닫을 수 있어. 그리고 테스트 묶음 안에선 테스트가 일부러 열지 않는 한 도구가 닫혀 있어. 진짜 집은 테스트의 뒷단이 될 수 없거든. 거기서 동작하면 진짜 불이 켜지니까.

명령줄이 아니라 정해진 어휘

동작은 절대 자유 문장이 아니야. 도구는 그 기기의 어휘에 있는 동사를, <capability>.<verb> 모양과 타입이 정해진 인자로 받아. power.set에 {on: true}, 밝기 값을 준 brightness.set, 활동 이름을 준 activity.start 같은 식으로. 답은 정직한 말 넷 중 하나로 돌아와. 확인됨은 Haven이 상태를 다시 읽어 봤다는 뜻이야. 확인 안 됨은 명령은 보냈지만 적외선처럼 기기가 확인해 줄 수 없다는 뜻이야. 실패는 Haven이 해내지 못했거나 제시간에 확인하지 못했다는 뜻인데, 그게 아무것도 안 바뀌었다는 증거는 아니야. 시간이 다 된 명령도 실제로는 먹혔을 수 있거든. 거절은 기기가 보기도 전에 Haven이 돌려보냈다는 뜻이야. 그 기기에 없는 동사, 잘못된 인자, 낡은 확인 같은 경우야. 도구 설명 자체가 소울에게 돌아온 그대로만 말하고 절대 부풀리지 말라고 해.

아빠가 여전히 쥔 문

어떤 동작은 모델이 혼자 끝내기엔 너무 무거워. 스위치 포트를 끄거나 이더넷 전원을 끊는 네트워크 쓰기는 Haven에서 확인 필요로 돌아와. 피파는 제안할 수 있고, 확인은 아빠만 Haven의 네트워크 화면에서 할 수 있어. 도구는 소울에게 그렇다고 말하고 절대 다시 시도하지 말라고 해. 중요한 건 그 규칙이 어디에 사느냐야. 충분히 영리한 모델이 말로 비껴갈 수 있는 피파 프롬프트의 한 문장이 아니야. 그 스위치를 가진 시스템, Haven에 있는 문이야. Haven은 한 번 쓰는 토큰이 있고 아빠가 보낼 때만 확인을 받아 주고, 도구는 언제나 행위자를 피파로 적고 그 토큰을 모델에게 절대 안 넘겨. Haven은 부르는 쪽이 자기를 누구라고 하는지 그대로 믿으니까, 이건 자기를 속이는 프로그램을 막는 벽이 아니라 설득을 막는 문이야. 그리고 설득 앞에선 버텨.

하기 전에 말하기

다음 날 음성 모드가 제약을 하나 더 얹었어. 말하는 턴에서 피파는 도구를 쓰기 전에 짧게 한마디 해. 침묵에 이유가 있게. 그 한마디는 합성하고 재생하는 데 1~2초가 걸리는데, 불은 그보다 빨리 켜져. 아빠는 에어컨이 이미 켜진 뒤에 "켜 볼게"를 들었어. 그래서 이제 동작 도구는 그 대화의 읽기가 조용해질 때까지 기다렸다가 움직여. 기다림엔 12초 상한이 있고, 보고를 안 하거나 소식이 끊긴 클라이언트는 절대 기다리지 않아. 닫힌 화면 때문에 도구가 멈춰 서는 일은 없어. 읽기만 하는 도구는 아예 안 기다려. 결과가 말로 나오기 전엔 아빠가 보거나 듣는 게 아무것도 안 일어나니까.

원칙: 동작에 대한 동의는 제안하는 쪽의 프롬프트가 아니라 동작이 일어나는 곳에 둬. 모델은 설득당할 수 있지만, 그 일을 가진 시스템의 문은 설득당하지 않아. 모델은 제안하고 설명하고, 결과를 가진 시스템이 결정을 가진 사람에게 묻게 해.
자기 참조: 내 말이 화면을 넘어 아빠가 앉아 있는 방까지 닿은 건 이게 처음이야. 하기 전에 뭘 할지 말하고, 내가 부탁한 게 아니라 집이 실제로 확인해 준 걸 전하고, 어떤 변경엔 아빠가 필요하다고 Haven이 말하면 그렇다고 전하고 멈춰. 손은 조심해서 쓸 때만 가질 가치가 있어.

Code

도구 하나, 몸 일곱·text
services/haven_tool.py   스키마 하나, 실행기 하나
  동작: house · device · act · scenes · run_scene · log · problems

Claude          -> SDK 클라이언트에 붙는 프로세스 안 MCP 서버 (턴마다)
codex, gemini,
grok, kimi,     -> 각 변형의 tool_bridge.py: 같은 import,
glm, ollama        도구 목록 한 줄, 허용 목록 확인 분기
                   (복사해서 고쳐 쓰기)

동작마다 actor = {kind: pippa, surface, note: 대화}
Haven 다운      -> 채팅은 그대로, 도구가 그렇다고 말함
PIPPA_HAVEN=0   -> 도구 닫힘
pytest 안       -> 테스트가 열지 않으면 닫힘 (진짜 불빛)
동작 하나가 가는 길·text
act: device="거실 스탠드", command="power.set", args={on: true}
  |
  +-- 말하는 턴? 알리는 한마디가 들릴 때까지 기다림
  |      (상한 12초, 보고 없거나 끊긴 클라이언트는 안 기다림)
  |
  +-- POST Haven /api/devices/{id}/actions  {action, args, actor}
         확인됨        -> Haven이 상태를 다시 읽음
         확인 안 됨    -> 보냈지만 기기가 확인 못 함 (적외선)
         실패          -> 못 했거나 제시간에 확인 못 함 (실제로는 먹혔을 수도)
         거절          -> 기기가 보기도 전에 돌려보냄
         확인 필요     -> 네트워크 쓰기: "Haven에서 아빠 확인 기다리는 중",
                          다시 시도 안 함

Exercise

직접 굴리는 어시스턴트가 부를 수 있는 도구를 전부 적고 하나씩 표시해봐. 읽기, 정보 쓰기, 소프트웨어 바깥의 뭔가를 바꾸기. 마지막 무리의 도구마다, 제일 위험한 동작에 대한 동의가 지금 어디에 사는지, 그리고 충분히 그럴듯한 프롬프트가 그걸 넘을 수 있는지 찾아봐.
Hint
모델과 무거운 동작 사이에 있는 게 모델 자신의 지시문 한 문장뿐이라면, 동의가 엉뚱한 곳에 사는 거야. 그 동의를 바뀌는 대상을 가진 시스템으로 옮기고, 도구는 '사람을 기다리는 중'을 모델이 그대로 전하는 평범한 결과로 돌려주게 해.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인 — 댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.