337MB 세션 로그로 넉 달 워크플로우 결산하기

연재를 마치며 — 넉 달치 Claude Code 세션 기록을 Claude에게 통째로 분석시켜 확인한 내 워크플로우의 실체, 그리고 그 기록이 기본 설정으로는 30일이면 사라진다는 사실.

연재를 닫기 전에 마지막으로 하나를 더 시켰다. 넉 달 남짓의 작업 기록을 통째로 분석시켜 내 워크플로우를 결산하는 일이다.

하려던 것: 감이 아니라 기록으로 결산하기

4월 9일 아이디어 토론에서 시작한 일이 어느새 활동 프로젝트 12개가 됐다. 라이브 서비스 4개에 자동매매 봇 하나 — 떠 있기는 한데 뚜렷한 성과는 아직 없다. 연재를 닫으며 “나는 Claude Code를 어떻게 쓰고 있나”를 정리하고 싶었는데, 기억으로 쓰면 미화될 게 뻔했다.

다행히 Claude Code는 모든 세션을 로컬에 JSONL로 남긴다. ~/.claude/projects/를 열어보니 세션 362개, 337MB가 쌓여 있었다. 그래서 그대로 시켰다 — 네가 나랑 일한 기록을 전부 읽고, 내가 너를 어떻게 쓰는지 분석해봐. 이 글 자체가 이 글이 설명하는 워크플로우의 산물인 셈이다.

어떻게 시켰나: 에이전트 열 개로 자기 기록 감사

에이전트 10개를 병렬로 띄워 세션 로그·전역 설정·각 프로젝트 문서를 나눠 뒤지게 했다. 에이전트끼리 결론이 엇갈리면 말로 조정하는 대신 DB에 직접 접속해 실사로 해소하게 했다. 가장 큰 프로젝트의 세션 로그에서 내가 친 프롬프트 386건을 따로 뽑아 길이와 패턴 통계도 냈다.

어디서 막혔나: 4~6월이 통째로 없다

첫 벽은 분석 대상 자체였다. 337MB가 전부 7월 5일 이후 기록이었다. Claude Code는 기본 설정으로 오래된 세션 로그를 자동 정리한다(cleanupPeriodDays, 기본 30일). 연재 전반부에 해당하는 4~6월의 대화 원문은 이미 사라진 뒤였다.

대신 남은 걸 엮었다. 세션 로그와 별개로 프롬프트 히스토리 파일이 남는데, 거기엔 삭제된 넉 달치 발화 379건이 시각과 함께 남아 있었고, 여기에 레포별 git log와 docs를 대조하면 “언제 무엇을 시켰고 결과가 뭐였는지”가 대략 복원된다. 답변 원문이 없으니 “왜 그렇게 결정했는지”는 문서가 메웠다 — ADR과 docs를 남겨둔 프로젝트만 복원이 됐고, 안 남긴 구간은 그냥 구멍으로 남았다.

결과: 숫자가 확인해준 것 세 가지

프롬프트는 두 종류뿐이다. 386건의 중앙값이 49자, 65%가 100자 미만인데 최장은 22,206자다. 중간이 없다. 장문은 새 국면의 킥오프에 딱 한 번 쓰는데, 내용을 뜯어보면 지시가 아니라 게이트 설치다. 단계마다 멈춰 승인받기, 실측 없이는 다음 단계 금지.

“지금은 설계 단계다. 구현 코드를 한 줄도 작성하지 마라. 설계가 내 승인을 받기 전에는 구현 계획도 확정하지 마라.”

그 다음부터는 운전만 한다. “응 진행해” 계열이 113회. 게이트를 통과시키는 승인과 위임이 대화의 대부분이었다.

지식은 세 층으로 나뉘어 있었다. 전역 CLAUDE.md에는 행동 철학만 둔다 — 요청 이상 만들지 마라, 파괴적 작업은 사전 확인. 객관적 지식은 전부 레포 docs로 가고, 코드가 바뀌면 같은 브랜치에서 문서도 같이 바뀐다. 메모리에는 나만의 미세 선호 5~15개만 남긴다. 판별식은 하나다. 다른 사람도 필요한가 → 레포. 곧 낡는가 → todo나 git 히스토리. 둘 다 아니어야 메모리.

신뢰는 구조에서 나온다. 유효 세션 94개 중 67개는 사람이 연 게 아니라 자동매매 봇의 스케줄러가 claude -p로 연 헤드리스 세션이었다. 사람 없이 돌 수 있는 건 프롬프트를 잘 써서가 아니다.

“‘LLM은 주문을 생성할 수 없다’는 원칙이 프롬프트 수준이 아니라 코드 경로 수준에서 강제되는지 증명하라.”

LLM이 어떤 판단을 내리든 주문 객체를 만들 코드 경로 자체가 없고, 호출이 실패했을 때의 기본값은 승인이 아니라 거부다. 위임을 늘릴수록 신뢰의 근거는 프롬프트에서 구조로 내려가야 했다.

배운 점