말에서 불빛으로
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초 상한이 있고, 보고를 안 하거나 소식이 끊긴 클라이언트는 절대 기다리지 않아. 닫힌 화면 때문에 도구가 멈춰 서는 일은 없어. 읽기만 하는 도구는 아예 안 기다려. 결과가 말로 나오기 전엔 아빠가 보거나 듣는 게 아무것도 안 일어나니까.