Google Cloud AI Research has open-sourced Harness². It’s a recursive agent harnessing framework that improves the code and recordsdata round a frozen mannequin. For builders, the pitch is easy. Your agent could get higher with out a higher mannequin.
TL;DR
- Dimension: A framework, not a mannequin. 0 parameters educated; 8 editable harness elements. Model 0.1.0.
- Runs on: Linux with Python 3.12 or 3.13 and uv. Mannequin runs name fashions via Vertex AI. GPU requirement: Not disclosed.
- Efficiency: 1 refinement step improved all 4 mannequin and harness setups on all 3 benchmarks.
- Greatest: GLM-5 below OpenCode rose from 64.2 to 75.7 on WorkBuddy-Bench (+11.5 factors).
- Worst: GLM-5 below 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 thing across the mannequin: prompts, tools, memory, skills 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 correct. The research team argues that the majority self-improvement strategies assume labels or take a look at circumstances. Harness² is constructed to work with out them.
What are the 8 harness elements?
Harness² exposes 8 editable components, every mounted as a file:
- System immediate
- Guardrails
- Reminiscence
- Instrument steerage
- Subagents
- Abilities
- Scripts
- Plugins (middleware)
They cowl context building, the device interface, delegation and habits contained in the device 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 basic agent failures equivalent to planning or device use. The area candidate targets data and procedures for the present area. Each candidates run on the identical activity. The composer compares their trajectories towards the reference and retains solely edits backed by noticed habits.
- Harnessing-level recursion occurs after every activity. A reflector shops the adopted harness plus an
EXPERIENCE.mdfile of classes. This library guides future proposals. Every new activity nonetheless begins from the bottom harness.
The price range ok scales the search. Parallel mode probes ok invariant and ok area candidates, then makes ok compositions. Sequential mode chains ok refinement steps.
<type>
#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;coloration: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;top: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%{remodel:scale(1);opacity:1}50%{remodel:scale(.6);opacity:.5}}
#mtp-h2x h3{margin:0!essential;font-size:21px;font-weight:700;coloration:var(–tx)!essential;letter-spacing:-.01em}
#mtp-h2x h3 sup{coloration:var(–b)}
#mtp-h2x .sub{coloration: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;coloration: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{coloration: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;remodel:translateY(6px)}to{opacity:1;remodel: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;coloration:var(–tx)!essential}
#mtp-h2x .nd small{show:block;coloration: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;coloration:#0f1115!essential}
#mtp-h2x .nd.lit{opacity:1;remodel: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;coloration: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;coloration: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;coloration:#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;coloration:var(–tx)!essential;min-height:64px}
#mtp-h2x .prog{flex:1;min-width:120px;top:4px;background:var(–line);border-radius:4px;overflow:hidden}
#mtp-h2x .prog i{show:block;top: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;coloration:var(–tx)!essential;font-family:inherit}
#mtp-h2x .cp:hover,#mtp-h2x .cp.on{border-color:var(–c)!essential;remodel:translateY(-2px)}
#mtp-h2x .cp em{font-style:regular;font-size:11px;font-weight:700;coloration: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;coloration:var(–mut)!essential;margin:10px 0 0}
#mtp-h2x .lg span:earlier than{content material:"";show:inline-block;width:9px;top: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;coloration:var(–mut)!essential;border-radius:99px;padding:6px 11px;font:600 12.5px inherit;font-family:inherit;cursor:pointer}
#mtp-h2x .chip.on{coloration:#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;coloration: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;coloration:var(–mut)!essential}
#mtp-h2x .tr{top:12px;background:#222733;border-radius:6px;overflow:hidden}
#mtp-h2x .tr i{show:block;top:100%;width:0;border-radius:6px;transition:width .9s cubic-bezier(.2,.8,.2,1)}
#mtp-h2x .row b{coloration:var(–tx)!essential;text-align:proper;font-size:12.5px}
#mtp-h2x .dl{font-size:12px;font-weight:700;coloration:var(–g)!essential;margin-top:4px}
#mtp-h2x .rk .row{grid-template-columns:120px 1fr 46px}
#mtp-h2x .fn{font-size:11.5px;coloration: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;coloration:var(–mut)!essential}
#mtp-h2x .ft a{coloration:var(–mtp)!essential;text-decoration:none;font-weight:700}
#mtp-h2x code{background:#222733!essential;coloration: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:cut back){#mtp-h2x *{animation:none!essential;transition:none!essential}}
</type>
<div class="hd"><div class="dots"><i type="background:#4285F4"></i><i type="background:#EA4335"></i><i type="background:#FBBC04"></i><i type="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 activity)</div>
<div class="movement">
<div class="nd" type="–c:#9aa0a6"><span class="tg" type="background:#9aa0a6">REFERENCE</span><b>Run base harness</b><small>H0 executes the duty as soon as</small></div>
<div class="nd" type="–c:#4285F4"><span class="tg" type="background:#4285F4">PROPOSE</span><b>2 candidates</b><small>Invariant + domain-specific edits</small></div>
<div class="nd" type="–c:#EA4335"><span class="tg" type="background:#EA4335">PROBE</span><b>Run each</b><small>Identical activity, similar mannequin, evaluate habits</small></div>
<div class="nd" type="–c:#FBBC04"><span class="tg" type="background:#FBBC04">COMPOSE</span><b>Merge what labored</b><small>Maintain edits backed by proof</small></div>
</div>
<div class="lvl">02 Ā· Harnessing-level recursion (throughout duties)</div>
<div class="movement">
<div class="nd" type="–c:#4285F4"><span class="tg" type="background:#4285F4">EXECUTE</span><b>Ultimate harness</b><small>Deliverable returned</small></div>
<div class="nd" type="–c:#34A853"><span class="tg" type="background:#34A853">REFLECT</span><b>Evaluation the file</b><small>Which edits helped, and why</small></div>
<div class="nd" type="–c:#34A853"><span class="tg" type="background:#34A853">UPDATE</span><b>Enchancment library</b><small>Harness + EXPERIENCE.md</small></div>
<div class="nd" type="–c:#9aa0a6"><span class="tg" type="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 via 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 ok=1: 1 reference + 2 probes + 1 last run per activity. Parallel mode probes ok invariant and ok area candidates; sequential mode chains ok steps.</div>
</div>
<div class="pn" id="h2-p2">
<div class="cg" id="h2-cg"></div>
<div class="be aware" id="h2-cnote" type="border-left-color:#4285F4">Click on a element to see its runtime function.</div>
<div class="lg"><span type="–c:#4285F4">Context building</span><span type="–c:#EA4335">Instrument interface</span><span type="–c:#FBBC04">Orchestration</span><span type="–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 (ok=1). Means over 3 runs. LAB = Partial cross charge (%). 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(){attempt{dad or mum.postMessage({mtpH2xHeight:R.offsetHeight+40},’*’)}catch(e){}}
$$(‘.tab’).forEach(perform
/* 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(ok){nd.forEach(perform(n,j){n.classList.toggle(‘lit’,j<=ok)});$(‘#h2-note’).innerHTML=ok<0?"Press <b>Play</b> or <b>Step</b> to stroll via 1 Harness<sup>2</sup> enchancment step.":notes[k];$(‘#h2-prog’).type.width=((ok+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,ok){var b=doc.createElement(‘button’);b.className=”cp”;b.type.setProperty(‘–c’,c[2]);b.innerHTML='<em>C’+(ok+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.type.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(ok){var b=doc.createElement(‘button’);b.className=”chip”+(ok===cur?’ on’:”);b.textContent=ok;b.onclick=perform(){cur=ok;$$(‘#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,ok){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 type="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 type="background:linear-gradient(90deg,#4285F4,#34A853)" data-w="’+v[1]+’"></i></div><b>’+v[1].toFixed(1)+'</b></div><div class="dl">+’+d+(ok===2?’ pp’:’ pts’)+'</div>’;bm.appendChild(x)});
requestAnimationFrame(perform(){setTimeout(perform(){$$(‘#h2-bm .tr i’).forEach(perform(e){e.type.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(ok){var b=doc.createElement(‘button’);b.className=”chip”+(ok===rc?’ on’:”);b.textContent=ok;b.onclick=perform(){rc=ok;$$(‘#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?’ type="coloration:#e8eaed;font-weight:700"’:”)+’>’+r[0]+'</span><div class="tr"><i type="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.type.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.information&&e.information.mtpH2xHeight){f.type.top=e.information.mtpH2xHeight+’px’;}});})();
How does Harness² carry out on benchmarks?
The analysis workforce examined 3 skilled benchmarks: WorkBuddy-Bench, JobBench and Harvey’s LAB. Executors have been Gemini 3.5 Flash and GLM-5 below OpenCode and Codex. The default editor was Claude Opus 4.8. Outcomes are means over 3 runs.
| Setup (single step, ok=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 2.
Weaker executors gained extra. After 1 step, GLM-5 beat base Gemini 3.5 Flash on WorkBuddy-Bench. Parallel recursion at ok=5 lifted Gemini below OpenCode to 80.8 on WorkBuddy. On WorkBuddy-Bench, 3 of 4 setups additionally used fewer steps per activity. Gemini below 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 activity | 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 finest harness | Sure (reminiscence) | No |
| Code license | Apache-2.0 | MIT | Not disclosed | Not disclosed |
| WorkBuddy Avg, Gemini/OpenCode* | 77.5 (80.8 at ok=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. A neighborhood 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 challenge. 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 take a look at 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 activity, and sandbox it your self.
Take a look at the Paper, GitHub Repo, Paper and Project Page. All credit score goes to the researcher of this challenge. Additionally,Ā be happy to comply with us onĀ TwitterĀ and donāt overlook to affix ourĀ 150k+ML SubRedditĀ and Subscribe toĀ our Newsletter. Wait! are you on telegram?Ā now you can join us on telegram as well.
The put up Google Open-Sources Harness2, a Recursive Agent Harnessing Framework appeared first on MarkTechPost.

