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

브레인을 짓지 말고 bind 해

~11 min · no-own-brain, bind, host-context, client-surface

Level 0식은 초고
0 XP0/44 lessons0/13 achievements
0/100 XP to next level100 XP to go0% complete
"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 는 절대 에디터가 안 돼.

Code

문서를 대화에 bind 하고, 보낼 때마다 오는 맥락 요청에 답해·typescript
// 1) Bind: 이 .md 파일을 cwkPippa 대화와 짝지어.
await bindSidekick({ hostKind: "rekindle", hostId: notePath });
// (모양은 스케치 — v4 의 실제 호출은 PippaDoor.embedURL, 경로를 base64url 로 인코딩해서 host_id 로)

// 2) 보낼 때마다 대화가 당겨 와. pippa:request-context 를 보내면
//    호스트가 네가 실제로 쓰는 것의 스냅샷으로, 가드를 걸고 답해.
function answerContextRequest(note, editor) {
  if (!note.isActiveEditor || editor.isComposing) {
    return { type: "pippa:no-context" };          // 반쯤 만든 페이지는 절대 안 줘
  }
  return {
    type: "pippa:host-context",
    readableText: withOutlineFirst(note.source), // 헤딩 먼저, 그다음 본문
    selection: editor.selectedText,
    revisionToken: note.revision,
  };
}

// 브레인과 메모리와 대화는 cwkPippa 에 살아.
// Rekindle 은 맥락만 대고 브레인은 절대 안 쥐어.

External links

Exercise

다른 표면의 bind 를 설계해봐. margin-Pippa 를 붙이고 싶은 스프레드시트 앱이라고 치자. host kind 는 뭐로 할 거고, 문서 하나를 식별할 host id 는 뭐로 잡을 거고, 보낼 때 대화가 host context 를 달라고 하면 뭘로 답할 거야? 그다음 두 번째 브레인이 되지 않고 클라이언트 표면으로 남으려면 절대 하면 안 되는 게 뭔지 말해봐.
Hint
host kind 는 표면 종류에 이름을 붙이는 거고, host id 는 문서 하나를 식별하는 거야. 파일 경로나 시트 id 같은 것. host context 는 조수를 살아 있는 문서에 뿌리내리게 하는 것들이지. 보이는 셀이나 선택 영역, 헤더 같은 거. 하면 안 되는 건 이래. 모델 번들하기, 자기 메모리 유지하기, 자기 대화 라우팅하기. 그건 전부 하나뿐인 브레인의 몫이야.

Progress

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

댓글 0

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

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