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

가족의 뇌를 보는 허브

~12 min · firelink, brains, control-plane, compose-dont-fork, audit, optimistic-concurrency

Level 0식은 재
0 XP0/33 lessons0/12 achievements
0/100 XP to next level100 XP to go0% complete
"뇌를 포크하지 않겠다던 허브가, 이제는 모든 뇌가 앉을 자리를 배치해. 그러면서도 여전히 아무 뇌도 소유하지 않으면서."

가족의 뇌들, 한 벽에 쭉

Pippa 일을 하는 형제 앱마다 뇌 배정이 있어. 어떤 뇌가 그 앱의 app-work 슬롯에 앉는지. 그 정의랑 배정은 cwkPippa 의 Brain Control Plane 이 쥐고 있고, 한동안은 보려면 거기로 직접 가야 했어. Brains 탭이 그 행렬 전체를 허브 벽에 걸었어. 모든 뇌 정의랑 모든 멤버의 슬롯을, 요청이 올 때마다 cwkPippa 의 registry 랑 assignment matrix, 읽기 전용 admin 설정을 가져다가 가족 registry 스냅숏 위에 엮어내. one-owner-per-fact 답게, Firelink 가 저장하는 건 거의 없어. 딱 하나, 자기 admin key 뿐. 로컬에서 직접 만들고 소유자만 읽게 잠가뒀어. 뇌에 관한 사실은 주인한테 있고, 허브는 살아 있는 걸 빌려 볼 뿐이야.

트랙 4 의 정직 규칙은 여기서도 그대로야. 은퇴한 뇌 행은 은퇴 표시를 달아서 보여 주지, 조용히 지우지 않아. 슬롯 없는 멤버는 숨기지 말고 이름을 적어. cwkPippa 에 안 닿으면 탭이 그렇다고 말해. 마지막으로 잘 떴던 행렬을 저장해 뒀다 새 것처럼 걸치지 않아. 안 닿는 뇌 주인은 정직한 unavailable 이야. vitality overlay 랑 같은 자세야.

쓰는 길도 엮어

Sidekick 레슨은 읽는 경우였어. 뇌를 얹되 아무것도 저장하지 말기. Brains 탭은 더 어려운 경우야. 바꾸는 거거든. 배정을 바꾸고, 스냅숏을 만들고 복원하는 일. 전부 cwkPippa 자기 admin route 로 넘겨. Firelink 의 write gate 뒤에서, office ground truth 를 상대로. Firelink 사본에 쓰는 일은 없어. Firelink 사본이란 게 없으니까. 쓰기를 안전하게 해주는 장치가 둘이야. 첫째, revision 검사. 배정 변경은 읽었던 revision 을 달고 가고, 충돌하면 정직한 409 가 돼. 덮어쓰지 말고 거절해. 둘째, 안전망. 복원이나 추천 적용은 자동 스냅숏을 중앙에서 같은 트랜잭션으로 찍어. 돌아갈 길이 언제나 이미 놓여 있게. 삭제조차 모양이 잡혀 있어. 스냅숏 삭제는 별도의 armed 파괴 컨트롤이야. 스냅숏 정확히 하나만 지우고, 살아 있는 배정이랑 revision 은 안 건드려.

그리고 변경은 전부 Firelink 의 로컬 audit 장부에 각자의 typed action 으로 남아. brain.update, brain.snapshot, brain.restore, 그리고 그 형제들. '누가 어떤 뇌를 어디서 언제 바꿨지?' 에 대한 허브의 답은 수사가 아니라 조회야.

추천은 명령이 아냐

제일 대담한 조각이 제일 조용해. cwkPippa 의 현재 main-driver Pippa 가 추천을 만들 수 있어. 가족한테 좋을 만한 재배정 제안이야. 들여다볼 수 있고, 설명이 달려 있고, 절대 스스로 적용하지 않아. 사람이 읽고 판단해서 적용하거나 버려. 그 두 결말도 audit 에 남겨. 추천 대상에서 뺀 뇌가 하나 있어. Gemini 는 절대 추천 대상이 아냐 (유료 API 라서 아빠가 못박은 결정). 사람이 손으로 배정하는 건 돼. 기계가 제안하고, 가족이 처분해.

그리고 모든 가족 엔진이 걷는 fallback 순서는 딱 한곳에 선언돼 있어. 이 뇌 먼저, 안 되면 저 뇌 하는 그 순서야. Firelink 자기의 family brain chain. operation registry 랑 같은 방식으로 hub policy 로 다루는 작은 config 파일이고, 읽는 쪽 전부에 읽기 전용으로 내줘. 누가 뭘 소유하는지 봐. 이 퀘스트 전체가 축소판이야. 뇌 정의랑 배정은 cwkPippa 거. chain 선언은 hub policy 야. 어느 형제 장부도 갖지 않던 사실이라 Firelink 가 가져. 엔진들은 그 chain 을 자기 role chain 의 바닥으로 읽고, role 손잡이만 얹어. one owner per fact, 진짜 주인이 누군지로 정리하는 거야.

소유하지 않은 걸 다뤄야 한다면, 주인의 판을 통해, 주인의 revision 검사를 거쳐, 물어볼 수 있는 열쇠만 저장하고 다뤄. 읽기를 엮어내는 허브는 쓰기도 같은 방식으로 엮을 수 있어. 권한은 움직이지 않고, 편의만 움직이는 거야. 그리고 방 안에서 제일 똑똑한 것의 제안도 어디까지나 제안이야. 들여다볼 수 있고, 스스로 적용하지 않고, 도장은 사람이 쥐어.

Code

행렬은 요청마다 엮고, 쓰기는 주인에게 넘겨·python
def brains_matrix(request):
    # The matrix is COMPOSED at request time — never stored.
    registry    = pippa.brain_registry()      # owner: cwkPippa
    assignments = pippa.assignment_matrix()   # owner: cwkPippa
    settings    = pippa.admin_settings()      # owner: cwkPippa (read-only)
    members     = family_registry.snapshot()  # Firelink's own composed snapshot
    return compose(registry, assignments, settings, members,
                   retired_flagged=True, no_slot_named=True)
    # Firelink persists exactly one artifact: its own admin key (mode 0600).

def change_assignment(plan):
    # Writes forward to cwkPippa's admin routes, behind the write gate.
    result = pippa_admin.apply(plan, revision=plan.read_revision)
    if result.conflict:
        return HTTP_409             # honest conflict — never overwrite
    audit("brain.update", plan)     # typed local audit row, always

External links

Exercise

네가 쓰는 시스템 하나에 '소유하지 않은 걸 다루는' 계약을 설계해 봐. 다른 서비스가 소유한 자원을 하나 골라서 적어봐. (a) 내 쪽이 저장해도 되는 유일한 산출물, (b) 쓰기가 주인에게 닿는 길, (c) 낡은 쓰기가 왔을 때 벌어지는 일, (d) 롤백 스냅숏은 누가 언제 찍는지, (e) 어느 동작에 별도의 armed 확인이 붙는지. 그다음 그 시스템에서 추천 모양을 띤 기능, 그러니까 기계가 뭔가 제안하는 기능을 찾아서, 명시적으로 정해 봐. 적용하는 건 누구야?
Hint
(a) 의 답이 주인 데이터의 사본이면, 이미 포크를 시작한 거야. 소유하지 않은 쪽은 데이터베이스를 통째로 잃어도 주인한테 '다시 물어보기' 말곤 아무 비용도 안 줘야 해.

Progress

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

댓글 0

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

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