뇌스냅샷 — 크라우니뇌 자산 스냅샷·복구 도구
개요
2026-07-05 학습DB 오염 4건(줄접합·멀티라인·파편·파일끝개행누락)을 수동 정제로 복구한 사고 이후, 재발 시 신속 롤백을 위한 스냅샷·복구 체계를 도구화했다. 결재 옴 안건(오염 사고 대비) 처리분.
무엇을 했는지
산출물 1 — ~/.claude/scripts/뇌스냅샷.sh
snap [태그]: 대상 7종(주학습DB·패턴DB·미스로그·작업구분로그·개선후보·안건큐·결재로그)을
gzip -c 스트리밍으로 ~/.crownycode/스냅샷/<YYYYMMDD_HHMMSS>[-태그]/에 저장.
라벨|원본경로|있음/없음|원본바이트|gz바이트 형식의 매니페스트.psv로 원본 경로를 라벨로 역참조(basename 충돌 회피 — 두 DB 모두 파일명이 학습.dat/all_patterns.dat라 basename만으로는 구분 불가).
스냅샷 직후 crownycode-db-integrity.sh scan을 2대 DB에 실행해 무결성요약.psv로 스냅샷 시점 건강상태를 함께 기록.
list: 스냅샷 디렉토리를 이름(타임스탬프 접두) 역순으로 나열 + 크기 + 파일수.restore <스냅샷> <라벨>: 현재 파일을<원본>.pre-restore-<타임스탬프>로 먼저 대피(파괴 방지) →
prune [N=7]: 이름(타임스탬프) 역순 정렬 기준 최신 N개만 유지, 나머지 삭제.
산출물 2 — ~/.claude/scripts/뇌스냅샷.한선 (+ RPN 동반 뇌스냅샷.std.rpn.한선)
스냅샷 보존 4상 판정 축소판(스냅샷보존판정(순번, 나이, N)):
- 순번 <= N → 티|유지(최신 N개 이내)
- 나이 <= 7일 → 티|유지(최근7일이내)
- 나이 > 30일 → 타|삭제후보
- 그 외 → 옴|보관(장기보관후보)
- 입력 이상(순번<1, 나이<0) → 음|판정불가
hanseonc_high로 컴파일·crownyc run으로 실행해 순번1~10/나이배열 데모로 검증 완료(출력 논리 일치).
RPN본은 hanseonc_rpn으로 컴파일 후 4가지 경계 케이스(최신/최근7일/보관/삭제후보)를 stdin 입력으로 실행 검증, 전부 기대값과 일치.산출물 3 — crownycode-ratchet.sh status에 최근 스냅샷 표시 1줄 추가
cmd_status() 최상단에 최근 스냅샷: <디렉토리명> (또는 "없음") 출력을 추가. 편집 전 crownycode-ratchet.sh.bak-<타임스탬프>로 백업.
발견·수정한 함정 2건 (검증 과정에서 실제 발생)
$VAR한글변수명 mangling (기존 가드레일에 이미 문서화된 함정을 실전에서 재확인):$n개가 변수n개(unbound)로 해석되어 스크립트 크래시.${n}개로 수정.ls -t(mtime) vs 이름(타임스탬프) 정렬 불일치 — 신규 발견, 실제 데이터 손실 직전 상황: prune 최초 구현이ls -t "$SNAPROOT"(디렉토리 mtime 기준)로 정렬했는데, 검증 중 만든 "오래된 이름"의 더미 디렉토리가 실제로는 방금mkdir돼 mtime이 더 최신이라 진짜 최신 스냅샷 2개가 삭제됨(다행히 원본 DB는 살아있어 스냅샷 사본만 유실, 실피해 없음).ls -1 | sort -r(이름=타임스탬프 접두 기준 정렬)로 수정 후 재검증 통과.crownycode-ratchet.sh의 "최근 스냅샷" 표시도 동일 원칙으로 수정.- bash
local <한글식별자>가 이 환경에서 "not a valid identifier" 에러 (macOS bash 3.2 추정):crownycode-ratchet.sh에 한글 변수명(최근스냅샷)을local로 선언했다가 실패 — ASCII 변수명(latest_snap)으로 교체. - macOS awk(bwk awk)는 3항 연산자(
?:) 미지원: 최초snap출력 포맷팅에$3=="있음"?"...":"..."사용 시 syntax error.if/else블록으로 교체.
검증 결과
snap 큐3차: 대상 7건 전부 성공(gz 총 9.9M, 원본 합계 ~73MB), 소요 ~3.0s.list: 정상 나열.restore왕복(미스로그.psv, 33개소): 복구전/복구후/대피본 MD5 3자 일치(dedfb666d6b23b8667f8f335ff53ad1e) — 원본 무손상 확인.prune스모크: 이름순 최신 유지 로직 정상(더미 구버전 2개 삭제, 실제 최신 스냅샷 보존).crownycode-ratchet.sh status: "최근 스냅샷: 20260705_234724-큐3차" 정상 표시.- 무결성요약.psv: 스냅샷마다 자동 생성 확인(접합/멀티라인/파편/주석만/중복intent/파일끝개행 6개 지표).
관련 파일 경로
/Users/ef/.claude/scripts/뇌스냅샷.sh/Users/ef/.claude/scripts/뇌스냅샷.한선/Users/ef/.claude/scripts/뇌스냅샷.std.rpn.한선/Users/ef/.claude/scripts/crownycode-ratchet.sh(status 1줄 추가, 백업crownycode-ratchet.sh.bak-<타임스탬프>존재)- 스냅샷 저장위치:
~/.crownycode/스냅샷/ - 참고 도구:
/Users/ef/.claude/scripts/crownycode-db-integrity.sh(무결성 스캔 코어)
잔여 이슈
- 스냅샷 대용량 DB(주학습DB 33MB, 패턴DB 35MB)는 gzip으로 약 7:1 압축(9.9M/7건). 자동 주기 실행(cron/launchd)은 미설정 — 사용자가 수동 또는 다른 훅에서 호출 필요(신규 launchd 데몬 등록은 이번 작업 범위 밖, 지시에 따라 생성하지 않음).
restore는 라벨 단위만 지원(전체 일괄 복구 커맨드 없음) — 필요 시restore를 대상별로 반복 호출.- 크라우니코드 학습DB lookup: "학습DB스냅샷" 인텐트 MISS 확인 후 신규 생성(기존 "스냅샷롤백" 패턴은 프로젝트 맵 롤백용으로 도메인 다름, 재사용 대상 아님).