AI 코딩 도구를 쓰면서 한 번쯤 이런 경험이 있을 것이다. 분명히 지시사항을 썼는데 에이전트가 무시했다. 더 강조해서 다시 썼는데도 달라지지 않았다. 그 순간 자연스럽게 드는 결론은 '모델이 멍청한 거 아닌가'다. 하지만 진짜 이유는 그보다 훨씬 앞 단계에 있다. 모델이 그 지시사항을 애초에 읽지 못했을 가능성 말이다.
세 편의 글을 엮으면 지금 AI 개발 도구를 둘러싼 흥미로운 긴장감이 하나의 그림으로 그려진다. AI가 UI 자체를 동적으로 생성하는 Generative UI 대시보드 구축 사례, 코딩 에이전트가 지시사항을 조용히 무시하는 세 가지 메커니즘, 그리고 Anthropic이 Claude Code 시스템 프롬프트의 80%를 삭제한 후 달라진 워크플로우 최적화 전략. 각각은 독립된 주제처럼 보이지만, 실은 같은 질문을 향하고 있다. AI 도구를 어디까지, 어떻게 믿어야 하는가.
AI가 UI를 직접 그린다는 것의 의미
dev.to의 'The dashboard that builds itself'는 흥미로운 실험에 대한 기록이다. 사용자가 "Q3는 어땠어?"라고 물으면, 텍스트 응답 대신 통계 카드와 차트로 이뤄진 대시보드가 화면에 스트리밍된다. AI가 사용자의 질문에 반응해 UI 자체를 실시간으로 설계하는 Generative UI의 전형적인 사례다.
이 프로젝트의 핵심 설계 결정은 AI가 코드를 쓰지 않는다는 것이다. Generative UI를 구현하는 방법은 크게 세 가지인데, 가장 직관적인 방식은 AI가 HTML/CSS/JS를 직접 생성하는 것이다. 실제로 Gemini에서 이런 방식을 볼 수 있다. 그런데 자신의 프로덕트에서 이 방식을 쓰면 사용자 브라우저에서 AI가 작성한 코드가 실행된다는 뜻이고, 악의적인 입력이 AI를 통해 XSS 공격으로 연결될 수 있다.
그래서 저자가 선택한 방식은 'AI는 메뉴에서 주문만 한다'는 구조다. Google이 2025년 12월 발표한 A2UI(Agent to UI) 프로토콜을 사용해, AI는 어떤 컴포넌트를 어떤 값으로 배치할지를 데이터 형태로만 기술하고, 렌더링은 클라이언트가 미리 정의한 컴포넌트 카탈로그에서만 처리된다. UI가 코드가 아닌 데이터로 여행한다.
더 정교한 설계 포인트는 모델이 A2UI 프로토콜을 직접 출력하지 않는다는 것이다. 대신 OpenAI의 구조화된 출력(Structured Outputs)을 통해 6가지 블록 타입으로 제한된 스키마를 강제한다. 모델이 생성한 블록은 백엔드 컴파일러가 A2UI 메시지로 변환해 SSE(Server-Sent Events)로 브라우저에 스트리밍한다. 스키마를 강제함으로써 모델은 존재하지 않는 7번째 컴포넌트 타입을 만들어낼 수 없고, 필수 필드를 빠뜨릴 수도 없다. '보통은 하지 않는다'가 아니라 '구조적으로 할 수 없다'.
스트리밍 중 미완성 카드 처리 방식도 눈에 띈다. 모델이 다음 카드를 시작해야만 이전 카드가 완성됐다고 판단하고, 마지막 카드는 항상 최종 검증 후에 오버라이트한다. 같은 데이터 경로, 같은 컴포넌트 ID를 덮어쓰는 방식이라 스트리밍 중 서둘러 렌더링된 오류가 자연스럽게 수정된다. 이런 작은 안전망들이 쌓여서 'AI가 UI를 그린다'는 것이 무섭지 않고 평범한 일이 된다.
에이전트가 지시사항을 무시하는 진짜 이유
이 흥미로운 Generative UI 실험과는 대조적으로, 일상적인 AI 코딩 도구 사용에서는 훨씬 낮은 수준의 문제가 반복된다. dev.to의 'Three ways your coding agent silently never reads your instructions'는 모델 탓을 하기 전에 먼저 확인해야 할 세 가지 구체적인 메커니즘을 짚는다.
첫 번째는 Cursor의 .md 파일 무시 문제다. .cursor/rules 디렉토리 안의 룰 파일은 반드시 .mdc 확장자를 써야 한다. 완벽히 올바른 위치에, 완벽히 올바른 내용을 담은 .md 파일은 아무런 경고 없이 조용히 무시된다. 더 교묘한 것은, 과거에 .md 파일이 작동했다고 기억하는 사람들이 있다는 점이다. 어느 업데이트 시점에서 조용히 동작이 바뀌었고, 아무것도 공지되지 않았다. '한 번 확인했다'는 사실이 보호막이 되지 않는다는 뜻이다.
두 번째는 Codex의 AGENTS.md 합산 트런케이션이다. Codex는 작업 디렉토리에 적용되는 모든 AGENTS.md 파일을 이어붙인다. 문제는 32KB 제한이 각각의 파일이 아니라 합산된 전체 페이로드에 적용된다는 것이다. 파일 하나하나를 보면 전부 괜찮아 보이지만, 합치면 제한을 초과한다. 저자가 실제로 테스트한 레포는 AGENTS.md 파일 4개의 합이 65.6KB였고, 33.6KB가 잘려나갔다. 주의 깊게 맨 아래에 배치한 룰이 모델에게는 존재하지 않는 룰이 된다.
세 번째는 Claude Code 스킬 설명의 1,536자 트런케이션이다. 스킬 목록에서 description과 when_to_use의 합산이 1,536자를 넘으면 잘린다. 트리거 예시를 5개 써놨는데 마지막 2개가 사라지면, 그 조건에서 스킬이 자동으로 선택되지 않는다. 스킬이 게으른 게 아니라, 모델이 그 트리거 조건을 몰랐을 뿐이다.
세 경우 모두 공유하는 패턴이 있다. 실패가 내부에서는 보이지 않는다. 파일은 디스크에 있다. 에디터에서도 보인다. 코드 리뷰에도 올라간다. 하지만 에이전트는 그 중 일부만 읽었고, 어느 부분이 잘렸는지 알려주지 않는다.
저자는 여기서 한 걸음 더 나아간다. 일반 문서는 사람이 읽다가 '이 경로 이상한데?'라고 눈치챈다. 하지만 에이전트는 눈치채지 못한다. 3월에 삭제된 파일 경로를 아직도 지시사항에 적어두면, 에이전트는 완전한 확신을 갖고 그 지시를 따르려 한다. 118개 오픈소스 레포를 스캔한 결과 59%에서 적어도 하나의 죽은 참조를 발견했다고 밝힌다. 관리가 잘 된 프로젝트들에서도 예외가 아니었다.
더 강한 모델일수록, 더 짧은 지시사항이 맞다
여기서 세 번째 글이 맥락을 뒤집는다. Anthropic이 Claude Code의 시스템 프롬프트 중 80% 이상을 삭제했다. 코딩 평가 지표에서 측정 가능한 손실은 없었다. dev.to의 'Anthropic deleted 80% of Claude Code's system prompt'는 이 변화가 무엇을 의미하는지, 그리고 자신의 워크플로우에서 무엇을 바꿔야 했는지를 정리한다.
삭제된 이유가 핵심이다. 그 지시사항들은 약한 모델을 통제하기 위해 존재했다. Opus 5나 Fable 5 같은 모델에서는 오히려 역효과를 낳는다. 모델이 서로 충돌하는 규칙들 중 어느 것이 우선인지 파악하는 데 토큰을 소모하고 나서야 실제 코드에 손을 댄다. 더 강한 모델에게 더 많은 지시사항은 도움이 아니라 노이즈다.
이 맥락에서 실무 워크플로우에 영향을 주는 변화들이 나온다. 롤플레이 프롬프트("당신은 20년 경력의 시니어 개발자입니다")는 더 이상 효과가 없다. 금지 목록을 늘리는 방식도 문제가 된다. "너무 길게 쓰지 마라" 대신 "최대 5문장으로 답해라"처럼, 금지형 지시사항을 긍정형 제약으로 바꾸는 것이 낫다. 모델이 서로 충돌하는 금지 조항들을 조율하느라 리소스를 낭비하지 않도록.
캐싱 전략도 재고할 필요가 있다. Claude Code는 모든 요청에 전체 히스토리를 보내고, 캐싱은 요청 시작부터의 정확한 프리픽스 매칭으로 작동한다. 비용을 아끼려고 Opus에서 Sonnet으로 모델을 전환하면, 모델 캐시가 분리돼 있어 전체 히스토리가 캐시 미스로 처리된다. 오히려 더 많은 비용이 든다. 여러 모델이 필요하다면 스위칭이 아니라 서브에이전트로 분리하는 구조가 맞다.
컨텍스트 창이 크다는 것과 모델이 그 내용을 잘 기억한다는 것은 다른 이야기다. Anthropic이 공개한 MRCR v2 수치를 보면 256K 토큰에서 93%, 1M 토큰에서 76%다. 컨텍스트 창이 가득 찰수록 모델의 신뢰성이 떨어진다. 서브태스크가 끝날 때마다 /clear, 자연스러운 중단점마다 /compact를 쓰고, 긴 작업은 핸드오프 파일을 만들어 새 세션에서 이어가는 위생 습관이 중요해진다.
강제해야 할 규칙은 CLAUDE.md가 아니라 훅에 넣어야 한다. CLAUDE.md는 Claude에게 전달되는 컨텍스트지, 강제되는 설정이 아니다. 인코딩 검사나 크리덴셜 접근 차단처럼 모델의 판단과 무관하게 반드시 지켜야 할 규칙은 PreToolUse 훅으로 구현하는 것이 맞다. 그리고 세션 중간에 CLAUDE.md를 수정해도 현재 세션에는 적용되지 않는다. 새 내용은 다음 /clear, /compact, 또는 재시작 이후에 로드된다.
믿음의 조건을 직접 설계하는 것
세 편의 글이 수렴하는 지점은 결국 하나다. AI 도구를 신뢰하는 것은 맹목적인 믿음이 아니라 구조적 신뢰여야 한다는 것. Generative UI 대시보드가 스키마로 모델의 출력을 강제하고, 클라이언트가 정의한 컴포넌트 카탈로그 밖으로 나가지 못하게 막는 것처럼. 코딩 에이전트에게 지시사항을 전달할 때 그것이 실제로 도달했는지 확인 가능한 방식을 만드는 것처럼. 더 강한 모델에게는 더 적은 지시사항이, 더 명확한 제약이, 더 결정론적인 훅이 맞다는 것을 이해하는 것처럼.
'더 길고 강력한 프롬프트'가 정답이던 시절은 지나가고 있다. 지금의 AI 개발 워크플로우는 프롬프트 분량 경쟁이 아니라, 무엇을 모델에게 맡기고 무엇을 구조로 강제할지를 구분하는 설계의 문제다. 에이전트가 지시사항을 무시했다고 느낄 때, 가장 먼저 물어야 할 질문은 이것이다. 그 지시사항이 애초에 에이전트에게 닿기는 했는가.