Coding agents now run for hours, not minutes. Every edit, test run and log read goes back into the model’s context. A team of researchers from NVIDIA, NTU and MIT have released SoL-Pi, a set of 4 efficiency mechanisms for the open-source Pi coding agent. An AI found these mechanisms by running auto-research loops at the harness layer. On the 51-task EdgeBench evaluation, SoL-Pi cuts recorded token traffic by 44.7% to 49.0% versus Pi and cuts API cost by roughly 33%. Its scores stay close to Pi on both GPT-5.6 Sol and Opus 5.
Is it deployable? Yes. SoL-Pi ships on GitHub under NVlabs as an MIT-licensed extension that runs on an unmodified Pi release. It is tested with Pi 0.85.1 and Node.js 22.19 or newer.
Why Target the Harness
Most efficiency work lowers the cost per token through faster kernels, quantization or cheaper models. SoL-Pi instead reduces how many tokens a task consumes. The harness is the layer that handles tool calls, context, observations and delegation.
Tuning a harness by hand is slow, and its parts are coupled: a fix in one place can push cost into later steps. Meta-Harness and similar systems automate this work. However, a recent study found that evolved harnesses can overfit their search tasks and give only marginal gains on unseen ones.
How the Search Works
A research AI observes execution traces from a separate agent running base Pi. It then proposes harness changes and tests them. The search covered:
- 152 proposed directions across 6 families: context, progress, tools, delegation, prompt and policy, and improvement and evaluation
- 535 executable environments: 495 built from GitHub issue-pull request pairs and 40 synthetic tasks with executable verifiers
- More than 3,000 runs and 60,000+ agent-environment interactions
Each search is a disposable, isolated loop. It follows the autoresearch cycle, extended with a Ralph Loop implementation step and an independent reviewer.
Acceptance rules are fixed before the search starts, and the optimizer cannot change them. Every capability metric must stay within a predeclared tolerance. The candidate must also improve at least 1 efficiency metric. EdgeBench stays held out. Of its 51 public tasks, 11 are used for one-way acceptance of frozen candidates and 40 for final evaluation. Held-out results never feed back into the search.
The 4 Mechanisms That Survived
- Action Fusion: Base Pi often edits a file and then issues a separate command to test, build or run it. Action Fusion merges both into 1 tool request and returns both outcomes in 1 observation. This removes a model round trip.
- Online Context Compact: Plan steps are tracked through
update_plan. When a step completes, the harness estimates how many requests remain. It then compares the projected input savings with the extra cost of rewriting the prompt cache. It invokes Pi’s native compaction when this gate passes or when context nears the window limit. - ObservationPack: Tool outputs above 10 KiB are archived locally and sent in full for the next 2 provider requests. From the 3rd request onward, the model sees a stable handle, the original size and a short excerpt of head and tail lines. Exact pages stay retrievable through the handle.
- Evidence-Preserving Reducer: Build and test logs of at least 4 KiB go to a cheaper model, GPT-5.6 Luna at
high, which writes a compact receipt. A deterministic verifier checks the receipt’s schema, source hash, exit status, exact quotes and size. The harness falls back to the original log in 3 cases: verification fails, credentials are suspected, or the receipt is not smaller.
‘ #wi<=2,ht=full?Math.min(100,12+k*1.5):8,cls=big?(full?’full’:’hand’):”,t=!big?’Small result, sent unchanged’:(full?’Full result (‘+k+’ KiB)’:’Handle + size + head/tail excerpt’);h+=’
Provider request ‘+i+’
‘+t+’
‘ .topvar full=!big .top h1{font-size:22px;font-weight:800;letter-spacing:-.3px;color:#fff} .top h1 b{color:#76B900} .top p{font-size:13px;color:#9a9a9a;margin-top:4px} .cnt{font-size:13px;color:#76B900;font-weight:700;white-space:nowrap} .tabs{display:flex;gap:6px;flex-wrap:wrap;margin-bottom:14px} .tabs button{background:#1b1b1b;color:#bdbdbd;border:1px solid #333;border-radius:4px;padding:7px 11px;font-size:12.5px;cursor:pointer;font-family:inherit} .tabs button.on{background:#76B900;color:#111;border-color:#76B900;font-weight:700} .tabs button:focus-visible,.btn:focus-visible,input:focus-visible{outline:2px solid #fff;outline-offset:2px} .slide{display:none}.slide.on{display:block;animation:fi .35s ease} @keyframes fi{from{opacity:0;transform:translateY(6px)}to{opacity:1;transform:none}} h2{font-size:18px;color:#fff;margin-bottom:6px} .lead{font-size:14px;line-height:1.55;color:#c9c9c9;margin-bottom:14px;max-width:70ch} .stage{background:#161616;border:1px solid #2a2a2a;border-radius:8px;padding:16px;margin-bottom:12px} .ctrl{display:flex;gap:10px;align-items:center;flex-wrap:wrap;margin-bottom:12px} .btn{background:#76B900;color:#111;border:0;border-radius:4px;padding:8px 14px;font-weight:700;font-size:13px;cursor:pointer;font-family:inherit} .btn.g{background:transparent;color:#76B900;border:1px solid #76B900} .btn.on{background:#76B900;color:#111} .note{font-size:12px;color:#8a8a8a;line-height:1.5} .lbl{font-size:12.5px;color:#9a9a9a} /* funnel */ .fr{display:flex;align-items:center;gap:12px;margin:7px 0} .fb{flex-shrink:0;height:30px;background:#1f2a0e;border:1px solid #76B900;border-radius:3px;display:flex;align-items:center;padding:0 10px;font-weight:800;color:#fff;font-size:15px;width:0;transition:width .9s cubic-bezier(.2,.8,.2,1);overflow:hidden;white-space:nowrap} .fr.last .fb{background:#76B900;color:#111} .ft{font-size:13px;color:#bdbdbd;flex:1} .wall{display:grid;grid-template-columns:1fr auto 1fr;gap:10px;align-items:stretch;margin-top:12px} .box{border:1px solid #333;border-radius:6px;padding:10px;font-size:12.5px;line-height:1.5;color:#c9c9c9} .box b{color:#fff} .bar{width:3px;background:repeating-linear-gradient(#76B900 0 6px,transparent 6px 11px)} /* lanes */ .lane{margin-bottom:14px} .lane .ln{font-size:13px;font-weight:700;color:#fff;margin-bottom:8px} .calls{display:flex;gap:8px;align-items:stretch;position:relative} .call{flex:1;border:1px solid #3a3a3a;border-radius:6px;padding:10px 8px;font-size:12px;color:#aaa;text-align:center;transition:all .35s;background:#141414;min-height:62px;display:flex;flex-direction:column;justify-content:center} .call small{display:block;color:#666;font-size:11px;margin-bottom:3px} .call.hot{border-color:#76B900;color:#fff;background:#1f2a0e;box-shadow:0 0 0 3px rgba(118,185,0,.18)} .call.red{border-color:#e0533d;color:#fff;background:#2a1411} .tally{font-size:13px;color:#9a9a9a;margin-top:6px}.tally b{color:#76B900;font-size:16px} .stats{display:grid;grid-template-columns:repeat(3,1fr);gap:8px} .st{border:1px solid #2a2a2a;border-radius:6px;padding:10px;background:#141414} .st .v{font-size:20px;font-weight:800;color:#76B900}.st .k{font-size:11.5px;color:#999;margin-top:3px;line-height:1.35} /* observation */ .reqs{display:grid;grid-template-columns:repeat(4,1fr);gap:8px} .rq{border:1px solid #333;border-radius:6px;padding:8px;background:#141414;min-height:140px;display:flex;flex-direction:column} .rq .h{font-size:11.5px;color:#888;margin-bottom:6px} .pl{flex:1;display:flex;align-items:flex-end} .pb{width:100%;background:#3a3a3a;border-radius:3px;transition:height .6s,background .4s;height:10%} .pb.full{background:#e0533d}.pb.hand{background:#76B900} .rq .t{font-size:11.5px;margin-top:6px;color:#ccc;min-height:30px;line-height:1.3} input[type=range]{accent-color:#76B900;width:220px} .rec{margin-top:10px;font-size:12.5px;color:#76B900;min-height:18px} /* context */ .cbars{display:grid;grid-template-columns:repeat(4,1fr);gap:10px;align-items:end;height:150px} .cb{display:flex;flex-direction:column;align-items:center;justify-content:flex-end;height:100%} .cbi{width:70%;background:#3a3a3a;border-radius:3px 3px 0 0;height:0;transition:height .7s,background .4s} .cbi.g{background:#76B900} .cb span{font-size:12px;color:#ccc;margin-top:5px} .gate{display:flex;gap:10px;align-items:center;flex-wrap:wrap;margin-top:12px;padding:10px;border:1px dashed #444;border-radius:6px;font-size:13px} .pill{padding:3px 9px;border-radius:12px;font-weight:700;font-size:12px} .pill.p{background:#76B900;color:#111}.pill.f{background:#e0533d;color:#fff} /* reducer */ .pipe{display:flex;gap:8px;align-items:stretch;flex-wrap:wrap} .pipe .call{min-width:110px} .checks{display:grid;grid-template-columns:repeat(5,1fr);gap:6px;margin-top:12px} .ck{border:1px solid #333;border-radius:5px;padding:8px 4px;text-align:center;font-size:11.5px;color:#999;transition:all .3s} .ck.ok{border-color:#76B900;color:#fff;background:#1f2a0e} .ck.bad{border-color:#e0533d;color:#fff;background:#2a1411} .out{margin-top:10px;font-size:13px;min-height:20px} /* results */ .rs{margin:6px 0} .rrow{display:grid;grid-template-columns:150px 1fr 70px;gap:10px;align-items:center;margin:6px 0;font-size:12.5px} .rrow .n{color:#ccc} .track{background:#1d1d1d;height:18px;border-radius:3px;overflow:hidden} .fill{height:100%;background:#555;width:0;transition:width .8s cubic-bezier(.2,.8,.2,1)} .fill.g{background:#76B900} .rrow .val{color:#fff;font-weight:700;text-align:right} .mt{font-size:13px;font-weight:700;color:#fff;margin:14px 0 4px} .nav{display:flex;justify-content:space-between;align-items:center;margin-top:14px} .dots{display:flex;gap:6px}.dots i{width:8px;height:8px;border-radius:50%;background:#333;display:block}.dots i.on{background:#76B900} .foot{margin-top:14px;padding-top:10px;border-top:1px solid #2a2a2a;display:flex;justify-content:space-between;gap:10px;flex-wrap:wrap;font-size:12px;color:#8a8a8a} .foot a{color:#76B900;text-decoration:none}.foot b{color:#76B900} code{background:#1d1d1d;color:#76B900;padding:2px 6px;border-radius:3px;font-size:12px} @media (max-width:640px){ .top{flex-direction:column;align-items:flex-start} .top h1{font-size:19px} .stats{grid-template-columns:1fr} .reqs{grid-template-columns:repeat(2,1fr)} .checks{grid-template-columns:repeat(2,1fr)} .calls{flex-direction:column} .wall{grid-template-columns:1fr}.bar{width:100%;height:3px;background:repeating-linear-gradient(90deg,#76B900 0 6px,transparent 6px 11px)} .rrow{grid-template-columns:100px 1fr 58px} input[type=range]{width:100%} } @media (prefers-reduced-motion:reduce){*{transition:none!important;animation:none!important}} </style></head><body> <div id="w"> <div class="top"><div><h1><b>SoL-Pi</b> explained</h1><p>How NVIDIA’s auto-research loop found 4 harness mechanisms that cut token traffic</p></div><div class="cnt" id="cnt">1 / 6</div></div> <div class="tabs" id="tabs" role="tablist"></div> <section class="slide on" data-t="The search"> <h2>A broad-to-deep funnel</h2> <p class="lead">A research AI reads execution traces from Pi, proposes harness changes and tests them in isolated loops. Only candidates that hold capability within tolerance and improve at least 1 efficiency metric survive.</p> <div class="stage"> <div class="ctrl"><button class="btn" id="fPlay">Run the funnel</button><span class="lbl">Numbers from the paper</span></div> <div class="fr"><div class="fb" data-w="100">60,000+</div><div class="ft">agent-environment interactions</div></div> <div class="fr"><div class="fb" data-w="82">3,000+</div><div class="ft">runs</div></div> <div class="fr"><div class="fb" data-w="64">535</div><div class="ft">executable environments (495 GitHub issue-PR, 40 verifier-driven)</div></div> <div class="fr"><div class="fb" data-w="46">152</div><div class="ft">proposed directions across 6 families</div></div> <div class="fr"><div class="fb" data-w="30">2 gates</div><div class="ft">capability within tolerance, then efficiency gain</div></div> <div class="fr last"><div class="fb" data-w="18">4</div><div class="ft">mechanisms retained and frozen</div></div> <div class="wall"><div class="box"><b>Search side</b><br>Trajectory rollouts, map-reduce analysis, proposal, implementation, independent review, development validation.</div><div class="bar"></div><div class="box"><b>Held-out EdgeBench (51 public tasks)</b><br>11 tasks for one-way acceptance, 40 for final evaluation. No results feed back into search.</div></div> </div> </section> <section class="slide" data-t="Action Fusion"> <h2>Action Fusion: edit and run in 1 request</h2> <p class="lead">Base Pi often edits a file, then spends another model round trip issuing a test, build or run command. Action Fusion attaches the follow-up command to the edit and returns both outcomes in 1 observation.</p> <div class="stage"> <div class="ctrl"><button class="btn" id="aPlay">Play both lanes</button></div> <div class="lane"><div class="ln">Baseline Pi</div><div class="calls" id="aBase"><div class="call"><small>API call 1</small>Edit / write</div><div class="call"><small>API call 2</small>Read result, choose run</div><div class="call"><small>API call 3</small>Receive output</div></div><div class="tally">API calls: <b id="aBn">0</b></div></div> <div class="lane"><div class="ln">With Action Fusion</div><div class="calls" id="aFus"><div class="call"><small>API call 1</small>Edit + then_run</div><div class="call"><small>API call 2</small>File changed + command output</div></div><div class="tally">API calls: <b id="aFn">0</b></div></div> </div> <div class="stats"><div class="st"><div class="v">78.4%</div><div class="k">of EdgeBench tasks trigger it (GPT-5.6 Sol)</div></div><div class="st"><div class="v">70.58</div><div class="k">avg triggers per triggered task (GPT-5.6 Sol)</div></div><div class="st"><div class="v">24.7%</div><div class="k">token efficiency gain on triggered tasks (GPT-5.6 Sol)</div></div></div> </section> <section class="slide" data-t="ObservationPack"> <h2>ObservationPack: stop replaying big outputs</h2> <p class="lead">Tool results over 10 KiB are archived locally and sent in full for the next 2 provider requests. From the 3rd request on, the model sees a stable handle, the original size and a short head and tail excerpt. Exact pages stay retrievable.</p> <div class="stage"> <div class="ctrl"><label class="lbl" for="oS">Tool output size: <b id="oV" style="color:#fff">24</b> KiB</label><input type="range" id="oS" min="1" max="60" value="24"><button class="btn g" id="oRec">Recall exact page</button></div> <div class="reqs" id="oR"></div> <div class="rec" id="oMsg"></div> <p class="note">Bar heights are illustrative. The 10 KiB threshold and 2-request window come from the paper.</p> </div> </section> <section class="slide" data-t="Online Context Compact"> <h2>Online Context Compact: compact when it pays</h2> <p class="lead">At each completed plan step (tracked through <code>update_plan</code>), the harness estimates the remaining requests and weighs projected input savings against the extra cost of rewriting the prompt cache. It triggers Pi’s native compaction if the gate passes or the context nears the window limit.</p> <div class="stage"> <div class="ctrl"><button class="btn" id="cPlay">Replay 4 calls</button><label class="lbl" for="cS">Estimated remaining requests: <b id="cV" style="color:#fff">6</b></label><input type="range" id="cS" min="0" max="12" value="6"></div> <div class="cbars" id="cB"></div> <div class="gate"><span>Cost gate at subtask completion:</span><span class="pill" id="cG"></span><span class="lbl" id="cT"></span></div> <p class="note" style="margin-top:8px">Context multiples follow the paper’s Figure 4 schematic. The gate math here is a simplified illustration, not SoL-Pi’s exact formula.</p> </div> </section> <section class="slide" data-t="Evidence Reducer"> <h2>Evidence-Preserving Reducer: cheap reading, verified</h2> <p class="lead">Build and test logs of at least 4 KiB from a predefined command set are archived, then a lower-cost model (GPT-5.6 Luna at high) writes a compact receipt. A deterministic verifier checks it. File reads and search results bypass the reducer.</p> <div class="stage"> <div class="ctrl"><button class="btn" id="rPlay">Reduce a log</button><button class="btn g" id="rBad" aria-pressed="false">Inject a misquoted line</button></div> <div class="pipe"><div class="call" id="r1"><small>Input</small>Build / test log ≥ 4 KiB</div><div class="call" id="r2"><small>Local</small>Archive exact original</div><div class="call" id="r3"><small>Low-cost call</small>Luna extracts receipt</div><div class="call" id="r4"><small>Frontier call</small>Main agent decides</div></div> <div class="checks" id="rC"><div class="ck">Schema</div><div class="ck">Source hash</div><div class="ck">Exit status</div><div class="ck">Exact quotes</div><div class="ck">Smaller size</div></div> <div class="out" id="rO"></div> </div> </section> <section class="slide" data-t="Results"> <h2>EdgeBench results</h2> <p class="lead">SoL-Pi [Efficiency] is the full 4-mechanism stack. SoL-Pi [Performance] is the best single mechanism per backend. The stack was built on GPT-5.6 Sol and applied to Opus 5 without further search.</p> <div class="ctrl"><button class="btn on" id="bS">GPT-5.6 Sol</button><button class="btn g" id="bO">Opus 5</button></div> <div class="stage"> <div class="mt">Average score (higher is better)</div><div id="gS"></div> <div class="mt">API cost in USD (lower is better)</div><div id="gC"></div> <div class="mt">Recorded token traffic in billions (lower is better)</div><div id="gT"></div> </div> <div class="stats"><div class="st"><div class="v">-26.3%</div><div class="k">total cost vs Pi on Terminal-Bench 4 (15 vs 18 solved)</div></div><div class="st"><div class="v">$20.90</div><div class="k">per passed IMO 2026 problem, lowest of 3 harnesses</div></div><div class="st"><div class="v">-26.8%</div><div class="k">swarm API cost vs 20 Pi workers, 1,127 vs 1,366 cycles</div></div></div> </section> <div class="nav"><button class="btn g" id="prev">Previous</button><div class="dots" id="dots"></div><button class="btn" id="next">Next</button></div> <div class="foot"><span>Install: <code>pi install git:github.com/NVlabs/SoL-Pi</code> (MIT, opt-in)</span><span>Source: <a href="https://arxiv.org/abs/2609.20519" target="_blank" rel="noopener">arXiv 2609.20519</a> · <b>Built by Marktechpost</b></span></div> </div> <script> (function(){ var S=[].slice.call(document.querySelectorAll(‘.slide’)),cur=0,T=document.getElementById(‘tabs’),D=document.getElementById(‘dots’); function post(){try{parent.postMessage({type:’mtp-solpi-h’,h:document.getElementById(‘w’).offsetHeight+40},’*’)}catch(e){}} S.forEach(function(s,i){var b=document.createElement(‘button’);b.textContent=s.dataset.t;b.setAttribute(‘role’,’tab’);b.onclick=function(){go(i)};T.appendChild(b);D.appendChild(document.createElement(‘i’))}); function go(i){cur=(i+S.length)%S.length;S.forEach(function(s,j){s.classList.toggle(‘on’,j===cur);T.children[j].classList.toggle(‘on’,j===cur);D.children[j].classList.toggle(‘on’,j===cur)});document.getElementById(‘cnt’).textContent=(cur+1)+’ / ‘+S.length;if(cur===0)funnel();if(cur===3)ctx(true);if(cur===5)res();setTimeout(post,60);setTimeout(post,900)} document.getElementById(‘prev’).onclick=function(){go(cur-1)};document.getElementById(‘next’).onclick=function(){go(cur+1)}; var timers=[];function later(f,t){timers.push(setTimeout(f,t))} /* funnel */ function funnel(){var f=document.querySelectorAll(‘.fb’);f.forEach(function(b){b.style.width=” document.getelementbyid=”” action=”” fusion=”” b=”document.querySelectorAll(‘#aBase” .call=”” red=”” hot=”” saved=”” observationpack=”” var=”” os=”document.getElementById(‘oS’),oR=document.getElementById(‘oR’);” function=”” obs=”” k=”+oS.value;document.getElementById(‘oV’).textContent=k;var” big=”k”>10,h=””;for(var i=1;i<=4;i++){var full=!big||i<=2,ht=full?Math.min(100,12+k*1.5):8,cls=big?(full?’full’:’hand’):”,t=!big?’Small result, sent unchanged’:(full?’Full result (‘+k+’ KiB)’:’Handle + size + head/tail excerpt’);h+=’
Provider request ‘+i+’
‘+t+’
‘}oR.innerHTML=h;document.getElementById(‘oMsg’).textContent=big?’Above the 10 KiB threshold: ObservationPack archives the original locally.’:’Below 10 KiB: ObservationPack leaves the result alone.’;post()}
oS.oninput=obs;obs();
document.getElementById(‘oRec’).onclick=function(){var m=document.getElementById(‘oMsg’);if(+oS.value<=10){m.textContent=”Nothing archived at this size. Raise the slider above 10 KiB.”;return}m.textContent=”Fetching exact page through the stable handle…”;later(function(){m.textContent=”Exact original chunk returned on demand. Nothing was lost, only deferred.”},900)};
/* context compact */
var cS=document.getElementById(‘cS’),cB=document.getElementById(‘cB’);
function gate(){var n=+cS.value,sav=n*1.05,cost=3.4,p=sav>cost;document.getElementById(‘cV’).textContent=n;var g=document.getElementById(‘cG’);g.className=”pill “+(p?’p’:’f’);g.textContent=p?’Compact’:’Skip’;document.getElementById(‘cT’).textContent=p?’Projected input savings exceed the cache-rewrite cost.’:’Too few requests left to repay rewriting the cache. Keep full history.’;return p}
function ctx(anim){var p=gate(),base=[1,1.3,1.6,1.9],cmp=p?[1,1.3,.55,.75]:base;var h=””;for(var i=0;i<4;i++)h+=”;cB.innerHTML=h;var bars=cB.querySelectorAll(‘.cbi’);[].forEach.call(bars,function(b,i){later(function(){b.style.height=(base[i]/1.9*100)+’%’;document.getElementById(‘cl’+i).textContent=”call “+(i+1)+’: ‘+base[i]+’x’},anim?150+i*350:0)});
if(p)[2,3].forEach(function(i){later(function(){bars[i].style.height=(cmp[i]/1.9*100)+’%’;bars[i].classList.add(‘g’);document.getElementById(‘cl’+i).textContent=”call “+(i+1)+’: ‘+cmp[i]+’x’},anim?1750+(i-2)*400:10)});post()}
cS.oninput=function(){ctx(false)};document.getElementById(‘cPlay’).onclick=function(){ctx(true)};
/* reducer */
var bad=false,rb=document.getElementById(‘rBad’);rb.onclick=function(){bad=!bad;rb.setAttribute(‘aria-pressed’,bad);rb.classList.toggle(‘on’,bad);rb.textContent=bad?’Misquote injected’:’Inject a misquoted line’};
document.getElementById(‘rPlay’).onclick=function(){var st=[‘r1′,’r2′,’r3’].map(function(x){return document.getElementById(x)}),r4=document.getElementById(‘r4’),ck=document.querySelectorAll(‘#rC .ck’),o=document.getElementById(‘rO’);st.concat([r4]).forEach(function(c){c.className=”call”});[].forEach.call(ck,function(c){c.className=”ck”});o.textContent=””;
st.forEach(function(c,i){later(function(){c.className=”call hot”},200+i*450)});
[].forEach.call(ck,function(c,i){later(function(){c.className=”ck “+(bad&&i===3?’bad’:’ok’)},1600+i*300)});
later(function(){if(bad){r4.className=”call red”;o.innerHTML=’Verification failed. The harness falls back to the original log, so no evidence is hidden.’}else{r4.className=”call hot”;o.innerHTML=’Verified receipt passed. The main agent still owns diagnosis and action selection.’}post()},1600+5*300+200)};
/* results */
var R={s:{sc:[[‘Codex’,34.738],[‘Pi’,44.833],[‘SoL-Pi [Efficiency]’,42.003],[‘SoL-Pi [Performance]’,47.208]],c:[[‘Codex’,1787],[‘Pi’,1339],[‘SoL-Pi [Efficiency]’,894],[‘SoL-Pi [Performance]’,1271]],t:[[‘Codex’,3.0537],[‘Pi’,2.1538],[‘SoL-Pi [Efficiency]’,1.0990],[‘SoL-Pi [Performance]’,2.0224]]},
o:{sc:[[‘Claude Code’,43.689],[‘Pi’,44.756],[‘SoL-Pi [Efficiency]’,42.224],[‘SoL-Pi [Performance]’,50.482]],c:[[‘Claude Code’,2535],[‘Pi’,1741],[‘SoL-Pi [Efficiency]’,1158],[‘SoL-Pi [Performance]’,1605]],t:[[‘Claude Code’,2.0045],[‘Pi’,2.3697],[‘SoL-Pi [Efficiency]’,1.3101],[‘SoL-Pi [Performance]’,2.1016]]}},be=”s”;
function draw(id,arr,max,fmt){var h=””;arr.forEach(function(r){h+=”});var el=document.getElementById(id);el.innerHTML=h;later(function(){[].forEach.call(el.querySelectorAll(‘.fill’),function(f){f.style.width=f.dataset.w+’%’})},40)}
function res(){var d=R[be];draw(‘gS’,d.sc,55,function(v){return v.toFixed(1)});draw(‘gC’,d.c,2600,function(v){return ‘$’+v.toLocaleString(‘en-US’)});draw(‘gT’,d.t,3.1,function(v){return v.toFixed(2)+’B’});post()}
var bS=document.getElementById(‘bS’),bO=document.getElementById(‘bO’);
bS.onclick=function(){be=”s”;bS.className=”btn on”;bO.className=”btn g”;res()};bO.onclick=function(){be=”o”;bO.className=”btn on”;bS.className=”btn g”;res()};
go(0);window.addEventListener(‘resize’,post);window.addEventListener(‘load’,post);
})();