본문으로 건너뛰기

© 2026 Molayo

Simon헤드라인2026. 06. 15. 04:37

Claude Fable은 끊임없이 주도적입니다

요약

Claude Fable 5 모델의 주도적인 에이전트 능력을 소개합니다. 사용자의 명시적인 명령 없이도 브라우저를 열고 환경을 탐색하며 문제를 해결하려는 능동적인 동작 방식을 보여줍니다.

핵심 포인트

  • Claude Fable 5의 핵심 특징은 '끊임없이 주도적(relentlessly proactive)'인 태도임
  • 의존성 분석을 위해 가상 환경과 로컬 디스크를 능숙하게 조사함
  • 명시적 명령 없이도 브라우저 자동화를 수행하는 놀라운 자율성을 보임
  • 문제 해결을 위해 스스로 도구를 선택하고 실행하는 에이전트 역량 입증

Claude Fable은 끊임없이 주도적입니다

2026년 6월 11일

Claude Fable 5를 이틀간 경험해 본 결과, 이를 설명하는 가장 좋은 방법은 **끊임없이 주도적 (relentlessly proactive)**이라는 것입니다. 이 모델은 수많은 기술을 알고 있으며, 목표를 달성하기 위해 거의 모든 기술을 동원합니다.

한 가지 예로 설명하겠습니다. 오늘 Datasette Agent를 해킹하던 중 결함을 발견했습니다. 점프 메뉴 채팅 프롬프트에 있어서는 안 될 가로 스크롤바가 나타난 것입니다. 저는 이 스크린샷을 찍었습니다:

Screenshot of a modal dialog demonstrating a scrollbar bug. At the top is a focused search input with blue outline and placeholder "Jump to...", with an X close button to its right. Below, a heading reads "Start a new agent chat" above a textarea with the placeholder "Ask a question about your data..." — the bug: a thick gray horizontal scrollbar is incorrectly displayed along the bottom edge of the empty textarea, spanning nearly its full width, next to the resize handle. Below the textarea: "Press Enter to start. Shift+Enter adds a new line." followed by a blue "Start chat" button.

그런 다음 datasette-agent 체크아웃(checkout) 상태에서 새로운 claude 세션을 시작했고, 스크린샷을 끌어다 놓으며 다음과 같이 말했습니다:

여기에 왜 가로 스크롤바가 있는지 파악할 수 있도록 의존성 (dependencies)을 확인해 봐

저는 원인이 Datasette Agent의 의존성(아마도 Datasette 자체일 가능성이 높음)에 있을 것이라는 직감이 들었습니다. 그리고 Fable이 자신의 가상 환경 site-packages에 설치된 파일을 조사하거나 디스크의 로컬 체크아웃을 참조하여 의존성 코드를 파헤치는 데 능숙하다는 것을 알고 있었습니다. 의존성부터 시작하라고 말하는 것은 좋은 전략처럼 느껴졌습니다.

저는 집안일 때문에 잠시 주의가 분산되어 컴퓨터 앞을 떠났습니다.

몇 분 후 돌아왔을 때, 제 컴퓨터가 평소 사용하는 Firefox에서 브라우저 창을 열고 문제가 된 대화창으로 이동하는 것을 보았습니다. 저는 Claude Code에게 브라우저 자동화 (browser automation)를 사용하라고 말한 적이 없으며, 창 내부에서 마우스 움직임이나 키보드 단축키를 트리거하는 것은 불가능할 것이라고 확신했기에, 도대체 어떻게 그러고 있는 것인지 의아했습니다.

저는 모델이 탐색을 계속하는 모습을 매료된 채 지켜보았고, 이어서 Firefox 대신 Safari 창을 여는 것을 보았습니다. 또한 Claude 터미널에서 이 스냅샷을 찍었습니다:

Screenshot of two Bash tool calls in a dark terminal interface. First: Bash(open -a Safari /tmp/textarea-scrollbar-test.html && sleep 4 && uv run --with pyobjc-framework-Quartz python - <<'EOF' import Quartz wins = Quartz.CGWindowListCopyWindowInfo(Quartz.kCGWindowListOptionOnScreenOnly, Quartz.kCGNullWindowID) for w in wins: if (w.get('kCGWindowOwnerName') or '') == 'Safari' and 'textarea' in (w.get('kCGWindowName') or '').lower(): print(w.get('kCGWindowNumber')) EOF) with output 153551. Second: Bash(screencapture -x -o -l 153551 /tmp/safari-cases.png && echo ok) with output ok.

uv run --with pyobjc-framework-Quartz를 사용해서 거기서 무엇을 하고 있었던 걸까요?

알고 보니 Fable은 브라우저 창의 스크린샷을 찍기 위해 자신만의 패턴을 만들어낸 것이었습니다. Python을 사용하여 내 컴퓨터에서 사용 가능한 모든 창을 순회한 다음, `

창 이름에 포함된 문자열을 찾았습니다. 그것은 이를 통해 153551과 같은 정수 형태의 창 번호를 찾아냈고, 그 후 screencapture CLI 도구를 사용하여 PNG 파일을 캡처할 수 있었습니다.

좋습니다, 스크린샷을 찍는 꽤 멋진 방법이네요. 하지만 도대체 무엇을 스크린샷으로 찍고 있었던 걸까요?

알고 보니, Claude는 버그를 재현하기 위해 자신만의 임시 HTML 페이지를 작성한 다음, Safari를 열고 스크린샷을 찍고 있었습니다.

그것이 생성한 /tmp/textarea-scrollbar-test.html 페이지와 screencapture -x -o -l 153551 /tmp/safari-cases.png 명령어로 찍은 스크린샷은 다음과 같습니다:

Screenshot of a Safari browser window showing a textarea scrollbar test page at file:///private/tmp/textarea-scrollbar-test.html. Page text reads: scrollbar thickness: 17px | UA: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/26.4 Safari/605.1.15 | devicePixelRatio: 2. Four numbered test cases follow, each with a textarea containing the placeholder "Ask a question about your data...": 1. Exact plugin CSS (resize: vertical, default overflow), 2. Plugin CSS + overflow-x: hidden, 3. Plugin CSS + resize: none, and 4. Bare default textarea, which is a much smaller box with the placeholder wrapping onto two lines.

좋습니다, 테스트 페이지를 열고 스크린샷을 찍는 방식은 이해했습니다. 하지만 도대체 어떻게 테스트 대상이었던 모달 대화 상자 (modal dialog)를 트리거했을까요? 그것은 클릭이나 키보드 단축키를 통해서만 실행 가능한데, Safari에서 이를 실행할 수 있는 메커니즘을 찾을 수 없었습니다.

결국 저는 그것이 무엇을 했는지 알아냈습니다.

Claude는 애플리케이션의 소스 코드가 포함된 폴더 내에서 실행되고 있었습니다. Claude는 로컬 개발 서버 (local development server)를 실행할 수 있을 정도로 Datasette에 대해 충분히 알고 있었습니다. 알고 보니 Claude는 Datasette의 자체 템플릿을 수정하여, 창이 열리자마자 올바른 키보드 단축키를 트리거하는 JavaScript를 추가하고 있었습니다. 다음과 같은 코드를 삽입한 것입니다:

<script>
window.addEventListener("load", function () {
setTimeout(function () {
...

창이 열리고 1.2초 후에, 이 코드는 모달 대화 상자를 여는 키보드 단축키인 / 키 입력을 시뮬레이션하여 트리거합니다.

한 가지 과제가 더 남아 있었습니다. 무슨 일이 일어나고 있는지 이해하기 위해, Claude는 스스로 측정을 수행할 수 있도록 페이지에서 JavaScript를 실행해야 했습니다.

Claude는 CORS를 통해 정보를 캡처하기 위한 자신만의 커스텀 웹 애플리케이션을 작성한 다음, 이를 로컬 서버로 실행하고 해당 서버로 직접 POST 요청을 보내는 JavaScript가 포함된 페이지를 열었습니다!

표준 라이브러리인 http.server 패키지를 사용하여 작성한 Python 웹 앱은 다음과 같습니다:

모든 것은 JSON으로 가득 찬 POST 요청을 받아 /tmp/diag.json 파일에 쓰는 것뿐입니다. 또한 Access-Control-Allow-Origin: * 헤더(OPTIONS 요청 포함)를 전송하여 다른 도메인에서 실행되는 코드가 여전히 여기에 통신할 수 있도록 합니다.

그런 다음 Claude는 이 코드를 브라우저에서 로드하는 템플릿에 주입했습니다:

const host = document.querySelector("navigation-search");
const ta = host.shadowRoot.querySelector("textarea");
const cs = getComputedStyle(ta);
...

이 코드는 <navigation-search> 내부의 <textarea>에 대한 측정값을 가져와 서버로 전송했고, 서버는 이를 디스크의 파일에 기록했으며, Claude는 나중에 이 파일을 읽을 수 있었습니다.

Fable이 이러한 모든 트릭들을 파악한 후... 보이지 않는 가드레일(guardrail)에 부딪혀 Opus로 다운그레이드되었습니다. 다행히도 Opus는 전체 스크립트에 접근할 수 있었고, Fable이 개척했던 트릭들을 계속 사용할 수 있었으며, 얼마 지나지 않아 수정 사항을 찾아내고, 테스트하고, 검증했습니다.

저는 Opus에게 다음과 같이 요청했습니다:

이 세션에서 제 컴퓨터의 실제 브라우저를 대상으로 테스트하기 위해 사용한 모든 트릭들을 기록하여 /tmp/automation-report.md에 보고서를 작성해 주세요. 실행 가능한 코드 예시도 포함해 주세요.

그 결과 이 보고서가 생성되었는데, 이 게시물에서 무슨 일이 일어났는지 세부 사항을 파악하는 데 매우 귀중했습니다.

Claude Code 세션의 전체 터미널 스크립트도 공유했습니다.

수행한 모든 작업에 대한 검토

스크린샷 하나와 한 줄짜리 프롬프트만으로, Claude Fable 5 + Claude Code는 다음과 같은 작업을 수행했습니다:

  • 로컬 개발 서버를 실행하기 위한 레시피를 파악함 (실행에 필요한 가짜 환경 변수 포함)
  • Playwright Chrome 세션을 실행함
  • Chrome의 스크롤바 표시 설정을 활성화함
    defaults write com.google.chrome.for.testing AppleShowScrollBars Always

(나중에 다시 비활성화함) - Playwright에서 Firefox와 WebKit으로도 전환하며 테스트했으나 버그 재현에 실패함

  • 나의 기본 브라우저가 Safari임을 알아냄
  • textarea-scrollbar-test.html HTML 문서를 생성함 - 이를 실제 (Playwright가 아닌) Firefox에서 열었음
  • osascript -e 'tell application "System Events" to tell process "firefox" to id of window 1' 명령이 “osascript에 보조 기능 접근 권한이 허용되지 않음”이라는 이유로 차단된 것을 발견함 - 위에서 설명한 uv run --with pyobjc-framework-Quartz python 우회 방법을 찾아냄
  • / 키를 트리거하기 위해 사이트 템플릿에 JavaScript를 추가함
  • JSON 데이터를 캡처하기 위한 자체적인 작은 Python CORS 웹 서버를 구축함
  • 해당 데이터를 캡처하여 서버로 전송하도록 템플릿을 재작성함
  • Web Component의 Shadow DOM (섀도우 DOM)을 스크립트로 통과하여 필요한 정보에 접근함
  • Safari를 열어 버그의 원인을 확인함
  • 잠재적인 해결책을 해킹하여 삽입하기 위해 커스텀 템플릿을 수정함
  • 해킹한 해결책이 작동함을 확인함
  • 문제를 어떻게 해결해야 하는지 보고함

말씀드린 대로, 끊임없이 주도적입니다!

이 녀석을 정말로 통제(lock down)해야겠습니다

한편으로는, 결국 단 두 줄의 CSS 수정으로 끝날 문제를 디버깅하기 위해 Fable이 필요한 정보를 얻으려고 극단적인 노력까지 기울이는 모습을 지켜보는 것은 매우 흥미로웠습니다.

하지만 다른 한편으로는... 이는 코딩 에이전트(coding agents)가 터미널에 명령어를 입력하여 당신이 할 수 있는 모든 것을 할 수 있다는 강력한 상기물입니다. 그리고 프런티어 모델(frontier models)은 세상의 모든 기술을 알고 있으며, 분명 아직 아무도 기록하지 않은 몇 가지 기술까지도 알고 있습니다.

만약 Fable이 악의적인 지침—코드나 이슈 스레드에 숨겨진 프롬프트 인젝션 (Prompt Injection) 공격, 혹은 제가 부주의하게 터미널에 붙여넣은 무언가—에 따라 행동했다면, 데이터 유출이나 다른 형태의 해를 끼치기 위해 얼마나 멀리까지 나아갈 수 있었을지 생각하면 매우 섬뜩합니다.

샌드박스 (Sandbox) 외부에서 코딩 에이전트 (Coding Agent)를 실행하는 것은 언제나 나쁜 아이디어였습니다. 이는 Johann Rehberger가 'AI에서의 일탈의 정상화 (The Normalization of Deviance in AI)'에서 설명한 Challenger 참사 사건의 강력한 후보가 될 만한 사례입니다.

Fable은 단연코 더 똑똑하며, 따라서 잠재적으로 악의적인 지침에 대해 더 의심스럽게 반응합니다. 하지만 그 똑똑함은 매우 양날의 검과 같습니다. 만약 지침에 의해 실제로 장악당한다면, Fable의 끊임없는 주도성을 고려할 때 그것이 초래할 수 있는 피해의 양은 공포스러울 정도입니다.

AI 자동 생성 콘텐츠

본 콘텐츠는 Simon Willison Blog의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.

원문 바로가기
0

댓글

0