
AI Agent를 오래 사용하다 보면 거의 반드시 한 번은 Context 문제를 만난다.
처음에는 단순하다.
사용자 요구사항
+
관련 코드 몇 개
+
Agent 응답
조금 지나면 다음이 붙는다.
Repository 조사
Build Log
Test 결과
공식 문서
Git Diff
Subagent 결과
실패한 가설
Architecture 결정
추가 요구사항
장시간 Coding Agent라면 더 심하다.
Session 1
→ Repository 분석
Session 2
→ 구현
Session 3
→ 테스트 실패 분석
Session 4
→ 수정
Session 5
→ Review
Session 6
→ 추가 수정
그래서 자연스럽게 이런 생각을 하게 된다.
Context Window가 더 크면
이 문제가 해결되지 않을까?
128K보다 200K.
200K보다 1M.
1M보다 더 큰 Context.
실제로 최신 Frontier Model들은 매우 큰 Context Window를 지원하고 있고, 긴 문서나 대형 Repository를 다루는 능력도 계속 좋아지고 있다.
그런데 최근 Agent 연구와 실제 Coding Agent 설계를 보면 방향이 조금 달라지고 있다.
모든 정보를
Model Context 안에 넣는다.
보다
정보를 File System에 둔다.
↓
Agent가 필요한 파일을 찾는다.
↓
필요한 부분만 읽는다.
↓
가공한 결과를 다시 파일로 남긴다.
↓
Main Context에는 판단에 필요한 정보만 유지한다.
는 구조가 중요해지고 있다.
최근 공개된 연구 Coding Agents are Effective Long-Context Processors에서는 Coding Agent가 방대한 Text Corpus를 파일 시스템에 저장해놓고 grep, Shell, Script 같은 도구를 이용해 직접 탐색하게 하는 방식을 실험했다.
연구진은 최대 3조 Token 규모의 Corpus까지 실험했고, 여러 Long-context Benchmark에서 기존 공개 최고 결과보다 평균적으로 높은 성능을 보고했다.
더 최근에는 아예 Filesystem-Based Memory for LLM Agents라는 연구까지 나왔다.
Agent가 Markdown 파일과 Directory Tree를 장기 기억 저장소처럼 직접 읽고, 수정하고, 재구성하는 방식을 체계적으로 분석한 연구다.
이 흐름에서 중요한 생각은 하나다.
Context Window
=
Agent의 모든 기억
으로 볼 필요가 없다는 것이다.
오히려
Context Window
→ Working Memory
File System
→ External Memory
로 역할을 나누는 편이 Agent 구조에 더 잘 맞을 수 있다.
이번 글에서는 이 방식을 Coding Agent에 어떻게 적용할 수 있는지 실제 구조와 파일까지 만들어보면서 정리해본다.
Model Context 안에는 생각보다 많은 정보가 들어간다.
Coding Agent를 예로 들어보자.
System Instructions
AGENTS.md
사용자 Prompt
Tool 정의
MCP Tool 설명
읽은 Source Code
Command 결과
Test Log
Subagent 결과
Conversation History
모두 Context를 사용한다.
처음에는 문제가 없다.
하지만 작업이 길어지면 중요한 정보와 중요하지 않은 정보가 섞인다.
예를 들어 로그인 Race Condition을 수정하고 있다고 하자.
정말 중요한 정보는 다음 정도다.
Goal
Race Condition 수정
Constraint
Public API 변경 금지
Root Cause
Session refresh가 동시에 두 번 실행됨
Decision
TokenStore가 아니라
SessionCoordinator에서 직렬화
그런데 Context에는 다음도 계속 남아 있을 수 있다.
처음 실행한 grep 결과 400줄
실패한 Build Log 1,200줄
이미 폐기한 가설
관련 없는 File 내용
SDK 문서 전체
Subagent 원본 응답
이것이 Context Pollution이다.
Context Window가 크다고 모든 문제를 자동으로 해결하지는 않는다.
예를 들어 1M Token을 넣을 수 있다고 하자.
다음 두 방식이 있다.
Repository 전체
+
문서 전체
+
Log 전체
+
History 전체
↓
Model
Repository
↓
File System
Documentation
↓
File System
Logs
↓
Artifact
Main Context
↓
Goal + Decision + Relevant Evidence
둘 다 Model이 필요한 정보에 접근할 수 있다.
하지만 B에서는 어떤 정보가 현재 판단에 필요한지가 더 명확하다.
최근 OpenAI도 Responses API의 Computer Environment를 설명하면서 비슷한 문제를 지적했다.
모든 입력을 Prompt Context에 직접 넣는 방식은 입력이 커질수록 비싸지고 탐색하기 어려워진다.
대신 Resource를 Container File System에 두고 Model이 필요한 파일을 선택적으로 열거나 Shell로 처리하는 패턴을 권장한다.
개념을 단순화하면 이해하기 쉽다.
컴퓨터에서는 모든 데이터를 RAM에 올려놓지 않는다.
Storage
↓
필요한 Data
↓
RAM
↓
CPU
Agent도 비슷하게 볼 수 있다.
File System / Memory Store
↓
Relevant Context
↓
Context Window
↓
Model Reasoning
즉 Context Window는 저장소라기보다 현재 작업을 위한 Working Set에 가깝다.
이 관점으로 바꾸면 질문도 바뀐다.
기존 질문:
Context Window가 얼마나 큰가?
새 질문:
지금 판단에 필요한 정보만
Context에 올릴 수 있는가?
이쪽이 Agent 설계에서는 더 중요하다.
Coding Agents are Effective Long-Context Processors 연구가 재미있는 이유다.
연구에서는 긴 Context를 모두 Model Attention에 넣지 않았다.
대신 Corpus를 파일 시스템에 구성한다.
corpus/
├── part-001.txt
├── part-002.txt
├── part-003.txt
├── ...
└── part-n.txt
그리고 Coding Agent에게 일반적인 개발 Tool을 준다.
ls
find
grep
rg
sed
awk
python
Shell
Agent는 질문을 받으면 스스로 탐색한다.
Question
↓
검색어 결정
↓
rg 실행
↓
관련 File 찾기
↓
일부 File 읽기
↓
Script로 가공
↓
추가 검색
↓
Answer
즉 긴 Context 처리 자체를
Attention
에서
Executable Interaction
으로 일부 외부화한 것이다.
Coding Agent는 원래 파일 시스템 탐색에 익숙하다.
개발할 때 이미 이런 일을 한다.
Repository 구조 확인
↓
관련 Symbol 검색
↓
File 열기
↓
호출 경로 추적
↓
Script 실행
↓
결과 저장
이 능력을 Text Corpus에도 그대로 적용할 수 있다.
예를 들어 5GB짜리 Log가 있다고 하자.
좋지 않은 방식:
5GB Log
↓
Model Context
불가능하거나 비효율적이다.
Coding Agent 방식:
rg "fatal|exception|timeout" logs/
↓
rg "requestId=82A1" logs/
↓
python scripts/group_errors.py logs/
↓
error-summary.json
↓
필요한 부분만 Model이 읽는다.
훨씬 자연스럽다.
Agent Tool을 생각하면 흔히 다음부터 떠올린다.
Vector Search
RAG
Embedding
Semantic Retrieval
물론 중요하다.
하지만 Coding Agent에서는 이미 매우 강력한 검색 도구가 있다.
grep
ripgrep
find
git
jq
sqlite
Python
예를 들어 JSON Log 100만 줄을 Model이 직접 읽는 대신:
jq '
select(.status == "failed")
| {
id,
error,
timestamp
}
' events.json
으로 줄일 수 있다.
Model Context에는 가공된 결과만 들어간다.
Agent 프로젝트에서 다음처럼 만들 수 있다.
.ai/
├── context/
│ ├── project/
│ ├── decisions/
│ ├── investigations/
│ └── references/
│
├── tasks/
│ └── current/
│ ├── goal.md
│ ├── plan.md
│ ├── checkpoint.json
│ └── working-memory.md
│
└── artifacts/
├── logs/
├── tests/
├── diffs/
└── reports/
이제 Context Window에 모든 정보를 유지하지 않아도 된다.
# Goal
로그인 Session Refresh 과정에서 발생하는
중복 Refresh Race Condition을 제거한다.
## Success Criteria
- 동일 Session에서 동시에 Refresh Request가 실행되지 않음
- Public API 유지
- 기존 Auth Tests 통과
- Race 재현 Test 추가
Agent Session이 바뀌더라도 이 파일을 읽으면 목표를 다시 알 수 있다.
# Decisions
## D-001
Race 원인은 TokenStore가 아니다.
SessionCoordinator에서
동시에 두 Refresh Task가 시작되는 것이 원인이다.
## D-002
Public API는 변경하지 않는다.
## D-003
SessionCoordinator 내부에
Single-flight 제어를 추가한다.
## D-004
NetworkClient는 공용 SDK이므로 수정하지 않는다.
중요한 것은 사고 과정 전체를 저장하지 않는 것이다.
예를 들어 이런 것은 필요 없다.
처음에는 TokenStore가 문제라고 생각했는데...
그다음 Lock도 생각해봤고...
Actor도 봤지만...
최종 결정과 근거만 저장한다.
Conversation History는 시간 순서다.
Turn 1
Turn 2
Turn 3
Turn 4
Turn 5
그런데 Agent가 다시 필요한 것은 시간 순서가 아닐 수 있다.
Goal
Architecture
Decision
Known Issue
Test Result
즉 File System Memory는 정보를 의미 단위로 재구성할 수 있다.
2026년 7월 말 공개된 Filesystem-Based Memory for LLM Agents에서는 Agent 장기 기억을 Directory Tree와 Markdown 파일로 유지하는 방식을 실험했다.
흥미로운 점은 Memory 역할을 세 가지로 나눴다는 것이다.
Management Agent
기억을 정리하고 통합
Search Agent
필요한 기억 검색
Execution Agent
실제 Task 수행
개념적으로 보면 다음과 같다.
Task Experience
↓
Memory Manager
↓
filesystem/
├── projects/
├── decisions/
├── people/
├── skills/
└── incidents/
그리고 다음 Task에서:
Execution Agent
↓
Search Agent
↓
Relevant Files
↓
Current Context
로 가져온다.
이 연구의 결과에서 특히 중요한 부분이다.
파일 시스템을 Agent가 직접 정리하게 했다고 해서 항상 답변 정확도가 올라간 것은 아니었다.
연구에서는 잘 조직된 저장 구조가 대규모 Memory에서 검색 비용을 대략 절반 수준으로 줄이는 효과를 보였지만, 조직 구조 자체가 항상 더 좋은 답변으로 이어지지는 않았다.
또 Memory가 계속 쌓이면 문제가 생겼다.
중복
충돌
오래된 정보
잘못된 분류
Directory 비대화
그리고 강한 Management Agent를 제외하면 시간이 지나면서 정리 품질도 떨어지는 경향이 나타났다.
즉:
File System
=
완벽한 Memory
는 아니다.
관리 전략이 필요하다.
Memory를 무한히 추가하면 안 된다.
다음 상태를 둔다.
active
stale
superseded
archived
예:
id: decision-014
status: superseded
superseded_by: decision-028
새 Architecture 결정이 나오면 기존 결정을 지우기보다 연결한다.
---
id: decision-028
type: architecture
status: active
created: 2026-08-12
supersedes:
- decision-014
tags:
- auth
- concurrency
---
# Session Refresh Coordination
Refresh 요청은 SessionCoordinator에서
single-flight 방식으로 직렬화한다.
## Reason
여러 화면에서 동시에 refresh를 요청할 수 있어
TokenStore만 보호해서는 중복 Network Request를 막을 수 없다.
## Evidence
- `SessionCoordinator.swift`
- `SessionRefreshRaceTests.swift`
Markdown + Metadata면 사람이 읽기도 쉽다.
모든 정보를 영구 보관할 필요는 없다.
현재 Task에만 필요하다.
현재 가설
이번 Build 실패
진행 중 File
다음 Step
다음 작업에서도 가치가 있다.
Architecture Decision
Repository Gotcha
Release Rule
검증 절차
반복되는 Bug Pattern
구조:
.ai/
├── memory/
│ └── long-term/
│
└── tasks/
└── current/
└── working-memory.md
Task가 끝나면 Working Memory는 정리한다.
현재 Task:
tasks/current/
안에 여러 정보가 있다.
Task가 끝났다고 모두 Long-term Memory로 옮기지 않는다.
Agent 또는 사람이 판단한다.
이 정보가
다음 Task에서도 유용한가?
YES:
memory/
로 Promotion.
NO:
archive/
또는 삭제.
긴 Session에서는 Context 압축이 여전히 필요하다.
구조는 다음처럼 보면 된다.
Current Context
↓
압축
↓
Summary
하지만 Summary 과정에서 정보가 손실될 수 있다.
그래서 중요한 원본은 File에 둔다.
Current Context
├── Goal
├── Working Discussion
└── Recent Evidence
↓
Important Evidence
→ File System
Decision
→ decisions.md
Test Result
→ artifacts/tests/
↓
Context Compaction
압축돼도 필요한 정보는 다시 읽을 수 있다.
최근 공개된 Agentic Context Management 연구는 기존의 자동 Context Compression이 가진 문제를 지적한다.
일반적인 압축:
Token 80% 도달
↓
자동 압축
처럼 정해진 임계치에 의해 실행된다.
문제는 Agent의 현재 사고 흐름과 관계없이 압축이 일어난다는 것이다.
이 연구에서는 Agent에게 직접 Context 관리 도구를 주었다.
Agent가 판단한다.
이 내용은 지금 필요 없음.
↓
외부 Memory로 이동
필요해지면:
External Memory 검색
↓
다시 Context로 가져옴
즉
Runtime이 강제로 압축
에서
Agent가 Context를 관리
하는 방향이다.
개념적으로 다음과 같다.
Long-term Memory
/ \
decisions/ knowledge/
↑ ↑
│ │
└─────────┬───────────┘
│
▼
Retrieval / Search
│
▼
Working Context
│
┌──────────┼──────────┐
│ │ │
▼ ▼ ▼
Goal Current Recent
Plan Evidence
│
▼
Model
│
▼
Tool Use
│
▼
Artifacts
Context Window 자체를 Database처럼 쓰지 않는다.
Repository:
MyProject/
├── AGENTS.md
│
├── .ai/
│ ├── memory/
│ │ ├── architecture/
│ │ ├── gotchas/
│ │ └── decisions/
│ │
│ ├── tasks/
│ │ └── current/
│ │ ├── goal.md
│ │ ├── plan.md
│ │ ├── checkpoint.json
│ │ └── working-memory.md
│ │
│ └── artifacts/
│ ├── tests/
│ ├── logs/
│ └── research/
│
├── Sources/
└── Tests/
AGENTS.md에는 모든 내용을 넣지 않는다.
거대한 AGENTS.md:
Architecture 200줄
Release 300줄
Test 300줄
Security 200줄
History 500줄
보다:
# Project
Swift 6 기반 모바일 애플리케이션.
## Commands
- Build: `make build`
- Tests: `make test`
## Architecture
상세 Architecture는 필요할 때
`.ai/memory/architecture/`에서 확인한다.
## Known Gotchas
관련 작업에서만
`.ai/memory/gotchas/`를 확인한다.
## Current Task
현재 장시간 작업이 있다면
`.ai/tasks/current/goal.md`와
`checkpoint.json`을 먼저 확인한다.
처럼 Map을 준다.
OpenAI의 Harness Engineering 글에서 흥미로운 경험이 소개됐다.
초기에는 큰 AGENTS.md 하나에 Repository 지식을 모두 넣었다.
하지만 문제가 생겼다.
Context를 많이 사용함
모든 지침이 중요해 보여 우선순위가 사라짐
오래된 정보가 쌓임
검증이 어려움
그래서 Repository 자체를 System of Record로 두고 Agent에게 Map을 제공하는 방향으로 전환했다.
이것이 File System Memory 사고방식과 정확히 맞는다.
예를 들어 Auth Module이 있다.
Sources/
└── Auth/
관련 지식을 멀리 떨어뜨리지 않는다.
docs/
└── auth/
├── architecture.md
├── token-refresh.md
└── known-failures.md
또는:
Sources/
└── Auth/
└── AGENTS.md
처럼 Local Instruction을 둘 수도 있다.
Agent가 해당 영역을 읽을 때 필요한 Context를 같이 가져오는 방식이다.
예를 들어 Camera Module을 수정한다.
Main Context에 필요한 것:
Camera Architecture
관련 API
Current Goal
Test Strategy
필요 없는 것:
Payment Architecture
Release Process
Database Migration Rule
Marketing Analytics
파일 시스템을 사용하면 Locality를 만들 수 있다.
예:
Main Agent
Sol / Opus
↓
Explorer
Repository 조사
↓
research/auth-flow.md
↓
Main Agent는 조사 원문 전체를 받을 필요가 없다.
다음만 받는다.
조사 완료.
Artifact:
.ai/artifacts/research/auth-flow.md
핵심:
SessionCoordinator가 Refresh 진입점.
필요하면 Main Agent가 Artifact를 직접 읽는다.
좋은 Subagent Return Contract:
{
"status": "completed",
"summary": "Refresh race originates in SessionCoordinator.",
"evidence": [
"Sources/Auth/SessionCoordinator.swift:142",
"Sources/Auth/TokenStore.swift:88"
],
"artifact": ".ai/artifacts/research/auth-race.md",
"uncertainties": [
"Background refresh path not yet verified"
]
}
전체 조사 과정은 Artifact에 둔다.
예:
xcodebuild ... > .ai/artifacts/logs/build.log 2>&1
Agent에게:
build.log 전체를 Main Context에 복사하지 마.
먼저 실패한 Target과 Error를 추출하고,
필요한 구간만 읽어.
라고 한다.
Script:
rg "error:|fatal error:|BUILD FAILED" \
.ai/artifacts/logs/build.log
필요하면 특정 줄만 읽는다.
{
"command": "make test-auth",
"status": "failed",
"passed": 84,
"failed": 1,
"failedTests": [
"SessionRefreshRaceTests.testConcurrentRefresh"
],
"log": ".ai/artifacts/tests/auth-tests.log"
}
Main Context에는 JSON만 올린다.
원본 Log는 File.
공식 SDK Documentation을 통째로 Prompt에 넣는 방식:
Documentation 300페이지
↓
Context
대신:
references/
└── sdk/
에 두고 Agent에게 질문한다.
현재 사용하는 refresh API의
thread safety와 cancellation 관련 내용만 찾아.
Agent가 검색한다.
아니다.
File System과 Vector Retrieval은 경쟁 기술이 아니다.
작은 Repository:
File System + grep
충분
대규모 Enterprise Knowledge:
Vector Search
+
File System
이 더 나을 수 있다.
구조:
Query
↓
Broad Retrieval
Vector Search
↓
Relevant Documents
↓
File System / Working Directory
↓
Agent 직접 탐색
즉 RAG가 후보를 찾고 Coding Agent가 후보 안에서 정밀 탐색하는 식이다.
Source Code
Logs
JSON
CSV
Configuration
Documentation Repository
Test Results
Build Artifacts
처럼 이미 구조가 있는 데이터다.
Coding Agent의 기존 Tool을 그대로 활용할 수 있다.
질문 표현과 문서 표현이 크게 다름
수백만 문서 중 후보를 먼저 찾아야 함
자연어 의미 검색이 중요함
Directory 구조가 약함
이다.
그래서 최종 구조는 종종 다음이 된다.
Semantic Retrieval
↓
Filesystem Workspace
↓
Shell / Code Processing
↓
Model Reasoning
Memory가 10개일 때는 문제가 없다.
memory/
├── auth.md
├── camera.md
└── release.md
1000개가 되면 Agent도 찾기 어렵다.
그래서 index.md를 만든다.
# Memory Index
## Architecture
- `architecture/auth.md`
- `architecture/network.md`
- `architecture/camera.md`
## Known Gotchas
- `gotchas/generated-code.md`
- `gotchas/signing.md`
## Decisions
- `decisions/ADR-014.md`
- `decisions/ADR-021.md`
Agent는 Index부터 읽는다.
memory/
├── architecture/
│ ├── index.md
│ ├── auth.md
│ └── camera.md
│
├── incidents/
│ ├── index.md
│ ├── 2026-07-auth.md
│ └── 2026-08-build.md
│
└── skills/
├── index.md
└── release.md
Directory 자체가 Context Navigation 구조가 된다.
좋지 않은 이름:
note1.md
note2.md
final2.md
new-final.md
좋은 이름:
auth-refresh-race.md
ios-signing-gotchas.md
release-validation.md
camera-frame-pipeline.md
Agent는 File Name도 검색에 사용한다.
architecture.md 하나가 5,000줄이면 다시 Monolithic Context 문제가 생긴다.
나눈다.
architecture/
├── overview.md
├── auth.md
├── network.md
├── camera.md
└── persistence.md
각 파일은 하나의 책임을 가진다.
Agent가 다음에 읽을 때
왜 이런 결론이 났지?
를 확인할 수 있어야 한다.
예:
## Evidence
- `Sources/Auth/SessionCoordinator.swift:120-184`
- PR #812
- `SessionRefreshRaceTests.swift`
Memory를 “진실”처럼 쓰지 말고 Evidence와 연결한다.
파일 시스템 기반 Memory의 가장 큰 문제 중 하나다.
예를 들어:
Memory
NetworkClient는 MainActor
라고 돼 있다.
3개월 뒤 Architecture가 바뀌었다.
Memory를 갱신하지 않으면 Agent가 잘못된 결정을 할 수 있다.
그래서 Freshness를 둔다.
last_verified: 2026-08-12
sources:
- Sources/Network/NetworkClient.swift
예:
Memory에서 참조하는 File이 삭제됐는가?
링크가 깨졌는가?
관련 Module이 크게 변경됐는가?
간단한 Script로 검사할 수 있다.
python scripts/check_memory_links.py
고급 구조에서는 Agent가 PR 변경을 보고 관련 Memory Update를 제안하게 할 수 있다.
Agent가 자기 Memory를 자유롭게 계속 고치면 또 다른 문제가 생긴다.
잘못된 판단이 Memory에 들어가 다음 Session까지 전파될 수 있다.
예:
잘못된 분석
↓
Memory 저장
↓
다음 Agent가 읽음
↓
사실처럼 사용
그래서 중요한 Memory는 Review가 필요하다.
검색 결과 Cache
Log Summary
Temporary Notes
자동 갱신 가능.
Known Gotcha
Development Workflow
Test Pattern
Agent 제안 + Review.
Architecture Decision
Security Policy
Release Policy
Production Rule
사람 Review 후 반영.
장시간 프로젝트라면:
Execution Agent
↓
새 Decision / Result
↓
Memory Manager
↓
분류
중복 검사
기존 Memory와 충돌 검사
↓
Memory Update Proposal
구조로 만들 수 있다.
Memory Manager가 코드를 수정할 필요는 없다.
이번 Task에서 장기 보관할 가치가 있는 정보만 추출해.
다음은 저장하지 마.
- 일회성 로그
- 이미 코드에서 쉽게 확인 가능한 사실
- 실패한 가설
- 임시 Debug 정보
다음을 우선해.
- Architecture Decision
- 코드만 보고 알기 어려운 Gotcha
- 반복되는 실패 원인
- 검증된 Workflow
기존 .ai/memory/와 충돌하는 정보가 있으면
자동 덮어쓰지 말고 충돌을 보고해.
이 정도면 꽤 실용적이다.
Main Agent에게 500개 Memory File을 직접 찾게 하지 않는다.
Search Agent:
Question:
Auth Refresh와 관련된
기존 결정과 Incident를 찾아.
↓
결과:
{
"files": [
".ai/memory/architecture/auth.md",
".ai/memory/incidents/2026-05-refresh-loop.md",
".ai/memory/decisions/ADR-021.md"
],
"summary": "Refresh ownership was moved to SessionCoordinator in ADR-021."
}
Main Agent는 관련 3개만 읽는다.
Memory Search는 대부분:
검색
분류
요약
관련도 판단
이다.
고급 Architecture 판단까지 필요하지 않다면 작은 모델을 사용할 수 있다.
예:
Main
Sol / Opus
Memory Search
Luna / Haiku
Memory Manager
Terra / Sonnet
처럼 역할을 나눌 수 있다.
모든 Context를 Main Agent가 직접 처리하면 비싼 모델이 모든 Token을 소비한다.
File System 구조:
Large Corpus
↓
Luna Search
↓
10개 후보
↓
Terra 정리
↓
3개 핵심 Artifact
↓
Sol 판단
으로 만들 수 있다.
Token 비용도 줄일 수 있다.
예:
context_budget:
main:
role: reasoning
target: minimal
explorer:
role: retrieval
target: large
reviewer:
role: validation
target: medium
artifacts:
retention: persistent
Main Agent가 가장 많은 Raw Context를 가져야 한다는 법은 없다.
오히려 반대일 수 있다.
Main Agent Context:
Goal
Constraints
Current Plan
Relevant Evidence
Active Decisions
Current Diff
Verification Result
이 정도가 이상적이다.
전체 Build Log
전체 Documentation
대량 grep 결과
완료된 Subtask 원문
오래된 Plan
실패한 가설의 상세 과정
이미 해결된 Error
이런 것은 Artifact나 Memory로 이동한다.
장시간 Agent에게 다음 Rule을 준다.
각 Phase가 끝날 때:
1. 중요한 Decision을 decisions.md에 반영
2. Test 결과를 Artifact로 저장
3. 완료된 Investigation은 Artifact로 이동
4. Working Memory에서 해결된 항목 제거
5. checkpoint.json 갱신
일종의 Garbage Collection이다.
# Working Memory
## Current Step
SessionCoordinator 수정.
## Active Hypothesis
refreshTask를 저장하고
동시 호출이 동일 Task를 await하도록 한다.
## Open Questions
- cancellation 전파 방식
- logout 시 refreshTask 정리
## Next Verification
SessionRefreshRaceTests 실행.
짧다.
Task가 진행되면 계속 갱신한다.
처음:
Open Questions
A
B
C
D
A와 B 해결.
나쁜 방식:
A resolved
B resolved
C
D
좋은 방식:
C
D
A와 B에서 장기 보관할 내용이 있으면 decisions.md로 이동한다.
Programming Runtime:
사용하지 않는 Object
↓
GC
Agent Runtime:
더 이상 현재 추론에 필요 없는 Context
↓
Externalize / Archive
라고 생각하면 된다.
이것이 어려운 문제다.
그래서 중요한 정보에는 Pin을 둘 수 있다.
pinned:
- goal
- user_constraints
- security_policy
- unresolved_blockers
이 정보는 Context Compaction 대상에서도 보호한다.
사용자의 명시적 요구사항
완료 조건
금지 사항
보안 정책
현재 Branch 목적
Unresolved Critical Issue
반대로 Raw Tool Output은 Pin하지 않는다.
장시간 Task:
{
"taskId": "AUTH-142",
"status": "running",
"currentStep": "implementation",
"completed": [
"investigation",
"plan"
],
"memory": [
".ai/memory/decisions/ADR-021.md"
],
"artifacts": [
".ai/artifacts/research/auth-race.md"
]
}
Resume할 때 전 Conversation을 다시 넣을 필요가 없다.
Agent 시작
↓
goal.md
↓
checkpoint.json
↓
현재 plan.md
↓
관련 Memory Index
↓
Git Diff
↓
필요 Artifact
↓
Resume
굉장히 명확하다.
몇 시간짜리 Task에서는 Conversation History도 어느 정도 버틸 수 있다.
며칠짜리 Task에서는 상황이 달라진다.
Session 종료
Model 변경
Agent 재시작
Repository 변경
사람 개입
이 발생한다.
Conversation만 Memory로 쓰면 복구가 어렵다.
파일은 남는다.
이 구조의 좋은 점은 사람도 읽을 수 있다는 것이다.
Agent Memory
가 별도의 Black Box Database가 아니라
Markdown
JSON
Source
Git History
로 존재한다.
Git으로 Review도 가능하다.
예:
Agent
Architecture 변경 발견
↓
memory update
↓
PR
Diff:
- Authentication refresh is handled by TokenStore.
+ Authentication refresh is coordinated by SessionCoordinator.
사람이 확인한다.
Agent 지식 자체도 Code Review 대상이 된다.
Model을 바꿔도 된다.
Codex
↓
Claude Code
↓
Gemini Agent
모두 File을 읽을 수 있다.
특정 Vendor Memory API에 완전히 종속되지 않는다.
다음 구조를 보자.
memory/
사실과 결정
skills/
업무 방법
둘 다 File System에 존재한다.
예:
memory/
└── signing.md
skills/
└── ios-release/
└── SKILL.md
하나는
무엇을 알고 있는가
이고
다른 하나는
어떻게 작업하는가
다.
앞서 언급한 연구에서는 Task Trajectory에서 Skill을 추출해 같은 파일 저장소 안에 유지하는 구조도 함께 실험했다.
즉 Agent의 장기 지식이 점차 다음처럼 통합될 수 있다.
Agent Workspace
├── knowledge/
├── decisions/
├── experiences/
└── skills/
파일 시스템이 단순 Storage가 아니라 Agent Knowledge Architecture가 되는 것이다.
다음 정보는 Commit하면 안 된다.
Secret
개인정보
Customer Data
민감한 Log
Access Token
내부 Credential
Memory Pipeline에도 Data Classification이 필요하다.
memory_policy:
public:
persist: true
internal:
persist: true
confidential:
persist: restricted
restricted:
persist: false
.ai/memory/
팀 공유.
~/.agent-memory/
개인 Local.
예:
팀 공유:
Architecture
Build Rule
Known Gotcha
개인 Local:
내가 선호하는 작업 방식
Local Simulator 이름
개인 Shortcut
Repository Secret은 어느 쪽에도 넣지 않는다.
Context는 Session이 끝나면 사라질 수 있다.
Persistent Memory는 계속 남는다.
잘못된 Memory:
Production에서는 feature X를 사용하지 않는다.
그런데 사실은 이미 사용 중이다.
다음 20개 Agent Session이 계속 잘못된 정보를 사용할 수 있다.
그래서 Persistent Memory는 Freshness와 Verification이 중요하다.
우선순위:
Code / Config
↓
공식 Documentation
↓
Decision Record
↓
Agent Memory Summary
Memory와 Code가 충돌하면 Code를 확인한다.
Agent에게도 명시한다.
Memory는 탐색을 위한 도움이다.
현재 Repository 상태와 충돌하면
Repository를 Source of Truth로 사용한다.
Cache는 유용하지만 Source of Truth가 아니다.
Source
↓
Memory Cache
↓
Agent
Cache가 오래됐다면 갱신한다.
이 관점이 안전하다.
이 작업에서는 Main Context를 작게 유지해.
먼저 다음만 읽어.
- AGENTS.md
- .ai/tasks/current/goal.md
- .ai/tasks/current/checkpoint.json
필요한 과거 정보가 있으면
.ai/memory/index.md에서 관련 파일을 찾고
필요한 파일만 추가로 읽어.
Repository 탐색과 긴 로그 분석은 Subagent에게 맡겨.
Subagent의 원본 조사 내용을 Main Conversation에 복사하지 말고
.ai/artifacts/에 저장해.
Main Agent에게는 다음만 반환해.
- 결론
- 근거
- Artifact 경로
- 아직 확인되지 않은 점
중요한 Architecture 결정이 확정되면
decisions.md 업데이트를 제안해.
실패한 가설과 일회성 로그는 장기 Memory에 저장하지 마.
이 정도만으로 Context 사용 방식이 상당히 달라진다.
Claude Code는 File 탐색과 Subagent를 적극 활용하는 구조다.
Main Claude에게:
Repository 전체를 직접 읽지 마.
Explore Agent에게 Auth 영역을 조사하게 하고
관련 File과 호출 경로만 요약해서 반환하게 해.
할 수 있다.
Anthropic도 대형 Codebase에서는 Subagent를 사용해 검색·조사 작업을 별도 Context에서 수행하면 Main Context를 보존하는 데 도움이 된다고 설명한다.
# Project
모바일 애플리케이션 Monorepo.
## Commands
- Build: `make build`
- Tests: `make test`
## Context
Architecture:
`docs/architecture/index.md`
Known Issues:
`.ai/memory/gotchas/index.md`
Current long-running task:
`.ai/tasks/current/`
## Rule
현재 Task에 필요한 문서만 읽는다.
관련 없는 Reference Directory를 한 번에 로드하지 않는다.
앞서 다뤘던 “CLAUDE.md를 작게 유지하자”는 흐름과도 연결된다.
여기서 오해하면 안 된다.
Large Context Window
필요 없음
이라는 이야기가 아니다.
큰 Context가 특히 좋은 상황이 있다.
여러 File을 동시에 비교
큰 Diff Review
Architecture 관계 파악
긴 Conversation 유지
복합 Evidence를 한 번에 판단
중요한 것은
Context Capacity
≠
Context Strategy
라는 것이다.
RAM 64GB가 있다고 항상 64GB를 채우지 않는 것과 같다.
오히려 목표는:
필요한 정보
충분히 포함
+
불필요한 정보
최소화
이다.
좋은 Agent:
Large Context Window
+
File System
+
Subagent
+
Retrieval
+
Compaction
중 하나를 선택하는 것이 아니다.
모두 역할이 다르다.
현재 여러 Evidence를 동시에 생각.
장기적이고 구조화된 외부 저장.
수많은 후보에서 관련 정보 찾기.
탐색과 처리 Context를 격리.
장시간 Conversation을 줄이기.
이 다섯 개를 함께 쓰는 것이 Agent Context Architecture다.
구조를 이렇게 잡는다.
User Goal
│
▼
Main Agent
│
┌─────────┼─────────┐
│ │ │
▼ ▼ ▼
Search Explorer Reviewer
Agent Agent Agent
│ │ │
└────┬────┴────┬────┘
│ │
▼ ▼
File System Tools
│
┌────────┼────────┐
│ │ │
Memory Artifacts Skills
│ │ │
└────────┼────────┘
│
▼
Relevant Context
│
▼
Main Agent
Main Agent는 중앙 Coordinator다.
Storage 역할까지 맡기지 않는다.
복잡한 Runtime이 부담스럽다면:
.ai/
├── goal.md
├── decisions.md
├── checkpoint.json
├── memory.md
└── artifacts/
이 정도로 시작한다.
.ai/
├── current/
│ ├── goal.md
│ ├── plan.md
│ └── checkpoint.json
│
├── memory/
│ ├── architecture.md
│ └── gotchas.md
│
└── artifacts/
충분하다.
.ai/
├── memory/
│ ├── index.md
│ ├── architecture/
│ ├── incidents/
│ ├── decisions/
│ └── gotchas/
│
├── tasks/
│ ├── active/
│ └── archive/
│
├── artifacts/
│
└── policies/
Memory에 Owner와 Freshness를 추가한다.
기존:
Session 길어짐
↓
Context 가득 참
↓
Compaction
↓
중요 내용 일부 손실
↓
같은 File 다시 탐색
↓
Token 증가
개선:
탐색
↓
Artifact 저장
↓
Decision 저장
↓
Main Context 정리
↓
Compaction
↓
필요 시 Memory 재검색
↓
작업 계속
이다.
같은 장시간 Task를 두 방식으로 실행한다.
Conversation History 중심
Filesystem Memory 중심
측정:
총 Token
반복 File Read
Repeated Investigation
Resume 성공률
Task 성공률
Human Correction
총 비용
이런 Eval이 실제로 중요하다.
Agent를 일부러 중단한다.
50% 진행
↓
Session 종료
다시 시작한다.
Filesystem 구조가 좋다면:
goal
checkpoint
decisions
artifact
를 읽고 이어간다.
History에 의존하는 Agent는 처음부터 다시 조사할 가능성이 높다.
최근 Filesystem Memory 연구에서 재미있는 결과 중 하나가 이것이다.
잘 조직된 File Store는 큰 Memory에서 필요한 내용을 찾는 데 드는 비용을 상당히 줄였다.
즉 File 정리의 효과가
답변 정확도 무조건 상승
보다
검색 경제성 개선
으로 먼저 나타날 수 있다.
실무적으로 굉장히 중요하다.
Agent 비용에서 Retrieval 자체도 Token과 Tool Call을 쓰기 때문이다.
Retrieval Hit Rate
Average Files Opened
Stale Memory Rate
Duplicate Memory Rate
Conflicting Memory
Retrieval Token Cost
Agent Memory도 운영 대상이다.
Agent Memory 이야기를 하면 대부분
어떻게 더 많이 기억할까?
를 생각한다.
하지만 장기 운영에서는 반대가 중요해진다.
무엇을 버릴까?
무엇을 Archive할까?
무엇을 갱신할까?
무엇은 다시 검색하면 될까?
좋은 Memory System은 저장 기능뿐 아니라 Forgetting Policy가 있다.
예:
git status 결과
영구 기억 필요 없음.
Build #142의 전체 로그
장기 기억 필요 없음.
Build가 특정 Xcode Version에서 실패하는 반복 Gotcha
장기 기억 후보.
이 차이를 두어야 한다.
다시 쉽게 구할 수 있는 정보:
현재 git status
현재 Package Version
현재 File 내용
Memory에 중복 저장하지 않아도 된다.
다시 얻기 어려운 정보:
왜 Architecture를 이렇게 정했는가
지난 Incident에서 무엇이 원인이었는가
어떤 대안을 검토하고 제외했는가
Memory 가치가 높다.
정리한다면 다음 정도다.
MAIN CONTEXT
Goal
Constraint
Current Plan
Current Evidence
Open Questions
FILESYSTEM MEMORY
Architecture
Decision
Gotcha
Prior Incident
Reusable Knowledge
ARTIFACT
Log
Test Result
Research
Large Diff
Raw Output
SKILL
Repeatable Procedure
SOURCE CODE
Current Truth
역할이 명확하다.
Context가 커졌다고 무조건 좋은 것이 아니다.
Artifact로 남기고 Error만 추출한다.
Index와 Local Documentation으로 나눈다.
Memory가 Garbage Dump가 된다.
현재 Code와 공식 Config를 우선한다.
오류가 장기적으로 전파될 수 있다.
압축된 Summary에서 정보가 빠질 수 있다.
Context Window 경쟁은 계속될 것이다.
200K
↓
1M
↓
더 큰 Context
는 분명 Agent 성능에 도움이 된다.
하지만 Agent가 실제 개발 현장에서 몇 시간, 며칠, 수십 Session을 이어가게 되면 Context Window 하나만으로는 문제를 해결하기 어렵다.
정보는 계속 늘어나기 때문이다.
그래서 Agent Architecture는 점점 다음처럼 바뀌고 있다.
모든 것을 Context에 넣는다.
↓
필요한 것만 Context에 올린다.
그리고 나머지는:
File System
Memory
Artifact
Skill
Repository
에 둔다.
최근 연구에서도 Coding Agent가 대규모 Corpus를 File System에서 직접 탐색하고 Shell과 Script를 이용해 필요한 정보를 가공하는 방식이 강한 Long-context 처리 능력을 보였고, 더 최근의 Filesystem Memory 연구는 Directory와 Markdown 자체가 실제 Agent 장기 기억 저장소가 될 수 있다는 가능성과 동시에 정리·오래된 정보·검색 비용 관리라는 새로운 문제도 보여줬다.
결국 중요한 것은 Context Window의 최대 숫자가 아니다.
무엇을 지금 기억할 것인가?
무엇을 File로 내려놓을 것인가?
무엇을 다시 검색할 것인가?
무엇을 영구적으로 잊을 것인가?
를 Agent Runtime이 판단할 수 있어야 한다.
한 줄로 정리하면 이렇다.
100만 Token Context의 진짜 가치는
100만 Token을 전부 채우는 데 있는 것이 아니라,
필요할 때 필요한 정보를
충분히 올릴 수 있는 여유를 갖는 데 있다.
그리고 장기적으로는
Context Window
=
Working Memory
File System
=
External Memory
라는 구조가 Coding Agent를 오래 안정적으로 운영하는 가장 현실적인 패턴 중 하나가 될 가능성이 크다.
앞으로 좋은 Agent는 단순히 많이 기억하는 Agent가 아니라,
무엇을 Context에 두고, 무엇을 밖으로 내리고, 필요할 때 무엇을 다시 가져와야 하는지 스스로 관리하는 Agent가 될 것이다.
Cao et al. — Coding Agents are Effective Long-Context Processors
Coding Agent가 거대한 Corpus를 Model Attention에 직접 넣는 대신 File System과 Shell·Code Tool을 이용해 탐색하도록 구성했을 때의 Long-context 처리 능력을 분석한 연구.
Zhou et al. — Filesystem-Based Memory for LLM Agents: Organization, Evolution, and Sustainability
Markdown과 Directory Tree를 Agent 장기 기억으로 사용하는 방식을 체계적으로 분석하고 Memory Organization, Search Cost, Store Growth와 Staleness 문제를 다룬 최근 연구.
Li et al. — ACM: Agentic Context Management for Long Horizon Tasks
고정 Token 임계치 기반 압축 대신 Agent가 스스로 Context를 외부 Memory로 내보내고 필요할 때 다시 검색하는 Agentic Context Management를 제안한 연구.
OpenAI — From model to agent: Equipping the Responses API with a computer environment
모든 Resource를 Prompt에 직접 넣는 것을 Anti-pattern으로 보고, File System·Shell·Container를 Agent의 작업 Context로 사용해 필요한 Resource를 선택적으로 읽게 하는 공식 자료.
OpenAI — Harness engineering: leveraging Codex in an agent-first world
거대한 AGENTS.md 하나에 Repository 지식을 몰아넣는 방식의 문제와, Repository Knowledge를 System of Record로 두고 Agent에게 Map을 제공하는 실제 운영 방식을 설명한 자료.
Anthropic — Claude Code Advanced Patterns
대형 Repository에서 Subagent와 Context Strategy를 사용해 검색과 조사 Context를 Main Conversation에서 분리하는 Claude Code 운영 방법.
Anthropic — Claude Code Best Practices
탐색 단계에서 Subagent를 사용해 세부 조사와 검증을 분리함으로써 Main Context를 보존하는 실전 Workflow를 설명한 자료.
Coding Agents are Effective Long-Context Processors 연구는 일반적인 Frontier Coding Agent에게 File System과 Terminal을 제공하고 대규모 Text Corpus를 직접 탐색하게 했으며, 최대 3조 Token 규모 Corpus를 포함한 여러 Benchmark에서 기존 공개 최고 결과 대비 평균 17.3% 높은 결과를 보고했다. 중요한 점은 3조 Token을 Model Context에 직접 입력한 것이 아니라 파일 시스템을 통해 필요한 정보를 선택적으로 탐색했다는 것이다.
2026년 7월 말 공개된 Filesystem-Based Memory for LLM Agents는 Agent가 Markdown과 Directory Tree를 장기 기억으로 유지하는 방식을 분석했다. 조직화된 Store는 대규모 Memory에서 Retrieval Cost를 대략 절반으로 줄였지만, 정리된 File Structure 자체가 항상 답변 정확도를 높인 것은 아니며 Memory가 계속 성장할수록 Organization이 무너질 수 있다는 한계도 보고했다.
Agentic Context Management 연구는 Context가 일정 Token에 도달하면 자동 압축하는 고정 정책 대신 Agent가 현재 작업의 중요도를 판단해 내용을 External Memory로 이동하고 필요할 때 다시 검색하는 접근을 제안한다. 이 방식은 Long-horizon Search와 Coding Task에서 Peak Token Pressure를 낮추고 긴 탐색을 지속하는 방향을 보여준다.
OpenAI도 최근 Agent Runtime 설계에서 모든 입력을 Prompt Context에 넣는 것을 Anti-pattern으로 명시하고 있다. Resource는 Container File System에 두고 Model이 File Tool과 Shell을 이용해 필요한 부분만 읽고 가공하도록 만드는 방식을 설명하며, Codex 운영 사례에서도 “1,000페이지짜리 지침서를 주기보다 Map을 주라”는 방향을 사용하고 있다.
따라서 File System Memory는 Large Context Window를 대체하는 기술이라기보다, Large Context를 실제로 낭비하지 않기 위한 Context Architecture로 보는 편이 정확하다.