메뉴
HN
Hacker News 11일 전

클로드 코드 실수 분석: 60초 자동 승인 기능의 위험성

IMP
8/10
핵심 요약

Anthropic이 Claude Code에 사용자 동의 없이 60초 후 자동으로 작업을 진행하는 기능을 은연중에 추가하여 논란이 되었습니다. 이는 자동화된 환경에서 큰 보안 및 통제권 문제를 야기할 수 있는 명백한 설계 실수였으며, 며칠 뒤 수정되었지만 AI 에이전트의 자율성과 신뢰 문제를 다시금 환기시켰습니다.

번역된 본문

원문 제목: Claude Code: Anatomy of a Misfeature (클로드 코드: 잘못된 기능의 해부)

소스: hackernews

#AI #security #cli #automation

Olaf Alders 작성 · 2026년 7월 17일 · 읽는 데 29분 · 6,163단어

목차 Hustvedt의 "기계식 계란 타이머"는 CC BY-SA 3.0 라이선스를 따릅니다. 더 넓은 프레임으로 확장되었으며, 이 각색본 역시 CC BY-SA 3.0로 라이선스됩니다.

2026년 캐나다의 날(7월 1일), Anthropic은 Claude Code 사용자들에게 놀라운 '이스터에그'를 출시했습니다. 버전 2.1.198에는 에이전트가 인간의 지시를 기다리지 않고 작업을 계속 진행할 수 있도록 하는 '효율성 바이패스'가 포함되어 있었습니다. 기본적으로 Claude Code가 사용자 입력을 요청한 후 60초짜리 타이머가 작동합니다. 이 시간 안에 응답하지 않으면, Claude Code가 친절하게(?) 자신이 가장 좋다고 판단하는 방향으로 작업을 마음대로 진행합니다. 그 상황은 다음과 같이 보입니다:

● Claude가 질문했습니다: ⎿ ... ● 60초 후 응답 없음 — 답변 없이 계속 진행함 ● 사용자가 자리를 비웠습니다. 제 판단에 따라 진행하겠습니다. 내 계획은:

참고: 위 내용은 질문 부분만 다듬은 제 실제 Claude 세션에서 그대로 가져온 것입니다.

이러한 동작 방식이 놀랍다고 느껴진다면, 당신만 그런 것은 아닙니다. 발생할 수 있는 잠재적 결과들을 생각해 봅시다:

  • 샌드위치를 만들러 갈 때 노트북을 주방까지 가져가야 할까요?
  • 이 시간 동안 자리를 비우면 어떻게 될까요?
  • 한 번에 몇 개의 에이전트를 실행하고 계신가요? 그것들을 동시에 모두 감시할 수 있나요?
  • 두 개 이상의 에이전트가 같은 60초 안에 입력을 요청하면 어떻게 될까요?
  • 에이전트가 잘못된 선택을 하면 어떻게 될까요?
  • 그 사이에 얼마나 많은 토큰이 소모될까요?
  • 배포(deployment)를 위해 에이전트를 사용하고 있다면 어떻게 될까요? (네, 그런 일은 없겠지만 만약 그렇다면요)

이러한 것들은 이 기능을 출시할 때 합리적으로 고려해야 할 사항들이며, 어쩌면 변경 이력(changelog)에 그 이유를 문서화했을 수도 있습니다. 하지만 만약 변경 이력에 이 새로운 기본 설정에 대해 전혀 언급하지 않았다면 어떨까요? 그것이 훨씬 더 놀라운 일 아니겠습니까? (스포일러: 정말 그랬습니다!)

이 이야기에는 (어느 정도의) 해피엔딩이 있습니다. '빠르게 움직이고 부수기(Move fast and break things)'가 반드시 '빠르게 움직이고 고치기(Move fast and fix things)'를 배제하는 것은 아닙니다. 며칠 만에 수정 패치가 출시되었지만, 그렇다면 이 제품에 대한 사용자의 신뢰는 어디에 남게 되는 걸까요?

우리는 몇 가지 교훈을 얻었습니다:

  • Claude Code의 놀라운 기능들은 이론적으로나 실제적으로 Anthropic에 의해 매일 새로 출시될 수 있습니다.
  • 모든 기능이 반드시 변경 이력에 나타나는 것은 아닙니다.
  • 기본값이 되어서는 안 되는 것들이 문서화된 비활성화 스위치(off switch)를 갖고 있지 않을 수 있습니다.
  • Claude Code의 자동 업데이트 기능은 우리가 초기에 의심했던 것보다 훨씬 더 '알아서 내버려 둬(YOLO)' 모드에 가깝게 느껴집니다.

우리가 진정으로 교훈을 얻았는지 모를 몇 가지 사항들도 있습니다:

  • 이 과정에서 인간은 어떤 역할을 했을까요?
  • 인간이 이 기능을 구상했나요?
  • 인간이 직접 이 기능을 작성했나요? (아니면 에이전트에게 작성하게 했나요?)
  • 인간이 이 기능을 리뷰했나요?
  • 인간이 이 기능을 승인했나요?
  • 인간이 이 기능을 병합(merge)했나요?
  • 인간이 문서화나 변경 이력 추가를 거부했나요?
  • 인간인 릴리스 관리자가 배포하기 전에 이전 릴리스와 비교(diff)해 보고 최종 승인 인장을 찍어주었나요?

개인적으로, 인간이 이 모든 단계의 관문을 지키면서 '이게 정말 좋은 아이디어인가?'라고 묻지 않았다고는 믿기 어렵습니다. 만약 누군가 'Claude Code가 스스로 이 기능을 만들고, 배포하고, 승인한 다음 문서화할 가치가 없다고 판단했다'고 말한다면 저는 차라리 그쪽을 더 믿겠지만, 진실은 알 수 없습니다. 어쩌면 두 가지가 결합된 형태일 수도 있습니다. 아마도 여러 가지 일이 잘못되었겠지만, 분명한 것은 이런 일이 절대 일어나서는 안 된다는 것입니다. 저 역시 '실 서버 환경에 심각한 버그를 넣긴 했지만...'이라고 말했던 성과 평가를 받아본 적이 있는 사람으로서 이렇게 말하는 것입니다.

이 일이 어떻게 발생했었는지, 그리고 공개된 기록에 어떤 종류의 사후 분석(post-mortem)이 있는지 궁금해졌습니다. 그래서 Claude Code에게 자신을 조사해 보라고 했습니다. Claude에게 유리하게 말하자면, 이 코드와 관련하여 자기 성찰을 방해하는 필터가 없는 것 같습니다. 미리 밝히자면, 아래에 이어지는 내용은 대부분 Claude가 작업한 것이므로 그 점을 감안해서 읽으시길 바랍니다. 그리고 만약 당신이...

원문 보기
원문 보기 (영어)
#AI #security #cli #automation Claude Code: Anatomy of a Misfeature by Olaf Alders · July 17, 2026 · 29 min read · 6,163 words contents " Mechanical egg timer " by Hustvedt is licensed under CC BY-SA 3.0 . Padded to a wider frame; this adaptation is likewise licensed CC BY-SA 3.0. On Canada Day (July 1), 2026, Anthropic shipped a surprising “easter egg” to users of Claude Code: 2.1.198 includes an efficiency bypass which allows agents to continue on without being blocked on direction from a human. You essentially get a 60 second timer after Claude Code asks for input. If you miss the window, Claude Code helpfully does what it thinks is best and continues on its way. It looks like this: ● Claude asked: ⎿ … ● No response after 60s — continued without an answer ● The user stepped away. I'll proceed with best judgment. My plan: Note: the above is taken verbatim from one of my own claude sessions, with the questions having been trimmed. If you find this behaviour surprising, you’re not alone. Let’s consider the possible consequences: Do you have to take your laptop to the kitchen with you when you’re making a sandwich? What happens if you are afk during this window? How many agents are you running at once? Can you possibly observe them all at the same time? What if two or more agents ask for your input during the same 60 second window? What if the agent makes the wrong choice? How many tokens have been burned in the meantime? What if you are using agents for deployments? (Yes, I know, but what if ) These are reasonable things you might consider when shipping this feature and maybe you’d document your reasoning in the changelog. But what if you never mentioned the new defaults in the changelog at all? Wouldn’t that be even more surprising? (Spoiler: it was!) The story has a (sort of) happy ending. Move fast and break things does not necessarily preclude move fast and fix things. Within a couple of days a fix was shipped, but where does that leave user trust in this product? We’ve learned a few things: Surprising features in Claude Code can in theory (and in practice) be shipped by Anthropic on a daily cadence Not every feature will necessarily appear in the changelog Things that should not be defaults may not have a documented off switch Claude Code’s auto update feature feels more like YOLO mode than we might have suspected early on There are a few things I don’t know if we have learned: How do humans fit into this equation? Did a human dream up the feature? Did a human write (or have an agent write) this feature? Did a human review the feature? Did a human sign off on the feature? Did a human merge the feature? Did a human opt out of documenting the feature or adding it to the changelog? Did a human release manager diff the release with the previous release and give it their seal of approval before it went out the door? Personally I would find it hard to believe that a human was gating all of these steps without asking “is this a good idea?”. If you told me that Claude Code actually built the feature, shipped it, signed off on it and then deemed it unworthy of documentation, that’s something I’m more inclined to believe, but I just don’t know. Maybe it’s some combination of those two things. Maybe a number of things went wrong, but I think it’s clear that this never should have happened. And I say this as someone who has had at least one performance review where my manager said “well, you did put a serious bug into production”. I’ve wondered a bit about how this happened and what kind of post-mortem is available in the public record. So, I’ve asked Claude Code to investigate itself. To Claude’s credit, it seems to have no filter that prevents self-reflection regarding this code. So, full disclosure, what follows is mostly Claude’s work, so take that for what it’s worth and if you rely on any key assumptions, it’s worth reproducing them in isolation. Claude’s research begins here. # Timeline 2026-06-29 — 2.1.196 released; the reporter’s “last working version (I am guessing)” 2026-06-30 — 2.1.197 released; one changelog line, the Sonnet 5 launch 2026-07-01 — 2.1.198 released — the version the reporter pins the regression to. No public commit shows the change; the only public trace of this release is the bot commit publishing its notes ( 75709ea ), which touches nothing but CHANGELOG.md and feed.xml 2026-07-02 02:54 UTC — issue #73125 filed by Aleksey Nogin 2026-07-02 03:45 UTC — a commenter surfaces the escape hatch : CLAUDE_AFK_TIMEOUT_MS . Traded peer-to-peer in the thread, not pointed to from any release note 2026-07-02 — 2.1.199 ships 24 entries while the issue is open. Still no mention. 2026-07-03 — 2.1.200 reverses the behaviour; again the only public trace is the notes commit ( 1322e9b ) 2026-07-04 18:04 UTC — issue closed Reaction/scale on the issue: 384 👍 , 143 comments — not a niche complaint Reporter’s environment: 2.1.198 , “last working 2.1.196 (guessing)”, Opus, AWS Bedrock, VS Code terminal git clone https://github.com/anthropics/claude-code.git cd claude-code # When did the fix land, and in which version? git log -1 --format = '%h %ai' -S 'no longer auto-continue by default' -- CHANGELOG.md # 1322e9ba 2026-07-03 16:52:26 +0000 # When did the version that shipped the bug land? git log -1 --format = '%h %ai' -S '## 2.1.198' -- CHANGELOG.md # 75709eac 2026-07-01 20:45:29 +0000 # The misfeature AskUserQuestion is the tool Claude Code uses to stop and ask the human a question mid-task New behaviour: after 60 seconds of inactivity , the tool auto-returns a “proceed anyway” result instead of blocking The message handed back to the model — this is the template, rendered here at the 60-second default: // v2.1.198, verbatim. `Thl` is the minifier's name; the prose is the binary's own. // Note "60s" is interpolated, not a literal in the file: function Thl ( e ){ return `No response after ${ Math . round ( e / 1000 ) } s — the user may be away from keyboard. Proceed using your best judgment based on the context so far; you can re-ask this question later if it's still relevant.` } The “re-ask later” escape hatch is circular: the re-asked question hits the same timeout. Aleksey Nogin made this point in the issue thread within minutes of filing it The transcript line has two variants — the binary picks between them on whether you’d started answering: // v2.1.198, verbatim. `a` is the minifier's name for "some answers exist" // (`s=Object.entries(r)` over the answers, `a=s.length>0`); both string values // are the binary's own. let d = a ? "continued with the answers selected so far" : "continued without an answer" So a half-answered dialog does not discard the partial input — it submits it . Answer question one of three, step away, and the timeout commits your one answer plus whatever the model picks for the other two Both strings are absent from 2.1.197 and present in 2.1.198 In fairness: it was not silent on screen. The dialog rendered a live countdown, and a keypress restarted the timer. Assembled at runtime rather than stored as one string, so this is the rendered form, not a literal grep hit: // v2.1.198, verbatim — the pieces. `s` is the remaining-seconds value. children : [ "auto-continue in " , s , "s \xB7 any key to stay" ] // renders as: auto-continue in 12s · any key to stay Which cuts less far than it looks. The countdown only reaches someone watching the screen, and the premise of the feature is that you aren’t: the internal name is AFK ; the message says “the user may be away from keyboard” running several agents at once, “watching the screen” is not one place — the countdown you needed was on another tab And the countdown is late. The threshol