"프로세스 하나가 앱을 서빙하고, 스케줄을 돌리고, 쓰기를 소유하고, 백업을 rotate 해. 소유자가 하나면, 누가 뭘 했는지 물을 일이 없어."
한 지붕 아래 전부
Keep 은 단일 launchd agent 로 돌아. 그 프로세스 하나가 전부 해: API 서빙, 빌드된 PWA 서빙(같은 프로세스가 웹 앱을 나눠주고 그 호출에 답해), 06:31 일일 loop 돌리기, SQLite writer 소유, 백업 rotate. 별개 웹 서버도, 별개 스케줄러도, 별개 백업 daemon 도 없어. 프로세스 하나, 모든 움직이는 부품의 소유자 하나. 가족 하나 local-first 앱엔 이게 제한이 아냐 — 시스템 전체를 추론 가능하게 만드는 의도적 단순함이야.
왜 프로세스 하나가 딱 맞는 양인가
클라우드 아키텍처가 훈련시킨 본능은 쪼개기야: 웹 tier, worker tier, cron 서비스, 백업 job, 각자 독립 스케일. 규모에선 맞고 Mac 하나의 가족 하나엔 엄청난 over-build 야. 더하는 모든 split 이 새 조율 문제야: 스케줄러와 웹 서버가 상태를 어떻게 합의해, DB 를 하나만 쓰게 어떻게 확보해, 백업 daemon 과 일일 loop 가 동시에 돌면 뭐가 돼. Keep 은 그 질문을 애초에 안 만들어 전부 녹여. 프로세스 하나는 writer 를 누가 소유하는지 자기랑 의견 갈릴 수 없어, 그게 바로 writer 니까.
프로세스 하나가 실체화하는 single writer
snapshot 트랙의 single-writer DB 보장 기억나? 여기가 그게 물리적으로 참이 되는 곳이야. SQLite writer 가 정확히 하나인 이유는 프로세스가 정확히 하나고, 그 프로세스가 writer 니까. lock 과 서비스 간 조율로 single-writer 를 강제할 필요가 없어, 아키텍처가 여러 writer 를 불가능하게 만드니까 — 쓸 수 있는 프로세스가 하나뿐이야. 깔끔한 데이터 레이어 invariant 과 깔끔한 프로세스 모델은 두 각도에서 본 같은 사실이야.