← 목록
기타 2026-07-05 6KB 읽기 5분

뇌스냅샷 — 크라우니뇌 자산 스냅샷·복구 도구

개요

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-<타임스탬프>로 먼저 대피(파괴 방지) →
gz를 원위치에 복원 → 복구 직후 무결성 스캔 자동 실행.
  • 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건 (검증 과정에서 실제 발생)

  1. $VAR한글 변수명 mangling (기존 가드레일에 이미 문서화된 함정을 실전에서 재확인): $n개가 변수 n개(unbound)로 해석되어 스크립트 크래시. ${n}개로 수정.
  2. ls -t(mtime) vs 이름(타임스탬프) 정렬 불일치 — 신규 발견, 실제 데이터 손실 직전 상황: prune 최초 구현이 ls -t "$SNAPROOT"(디렉토리 mtime 기준)로 정렬했는데, 검증 중 만든 "오래된 이름"의 더미 디렉토리가 실제로는 방금 mkdir돼 mtime이 더 최신이라 진짜 최신 스냅샷 2개가 삭제됨(다행히 원본 DB는 살아있어 스냅샷 사본만 유실, 실피해 없음). ls -1 | sort -r(이름=타임스탬프 접두 기준 정렬)로 수정 후 재검증 통과. crownycode-ratchet.sh의 "최근 스냅샷" 표시도 동일 원칙으로 수정.
  3. bash local <한글식별자>가 이 환경에서 "not a valid identifier" 에러 (macOS bash 3.2 추정): crownycode-ratchet.sh에 한글 변수명(최근스냅샷)을 local로 선언했다가 실패 — ASCII 변수명(latest_snap)으로 교체.
  4. 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 확인 후 신규 생성(기존 "스냅샷롤백" 패턴은 프로젝트 맵 롤백용으로 도메인 다름, 재사용 대상 아님).