Haeminway haemin/way
무료 도구 English
22 분 분량

대화가 길어지면 새 세션으로 갈아탑니다: HANDOFF.md 네 제목과 300K 기준

AI 작업 창을 열하루에 97번 갈아탔습니다. 그때 쓴 HANDOFF.md 네 제목과 30만 토큰 알림 훅을 드립니다.

10월 20일부터 30일 새벽까지 제 AI 작업 창은 97번 새 세션으로 갈아탔습니다. 97번 모두 새 창이 인계 파일의 해시부터 답했고, 그 값이 맞은 뒤에 이어서 할 일을 받았습니다.

핵심

3줄 요약

AI 코딩 도구는 대화가 길어질수록 앞에서 정한 것을 놓치기 쉽습니다. 저는 길어진 대화를 이어 붙이지 않고, 인계 파일 한 장을 남긴 뒤 새 대화로 넘어갑니다.

이 글의 숫자는 제 컴퓨터의 교대 기록 파일(10월 12일~30일, 480줄), 블로그 저장소의 대화 기록, 관련 커밋커밋 commit 고친 파일들을 한 단위로 묶어 변경 기록에 남기는 일.눌러서 용어 설명서 보기 →에서 10월 30일에 센 값입니다. 교대는 작업 창 관리 스크립트가 하고, 그 창 안에서 도는 AI는 Claude CodeClaude Code 클로드 코드 Anthropic의 코딩용 AI 도구. 내 컴퓨터의 파일을 직접 읽고 고칩니다.눌러서 용어 설명서 보기 →입니다.

처음이라면 손으로 한 번 갈아타 봅니다

자동화보다 먼저, 지금 쓰는 대화에서 인계 파일을 한 번 남겨 보는 게 첫 단계입니다. 프롬프트프롬프트 prompt AI에게 주는 작업 지시문. 무엇을 어떤 형식으로 만들지 적은 글입니다.눌러서 용어 설명서 보기 → 두 개면 됩니다.

블로그 저장소의 실제 HANDOFF.md 발췌. 맨 위 제목 줄 아래에 정한 것(운영안·분량 기준·모바일 세로판·게시 승인 규칙), 맡은 일(세로판 마무리 단계와 다음 순서), 상시 작업: 없음, 참고(캡처 스크립트 위치·커밋 규칙·다른 세션 파일) 네 덩어리가 있음

위 그림은 이 블로그 저장소의 실제 HANDOFF.md(10월 27일 밤 판)를 찍은 발췌입니다. 내부 주소를 가리고 긴 줄은 앞부분만 실었습니다.

먼저 지금 길어진 대화에 아래를 붙여 넣습니다.

지금까지 대화를 새 세션에 넘기려고 한다. 이 폴더의 HANDOFF.md에
아래 네 제목으로 적고, 그 파일만 커밋해 줘(git이 아니면 저장만).
- 정한 것: 이 대화에서 내가 확정한 결정과 근거 파일 경로
- 맡은 일: 내가 맡긴 일 중 남은 것. 돌고 있는 작업은 식별자·상태·로그 위치까지
- 상시 작업: 이 창을 닫으면 멈추는 서버·감시·반복 실행.
  없으면 정확히 "상시 작업: 없음"
- 참고: 설명, 다른 사람 몫, 내 승인을 기다리는 것(실행하지 않음)
추측은 적지 말고, 확인하지 못한 것은 "미확인"이라고 적어.

파일이 생기면 새 대화를 엽니다. Claude Code는 /clear로 같은 창에서 새로 시작할 수 있고, 창을 닫고 다시 열어도 됩니다.

새 대화의 첫 메시지는 이것입니다.

이전 세션에서 이어받는다. HANDOFF.md를 읽고 두 줄로만 답하고 멈춰.
1줄: 이 파일의 sha256 해시(직접 계산)
2줄: 정한 것·맡은 일 한 줄 요약

답을 받으면 두 가지만 봅니다.

  • 해시 → 내 터미널에서 sha256sum HANDOFF.md를 돌린 값과 같은지
  • 한 줄 요약 → 내가 맡긴 일과 맞는지

둘 다 맞으면 “맡은 일을 이어서 해. 참고에 있는 건 실행하지 마.”라고 보냅니다. 맥에서는 sha256sum 대신 shasum -a 256 HANDOFF.md를 씁니다.

처음 할 때 막히는 곳은 대개 셋입니다.

  • 해시가 다름 → 그사이 파일을 고쳤는지 봅니다. 고쳤다면 새 대화에 같은 질문을 다시 합니다.
  • 해시를 계산하지 않고 그럴듯한 값을 씀 → 파일을 읽고 명령을 돌릴 수 없는 대화에서 생깁니다. 그래서 제 터미널 값과 꼭 비교합니다.
  • 한 줄 요약에 맡긴 일이 빠짐 → 새 대화에서 고치지 말고 HANDOFF.md에 그 줄을 더한 뒤 다시 확인합니다.

세 번째가 중요합니다. 빠진 내용을 대화로만 알려 주면 다음 교대 때 또 빠집니다. 파일에 적어야 다음 세션도 읽습니다.

갈아타는 때는 두 가지 중 하나입니다

맡은 일이 남았는데 대화가 30만 토큰을 넘었거나, 주제가 바뀌었을 때입니다. 일이 끝났으면 갈아타지 않고 그냥 닫습니다.

교대 판단 순서 도식. 맡은 일이 남았는가에서 아니오면 교대하지 않음. 예면 30만 토큰을 넘었거나 주제가 바뀌었는가를 보고, 예면 지금 하던 도구 호출을 마친 뒤 HANDOFF.md를 쓰고 그 파일만 커밋, 입력이 30초 조용해지면 새 창으로 넘어감. 알림은 30만·40만·50만을 넘을 때 한 번씩

30만은 실험으로 찾은 최적값이 아닙니다. 제가 정해 둔 눈금이고, 설정 하나로 바꿀 수 있게 해 두었습니다.

대신 실제 대화가 얼마나 길어지는지는 셌습니다. 10월 20일~29일에 블로그 저장소에서 쓰인 대화 기록 335개(작업자 대화 포함)의 최대 길이입니다.

최대 길이대화 수
10만 토큰 넘음288
20만 토큰 넘음174
30만 토큰 넘음70
40만 토큰 넘음13
가장 긴 대화약 43만 토큰

토큰 수는 각 대화의 응답마다 기록된 입력 토큰(캐시 포함) 합계입니다. 다섯 개 중 한 개꼴로 30만을 넘었습니다.

주제가 바뀌는 경우는 숫자로 잡히지 않습니다. 예를 들어 원고를 다듬던 대화에서 배포배포 deploy 만든 프로그램을 다른 사람이 쓸 수 있게 인터넷에 올리는 일.눌러서 용어 설명서 보기 → 오류를 고치기 시작하면, 대화가 짧아도 그때 넘깁니다.

원고 쪽 지시와 배포 쪽 지시가 한 대화에 섞이지 않게 하려는 것입니다. 원고 일은 인계 파일의 맡은 일에 남겨 두면 됩니다.

나머지 두 조건은 숫자가 아니라 순서입니다.

  • 도구를 쓰는 도중 → 끼워 넣지 않고 그 호출이 끝난 뒤
  • 직접 돌린 작업이 실행 중 → 끝나길 기다리거나, 식별자를 인계 파일에 빠짐없이 적은 뒤

지금 대화가 얼마나 긴지는 Claude Code에서 /context를 입력하면 나옵니다. 저는 이걸 매번 보지 않으려고 훅(hook) 하나를 붙였습니다.

자동 요약 대신 파일을 남기는 이유

인계 파일은 커밋으로 남아서, 언제 무엇을 넘겼는지 나중에 다시 열어 볼 수 있습니다. 이 블로그 저장소의 HANDOFF.md에는 10월 12일 첫 커밋부터 27일까지 커밋이 20개 남아 있습니다.

왼쪽 빨간 쪽에서는 둥근 로봇이 긴 두루마리를 손바닥만 한 흐릿한 쪽지로 꾹꾹 접어 넣고 있고, 오른쪽 파란 쪽에서는 같은 로봇이 얇고 선명한 파란 서류철을 같은 서류철들이 가지런히 꽂힌 서랍에 넣고 있음

Claude Code에는 대화가 길어지면 앞부분을 요약해 이어 가는 기능이 있습니다. 편하지만 무엇이 남고 무엇이 빠졌는지가 제 저장소에 파일로 남지 않습니다.

HANDOFF.md는 다릅니다. git log -- HANDOFF.md를 치면 커밋 제목만으로 흐름이 보입니다.

c0b7c76 docs: handoff (mobile variants in progress)
bb82cb4 docs: checker run evidence and handoff for enriched W44 posts
f036e72 docs: handoff (W44 v2 fixes done, approval pending)
c69b614 docs: handoff (weekly bundle v2, review fixes pending)

새 세션이 엉뚱하게 움직이면 그 시점의 인계 파일을 열어 봅니다. 파일에 없던 내용이면 제 인계가 부족했던 것이고, 파일에 있던 내용이면 읽는 쪽 문제입니다. 어느 쪽을 고칠지 바로 나뉩니다.

30만 토큰 알림은 훅이 겁니다

메시지를 보낼 때마다 도는 작은 스크립트가 대화 길이를 재고, 넘었을 때만 AI에게 한 줄을 끼워 줍니다. 사람은 아무것도 세지 않습니다.

둥근 로봇이 책상에서 일하는 동안 옆에 쌓이는 종이 더미 옆에 작은 눈금 기둥이 서 있고, 종이 더미가 눈금의 선을 넘는 순간 기둥 꼭대기의 작은 램프가 파랗게 켜져 로봇 쪽으로 빛을 비춤

Claude Code의 UserPromptSubmit 훅은 내가 메시지를 보낼 때마다 실행되고, 출력한 문장을 그 메시지와 함께 AI에게 넘깁니다. 제 전역 설정에는 이렇게 걸려 있습니다.

"hooks": {
  "UserPromptSubmit": [
    { "hooks": [ { "type": "command",
        "command": "~/…/scripts/context-budget-hook", "timeout": 3 } ] }
  ]
}

스크립트는 대화 기록 파일의 끝 2MiB만 읽고, 마지막 응답에 적힌 토큰 수를 꺼냅니다. 30만을 넘으면 아래 같은 문장을 AI에게 보냅니다(줄여 옮김).

컨텍스트가 약 30만 토큰입니다(예산 30만). 맡은 일이 남았으면 묻지 말고
지금 하던 도구 호출을 마친 뒤 스스로 교대하세요.
HANDOFF.md에 '- 정한 것:', '- 맡은 일:', '- 상시 작업:', '- 참고:'를 쓰고
그 파일만 커밋한 뒤 교대 명령을 실행하고 응답을 마치세요.
맡은 일이 없으면 교대하지 마세요.

같은 대화에서 매번 울리지 않게, 30만·40만·50만을 처음 넘을 때 한 번씩만 보냅니다. 스크립트가 실패하면 아무것도 출력하지 않아서 대화를 막지 않습니다.

창 관리 스크립트 밖에서 연 대화에는 문장이 달라집니다. “교대하세요”가 아니라 “답 끝에 새 세션을 한 줄로 권하세요”까지만 보냅니다.

핵심

길이를 재는 일은 스크립트에, 인계 파일을 쓰는 일은 AI에게, 갈아탈지 정하는 일은 규칙 한 줄에 둡니다.

HANDOFF.md는 네 제목만 씁니다

제목을 넷으로 고정하면 새 세션이 무엇을 실행하고 무엇을 건드리지 말지 바로 나뉩니다. 내용이 길어도 제목은 늘리지 않습니다.

HANDOFF.md 네 제목 구조와 블로그 인계 파일의 실제 줄 예시. 정한 것은 확정된 결정과 근거 경로(새 세션이 다시 따지지 않음), 맡은 일은 사용자가 맡긴 남은 일과 돌던 작업의 식별자·상태·결과 위치(새 세션이 바로 실행), 상시 작업은 이 창을 닫으면 멈추는 프로세스 또는 정확히 '없음'(새 세션이 중복 실행하지 않음), 참고는 설명·다른 담당자 몫·승인 대기(실행 금지)

제목쓰는 것새 세션이 하는 일
정한 것확정된 결정, 근거 파일·커밋다시 따지지 않음
맡은 일내가 맡긴 남은 일, 돌던 작업의 식별자·상태·결과 위치바로 이어서 실행
상시 작업이 창을 닫으면 멈추는 프로세스. 없으면 상시 작업: 없음중복 실행·종료하지 않음
참고설명, 다른 담당자 몫, 승인 대기, 다음 제안실행하지 않음

맡은 일에는 “끝나면 무엇을 하는지”까지 적습니다. 위 블로그 인계 파일도 “세로판 확인 → 미리보기 빌드빌드 build 작성한 코드를 실제로 열어 쓸 수 있는 파일 묶음으로 바꾸는 작업.눌러서 용어 설명서 보기 → → 390px로 찍기 → 커밋”처럼 다음 순서가 적혀 있었습니다.

맡은 일 한 줄의 차이는 이렇습니다. 위쪽은 제가 지어낸 나쁜 예이고, 아래쪽은 실제 블로그 인계 파일에 있던 줄입니다.

나쁜 예: - 모바일 작업 계속
실제 줄: - A 세로판 08은 08a·08b 두 장으로 나뉘어 있음
           → 위아래로 합쳐 08-length-dup.16x9.m.webp 하나로 만들고 08a·08b 삭제

“계속”만 적으면 새 세션은 무엇이 끝났는지부터 다시 조사합니다. 파일 이름과 끝 상태가 적혀 있으면 바로 그 작업을 시작합니다.

반대로 넣지 않는 것도 있습니다.

  • 대화를 요약한 사연 → 결정 기록 문서에 두고 경로만
  • 비밀 키·토큰·주소 → 어디에도 적지 않음
  • “아마 ~일 것” → 확인하지 못했으면 “미확인”

커밋은 인계 파일 하나만 합니다. 이전 창을 바로 닫은 74번 중 61번은 저장소에 커밋하지 않은 다른 파일이 남아 있었고, 파일 수를 센 72번의 중앙값은 69개였습니다(2번은 세지 못함).

그 안에는 다른 세션이 작업 중인 파일이 섞여 있을 수 있어서 같이 커밋하지 않습니다. 초기 규칙은 저장소 전체가 깨끗해야 교대를 허락했습니다. 10월 12~13일에 그 이유로 8번 거부됐고, 13일 오전에 “인계 파일이 커밋돼 있고 그 뒤 바뀌지 않았는지”만 보도록 바꿨습니다.

상시 작업 칸에는 창을 닫으면 멈추는 것만 적습니다

“상시 작업”은 이 창을 닫으면 같이 멈추는 프로세스만 뜻합니다. 이 정의가 넓던 날, 이전 창이 다섯 시간 남짓 동안 9번 닫히지 않았습니다.

왼쪽 빨간 쪽에서는 둥근 로봇이 방문을 닫고 나가는데 방 안의 작은 기계가 아직 돌고 있고, 오른쪽 파란 쪽에서는 같은 로봇이 돌고 있는 작은 기계를 새 로봇에게 손으로 건넨 뒤 빈 방의 문을 닫음

10월 20일 오후 2시 54분부터 8시 11분까지, 교대 기록에는 같은 문장이 9번 남았습니다. “상시 작업은 명시적으로 넘겨야 함, 이전 창 유지.”

그때 알림 문장은 상시 작업을 “소유한 감시·서버서버 server 인터넷으로 들어온 요청을 받아 일을 처리해 주는 컴퓨터.눌러서 용어 설명서 보기 →·주기 실행”이라고 불렀습니다. 그날 저녁 한 인계 파일의 상시 작업 칸에는 운영체제가 돌리는 웹 서비스 하나와 매주·매시 정기 작업들이 적혀 있었습니다.

창 관리 스크립트는 상시 작업 칸에 무언가 적혀 있으면 넘겨받았다는 확인 없이는 이전 창을 닫지 않습니다. 그 정기 작업들은 창과 상관없이 도는데도 창이 남았습니다.

그날 저녁 8시 55분에 정의 한 줄을 고쳤습니다.

전: '- 상시 작업:'(소유한 감시·서버·주기 실행만, 없으면 정확히 '없음')
후: '- 상시 작업:'(이 창을 닫으면 멈추는 프로세스만, 없으면 정확히 '없음';
    systemd 서비스·타이머는 참고에)

운영체제가 돌리는 서비스와 타이머는 창을 닫아도 멈추지 않으니 참고로 갑니다. 반대로 이 창에서 직접 띄운 미리보기 서버나 긴 렌더 작업은 창을 닫으면 죽으니 상시 작업입니다.

그래도 사람과 AI는 형식을 자주 틀립니다. 10월 20일 이후 교대 요청 중 28건은 상시 작업 칸이 정확히 “없음” 한 줄이 아니었습니다.

상시 작업 칸을 적는 형식 비교. 맞는 형식은 '- 상시 작업: 없음' 한 줄. 경고가 남은 형식은 제목 아래 줄에 '- 없음'을 따로 쓴 것, '없음 (미리보기 서버 2개는 세션 임시 프로세스라 꺼도 됨)'처럼 괄호 설명을 붙인 것, 칸을 비워 둔 것. 설명은 참고 칸으로 옮김. 실제 상시 작업이 있을 때는 프로세스 이름과 이 창을 닫으면 멈춘다는 점, 다시 띄우는 법을 적음. 10월 20일 이후 28건이 정확한 '없음'이 아니었음

자주 나온 모양은 셋이었습니다.

  • 제목 아래에 - 없음을 한 줄 더 씀
  • 없음 (미리보기 서버 2개는 세션 임시 프로세스라 꺼도 됨)처럼 괄호 설명을 붙임
  • 칸을 비워 둠

그래서 지금은 이 칸을 경고로만 기록하고, 이전 창을 닫을지는 그 창에 실제로 남은 프로세스로 정합니다. 경고가 남은 28건 중 22번은 교대가 끝나 이전 창이 닫혔고, 프로세스가 남아 있던 창은 그 작업이 끝난 뒤에 닫혔습니다.

실제 상시 작업이 있던 인계 파일은 이렇게 적었습니다. 이 블로그의 시안 작업 기록에서 주소와 폴더만 가렸습니다.

- 상시 작업:
  백그라운드 http.server 2개(이 창을 닫으면 멈춤, 시안 임시용):
  [주소 2개], 둘 다 [폴더] 서빙. 멈춰도 무방, 상시 서비스는 [다른 주소]로 대체한다.

이 칸은 경고로 기록되는 게 맞습니다. 이 창에서 띄운 서버라 창을 닫으면 꺼지고, 꺼져도 되는지까지 적혀 있습니다.

반대로 영상 렌더처럼 언젠가 끝나는 작업은 상시 작업이 아닙니다. 맡은 일에 식별자·상태·결과 위치를 적습니다. 실제 기록에는 렌더를 상시 작업 칸에 넣은 경우도 있었는데, 교대 문서의 분류와는 다릅니다.

새 창은 해시부터 답해야 일을 시작합니다

새 창의 첫 답은 일이 아니라 확인 한 줄입니다. 그 줄의 해시가 원본 파일과 맞아야 다음 지시가 갑니다.

새 창이 받는 첫 지시와 실제 답. 지시는 HANDOFF.md를 읽고 원본 바이트의 SHA-256을 계산해 정한 것·맡은 일을 한 줄로 확인하고 HANDOFF-LOADED:요청 ID:해시 64자리를 독립된 한 줄로 답하라는 것. 10월 24일 실제 답은 정한 것과 맡은 일 요약 두 문장과 HANDOFF-LOADED:acf27a99…:190de83d… 한 줄. 창 관리 스크립트가 같은 해시를 직접 계산해 비교하고, 맞으면 재개 지시를 보냄

창 관리 스크립트가 새 창에 보내는 첫 지시는 이렇습니다.

이전 세션에서 이어받는다. 먼저 "…/HANDOFF.md" 파일을 읽어라.
파일 원본 바이트의 SHA-256을 계산하라. 정한 것·맡은 일을 한 줄로 확인하고
HANDOFF-LOADED:<요청 ID>: 뒤에 계산한 64자리 해시를 붙여 독립된 한 줄로 답하라.
이 확인 줄을 도구를 쓰지 않는 단독 답으로 보내고 답을 끝내라.
다른 작업·다른 대화 기록 접근은 하지 마라.

스크립트는 같은 파일의 해시를 직접 계산해 둡니다. 새 창의 답에 그 줄이 그대로 있어야 통과입니다.

  • 해시가 맞음 → 정확히 그 판의 파일을 열었다는 확인
  • 확인 도중 인계 파일이 바뀜 → 실패, 이전 창 유지
  • 정해진 시간 안에 답이 없음 → 실패, 이전 창 유지

통과하면 그때 일을 시키는 지시가 갑니다(가운데 한 문장 생략).

인계 확인 완료. 지금 바로 HANDOFF.md의 '맡은 일'을 이어서 진행하라.
사용자에게 다시 묻거나 지시를 기다리지 마라. …
'참고'에 적힌 제안·다른 담당자 몫·승인 대기 항목은 실행하지 마라.
이전 탭 소유의 상시 작업은 이관 확인 없이 종료하거나 중복 실행하지 마라.

해시는 “어느 판의 파일을 열었는지”까지만 확인합니다. 해시 명령만 돌려도 같은 값이 나오기 때문에, 내용을 제대로 이해했는지는 같은 답에 남긴 한 줄 요약으로 사람이 봅니다.

첫 절의 손으로 하는 교대에서 두 줄 답을 요구한 것도 같은 구조입니다. 스크립트가 하던 비교를 사람이 sha256sum 한 번으로 대신할 뿐입니다.

그리고 확인 답을 받기 전에는 일을 시키지 않습니다. 확인과 일을 한 메시지에 섞으면, 파일을 잘못 읽었을 때도 일이 먼저 시작됩니다.

한 번 갈아타는 데 18.5초가 걸렸습니다

이전 창을 바로 닫은 74번의 교대 시간 중앙값은 18.5초, 가장 길었던 것은 30.5초였습니다. 가장 긴 단계는 새 창이 인계 파일을 읽고 해시를 답하는 시간입니다.

나머지 23번은 이전 창에서 돌던 작업이 끝나길 기다렸다가 나중에 닫혀서, 같은 방식으로 시간을 잴 수 없습니다.

교대 단계별 시간 중앙값 막대. 준비 확인 0.4초, 새 창 열기 4.8초, 입력 준비 0.0초, 인계 확인(파일 읽고 해시 답) 9.5초, 재개 확인 3.5초, 합계 18.5초. 74번 중 최장 30.5초

단계하는 일중앙값
준비 확인승인 정책, 인계 파일 커밋 여부0.4초
새 창 열기같은 폴더·같은 모델모델 model AI의 '두뇌' 하나하나를 부르는 말. 같은 회사도 크기·성능별로 여러 모델을 냅니다.눌러서 용어 설명서 보기 →·같은 설정으로4.8초
입력 준비새 창이 입력을 받을 수 있는지0.0초
인계 확인파일 읽기, 해시 답 비교9.5초
재개 확인맡은 일 지시 전달, 새 창이 일을 시작했는지3.5초

교대 명령은 바로 실행하지 않고 예약만 걸어 둡니다. 이전 창의 입력이 30초 동안 조용해지면 그때 위 순서가 시작됩니다.

그래서 사람이 체감하는 건 18초가 아니라 “답이 끝나고 잠시 뒤 새 창이 혼자 일을 이어 가는 장면”입니다. 교대가 끝나면 이전 창은 닫힙니다.

교대 중에 보낸 말은 두 번째 메시지로 따라갑니다

교대가 예약된 사이에 제가 보낸 말은 이전 창에 남아 버릴 수 있습니다. 그래서 지금은 원문 그대로 새 창에 따로 전달합니다.

교대 중 사용자 메시지 전달 흐름. 이전 창의 마지막 최종 답과 인계 파일 수정 시각 이후 사용자가 보낸 메시지를 대화 기록에서 모음. 첫 지시는 확인 한 줄만, 해시 확인이 끝나고 새 창이 입력 준비가 되면 두 번째 지시로 '미처리 해민 요청(원문)'을 보냄. 10월 27일 이후 교대 요청 20번에서 21건을 모았고, 교대가 끝난 11번에서 11건 전달

10월 13일 교대 뒤 보충 기록에는 이런 문장이 있습니다. 이전 창의 입력란에 보내지 않은 문구 “툰은 1번·3번, 블로그는 2번·5번으로 해줘”가 보였다는 내용입니다.

그게 제가 쓴 건지 AI가 제안해 둔 건지, 보낸 건지조차 확인되지 않았습니다. 그 기록은 그 문구를 실행하지 않고 참고로만 남겼습니다.

교대 사이에 보낸 말이 묻히지 않게, 10월 26일부터는 교대할 때 한 번 더 모읍니다.

  1. 이전 대화 기록에서 마지막 최종 답 이후 제가 보낸 메시지를 찾습니다.
  2. 인계 파일을 쓴 시각 이후의 메시지도 합칩니다.
  3. 시스템 알림·훅 문장·교대 지시는 뺍니다.
  4. 해시 확인이 끝난 뒤 두 번째 메시지로 “미처리 해민 요청(원문)“을 보냅니다.

원문을 첫 지시에 섞지 않는 이유가 있습니다. 첫 답은 도구를 쓰지 않는 확인 한 줄이어야 하는데, 요청이 같이 오면 확인보다 그 일을 먼저 시작할 수 있어서 둘을 나눴습니다.

10월 27일 이후 교대 요청 20번에서 제 메시지 21건을 모았습니다. 교대까지 끝난 11번에서 11건이 새 창으로 넘어갔고, 나머지 9번은 확인이 안 돼 그때 이전 창을 그대로 남겼습니다.

남긴 이전 창에는 제 메시지가 그대로 있어서 지워지지는 않습니다. 대화 기록을 읽지 못하면 “미확인”으로 표시하고 교대는 진행합니다.

손으로 갈아탈 때는 더 간단하게 막을 수 있습니다. 인계 파일을 쓰게 한 다음에는 이전 대화에 새 지시를 보내지 않습니다.

그 뒤에 생각난 말은 새 대화에 보냅니다. 이미 보냈다면 새 대화의 첫 확인이 끝난 뒤 그 문장을 그대로 다시 붙여 넣습니다.

열하루 기록에서 멈춘 곳은 이랬습니다

완료 97번의 반대편에는 교대를 멈춘 요청이 있습니다. 멈출 때는 늘 이전 창을 지우지 않고 남깁니다.

10월 20일~30일에 시작된 교대 요청 136개의 최종 결과. 교대 완료 97(이전 창 바로 닫힘 74, 작업 정리 뒤 닫힘 23, 17개 프로젝트). 멈춘 요청: 실패 뒤 이전 창이 없어져 기록만 보관 19, 승인 없음 6, 확인 실패 뒤 새 창 채택 4, 같은 창 중복 요청 3, 승인 만료 2, 잠금 경합 2, 창 신원 확인 실패 1, 재개 확인 실패 1, 인계 확인 안 됨 1

10월 20일~30일에 시작된 교대 요청은 136개입니다. 요청 하나가 예약·정리 중·완료처럼 기록을 여러 줄 남기기 때문에, 요청마다 마지막 결과 하나로 묶었습니다.

최종 결과요청 수뜻
교대 완료97바로 닫힘 74 + 작업 정리 뒤 닫힘 23, 17개 프로젝트
실패 뒤 기록만 보관19확인이 안 돼 멈췄고, 그 뒤 이전 창도 없어짐
승인 없음6교대하지 않음
확인 실패 뒤 새 창 채택4새 창의 확인 기록을 따로 검사해 이어받게 함
같은 창 중복 요청3두 번째 예약을 만들지 않음
승인 만료·잠금 경합각 2이전 창 유지
신원 확인 실패·재개 확인 실패·인계 확인 안 됨각 1이전 창 유지

“승인 없음”은 고장이 아닙니다. 자동 교대는 제가 “이 폴더는 알아서 교대해도 된다”고 한 번 승인해 둔 폴더에서만 돕니다.

그 승인은 폴더 단위로 남고, 제가 철회할 때까지 유지됩니다. 승인이 없는 폴더에서는 창 관리 스크립트가 교대를 거부하고 이전 창을 그대로 둡니다.

이미 쓰고 있다면 이 세 줄을 가져가세요

자동화의 뼈대는 지시 파일 한 줄, 훅 하나, 인계 파일 네 제목입니다. 창 관리 스크립트가 없어도 앞의 둘은 그대로 쓸 수 있습니다.

가져갈 세 가지를 나란히 놓은 화면. 전역 지시 파일의 세션 교대 한 줄(맡은 일이 남고 약 30만 토큰을 넘거나 주제가 바뀌면 스스로 교대, 절차는 정본 문서 한 곳), 30만 토큰 알림 훅 설정, HANDOFF.md 네 제목 템플릿

제 전역 지시 파일에는 교대에 관한 줄이 하나뿐입니다. Herdr는 제가 쓰는 작업 창 관리 도구 이름이고, 절차는 그 도구의 문서 한 곳에 두고 길만 안내합니다.

- Session lifetime: workers start fresh per job. Inside Herdr, when user-assigned
  work remains and context passes about 300K tokens or the topic changes,
  or the user asks ("교대해줘"), roll over by yourself without asking,
  exactly as `~/…/README.md` "상시 자동 교대 정책" says (…);
  that file is the only source for this procedure.
  Outside Herdr, write the handoff to … the project record and continue in a new session.

지시 파일을 나누는 방식은 지시 파일, 전역 한 장·프로젝트 한 장에 따로 적었습니다. 여기서는 교대 줄만 봅니다.

훅은 내려받기 파일로 올려 두었습니다. 제 훅에서 창 관리 스크립트 부분을 빼고, “새 세션을 권하라”까지만 하는 판입니다.

mkdir -p ~/.claude/hooks
cp context-budget-hook.py ~/.claude/hooks/ && chmod +x ~/.claude/hooks/context-budget-hook.py
# ~/.claude/settings.json 의 "hooks"에 추가
#   "UserPromptSubmit": [{"hooks": [{"type": "command",
#       "command": "$HOME/.claude/hooks/context-budget-hook.py", "timeout": 3}]}]
# 기준을 바꾸려면 command 앞에 붙임:
#   "command": "CONTEXT_BUDGET_TOKENS=150000 $HOME/.claude/hooks/context-budget-hook.py"

설치 전에 /context로 대화 창 크기를 먼저 봅니다. 창이 20만 토큰인 환경에서는 그 근처에서 자동 요약이 먼저 돌아 30만에 닿지 않으니, 기준을 15만 정도로 낮춰 둡니다.

이 훅은 글을 쓰면서 실제 대화 기록(마지막 길이 약 43만 토큰)에 돌려 봤습니다. 첫 번째는 알림 문장을 냈고, 같은 대화로 두 번째 돌렸을 때는 아무것도 내지 않았습니다.

템플릿 전문입니다.

# 인계 (날짜, 한 줄 상황)

- 정한 것:
  - [확정된 결정] → 근거: [파일 경로 또는 커밋]
- 맡은 일:
  - [남은 일 1]: 지금 상태, 끝나면 할 다음 단계
  - [돌고 있는 작업]: 식별자 [ID] · 상태 [진행 중/끝남] · 결과 위치 [경로]
- 상시 작업: 없음
- 참고:
  - [설명·도구 위치·다른 세션 파일]
  - 승인 대기(실행 금지): [항목]

창을 닫으면 멈추는 프로세스가 있다면 상시 작업: 없음 대신 이렇게 씁니다.

- 상시 작업:
  - 미리보기 서버 [포트]: 이 창을 닫으면 멈춤. 다시 띄우기: [명령]

오늘 해 볼 것

지금 가장 오래 쓰고 있는 AI 대화에 첫 절의 프롬프트를 붙여 넣어 HANDOFF.md를 한 장 남겨 보세요. 새 대화가 해시와 한 줄 요약을 맞게 답하면 첫 교대는 끝입니다.

템플릿·프롬프트 두 개·훅 설치법은 인계 키트 파일에, 훅 스크립트는 context-budget-hook.py에 있습니다.

무료 도구

영어 수업에 필요한 자료, 무료 도구로 직접 만들어 보세요

단어 시험지·지문 분석·변형문제·문항 검사 도구를 한곳에서 고를 수 있습니다.

무료 도구 열기 →

새 글 소식

새 글이 나오면 메일로 알려 드립니다.

새 글 주소와 한 줄 요약만 보냅니다. 광고는 보내지 않습니다.