실제로 AI 에이전트에게 권한을 줘본 사람이라면 안다. 처음엔 잘 된다. 그러다 한 번 크게 당한다. 문제는 그 '한 번'이 돌이킬 수 없는 사이드 이펙트를 동반한다는 것이다. 파일을 지우거나, 예산을 날리거나, 버그를 세 번 고쳤는데도 아무것도 안 고쳐지거나.
이번 주 dev.to에서 눈에 띈 세 개의 글이 바로 그 지점을 다룬다. 클라우드 드라이브에 쓰기 권한을 준 LLM 에이전트 실패 사례, Django 보일러플레이트를 AI로 자동 생성하려다 마주한 한계, 그리고 Claude Code 세션의 컨텍스트 압축을 제어하는 플러그인을 배포하다 자기 자신의 플러그인에 구조받은 이야기. 세 사례가 제각각 다른 도메인인 것 같지만, 공통으로 가리키는 설계 원칙은 하나다.
에이전트가 열여섯 번 검색하고 열한 개를 고른 이유
첫 번째 사례는 Mediary Scout라는 미디어 라이브러리 자동화 도구 제작기다. LLM 에이전트에게 클라우드 드라이브 쓰기 권한을 주고 영화·드라마 파일을 자동으로 수집·정리하는 워크플로우를 만들었다. 결과는 세 개의 버그였다.
첫 번째 버그가 핵심이다. 12부작 시즌 하나를 확보하는 데 에이전트가 검색을 열여섯 번 돌리고, 시즌 팩을 열한 개 골랐다. 프롬프트에 "나중에 중복 제거하면 되니까 겹쳐도 괜찮다"고 적어뒀기 때문이다. 에이전트는 그 말을 충실히 따랐다. API 예산이 바닥났고, 중복 제거 단계는 실행조차 못 했다.
저자가 시도한 첫 번째 수정은 프롬프트 다듬기였다. '절제하라'는 영어 문장을 여러 방식으로 바꿔봤다. 모델은 전부 무시했다. 결국 결정론적 코드로 해결했다. 전송 전에 최소 커버리지를 계산해 중복을 제거하는 함수(trimToMinimalCoveringCandidates)를 넣고, 검색 횟수 상한을 도구 경계에서 하드코딩했다. 모델이 열여섯 번 요청해도 여덟 번만 실행된다. 나머지는 캐시로 돌아온다.
교훈은 직접적이다. 에이전트가 숫자를 결정하게 두지 마라. 검색 횟수든, 선택 개수든, API 호출 수든—모델이 낸 숫자는 반드시 결정론적 상한선을 통과한 뒤에 실행되어야 한다. '나중에 정리하면 된다'는 프롬프트 속 약속은 에이전트에게 면죄부가 된다. 정리 로직은 행동 이전에, 코드 레벨에서 동작해야 한다.
세 번째 버그도 짚을 가치가 있다. 진행률 바가 세 번의 PR을 거쳐도 계속 빈 채로 렌더됐다. style.width는 정상 값을 반환했다. 그런데 실제 픽셀은 0이었다. <span>은 인라인 박스라 width 속성이 동작하지 않는다는 걸 두 번의 PR 동안 몰랐다. 개발자가 읽은 건 자신이 설정한 값이었고, 사용자가 본 건 아무것도 없는 화면이었다. "프록시가 아니라 사용자가 실제로 보는 아티팩트를 테스트하라"는 결론은 AI 에이전트와 무관해 보이지만, 검증 대상을 어디에 두느냐는 정확히 같은 질문이다.
AI가 Django 프로젝트를 세팅해줄 수 있나? 200커밋 후의 답
두 번째 사례는 LLM으로 Django 보일러플레이트를 자동 생성하는 실험이다. 문장 하나("Job board. Postgres, Google login, background tasks, Stripe, deploy to my VPS.")를 주면 프로젝트가 완성되는 게 목표였다. 200개 이상의 커밋 끝에 나온 실패 패턴은 다섯 가지다.
지식 컷오프 문제로 낡은 API를 사용하거나(Stripe SDK 두 메이저 버전 이전), 개발 설정 그대로 배포(디버그 모드 온, 시크릿 키 커밋), 파일 간 설정 충돌, 마이그레이션 실행 스크립트 누락, 그리고 서드파티 패키지 선택의 조용한 누락이 그것이다. 가장 위험한 건 마지막이다. 필요한 기능이 빠졌는데 에이전트가 아무 경고 없이 생략한다.
저자의 해법은 모델의 역할을 재정의하는 것이었다. 지식을 모델에 맡기지 않고 외부 참조 파일(치트시트)로 분리했다. seedkit이라는 Cursor/Claude Code 플러그인으로 이 파일들을 컨텍스트에 주입하고, 패키지 설치는 uv로 실행해 버전을 현재 릴리즈로 고정했다. "모델은 빠른 타이피스트 역할만 한다. 실제 지식은 외부에 있다"는 설계다.
또 하나 인상적인 관찰이 있다. 프롬프트가 길어질수록 출력 품질이 떨어졌다. 컨텍스트가 늘어나면 모델이 길을 잃는다. 참조 파일이 짧아질수록 결과가 좋아졌다. AI-First 워크플로우 설계에서 '얼마나 넣을 것인가'만큼 '얼마나 덜어낼 것인가'를 고민해야 하는 이유다.
새벽 3시, 내가 만든 플러그인이 나를 살렸다
세 번째 사례는 가장 구조적이다. compact-ops는 Claude Code의 컨텍스트 압축(compaction) 시점을 관리하는 플러그인이다. Claude Code 세션이 컨텍스트 한계에 닿으면 전체 대화가 요약본 하나로 압축되고 원본은 삭제된다. 요약은 코드엔 나쁘지 않지만, 운영 상태—"이 Push는 이미 승인됐다