코딩 에이전트가 동일한 명령 출력 결과를 반복해서 읽는 것이 지겨워져서 Dejavu를 만들었습니다
요약
코딩 에이전트가 반복되는 명령 출력 결과로 인해 컨텍스트 노이즈를 겪는 문제를 해결하기 위해 Dejavu를 개발했습니다. Dejavu는 실제 명령을 실행하되 변경된 부분(delta)만 에이전트에게 보여주는 PATH shim 방식의 메모리 레이어입니다.
핵심 포인트
- 반복되는 명령 출력으로 인한 에이전트의 컨텍스트 낭비 방지
- PATH shim 방식을 사용하여 에이전트의 수정 없이 적용 가능
- 실제 명령을 항상 실행하여 캐싱으로 인한 데이터 불일치 문제 해결
- 테스트 러너, 빌드 로그 등 안전한 명령에 대해 변경 사항만 표시
터미널 코딩 에이전트(Claude Code, Codex, Cursor의 에이전트, Aider, opencode, Gemini CLI)를 사용해 보셨다면, 아마 다음과 같은 상황을 목격했을 것입니다:
pnpm test실행. 40줄의 출력 결과. 테스트 하나가 실패함.- 관련 없는 무언가를 변경함.
- 다시
pnpm test실행. 동일한 40줄. 동일한 실패. - 이 과정을 다섯 번 더 반복함.
이러한 재실행이 일어날 때마다 전체 출력 내용이 에이전트의 컨텍스트(context)로 다시 쏟아져 들어갑니다. 하지만 에이전트에게 실제로 필요한 정보는 '차이점(delta)'입니다. 즉, 실패 내용이 변했는가 하는 점이죠. 나머지는 이미 본 노이즈(noise)일 뿐입니다.
저는 git diff, rg, 빌드 로그(build logs), 타입 체크(typechecks)에서도 똑같은 문제에 계속 부딪혔습니다. 그리고 에이전트에게 "변경되지 않은 출력은 다시 읽지 마"라고 프롬프트(prompting)를 주는 것은 신뢰할 수 있는 방법이 아니었습니다. 그래서 저는 코딩 에이전트를 위한 명령 출력 메모리 레이어(memory layer)인 Dejavu를 만들었습니다.
아이디어: 실제 명령을 실행하되, 새로운 내용만 출력하기
Dejavu는 PATH shim입니다. 다음과 같이 Dejavu를 통해 에이전트를 실행합니다:
dejavu start -- claude
이렇게 하면 PATH에 shim 디렉토리가 추가됩니다. 이제 에이전트가 pnpm test를 실행하면:
agent runs: pnpm test
PATH resolves: <dejavu-cache>/shims/bin/pnpm
shim runs: dejavu run --shim-name pnpm -- test
...
에이전트는 Dejavu의 존재를 모릅니다. 에이전트는 계속해서 일반적인 명령을 실행할 뿐입니다. Dejavu는 단지 각 명령이 지난번에 무엇을 출력했는지를 기억할 뿐입니다.
에이전트가 보는 화면
동일한 재실행 시:
dejavu: output unchanged since run 8c51f73.
Command: pnpm test
Exit code: 1
...
작은 변화가 있을 시:
dejavu: output changed since run b92d1aa.
Changed lines:
- expected 403, received 200
...
명령은 세 번 모두 실제로 실행되었습니다. 오직 '표시(display)'되는 내용만 바뀌었을 뿐입니다.
제가 가장 중요하게 생각하는 부분: 실행을 절대 건너뛰지 않음
PATH에 무언가를 추가할 때 가장 두려운 점은, 그것이 조용히 캐싱(caching)을 수행하여 에이전트에게 오래된(stale) 결과를 전달하는 것입니다. Dejavu는 그렇지 않습니다. 불변의 원칙(invariant)은 다음과 같습니다:
- 그것은 항상 실제 하부 명령(underlying command)을 실행합니다.
- 그것은 항상 실제 종료 코드(exit code)를 보존합니다.
- 전체 출력은 로컬에 저장되며 언제든 복구 가능합니다:
dejavu show latest --stdout. - 안전하다고 인식되는 명령 형태(command shapes)만 최적화합니다: 테스트 러너(test runners),
tsc/eslint, 읽기 전용(read-only) git (status/diff/log/show),rg/grep,find,docker logs. 확신을 가지고 분류할 수 없는 모든 것은 수정 없이 그대로 통과됩니다. - 상태를 변경하는 명령(mutating commands, 예:
git commit,git push, 설치,docker build, watch modes)은 그대로 통과됩니다. DEJAVU=off pnpm test를 사용하면 단일 명령에 대해 이를 우회할 수 있습니다.- 서버로 아무것도 전송되지 않습니다. 캐시(cache)는 로컬에 존재합니다.
이것은 "작업을 건너뛰는" 의미에서의 캐시가 아닙니다. _무엇이 출력되었는지_에 대한 메모리 계층(memory layer)입니다.
실제로 도움이 될까요? 초기 수치
과장하기 쉽기 때문에 정확하게 말씀드리고 싶습니다. 내장된 스위트(dejavu bench)는 결정론적(deterministic) 시나리오에 대해 실제 분류(classify) + 축소(reduce) 파이프라인을 실행합니다:
| 시나리오 | Dejavu 없이 에이전트가 읽음 | Dejavu 사용 시 |
|---|---|---|
| js 검증 루프 (5x test) | 5,561 | 2,443 (-56%) |
| ... |
그리고 약 12회의 실제 Codex 세션에서: 가로채진 출력(intercepted output)이 52-55% 감소했으며, 반복되는 로컬 재실행 루프에서는 약 87% 감소했습니다.
중요한 주의사항: 이는 Dejavu가 접촉한(touches) 출력에 대한 감소량이며, 전체 토큰 소비량에 대한 주장이 아닙니다. 가장 강력한 효과는 재실행 루프에서 나타납니다. 벤치마크는 사용자의 기기에서 재현 가능하며, 수치가 퇴보할 경우 CI가 실패합니다 (dejavu bench --check).
사용해 보기
# 설치 불필요
npx @salnika/dejavu start -- codex
...
그 다음:
cd my-project
dejavu start -- claude
Rust, MIT 라이선스, macOS/Linux/WSL (아직 네이티브 Windows는 지원하지 않음). 모든 것은 GitHub에 있습니다: https://github.com/Salnika/dejavu
직접 사용해 보신다면, 제가 가장 원하는 피드백은 다음과 같습니다: 차이점(delta) 때문에 실제로 필요했던 무언가가 숨겨진 명령 형태, 그리고 분류기(classifier)가 줄여서는 안 될 것을 줄인 모든 사례입니다. 그러한 보고가 현재로서는 가장 가치 있는 정보입니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기