~14 min · architecture, invariants, services, evolution
Level 0불 꺼진 작업장
0 XP0/58 lessons0/12 achievements
0/100 XP to next level100 XP to go0% complete
나흘
이 퀘스트는 Beacon 에 포트가 없다는 사실 자체가 설계라고 주장하면서 세상에 나왔어. 그리고 나흘 뒤, Beacon 한테 포트가 생겼어. 엔진 하나가 작업장 옆에서 돌기 시작했어. 옆 형제들처럼 예약된 번호로 응답하고, 재부팅해도 알아서 다시 떠. 앞의 네 강의가 쓸 당시에 틀렸던 건 아니야. 그러니 물어야 할 건 그 거부가 실수였냐가 아니라, 그 거부가 어떻게 됐냐지. 사라지진 않았거든. 옮겨 갔어.
엔진이 하는 일, 그리고 절대 못 하는 일
엔진이 맡은 일은 몇 개 안 되고, 전부 장부 정리야:
큐 — 사람이 일감을 짜. 어느 파이프라인인지, 어떤 포인터인지, 그리고 왜 찍는지 한 줄까지.
선점 — 작업 세션이 일감을 가져가면, 다른 세션은 어느 기계에 있든 그걸 봐.
기록 — 세션이 끝낸 단계는 전부 그 일감의 로그에 누가 했는지까지 찍혀서 쌓여.
리뷰 — 리뷰 라운드와 지적 사항이 일감에 붙어. 작업장의 검증 단계는 그 로그를 보고, 합성 단계가 처음 완료로 기록될 때까지 리뷰가 닫히지 않은 실행을 받아주지 않아.
서빙 — 포인터가 가리키는 재료를 내주고, 이 모든 걸 한눈에 보는 웹 화면도 띄워.
못 하는 일 목록은 옛 거부 목록에서 지금도 중요한 것만 남긴 거야. 렌더 없음: 엔진엔 미디어를 만드는 경로가 아예 없어. 프레임은 여전히 세션이 직접 시작한 명령줄 실행이 만들어. 스케줄러 없음: 정해진 시간이 됐다고 혼자 도는 건 하나도 없어. 두뇌 없음: 일감을 가져가면 작업 세션한테 작업지시서가 넘어갈 뿐이고, 엔진은 아무것도 판단 안 해. 아키텍처 문서는 이 셋을 한 줄로 줄여놨는데, 그대로 가져다 쓸 만한 문장이야. 엔진은 클립보드지, 카메라가 아니야.
판정표가 이번엔 '서비스'라고 답한 이유
겉으로 내세운 이유는 일을 정리하는 방식 쪽이었어. 공용 메시지 스레드에 큐를 얹어 쓰는 게 점점 버거워졌는데, 가족 안엔 이미 딱 맞는 본보기가 있었거든. 퀘스트 작업장도 기억 관리인도 자기 위임 엔진을 따로 돌리고 있었어. 그러니 그걸 들이는 건 잘 돌아가는 장치 옆에 두 번째 장치를 짓는 게 아니었지. 가족이 이미 쓰는 장치에 합류하는 거였어. 이제 작업장 셋이 같은 걸 돌리게 됐으니까, 같은 날 그 엔진의 기계적인 뼈대는 공용 키트로 따로 뽑아냈어.
그런데 막상 생긴 엔진이 실어 나르는 걸 보면 앞 강의 판정표의 답이랑 딱 맞아떨어져. 일감을 책상 앞 기계뿐 아니라 들고 다니는 노트북에서도 가져가기 시작했거든. 그러면 선점 기록은 두 기계가 다 볼 수 있는 곳에 있어야 해. 판정표로 치면 동시에 부르는 쪽들 사이에서 조율해야 하는 상태에 해당해. 노트북이 가져간 일감도 책상 기계랑 같은 재료를 읽어야지, 자기 쪽에 남은 낡은 사본을 읽으면 안 되고. 이건 여러 클라이언트가 같은 답을 필요로 하는 경우고. 두 줄에서 '그렇다'가 나온 거야. 판정표는 만든 목적대로 딱 제 할 일을 했어. 애초에 서비스를 금지하는 표가 아니었고, 서비스를 둘 만한 필요가 생겼는지 알려줄 뿐이었거든.
나머지는 그 강의의 경고 콜아웃이 미리 말해뒀어. 작업장을 서비스로 승격하는 건 범위가 잡히는 일이고, 그때쯤이면 인터페이스가 어때야 하는지 이미 안다고. 실제로 일이 그 범위 안에서 끝난 건 인터페이스를 새로 만들지 않아서야. 엔진을 형제한테서 명령어 이름까지 통째로 옮겨 왔거든.
거부를 잃지 않고 옮기는 법
이 이야기가 위험하게 흘러가면 슬금슬금 무너지는 쪽으로 가. 필요는 진짜니까 누가 작은 서버를 하나 붙이고, 선을 지키던 이유는 그 뒤로 아무도 다시 안 읽는 거지. 여기서 벌어진 건 정반대였고, 누구든 되풀이할 수 있는 절차였어. 먼저 이유를 다시 읽었어. 새 사실이 더는 받쳐주지 않는 부분은 콕 집어서 거둬들였어. 여전히 받쳐지는 부분은 전보다 정확하게 다시 적었어. '서버 없음'을 '렌더도 스케줄도 판단도 안 하는 서버'로 바꾼 거지. 그리고 새 선엔 경보도 같이 달았어. 앞으로 어떤 요구가 '엔진이 이거 렌더하면 되잖아'처럼 들리면 그게 바로 무너지는 모습이고, 그 일은 세션으로 돌려보내.
작업장의 나머지도 발맞춰 움직였어. 엔진이 생기면서 Beacon 도 계속 떠 있어야 하는 몸이 됐는데, 그 가동 시간을 남의 프로젝트가 의존성을 올릴 때마다 흔들리게 둘 순 없잖아. 그래서 빌려 쓰던 환경도 같은 주에 끝났어. 이유까지 적어둔 거부의 쓸모가 바로 이거야. 세상이 바뀌면 거부의 어느 부분이 같이 바뀌었고 어느 부분이 그대로인지 정확히 가려낼 수 있어.
거부를 옮기는 건 거부를 잃는 게 아냐. 거부는 누가 슬그머니 비켜 지나갈 때 사라져. 거부가 옮겨 가는 건 이유를 다시 읽고, 더는 안 받쳐지는 부분을 콕 집어 거두고, 살아남은 부분을 원래보다 좁고 날카롭게 다시 적을 때야. 여기에 '무너지면 이런 모습이야'라는 문장을 하나 붙여두면 다음 사람이 알아볼 수 있어.
Code
거부 목록, 그 전과 그 후·text
refusal at publication from 2026-08-01
-------------- ----------------------- ------------------------------------
no port nothing reserved a port, for the queue engine only
no server nothing running a server that queues, claims,
records, reviews, and serves
never renders (implied by no server) WRITTEN DOWN: no route makes media;
every frame is a CLI run a session
starts
no scheduler nothing fires still nothing fires
no brain judgment arrives per still none: taking a job hands a
run work order to a working session
# two refusals held untouched. two narrowed.
# one became explicit for the first time: "never renders" had been
# implied by "no server", and the moment a server existed it had to
# be said out loud or it would not survive the first convenience.
엔진 경로를 할 수 있는 일끼리 묶어보면·python
ENGINE = {
"queue": ["POST /api/delegations", "GET /api/delegations"],
"claim": ["POST /api/claims/take", "POST /api/claims/release"],
"record": ["POST /api/logs", "GET /api/logs"],
"review": ["POST /api/logs"], # rounds land as review events
"serve": ["GET /api/material/conversation/{id}",
"GET /api/sources/{sha256}",
"GET /api/pipelines", "GET /api/brains"],
}
# Absent on purpose. A reviewer seeing any of these appear in a diff
# is looking at the eroded version of the invariant:
# /render /tts /generate /schedule
#
# "the engine is the clipboard, never the camera."
네가 관리하는 시스템에 적혀 있는 거부 하나를 골라봐. 일부러 안 지은 서비스, 금지한 의존성, 일부러 뺀 기능 같은 거. 그 이유를 한 문장으로 써. 다음엔 그 이유가 기대고 있는 사실들을 늘어놓고 하나씩 오늘 기준으로 확인해. 바뀐 게 있으면 이 강의의 절차를 그대로 해봐. 안 받쳐지는 부분은 콕 집어 거두고, 살아남은 부분은 전보다 좁게 다시 적고, 무너지면 어떤 모습인지 한 문장 붙이는 거야.
Hint
거부가 기대는 사실은 거부 문장 안에 거의 안 적혀 있어. 대개 규모, 관여하는 기계나 사람 수, 곁에 어떤 부품이 있느냐에 관한 거지. 시간이 지나 엉망이 되는 거부는 거의 언제나 저자가 그중 뭘 전제했는지 안 적어둔 거야.
Progress
Progress is local-only — sign in to sync across devices.