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

순간을 참조해, 실어 보내지 마

~12 min · sidekick, reference, handoff, recall

Level 0릴 입문자
0 XP0/39 lessons0/12 achievements
0/100 XP to next level100 XP to go0% complete
"Ask Pippa About This Moment 은 현재 릴리스를 해석하고, 순간 참조 줄을 복사하고, Recall 의 pippa-handoff 를 부르고, 돌려받은 canonical 대화 URL 을 열어. 대화 상태는 이 앱에 안 살아."

같은 규율, 한 층 위에서

Track 3 은 플레이어로 '들어오는' handoff 를 가르쳤어. URL 이 영상을 경로가 아니라 신원으로 부른다는 거. Pippa 레인은 그 거울상이야. 대화로 '나가는' handoff 고, 규율은 정확히 똑같아. "Ask Pippa About This Moment" 를 누르면, Ashen Reel 은 자막 사본도, 영상 조각도, 상태 번들도 실어 보내지 않아. 대신 아주 작은 순간 참조 하나를 보내. 어느 영상, 어느 릴리스, 몇 밀리초. payload 가 아니라 pointer 지.

참조는 되도록 durable 한 걸 골라. 미디어가 Recall 에서 온 거면 앵커는 그 릴리스 신원에 타임스탬프를 붙인 거라, 교정이 들어와도 견디고 깔끔하게 다시 해석돼. Recall 이 출처가 아닐 때만 경로로 폴백하고. 어느 쪽이든 여행하는 건 작고 해석 가능한 핸들 하나야. 수신자가 진짜를 찾아가는 거지. Track 3 의 엄격한 파서가 반대 방향으로 했던 일이랑 똑같아.

그것 자체의 사본 말고, 수신자가 해석할 수 있는 참조를 보내. 참조는 작게 남고, 늘 최신이고(수신자가 현재 진실을 해석하니까), 소유권을 원래 자리에 둬. payload 를 복사하면 데이터가 중복되고, 즉시 늙고, 두 번째 소유자가 태어나. 가리켜. 복사하지 말고.

전체 흐름은 로컬 상태가 하나도 없는 orchestration 이야. 해석하고, 사람이 읽을 수 있는 pointer 를 복사하고, handoff 하고, 열고.

자막 레일은 같은 아이디어의 읽기 쪽이야. 영상 옆에서 레일은 현재 릴리스의 세그먼트를 세션 메모리로 투영하고, 재생 위치에 해당하는 줄을 강조하고, 클릭하면 딱 거기로 seek 해. 포인터를 올리면 auto-follow 가 멈춰서 앞부분을 미리 읽을 수도 있고. 읽기 전용이고, 세션 스코프고, 아무것도 소유 안 해. 표시는 투영이고 handoff 는 참조야. 둘 다 Recall 진실을 복사하지 않아.

왜 'payload 말고 pointer' 가 널 정직하게 지키나

클라이언트가 소유자로 미끄러지는 신호는 늘 똑같아. '안전하게 하려고' 나 '빠르게 하려고' payload 를 복사하기 시작하는 거. Ashen Reel 이 자막을 handoff 에 복사했거나 대화를 로컬에 쟁여뒀으면, 조용히 Recall 이랑 cwkPippa 진실의 두 번째 소유자가 됐을 거야. 아키텍처 전체가 막으려고 지어진 바로 그 드리프트지. handoff 를 참조로, 레일을 투영으로 지키는 덕분에, 비디오 플레이어가 쥐면 안 되는 바이트를 하나도 안 쥐고도 풍부한 Pippa 순간을 호스팅해. 절제가 기능인 거야.

Code

'Ask Pippa About This Moment' 은 참조만 보내고 대화 상태는 안 쥐어·swift
/// Ask about the current moment. Ships a REFERENCE, not a payload; the app
/// keeps no conversation state -- it orchestrates and opens.
func askAboutThisMoment() async throws {
    let ref = MomentReference(
        // Recall-sourced -> durable identity. Otherwise -> path fallback.
        anchor: current.isRecallSourced
            ? .release(current.releaseID, atMs: engine.observedTimeMs)
            : .file(current.path, atMs: engine.observedTimeMs)
    )

    clipboard.copy(ref.humanLine)                  // a durable, readable pointer
    let convo = try await recall.pippaHandoff(ref) // Recall returns the canonical convo
    open(convo.url)                                // the WebUI/conversation, not us

    // Nowhere did we copy the transcript, store the conversation, or persist
    // a marker. We pointed; the owners resolved. No second owner was born.
}

External links

Exercise

네 시스템에서 payload 를 통째로 메시지에 복사해서 다른 컴포넌트나 서비스한테 데이터를 넘기는 데를 찾아. 그리고 물어봐. 대신 수신자가 해석할 참조를 보낼 수 있어? id 든 URI 든 버전 붙은 핸들이든. 그중 한 경우를 골라서, 사본이 아니라 durable 한 참조를 싣도록 메시지를 다시 설계해. 뭐가 덜 낡게 되고, 복사를 그만두면 어떤 '두 번째 소유자' 가 사라져?
Hint
뒤집어야 할 패턴은 '데이터를 통째로 메시지에 넣기' 야. 대가는 두 가지고. 사본이 늙는다는 것, 그리고 누군가 두 번째 버전을 쥔 새 소유자가 된다는 것. 수신자가 해석하는 참조는 작고 늘 최신이고 소유권을 건드리지 않아. 통째로 넣는 건, 수신자가 참조를 스스로 해석할 방법이 진짜로 없을 때를 위해 아껴둬.

Progress

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

댓글 0

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

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