글만든 이유와 원리

작업 중에 보낸 메시지는 언제 Claude에게 닿을까: /next를 만든 이유

Claude Code가 일하는 동안 보낸 일반 메시지는 도구 호출 사이에 끼어듭니다. 슬래시 명령은 턴이 끝날 때까지 기다립니다. 이 차이를 이용해 한 줄짜리 스킬을 만들고, 실제 세션으로 검증했습니다.

터미널에 /next 명령을 입력한 화면

Claude Code에게 버그 수정을 맡겨 두고 화면을 보다 보면, 다음에 시킬 일이 떠오릅니다. “아, 빈 목록일 때 테스트도 하나 있어야겠다.” 잊어버리기 전에 바로 입력해서 보냅니다.

그런데 이 메시지는 지금 작업이 끝난 뒤가 아니라, 작업 도중에 Claude에게 전달됩니다. 정확히는 지금 실행 중인 도구 호출(파일 읽기, 명령 실행 등)이 하나 끝나는 즉시입니다. 버그를 고치다가 테스트를 돌리기도 전에 새 요청이 끼어들고, Claude는 두 가지를 한 번에 처리하려고 합니다. 결과적으로 두 요청이 한 답변 안에 섞이고, 처음 맡긴 일의 마무리(테스트 실행 같은)가 흐려지기도 합니다.

끼어드는 게 원래 의도된 동작이다

버그처럼 보이지만 Claude Code 문서에 적힌 의도된 동작입니다. 작업 중에 보낸 일반 메시지가 곧바로 반영되는 덕분에 진행 중인 작업의 방향을 바로잡을 수 있습니다. “그 파일 말고 다른 파일이야” 같은 말은 빨리 전달될수록 좋습니다.

같은 문서에 다른 동작도 적혀 있었습니다. 슬래시 명령은 지금 턴이 끝날 때까지 기다렸다가 실행됩니다. 그렇다면 “다음 할 일”을 슬래시 명령으로 보내면 원하는 순서가 됩니다. 문제는 그런 슬래시 명령이 없다는 것뿐이었습니다.

스킬 전체가 이것이다

Claude Code의 스킬은 SKILL.md 파일 하나로 만들 수 있고, 사용자가 /이름으로 부를 수 있습니다. /next의 본문은 이게 전부입니다.

skills/next/SKILL.md
---
name: next
description: Queue a follow-up request that runs after the current turn finishes.
argument-hint: <next request>
disable-model-invocation: true
---

Treat the following as the user's follow-up request and carry it out now,
continuing from the current conversation: $ARGUMENTS

/next 뒤에 적은 내용이 $ARGUMENTS 자리에 들어가고, “이어서 처리할 다음 요청”으로 Claude에게 넘어갑니다. 기다리는 일은 스킬이 하지 않습니다. Claude Code의 명령 대기열이 원래 슬래시 명령을 턴이 끝날 때까지 붙잡아 두기 때문에, 스킬은 차례가 왔을 때 요청을 건네기만 하면 됩니다.

머리말의 disable-model-invocation: true는 중요한 한 줄입니다. 이 설정이 있으면 Claude가 스스로 이 스킬을 고를 수 없고, 사용자만 실행할 수 있습니다. 그래서 Claude가 매번 읽는 스킬 목록에도 올라가지 않습니다. 쓰기 전까지는 컨텍스트를 한 글자도 차지하지 않는다는 뜻입니다. 도구를 하나 더 설치했다고 다른 작업이 무거워지지 않습니다.

정말 기다리는지 확인하기

“문서에 그렇게 쓰여 있다”만으로는 불안했습니다. Claude Code는 자주 업데이트되고, 대기열 동작이 바뀌면 이 스킬은 조용히 원래 문제로 돌아갑니다. 그래서 실제 세션으로 확인하는 테스트(tests/verify.sh)를 만들었습니다.

  1. tmux 안에서 실제 Claude Code를 띄우고, 8초씩 걸리는 명령 세 개를 따로 실행하라는 작업을 줍니다. 끝나면 FIRST_DONE이라고만 답하게 합니다.
  2. 첫 도구 호출이 기록되어 턴이 진행 중인 것을 확인한 뒤, /next 두 개를 연달아 입력합니다. 첫 번째 /next도 여러 단계짜리 작업이라, 두 번째가 그것까지 기다리는지 볼 수 있습니다.
  3. 끝나면 세션 기록(JSONL)을 읽어, 각 요청이 언제 대기열에 들어갔고 언제 Claude에게 전달됐는지 비교합니다.

Claude Code 2.1.283(macOS)에서의 결과입니다.

tests/verify.sh 결과
✓ both /next were queued during the first turn (2/2)
✓ neither /next reached Claude during the first turn (leaks: 0)
✓ the second /next didn't reach Claude during the first /next (leaks: 0)
✓ each /next ran as its own turn (2/2)
✓ reply order: FIRST_DONE -> SECOND_DONE -> THIRD_DONE

두 요청 모두 첫 작업 도중에 대기열에 들어갔지만, 첫 작업이 끝나기 전에는 한 번도 Claude에게 닿지 않았습니다. 그리고 각자 별도의 턴으로, 입력한 순서대로 실행됐습니다. Claude Code를 업데이트한 뒤에는 이 테스트를 다시 돌려 보면 됩니다.

쓰는 법

설치
npx claude-next-skill

설치한 뒤에는 새 Claude Code 세션을 열어야 스킬이 보입니다.

  • Claude가 일하는 중에 /next 테스트 돌리고 실패하는 것 고쳐줘처럼 입력합니다.
  • 여러 개를 남기려면 하나 입력할 때마다 Enter를 누릅니다. 하나씩 차례로 실행됩니다.
  • 취소하고 싶으면 입력창이 비어 있을 때 ↑로 대기 중인 줄을 불러와 지우고 Enter를 누릅니다. Ctrl+C는 지금 하던 작업까지 멈추니 이 용도로는 쓰지 마세요.

언제 무엇을 쓰나

이렇게 나눠 쓰면 헷갈리지 않습니다.

상황보내는 방법
지금 작업의 방향이 틀렸다일반 메시지 (바로 끼어들어야 한다)
지금 작업에 조건을 하나 더하고 싶다일반 메시지
지금 작업이 끝난 뒤에 할 별개의 일/next
끝나면 확인할 것 (테스트, 정리, 커밋 메시지)/next

하지 못하는 것

  • 메인 턴이 끝나기를 기다릴 뿐, Claude가 시작한 백그라운드 작업이 끝나기를 기다리지는 않습니다.
  • 권한 확인 창은 평소처럼 뜹니다. 자리를 비운 사이 모든 걸 처리해 주지는 않습니다.
  • 내 컴퓨터에 설치하는 개인 스킬이라, 클라우드에서 도는 세션에서는 쓸 수 없습니다.

만들고 보니 스킬의 핵심은 한 줄이고, 시간이 든 건 테스트였습니다. 이런 작은 도구는 기능보다 “정말 그렇게 동작하는가”를 계속 확인할 수 있는 장치가 더 중요하다고 생각합니다. 기반이 되는 프로그램이 바뀌면 조용히 망가지기 때문입니다.

이 글에서 다룬 도구

claude-next

작업을 끊지 않는 다음 요청

자세히 보기

루샨 · lucianLabs 운영자

AI 에이전트와 일하며 필요한 도구를 직접 만들고, 그 과정에서 얻은 숫자와 시행착오를 기록합니다. 글에 틀린 내용이 있으면 알려주세요.