Claude Code가 긴 작업을 수행하다 중간에 멈추는 이유와 이를 계속 진행하게 만들기 위해 내가 구축한 Harness
요약
Claude Code가 긴 작업 중 질문을 던지며 멈추는 문제를 해결하기 위해 오픈 소스 플러그인인 Nightshift를 소개합니다. Nightshift는 Markdown 기반의 펀치 리스트와 비차단형 질문 처리 방식을 통해 에이전트가 중단 없이 작업을 지속할 수 있도록 돕습니다.
핵심 포인트
- Nightshift는 Markdown 파일을 단일 원천으로 사용하여 작업 상태를 유지함
- 체크되지 않은 항목이 남은 경우 Claude의 조기 종료를 방지하는 중단 훅 제공
- 비차단형 질문은 'Parking Lot'에 저장하여 작업 흐름을 방해하지 않고 비동기적으로 처리
- 컨텍스트 압축이나 세션 재시작 후에도 작업 복구가 가능한 구조
나는 Claude Code에게 긴 작업 목록을 주고 자리를 비웠다가 돌아오면, Claude가 쉬운 부분만 완료하고 어려운 부분에 도달하기 전에 멈춰 있는 것을 발견하곤 했습니다.
때로는 상황이 더 나빴습니다.
Claude는 새벽 2시까지 작업하다가, 중요하지 않은 질문 하나를 던진 뒤, 내가 아침 8시에 일어날 때까지 6시간 동안 아무것도 하지 않고 가만히 앉아 있곤 했습니다.
그 질문은 대개 합리적이었지만, 진정으로 작업을 막는 요소는 아니었습니다. Claude는 안전한 기본값(safe default)을 선택하여 작업을 계속하고, 결정 사항은 나중에 내가 검토할 수 있도록 남겨둘 수도 있었습니다.
이것은 모델만의 문제가 아니라 Harness (하네스)의 문제입니다. 에이전트 루프 (agent loop) 주변의 레이어가 무엇이 "완료"인지, 언제 실행을 멈출 것인지, 그리고 인간의 입력이 불가능할 때 어떤 일이 일어날지를 결정하기 때문입니다.
이러한 문제로 인해 나는 사람이 지켜보지 않는 긴 Claude Code 세션을 위한 오픈 소스 신뢰성 Harness 플러그인인 Nightshift를 만들게 되었습니다.
대화 외부에서 작업 유지하기
Nightshift는 지속 가능한 Markdown 펀치 리스트 (punch list)를 신뢰할 수 있는 단일 원천 (source of truth)으로 사용합니다.
# Nightshift Punch List
- [ ] Add rate limiting
...
Claude는 리스트의 항목을 한 번에 하나씩 처리합니다.
작업 내용이 현재의 컨텍스트 윈도우 (context window) 내부에만 저장되는 것이 아니라 파일에 저장되기 때문에, 세션은 컨텍스트 압축 (context compaction), 중단 또는 재시작 이후에도 복구될 수 있습니다.
조용한 조기 종료 방지
Nightshift에는 Claude가 작업을 마치려 할 때마다 펀치 리스트를 확인하는 중단 훅 (stop hook)이 포함되어 있습니다.
체크되지 않은 항목이 남아 있다면, 일반적인 종료는 차단되며 Claude에게 계속 진행하도록 지시합니다.
작업 교대(shift)는 오직 다음과 같은 경우에만 종료됩니다:
- 모든 항목이 완료되었을 때
- 마감 기한에 도달했을 때
- 선택적인 지연 제한 (stall limit)에 도달했을 때
- 또는 소유자가 명시적으로 중단했을 때
지연 제한이 설정되지 않은 경우, 지연된 작업은 조용히 퇴근하는 대신 그대로 유지되며 눈에 띄게 플래그(flag)가 지정됩니다.
이는 단순히 Claude에게 "끝날 때까지 계속하라"고 프롬프팅하는 것보다 강력한데, 완료 조건이 지속적인 상태 (persistent state)를 바탕으로 확인되기 때문입니다.
비차단형 질문이 밤을 멈추게 해서는 안 됩니다
대부분의 Human-in-the-loop (인간 참여형) 시스템은 에이전트에게 질문이 생길 때마다 작업을 일시 중지합니다.
파괴적이거나 위험도가 높은 결정의 경우에는 그것이 타당합니다. 하지만 모든 명명 규칙(naming choice), 구현 선호도(implementation preference), 또는 되돌릴 수 있는 결정(reversible decision)에 대해 그렇게 하는 것은 타당하지 않습니다.
Nightshift 세션 동안, 비차단형 질문(non-blocking questions)은 Claude가 선택한 기본값과 함께 주차(parked)됩니다.
## Parking Lot (주차장)
- 질문: 엔드포인트가 200을 반환해야 합니까, 아니면 201을 반환해야 합니까?
...
Claude는 작업을 계속 진행하며, 개발자는 아침에 해당 결정들을 검토합니다.
목표는 인간의 감독(human oversight)을 제거하는 것이 아닙니다. 전체 세션이 대기하도록 강제하는 대신, 그러한 감독의 일부를 비동기적(asynchronous)으로 만드는 것입니다.
무인 작업을 위한 가드레일 (Guardrails for unattended work)
장시간 지속되는 자율성(autonomy)에는 명확한 경계가 필요합니다.
Nightshift는 다음과 같은 제한 사항들을 기계적으로 강제할 수 있습니다:
git push차단- 위험한 명령 거부
- 선택된 디렉토리 보호
- secret(비밀 정보)과 유사한 콘텐츠가 있는지 diff 검사
- 특정 Git identity 강제
- 비차단형 질문이 세션을 일시 중지하는 것을 방지
"push 하지 마세요"라고 말하는 프롬프트는 도움이 됩니다.
git push를 거부하는 훅(hook)은 더 강력합니다.
이러한 가드레일은 보안 샌드박스(security sandbox)는 아니지만, 모델이 모든 지침을 기억하는 것에만 의존할 때 발생하는 리스크를 줄여줍니다.
완료 전 검증 (Verification before completion)
체크 표시가 되었다 하더라도, 그것은 여전히 에이전트가 주장하는 바일 뿐입니다.
Nightshift는 구현이 올바르다는 것을 보장하거나 코드 리뷰(code review)를 대체할 수는 없습니다. Nightshift가 할 수 있는 일은 더 규율 있는 워크플로우(workflow)를 강제하는 것입니다:
- 변경 사항 구현
- 관련 검증(verification) 실행
- 결과 검사
- 완료된 항목 커밋(commit)
- 체크박스를 완료로 표시
검증에는 다음과 같은 명령어가 포함될 수 있습니다:
npm test
npm run lint
npm run typecheck
Nightshift는 또한 완료된 항목당 하나의 커밋을 권장하며, 이를 통해 실행 내용을 더 쉽게 검사하거나 부분적으로 되돌릴(revert) 수 있게 합니다.
재개 가능성 및 영수증 (Resumability and receipts)
Nightshift는 펀치 리스트(punch lists), 주차된 질문, 로그(logs), 마감일(deadlines), 중지 신호(stop signals), 그리고 완료 스냅샷(completion snapshots)을 포함한 운영 상태를 .nightshift/ 내부에 저장합니다.
이 상태는 메인 프로젝트 저장소(repository)와는 별개로 자체적인 로컬 Git 히스토리(history)를 가질 수 있습니다.
이를 통해 개발자에게는 두 가지 서로 다른 기록이 제공됩니다:
- 무엇이 변경되었는지 보여주는 프로젝트 커밋(project commits)
- 실행 중에 어떤 일이 일어났는지 보여주는 Nightshift 영수증(receipts)
만약 세션이 중단되더라도, 새로운 세션이 동일한 상태를 검사하여 남은 작업부터 계속 진행할 수 있습니다.
Nightshift가 해결하지 못하는 것
Nightshift는 환각(hallucinations)을 제거하지 않습니다.
Nightshift는 다음을 보장하지 않습니다:
- 완료된 모든 항목이 실제로 정확한지
- 테스트가 모든 요구사항을 충족하는지
- 선택된 모든 기본값(default)이 적절한지
- 모든 안전하지 않은 명령어가 탐지되는지
- 잘못 작성된 작업 목록(task list)이 좋은 결과를 만들어내는지
Nightshift는 Claude Code 주변에 지속성(persistence), 제약 조건(constraints), 검증 습관(verification habits), 재개 가능성(resumability), 그리고 가시성(visibility)을 추가합니다.
여전히 인간의 검토(Human review)가 필요합니다.
설치 방법
Claude Code 내부에서:
/plugin marketplace add orwa-mahmoud/claude-nightshift
/plugin install nightshift
그 다음 프로젝트 내부에서 초기화합니다:
/nightshift:setup
생성된 펀치 리스트(punch list)를 검토하고 교대 근무를 시작합니다:
/nightshift:start
개요 및 FAQ:
https://orwamahmoud.com/nightshift/
Nightshift는 무료이며, 오픈 소스이고, MIT 라이선스를 따릅니다.
기여(Contributions), 이슈(issues), 그리고 피드백을 환영합니다:
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기