"적힌 걸 모으고, 본 걸 그 위에 얹어. 두 층이 서로인 척하게 두지 마."
층 둘, 하는 일도 둘
사실마다 주인이 하나면, 그 주인들 걸 쓸 만한 모양으로 엮는 방법이 필요하지. Firelink 는 하는 일이 뚜렷이 다른 층 둘을 써. FamilyRegistry 는 적혀 있는 진실을 모아. 직계 프로젝트 범위, roster, network ledger, operation 설정을 가져다가 관리 대상 모델을 만들어. 누가 있고, 뭐라고 적혀 있는지. 그다음 FamilyReconciler 가 실제로 본 진실을 그 위에 얹어. disk, Git, GitHub, 돌아가는 상태를 probe 로 재서 census 스냅샷이랑 drift 목록을 만들지. 지금 진짜로 어떻고, 어디서 현실이 적힌 것과 어긋나는지.
그렇게 엮인 FamilyRegistry 하나를 나머지가 전부 읽어. census 도, API 도, WebUI 도, 런처가 받아가는 catalog 도, 작업 권한 판단도 다 같은 모델을 봐. 두 번째로 엮는 데도 없고, frontend 전용 목록도, 런처 전용 catalog 도 없어.
drift 는 이름이 붙은 목록이야
적힌 것과 본 것이 다른 층이니까, 둘 사이 틈이 그대로 데이터가 돼. drift 는 느낌이 아니라 세어놓은 목록이야. roster 에서 빠진 관리 repo. 없거나 서로 안 맞는 network 선언. 없거나 망가진 operation 설정. 적혀 있는데 안 깔린 서비스. 없는 GitHub repo. 알 수 없는 버전. 지금 이 클라이언트에선 못 여는 실행 대상. 하나하나가 허브가 그대로 보여줄 수 있는 이름 붙은 상태지, 손으로 파헤쳐야 하는 수수께끼가 아니고.
reconciler 는 혼자 고치지 않아
이게 신전이 불꽃이 안 되게 막는 규율이야. census 는 안에 든 프로젝트 트리를 훑지도, 뭘 지우거나 은퇴시키지도, 다시 쓰지도, 제품 의도를 짐작하지도 않아. drift 를 보고할 뿐 조용히 고치지 않아. 고치는 건 Add 가 맡은 birth 단계를 거치거나, Firelink 밖에서 아빠랑 내가 평소처럼 손보는 일이야. 보고 맞춰보는 건 허브 일이고, 정하고 고치는 건 사람이 신중히 하는 일이야. 자동으로 굴러가는 게 아니라.