Spaces:
Running
Running
Simplify Easy result notices and usage captions
Browse files- app.js +6 -40
- index.html +1 -1
- manifest.json +3 -3
app.js
CHANGED
|
@@ -37,7 +37,6 @@ function stats(es) {
|
|
| 37 |
window.benchmarkStats = stats;
|
| 38 |
const tokens = e => e && Number.isFinite(e.usage?.input_tokens) && Number.isFinite(e.usage?.output_tokens) ? e.usage.input_tokens+e.usage.output_tokens : null;
|
| 39 |
function metric(value,label,detail='',attrs='') {return `<div class="metric" ${attrs}><span class="metric-label">${label}</span><strong>${value}</strong>${detail?`<small>${detail}</small>`:''}</div>`;}
|
| 40 |
-
function usageDefinition(){return 'Inclusive input = fresh input + cache read + cache write. Fresh input excludes both cache categories. Cache hit rate = cache read / inclusive input. Output includes reasoning. Counts cover selected evaluated episodes; unavailable values are shown as —, not zero.';}
|
| 41 |
function variantTabs(selected,taskKey,section) {
|
| 42 |
return `<div class="variant-tabs" aria-label="Choose agent and model">${data.variants.filter(v=>!taskKey||data.tasks.find(t=>t.key===taskKey)?.planned_variants.includes(v.id)).map(v=>`<a class="variant-tab ${v.id===selected?'active':''}" style="--variant:${colors[v.id]}" href="${taskKey?taskRoute(taskKey,v.id,epFor(taskKey,v.id)?section:'overview'):'#runs/'+v.id}" ${v.id===selected?'aria-current="page"':''}><span class="tab-agent">${icon(v)}<strong>${esc(v.label||v.agent)}</strong>${taskKey?badge(epFor(taskKey,v.id)):''}</span><span class="tab-model">${modelLabel(v)}</span></a>`).join('')}</div>`;
|
| 43 |
}
|
|
@@ -51,23 +50,7 @@ function taskResult(ep, link) {
|
|
| 51 |
return `<span class="task-result">${badge(ep,link)}<span class="task-cost" title="${esc(costNote(s))} · USD" aria-label="Estimated cost: ${esc(cost)} USD">${cost}</span></span>`;
|
| 52 |
}
|
| 53 |
function usageTiles(s,includeCost=true) {
|
| 54 |
-
|
| 55 |
-
const writeNote=s.writeCount!==s.n?`${s.writeCount} / ${s.n} episodes reported`:s.cacheWrite===0?'Reported zero; see counter source':'Recorded cache creation tokens';
|
| 56 |
-
return `<div class="usage-metrics">${metric(compact(s.fresh),'Fresh input',freshNote,`title="${number(s.fresh)}"`)}${metric(rangeNumber(s.cacheLow,s.cacheHigh),'Cache read','Reused input tokens',`title="${rangeNumber(s.cacheLow,s.cacheHigh,number)}"`)}${metric(compact(s.cacheWrite),'Cache write',writeNote,`title="${number(s.cacheWrite)}"`)}${metric(compact(s.output),'Output',s.reasoning==null?'Includes reasoning when reported':compact(s.reasoning)+' reasoning')}${metric(rangeNumber(s.cacheRateLow,s.cacheRateHigh,pct),'Cache hit rate','Cache read / inclusive input')}${includeCost?metric(costValue(s),'Total cost',costNote(s)):''}</div>`;
|
| 57 |
-
}
|
| 58 |
-
function usageEvidence(ep) {
|
| 59 |
-
const u=ep?.usage;
|
| 60 |
-
const parser=u?.parser?`Recomputed with ${u.parser} from recorded sessions. `:'';
|
| 61 |
-
const coverage=u?.parser&&u.audit_complete===false?'Provider request identity is incomplete; recorded token totals are retained. ':'';
|
| 62 |
-
return parser+coverage+counterEvidence(ep);
|
| 63 |
-
}
|
| 64 |
-
function counterEvidence(ep) {
|
| 65 |
-
if(ep?.provider==='robotwin-official')return 'No language-agent API calls. Token counters cover the language agent; local VLA compute and GPU cost are not included.';
|
| 66 |
-
const u=UsageMetrics.usage(ep);
|
| 67 |
-
if(u.cacheWrite==null)return 'Cache-write coverage is missing; fresh input cannot be separated reliably.';
|
| 68 |
-
if(u.writeBasis==='provider-reported')return `Cache write: ${number(u.cacheWrite)} reported in raw provider responses. A reported zero does not establish unreported physical cache creation or an API bill.`;
|
| 69 |
-
if(u.writeBasis==='codex-native-counter')return `Cache write: ${number(u.cacheWrite)} in Codex native counters. Raw provider usage was not retained for this run; a CLI zero cannot distinguish an upstream zero from a missing field.`;
|
| 70 |
-
return `Cache write: ${number(u.cacheWrite)} in ${u.writeBasis==='claude-native-counter'?'Claude Code native':'Pi session'} counters. Fresh input is inclusive input minus cache read and cache write.`;
|
| 71 |
}
|
| 72 |
function modelGroups() {
|
| 73 |
const groups=new Map();
|
|
@@ -97,12 +80,7 @@ function comparisonCell(v,f) {
|
|
| 97 |
}
|
| 98 |
|
| 99 |
function comparisonTable() {
|
| 100 |
-
|
| 101 |
-
return `<section class="comparison-panel" aria-labelledby="comparison-title"><div class="section-heading bare"><div><h2 id="comparison-title">Compare environments</h2><p>Four standalone checkpoints are scheduled under official RoboTwin evaluation across all 50 tasks. Check completion counts alongside scores. Kinex conditions cover three tasks. The current Kinex + VLA condition uses VLAct Clean 50k with an open conditioning interface.</p></div><div class="segmented" aria-label="Comparison metric">${[['success','Success rate'],['tokens','Tokens / task'],['cost','Cost / task']].map(([k,l])=>`<button data-matrix="${k}" aria-pressed="${matrixMetric===k}">${l}</button>`).join('')}</div></div><p class="comparison-definition">${matrixMetric==='tokens'?scope+' '+usageDefinition():matrixMetric==='cost'?scope+' Estimated API-equivalent USD per task.':'Native passes / evaluated tasks. Pending tasks are excluded; compare coverage alongside success rates.'}</p><div class="model-comparisons">${modelGroups().map((g,i)=>`<details class="model-comparison panel" data-model-group="${esc(g.key)}" ${expandedModels?expandedModels.has(g.key)?'open':'':i===0?'open':''}><summary><span><strong>${esc(g.model)}</strong><span class="model-group-meta">${g.key==='baselines'?'One episode per task':esc(g.effort)+' effort'} · ${g.variants.map(v=>esc(v.label||v.agent)).join(' vs ')}</span></span><span class="model-group-count">${g.variants.length} variants <span class="disclosure-arrow">⌄</span></span></summary><div class="table-scroll"><table class="comparison-table grouped-comparison ${matrixMetric}"><thead><tr><th>Environment</th>${g.variants.map(v=>`<th><a href="#runs/${v.id}" class="agent-inline">${icon(v)}${esc(v.label||v.agent)} ${arrow}</a></th>`).join('')}</tr></thead><tbody>${data.families.map(f=>`<tr><th scope="row"><span class="family-code">${f.id.slice(-2)}</span>${esc(f.name)}<small>${f.tasks} tasks</small></th>${g.variants.map(v=>comparisonCell(v,f)).join('')}</tr>`).join('')}</tbody></table></div></details>`).join('')}</div></section>`;
|
| 102 |
-
}
|
| 103 |
-
function recordingPilotProgress(){
|
| 104 |
-
const p=data.recording_pilot;if(!p)return '';
|
| 105 |
-
return `<section class="panel" style="padding:18px 24px;margin-bottom:24px" data-recording-pilot><strong>Codex + RoboBridge · GPT-6 Astra / high · GPU recording pilot</strong><p>${number(p.completed)} / ${number(p.planned)} independent attempts published: LIBERO, RoboTwin, and two RoboDojo recording conditions. This pilot does not cover the full benchmark.</p><p>LIBERO and RoboTwin use independent 720-high spectator cameras. RoboDojo compares native camera recording with online HD recording. Both keep native agent camera resolution, but the RTX control test found that extra HD cameras change subsequent native image pixels. The HD control is shown separately.</p><p>Videos play at 4× simulation speed. Session galleries contain images actually submitted to the agent. One model episode per condition cannot establish a success-rate effect.</p><div class="inline-links"><a href="#runs/codex-astra">Three simulator results ↗</a><a href="#task/task04/01/codex-astra-spectator">RoboDojo HD control ↗</a>${external(p.details_url||p.report_url,'GPU recording validation')}</div></section>`;
|
| 106 |
}
|
| 107 |
function recordingComparisonNote(ep){
|
| 108 |
if(!ep.recording_comparison)return '';
|
|
@@ -110,16 +88,8 @@ function recordingComparisonNote(ep){
|
|
| 110 |
return `<aside class="native-note" data-recording-comparison><span class="note-symbol">i</span><div><strong>Recording comparison · ${hd?'Online HD cameras':'Native camera frames'}</strong><p>${hd?'The agent receives native-resolution images. GPU controls show that extra HD cameras affect subsequent native RGB pixels through the shared renderer. Spectator images are for the human video only.':'The video uses cached native camera frames. No extra camera or rendering pass is added for recording.'}</p><p>Same task, seed 0, model, effort, prompt, budget and owner image; one fresh model attempt per condition. Model sampling also varies, so trajectory differences alone do not establish causality.</p>${ep.collector_review?`<p>Original Harbor collection failed because of a nested Docker log-path mismatch. The unchanged session, usage, sealed evidence and native failure were recovered; the original collection exception is retained. ${external(ep.links.collector_review,'Collection recovery receipt')}</p>`:''}${ep.encoding_review?`<p>The original 300-second encoding deadline expired after four of six videos. This presentation uses all sealed source frames re-encoded offline with a 600-second deadline; there was no model or simulator retry. ${external(ep.links.encoding_recovery,'Encoding recovery receipt')}</p>`:''}<a href="${taskRoute(ep.task_key,hd?'codex-astra':'codex-astra-spectator')}">View the other recording condition ↗</a>${external(data.recording_pilot.details_url||data.recording_pilot.report_url,'Measured image differences and behavior review')}</div></aside>`;
|
| 111 |
}
|
| 112 |
|
| 113 |
-
function campaignProgress(){
|
| 114 |
-
const c=data.active_campaign;if(!c)return '';const n=c.counts||{};const paired=(n.paired_replacement_pending||0)+(n.paired_replacement_running||0);const codexOnly=(n.codex_replacement_pending||0)+(n.codex_replacement_running||0);const kinex=Object.values(c.kinex_reruns||{});const kinexDone=kinex.filter(x=>x.closed&&x.published_episodes===1).length;
|
| 115 |
-
return `<section class="panel" style="padding:18px 24px;margin-bottom:24px" aria-label="Current evaluation campaign"><strong>${esc(c.phase||'Kinex + RoboEnv · GPT-6 Astra / high')}</strong>${c.dispatch_enabled===false?'<p><strong>New dispatch paused.</strong> '+esc(c.pause_reason||'Runtime review pending.')+'</p>':''}<p>${number(n.finished||0)} / ${number(c.planned_episodes)} episodes completed · ${number(n.running||0)} running · ${number(n.queued||0)} queued${n.preflight?' · '+number(n.preflight)+' checking initialization':''}${paired?' · '+number(paired)+' paired replacements pending':''}${codexOnly?' · '+number(codexOnly)+' Codex replacements pending':''}${n.preflight_failed?' · '+number(n.preflight_failed)+' initialization failures awaiting replacement':''}${n.not_run?' · '+number(n.not_run)+' unavailable':''}${n.needs_review?' · '+number(n.needs_review)+' under review':''}. ${c.closed&&c.published_episodes===n.finished?'Evaluations have finished. All available results, videos and evidence are listed below.':'Results, videos and evidence are published after verification.'}</p>${kinex.length?'<p>'+number(kinexDone)+' / '+number(kinex.length)+' authorized Kinex reruns verified and published. Original selected results remain visible until replacement verification finishes.</p>':''}<p class="source-note">Updated ${esc(c.updated_at)} · <a href="${esc(c.status_url)}" target="_blank" rel="noopener">Campaign status and provenance ↗</a></p></section>`;
|
| 116 |
-
}
|
| 117 |
-
function opusPilotProgress(){
|
| 118 |
-
const c=data.pilot_campaigns?.['cc-opus'];if(!c)return '';const n=c.counts||{};
|
| 119 |
-
return `<section class="panel" style="padding:18px 24px;margin-bottom:24px" aria-label="Claude Code campaign"><strong>Claude Code · Opus 5.5 / high</strong><p>${number(n.finished||0)} / ${number(c.planned_episodes)} episodes completed · ${number(n.running||0)} running · ${number(n.queued||0)} pending${n.needs_review?' · '+number(n.needs_review)+' under review':''}${n.interrupted?' · '+number(n.interrupted)+' interrupted':''}.</p><p class="source-note">${c.quota_waiting?'Waiting for model-service quota recovery · ':''}${number(c.published_episodes)} episode records published · <a href="${esc(c.status_url)}" target="_blank" rel="noopener">Results and protocol ↗</a></p></section>`;
|
| 120 |
-
}
|
| 121 |
function methodology() {
|
| 122 |
-
return `<details class="panel methodology" id="methodology"><summary><span><span class="eyebrow">Reading the benchmark</span><strong>Protocol, metrics & provenance</strong></span><span class="summary-plus">+</span></summary><div class="method-grid"><div><h3>One selected episode</h3><p>Each standalone checkpoint: 50 tasks, one episode each, official seed group 0 with native expert admission. VLAct Clean 50K, VLAct All 100K and the original Base 40K episodes are all retained. Kinex: the retained three-task seed-0 pilot. Kinex + VLA: the October 30 VLAct Clean 50k run on those same three tasks and seed 0; previous valid attempts remain archived.</p></div><div><h3>Native success</h3><p>Success rate is passes / evaluated tasks, pooled over the selected episodes. Pending tasks do not count as failures. Results follow the original native verifier.</p></div><div><h3>Native control budget</h3><p>RLE-Bench task03 · RoboTwin 2.0 · ALOHA AgileX. Standalone uses official take_action and task-specific limits. Kinex uses rosbridge control frames. Initializations and physical durations are not matched.</p></div><div><h3>Policy & agent</h3><p>Non-VLAct All 140k: StarVLA/Qwen3-VL-OFT-RoboTwin2-All, step 140,000, trained on 27,500 clean/randomized demonstrations. It uses three 224 × 224 images and full 50-action chunks. The existing Easy instruction protocol is retained; expert admission matched Base scene seeds on 45/50 tasks.</p><p>Standalone VLAct Clean: StarVLA/VLAct_Qwen3OFT_Robotwin_Finetune, step 50,000, RoboTwin Clean/Base training mixture. It uses the same released 32-action, image-bucket and wrap-joint contract as VLAct All. Official expert admission selected the same scene seed as All in 45/50 tasks. Each checkpoint has one admitted episode per task; training mixture and training duration differ, so these results do not isolate a causal mechanism. </p><p>Standalone VLAct All: StarVLA/VLAct_Qwen3OFT_Robotwin_all_Finetune, step 100,000, 32-action chunks and checkpoint-specific image buckets / wrap decoding. Official expert admission selected the same scene seed as Base 40k in 43 of 50 tasks; this is not a fully paired comparison. Standalone Base 40k retains StarVLA/Qwen3-VL-OFT-Robotwin2, step 40,000. Kinex + VLA now uses VLAct Clean 50k, with 32 predicted targets and its checkpoint-specific image buckets and wrap decoder. Kinex uses GPT-6 Astra / high. Kinex chooses whether to use VLA, writes its control loop, and chooses language, arbitrary JSON conditions and optional formatting. Additional conditions enter the frozen model through language. This interface supports richer inputs; effectiveness is a separate experimental question. The rerun returns untimed joint waypoints, executed by Kinex trajectories or agent-authored code. Encoder changes and progress monitors are not used.</p></div><div><h3>Token accounting</h3><p>
|
| 123 |
}
|
| 124 |
function taskBrowser(variant=null) {
|
| 125 |
return `<section class="task-browser" id="tasks"><div class="section-heading bare"><div><div class="eyebrow">${variant?'Episode index':'Browse the benchmark'}</div><h2>Explore tasks <span class="heading-count">${plannedTasks(variant).length}</span></h2></div><button class="button secondary" data-export="${variant||'all'}">Export CSV ↓</button></div><div class="panel"><div class="filters"><label class="search-field"><span aria-hidden="true">⌕</span><input id="task-search" type="search" aria-label="Search tasks" placeholder="Search task name, instruction or ID" value="${esc(filters.query)}"></label><select id="task-family" aria-label="Environment"><option value="">All environments</option>${data.families.map(f=>`<option value="${f.id}" ${filters.family===f.id?'selected':''}>${f.name}</option>`).join('')}</select>${variant?'':`<select id="task-variant" aria-label="Agent for outcome filter">${data.variants.map(v=>`<option value="${v.id}" ${filters.variant===v.id?'selected':''}>${v.label||v.agent} · ${v.model}</option>`).join('')}</select>`}<select id="task-status" aria-label="Outcome"><option value="">All outcomes</option>${['pass','fail','pending'].map(s=>`<option value="${s}" ${filters.status===s?'selected':''}>${s[0].toUpperCase()+s.slice(1)}</option>`).join('')}</select><select id="task-sort" aria-label="Sort tasks"><option value="catalog" ${filters.sort==='catalog'?'selected':''}>Catalog order</option><option value="tokens" ${filters.sort==='tokens'?'selected':''}>Most fresh input tokens</option><option value="cost" ${filters.sort==='cost'?'selected':''}>Highest cost</option><option value="name" ${filters.sort==='name'?'selected':''}>Task name</option></select></div><div class="table-scroll"><table class="task-table ${variant?'single-variant':''}"><thead><tr><th>Task</th>${variant?'<th>Native result</th><th>Fresh input<small>Excludes read and write</small></th><th>Cache read</th><th>Cache write</th><th>Cache hit</th><th>Output</th><th>Total cost<small>Estimated USD</small></th><th>Action steps</th>':data.variants.map(v=>`<th class="${v.id===filters.variant?'focus-column':''}">${v.label||v.agent}<small>${v.model} · ${v.effort}</small><small>Native result · Estimated USD</small></th>`).join('')}</tr></thead><tbody id="task-rows"></tbody></table></div><div class="table-footer"><span id="task-count" aria-live="polite"></span><span id="filter-context"></span><button class="text-button" id="reset-filters">Reset filters</button></div></div></section>`;
|
|
@@ -135,15 +105,11 @@ function renderRows() {
|
|
| 135 |
$('#filter-context').textContent=variant?variantName(variant):'Outcome filter & usage/cost sort: '+variantName(filters.variant);
|
| 136 |
$$('.task-table thead th').forEach((th,i)=>{if(!variant&&i)th.classList.toggle('focus-column',data.variants[i-1].id===filters.variant);});
|
| 137 |
}
|
| 138 |
-
function researchRerunNote() {
|
| 139 |
-
const r=data.research_update;if(!r)return '';
|
| 140 |
-
return `<aside class="native-note" data-research-rerun><span class="note-symbol">i</span><div><strong>Kinex + VLAct 50k · October 30</strong><p>${number(r.successes)} / ${number(r.valid)} native successes · ${number(r.vla_calls)} VLA calls · ${number(r.structured_condition_calls)} calls with caller-defined structured conditions. Astra/high chooses tool use, conditions, text organization and execution horizon. Three single-seed episodes do not establish a causal benefit or superiority over pure agent control.</p><div class="inline-links"><a href="#runs/kinex_policy">Explore the new runs ↗</a><a href="${esc(evidenceURL(r.report))}">Calling behavior & evidence ↗</a><a href="history.html#overview">Previous pilot ↗</a></div></div></aside>`;
|
| 141 |
-
}
|
| 142 |
|
| 143 |
function overview() {
|
| 144 |
current={type:'overview'};
|
| 145 |
$('#main').innerHTML=`<section class="hero"><div><div class="eyebrow"><span class="tiny-logo">✦</span> RLE-Bench · Embodied agent evaluation</div><h1>Coding agents.<br><span>Physical tasks.</span></h1><p>Compare native success, token usage and recorded behavior.<br>Every result opens into the full agent session and its evidence.</p></div><div class="hero-facts"><div><strong>${data.families.length}</strong><span>environment</span></div><div><strong>${data.tasks.length}</strong><span>distinct tasks</span></div><div><strong>${data.variants.length}</strong><span>agent–model variants</span></div><span class="progress-label"><i></i>${data.benchmark_complete?'Evaluation complete':'Evaluation in progress'} · selected seeds</span></div></section>
|
| 146 |
-
<
|
| 147 |
renderRows();
|
| 148 |
}
|
| 149 |
function runsPage(variant,params,restoredFilters=null) {
|
|
@@ -153,7 +119,7 @@ function runsPage(variant,params,restoredFilters=null) {
|
|
| 153 |
if(params.has('family')){filters.family=params.get('family');filters.status='';filters.query='';}
|
| 154 |
if(restoredFilters)filters={...restoredFilters};
|
| 155 |
const v=variantFor(variant),s=stats(episodes(variant));
|
| 156 |
-
$('#main').innerHTML=`<div class="breadcrumbs"><a href="#overview">Benchmark</a><span>/</span><span>Agent report</span></div>${variantTabs(variant)}<section class="report-hero" style="--variant:${colors[variant]}"><div><div class="eyebrow">${s.n?'Selected results':'Planned evaluation'}</div><h1>${esc(v.label||v.agent)} <span class="muted-times">×</span> ${v.model}</h1><p>${esc(v.effort)} effort · One seed per task · ${s.n} evaluated · ${plannedTasks(variant).length-s.n} pending</p></div><button class="button secondary" data-export="${variant}">Download results ↓</button></section><div class="report-metrics">${metric(pct(s.rate),'Native success',s.n?`${s.passes} passed / ${s.n} evaluated`:'No recorded episodes')}${metric(costValue(s),'Total cost',costNote(s))}${metric(number(s.responses??s.usageMessages),s.responses==null&&s.usageMessages!=null?'Session usage messages':'Model responses',s.n?(s.responses==null&&s.usageMessages!=null?'Provider response identity unavailable':'Recorded response count'):'Not yet measured')}${metric(elapsed(s.wall==null?null:s.wall/s.n),'Mean wall time',s.n?'Per evaluated episode':'Not yet measured')}</div>${usageTiles(s,false)}<div class="family-cards">${data.families.map(f=>{const fs=stats(episodes(variant,f.id));if(!plannedTasks(variant).some(t=>t.family===f.id))return '';return `<button class="family-card ${filters.family===f.id?'active':''}" data-report-family="${f.id}"><div><strong>${f.name}</strong><span>${pct(fs.rate)}</span></div><div class="mini-track"><span style="width:${(fs.rate||0)*100}%;background:${colors[variant]}"></span></div><small>${fs.n?`${fs.passes} / ${fs.n} passed`:'Pending'} · ${plannedTasks(variant).filter(t=>t.family===f.id).length-fs.n} untested</small></button>`;}).join('')}</div>
|
| 157 |
renderRows();
|
| 158 |
}
|
| 159 |
function nativeNote(task,ep) {
|
|
@@ -166,7 +132,7 @@ function videoPanel(ep,mini=false) {
|
|
| 166 |
}
|
| 167 |
function episodeMetrics(ep) {
|
| 168 |
const u=ep.usage||{},s=stats([ep]);
|
| 169 |
-
return `<section class="episode-usage" aria-label="Token usage and cost">${usageTiles(s)}<
|
| 170 |
}
|
| 171 |
// Align words and punctuation while preserving the exact original whitespace.
|
| 172 |
function instructionDiff(original, revised) {
|
|
|
|
| 37 |
window.benchmarkStats = stats;
|
| 38 |
const tokens = e => e && Number.isFinite(e.usage?.input_tokens) && Number.isFinite(e.usage?.output_tokens) ? e.usage.input_tokens+e.usage.output_tokens : null;
|
| 39 |
function metric(value,label,detail='',attrs='') {return `<div class="metric" ${attrs}><span class="metric-label">${label}</span><strong>${value}</strong>${detail?`<small>${detail}</small>`:''}</div>`;}
|
|
|
|
| 40 |
function variantTabs(selected,taskKey,section) {
|
| 41 |
return `<div class="variant-tabs" aria-label="Choose agent and model">${data.variants.filter(v=>!taskKey||data.tasks.find(t=>t.key===taskKey)?.planned_variants.includes(v.id)).map(v=>`<a class="variant-tab ${v.id===selected?'active':''}" style="--variant:${colors[v.id]}" href="${taskKey?taskRoute(taskKey,v.id,epFor(taskKey,v.id)?section:'overview'):'#runs/'+v.id}" ${v.id===selected?'aria-current="page"':''}><span class="tab-agent">${icon(v)}<strong>${esc(v.label||v.agent)}</strong>${taskKey?badge(epFor(taskKey,v.id)):''}</span><span class="tab-model">${modelLabel(v)}</span></a>`).join('')}</div>`;
|
| 42 |
}
|
|
|
|
| 50 |
return `<span class="task-result">${badge(ep,link)}<span class="task-cost" title="${esc(costNote(s))} · USD" aria-label="Estimated cost: ${esc(cost)} USD">${cost}</span></span>`;
|
| 51 |
}
|
| 52 |
function usageTiles(s,includeCost=true) {
|
| 53 |
+
return `<div class="usage-metrics">${metric(compact(s.fresh),'Fresh input','',`title="${number(s.fresh)}"`)}${metric(rangeNumber(s.cacheLow,s.cacheHigh),'Cache read','',`title="${rangeNumber(s.cacheLow,s.cacheHigh,number)}"`)}${metric(compact(s.cacheWrite),'Cache write','',`title="${number(s.cacheWrite)}"`)}${metric(compact(s.output),'Output')}${metric(rangeNumber(s.cacheRateLow,s.cacheRateHigh,pct),'Cache hit rate')}${includeCost?metric(costValue(s),'Estimated cost'):''}</div>`;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 54 |
}
|
| 55 |
function modelGroups() {
|
| 56 |
const groups=new Map();
|
|
|
|
| 80 |
}
|
| 81 |
|
| 82 |
function comparisonTable() {
|
| 83 |
+
return `<section class="comparison-panel" aria-labelledby="comparison-title"><div class="section-heading bare"><div><h2 id="comparison-title">Compare environments</h2></div><div class="segmented" aria-label="Comparison metric">${[['success','Success rate'],['tokens','Tokens / task'],['cost','Cost / task']].map(([k,l])=>`<button data-matrix="${k}" aria-pressed="${matrixMetric===k}">${l}</button>`).join('')}</div></div><div class="model-comparisons">${modelGroups().map((g,i)=>`<details class="model-comparison panel" data-model-group="${esc(g.key)}" ${expandedModels?expandedModels.has(g.key)?'open':'':i===0?'open':''}><summary><span><strong>${esc(g.model)}</strong><span class="model-group-meta">${g.key==='baselines'?'One episode per task':esc(g.effort)+' effort'} · ${g.variants.map(v=>esc(v.label||v.agent)).join(' vs ')}</span></span><span class="model-group-count">${g.variants.length} variants <span class="disclosure-arrow">⌄</span></span></summary><div class="table-scroll"><table class="comparison-table grouped-comparison ${matrixMetric}"><thead><tr><th>Environment</th>${g.variants.map(v=>`<th><a href="#runs/${v.id}" class="agent-inline">${icon(v)}${esc(v.label||v.agent)} ${arrow}</a></th>`).join('')}</tr></thead><tbody>${data.families.map(f=>`<tr><th scope="row"><span class="family-code">${f.id.slice(-2)}</span>${esc(f.name)}<small>${f.tasks} tasks</small></th>${g.variants.map(v=>comparisonCell(v,f)).join('')}</tr>`).join('')}</tbody></table></div></details>`).join('')}</div></section>`;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 84 |
}
|
| 85 |
function recordingComparisonNote(ep){
|
| 86 |
if(!ep.recording_comparison)return '';
|
|
|
|
| 88 |
return `<aside class="native-note" data-recording-comparison><span class="note-symbol">i</span><div><strong>Recording comparison · ${hd?'Online HD cameras':'Native camera frames'}</strong><p>${hd?'The agent receives native-resolution images. GPU controls show that extra HD cameras affect subsequent native RGB pixels through the shared renderer. Spectator images are for the human video only.':'The video uses cached native camera frames. No extra camera or rendering pass is added for recording.'}</p><p>Same task, seed 0, model, effort, prompt, budget and owner image; one fresh model attempt per condition. Model sampling also varies, so trajectory differences alone do not establish causality.</p>${ep.collector_review?`<p>Original Harbor collection failed because of a nested Docker log-path mismatch. The unchanged session, usage, sealed evidence and native failure were recovered; the original collection exception is retained. ${external(ep.links.collector_review,'Collection recovery receipt')}</p>`:''}${ep.encoding_review?`<p>The original 300-second encoding deadline expired after four of six videos. This presentation uses all sealed source frames re-encoded offline with a 600-second deadline; there was no model or simulator retry. ${external(ep.links.encoding_recovery,'Encoding recovery receipt')}</p>`:''}<a href="${taskRoute(ep.task_key,hd?'codex-astra':'codex-astra-spectator')}">View the other recording condition ↗</a>${external(data.recording_pilot.details_url||data.recording_pilot.report_url,'Measured image differences and behavior review')}</div></aside>`;
|
| 89 |
}
|
| 90 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 91 |
function methodology() {
|
| 92 |
+
return `<details class="panel methodology" id="methodology"><summary><span><span class="eyebrow">Reading the benchmark</span><strong>Protocol, metrics & provenance</strong></span><span class="summary-plus">+</span></summary><div class="method-grid"><div><h3>One selected episode</h3><p>Each standalone checkpoint: 50 tasks, one episode each, official seed group 0 with native expert admission. VLAct Clean 50K, VLAct All 100K and the original Base 40K episodes are all retained. Kinex: the retained three-task seed-0 pilot. Kinex + VLA: the October 30 VLAct Clean 50k run on those same three tasks and seed 0; previous valid attempts remain archived.</p></div><div><h3>Native success</h3><p>Success rate is passes / evaluated tasks, pooled over the selected episodes. Pending tasks do not count as failures. Results follow the original native verifier.</p></div><div><h3>Native control budget</h3><p>RLE-Bench task03 · RoboTwin 2.0 · ALOHA AgileX. Standalone uses official take_action and task-specific limits. Kinex uses rosbridge control frames. Initializations and physical durations are not matched.</p></div><div><h3>Policy & agent</h3><p>Non-VLAct All 140k: StarVLA/Qwen3-VL-OFT-RoboTwin2-All, step 140,000, trained on 27,500 clean/randomized demonstrations. It uses three 224 × 224 images and full 50-action chunks. The existing Easy instruction protocol is retained; expert admission matched Base scene seeds on 45/50 tasks.</p><p>Standalone VLAct Clean: StarVLA/VLAct_Qwen3OFT_Robotwin_Finetune, step 50,000, RoboTwin Clean/Base training mixture. It uses the same released 32-action, image-bucket and wrap-joint contract as VLAct All. Official expert admission selected the same scene seed as All in 45/50 tasks. Each checkpoint has one admitted episode per task; training mixture and training duration differ, so these results do not isolate a causal mechanism. </p><p>Standalone VLAct All: StarVLA/VLAct_Qwen3OFT_Robotwin_all_Finetune, step 100,000, 32-action chunks and checkpoint-specific image buckets / wrap decoding. Official expert admission selected the same scene seed as Base 40k in 43 of 50 tasks; this is not a fully paired comparison. Standalone Base 40k retains StarVLA/Qwen3-VL-OFT-Robotwin2, step 40,000. Kinex + VLA now uses VLAct Clean 50k, with 32 predicted targets and its checkpoint-specific image buckets and wrap decoder. Kinex uses GPT-6 Astra / high. Kinex chooses whether to use VLA, writes its control loop, and chooses language, arbitrary JSON conditions and optional formatting. Additional conditions enter the frozen model through language. This interface supports richer inputs; effectiveness is a separate experimental question. The rerun returns untimed joint waypoints, executed by Kinex trajectories or agent-authored code. Encoder changes and progress monitors are not used.</p></div><div><h3>Token accounting</h3><p>API-equivalent cost uses the recorded Pi session estimates; account charges and GPU costs are not reported.</p></div></div><div class="method-links"><a href="${esc(evidenceURL('research/oft-all140k-20261103/REPORT.md'))}">All 140k results & validation ↗</a><a href="${esc(evidenceURL('research/oft-all140k-20261103/protocol.json'))}">All 140k protocol & checkpoint ↗</a><a href="${esc(resultURL('sources.json'))}" target="_blank">Data sources ↗</a><a href="history.html#overview">Previous rosbridge pilot ↗</a><a href="${esc(evidenceURL('research/vlact-clean-20261029/results.json'))}">VLAct Clean results ↗</a><a href="${esc(evidenceURL("research/vlact-all-20261029/results.json"))}">VLAct All results ↗</a><a href="${esc(evidenceURL("official/results.json"))}">Base 40k results ↗</a><button class="text-button" data-export="all">Download comparison CSV ↓</button></div></details>`;
|
| 93 |
}
|
| 94 |
function taskBrowser(variant=null) {
|
| 95 |
return `<section class="task-browser" id="tasks"><div class="section-heading bare"><div><div class="eyebrow">${variant?'Episode index':'Browse the benchmark'}</div><h2>Explore tasks <span class="heading-count">${plannedTasks(variant).length}</span></h2></div><button class="button secondary" data-export="${variant||'all'}">Export CSV ↓</button></div><div class="panel"><div class="filters"><label class="search-field"><span aria-hidden="true">⌕</span><input id="task-search" type="search" aria-label="Search tasks" placeholder="Search task name, instruction or ID" value="${esc(filters.query)}"></label><select id="task-family" aria-label="Environment"><option value="">All environments</option>${data.families.map(f=>`<option value="${f.id}" ${filters.family===f.id?'selected':''}>${f.name}</option>`).join('')}</select>${variant?'':`<select id="task-variant" aria-label="Agent for outcome filter">${data.variants.map(v=>`<option value="${v.id}" ${filters.variant===v.id?'selected':''}>${v.label||v.agent} · ${v.model}</option>`).join('')}</select>`}<select id="task-status" aria-label="Outcome"><option value="">All outcomes</option>${['pass','fail','pending'].map(s=>`<option value="${s}" ${filters.status===s?'selected':''}>${s[0].toUpperCase()+s.slice(1)}</option>`).join('')}</select><select id="task-sort" aria-label="Sort tasks"><option value="catalog" ${filters.sort==='catalog'?'selected':''}>Catalog order</option><option value="tokens" ${filters.sort==='tokens'?'selected':''}>Most fresh input tokens</option><option value="cost" ${filters.sort==='cost'?'selected':''}>Highest cost</option><option value="name" ${filters.sort==='name'?'selected':''}>Task name</option></select></div><div class="table-scroll"><table class="task-table ${variant?'single-variant':''}"><thead><tr><th>Task</th>${variant?'<th>Native result</th><th>Fresh input<small>Excludes read and write</small></th><th>Cache read</th><th>Cache write</th><th>Cache hit</th><th>Output</th><th>Total cost<small>Estimated USD</small></th><th>Action steps</th>':data.variants.map(v=>`<th class="${v.id===filters.variant?'focus-column':''}">${v.label||v.agent}<small>${v.model} · ${v.effort}</small><small>Native result · Estimated USD</small></th>`).join('')}</tr></thead><tbody id="task-rows"></tbody></table></div><div class="table-footer"><span id="task-count" aria-live="polite"></span><span id="filter-context"></span><button class="text-button" id="reset-filters">Reset filters</button></div></div></section>`;
|
|
|
|
| 105 |
$('#filter-context').textContent=variant?variantName(variant):'Outcome filter & usage/cost sort: '+variantName(filters.variant);
|
| 106 |
$$('.task-table thead th').forEach((th,i)=>{if(!variant&&i)th.classList.toggle('focus-column',data.variants[i-1].id===filters.variant);});
|
| 107 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
| 108 |
|
| 109 |
function overview() {
|
| 110 |
current={type:'overview'};
|
| 111 |
$('#main').innerHTML=`<section class="hero"><div><div class="eyebrow"><span class="tiny-logo">✦</span> RLE-Bench · Embodied agent evaluation</div><h1>Coding agents.<br><span>Physical tasks.</span></h1><p>Compare native success, token usage and recorded behavior.<br>Every result opens into the full agent session and its evidence.</p></div><div class="hero-facts"><div><strong>${data.families.length}</strong><span>environment</span></div><div><strong>${data.tasks.length}</strong><span>distinct tasks</span></div><div><strong>${data.variants.length}</strong><span>agent–model variants</span></div><span class="progress-label"><i></i>${data.benchmark_complete?'Evaluation complete':'Evaluation in progress'} · selected seeds</span></div></section>
|
| 112 |
+
<div class="agent-cards">${data.variants.map(v=>{const s=stats(episodes(v.id));return `<a class="agent-card ${s.n?'':'planned'}" href="#runs/${v.id}" style="--variant:${colors[v.id]}"><div class="card-header"><span class="agent-name">${icon(v)}${esc(v.label||v.agent)}</span><span class="state-label">${s.n===plannedTasks(v.id).length?'Complete':s.n?'Partial':'Planned'}</span></div><p class="card-model">${modelLabel(v)}</p><div class="card-rate"><strong>${pct(s.rate)}</strong><span>native success</span></div><div class="card-stats"><span><b>${s.n?s.passes+' / '+s.n:'—'}</b> passed</span><span class="card-cost" title="${esc(costNote(s))}"><b>${costValue(s)}</b> total cost<small>Estimated USD</small></span></div><div class="completion-track"><span style="width:${s.n/plannedTasks(v.id).length*100}%"></span></div><div class="card-bottom"><span>${s.n} / ${plannedTasks(v.id).length} evaluated</span><span>${s.n?'Explore runs':'View planned'} ${arrow}</span></div></a>`;}).join('')}</div><div id="comparison-mount">${comparisonTable()}</div><a class="audit-launcher" href="#instructions"><div><strong>Instructions audit</strong><p>Compare current RLE goals with native descriptions, runtime language pools and recorded episode instructions.</p></div><span aria-hidden="true">↗</span></a>${taskBrowser()}${methodology()}`;
|
| 113 |
renderRows();
|
| 114 |
}
|
| 115 |
function runsPage(variant,params,restoredFilters=null) {
|
|
|
|
| 119 |
if(params.has('family')){filters.family=params.get('family');filters.status='';filters.query='';}
|
| 120 |
if(restoredFilters)filters={...restoredFilters};
|
| 121 |
const v=variantFor(variant),s=stats(episodes(variant));
|
| 122 |
+
$('#main').innerHTML=`<div class="breadcrumbs"><a href="#overview">Benchmark</a><span>/</span><span>Agent report</span></div>${variantTabs(variant)}<section class="report-hero" style="--variant:${colors[variant]}"><div><div class="eyebrow">${s.n?'Selected results':'Planned evaluation'}</div><h1>${esc(v.label||v.agent)} <span class="muted-times">×</span> ${v.model}</h1><p>${esc(v.effort)} effort · One seed per task · ${s.n} evaluated · ${plannedTasks(variant).length-s.n} pending</p></div><button class="button secondary" data-export="${variant}">Download results ↓</button></section><div class="report-metrics">${metric(pct(s.rate),'Native success',s.n?`${s.passes} passed / ${s.n} evaluated`:'No recorded episodes')}${metric(costValue(s),'Total cost',costNote(s))}${metric(number(s.responses??s.usageMessages),s.responses==null&&s.usageMessages!=null?'Session usage messages':'Model responses',s.n?(s.responses==null&&s.usageMessages!=null?'Provider response identity unavailable':'Recorded response count'):'Not yet measured')}${metric(elapsed(s.wall==null?null:s.wall/s.n),'Mean wall time',s.n?'Per evaluated episode':'Not yet measured')}</div>${usageTiles(s,false)}<div class="family-cards">${data.families.map(f=>{const fs=stats(episodes(variant,f.id));if(!plannedTasks(variant).some(t=>t.family===f.id))return '';return `<button class="family-card ${filters.family===f.id?'active':''}" data-report-family="${f.id}"><div><strong>${f.name}</strong><span>${pct(fs.rate)}</span></div><div class="mini-track"><span style="width:${(fs.rate||0)*100}%;background:${colors[variant]}"></span></div><small>${fs.n?`${fs.passes} / ${fs.n} passed`:'Pending'} · ${plannedTasks(variant).filter(t=>t.family===f.id).length-fs.n} untested</small></button>`;}).join('')}</div>${taskBrowser(variant)}${methodology()}`;
|
| 123 |
renderRows();
|
| 124 |
}
|
| 125 |
function nativeNote(task,ep) {
|
|
|
|
| 132 |
}
|
| 133 |
function episodeMetrics(ep) {
|
| 134 |
const u=ep.usage||{},s=stats([ep]);
|
| 135 |
+
return `<section class="episode-usage" aria-label="Token usage and cost">${usageTiles(s)}<div class="usage-activity"><span><strong>${u.response_count==null&&Number.isFinite(u.known_response_count)?number(u.known_response_count)+'+':number(u.response_count??u.usage_message_count)}</strong> ${u.response_count==null&&u.usage_message_count!=null?'session usage messages':'model responses'}</span><span><strong>${number(ep.call_activity?.model_tool_calls)}</strong> tool calls</span>${external(ep.links.usage,'Usage accounting record')}</div></section>`;
|
| 136 |
}
|
| 137 |
// Align words and punctuation while preserving the exact original whitespace.
|
| 138 |
function instructionDiff(original, revised) {
|
index.html
CHANGED
|
@@ -10,7 +10,7 @@
|
|
| 10 |
<link rel="stylesheet" href="style.css?v=bd1a59147e1d">
|
| 11 |
<script src="usage-metrics.js?v=330e92f8eb96" defer></script>
|
| 12 |
<script src="instruction-audit.js?v=7b5e9a418dec" defer></script>
|
| 13 |
-
<script src="app.js?v=
|
| 14 |
<link rel="stylesheet" href="policy.css">
|
| 15 |
<link rel="stylesheet" href="instruction-audit.css?v=43163fc879ed">
|
| 16 |
</head>
|
|
|
|
| 10 |
<link rel="stylesheet" href="style.css?v=bd1a59147e1d">
|
| 11 |
<script src="usage-metrics.js?v=330e92f8eb96" defer></script>
|
| 12 |
<script src="instruction-audit.js?v=7b5e9a418dec" defer></script>
|
| 13 |
+
<script src="app.js?v=7000a70b1bf3" defer></script>
|
| 14 |
<link rel="stylesheet" href="policy.css">
|
| 15 |
<link rel="stylesheet" href="instruction-audit.css?v=43163fc879ed">
|
| 16 |
</head>
|
manifest.json
CHANGED
|
@@ -11,8 +11,8 @@
|
|
| 11 |
"sha256": "43163fc879edcc6dcc6e3c6bc1faa058d1ac3fd914fcb05302c5ca08640ef7d5"
|
| 12 |
},
|
| 13 |
"app.js": {
|
| 14 |
-
"bytes":
|
| 15 |
-
"sha256": "
|
| 16 |
},
|
| 17 |
"history-app.js": {
|
| 18 |
"bytes": 87082,
|
|
@@ -44,7 +44,7 @@
|
|
| 44 |
},
|
| 45 |
"index.html": {
|
| 46 |
"bytes": 3609,
|
| 47 |
-
"sha256": "
|
| 48 |
},
|
| 49 |
"policy.css": {
|
| 50 |
"bytes": 1067,
|
|
|
|
| 11 |
"sha256": "43163fc879edcc6dcc6e3c6bc1faa058d1ac3fd914fcb05302c5ca08640ef7d5"
|
| 12 |
},
|
| 13 |
"app.js": {
|
| 14 |
+
"bytes": 87284,
|
| 15 |
+
"sha256": "7000a70b1bf3bcf2e7a290e543436a8c438f07587068b086a4924a019c24503c"
|
| 16 |
},
|
| 17 |
"history-app.js": {
|
| 18 |
"bytes": 87082,
|
|
|
|
| 44 |
},
|
| 45 |
"index.html": {
|
| 46 |
"bytes": 3609,
|
| 47 |
+
"sha256": "717b2cfd11db46b6a4b37443729ba34b8cfcc3b173b1e0ad36a911e983f7f07c"
|
| 48 |
},
|
| 49 |
"policy.css": {
|
| 50 |
"bytes": 1067,
|