Claude Code 안에서 두 모델은 완전히 같은 하네스를 쓴다. effort 단계, 서브에이전트, 워크플로, 메모리, 툴 전부 공통 — 2026-07-02에 양쪽을 직접 돌려 확인했다.
그래서 명제가 성립한다 — "Fable다움"의 절반은 모델이 아니라 지시문이고, 지시문은 텍스트라서 훔쳐올 수 있다.
Fable 세션을 열면 시스템 프롬프트에 행동 지침 섹션이 추가로 들어간다. 이 지침이 시키는 것들이 곧 우리가 "Fable답다"고 느끼는 행동이다.
첫 문장이 TLDR, 사용자에게 필요한 모든 것은 턴의 마지막 메시지에. 화살표 체인·약어 뭉치 금지, 완전한 문장으로.
가역적이면 "~할까요?" 없이 실행하고, 완료 주장은 이 턴의 툴 결과로 증명된 것만. 진단 요청엔 진단만.
훈련(웨이트)이 아니라 지시문이 만드는 행동이라면, 같은 텍스트를 Opus에게 매 턴 강하게 먹이면 상당 부분 재현된다 — 실측 97%.
물론 Fable은 훈련으로도 이 행동이 박여 있다 — 그래서 지시문만으로 100%가 아니라 97%다. 나머지는 웨이트의 몫.
Claude Code 훅은 세션의 특정 순간마다 실행되는 셸 스크립트다. 모델에게 "부탁"하는 게 아니라, 모델이 보는 입력과 끝낼 수 있는 조건을 코드로 강제한다.
훅이 출력한 텍스트는 그 턴 모델의 입력에 끼어 들어간다. 규범 블록을 매 턴 여기로 밀어 넣는다 — 모델이 잊으래야 잊을 수 없다.
Stop 훅이 decision:block을 반환하면 모델은 끝내지 못하고 한 번 더 돈다. "끝내기 전 자가검증"을 외부에서 강제하는 장치.
훅은 매번 새로 뜨는 프로세스라 기억이 없다. "이 세션은 Opus였다", "이 턴은 이미 검증했다"를 전부 파일 존재 여부로 기록한다.
데몬도 프록시도 API 개조도 없다 — 셸 스크립트 4개와 빈 마커 파일들이 전부다. 그래서 설치 2줄, 제거도 즉시.
훅 4종이 각각 세션의 다른 순간에 개입한다 — 시작할 때, 말할 때마다, 부하를 부릴 때, 끝내려 할 때.
이 훅이 어려운 이유 — 세션 시작 시점의 훅 입력에는 모델 정보가 안 들어온다(실측). 그래서 우회로를 겹겹이 팠다.
우선순위 설계 — 킬스위치(FABLE_MODE=0)가 모든 것을 이기고, 트랜스크립트의 실제 모델이 수동 토글(GLOBAL)을 이긴다. 진짜 Fable 세션에 규범이 이중 주입되는 사고를 구조적으로 막는 순서다.
Fable의 행동 지침을 역설계해 13개 조항으로 압축했다. 매 턴 이 블록이 사용자 메시지에 끼어 들어간다.
긴 대화에서 지시 준수는 희석된다. 시스템 프롬프트에 한 번 넣는 방식(output style)보다, 사용자 메시지에 매 턴 재주입하는 방식이 끝까지 강하게 남는다.
수십 턴이 지나면 맨 앞의 지시는 최근 대화에 묻힌다. 규범을 세션 초반에만 넣으면 후반 턴에서 준수율이 떨어진다 — 그래서 주입 위치를 "항상 가장 최근"으로 고정한다.
일 시키는 턴(major)·세션 첫 턴·5턴마다는 풀 블록(1,377자), 짧은 질답 턴은 핵심만 담은 리마인더(214자, −84%). 리마인더도 "전체 규범은 계속 유효하다"로 시작해 앵커를 유지한다.
major 판정은 프롬프트 길이(80자 초과)나 작업 동사(만들·구현·고쳐·커밋·배포…) 매칭 — 이 판정이 종료 시 자가검증 대상도 결정한다.
Fable은 훈련 덕에 스스로 검증하고 끝낸다. Opus에겐 그 습관이 약하다 — 그래서 끝내려는 순간을 붙잡아 한 바퀴 더 돌린다.
부작용도 정직하게 — 이 루프가 턴을 하나 더 쓴다. 그게 스택 비용의 대부분이고, 크론·타임아웃 환경에서 FABLE_MODE=0으로 끄라는 이유다.
매 턴 주입의 사각지대: 서브에이전트는 UserPromptSubmit 이벤트를 받지 않는다. 팬아웃 작업에서 부하들만 순정으로 돌던 구멍을 SubagentStart 훅이 막는다.
이 훅으로 "메인 세션만 Fable답고 부하들은 제멋대로"였던 v1.2까지의 최대 커버리지 구멍이 닫혔다 (v1.3).
훅이 심장이지만, 완전한 이식은 세 층을 겹쳐야 한다. 각 층은 독립적으로 켜고 끌 수 있다.
Opus 4.8 + effort xhigh + ultracode를 한 번에 켜는 원샷 런처. Fable의 기본 동작 조건(깊은 사고·자동 워크플로)을 흉내 낸다.
선택 — 래퍼 없이 훅만으로도 동작
규범의 영어 정본을 시스템 프롬프트 레벨에 심는다. 캐시에 올라가 매 턴 재과금이 없고, 훅 주입과 상호 보강한다.
선택 — 래퍼가 자동 적용
아무 설정 없이도 Opus 세션이면 자동으로 켜진다. 매 턴 주입·자가검증·서브에이전트 상속 — 이 층만으로 실측 97%가 나왔다.
기본 — 플러그인 설치만으로 활성
제어 — /fable-mode on·off·status 토글, FABLE_MODE=0 킬스위치(크론·원샷용), 주입 텔레메트리로 오버헤드 관측.
개발 과정에서 드러난 갭과 리스크, 그리고 각각에 적용된 방법의 전체 지도.
규범은 "어떻게 일하고 말하나"를 바꾼다. 하지만 "얼마나 깊게 생각하나"는 웨이트의 영역이라 프롬프트로는 못 바꾼다.
| 능력 항목 | 순정 Opus지시 없음 | Opus + 킷규범 주입 | Fable 5훈련 + 지시 |
|---|---|---|---|
| 결론 우선·완결된 보고 말하기 규범 | △ | ✓ | ✓ |
| 자율 실행·스코프 준수 행동 규범 | ✗ | ✓ | ✓ |
| 검증 후 보고 증명 규범 | ✗ | ✓ | ✓ |
| 서브에이전트까지 규범 유지 상속 | ✗ | ✓ | ✓ |
| 얽힌 단일 패스 추론 웨이트 — 벤치 5–11pt 추정 | △ | △ | ✓ |
| 장기 자율 런 유지력 웨이트 | △ | △ | ✓ |
△ 두 줄의 우회법 — 고난도 추론·장기 자율 작업은 Fable 직행, 또는 Opus 다중 에이전트(팬아웃 + 적대 검증)로 보정. 후자도 Fable 단독 대비 1–2.5×(추정) 비용이라 케이스별 선택.
그래서 이 킷은 마법이 아니라 구조다 — 세 문장이면 전체가 설명된다.
Fable 세션에만 들어가는 행동 지침을 역설계해, 훅으로 Opus의 모든 턴·모든 서브에이전트에 밀어 넣는다.
훈련으로 박인 "끝내기 전 자가 점검"은 Stop 훅이 턴 종료를 1회 되돌리는 외부 루프로 재현하고, 누설은 grep으로 막는다.
얽힌 추론·장기 자율 런은 지시문의 영역이 아니다 — 그 일감만 Fable로 보내거나 다중 검증으로 보정한다.
근거 — 2026-07-02 시스템 프롬프트 실측 리서치 · 07-03 E2E(행동 64%→97%) · 07-06~07 v1.4 재실측(비용 0.72×·등가성 80–95%). github.com/jee599/fable-mode-kit