FROM THE WORKSHOP / 이슈
세션 중단 직후 방금 만든 스킬 파일이 커밋/푸시 없이 로컬에만 남음
세션 중단 직후 방금 만든 스킬 파일이 커밋/푸시 없이 로컬에만 남음
- 발생 일자: 2026-04-21 14:32 KST (세션 중단), 2026-04-21 23:42 KST (9시간 10분 뒤 사용자 체감 보고)
- 해결 일자: 2026-04-21 23:46 KST (다음 세션에서
git add + commit + push) - 심각도: medium (데이터 유실 가능성 — Mac 디스크 단일 장애점 의존, 단일 파일 규모)
- 재발 가능성: high (인터럽트/컨텍스트 스위치가 일상적, 현재 가드 없음)
- 영향 범위:
~/.claude/skills/**의 신규 파일 모두 (특히lessons/,issues/,SKILL.md수정)
증상
14:32:06 — Write() 로 ~/.claude/skills/submit-app/lessons/android-draft-app-release-status.md 신규 생성.
14:32:09 — 파일 시스템 쓰기 완료.
14:32:12 — [Request interrupted by user].
이 시점에 다음 일이 벌어져야 했지만 안 일어남:
git add❌git commit❌git push❌
14:42:08 — 사용자가 /clear 로 세션 초기화. 새 세션이 뜨지만 이전 세션의 “미처리 git 상태” 는 자동으로 감지되지 않음.
23:42 — 사용자가 “뭐가 꼬였나” 를 체감하고 재발 방지 요청. git status 로 untracked 파일 1개 확인:
$ git status --short
?? submit-app/lessons/android-draft-app-release-status.md
파일 내용은 무사했으나, Mac 이 사망했다면 해당 lesson 은 완전 유실. 홈페이지 /skills 에도 반영 안 됐음(rule: 새/수정 스킬은 GitHub + daejong-page 자동 반영).
원인
- 인터럽트 = 작업 중단의 끝점 ≠ 세이브 포인트. Claude Code 세션이 중단되면 그 직후에 돌려야 할 정리 단계(커밋·푸시·홈페이지 반영)가 그냥 누락됨. 복구할 메커니즘 없음.
- 스킬 파일 쓰기 루틴이 “write-then-commit” 을 한 묶음으로 보장하지 않음. 세션 로직상 Write() 이후 사용자 확인이나 다음 지시를 기다리는 게 일반적인 흐름이라, 인터럽트가 사이에 끼면 미커밋 상태로 정지.
- Stop/SessionEnd 훅이 “claude-skills repo 의 untracked/unstaged 변경” 을 감지 안 함.
daily-sync-and-learn은 06:45 KST 에 돈다 — 그 사이에 세션 여러 번 열릴 수 있고, 그 시간대에 끄고 다시 켜면 구멍 발생. - 사용자 기준 가시성 제로. 파일이 만들어졌는지조차 바로 알기 어려움 (git status 를 수동으로 쳐야 보임).
근본 원인은 “쓰기(Write) 와 배포(commit+push) 가 트랜잭셔널하지 않다”. 파일 시스템은 쓰였지만 git/GitHub/홈페이지 어디에도 반영 안 된 중간 상태가 장기간 눈에 안 띔.
조치
즉시:
~/.claude/skills/에서git status --porcelain으로 untracked/unstaged 확인 → 1건(submit-app/lessons/android-draft-app-release-status.md) 식별git add+ 포스트모템 성격의 커밋 메시지로git commit+git push- 이 이슈 파일 자체를
/issue포맷으로 기록 +regen_index.py로 INDEX.md 갱신 - 텔레그램으로 사용자에게 복구 완료 보고
항구적 조치는 아래 예방 참조.
예방 (Forcing function 우선)
우선순위 순서:
1. Stop 훅에 “skills repo 미커밋 감지 + 텔레그램 경보” 추가 (최우선)
~/.claude/hooks/ 혹은 settings.json 의 Stop 훅에 짧은 쉘 스니펫:
#!/bin/bash
cd ~/.claude/skills || exit 0
dirty=$(git status --porcelain)
if [ -n "$dirty" ]; then
# untracked/unstaged 가 남은 채 세션이 끝나려는 상태
curl -s -X POST "https://api.telegram.org/bot${TG_BOT_TOKEN}/sendMessage" \
-d "chat_id=${TG_CHAT}" \
-d "text=⚠️ claude-skills untracked/unstaged 감지 (세션 종료 직전):%0A%0A${dirty}%0A%0A다음 세션에서 정리 필요" \
> /dev/null
fi
같은 로직을 ~/daejong-page/ 에도 확장 적용. “세션 끝났는데 홈페이지 반영 안 된 변경이 있다” 를 유저가 바로 인지.
2. “새 스킬 파일 = 즉시 push” 루틴 규칙화 (메모리)
메모리 feedback_skill_write_commits_immediately.md 신설:
스킬 관련 파일(
~/.claude/skills/**) 을 Write/Edit 하면, 그 직후 같은 응답 안에서git add + commit + push까지 묶어서 실행. 사용자 확인 기다리지 않음(가역 + 규칙 명시).
이미 feedback_skill_publishing.md 가 “새 스킬은 GitHub + 홈페이지 자동 반영” 을 말하지만, “한 응답 안에서 끝낸다” 는 트랜잭션 단위를 명시적으로 못 박지는 않음 — 그걸 추가.
3. 세션 시작 시 자기 점검 (start-of-session safety net)
신규 세션 초기 작업 체크리스트에 cd ~/.claude/skills && git status --short && cd ~/daejong-page && git status --short 를 무조건 1회 돌려서 남아있는 미커밋을 발견 즉시 수습. daily-sync-and-learn 이 06:45 에 도는 것과 별개로 매 세션 이 자기 청소를 하게 만듬.
~/.claude/CLAUDE.md 에 ”## 세션 워밍업” 섹션 신설하거나, 세션 워밍업 훅(UserPromptSubmit 아님 — SessionStart 훅) 으로 자동 git status → 결과 요약 주입.
4. daily-sync-and-learn 에 Mac 쪽 repo 훑기 추가
이미 WSL → Mac 동기화용으로 돌고 있으니, 거기서 ~/.claude/skills, ~/daejong-page 의 git status --porcelain 결과를 리포트. 하루 1회 건강검진 성격. 1·3번 있으면 백업 역할만 하면 충분.
Deferred 결정
1번(Stop 훅) 을 우선 설치하고, 2번 메모리도 같이 박음. 3번은 2번과 상당히 겹쳐서 1·2 이후 상황 보고 결정. 4번은 이미 돌고 있는 잡 확장이라 당장 안 해도 됨.
재발 이력
(없음 — 최초 발견)
단, 과거 비슷한 “작업은 되었는데 외부 시스템에 반영 누락” 패턴은 있었음:
- 2026-04-20
terminal-only-reply-missed-telegram(reply 툴 호출 누락) - 2026-04-21
memoyo-signup-ghost-form(홈페이지 반영 누락)
같은 계열 문제 — “여러 출력 채널 중 일부가 빠짐”. 통합 관점에서 보면 “write 후에 수반돼야 할 배포 동작이 빠지는 게 반복된다” 이므로, 각 채널마다 Stop 훅 레벨 가드를 까는 방향이 일관된 대응.
관련 링크
- 커밋(orphan 수습):
claude-skillsHEAD~1(submit-app: add lesson — draft app 상태의 앱은 release status=draft 강제) - 기존 메모리:
feedback_skill_publishing.md(“새/수정된 스킬은 ssamssae/claude-skills GitHub + daejong-page /skills 페이지에 자동 반영”) - 예방 2 로 추가할 메모리(예정):
feedback_skill_write_commits_immediately.md - 예방 1 로 추가할 훅(예정):
~/.claude/hooks/stop-check-repos-dirty.sh