Claude Code pluginClaude Code 플러그인
The one holding the baton makes no sound. 바톤을 든 사람은 소리를 내지 않는다.
baton runs your Claude Code session as a pure orchestrator. It thinks, decomposes,
delegates and reviews — and a PreToolUse hook makes sure it never edits a file
itself. The rule doesn't live in a prompt where a model can talk itself out of it.
It lives in the tool layer.
baton은 Claude Code 세션을 순수 오케스트레이터로 돌린다. 사고하고, 분해하고,
위임하고, 리뷰할 뿐 직접 파일을 고치지 않는다 — PreToolUse 훅이 그것을
보장한다. 규칙이 모델을 설득할 수 있는 프롬프트가 아니라 도구 계층에 있다.
/plugin marketplace add KyongSik-Yoon/baton
Your most expensive model shouldn't be typing. 가장 비싼 모델이 타이핑을 하고 있으면 안 된다.
Telling a model to delegate is a suggestion. It holds for a few turns, then drifts back
to editing files itself — usually right when the task gets interesting enough for the
drift to matter. baton removes the option. While the flag file ~/.claude/baton
exists, the main agent's Write, Edit and NotebookEdit
are denied at the hook layer, and Bash is filtered down to read-only inspection plus
test, lint and typecheck. The deny reason is written to steer, not to scold: it names the
worker the change should have gone to.
모델에게 "위임하라"고 말하는 것은 제안일 뿐이다. 몇 턴은 지켜지다가 결국 직접 파일을
고치는 쪽으로 돌아간다 — 하필 그 이탈이 문제가 될 만큼 작업이 흥미로워지는 시점에.
baton은 그 선택지를 없앤다. 플래그 파일 ~/.claude/baton이 존재하는 동안
메인 에이전트의 Write·Edit·NotebookEdit은 훅
계층에서 거부되고, Bash는 읽기 전용 조회와 테스트·린트·타입체크로 좁혀진다. 거부 사유는
꾸짖기 위한 문구가 아니라 유도하기 위한 문구다 — 그 변경이 갔어야 할 워커를 지목한다.
Write, Edit and NotebookEdit are denied for the main agent while the mode is on. There is no verbal exception it can grant itself.
모드가 켜져 있는 동안 메인 에이전트의 Write·Edit·NotebookEdit은 거부된다. 스스로 만들어 낼 수 있는 예외는 없다.
The filter is an allowlist, not a blocklist. A wrapper like env rm -rf . reads as read-only at a glance and is exactly the shape a blocklist misses.
Bash 필터는 블록리스트가 아니라 허용리스트다. env rm -rf . 같은 래퍼는 얼핏 읽기 전용처럼 보이는데, 블록리스트가 놓치는 것이 정확히 그 형태다.
Workers never spawn workers, and the advisor never implements. The tree you review is the tree that ran.
워커는 자식을 만들지 않고, 어드바이저는 구현하지 않는다. 리뷰하는 트리가 곧 실행된 트리다.
Enforcement, not encouragement. 권고가 아니라 강제.
Two hooks do the whole job. A UserPromptSubmit hook injects the orchestrator
posture each turn so the model delegates by intent rather than by collision. A
PreToolUse hook enforces it when intent slips. Subagent calls pass the guard
untouched — and the distinction is structural, not a name check: a subagent's hook input
carries agent_id, the main agent's never does.
훅 두 개가 전부다. UserPromptSubmit 훅이 매 턴 오케스트레이터 태세를 주입해
모델이 부딪혀서가 아니라 의도적으로 위임하게 만들고, PreToolUse 훅이 그
의도가 흔들릴 때 강제한다. 서브에이전트 호출은 가드를 그대로 통과한다 — 이름 비교가 아니라
구조적 구분이다: 서브에이전트의 훅 입력에는 agent_id가 실려 오고, 메인
에이전트에는 절대 실리지 않는다.
> /baton on baton mode ON · parent=opus · advisor=fable ⏺ Edit(hooks/orchestrator-bash-filter.py) ✗ denied orchestrator mode: direct edits are disabled for the main agent. Delegate this change to a worker subagent (coder-sonnet for standard work, coder-opus48 for complex work). ⏺ Task(baton:coder-opus48) claude-opus-4-8 · high ✓ 1 file changed, 34 insertions(+), 9 deletions(-) ⏺ Bash(git diff --stat) — read-only, allowed
Read-only inspection (git diff, git log, rg, ls), test/lint/typecheck runs, and the skill's own flag-file commands. You review the diffs and re-run the validation yourself — a worker's report is a claim, not evidence.
읽기 전용 조회(git diff, git log, rg, ls), 테스트·린트·타입체크 실행, 그리고 스킬 자신의 플래그 파일 명령. 디프를 읽고 검증을 다시 돌리는 것은 오케스트레이터의 몫이다 — 워커의 보고는 증거가 아니라 주장이다.
Every mutation, including git add / commit / push. Each worker gets a narrow packet: objective, evidence as paths rather than dumps, allowed write surface, non-goals, acceptance criteria, validation command.
모든 변경, git add·commit·push까지. 각 워커는 좁은 패킷을 받는다: 목표, 덤프가 아닌 경로 형태의 근거, 허용된 쓰기 범위, 비목표, 수용 기준, 검증 명령.
Workers pinned by model ID, not by alias. 별칭이 아니라 모델 ID로 고정된 워커들.
Every worker names its model in frontmatter, so the tiers hold regardless of what the
opus alias resolves to next month. Effort is pinned too — recon runs low,
implementation runs medium to high, adversarial review runs xhigh.
모든 워커가 frontmatter에 모델 ID를 직접 적는다. 다음 달에 opus 별칭이
무엇으로 해석되든 계층이 그대로 유지된다는 뜻이다. Effort도 고정된다 — 정찰은 low,
구현은 medium~high, 적대적 리뷰는 xhigh.
baton:coder-opus48
Complex implementation, cross-file refactors, the debugging that doesn't yield on the first read.
복잡한 구현, 파일을 넘나드는 리팩터, 한 번 읽어서는 풀리지 않는 디버깅.
baton:coder-sonnet
Standard implementation with clear acceptance criteria, test writing, moderate fixes.
수용 기준이 분명한 표준 구현, 테스트 작성, 중간 난도 수정.
baton:scout
Mechanical read-only recon — file discovery, pattern scanning, bulk evidence. The built-in Explore would inherit the expensive session model; this one doesn't.
기계적인 읽기 전용 정찰 — 파일 탐색, 패턴 스캔, 대량 근거 수집. 내장 Explore는 비싼 세션 모델을 상속받지만 이쪽은 아니다.
baton:scout-sonnet
Recon that needs interpretation rather than scanning: ambiguous code, scattered evidence, hypothesis forming.
스캔이 아니라 해석이 필요한 정찰: 모호한 코드, 흩어진 근거, 가설 수립.
baton:reviewer-xhigh
Adversarial read-only review of high-consequence diffs. It produces findings, never commits — any resulting fix goes back through a coder as a normal stage.
고위험 디프에 대한 적대적 읽기 전용 리뷰. 결과물은 지적 사항이지 커밋이 아니다 — 수정은 다시 코더에게 정상 스테이지로 내려간다.
baton:advisor
A persistent, read-only senior advisor. Spawned once and continued via SendMessage so it accumulates context, rather than respawned per question.
세션 내내 살아 있는 읽기 전용 시니어 어드바이저. 질문마다 새로 띄우지 않고 한 번 띄운 뒤 SendMessage로 이어 써서 맥락을 쌓는다.
scout-sonnet is for, and choosing between them is a real decision,
not a default.
정찰 비용은 input 토큰이 지배하는데, effort 설정은 거기서 아무것도 줄여주지
못한다. Sonnet 5의 토크나이저는 같은 텍스트에 약 30% 더 많은 토큰을 쓰기 때문에 3배의 스티커
가격 차가 실질 4배 가까이 벌어진다. 진짜로 해석이 필요한 정찰은 Haiku의 floor를 넘는다 —
scout-sonnet은 그때 쓰는 것이고, 둘 사이의 선택은 기본값이 아니라 실제 판단이다.
The parent is a profile, not an assumption. 부모 모델은 전제가 아니라 프로파일이다.
Same enforcement, two economics. What changes between profiles is only where escalation triggers resolve — the guard is identical either way.
강제는 같고 경제성만 다르다. 프로파일에 따라 달라지는 것은 에스컬레이션 트리거가 어디서 해소되는지뿐이며, 가드 자체는 양쪽 모두 동일하다.
Cheap orchestration, imported judgment저비용 오케스트레이션, 수입한 판단력
Opus 5 holds the baton. Fable 5 is the scarce resource, so it lands only where it changes the outcome: one persistent advisor, consulted at the mandatory triggers and nowhere else.
Opus 5가 바톤을 든다. Fable 5는 희소 자원이므로 결과를 바꾸는 곳에만 투입된다 — 지속형 어드바이저 하나를, 필수 트리거에서만.
- with advisor=none
- advisor=none일 때
- Triggers still fire. Design and ambiguity go to you via AskUserQuestion; the final review routes to
reviewer-xhigh, because a subtle correctness review isn't something a user can answer on the model's behalf. - 트리거는 그대로 발동한다. 설계·모호성은 AskUserQuestion으로 사용자에게 가고, 최종 리뷰는
reviewer-xhigh로 간다 — 미묘한 정합성 리뷰는 사용자가 대신 답해 줄 수 있는 종류가 아니기 때문이다.
Top-tier judgment conducting directly최상위 판단력이 직접 지휘
Fable 5 holds the baton and is itself the top judgment tier. Escalating a judgment call to another Fable would just outsource its own job, so design and ambiguity triggers get decided in place. Implementation still goes to the cheap pinned workers.
Fable 5가 바톤을 들고, 스스로가 최상위 판단 티어다. 판단을 또 다른 Fable에게 넘기는 것은 자기 일을 외주 주는 것이므로 설계·모호성 트리거는 그 자리에서 결정한다. 구현은 여전히 저렴한 핀 고정 워커의 몫이다.
- what still leaves the session
- 그래도 밖으로 나가는 것
- Only the final review — routed to
reviewer-xhighfor independence rather than capability. Its value is a fresh context outside the history that produced the change. - 최종 리뷰뿐이다 — 능력이 아니라 독립성을 위해
reviewer-xhigh로 보낸다. 그 가치는 변경을 만들어 낸 히스토리 바깥의 새 맥락에 있다.
The four mandatory triggers네 가지 필수 트리거
Not optional, and identical under both profiles. A floor against under-consulting, and a ceiling against outsourcing the orchestrator's own job. 선택이 아니고, 두 프로파일에서 동일하다. 자문을 너무 안 구하는 것에 대한 하한선이자, 오케스트레이터가 자기 일을 외주 주는 것에 대한 상한선.
- Lasting design decisions. Public interfaces, data models, irreversible migrations. 오래 남는 설계 결정. 공개 인터페이스, 데이터 모델, 되돌릴 수 없는 마이그레이션.
- Twice-failed validation. A stage that fails twice after a tier escalation always moves — it never retries in place. 두 번 실패한 검증. 티어를 올린 뒤에도 두 번 실패한 스테이지는 반드시 이동한다 — 제자리 재시도는 없다.
- Conflicting evidence. Requirements ambiguity that blocks decomposition, rather than merely complicating it. 충돌하는 근거. 단순히 성가신 정도가 아니라 분해 자체를 막는 요구사항 모호성.
- Final review of a high-consequence change. Security-sensitive, destructive, or hard to roll back. 고위험 변경의 최종 리뷰. 보안에 민감하거나, 파괴적이거나, 되돌리기 어려운 변경.
Three lines to hand over the baton. 바톤을 넘기는 데 세 줄.
The plugin install is what makes the mode enforce anything — the hooks ship with the
plugin. A manual checkout has to wire orchestrator-guard.sh (PreToolUse) and
orchestrator-mode.sh (UserPromptSubmit) into settings itself.
모드가 실제로 뭔가를 강제하려면 플러그인 설치가 필요하다 — 훅이 플러그인과 함께
배포되기 때문이다. 수동 체크아웃은 orchestrator-guard.sh(PreToolUse)와
orchestrator-mode.sh(UserPromptSubmit)를 settings에 직접 연결해야 한다.
/plugin marketplace add KyongSik-Yoon/baton
/plugin install baton@baton
/baton on
fable under an Opus parent, none under a Fable one.부모 프로파일은 세션 자신의 모델 정체성에서 자동으로 잡힌다. advisor 기본값은 Opus 부모면 fable, Fable 부모면 none.Commands명령
/baton on advisor=noneOpus parent without Fable at all — e.g. once the quota is spent.Fable 없이 Opus 부모로 — 예컨대 쿼터를 다 썼을 때./baton on parent=fablePick the Fable-parent profile explicitly.Fable 부모 프로파일을 명시적으로 고른다./baton advisor noneSwitch the advisor while staying on.모드를 유지한 채 advisor만 전환한다./baton parent fableSwitch the parent profile while staying on.모드를 유지한 채 부모 프로파일만 전환한다./baton statusReport the flag, the advisor and the parent setting.플래그·advisor·parent 설정을 보고한다./baton offRemove the flag. Enforcement stops the same turn.플래그를 지운다. 강제는 그 턴부터 멈춘다."model": "claude-opus-5" (or "claude-fable-5") in
.claude/settings.json, or use /model. And the Bash filter aims to
make bypasses hard, not impossible: the enforcement target is model drift, not an adversary.
스킬이 세션 모델을 바꿔 줄 수는 없다 — .claude/settings.json에
"model": "claude-opus-5"(또는 "claude-fable-5")를 넣거나
/model로 직접 고정할 것. 그리고 Bash 필터의 목표는 우회를 어렵게 만드는 것이지
불가능하게 만드는 것이 아니다: 강제 대상은 모델 드리프트지 공격자가 아니다.