HARNESS ENGINEERING · PART 2 요약 · 花叔 (2026-04)

프레임워크 — 다섯 개의
구성 요소와 감법의 철학

고삐는 한 가닥의 줄이 아니라 다섯 가닥이다. 각자의 역할이 있으며 하나라도 빠지면 안 된다. Part 2는 하네스의 완전한 구조를 해부하고, 이어서 이 책에서 가장 반직관적인 명제 — 「하네스는 클수록 좋은 것이 아니다」 — 를 데이터로 논증한다.

§04 하네스의 다섯 구성 요소 §05 少即是多: 감법 철학
§04

하네스의 다섯 구성 요소

Five Components of a Harness

하네스가 무엇이고 왜 중요한지는 확인했다. 그러나 지금 당장 만들려 하면 문제가 생긴다 — 어디서부터 손을 대는가. OpenAI는 네 개의 동사로, Martin Fowler는 세 개의 블록으로, Anthropic은 멀티 Agent 노선으로 답했다. 서로 다른 말을 하는 듯하지만 자세히 비교하면 같은 코끼리의 다른 부위를 묘사하고 있다. 이 장은 이들 프레임을 통합해 다섯 개의 구성 요소로 추출한다. 다섯이 셋이나 넷보다 옳다는 뜻이 아니라, 이 입도(粒度)가 실전에 가장 적합하다.

COMPONENT 01 · INSTRUCTION

지시 — 가장 기초적인 층

AI에게 「나는 누구인지, 프로젝트가 어떻게 생겼는지, 반드시 지켜야 할 규칙이 무엇인지」를 알린다. 도구마다 이름이 다르다 — Claude Code는 CLAUDE.md, Codex CLI는 AGENTS.md, Cursor는 .cursorrules, Windsurf는 .windsurfrules. 본질은 같다: Markdown 파일로 의도를 AI가 읽을 수 있는 규칙으로 인코딩한다.

  • Boris Cherny(Claude Code 창시자)의 CLAUDE.md는 약 100줄. 팀의 많은 개발자가 500줄, 1000줄 이상을 쓰지만 효과는 오히려 나쁘다. 핵심 원칙 — 「모든 줄에 대해 묻는다: 지우면 Claude가 실수하는가? 아니라면 지운다.」
  • OpenAI Codex 팀은 지시 파일을 「매뉴얼」이 아니라 「지도」라 부른다. AGENTS.md 약 100줄로 프로젝트 구조·파일 관계·핵심 제약만 보여 주고, 포인터로 더 깊은 문서를 가리킨다. 초대형 AGENTS.md를 시도했다가 나쁜 결과를 확인했다.
  • Mitchell Hashimoto의 Ghostty 프로젝트에서는 모든 규칙이 agent의 과거 실수 하나에 대응한다. 파일은 살아 있고 AI와의 상호작용 속에서 자연스럽게 자란다.
세 방식은 달라 보이지만 논리는 공통이다 — 지시는 한 번 쓰고 끝나는 문서가 아니라 지속적으로 진화하는 공학적 산출물이다. Boris는 이를 복리(複利) 엔지니어링이라 부른다.
COMPONENT 02 · CONSTRAINT

제약 — 지시는 권고, 제약은 법률

차이는 이렇다. 지시는 「코드 규범에 유의하라」고 말하고, 제약은 코드가 규범에 맞지 않으면 컴파일이 통과되지 않게 만든다. OpenAI는 이 층을 두 개의 동사 — constrain(사전 차단)correct(사후 수정) — 로 요약한다.

  • 커스텀 linter와 구조 테스트가 가장 단단한 제약이다. OpenAI Codex 팀은 CI에 커스텀 ESLint 규칙을 넣어 나쁜 패턴이 정적 단계에서 아예 존재할 수 없게 만들었다. 흥미롭게도 이 linter 자체를 Codex가 작성했다 — AI가 규칙을 써서 AI를 제약하는 재귀 구조다.
  • Claude Code의 Hooks — agent의 핵심 생명주기 지점에 스크립트를 주입한다. PreToolUse 훅은 도구 호출 전에 개입해 deny 신호로 실행을 직접 차단한다. 프롬프트 층의 권고가 아니라 프로그램 층의 하드 차단이다.
  • Codex CLI는 샌드박스 노선 — 기본 모드에서 agent는 워크스페이스 내부 파일만 쓸 수 있고 네트워크는 차단된다. .git/.codex/는 전권 모드에서도 보호된다.
  • 의존 계층 아키텍처Types → Config → Repo → Service → Runtime → UI. 코드는 고정된 방향으로만 의존할 수 있다. 통상 엔지니어 수백 명 규모에서나 설계하는 아키텍처지만, agent 코딩 시대에는 초기 전제 조건이 되었다.
제약의 반직관 — 해공간(解空間)을 좁힐수록 agent의 산출이 오히려 좋아진다. Birgitta Boeckeler(Thoughtworks Distinguished Engineer): "Increasing AI autonomy requires decreasing solution space flexibility." — AI의 자율성을 높이려면 해공간의 자유도를 줄여야 한다.
COMPONENT 03 · FEEDBACK

피드백 — AI 최대의 문제는 틀린 코드가 아니라, 맞다고 믿는 것

LangChain이 Terminal Bench 2.0 테스트에서 발견한 가장 흔한 실패 모드: agent가 해법을 작성한 뒤 자기 코드를 다시 읽고, 보기에 문제없다고 판단하고 멈춘다. 테스트를 돌리지 않고 경계 조건도 검증하지 않는다. 모델은 자신의 첫 번째 그럴듯한 해법을 선천적으로 선호한다 — 더 잘할 수 없어서가 아니라 「보기에 괜찮음」에 너무 쉽게 만족한다.

  • Anthropic의 대응이 가장 철저하다. GAN(생성적 적대 신경망)에서 영감을 받은 3-Agent 아키텍처 — 계획자(Planner)가 짧은 지시를 상세 명세로 확장하고, 생성자(Generator)가 Sprint 단위로 기능을 구현하고, 평가자(Evaluator)가 Playwright로 구동 중인 애플리케이션과 상호작용하며 실제 QA 엔지니어처럼 테스트한다.
  • 생성자에게 자기 검사를 시키지 않는 이유 — 「엄격한 독립 평가자를 엔지니어링하는 것이, 생성자에게 자기비판을 가르치는 것보다 훨씬 쉽다.」 역할 분리가 적대적 역학을 만들고, 회의적인 평가자의 비판적 피드백이 생성자의 돌파를 돕는다.
  • Boris Cherny의 첫 번째 조언도 같은 뜻이다 — Claude에게 검증 수단을 주면 최종 결과 품질이 2–3배 올라간다. 웹 코드는 Chrome 확장으로 UI를, CLI는 테스트 스위트를, 인프라는 시뮬레이터와 브라우저 테스트를 쓴다.
  • OpenAI의 동사는 verify — Chrome DevTools Protocol로 DOM 스냅숏과 스크린숏을 찍는 「눈」을 달아 주고, 관측성 데이터를 연결해 agent가 로그와 지표를 직접 조회하게 했다. 「기동 시간 800ms 미만」이 문서 속 소망에서 실행 가능한 지시로 바뀌었다. 이 피드백 루프 덕에 단일 작업 실행이 6시간 이상 지속된다.
  • Martin Fowler의 「가비지 컬렉션」 — 코드도 기능도 만들지 않고 주기적으로 돌며 문서의 모순과 아키텍처 위반만 찾아내는 전담 agent. 트집 전문 AI다.
Boeckeler가 지적한 OpenAI 방식의 맹점 — 하네스가 코드를 어떻게 쓰고 조직하는지는 제약했지만, 코드가 사용자가 원하는 일을 실제로 하는지는 검증하지 않았다. 내부 품질에만 주목하고 기능적 정확성을 놓쳤다. LangChain이 발견한 「agent는 검증하지 않는다」 문제와 본질이 같다.
COMPONENT 04 · MEMORY

기억 — 기억 없는 Agent는 금붕어다

대화마다 처음부터 다시 시작하고 같은 실수를 두 번, 세 번 반복한다. 기억은 몇 개의 층으로 나뉜다.

  • 정적 기억 — CLAUDE.md·AGENTS.md 같은 지시 파일 자체가 기억의 매체다. Boris Cherny 팀은 PR에서 @.claude 태그로 CLAUDE.md를 갱신하며, 추가되는 모든 규칙은 agent의 과거 실수에 대한 제도화된 기록이다.
  • 동적 기억 — Claude Code의 auto-memory는 유용한 관찰을 AI가 스스로 저장해 세션 간에 지속시킨다. Windsurf의 Cascade Memories, Cline의 MCP 기반 Memory Bank도 같은 계열이다.
  • 구조화된 노트가 가장 정교하다. Anthropic은 agent가 컨텍스트 윈도 바깥에 지속적 노트를 유지하는 것이 매우 효과적인 압축 수단임을 발견했다. Claude가 Pokemon을 플레이할 때 정확한 스텝 카운트(「지난 1,234스텝 동안 Route 1에서 훈련 중」)를 유지했고, 컨텍스트 리셋 후 자기 노트를 읽어 수 시간짜리 시퀀스를 이어 갔다.
  • OpenAI는 기억을 inform(고지) 동사에 포함 — agent가 볼 수 없는 것은 존재하지 않는 것과 같다. Google Docs의 기획 문서를 저장소로 이관하고, Slack의 의사결정을 markdown으로 변환해 repo에 넣고, ExecPlan이라는 자기완결적 설계 문서를 만들었다. 저장소가 유일한 진실의 원천이어야 한다.
단, 기억은 많을수록 좋은 것이 아니다. Anthropic의 정의 — 「기대 결과의 가능성을 최대화하는 최소한의 고신호(high-signal) 토큰 집합을 찾는다.」 컨텍스트는 희소 자원이다. 너무 많이 채우면 실제 작업 공간을 잠식한다. 이 논점은 §05에서 전개된다.
COMPONENT 05 · ORCHESTRATION

편성 — 여러 Agent가 협업할 때 필요한 다섯 번째 요소

앞의 네 요소는 단일 agent의 하네스다. 과제가 충분히 복잡해 여러 agent의 협업이 필요할 때 편성(orchestration)이 다섯 번째 구성 요소가 된다.

  • Anthropic의 3-Agent 아키텍처가 편성의 모범이다. 각 Sprint 시작 전 Generator와 Evaluator가 Sprint Contract(스프린트 계약)를 협상해 「완료」의 정의에 합의한 뒤에야 코드를 쓴다.
  • Claude Code의 두 가지 편성 모드 — Subagents는 독립 컨텍스트 윈도에서 탐색 작업을 처리하고 메인 agent에는 요약만 반환한다. Agent Teams(실험 기능)는 여러 독립 인스턴스가 각자의 컨텍스트를 갖고, 한 세션이 team lead로 과제를 배분하며 teammate 간 직접 통신이 가능하다.
  • LangChain의 middleware 체계 — before_agent, before_model, wrap_model_call, wrap_tool_call, after_model, after_agent의 6개 훅 포인트로 팀별 관심사를 분리하고 비즈니스 로직을 core agent 코드에서 디커플링한다.
  • Boris Cherny의 개인 편성은 소박하지만 유효하다 — 동시 10–15개의 Claude Code 세션(터미널 5개, 브라우저 5–10개, 아침에 띄워 두고 나중에 확인하는 모바일 세션). worktree마다 독립 실행이라 코드 충돌이 없다. 고급 아키텍처가 아니라 사람을 편성기로 쓰는 방식이다.

두 프레임과의 대조 — 자르는 방식이 다를 뿐, 같은 케이크다

5-요소 모델OpenAI 4동사Fowler 3블록대표 구현
지시inform (고지)컨텍스트 엔지니어링CLAUDE.md / AGENTS.md / .cursorrules
제약constrain (제약)아키텍처 제약Hooks / Linter / Sandbox / CI
피드백verify (검증)가비지 컬렉션Evaluator Agent / 테스트 / 관측성
기억inform (고지)컨텍스트 엔지니어링지식 베이스 / auto-memory / ExecPlan
편성correct (교정)— (미포함)멀티 Agent / Pipeline / Middleware

대응 관계 몇 가지가 짚어 볼 만하다. OpenAI의 inform은 지시와 기억을 동시에 덮는다 — 그들의 프레임에서는 규칙이든 지식이든 「agent가 못 보는 것은 없는 것」이라는 한 문장으로 통합된다. 그러나 실무에서 CLAUDE.md와 knowledge base의 관리 논리는 완전히 다르므로 분리하는 편이 낫다. Fowler의 가비지 컬렉션은 피드백에 대응하지만 의미가 좁다 — Fowler는 코드베이스 층위의 엔트로피 증가(문서 낙후, 아키텍처 위반 누적)를 보고, Anthropic의 Evaluator는 기능 층위의 정확성을 본다. 둘 다 피드백이되 층위가 다르다. 편성은 어느 쪽도 명시적으로 다루지 않는다 — 멀티 Agent 편성이 2026년 초 현재도 실험 단계이며 주류 프레임이 아직 흡수하지 못했음을 반영한다.

다섯 요소의 관계

지시
AI에게 할 일을 알린다
제약
잘못을 사전에 막는다
피드백
제대로 했는지 검사한다
기억
실수를 반복하지 않게 한다
편성
여러 AI를 협업시킨다

다섯 요소는 평행하지 않고 층위가 있다. 지시와 제약은 입력단으로 agent가 행동하기 전에 자리 잡는다. 피드백은 과정 중의 품질 검사이고, 기억은 시간을 가로질러 경험을 세션 사이에 지속시키며, 편성은 공간을 가로질러 여러 agent를 동시에 협업시킨다.

실전 순서

다섯을 동시에 올릴 필요가 없다. 처음에는 지시(CLAUDE.md 하나)와 기본 피드백(AI에게 테스트 실행)만으로 충분하다. 제약은 agent에게 시달린 뒤 자연스럽게 추가된다. 기억은 규칙을 매번 반복 설명하는 데 지친 뒤 자연스럽게 구축된다. 편성은 과제가 정말로 단일 agent가 감당 못 할 만큼 복잡할 때 마지막에 필요하다. 하네스는 설계되는 것이 아니라 자라나는 것이다. Mitchell Hashimoto의 말을 다시 새길 만하다 — agent가 실수할 때마다 해법을 엔지니어링하라. 3개월 뒤 그 파일이 곧 당신의 하네스다.

§05

少即是多: 하네스의 감법 철학

Less Is More: The Counterintuitive Art of Subtraction

앞 장을 읽고 나면 자연스러운 반응이 나온다 — 다섯 요소를 전부 극한까지 하면 최고 아닌가. 아니다. 정반대다. 복수의 독립된 팀이 서로 다른 장면에서 같은 사실을 발견했다: 과도하게 공학화된 하네스는 하네스가 없는 것보다 나쁘다. 철학적 견해가 아니라 데이터가 있다.

컨텍스트 불안 — 모델도 초조해진다

Anthropic은 장기 실행 agent를 개발하며 아무도 주목하지 않았던 현상을 발견했다. Claude Sonnet 4.5는 「자신의 컨텍스트 윈도를 인식한」 최초의 모델이다. 좋은 일처럼 들리지만 아니다. 이 자기 인식은 부작용을 낳았다 — 모델이 컨텍스트 한계에 가까워졌다고 판단하면 조기에 마무리 작업을 시작한다. Anthropic은 이를 컨텍스트 불안(context anxiety)이라 명명했다. 잔여 토큰에 대한 모델의 추정은 「매우 정밀하지만 틀렸다」. 진행 상황을 능동적으로 요약하고 수정을 더 성급하게 밀어붙인다. 겉보기에는 효율이 오른 듯하지만 실제로는 서두르는 것이다.

핵심 조언

Sonnet 4.5의 컨텍스트 불안은 압축(compaction)만으로는 부족할 정도로 심각했다. Anthropic은 하네스에 컨텍스트 리셋(context reset) — 윈도를 완전히 비우고 구조화된 인계 상태로 새 Agent를 기동하는 메커니즘 — 을 추가해야 했다. Opus 4.5에 이르러서야 이 행동은 저절로 사라졌다.

이 발견의 의미는 단일 모델을 넘어선다. 더 보편적인 법칙을 드러낸다 — 컨텍스트는 공짜 자원이 아니며 부작용이 있다. 집어넣는 정보가 많을수록 모델이 개별 정보를 정확히 상기하는 능력은 떨어진다. Anthropic의 엔지니어링 문서는 기술적으로 얼마나 큰 윈도를 지원하든 약 100만 토큰 지점에서 뚜렷한 성능 천장이 있고 그 이후 성능이 유의미하게 하락한다고 명시한다. Claude Code 공식 베스트 프랙티스 문서도 첫머리에 밝힌다 — 「대부분의 베스트 프랙티스는 한 가지 제약에 기초한다: Claude의 컨텍스트 윈도는 빠르게 차고, 차면 성능이 떨어진다.」

안티패턴내용
Kitchen Sink Session하나의 세션에 무관한 과제들을 뒤섞는다
반복 수정실패한 해법으로 컨텍스트가 오염된 상태에서 계속 고친다
과잉 명세된 CLAUDE.md너무 길어서 규칙이 무시된다
무경계 탐색범위를 한정하지 않은 조사가 컨텍스트를 가득 채운다

네 항목 모두 같은 결론을 가리킨다 — 少即是多(적을수록 많다).

지도를 주되, 설명서를 주지 마라

OpenAI · Harness Engineering 제5원칙
약 100줄의 짧은 AGENTS.md가 더 깊은 문서를 가리키는 포인터를 지닌 지도 역할을 한다.
"A short AGENTS.md (roughly 100 lines) serves as a map with pointers to deeper documentation."

1000줄도, 500줄도 아닌 100줄. OpenAI는 반대쪽 극단도 시도했다 — 모든 규칙·컨벤션·아키텍처 결정을 하나의 초대형 AGENTS.md에 몰아넣었고, 결과는 나빴다. 이유는 어렵지 않다. 포괄적 지시 파일은 과제 컨텍스트와 관련 코드의 공간을 잠식한다. Agent는 작고 안정적인 진입점 + 전문화된 지식을 가리키는 구조에서 가장 잘 동작한다.

Boris Cherny의 CLAUDE.md도 약 100줄로, 많은 개발자의 500–1000줄보다 훨씬 짧다. 그의 경험 — 비대한 CLAUDE.md는 Claude가 정작 중요한 지시를 무시하게 만든다. 규칙이 너무 많으면 규칙이 없는 것과 같다. 인간 팀 관리와 통하는 이치다. 300쪽 매뉴얼은 아무도 읽지 않지만 A4 한 장의 행동 목록은 모두가 기억한다. 올바른 방법은 계층화다 — 얇은 진입 파일 하나를 지도로 삼아 더 깊은 전문 문서를 가리킨다. API 설계 규범이 필요하면 길만 알려 준다. 전부 한 파일에 펼쳐 놓지 않는다.

추론 샌드위치 — 전 구간 최대 출력이 오히려 나쁘다

컨텍스트의 「少即是多」가 그나마 이해하기 쉽다면, LangChain의 이 발견은 진짜 반직관적이다. Terminal Bench 2.0에서 추론 예산 배분 전략별 결과는 다음과 같다.

추론 구성점수비고
전 구간 xhigh최고 추론53.9%대량의 과제가 타임아웃
전 구간 high63.6%안정적이나 부족
Reasoning Sandwichxhigh → high → xhigh66.5%최종 채택안

전 구간 최고 추론이 가장 낮은 점수를 냈다. 이유는 추론 능력 부족이 아니라 타임아웃이다 — 필요 없는 곳에서 자원이 낭비되어 정작 필요할 때 모자랐다. 최적 전략인 추론 샌드위치는 시작 단계(계획)에 최고 추론, 중간 구현 단계(이미 계획된 코드를 쓰는 기계적 작업)에는 추론을 낮춰 토큰과 시간을 절약, 마지막 검증 단계에 다시 최고 추론을 투입한다.

일반 법칙

자원 배분이 자원 총량보다 중요하다. 이 결론은 컨텍스트 관리, 추론 예산, 심지어 팀의 시간 배분에서도 성립한다.

언제 규칙을 더하고, 언제 자르는가

「少即是多」를 이해한 뒤 실전에서 가장 어려운 질문 — 그 「적음」의 경계는 어디인가. Mitchell Hashimoto의 방법은 순수 귀납법이다: agent가 실수했을 때만 규칙을 더한다. 빈 파일에서 시작해 실수 하나마다 한 줄. 모든 규칙이 실제 문제에 대응함이 보장되고 「혹시 몰라서」식 잉여가 없다. 그러나 규칙은 누적된다. 3개월 뒤 파일이 비대해지면 감법이 필요하다. 잘라야 한다는 신호는 다음과 같다.

ETH Zurich · 2026-03 · 실증 연구
AGENTS.md가 AI Agent 성능에 미치는 영향을 체계적으로 테스트한 결과, 일부 장면에서 AGENTS.md는 도움이 되기는커녕 오히려 성능을 저해했다. 연구진의 권고는 구체적이다 — 인간이 아니면 추론할 수 없는 정보만 쓰라. 특수한 툴체인, 커스텀 빌드 명령, 비표준 프로젝트 컨벤션처럼 AI가 코드를 봐도 알 수 없는 것만 기록할 가치가 있다.
Boris의 100줄 철학, OpenAI의 100줄 지도, Mitchell의 실수 주도와 길은 달라도 도착점은 같다 — 모든 규칙은 「AI가 스스로 발견할 수 있는가?」라는 필터를 통과해야 한다.

감법 체크리스트

남겨야 할 규칙
  • Agent가 반복해서 저지른 실수 (검증된 실제 문제)
  • 프로젝트 고유의 아키텍처 결정과 컨벤션
  • 기본 동작과 다른 규칙
  • 핵심적인 보안·품질 레드라인
  • 심층 문서를 가리키는 포인터
잘라야 할 규칙
  • 구모델의 약점을 위해 쓴 패치
  • AI가 코드만 봐도 알 수 있는 관례
  • 「혹시 몰라서」식 예방 규칙 (한 번도 발동된 적 없는 것)
  • 자주 바뀌는 구체적 정보
  • 튜토리얼 성격의 장황한 설명

Anthropic의 Evaluator도 감법을 따른다

감법은 지시 파일뿐 아니라 하네스 아키텍처 자체에도 적용된다. Anthropic은 Sonnet 4.5 → Opus 4.6 업그레이드 과정에서 일련의 감법을 수행했다 — Sprint 메커니즘 제거, 컨텍스트 리셋 제거, Evaluator를 매 Sprint 평가에서 전 과정 종료 후 1회 평가로 축소.

핵심 조언

Evaluator는 유/무의 고정된 결정이 아니다. 과제가 현재 모델이 신뢰성 있게 독립 완수할 수 있는 범위를 넘어설 때에만 비용을 투입할 가치가 있다. 하네스 설계는 모델 능력에 따라 동적으로 조정되어야 한다.

하네스는 한 번 만들면 끝나는 것이 아니다. 모델이 강해지면 하네스는 얇아져야 한다. 오늘 필요한 비계(飛階)가 내일은 군더더기 무게가 될 수 있다. LangChain의 공식으로 돌아가면 — Agent = Model + Harness. Model이 강해질수록 Harness에 필요한 것은 줄어든다. 다만 「더 적음」이 「없음」은 아니다. 가장 강한 모델도 지시·제약·피드백은 여전히 필요하며, 규모와 복잡도를 낮출 수 있을 뿐이다.

이것이 하네스 엔지니어링에서 판단력이 가장 필요한 지점이다. 규칙을 더하기는 쉽고 자르기는 어렵다. 규칙 하나를 잘랐다가 문제가 생기면 후회하지만, 쓸모없는 규칙 하나를 남겨 두면 그 비용은 감지되지 않는다. 그러나 비용은 실재한다 — 잉여 규칙 하나하나가 정말 중요한 규칙의 가중치를 희석하고 있다.

Part 2의 결론

좋은 하네스는 규칙이 가장 많은 것이 아니라, 모든 규칙이 일하고 있는 것이다.