Community생산성 & 협업github.com

세션 랩 (Session Wrap) - 프로젝트 인식 종료

프로젝트를 인식하는 세션 종료 절차입니다. 읽기 우선 핸드오프 메모리를 갱신하고 MEMORY.md를 다시 지정하며(모든 프로젝트에서 작동), 현재 프로젝트의 상태 저장소(있는 경우)를 동기화합니다. 세션 종료, 높은 컨텍스트(약 70% 이상) 또는 '컨텍스트 저장', '핸드오프 준비', '마무리', '세션 저장' 시 사용합니다. 세션 중간 자동 체크포인트를 제공합니다.

세션 랩 (Session Wrap) - 프로젝트 인식 종료란 무엇인가요?

이 스킬은 AI 어시스턴트(Claude Code, Cursor 등)가 세션 종료 시 프로젝트 상태를 체계적으로 보존하고 다음 세션을 원활하게 재개할 수 있도록 설계된 프로젝트 인식 종료 절차입니다. 스킬은 세 부분으로 구성됩니다: §1(범용 핸드오프 메모리), §2(프로젝트별 상태 저장소 동기화), §3(재개 프롬프트 생성). 또한 세션 중간 하트비트 체크포인트(§0)를 통해 각 하위 작업 완료 후 또는 위험한 단계 전에 현재 상태를 저장하여 충돌 시 최대 한 단계의 메모리 손실만 발생하도록 합니다. 핸드오프 파일은 `~/.claude/hooks/session-resume.sh` 훅에 의해 자동으로 로드되며, 모든 프로젝트에 대해 별도 설정 없이 작동합니다. 저장 전 API 키, 토큰 등 민감 정보를 자동으로 'REDACTED' 처리하는 보안 기능이 내장되어 있습니다.

지원 대상✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/butterpurse-dot/claude-code-crashproof-handoff/tree/HEAD/skills/session-wrap

Installed? Explore more 생산성 & 협업 skills: steipete/gemini, steipete/gh-issues, steipete/skill-creator · View all 6 →

즐겨 사용하는 AI에게 물어보기

이 에이전트 스킬이 미리 로드된 새 채팅을 엽니다.

문서

세션 랩 (Session Wrap, 프로젝트 인식 종료)

두 부분으로 구성: §1은 모든 프로젝트에 공통; §2는 프로젝트별로 라우팅 (상태 테이블은 프로젝트별 — 절대 다른 프로젝트의 테이블을 쓰지 마세요). §0 = 세션 중간 하트비트 (아래). <MEM> = bash ~/.claude/hooks/session-resume.sh --dir 명령어가 출력하는 메모리 디렉토리.

저장 전 (하트비트, 핸드오프 메모리, 규칙/현재파일, DB 행, 재개 프롬프트) 반드시 수정: API 키, 토큰, 비밀번호, 개인 키, 계좌 번호 및 잔액, 개인 데이터, 활성 계정을 식별할 수 있는 모든 정보를 제거하세요. <REDACTED — see vault>라고 쓰거나 요약하세요 (예: "실시간 잔액 확인됨, 여기에 기록되지 않음"). 실제 값이 있는 위치를 명명하는 것은 괜찮지만, 값 자체는 기록하지 마세요. §2의 보호구역 의역 규칙과 동일한 패턴 — 둘 다 유지.

0. 하트비트 체크포인트 — 세션 중간 (핸드오프 메모리만)

각 하위 작업 완료 후, 그리고 길거나 위험한 단계(대규모 리팩터, 배포, DB 마이그레이션) 전에는 현재 프로젝트의 §1 핸드오프 파일만 갱신하세요 (파일이 없으면 생성): ## LIVE STATE (heartbeat) 블록 — 방금 완료한 작업, 진행 중인 작업, 다음 단계. 이전 블록을 바꾸고, 절대 추가하지 마세요; 15줄 미만으로 작성. 제목을 정확히 유지하세요: 훅이 이 제목을 찾습니다.

  • MEMORY.md를 다시 태그하거나, 데이터베이스를 건드리거나, 재개 프롬프트를 출력하지 마세요 — 그것들은 세션 종료 시에만 수행합니다 (§1 태그, §2, §3). 종료 시 블록을 확인된 상태로 접고 삭제하세요.
  • 이제 언제든지 충돌이 발생해도 최대 한 단계의 메모리만 손실됩니다. session-resume.sh는 여전히 해당 블록을 가진 모든 핸드오프를 다음 시작 시 UNWRAPPED HEARTBEAT으로 나열하므로, 태그되지 않은 첫 번째 하트비트 파일도 발견됩니다.

1. 핸드오프 메모리 — 항상 (모든 프로젝트)

<MEM>/project_<proj>_handoff_<YYYYMMDD>.md 파일을 쓰거나 갱신: 확인된 상태 (주요 SHA, 완료된 작업, 열린 결정, 순서가 지정된 다음 작업, 지시 사항). <MEM>/MEMORY.md에서 해당 인덱스 라인에 ★READ FIRST FOR <PROJECT> (current)★ 태그를 붙이고, 이전 것은 "(superseded)"로 표시. 이전 핸드오프는 디스크에 유지: 대체된 체인이 프로젝트의 기록입니다.

  • ~/.claude/hooks/session-resume.sh SessionStart 훅은 프로젝트에 구애받지 않음: 대체(superseded) 표시되지 않은 READ FIRST FOR <ANY-PROJECT>와 일치하는 모든 라인을 주입 → 라인에 태그를 붙이는 것이 모든 프로젝트에 대한 재개 보장입니다 (프로젝트별 훅 불필요). MEMORY.md가 자동 로드되더라도 훅을 유지: "작업 전에 핸드오프를 읽으세요" 지침을 추가하고, 모든 디렉토리에서 작동하며, MEMORY.md가 200줄 로드 제한을 초과해도 생존합니다. 또한 프로젝트에 두 개의 활성 포인터나 누락된 파일에 대한 포인터가 있을 때 경고합니다 — 종료 시 수정하세요.

규칙은 이월됩니다. 새로운 소유자 규칙, 상시 지침, 작업 명령어 또는 유료로 얻은 교훈은 핸드오프뿐만 아니라 주어지는 즉시 해당 프로젝트의 항상 로드되는 규칙 파일에 기록합니다. 규칙 파일: <MEM>/<proj>_rules.md, <MEM>/session-wrap.conf에 나열된 모든 프로젝트에 대해 session-resume.sh에 의해 전체가 강제 로드됩니다. 짧게 유지하고, 추가보다는 교체하세요. 종료 시 확인: 이 세션에서 소유자가 반복해야 했던 모든 내용이 이제 규칙 파일에 있어야 합니다. 또한 <MEM>/<proj>_now.md를 다시 작성 (현재 상태 및 다음 단계, 짧게 유지: 훅 컨텍스트는 약 10,000자에서 잘림).

2. 프로젝트 상태 저장소 동기화 — 먼저 라우팅

cwd 또는 이번 세션의 작업에서 프로젝트를 감지합니다. 그런 다음 해당 프로젝트의 라우트를 따릅니다. 소유한 각 프로젝트에 대해 ### 라우트를 하나씩 추가하세요; 아래 세 가지는 패턴입니다.

<Postgres 저장소가 있는 프로젝트> → 자체 데이터베이스

환경 변수(psql "$PROJECT_DB_URL")에서 자격 증명을 가져와 연결하고, 명령어에 리터럴을 절대 사용하지 마세요. examples/state-store.sql의 예제 테이블:

INSERT INTO session_handoff (session_id, handoff_prompt, created_at) VALUES ('<sid>','<resume>',now());
INSERT INTO decisions (title,rationale,applies_to,status,session,"timestamp",decided_at)
  VALUES ('<d>','<why>','<project>','implemented','<sid>',now()::text,now());   -- 행당 하나의 INSERT
INSERT INTO code_map (module,path,lines,purpose,bounded_context) VALUES (...);  -- 고유 제약 조건이 없으면 먼저 해당 경로를 DELETE

주의사항 (자체 저장소의 것을 여기에 작성; 이런 종류는 각각 세션을 소모합니다): 키워드로 명명된 열은 따옴표 처리(decisions."timestamp"; "order"와 같은 예약어에 필수, 그 외에는 무해)하고 해당 유형에 주의(이것은 text + NOT NULL이므로 now()::text); CHECK 제약 조건이 있는 열은 나열된 값만 사용 가능(pending|implemented|superseded|deferred|rejected); 테이블이 존재한다고 가정하지 말고 먼저 \d로 확인; 다중 행 VALUES는 원자적이므로 하나의 잘못된 행이 모두 삭제됨 → -v ON_ERROR_STOP=off 옵션과 함께 행별로 수행. 보호구역 오경보: 위험한 명령어를 차단하는 PreToolUse 훅은 전체 Bash 명령어를 grep합니다 — SQL 텍스트에 차단된 패턴 리터럴(reset --hard, git push, git clean)이 포함되어 있으면 전체 명령어가 차단됩니다. 핸드오프/결정 텍스트에서 이러한 문자열을 의역하세요 (예: 리터럴 대신 "파괴적 git" 사용).

<실행 중인 프로젝트> → 자체 저장소 (다른 프로젝트의 것이 아님)

쓰기 전에 스키마를 확인; 이에 대한 메모는 오래됩니다. 라이브 인프라 — 외부 시스템 of record(결제 제공자, 프로덕션 DB, 실행 중인 서비스)가 진실이며 핸드오프가 아닙니다; 랩의 일부로 라이브 플래그나 설정을 절대 변경하지 마세요.

<기타 모든 것> → 메모리 전용

DB 상태 저장소 없음 — §1 핸드오프 메모리가 기록입니다. 이를 명시하고, 다른 프로젝트의 테이블을 쓰지 마세요.

3. 재개 프롬프트 출력 (마지막 아티팩트 — 사용자가 다음 Claude에 붙여넣는 내용)

저장 후, 다음 세션을 위한 복사-붙여넣기 프롬프트를 펜스 처리하여 출력합니다. SessionStart 훅이 이미 핸드오프 포인터를 주입하므로, 이 프롬프트는 다음만 추가합니다: 재로드 확인 + 사용자가 결정해야 하는 열린 결정. 템플릿:

<프로젝트> 재개. 먼저 메모리 <핸드오프-파일>을 읽고, 그 다음 스킬 /<프로젝트-맵-스킬>을 실행.
확인된 상태: <1줄: 주요 SHA + 라이브 상태 + 차단/게이트된 항목>.
먼저: 1) /context — <재로드 확인, 예: 새로 로드된 플러그인 비용 측정>; 2) <로드 확인>.
그런 다음 <열린 포크>에 대한 결정: [하나 선택] (a) <권장> (b) … (c) …
<상시 세션별 지침, 예: 완료 주장 전 확인>

짧게 유지 — 포인터 + 결정, 상태 덤프가 아님 (상태는 핸드오프 메모리 + DB에 있음; 중복 금지 → 컨텍스트 오염). 또한 이 프롬프트를 ## RESUME PROMPT 제목 아래 핸드오프 메모리에 붙여넣어 쿼리 가능하게 하고 채팅에서 손실되지 않도록 하세요.

완료 (확인, 결과 인용)

  • 조정 게이트 — 먼저 실행, 필수. 전체 대화(메모리뿐만 아니라)를 스캔하고 이 세션의 모든 결정, 열린 항목, 소유자 수정 및 지시 사항을 나열하세요. 각 항목에 대해, 어디에 기록되었는지(핸드오프 메모리 라인, 규칙 파일 라인 또는 DB 행) 인용하거나 DROPPED: <한 줄 이유>로 표시하세요. "다루어진 것 같다"는 허용되지 않음 — 라인을 가리키거나 드롭된 것으로 표시. 설명되지 않은 항목이 있다면 지금 기록하고(열린 결정이 변경된 경우 §3 갱신), 다시 나열.
  • §1: 핸드오프 메모리의 MEMORY.md 라인은 (current)를 가짐; 이전 것은 superseded 표시; grep -c 'LIVE STATE (heartbeat)' <핸드오프> = 0.
  • §2: DB 프로젝트의 경우, SELECT max(created_at) FROM session_handoff; ≈ 현재 시간 + 작성한 행 수. 메모리 전용이면 그렇게 명시.
  • §3: 재개 프롬프트가 출력되고 핸드오프 메모리에 저장됨.

관련 스킬