
AI 에이전트를 1주일 동안 망가뜨린 단 한 줄 — '에러를 무시하지 않기'를 구현했더니 진범까지 직행했다
요약
AI 에이전트 AMA-teras의 설정이 의도치 않게 초기화되는 장애 원인을 분석한 사례입니다. 에러 이벤트를 무시하는 'Error swallowing' 문제를 해결하여 가시성을 확보하고, 근본적인 설정 로드 오류를 찾아낸 과정을 다룹니다.
핵심 포인트
- 에러 이벤트를 무시하지 말고 반드시 로그에 기록해야 함
- UI의 상태와 실제 API 요청 데이터 간의 불일치를 경계할 것
- 에이전트의 보고보다 실제 네트워크 요청 등 1차 정보를 신뢰할 것
- 잘못된 설정을 묵묵히 기본값으로 되돌리는 설계는 피해야 함
증상: 무엇을 전환해도 되돌아간다
자기 진화형 데스크톱 AI 에이전트 AMA-teras(GitHub)에서 1주일에 걸친 연쇄 장애가 발생했습니다. 결론부터 말하자면, 원인은 설정 로드(Loading)의 한 줄입니다. 이 기사는 그 한 줄에 도달하기까지의 기록입니다.
증상은 불가해했습니다.
- 설정 화면에서 모델 프로바이더(Model Provider)를 Moonshot(Kimi)으로 전환한다 → 작동함
- 그런데 며칠 후, API 에러로 본체 채팅이 전면 중단됨
- 설정을 보면 「Provider: Anthropic / Model: kimi-k3」라는 수수께끼의 조합으로 되돌아와 있음
- 에이전트의 자기 진화 작업(Job)은 5회 연속 실패. 로그에는 단 한 마디 — 「에이전트가 비정상 종료: error」
「전환했을 텐데 되돌아와 있다」. 사용자(나)는 자신의 조작 실수를 의심하며 다시 한번 전환합니다. 잠시 작동합니다. 그리고 또 망가집니다. 이 반복이었습니다.
단서 제로의 원인: 에러 무시 (Error swallowing)
조사를 방해한 것은 진화 작업의 로그에 남은 「비정상 종료: error」라는 문자열뿐인 보고였습니다. error라니. 어떤 API가, 무엇이라고 거절했는지 아무것도 알 수 없습니다.
코드를 보니 원인은 바로 알 수 있었습니다. 에이전트 루프(Agent loop)는 에러 이벤트를 제대로 발행하고 있었지만, 진화 작업 측의 이벤트 핸들러(Event handler)가 텍스트와 툴 실행(Tool execution) 이벤트만 수집하고, 에러 이벤트는 버리고 있었던 것입니다.
emit: (e) => {
if (e.kind === 'text_delta') lastText += e.text;
if (e.kind === 'tool_start') log(`[job] tool: ${e.name}`);
...
수정은 20줄입니다. 에러 이벤트를 작업 로그에 기록하고, 예외 메시지(Exception message)에도 실제 문구를 넣는다. 그것뿐입니다.
수정한 다음 날 아침, 작업이 '자백'했다
가시성(Observability)을 도입하여 실패한 작업을 재실행하자, 지금까지 「error」라고만 말하던 작업이 첫 번째 LLM 호출에서 즉시 다음과 같이 내뱉었습니다.
400 Your credit balance is too low to access the Anthropic API.
……Anthropic? 설정은 Moonshot이어야 합니다. 연결 테스트를 실행하니 확실히 요청은 api.anthropic.com으로 날아가고 있습니다. 앱 내부에서는 설정이 Anthropic으로 되돌아가 있습니다. 디스크 상의 설정 파일에는 `
3. 「묵묵히 기본값으로 되돌리는 것」은 최악의 실패 모드입니다. 잘못된 값을 거부하는 것 자체는 올바른 설계입니다. 하지만 묵묵히 거부하면, 사용자에게는 "조작했는데 다시 돌아가 버리는" 초자연적인 현상처럼 보입니다. 최소한 로그에 한 줄이라도 남겨야 합니다. 가능하다면 기동 시에 경고를 띄워야 합니다.
4. 자기 보고가 아닌 1차 정보. "설정 화면은 Moonshot으로 표시하고 있다"는 것은 진실이 아니었습니다. 실제로 어떤 URL로 요청(Request)이 날아갔는가, 라는 1차 정보만이 진실이었습니다. AMA-teras의 설계 원칙인 "에이전트의 성공 보고를 신뢰하지 말고 1차 정보로 교차 검증한다"가, 이번에는 자기 자신의 앱에 꽂힌 형태가 되었습니다.
부록: 고쳐진 날에, 에이전트가 도구를 만들었다
프로바이더(Provider) 되돌림 문제를 수정한 몇 시간 후, 멈춰있던 자기 진화 파이프라인이 부활했고, 에이전트는 "실패한 작업(Job)의 원인을 요약하는 조사 도구"를 스스로 작성했습니다. 그리고 격리된 워크트리(Worktree)에서 타입 검사(Type Check), 12건의 테스트, 실행 스모크 테스트(Smoke Test)를 통과한 뒤, 인간의 승인을 거쳐 자신에게 통합했습니다. 이번 장애의 재발을 에이전트 스스로 조사할 수 있는 도구가 첫 번째 결과물이 된 것은, 조금 지나치게 완벽한 결말이었습니다.
실패 로그는 모두 공개하고 있습니다. "우리 쪽에서도 비슷한 되돌림 버그를 겪었다"는 이야기가 있다면, 꼭 들려주세요.
Discussion

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