Meta-Harness — 모델을 그대로 두고 harness를 탐색한다
🏟️

Meta-Harness — 모델을 그대로 두고 harness를 탐색한다

Tags
harness engineering
Computer Science
AI
Published
August 13, 2026
Author

0. 이 논문이 주장하는 것

LLM 시스템의 성능은 model weight만으로 결정되지 않는다. 무엇을 저장하고, 언제 꺼내고, 모델에게 어떤 형태로 보여줄지를 정하는 코드 — 논문이 harness라고 부르는 층 — 가 성능을 함께 결정한다. 같은 벤치마크에서 모델을 고정한 채 harness만 바꿔도 6× 성능 차이가 난다는 보고가 있다 .
그런데 harness는 아직 거의 수작업으로 만들어진다. 실무자가 실패 사례를 들여다보고, heuristic을 손보고, 몇 개 안 되는 설계를 반복해서 다듬는다. 이 논문은 그 반복 과정 자체를 자동화할 수 있는지 묻는다.
답은 Meta-Harness다. harness 코드를 탐색하는 outer-loop 시스템이고, proposer로 coding agent를 쓴다. 핵심 설계는 하나다. 이전 후보들의 source code, evaluation score, execution trace를 전부 filesystem에 남겨두고, proposer가 grep과 cat 같은 평범한 도구로 필요한 것만 골라 읽게 한다. 요약본을 주지 않는다.
세 도메인의 결과다.
  • Online text classification: state-of-the-art context management 시스템(ACE)보다 정확도 7.7 points 높으면서 context token은 4× 적게 쓴다.
  • Retrieval-augmented math reasoning: 발견된 harness 하나가 IMO급 200문제에서 held-out 모델 5종 평균 +4.7 points.
  • Agentic coding: TerminalBench-2에서 수작업으로 다듬어진 최고 harness들을 넘어선다. Haiku 4.5 기준 1위, Opus 4.6 기준 2위.
Meta-Harness 헤드라인 결과
Meta-Harness 헤드라인 결과
왼쪽은 text classification에서의 탐색 진행이다. Meta-Harness는 차선책의 최종 정확도를 4번의 evaluation 만에 따라잡고 계속 올라간다. 오른쪽은 TerminalBench-2에서 보고된 모든 Claude Haiku 4.5 harness를 앞선 결과다.

1. harness란 무엇인가, 왜 지금인가

논문은 harness를 이렇게 정의한다.
A harness is a stateful program that wraps a language model and determines what context the model sees at each step.
stateful이라는 점이 중요하다. harness는 한 번의 호출을 꾸미는 프롬프트 템플릿이 아니라, 예제를 하나씩 처리하면서 상태를 갱신하고 그 상태가 다음 호출에 반영되는 프로그램이다. 무엇을 memory에 넣을지 한 번 잘못 정하면 그 영향이 평가 시퀀스 전체를 타고 흐른다.
이 층에 이름이 붙고 관심이 몰린 건 최근이다. OpenAI가 “harness engineering: leveraging Codex in an agent-first world”를 냈고(2026년 2월) , Anthropic이 long-running agent용 harness 글을 냈고(2025년 11월) , martinfowler.com에 harness engineering 항목이 올라왔으며(2026년 3월) , “오후 한나절 만에 LLM 15개의 코딩 성능을 올렸다, 바꾼 건 harness뿐”이라는 실무 글도 나왔다(2026년 2월).
논문은 각주에서 시점을 못박는다.
Based on earlier exploration, we think this workflow only became practical recently, following major improvements in coding-agent capabilities around early 2026.
즉 이 방법이 되는 이유의 절반은 coding agent가 2026년 초에 충분히 좋아졌다는 사실에 있다.

최적화 목표

고정된 language model M과 task distribution X가 있다. harness H와 task instance x ~ X마다 rollout trajectory τ ~ p_M(H, x)를 실행한다. harness가 M에게 줄 prompt를 만들고, 모델이 답하고, harness가 상호작용마다 상태를 갱신한다. reward r(τ, x)가 trajectory를 채점한다.
H* = arg max_H E_{x~X, τ~p_M(H,x)} [ r(τ, x) ]
목표가 여러 개일 때(정확도와 context cost처럼)는 스칼라 하나로 합치지 않고 Pareto dominance로 후보를 평가한 뒤 frontier를 보고한다.

2. 기존 text optimizer가 이 문제에 맞지 않는 이유

harness engineering도 이전 시도의 피드백으로 텍스트·코드 artifact를 반복 개선하는 일이니, 자연스러운 출발점은 text optimization 계열이다. 그런데 이 방법들은 피드백을 지나치게 압축한다.
  • 현재 후보만 조건으로 삼는 것들
  • 주로 scalar score에 의존하는 것들
  • 피드백을 짧은 템플릿이나 LLM 요약으로 제한하는 것들
논문은 이걸 “정보가 쓸모없다는 증거가 아니라 확장성을 고려한 실용적 선택”이라고 정확히 짚는다. 문제는 harness가 long horizon에서 작동한다는 데 있다. 무엇을 저장할지, 언제 꺼낼지, 어떻게 보여줄지를 한 번 정하면 그 효과가 수많은 reasoning step 뒤에 나타난다. 압축된 피드백은 downstream failure를 앞선 설계 결정까지 되짚어 올라가는 데 필요한 정보를 지워버린다.
text optimization 방법별 피드백 예산 비교 (Table 1)
text optimization 방법별 피드백 예산 비교 (Table 1)
Method
History
Log content
MTok/iter
OPRO [51]
Window
past (solution, score) pairs
0.002
TextGrad [53]
Last
textual feedback on current artifact
0.015
AlphaEvolve [35]
Window
program database + eval. scores
0.022
GEPA [1]
Summary
reflective feedback from rollout traces
0.008
Feedback Descent [26]
Summary
comparison + textual feedback
0.012
TTT-Discover [54]
Window
prev. solution fragment
0.026
Meta-Harness
Full
all logs and scores
10.0
MTok/iter는 각 논문이 다룬 가장 큰 세팅에서 artifact 한 번 평가로 생성되는 전체 context의 저자 추정치다. 기존 방법들은 optimization step당 100~30,000 token을 쓴다. Meta-Harness가 다루는 세팅에서는 한 번의 evaluation이 최대 10,000,000 token의 진단 정보를 만든다. 세 자릿수 차이다.
retrieval·memory-augmented LM 연구가 시사하는 방향도 같다. 유용한 context는 하나의 prompt에 통째로 밀어 넣기보다 필요할 때 골라 접근하는 편이 낫다 [28; 48; 37; 56].

3. Meta-Harness의 구조

Meta-Harness search loop (Figure 2)
Meta-Harness search loop (Figure 2)
루프는 세 단계다.
  1. agent가 이전 후보 전부의 source code·execution trace·score가 담긴 filesystem을 읽고 새 harness를 제안한다.
  1. 제안된 harness를 evaluation task에서 평가한다.
  1. 모든 로그(제안 코드, reasoning trace, evaluation score)를 새 디렉터리에 저장하고 루프를 반복한다.
이름이 Meta-Harness인 이유는 이 시스템 자체가 넓은 의미의 harness이기 때문이다. proposer 모델이 탐색 중 무엇을 보는지를 결정하니까. 이하에서 그냥 harness라고 하면 최적화 대상인 task-specific 프로그램을 가리킨다.

proposer는 raw LLM이 아니라 coding agent다

경험의 양이 금방 context limit을 넘어서기 때문에, proposer가 무엇을 볼지 스스로 정하고 편집을 코드베이스와 직접 상호작용하며 검증해야 한다. 그래서 raw next-token model이 아니라 developer tool을 호출하고 코드를 고칠 수 있는 agent를 쓴다.
실제로 가장 부담이 큰 세팅에서 proposer는 iteration마다 중앙값 82개 파일을 읽고, step당 20개 이상의 이전 후보를 참조한다(Appendix A).

outer loop는 의도적으로 최소한만 둔다

Meta-Harness는 population H와 evaluated harness들의 Pareto frontier를 유지하지만 parent-selection rule을 두지 않는다. proposer는 어떤 이전 harness든, 그 execution trace든 자유롭게 들여다볼 수 있다. 정해진 iteration 수만큼 evolution을 돌리고 마지막에 Pareto frontier만 test-set으로 평가한다.
이 단순함은 의도적이다. 진단과 편집 결정을 탐색 heuristic으로 하드코딩하지 않고 proposer에게 맡겨 두면, coding agent가 좋아질수록 Meta-Harness도 저절로 좋아진다.
proposer는 test-set 결과를 절대 보지 않는다. 피드백은 탐색 중 후보 평가에 쓰이는 task instance 부분집합인 search set과, 그 실행에서 남은 execution trace뿐이다.
Algorithm 1 — Meta-Harness outer loop
Algorithm 1 — Meta-Harness outer loop
Algorithm 1 — Meta-Harness outer loop
Algorithm 1 Meta-Harness outer loop over harnesses 1: Input: tasks X, LLM M, proposer P, iterations N 2: Initialize: population H ▷ Initial set of valid harnesses 3: Initialize: filesystem D ← ∅ ▷ stores code, scores, traces 4: for H ∈ H do 5: E_H ← Evaluate(H, M, X) 6: D ← D ∪ {(H, E_H)} 7: for t = 1 … N do 8: Proposer P queries filesystem D ▷ inspects prior harnesses and scores 9: Proposer P proposes k new harnesses {H_1, …, H_k} 10: for H in {H_1, …, H_k} do 11: if H passes interface validation then 12: D ← D ∪ {(H, Evaluate(H, M, X))} 13: return Pareto frontier of harnesses stored in D

code space에서 탐색하면 좋은 점

harness 최적화는 code space에서 일어난다. retrieval·memory·prompt 구성 로직을 조금만 바꿔도 여러 step 뒤의 행동이 달라지므로, local search heuristic은 이 문제와 잘 맞지 않는다.
execution trace를 읽으면 proposer는 harness가 실패했다는 사실(that)뿐 아니라 왜(why) 실패했고 어떤 앞선 설계 결정이 원인이었는지까지 추론할 수 있다. Appendix A와 A.2의 탐색 궤적이 이걸 보여준다. proposer는 이전 코드와 로그를 넓게 읽고, 그 trace로 confounded edit을 식별하고, 인과적으로 유력한 변경을 분리하고, 반복된 regression 뒤에는 더 안전한 수정으로 방향을 튼다.
덕분에 proposer는 알고리즘 구조 수준에서 harness를 고친다. retrieval·memory·prompt 구성 로직 변경부터 프로그램 전면 재작성까지 범위가 넓고, 템플릿 빈칸 채우기나 미리 정의된 mutation operator 적용이 아니다. 실제로는 강한 이전 harness에서 출발하는 일이 잦은데, 이건 하드코딩된 규칙이 아니라 창발한 전략이다.
탐색 공간이 크지만 harness를 프로그램으로 표현하는 것 자체가 자연스러운 regularization이 된다. coding model은 취약한 하드코딩 해법보다 일관된 알고리즘을 내놓는 경향이 있고, 그래서 탐색이 재사용 가능한 context-management 절차 쪽으로 기운다. 이 action space는 프런티어 coding assistant가 학습한 read–write–execute 워크플로와 정확히 겹친다.

실제 구현

  • harness 하나 = single-file Python program. task별 prompting, retrieval, memory, orchestration 로직을 담는다.
  • proposer P = Claude Code [4] with Opus-4.6.
  • proposer는 minimal domain-specific skill의 안내를 받는다. 새 harness를 어디에 쓸지, 이전 harness와 execution trace를 어떻게 볼지, 어떤 파일을 고칠 수 있고 없는지를 적은 문서다.
  • base model M은 도메인마다 다르고 항상 frozen.
  • 전형적인 실행은 20 iteration에 harness 약 60개 평가.

4. 실험

세 도메인이다: online text classification, math reasoning, agentic coding. 비교 대상은 두 부류다. (1) 각 도메인의 hand-crafted harness — context 구성의 현재 최고 수준. (2) program-search 방법 — 피드백과 reward로 후보를 탐색하지만 harness engineering보다 작은 규모를 겨냥해 설계된 것들.

4.1 Online Text Classification

Zhang et al. [59]과 Ye et al. [52]의 세팅을 따른다. LLM이 labeled example을 하나씩 받고, memory를 갱신하고, held-out test set에서 평가받는다. 분류기 LLM은 GPT-OSS-120B로 고정한다.
데이터셋 세 개를 난이도와 도메인 다양성 기준으로 골랐다.
  • LawBench (Law) [16] — 사건 기술에서 형사 혐의를 예측. 215 classes.
  • Symptom2Disease (S2D) [19] — 증상 기술에서 질병 예측. 22 classes.
  • USPTO-50k [41] — 생성물 분자에서 전구체 반응물 예측. 180 classes.
search population H는 이 세팅의 주요 baseline harness들 — zero-shot, few-shot, ACE, MCE — 로 초기화했다. evolution 20 iteration × iteration당 후보 2개 = 후보 harness 40개.
공정한 비교를 위해 proposer 설정을 동일하게 맞췄다(Opus-4.6, max reasoning). 후보 선택은 오직 search-set 성능으로만 하고, test set은 최종 평가까지 봉인한다. evaluation이 주된 계산 병목이므로 각 방법에 동일한 harness evaluation 예산을 준다.
  • Best-of-N — seed에서 독립 샘플링, 탐색 구조 없음. 탐색이 의미가 있는지 자체를 재는 compute-matched control.
  • OpenEvolve [43] — LLM mutation을 쓰는 evolutionary program search.
  • TTT-Discover [55] — 이 방법의 text-optimization 요소만 사용, 즉 PUCT reuse rule로 proposal을 선택하는 부분.
Method
Median
Best
GEPA [1]
32.6
40.2
Best-of-N
34.0
44.2
OpenEvolve [43]
39.1
43.3
TTT-Discover [55]
34.1
45.6
Meta-Harness
50.0
56.7
Table 4 — 서로 다른 text optimizer가 제안한 harness들의 정확도(search set 기준).
Meta-Harness는 최고 성능 text optimizer들(OpenEvolve, TTT-Discover)의 도달점을 0.1× evaluation으로 따라잡고, 최종 정확도는 그들보다 10 points 이상 높다.
탐색 진행 곡선 (Figure 4)
탐색 진행 곡선 (Figure 4)
탐색 진행 곡선 (Figure 4)
점 하나가 후보 harness 하나이고, 선은 best-so-far를 따라간다. Meta-Harness는 처음 4번의 evaluation 안에 OpenEvolve와 TTT-Discover의 최종 정확도에 도달하고 계속 개선되어 모든 baseline보다 10 points 이상 위에서 끝난다.
논문은 이 속도 차이를 outer loop에 최소한의 구조만 부과한 설계 선택에서 찾는다. Meta-Harness는 filesystem으로 전체 경험 이력을 보존하고 proposer가 필요한 것은 무엇이든 보게 하는데, OpenEvolve와 TTT-Discover는 훨씬 구조화되고 제한된 입력으로 작동한다. 그리고 한 마디 덧붙인다 — online text classification은 이 논문이 다루는 세팅 중 context가 가장 작은 쪽이다. 구조가 무거운 optimizer들이 여기서 이미 뒤처진다면 더 어려운 영역에서 격차는 벌어지기만 할 것이다.
proposer 인터페이스의 어느 부분이 중요한지 분리하려고 세 조건을 비교했다.
Method
Scores
Code
Summ.
Traces
Median ↑
Best Acc ↑
> ZS
Scores Only
✓
✓
×
×
34.6
41.3
26
Scores + Summary
✓
✓
✓
×
34.9
38.7
23
Meta-Harness (full)
✓
✓
–
✓
50.0
56.7
39
Table 3 — proposer가 접근할 수 있는 정보의 ablation. > ZS는 zero-shot baseline을 넘긴 실행 횟수.
full 인터페이스의 중앙값 후보(50.0)가 두 ablation의 최고 후보(41.3, 38.7)보다 높다. 요약은 사라진 신호를 복구하지 못하고, 진단에 쓸모 있는 세부를 눌러버려 오히려 해가 되기도 한다. raw execution trace 접근이 harness 탐색을 가능하게 하는 핵심 재료라는 결론이 여기서 나온다.
주 비교 대상은 이 문제에 맞춰 사람이 설계한 harness들이다.
  • ACE (Agentic Context Engineering) [59] — reflective memory curation으로 시간에 걸쳐 context를 쌓는다.
  • MCE (Meta Context Engineering) [52] — context 구성을 위한 natural-language skill 라이브러리를 유지·진화시킨다.
Harness
USPTO
S2D
Law
Avg Acc
Ctx ↓
Zero-Shot
12.0
63.2
7.0
27.4
0
Few-Shot (8)
14.0
67.9
21.0
34.3
2.0
Few-Shot (32)
13.0
72.2
21.0
35.4
7.9
Few-Shot (all)
15.0
78.3
29.0
40.8
12.3
MCE [52]†
14.0
83.0
23.0
40.0
28.5
ACE [59]†
16.0
77.8
29.0
40.9
50.8
Meta-Harness
14.0
86.8
45.0
48.6
11.4
Table 2 — test-set 지표. Ctx는 추가 input token(천 단위), 낮을수록 좋다. †는 Ye et al. [52]의 구현.
선택된 Meta-Harness는 48.6%로 ACE를 7.7 points, MCE를 8.6 points 앞선다. context를 더 써서 얻은 결과가 아니다. Meta-Harness는 11.4K context token만 쓰고, ACE는 50.8K, MCE는 28.5K를 쓴다.
가장 큰 차이는 LawBench에서 난다. 215 class 문제에서 45.0 대 29.0(ACE)이다.
harness 코드를 자유 형식으로 최적화하니 스칼라 목적 하나에 미리 커밋할 필요가 없다. 현재 지표와 원하는 trade-off만 알려주면 proposer가 frontier의 넓은 구간에 걸친 harness들을 찾아낸다.
accuracy vs. context Pareto frontier (Figure 3)
accuracy vs. context Pareto frontier (Figure 3)
accuracy vs. context Pareto frontier (Figure 3)
곡선이 매끄럽게 이어지므로, 사람이 설계한 운영점 하나에 묶이는 대신 context를 더 쓰고 정확도를 사는 교환을 통제된 방식으로 할 수 있다.
탐색에서 한 번도 쓰지 않은 데이터셋 9종으로 검증했다.
Harness
SciC
FiNER
Amz5
FPB
GoEmo
Bank77
News
SciT
TwHate
Avg Acc
Ctx ↓
Zero-shot
32.7
56.0
52.7
90.0
42.0
80.7
84.7
89.3
75.3
67.0
–
Few-shot (8)
34.0
63.0
54.0
90.0
44.0
82.7
84.7
91.3
76.7
68.9
2.2
Few-shot (32)
38.7
62.0
53.3
90.7
43.3
86.0
85.3
90.7
76.7
69.6
5.2
Few-shot (all)
35.3
61.0
50.0
93.3
42.7
80.7
84.0
90.0
76.7
68.2
7.4
ACE [59]
40.7
74.0
48.0
96.7
44.0
83.3
86.0
90.7
68.7
70.2
11.7
Meta-Harness
53.3
67.0
60.0
94.0
46.0
82.7
86.7
91.3
77.3
73.1
7.3
Table 5 — OOD text classification. 9개 미지 task에서 차선책 대비 2.9 points 우위.
Meta-Harness가 평균 73.1%로 1위, ACE는 70.2%다. 9개 중 6개에서 최고 성능을 낸다. 눈에 띄는 부수적 관찰이 하나 있다. few-shot 예제를 32개 너머로 무작정 늘리면 9개 중 7개에서 성능이 떨어진다.
발견된 harness가 탐색에 쓴 특정 데이터셋에 과적합한 게 아니라 text classification에 두루 통하는 전략을 잡아냈다는 근거다.
search-set 대 test 정확도 (Figure 7)
search-set 대 test 정확도 (Figure 7)
search-set 대 test 정확도 (Figure 7)
분홍 점 하나가 발견된 전략 하나이고 점선 대각선이 y = x다. LawBench·Symptom2Disease·USPTO 각각에서 search set 성능과 test 성능이 대체로 함께 움직인다.

4.2 Retrieval-Augmented Math Reasoning

올림피아드 수학 풀이에 검색을 붙인, 다소 비표준적인 세팅이다.
원리적으로는 검색이 도움이 될 이유가 있다. 해답은 재사용 가능한 증명 패턴을 공유하는 일이 많으니 이전 reasoning trace에 inference time에 활용할 정보가 들어 있다. 그런데 실제로는 표준 재료가 되지 못했고, 사실 기반(fact-grounded) 도메인과 달리 reasoning 중심 수학 벤치마크에서는 성과가 훨씬 부진했다 [42; 49; 6]. 문제는 naive retrieval이 올바른 trace를 올바른 형태로 좀처럼 끌어오지 못한다는 데 있다. 성패는 검색을 붙이느냐가 아니라 어떤 retrieval policy를 쓰느냐에 달렸다는 뜻이다. 논문은 그 policy를 손으로 설계하는 대신 어려운 올림피아드 문제 집합을 주고 검색 행동 자체가 탐색에서 창발하게 둔다.
retrieval corpus는 8개 오픈소스 데이터셋에서 모은 50만 개 이상의 풀린 문제다.
Dataset
Problems
Sol. Len
Proof
OpenMathReasoning
281,743
5,000†
34%
DeepMath-103K
103,021
5,000†
0%
NuminaMath-1.5
129,520
1,376
13%
PolyMath
11,083
363
0%
Omni-MATH
4,289
829
0%
FineProofs-SFT
4,275
3,977
100%
AIME 1983–2024
933
—
0%
Putnam-AXIOM
492
888
100%
Total
535,356
5,000†
22%
Table 10 — † 5,000자에서 잘림, 실제 해답은 더 길다. Sol. Len은 해답 길이 중앙값(문자 수).
필터링 절차가 꼼꼼하다.
  • NuminaMath-1.5는 competition-math 부분집합(AMC/AIME, olympiad references, number theory, inequalities 및 관련 소스)으로 제한하고 품질이 낮은 웹 스크랩 항목을 버렸다.
  • OpenMathReasoning은 문제당 해답 하나로 중복 제거했고(독립 verifier의 pass rate가 가장 높은 해답을 남김), 중복 제거 전에 출처가 평가 벤치마크 계열(IMO, AIME, HMMT, SMT, USAMO, Putnam)과 겹치는 문제를 먼저 제거했다.
  • 전체 코퍼스를 모든 평가 벤치마크와 harness 탐색에 쓴 search set 기준으로 오염 제거했다. exact prefix matching 후 fuzzy Jaccard similarity(threshold 0.8)를 적용해 둘 중 하나라도 걸리면 폐기.
  • OpenMathReasoning과 DeepMath의 해답은 5,000자로 자른다. 런타임에는 선택된 harness가 해답이 비어 있지 않고 4,000자 미만인 항목으로 검색을 더 제한하고, prompt에 넣을 때 다시 3,000자로 자른다.
  • geometry route용으로 NuminaMath에서 difficulty > 6인 문제만 모은 별도의 hard-reference index를 만든다.
held-out 문제들이 string 기반 필터에서 exact prefix match가 없음을 확인했고, held-out 예제에 대한 top BM25 검색 결과를 수작업으로도 들여다봤다.
  • search set: Olympiad 난이도 문제 250개(OlympiadBench + Omni-MATH hard)
  • 40 iteration, 후보 retrieval harness 109개 생성
  • search population 초기화: zero-shot, few-shot, ACE
  • search-set 성능으로 GPT-OSS-20B 기준 harness 하나를 선택
  • 평가: 처음 보는 IMO급 문제 200개 (IMO-AnswerBench, IMO-ProofBench, ArXivMath [30; 6])
  • 탐색에서 보지 않은 모델 4종에 같은 harness를 적용: GPT-5.4-nano, GPT-5.4-mini, Gemini-3.1-Flash-Lite, Gemini-3-Flash
  • 선행 연구 [30]의 표준 프로토콜을 따라 문제당 3 샘플 평균 정확도 보고
Dataset
Problems
IMO-AnswerBench
100
IMO-ProofBench
60
ArXivMath Dec. 2025
17
ArXivMath Jan. 2026
23
Total
200
Table 11 — 200문제 평가 세트 구성. IMO-AnswerBench는 층화 추출한 100문제 부분집합, 나머지 셋은 전량.
Method
GPT-5.4n
GPT-5.4m
Gem-3.1FL
Gem-3F
GPT-20B
Avg.
No Retriever
23.0
28.8
28.6
42.6
47.6
34.1
Dense Retrieval (k=1)
27.1 (+4.1)
24.5 (−4.3)
31.3 (+2.7)
42.3 (−0.3)
46.9 (−0.7)
34.4 (+0.3)
Dense Retrieval (k=5)
31.1 (+8.1)
28.3 (−0.5)
37.1 (+8.5)
47.2 (+4.6)
46.7 (−0.9)
38.1 (+4.0)
Random Few-shot
23.1 (+0.1)
24.5 (−4.3)
31.0 (+2.4)
40.4 (−2.2)
41.8 (−5.8)
32.2 (−1.9)
BM25 Retrieval
30.2 (+7.2)
29.2 (+0.4)
32.8 (+4.2)
46.6 (+4.0)
48.9 (+1.3)
37.5 (+3.4)
Meta-Harness
31.7 (+8.7)
30.4 (+1.6)
34.9 (+6.3)
46.3 (+3.7)
50.6 (+3.0)
38.8 (+4.7)
Table 6 — IMO급 200문제, pass@1 (문제당 3 샘플 평균). 괄호는 no-retriever 대비 절대 개선폭.
주목할 점 세 가지.
첫째, Meta-Harness는 별도의 dense encoder를 도입하지 않는다. sparse baseline과 동일한 BM25 기반 lexical retrieval stack 위에서 오직 code space만 최적화한다.
둘째, held-out 모델 5종 전부에서 no-retrieval 대비 개선한다. 평균 +4.7 points.
셋째, dense retrieval과 random few-shot은 여러 모델에서 성능을 깎는다. Random Few-shot은 전체 평균이 −1.9로 오히려 해롭고, Dense(k=1)도 GPT-5.4-mini에서 −4.3이다. Meta-Harness는 이 회귀를 피하면서 평균으로도 가장 강한 고정 baseline(BM25)을 1.3 points 앞선다.

4.3 Agentic Coding — TerminalBench-2

TerminalBench-2 [33]는 LLM agent를 89개 과제로 평가한다. 긴 호흡, 완전 자율 실행, 복잡한 의존성, 상당한 도메인 지식을 요구하는 과제들이다. 이 벤치마크에서 agent harness 선택이 성능에 큰 영향을 준다는 건 이미 알려져 있다.
탐색은 강한 오픈 baseline 둘 — Terminus 2 [33]와 Terminus-KIRA [25] — 에서 출발한다.
이 실험은 89개 과제 벤치마크 하나에서 탐색과 최종 평가를 같이 한다. 논문은 이걸 숨기지 않고 [54]의 discovery problem 프레이밍으로 명시한다. 어렵고 공개적으로 경쟁이 붙은 벤치마크에서 성능을 올리는 harness 구성을 찾아내는 문제로 보겠다는 것이다.
근거도 밝힌다. 공개 기술 문서들이 이미 TerminalBench 자체에 대한 반복적 harness 튜닝을 서술하고 있고 [18; 34; 25], 벤치마크가 작고 실행 비용이 커서 별도 split을 만들면 탐색 신호가 크게 약해진다. 과적합 여부는 수작업 검사와, 진화된 harness에 과제별 문자열이 새어 들어갔는지 확인하는 regex 감사로 점검했다.
발견된 harness가 TerminalBench-2 영역에 특화된 것은 맞다. 다만 지시 하나로 어려운 장기 과제를 자율 완수하는 능력 자체가 핵심 역량이고, 이 벤치마크에는 프런티어 모델과 공들여 만든 harness도 고전하는 과제가 많다는 게 논문의 변호다.
Harness
Auto
Pass (%)
Claude Opus 4.6
ㅤ
ㅤ
Claude Code
×
58.0
Terminus 2
×
62.9
Mux
×
66.5
Droid
×
69.9
TongAgents
×
71.9
MAYA-V2
×
72.1
Terminus-KIRA
×
74.7
Capy
×
75.3
ForgeCode
×
81.8
Meta-Harness
✓
76.4
Claude Haiku 4.5
ㅤ
ㅤ
OpenHands
×
13.9
Claude Code
×
27.5
Terminus 2
×
28.3
Mini-SWE-Agent
×
29.8
Terminus-KIRA
×
33.7
Goose
×
35.5
Meta-Harness
✓
37.6
Table 7 — TerminalBench-2 pass rate. 다른 결과는 공식 리더보드 기준. Auto 열은 harness가 자동 탐색으로 만들어졌는지를 표시한다.
Opus 4.6에서 76.4%로 수작업 harness인 Terminus-KIRA(74.7%)를 넘고 리더보드 전체 Opus 4.6 agent 중 2위다. 더 높은 유일한 항목은 ForgeCode(81.8%)인데, 논문은 공개된 코드만으로는 그 보고 수치를 재현하지 못했다고 적고, 리더보드 점수가 공개 저장소 밖의 구성 요소에 의존하는 것으로 보인다고 덧붙인다.
더 약한 모델인 Haiku 4.5에서는 개선폭이 더 크다. 37.6%로 차선책 Goose(35.5%)를 2.1 points 앞서며 Haiku 4.5 agent 중 1위다.
여러 팀이 직접 최적화 중인 경쟁 벤치마크에서 자동 탐색 방법이 프런티어에 이런 이득을 낸다는 점이 이 결과의 의미다.

5. proposer는 실제로 무엇을 했나

논문의 Appendix A는 TerminalBench-2 실행(10 iteration, Claude Opus 4.6)의 탐색 로그를 열어 보여준다. 방법론 주장이 실제 행동으로 뒷받침되는지 확인할 수 있는 부분이라 그대로 옮긴다.

5.1 파일 접근 통계

proposer 파일 접근 통계 (Table 8)
proposer 파일 접근 통계 (Table 8)
proposer 파일 접근 통계 (Table 8)
Statistic
Value
Files read per iteration (median)
82
Files read per iteration (range)
69–99
File type breakdown
ㅤ
Harness source code
41%
Execution traces
40%
Score/summary files
6%
Other
13%
proposer는 iteration마다 중앙값 82개 파일을 읽고, 그 절반 가까이가 이전 harness source code(41%), 또 그만큼이 execution trace(40%)다. score/summary 파일은 6%에 그친다. 접근 패턴이 non-Markovian이라는 뜻이다. 가장 최근 parent만 조건으로 삼는 게 아니라 가용 이력의 대부분을 습관적으로 훑는다.

5.2 실패에서 인과를 읽어내는 궤적

아래 인용문은 각 iteration에서 proposer가 남긴 reasoning을 논문이 verbatim으로 실은 것이다(강조는 논문 저자).
처음 두 iteration 모두 구조적 수정과 prompt 템플릿 수정을 한 후보에 묶어 넣었고, 둘 다 64.4% Terminus-KIRA baseline에서 크게 후퇴했다. Iteration 1은 유출된 터미널 마커로 인한 observation 손상을 겨냥하고 loop breaker를 추가한다.
Hypothesis: CMD_END marker fragments leak into LLM observations on long-running tasks, causing the model to get confused and enter infinite no-tool-call loops. Stripping these markers + adding a loop breaker will recover wasted steps.
긴 작업에서 CMD_END 마커 조각이 LLM observation으로 새어 들어가 모델이 혼란에 빠지고 tool call이 없는 무한 루프에 갇힌다. 마커를 제거하고 loop breaker를 넣으면 낭비된 step을 회수한다.
이 후보에는 정리(cleanup) 중심의 새 prompt 템플릿과 검증 체크리스트도 함께 들어갔다. Iteration 2는 다른 state-machine 수정을 제안한다.
Double-confirmation completion mechanism causes verification spirals. Observed in trajectories where the agent solves the task early but burns 15--40+ additional steps re-verifying because each verification command resets pending completion, requiring another task complete → checklist → verify cycle.
이중 확인 completion 메커니즘이 검증 나선을 만든다. agent가 과제를 일찍 풀고도 15~40 step 이상을 재검증에 태우는 trajectory가 관찰된다. 검증 명령이 실행될 때마다 pending completion이 초기화되면서 task complete → 체크리스트 → 검증 주기를 또 돌아야 하기 때문이다.
두 번째 후보는 pending-completion 메커니즘을 통째로 없애면서 마커 제거와 새 prompt는 그대로 안고 갔다. 이것도 후퇴했다. 결과적으로 proposer는 구조 변경은 서로 다르지만 prompt 개입은 공유하는 실패 후보 두 개를 손에 쥔다.
Prior attempts: evo marker fix (58.9%, -5.6pp), evo single confirm (57.8%, -6.7pp) --- both regressed. Root cause of regressions: Prompt template changes (cleanup directives) caused the agent to delete necessary state before task completion. The structural bugfixes were confounded with harmful prompt changes. evo strip only isolates the two proven structural fixes.
이전 시도 둘 다 후퇴했다. 후퇴의 근본 원인은 prompt 템플릿 변경(정리 지시)이며, 이 때문에 agent가 과제 완료 전에 필요한 상태를 지워버렸다. 구조적 버그 수정이 해로운 prompt 변경과 뒤섞여 있었다. evo strip only는 검증된 구조 수정 두 개만 분리한다.
궤적의 핵심 인과 추론 단계다. proposer는 첫 두 실패의 공통 요인이 특정 버그 수정이 아니라 정리 중심 prompt 재작성이라는 걸 알아챈다. 그래서 원래 prompt로 되돌리고 marker stripping과 loop breaker만 시험한다. 결과 후보는 여전히 약간 낮지만(63.3%, −1.1pp) 앞선 버전들보다 훨씬 덜 잃었고, 이는 confound 진단을 뒷받침한다.
Iteration 4는 completion flag가 중간 명령 실행 시 초기화되는 state-machine 버그를 지목한다.
Remove the two self. pending completion = False lines that reset the completion flag when intermediate commands run. This fixes a state machine bug where: (1) Agent calls task complete → sees QA checklist, pending completion = True (2) Agent runs verification commands → pending completion = False (bug!) (3) Agent calls task complete again → sees checklist AGAIN → infinite loop.
proposer는 구체적 trajectory 증거까지 인용한다. configure-git-webserver 과제에서 agent가 사실상 과제를 푼 뒤 30~60 step의 검증 나선에 갇히는 baseline 실패가 나왔다는 것이다. Iteration 5는 confirmation을 유지한 채 정리 지시 문구를 부드럽게 만들려 했지만 여전히 prompt를 건드렸고 크게 후퇴했다. Iteration 6은 더 안전한 evo strip only 기반으로 돌아와 시스템 수준 최적화를 제안한다.
Empty-command turns waste full LLM round-trips when terminal output hasn't changed. Smart-waiting (poll pane up to 3×5s) before the next LLM call saves 5--15 turns on long-running tasks.
터미널 출력이 바뀌지 않았는데도 빈 명령 턴이 LLM 왕복을 통째로 낭비한다. 다음 LLM 호출 전에 smart-waiting(최대 3×5초 pane 폴링)을 두면 긴 작업에서 5~15턴을 아낀다.
이것도 후퇴했다. 여기까지 오면서 proposer는 구체적인 경험칙 하나를 얻는다. prompt와 completion flow 수정은 국소 가설이 아무리 그럴듯해도 위험이 크다.
여섯 번 연속 후퇴한 뒤, proposer는 control loop를 고치는 대신 loop가 시작되기 전에 정보를 더해주는 쪽으로 전략을 바꾼다.
All 6 prior iterations regressed from the 64.4% baseline because they modified the completion flow, prompt template, or observation processing. evo env bootstrap takes a different approach --- purely additive. It gathers an environment snapshot via a single shell command before the first LLM call and appends it to the initial prompt. No other methods are changed. This should eliminate 3--5 wasted exploration turns on dependency-heavy tasks without risking regression on already-passing tasks.
앞선 6개 iteration이 모두 64.4% baseline에서 후퇴한 건 completion flow, prompt 템플릿, observation 처리를 건드렸기 때문이다. evo env bootstrap은 다르게 접근한다 — 순수 additive다. 첫 LLM 호출 전에 shell 명령 하나로 환경 스냅샷을 모아 초기 prompt에 덧붙인다. 다른 메서드는 바꾸지 않는다. 이러면 의존성이 많은 과제에서 3~5턴의 탐색 낭비를 없애면서 이미 통과하는 과제의 후퇴 위험은 지지 않는다.
이 후보가 실행 중 최고 결과를 낸다. 중요한 건 iteration 7이 이겼다는 사실보다, proposer가 왜 이 변경이 더 안전한지를 스스로 언어화했다는 점이다. 취약하다고 판명된 completion 기계장치를 건드리지 않고, 어려운 과제에서만 주로 유용한 정보를 더한다.
Combining two orthogonal fixes --- env snapshot (saves early exploration turns) + marker stripping with no-tool-call loop breaker --- will yield +1--3pp because they address independent failure modes without touching prompts or confirmation flows (which caused regressions in 5 of 7 prior iterations).
직교하는 두 수정을 결합한다. 서로 독립적인 실패 모드를 다루면서 prompt나 confirmation flow는 건드리지 않으므로 +1~3pp를 기대한다(앞선 7개 중 5개의 후퇴 원인이 그쪽이었다).
The evolution history showed ``don't cleanup service artifacts'' was worth +18pp. Iter 9 (evo no cleanup directive) targeted the same idea but crashed before evaluation.
evolution 이력을 보면 “서비스 산출물을 정리하지 말 것”이 +18pp 가치가 있었다. Iteration 9(evo no cleanup directive)가 같은 아이디어를 겨눴지만 평가 전에 죽었다.
proposer가 별개의 이전 탐색 실행 결과를 참조한 대목이다.

5.3 이 궤적이 말해주는 것

일곱 iteration에 걸쳐 proposer는 confound를 식별하고, confound를 분리하는 가설을 직접 시험하고, control-flow와 prompt 편집이 계속 취약하다는 걸 관찰한 뒤, 의도적으로 순수 additive 수정으로 방향을 튼다. 그 수정이 실행 최고 후보가 된다. 이후 그 아이디어를 앞선 수정과 조합해보고, 다른 실행에서 얻은 교훈까지 옮겨온다.
무작위 mutation이 아니다. 실패 이력을 놓고 인과를 따지는 이런 추론이 full-history filesystem 접근이 가능하게 하는 것이고, 압축된 피드백만 받는 optimizer는 지원할 수 없는 것이다.

6. 발견된 harness들의 실제 모습

Meta-Harness가 내놓는 건 문제 상황에 특화된 실행 가능한 inference-time 절차다. routing, filtering, 조건부 context 구성 같은 비자명한 control flow를 갖춘 구조화된 정책이고, 선택 기준은 오직 search-set 성능이었다. 발견된 harness 각각의 전체 구현은 100~1000줄 규모다.

6.1 Text Classification — 하나가 아니라 계열이 나온다

online text classification에서 Meta-Harness는 단일 정답 정책이 아니라 memory 기반 harness 계열을 찾아낸다.
Pareto-optimal 변형들 (Table 9)
Pareto-optimal 변형들 (Table 9)
Pareto-optimal 변형들 (Table 9)
Variant
USPTO ↑
Symptom ↑
LawBench ↑
Avg ↑
Ctx ↓
Meta-Harness (Draft Verification)
18.0
85.4
17.0
40.1
5.4
Meta-Harness (Error-Annotated)
9.0
87.7
24.0
40.2
22.3
Meta-Harness (CoT Replay)
13.0
88.2
25.0
42.1
23.3
Meta-Harness (Cluster Coverage)
12.0
86.8
33.0
43.9
31.2
Meta-Harness (Cascade Retrieval)
12.0
86.8
36.0
44.9
39.2
Meta-Harness (RRF + Contrastive)
18.0
89.6
35.0
47.5
41.4
Meta-Harness (Relevance + Contrastive)
18.0
90.6
36.0
48.2
43.9
Meta-Harness (Label-Primed Query)
14.0
86.8
45.0
48.6
45.5
Table 9 — 본 탐색에서 나온 Pareto-optimal 변형들. Ctx는 input context의 평균 추가 문자 수(천 단위)로, 본문 Table 2의 token 단위와 다르다. 본문에서 선택된 시스템은 Label-Primed Query.
frontier의 양 끝 두 개를 논문이 자세히 설명한다. 둘 다 과거 labeled example의 memory를 키우면서 inference time에 그 memory로 prompt를 만든다. 차이는 memory를 심문하는 control flow에 있다.
발견된 파일명은 draft_verification.py. 예측을 2회 호출 절차로 바꾼다.
Draft-verification classification harness (Figure 5)
Draft-verification classification harness (Figure 5)
Draft-verification classification harness (Figure 5)
  • Stage 1: Draft — 가장 유사한 labeled example 5개를 검색해 초기 예측을 받는다.
  • Stage 2: Verification — 그 draft label을 조건으로 memory를 다시 검색한다. 같은 label의 confirmer 5개와 다른 label의 challenger 5개를 가져와, 초기 답을 유지할지 수정할지 모델에게 묻는다.
  • Cold start — labeled example이 5개 미만이면 2단계 절차를 건너뛰고 표준 단일 호출 few-shot prompt를 쓴다.
  • 왜 저렴한가 — 두 호출 모두 짧은 검색 context를 쓰므로 모델을 두 번 부르고도 전체 context 비용이 frontier의 낮은 쪽에 머문다.
핵심 발견 행동은 두 번째 검색이 query와 draft prediction 양쪽에 의존한다는 점이다. 그래서 일반적인 근접 이웃이 아니라 모델의 현재 추측을 겨냥한 반례를 꺼내올 수 있다.
발견된 파일명은 label_primed_query_anchored.py. 세 부분으로 조립한 하나의 큰 호출을 쓴다.
Label-primed query-anchored classification harness (Figure 6)
Label-primed query-anchored classification harness (Figure 6)
Label-primed query-anchored classification harness (Figure 6)
  • Label primer — 예제를 보여주기 전에 유효한 출력 label을 나열해 모델이 답 공간 전체를 먼저 보게 한다.
  • Coverage block — 알려진 label마다 query와 가장 관련 깊은 labeled example을 검색해 클래스당 대표 예제를 하나씩 넣는다.
  • Contrastive block — 매우 유사하지만 label이 다른 예제 쌍을 만들어, 현재 query 주변의 국소 결정 경계를 prompt에 노출한다.
  • Retrieval rule — label을 무시한 최근접 이웃 대신 TF-IDF 유사도 + query-anchored 파트너 선택을 쓴다.
coverage block이 label 공간 전체를 드러내고, contrastive block이 현재 query 주변의 결정 경계를 날카롭게 한다. 215 class인 LawBench에서 이 변형이 45.0을 내며 ACE(29.0)를 16 points 앞선 이유가 여기 있다.

6.2 Math Retrieval — 네 갈래 라우터

수학 추론에서 나온 최종 harness는 간결한 4-route BM25 프로그램이다. 사후에 사람이 정리한 구조가 아니라 탐색에서 창발한 구조다. routing predicate, reranking 항, 중복 제거 임계값, route별 예제 개수까지 전부 outer loop가 40 iteration에 걸쳐 선택했다.
발견된 math retrieval harness (Figure 8)
발견된 math retrieval harness (Figure 8)
발견된 math retrieval harness (Figure 8)
inference time에 harness는 각 문제를 네 route 중 정확히 하나에 배정한다: combinatorics, geometry, number theory, 그리고 algebra 및 기타를 위한 default. gate는 문제 서술에 대한 가벼운 lexical predicate로 구현되며, keyword 집합과 geometry 표기용 정규식 feature 몇 개를 쓴다. route 간 출력 통합은 하지 않는다. 하나가 선택되면 그 route만 최종 prompt용 예제를 검색한다.
모든 route는 앞서 필터링한 코퍼스 위에서 BM25를 쓴다. BM25 인덱스는 LaTeX token(\frac, ^{2} 등)을 원자 단위로 보존하는 math-aware tokenizer를 쓴다.
Route
정책
Combinatorics
BM25 후보 20개 → 8개로 중복 제거 → lexical score와 difficulty로 rerank → 상위 3개 반환. harness가 다양성과 어려운 문제 매칭을 명시적으로 맞바꾸는 주 route다.
Geometry
NuminaMath의 hard reference 1개 + raw BM25 이웃 2개. 탐색은 여기서 difficulty reranking보다 raw 구조 매칭을 일관되게 선호했다.
Number theory
BM25 후보 12개 → lexical score, difficulty, 그리고 기법을 앞부분에서 밝히는 해답에 주는 작은 보너스로 rerank → 상위 3개. 증명 전략이 명시적인 예제를 선호한다.
Default (Algebra/Other)
BM25 후보 10개 → lexical score와 difficulty로 rerank → 상위 검색 점수가 얼마나 몰려 있는지에 따라 adaptive한 개수 K를 선택.
최종 선택된 harness는 성공한 두 탐색 계보의 병합이고, proposer가 탐색 중 자율적으로 합쳤다. 한쪽은 raw BM25 기반의 더 나은 geometry route를, 다른 쪽은 중복 제거와 difficulty reranking 기반의 더 나은 combinatorics route를 기여했다.

6.3 TerminalBench-2 — environment bootstrap

발견된 TerminalBench-2 harness는 Terminus-KIRA [25] 위에 얹힌다. Terminus-KIRA의 native tool calling(Terminus 2의 ICL 기반 JSON 파싱을 대체), 30KB output cap, multi-perspective completion checklist를 그대로 물려받는다.
Meta-Harness가 발견한 주된 수정은 environment bootstrapping 하나다. agent loop가 시작되기 전에 harness가 compound shell 명령을 실행해 sandbox 환경 스냅샷을 모으고 초기 prompt에 주입한다.
발견된 TerminalBench-2 harness (Figure 9)
발견된 TerminalBench-2 harness (Figure 9)
발견된 TerminalBench-2 harness (Figure 9)
탐색 로그에서 verbatim으로 기록된 proposer의 가설이다.
Hypothesis: ``Injecting an environment snapshot (OS, installed languages, package managers, /app contents) before the first LLM turn will reduce wasted exploration episodes by 3--5 turns on dependency-heavy tasks'' Changes: ``Added _gather_env_snapshot() that runs a single compound shell command to collect working directory, /app listing, available languages (python, gcc, node, java, rustc, go), package managers (pip, apt) [...] and injects as [Environment Snapshot] block''
스냅샷에 담기는 것: 작업 디렉터리, /app 목록(큰 디렉터리는 20개 항목으로 잘림), 사용 가능한 프로그래밍 언어와 버전(Python, GCC, G++, Node, Java, Rust, Go), 설치된 패키지 매니저(pip, apt-get), 가용 메모리.
이것으로 agent가 보통 어떤 도구와 파일이 있는지 알아내는 데 쓰는 2~4턴의 탐색이 사라지고 모델은 곧바로 생산적인 작업을 시작한다. bootstrapping 명령은 15초 타임아웃으로 보호되고 실패해도 조용히 넘어가므로 특이한 환경에서 agent를 망가뜨리지 않는다. 전체 구현은 Terminus-KIRA 위에 약 80줄을 더한다.
Terminus-KIRA 대비 89개 중 7개 과제에서 이득을 보고, 개선폭이 가장 큰 건 protein-assembly와 path-tracing이다. 이득을 본 과제들은 공통점이 있다. 사전에 존재를 가정할 수 없는 도메인 특화 도구를 요구한다는 점이다 — 생물정보학 라이브러리, 렌더링 파이프라인, 체스 엔진, 암호 유틸리티, CoreWars 시뮬레이터.
bootstrap이 없으면 agent는 첫 2~4턴을 환경 탐색에 쓴다. 턴 예산이 빠듯하거나 초기의 잘못된 가정이 연쇄적으로 번지는 과제에서 이 낭비된 턴이 pass와 fail을 가른다. bootstrap의 가치는 환경이 자명하지 않고, 실제로 설치된 것에 맞춰 agent가 전략을 조정해야 할 때 가장 크다.

7. 새 도메인에 Meta-Harness를 적용할 때 (Appendix D)

Meta-Harness는 대체로 도메인 비의존적이다. language model을 task-specific harness가 감싸는 상황이면 어디든 적용될 것으로 저자들은 본다. 다만 새 도메인 적용은 비교적 새로운 LLM-assisted coding 영역에서 작업한다는 뜻이고, proposer가 이전 실행들의 long-horizon 이력을 조건으로 삼아 효과가 한참 뒤에야 드러나는 프로그램을 쓰는 일이다.
논문은 이 지침이 방법에 대한 과학적 주장이 아니라 시스템을 만들고 돌리며 얻은 엔지니어링 교훈이라고 못박는다. 세 도메인 전부에서 일관되게 중요했던 것들이다.
좋은 skill을 써라. skill 텍스트는 탐색을 조종하는 주 인터페이스이고, 루프가 작동하느냐를 좌우하는 가장 강한 지렛대다. proposer는 자기 역할, 디렉터리 구조, CLI 명령, 출력 형식을 정의한 natural-language skill [5]을 받는다. 실무에서 skill은 출력과 안전 관련 행동을 제약해야지 proposer의 진단 절차를 제약하면 안 된다. 무엇이 금지인지, 어떤 산출물을 만들지, 어떤 목적을 최적화할지를 명시하되, score·trace·이전 코드를 어떻게 살필지는 모델에게 맡긴다. 로그를 들여다본 저자들의 직관으로는, 충분한 iteration이 쌓이면 누적된 trace가 skill 자체보다 proposer의 행동을 더 크게 좌우한다. 경험상 skill 텍스트를 다듬는 일이 iteration 수나 population 크기를 바꾸는 것보다 탐색 품질에 더 큰 영향을 줬다. 본 실행에 들어가기 전에 skill을 디버깅하고 다듬기 위한 짧은 evolution 실행(각 3~5 iteration)을 몇 번 돌릴 각오를 하라.
baseline harness와, 그 baseline이 어려워하는 search set에서 시작하라. 간단한 baseline(few-shot prompting 정도)을 쓴 다음, baseline이 틀리는 예제를 걸러내거나 어려운 인스턴스의 다양한 부분집합을 골라 search set을 구성한다. baseline이 이미 평가를 포화시키면 탐색이 최적화할 게 없다. search set은 실행당 대략 50번의 전체 평가가 가능한 크기로 유지한다(분류 실험에서 50~100 예제, math retrieval에서 88 문제). 크기가 큰 평가보다 빠르고 변별력 있는 평가가 값지다.
탐색하기 쉬운 형식으로 전부 로깅하라. 평가 코드는 코드·score·execution trace를 proposer가 안정적으로 질의할 수 있는 형태로 써야 한다. JSON 같은 machine-readable 형식, 계층적 산출물 구성, 합리적이고 일관된 파일명, 정규식 검색이 잘 먹는 명명 규칙을 뜻한다.
작은 CLI로 로그를 질의 가능하게 하라(선택이지만 유용). harness마다 source code·score·execution trace가 든 디렉터리가 생기지만, 이력이 커지면 raw filesystem 접근만으로는 번거로워진다. Pareto frontier를 나열하고, top-k harness를 보여주고, 두 실행 사이의 코드와 결과를 diff하는 짧은 CLI가 경험 저장소를 훨씬 쓰기 좋게 만든다. 이런 CLI를 질의하는 일은 coding agent가 학습한 워크플로와 잘 맞는다. 관련 오프라인 경험(다른 모델의 rollout, 풀린 문제 코퍼스, 관련 논문)이 있으면 같은 디렉터리 구조로 변환해 두는 것도 탐색을 warm-start하고 새 아이디어를 근거에 묶는 데 도움이 된다. 이 층이 proposer가 탐색에 낭비했을 token을 아껴준다.
비싼 벤치마크 전에 가벼운 검증을 두라. 모듈을 import하고, 클래스를 인스턴스화하고, 두 메서드를 아주 작은 예제 집합에 호출하는 작은 검증 테스트를 쓴다. 탐색 중 제안된 harness는 전면 평가 전에 이 테스트를 통과해야 한다. 간단한 테스트 스크립트가 기형이거나 작동하지 않는 후보 대부분을 몇 초 안에 걸러내 실패 비용을 0에 가깝게 유지한다.
평가는 proposer 밖에서 자동화하라. eval 실행은 충분히 단순해서 proposer에게 시킬 가치가 없다. 별도 harness가 후보를 채점하고 결과를 filesystem에 쓰게 한다.

8. 이웃 연구들과의 위치 (Section 2 + Appendix E)

큰 틀에서 Meta-Harness는 credit assignment와 meta-learning 문헌 [40; 46; 3; 17; 44; 2]의 아이디어를 coding agent의 최근 발전이 열어준 새 영역으로 가져온다. model weight를 갱신하는 대신 harness 수준에서 credit을 할당한다. 과거 rollout 경험으로 어떤 step과 구성 요소가 실패에 책임이 있는지 의도적으로 추론하고, 이후 행동을 지배하는 외부 코드를 다시 쓴다.
External memory와 adaptive access. 큰 지식 소스나 긴 입력을 한 번에 삼키는 대신 외부 자원으로 두고 필요할 때 접근하는 이점은 여러 선행 연구가 지적했다 — retrieval-augmented generation [28], retrieval과 reasoning의 교차 배치 [48], memory 기반 agent [37], recursive language model [56]. Meta-Harness도 같은 접근 패턴을 쓰되, proposer가 코드·score·execution trace의 거대한 외부 이력을 선택적으로 뒤져 context 관리 절차 자체를 개선하는 더 까다로운 세팅에서 쓴다.
Executable code search. 함수·워크플로·agent 설계를 코드로 탐색하는 계열이 있다. 초기 연구는 큰 모델을 진화적 프로그램 탐색의 mutation·crossover 연산자로 썼고 [27], 이후 고정된 프로그램 뼈대 안의 지정된 함수를 진화시키거나 [39], meta-agent가 이전 발견물로 새 agent를 프로그래밍하게 하거나 [20], agentic system의 workflow graph를 탐색했다 [58]. continual-learning agent를 위한 memory 설계를 탐색하는 흐름도 있는데, 여기서 memory는 task stream을 가로질러 지속된다 [57; 50]. 이와 달리 Meta-Harness는 과제마다 리셋되는 domain-specific harness를 탐색한다 — prompt 구성, retrieval, state update 전략. outer loop는 의도적으로 최소한이다. 고정된 뼈대나 발견물 아카이브, 지속 memory 메커니즘에 기대는 대신 proposer에게 이전 경험에 대한 무제한 filesystem 접근을 준다.
AlphaEvolve / OpenEvolve. 이 둘 [35; 43]은 구조화된 피드백과 함께 LLM 유도 mutation으로 코드를 진화시킨다. proposer는 scalar score가 붙은 program database를 받고(step당 4~22K token) 토너먼트로 선택된 parent에 고정 mutation 전략을 적용한다. 알고리즘 발견·최적화(수학적 추측, 스케줄링 heuristic, 하드웨어 커널)를 겨냥한 설계이고, 탐색 대상이 깔끔한 scalar 목적을 가진 stateless 함수 하나이며 mutation이 국소적이다. harness engineering은 다른 영역이다. harness는 많은 예제에 걸쳐 경험을 축적하는 stateful 프로그램이고, 설계 결정 하나(memory에 무엇을 저장할지 같은)가 평가 시퀀스 전체를 타고 번진다.
GEPA. GEPA [1]는 피드백 풍부함으로 보면 가장 가까운 text optimizer로, 후보마다 rollout trace를 제공한다. 다만 rollout 하나가 단일 LLM 호출이나 짧은 파이프라인인, 피드백 루프가 짧은 과제(수학 문제, 지시 따르기, 코드 최적화)의 prompt 최적화를 겨냥했다. 그 영역에서는 후보별 reflection이 잘 작동한다 — prompt 하나, 답 하나, 점수 하나. harness engineering은 많은 예제와 많은 후보를 동시에 놓고 추론해야 한다. 어떤 retrieval 전략이 한 부류 문제에서는 통하고 다른 부류에서는 나빠지는 이유를 이해하려면 population 전체의 execution trace를 비교해야 한다. GEPA는 한 번에 후보 하나만 다루고(step당 2~8K token), 무엇이 관련 정보일지 미리 예상해야 하는 고정 비평 형식을 쓴다. Meta-Harness는 이전 후보 전부에 동시 접근을 주고 무엇을 살필지 agent가 정하게 한다.
Prompt orchestration framework. LMQL [8], LangChain [13], DSPy [23]는 prompt 템플릿, control flow, 모듈형 LLM 파이프라인을 위한 상위 인터페이스로 prompt engineering을 체계화한다. 이 프레임워크들은 LLM 프로그램을 명세하고 조직하는 걸 돕지만, retrieval policy·memory 갱신·orchestration 로직은 여전히 사람이 설계해야 한다. Meta-Harness는 다른 층위에서 작동한다. 그 policy들의 구현을 실행 가능한 코드 수준에서 탐색하며, harness 자체를 최적화 대상으로 삼는다.

9. 논의와 한계

기존 harness를 이기는 것 말고도 실용적 이점이 몇 가지 있다.
  • 발견된 harness가 OOD 분류 데이터셋(Table 5)과 미지의 base model(Table 6)로 일반화한다.
  • 탐색 실행 하나가 몇 시간의 wall-clock으로 끝나면서, 읽을 수 있고 옮길 수 있는 전략을 내놓는다. 앞으로 나올 더 강한 모델을 포함해 여러 모델에 재사용할 수 있다.
  • code space의 과적합은 검사 가능하다. 취약한 if-chain이나 하드코딩된 클래스 매핑은 코드를 읽으면 보인다. weight space의 과적합은 그렇지 않다.
논문이 스스로 정리한 핵심은 이렇다. Meta-Harness의 주된 이점은 코드를 탐색한다는 것 자체가 아니라 이전 진단 경험에 선택적으로 접근하면서 탐색한다는 데 있다. proposer는 scalar reward나 고정된 요약에 갇히지 않고, raw code·execution trace·과거 실패를 직접 살펴 무엇을 바꿀지 가설을 세우고 시험한다.
저자들은 이 결과가 머신러닝의 반복되는 패턴 [45]과 맞닿아 있다고 본다. 탐색 공간이 접근 가능해지고 나면, 더 강한 범용 agent가 손으로 만든 해법을 앞선다. Rich Sutton의 Bitter Lesson이다.
다음 단계로는 harness와 model weight를 함께 진화시켜, 전략이 모델의 학습 내용을 빚고 그 반대도 성립하게 하는 방향을 제안한다.

남는 한계

  • 세 도메인에서 검증했지만, 실험이 보여준 건 harness 탐색이 특히 강한 coding-agent proposer 하나(Claude Code)로 작동한다는 사실이다. proposer agent에 따라 효과가 어떻게 달라지는지는 남은 과제다.
  • TerminalBench-2 실험은 탐색과 최종 평가에 같은 89개 과제를 쓴다. 논문이 discovery problem으로 명시하고 근거를 대며 과적합 감사를 붙였지만, 다른 두 도메인처럼 깨끗한 held-out 설계는 아니다.
  • ForgeCode(81.8%)의 리더보드 점수는 공개 코드만으로 재현되지 않았다. Opus 4.6에서 Meta-Harness가 2위라는 서술은 이 재현 실패를 전제로 읽어야 한다.
  • Table 2의 Ctx는 token 단위(천), Table 9의 Ctx는 문자 단위(천)다. 두 표의 숫자를 나란히 비교하면 안 된다.
  • Appendix A.2의 baseline은 64.4%인데 Table 7의 Terminus-KIRA는 74.7%다. Appendix는 10 iteration짜리 별도 탐색 실행 기록이고, 그 실행의 기준선 수치다.
  • Appendix C.3에는 편집 흔적이 남아 있다. “When included, the table in this section should report each benchmark separately for both Base and Meta-Harness across the five held-out models.” — 벤치마크별 분해 표는 v1에 실리지 않았다.

10. 정리하며 남는 것

이 논문에서 가져갈 만한 지점은 세 개다.
첫째, harness는 최적화 대상이다. model weight를 건드리지 않고, prompt 문자열을 다듬는 것도 아니고, 무엇을 저장하고 꺼내고 보여줄지를 정하는 프로그램을 탐색 대상으로 놓는다. Table 2에서 정확도가 7.7 points 오르면서 context는 4분의 1로 줄어드는 결과가, 이 층에 아직 안 캐낸 여유가 많다는 증거다.
둘째, 요약하지 말고 접근하게 하라. ablation 결과가 이 논문에서 가장 날카로운 숫자다. score만 준 조건의 최고 후보(41.3)가 full 인터페이스의 중앙값 후보(50.0)보다 낮다. LLM 요약을 얹은 조건은 오히려 최고 성능이 더 떨어졌다(38.7). 진단에 쓸 정보를 미리 압축하면, 무엇이 중요한지 아직 모르는 상태에서 중요한 걸 버리게 된다. filesystem에 다 던져 놓고 agent가 grep으로 파게 하는 편이 낫다.
셋째, 지금 되는 이유는 agent가 좋아졌기 때문이다. iteration마다 파일 82개를 읽고, 여섯 번 연속 실패한 뒤 “이전 실패들의 공통 요인은 버그 수정이 아니라 prompt 재작성이다”라고 스스로 진단하고, 그래서 위험이 없는 additive 변경으로 방향을 트는 행동은 몇 년 전 시스템에 기대할 수 있는 게 아니었다. 저자들이 각주에 “2026년 초 coding agent 능력의 큰 개선 이후에야 이 워크플로가 현실적이 되었다”고 적은 것이 이 방법론의 전제 조건을 정확히 말해준다.
바꿔 말하면, outer loop를 정교하게 설계하는 대신 최소한만 두고 proposer가 좋아지기를 기다리는 것이 이 논문의 베팅이다. 그리고 Bitter Lesson은 대체로 그런 베팅의 편이었다.

부록: 용어 대조

용어
이 글에서의 뜻
harness
LLM을 감싸는 stateful 프로그램. 각 step에서 모델이 볼 context를 결정한다. 최적화 대상.
proposer
새 harness를 제안하는 coding agent. 이 논문에서는 Claude Code + Opus-4.6.
execution trace
harness 실행에서 남는 기록. prompt, tool call, 모델 출력, state 갱신을 포함한다.
search set
탐색 중 후보 harness를 평가하는 데 쓰는 task instance 부분집합. proposer의 유일한 피드백 원천.
Pareto frontier
정확도와 context 비용처럼 상충하는 목적에서 어느 것도 다른 후보에 지배당하지 않는 후보 집합.
discovery problem
별도 held-out split 없이, 어렵고 경쟁이 붙은 벤치마크에서 성능을 올리는 구성을 찾는 문제 설정 [54].
ACE (Agentic Context Engineering)
reflective memory curation으로 context를 누적하는 hand-designed harness [59].
MCE (Meta Context Engineering)
context 구성을 위한 natural-language skill 라이브러리를 유지·진화시키는 harness [52].
Terminus-KIRA
TerminalBench용 최소 harness. native tool calling, 30KB output cap, multi-perspective completion checklist [25].
environment bootstrap
agent loop 시작 전에 shell 명령 하나로 sandbox 환경 스냅샷을 모아 초기 prompt에 주입하는, 이 논문이 발견한 수정.