← 목록
한선씨 2026-07-04 5KB 읽기 5분

세션 레지스트리/prune 한선씨 더블작성

개요

감사판정 "연결" 대응 — crowny_knowledge.py가 관리하는 세션 레지스트리(~/.claude/knowledge/sessions.json)의 등록/하트비트/해제/prune 로직을 순수 한선씨로 더블작성했다. 라이브 파일은 절대 무접촉 — 새 파일은 전부 인메모리(또는 사본) 저장소만 다루고, sessions.json은 읽기전용 진단 도구에서만 읽는다(쓰기 0회).

무엇을 했는지

1. /Users/ef/crowny-butler/libs/세션스토어.한선 (신규)

  • 재사용: 셀저장소.한선(키=값 저장소: 저장소열기/저장소넣기/저장소꺼내기/저장소삭제/저장소목록) — CROWNY_STD 폴백 검색으로 자동 발견됨.
  • 함수: 세션등록(저장소,sid,작업,시각), 하트비트(저장소,sid,작업,시각)(기존 세션이면 시작시각 보존), 세션해제(저장소,sid), 세션목록(저장소), 세션정리(저장소,현재시각,만료초)→[저장소,제거건수], 세션정보(저장소,sid).
  • 인코딩: 값 문자열 = "시작시각|하트비트시각|작업". 파싱은 셀저장소.한선의 "=" 파싱과 동일 idiom(앞에 공백 붙여 포함()으로 실제 인덱스 산출 후 부분()) — 포함()이 인덱스(없으면 -1) 반환이지 불리언이 아니라는 VM 함정 회피.
  • prune 핵심: 감사에서 지적된 "159세션 누적, 비활성72 미정리" 문제에 대응 — 세션정리()age(현재시각-하트비트) > 만료초인 세션을 제거하고 제거건수를 반환.

2. /Users/ef/crowny-butler/libs/세션현황.한선 (신규, 읽기전용 진단)

  • 실제 ~/.claude/knowledge/sessions.json버퍼파일읽기(op874)로 로드(64KB 읽기() 캡 우회, 파일이 커져도 안전) 해 총/활성/비활성 세션 수만 집계 출력.
  • 바이트 레벨 패턴매칭: 문자열로 통짜 변환하지 않고 "heartbeat": ASCII 패턴을 버퍼 바이트 단위로 직접 매칭 → 480000 문자열풀 고갈 회피 + 파일에 섞인 한글 task 문자열을 바이트 단위로 잘못 재조합할 위험 자체를 원천 차단.
  • 쓰기()/덧쓰기()/저장소저장() 등 쓰기 계열 함수 일절 호출 없음 — 순수 읽기.
  • 직접 실행 시 만료기준 1800초(30분)로 즉시 현황 출력.

검증 결과

  • 컴파일: hanseonc_high 2회(세션현황, 세션스토어+검증) 모두 exit 0, stderr에 [가져오기] 정보 로그만 있고 경고/에러 0건.
  • 실행(crownyc run) 모두 exit 0.
  • 세션스토어 인메모리 검증: sidA/sidB/sidC(오래됨, 지금-3600초) 3세션 등록 → 하트비트()로 sidA 갱신 → 세션정리(...,1800) 실행 → sidC 1건 제거 확인(PASS) → 세션해제()로 sidB 제거 → 1개 남음 확인(PASS) → 세션정보()로 sidA 작업필드가 갱신값("작업A-갱신")인지 최종 확인(PASS). 검증용 더미 파일 경로(저장소열기(경로)에 넘긴 스크래치 경로)는 저장소저장()을 호출하지 않았으므로 실제로 생성되지 않음ls로 재확인.
  • 세션현황 실측: 실행 시점마다 sessions.json의 실제 총/활성/비활성 수를 정확히 출력(예: 총=230 활성=184 비활성=46, 만료기준 1800초). Python json.load 기준값과 동시 측정 시 정확히 일치(초 단위 타이밍차로 근접 실행 시 1~2건 차이 나던 것도 파일이 실시간으로 살아있는 다른 세션들에 의해 계속 갱신되고 있었기 때문임을 mtime/size 변화로 확인).
  • 라이브 무파괴 확인: 작업 전/후 sessions.json mtime·size가 계속 변하고 있으나(다른 세션들의 정상 하트비트 활동) 이 작업의 어떤 코드도 그 파일에 쓰기를 수행하지 않았고, 작업 종료 시점에도 json.load()로 파싱 정상 확인(무결성 유지).

관련 파일

  • /Users/ef/crowny-butler/libs/세션스토어.한선
  • /Users/ef/crowny-butler/libs/세션현황.한선
  • 재사용: /Users/ef/CrownyOS/crownyc/libs/셀저장소.한선 (= pkg/libs/셀저장소.한선, 두 경로 동일 파일)
  • 검증 스크립트(스크래치, 비영구): /private/tmp/claude-501/-Users-ef/9f0a93ac-8ce6-40ac-92bd-8df0220ddf06/scratchpad/세션스토어_검증.한선

잔여 이슈 / 향후

  • 이번 작업은 "더블작성"(교체 아님) — crowny_knowledge.py의 실제 세션 등록/하트비트/prune 경로는 그대로 살아있고, 이 한선씨 코드는 별도 인메모리 구현 + 읽기전용 진단으로만 존재.
  • 향후 컷오버 시: 세션스토어.한선의 저장 포맷("시작|하트비트|작업")을 실제 sessions.json의 JSON 구조와 매핑하는 어댑터가 필요(현재는 셀저장소의 key=value 포맷이라 JSON과 다름). 컷오버 전 반드시 병행운영/영향분석 필요.
  • 세션현황.한선은 만료초 파라미터를 인자로 받는 함수라 다른 만료기준(예: 3600초)으로도 즉시 재호출 가능.
  • 학습DB 등록 완료: crownycode-learn.sh add세션스토어_인메모리레지스트리_prune, 세션현황_읽기전용_sessionsjson_진단 두 intent 등록(별칭: 세션스토어, 세션현황).