Google Cloud AI Analysis has open-sourced Harness². It’s a recursive agent harnessing framework that improves the code and information round a frozen mannequin. For builders, the pitch is straightforward. Your agent might get higher with out a higher mannequin.
TL;DR
- Dimension: A framework, not a mannequin. 0 parameters skilled; 8 editable harness elements. Model 0.1.0.
- Runs on: Linux with Python 3.12 or 3.13 and uv. Mannequin runs name fashions by way of Vertex AI. GPU requirement: Not disclosed.
- Efficiency: 1 refinement step improved all 4 mannequin and harness setups on all 3 benchmarks.
- Greatest: GLM-5 beneath OpenCode rose from 64.2 to 75.7 on WorkBuddy-Bench (+11.5 factors).
- Worst: GLM-5 beneath Codex gained just one.2 factors on JobBench (23.6 to 24.8).
What’s Harness²?
Harness² is a plug-and-play framework from Google Analysis that refines an agent’s harness throughout deployment. A harness is every part across the mannequin: prompts, instruments, reminiscence, expertise and orchestration. Harnessing is the method of optimizing that system. Mannequin weights by no means change.
The goal setting is the open world. Duties arrive unseen, and no verifier says whether or not a solution is true. The analysis staff argues that almost all self-improvement strategies assume labels or check circumstances. Harness² is constructed to work with out them.
What are the 8 harness elements?
Harness² exposes 8 editable elements, every mounted as a file:
- System immediate
- Guardrails
- Reminiscence
- Instrument steerage
- Subagents
- Abilities
- Scripts
- Plugins (middleware)
They cowl context development, the instrument interface, delegation and habits contained in the instrument loop. The format extends the 7-file break up from earlier Agentic Harness Engineering work by 1 element.
How does recursive agent harnessing work?
The framework runs two linked ranges of recursion:
- Process-level recursion makes use of a contrastive Suggest, Probe, Compose step. First, the agent runs the duty as soon as with the bottom harness. An editor then proposes 2 candidates. The invariant candidate targets common agent failures resembling planning or instrument use. The area candidate targets information and procedures for the present area. Each candidates run on the identical process. The composer compares their trajectories towards the reference and retains solely edits backed by noticed habits.
- Harnessing-level recursion occurs after every process. A reflector shops the adopted harness plus an
EXPERIENCE.mdfile of classes. This library guides future proposals. Every new process nonetheless begins from the bottom harness.
The finances okay scales the search. Parallel mode probes okay invariant and okay area candidates, then makes okay compositions. Sequential mode chains okay refinement steps.
<model>
#mtp-h2x{–bg:#0f1115;–card:#171a21;–line:#2a2f3a;–tx:#e8eaed;–mut:#9aa0a6;–b:#4285F4;–r:#EA4335;–y:#FBBC04;–g:#34A853;–mtp:#76B900;
max-width:880px;margin:0 auto;background:var(–bg)!essential;colour:var(–tx)!essential;border:1px stable var(–line)!essential;border-radius:16px;padding:22px 22px 16px;font-family:Inter,"Google Sans",Roboto,system-ui,-apple-system,sans-serif;box-sizing:border-box;line-height:1.5}
#mtp-h2x *{box-sizing:border-box}
#mtp-h2x hr,#mtp-h2x p:empty,#mtp-h2x del,#mtp-h2x s{show:none!essential}
#mtp-h2x .hd{show:flex;align-items:heart;hole:10px;flex-wrap:wrap;margin-bottom:4px}
#mtp-h2x .dots{show:flex;hole:5px}
#mtp-h2x .dots i{width:10px;peak:10px;border-radius:50%;show:block;animation:h2pulse 2.4s infinite}
#mtp-h2x .dots i:nth-child(2){animation-delay:.3s}#mtp-h2x .dots i:nth-child(3){animation-delay:.6s}#mtp-h2x .dots i:nth-child(4){animation-delay:.9s}
@keyframes h2pulse{0%,100%{rework:scale(1);opacity:1}50%{rework:scale(.6);opacity:.5}}
#mtp-h2x h3{margin:0!essential;font-size:21px;font-weight:700;colour:var(–tx)!essential;letter-spacing:-.01em}
#mtp-h2x h3 sup{colour:var(–b)}
#mtp-h2x .sub{colour:var(–mut)!essential;font-size:13.5px;margin:2px 0 14px}
#mtp-h2x .tabs{show:flex;hole:6px;flex-wrap:wrap;border-bottom:1px stable var(–line);margin-bottom:16px}
#mtp-h2x .tab{background:clear!essential;border:0!essential;colour:var(–mut)!essential;font:600 13.5px/1 inherit;font-family:inherit;padding:10px 12px;cursor:pointer;border-bottom:2px stable clear!essential;margin-bottom:-1px}
#mtp-h2x .tab.on{colour:var(–tx)!essential;border-bottom-color:var(–b)!essential}
#mtp-h2x .pn{show:none;animation:h2in .35s ease}
#mtp-h2x .pn.on{show:block}
@keyframes h2in{from{opacity:0;rework:translateY(6px)}to{opacity:1;rework:none}}
/* pipeline */
#mtp-h2x .movement{show:grid;grid-template-columns:repeat(4,1fr);hole:10px;place:relative}
#mtp-h2x .nd{background:var(–card)!essential;border:1px stable var(–line)!essential;border-radius:12px;padding:11px 12px;transition:all .35s;opacity:.38;min-height:92px}
#mtp-h2x .nd b{show:block;font-size:13.5px;colour:var(–tx)!essential}
#mtp-h2x .nd small{show:block;colour:var(–mut)!essential;font-size:12px;margin-top:3px}
#mtp-h2x .nd .tg{show:inline-block;font-size:10.5px;font-weight:700;letter-spacing:.06em;padding:2px 7px;border-radius:99px;margin-bottom:6px;colour:#0f1115!essential}
#mtp-h2x .nd.lit{opacity:1;rework:translateY(-2px);box-shadow:0 0 0 1px var(–c),0 8px 22px -10px var(–c)}
#mtp-h2x .lvl{font-size:11px;font-weight:700;letter-spacing:.08em;colour:var(–mut)!essential;margin:12px 0 6px;text-transform:uppercase}
#mtp-h2x .ctl{show:flex;hole:8px;align-items:heart;margin-top:14px;flex-wrap:wrap}
#mtp-h2x .btn{background:var(–card)!essential;colour:var(–tx)!essential;border:1px stable var(–line)!essential;border-radius:99px;padding:8px 14px;font:600 13px inherit;font-family:inherit;cursor:pointer}
#mtp-h2x .btn.pri{background:var(–b)!essential;border-color:var(–b)!essential;colour:#fff!essential}
#mtp-h2x .be aware{background:var(–card)!essential;border:1px stable var(–line)!essential;border-left:3px stable var(–b)!essential;border-radius:10px;padding:11px 13px;margin-top:12px;font-size:13.5px;colour:var(–tx)!essential;min-height:64px}
#mtp-h2x .prog{flex:1;min-width:120px;peak:4px;background:var(–line);border-radius:4px;overflow:hidden}
#mtp-h2x .prog i{show:block;peak:100%;width:0;background:linear-gradient(90deg,var(–b),var(–r),var(–y),var(–g));transition:width .4s}
/* elements */
#mtp-h2x .cg{show:grid;grid-template-columns:repeat(4,1fr);hole:8px}
#mtp-h2x .cp{background:var(–card)!essential;border:1px stable var(–line)!essential;border-radius:11px;padding:11px;cursor:pointer;transition:all .25s;text-align:left;colour:var(–tx)!essential;font-family:inherit}
#mtp-h2x .cp:hover,#mtp-h2x .cp.on{border-color:var(–c)!essential;rework:translateY(-2px)}
#mtp-h2x .cp em{font-style:regular;font-size:11px;font-weight:700;colour:var(–c)!essential}
#mtp-h2x .cp b{show:block;font-size:13.5px;margin-top:2px}
#mtp-h2x .lg{show:flex;hole:14px;flex-wrap:wrap;font-size:12px;colour:var(–mut)!essential;margin:10px 0 0}
#mtp-h2x .lg span:earlier than{content material:"";show:inline-block;width:9px;peak:9px;border-radius:3px;margin-right:5px;background:var(–c)}
/* bars */
#mtp-h2x .sel{show:flex;hole:6px;flex-wrap:wrap;margin-bottom:12px}
#mtp-h2x .chip{background:var(–card)!essential;border:1px stable var(–line)!essential;colour:var(–mut)!essential;border-radius:99px;padding:6px 11px;font:600 12.5px inherit;font-family:inherit;cursor:pointer}
#mtp-h2x .chip.on{colour:#fff!essential;background:var(–b)!essential;border-color:var(–b)!essential}
#mtp-h2x .bm{show:grid;grid-template-columns:repeat(3,1fr);hole:14px}
#mtp-h2x .bx{background:var(–card)!essential;border:1px stable var(–line)!essential;border-radius:12px;padding:12px}
#mtp-h2x .bx h4{margin:0 0 10px!essential;font-size:13px;colour:var(–tx)!essential}
#mtp-h2x .row{show:grid;grid-template-columns:62px 1fr 42px;align-items:heart;hole:8px;margin:7px 0;font-size:12px;colour:var(–mut)!essential}
#mtp-h2x .tr{peak:12px;background:#222733;border-radius:6px;overflow:hidden}
#mtp-h2x .tr i{show:block;peak:100%;width:0;border-radius:6px;transition:width .9s cubic-bezier(.2,.8,.2,1)}
#mtp-h2x .row b{colour:var(–tx)!essential;text-align:proper;font-size:12.5px}
#mtp-h2x .dl{font-size:12px;font-weight:700;colour:var(–g)!essential;margin-top:4px}
#mtp-h2x .rk .row{grid-template-columns:120px 1fr 46px}
#mtp-h2x .fn{font-size:11.5px;colour:var(–mut)!essential;margin-top:10px}
#mtp-h2x .ft{show:flex;justify-content:space-between;hole:8px;flex-wrap:wrap;border-top:1px stable var(–line);margin-top:16px;padding-top:10px;font-size:11.5px;colour:var(–mut)!essential}
#mtp-h2x .ft a{colour:var(–mtp)!essential;text-decoration:none;font-weight:700}
#mtp-h2x code{background:#222733!essential;colour:var(–y)!essential;border:0!essential;padding:1px 5px;border-radius:4px;font-size:12px}
@media(max-width:640px){
#mtp-h2x{padding:16px 14px 12px}
#mtp-h2x .movement,#mtp-h2x .cg{grid-template-columns:repeat(2,1fr)}
#mtp-h2x .bm{grid-template-columns:1fr}
#mtp-h2x h3{font-size:18px}
#mtp-h2x .rk .row{grid-template-columns:96px 1fr 42px}
}
@media(prefers-reduced-motion:scale back){#mtp-h2x *{animation:none!essential;transition:none!essential}}
</model>
<div class="hd"><div class="dots"><i model="background:#4285F4"></i><i model="background:#EA4335"></i><i model="background:#FBBC04"></i><i model="background:#34A853"></i></div><h3>Harness<sup>2</sup> defined</h3></div>
<div class="sub">Google's recursive agent harnessing: the harness adjustments, the mannequin weights keep frozen.</div>
<div class="tabs">
<button class="tab on" data-t="p1">The way it works</button>
<button class="tab" data-t="p2">8 elements</button>
<button class="tab" data-t="p3">Benchmarks</button>
<button class="tab" data-t="p4">vs baselines</button>
</div>
<div class="pn on" id="h2-p1">
<div class="lvl">01 · Process-level recursion (inside 1 process)</div>
<div class="movement">
<div class="nd" model="–c:#9aa0a6"><span class="tg" model="background:#9aa0a6">REFERENCE</span><b>Run base harness</b><small>H0 executes the duty as soon as</small></div>
<div class="nd" model="–c:#4285F4"><span class="tg" model="background:#4285F4">PROPOSE</span><b>2 candidates</b><small>Invariant + domain-specific edits</small></div>
<div class="nd" model="–c:#EA4335"><span class="tg" model="background:#EA4335">PROBE</span><b>Run each</b><small>Identical process, identical mannequin, evaluate habits</small></div>
<div class="nd" model="–c:#FBBC04"><span class="tg" model="background:#FBBC04">COMPOSE</span><b>Merge what labored</b><small>Preserve edits backed by proof</small></div>
</div>
<div class="lvl">02 · Harnessing-level recursion (throughout duties)</div>
<div class="movement">
<div class="nd" model="–c:#4285F4"><span class="tg" model="background:#4285F4">EXECUTE</span><b>Last harness</b><small>Deliverable returned</small></div>
<div class="nd" model="–c:#34A853"><span class="tg" model="background:#34A853">REFLECT</span><b>Evaluate the document</b><small>Which edits helped, and why</small></div>
<div class="nd" model="–c:#34A853"><span class="tg" model="background:#34A853">UPDATE</span><b>Enchancment library</b><small>Harness + EXPERIENCE.md</small></div>
<div class="nd" model="–c:#9aa0a6"><span class="tg" model="background:#9aa0a6">NEXT TASK</span><b>Restart at H0</b><small>Library guides new proposals</small></div>
</div>
<div class="be aware" id="h2-note">Press <b>Play</b> or <b>Step</b> to stroll by way of 1 Harness<sup>2</sup> enchancment step.</div>
<div class="ctl"><button class="btn pri" id="h2-play">
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 okay=1: 1 reference + 2 probes + 1 remaining run per process. Parallel mode probes okay invariant and okay area candidates; sequential mode chains okay steps.</div>
</div>
<div class="pn" id="h2-p2">
<div class="cg" id="h2-cg"></div>
<div class="be aware" id="h2-cnote" model="border-left-color:#4285F4">Click on a element to see its runtime position.</div>
<div class="lg"><span model="–c:#4285F4">Context development</span><span model="–c:#EA4335">Instrument interface</span><span model="–c:#FBBC04">Orchestration</span><span model="–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 enchancment step (okay=1). Means over 3 runs. LAB = Partial cross price (%). Supply: Harness<sup>2</sup> paper, Tables 1 and a pair of.</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 begins at 50. Meta-Harness is optimized offline on separate coaching duties. Scores as measured within 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" goal="_blank" rel="noopener">© Marktechpost</a></div>
<script>
(perform(){
var R=doc.getElementById(‘mtp-h2x’);
perform $(s){return R.querySelector(s)}perform $$(s){return R.querySelectorAll(s)}
perform sz(){strive{guardian.postMessage({mtpH2xHeight:R.offsetHeight+40},’*’)}catch(e){}}
$$(‘.tab’).forEach(perform(t){t.onclick=perform(){$$(‘.tab’).forEach(perform(x){x.classList.take away(‘on’)});$$(‘.pn’).forEach(perform(x){x.classList.take away(‘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."];
perform present(okay){nd.forEach(perform(n,j){n.classList.toggle(‘lit’,j<=okay)});$(‘#h2-note’).innerHTML=okay<0?"Press <b>Play</b> or <b>Step</b> to stroll by way of 1 Harness<sup>2</sup> enchancment step.":notes[k];$(‘#h2-prog’).model.width=((okay+1)/nd.size*100)+’%’;sz()}
perform step(){i=(i+1)%nd.size;present(i)}
$(‘#h2-step’).onclick=perform(){cease();step()};
$(‘#h2-reset’).onclick=perform(){cease();i=-1;present(-1)};
perform cease(){if(tm){clearInterval(tm);tm=null;$(‘#h2-play’).textContent=”
Play”}}
$(‘#h2-play’).onclick=perform(){if(tm){cease();return}if(i>=nd.length-1)i=-1;step();tm=setInterval(perform(){if(i>=nd.length-1){cease();return}step()},1900);this.textContent=”❚❚ Pause”};
/* elements */
var C=[["System prompt","Context construction","#4285F4","Persona and top-level procedure followed on every call."],
["Guardrails","Context construction","#4285F4","Process rules, e.g. verify outputs before finishing."],
["Memory","Context construction","#4285F4","Persistent context made available to the agent."],
["Tool guidance","Tool interface","#EA4335","How to use specific tools and handle formats precisely."],
["Subagents","Orchestration","#FBBC04","Delegated roles with their own instructions."],
["Skills","Context construction","#4285F4","Reusable domain procedures, e.g. a reconciliation skill."],
["Scripts","Tool interface","#EA4335","Executable helpers, e.g. a script that reopens and checks files."],
["Plugins","Middleware control","#34A853","Middleware that shapes behavior inside the tool loop."]];
var cg=$(‘#h2-cg’);C.forEach(perform(c,okay){var b=doc.createElement(‘button’);b.className=”cp”;b.model.setProperty(‘–c’,c[2]);b.innerHTML='<em>C’+(okay+1)+’ · ‘+c[1]+'</em><b>’+c[0]+'</b>’;b.onclick=perform(){$$(‘.cp’).forEach(perform(x){x.classList.take away(‘on’)});b.classList.add(‘on’);var n=$(‘#h2-cnote’);n.model.borderLeftColor=c[2];n.innerHTML='<b>’+c[0]+'</b> (‘+c[1].toLowerCase()+’): ‘+c[3]+’ Every element is a file the editor can rewrite.’;sz()};cg.appendChild(b)});
/* benchmarks */
var D={"Gemini 3.5 Flash · OpenCode":[[72.4,77.5],[31.5,36.0],[79.9,81.9]],"Gemini 3.5 Flash · Codex":[[74.5,77.5],[33.9,35.3],[71.6,75.6]],"GLM-5 · OpenCode":[[64.2,75.7],[20.6,24.2],[59.6,71.4]],"GLM-5 · Codex":[[64.4,75.3],[23.6,24.8],[58.1,65.9]]};
var BN=["WorkBuddy-Bench (avg)","JobBench","LAB Partial (%)"],cur="GLM-5 · OpenCode";
var sel=$(‘#h2-sel’);Object.keys(D).forEach(perform(okay){var b=doc.createElement(‘button’);b.className=”chip”+(okay===cur?’ on’:”);b.textContent=okay;b.onclick=perform(){cur=okay;$$(‘#h2-sel .chip’).forEach(perform(x){x.classList.take away(‘on’)});b.classList.add(‘on’);drawB()};sel.appendChild(b)});
perform drawB(){var bm=$(‘#h2-bm’);bm.innerHTML=”;D[cur].forEach(perform(v,okay){var d=(v[1]-v[0]).toFixed(1);var x=doc.createElement(‘div’);x.className=”bx”;x.innerHTML='<h4>’+BN[k]+'</h4><div class="row"><span>Base</span><div class="tr"><i model="background:#5f6368" data-w="’+v[0]+’"></i></div><b>’+v[0].toFixed(1)+'</b></div><div class="row"><span>Harness²</span><div class="tr"><i model="background:linear-gradient(90deg,#4285F4,#34A853)" data-w="’+v[1]+’"></i></div><b>’+v[1].toFixed(1)+'</b></div><div class="dl">+’+d+(okay===2?’ pp’:’ pts’)+'</div>’;bm.appendChild(x)});
requestAnimationFrame(perform(){setTimeout(perform(){$$(‘#h2-bm .tr i’).forEach(perform(e){e.model.width=e.dataset.w+’%’})},30)});sz()}
/* baselines */
var RK={"WorkBuddy avg · OpenCode":[["Base harness",72.4],["ReasoningBank",73.4],["Harness Scaling",75.3],["Meta-Harness",76.4],["Harness² k=1",77.5],["Harness² k=5",80.8]],
"JobBench · OpenCode":[["Base harness",31.5],["ReasoningBank",30.8],["Harness Scaling",32.9],["Meta-Harness",35.8],["Harness² k=1",36.0]],
"LAB Partial · Codex":[["Base harness",71.6],["ReasoningBank",74.8],["Harness Scaling",67.9],["Meta-Harness",76.5],["Harness² k=1",75.6]]};
var rc="WorkBuddy avg · OpenCode",s2=$(‘#h2-sel2’);
Object.keys(RK).forEach(perform(okay){var b=doc.createElement(‘button’);b.className=”chip”+(okay===rc?’ on’:”);b.textContent=okay;b.onclick=perform(){rc=okay;$$(‘#h2-sel2 .chip’).forEach(perform(x){x.classList.take away(‘on’)});b.classList.add(‘on’);drawR()};s2.appendChild(b)});
perform drawR(){var rk=$(‘#h2-rk’);rk.innerHTML=”;var mx=Math.max.apply(null,RK[rc].map(perform(r){return r[1]}));
RK[rc].forEach(perform(r){var h=r[0].indexOf(‘Harness²’)===0;var c=h?’linear-gradient(90deg,#4285F4,#34A853)’:(r[1]===mx?’#FBBC04′:’#5f6368′);var x=doc.createElement(‘div’);x.className=”row”;x.innerHTML='<span’+(h?’ model="colour:#e8eaed;font-weight:700"’:”)+’>’+r[0]+'</span><div class="tr"><i model="background:’+c+’" data-w="’+((r[1]-50)/40*100)+’"></i></div><b>’+r[1].toFixed(1)+'</b>’;rk.appendChild(x)});
requestAnimationFrame(perform(){setTimeout(perform(){$$(‘#h2-rk .tr i’).forEach(perform(e){e.model.width=e.dataset.w+’%’})},30)});sz()}
present(-1);window.addEventListener(‘load’,sz);window.addEventListener(‘resize’,sz);setTimeout(sz,300);
})();
</script>
</div>
</physique></html>”>
(perform(){var f=doc.getElementById(‘mtp-h2x-frame’);window.addEventListener(‘message’,perform(e){if(e.supply===f.contentWindow&&e.knowledge&&e.knowledge.mtpH2xHeight){f.model.peak=e.knowledge.mtpH2xHeight+’px’;}});})();
How does Harness² carry out on benchmarks?
The analysis staff examined 3 skilled benchmarks: WorkBuddy-Bench, JobBench and Harvey’s LAB. Executors had been Gemini 3.5 Flash and GLM-5 beneath OpenCode and Codex. The default editor was Claude Opus 4.8. Outcomes are means over 3 runs.
| Setup (single step, okay=1) | WorkBuddy Avg | JobBench | LAB Partial |
|---|---|---|---|
| Gemini 3.5 Flash, OpenCode | 72.4 → 77.5 | 31.5 → 36.0 | 79.9 → 81.9 |
| Gemini 3.5 Flash, Codex | 74.5 → 77.5 | 33.9 → 35.3 | 71.6 → 75.6 |
| GLM-5, OpenCode | 64.2 → 75.7 | 20.6 → 24.2 | 59.6 → 71.4 |
| GLM-5, Codex | 64.4 → 75.3 | 23.6 → 24.8 | 58.1 → 65.9 |
Supply: Harness² paper, Tables 1 and a pair of.
Weaker executors gained extra. After 1 step, GLM-5 beat base Gemini 3.5 Flash on WorkBuddy-Bench. Parallel recursion at okay=5 lifted Gemini beneath OpenCode to 80.8 on WorkBuddy. On WorkBuddy-Bench, 3 of 4 setups additionally used fewer steps per process. Gemini beneath OpenCode fell from 25.4 to 21.9.
How does it evaluate with different harness strategies?
| Characteristic | Harness² | Meta-Harness | ReasoningBank | Harness Scaling |
|---|---|---|---|---|
| Builders | Google Cloud AI Analysis, Northwestern | Stanford IRIS Lab and co-authors | Google Analysis and co-authors | Wang et al. |
| What adjustments | Full 8-component harness, per process | Harness code, searched offline | Retrieved reminiscence; harness fastened | Harness, revised per occasion |
| Wants coaching break up | No | Sure | No | No |
| Learns throughout duties | Sure (library + classes) | Deploys 1 greatest harness | Sure (reminiscence) | No |
| Code license | Apache-2.0 | MIT | Not disclosed | Not disclosed |
| WorkBuddy Avg, Gemini/OpenCode* | 77.5 (80.8 at okay=5) | 76.4 | 73.4 | 75.3 |
| JobBench, Gemini/OpenCode* | 36.0 | 35.8 | 30.8 | 32.9 |
| LAB Partial, Gemini/Codex* | 75.6 | 76.5 | 74.8 | 67.9 |
*Scores as measured within the Harness² paper; the opposite strategies didn’t report these benchmarks themselves.
How do you put in and run Harness²?
The README targets Linux, Python 3.12 and uv. An area demo runs each recursion modes with out mannequin credentials:
uv venv --python 3.12 .venv
supply .venv/bin/activate
uv pip set up -e '.[render]'
harness2-demo --output runs/demo --k 2
Mannequin-backed runs want Node.js 20+, the Google Cloud CLI and a Vertex AI mission. LAB wants Pandoc and Poppler. WorkBuddy-Bench wants Docker. Executors are OpenCode by default, or Codex with --substrate cx.
Key Takeaways
- Harness² rewrites an agent’s harness at check time; weights keep frozen.
- 1 step lifted GLM-5 by 11.5 factors on WorkBuddy-Bench.
- Suggest, Probe, Compose replaces ground-truth labels with behavioral contrasts.
- A classes library carries enhancements to future duties.
- Count on additional runs per process, and sandbox it your self.
Take a look at the Paper, GitHub Repo, Paper and Mission Web page. All credit score goes to the researcher of this mission. Additionally, be happy to observe us on Twitter and don’t overlook to hitch our 150k+ML SubReddit and Subscribe to our Publication. Wait! are you on telegram? now you’ll be able to be part of us on telegram as nicely.
The publish Google Open-Sources Harness2, a Recursive Agent Harnessing Framework appeared first on MarkTechPost.









