Harness²: 정답 없이 하네스를 고치고, 고친 경험까지 쌓는 재귀적 하네싱
"재귀적 자기 개선은 현재 하네스뿐 아니라, 미래의 하네스를 개선하는 방법 자체도 개선할 수 있는가?" — 논문 1장의 중심 질문
2026년 10월 9일 Google Cloud AI Research의 Ruiyao Xu(Northwestern University 겸직) 등 9명이 Harness²: Recursive Agent Harnessing for an Open World(arXiv 2610.14224)를 공개하고, 10월 13일 코드를 github.com/google-research/harness2에 Apache 2.0으로 올렸다. 이 블로그의 하네스 시리즈로 치면 네 번째다. Effective harnesses for long-running agents는 사람이 하네스를 설계하는 이야기였고, Raven은 하네스들을 조합하는 상위 하네스였으며, RRSI는 하네스가 스스로를 진화시킬 때 벤치마크 과적합을 막는 정규화였다. 루프 엔지니어링 글은 그 모든 것을 "에이전트를 돌리는 바깥 루프"의 관점에서 묶었다.
Harness²는 RRSI와 같은 팀의 후속작에 가깝다. arXiv 저자 정보를 대조하면 Harness² 저자 9명 중 7명(Yanfei Chen, Zhongying CuiZhu, Yifei Ming, Han Yu, Rujun Han, Chen-Yu Lee, Tomas Pfister)이 RRSI 저자 명단에도 있다. 다만 관계는 "후속"이라기보다 "직교"다. RRSI는 오프라인 진화 세트에서 반복 편집할 때 생기는 과적합을 정규화하는 문제를 다뤘고, Harness²는 배포 중 처음 보는 과제 하나하나에 즉시 적응하면서 그 적응 경험을 축적하는 문제를 다룬다. 흥미롭게도 Harness² 논문은 RRSI(arXiv 2609.24972)를 인용하지 않는다. 논문이 인용하는 "Recursive harness self-improvement"(Lee et al., 2026a)는 H. Lee·M. Zaharia 등의 다른 논문(RHI, arXiv 2607.15524)이니 혼동하지 말자.
원문: https://arxiv.org/abs/2610.14224
🤔 배경: 하네스는 설계된 분포 밖에서 깨진다
에이전트 = 모델 + 하네스. 논문은 Lilian Weng의 글과 OpenCode·Codex 같은 실제 코딩 에이전트를 인용하며, 같은 모델이라도 하네스에 따라 성능이 크게 달라진다는 전제에서 출발한다. 그래서 하네스를 LLM이 자동으로 고치게 하는 하네스 RSI(recursive self-improvement) 연구가 쏟아졌다. Meta-Harness, AHE 같은 초기 방법은 고정된 훈련 과제·단위 테스트·검증 피드백에 대해 후보를 최적화하고 최선의 구성을 골라 배포한다.
문제는 open world다. 논문의 정의로는 "에이전트가 하네스 설계 시점에 본 적 없는 과제를 계속 만나는 동적 환경"이다. 여기서 오프라인에 고른 정적 하네스는 일반화에 실패하기 쉽고, 저자들은 두 가지 연결된 난점을 짚는다.
- 정답이 없다. 배포 중 과제에는 ground-truth 라벨도, 믿을 만한 verifier도 없다. 기존 온라인 방법들은 프록시 신호, 가정된 정답, 출력 쌍 비교에 기댔는데, 불완전한 실행 증거로 하네스를 안전하게 바꾸는 것은 여전히 어렵다.
- 한 과제에서 고친 것이 다음 과제의 고치는 능력을 올리지 않는다. 과제 특화 편집은 요구사항이 바뀌면 깨지고, 고도로 맞춤된 실행 하네스를 다음 과제에 그대로 물려주면 분포가 바뀔 때 오히려 잡음 섞인 재귀가 된다.
저자들의 통찰은 두 번째 난점에 있다. 개선 과정 자체가 재사용 가능한 경험을 만든다. 어떤 약점을 어떻게 진단했고, 무슨 변경을 시험했고, 실행이 무엇을 드러냈는지. 따라서 개선 과정이 학습의 원천이 되어 시스템이 자기 개선 메커니즘을 재귀적으로 업그레이드해야 한다는 것이다. 모델 가중치는 끝까지 고정이다. 논문은 이를 하네싱(harnessing), 즉 "고정된 기반 모델 주위의 런타임 스캐폴딩을 최적화하는 과정"이라 부른다.
🧠 핵심 아이디어: 실행 하네스와 개선 하네스, 두 층의 재귀

논문은 하네스를 , 즉 개의 편집 가능한 컴포넌트로 정의하고 고정 모델 과 합쳐 에이전트 를 만든다. 과제 이 스트림으로 들어오고, 각 과제는 공통 실행 하네스 에서 출발하며, 정해진 예산 안에서 같은 과제를 여러 번 다시 돌릴 수 있다. 완료된 과제는 다시 돌리지 않는다.
그 위에 두 개의 하네스가 있다.
- 실행 하네스(execution harness): 과제를 실제로 수행하는 에이전트의 하네스. 과제 수준 재귀가 고치는 대상이다.
- 개선 하네스(improvement harness) : 실행 하네스를 고치는 편집자 에이전트의 하네스. 과제가 진행되는 동안은 고정이고, 과제가 끝난 뒤 하네스 개선 라이브러리를 통해 갱신된다. 라이브러리는 채택된 하네스와 그 하네스를 얻기까지의 교훈을 담는다.
논문의 정의를 옮기면 재귀적 에이전트 하네싱은 "생성된 하네스와 실행 증거로 현재 실행 하네스를 다듬는 과제 수준 재귀"와 "채택된 하네스와 개선 경험으로 개선 하네스를 갱신하는 하네싱 수준 재귀"의 결합이다. 루프 엔지니어링 글의 LangChain 4층 구도로 보면, 과제 수준 재귀는 검증 루프(같은 과제에서 편집→실행→비교)이고 하네싱 수준 재귀는 "안쪽으로 손을 뻗어 에이전트 루프 자체를 고치는" 힐클라이밍 루프에 해당한다.
편집 가능한 8개 컴포넌트

실행 하네스는 AHE(Lin et al., 2026)의 파일 단위 분해를 가져와 한 컴포넌트를 더 얹은 이다. 모든 컴포넌트가 파일이므로 편집은 diff이고, 논문 Table 5는 각 컴포넌트가 언제 모델에 닿는지를 함께 적는다.
| 그룹 | 컴포넌트 | 파일 | 활성화 | 정의 |
|---|---|---|---|---|
| 컨텍스트 구성 | C1 System prompt | systemprompt.md |
매 호출 | 모든 과제에 적용되는 페르소나와 최상위 절차 |
| C2 Guardrails | guardrails.md |
매 호출 | 과제·도구와 무관하게 지켜야 하는 제약 | |
| C3 Memory | LongTermMEMORY.md |
매 호출 | 한 도메인 안에서 과제를 넘어 유지되는 사실 | |
| C6 Skills | skills/<n>/SKILL.md + scripts/* |
skill 도구 호출 시 | 필요할 때만 로드되는 전문 절차 | |
| 도구 인터페이스 | C4 Tool guidance | tool_descriptions/tool_guidance.md |
매 호출 | 기존 도구를 언제 어떻게 쓸지 |
| C7 Scripts | scripts/<name>.py |
bash로 실행 | 토큰으로 추론하는 대신 실행하는 결정론적 능력 | |
| 오케스트레이션 | C5 Subagents | sub_agents/<n>/AGENT.md |
task 도구 | 자기 컨텍스트 창에서 돌고 결과만 반환하는 위임 워커 |
| 미들웨어 | C8 Plugin | plugin/<name>.ts |
도구 루프 내부 | 도구 호출·턴 경계에 끼는 훅. 지시가 아니라 강제 |
OpenCode에서는 이 파일 트리가 그대로 마운트되고, Codex에서는 항상 켜진 텍스트가 AGENTS.md에 들어가며 온디맨드 컴포넌트는 같다. 초기 하네스에서 항상 켜진 파일은 벤치마크 지시문만 담고 비어 있고, 온디맨드 디렉터리에는 "이런 레버가 있다"는 placeholder만 있다. 편집자가 컴포넌트의 존재를 발견하게 하는 장치다.
📐 과제 수준 재귀: 정답 없이 어떻게 Probe하는가
과제 수준 재귀의 단위는 대조적 개선 단계(contrastive improvement step) 다. 실행 기록을 (궤적 , 산출물 )라 할 때
는 후속 하네스 , 그 실행 기록 , 그리고 참조 실행·후보·프로브·구성 결정을 담은 단계 기록 를 돌려준다. 세 단계는 이렇다.
Propose. 먼저 현재 하네스로 참조 실행 를 얻는다. 핵심 문장은 "참조는 하네스가 어떻게 행동하는지를 드러내지, 산출물이 맞는지를 드러내지 않는다"다. 그 참조와 과제, 현재 하네스, 이전 이력, 라이브러리를 보고 편집자가 두 개의 후보를 만든다. 불변(invariant) 후보는 계획·도구 사용·컨텍스트 관리·위임처럼 도메인을 넘어 반복되는 에이전트적 결함을, 도메인 후보는 현재 도메인의 지식·절차·제약을 겨냥한다. 라이브러리의 컴포넌트를 재사용해도 되지만 과제 특화 사실은 현재 과제의 증거로 재검증해야 한다.
Probe. 각 후보 하네스를 같은 과제, 같은 모델·환경 설정에서 실행한다. 궤적과 산출물을 참조 실행과 비교하면 행동 대조(behavioral contrast) 가 나온다. 편집이 겨냥한 결함을 완화했는지, 해당 행동이 그대로인지, 퇴행을 일으켰는지에 대한 증거다. 논문은 여기서 조심스럽다. 이 대조는 "과제 정확성을 검증하는 것이 아니라 후속 구성에 정보를 주는 것"이며, 실행의 확률성과 모델이 공유하는 편향 때문에 증거의 신뢰도에 한계가 있다고 못 박는다.
Compose. 참조, 후보 하네스들, 현재 하네스 대비 diff, 그리고 과제 안에서 쌓인 모든 실행 증거를 읽고 를 만든다. 구성은 선택적이다. 지지되는 변경을 합치거나, 충돌하는 편집을 고치거나, 한 후보를 채택하거나, 현재 하네스를 그대로 둘 수도 있다. 각 결정은 "점수가 오를 것"이라는 추정이 아니라 구체적 관찰에 묶인다. 구성된 하네스는 다시 실행되어 를 만든다.
그러니까 "정답 없이 probe한다"의 답은 이렇다. 정답 대신 같은 과제에서 하네스만 바꾼 두 실행의 차이를 증거로 쓰고, 그 증거를 "맞다/틀리다"가 아니라 "이 편집이 궤적의 이 순간을 바꿨는가"의 수준에서만 해석한다. 부록 H의 편집자 프롬프트가 이를 그대로 강제한다. "모든 편집은 궤적의 한 순간으로 추적 가능해야 한다. 어느 실행이 무엇을 했고, 이 텍스트가 있었다면 그것이 바뀌었을까? 그 순간을 지목할 수 없다면 그 편집은 추측이다." 우선순위는 (1) 실행들이 서로 다르게 행동한 분기점, (2) 모든 실행에서 반복된 구체적 실패, (3) 궤적에 보이지만 아직 실현되지 않은 위험 순이다. 그리고 "컨텍스트에는 루브릭·채점 기준·정답·점수가 없으며, 'the grader expects' 같은 문구를 절대 쓰지 말라"고 명시한다. 코드 쪽에서도 채점 결과·루브릭·점수가 든 작업 디렉터리는 가드가 편집자에게 넘기기를 거부한다.
병렬 재귀와 순차 재귀

양의 정수 가 탐색 예산이다. 병렬 재귀는 RSA(Recursive Self-Aggregation)의 집계 원리를 추론 출력이 아니라 실행 가능한 하네스에 적용한 것이다. 현재 하네스의 참조 실행 개를 모으고, 불변 후보 개와 도메인 후보 개를 독립적으로 제안·프로브한 뒤, 개의 독립 구성 세션이 전체 풀을 받아 각자 후속 하네스를 만든다.
구현은 한 번의 개체군 갱신이고, 는 깊이가 아니라 너비를 조절한다. 순차 재귀는 Self-Refine 방식으로 를 번 체인한다. 각 단계는 직전 하네스와 누적 실행 이력 에 조건부이므로 나중 단계가 앞 단계의 변경을 유지·수정·철회할 수 있다.
이면 마지막에 에이전트 선택기가 익명화된 산출물들을 과제 요청·소스 자료와 비교해 하나를 고른다. 선택기는 산출물이 어느 하네스에서 왔는지 모르고 새 내용을 합성하지도 않는다. 채택된 하네스는 인데, 별표는 "검증된 최적"이 아니라 "채택"을 뜻한다. 이면 둘 다 기본 대조 단계 하나로 환원되고 선택을 건너뛴다. CLI 도움말이 비용을 솔직하게 적어 둔다. 과제당 실행기 롤아웃 회, 개선자 세션 회다.
🔍 하네싱 수준 재귀: 교훈은 증거가 있을 때만 남긴다
과제가 끝나고 산출물을 반환한 뒤, 파이프라인은 전체 개선 기록 (참조 실행, 후보와 프로브, 구성 결정, 선택 결과)를 되돌아본다. Reflect는 어떤 변경이 어떤 조건에서 어떤 결과로 관찰된 결함을 해결했는지 교훈을 뽑는데, 조건이 있다. 교훈은 실행 대조가 뒷받침할 때만 남긴다. 산출물이 선택됐다는 사실만으로는 전이 가능성이 성립하지 않는다. 증거가 부족하면 새 경험 항목을 추가하지 않는다.
라이브러리 항목 하나는 실행 가능한 하네스 전체 트리 + EXPERIENCE.md(적용 상황, 교훈, 뒷받침 증거)이고, 인덱스가 있어 다음 세션이 관련 항목만 열어 본다. 실행 가능한 컴포넌트는 산문으로 요약하지 않고 그대로 보관한다. 라이브러리는 벤치마크 도메인별로 나뉘고, 도메인 안의 과제들은 순서대로 돌며 앞선 항목만 읽는다.
중요한 설계 결정은 다음 과제가 에서 다시 출발한다는 점이다. 이전 실행 하네스를 자동 상속하지 않고, 갱신된 의 안내로 Propose가 선택적으로 재사용·적응한다. TTHE처럼 성공한 하네스를 다음 배치로 넘기는 방식과의 차이가 여기 있고, 앞서 말한 "맞춤 하네스를 물려주면 분포가 바뀔 때 잡음 섞인 재귀가 된다"는 문제에 대한 답이다. 모델 가중치, 단계 지시문, 결정 규칙은 고정이고 라이브러리만 진화한다.
Appendix A의 비교표(Table 4)에서 저자들은 자기 위치를 여섯 축으로 정리한다. 대상=Harness, 단계=Online, 라벨=없음, 스트리밍=O, 스케일링 연구=O, 개선자 갱신=O. 이 여섯 칸을 모두 이렇게 채운 방법은 표에서 Harness²뿐이다. 다만 저자들 스스로 "체크 표시는 갱신 메커니즘이 있다는 뜻이지 개선 능력이 올랐다는 검증이 아니다"라고 단서를 단다.
📊 실험
설정
- 벤치마크: WorkBuddy-Bench(Tencent, Code 40/Web 35/Office 25개 테스트 과제, 컨테이너 안에서 결정론적 검사 + LLM/VLM 판정), JobBench(65개 직업 과제 중 34개 테스트, Claude Opus 4.8이 가중 루브릭으로 채점), Harvey LAB(1,251개 법률 과제 중 100개 held-out 테스트, Claude Sonnet 4.6 판정, 기준별 통과율 Partial 보고). 3회 독립 스트림(과제 순서 셔플) 평균과 표준편차.
- 실행기: Gemini 3.5 Flash와 GLM-5를 OpenCode와 Codex 하네스 아래에서 고정. 롤아웃당 200턴·3,600초 상한, 과제 간 메모리 없음.
- 편집자/선택기: Claude Opus 4.8, OpenCode 위의 에이전트 세션, high reasoning effort. 증거는 프롬프트에 인라인하지 않고 작업 디렉터리의 파일로 받는다.
- 베이스라인: Base harness, ReasoningBank(하네스 고정 + 추론 메모리 검색), Meta-Harness(훈련 분할로 오프라인 검색 후 고정 배포, 훈련 절반을 쓰는 유일한 방법), Harness Scaling(과제별 verifier-blind 수정 루프, 상태 이월 없음). 수정·반성은 모두 Claude Opus 4.8로 통일.
- 본문 표의 Harness²는 한 단계, "+ Recursion"은 병렬 의 추가 변화. 라이브러리는 벤치마크마다 빈 상태에서 시작.
주요 결과
README의 "최대 +11.5 / +4.5 / +11.8pp"를 논문 Table 1·2에서 확인해 보자.
| 설정 | Base | Harness² () | + Recursion () |
|---|---|---|---|
| WB Avg, GLM-5 / OpenCode | 64.2 | 75.7 (+11.5) | +3.9 |
| WB Avg, GLM-5 / Codex | 64.4 | 75.3 (+10.9) | +3.0 |
| WB Avg, Gemini 3.5 Flash / OpenCode | 72.4 | 77.5 (+5.1) | +3.3 |
| WB Avg, Gemini 3.5 Flash / Codex | 74.5 | 77.5 (+3.0) | +2.9 |
| JobBench, Gemini 3.5 Flash / OpenCode | 31.5 | 36.0 (+4.5) | +3.0 |
| JobBench, GLM-5 / OpenCode | 20.6 | 24.2 (+3.6) | +4.2 |
| LAB Partial, GLM-5 / OpenCode | 59.6 | 71.4 (+11.8) | +6.7 |
| LAB Partial, Gemini 3.5 Flash / OpenCode | 79.9 | 81.9 (+2.0) | +2.6 |
세 수치가 모두 표에서 그대로 재현된다. 저자들이 강조하는 관찰은 네 가지다.
- 12개 벤치마크–설정 쌍 전부에서 한 단계로 개선. 반면 ReasoningBank는 코딩 과제에서 base보다 최대 6.6점 아래로 떨어지고, Harness Scaling은 12쌍 중 7쌍에서 base에 못 미친다. LAB의 Gemini/Codex 한 칸에서만 Meta-Harness(76.5)가 Harness²(75.6)를 앞선다.
- 약한 실행기가 더 많이 번다. GLM-5가 한 단계 후 WB 75.7(OpenCode)·75.3(Codex)으로, 각각 Gemini의 base 72.4·74.5를 넘는다. "개선된 하네스를 가진 약한 모델이 원래 하네스의 강한 모델을 이길 수 있다."
- 재귀가 초기 하네스 간 격차를 균일하게 닫지는 않는다. JobBench에서 OpenCode–Codex 격차는 Gemini 2.4→0.5, GLM-5 3.0→0.5로 줄지만, WB에서 GLM-5의 격차는 0.2→1.3으로 오히려 커진다.
- #Steps(실행기 턴 수)를 함께 보고한다. WB에서 Harness²는 대체로 base보다 적은 턴으로 더 높은 점수를 내지만(Gemini/OpenCode 25.4→21.9), JobBench·LAB에서는 턴이 늘기도 한다.
예산 와 비용

Figure 5에서 병렬·순차 모두 가 1에서 5로 갈 때 단조 상승한다. 병렬은 Code 76.5→80.8, Office 79.5→83.4다. Harness Scaling은 →3에서 두 도메인 모두 퇴행하고 ReasoningBank는 요동친다. 저자들이 꼽는 포인트는 Harness²의 두 재귀 모두 에서 이미 모든 베이스라인의 를 넘는다는 것이다. "테스트 타임 탐색을 늘리는 것만으로는 성능이 보장되지 않는다." 에서는 병렬이 순차보다 위에서 끝나지만 Code의 에서는 순차가 더 높다.
비용은 Figure 6에서 산출물 제출 전까지 쓴 모든 토큰(실행 + 개선)을 x축에 놓고 본다. Gemini 3.5 Flash/OpenCode 기준 JobBench는 base 대비 이득이 4.5점→ 7.5점, WB는 5.1→8.4점이며, 두 설정 모두 경험적 Pareto 프런티어 위에 있다. 그래프를 읽으면 JobBench에서 은 과제당 수십 M 토큰, 는 100M 토큰대이고, Meta-Harness는 보다 더 많은 컴퓨트를 쓰고도 더 낮은 점수다. 한계 절에서 저자들은 "병렬 세션이 지연은 줄여도 계산량을 없애지는 않으며, 보편적으로 최적인 배분을 확립한 것은 아니다"라고 쓴다.
Ablation: 라이브러리, 범위 분리, 구성
Table 3(Gemini 3.5 Flash, OpenCode, ):
| 구성 | WorkBuddy | JobBench |
|---|---|---|
| Harness² | 77.5 | 36.0 |
| w/o library (라이브러리 읽기·쓰기 없음) | 74.4 (−3.1) | 34.2 (−1.8) |
| w/o scoping (불변/도메인 대신 범용 편집자 2개) | 74.6 (−2.9) | 32.3 (−3.7) |
| w/o composition (후보 둘 중 증거가 선호하는 쪽 채택) | 75.9 (−1.6) | 34.1 (−1.9) |
세 요소가 모두 기여하고, JobBench에서는 범위 분리가 가장 크다. 같은 증거에서 같은 수의 후보를 만들어도 "어느 범위를 읽을지"를 정해 주는 것이 효과가 있다는 뜻이다.
Table 6은 반대 방향이다. 이미 개선된 하네스( 병렬, WB 평균 80.8)에서 컴포넌트 그룹을 떼어 내고 재개선 없이 다시 평가한다. 스킬 제거가 Code·Web에서 가장 큰 손실(−3.6, −6.9), 스크립트 제거가 Office에서 가장 큰 손실(−7.4). 세 도메인 평균으로는 스킬 −5.3, 스크립트 −3.7, 프롬프트 계열 −1.5다. 모든 ablation이 여전히 base(72.4)보다 높고, 저자들은 "가산적 효과를 입증한 것은 아니다"라고 덧붙인다. Figure 10에 따르면 실제 편집의 절반가량이 스킬과 스크립트에 몰린다.
교훈 이월의 효과

하네싱 수준 재귀가 정말 다음 과제를 돕는지 보는 실험이 Figure 7이다. 왼쪽은 참조 실행도 프로브도 없이 base 하네스를 직접 편집만 하는 설정이다. 라이브러리 없이 편집하면 Code 73.4→63.2, Web 69.9→65.0으로 base보다 나빠진다. 증거 없는 편집은 해롭다는 뜻이다. 로 쌓은 라이브러리를 주면 base 수준으로 돌아오고, 로 쌓은 라이브러리를 주면 프로브 없이도 Code +0.9, Web +4.4, Office +5.1을 번다. 과제 수준 탐색을 더 하면 그 경험만으로 이후 하네싱이 좋아진다는 것이 논문의 핵심 주장 중 하나다. 오른쪽은 JobBench에서 쌓은 라이브러리를 WB의 한 단계 개선에 넘긴 결과로 +0.6/+0.5/+2.9다. Leave-one-out 재실행(각 과제를 자기 항목만 뺀 완성 라이브러리로 재실행)은 WB 77.5→79.4, JobBench 36.0→37.7인데, 저자들은 이것이 나중 과제의 경험까지 쓰는 오프라인 재사용 분석이지 온라인 이득 추정이 아니라고 명시한다.
그 밖의 분석
- 같은 모델로 편집자와 실행기를 겸함(Figure 8, OpenCode, ): GLM-5부터 Claude Opus 5까지 다섯 모델 모두 세 벤치마크에서 개선. Opus 5는 WB +3.3, JobBench +5.5, LAB +3.0, GLM-5는 LAB +13.7. 더 강한 편집자가 필수는 아니다.
- 모델 간 전이(Figure 12): Gemini 3.5 Flash용으로 다듬은 하네스를 그대로 GLM-5에 주면 Code 58.5→75.8(+17.3). Gemini 3.7 Flash는 Code +0.3, Office +6.4로 편차가 크다.
- 도구 오류율(Table 7): 한 단계 후 세 벤치마크 모두 하락, JobBench 14.4%→9.1%. 도구 호출 수는 WB에서 줄고(20.0→17.8) JobBench·LAB에서 는다. "더 신뢰할 수 있는 도구 사용"과 "더 적은 호출"은 다른 일이다.
- 프로덕션 하네스 비교(Figure 13): CodeBuddy·OpenCode·Codex·Claude Code를 그대로 둔 것 중 어느 것도 모든 도메인에서 1등이 아니다(Claude Code는 Code·Office, Codex는 Web). OpenCode에서 출발한 Harness² 는 도메인별 최강 고정 하네스보다 +4.6/+5.8/+4.9.
- 실패 분석(Figure 14): 참조보다 나빠진 9건을 세 유형으로 분류. 선택기가 더 약한 후보를 고름(WB-code에서 95점짜리 대신 55점짜리 선택), 잘못된 전제가 후보들로 전파됨(2~11점 손실), 결과 변동·판정 누락 등 귀속이 어려운 경우.
🛠️ 직접 돌려보기
README는 Linux·Python 3.12·uv 기준이다. macOS 27.0.1(Apple Silicon)에서 시도해 봤다. uv가 Python 3.12를 직접 내려받으므로 시스템 Python(3.9)은 상관없다.
git clone https://github.com/google-research/harness2 && cd harness2
uv venv --python 3.12 .venv
source .venv/bin/activate
uv pip install -e '.[render]'
harness2-demo --output runs/demo --k 2
README의 설명대로 데모는 모델 자격증명 없이 두 재귀 모드를 결정론적 편집자와 실제 Python 실행으로 돌린다. macOS에서도 그대로 성공했다(commit 1cfe254, 2026-10-13 기준).
[accounting] 1/2 ok ledger-1
[accounting] 2/2 ok ledger-2
Local demo: 2 tasks completed; 0 failed. .../runs/demo/demo.json
harness2-demo --output runs/demo --k 2 0.73s user 0.72s system 91% cpu 1.584 total
demo.json을 열면 과제 2개에 대해 execution_count: 28, editor_calls: 32가 기록되어 있다. 두 모드( 병렬 agg2, 순차 seq2)를 각각 돌렸으니 과제·모드당 실행 7회, 편집자 호출 8회다. 데모 과제는 harness2/demo.py에 들어 있는데, 꽤 교육적이다. 기본 하네스의 scripts/summarize.py가 장부의 양수 금액만 합산하는 버그를 갖고 있고(if amount > 0), 시스템 프롬프트는 "이 스크립트로 장부를 대사하라"고만 말한다. 결정론적 편집자가 Propose–Probe–Compose를 거쳐 이 필터를 제거하고, 반성 단계가 라이브러리에 다음과 같은 EXPERIENCE.md를 남긴다.
## What each edit did
component: scripts/summarize.py
candidates: inv1
change: dropped the positive-only filter from the amount sum
observed: the probe total included the credits the base run omitted
verdict: helped
## Transferable lesson
- **cue**: When a ledger includes credits and debits
- **lesson**: Include both signs when summing in scripts/summarize.py.
- **evidence**: ... removing the positive-only filter changed the probe total
to include the credits omitted by the base trajectory.
- **confidence**: high for this observed arithmetic contrast
논문이 말한 라이브러리 항목의 구조(하네스 전체 트리 + 상황·교훈·증거)가 runs/demo/library/k2/{agg,seq}/accounting/harnesses/<task>/ 아래에 그대로 있고, INDEX.md가 각 항목의 cue를 나열한다. 두 번째 과제 ledger-2는 library_entries_before: 1로 첫 과제의 항목을 읽은 상태에서 시작한다. 실행 디렉터리에는 context/{inv1,inv2,dom1,dom2,agg1,agg2}, harnesses/, selection/, reflection/이 과제별로 생겨 파이프라인 단계가 파일로 보인다.
모델 기반 벤치마크는 Node.js 20+, Google Cloud CLI, Vertex AI 프로젝트, 그리고 벤치마크별 의존성(LAB은 Pandoc·Poppler, WorkBuddy는 Docker)이 필요하다. .env.example을 복사해 모델 ID를 적고 gcloud auth application-default login을 한 뒤, LAB을 한 과제만 돌리는 README의 4단계는 다음과 같다. 이 글에서는 비용 때문에 실행하지 않았다.
harness2-setup lab
harness2-check --bench lab
harness2 --bench lab --k 1 --mode parallel \
--only-domains antitrust-competition --max-tasks 1
harness2-judge --bench lab --k 1 --mode parallel
harness2-report --bench lab --k 1 --mode parallel
판정·보고는 개선 실행과 같은 벤치마크·실행기·부분집합·--k·--mode·seed를 써야 하고, --dry-run을 붙이면 모델 호출 없이 과제 선택만 미리 본다. --max-tasks는 전체가 아니라 도메인당 상한이고 LAB의 전체 스트림은 1,143개 과제이니 작게 시작하라는 것이 문서의 조언이다. 순차 재귀는 --mode sequential, Codex 실행기는 --substrate cx(Vertex의 Gemini를 Responses API로 노출하는 harness2-bridge가 함께 필요). 결과는 runs/<bench>/ 아래에 과제 요약, 산출물, 채택 하네스, 반성 노트, 채점 결과로 저장되고 같은 명령을 다시 치면 이어서 돈다.
⚠️ 보안 주의: 실행기의 네트워크는 열려 있다
README와 docs/EXPERIMENTS.md가 직접 밝힌 사실이다. 실행기의 네트워크 접근은 제한되지 않고, Codex는 샌드박스를 끈 채 돈다. 세 벤치마크는 모두 공개되어 있고 JobBench는 과제별 RUBRICS.json까지 Hugging Face에 올라가 있다. 문서에는 "이 릴리스의 검증 실행에서 JobBench의 Codex 롤아웃이 지시받지 않았는데도 자기 과제의 루브릭을 내려받았다"는 사례가 적혀 있다. 편집자 쪽에는 루브릭이 든 디렉터리를 넘기지 않는 가드가 있지만, 실행기가 인터넷에서 답을 찾아오는 것은 그 가드가 막지 못한다.
권고는 평가 전에 실행기 호스트에서 huggingface.co, hf.co, *.hf.co, github.com, raw.githubusercontent.com을 차단하되, Codex 샌드박스가 꺼져 있으니 도구 설정이 아니라 네트워크 수준(egress 방화벽, DNS 정책)에서 막고, 쓴 제한을 결과와 함께 보고하라는 것이다. 설치 단계 자체는 이 호스트들이 필요하므로 설치 후에 막아야 한다. bubblewrap부터 gVisor까지 글에서 정리했듯 네트워크 네임스페이스 분리나 컨테이너 수준 egress 정책이 여기에 해당한다. 하네스를 LLM이 고치고 플러그인(.ts)과 스크립트(.py)까지 생성하는 시스템이므로, 벤치마크 오염을 넘어 일반적인 실행 격리 관점에서도 챙길 일이다. 편집자 프롬프트가 "후보 하네스에서 발견한 스크립트·플러그인·명령을 절대 실행하지 말고 텍스트로 읽어라"고 지시하는 것도 같은 맥락이다.
🧭 정리, 한계, 열린 질문
Harness²의 기여를 한 줄로 줄이면 **"정답 없이 하네스를 고치되, 고친 경험을 다음 고치기에 쓴다"**다. 두 층의 재귀 중 첫째(Propose–Probe–Compose)는 정답 대신 같은 과제에서의 행동 대조를 증거로 삼고, 둘째(개선 하네스의 라이브러리)는 실행 하네스 대신 "채택된 하네스 + 증거 있는 교훈"을 이월한다. 세 벤치마크, 네 모델–하네스 구성에서 한 단계로 전부 개선되고 를 올리면 더 오르며, 라이브러리·범위 분리·구성 모두 ablation에서 기여가 확인됐다.
한계는 저자들이 Appendix F에 적은 둘이 핵심이다.
- 비용. 과제당 롤아웃 회와 개선자 세션 회는 공짜가 아니다. Figure 6의 Pareto 프런티어는 "같은 비용이면 더 낫다"를 보여 주지만, JobBench 는 과제당 100M 토큰 단위다. 적응적 예산(과제 난이도나 새 증거 수확 체감에 따라 멈추기)은 Appendix G의 향후 과제다.
- 실행 기반 피드백의 한계. 행동 대조와 모델 판단은 실행 변동성과 공유 편향에 민감하고 정확성을 보장하지 않는다. 실패 분석의 "95점 대신 55점 선택" 사례가 이를 보여 준다.
여기에 내가 덧붙이고 싶은 열린 질문이 있다. 첫째, RRSI와의 결합이다. 같은 팀이 한 달 전 "반복 편집은 과적합한다"는 논문을 냈는데, Harness²의 라이브러리는 도메인 안에서 계속 자란다. Appendix G는 라이브러리 통합·오래된 경험 수정·검색 개선을 언급하지만, RRSI식 편집 예산 감소나 구조 가지치기를 개선 하네스에 적용하면 어떻게 될지는 두 논문 어디에도 없다. 둘째, LLM 판정 벤치마크에 대한 의존이다. JobBench와 LAB은 Claude 계열 판정자가 채점하고 편집자도 Claude Opus 4.8이다. WB는 결정론적 검사가 섞여 있어 완화되지만, RRSI 글에서 봤던 "판정자가 좋아하는 문체"를 익힐 가능성이 완전히 배제됐다고 보기는 어렵다. 셋째, 라이브러리 재사용 수치(Figure 10)에서 수정 파일 중 라이브러리 기원이 LAB·WB-office 22%, JobBench 47%인데 절반 이상 복사된 파일은 2~10%에 그친다. "적응이 복사보다 흔하다"는 해석은 그럴듯하지만, 교훈(EXPERIENCE.md)의 기여와 하네스 파일의 기여를 분리한 실험은 없다.
마지막으로 고지. README의 Disclaimer대로 이 프로젝트는 Google의 공식 지원 제품이 아니며 Google OSS 취약점 보상 프로그램 대상도 아니다. 프로젝트 사이트 harness2.github.io는 글 작성 시점에 접속이 되지 않아 이 글은 arXiv HTML과 GitHub 저장소만을 근거로 썼다.
📚 참고
- 원문: Harness²: Recursive Agent Harnessing for an Open World (arXiv 2610.14224v1, 2026-10-09) / HTML 버전
- 코드: github.com/google-research/harness2 (README,
docs/BENCHMARKS.md,docs/EXPERIMENTS.md,docs/SETUP.md,harness2/demo.py) - 프로젝트 사이트: harness2.github.io (작성 시점 접속 불가)
- 관련 논문: RRSI (arXiv 2609.24972), Recursive Harness Self-Improvement / RHI (arXiv 2607.15524), Recursive Self-Aggregation (arXiv 2509.26626)
- 벤치마크: JobBench, Harvey LAB, WorkBuddy-Bench
- 이 블로그의 관련 글: Effective harnesses for long-running agents, Raven: 하네스의 하네스, RRSI, 루프 엔지니어링, bubblewrap부터 gVisor까지
본 글의 그림은 원문과 공식 저장소(assets/)에서 가져왔습니다. 그림 4·5는 arXiv HTML의 SVG를 렌더한 것입니다.