Agent Harness Engineering — AI 에이전트 성능을 결정하는 진짜 변수

10 min read
AI AgentHarnessClaude CodeAGENTS.md에이전트 설계
Agent Harness Engineering — AI 에이전트 성능을 결정하는 진짜 변수

Addy Osmani가 최근 공개한 글의 핵심은 한 문장으로 정리된다.

Agent = Model + Harness. 모델이 아닌 것은 전부 harness다.

Terminal Bench 2.0에서 Claude Opus 4.6은 기본 Claude Code보다 낮은 성능을 기록했다. 같은 모델인데 harness만 바꾸자 Top 5로 올라섰다. 모델 선택의 격차보다 harness 설계 격차가 더 크다는 얘기다.


Harness가 뭔데

에이전트는 AI 모델 + 모델을 둘러싼 모든 코드와 설정의 합이다. Harness는 모델에게 상태(state), 도구 실행, 피드백 루프, 강제 가능한 제약을 부여하는 레이어다.

비유하면 공장의 지그(jig)와 비슷하다. 숙련공이 없어도 공정이 정해진 품질을 냈으면 하는 게 지그고, 모델이 달라져도 일관된 행동을 내줬으면 하는 게 harness다.

6가지 핵심 요소로 구성된다.

요소역할
Filesystem & Git중간 작업 저장, 진행 추적, 오류 롤백
Bash / 코드 실행실제 명령 실행 환경
Sandboxes격리된 안전 실행 공간
Memory & Search세션 간 지식 이전, 검색 보완
Context Management압축·오프로딩·점진적 공개
Loops & Verification장기 작업 자동화, 자기평가 분리

설계 원칙 3가지

원칙 1: 행동에서 역방향으로 설계한다

기능을 먼저 쌓지 않는다. 에이전트가 보여줘야 할 구체적인 행동을 먼저 정의하고, 그 행동을 만들어내는 요소를 추가한다. 이름을 붙일 수 없는 기능은 지운다.

원칙 2: Ratchet — 실수가 규칙이 된다

매번 에이전트가 실수할 때마다 그 실수가 다시 일어나지 못하도록 harness를 업데이트한다. AGENTS.md에 규칙을 추가하거나, pre-commit hook을 달거나, 평가 에이전트가 플래그를 세우게 만든다.

AGENTS.md의 각 줄은 구체적인 과거 실패로 추적 가능해야 한다. "항상 Jest를 써라"라는 규칙이 있다면, 한때 Vitest를 혼용해서 파이프라인이 터진 사건이 그 뒤에 있어야 한다.

AGENTS.md
패키지 관리자: pnpm (npm, yarn 금지 — CI 잠금 파일 충돌 이력)
테스트: Jest (Vitest 혼용 금지 — 2026-03 파이프라인 장애)
금지 구역: /legacy 디렉토리 접근 금지
로깅: 반드시 내부 logger 모듈 사용 (console.log 금지)

60줄 이하로 유지하는 걸 권장한다. 파일럿 체크리스트처럼, 비행 전에 읽고 체크할 수 있는 분량이어야 한다.

원칙 3: 성공은 침묵, 실패는 시끄럽다

타입체크가 통과하면 아무 말도 하지 않는다. 실패하면 오류 텍스트를 루프에 주입해서 에이전트가 자동으로 고치게 한다. 수동 개입 없이 피드백이 순환하는 구조다.


AGENTS.md 설정법

[💡 잠깐! 이 용어는?] AGENTS.md: 에이전트가 코드베이스에서 작업할 때 따라야 할 규칙을 담은 파일. Claude Code의 CLAUDE.md와 같은 역할을 한다.

프로젝트 루트에 AGENTS.md를 두고 에이전트 행동 규칙을 명시한다. 핵심은 추상적 지침보다 구체적 제약이다.

AGENTS.md
## 환경
- Node.js 22 LTS
- pnpm 9.x
 
## 테스트
- Jest + ts-jest
- 커버리지 80% 이상 유지
 
## 절대 하지 말 것
- /src/legacy 디렉토리 수정
- console.log 직접 사용 (logger 모듈 사용)
- 테스트 skip 또는 주석 처리
 
## 커밋 전 체크
- pnpm typecheck
- pnpm lint
- pnpm test

Hooks — 강제 레이어

Hooks는 라이프사이클 특정 지점에서 실행되는 강제 장치다.

.claude/settings.json
{
  "hooks": {
    "afterToolCall:Edit": "pnpm typecheck && pnpm lint",
    "afterToolCall:Write": "pnpm typecheck",
    "beforeToolCall:Bash": "echo '명령 실행: 확인 필요'"
  }
}
Hook 지점용도
Before tool call파괴적 명령 차단 (rm -rf, DROP TABLE)
After file edit타입체크, 린트, 테스트 자동 실행
Before commit리뷰 승인 요구
On session start컨텍스트 초기화

에이전트가 파일을 수정할 때마다 타입체크가 돌아가면, 타입 오류는 발생 즉시 피드백 루프로 들어가 자동 수정된다. 사람이 나중에 PR에서 오류를 발견하는 시나리오가 사라진다.


Context Management — 3가지 기법

컨텍스트 윈도우는 유한하다. 긴 작업에서 윈도우를 잘 관리하지 않으면 중요한 정보가 밀려나거나 비용이 기하급수적으로 늘어난다.

1. Compaction(압축) 오래된 컨텍스트를 지능적으로 요약한다. 세부 내용보다 결정과 결과만 남긴다.

2. Tool-call Offloading 큰 출력(파일 목록, 로그)을 파일시스템으로 옮긴다. 에이전트가 필요할 때만 읽게 한다.

tools/offload.ts
async function offloadLargeOutput(content: string, path: string) {
  await fs.writeFile(path, content)
  return `출력을 ${path}에 저장했다. 필요하면 읽어라.`
}

3. Progressive Disclosure 도구 목록을 한꺼번에 노출하지 않는다. 현재 작업에 필요한 도구만 공개하고, 단계가 진행되면 추가로 노출한다.


Ralph Loop — 장기 작업 패턴

단일 세션으로 완료할 수 없는 작업은 Ralph Loop로 처리한다. 완료 목표에 도달할 때까지 새 컨텍스트로 에이전트를 재시작하는 구조다.

ralph_loop.py
def ralph_loop(goal: str, max_iterations: int = 10):
    iteration = 0
    while iteration < max_iterations:
        result = run_agent(goal, fresh_context=True)
        if result.completed:
            return result
        goal = result.remaining_work  # 남은 작업을 다음 이터레이션으로
        iteration += 1
    raise Exception("목표 미달성")

Planning은 목표를 단계별로 분해하고 계획 파일로 저장한다. Planner와 Evaluator를 분리해서 자기평가 편향을 줄인다. "내가 만든 걸 내가 평가한다"는 구조는 실제 버그를 잘 잡지 못한다.


도구 설계 — 적게, 명확하게

10개의 집중형 도구 > 50개의 겹치는 도구

각 도구의 이름, 설명, 스키마는 매 요청마다 프롬프트에 포함된다. 도구가 많아질수록 모델이 선택 장애를 겪고, 프롬프트 길이도 늘어난다.

도구 설계 원칙:

  • 단일 책임: 한 도구는 한 가지 일만
  • 명확한 이름: execute_command보다 run_test_suite
  • 보안 주의: MCP 서버는 신뢰할 수 있는 텍스트를 다루므로 프롬프트 인젝션 위험을 항상 고려

Harness-as-a-Service 전환

현재 에이전트 생태계는 LLM API에서 Harness API로 무게중심이 이동 중이다. Claude Agent SDK, Codex SDK, OpenAI Agents SDK가 이 전환을 가속하고 있다. 모델을 직접 호출하는 대신, harness가 내장된 서비스를 호출하는 패턴이다.

미래는 동적 도구/컨텍스트 조립으로 향한다. "사전 설정된 harness"가 아니라, 작업에 맞게 필요한 도구와 규칙을 런타임에 컴파일하는 컴파일러 같은 harness다.


마무리

  • 모델보다 harness 설계 격차가 크다 — Terminal Bench 2.0이 이미 증명
  • AGENTS.md 각 줄은 과거 실패 이력 — 추상적 지침은 무시된다
  • Ratchet 원칙 — 실수가 곧 규칙이 되는 시스템을 만들어라
  • 적은 도구, 명확한 피드백, 자동 강제 — harness의 3요소

지금 당장 할 수 있는 일은 하나다. 에이전트가 가장 자주 실수하는 것 하나를 골라 AGENTS.md에 규칙을 추가하고, hook으로 강제하는 것이다.


참고:

관심 있을 만한 포스트

Claude Code + Figma MCP — UX 라이팅 리소스 50% 절감 실전기

수치화된 톤 스펙트럼과 Figma MCP 자동화로 반복 작업을 AI에게 넘기고 팀이 맥락과 사용자 경험에 집중하게 만든 과정을 정리한다.

Claude CodeFigma MCP

Claude Code 프롬프트 재현성 — 암묵지를 제거하는 자동 튜닝 워크플로우

작성자와 평가자를 분리하고 서브에이전트로 반복 실행해 프롬프트 품질을 객관적으로 끌어올리는 실전 방법론을 정리한다.

Claude Code프롬프트 엔지니어링

Cloudflare Agent Memory — 에이전트가 기억을 갖는 방법

Cloudflare가 공개한 관리형 Agent Memory 서비스의 수집·검색 파이프라인과 실제 API 사용법을 분석한다.

CloudflareAI Agent

Cloudflare Agents Week 2026 — 에이전트 클라우드가 온다

Cloudflare가 Agents Week에 발표한 컴퓨팅, 보안, 메모리, AI 추론 인프라를 한 번에 정리한다.

CloudflareAI Agent

Cloudflare 내부 AI 스택 — 93% 개발자 채택률을 만든 방법

Cloudflare가 자사 제품으로 내부 AI 엔지니어링 인프라를 구축하고 R&D 93%를 1년 안에 채택시킨 아키텍처와 운영 전략을 분석한다.

CloudflareAI

AI 에이전트 프로토콜 완전 정리 — MCP, A2A, AG-UI 무엇을 언제 쓰나

AI 에이전트 생태계를 지탱하는 6가지 표준 프로토콜의 역할 차이와 선택 기준을 정리한다.

MCPA2A

Claude Code FDE Night 2026 — 기업 AX 전환 최전선의 현장 목소리

서울에서 열린 Claude Code FDE Night 세미나에서 나온 기업 AI 전환 전략과 현장 경험을 정리한다.

Claude CodeAX

Gemini CLI 서브에이전트 — 전문 AI 팀을 터미널에서 구성하는 법

Gemini CLI에 도착한 서브에이전트 기능으로 복잡한 작업을 전문화된 AI에게 위임하는 방법을 알아본다.

Gemini CLIAI Agent