4/11/2026

AI를 쓰고 있는데, 왜 바뀌지 않을까?

Man On Arrow
Photo by Smart on Unsplash

현재 AI를 쓰지 않는 조직은 거의 없다. 레포트에 따르면 약 88%의 기업이 최소 한 개 이상의 업무에 AI를 활용하고 있다고 한다.

하지만 질문을 하나 던져보면 답이 달라진다.

"그 AI가 조직의 결과를 바꿨는가?"

또 다른 연구에서는 기업의 생성형 AI 프로젝트 중 95%가 실제 성과에 영향을 주지 못했다고 한다. 이건 기술 문제가 아니다.

AI는 이미 작동하고 있다.
작동하지 않는 것은 조직이다.

실패의 본질 - 우리는 AI를 "도입"하고 있다.

AI 프로젝트 실패율은 자료마다 다르지만, 대략 70% ~ 95% 수준이라는 공통된 범위가 나온다.
이 숫자의 핵심은 실패율이 아니라 "실패 이유"이다.
대부분의 실패 원인은 다음과 같다.

  • 기술 문제 X
  • 조직 문제 O

연구에 따르면 AI 실패의 63%는 기술이 아니라 인간, 조직 요인에서 발생한다. 여기서 중요한 차이가 하나 나온다.

도입 vs 전환

  • 도입: AI 도구를 업무에 추가
  • 전환: 업무 자체를 다시 설계

문제는 대부분의 기업이 전환이 아니라 도입을 하고 있다는 점이다.

AX팀 패러독스 - 전환을 하겠다고 하면서 더 멀어진다.

FLowkater 블로그의 "AX Team Paradox" 글에서 매우 중요한 통찰이 하나 제시된다.

AX팀을 만드는 순간, AX는 실패한다.

위 문장은 과장처럼 보일 수 있지만 구조적으로 보면 맞다고 생각된다. 이유는 단순한다.

AX의 본질은:

  • 의사결정 -> 실행 간 거리 축소
  • 중간 레이어 제거

그런데 아래의 조직을 만든다:

  • AX팀
  • AI TF
  • 전환 조직

즉, 단순한 실행 문제를 넘어서 구조적 모순이다라는 점이다.

계층을 줄여야 하는데
계층을 하나 더 추가하는 모양새다.

개인은 변했지만 조직은 변하지 않았다.

현재 기업에서 실제로 일어나는 변화는 대부분이 아래 수준이다.

  • 개발자 -> Claude Code, Cursor, Codex 등 사용
  • 마케터 -> GPT 사용
  • 기획자 -> AI 리서치 사용

즉, 개인 생산성은 올라간다.

하지만 조직 수준에서는:

  • 승인 프로세스 변화 없음
  • 핸드오프 변화 없음
  • KPI 변화 없음

결과적으로 "고도화된 각자도생" 상태가 된다.

이건 MacKinsey 레포트와도 정확하게 일치한다.

AI 성과를 내는 기업은 워크플로우를 재설계한다.

왜 조직은 바뀌지 않는가?

AI 전환이 어려운 이유는 크게 3가지라고 본다.

조직 구조의 문제

기존 조직은 역할 기반이다.

  • PM
  • 기획
  • 개발
  • QA
  • 운영 등

AI는 위 구조를 무너뜨린다. 한명이 기획 -> 개발 -> 테스트를 수행할 수 있게 만든다.
하지만 조직은 그대로 유지된다.

결과적으로 AI는 도입했지만, 병목은 그대로 유지된다.

정체성의 문제

AI 전환은 단순한 생산성 문제가 아니다.

"나는 개발자다"
"나는 기획자다"

이 정체성이 흔들린다. 그래서 서로 가지 않았던 영역을 걸어가야 한다고 가이드하고 있다.
즉, AI는 업무를 바꾸는 것이 아니라, 사람의 역할을 재정의한다.

시스템의 문제 (하네스 부재)

현재 대부분의 기업은 여러 AI 도구를 가지고 있다. 그러나 없는 것이 있다. (물론 있는 기업도 있다.)

"어떻게 같이 일하게 할 것인가?"

이게 바로 하네스(Harness) 문제다.

전환의 본질 - 조직을 다시 설계하는 것

McKinsey에서는 이 문제에 대해 이야기한다. "AI 경쟁력은 기술이 아니라 어떻게 적용하느냐에서 나온다." 그리고 가장 중요한 요소는 "워크플로우 재설계"라고 언급한다.

즉, AI는 기능 자동화 기술이 아니라 조직 구조를 바꾸는 도구다.

새로운 운영 모델

AI 전환의 끝에는 완전히 다른 조직 형태가 나온다. 그 특징은 아래와 같다.

  • 역할 중심 -> 결과 중심
  • 부서 중심 -> 문제 중심
  • 사람 중심 -> 사람 + AI Agent 협업

그리고 가장 중요한 변화는.,

"팀"의 정의가 바뀐다.

단순한 자동화가 아니라 조직 단위 자체의 변화다.

핵심 매커니즘 - 하네스 엔지니어링

AI 전환의 핵심은 모델이 아니다. 물론 모델도 중요하다. 하지만 모든 작업에 동일한 모델을 사용하지 않을 것이다. 이것만큼 비효율은 없으니까...

Orchestration

그래서 하네스 엔지니어링이 필요하다. 구성 요소는 다음과 같다.

  • 역할 정의 (Agent)
  • 워크플로우
  • 메모리
  • 피드백 루프

Zero Human Company - 전환의 끝

AI 전환의 궁극적인 형태는...

  • 사람은 실행하지 않는다.
  • 사람은 설계한다.

즉,

"운영하는 회사" -> "설계하는 회사"

위 개념은 아직 극단적으로 보이지만, 이미 일부 영역에서는 현실이 되고 있다.

실행 전략 - 어떻게 시작할 것인가?

현실적인 전략은 다음에 언급하는 네 가지이다.

AX팀을 만들지 말 것

별도 조직을 만들지 말고, 기존 조직 내에 embedding 해야 한다.

도구가 아니라 워크플로우 설계

AI 도구 도입이 우선시 되는 것이 아니라, End-to-End를 AI기반으로 설계해야 한다.

개인 자동화에서 조직 자동화로

개인 생산성은 이미 어느정도 올라가 있다. 이것을 조직 구조 변화로 확장해야 한다.

역할을 다시 정의

하나의 질문을 해보자.

"AI가 60%를 하면, 남은 40%는 무엇인가?"

마무리

AI는 이미 충분히 발전했다. 문제는 기술이 아니라고 생각한다.

AI는 도입하는 순간 실패하고, 조직을 다시 설계하는 순간 시작된다.

위 차이를 이해하는 것과 이해하는 못한 상황의 격차는 앞으로 훨씬 더 벌어질 것이다.

References:

4/10/2026

모델이 읽는 쓰레기 줄이기

요즘 팀내에서 토큰 부족 현상이 자주 발생한다. 

Budget을 무한정 투입할 수 없는 상황이라 여러 고민을 하던 중, Github에 꽤 괜찮은 Repo가 있는 것을 발견했다. 팀에 내용을 공유하고 여기에 정리해본다.

A close up of a thermometer and a hose
Photo by camera obscura on Unsplash

AI 코딩 도구를 처음에 쓸땐 대부분 감탄한다. 코드를 읽고, 테스트를 수행하고, 수정안을 내놓는 속도가 생각보다 빠르다. 사람보다 빠르다는 말이 과장이 아닐 때도 있다.

그러나 오랫동안 붙잡고 있으면 문제가 나타난다. 대화가 길어질수록 에이전트가 점점 이상해진다. 방금 전까지 이해하던 문맥을 놓치고, 이미 확인한 내용을 다시 확인하고, 중요하지 않은 로그에 매달린다. 모델이 멍청해졌다기보다는 모델이 읽는 환경이 나빠졌다고 봐야한다.

RTK는 이런 문제를 해소하기 위해 등장했다. 공식 설명은 단순하다.

CLI 출력이 LLM의 context window에 들어가기전에 필터링하고 압축하는 CLI Proxy이다.

즉, 모델을 바꾸는 도구가 아니라, 모델에게 들어가는 입력의 형태를 바꾸는 도구다. CLI noise를 줄여 더 나은 reasoning, 더 긴 세션, 더 낮은 비용을 만들기 위함히다.

우리는 종종 더 큰 모델, 더 긴 컨텍스트, 더 좋은 에이전트를 원한다. 하지만 실제 사용에서 문제가 되는 것은 모델의 지능이 아니라 입력의 질이다. 지나치게 장황한 git diff, 쓸모없는 pass log로 가득한 cargo test, 사람이 터미널에서 볼 때는 무해하지만, 모델에게는 비용과 혼란만 남기는 출력들... RTK는 이 문제를 아래와 같이 접근한다.

모델이 읽는 터미널은 아직도 인간용으로 설계되어 있다.

공식 사이트를 보면 숫자가 매력적이다. 평균 89%의 노이즈 제거, 3배 더 긴 세션을 언급한다. 대체로 큰 폭의 출력 압축을 지향하지만 수치는 커맨드와 환경에 따라 다르다고 인지해야 한다.


RTK의 구조는 생각보다 단순하다. Github 아키텍처 문서를 보면 이 도구는,

  1. 특정 커맨드를 감지하고
  2. 원래 커맨드를 실행한 뒤
  3. stdout/stderr를 캡쳐하고
  4. 커맨드 종류에 맞는 필터를 적용하고
  5. 더 짧은 형태로 다시 출력한다.

즉, RTK는 커맨드별 규칙 기반 압축기이다. 단순해서 신뢰가 간다. 모델이 요약하는 구조가 아니라, 개발 도구의 출력 형식을 사람이 이해 가능한 규칙으로 재구성하는 쪽에 가깝기 때문이다.

그렇다고 RTK를 단순한 "토큰 절약기"로만 보는 것은 이 도구의 확장성 관점에서 아깝다. RTK는 LLM용 인터페이스 레이어라고 볼 수 있다.

우리가 사용하는 CLI는 원래 인간을 위한 인터페이스다. 행 단위로 길게 출력하고, 강조를 위해 반복하고, 상태를 친절하게 설명하고, 때때로 인테리어 장식도 넣는다. 그중 사람은 필요한 것만 골라서 본다.

반면 대부분 LLM의 경우는 사람처럼 골라보지 못한다. 읽을 수 있는 것은 읽고, 읽은 것은 비용이 되고, 비용은 곧 컨텍스트 오염이 된다. RTK는 이 오래된 CLI를 LLM 친화적으로 번역한다. 같은 사실을 더 짧고 구조적으로 표현하는 것이다.

이 아이디어는 생각보다 큰 의미를 가진다. AI 시대에 경쟁력이 모델 그 자체에서만 생기는 것이 아니라, 모델이 무엇을 어떤 형태로 읽게 하느냐에서 생길 수 있단느 점을 보여주기 때문이다.

물론, 모든 컨텍스트 문제의 해결사는 아니다. Shell 출력이라는 오염원 하나를 잘라내는 도구로 봐야 한다. 그러나 이것만 해도 꽤 큰 오염원 제거이다. 현실의 생산성 도구는 대체로 이렇게 부분적인 문제를 해결해나가기 때문이다.

이제까지 살펴본 바로는 이 프로젝트는 "더 똑똑한 모델"을 포커싱하는 것이 아니라, "더 적절한 입력"을 문제의 중심에 놓고 있다. 지금까지 AI 도구 시장은 주로 모델 교체를 경쟁처럼 진행되었다. GPT가 좋냐, Claude가 좋냐, Gemini가 좋냐 등... 그런데 현장에서는 종종 더 하위 레이어가 중요하다. 파일을 어떻게 읽히게 할 것인가, 테스트 결과는 어디까지 보여줄 것인가, diff를 어떤 단위로 잘라줄 것인가, 이런 문제들은 모델의 IQ보다 입구의 형식과 더 가깝다. RTK는 이 문제에 접근해서 풀어냈다.

이미 있는 모델이 쓸데없는 것을 덜 읽게 만든다.

이것은 화려하진 않지만 대단히 실용적이다.

그런데, 불편한 점도 존재한다. 압축은 trade-off다. 출력이 짧아진다는 것은 토큰 낭비를 덜한다는 점에서 좋아보이지만, 어떤 상황에서는 정보 손실이 될 수 있다. 상황에 따른 호불호가 있다고 생각된다. 그래서 RTK에서는 언제 압축하고 언제 원본으로 돌아갈지를 사용자가 통제할 수 있게 하였다.

이 프로젝트는 단순한 유틸리티로 볼 수도 있다. 하지만 AI Native 개발 환경 관점에서 보면 느낌이 다르다.

모델은 두뇌이고, RTK와 같은 도구는 감각을 정리하는 장치다.

두뇌를 키우는 일만큼, 들어오는 감각을 정제하는 일도 중요하다는 것을 이 도구가 보여주기 때문이다.

결국 RTK가 던지는 질문은 단순하다.

정말 필요한 것은 더 큰 모델일까? 아니면 더 깨끗한 입력일까?

아마도 답은 둘 다일 것이다. 그러나 현장에서는 두 번째가 더 중요하다. 더 큰 모델은 비싸고, 느리고, 언제나 접근 가능하지 않기 때문이다. 반면 입력을 정리하는 일은 상대적으로 싸고, 빠르고, 바로 적용이 가능하다. 이 작은 도구는 거대한 AI 혁신처럼 보이지는 않지만, 실제 사용 경험의 병목을 직접 건드린다.

"LLM이 읽는 모든 것을 더 많이 넣자!"는 방향이 아니라, "LLM이 읽을 가치가 없는 것을 빼자!"는 방향을 선택한다.

이 프로젝트가 의미 있다고 보는 이유는, 문제를 정확히 문제로 본다는 데 있다. AI 코딩의 병목은 모델안에만 있지 않다. 종종 모델 바깥, 터미널의 지저분한 출력과 도구 체인에 있을 수 있다.

즉, "AI가 일하는 환경을 인간 중심 인터페이스에서 기계 중심 인터페이스로 번역하려는 시도다."

나는 이런 종류의 시도가 앞으로 더 많아질 것이라고 본다. 모델이 좋아질수록, 오히려 모델 앞단의 정제 레이어가 더 중요해질 가능성이 크기 때문이다.

지금 이 모델은, 무엇을 읽고 있는가?


References:

  1. https://github.com/rtk-ai/rtk
  2. https://www.rtk-ai.app/

Unlearning - 배운 것 중 필요없는 것을 버리는 능력

If you use this image, we’d appreciate a link back to our website www.quotecatalog.com.
Photo by Thought Catalog on Unsplash

우리는 그동안 지식, 경험, 확신을 계속 쌓아왔다. 더 많이 알고, 더 정교한 프레임을 갖고, 더 많은 경험을 쌓는 사람이 결국 더 멀리 간다고 생각했다. 

실제로 그동안 역사에서 그것은 맞는 말이었다. 산업화 시대에도 그랬고, 디지털 전환 초반에도 그랬다. 문제는 지금이다. 지금은 많이 아는 사람이 아니라, 무엇을 계속 붙잡고 있는지 스스로 의심할 수 있는 사람이 더 멀리 간다. 새로운 것을 배우는 능력보다, 한때 나를 성공시켰던 방식을 내려놓는 능력이 더 중요해진 시대다.

경영학에서 이 문제를 오래전부터 다뤄온 개념이 바로 organizational unlearning이다. 고전적으로는 Hedberg가 조직이 학습할 뿐 아니라 “기존의 이해와 방식을 벗어나는 과정”도 필요하다고 보았고, 이후 연구들은 이를 조직 변화의 핵심 주제로 확장해 왔다.

대부분 unlearning을 “잊는 것” 정도로 이해한다. 하지만 연구자들은 대체로 그렇게 보지 않는다. 최근 리뷰들은 unlearning을 단순한 망각이 아니라, 더 이상 적합하지 않은 지식/루틴/기억 구조를 의도적으로 약화시키거나 버리는 과정으로 정리한다.

이 차이는 생각보다 중요하다. 그냥 시간이 흘러서 잊어버리는 것은 forgetting에 가깝다. 하지만 “이 방식은 더 이상 맞지 않는다”는 판단 아래 기존의 신념, 관행, 규칙, 평가기준을 흔들고 재배치하는 것은 unlearning에 가깝다. 

다시 말해 unlearning은 기억의 자연 소멸이 아니라, 판단 체계의 의도적 수정이다. 그래서 이 개념은 개인보다도 조직 변화, 혁신, 전략 전환, 리더십, 팀 실험과 더 자주 연결된다.

이 지점에서 Chris Argyris의 double-loop learning은 여전히 유효하다. Argyris는 조직이 오류를 수정하는 데에도 두 단계가 있다고 봤다.

하나는 기존 목표와 규칙을 그대로 둔 채 그 안에서 오차를 고치는 방식이고, 다른 하나는 아예 그 목표와 규칙 자체, 즉 “governing variables”를 다시 묻는 방식이고, 이것이 double-loop learning이다.

이 개념은 unlearning과 동일하지는 않지만, 실제 조직에서 unlearning이 일어나는 방식과 깊게 닿아 있다. 왜냐하면 기존의 운영 변수와 기준을 바꾸지 않으면, 새로운 학습은 대부분 낡은 프레임 안에 흡수되기 때문이다. 결국 무언가를 새로 배우는 일보다 먼저 필요한 것은, 지금의 기준이 여전히 맞는지를 묻는 일이다.

그래서 unlearning은 학습의 반대말이 아니다. 정확하게 말하면, 제대로 배우기 위해 필요한 해체 과정에 가깝다. 조직은 흔히 새로운 시스템을 도입하고, 새로운 도구를 교육하고, 새로운 KPI를 붙이면 변화가 일어난다고 생각한다. 하지만 현실에서는 새 제도가 들어와도 사람들은 예전 방식으로 해석하고 예전 방식으로 사용한다.

그래서 AI를 도입해도 구조는 쉽게 바뀌지 않는다. 승인 체계는 그대로 남고, 보고 방식도 달라지지 않는다. 클라우드로 옮겨도 온프레미스 시절의 의사결정 속도와 통제 습관이 그대로면 혁신은 지연된다. 애자일을 선언해도 실패를 허용하지 않는 평가 체계가 유지되면 팀은 더 자주 회의할 뿐 덜 실험하지는 않는다. 최근 연구들이 unlearning을 개인, 팀, 조직의 여러 수준에서 동시에 봐야 한다고 강조하는 이유가 여기에 있다.

이제 왜 지금 unlearning이 중요한지 생각해볼 필요가 있다.

첫째는 환경 변화의 속도 때문이다. 과거에는 한번 익힌 지식의 유효기간이 꽤 길었다. 제품 사이클도 길었고, 조직 구조도 비교적 천천히 변했다. 하지만 지금은 시장, 기술, 규제, 고객 기대가 동시에 빠르게 바뀐다.

최근 리뷰들은 조직 기억이 개인 기억, 팀 기억, 루틴과 관행, 디지털 저장소까지 여러 레이어위에 저장된다고 설명하는데, 문제는 이 기억 구조가 환경 변화보다 느리게 움직인다는 점이다. 조직은 늘 이미 지나간 현실에 맞춰 최적화되어 있기 쉽다. 이럴 때 필요한 것은 추가 학습보다 현재를 더 이상 설명하지 못하는 기억 구조를 약화시키는 일이다.

둘째는 AI 시대의 아이러니 때문이다. 많은 사람이 AI 시대를 “배움이 쉬워진 시대”로 말한다. 분명 맞는 말이다. 정보 접근 비용은 낮아졌고, 코드 작성, 문서 초안, 자료 조사, 번역, 요약 같은 지식노동의 진입장벽은 빠르게 내려가고 있다.

그래서 무엇을 새로 배우느냐보다 어떤 프레임으로 질문하느냐가 더 중요해졌다. 기존 방식대로 질문하면 기존 방식대로 답을 얻는다. 기존 조직 논리 안에서 AI를 배치하면 AI는 혁신 엔진이 아니라 자동화된 보조 인력으로 축소된다. 이때 필요한 것은 “AI를 배우자”라는 구호가 아니라, “우리가 일을 정의하는 방식부터 다시 볼 수 있는가”라는 질문이다. 이것은 기술 도입의 문제가 아니라 unlearning의 문제다.

unlearning이 어려운 이유는 아래와 같다.

첫째, 사람은 자신이 틀렸다는 사실보다 자신이 틀릴 수 있다는 사실을 견디기 어려워한다. 오래 써온 개념, 익숙한 루틴, 성과를 냈던 프레임은 단순한 지식이 아니라 정체성의 일부가 된다. 그래서 unlearning은 정보 업데이트보다 훨씬 불편한 경험이다.

둘째, 조직 차원에서는 성과평가와 보고체계가 이를 더 어렵게 만든다. 조직은 예측 가능성과 반복 가능성을 좋아한다. 반면 unlearning은 대체로 불확실성과 실험, 일시적 혼란을 수반한다.

셋째, 성공 경험이 강할수록 더 버리기 어렵다. 실패한 방식은 쉽게 버릴 수 있지만, 성공한 방식은 마지막까지 남는다. 바로 이 때문에 많은 기업이 위기 때보다 호황기 말기에 더 취약하다.

unlearning은 종종 도전(challenge)으로 시작된다. 여기서 challenge는 단순한 반항이 아니다. 지금의 질서, 지금의 설명, 지금의 성공 공식을 다시 질문하는 과정이다. 무엇이 당연한가를 묻는 순간, 조직은 비로소 현재를 현재의 언어로 보기 시작한다. 어떤 사람의 생각이 바뀌는 것만으로는 unlearning이 완성되지 않는다. 기준, 프로세스, 루틴, 자원 배분, 승인 구조가 함께 바뀌어야 한다.

그렇다면 실무에서 unlearning은 어떻게 일어나는가? 나는 이것을 세 단계로 설명하는 편이 가장 현실적이라고 본다.

첫 번째는 인식이다. 지금의 문제가 실행력 부족인지, 아니면 전제 자체가 낡았는지 구분해야 한다. 대부분의 조직은 낡은 프레임의 문제를 실행의 문제로 오해한다. 고객 반응이 달라졌는데 메시지의 빈도를 높이거나, 제품 구조가 바뀌었는데 보고 횟수를 늘리거나, 전략의 전환이 필요한데 예전 KPI를 더 엄격히 적용한다. 이 단계에서 필요한 질문은 단순하다. 

“우리는 무엇을 너무 당연하게 여기고 있는가?”

두 번째는 분리다. 낡은 지식이 사람의 능력 부족 때문인지, 루틴 때문인지, 제도 때문인지 떼어서 봐야 한다. 조직 기억은 개인 기억만이 아니라 팀 기억, 루틴과 관행, 디지털 저장소에 분산되어 있다. 그래서 unlearning은 교육만으로 해결되지 않는다. 사람은 바뀌었는데 회의체가 안 바뀌면 예전 방식이 돌아오고, 프로세스가 바뀌었는데 데이터 정의가 안 바뀌면 같은 판단이 반복된다. 시스템 차원에서 무엇이 기존 질서를 지탱하는지 분리해 보지 않으면, 조직은 늘 “새로운 언어로 옛날 일”을 하게 된다.

세 번째는 대체다. 버리는 것만으로는 조직이 움직이지 않는다. 기존 신념과 관행을 제거한 자리에 새로운 해석과 루틴이 들어와야 한다. 새로운 제도가 실제로 반복되고 저장되는 구조를 만드는 일이다. 결국 조직은 기억하는 방식대로 움직이기 때문이다.

unlearning을 정말 쓰고 싶다면, 막연히 “과거를 버려야 한다”는 선언이 아니라 무엇이 어떻게 약화되었는지?, 무엇이 대체되었는지?, 그 변화가 실제 루틴과 의사결정에 어떻게 남았는지를 보여줘야 한다. 그렇지 않으면 unlearning은 그냥 멋있는 단어에 그친다.

실무에서 unlearning을 판단하는 가장 현실적인 기준은 이것이다.

  • 새로운 도구를 도입했는가? 가 아니라, 옛 판단 기준이 약해졌는가?
  • 새로운 조직도를 만들었는가? 가 아니라, 예전 승인 구조가 실제로 덜 중요해졌는가?
  • AI를 붙였는가? 가 아니라, 사람이 직접 해야 한다고 믿었던 일의 경계가 다시 그어졌는가?
  • 데이터를 쌓았는가? 가 아니라, 직관이 아니라 실험으로 결론 내리는 비율이 높아졌는가?

이 질문들에 “그렇다”고 답할 수 있을 때 비로소 unlearning은 시작된 것이다.

그래서 나는 unlearning을 혁신의 부속 개념으로 보지 않는다. 오히려 혁신의 앞단에 놓인 조건이라고 본다. 많은 조직이 transformation을 말하지만 실제로는 기존 운영 모델을 조금 더 디지털화하는 데 그친다.

이유는 단순하다. 학습은 했지만 unlearning은 하지 않았기 때문이다. 기존의 권한 구조, 성공 공식, 리스크 정의, 고객 이해 방식이 그대로면 혁신은 반드시 기존 질서의 범위 안으로 흡수된다. 결국 “새로운 것을 받아들일 준비”보다 더 중요한 것은 “기존 것을 의심할 준비”다. unlearning은 개인의 태도 변화로 끝나지 않고, 전략적 유연성, 혁신, 조직 성과와 연결될 가능성이 있지만, 그 효과는 언제나 맥락과 구조를 탄다.

결국 unlearning은 많이 배운 사람에게 더 어려운 일이다. 많이 아는 사람은 더 많은 설명을 가지고 있고, 더 많은 성공 경험을 가지고 있으며, 더 많은 정당화를 할 수 있다. 그렇기에 배움의 총량이 많은 사람이 반드시 변화에 강한 것은 아니다. 때로는 반대다. 진짜 유연한 사람은 많이 아는 사람이 아니라, 자신의 지식이 언제 낡아지는지 감지할 수 있는 사람이다. 조직도 마찬가지다. 더 많은 시스템을 가진 조직이 강한 것이 아니라, 그 시스템을 언제 내려놓아야 하는지 아는 조직이 강하다.

지금 시대에 learning은 기본 역량이 되었다. 누구나 배울 수 있고, 도구도 많고, 접근도 빠르다. 차이를 만드는 것은 그다음이다. 무엇을 더 추가하느냐보다, 무엇을 계속 들고 가지 않느냐가 더 중요해졌다. 그래서 앞으로의 경쟁력은 지식의 축적량만으로 설명되지 않을 것이다. 본 글에서 하고 싶은 이야기는 아래의 문장으로 정리된다.

"우리는 계속 배우고 있다. 문제는, 무엇을 아직도 버리지 못하고 있는가다." 


Refercences:

  • Bo Hedberg, How Organizations Learn and Unlearn (1981). (Semantic Scholar)
  • Chris Argyris, Double-Loop Learning in Organizations (1977). (Antonie van Nistelrooij)
  • Adrian Klammer et al., Organizational unlearning as a process: What we know, what we don’t know, what we should know (2024). (ResearchGate)
  • Samuele Maccioni et al., Navigating the unlearning landscape: an organizational unlearning taxonomy and an outcome-centric model (2024). (Emerald)
  • Annette Kluge, Recent findings on organizational unlearning and intentional forgetting research (2019–2022) (2023). (Frontiers)
  • Adrian Klammer & Stefan Gueldenberg, Unlearning and forgetting in organizations: a systematic review of literature (2019). (Emerald)
  • John Howells & Joachim Scholderer, Forget unlearning? (2016). (Sage Journals)

4/06/2026

gstack을 Antigravity로 포팅


AI 코딩 도구를 쓰다 보면 비슷한 순간이 온다.

  1. 처음에는 “정말 똑똑하네”에서 시작한다.
  2. 그다음에는 “이걸 어떻게 더 잘 시킬까?”로 넘어간다.
  3. 그리고 조금 더 쓰다 보면 결국 이런 고민을 하게 된다.

이걸 팀처럼 일하게 만들 수는 없을까?

내가 gstack에 관심을 가진 이유도 여기에 있었다.

gstack은 스스로를 단순한 스킬 모음이 아니라, Claude Code를 하나의 가상 엔지니어링 팀처럼 움직이게 만드는 방식으로 설명한다. 

CEO, 엔지니어링 매니저, 디자이너, 리뷰어, QA 리드, 보안 담당, 릴리즈 엔지니어 같은 역할이 나뉘어 있고, 전체 흐름이 Think → Plan → Build → Review → Test → Ship → Reflect로 설계되어 있다. 

즉, 핵심은 프롬프트 몇 개가 아니라 역할 분리와 작업 순서에 있다.

요즘 AI 도구들은 대부분 “잘 대답하는가?”에 초점이 맞춰져 있다. 그런데 gstack은 한 걸음 더 들어가서 “어떤 순서로 일하게 만들 것인가”를 다룬다. 

  1. `/office-hours`로 문제를 다시 정의하고, 
  2. `/plan-ceo-review`와 `/plan-eng-review`로 범위와 구조를 다듬고, 
  3. `/review`, `/qa`, `/ship`으로 마무리하는 흐름은 실제 팀이 일하는 방식과 꽤 닮아 있다. 
그래서 gstack을 처음 봤을 때 든 생각은 신기하다보다 이건 실무에 더 가깝다는 쪽이었다.

그런데 여기서 다음 질문이 생겼다.

좋은 건 Claude Code 자체일까, 아니면 gstack의 워크플로우일까?

gstack은 Claude Code 중심으로 설계돼 있다. 

설치 구조도 Claude 체계를 전제로 하고 있고, 브라우저 자동화 역시 자체 browse 흐름을 기준으로 설명한다. 

ARCHITECTURE 문서에서는 persistent browser와 long-lived Chromium daemon을 유지해서 첫 호출 이후에는 빠르게 재사용하고, 세션과 탭 상태도 이어가는 방식이라고 설명한다. 

즉, 원본 gstack은 단순한 명령어 모음이 아니라 브라우저 기반 검증과 리뷰까지 포함한 일종의 소프트웨어 팩토리에 가깝다.

그래서 Antigravity로의 포팅은 이름만 바꾸는 작업이 될 수 없었다. 그냥 복사해서 붙여넣는다고 되는 구조가 아니었기 때문이다.

gstack의 핵심은 명령어 목록 그 자체가 아니라, 그 명령들이 어던 런타임 위에서 어떤 철학으로 연결되는가에 있다.

결국 이 작업은 포팅이라기보다 번역에 가까웠다. 원본의 철학과 흐름을 이해한 뒤, 그것을 Antigravity의 문법으로 다시 써야 했기 때문이다.

gstack-antigravity는 바로 이 관점에서 시작되었다. 물론 내가 antigravity를 자주 사용하는 이유도 있었다.

내가 사용하기 위해서는 Antigravity 환경에 맞춘 네이티브 포팅이 필요했고, 그 과정에서 Thin Router Architecture, Native Browser Integration, Cross-Platform Parity를 고민하게 됐다. 

즉, 원본을 그대로 흉내 내는 포크가 아니라, 원본 워크플로우를 Antigravity 쪽에서 오래 버틸 수 있게 다시 설계한 포팅이라고 보는 편이 맞다.

또 하나는 토큰 문제였다.

AI 워크플로우를 오래 쓰다 보면 언젠가는 비슷한 문제를 겪게 된다.

처음에는 잘 되는데, 문맥이 길어질수록 점점 느려지고, 작업이 커질수록 흐름이 흐트러진다. 특히 역할과 규칙이 많아질수록, 매번 모든 설명을 통째로 들고 다니는 방식은 금방 무거워진다. 

gstack-antigravity는 이 문제를 해결하기 위해, 가벼운 규칙 파일이 먼저 라우터처럼 동작하고 실제 워크플로우가 호출될 때만 필요한 내용을 읽어오는 방향을 택했다.

모든 걸 항상 들고 있는 구조가 아니라, 필요한 순간에 필요한 것만 가져오는 구조를 지향하는 셈이다.

이런 종류의 포팅이 실패하는 가장 흔한 이유는 원본 시스템의 방식을 너무 고집해서, 새 환경이 이미 잘하는 것을 못 쓰는 경우다. 

그래서 gstack-antigravity는 원본처럼 별도의 브라우저 체계를 억지로 유지하기보다 Antigravity가 제공하는 네이티브 브라우저 도구를 우선 활용하는 방식으로 정리했다.

나는 이 방향이 꽤 중요하다고 생각한다. 좋은 포팅은 원본을 똑같이 복제하는 것이 아니라, 원본의 철학을 유지한 채 새 환경이 잘하는 방식을 받아들이는 일에 더 가깝기 때문이다.

그리고 이 포팅은 antigravity-skills와 함께 쓰면 더 효율적이다. 실제 작업할 때는 큰 흐름을 잡아주는 운영체계와 세부 작업을 도와주는 스킬셋을 나눠 쓰는 편이 훨씬 효율적이다.

gstack-antigravity가 생각-계획-구현-리뷰-QA-배포 같은 전체 흐름을 잡아주는 쪽이라면, antigravity-skills는 브레인스토밍이나 계획 작성 같은 작업 단위 스킬을 보강하는 쪽에 가깝다.

개인적으로 이 조합이 괜찮다고 느껴지는 이유는 현실의 작업 방식과도 잘 맞기 때문이다.

실제 일은 처음부터 끝까지 한 가지 모드로만 흐르지 않는다. 

  • 어떤 날은 아이디어를 넓게 보는 시간이 필요하고, 
  • 어떤 날은 빠르게 계획을 해야 하며, 
  • 어떤 날은 리뷰와 QA가 더 중요하다. 

이럴 때 gstack-antigravity가 전체 뼈대를 잡아주고, antigravity-skills가 필요한 순간에 세부 스킬을 보강해주면 흐름이 훨씬 부드러워진다. 

예를 들어 새로운 기능을 시작할 때는 먼저 @brainstorming으로 문제를 살펴보고, 그다음 gstack 스타일의 계획 흐름으로 구조를 잡고, 구현 이후에는 리뷰와 QA로 마무리하는 식이다. 

즉, 이 둘은 경쟁 관계라기보다 운영체계와 도구 상자라고 표현하는 편이 더 맞다.

AI 도구를 오래 써보면 결국 필요한 건 “더 똑똑한 답변”만이 아니다. 오히려 더 절실한 건 흐트러지지 않는 작업 흐름, 길어져도 무너지지 않는 문맥 관리, 실제로 계속 쓸 수 있는 운영 방식이다. 

gstack-antigravity는 원본 gstack의 핵심인 역할 분리, 스프린트형 흐름, 작업 철학을 유지하면서, 그것을 Antigravity 환경에 맞게 다시 설계한 포팅이다. 

이 과정에서 얇은 라우팅 구조를 통한 문맥 경량화, Antigravity 네이티브 브라우저 도구 활용, 크로스 플랫폼 대응을 함께 고민했다. 

여기에 antigravity-skills 같은 실전 스킬 저장소를 함께 붙이면, 전체 흐름과 세부 작업을 나눠서 다루는 좀 더 현실적인 작업 방식이 만들어진다.

혹시, 써보고 싶은신 분들은 아래를 참고하세요.

https://www.npmjs.com/package/@runchr/gstack-antigravity

다음 글에서는 paperclipai + opencode 같은 조합으로 여러 Agent를 회사 조직처럼 묶어서 운영하는 방법에 대해 정리해보려고 합니다.

3/29/2026

Mitchell Hashimoto의 「My AI Adoption Journey」를 읽고

본 글은 Mitchell Hashimoto의 을 읽고 정리한 글이다.

AI를 둘러싼 이야기는 대체로 두 갈래로 흐른다. 하나는 모든 것이 곧 AI로 대체될 것이라는 과장된 낙관론이고, 다른 하나는 아직은 실무에서 믿고 쓰기 어렵다는 냉소다. 

그런데 실제로 생산성을 만들어내는 사람들의 이야기는 중간 어딘가에 있다. Mitchell Hashimoto가 2026년 2월에 쓴 "My AI Adoption Journey" 도 그런 글이다. 

이 글은 특정 모델을 찬양하는 글도 아니고, 반대로 AI를 무의미한 유행으로 치부하는 글도 아니다. 그는 자신이 AI를 어떤 순서로 받아들였고, 어디에서 실망했고, 어느 시점부터 실질적인 가치를 느꼈는지를 여섯 단계로 정리한다.

Hashimoto는 새로운 도구를 도입할 때 대체로 세 시기를 거친다고 말한다. 

처음에는 비효율의 시기가 있고, 그다음에는 그럭저럭 쓸 만한 단계가 오고, 마지막에는 워크플로우 자체를 바꾸는 수준의 발견에 도달한다는 것이다. 

AI도 예외가 아니었다. 이미 손에 익은 방식이 있는데 새로운 도구를 배우는 일은 그 자체로 비용이 들고, 그래서 대개 사람은 초반의 불편함을 견디지 못한 채 포기한다. 그럼에도 그는 그 비효율의 시기를 통과해야만 진짜 판단이 가능하다고 얘기한다. 이것이 중요한 이유는, AI 도입을 단순히 “좋으냐 나쁘냐”로 나누지 않고, 도구 채택의 자연스러운 학습 곡선으로 보기 때문이다.

그의 첫 번째 결론은 의외로 단호하다. 의미 있는 코딩 작업을 웹 챗봇 인터페이스에서 하려는 시도를 그만두라는 것이다. ChatGPT나 Gemini 같은 챗 인터페이스는 여전히 가치가 있지만, 복잡한 코드 작업에서는 한계가 분명하다고 얘기한다. 

특히 기존 코드베이스처럼 맥락이 많은 환경에서는 결과가 자주 어긋나고, 사람이 코드와 로그를 복사해 붙여넣으며 계속 오류를 바로잡아야 하므로 오히려 비효율적이라는 판단이다. 그가 본격적으로 가치를 느낀 지점은 챗봇이 아니라 에이전트였다. 그가 말하는 에이전트는 단순히 대화하는 모델이 아니라, 파일을 읽고, 프로그램을 실행하고, HTTP 요청을 보내며, 이런 행동을 반복 루프 안에서 수행할 수 있는 형태의 도구다. 즉, “답해주는 AI”보다 “일할 수 있는 AI”가 필요하다는 이야기다.

두 번째 단계에서 그는 AI에게 자신의 일을 맡기기 전에 먼저 아주 불편한 실험을 한다. 사람이 직접 한 작업을, 에이전트만으로 다시 재현해보는 것이다. 같은 일을 두 번 하는 셈이니 당연히 비효율적이다. 실제로 그는 이 과정을 고통스럽다고 표현한다. 하지만 이 반복 속에서 중요한 감각이 생겼다고 말한다. 

하나의 거대한 세션으로 모든 것을 해결하려고 하면 실패 확률이 높고, 작업은 명확하고 실행 가능한 작은 단위로 나눠야 한다는 점이다. 또 요청이 모호하다면 계획 단계와 실행 단계를 분리해야 하며, 에이전트가 자기 결과를 검증할 수 있는 방법을 주면 스스로 실수를 고치고 회귀를 줄일 가능성이 높아진다는 점도 확인한다. 

결국 여기서 얻은 가장 큰 성과는 “AI가 무엇을 잘하는가”보다 “AI에게 무엇을 맡기면 안 되는가”를 배운 데 있었다. 이 경계를 아는 것만으로도 시간 낭비를 크게 줄일 수 있기 때문이다.

대부분 많은 사람들이 지금도 AI 생산성을 모델의 지능에서만 찾으려 하고 있다. Hashimoto의 경험은 조금 다르다. 생산성은 더 똑똑한 모델에서만 오지 않는다. 오히려 실패할 일을 애초에 던지지 않는 판단, 모호한 일을 계획과 실행으로 분리하는 습관, 검증 수단을 함께 주는 방식 같은 운영 감각에서 더 많이 나온다. 즉, AI를 잘 쓰는 능력은 “좋은 질문을 던지는 능력”만이 아니라 “실패할 조건을 미리 제거하는 능력”에 가깝다. 

그는 이 단계에서 이미 에이전트를 워크플로우 안에 넣을 수 있을 정도의 가치를 느꼈지만, 아직 자신보다 확실히 빠르다고 생각하지는 않았다고 얘기한다.

세 번째 단계는 하루의 끝을 활용하는 방식이다. 그는 근무 마지막 30분 정도를 따로 확보해 하나 이상의 에이전트를 실행한다. 사람의 집중력은 하루 후반부로 갈수록 떨어지고, 이때 억지로 깊이 있는 작업을 계속하기보다 에이전트를 돌려 다음 날의 준비물을 만들어두는 편이 낫다고 본 것이다. 

여기에는 몇 가지 유형이 있다. 특정 언어나 라이선스 조건에 맞는 라이브러리를 조사해 장단점과 개발 현황, 커뮤니티 반응까지 정리하게 하는 딥 리서치, 아직 모양이 잡히지 않은 아이디어를 병렬적으로 탐색하는 시도, 그리고 GitHub 이슈나 PR을 분류하고 검토 보고서를 만드는 일이 대표적이다. 

그는 에이전트를 밤새 무한 루프로 돌리는 극단적인 방식까지 간 것은 아니라고 분명히 얘기한다. 대부분의 작업은 30분 이내에 끝났다. 그러나 그 정도만으로도 다음 날 아침 더 빨리 일에 들어갈 수 있는 “웜 스타트”가 만들어졌다고 평가한다.

우리는 흔히 AI가 사람보다 즉시 빠르고 정확해야만 유용하다고 생각한다. 하지만 실제 업무에서는 사람이 일하지 못하는 시간에 다음 작업의 맥락과 재료를 준비해두는 것만으로도 충분히 큰 가치가 생긴다. 

AI는 사람과 경쟁하는 속도 도구가 아니라, 사람의 비가동 시간을 생산적인 준비 시간으로 바꾸는 장치가 될 수 있다는 뜻이다. 여기서 중요한 것은 완전 자동화가 아니라, 사람의 리듬에 맞춘 보조다. Hashimoto의 경험은 AI 활용이 반드시 실시간 협업만을 의미하지 않으며, 비동기적으로도 충분히 강력할 수 있음을 보여준다.

네 번째 단계에서 그는 조금 더 과감해진다. 이제는 에이전트가 거의 틀리지 않을 것 같은 일을 골라, 백그라운드에서 실제로 맡기기 시작한다. 전날 밤 에이전트가 분류해둔 이슈나 작업 목록을 보고, 그중 성공 확률이 높은 것만 골라 하나씩 돌려두고, 자신은 그동안 다른 깊은 작업을 한다. 

여기서 그가 강조하는 원칙 하나는 에이전트의 데스크톱 알림을 꺼야 한다는 것이다. 이유는 단순하다. 컨텍스트 스위칭 비용이 크기 때문이다. 인간이 언제 에이전트를 통제해야지, 에이전트가 사람의 집중을 끊어서는 안 된다. 

자연스러운 휴식 구간이나 전환 지점에서만 에이전트를 확인하고 다시 자기 일로 돌아가야 한다는 것이다. 이 원칙은 AI 도입의 문제를 기술 문제가 아니라 주의력 관리 문제로도 바라보게 만든다. 

그는 이 단계가 AI가 기술 형성을 해칠 수 있다는 우려와도 일정한 균형을 만든다고 본다. 덜 중요하거나 비교적 확실한 작업은 에이전트에게 맡기되, 자신이 계속 성장하고 싶은 영역의 작업은 여전히 수작업으로 유지하는 방식이다. 

이 우려는 과장된 것이 아니다. Anthropic이 2026년 1월 공개한 연구는, 새로운 Python 라이브러리를 익히는 과제에서 AI 도움을 받은 참가자들이 도움을 받지 않은 집단보다 개념 이해, 코드 읽기, 디버깅 능력에서 더 낮은 점수를 기록했다고 보고했다. 

논문 초록은 평균적으로 유의미한 효율 향상도 크지 않았으며, 특히 과제를 AI에 많이 위임할수록 학습 손실이 커졌다고 설명한다. 반면 AI를 단순 대행자가 아니라 설명과 분석 보조 도구로 쓴 참가자들은 상대적으로 더 나은 학습을 보였다는 해석도 함께 나온다. 결국 문제는 AI 사용 여부 자체가 아니라, 무엇을 위임하고 무엇을 직접 이해할 것인가에 대한 것이다.

다섯 번째 단계에서 이 글의 핵심이 나온다. 바로 “Engineer the Harness” 하네스를 설계하라는 말이다. Hashimoto는 에이전트가 처음부터 맞는 결과를 내거나, 최소한 아주 적은 수정만 필요하도록 만들수록 효율이 급격히 높아진다고 봤다. 그리고 이를 위한 가장 확실한 방법은, 에이전트가 틀렸을 때 빠르고 정확하게 틀렸음을 알려주는 좋은 도구를 주는 것이라고 말한다. 

그는 이 접근을 “하네스 엔지니어링”이라 부른다. 뜻은 명확하다. 에이전트가 어떤 실수를 했다면, 그 실수를 다시는 반복하지 못하도록 환경과 도구를 설계하는 것이다. 이 발상이 중요한 이유는 AI 활용의 중심을 프롬프트에서 시스템 설계로 이동시키기 때문이다. 반복되는 실수를 사람의 인내로 감당하는 대신, 작업 환경의 규칙과 검증 장치로 흡수하는 것이다.

그는 하네스 엔지니어링을 두 가지 형태로 설명한다. 

첫째는 더 나은 암묵적 프롬프팅이다. 예를 들어 AGENTS.md 같은 파일에, 에이전트가 자주 잘못 사용하는 명령어, 자주 엉뚱하게 찾는 API, 특정 서브시스템에서 먼저 확인해야 하는 파일, 플랫폼별 검증 방법 같은 맥락 정보를 짧고 구체적으로 적어두는 방식이다. 

Hashimoto는 Ghostty 저장소의 AGENTS.md를 사례로 제시하며, 그 파일의 각 줄이 실제로 나쁜 에이전트 행동 하나를 겨냥해 추가된 것이고 결과적으로 문제를 거의 해결했다고 말한다. 

둘째는 실제 도구다. 스크린샷을 찍는 스크립트, 일부 테스트만 빠르게 실행하는 스크립트, 결과를 필터링해 이상 여부를 바로 확인하는 도구 등이 여기에 속한다. 

핵심은 에이전트가 결과를 스스로 검증할 수 있어야 한다는 점이다. 사람의 눈으로만 확인해야 하는 작업은 결국 병목이 된다. 반대로 검증이 자동화되면, AI는 “시도하는 도구”에서 “자기 오류를 교정하는 시스템의 일부”가 된다.

이 부분이 특히 중요한 이유는, 소프트웨어 엔지니어링의 좋은 원칙과 정확히 닿아 있기 때문이다. 

좋은 팀은 버그를 하나 고치고 끝내지 않는다. 왜 그 버그가 다시 생기지 않게 할 것인지까지 고민한다. 테스트를 추가하고, 린트 규칙을 넣고, 배포 전 체크를 강화하고, 문서와 실행 규칙을 손본다. 

Hashimoto가 말하는 하네스 엔지니어링은 사실 AI 시대에 새로 생긴 마법이 아니라, 익숙한 프로그래밍 원칙을 AI 작업에 그대로 확장한 것이다. 

에이전트가 잘못했다면 그것은 한 번의 실패가 아니라, 다음부터 시스템으로 줄일 수 있는 결함 패턴이다. 따라서 AI를 잘 쓰는 사람은 답변을 더 정교하게 유도하는 사람이라기보다, 실패를 재발 방지 가능한 구조로 바꾸는 사람에 가깝다.

여섯 번째 단계는 “항상 에이전트 하나는 돌아가고 있는 상태”를 목표로 삼는 것이다. 그는 아직 여러 에이전트를 동시에 대규모로 운영하고 싶지는 않다고 말한다. 다만 최소한 하나의 에이전트는 가능한 자주 백그라운드에서 일하고 있기를 바란다. 

에이전트가 돌아가고 있지 않을 때면, 지금 당장 에이전트가 대신 할 수 있는 일이 없는지 스스로 묻는다는 것이다. 다만 여기서도 그는 중요한 선을 긋는다. 에이전트를 돌리기 위해 억지로 일을 만드는 것이 목적은 아니다. 실제로 도움이 되는 일이 있을 때만 돌려야 한다. 그래서 이 목표를 실현하려면, 자신의 워크플로우 자체를 개선해 위임 가능한 고품질 작업이 꾸준히 나오도록 만들어야 한다고 본다. 

그는 현재 자신이 근무 시간의 대략 10~20% 정도만 이런 방식으로 효과적으로 운영하고 있다고 밝힌다. 이 수치는 AI 도입이 완성형이 아니라 계속 다듬어가는 과정임을 보여준다.

마지막으로 그는 자신이 AI 기업에서 일하지도, 투자하지도, 자문하지도 않는다고 밝힌다. 또 AI가 영원히 남을지 여부보다, 지금 자신이 무언가를 만드는 데 실제로 도움이 되는지가 더 중요하다고 말한다. 

AI 시대의 생산성 차이는 누가 더 화려한 프롬프트를 쓰느냐에서 갈리지 않는다. 진짜 차이는 누가 더 좋은 작업 환경을 설계하느냐에서 발생한다. 

챗봇에 멋진 질문을 던지는 능력은 출발점일 수 있지만, 지속적인 생산성의 원천은 아니다. 더 큰 차이는 에이전트가 일할 수 있는 문맥을 만들고, 잘못된 행동을 빠르게 잡아내고, 반복되는 실수를 규칙과 도구로 제거하며, 사람은 더 중요한 문제에 집중할 수 있도록 일의 배치를 다시 짜는 데서 생긴다. 

그런 의미에서 Hashimoto의 여정은 AI 사용 팁이라기보다, 새로운 도구를 실무에 흡수하는 엔지니어링 방법론에 가깝다. AI를 잘 쓰는 사람은 프롬프트를 다듬는 데서 멈추지 않는다. 결국 하네스를 만든다.

3/28/2026

터미널용 효과적인 AI 코딩 에이전트 구축

요즘 에이전트 환경에 대한 관심이 많다. 관련해서 오늘 읽어본 논문에 대해서 간단하게 정리해본다.

이 논문은 무엇을 말하는가?

이 논문은 “새로운 모델이 얼마나 똑똑한가”를 보여주는 논문이 아니다.
정확히는, 터미널에서 실제로 일하는 코딩 에이전트를 만들려면 어떤 구조가 필요한가를 설명하는 설계 논문이다. 저자는 OPENDEV를 오픈소스, Rust 기반, 터미널 네이티브 코딩 에이전트로 소개하면서, 이 시스템을 만들며 마주친 문제와 해결 방식을 정리한다. 초록에서도 같은 메시지가 나온다. 핵심 키워드는 compound AI system, planning과 execution의 분리, adaptive context compaction, event-driven reminders, memory pipeline, lazy tool discovery다.

논문이 보는 배경도 분명하다.
예전 AI 코딩 도구는 IDE 안에서 반응형 보조 역할을 했다면, 최근에는 Claude Code 같은 흐름을 따라 터미널 중심 에이전트가 부상하고 있다. 이유는 간단하다. 실제 개발의 중심에는 여전히 Git, build, SSH, 로그, 배포처럼 터미널이 있기 때문이다. 그런데 Terminal-Bench, LongCLI-Bench 같은 벤치마크를 보면, 최신 모델도 긴 호흡의 CLI 작업에서는 여전히 잘 흔들린다. 저자는 바로 그 지점에서 문제를 본다. 즉 모델이 강해졌는데도 에이전트는 왜 오래 못 버티는가?가 이 논문의 출발점이다.

논문은 이 문제를 세 가지로 정리한다.

  1. 긴 세션에서 컨텍스트 윈도우를 어떻게 관리할 것인가?

  2. Shell 명령과 파일 수정이 가능한 시스템을 어떻게 안전하게 통제할 것인가?

  3. 기능을 늘리면서도 툴 스키마와 프롬프트가 비대해지지 않게 어떻게 설계할 것인가?

이 세 질문이 사실상 논문 전체를 끌고 간다 여기서 중요한 점 하나를 먼저 짚어야 한다.
저자는 이 논문의 목적이 “알고리즘적 돌파구”를 내는 것이 아니라, production-ready agentic coding system을 만들며 얻은 설계 결정과 트레이드오프를 공유하는 것이라고 직접 말한다. 즉, 이 논문은 “우리가 최고다”를 증명하는 성능 논문이 아니라, 좋은 에이전트를 만들기 위한 운영 설계 문서에 가깝다.

이 논문의 가장 중요한 주장: 코딩 에이전트의 병목은 모델이 아니라 운영 구조다

이 논문에서 내가 가장 중요하게 본 문장은, OPENDEV를 단일 LLM이 아니라 compound AI system이라고 규정하는 부분이다. 저자는 세션, 에이전트, 워크플로우, LLM이 계층적으로 연결된 구조를 제시한다. 한 세션 안에는 여러 서브에이전트가 있고, 각 에이전트는 Execution, Thinking, Compaction 같은 워크플로우를 수행하며, 각 워크플로우는 사용자 설정 모델에 독립적으로 바인딩될 수 있다.

이게 왜 중요하냐면.,
많은 사람은 “어떤 모델이 제일 좋은가”를 먼저 묻는다. 하지만 그보다 어떤 종류의 작업에 어떤 모델을 붙일 것인가?가 더 중요하다고 본다. Action model은 실행과 툴 호출을 담당하고, Thinking model은 도구 없이 전략적 추론을 담당하며, Critique model은 자기비평, Vision model은 이미지/스크린샷 분석, Compact model은 컨텍스트 압축용 요약을 맡는다. 그리고 각 역할은 fallback 체인을 갖는다.

즉, OPENDEV는 “최강 모델 하나”를 중심에 두지 않는다.
오히려 비싼 모델은 비싼 일에만, 빠른 모델은 요약 같은 값싼 일에 쓰는 구조를 지향한다. 이건 비용, 지연시간, 품질을 분리해서 조절할 수 있다는 뜻이다. 논문은 이를 첫 번째 기여로 “Per-workflow LLM configurability”라고 적고 있다.

내 해석을 덧붙이면, 이건 단순한 구현 디테일이 아니다.
이 논문은 사실상 “코딩 에이전트는 모델 앱이 아니라 운영체계다” 라고 말하고 있다. 모델이 뇌라면, OPENDEV는 그 뇌 하나만으로 일하는 게 아니라, 뇌를 역할별로 나눠서 배치하는 시스템이다. 이 관점은 앞으로 코딩 에이전트를 볼 때 매우 중요하다.

OPENDEV 전체 구조를 쉽게 풀어보면

OPENDEV를 네 개 층으로 설명된다.
Entry & UI, Agent, Tool & Context, Persistence다. 사용자 입력은 CLI 또는 UI에서 들어와 에이전트 레이어로 전달되고, 에이전트가 툴과 컨텍스트 계층을 활용해 작업한 뒤, 결과를 persistence 계층에 저장한다. 즉 이 시스템은 단순한 채팅 인터페이스가 아니라, 입력-추론-실행-저장으로 이어지는 운영 파이프라인이다.

Entry & UI 계층은 생각보다 단순하다.
CLI entry point가 ConfigManager, SessionManager, ModeManager, Approval Manager를 초기화하고, TUI와 Web UI는 공통 callback 계약 위에서 작동한다. 즉 UI는 다를 수 있지만, 아래쪽 에이전트 계층은 같은 로직을 쓴다. 이건 나중에 CLI, 웹, IDE로 확장할 때 유리한 구조다. 결론부의 future directions에도 hybrid CLI–IDE integration이 미래 과제로 언급된다.

Agent 계층은 이 논문의 중심이다.
여기서 다섯 개 모델 역할이 나뉘고, reasoning은 Extended ReAct loop를 따라간다. 본문은 이 루프를 네 단계 또는 여섯 단계로 서술하는데, 큰 흐름은 같다. 시작할 때 context pressure를 점검해 compaction이 필요한지 보고, 필요하면 thinking phase를 돌리고, 더 깊게 갈 때는 critique를 하고, 마지막에 action model이 툴과 함께 실행 결정을 내린다.

Tool & Context 계층은 이름은 하나지만 실제로는 둘이다.
Tool Registry를 중심으로 파일, 프로세스, 웹, MCP, skills, subagents가 붙고, 그 옆에서 Prompt Composer, Memory, System Reminders, Compaction이 모델이 보는 문맥을 조절한다. 즉, 툴은 “무엇을 할 수 있는가?”를 정하고, 컨텍스트 계층은 “무엇을 보게 할 것인가?”를 정한다. 저자는 이 둘을 함께 놓지만, 실제 설계상으로는 행동 가능성인지 가능성을 나누고 있다고 볼 수 있다.

Persistence 계층도 꽤 중요하다.
대화 세션, 모델 capability cache, operation log, 설정 계층이 모두 여기 있다. 화려하지 않지만, 실제 에이전트는 여기서 production 감각이 드러난다. 단순히 답을 잘하는 게 아니라, 이어서 하고, 되돌리고, 재개하고, 비용을 추적하는 시스템으로 만들려는 의도가 분명하다.

왜 이 논문은 planning을 별도 서브에이전트로 분리했는가?

이 논문에서 가장 흥미로운 아키텍처 선택 중 하나는 planning을 main agent 내부 상태가 아니라 별도의 Planner subagent로 다룬다는 점이다. 사용자가 /plan을 쓰거나 설계/아키텍처/변경 계획 같은 의도가 감지되면, main agent는 plan mode로 “변신”하는 대신 Planner를 spawn한다. Planner는 코드베이스를 탐색하고, 패턴과 리스크를 분석한 뒤, goal/context/files/steps/verification/risks를 포함한 구조화된 plan file을 만든다. 그 후 main agent가 present_plan으로 사용자 승인을 받는다.

이 방식의 핵심은 안전이다.
논문은 이전 설계에서 enter_plan_mode, exit_plan_mode 같은 상태 머신을 썼지만, 에이전트가 read-only 상태에 갇혀버리는 brittle한 문제가 있었다고 설명한다. 그래서 현재는 state machine을 버리고, Planner 자체를 별도 스키마로 컴파일하는 쪽으로 바꿨다고 한다. 저자의 표현을 빌리면, Planner는 write가 “차단되는” 존재가 아니라, 애초에 write tool이 스키마에 존재하지 않는 존재다. 이게 schema-level gating이다.

이건 정말 중요한 설계 철학이다.
안전은 “하지 마!”라는 규칙보다, 그 능력을 보여주지 않는 것이 더 강하다는 뜻이다. 코딩 에이전트는 확률적 시스템이기 때문에, 위험한 도구가 보이면 언젠가는 그것을 떠올리고 시도할 수 있다. 하지만 스키마에 없으면 reasoning 자체가 그 도구를 중심으로 형성되지 않는다. 이 논문이 safety를 가장 잘 이해한 부분이 바로 여기다. 결론에서도 schema-level safety enforcement가 runtime permission check보다 robust했다고 다시 강조한다. 

main agent는 실행과 조율에 집중하고, Planner는 읽기 중심 탐색과 계획 작성에 집중한다. 이건 사고의 분리이자 권한의 분리다. 즉, 전략은 별도 문맥에서, 실행은 별도 문맥에서 다뤄진다. 에이전트 설계에서 이 정도로 planning을 구조화한 사례는 꽤 인상적이다.

Extended ReAct는 왜 필요한가?

OPENDEV는 일반적인 ReAct를 그대로 쓰지 않는다.
각 질의는 initialization 후 반복 루프에 들어가고, 그 안에서 context management → thinking → action → decision 흐름을 거친다. 논문 텍스트는 여기에 self-critique와 learning까지 덧붙여 더 세분화해서 설명한다. 핵심은 하나다. 생각을 행동보다 먼저, 그리고 별도 호출로 빼놓는다는 것이다.

저자들의 판단은 명확하다.
도구가 보이는 순간 모델은 생각보다 행동을 서두른다. 그래서 thinking phase에서는 tool-free conversation만 주고, action phase에서만 full tool schema를 준다. 또 HIGH thinking level에서는 critique model이 reasoning trace를 비평하고, thinking model이 이를 반영해 reasoning을 다듬는다. 이 구조는 단순한 “think step by step” 프롬프트보다 훨씬 구조적이다.

이 부분은 Discussion에서도 다시 일반화된다.
저자는 “Separate thinking from action”을 교훈으로 적으면서, 같은 호출 안에서 “신중히 생각하라”고 말하는 것보다, 툴 스키마를 아예 빼서 행동 유혹을 제거하는 것이 더 효과적이었다고 정리한다. 이건 본문, 토론, 결론이 모두 일치하는 내용이다.

또 하나 흥미로운 것은 doom-loop detection이다.
논문은 같은 툴과 같은 인자가 20개 sliding window 안에서 3번 이상 반복되면 경고를 넣고, 이후에도 반복되면 approval-based pause로 올린다. 이건 단순한 반복 횟수 제한보다 훨씬 정교하다. 왜냐하면 실제 agent failure는 “많이 했다”보다 같은 실패를 그대로 재현했다에서 나오기 때문이다. 예를 들어 없는 파일을 계속 읽거나, 같은 edit mismatch를 무한 재시도하는 경우다.

이 설계는 에이전트를 더 똑똑하게 만든다기보다, 바보 같은 실패를 빨리 멈추게 만든다는 점에서 가치가 있다. 실무에서는 후자가 훨씬 중요하다.

이 논문의 진짜 본론: 컨텍스트 엔지니어링

지금까지 구조를 봤다면, 이제 이 논문의 핵심으로 들어가야 한다.
LLM 기반 에이전트의 품질은 결국 모델이 무엇을 볼 수 있느냐에 의해 결정된다고 말한다. 시스템 프롬프트, 이전 대화, 외부 정보, 메모리, 툴 상태, 사용자 질의가 모두 문맥의 일부라는 뜻이다.

논문은 이 레이어를 여섯 개 하위 메커니즘으로 푼다.
동적 시스템 프롬프트 조립, 툴 결과 최적화, dual-memory, system reminders, error recovery, adaptive context compaction, 그리고 마지막 assembly pipeline이다. 즉 컨텍스트 엔지니어링은 단순한 “요약”이 아니라, 어떤 규칙을 넣고, 어떤 출력은 잘라내고, 어떤 기억을 남기고, 어떤 순간에 리마인더를 주고, 마지막에 어떤 순서로 조립할 것인가까지 포함하는 운영 기술이다.

시스템 프롬프트를 “하나의 긴 문서”로 두지 않았는가?

OPENDEV는 시스템 프롬프트를 하나의 거대한 텍스트로 다루지 않는다.
시스템 프롬프트는 독립적인 섹션들로 쪼개져 있고, 각 섹션은 조건(predicate)과 우선순위(priority)를 가진다. 실행 시점에 Prompt Composer가 현재 환경을 보고 섹션을 걸러내고, 우선순위로 정렬하고, 파일을 읽어 합쳐 최종 시스템 프롬프트를 만든다. 다시 말해, 프롬프트는 정적인 지시문이 아니라 상황에 따라 조립되는 컨텍스트 구조물이다.

이게 왜 중요하냐면, 긴 프롬프트의 가장 큰 문제는 길이만이 아니기 때문이다.
논문은 불필요한 지시가 많이 들어가면 두 가지 문제가 생긴다고 본다. 하나는 당연히 토큰을 낭비한다는 점이고, 다른 하나는 더 중요하게도 정말 필요한 규칙의 신호를 희석시킨다는 점이다. 예를 들어 git 저장소가 아닌 디렉터리에서 git workflow 규칙을 계속 싣고 있거나, subagent를 안 쓰는 세션에서 subagent 사용법이 계속 들어가 있으면, 모델은 중요하지 않은 안내까지 같이 떠안게 된다. 그래서 OPENDEV는 “길게 잘 쓰는 프롬프트”보다 적시에 필요한 섹션만 넣는 프롬프트를 택한다.

또 하나 흥미로운 건 provider-specific section이다.
Anthropic, OpenAI, Fireworks처럼 공급자마다 도구 호출 방식, thinking 지원, context window가 다르기 때문에, OPENDEV는 provider별 안내를 서로 배타적인 섹션으로 넣는다. 즉 현재 provider가 Anthropic이면 Anthropic용 section만, OpenAI면 OpenAI용 section만 들어간다. 이건 사소해 보이지만, 실은 매우 중요하다. 왜냐하면 다른 provider의 capability를 잘못 암시하면 모델이 없는 기능을 있는 줄 알고 행동할 수 있기 때문이다. 논문은 unknown provider라면 아무 섹션도 넣지 않는 graceful degradation을 택했다고 말한다.

캐싱 관점에서도 이 설계는 똑똑하다.
Anthropic처럼 prompt caching을 지원하는 provider에서는 stable 부분과 dynamic 부분을 분리하고, stable block에 cache control을 붙인다. 논문은 system prompt가 매 호출마다 다시 전송되므로, 그중 80~90% 정도의 stable 부분을 캐싱하면 입력 토큰 비용을 크게 줄일 수 있다고 설명한다. 즉 Prompt Composer는 단지 프롬프트를 예쁘게 조립하는 도구가 아니라, 행동 제어와 비용 최적화를 동시에 수행하는 장치다.

내가 보기에 핵심은 이것이다.
이 논문은 프롬프트를 “좋은 문장”의 문제가 아니라 로딩 정책의 문제로 본다. 이 관점이 아주 좋다. 실무에서는 프롬프트를 한 번 잘 쓰는 것보다, 언제 어떤 규칙을 빼고 넣을지가 훨씬 중요하기 때문이다.

툴 결과 최적화는 왜 이렇게 중요하게 다뤄졌나?

이 논문에서 현실감이 가장 강하게 느껴지는 부분 중 하나가 Tool Result Optimization이다.
저자는 아주 단순한 사실을 인정한다. 원본 도구 출력은 대체로 가치보다 훨씬 크다. read_file 한 번이면 수천 토큰의 코드가 들어오고, 디렉터리 listing은 수백 개 항목을 뿌릴 수 있고, 테스트 러너는 수천 줄 로그를 찍을 수 있다. 이런 것들을 그대로 conversation history에 넣으면, 모델이 “무엇을 읽었는지”보다 “무엇이 너무 많이 출력됐는지”에 문맥이 잠식된다. 그래서 OPENDEV는 툴 결과를 conversation에 넣기 전에 도구별 요약 규칙으로 먼저 변환한다.

예를 들어 file read는 전체 내용을 다시 싣는 대신 “몇 줄, 몇 글자짜리 파일을 읽었다”는 메타데이터만 남긴다. 검색 결과는 몇 개 match가 있었는지만 남기고, 디렉터리 listing도 item count로 압축한다. 긴 command output은 전부 넣는 대신 line count 위주로 요약한다. 즉 OPENDEV는 conversation history를 사실의 저장소가 아니라 행동 흔적의 색인처럼 다룬다.

그리고 정말 긴 출력은 한 단계 더 나간다.
8,000자를 넘으면 scratch file로 offload하고, conversation에는 500자 preview와 파일 경로만 남긴다. 여기서 핵심은 “정보를 버린다”가 아니라, 저렴한 retrieval 문제로 바꾼다는 점이다. 논문 Discussion도 이걸 아주 분명하게 교훈으로 정리한다. 큰 출력을 계속 들고 다니는 대신 파일시스템에 내려놓고 필요할 때 다시 읽으면, 비용은 한 번의 read_file 호출로 끝나지만, 그대로 문맥에 남겨두면 그 비용을 이후 모든 LLM 호출에서 계속 내야 한다는 것이다.

게다가 recovery hint도 agent-aware하게 설계했다.
subagent를 쓸 수 있는 agent에게는 Code Explorer에 넘기라고 하고, 그렇지 않은 경우에는 offset/limit 기반으로 나눠 읽으라고 안내한다. 이 점이 중요하다. 흔한 에이전트 실패는 “해결 힌트를 줬는데, 그 힌트가 그 에이전트에게는 불가능한 행동”인 경우다. OPENDEV는 이런 종류의 2차 실패를 줄이려 한다.

실무적으로 보면 이 절의 메시지는 매우 단순하다.
도구 출력은 사실 자체보다 압축된 흔적이 더 중요할 때가 많다.
그리고 그 압축이 잘 되면, 에이전트는 훨씬 오래 버틴다.

dual-memory architecture는 왜 설득력 있는가?

OPENDEV의 thinking phase는 full conversation을 전부 들고 가지 않는다.
이를 dual-memory architecture로 설명한다. 하나는 episodic memory다. 전체 대화에서 전략적 의미만 남기는 LLM 요약이다. 다른 하나는 working memory다. 최근 몇 개 교환은 그대로 verbatim으로 들고 간다. 그리고 thinking LLM에는 이 둘과 현재 user query를 함께 준다.

이 구조가 좋은 이유는, 긴 세션에서 딱 두 가지를 동시에 지키려 하기 때문이다.
하나는 “우리가 전체적으로 뭘 하려 했는지”라는 전략적 연속성이고, 다른 하나는 “방금 어느 줄에서 무슨 에러가 났는지”라는 세부 정확성이다.

전략만 남기면 구체적 편집이 틀리고, 최근 내용만 남기면 처음 목표를 잃는다. 논문은 이 둘을 각각 episodic과 working으로 나눠 잡는다. 그리고 요약은 매번 summary of summary를 만들지 않고, 일정 메시지 수가 쌓일 때마다 full history에서 새로 생성한다. 이유는 summary drift 때문이다. 요약을 다시 요약하면 왜곡이 누적되기 때문이다.

이건 인간 비유로도 이해가 쉽다.
멀리 보면 “무엇을 하려는지”는 기억하지만, 바로 직전의 구체적인 line number나 error message는 최근 기억에서 꺼내는 식이다. OPENDEV는 이걸 꽤 솔직하게 시스템 구조로 옮겼다. 요즘 agent memory 담론에서 흔히 나오는 거대한 영구 기억 저장소보다 훨씬 현실적인 접근이다.

여기에 ACE playbook이 붙는다.
플레이북은 자연어 bullet들의 모음인데, 각 bullet에는 helpful/harmful/neutral 효과성 태그와 시간 정보가 있고, BulletSelector가 effectiveness, recency, semantic similarity를 합쳐 상위 항목만 뽑아 현재 프롬프트에 넣는다. 즉 장기기억도 거대한 문서가 아니라 짧은 전략 조각들의 선택적 주입으로 설계되어 있다. 이건 메모리를 환상적으로 부풀리지 않고, 실제로 모델이 소화 가능한 크기의 “조언 묶음”으로 제한한다는 점에서 매우 실용적이다.

왜 system reminder가 이 논문에서 그렇게 중요한가?

저자는 아주 직접적으로 말한다. 긴 세션이 되면 모델은 초기의 system prompt를 점점 덜 따른다. 초반엔 잘 하던 행동, 예를 들어 “편집 후 테스트를 돌려라”, “todo를 다 끝내고 마무리해라” 같은 규칙도 15~20회 이상의 툴 호출 뒤에는 슬그머니 흐려진다. 그래서 OPENDEV는 규칙을 전부 처음에 몰아넣는 대신, 실수하기 직전에 짧은 reminder를 넣는다.

이 리마인더는 여덟 가지 이벤트 감지기에 의해 동작한다.
tool failure without retry, exploration spiral, denied tool re-attempt, incomplete todos at completion, all todos complete, plan approval without follow-through, unprocessed subagent results, empty completion messages 같은 조건이 걸리면, 대응하는 리마인더를 가장 최근 user-role 메시지로 대화에 넣는다. 논문은 이것을 “point of decision”에서의 steering이라고 본다.

여기서 핵심은 role 선택이다.
논문은 실험상 role: system보다 role: user 리마인더가 더 잘 먹혔다고 말한다. 시스템 메시지는 멀리 밀려나 배경화되지만, user message는 “방금 들어온 것”이라 모델이 더 강하게 반응한다는 것이다. 이건 아주 작은 디테일처럼 보이지만, 사실 이 논문의 설계 철학 전체와 맞닿아 있다. 저자는 프롬프트를 길게 잘 쓰는 것보다, 무엇을 언제 가장 가깝게 배치할 것인가를 더 중요하게 본다.

그리고 guardrail counters도 중요하다.
리마인더가 계속 뜨면 오히려 배경 소음이 되기 때문에 incomplete-todo nudges는 최대 두 번, error-recovery nudges는 최대 세 번처럼 예산을 둔다. 즉 OPENDEV는 리마인더도 무한 교정 장치가 아니라 제한된 신호 자원으로 다룬다. 이것도 매우 운영체계적 사고다. 리마인더를 많이 넣는다고 해결되는 게 아니라, 너무 많으면 학습된 무시가 생기기 때문이다.

내 해석으로는, 이 시스템은 “LLM이 규칙을 모른다”가 아니라 규칙을 오래 유지하지 못한다는 사실에서 출발한다. 그리고 그 해결책도 똑같이 운영적이다. 더 긴 규칙이 아니라, 짧고 늦게 들어오는 신호다.

Adaptive Context Compaction이 왜 이 논문의 실무적 핵심인가?

이제 이 논문의 가장 강한 기여라고 볼 수 있는 Adaptive Context Compaction, ACC를 봐야 한다.
논문은 기존 시스템들이 보통 95~99% 근처에서 emergency compaction을 한 번에 돌리는데, 이 방식은 발동이 너무 늦고, 정보 손실이 심하고, 다음 compaction 때 더 큰 왜곡을 낳는다고 비판한다. 그래서 OPENDEV는 context pressure를 매 iteration 시작마다 측정하고, 70/80/85/90/99%의 다섯 단계로 점진적으로 처리한다.

70%에서는 경고만 남긴다.
80%에서는 오래된 tool result를 compact pointer로 바꾸는 observation masking을 한다.
85%에서는 offload조차 하지 않고 오래된 결과를 [pruned]로 지우는 fast pruning이 들어간다.
90%에서는 aggressive masking으로 최근 극소수만 남긴다.
99%에 이르러서야 full compaction을 LLM으로 수행한다. 그리고 이때도 full history를 scratch file에 저장하고, artifact index와 archive path를 summary에 넣어 복구 가능성을 남긴다.

이 구조가 좋은 이유는, compaction을 “마지막 순간의 요약”이 아니라 관찰값의 생애주기 관리로 보기 때문이다. active에서 faded, archived로 내려가는 흐름은 운영체제의 캐시나 메모리 정책과 비슷하다. 무엇보다도, 도구 출력 최적화와 결합될 때 효과가 커진다. 이미 ingestion 단계에서 요약과 오프로딩이 이루어졌기 때문에, 나중에 compaction이 필요해져도 입력이 훨씬 가벼운 상태다.

논문은 이 구조가 observation 기준 peak context consumption을 약 54% 줄였다고 적는다. 그리고 typical 30-turn session에서는 emergency compaction 자체를 피하게 되는 경우가 많았다고 한다. 결론에서도 이 수치를 다시 반복한다. 다만 동시에, 결론은 이 논문이 체계적인 정량 평가를 아직 갖추지 않았다고 인정한다. 따라서 이 54%는 외부 재현이 끝난 결과라기보다, 현재 시스템 설계가 내부적으로 보여준 유망한 지표로 읽는 것이 맞다.

Discussion의 교훈도 이와 일치한다.
저자는 “Treat context as a budget, not a buffer”라고 말한다. 그리고 “Calibrate from API-reported token counts, not local estimates”라는 교훈도 덧붙인다. 즉 로컬에서 세는 토큰 수보다 provider가 실제 응답에서 돌려준 prompt_tokens를 기준으로 관리해야 한다는 것이다. 보이지 않는 provider-side injection이 있기 때문이다. 이 역시 매우 실용적이다.

이 절 전체를 한마디로 요약하면 이렇다.
좋은 코딩 에이전트는 큰 컨텍스트를 버티는 것이 아니라, 중요한 것만 오래 남게 만드는 시스템이다.

Retrieval과 Code Explorer는 왜 별도 파이프라인으로 나왔을까?

저자는 coding agent에서 retrieval이 가장 consequential capability라고 말한다. 왜냐하면 editing, testing, planning 같은 후속 행동의 품질은 결국 처음에 올바른 코드를 찾았는가에 달려 있기 때문이다. 단순 RAG처럼 질의 한 번에 top-k 파일을 뽑는 접근은 코드베이스에는 잘 맞지 않는다고 본다. 실제 코드는 파일 간 참조, 구조, symbol, 설정이 뒤엉켜 있기 때문이다.

그래서 OPENDEV는 retrieval을 네 층으로 본다.
Layer 1은 anchor-based tool selection이다. 질의에서 strongest anchor가 symbol인지, 문자열인지, 구조 패턴인지, 경로 관습인지 판단해 find_symbol, text_search, ast_search, list_files 중 맞는 걸 택한다.
Layer 2는 multi-step agentic search다. broad understanding이 필요하면 Code Explorer subagent로 넘겨, 그 안에서 읽기 전용 도구들로 탐색을 반복하게 한다.
Layer 3은 context assembly다. system prompt, persistent rules, @file, conversation history, reminders, current query를 한 순서로 조립한다.
Layer 4는 context optimization, 즉 staged compaction이다.

여기서 핵심은 Code Explorer의 isolated context다.
탐색 과정에서 쏟아지는 검색 결과와 파일 읽기 결과가 main agent의 사고 공간을 오염시키지 않도록, Code Explorer가 자체 문맥에서 탐색하고 증류된 요약만 main agent에 돌려준다. 이건 정말 중요한 설계다. 대부분의 retrieval 실패는 “못 찾음”보다 너무 많이 찾아서 정작 본체가 판단 못함에서 생기기 때문이다. OPENDEV는 retrieval 과정을 본체 reasoning에서 분리해 이 문제를 줄인다.

도구 시스템은 “많은 기능”보다 “실패를 흡수하는 기능”이 핵심이다

도구 시스템 자체로 넘어가 보자.
OPENDEV는 registry architecture를 택한다. ToolSchemaBuilder가 스키마를 만들고, ToolRegistry가 dispatch를 담당하고, lifecycle hooks가 그 주위를 둘러싼다. static built-in schema, discovered MCP schema, subagent schema가 합쳐져 LLM prompt에 들어가고, dispatch는 category-based handler로 나뉜다. 논문은 이 설계가 flat namespace의 혼란과 unsafe dynamic loading 문제를 줄인다고 본다.

여기서 안전은 다시 한 번 구조적으로 다뤄진다.
approval system은 Manual / Semi-Auto / Auto 세 수준을 제공하지만, 더 중요한 것은 DANGER 규칙이 사용자 설정보다 더 낮은 층에서 강제된다는 점이다. 즉 어떤 규칙은 auto-deny semantics를 가지며, 사용자가 일반적인 승인 레벨을 바꿔도 이를 우회할 수 없다. 그리고 approvals는 user-global, project-local JSON에 지속 저장되어 fatigue를 줄인다. Discussion도 approval persistence가 중요하다고 강조한다. 같은 명령을 세션마다 다시 승인받게 하면 결국 사용자는 blanket auto-approve로 가버리기 때문이다.

파일 도구는 특히 흥미롭다.
edit_file은 9-pass fuzzy matching chain을 둔다. exact match, whitespace normalization, indentation flexibility, context-aware anchor matching 등 단계별로 완화를 시도하고, 매칭에 성공하면 실제 파일 안 substring을 반환해 원래 포맷을 보존한다. Discussion의 표현대로, 이건 “모델이 정확한 literal output을 항상 내리라”를 기대하지 않고, 도구가 LLM의 approximate output을 흡수하도록 설계한 사례다.

shell execution도 비슷하다.
run_command는 safety gates, command preparation, server detection, execution fork, output management, timeout handling으로 이루어진 6-stage pipeline을 갖는다. server-like command는 background로 자동 승격하고, PTY 기반으로 출력 스트리밍을 유지한다. 이는 기능 자체보다 잘 걸리고, 잘 멈추고, 잘 지켜본다는 점이 핵심이다. 단순히 명령을 실행할 줄 아는 것과, 장시간 실행 작업을 agent workflow 안에서 안전하게 다루는 것은 전혀 다른 문제라는 것을 보여준다.

MCP 부분도 마찬가지다.
논문은 external tools를 모두 처음부터 schema에 넣으면 문맥의 40%까지 먹을 수 있다고 본다. 그래서 search_tools를 통해 keyword-based lazy discovery를 하고, 발견된 도구만 다음 LLM call부터 schema에 넣는다. 즉 extensibility 역시 capability-first가 아니라 token-efficient extensibility로 설계된다.

persistence는 왜 소박하지만 강한가

이 논문은 persistence를 아주 요란하게 다루지 않지만, 사실 production readiness를 가장 잘 보여주는 장이기도 하다.
세션은 metadata JSON과 transcript JSONL로 분리 저장된다. session listing을 빠르게 하기 위한 index도 따로 두고, index가 망가지면 다시 rebuild하는 self-healing 구조를 둔다. cost tracking도 세션 메타데이터에 저장되어, --continue로 이어갈 때 이전 토큰 사용량과 비용이 복원된다.

undo는 두 겹이다.
하나는 in-memory operation log로, 최근 create/modify/delete를 되돌리는 빠른 undo다. 다른 하나는 더 흥미로운 shadow git snapshots다. 셸 명령이나 빌드가 일으킨 부수효과까지 되돌릴 수 있도록, 사용자 저장소와 별개의 bare repository를 shadow로 두고 tree hash를 남긴다. 그러면 /undo는 실제 git history를 건드리지 않으면서도 파일 레벨 복원을 할 수 있다. Discussion과 conclusion도 이 설계를 layered architecture의 확장성 사례로 다시 언급한다.

에이전트의 실전성은 “정답을 잘 맞히는가”뿐 아니라, 실수했을 때 빠르게 되돌릴 수 있는가에 달려 있다. OPENDEV는 그 점을 정확히 짚는다.

Discussion은 이 논문의 요약이 아니라, 사실상 설계 원리의 압축본이다

가장 좋은 교훈은 두 가지다.
하나는 context를 buffer가 아니라 budget으로 다뤄라는 것.
다른 하나는 unsafe tools는 block하지 말고 invisible하게 만들어라는 것이다.
이 둘이 사실 OPENDEV 철학의 중심이다. 앞자는 문맥 관리의 원리이고, 뒤는 안전 관리의 원리다. 그리고 approximate outputs를 흡수하도록 도구를 설계하라는 점까지 합치면, 이 논문은 agent engineering의 본질을 꽤 잘 잡아낸다.

특히 “context engineering 2.0”과 연결하는 related work 부분도 흥미롭다.
논문은 OPENDEV의 구조가 retrieval, processing, management라는 context engineering taxonomy와 직접 맞물린다고 설명한다. staged compaction은 entropy reduction, system reminders는 semantic continuity를 구현하는 사례로 해석된다. 즉 저자는 OPENDEV를 단순 구현체가 아니라, 컨텍스트 엔지니어링 이론의 한 사례로 위치시키려 한다.

이 논문의 한계와, 그럼에도 불구하고 왜 가치가 큰가?

이 논문은 분명히 강한 설계 문서지만, 약점도 분명하다.
가장 큰 약점은 정량 평가 부족이다. 결론부는 이를 숨기지 않는다. SWE-bench, Terminal-Bench, LongCLI-Bench 위에서 체계적이고 비교 가능한 검증이 아직 없다고 직접 인정한다. 즉 이 논문은 “이 구조가 더 낫다”는 강한 성능 주장보다, 이 구조가 왜 필요했는지에 대한 설계 근거를 제공하는 쪽에 가깝다.

또 문서 정합성에서도 약간의 흔들림이 있다.
앞서 본 Planner 서브에이전트의 read-only 여부, built-in tool 수에 대한 본문과 부록의 차이 같은 부분은, 구현이 발전하는 속도에 문서가 완전히 따라가지 못했음을 보여준다. 연구 논문으로 보면 아쉬운 지점이지만, 반대로 말하면 이것이 아주 polished한 benchmark paper가 아니라 실제 제품을 만드는 과정에서 나온 보고서라는 점을 드러내기도 한다.

그럼에도 이 논문의 가치는 높다.
이유는 간단하다. 코딩 에이전트 분야에서 많은 글이 “얼마나 잘 푸는가”에 집중하는 반면, 이 논문은 왜 에이전트가 오래 못 버티는가, 왜 잘못된 도구를 반복 호출하는가, 왜 system prompt를 잊어버리는가, 왜 안전은 권한 체크만으로 부족한가를 아주 구체적으로 다룬다. 즉 실패의 원인을 운영 수준에서 해부한다. 이건 실무적으로 매우 큰 가치가 있다.

마지막 정리

이 시스템의 본질은 “터미널에서 돌아가는 코딩 에이전트”가 아니다.
정확히는, 긴 세션을 버티고, 큰 출력을 흘려보내고, 위험한 행동을 구조적으로 감추고, 필요할 때만 기억을 꺼내고, 잊기 직전에 규칙을 다시 주입하는 운영체계다.

이 논문이 정말 말하고 싶은 것은 아마 이것일 것이다.
코딩 에이전트의 미래는 단순히 더 똑똑한 모델을 붙이는 데 있지 않다.
오히려

무엇을 보게 할지,
무엇을 못 하게 할지,
무엇을 잊지 않게 할지,
실수했을 때 어떻게 복구할지

를 구조적으로 설계하는 데 있다.
OPENDEV는 그 점에서 “좋은 데모”보다 훨씬 가치 있어 보인다.
완벽하게 검증된 정답은 아니지만, 터미널형 AI 코딩 에이전트를 실제로 만들려는 사람에게 매우 실용적인 설계 지도를 제공한다.

해당 논문의 구현체인 OPENDEV에 관심이 있으신 분은 https://github.com/opendev-to/opendev 여기를 참고해보세요.