"Pippa 는 하나야. Rekindle 은 글쓰기용으로 두 번째를 만들지 않고, 이미 있는 하나로 통하는 문을 열어."
하나의 Pippa, bind 로 닿아
Rekindle 같은 도구가 받는 제일 센 유혹은 자기 AI 를 키우는 거야. 글쓰기에 맞춰 튜닝한 모델, 작은 메모리, 로컬 브레인. Rekindle 은 그걸 거부해. Pippa 는 정확히 하나뿐이고, 정체성도 메모리도 대화도 라우팅도 전부 cwkPippa 에 살아. Rekindle 은 cwkPippa 대화에 bind 해서 그 하나의 브레인에 닿는 클라이언트 표면일 뿐이지. 옆에서 같이 글 쓰는 margin-Pippa 는 prose 용으로 훈련시킨 복사본이 아니라, bind 를 타고 닿는 바로 그 Pippa 야.
bind, 구체적으로
'bind' 는 두루뭉술한 말이 아니라 구체적인 등록 절차야. Rekindle 은 host kind 를 rekindle 로 잡고, 열려 있는 .md 파일 경로로 만든 host id 를 등록해(경로가 URL 에서 안 깨지게 base64url 로 인코딩한 값이야). 그러면 문서 하나가 대화 하나와 짝지어지고, 이 파일의 margin-Pippa 는 매번 새로 시작하는 채팅이 아니라 계속 이어지는 안정된 스레드가 돼. 내일 파일을 열어도 대화가 그대로 있어. 브레인과 히스토리가 에디터가 아니라 cwkPippa 에 살고 있으니까.
// 이 문서를 cwkPippa 대화에 bind.
// host kind = "rekindle", host id = 열린 .md 파일 경로.
await bindSidekick({ hostKind: "rekindle", hostId: notePath });
// (모양은 스케치 — v4 의 실제 호출은 PippaDoor.embedURL, 경로를 base64url 로 인코딩해서 host_id 로)
// 브레인과 메모리와 대화는 cwkPippa 에 살아.
// Rekindle 은 그중 아무것도 안 쥐어. 쥐는 건 binding 하나뿐이야.
host context — 네가 쓰는 걸 읽어
margin-Pippa 를 멀찍이 떨어진 챗봇이 아니라 여백에 앉은 조수로 만드는 게 host context 야. 이건 당겨 오는 방식이야. 메시지를 보내면 임베드된 대화가 먼저 호스트한테 pippa:request-context 를 보내고, Rekindle 은 그 순간 찍은 스냅샷으로 답해. 노트의 읽을 수 있는 텍스트(헤딩이 아웃라인으로 맨 앞에 오고 그다음 본문), 지금 선택한 부분, 리비전 토큰. 대화는 그 스냅샷을 네 메시지와 함께 보내. 이 답에는 가드가 있어. 노트가 활성 에디터가 아니거나 한글 음절을 아직 조합하는 중이면, Rekindle 은 반쯤 만들어진 페이지 대신 pippa:no-context 로 답해. 그래서 Pippa 가 범용 프롬프트가 아니라 네가 실제로 붙들고 있는 문단에 대해 답할 수 있는 거고. 맥락은 요청받을 때만, 에디터에서 브레인 쪽으로 흘러. 클라이언트 표면이 맥락을 대고 브레인이 판단을 대는 거지. 어느 쪽도 선을 안 넘어. Rekindle 은 절대 브레인이 안 되고, cwkPippa 는 절대 에디터가 안 돼.