- 출처: Anthropic 블로그 A harness for every task: Dynamic workflows in Claude Code (Thariq Shihipar, Sid Bidasaria).
- 동적 워크플로우: Claude가 작업에 맞는 멀티 에이전트 하네스를 즉석에서 JavaScript로 작성해 실행하는 것.
- 스크립트가 여러 서브에이전트를 생성·조정한다. 각 서브에이전트는 독립 컨텍스트 윈도우 + 좁은 목표를 갖는 별개의 Claude 인스턴스다.
- 핵심 메시지: 기본 하네스(단일 컨텍스트에서 계획과 실행을 동시에)는 길고 큰 작업에서 구조적으로 무너진다. 작업 형태에 맞춰 하네스 자체를 갈아끼우는 것이 해법이다.
왜 단일 에이전트로는 부족한가
- 기본 Claude Code는 하나의 컨텍스트 윈도우 안에서 계획·실행을 함께 처리한다. 복잡한 멀티파트 작업에서 세 가지 실패 모드가 나타난다.
- 에이전트 태만(agentic laziness): “50개 중 35개 했으니 됐다"며 조기 종료한다. 부분 완료 상태로 멈춘다.
- 자기선호 편향(self-preferential bias): 자기 산출물을 스스로 검증하면 자기 결과를 편들어 객관적 평가가 안 된다.
- 목표 표류(goal drift): 장시간 작업 뒤 원래 목표에서 벗어난다. 컨텍스트 요약 과정에서 엣지 케이스·제약 조건이 소실된다.
- 서브에이전트로 쪼개면 각 에이전트가 좁은 목표만 보므로 이 세 가지가 구조적으로 억제된다.
정적 워크플로우 vs 동적 워크플로우
| 정적 워크플로우 | 동적 워크플로우 | |
|---|---|---|
| 작성 주체 | 사람이 미리 작성 (Agent SDK, claude -p) | Claude(Opus 4.8)가 요청 시 즉석 작성 |
| 범용성 | 모든 엣지 케이스에 대응하려 범용적이어야 함 | 이번 작업 하나에만 맞춘 전용 하네스 |
| 비용 | 재사용 시 저렴 | 대체로 토큰을 더 많이 씀 |
- 반복적으로 쓸 하네스는 정적으로 굳혀두고, 일회성·고가치 작업은 동적으로 그때그때 짜는 것이 요지.
작동 방식
- 워크플로우는 특수 함수를 담은 JavaScript 파일을 실행한다. 서브에이전트 생성·조정 함수 + 표준 JS(JSON, Math, Array 등)를 쓴다.
- 모델 선택: 하위 작업별로 알맞은 모델(Sonnet/Opus 등)을 고를 수 있다.
- 워크트리 격리: 서브에이전트를 독립된 작업 디렉터리에서 돌려 서로 간섭하지 않게 한다.
- 중단·재개: 중간에 끊겨도 마지막 진행 지점부터 이어서 재개한다.
워크플로우 패턴
- 분류-후-실행(classify-and-act): 분류 에이전트가 작업 유형을 판정해 알맞은 에이전트로 라우팅한다.
- 팬아웃-후-통합(fan-out-and-synthesize): 큰 작업을 소작업으로 쪼개 각각 에이전트를 붙이고, 합성 단계가 결과를 구조화해 병합한다. 소작업이 많거나 컨텍스트 교차오염을 피하고 싶을 때 유용하다.
- 적대적 검증(adversarial verification): 산출물마다 별도 검증 에이전트가 룰북·기준에 대고 반증을 시도한다. 자기선호 편향을 차단하는 핵심 장치.
- 생성-후-필터(generate-and-filter): 아이디어를 다량 생성 → 중복 제거 → 룰북으로 최상위만 선별.
- 토너먼트(tournament): N개 에이전트가 서로 다른 접근으로 같은 작업을 시도하고, 판정 에이전트가 쌍대비교로 우승자를 고른다.
- 완료까지 반복(loop until done): 고정 횟수가 아니라 정지 조건(새 발견 없음, 에러 없음)까지 돈다. 꼬리에 남은 케이스를 놓치지 않는다.
활용 사례
- 마이그레이션·리팩터링: Bun이 Zig→Rust 재작성 때 콜사이트·실패 테스트·모듈별로 서브에이전트를 띄우고, 다른 에이전트가 적대적으로 검토한 뒤 병합했다.
- 심층 조사: 웹 검색을 팬아웃 → 소스 수집 → 주장을 적대적으로 검증 → 인용 붙은 보고서 합성 (
/deep-research가 이 형태). - 대규모 분류: 지원 큐·버그 리포트를 자동 분류·중복 제거·조치. 공개 콘텐츠를 읽는 에이전트와 고권한 작업 에이전트를 분리하는 격리(quarantine) 패턴을 쓴다.
- 근본 원인 조사: 로그·파일·데이터별로 독립 가설 에이전트를 세워 병렬 검증. 자기선호 편향을 피한다.
- 규칙 개선: 최근 세션과 코드 리뷰를 채굴해 반복 수정 패턴을 뽑아
CLAUDE.md규칙으로 역산출한다. - 정렬: 1000행 이상을 한 프롬프트로 정렬하면 품질이 떨어지므로, 토너먼트·쌍대비교 파이프라인·병렬 버킷 랭킹으로 나눈다.
언제 쓰고, 언제 쓰지 말까
- 쓴다: 길고, 대규모 병렬이고, 고도로 구조화됐거나 적대적 검증이 필요한 고가치 작업.
- 안 쓴다: 평범한 코딩(리뷰어 5명 패널이 과함), 병렬화·조정 비용이 정당화 안 되는 단순 작업, 토큰 효율이 중요한 경우.
- 토큰을 더 쓰므로 명시적 예산(“10k 토큰만 써”)을 걸 수 있다.
저장·트리거
- 좋은 워크플로우는
s키로 저장 →~/.claude/workflows에 체크인하거나 스킬(JS 파일 +SKILL.md)로 배포해 재사용한다. - 트리거: “워크플로우 만들어줘” 프롬프트가 기본.
/ultracode키워드로 워크플로우 사용을 강제하고,/goal+/loop로 정기 분류·조사 같은 반복 작업에 물릴 수 있다. - 작은 작업은 “빠른 워크플로우”(예: 빠른 적대적 리뷰)로도 요청 가능.