hiw3c 日报精选
MarkTechPost RSS 全文

Google Open-Sources Harness2, a Recursive Agent Harnessing Framework

Google Research released Harness2, an Apache-2.0 framework that rewrites an agent's harness at test time. One refinement step lifted GLM-5 by 11.5 points on WorkBuddy-Bench with no weight updates. The

来源:MarkTechPost · www.marktechpost.com

正文为英文,可一键机器翻译(仅首次需要等待)

Google Cloud AI Research has open-sourced Harness². It is a recursive agent harnessing framework that improves the code and files around a frozen model. For developers, the pitch is simple. Your agent may get better without a better model.

TL;DR

  • Size: A framework, not a model. 0 parameters trained; 8 editable harness components. Version 0.1.0.
  • Runs on: Linux with Python 3.12 or 3.13 and uv. Model runs call models through Vertex AI. GPU requirement: Not disclosed.
  • Performance: 1 refinement step improved all 4 model and harness setups on all 3 benchmarks.
  • Best: GLM-5 under OpenCode rose from 64.2 to 75.7 on WorkBuddy-Bench (+11.5 points).
  • Worst: GLM-5 under Codex gained only 1.2 points on JobBench (23.6 to 24.8).

What is Harness²?

Harness² is a plug-and-play framework from Google Research that refines an agent’s harness during deployment. A harness is everything around the model: prompts, tools, memory, skills and orchestration. Harnessing is the process of optimizing that system. Model weights never change.

The target setting is the open world. Tasks arrive unseen, and no verifier says whether an answer is right. The research team argues that most self-improvement methods assume labels or test cases. Harness² is built to work without them.

What are the 8 harness components?

Harness² exposes 8 editable components, each mounted as a file:

  1. System prompt
  2. Guardrails
  3. Memory
  4. Tool guidance
  5. Subagents
  6. Skills
  7. Scripts
  8. Plugins (middleware)

They cover context construction, the tool interface, delegation and behavior inside the tool loop. The layout extends the 7-file split from earlier Agentic Harness Engineering work by 1 component.

How does recursive agent harnessing work?

The framework runs two linked levels of recursion:

  • Task-level recursion uses a contrastive Propose, Probe, Compose step. First, the agent runs the task once with the base harness. An editor then proposes 2 candidates. The invariant candidate targets general agent failures such as planning or tool use. The domain candidate targets knowledge and procedures for the current domain. Both candidates run on the same task. The composer compares their trajectories against the reference and keeps only edits backed by observed behavior.
  • Harnessing-level recursion happens after each task. A reflector stores the adopted harness plus an EXPERIENCE.md file of lessons. This library guides future proposals. Each new task still starts from the base harness.

The budget k scales the search. Parallel mode probes k invariant and k domain candidates, then makes k compositions. Sequential mode chains k refinement steps.

Play</button><button class="btn" id="h2-step">Step →</button><button class="btn" id="h2-reset">↺ Reset</button><div class="prog"><i id="h2-prog"></i></div></div> <div class="fn">At k=1: 1 reference + 2 probes + 1 final run per task. Parallel mode probes k invariant and k domain candidates; sequential mode chains k steps.</div> </div> <div class="pn" id="h2-p2"> <div class="cg" id="h2-cg"></div> <div class="note" id="h2-cnote" style="border-left-color:#4285F4">Click a component to see its runtime role.</div> <div class="lg"><span style="--c:#4285F4">Context construction</span><span style="--c:#EA4335">Tool interface</span><span style="--c:#FBBC04">Orchestration</span><span style="--c:#34A853">Middleware</span></div> </div> <div class="pn" id="h2-p3"> <div class="sel" id="h2-sel"></div> <div class="bm" id="h2-bm"></div> <div class="fn">Single improvement step (k=1). Means over 3 runs. LAB = Partial pass rate (%). Source: Harness<sup>2</sup> paper, Tables 1 and 2.</div> </div> <div class="pn" id="h2-p4"> <div class="sel" id="h2-sel2"></div> <div class="bx rk" id="h2-rk"></div> <div class="fn">Gemini 3.5 Flash executor. Bar axis starts at 50. Meta-Harness is optimized offline on separate training tasks. Scores as measured in the Harness<sup>2</sup> paper.</div> </div> <div class="ft"><span>Sources: arXiv 2610.14224 · github.com/google-research/harness2</span><a href="https://www.marktechpost.com" target="_blank" rel="noopener">© Marktechpost</a></div> <script> (function(){ var R=document.getElementById('mtp-h2x'); function $(s){return R.querySelector(s)}function $$(s){return R.querySelectorAll(s)} function sz(){try{parent.postMessage({mtpH2xHeight:R.offsetHeight+40},'*')}catch(e){}} $$('.tab').forEach(function(t){t.onclick=function(){$$('.tab').forEach(function(x){x.classList.remove('on')});$$('.pn').forEach(function(x){x.classList.remove('on')});t.classList.add('on');$('#h2-'+t.dataset.t).classList.add('on');if(t.dataset.t==='p3')drawB();if(t.dataset.t==='p4')drawR();setTimeout(sz,50)}}); /* pipeline */ var nd=$$('.nd'),i=-1,tm=null; var notes=["<b>Reference.</b> The frozen model runs the task with the base harness H0. This shows how the harness behaves, not whether the answer is correct.", "<b>Propose.</b> An editor drafts 2 candidates: an <b>invariant</b> one for general agent failures (planning, tool use) and a <b>domain</b> one for task knowledge and procedures.", "<b>Probe.</b> Each candidate runs on the same task. Comparing trajectories against the reference gives a behavioral contrast. No ground-truth labels needed.", "<b>Compose.</b> The composer reads all evidence and diffs. It may merge, revise, adopt 1 candidate, or keep the current harness.", "<b>Execute.</b> The composed harness runs and returns the final deliverable.", "<b>Reflect.</b> The full improvement record is reviewed. Lessons are kept only if execution contrasts support them.", "<b>Update.</b> The adopted harness and an <code>EXPERIENCE.md</code> of lessons join the improvement library.", "<b>Next task.</b> The executor resets to H0, but the library now guides proposals and composition. Removing it cut WorkBuddy from 77.5 to 74.4."]; function show(k){nd.forEach(function(n,j){n.classList.toggle('lit',j<=k)});$('#h2-note').innerHTML=k<0?"Press <b>Play</b> or <b>Step</b> to walk through 1 Harness<sup>2</sup> improvement step.":notes[k];$('#h2-prog').style.width=((k+1)/nd.length*100)+'%';sz()} function step(){i=(i+1)%nd.length;show(i)} $('#h2-step').onclick=function(){stop();step()}; $('#h2-reset').onclick=function(){stop();i=-1;show(-1)}; function stop(){if(tm){clearInterval(tm);tm=null;$('#h2-play').textContent='▶ Play'}} $('#h2-play').onclick=function(){if(tm){stop();return}if(i>=nd.length-1)i=-1;step();tm=setInterval(function(){if(i>=nd.length-1){stop();return}step()},1900);this.textContent='❚❚ Pause'}; /* components */ var C=[["System prompt",