서론
2026년 5월, Claude Code에 조용하지만 구조적으로 중요한 세 가지 변경 사항이 도입되었습니다.
저는 CreoLab 미디어 운영 파이프라인 (6+1 플랫폼 일일 운영)의 Phase 단위 자동화를 매일 다루고 있으며, 이 세 가지는 단독 기능이라기보다 "조합했을 때 비로소 효과를 발휘하는" 성격을 띠고 있었습니다. 본 기사에서는 구현 관점에서 순서대로 정리하겠습니다.
1. skills 검색창 — skill을 "자산화"하는 업데이트
지금까지 Claude Code의 skills는 파일명으로 기억하거나 도움말에서 목록을 표시하는 방법밖에 없었습니다. skill이 너무 많아지면 "그 skill 이름이 뭐였더라" 하는 지점에서 반드시 멈추게 됩니다.
5월 업데이트로 / 메뉴에서 skill 이름과 description을 모호 검색(fuzzy search)할 수 있게 되었습니다. 사소한 UI 개수로 보일 수 있지만, 이는 "skill을 늘릴수록 운영이 무거워지는" 스케일링(scaling) 문제에 대한 정면 대응입니다. 제 로컬 환경에서는 200개가 넘는 skills가 나열되고 있는데, 검색 기능이 도입된 순간 운영 부하가 낮아졌습니다.
CreoLab의 견해로는, 이는 skills를 "일회용이 아닌 자산"으로 키워나가는 설계 판단을 뒷받침하는 변경입니다.
2. async hooks — Phase의 종단에서 부작용(side effect)을 기다리지 않기
PostToolUse hooks에 async: true 플래그가 추가되었습니다.
기존의 hooks는 동기(synchronous) 실행 방식이었기에, 시간이 오래 걸리는 부작용 (Discord 알림, 이미지 생성, 파일 동기화 등)을 hook에 작성하면 다음 툴 호출까지 Claude Code가 멈춰 있었습니다. async: true를 설정하면 hook은 백그라운드로 분리되어 메인 플로우는 즉시 다음 단계로 진행됩니다.
CreoLab 파이프라인에 대입하면, master.md 작성 후의 Discord webhook 알림 (수백 ms)과 images.yaml 기반의 scripts/generate-image.ts 호출 (1분 이상)이 이에 해당합니다. 동기 hook 시대에는 master 완료 → 이미지 생성 완료 대기 → packager 그룹 기동이라는 직렬 구성이었으나, async hook 도입 후에는 master 완료와 동시에 packager 그룹과 이미지 생성이 병렬로 실행됩니다. 체감상 30~60초 정도 단축되었습니다.
단, async hook에는 실패 핸들링(failure handling)이라는 별도의 과제가 발생합니다. 백그라운드로 분리한 부작용이 실패했을 때, 누가 그것을 포착할 것인가의 문제입니다. CreoLab에서는 작은 wrapper를 한 겹 끼워 넣는 구성으로 운영하고 있습니다.
#!/usr/bin/env bash
set -o pipefail
...
3. HTTP hooks — Claude Code를 "외부 서버의 기점"으로 바꾸기
더욱 중대한 변경은, hook에서 외부 web server로 HTTP POST를 할 수 있게 되었다는 점입니다.
{
"hooks": {
"PostToolUse": [
...
지금까지 hooks는 로컬의 쉘 스크립트 실행으로 한정되어 있었습니다. HTTP hook이 도입됨으로써, Claude Code는 "로컬에서 툴을 호출하는 도구"에서 "외부 서비스로 이벤트를 발화시키는 기점"으로 역할이 확장됩니다.
CreoLab 파이프라인에 대한 응용으로서 가장 유효한 것은 Buffer / Zenn API / Qiita API로의 게시 예약 hook입니다. 기존에는 사람이 직접 tsx scripts/post-to-buffer.ts를...
직접 tsx scripts/post-to-buffer.ts를 실행하던 공정을 Phase 4 packager의 완료 hook (completion hook)으로서 직접 POST 하면, Phase 5 (Buffer Drafts 투입) 단계를 1단계 단축할 수 있습니다.
단, HTTP hook 설정은 그대로 git에 올라가기 때문에, 토큰을 직접 하드코딩(hard-coding)하지 않는 것이 중요합니다. .env를 읽는 wrapper를 경유하거나, bodyTemplate 내에서 $ENV_VAR 전개를 사용하는 설계로 통일합니다.
4. CreoLab 파이프라인으로의 통합 — Phase 구성의 재작성
세 가지 점을 정리하면, Phase 구성은 다음과 같이 다시 그릴 수 있습니다.
- Phase 1 (리서치): skills 검색으로
researcher skill을 즉시 기동
- Phase 2 (소재 선정): topic-selector 완료의 async hook으로 Discord 알림
- Phase 3 (master 생성): master-writer 완료의 async hook으로 이미지 생성을 병렬 기동
- Phase 4 (packager 병렬): 각 packager 완료의 HTTP hook으로 Buffer Drafts에 직접 투입
- Phase 5 (인간 리뷰): 게시 전 30분 리뷰에 집중
CreoLab의 설계 판단으로서, async hook과 HTTP hook은 'L3 완전 자동 게시로 나아가는' 변경이 아니라, 'L2 (초안까지 자동 + 인간 리뷰 30분) 상태를 유지하면서, 인간 이외의 대기 시간을 줄이는' 구조적 개선입니다.
5. 세 가지 함정
구현할 때 피해야 할 세 가지 함정을 공유합니다.
- async hook의 실패가 조용히 어둠 속으로 사라짐 — stderr를 반드시 errors 채널로 전송하는 wrapper를 하나 끼워 넣을 것
- HTTP hook의 인증 정보를 직접 작성하기 쉬움 —
.env를 경유하거나 은닉 wrapper script를 통해 호출할 것
- PreToolUse와 PostToolUse의 책임 모호화 — '결과를 보고 부작용(side effect)을 일으킴'은 PostToolUse, '결과를 내기 전에 확인/거부'는 PreToolUse라고 원칙을 명문화할 것
요약
5월의 세 가지 업데이트는 화려한 기능 추가는 아니지만, 'skills와 hooks를 늘릴수록 로컬 운영이 무거워진다'는 스케일링(scaling) 문제에 대한 구조적 해답입니다. 저 자신도 async hook 도입 후 CreoLab Phase 4 기동 시간이 체감상 30~60초 단축되었습니다.
skills와 agents가 늘어날수록, 자신의 로컬 환경은 작은 코드베이스가 되어갑니다. 100 skills를 넘어가는 시점부터는 설계를 조망할 도구가 필요해집니다.
참고
관련 제품