가공되지 않은 대화 로그는 규모가 커지면 읽기 어려워집니다. 몇 달간 집중적으로 사용하다 보면, 수십만 줄에 달하는 주고받은 대화 내용을 마주하게 됩니다. 이를 검색하는 것은 느리고, 읽는 것은 불가능에 가깝습니다. 반면, Obsidian vault는 양방향 링크, 태그, 연결성을 드러내는 그래프 뷰를 통해 구조화된 장기 기억을 제공합니다. 두 방식 사이의 격차는 분명합니다. 이 격차를 메우려면 자동화가 필요합니다.

저는 매일 밤 이 격차를 메우는 작은 파이프라인을 구축했습니다. 이 파이프라인은 수동 개입 없이 세 단계를 순차적으로 실행합니다. 첫째, 최신 대화 내보내기 파일을 수집하여 현재 상태로 새로 고칩니다. 둘째, Claude를 통해 지난 28시간 동안의 가공되지 않은 대화를 정제하여 구조화된 요약본을 Obsidian vault에 직접 추가합니다. 28시간이라는 시간 범위를 설정한 것은 의도적인 것입니다. 이는 전날 전체 시간과 지연을 대비한 약간의 버퍼를 포함합니다. 셋째, 모든 변경 사항을 커밋하고 프라이빗 저장소로 푸시하여 백업합니다. 이는 오프라인 저장소이자 실수로 인한 삭제를 방지하는 보험 역할을 합니다. 전체 과정은 지루할 정도로 단순하고 신뢰할 수 있어야 합니다. 지루한 자동화가 목표입니다.

macOS가 스크립트를 조용히 종료할 때

야간 작업의 가장 큰 적은 극적인 크래시가 아닙니다. 바로 침묵입니다.

macOS에서 Documents 폴더는 민감한 위치에 대한 접근을 제어하는 개인정보 보호 서브시스템인 TCC의 보호를 받습니다. 만약 launchd를 통해 스크립트를 예약하면, 시스템은 사용자가 알아차릴 수 있는 오류를 던지지 않고 단순히 프로세스를 차단할 수 있습니다. 로그 파일은 비어 있고, vault는 업데이트되지 않습니다. 작업은 실패했지만, 노트가 최신 상태가 아니라는 것을 깨닫는 며칠 뒤에야 그 격차를 발견하게 됩니다.

저는 이를 엄격한 사전 점검 루틴으로 해결합니다. 주요 작업이 시작되기 전, 스크립트는 대상 디렉터리 내에서 무해한 쓰기 작업을 시도합니다. 만약 macOS가 이를 거부하면 즉시 실패를 감지하고 눈에 띄는 데스크톱 알림을 보냅니다. 조용히 종료되는 일은 없습니다. 그다음으로, 셸 인터프리터 자체가 시스템 설정에서 '전체 디스크 접근 권한'을 부여받아야 합니다. 이 권한은 매우 포괄적이므로, 저는 모든 자동화 스크립트를 보호된 Documents 폴더 트리 외부로 완전히 분리하여 노출을 최소화합니다. 스크립트들은 다른 곳의 전용 디렉터리에 존재하며, vault 경로는 명시적으로 참조됩니다. 이러한 조기 감지, 강력한 알림, 그리고 세심한 폴더 배치의 조합이 '조용한 죽음' 시나리오를 해결합니다.

절전 모드, 타임아웃, 그리고 멈춘 작업을 고려한 설계

노트북은 절전 모드로 들어갑니다. 네트워크는 끊길 수 있습니다. API 호출은 멈출 수 있습니다. 단 하나의 작업이 멈췄다고 해서 전체 시스템이 무한정 중단되어서는 안 됩니다.

저는 파이프라인을 안정적으로 유지하기 위해 네 가지 실용적인 메커니즘을 사용합니다.

다중 시간대 설정. 이른 아침 한 번의 실행에 모든 것을 거는 대신, 스케줄러는 하루 중 여러 시점에 다시 시도합니다. 새벽에 컴퓨터가 닫혀 있었다면, 오후 시간대에 작업을 수행할 수 있습니다.

완료 표시(Done markers). 실행에 성공하면 명확한 흔적을 남깁니다. 다음 예약된 시도 시 이 표시를 먼저 확인합니다. 작업이 이미 완료되었다면 몇 초 내에 깔끔하게 종료됩니다. 이를 통해 불필요한 API 호출과 중복 처리를 방지합니다.

mkdir을 통한 파일 잠금. 실행이 겹치는 것을 방지하기 위해 디렉터리 기반의 잠금을 사용합니다. 로컬 파일 시스템에서 디렉터리 생성은 원자적(atomic)이므로, 두 개의 작업이 동시에 동일한 잠금 경로를 점유할 수 없습니다. 만약 디렉터리가 이미 존재한다면, 두 번째 인스턴스는 즉시 중단됩니다. 첫 번째 작업이 끝나면 디렉터리를 삭제합니다. 이는 PID 파일보다 가볍고...