yzzhao commited on
Commit
b844444
·
verified ·
1 Parent(s): 1450770

Publish RoboTwin 2.0 Hard: 200 native-instruction episodes; retain Easy results

Browse files
README.md CHANGED
@@ -36,3 +36,7 @@ This lightweight Space contains presentation code, logos and revision pointers o
36
  `StarVLA/VLAct_Qwen3OFT_Robotwin_Finetune`, step 50,000: **37/50 native successes**, 50/50 valid completed episodes. All 106 previously selected episodes are retained. The new result uses the same simulator, official admission rule, RLE instructions, native action limits and VLAct execution contract as the All run. Actual scene seeds agree with All in 45/50 tasks; training mixture and duration differ. This single-episode-per-task comparison is not the upstream paper protocol and does not isolate a causal mechanism.
37
 
38
  [Clean results](https://huggingface.co/datasets/RLE-Bench/programmable-vla/resolve/c2e39c9ea8f3a9d3e7680e4818d294770f032c21/research/vlact-clean-20261029/results.json) · [Protocol](https://huggingface.co/datasets/RLE-Bench/programmable-vla/resolve/c2e39c9ea8f3a9d3e7680e4818d294770f032c21/research/vlact-clean-20261029/protocol.json) · [Scene-seed comparison](https://huggingface.co/datasets/RLE-Bench/programmable-vla/resolve/c2e39c9ea8f3a9d3e7680e4818d294770f032c21/research/vlact-clean-20261029/comparison.json)
 
 
 
 
 
36
  `StarVLA/VLAct_Qwen3OFT_Robotwin_Finetune`, step 50,000: **37/50 native successes**, 50/50 valid completed episodes. All 106 previously selected episodes are retained. The new result uses the same simulator, official admission rule, RLE instructions, native action limits and VLAct execution contract as the All run. Actual scene seeds agree with All in 45/50 tasks; training mixture and duration differ. This single-episode-per-task comparison is not the upstream paper protocol and does not isolate a causal mechanism.
37
 
38
  [Clean results](https://huggingface.co/datasets/RLE-Bench/programmable-vla/resolve/c2e39c9ea8f3a9d3e7680e4818d294770f032c21/research/vlact-clean-20261029/results.json) · [Protocol](https://huggingface.co/datasets/RLE-Bench/programmable-vla/resolve/c2e39c9ea8f3a9d3e7680e4818d294770f032c21/research/vlact-clean-20261029/protocol.json) · [Scene-seed comparison](https://huggingface.co/datasets/RLE-Bench/programmable-vla/resolve/c2e39c9ea8f3a9d3e7680e4818d294770f032c21/research/vlact-clean-20261029/comparison.json)
39
+
40
+ ## RoboTwin 2.0 Hard · November 1, 2026
41
+
42
+ [Open the Hard results](https://rle-bench-programmable-vla.static.hf.space/hard/index.html): 50 tasks per condition, one valid episode each, native unseen instructions. Base 40k **2/50**, VLAct Clean **16/50**, VLAct All **46/50**, pure Kinex Astra/high **33/50**. The existing Easy and historical panels are retained. Execution interfaces, seeds and physical budgets differ; the panel documents those limits.
app.js CHANGED
@@ -143,7 +143,7 @@ function researchRerunNote() {
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
- ${researchRerunNote()}${recordingPilotProgress()}${campaignProgress()}${opusPilotProgress()}<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 class="scope-note"><span><i class="status-dot"></i>Success rates and costs cover selected evaluated tasks only.</span><span>Recorded effort · Cache-aware costs · Native verdicts preserved</span></div><div id="comparison-mount">${comparisonTable()}</div>${taskBrowser()}${methodology()}`;
147
  renderRows();
148
  }
149
  function runsPage(variant,params,restoredFilters=null) {
 
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
+ <aside class="native-note" data-hard-results><span class="note-symbol">↗</span><div><strong>RoboTwin 2.0 Hard · 200 / 200 episodes complete</strong><p>Native unseen instructions · 50 tasks per condition · Base 40k 2/50 · VLAct Clean 16/50 · VLAct All 46/50 · Kinex Astra/high 33/50.</p><a href="hard/index.html#overview">Explore Hard results, videos and evidence ↗</a></div></aside>${researchRerunNote()}${recordingPilotProgress()}${campaignProgress()}${opusPilotProgress()}<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 class="scope-note"><span><i class="status-dot"></i>Success rates and costs cover selected evaluated tasks only.</span><span>Recorded effort · Cache-aware costs · Native verdicts preserved</span></div><div id="comparison-mount">${comparisonTable()}</div>${taskBrowser()}${methodology()}`;
147
  renderRows();
148
  }
149
  function runsPage(variant,params,restoredFilters=null) {
hard/app.js ADDED
@@ -0,0 +1,515 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ 'use strict';
2
+ const plannedProtocol = (task, variant) => task.planned_protocol_by_variant?.[variant] || task.planned_protocol;
3
+ // RoboEnv LIBERO raw counters include five initialization frames; RoboBridge counters do not.
4
+ const actionSteps = (value, task, variant=task?.variant || current.variant || filters.variant) => Number.isFinite(value) ? Math.max(0, value - (task?.initialization_control_steps ?? task?.planned_protocol_by_variant?.[variant]?.initialization_control_steps ?? 0)) : null;
5
+ const currentBudget = task => data.budget_defaults?.tasks?.[task.native_id]?.action_step_limit ?? null;
6
+ const budgetNote = task => `<p class="subtle" data-budget-note>${currentBudget(task)==null?'':`Current benchmark default: ${number(currentBudget(task))} action steps. `}${task.family==='task02'?'RoboEnv and rosbridge displays exclude five initialization steps; RoboBridge directly counts agent actions. ':''}Recorded episodes and campaign plans retain their original budgets.</p>`;
7
+ const $ = s => document.querySelector(s);
8
+ const $$ = s => [...document.querySelectorAll(s)];
9
+ const esc = value => String(value ?? '').replace(/[&<>"']/g, c => ({'&':'&amp;','<':'&lt;','>':'&gt;','"':'&quot;',"'":'&#39;'}[c]));
10
+ const number = v => v == null ? '—' : Number(v).toLocaleString('en-US');
11
+ const compact = v => v == null ? '—' : Math.abs(v) >= 1e9 ? (v/1e9).toFixed(2)+'B' : Math.abs(v) >= 1e6 ? (v/1e6).toFixed(2)+'M' : Math.abs(v) >= 1e3 ? (v/1e3).toFixed(1)+'K' : Math.round(v).toString();
12
+ const pct = v => v == null ? '—' : (v*100).toFixed(1)+'%';
13
+ const elapsed = v => v == null ? '—' : v >= 3600 ? (v/3600).toFixed(1)+' h' : v >= 60 ? (v/60).toFixed(1)+' min' : v.toFixed(1)+' s';
14
+ const arrow = '<span aria-hidden="true">↗</span>';
15
+ const colors = {'standalone-vlact-clean':'#a75f7f','standalone-vlact-all':'#bd733b','standalone-official':'#39819c','standalone':'#39819c','kinex_policy':'#756ee4','kinex':'#27847a','codex-astra-spectator':'#a76a34','codex-astra':'#39819c','kinex-astra':'#756ee4','cc-opus':'#b48566','kinex-opus':'#958bc8','cc-opus-vertex-high':'#c9875a','cc-opus-vertex-xhigh':'#8c5a3a','kinex-opus-vertex-high':'#5b8bd8','kinex-opus-vertex-xhigh':'#3a5ba6','cc-opus-vertex-high-run2':'#e0a37a','cc-opus-vertex-xhigh-run2':'#a8704a','kinex-opus-vertex-high-run2':'#86aae6','kinex-opus-vertex-xhigh-run2':'#5876c0'};
16
+ let data, epoch = 0, current = {}, matrixMetric = 'success';
17
+ let filters = {query:'',family:'',status:'',variant:'standalone-vlact-clean',sort:'catalog'};
18
+ let sessionState = {filter:'all',query:'',count:40,view:'timeline'};
19
+ let imageItems = [], imageIndex = 0;
20
+ const sessionCache = new Map(), fileCache = new Map();
21
+ const episodes = (variant, family) => data.episodes.filter(e => (!variant || e.variant===variant) && (!family || e.family===family));
22
+ const reviewFor = (key, variant) => (data.runtime_reviews||[]).find(r => r.task_key===key && r.variant===variant);
23
+ const epFor = (key, variant) => data.episodes.find(e => e.task_key===key && e.variant===variant);
24
+ const plannedTasks = variant => data.tasks.filter(t => !variant || t.planned_variants.includes(variant));
25
+ const variantFor = id => data.variants.find(v => v.id===id);
26
+ const familyName = id => data.families.find(f => f.id===id)?.name || id;
27
+ const variantName = id => {const v=variantFor(id);return v ? `${v.label||v.agent} + ${v.model}` : id;};
28
+ const taskRoute = (key, variant='kinex', section='overview') => `#task/${key}/${variant}${section==='overview' ? '' : '/'+section}`;
29
+ const outcome = e => !e ? 'pending' : e.valid===false ? 'invalid' : typeof e.success!=='boolean' ? 'unreported' : e.success ? 'pass' : 'fail';
30
+ const badge = (e, link) => {if(!e&&link){const p=link.split('/'),t=data.tasks.find(t=>t.key===p.slice(1,3).join('/'));if(t&&!t.planned_variants.includes(p[3]))return '<span class="muted">Not scheduled</span>';}if(!e&&link){const p=link.split('/');if(reviewFor(p.slice(1,3).join('/'),p[3]))return `<a class="badge invalid" href="${esc(link)}">Under review</a>`;}const s=outcome(e),tag=link?'a':'span';return `<${tag} class="badge ${s}" ${link ? `href="${esc(link)}"` : ''}><span class="status-dot"></span>${s==='pending'?((data.active_campaign?.initialization_blocked||[]).includes((link||'').split('/').slice(1,4).join('/'))?'Blocked':'Pending'):s==='invalid'?'Invalid':s==='unreported'?'Unreported':s==='pass'?'Pass':'Fail'}</${tag}>`;};
31
+ const external = (url,label,cls='') => typeof url==='string' && /^(https?:|[a-zA-Z0-9_.-]+\/|[a-zA-Z0-9_.-]+\.json)/.test(url) ? `<a class="${cls}" href="${esc(evidenceURL(url))}" target="_blank" rel="noopener">${esc(label)} ${arrow}</a>` : '';
32
+ const modelLabel = v => `${v.model} <span class="separator">/</span> ${v.effort} <span class="separator">/</span> ${esc(v.provider)}`;
33
+ const icon = v => `<img class="agent-logo" src="assets/${v.agent==='Kinex'?'kinex':'vla'}-logo.svg" alt="" width="23" height="23">`;
34
+ function stats(es) {
35
+ return UsageMetrics.stats(es);
36
+ }
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
+ }
44
+
45
+ const rangeNumber = (lo,hi,formatter=compact) => UsageMetrics.bounds(lo,hi,formatter);
46
+ const costValue = s => UsageMetrics.bounds(s.costLow,s.costHigh,UsageMetrics.money);
47
+ const exactMoney = v => v == null ? '—' : '$'+v.toLocaleString('en-US',{minimumFractionDigits:6,maximumFractionDigits:6});
48
+ const costNote = s => !s.n ? 'Not evaluated' : s.costCount!==s.n ? `Pricing available for ${s.costCount} / ${s.n} episodes` : s.conditional ? 'Estimated · 5m cache-write basis' : 'Estimated · recorded session rates';
49
+ function taskResult(ep, link) {
50
+ const s=stats(ep?[ep]:[]), cost=costValue(s);
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
+ const freshNote=s.freshCount===s.n?'Excludes cache read and write':`${s.freshCount} / ${s.n} episodes have a complete split`;
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();
74
+ for (const v of data.variants) {
75
+ const key=v.model+' / '+v.effort;
76
+ if(!groups.has(key))groups.set(key,{key,model:v.model,effort:v.effort,variants:[]});
77
+ groups.get(key).variants.push(v);
78
+ }
79
+ return [{key:'baselines',model:'RoboTwin 2.0 Hard',effort:'Selected seeds',variants:data.variants}];
80
+ }
81
+ let expandedModels=null;
82
+ function perTaskStats(s) {
83
+ const average = value => s.n > 0 && Number.isFinite(value) ? value / s.n : null;
84
+ const result = {...s, perTask: true};
85
+ for (const key of ['inclusive','fresh','cacheWrite','input','cached','output','inputLow','inputHigh','cacheLow','cacheHigh','reasoning','costLow','costHigh','knownCost']) result[key] = average(s[key]);
86
+ result.buckets = s.buckets.map(b => ({...b, tokens: average(b.tokens), lower: average(b.lower), upper: average(b.upper)}));
87
+ return result;
88
+ }
89
+ function comparisonCell(v,f) {
90
+ if(!plannedTasks(v.id).some(t=>t.family===f.id))return '<td><span class="muted">Not scheduled</span></td>';
91
+ const s=stats(episodes(v.id,f.id)),mean=perTaskStats(s),link=`#runs/${v.id}?family=${f.id}`;
92
+ let value;
93
+ if(matrixMetric==='success')value=`<div class="comparison-value"><strong>${pct(s.rate)}</strong><span>${s.n?s.passes+' / '+s.n+' passed':'Not evaluated'}</span></div><div class="mini-track"><span style="width:${(s.rate||0)*100}%;background:${colors[v.id]}"></span></div>`;
94
+ else if(matrixMetric==='tokens')value=`<dl class="comparison-usage"><div><dt>Fresh input / task</dt><dd title="${number(mean.fresh)} tokens / task">${compact(mean.fresh)}</dd></div><div><dt>Cache write / task</dt><dd title="${number(mean.cacheWrite)} tokens / task">${compact(mean.cacheWrite)}</dd></div><div><dt>Cache read / task</dt><dd title="${rangeNumber(mean.cacheLow,mean.cacheHigh,number)} tokens / task">${rangeNumber(mean.cacheLow,mean.cacheHigh)}</dd></div><div><dt>Cache hit</dt><dd>${rangeNumber(s.cacheRateLow,s.cacheRateHigh,pct)}</dd></div><div><dt>Output / task</dt><dd title="${number(mean.output)} tokens / task">${compact(mean.output)}</dd></div></dl>`;
95
+ else value=`<div class="comparison-value"><strong>${costValue(mean)}</strong><span>USD / task · ${costNote(s)}</span></div>`;
96
+ return `<td data-harness="${esc(v.label||v.agent)}" style="--variant:${colors[v.id]}">${value}<a class="comparison-explore" href="${link}">${s.n} evaluated · ${plannedTasks(v.id).filter(t=>t.family===f.id).length-s.n} pending ${arrow}</a></td>`;
97
+ }
98
+
99
+ function comparisonTable() {
100
+ const scope='Per-task averages divide totals by the number of valid evaluated tasks in each environment and variant, including passes and failures. Pending and invalid tasks are excluded; missing values remain —.';
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 conditions cover the same 50 Hard tasks, one valid episode each. All use native unseen instructions. Pure Kinex uses Astra/high without VLA.</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 '';
109
+ const hd=ep.recording_mode==='spectator';
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 Hard benchmark</span><strong>Protocol, metrics & provenance</strong></span><span class="summary-plus">+</span></summary><div class="method-grid"><div><h3>50 tasks × 4 conditions</h3><p>RoboTwin 2.0 Hard, ALOHA AgileX, demo_randomized. Each condition completed one valid episode per task. Successes and valid failures are both retained; no valid outcome was retried. This is RoboTwin 2.0 Hard, not RoboTwin 2.0-Plus.</p></div><div><h3>Native unseen instructions</h3><p>Every episode uses the original upstream unseen instruction with its scene bindings. No RLE task03 instruction revision is applied. The exact instruction is available on each episode page and in the recorded model inputs.</p></div><div><h3>Checkpoint identity</h3><p>Base 40k: StarVLA/Qwen3-VL-OFT-Robotwin2. VLAct Clean 50k: StarVLA/VLAct_Qwen3OFT_Robotwin_Finetune. VLAct All 100k: StarVLA/VLAct_Qwen3OFT_Robotwin_all_Finetune. Full revisions and weight checksums are linked below. Kinex uses GPT-6 Astra / high without a VLA extension.</p></div><div><h3>Execution and seeds</h3><p>Standalone VLA uses official expert admission from scene seed 100000 and official take_action with full predicted chunks. Pure Kinex uses rosbridge at 25 Hz and the first initializable seed in ascending order from 0, selected before the first model query. Seeds, admission rules and physical durations are not matched across the interfaces; this is not a paired causal comparison. Per-episode seeds and budgets are retained.</p></div><div><h3>Initialization provenance</h3><p>Five infrastructure startup attempts produced no completed model response and are excluded from the 200 valid outcomes. For hanging_mug, a minimal runtime repair retains native language bindings if the expert path fails before finishing. Selected seed 0, task physics and the native verifier are preserved.</p></div><div><h3>Usage and costs</h3><p>${usageDefinition()} Estimated API-equivalent costs use recorded Pi session values. Actual account charges and GPU costs are not measured. Standalone VLA has zero language-agent API calls, not zero compute cost.</p></div></div><div class="method-links"><a href="${esc(resultURL('sources.json'))}" target="_blank">Data sources ↗</a><a href="${esc(evidenceURL('research/robotwin-hard-20261101/REPORT.md'))}">Report ↗</a><a href="${esc(evidenceURL('research/robotwin-hard-20261101/protocol.json'))}">Protocol & checkpoints ↗</a><a href="${esc(evidenceURL('research/robotwin-hard-20261101/execution-audit.json'))}">200-episode audit ↗</a><a href="../index.html#overview">Retained Easy results ↗</a><button class="text-button" data-export="all">Download comparison CSV ↓</button></div></details>`;
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>`;
126
+ }
127
+ function renderRows() {
128
+ const variant=current.type==='runs'?current.variant:null, selected=variant||filters.variant, q=filters.query.trim().toLowerCase();
129
+ let tasks=plannedTasks(variant).filter(t=>(!filters.family||t.family===filters.family)&&(!filters.status||outcome(epFor(t.key,selected))===filters.status)&&(!q||[t.key,t.title,t.catalog_instruction,t.native_id,familyName(t.family)].some(s=>s?.toLowerCase().includes(q))));
130
+ if(filters.sort==='name') tasks.sort((a,b)=>a.title.localeCompare(b.title));
131
+ if(filters.sort==='tokens') tasks.sort((a,b)=>(UsageMetrics.usage(epFor(b.key,selected)).fresh??-1)-(UsageMetrics.usage(epFor(a.key,selected)).fresh??-1));
132
+ if(filters.sort==='cost') tasks.sort((a,b)=>(UsageMetrics.price(epFor(b.key,selected))?.upper??-1)-(UsageMetrics.price(epFor(a.key,selected))?.upper??-1));
133
+ $('#task-rows').innerHTML=tasks.length?tasks.map(t=>{const ep=epFor(t.key,selected),us=UsageMetrics.usage(ep),cs=stats(ep?[ep]:[]);return `<tr data-task="${t.key}"><th scope="row"><a class="task-title" href="${taskRoute(t.key,selected)}">${esc(t.title)} <span class="row-arrow">↗</span></a><span class="task-meta">${familyName(t.family)} <span>·</span> <code>${t.key}</code>${data.task_notes[t.key]?'<span class="native-marker" title="Simulator source issue">◆ Native note</span>':''}</span></th>${variant?`<td>${badge(ep,taskRoute(t.key,selected))}</td><td class="numeric" title="${number(us.fresh)}">${compact(us.fresh)}</td><td class="numeric" title="${rangeNumber(us.cacheLow,us.cacheHigh,number)}">${rangeNumber(us.cacheLow,us.cacheHigh)}</td><td class="numeric" title="${number(us.cacheWrite)}">${compact(us.cacheWrite)}</td><td class="numeric">${rangeNumber(us.cacheRateLow,us.cacheRateHigh,pct)}</td><td class="numeric">${compact(us.output)}</td><td class="numeric" title="${esc(costNote(cs))}">${costValue(cs)}</td><td class="numeric">${number(actionSteps(ep?.steps,t))}<small>${ep?'of '+number(actionSteps(ep.measured_protocol?.max_steps,ep)):number(actionSteps(plannedProtocol(t,selected).max_control_steps,t))+' campaign plan'}</small></td>`:data.variants.map(v=>`<td class="${v.id===filters.variant?'focus-column':''}">${taskResult(epFor(t.key,v.id),taskRoute(t.key,v.id))}</td>`).join('')}</tr>`;}).join(''):'<tr><td colspan="${variant?9:data.variants.length+1}" class="empty-state">No tasks match these filters. <button class="text-button" data-reset>Clear filters</button></td></tr>';
134
+ $('#task-count').textContent=`${tasks.length} of ${data.tasks.length} tasks`;
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>RoboTwin 2.0.<br><span>Hard evaluation.</span></h1><p>Native unseen instructions · demo_randomized · one episode per task.<br>Explore all 200 native verdicts, recordings and model 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
+ ${researchRerunNote()}${recordingPilotProgress()}${campaignProgress()}${opusPilotProgress()}<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 class="scope-note"><span><i class="status-dot"></i>Success rates and costs cover selected evaluated tasks only.</span><span>Native unseen instructions · Distinct execution protocols</span></div><div id="comparison-mount">${comparisonTable()}</div>${taskBrowser()}${methodology()}`;
147
+ renderRows();
148
+ }
149
+ function runsPage(variant,params,restoredFilters=null) {
150
+ if(!variantFor(variant)){overview();return;}
151
+ if(current.type!=='runs'||current.variant!==variant)filters={query:'',family:'',status:'',variant,sort:'catalog'};
152
+ current={type:'runs',variant};filters.variant=variant;
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><p class="scope-note single">${s.n?'Native success is computed from the selected evaluated episodes. Native notes identify simulator source issues. '+usageDefinition():'This combination has no published episodes. The catalog and planned budgets are shown below.'}</p>${taskBrowser(variant)}${methodology()}`;
157
+ renderRows();
158
+ }
159
+ function nativeNote(task,ep) {
160
+ const note=data.task_notes[task.key];if(!note)return '';
161
+ return `<aside class="native-note" data-native-note><span class="note-symbol">!</span><div><strong>Native source · ${esc(note.kind)}</strong><p>${esc(note.text)}</p><div class="inline-links">${external(note.source,'Pinned source')}${external(note.evidence,'Diagnostic evidence')}${external(ep?.links?.analysis,'Episode record')}${external(ep?.links?.terminal_frame,'Terminal frame')}</div></div></aside>`;
162
+ }
163
+ function videoPanel(ep,mini=false) {
164
+ const m=ep.media||{},speed=m.speed||1,links=ep.links;
165
+ return `<div class="video-panel ${mini?'mini-video':''}"><div class="video-caption"><span><i class="status-dot"></i> Native recording</span><span>${m.width||'—'} × ${m.height||'—'} · ${m.duration_s==null?'':m.duration_s.toFixed(2)+' s'}</span></div><video id="episode-video" controls playsinline preload="metadata" style="aspect-ratio:${m.width||2}/${m.height||1}" poster="${esc(links.poster||'')}" src="${esc(links.video)}"></video><div class="video-toolbar"><label>Speed <select id="playback-speed" aria-label="Video playback speed">${[.25,.5,1,2].map(x=>`<option value="${x}" ${x===1?'selected':''}>${x*speed}× ${m.playback_kind==='official_action_index'?'recording':'simulation'}</option>`).join('')}</select></label><div><button class="button small" id="final-frame">${m.playback_kind==='official_action_index'?'Last recorded frame':'Final frame'}</button>${external(links.video,'Video','button small')}${external(links.terminal_frame,'Still','button small')}</div></div><div id="video-error" class="inline-error" hidden>Video unavailable. Open the pinned video directly using the Video link.</div></div>`;
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)}<p class="usage-caption">${usageDefinition()}</p><p class="usage-caption" data-usage-source>${esc(usageEvidence(ep))}</p><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>`;
170
+ }
171
+ // Align words and punctuation while preserving the exact original whitespace.
172
+ function instructionDiff(original, revised) {
173
+ const split = text => text.match(/\s+|[\p{L}\p{N}_]+|[^\s]/gu) || [];
174
+ const a=split(original), b=split(revised);
175
+ const lcs=Array.from({length:a.length+1},()=>new Uint16Array(b.length+1));
176
+ for(let i=a.length-1;i>=0;i--)for(let j=b.length-1;j>=0;j--)
177
+ lcs[i][j]=a[i]===b[j]?lcs[i+1][j+1]+1:Math.max(lcs[i+1][j],lcs[i][j+1]);
178
+ const before=[],after=[];
179
+ const append=(list,text,changed)=>{const last=list.at(-1);if(last&&last.changed===changed)last.text+=text;else list.push({text,changed});};
180
+ let i=0,j=0;
181
+ while(i<a.length||j<b.length){
182
+ if(i<a.length&&j<b.length&&a[i]===b[j]){append(before,a[i++],false);append(after,b[j++],false);}
183
+ else if(j<b.length&&(i===a.length||lcs[i][j+1]>=lcs[i+1][j]))append(after,b[j++],true);
184
+ else append(before,a[i++],true);
185
+ }
186
+ const html=(parts,kind)=>parts.map(p=>p.changed&&p.text.trim()?`<${kind==='removed'?'del':'mark'} class="instruction-${kind}">${esc(p.text)}</${kind==='removed'?'del':'mark'}>`:esc(p.text)).join('');
187
+ return {original:html(before,'removed'),revised:html(after,'added')};
188
+ }
189
+ function instructionPair(task, ep) {
190
+ const candidate = ep ? measuredInstructions.episodes[ep.id] : null;
191
+ const record = candidate && candidate.initial_goal === ep.instruction && candidate.task_key === task.key ? candidate : null;
192
+ const recordedNative = record?.observed_native || (ep ? ep.native_instruction : task.native_instruction);
193
+ const measured = record?.text || (ep ? (ep.instruction || (ep.instruction_policy === 'original_native' ? recordedNative : null)) : null);
194
+ const reference = catalogInstructionAudit.tasks.find(item => item.key === task.key && item.native_id === task.native_id);
195
+ const nativeReference = !recordedNative && reference?.native ? reference : null;
196
+ const native = recordedNative || nativeReference?.native;
197
+ return {record, native, measured, nativeReference};
198
+ }
199
+
200
+ function instructionPanel(task,ep) {
201
+ const {record,native,measured:recorded,nativeReference}=instructionPair(task,ep);
202
+ const measured=ep?recorded:task.catalog_instruction;
203
+ const initial=record&&record.initial_goal!==measured?record.initial_goal:null;
204
+ const changed=Boolean(native&&measured&&native!==measured);
205
+ const diff=changed?instructionDiff(native,measured):null;
206
+ const choices=[['measured',ep?'Measured':'Planned',measured],['native','Original native',native],['current','Current catalog',null]].filter(([key,,text])=>text&&(key!=='current'||(ep&&text!==measured&&text!==initial)));
207
+ const currentChanged=native&&task.catalog_instruction&&native!==task.catalog_instruction;
208
+ const description=!ep?'The current catalog instruction for the planned evaluation.':record?.kind==='scene_bound_goal'?"The measured goal with this episode's objects and targets filled in from the agent's session.":record?.kind==='native_received'?'The native instruction received by the agent during this episode.':'The task instruction supplied for this episode.';
209
+ return `<section class="panel instruction-panel"><div class="section-heading"><div><h2>Task instruction</h2><p>${description}</p></div><div class="segmented" aria-label="Instruction version">${choices.map(([k,label],i)=>`<button data-instruction="${k}" aria-pressed="${i===0}">${label}</button>`).join('')}</div></div>${nativeReference?`<p class="instruction-diff-note" data-native-reference><span>Native comparison uses a pinned upstream reference${ep?'; native text was not recorded in this episode':''}. ${external(nativeReference.source_url,'Native source')}</span></p>`:''}${choices.map(([k,,text],i)=>{
210
+ const comparison=k==='current'?(currentChanged?instructionDiff(native,text):null):diff;
211
+ const html=comparison?(k==='native'?comparison.original:comparison.revised):esc(text);
212
+ const note=comparison?(k==='native'?'Struck-through text was removed or replaced in the '+(ep?'measured':'planned')+' instruction.':'Highlighted text was added or replaced relative to the original native instruction.'):(native?'No changes from the original native instruction.':'Original native text is unavailable for comparison.');
213
+ return `<div class="instruction-version" id="instruction-${k}" ${i?'hidden':''}><p class="instruction-diff-note">${comparison?`<span class="diff-swatch ${k==='native'?'removed':'added'}" aria-hidden="true"></span>`:''}${note}${k==='current'?' This catalog text is not the measured episode instruction.':''}</p><div class="instruction-text">${html}</div></div>`;
214
+ }).join('')}<div class="instruction-footer"><span>${ep?`Policy: ${esc(ep.instruction_policy)}`:'Planned seed: '+(task.planned_seed_by_variant?.[current.variant]??plannedProtocol(task,current.variant).seed)}</span><span>${ep?'Recorded':'Campaign planned'} budget: ${number(actionSteps(ep?ep.measured_protocol?.max_steps:plannedProtocol(task,current.variant).max_control_steps,task))} action steps</span></div>${record&&initial?`<p class="instruction-diff-note">${record.kind==='scene_bound_goal'?'Object names are resolved for display; the measured completion requirements are preserved.':'The initial input contained a generic placeholder; this native instruction was received in the recorded session.'} <a href="${esc(record.source.instructions_url)}" target="_blank" rel="noopener">Original instruction record ↗</a> · <a href="${esc(record.source.transcript_url)}" target="_blank" rel="noopener">Session evidence ↗</a></p>`:''}</section>`;
215
+ }
216
+
217
+ function overviewDetail(task,ep) {
218
+ const seedLimit=data.active_campaign?.native_seed_selection?.[task.key];
219
+ const initializationNote=task.initialization_note_by_variant?.[ep?.variant]||task.initialization_note;
220
+ const initializationBlocked=(data.active_campaign?.initialization_blocked||[]).includes(task.key+'/'+current.variant);
221
+ const review=reviewFor(task.key,current.variant);
222
+ if(!ep&&review)return `<section class="panel pending-panel" data-runtime-review><span class="badge invalid">Under review</span><h2>Native success recorded; runtime finalization failed</h2><p>${esc(review.reason)}</p><p>Original harness verdict: invalid. Recording manifest: incomplete. This attempt is excluded from formal success metrics; its usage is retained separately.</p><dl class="facts"><dt>Native terminal steps</dt><dd>${number(actionSteps(review.native_terminal_steps,task,current.variant))}</dd><dt>Fresh input</dt><dd>${number(review.usage.fresh_input_tokens)}</dd><dt>Cache read</dt><dd>${number(review.usage.cached_input_tokens)}</dd><dt>Output</dt><dd>${number(review.usage.output_tokens)}</dd><dt>Model responses</dt><dd>${number(review.usage.response_count)}</dd><dt>Estimated API-equivalent cost</dt><dd>${exactMoney(review.estimated_api_equivalent_usd)}</dd></dl><p>Both original camera streams decode successfully. Their completion manifest was not sealed, so they are retained as review evidence.</p><div class="inline-links">${Object.entries(review.links).map(([key,url])=>external(url,key.replaceAll('_',' '))).join('')}</div></section>${instructionPanel(task,null)}`;
223
+ if(!ep)return `<div class="pending-layout"><section class="pending-panel"><span class="pending-orbit">○</span><span class="eyebrow">${initializationBlocked?'Initialization blocked':'Awaiting evaluation'}</span><h2>${seedLimit?.exhausted?'No native-valid seed at or below '+number(seedLimit.max_seed):initializationBlocked?'Native seed 0 could not initialize':'No recorded episode yet'}</h2><p>${variantName(current.variant)} / ${esc(variantFor(current.variant).effort)}</p><div class="pending-facts">${metric(number(actionSteps(plannedProtocol(task,current.variant).max_control_steps,task)),'Campaign planned action steps')}${metric(String(task.planned_seed_by_variant?.[current.variant]??plannedProtocol(task,current.variant).seed),'Seed')}${metric(task.planned_protocol.control_frequency_hz+' Hz','Control frequency')}</div><p class="subtle">${seedLimit?.exhausted?'Native checks exhausted seeds 1–'+number(seedLimit.max_seed)+'. No Codex model attempt was launched. The original Kinex result is retained; this unavailable Codex task is excluded from success rates.':initializationBlocked?'No model was called. Seed 0 is retained by user decision; this is excluded from task success rates.':'This task is included in the planned catalog. Results and usage will appear after evaluation.'}</p></section>${instructionPanel(task,null)}</div>${seedLimit?.evidence_url?external(seedLimit.evidence_url,'Native seed selection evidence'):''}${nativeNote(task,null)}`;
224
+ const m=ep.media||{},u=ep.usage||{},a=ep.analysis||{};
225
+ const reason=a.evidence_note||a.failure_reason||a.cause||a.observed||a.visible_completion;
226
+ return `<div class="episode-layout"><div>${videoPanel(ep)}<p class="media-note">${m.playback_kind==='official_action_index'?'Head + left wrist + right wrist · 4× official recording, not simulation time. Wrist views update only at inference boundaries. Native 320 × 240 views are upscaled for display; action-limit recordings omit the post-final-action frame.':ep.recording_mode==='native'?'Native camera recording · cached agent-resolution frames · '+(m.speed||1)+'× simulation speed.':ep.provider==='robobridge'&&m.playback_kind==='live_spectator'?'Independent spectator cameras · 720 px high per view · overview + wrist views · '+(m.speed||1)+'× simulation speed. Agent images retain native resolution and orientation.':m.playback_kind==='native_observation_snapshots'?'Native observation snapshots · 10 FPS playback; this is not simulation time.':`${m.source_fps?m.source_fps+' FPS source capture · ':''}${m.speed||1}× simulation speed.`} Session timestamps use wall time and are not synchronized to video frames.</p></div><aside class="result-panel panel"><div class="result-head"><span class="eyebrow">Native verdict</span>${badge(ep)}</div><div class="result-number">${number(actionSteps(ep.steps,ep))}<span> / ${number(actionSteps(ep.measured_protocol?.max_steps,ep))} action steps</span></div><div class="completion-track"><span style="width:${Math.min(100,(actionSteps(ep.steps,ep)||0)/(actionSteps(ep.measured_protocol?.max_steps,ep)||1)*100)}%"></span></div><dl class="facts"><dt>Termination</dt><dd>${esc(ep.verdict?.termination||'—')}</dd><dt>Execution</dt><dd>${esc(ep.execution?.status||'—')}</dd><dt>Evidence</dt><dd>${ep.valid?'Valid':'Invalid'}</dd><dt>Simulation time</dt><dd title="${esc(ep.timing?.simulation_time_note||'')}">${ep.timing&&ep.simulation_time_s==null?'Not recorded':elapsed(ep.simulation_time_s)}</dd><dt>Wall time</dt><dd title="${esc(ep.timing?.wall_time_scope||'')}">${elapsed(ep.wall_time_s)}</dd><dt>Estimated cost</dt><dd>${costValue(stats([ep]))}</dd><dt>Seed</dt><dd>${ep.seed}</dd><dt>Agent version</dt><dd>${ep.kinex_version?'Kinex '+esc(ep.kinex_version):ep.codex_version?'Codex '+esc(ep.codex_version):ep.claude_code_version?'Claude Code '+esc(ep.claude_code_version):esc(variantFor(ep.variant).agent)}</dd></dl><div class="result-links">${external(ep.links.verdict,'Native verdict')}${external(ep.links.provenance,'Source identity')}</div></aside></div>${nativeNote(task,ep)}${ep.post_terminal_review?`<aside class="native-note" data-post-terminal-note><span class="note-symbol">!</span><div><strong>Native episode completed; later provider error</strong><p>${esc(ep.post_terminal_review.reason)}</p>${external(ep.links.completion_review,"Terminal completion review")}</div></aside>`:""}${initializationNote?`<aside class="native-note" data-initialization-note><span class="note-symbol">!</span><div><strong>Measured initial-state variation</strong><p>${esc(initializationNote)}</p><a href="${esc(resultURL('initialization-comparison.json'))}" target="_blank">Paired initialization evidence ↗</a></div></aside>`:''}${ep.usage_review?`<aside class="native-note" data-usage-review-note><span class="note-symbol">i</span><div><strong>Context compaction included in usage</strong><p>${esc(ep.usage_review.reason)}</p>${external(ep.links.usage_review,"Usage reconciliation evidence")}</div></aside>`:""}${ep.native_clock_review?`<aside class="native-note" data-native-clock-note><span class="note-symbol">i</span><div><strong>Native physics clock differs from control-frame time</strong><p>${esc(ep.native_clock_review.reason)}</p>${external(ep.links.native_clock_review,"Native clock review")}</div></aside>`:""}${ep.collector_review&&ep.collector_review.schema!=="rlebench/collector-recovery/1"?`<aside class="native-note" data-collector-review-note><span class="note-symbol">i</span><div><strong>Host collector recovered; original model continued</strong><p>${esc(ep.collector_review.reason)}</p><p>Wall time uses the original session timestamps. Lost host setup timing is left unknown.</p><p>Host waiting protection was extended prospectively from 8 to 16 hours for this original execution; the native control budget is unchanged.</p>${external(ep.links.collector_review,"Collector recovery evidence")}</div></aside>`:""}${ep.provenance?.protocol_exception?.same_seed_comparison===false?`<aside class="native-note" data-seed-scope-note><span class="note-symbol">i</span><div><strong>Different evaluation seeds</strong><p>Codex uses seed ${number(ep.seed)} after native expert and initialization checks with no model calls during selection. ${ep.provenance.protocol_exception.max_seed!=null?'Seed selection was capped at '+number(ep.provenance.protocol_exception.max_seed)+'. ':''} Kinex retains its original seed ${number(ep.provenance.protocol_exception.preserved_kinex_seed)} result. Codex ran once; this is not a same-seed comparison.</p>${external(ep.links.seed_selection,'Native seed selection evidence')}</div></aside>`:''}${recordingComparisonNote(ep)}${episodeMetrics(ep)}<div class="detail-two-column">${instructionPanel(task,ep)}<section class="panel episode-analysis"><div class="section-heading"><div><h2>Episode notes</h2><p>Recorded observations and task-specific interpretation.</p></div></div><div class="analysis-body">${reason?`<p>${esc(reason)}</p>`:`<p>${esc(a.outcome||'The native result and original evidence are retained for this episode.')}</p>`}<details><summary>Read recorded analysis</summary>${Object.entries(a).filter(([k])=>k!=='preflight').map(([k,v])=>`<div class="analysis-entry"><span>${esc(k.replaceAll('_',' '))}</span><p>${esc(typeof v==='string'?v:JSON.stringify(v))}</p></div>`).join('')}</details><div class="inline-links">${external(ep.links.analysis,'Analysis JSON')}${external(ep.links.terminal_frame,'Terminal evidence')}</div></div></section></div><div class="detail-launchers"><a href="${taskRoute(task.key,ep.variant,'session')}"><span class="launcher-icon">≡</span><div><strong>Read the full session</strong><span>${number(ep.session_counts?.visible_events)} events · ${number(ep.session_counts?.observed_images)} observations</span></div>${arrow}</a><a href="${taskRoute(task.key,ep.variant,'artifacts')}"><span class="launcher-icon">⌘</span><div><strong>Inspect agent artifacts</strong><span>${ep.resources?.length||0} saved files · workspace & evidence</span></div>${arrow}</a></div>`;
227
+ }
228
+ function taskPage(key,variant,section='overview') {
229
+ const task=data.tasks.find(t=>t.key===key);if(!task||!variantFor(variant)){notFound();return;}
230
+ if(!task.planned_variants.includes(variant)){current={type:'not-scheduled'};$('#main').innerHTML=`<section class="panel pending-panel"><h1>Not scheduled</h1><p>${esc(variantFor(variant).agent)} is not included for ${esc(familyName(task.family))} in this campaign.</p><a class="button secondary" href="${taskRoute(key,task.planned_variants[0])}">View the scheduled evaluation ${arrow}</a></section>`;return;}
231
+ const ep=epFor(key,variant), validSections=['overview','session','tools','policy','artifacts','evidence','attempts'];
232
+ if(!validSections.includes(section)||(!ep&&!['overview','attempts'].includes(section)))section='overview';
233
+ current={type:'task',key,variant,section,ep,task};
234
+ sessionState={filter:'all',query:'',count:40,view:'timeline'};
235
+ const taskList=plannedTasks(variant),index=taskList.indexOf(task),history=data.attempt_history.filter(h=>h.task_key===key&&h.variant===variant);
236
+ document.title=`${task.title} · ${variantFor(variant).agent} — Programmable VLA`;
237
+ $('#main').innerHTML=`<div class="breadcrumbs"><a data-task-return href="${esc(taskListReturn?.hash || '#tasks?task='+encodeURIComponent(key))}">← Back to tasks</a><span>/</span><a href="#runs/${variant}?family=${task.family}">${familyName(task.family)}</a><span>/</span><code>${key}</code></div><div class="task-heading"><div><div class="eyebrow">${familyName(task.family)} · ${key}</div><h1>${esc(task.title)}</h1><p><code>${esc(task.native_id)}</code></p></div><div class="task-arrows">${index?`<a class="button" href="${taskRoute(taskList[index-1].key,variant)}" aria-label="Previous task">←</a>`:''}${index<taskList.length-1?`<a class="button" href="${taskRoute(taskList[index+1].key,variant)}" aria-label="Next task">→</a>`:''}</div></div>${budgetNote(task)}${variantTabs(variant,key,section)}<nav class="detail-nav" aria-label="Episode sections">${[['overview','Overview',null],['session','Session',ep?.session_counts?.visible_events],['tools','Tool calls',ep?.call_activity?.model_tool_calls],['policy','VLA input/output',ep?.vla_calls],['artifacts','Artifacts',ep?.resources?.length],['evidence','Evidence',null],['attempts','Previous attempts',history.length]].filter(([k])=>k!=='attempts'||history.length).map(([k,l,n])=>!ep&&!['overview','attempts'].includes(k)?`<span class="disabled-tab" aria-disabled="true">${l}</span>`:`<a href="${taskRoute(key,variant,k)}" class="${k===section?'active':''}" ${k===section?'aria-current="page"':''}>${l}${n!=null?`<span>${number(n)}</span>`:''}</a>`).join('')}<span class="detail-model">${variantFor(variant).model} / ${variantFor(variant).effort}</span></nav><div id="detail-content">${section==='overview'?overviewDetail(task,ep):section==='session'?sessionShell(ep):section==='tools'?toolsShell(ep):section==='policy'?policyShell(ep):section==='artifacts'?artifactsPanel(ep):section==='evidence'?evidencePanel(task,ep):historyPanel(history,task)}</div>`;
238
+ setupVideo();
239
+ if(section==='session')loadSession(ep,epoch);
240
+ if(section==='tools')loadTools(ep,epoch);
241
+ if(section==='policy')loadPolicy(ep,epoch);
242
+ if(section==='artifacts'&&ep.resources?.length)loadResource(0,epoch);
243
+ }
244
+ function setupVideo() {
245
+ const v=$('#episode-video');if(!v)return;
246
+ v.onerror=()=>{if($('#video-error'))$('#video-error').hidden=false;};
247
+ }
248
+ function sessionShell(ep) {
249
+ return `<section class="panel session-panel"><div class="section-heading"><div><h2>Session & observations</h2><p id="session-summary">Loading the original transcript…</p></div><div class="inline-links">${external(ep.links.transcript,'Transcript JSON')}${external(ep.links.native_session,'Native session')}</div></div><div class="session-toolbar"><div class="segmented"><button data-session-view="timeline" aria-pressed="true">Timeline</button><button data-session-view="gallery" aria-pressed="false">Observations</button></div><select id="event-filter" aria-label="Filter session events"><option value="all">All events</option><option value="assistant">Assistant</option><option value="tools">Tool results</option><option value="errors">Tool errors</option><option value="images">With images</option><option value="context">User & context</option></select><input id="event-search" type="search" placeholder="Search text, tool name or event ID" aria-label="Search session"><span id="event-count" aria-live="polite"></span></div><div id="session-events"><div class="loading"><span class="spinner"></span>Loading session…</div></div><div class="session-more"><button id="more-events" class="button secondary" hidden>Load more events</button></div></section>`;
250
+ }
251
+ async function loadSession(ep,token) {
252
+ try {
253
+ if(!sessionCache.has(ep.id)) {
254
+ const response=await fetch(ep.links.transcript);if(!response.ok)throw Error('HTTP '+response.status);
255
+ const raw=await response.json();const entries=Array.isArray(raw)?raw:raw.messages||raw.entries||raw.events||[];
256
+ if(!Array.isArray(entries))throw Error('Unsupported transcript format');
257
+ sessionCache.set(ep.id,entries);
258
+ if(sessionCache.size>6)sessionCache.delete(sessionCache.keys().next().value);
259
+ }
260
+ if(token!==epoch)return;
261
+ const entries=sessionCache.get(ep.id),images=entries.flatMap((m,i)=>(m.parts||[]).filter(p=>p.type==='image'&&p.src).map(p=>({url:new URL(p.src,new URL(ep.links.transcript,location.href)).href,label:`Event ${i+1} · ${m.id||m.role||'Observation'}`})));
262
+ $('#session-summary').textContent=`${number(entries.length)} events · ${number(images.length)} observation images · ${entries.filter(e=>e.error).length} tool errors. Event timestamps are in UTC.`;
263
+ renderSession();
264
+ } catch(error) {if(token!==epoch)return;$('#session-events').innerHTML=`<div class="empty-state">Transcript preview could not load (${esc(error.message)}).<br><button class="button secondary" data-retry-session>Retry</button> ${external(ep.links.transcript,'Open original transcript')}</div>`;}
265
+ }
266
+ function sessionText(entry) {return [entry.id,entry.role,entry.tool,...(entry.parts||[]).map(p=>p.text||JSON.stringify(p.input||p))].join('\n');}
267
+ function renderSession() {
268
+ const entries=sessionCache.get(current.ep.id);if(!entries)return;
269
+ const {filter,query,count,view}=sessionState, q=query.trim().toLowerCase();
270
+ let matches=entries.map((entry,i)=>({entry,index:i})).filter(({entry:e})=>(filter==='all'||filter==='assistant'&&e.role==='assistant'||filter==='tools'&&e.role==='toolResult'||filter==='errors'&&e.error||filter==='images'&&(e.parts||[]).some(p=>p.type==='image')||filter==='context'&&['user','system','developer'].includes(e.role))&&(!q||sessionText(e).toLowerCase().includes(q)));
271
+ imageItems=[];
272
+ const imagePart=(p,index,entry,cls='observation')=>{
273
+ const url=new URL(p.src,new URL(current.ep.links.transcript,location.href)).href;if(!/^https?:/.test(url))return '';
274
+ const n=imageItems.length;imageItems.push({url,label:`Event ${index+1} · ${entry.id||entry.role||'Observation'}`});
275
+ return `<button class="${cls}" data-image="${n}" aria-label="Open observation from event ${index+1}"><img src="${esc(url)}" alt="Agent observation at event ${index+1}" loading="lazy" decoding="async"><span>Event ${index+1} ${arrow}</span></button>`;
276
+ };
277
+ if(view==='gallery') {
278
+ const images=matches.flatMap(({entry,index})=>(entry.parts||[]).filter(p=>p.type==='image'&&p.src).map(part=>({entry,index,part})));
279
+ $('#session-events').innerHTML=images.length?`<div class="observation-gallery">${images.slice(0,count).map(({entry,index,part})=>imagePart(part,index,entry,'gallery-image')).join('')}</div>`:'<div class="empty-state">No observation images match these filters.</div>';
280
+ $('#event-count').textContent=`${Math.min(count,images.length)} / ${images.length} images`;$('#more-events').hidden=count>=images.length;
281
+ } else {
282
+ $('#session-events').innerHTML=matches.length?`<div class="timeline">${matches.slice(0,count).map(({entry:e,index})=>{
283
+ const role=e.role==='toolResult'?'Tool result':e.role==='assistant'?'Assistant':({user:'User',system:'System',developer:'Developer'}[e.role]||e.role||e.type||'Event');
284
+ const tool=e.tool||(e.parts||[]).find(p=>p.type==='tool')?.name;
285
+ return `<article class="session-entry ${e.error?'event-error':''}" id="event-${index}"><div class="event-index">${index+1}</div><div class="event-content"><div class="event-header"><strong>${esc(role)}</strong>${tool?`<code>${esc(tool)}</code>`:''}${e.error?'<span class="error-tag">Error</span>':''}<time>${esc(e.timestamp?e.timestamp.replace('T',' ').replace(/\.\d+Z$/,' UTC'):'')}</time></div><div class="event-parts">${(e.parts||[{type:'text',text:typeof e==='string'?e:JSON.stringify(e,null,2)}]).map(p=>{
286
+ if(p.type==='image'&&p.src)return imagePart(p,index,e);
287
+ if(p.type==='tool')return `<details class="tool-block"><summary><span>Tool call · <strong>${esc(p.name)}</strong></span><code>${esc((typeof p.input==='string'?p.input:JSON.stringify(p.input)).slice(0,130))}</code></summary><pre>${esc(typeof p.input==='string'?p.input:JSON.stringify(p.input,null,2))}</pre></details>`;
288
+ const txt=p.text??p.thinking??JSON.stringify(p,null,2);
289
+ if(txt==='')return '<span class="empty-event">No text recorded.</span>';
290
+ if(p.type==='thinking'||p.type==='reasoning')return `<details class="tool-block"><summary>Recorded reasoning</summary><pre>${esc(txt)}</pre></details>`;
291
+ if(e.role==='toolResult'||txt.length>1800)return `<details class="tool-block ${e.error?'error-block':''}"><summary><span>${e.role==='toolResult'?'Tool output':'Message'}</span><span class="output-excerpt">${esc(txt.slice(0,160))}</span></summary><pre>${esc(txt)}</pre></details>`;
292
+ return `<div class="message-text">${esc(txt)}</div>`;
293
+ }).join('')}</div><div class="event-id">${esc(e.id||'')}</div></div></article>`;
294
+ }).join('')}</div>`:'<div class="empty-state">No events match these filters.</div>';
295
+ $('#event-count').textContent=`${Math.min(count,matches.length)} / ${matches.length} events`;$('#more-events').hidden=count>=matches.length;
296
+ }
297
+ $('#more-events').textContent=view==='gallery'?'Load more observations':'Load next 40 events';
298
+ }
299
+ function artifactsPanel(ep) {
300
+ const resources=ep.resources||[];
301
+ return `<section class="panel artifacts-panel"><div class="section-heading"><div><h2>Agent artifacts</h2><p>Final files created during this episode. Their edit history remains in the session.</p></div><div class="inline-links">${external(ep.links.workspace,'Workspace archive')}${external(ep.links.workspace_changes,'Workspace manifest')}</div></div>${resources.length?`<div class="file-browser"><aside class="file-list" aria-label="Artifact files"><div class="file-list-title">${resources.length} saved files</div>${resources.map((r,i)=>`<button data-resource="${i}" class="file-item ${i===0?'active':''}" aria-pressed="${i===0}"><span class="file-extension">${esc(r.name.split('.').at(-1).toUpperCase().slice(0,4))}</span><span>${esc(r.name)}</span></button>`).join('')}</aside><div class="file-preview"><div class="file-toolbar"><code id="resource-name">${esc(resources[0].name)}</code><div><button class="button small" id="copy-resource">Copy</button><a class="button small" id="resource-open" target="_blank" rel="noopener" href="${esc(resources[0].file)}">Open file ↗</a></div></div><p id="resource-kind" class="file-caption"></p><pre id="resource-preview" tabindex="0">Loading file…</pre></div></div>`:'<div class="empty-state">No standalone tool or memo files were saved in this episode. The original session and workspace evidence remain available.</div>'}</section><div class="artifact-shortcuts">${evidenceCard('Execution evidence','Original verdict, protocol and runtime identity.',[['verdict','Native verdict'],['protocol','Protocol'],['provenance','Source identity']],ep)}${evidenceCard('Session & interactions','Original tool calls, observations and edited workspace.',[['native_session','Native session'],['trace','Trace'],['workspace_changes','Workspace changes']],ep)}</div>`;
302
+ }
303
+ async function fetchText(url) {
304
+ if(fileCache.has(url))return fileCache.get(url);
305
+ const r=await fetch(url);if(!r.ok)throw Error('HTTP '+r.status);
306
+ if(Number(r.headers.get('content-length'))>3e6)throw Error('File exceeds the 3 MB preview limit; use Open file');
307
+ const text=await r.text();if(text.length>3e6)throw Error('File exceeds the preview limit; use Open file');
308
+ fileCache.set(url,text);if(fileCache.size>20)fileCache.delete(fileCache.keys().next().value);return text;
309
+ }
310
+ async function loadResource(index,token) {
311
+ const r=current.ep?.resources?.[index];if(!r)return;
312
+ current.resource=index;$('#resource-name').textContent=r.name;$('#resource-open').href=r.file;$('#resource-kind').textContent=r.kind||'Final workspace snapshot';$('#resource-preview').textContent='Loading file…';
313
+ $$('[data-resource]').forEach(b=>{b.classList.toggle('active',+b.dataset.resource===index);b.setAttribute('aria-pressed',+b.dataset.resource===index);});
314
+ try{const text=await fetchText(r.file);if(token===epoch&&current.resource===index){$('#resource-preview').textContent=text;current.resourceText=text;}}
315
+ catch(e){if(token===epoch&&current.resource===index){$('#resource-preview').textContent='Preview unavailable: '+e.message;current.resourceText=null;}}
316
+ }
317
+ const evidenceGroups=[
318
+ ['Native evaluation','Owner verdicts, measured task and control protocol.',[['verdict','Native verdict'],['timing','Episode timing'],['protocol','Measured protocol'],['native_goal','Task instructions'],['owner_journal','Owner action journal']]],
319
+ ['Session & workspace','The original agent trajectory and final files.',[['native_session','Native session'],['transcript','Readable transcript'],['trace','Agent trace'],['workspace','Workspace archive'],['workspace_changes','Workspace manifest']]],
320
+ ['Recording & review','Published media and checks against the recorded evidence.',[['native_video','Original head recording'],['video','Video'],['poster','Poster'],['terminal_frame','Terminal frame'],['recording_manifest','Recording manifest'],['media_check','Media validation'],['analysis','Episode analysis']]],
321
+ ['Usage & provenance','Provider counters and the actual code used by the episode.',[['usage','Token usage'],['provider_usage','Provider usage ledger'],['provenance','Source identities'],['tool_errors','Tool errors']]]
322
+ ];
323
+ function evidenceCard(title,description,items,ep) {
324
+ return `<section class="panel evidence-card"><h3>${title}</h3><p>${description}</p><div>${items.filter(([k])=>ep.links[k]).flatMap(([k,l])=>(Array.isArray(ep.links[k])?ep.links[k]:[ep.links[k]]).map((url,i)=>external(url,l+(Array.isArray(ep.links[k])?' '+(i+1):'')))).join('')}</div></section>`;
325
+ }
326
+ function evidencePanel(task,ep) {
327
+ const used=new Set(evidenceGroups.flatMap(g=>g[2].map(x=>x[0]))),extras=Object.keys(ep.links).filter(k=>!used.has(k));
328
+ const source={...data.variant_sources[ep.variant],...(ep.source_dataset_revision?{dataset_revision:ep.source_dataset_revision}:{})};
329
+ return `<div class="evidence-intro"><h2>Evidence & provenance</h2><p>Original files retained with their published checksums. Native verdicts and measured source identities remain unchanged.</p></div><div class="evidence-grid">${evidenceGroups.map(([title,desc,items])=>evidenceCard(title,desc,items,ep)).join('')}${extras.length?evidenceCard('Additional records','Episode-specific checks and retained references.',extras.map(k=>[k,k.replaceAll('_',' ')]),ep):''}</div><section class="panel provenance-panel"><div class="section-heading"><div><h2>Recorded identity</h2><p>Source and protocol belonging to this episode.</p></div></div><dl class="provenance-list"><dt>Episode</dt><dd><code>${esc(ep.source_episode_id)}</code></dd><dt>Model</dt><dd>${esc(ep.model)} / ${ep.effort}</dd><dt>Space</dt><dd>${external('https://huggingface.co/spaces/'+source.space,source.space)}</dd><dt>Original evidence revision</dt><dd><code>${source.evidence_revision}</code></dd>${ep.kinex_revision?`<dt>Kinex revision</dt><dd><code>${esc(ep.kinex_revision)}</code></dd>`:''}${Object.entries(ep.provenance?.sources||{}).map(([k,v])=>`<dt>${esc(k)}</dt><dd><code>${esc(v.revision||'Unrecorded revision')}</code>${v.dirty?' <span class="tag">Local changes recorded</span>':''}</dd>`).join('')}<dt>Recorded action-step budget</dt><dd>${number(actionSteps(ep.measured_protocol?.max_steps,ep))} steps</dd><dt>Campaign planned action-step budget</dt><dd>${number(actionSteps(plannedProtocol(task,current.variant).max_control_steps,task))} steps</dd><dt>Current benchmark default</dt><dd>${number(currentBudget(task))} action steps</dd></dl><details class="protocol-json"><summary>Inspect the measured protocol JSON</summary><pre>${esc(JSON.stringify(ep.measured_protocol,null,2))}</pre></details></section><section class="panel evidence-preview-panel"><div class="section-heading"><div><h2>Preview an evidence file</h2><p>Inspect the recorded JSON without leaving this page.</p></div><select id="evidence-select" aria-label="Choose evidence preview"><option value="">Choose a file…</option>${[['verdict','Native verdict'],['timing','Episode timing'],['protocol','Measured protocol'],['provenance','Source identities'],['usage','Token usage'],['analysis','Episode analysis'],['media_check','Media validation'],['recording_manifest','Recording manifest']].filter(([k])=>ep.links[k]).map(([k,l])=>`<option value="${k}">${l}</option>`).join('')}</select></div><pre id="evidence-preview" hidden tabindex="0"></pre></section>`;
330
+ }
331
+ function historyPanel(history,task) {
332
+ return `<section class="panel history-panel"><div class="section-heading"><div><h2>Previous attempts</h2><p>Archived attempts are preserved separately and excluded from the current success rate, usage and costs.</p></div><a href="${esc(resultURL('attempt-history.json'))}" target="_blank" class="button secondary">Full archive ↗</a></div>${history.length?history.map(h=>`<article class="history-row"><div class="history-outcome">${badge(h)}<small>${h.valid===false?'Interrupted / invalid':typeof h.success==='boolean'?'Archived result':'Verdict not recorded'}</small></div><div><strong>${esc((h.status||'Archived attempt').replaceAll('_',' '))}</strong><p><code>${esc(h.id||h.job||h.dataset_revision||'Historical record')}</code></p><span class="history-stats">${h.steps!=null?number(actionSteps(h.steps,task))+' action steps · ':''}${h.usage?'Fresh input '+compact(UsageMetrics.usage(h).fresh)+' · cache read '+compact(h.usage.cached_input_tokens)+' · cache write '+compact(UsageMetrics.usage(h).cacheWrite)+' · output '+compact(UsageMetrics.usage(h).output)+' · ':''}${h.dataset_revision?'Revision '+h.dataset_revision.slice(0,8):''}</span>${h.analysis?.execution?`<p>${esc(h.analysis.execution)}</p>`:''}${h.instruction?`<details><summary>Measured instruction</summary><p>${esc(h.instruction)}</p></details>`:''}<div class="inline-links">${Object.entries(h.links||{}).filter(([k])=>['video','verdict','provenance','transcript','terminal_frame','native_session','result_page'].includes(k)).map(([k,u])=>external(u,k.replaceAll('_',' '))).join('')}</div></div></article>`).join(''):'<div class="empty-state">No earlier attempts are listed for this task and agent combination.</div>'}</section>`;
333
+ }
334
+ function notFound() {$('#main').innerHTML='<div class="empty-state"><h1>Page not found</h1><p><a href="#overview">Return to the benchmark</a></p></div>';}
335
+ // Keep each task list's view with its browser history entry.
336
+ history.scrollRestoration = 'manual';
337
+ let taskListReturn = null;
338
+ const navigationHash = () => location.hash || '#overview';
339
+ function saveTaskList(row = null) {
340
+ if (!['overview', 'runs'].includes(current.type) || !$('#task-rows')) return;
341
+ row ||= $$('#task-rows tr[data-task]').find(r => r.getBoundingClientRect().bottom > 100);
342
+ const view = {
343
+ hash: navigationHash(), filters: {...filters}, x: window.scrollX, y: window.scrollY,
344
+ task: row?.dataset.task, offset: row?.getBoundingClientRect().top,
345
+ tableX: $('#tasks .table-scroll').scrollLeft,
346
+ matrixMetric, expandedModels: $$('[data-model-group][open]').map(el => el.dataset.modelGroup)
347
+ };
348
+ history.replaceState({...history.state, benchmarkNavigation: {list: view}}, '');
349
+ return view;
350
+ }
351
+ function restoreTaskList(view) {
352
+ const row = $$('#task-rows tr[data-task]').find(r => r.dataset.task === view.task);
353
+ const y = row && view.offset != null
354
+ ? window.scrollY + row.getBoundingClientRect().top - view.offset : view.y;
355
+ $('#tasks .table-scroll').scrollLeft = view.tableX;
356
+ window.scrollTo({left: view.x, top: y, behavior: 'instant'});
357
+ }
358
+ document.addEventListener('click', event => {
359
+ const link = event.target.closest('a[href]');
360
+ if (!link || event.button !== 0 || event.metaKey || event.ctrlKey || event.shiftKey || event.altKey ||
361
+ link.target === '_blank' || !link.getAttribute('href').startsWith('#')) return;
362
+ const view = saveTaskList(link.closest('tr[data-task]'));
363
+ if (view && link.getAttribute('href').startsWith('#task/')) taskListReturn = view;
364
+ }, true);
365
+ window.addEventListener('pagehide', () => saveTaskList());
366
+
367
+ function route() {
368
+ epoch++;$$('video').forEach(v=>{v.pause();v.removeAttribute('src');v.load();});
369
+ const [hash,query='']=location.hash.slice(1).split('?'),parts=hash.split('/'),params=new URLSearchParams(query);
370
+ const saved = history.state?.benchmarkNavigation;
371
+ const returning = current.type === 'task' && taskListReturn &&
372
+ (taskListReturn.hash === navigationHash() ||
373
+ ['#overview', '#tasks'].includes(taskListReturn.hash) && ['#overview', '#tasks'].includes(navigationHash()));
374
+ const view = saved?.list?.hash === navigationHash() ? saved.list : returning ? taskListReturn : null;
375
+ if (parts[0] === 'task') {
376
+ taskListReturn = saved ? saved.origin || null : (['overview', 'runs', 'task'].includes(current.type) ? taskListReturn : null);
377
+ history.replaceState({...history.state, benchmarkNavigation: {origin: taskListReturn}}, '');
378
+ } else if (view) {
379
+ filters = {...view.filters};
380
+ matrixMetric = view.matrixMetric;
381
+ expandedModels = new Set(view.expandedModels);
382
+ }
383
+ document.title='Programmable VLA — RLE-Bench';
384
+ if(parts[0]==='task')taskPage(parts[1]+'/'+parts[2],parts[3],parts[4]||'overview');
385
+ else if(parts[0]==='instructions'){location.replace('#overview');return;}
386
+ else if(parts[0]==='runs')runsPage(parts[1],params,view?.filters);
387
+ else overview();
388
+ $$('[data-nav]').forEach(a=>a.setAttribute('aria-current',a.dataset.nav===(hash||'overview')?'page':'false'));
389
+ if(view && $('#task-rows'))restoreTaskList(view);
390
+ else if(hash==='tasks') {
391
+ const row = $$('#task-rows tr[data-task]').find(r => r.dataset.task === params.get('task'));
392
+ (row || $('#tasks')).scrollIntoView({block: row ? 'center' : 'start', behavior: 'instant'});
393
+ }
394
+ else if(hash==='methodology'){$('#methodology').open=true;$('#methodology').scrollIntoView();}
395
+ else window.scrollTo({left:0,top:0,behavior:'instant'});
396
+ if(parts[0]!=='task')taskListReturn=null;
397
+ }
398
+ function resetFilters() {filters={query:'',family:'',status:'',variant:filters.variant,sort:'catalog'};if(current.type==='runs')runsPage(current.variant,new URLSearchParams());else overview();$('#tasks').scrollIntoView();}
399
+ function showToast(text){$('#toast').textContent=text;$('#toast').classList.add('visible');setTimeout(()=>$('#toast').classList.remove('visible'),2200);}
400
+ function exportCSV(variant) {
401
+ const ids=variant==='all'?data.variants.map(v=>v.id):[variant];
402
+ const rows=[['task','environment','title','agent','model','effort','status','native_success','fresh_input_tokens','cache_read_tokens','cache_write_tokens','cache_write_counter_source','input_tokens_fresh_plus_cache_write','input_tokens_lower','input_tokens_upper','cached_tokens','cached_tokens_lower','cached_tokens_upper','cache_hit_rate','cache_hit_rate_lower','cache_hit_rate_upper','output_tokens','inclusive_input_tokens_original','cache_write_tokens_original','estimated_cost_usd','estimated_cost_lower_usd','estimated_cost_upper_usd','cost_basis','cache_write_basis','cache_write_assumed','steps','episode_id','reasoning_output_tokens','recorded_budget','planned_budget','source_episode_id','inclusive_total_tokens_original','seed','planned_seed','agent_execution','reported_harness_valid','post_terminal_provider_error','host_collector_recovered','harness_result_origin','agent_wall_time_limit_s','requested_wall_time_limit_s','wall_time_guard_adjusted','raw_steps','raw_recorded_budget','raw_planned_budget','current_action_step_budget']];
403
+ for(const t of data.tasks)for(const id of ids){
404
+ if(!t.planned_variants.includes(id))continue;
405
+ const e=epFor(t.key,id),v=variantFor(id),u=UsageMetrics.usage(e),c=UsageMetrics.price(e);
406
+ rows.push([t.key,familyName(t.family),t.title,v.agent,v.model,v.effort,outcome(e),e?e.success:'',u.fresh,u.cached,u.cacheWrite,e?u.writeBasis:null,u.input,u.inputLow,u.inputHigh,u.cached,u.cacheLow,u.cacheHigh,u.cacheRate,u.cacheRateLow,u.cacheRateHigh,u.output,u.inclusive,e?.usage?.cache_write_input_tokens,c&&c.lower===c.upper?c.lower:null,c?.lower,c?.upper,c?.basis,c?.cache_write_basis,c?.cache_write_assumed,actionSteps(e?.steps,t,id),e?.id,e?.usage?.reasoning_output_tokens,actionSteps(e?.measured_protocol?.max_steps,t,id),actionSteps(plannedProtocol(t,id).max_control_steps,t,id),e?.source_episode_id,tokens(e),e?.seed,t.planned_seed_by_variant[id],e?.execution?.status,e?(Object.prototype.hasOwnProperty.call(e,"harness_valid")?e.harness_valid:e.valid):null,e?Boolean(e.post_terminal_review):null,e?Boolean(e.collector_review):null,e?(e.harness_result_origin||"harbor"):null,e?.measured_protocol?.timeout_s,e?(e.measured_protocol?.requested_timeout_s??e.measured_protocol?.timeout_s):null,e?Boolean(e.collector_review?.operational_wall_time_adjustment):null,e?.steps,e?.measured_protocol?.max_steps,plannedProtocol(t,id).max_control_steps,currentBudget(t)]);
407
+ }
408
+ const csv=rows.map(row=>row.map(v=>'"'+String(v??'').replaceAll('"','""')+'"').join(',')).join('\r\n');
409
+ const url=URL.createObjectURL(new Blob([csv],{type:'text/csv;charset=utf-8'})),a=document.createElement('a');a.href=url;a.download='kinex-benchmark-'+variant+'.csv';a.click();setTimeout(()=>URL.revokeObjectURL(url),1000);
410
+ }
411
+ function showImage(index) {
412
+ if(!imageItems.length)return;imageIndex=(index+imageItems.length)%imageItems.length;const item=imageItems[imageIndex];$('#large-image').src=item.url;$('#image-original').href=item.url;$('#image-caption').textContent=`${imageIndex+1} / ${imageItems.length} · ${item.label}`;if(!$('#image-viewer').open)$('#image-viewer').showModal();
413
+ }
414
+ $('#main').addEventListener('click',async event=>{
415
+ const b=event.target.closest('button,a');if(!b)return;
416
+ if(b.dataset.matrix){expandedModels=new Set($$('[data-model-group][open]').map(x=>x.dataset.modelGroup));matrixMetric=b.dataset.matrix;$('#comparison-mount').innerHTML=comparisonTable();}
417
+ if(b.dataset.familyLink){filters.family=b.dataset.familyLink;filters.query='';filters.status='';if(location.hash==='#tasks'){overview();$('#tasks').scrollIntoView();}}
418
+ if(b.dataset.reportFamily){filters.family=filters.family===b.dataset.reportFamily?'':b.dataset.reportFamily;$('#task-family').value=filters.family;$$('[data-report-family]').forEach(x=>x.classList.toggle('active',x.dataset.reportFamily===filters.family));renderRows();$('#tasks').scrollIntoView({behavior:'smooth'});}
419
+ if(b.id==='reset-filters'||b.hasAttribute('data-reset'))resetFilters();
420
+ if(b.dataset.export)exportCSV(b.dataset.export);
421
+ if(b.dataset.instruction){$$('[data-instruction]').forEach(x=>x.setAttribute('aria-pressed',x===b));$$('.instruction-version').forEach(x=>x.hidden=x.id!=='instruction-'+b.dataset.instruction);}
422
+ if(b.id==='final-frame'){const v=$('#episode-video');if(v.readyState<1)await new Promise(r=>v.addEventListener('loadedmetadata',r,{once:true}));v.pause();v.currentTime=Math.max(0,v.duration-.001);}
423
+ if(b.dataset.sessionView){sessionState.view=b.dataset.sessionView;sessionState.count=40;$$('[data-session-view]').forEach(x=>x.setAttribute('aria-pressed',x===b));renderSession();}
424
+ if(b.id==='more-events'){sessionState.count+=40;renderSession();}
425
+ if(b.hasAttribute('data-image'))showImage(+b.dataset.image);
426
+ if(b.hasAttribute('data-resource'))loadResource(+b.dataset.resource,epoch);
427
+ if(b.hasAttribute('data-retry-session'))loadSession(current.ep,epoch);
428
+ if(b.id==='copy-resource'){if(current.resourceText!=null){try{await navigator.clipboard.writeText(current.resourceText);showToast('File copied to clipboard');}catch{showToast('Copy unavailable. Use Open file to select the text.');}}}
429
+ });
430
+ $('#main').addEventListener('input',event=>{
431
+ if(event.target.id==='task-search'){filters.query=event.target.value;renderRows();}
432
+ if(event.target.id==='event-search'){sessionState.query=event.target.value;sessionState.count=40;renderSession();}
433
+ });
434
+ $('#main').addEventListener('change',async event=>{
435
+ const {id,value}=event.target;
436
+ if(id==='task-family'){filters.family=value;renderRows();$$('[data-report-family]').forEach(x=>x.classList.toggle('active',x.dataset.reportFamily===value));}
437
+ if(id==='task-variant'){filters.variant=value;renderRows();}
438
+ if(id==='task-status'){filters.status=value;renderRows();}
439
+ if(id==='task-sort'){filters.sort=value;renderRows();}
440
+ if(id==='playback-speed')$('#episode-video').playbackRate=Number(value);
441
+ if(id==='event-filter'){sessionState.filter=value;sessionState.count=40;renderSession();}
442
+ if(id==='evidence-select'){
443
+ const preview=$('#evidence-preview'),token=epoch;preview.hidden=!value;if(!value)return;preview.textContent='Loading evidence…';
444
+ try{const text=await fetchText(current.ep.links[value]);if(token!==epoch||$('#evidence-select').value!==value)return;try{preview.textContent=JSON.stringify(JSON.parse(text),null,2);}catch{preview.textContent=text;}}
445
+ catch(e){if(token===epoch)preview.textContent='Preview unavailable: '+e.message;}
446
+ }
447
+ });
448
+ $('#close-viewer').onclick=()=>$('#image-viewer').close();$('#previous-image').onclick=()=>showImage(imageIndex-1);$('#next-image').onclick=()=>showImage(imageIndex+1);
449
+ $('#image-viewer').addEventListener('click',event=>{if(event.target===$('#image-viewer'))$('#image-viewer').close();});
450
+ $('#image-viewer').addEventListener('keydown',event=>{if(event.key==='ArrowLeft'){event.preventDefault();showImage(imageIndex-1);}if(event.key==='ArrowRight'){event.preventDefault();showImage(imageIndex+1);}});
451
+ let catalogInstructionAudit={tasks:[],families:[]};
452
+ let measuredInstructions={episodes:{}};
453
+ let evidenceRoot = '';
454
+ const evidenceURL = path => {
455
+ if (typeof path !== 'string' || !evidenceRoot || path.endsWith('.html')) return path;
456
+ if (/^(?:experiments|official|policy-contract|research|data|history|probes|hard)\//.test(path) || /^[a-zA-Z0-9_-]+\.json$/.test(path)) return new URL(path, evidenceRoot).href;
457
+ return path;
458
+ };
459
+ // Resolve published file references for display; downloaded evidence remains byte-identical.
460
+ function resolveEvidence(value) {
461
+ if (typeof value === 'string') return evidenceURL(value);
462
+ if (Array.isArray(value)) return value.map(resolveEvidence);
463
+ if (value && typeof value === 'object') return Object.fromEntries(Object.entries(value).map(([key, item]) => [key, resolveEvidence(item)]));
464
+ return value;
465
+ }
466
+ let resultFiles = {};
467
+ const resultURL = name => evidenceURL(resultFiles[name]?.url || name);
468
+ let policyRecord=null;
469
+ function policyShell(ep) {
470
+ return `<section class="panel session-panel"><div class="section-heading"><div><h2>VLA input/output</h2><p>${number(ep.vla_calls)} recorded inferences · model inputs, action outputs and agent tool results.</p></div><div class="inline-links">${external(ep.links.vla_io,'All calls JSON')}${external(ep.links.policy_trace,'Original trace')}</div></div><div class="policy-body" id="policy-body">Loading recorded calls…</div></section>`;
471
+ }
472
+ async function loadPolicy(ep,token) {
473
+ try {const response=await fetch(ep.links.vla_io);if(!response.ok)throw Error(response.status);const record=resolveEvidence(await response.json());if(token!==epoch)return;policyRecord=record;renderPolicy(0);}catch(e){if(token===epoch)$('#policy-body').textContent='Preview unavailable: '+e.message;}
474
+ }
475
+ function jsonBlock(title,value,open=false) {return `<details class="tool-block" ${open?'open':''}><summary>${esc(title)}</summary><pre>${esc(JSON.stringify(value,null,2))}</pre></details>`;}
476
+ function renderPolicy(index) {
477
+ const record=policyRecord,c=record.calls[index],ep=current.ep;
478
+ if(ep.provider==='robotwin-official')return renderOfficialPolicy(index);
479
+ if(!c){$('#policy-body').innerHTML='<div class="empty-state">No VLA inference was made in this episode.</div>';return;}
480
+ const images=c.images.map(im=>`<figure><a href="${esc(im.model_image)}" target="_blank"><img src="${esc(im.model_image)}" alt="${esc(im.camera)} model input, call ${index+1}"></a><figcaption>${esc(im.camera)} · ${im.model_size.join(' × ')}<br><a href="${esc(im.recorded)}" target="_blank">Recorded RGB · ${im.recorded_size.join(' × ')} ↗</a></figcaption></figure>`).join('');
481
+ const caller=c.caller;
482
+ const textParts=p=>(p||[]).filter(x=>x.type!=='image');
483
+ const toolImages=caller?caller.tool_result.parts.filter(p=>p.type==='image').map(p=>{const url=new URL(p.src,new URL(ep.links.transcript,location.href)).href;return `<a href="${esc(url)}" target="_blank"><img src="${esc(url)}" alt="Observation returned to the language agent" style="width:240px;max-width:100%"></a>`;}).join(''):'';
484
+ const cols=record.contract.output_layout;
485
+ $('#policy-body').innerHTML=`<label>Inference <select class="policy-select" id="policy-call" aria-label="VLA inference">${record.calls.map((x,i)=>`<option value="${i}" ${i===index?'selected':''}>${i+1} / ${record.calls.length} · ${x.call_id.slice(0,12)} · ${String(x.request.task||'').trim().toLowerCase().replace(/\s+/g,' ').replace(/[.!?]+$/,'')===String(ep.instruction||'').trim().toLowerCase().replace(/\s+/g,' ').replace(/[.!?]+$/,'')?'full task':'caller task'}</option>`).join('')}</select></label><div class="inline-links"><code>${esc(c.call_id)}</code><span>${c.service_response.inference_s.toFixed(3)} s · ${(c.service_response.waypoints||c.service_response.actions).length} × ${(c.service_response.waypoints||c.service_response.actions)[0].length} actions</span></div><h3>Task instruction</h3><div class="instruction-text">${esc(c.request.task)}</div><div class="policy-images">${images}</div><p class="subtle">${esc(record.contract.image_preprocessing||"Model images follow the recorded checkpoint preprocessing.")} Additional information reaches the model only when present in the request and rendered language below.</p>${jsonBlock('Complete model-service request',c.request)}${c.model_input_text!==undefined?jsonBlock('Language passed to predict_action · recorded',c.model_input_text,true):''}${jsonBlock('Backbone message · reconstructed from executed code',c.backbone_messages)}<h3>Model-service output</h3><p class="subtle">${c.service_response.waypoints?'Untimed joint waypoints consumed by the recorded caller. Kinex or agent-authored code determines their physical timing.':'The recorded action response consumed by the caller.'} Joint values are absolute radians; grippers use −1 open, +1 closed.</p><div class="policy-table"><table><thead><tr><th>Action</th>${cols.map(x=>`<th>${esc(x.replace('left_','L ').replace('right_','R '))}</th>`).join('')}</tr></thead><tbody>${(c.service_response.waypoints||c.service_response.actions).map((row,i)=>`<tr><th>${i+1}</th>${row.map(x=>`<td title="${x}">${x.toFixed(5)}</td>`).join('')}</tr>`).join('')}</tbody></table></div>${jsonBlock('Complete service response · full precision',c.service_response)}${c.execution?jsonBlock('Actual execution · target count and world time',{executor:c.planner,...c.execution},true):''}${jsonBlock('Internal diagnostic · denormalized training-order actions',c.internal_diagnostics.denormalized_actions)}${caller?`<h3>Kinex tool call & result</h3><p class="subtle">This inference is joined to the recorded tool call and result below. Agent-authored code may consume the model output directly; the language agent receives the displayed tool response.</p>${jsonBlock('Agent tool call',caller.tool_call,true)}${jsonBlock('Tool result received by the language agent',{...caller.tool_result,parts:textParts(caller.tool_result.parts)},true)}<div class="inline-links">${toolImages}<a href="${taskRoute(ep.task_key,ep.variant,'session')}">Read the full session ↗</a><a href="${taskRoute(ep.task_key,ep.variant,'artifacts')}">Inspect agent artifacts ↗</a></div>${c.executed_tool_source?jsonBlock('Agent-authored code at this call',c.executed_tool_source):''}`:'<p class="subtle">Standalone execution; no language-agent tool call.</p>'}<details class="tool-block"><summary>Recording coverage & model contract</summary><p>See the per-run contract below for recorded and reconstructed fields. Original requests and rendered language are retained in the current rich-input run; older runs have different recording coverage.</p><pre>${esc(JSON.stringify(record.contract,null,2))}</pre><div class="inline-links">${external(record.contract.model_metadata,'Model configuration')}${external(record.contract.executed_sources,'Executed source checksums')}${external(record.contract.model_service_source||'policy-contract/model_node.py','Model service')}${external(record.contract.adapter_source||'policy-contract/starvla.py','Policy adapter')}${external(record.contract.helper_source||'policy-contract/kinex_policy.py','Kinex run_policy')}</div></details>`;
486
+ $('#policy-call').onchange=e=>renderPolicy(Number(e.target.value));
487
+ }
488
+ function toolsShell(ep) {return `<section class="panel session-panel"><div class="section-heading"><div><h2>Tool calls</h2><p>Original tool inputs and outputs from the agent trace.</p></div>${external(ep.links.tool_calls,'Tool calls JSON')}</div><div class="policy-body" id="tools-body">Loading tool calls…</div></section>`;}
489
+ async function loadTools(ep,token) {
490
+ try{const r=await fetch(ep.links.tool_calls);if(!r.ok)throw Error(r.status);const calls=await r.json();if(token!==epoch)return;$('#tools-body').innerHTML=calls.length?calls.map((c,i)=>`<details class="tool-block"><summary>${i+1} · ${esc(c.name)}${c.is_error?' · Error':''}</summary><p><code>${esc(c.call_id)}</code></p><h3>Input</h3><pre>${esc(JSON.stringify(c.input,null,2))}</pre><h3>Output</h3><pre>${esc(typeof c.output==='string'?c.output:JSON.stringify(c.output,null,2))}</pre></details>`).join(''):'<div class="empty-state">No language-agent tool calls in this episode.</div>';}catch(e){if(token===epoch)$('#tools-body').textContent='Preview unavailable: '+e.message;}
491
+ }
492
+
493
+ async function boot(){try{
494
+ const source=await fetch('data-source.json');if(!source.ok)throw Error('Result source unavailable');
495
+ const sourceConfig=await source.json();evidenceRoot=sourceConfig.evidence_root;resultFiles=sourceConfig.files;
496
+ document.querySelectorAll('[data-result-file]').forEach(link=>{link.href=resultURL(link.dataset.resultFile);});
497
+ const r=await fetch(resultURL('data.json'));if(!r.ok)throw Error('HTTP '+r.status);data=resolveEvidence(await r.json());
498
+ const ir=await fetch(resultURL('measured-instructions.json'));if(!ir.ok)throw Error('Instruction evidence unavailable');measuredInstructions=resolveEvidence(await ir.json());
499
+ const nr=await fetch(resultURL('instruction-audit.json'));if(!nr.ok)throw Error('Instruction audit unavailable');catalogInstructionAudit=resolveEvidence(await nr.json());
500
+ try{const c=await fetch(resultURL('cost-data.json'));if(c.ok)UsageMetrics.init(resolveEvidence(await c.json()));}catch{UsageMetrics.init({episodes:{},sources:[]});}
501
+ for(const task of data.tasks){
502
+ if(task.family==='task02'){
503
+ const {suite_name,task_id}=task.native_identity;
504
+ task.title=`LIBERO-${suite_name.replace(/^libero_/, '')}-${String(task_id+1).padStart(2,'0')}`;
505
+ }
506
+ }
507
+ window.benchmarkData=data;$('#updated').textContent='Results updated '+data.updated_at.slice(0,10);window.addEventListener('hashchange',route);route();}catch(e){$('#main').innerHTML=`<div class="empty-state"><h2>Results could not load</h2><p>${esc(e.message)}</p><a href="${esc(resultURL('data.json'))}">Download the results index</a></div>`;}}
508
+ boot();
509
+
510
+ function renderOfficialPolicy(index) {
511
+ const r=policyRecord,c=r.calls[index],ep=current.ep;
512
+ const ims=c.images.map(im=>`<figure><a href="${esc(im.model_image)}" target="_blank"><img src="${esc(im.model_image)}" alt="${esc(im.camera)} model input"></a><figcaption>${esc(im.camera)} · ${im.model_size.join(' × ')}<br><a href="${esc(im.recorded)}" target="_blank">Recorded RGB · ${im.recorded_size.join(' × ')} ↗</a></figcaption></figure>`).join('');
513
+ $('#policy-body').innerHTML=`<label>Inference <select class="policy-select" id="policy-call" aria-label="VLA inference">${r.calls.map((x,i)=>`<option value="${i}" ${i===index?'selected':''}>${i+1} / ${r.calls.length} · action ${x.native_step}</option>`).join('')}</select></label><div class="inline-links"><code>${esc(c.call_id)}</code><span>${c.service_response.inference_s.toFixed(3)} s · ${(c.service_response.waypoints||c.service_response.actions).length} × ${(c.service_response.waypoints||c.service_response.actions)[0].length} actions</span></div><h3>Task instruction</h3><div class="instruction-text">${esc(c.request.task)}</div><div class="policy-images">${ims}</div><p class="subtle">Exact transmitted RGB pixels. No joint state or agent conversation is passed to the VLA.</p>${jsonBlock('Complete model request · image arrays linked as PNGs',c.request.wire_payload)}<h3>Native action chunk</h3><p class="subtle">Reordered model output consumed by the official evaluator. Absolute joint radians; gripper opening: 0 closed, 1 open.</p><div class="policy-table"><table><thead><tr><th>Action</th>${r.contract.output_layout.map(x=>`<th>${esc(x.replace('left_','L ').replace('right_','R '))}</th>`).join('')}</tr></thead><tbody>${(c.service_response.waypoints||c.service_response.actions).map((row,i)=>`<tr><th>${i+1}</th>${row.map(x=>`<td title="${x}">${x.toFixed(5)}</td>`).join('')}</tr>`).join('')}</tbody></table></div>${jsonBlock('Complete recorded StarVLA response · full precision',c.raw_response)}${jsonBlock('Reordered native actions · full precision',c.service_response.actions)}<p class="subtle">Standalone execution; no language-agent session or tool call. Token and API costs cover the language agent only; local GPU cost is not reported.</p>${jsonBlock('Recording coverage & model contract',r.contract)}<div class="inline-links">${external(r.contract.model_metadata,'Model configuration')}${external(r.contract.executed_sources,'Source identities')}${external(r.contract.adapter_source||'official/adapters.py','Policy adapter')}${external(r.contract.integration_source||'official/integrations.py','Official evaluator integration')}</div>`;
514
+ $('#policy-call').onchange=e=>renderPolicy(Number(e.target.value));
515
+ }
hard/assets/anthropic-logo.svg ADDED
hard/assets/kinex-logo-night.svg ADDED
hard/assets/kinex-logo.svg ADDED
hard/assets/openai-logo.svg ADDED
hard/assets/vla-logo.svg ADDED
hard/data-source.json ADDED
@@ -0,0 +1,23 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "schema": "programvla/dataset-source/1",
3
+ "dataset": "RLE-Bench/programmable-vla",
4
+ "revision": "b07d88579523eeeefdf7ad2ca14ee65340af5d4e",
5
+ "evidence_root": "https://huggingface.co/datasets/RLE-Bench/programmable-vla/resolve/b07d88579523eeeefdf7ad2ca14ee65340af5d4e/",
6
+ "files": {
7
+ "data.json": {
8
+ "url": "https://huggingface.co/datasets/RLE-Bench/programmable-vla/resolve/b07d88579523eeeefdf7ad2ca14ee65340af5d4e/hard/data.json"
9
+ },
10
+ "cost-data.json": {
11
+ "url": "https://huggingface.co/datasets/RLE-Bench/programmable-vla/resolve/b07d88579523eeeefdf7ad2ca14ee65340af5d4e/hard/cost-data.json"
12
+ },
13
+ "measured-instructions.json": {
14
+ "url": "https://huggingface.co/datasets/RLE-Bench/programmable-vla/resolve/b07d88579523eeeefdf7ad2ca14ee65340af5d4e/hard/measured-instructions.json"
15
+ },
16
+ "instruction-audit.json": {
17
+ "url": "https://huggingface.co/datasets/RLE-Bench/programmable-vla/resolve/b07d88579523eeeefdf7ad2ca14ee65340af5d4e/hard/instruction-audit.json"
18
+ },
19
+ "sources.json": {
20
+ "url": "https://huggingface.co/datasets/RLE-Bench/programmable-vla/resolve/b07d88579523eeeefdf7ad2ca14ee65340af5d4e/hard/sources.json"
21
+ }
22
+ }
23
+ }
hard/icon.svg ADDED
hard/index.html ADDED
@@ -0,0 +1,24 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1">
6
+ <meta name="description" content="Compare coding agents on physical tasks. Native success rates, token usage, recorded behavior, full sessions and reproducible evidence.">
7
+ <meta name="theme-color" content="#756ee4">
8
+ <title>RoboTwin 2.0 Hard — Programmable VLA</title>
9
+ <link rel="icon" href="icon.svg" type="image/svg+xml">
10
+ <link rel="stylesheet" href="style.css?v=bd1a59147e1d">
11
+ <script src="usage-metrics.js?v=330e92f8eb96" defer></script>
12
+ <script src="app.js?v=hard-20261101" defer></script>
13
+ <link rel="stylesheet" href="policy.css">
14
+ </head>
15
+ <body>
16
+ <a class="skip" href="#main">Skip to content</a>
17
+ <header class="site-header"><div class="header-inner"><a class="brand" href="#overview" aria-label="Programmable VLA home"><img src="assets/kinex-logo.svg" width="34" height="34" alt="Kinex"><span>programmable<span class="brand-divider">/</span><span class="brand-benchmark">vla</span></span></a><nav aria-label="Main navigation"><a href="../index.html#overview">Easy</a><a href="#overview" data-nav="overview">Hard</a><a href="#tasks" data-nav="tasks">Explore tasks</a><a href="#methodology" data-nav="methodology">Protocol</a></nav><a class="header-link" href="https://huggingface.co/spaces/RLE-Bench/programmable-vla" target="_blank" rel="noopener">Hugging Face <span aria-hidden="true">↗</span></a></div></header>
18
+ <main id="main" tabindex="-1"><div class="loading"><span class="spinner"></span>Loading benchmark results…</div></main>
19
+ <footer class="site-footer"><div><img src="assets/kinex-logo.svg" width="22" height="22" alt=""><strong>Programmable VLA</strong><span class="footer-org">by RLE-Bench</span></div><div><a data-result-file="data.json" href="https://huggingface.co/datasets/RLE-Bench/programmable-vla/resolve/b07d88579523eeeefdf7ad2ca14ee65340af5d4e/hard/data.json" target="_blank">Hard results JSON</a><a data-result-file="sources.json" href="https://huggingface.co/datasets/RLE-Bench/programmable-vla/resolve/b07d88579523eeeefdf7ad2ca14ee65340af5d4e/hard/sources.json" target="_blank">Data sources</a><a href="https://huggingface.co/datasets/RLE-Bench/programmable-vla/resolve/b07d88579523eeeefdf7ad2ca14ee65340af5d4e/manifest.json" target="_blank">Manifest</a><span id="updated"></span></div></footer>
20
+ <dialog id="image-viewer" aria-labelledby="image-caption"><div class="viewer-toolbar"><span id="image-caption"></span><a id="image-original" target="_blank" rel="noopener">Open original ↗</a><button class="icon-button" id="close-viewer" aria-label="Close image">×</button></div><div class="viewer-image"><button id="previous-image" class="viewer-arrow" aria-label="Previous image">←</button><img id="large-image" alt="Recorded agent observation"><button id="next-image" class="viewer-arrow" aria-label="Next image">→</button></div><p>Recorded agent observation · Use ← → to browse · Esc to close</p></dialog>
21
+ <div id="toast" role="status" aria-live="polite"></div>
22
+ <noscript><p>This site needs JavaScript. <a data-result-file="data.json" href="https://huggingface.co/datasets/RLE-Bench/programmable-vla/resolve/b07d88579523eeeefdf7ad2ca14ee65340af5d4e/hard/data.json">Download the complete results index.</a></p></noscript>
23
+ </body>
24
+ </html>
hard/policy.css ADDED
@@ -0,0 +1,15 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /* Additional evidence panels share the reference benchmark components. */
2
+ .policy-body { padding: 24px; min-width: 0; }
3
+ .policy-images { display: grid; grid-template-columns: repeat(3,minmax(0,1fr)); gap: 14px; margin: 20px 0; }
4
+ .policy-images figure { margin: 0; min-width: 0; }
5
+ .policy-images img { width: 100%; image-rendering: auto; border-radius: 6px; }
6
+ .policy-images figcaption { font-size: 12px; color: var(--muted); margin-top: 6px; }
7
+ .policy-body pre { white-space: pre-wrap; overflow-wrap: anywhere; max-height: 600px; overflow: auto; font-size: 12px; }
8
+ .policy-body .tool-block { margin: 12px 0; }
9
+ .policy-body .policy-select { max-width: 100%; }
10
+ .policy-body .inline-links { flex-wrap: wrap; }
11
+ .policy-table { overflow: auto; margin: 16px 0; }
12
+ .policy-table table { font: 11px ui-monospace,monospace; width: max-content; min-width: 100%; }
13
+ .policy-table th,.policy-table td { padding: 6px 8px; text-align: right; }
14
+ .policy-table th { background: var(--surface); }
15
+ @media(max-width:600px) { .policy-body { padding: 16px; } .policy-images { gap: 8px; } }
hard/style.css ADDED
@@ -0,0 +1,107 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ :root{font-family:Inter,-apple-system,BlinkMacSystemFont,"Segoe UI",sans-serif;color:#272b34;background:#f7f8fb;font-size:14px;--ink:#272b34;--muted:#687083;--line:#e5e7ef;--purple:#756ee4;--purple-dark:#5d56ca;--lavender:#f0effd;--green:#1e755c;--red:#a14b47;--amber:#9c752f;--radius:14px;color-scheme:light;font-synthesis:none}*{box-sizing:border-box}body{margin:0}a{color:inherit;text-decoration:none}a:hover{color:var(--purple-dark)}button,input,select{font:inherit}button{cursor:pointer;color:inherit}button,a,input,select,summary{-webkit-tap-highlight-color:transparent}button:focus-visible,a:focus-visible,input:focus-visible,select:focus-visible,summary:focus-visible{outline:3px solid #b7b2ff;outline-offset:3px}button{border:0;background:none}h1,h2,h3,p{margin:0}h1,h2,h3{letter-spacing:-.035em}h1{font-size:47px;font-weight:680;line-height:1.13}h2{font-size:21px;font-weight:650}h3{font-size:15px;font-weight:650}p{line-height:1.65}small{font-size:11px}code,pre{font-family:ui-monospace,SFMono-Regular,Consolas,"Liberation Mono",monospace}code{font-size:.86em;overflow-wrap:anywhere}pre{margin:0;white-space:pre-wrap;overflow-wrap:anywhere;line-height:1.65;font-size:12px;font-variant-ligatures:none}[hidden]{display:none!important}.site-header{background:#fffffff2;border-bottom:1px solid var(--line);position:sticky;top:0;z-index:20;backdrop-filter:blur(12px)}.header-inner{max-width:1440px;margin:auto;padding:0 46px;min-height:78px;display:flex;align-items:center;gap:30px}.brand{display:flex;align-items:center;gap:12px;margin-right:auto;white-space:nowrap}.brand>span{font-size:23px;font-weight:730;letter-spacing:-.8px;display:flex;align-items:center;gap:11px}.brand-divider{font-size:21px;color:#d3d4df;font-weight:400}.brand-benchmark{font-size:16px;font-weight:500;letter-spacing:-.35px}.header-inner nav{display:flex;align-items:stretch;gap:25px;height:78px}.header-inner nav a{display:flex;align-items:center;border-bottom:2px solid transparent;font-size:12px;font-weight:550;color:#707686}.header-inner nav a[aria-current=page]{color:var(--purple-dark);border-color:var(--purple)}.header-link{font-size:11px;border-left:1px solid var(--line);padding-left:25px;color:#6c7281;white-space:nowrap}main{max-width:1440px;padding:34px 46px 60px;margin:auto;min-height:70vh;outline:none}main>section,main>div{min-width:0}.eyebrow{text-transform:uppercase;font-size:10px;letter-spacing:1.45px;font-weight:650;color:var(--purple);line-height:1.5}.hero{display:flex;align-items:center;justify-content:space-between;gap:40px;margin:7px 0 32px}.hero .eyebrow{margin-bottom:17px}.tiny-logo{font-size:15px;margin-right:4px}.hero h1 span{color:var(--purple)}.hero p{color:var(--muted);font-size:14px;line-height:1.7;margin-top:16px}.hero-facts{display:grid;grid-template-columns:repeat(3,1fr);gap:0;text-align:center;min-width:325px;margin-top:40px}.hero-facts>div{padding:0 20px;border-left:1px solid var(--line)}.hero-facts>div:first-child{border:0}.hero-facts strong{display:block;font-size:29px;letter-spacing:-1px;font-weight:600;line-height:1.4}.hero-facts>div span{font-size:10px;white-space:nowrap;color:var(--muted)}.progress-label{grid-column:1/-1;font-size:10px;color:var(--muted);margin-top:25px;display:flex;align-items:center;justify-content:center;gap:7px}.progress-label i{width:6px;height:6px;background:var(--purple);border-radius:50%}.agent-cards{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:14px}.agent-card{position:relative;display:block;border:1px solid var(--line);border-radius:var(--radius);background:#fff;padding:19px 21px 17px;overflow:hidden;box-shadow:0 3px 5px #29274903;transition:transform .18s,border-color .18s,box-shadow .18s}.agent-card:before{content:"";position:absolute;top:0;left:0;right:0;height:3px;background:var(--variant)}.agent-card:hover{color:inherit;transform:translateY(-3px);border-color:var(--variant);box-shadow:0 8px 22px #3029660c}.card-header{display:flex;align-items:center;justify-content:space-between;gap:5px}.agent-name,.agent-inline{display:flex;align-items:center;gap:9px;font-weight:650}.agent-name{font-size:15px}.agent-logo{object-fit:contain;flex-shrink:0}.state-label{font-size:8px;letter-spacing:.7px;text-transform:uppercase;color:var(--muted);border:1px solid var(--line);border-radius:4px;padding:3px 5px}.card-model{font-size:11px;color:var(--muted);margin-top:9px}.separator{color:#c7c7d8;margin:0 3px}.card-rate{display:flex;align-items:baseline;gap:9px;margin:24px 0 16px}.card-rate strong{font-size:35px;font-weight:600;letter-spacing:-1.6px;font-variant-numeric:tabular-nums;color:var(--variant);line-height:1}.card-rate>span{font-size:10px;color:var(--muted)}.card-stats{display:flex;justify-content:space-between;gap:8px;font-size:10px;color:var(--muted)}.card-stats b{font-weight:600;color:#535a6a}.completion-track{height:4px;background:#eff0f5;border-radius:5px;overflow:hidden;margin:13px 0}.completion-track>span{display:block;height:100%;background:var(--variant,var(--purple));border-radius:5px}.card-bottom{display:flex;justify-content:space-between;gap:8px;font-size:10px;color:var(--muted)}.card-bottom>span:last-child{color:var(--variant);font-weight:600}.planned .card-rate strong{color:#b9bccb}.scope-note{display:flex;justify-content:space-between;gap:15px;font-size:10px;color:var(--muted);line-height:1.6;margin:14px 0 26px}.scope-note>span:first-child{display:flex;align-items:center;gap:7px}.scope-note .status-dot{background:#b1afc8}.scope-note.single{display:block;margin:17px 0 28px;max-width:1050px;font-size:11px}.panel{background:#fff;border:1px solid var(--line);border-radius:var(--radius);overflow:hidden;margin-bottom:24px}.section-heading{display:flex;align-items:center;justify-content:space-between;gap:22px;padding:23px 25px}.section-heading .eyebrow{margin-bottom:5px}.section-heading p{font-size:11px;color:var(--muted);margin-top:6px}.section-heading.bare{padding:0;margin-bottom:17px}.segmented{display:inline-flex;flex-shrink:0;align-items:center;background:#f4f5f9;border:1px solid #eeeff4;border-radius:7px;padding:3px;gap:2px}.segmented button{padding:7px 10px;border-radius:5px;color:var(--muted);font-size:10px;white-space:nowrap;font-weight:550}.segmented button[aria-pressed=true]{color:var(--purple-dark);background:#fff;box-shadow:0 1px 4px #20202f0a}.table-scroll{overflow-x:auto;overscroll-behavior-x:contain}table{width:100%;border-collapse:collapse;table-layout:fixed}th,td{padding:15px 22px;text-align:left;border-bottom:1px solid #eef0f5;vertical-align:middle;font-size:12px}thead th{font-size:11px;font-weight:600;color:#646b7a;background:#fafbfe;border-top:1px solid var(--line);padding-top:14px;padding-bottom:14px}th small,td small{display:block;font-size:10px;color:var(--muted);font-weight:400;line-height:1.5;margin-top:4px}tbody th{font-weight:550}tbody tr:last-child>*{border-bottom:0}tbody tr:hover{background:#fafbfe}.comparison-table th:first-child{width:25%}.comparison-table th:not(:first-child),.comparison-table td{text-align:center}.comparison-table td{padding:0}.comparison-table tbody th a{display:flex;align-items:center;gap:9px}.comparison-table tbody th small{padding-left:28px}.family-code{font-family:ui-monospace,monospace;color:#b5b9c8;font-size:10px}.subtle-arrow{color:#b2b5c8;font-size:10px}.comparison-cell{display:block;padding:14px 30px;min-height:83px}.comparison-cell:hover{background:#f2f1fd}.comparison-cell>div:first-child{display:flex;align-items:baseline;justify-content:center;gap:7px;white-space:nowrap}.comparison-cell strong{font-size:17px;font-weight:600;letter-spacing:-.5px;font-variant-numeric:tabular-nums}.comparison-cell>div>span{font-size:10px;color:var(--muted)}.comparison-cell>small{display:block;font-size:9px;color:#707587;margin-top:5px}.mini-track{height:3px;background:#eef0f5;border-radius:4px;overflow:hidden;margin-top:9px}.mini-track span{height:100%;display:block;border-radius:4px}.empty-cell strong{color:#b9becc}.empty-cell{color:var(--muted)}.token-table th:first-child{width:25%}.token-table th:not(:first-child),.token-table td{text-align:right;font-variant-numeric:tabular-nums}.token-table td{font-weight:550;font-size:13px}.token-table strong{font-size:15px;color:var(--purple-dark);font-weight:650}.token-table .agent-inline{text-align:left;line-height:1.5;font-size:12px}.token-track{display:flex;width:100%;height:5px;margin-top:9px;gap:0;border-radius:3px;background:#f4f5f9;overflow:hidden}.token-track i{display:block;height:100%;min-width:0}.cached{background:#c2bef7}.uncached{background:#7770de}.output{background:#3a859f}.panel-footnote{border-top:1px solid var(--line);padding:14px 25px;display:flex;justify-content:space-between;align-items:flex-start;gap:30px}.panel-footnote p{font-size:10px;color:var(--muted);max-width:750px;line-height:1.6}.legend{display:flex;gap:13px;font-size:9px;color:var(--muted);white-space:nowrap}.legend i{width:6px;height:6px;display:inline-block;margin-right:5px;border-radius:2px}.task-browser{margin-top:35px;scroll-margin-top:102px}.heading-count{display:inline-block;vertical-align:middle;font-size:11px;letter-spacing:0;font-weight:500;background:#ecebf9;color:var(--purple);padding:4px 7px;border-radius:5px;margin-left:6px}.button{display:inline-flex;justify-content:center;align-items:center;gap:6px;font-size:11px;line-height:1.5;font-weight:550;border:1px solid var(--line);border-radius:6px;padding:9px 12px;background:white;color:#5f6779;white-space:nowrap}.button:hover{border-color:#c1bcec;background:#f9f8fe;color:var(--purple-dark)}.button.small{padding:6px 9px;font-size:10px}.button.secondary{background:#fff}.text-button{font-size:11px;color:var(--purple-dark);font-weight:550;padding:0}.text-button:hover{text-decoration:underline}.filters{display:flex;align-items:center;gap:9px;padding:17px 20px;flex-wrap:wrap}.search-field{display:flex;align-items:center;flex:1;min-width:220px;gap:8px;background:#f8f9fc;border:1px solid var(--line);border-radius:7px;padding:0 10px}.search-field>span{font-size:23px;color:#a1a7b7;line-height:1}.search-field input{border:0;background:transparent;width:100%;min-width:0;padding:10px 0;outline-offset:1px}input,select{font-size:11px;padding:9px 10px;color:#606879;border:1px solid var(--line);border-radius:6px;background:#fff;min-width:0}input::placeholder{color:#a1a6b5}select{max-width:100%;cursor:pointer}.task-table th:first-child{width:38%}.task-table th:not(:first-child),.task-table td{text-align:center}.task-table th small{font-size:9px}.task-title{display:block;font-size:12px;line-height:1.65;font-weight:550}.row-arrow{color:#a5a7bc;opacity:0;padding-left:5px}.task-title:hover .row-arrow{opacity:1}.task-meta{display:flex;align-items:center;gap:7px;flex-wrap:wrap;color:#707587;font-size:9px;margin-top:5px;font-weight:400}.task-meta code{font-size:9px}.native-marker{color:#8a642c;font-size:8px;white-space:nowrap}.focus-column{background:#756ee407}.badge{font-size:10px;font-weight:550;display:inline-flex;align-items:center;gap:5px;line-height:1.4;border-radius:5px;padding:5px 8px;background:#f2f3f7;color:#687083;white-space:nowrap}.status-dot{display:inline-block;width:5px;height:5px;border-radius:50%;background:currentColor;flex-shrink:0}.badge.pass{background:#eaf5f0;color:var(--green)}.badge.fail{background:#faefed;color:var(--red)}.badge.invalid{background:#fff4e4;color:#a78345}a.badge:hover{box-shadow:0 0 0 1px currentColor}.badge.pending .status-dot{background:none;border:1px solid currentColor;width:6px;height:6px}.table-footer{padding:13px 22px;display:flex;justify-content:space-between;gap:15px;border-top:1px solid var(--line);font-size:10px;color:var(--muted);flex-wrap:wrap}.table-footer .text-button{font-size:10px}.numeric{font-variant-numeric:tabular-nums}.methodology{margin-top:32px;scroll-margin-top:98px}.methodology>summary{list-style:none;display:flex;align-items:center;justify-content:space-between;gap:20px;padding:24px 25px;cursor:pointer}.methodology summary .eyebrow{display:block;margin-bottom:6px}.methodology summary strong{font-size:16px;letter-spacing:-.4px}.summary-plus{font-size:23px;color:#a4a1cc;font-weight:300}.methodology[open] .summary-plus{transform:rotate(45deg)}.method-grid{display:grid;grid-template-columns:1fr 1fr;gap:26px 35px;padding:2px 25px 25px}.method-grid h3{font-size:12px;margin-bottom:7px}.method-grid p{font-size:11px;color:var(--muted)}.method-links{display:flex;gap:24px;padding:18px 25px;border-top:1px solid var(--line);font-size:11px;color:var(--purple-dark);flex-wrap:wrap}.breadcrumbs{display:flex;align-items:center;gap:10px;font-size:11px;color:var(--muted);margin:0 0 25px;flex-wrap:wrap}.breadcrumbs>span:nth-child(even){color:#c4c7d2}.variant-tabs{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:10px;margin-bottom:28px}.variant-tab{padding:13px 16px;border:1px solid var(--line);background:white;border-radius:9px;display:block}.variant-tab:hover{border-color:#b5aff1}.variant-tab.active{border-color:var(--purple);background:#f3f2ff;box-shadow:0 0 0 2px #756ee409}.tab-agent{display:flex;align-items:center;gap:8px;font-size:12px;min-width:0}.tab-agent .badge{margin-left:auto;font-size:9px;padding:3px 5px}.tab-agent img,.tab-agent .agent-logo{object-fit:contain;flex-shrink:0}.tab-model{display:block;color:var(--muted);font-size:10px;margin-top:7px;padding-left:27px}.report-hero{display:flex;justify-content:space-between;align-items:center;gap:20px;margin:8px 0 25px}.report-hero .eyebrow{margin-bottom:10px}.report-hero h1{font-size:34px;letter-spacing:-1.2px}.report-hero p{font-size:12px;color:var(--muted);margin-top:10px}.muted-times{color:#b7b7cc;font-weight:400;padding:0 3px}.report-metrics{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));border:1px solid var(--line);background:#fff;border-radius:var(--radius);margin:25px 0 20px;padding:20px 0}.metric{padding:0 23px;border-right:1px solid var(--line);min-width:0}.metric:last-child{border:0}.metric-label{display:block;font-size:10px;color:var(--muted);margin-bottom:8px;font-weight:500}.metric>strong{display:block;font-size:26px;line-height:1.2;font-weight:620;letter-spacing:-.85px;font-variant-numeric:tabular-nums}.metric>small{display:block;font-size:9px;color:#707587;margin-top:7px;line-height:1.5}.family-cards{display:grid;grid-template-columns:repeat(6,minmax(0,1fr));gap:10px}.family-card{text-align:left;background:white;border:1px solid var(--line);border-radius:9px;padding:14px}.family-card:hover,.family-card.active{border-color:#b3acef;background:#faf9ff}.family-card>div:first-child{display:flex;justify-content:space-between;gap:10px;font-size:11px}.family-card strong{font-weight:600}.family-card>div>span{color:var(--purple);font-weight:550;font-variant-numeric:tabular-nums}.family-card small{display:block;font-size:9px;color:var(--muted);margin-top:8px}.family-card .mini-track{margin-top:12px}.task-heading{display:flex;justify-content:space-between;align-items:flex-start;gap:20px;margin-bottom:25px}.task-heading .eyebrow{margin-bottom:11px}.task-heading h1{font-size:32px;line-height:1.25;letter-spacing:-1px}.task-heading p{margin-top:9px;color:var(--muted);font-size:12px}.task-arrows{display:flex;gap:6px;flex-shrink:0}.task-arrows .button{padding:8px 12px;font-size:14px}.detail-nav{display:flex;align-items:center;gap:23px;border-bottom:1px solid var(--line);margin-bottom:23px;overflow-x:auto;white-space:nowrap;scrollbar-width:thin}.detail-nav a,.disabled-tab{display:inline-flex;align-items:center;gap:6px;padding:0 1px 14px;font-size:12px;font-weight:550;border-bottom:2px solid transparent;flex-shrink:0}.detail-nav a.active{color:var(--purple-dark);border-bottom-color:var(--purple)}.detail-nav a>span{background:#edecf8;padding:2px 5px;border-radius:4px;color:#8b86ad;font-size:9px;font-weight:500}.disabled-tab{color:#b6bbc8;font-weight:400}.detail-model{font-size:10px;color:var(--muted);margin-left:auto;padding:0 0 14px}.episode-layout{display:grid;grid-template-columns:minmax(0,1fr) 290px;gap:22px;align-items:start}.video-panel{border:1px solid var(--line);border-radius:var(--radius);background:#fff;overflow:hidden}.video-caption{display:flex;align-items:center;justify-content:space-between;padding:12px 16px;font-size:9px;color:var(--muted);gap:10px}.video-caption>span:first-child{display:flex;align-items:center;gap:6px;font-weight:550}.video-caption .status-dot{color:var(--purple)}video{display:block;width:100%;max-height:610px;background:#161822;object-fit:contain}.video-toolbar{padding:12px 15px;display:flex;justify-content:space-between;align-items:center;gap:10px;flex-wrap:wrap}.video-toolbar>div{display:flex;gap:7px}.video-toolbar label{font-size:10px;color:var(--muted);display:flex;align-items:center;gap:8px}.video-toolbar select{padding:6px;font-size:10px}.media-note{font-size:9px;color:var(--muted);line-height:1.65;margin:10px 2px 0}.result-panel{padding:20px;margin:0}.result-head{display:flex;align-items:center;justify-content:space-between;gap:10px;margin-bottom:21px}.result-head .eyebrow{font-size:9px}.result-number{font-size:30px;letter-spacing:-1px;font-weight:620;line-height:1.2}.result-number>span{display:block;font-size:11px;letter-spacing:0;font-weight:400;color:var(--muted);margin-top:4px}.result-panel .completion-track{margin:15px 0 20px;height:3px}.facts{display:grid;grid-template-columns:1fr 1fr;gap:12px 8px;margin:0;font-size:11px;line-height:1.5}.facts dt{color:var(--muted)}.facts dd{margin:0;text-align:right;font-variant-numeric:tabular-nums;overflow-wrap:anywhere}.result-links{border-top:1px solid var(--line);margin-top:18px;padding-top:16px;display:flex;gap:14px;font-size:10px;color:var(--purple-dark)}.native-note{display:flex;align-items:flex-start;gap:13px;border:1px solid #ecdfc6;background:#fffcf6;border-radius:10px;padding:17px 20px;margin:22px 0}.note-symbol{width:19px;height:19px;flex-shrink:0;border:1px solid #dec494;color:#b18a46;border-radius:50%;display:grid;place-items:center;font-size:11px;font-weight:650}.native-note strong{font-size:11px;font-weight:650;color:#86612e}.native-note p{font-size:12px;line-height:1.65;margin-top:6px;color:#6f6555}.inline-links{display:flex;align-items:center;gap:16px;flex-wrap:wrap;font-size:10px;color:var(--purple-dark);line-height:1.5}.native-note .inline-links{margin-top:10px;color:#85622e}.episode-metrics{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));background:white;border:1px solid var(--line);border-radius:var(--radius);padding:20px 0;margin:23px 0}.episode-metrics .metric>strong{font-size:25px}.detail-two-column{display:grid;grid-template-columns:1.1fr 1fr;gap:22px;align-items:start}.detail-two-column .panel{margin-bottom:20px}.instruction-panel .section-heading{flex-wrap:wrap;gap:14px}.instruction-panel .section-heading h2,.episode-analysis h2{font-size:17px}.instruction-panel .section-heading p{font-size:10px}.instruction-text{font-size:13px;line-height:1.85;padding:0 25px 22px;white-space:pre-wrap;overflow-wrap:anywhere}.instruction-footer{padding:13px 25px;background:#fbfbfe;border-top:1px solid var(--line);display:flex;flex-wrap:wrap;justify-content:space-between;gap:8px;font-size:9px;color:var(--muted)}.analysis-body{padding:0 25px 23px;font-size:12px;color:#737888;line-height:1.75}.analysis-body>p{line-height:1.85}.analysis-body details{margin:17px 0}.analysis-body summary{font-size:11px;color:var(--purple-dark);cursor:pointer}.analysis-entry{margin-top:17px;border-left:2px solid #e5e1fa;padding-left:12px}.analysis-entry>span{font-size:9px;text-transform:uppercase;letter-spacing:.6px;color:#75688b}.analysis-entry p{margin-top:4px;font-size:11px;line-height:1.8}.detail-launchers{display:grid;grid-template-columns:1fr 1fr;gap:20px;margin-top:3px}.detail-launchers>a{display:flex;align-items:center;gap:14px;padding:20px 23px;background:#f1f0fc;border:1px solid #e4e1f9;border-radius:10px}.detail-launchers>a>span:last-child{margin-left:auto;color:var(--purple)}.launcher-icon{font-size:22px;color:var(--purple)}.detail-launchers strong{display:block;font-size:12px;font-weight:600}.detail-launchers div>span{display:block;font-size:10px;color:#716784;margin-top:5px}.session-toolbar{display:flex;align-items:center;gap:10px;padding:15px 23px;border-top:1px solid var(--line);border-bottom:1px solid var(--line);background:#fafbfe;flex-wrap:wrap}.session-toolbar input{flex:1;min-width:180px}.session-toolbar #event-count{font-size:10px;color:var(--muted);white-space:nowrap}.timeline{padding:6px 25px 10px}.session-entry{display:grid;grid-template-columns:28px minmax(0,1fr);gap:14px;padding:23px 0;border-bottom:1px solid #eef0f5}.session-entry:last-child{border:0}.event-index{font-size:10px;color:#b8bccb;text-align:center;padding-top:3px;font-variant-numeric:tabular-nums}.event-header{display:flex;align-items:center;gap:9px;margin-bottom:12px;min-width:0;flex-wrap:wrap}.event-header strong{font-size:11px;font-weight:650}.event-header code{font-size:10px;background:#f0effb;color:#6a5cad;padding:3px 5px;border-radius:4px}.event-header time{margin-left:auto;color:#74778a;font-size:9px;font-variant-numeric:tabular-nums}.error-tag{font-size:8px;padding:3px 5px;border-radius:4px;color:#a14b47;background:#fceeed;text-transform:uppercase;letter-spacing:.5px}.event-error .event-index{color:#c68177}.message-text{white-space:pre-wrap;overflow-wrap:anywhere;font-size:12px;line-height:1.8;color:#626979;max-width:1080px}.tool-block{margin:7px 0;border:1px solid #e5e7ef;background:#fafbfe;border-radius:7px;overflow:hidden}.tool-block summary{cursor:pointer;display:flex;align-items:center;gap:12px;font-size:10px;padding:11px 13px;color:#687181;list-style:none}.tool-block summary:before{content:'›';color:#9a9cb6;font-size:15px;line-height:1;flex-shrink:0}.tool-block[open] summary:before{transform:rotate(90deg)}.tool-block summary>span:first-of-type{white-space:nowrap}.tool-block summary code,.output-excerpt{color:#707587;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0;font-size:10px;font-weight:400}.tool-block pre{border-top:1px solid var(--line);padding:15px;background:#fff;max-height:560px;overflow:auto;color:#535e70;font-size:11px}.error-block{border-color:#eedbd7;background:#fff9f7}.event-id{font-family:ui-monospace,monospace;font-size:8px;color:#b3b8c8;overflow-wrap:anywhere;margin-top:10px}.observation{display:inline-flex;flex-direction:column;padding:0;margin:8px 9px 5px 0;border:1px solid #e5e5f0;border-radius:7px;overflow:hidden;background:#fff;max-width:230px;vertical-align:top}.observation img{max-width:100%;height:150px;object-fit:contain;background:#f4f5f9;display:block}.observation>span{font-size:9px;color:#766a91;padding:7px 10px;display:flex;justify-content:space-between;gap:20px;width:100%}.session-more{display:flex;justify-content:center;padding:18px}.observation-gallery{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:15px;padding:24px}.gallery-image{padding:0;border:1px solid var(--line);border-radius:9px;background:#fafbfe;overflow:hidden}.gallery-image img{width:100%;height:180px;object-fit:contain;display:block}.gallery-image>span{display:flex;justify-content:space-between;padding:12px;font-size:10px;color:var(--muted);background:white}.file-browser{display:grid;grid-template-columns:280px minmax(0,1fr);border-top:1px solid var(--line);min-height:460px}.file-list{border-right:1px solid var(--line);background:#fcfcfe;padding:15px 10px;max-height:680px;overflow:auto}.file-list-title{font-size:10px;color:var(--muted);padding:0 10px 14px}.file-item{width:100%;text-align:left;border-radius:6px;display:flex;align-items:flex-start;gap:9px;font-family:ui-monospace,monospace;font-size:10px;padding:11px 10px;line-height:1.6;color:#778093;margin-bottom:4px;word-break:break-word}.file-item.active{background:#eeecfd;color:var(--purple-dark)}.file-item:hover{background:#f1f0fc}.file-extension{font-size:8px;color:#9e97c4;border:1px solid #ddd9f0;border-radius:3px;line-height:1;padding:4px 3px;flex-shrink:0;margin-top:1px}.file-preview{min-width:0;display:flex;flex-direction:column}.file-toolbar{padding:14px 17px;display:flex;justify-content:space-between;align-items:center;gap:15px;border-bottom:1px solid var(--line);background:#fff}.file-toolbar>code{font-size:10px;line-height:1.7;color:#687084}.file-toolbar>div{display:flex;gap:7px;flex-shrink:0}.file-caption{padding:10px 18px;font-size:9px;color:#707587;background:#fcfcfe;border-bottom:1px solid #f0f1f6}.file-preview pre{padding:20px;overflow:auto;max-height:620px;flex:1;color:#556078;background:#fdfdff;font-size:11px;tab-size:4}.artifact-shortcuts{display:grid;grid-template-columns:1fr 1fr;gap:22px}.evidence-grid{display:grid;grid-template-columns:1fr 1fr;gap:20px}.evidence-intro{margin:8px 0 20px}.evidence-intro p{font-size:12px;color:var(--muted);margin-top:8px}.evidence-card{padding:23px;margin:0}.evidence-card p{font-size:11px;color:var(--muted);margin:7px 0 17px}.evidence-card>div{display:flex;gap:9px;flex-wrap:wrap}.evidence-card a{font-size:10px;border:1px solid #e9e6f8;border-radius:5px;padding:7px 9px;color:#6d5ba6;background:#fdfcfe}.evidence-card a:hover{background:#f1effd;border-color:#c9c1e8}.provenance-panel{margin-top:23px}.provenance-list{display:grid;grid-template-columns:190px minmax(0,1fr);gap:14px 22px;margin:0;padding:0 25px 25px;font-size:11px;line-height:1.65}.provenance-list dt{color:var(--muted)}.provenance-list dd{margin:0;overflow-wrap:anywhere}.provenance-list code{font-size:10px}.tag{display:inline-block;font-size:8px;border-radius:3px;padding:3px 5px;background:#f0eff9;color:#9990b4;margin-left:5px}.protocol-json{border-top:1px solid var(--line);padding:17px 25px}.protocol-json summary{cursor:pointer;color:var(--purple-dark);font-size:11px}.protocol-json pre{max-height:450px;overflow:auto;margin-top:17px;background:#fafbfe;border:1px solid var(--line);padding:15px;border-radius:6px}.evidence-preview-panel pre{max-height:600px;overflow:auto;margin:0 25px 25px;padding:20px;background:#fafbfe;border:1px solid var(--line);border-radius:7px;font-size:11px}.history-row{padding:23px 25px;border-top:1px solid var(--line);display:grid;grid-template-columns:140px minmax(0,1fr);gap:25px}.history-outcome small{display:block;font-size:9px;color:var(--muted);margin-top:9px}.history-row strong{font-size:12px;font-weight:550;text-transform:capitalize}.history-row p{margin-top:6px;font-size:11px;color:var(--muted)}.history-row code{font-size:9px;word-break:break-word}.history-stats{display:block;font-size:10px;color:#707587;margin-top:6px}.history-row details{margin:12px 0;font-size:11px}.history-row summary{cursor:pointer;color:var(--purple-dark)}.history-row .inline-links{margin-top:15px}.pending-layout{display:grid;grid-template-columns:1.1fr 1fr;gap:23px;align-items:start}.pending-panel{background:linear-gradient(135deg,#fff,#f3f2fd);border:1px dashed #d5d0ee;border-radius:var(--radius);padding:30px;text-align:center}.pending-orbit{display:block;font-size:43px;color:#bbb4e6;margin:0 0 13px;line-height:1}.pending-panel h2{font-size:22px;margin-top:9px}.pending-panel>p{font-size:12px;color:var(--muted);margin-top:9px}.pending-facts{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));margin:30px 0 24px}.pending-facts .metric{padding:0 10px}.pending-facts .metric>strong{font-size:22px}.pending-facts .metric-label{font-size:9px}.pending-panel .subtle{font-size:11px;line-height:1.8}.empty-state{padding:55px 25px;text-align:center;color:var(--muted);font-size:12px;line-height:1.9}.empty-state h1,.empty-state h2{margin-bottom:15px;color:var(--ink)}.empty-state .button{margin-top:15px}.inline-error{font-size:11px;padding:15px;color:var(--red)}.loading{display:flex;justify-content:center;align-items:center;gap:12px;padding:80px 20px;font-size:12px;color:var(--muted)}.spinner{width:18px;height:18px;border:2px solid #e9e7fb;border-top-color:var(--purple);border-radius:50%;animation:spin 1s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}.site-footer{max-width:1348px;margin:auto;display:flex;justify-content:space-between;align-items:center;gap:20px;padding:24px 0 35px;border-top:1px solid var(--line);font-size:10px;color:var(--muted)}.site-footer>div{display:flex;align-items:center;gap:17px;flex-wrap:wrap}.site-footer strong{font-size:11px;color:#555a6a;font-weight:550;margin-left:-7px}.footer-org{color:#707587}.skip{position:absolute;top:-60px;left:15px;z-index:40;background:white;padding:10px}.skip:focus{top:10px}dialog{border:1px solid #424352;padding:0;border-radius:12px;width:min(1200px,94vw);max-height:92vh;background:#191b25;color:#f2f3f9;overflow:hidden}dialog::backdrop{background:#12131bcc;backdrop-filter:blur(5px)}.viewer-toolbar{display:flex;align-items:center;gap:18px;padding:14px 20px;font-size:11px;border-bottom:1px solid #343543}.viewer-toolbar>span{margin-right:auto;overflow-wrap:anywhere}.viewer-toolbar a{font-size:10px;color:#b7b0ed;white-space:nowrap}.icon-button{font-size:25px;color:#adb0c1;padding:0 5px}.viewer-image{display:flex;align-items:center;justify-content:space-between;min-height:180px;padding:15px;gap:10px}.viewer-image img{max-width:calc(100% - 95px);max-height:72vh;object-fit:contain;display:block}.viewer-arrow{font-size:24px;padding:10px;color:#c3bee8;border-radius:5px}.viewer-arrow:hover{background:#333140}dialog>p{text-align:center;padding:0 20px 15px;font-size:10px;color:#8f91a5}#toast{position:fixed;bottom:25px;left:50%;transform:translate(-50%,20px);opacity:0;transition:opacity .15s,transform .15s;pointer-events:none;background:#373448;color:white;border-radius:8px;padding:12px 20px;font-size:12px;z-index:50;box-shadow:0 3px 15px #15132020;max-width:90vw}#toast.visible{opacity:1;transform:translate(-50%,0)}
2
+ @media(max-width:1150px){.header-inner{padding:0 28px;gap:22px}main{padding:29px 28px 45px}.hero-facts{min-width:290px}.hero-facts>div{padding:0 15px}.agent-card{padding:17px 15px}.card-rate{gap:6px}.card-rate strong{font-size:31px}.card-rate>span{font-size:9px}.card-stats,.card-bottom{font-size:9px}.comparison-cell{padding:14px 20px}.family-cards{grid-template-columns:repeat(3,1fr)}.hero h1{font-size:43px}.site-footer{margin:0 28px}.report-metrics .metric{padding:0 18px}.token-table th,.token-table td{padding-left:16px;padding-right:16px}.panel-footnote{gap:20px;flex-direction:column}.detail-model{display:none}.episode-layout{grid-template-columns:minmax(0,1fr) 265px}.detail-two-column{grid-template-columns:1fr 1fr}.section-heading{padding:20px}.detail-two-column .section-heading{padding:20px}.instruction-text,.analysis-body{padding-left:20px;padding-right:20px}.observation-gallery{grid-template-columns:repeat(3,1fr)}}
3
+ @media(max-width:850px){.header-inner nav{gap:17px}.header-link{padding-left:17px}.brand>span{font-size:21px;gap:8px}.brand-benchmark{font-size:14px}.brand img{width:29px;height:29px}.brand{gap:9px}.hero{gap:15px}.hero-facts{min-width:245px}.hero-facts>div{padding:0 10px}.hero-facts>div span{font-size:9px}.hero p{font-size:12px}.agent-cards{grid-template-columns:repeat(2,minmax(0,1fr))}.agent-card{padding:20px}.card-rate strong{font-size:34px}.card-rate>span{font-size:11px}.card-stats,.card-bottom{font-size:11px}.scope-note{flex-direction:column;gap:4px}.comparison-table{min-width:730px}.token-table{min-width:720px}.task-table{min-width:740px}.comparison-table th:first-child{width:24%}.comparison-cell{padding:14px 21px}.report-hero h1{font-size:30px}.variant-tabs{gap:8px}.variant-tab{padding:12px 11px}.tab-agent{font-size:10px;gap:6px}.tab-model{font-size:9px;padding-left:0}.tab-agent .badge{font-size:8px;padding:3px}.report-metrics .metric{padding:0 12px}.report-metrics .metric>strong{font-size:23px}.metric>small{font-size:8px}.episode-layout{grid-template-columns:1fr}.result-panel{display:grid;grid-template-columns:1fr 2fr;gap:0 30px}.result-head{grid-column:1;align-self:start;margin:0 0 13px}.result-number{grid-column:1;grid-row:2}.result-panel .completion-track{grid-column:1;grid-row:3;align-self:center}.result-panel .facts{grid-column:2;grid-row:1/5;grid-template-columns:1fr 1fr;gap:9px}.result-links{grid-column:1;grid-row:4;margin-top:5px;flex-wrap:wrap}.detail-two-column{gap:15px}.detail-nav{gap:18px}.session-panel .section-heading{align-items:flex-start}.file-browser{grid-template-columns:220px 1fr}.pending-layout{grid-template-columns:1fr}.pending-panel{padding:25px}.pending-facts{max-width:440px;margin-left:auto;margin-right:auto}.task-heading h1{font-size:29px}.task-heading p code{font-size:10px}.tab-agent .agent-monogram,.tab-agent img{width:17px;height:17px}.observation-gallery{grid-template-columns:repeat(3,1fr)}.gallery-image img{height:150px}}
4
+ @media(max-width:600px){.header-inner{padding:0 18px;min-height:65px;gap:10px;flex-wrap:wrap}.header-inner nav{height:65px;gap:12px}.header-inner nav a{font-size:10px}.header-inner nav a:last-child{display:none}.header-link{display:none}.brand img{width:25px;height:25px}.brand>span{font-size:19px;gap:6px}.brand-benchmark{font-size:12px}.brand-divider{font-size:16px}.brand{gap:7px}.brand>span{letter-spacing:-.5px}main{padding:25px 18px 38px}.hero{display:block;margin:3px 0 24px}.hero h1{font-size:40px;letter-spacing:-1.6px}.hero .eyebrow{font-size:9px;letter-spacing:1.15px;margin-bottom:13px}.hero p{font-size:12px;margin-top:12px}.hero-facts{grid-template-columns:repeat(3,1fr);margin-top:25px;min-width:0;text-align:left;background:#eeeefa80;border-radius:9px;padding:13px 0}.hero-facts>div{padding:0 17px;border-color:#dedfed}.hero-facts strong{font-size:23px}.hero-facts>div span{font-size:9px}.progress-label{margin-top:12px;font-size:9px}.agent-cards{gap:10px}.agent-card{padding:14px 13px;border-radius:10px}.card-header{gap:4px}.agent-name{font-size:12px;gap:6px}.agent-name img,.agent-logo{object-fit:contain;flex-shrink:0}.state-label{font-size:6px;padding:3px;letter-spacing:.4px}.card-model{font-size:9px;margin-top:8px}.card-rate{display:block;margin:19px 0 13px}.card-rate strong{font-size:33px;letter-spacing:-1.5px}.card-rate>span{display:block;font-size:9px;margin-top:5px}.card-stats{display:block;line-height:1.9;font-size:9px}.card-stats>span{display:block}.card-bottom{font-size:8px;line-height:1.6;flex-direction:column;gap:5px}.completion-track{margin:10px 0}.scope-note{font-size:9px;gap:7px;margin:13px 0 23px}.scope-note>span:first-child{align-items:flex-start}.scope-note .status-dot{margin-top:5px}.panel{border-radius:11px;margin-bottom:20px}.section-heading{padding:18px;gap:14px;flex-wrap:wrap}.section-heading h2{font-size:19px}.section-heading p{font-size:10px;line-height:1.7}.segmented button{font-size:9px;padding:7px 9px}.comparison-table{min-width:660px}.comparison-table th:first-child{width:24%}.comparison-cell{padding:12px 15px;min-height:83px}.comparison-cell strong{font-size:15px}.comparison-cell>div>span{font-size:9px}.comparison-table thead th,.comparison-table tbody th{padding:13px 15px}.comparison-table tbody th a{gap:6px;font-size:11px}.comparison-table tbody th small{padding-left:21px}.comparison-table th:first-child,.task-table th:first-child{position:sticky;left:0;background:#fff;z-index:2;box-shadow:1px 0 0 var(--line)}.comparison-table thead th:first-child,.task-table thead th:first-child{background:#fafbfe}.token-table{min-width:660px}.panel-footnote{padding:15px 18px;gap:12px}.panel-footnote p{font-size:9px}.legend{font-size:8px;gap:12px}.task-browser{margin-top:26px;scroll-margin-top:85px}.heading-count{font-size:10px}.section-heading.bare{gap:10px}.button{font-size:10px;padding:8px 10px}.filters{padding:14px;gap:8px}.search-field{min-width:100%;flex-basis:100%}.filters select{flex:1;max-width:calc(50% - 4px);font-size:10px;padding:9px 7px}.task-table{min-width:665px}.task-table th:first-child{width:34%;max-width:230px}.task-table th,.task-table td{padding:13px 14px}.task-title{font-size:11px;line-height:1.6}.task-meta{font-size:8px;gap:5px}.task-meta code{font-size:8px}.task-table thead th{font-size:10px}.task-table th small{font-size:8px}.table-footer{padding:13px 15px;gap:10px;font-size:9px}.table-footer #filter-context{order:3;flex-basis:100%;font-size:8px}.methodology>summary{padding:19px 18px}.methodology summary strong{font-size:14px}.method-grid{grid-template-columns:1fr;gap:20px;padding:0 18px 20px}.method-links{padding:16px 18px;gap:14px;font-size:10px}.site-footer{margin:0 18px;flex-direction:column;align-items:flex-start;gap:19px;padding:21px 0;font-size:9px}.site-footer>div{gap:13px}.footer-org{font-size:9px}.breadcrumbs{font-size:10px;margin-bottom:21px;gap:7px}.variant-tabs{grid-template-columns:1fr 1fr;gap:8px;margin-bottom:22px}.variant-tab{padding:13px 12px}.tab-agent{font-size:11px;gap:7px}.tab-agent img,.tab-agent .agent-logo{object-fit:contain;flex-shrink:0}.tab-agent .badge{font-size:8px;margin-left:auto}.tab-model{font-size:9px;margin-top:9px}.report-hero{display:block;margin-top:0}.report-hero h1{font-size:29px;line-height:1.25;letter-spacing:-1px}.report-hero p{font-size:10px;line-height:1.8}.report-hero>.button{margin-top:17px}.report-metrics{grid-template-columns:repeat(2,minmax(0,1fr));padding:0;overflow:hidden;margin:22px 0 18px}.report-metrics .metric{padding:17px 18px;border-bottom:1px solid var(--line);border-right:1px solid var(--line)}.report-metrics .metric:nth-child(even){border-right:0}.report-metrics .metric:nth-last-child(-n+2){border-bottom:0}.report-metrics .metric>strong{font-size:25px}.metric-label{font-size:9px}.metric>small{font-size:9px}.family-cards{grid-template-columns:1fr 1fr;gap:9px}.family-card{padding:13px}.family-card>div:first-child{font-size:11px}.family-card small{font-size:9px}.scope-note.single{font-size:9px;line-height:1.8}.task-heading{gap:10px;margin-bottom:22px}.task-heading h1{font-size:27px;letter-spacing:-.8px;line-height:1.3}.task-heading .eyebrow{font-size:9px}.task-heading p{font-size:10px;line-height:1.8}.task-arrows{gap:5px;margin-top:0}.task-arrows .button{padding:6px 8px;font-size:12px}.detail-nav{gap:22px;margin-bottom:19px}.detail-nav a,.disabled-tab{font-size:11px;padding-bottom:13px}.detail-nav a>span{font-size:8px}.video-caption{font-size:8px;padding:11px 12px}.video-toolbar{padding:11px;gap:9px}.video-toolbar .button{font-size:9px;padding:6px 8px}.video-toolbar label,.video-toolbar select{font-size:9px}.video-toolbar>div{gap:5px}.media-note{font-size:8px;margin-top:9px}.episode-layout{gap:16px}.result-panel{padding:18px;gap:0 17px;grid-template-columns:1fr 1.4fr}.result-head{gap:5px;flex-direction:column;align-items:flex-start;margin-bottom:10px}.result-head .eyebrow{font-size:8px}.result-head .badge{font-size:9px}.result-number{font-size:25px}.result-number>span{font-size:9px}.facts{font-size:9px;gap:8px!important}.result-links{font-size:9px;gap:9px;margin-top:0;padding-top:12px}.native-note{padding:14px;gap:10px;margin:18px 0}.note-symbol{width:17px;height:17px;font-size:10px}.native-note strong{font-size:10px;line-height:1.6;display:block}.native-note p{font-size:11px;line-height:1.8}.native-note .inline-links{font-size:9px;gap:12px}.episode-metrics{grid-template-columns:repeat(2,minmax(0,1fr));padding:0;margin:20px 0}.episode-metrics .metric{padding:17px 18px;border-bottom:1px solid var(--line)}.episode-metrics .metric:nth-child(2){border-right:0}.episode-metrics .metric:nth-child(n+3){border-bottom:0}.episode-metrics .metric>strong{font-size:23px}.detail-two-column{grid-template-columns:1fr;gap:0}.instruction-text{font-size:12px;line-height:1.85;padding:0 18px 20px}.instruction-footer{padding:12px 18px;font-size:9px}.analysis-body{padding:0 18px 20px;font-size:11px;line-height:1.85}.detail-launchers{grid-template-columns:1fr;gap:11px}.detail-launchers>a{padding:17px 18px}.detail-launchers strong{font-size:11px}.detail-launchers div>span{font-size:9px}.session-toolbar{padding:13px 15px;gap:9px}.session-toolbar input{min-width:100%;order:3;font-size:10px}.session-toolbar select{font-size:9px;padding:8px 7px;flex:1}.session-toolbar #event-count{font-size:9px;margin-left:auto;order:4}.session-toolbar .segmented button{padding:7px;font-size:9px}.timeline{padding:0 14px}.session-entry{grid-template-columns:18px minmax(0,1fr);gap:9px;padding:18px 0}.event-index{font-size:9px}.event-header{gap:6px;margin-bottom:10px}.event-header strong{font-size:10px}.event-header code{font-size:9px}.event-header time{font-size:8px;flex-basis:100%;margin:0}.message-text{font-size:11px;line-height:1.85}.tool-block summary{padding:10px;font-size:9px;gap:7px}.tool-block summary code,.output-excerpt{font-size:9px}.tool-block pre{padding:12px;font-size:10px;max-height:440px}.observation{max-width:100%;margin-right:0;width:100%}.observation img{width:100%;height:190px}.observation-gallery{grid-template-columns:1fr 1fr;padding:15px;gap:10px}.gallery-image img{height:130px}.gallery-image>span{font-size:9px;padding:10px}.file-browser{grid-template-columns:1fr}.file-list{max-height:210px;border-right:0;border-bottom:1px solid var(--line);padding:12px}.file-item{font-size:10px}.file-list-title{padding-bottom:10px}.file-toolbar{padding:13px;gap:8px;flex-wrap:wrap}.file-toolbar>code{font-size:9px;max-width:100%}.file-toolbar>div{margin-left:auto}.file-caption{padding:10px 14px;font-size:8px}.file-preview pre{padding:15px;font-size:10px;max-height:530px}.artifact-shortcuts,.evidence-grid{grid-template-columns:1fr;gap:15px}.evidence-card{padding:20px}.evidence-card h3{font-size:14px}.evidence-card p{font-size:10px}.evidence-card a{font-size:9px}.evidence-intro h2{font-size:20px}.evidence-intro p{font-size:11px}.provenance-list{grid-template-columns:1fr;gap:5px;padding:0 18px 20px;font-size:10px}.provenance-list dd{margin-bottom:10px}.provenance-list code{font-size:9px}.protocol-json{padding:17px 18px}.protocol-json pre{font-size:10px;padding:12px}.evidence-preview-panel pre{margin:0 18px 18px;padding:15px;font-size:10px}.history-row{grid-template-columns:1fr;gap:13px;padding:20px 18px}.history-outcome{display:flex;align-items:center;gap:10px}.history-outcome small{margin:0}.history-row p{font-size:10px}.history-row .inline-links{font-size:9px;gap:12px}.pending-panel{padding:25px 18px}.pending-facts .metric{padding:0 8px}.pending-facts .metric>strong{font-size:21px}.pending-facts .metric-label{font-size:8px}.pending-panel h2{font-size:22px}.pending-panel>p{font-size:11px}.pending-panel .subtle{font-size:10px}.viewer-toolbar{padding:12px;gap:10px;font-size:9px}.viewer-toolbar a{font-size:8px}.viewer-image{padding:8px;gap:0}.viewer-arrow{font-size:19px;padding:7px}.viewer-image img{max-width:calc(100% - 65px)}dialog>p{font-size:8px;padding:0 10px 12px}.inline-links{font-size:9px;gap:12px}.empty-state{padding:40px 18px;font-size:11px}.loading{font-size:11px;padding:65px 15px}}
5
+ @media(prefers-reduced-motion:reduce){*{scroll-behavior:auto!important;transition:none!important}.spinner{animation:none}}
6
+
7
+ .empty-event{color:#707587;font-size:11px;font-style:italic}.token-table .agent-inline:hover{color:var(--purple-dark)}
8
+
9
+ .eyebrow{color:var(--purple-dark)}.card-bottom>span:last-child{color:var(--purple-dark)}.family-card>div>span{color:var(--purple-dark)}.empty-cell strong{color:#7c7e92}.comparison-cell>small{color:var(--muted)}.event-id{color:#767b8e}.event-index{color:#767b8e}.file-extension{color:#776b9e}.tag{color:#76628d}.task-meta code{color:var(--muted)}.error-tag{color:#9e4947}.source-note{color:var(--muted)}
10
+
11
+ .comparison-note{padding:16px 25px;border-top:1px solid var(--line);font-size:11px;line-height:1.7;color:var(--muted)}
12
+ .instruction-diff-note{display:flex;align-items:baseline;gap:7px;padding:0 25px 15px;font-size:10px;line-height:1.7;color:var(--muted)}
13
+ .instruction-added{background:#eee9ff;color:#4c3692;border-bottom:1px solid #bbabec;box-decoration-break:clone;-webkit-box-decoration-break:clone;border-radius:2px;padding:1px 0}
14
+ .instruction-removed{background:#fff0ed;color:#8f4640;text-decoration-color:#b76d64;box-decoration-break:clone;-webkit-box-decoration-break:clone;border-radius:2px}
15
+ .diff-swatch{display:inline-block;flex-shrink:0;width:9px;height:9px;border-radius:2px}.diff-swatch.added{background:#eee9ff;border:1px solid #bbabec}.diff-swatch.removed{background:#fff0ed;border:1px solid #b76d64}
16
+ @media(max-width:600px){.instruction-diff-note{padding:0 18px 14px;font-size:9px}.comparison-note{padding:14px 18px;font-size:10px}}
17
+
18
+ /* Usage and price presentation: shared definitions, readable model comparisons. */
19
+ .card-stats{align-items:flex-start;font-size:12px;gap:14px}.card-cost{text-align:right}.card-cost b{font-size:17px;letter-spacing:-.4px;font-variant-numeric:tabular-nums}.card-cost small{display:block;font-size:10px;line-height:1.6;color:var(--muted)}
20
+ .card-model{font-size:12px;line-height:1.6;min-height:38px}.card-bottom{font-size:11px}.agent-cards{row-gap:18px}.scope-note{font-size:11px}
21
+ .comparison-panel{margin:36px 0}.comparison-panel>.section-heading{padding:0 0 12px;align-items:flex-start}.comparison-panel>.section-heading p{font-size:12px;max-width:570px}.comparison-panel .segmented{flex-shrink:0}.comparison-panel .segmented button{font-size:12px;padding:10px 14px}.comparison-definition{font-size:12px;color:var(--muted);line-height:1.7;margin:0 0 18px;max-width:1000px}
22
+ .model-comparison{margin-bottom:12px}.model-comparison>summary{list-style:none;cursor:pointer;display:flex;align-items:center;justify-content:space-between;gap:16px;padding:20px 24px}.model-comparison>summary::-webkit-details-marker{display:none}.model-comparison>summary strong{font-size:17px;font-weight:650;letter-spacing:-.3px}.model-group-meta{display:block;font-size:12px;color:var(--muted);line-height:1.7;margin-top:4px}.model-group-count{font-size:11px;color:var(--muted);white-space:nowrap}.disclosure-arrow{display:inline-block;margin-left:12px;font-size:18px;transition:transform .15s}.model-comparison[open] .disclosure-arrow{transform:rotate(180deg)}.model-comparison[open]>summary{border-bottom:1px solid var(--line)}
23
+ .grouped-comparison{table-layout:fixed;width:100%;min-width:0}.grouped-comparison th:first-child{width:23%}.grouped-comparison thead th:not(:first-child){width:38.5%}.grouped-comparison th,.grouped-comparison td{padding:18px 24px;text-align:left;vertical-align:top}.grouped-comparison thead th{font-size:14px}.grouped-comparison tbody th{font-size:14px}.grouped-comparison tbody th small{display:block;font-size:11px;margin-top:5px;color:var(--muted)}.grouped-comparison .family-code{margin-right:8px;font-size:11px}.grouped-comparison .agent-inline{font-size:14px}.comparison-value{display:flex;align-items:baseline;gap:12px;flex-wrap:wrap}.comparison-value strong{font-size:25px;font-weight:600;letter-spacing:-.65px;color:var(--variant);font-variant-numeric:tabular-nums;line-height:1.3}.comparison-value>span{font-size:11px;color:var(--muted)}.grouped-comparison .mini-track{max-width:260px;margin:10px 0}.comparison-explore{display:inline-block;font-size:11px;color:var(--muted);line-height:1.6;margin-top:10px}.comparison-explore:hover{color:var(--purple-dark)}
24
+ .comparison-usage{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px 20px;margin:0}.comparison-usage dt{font-size:11px;color:var(--muted);margin-bottom:3px}.comparison-usage dd{margin:0;font-size:20px;letter-spacing:-.4px;font-weight:550;font-variant-numeric:tabular-nums}.comparison-usage div:nth-child(3) dd{color:var(--variant)}
25
+ .usage-metrics{display:grid;grid-template-columns:repeat(6,minmax(0,1fr));background:#fff;border:1px solid var(--line);border-radius:var(--radius);margin:24px 0 12px;overflow:hidden}.usage-metrics:has(>.metric:last-child:nth-child(5)){grid-template-columns:repeat(5,minmax(0,1fr))}.usage-metrics .metric{padding:21px 20px;border-right:1px solid var(--line);min-width:0}.usage-metrics .metric:last-child{border:0}.usage-metrics .metric>strong{font-size:28px;line-height:1.35;letter-spacing:-.7px;font-variant-numeric:tabular-nums;overflow-wrap:anywhere}.usage-metrics .metric-label{font-size:11px}.usage-metrics .metric>small{font-size:11px;line-height:1.55;display:block;margin-top:5px}.usage-caption{font-size:11px;color:var(--muted);line-height:1.7;margin:0 0 16px}.usage-activity{display:flex;gap:26px;flex-wrap:wrap;align-items:center;font-size:12px;color:var(--muted);margin:18px 0 30px}.usage-activity strong{color:var(--text);font-weight:600}.usage-activity>a{margin-left:auto;font-size:11px;color:var(--purple-dark)}
26
+ .cost-breakdown{background:#fff;border:1px solid var(--line);border-radius:10px;margin:14px 0 20px;overflow:hidden}.cost-breakdown>summary{list-style:none;cursor:pointer;display:flex;align-items:center;justify-content:space-between;gap:12px;padding:15px 18px;font-size:13px;font-weight:600}.cost-breakdown>summary::-webkit-details-marker{display:none}.cost-breakdown[open]>summary .summary-plus{transform:rotate(45deg)}.estimate-tag{font-size:10px;color:var(--muted);font-weight:400;margin-left:8px}.cost-breakdown-body{border-top:1px solid var(--line);padding:0 18px 17px}.cost-breakdown-body>p{font-size:11px;color:var(--muted);line-height:1.75;margin:12px 0 0}.cost-breakdown .inline-links{font-size:11px;margin-top:13px;gap:15px;flex-wrap:wrap}.price-table{width:100%;border-collapse:collapse;min-width:600px;font-size:12px;line-height:1.55}.price-table th,.price-table td{padding:11px 9px;border-bottom:1px solid var(--line);font-weight:400;text-align:left}.price-table thead th{font-size:10px;color:var(--muted);font-weight:600;white-space:nowrap}.price-table tbody th{font-weight:550;white-space:nowrap}.price-table .numeric{text-align:right;white-space:nowrap;font-variant-numeric:tabular-nums}.price-table tfoot th,.price-table tfoot td{border:0;font-weight:600}.coverage-note{color:var(--amber)!important}
27
+ .grouped-comparison .cost-breakdown{margin:12px 0 0}.grouped-comparison .cost-breakdown>summary{padding:11px 12px;font-size:11px}.grouped-comparison .estimate-tag{display:none}.grouped-comparison .cost-breakdown-body{padding:0 12px 12px}.grouped-comparison .price-table{min-width:550px}.grouped-comparison .price-table th:first-child{width:auto}.grouped-comparison .price-table th,.grouped-comparison .price-table td{padding:9px 7px;font-size:11px}.grouped-comparison .price-table thead th{width:auto;font-size:9px}.grouped-comparison .cost-breakdown-body>p{font-size:10px}
28
+ .single-variant{min-width:1120px}.single-variant th:first-child{width:27%}.single-variant thead th{font-size:11px}.single-variant thead th small{font-size:9px;margin-top:3px;white-space:nowrap}.single-variant td.numeric{font-size:12px;white-space:nowrap}.single-variant th,.single-variant td{padding-left:15px;padding-right:15px}.report-metrics .metric>strong{font-size:30px}.report-metrics .metric>small{line-height:1.5;font-size:11px}
29
+ @media(max-width:1000px){.usage-metrics{grid-template-columns:repeat(3,minmax(0,1fr))}.usage-metrics .metric{border-bottom:1px solid var(--line)}.usage-metrics .metric:nth-child(3){border-right:0}.usage-metrics .metric:nth-last-child(-n+2){border-bottom:0}.grouped-comparison th,.grouped-comparison td{padding:16px}.comparison-panel>.section-heading{flex-wrap:wrap}.grouped-comparison th:first-child{width:24%}.card-cost b{font-size:16px}}
30
+ @media(max-width:600px){.comparison-panel{margin:27px 0}.comparison-panel>.section-heading{gap:14px}.comparison-panel>.section-heading p{font-size:11px}.comparison-panel .segmented{width:100%;display:flex}.comparison-panel .segmented button{flex:1;font-size:11px;padding:10px 8px}.comparison-definition{font-size:11px}.model-comparison>summary{padding:17px 15px;gap:8px}.model-comparison>summary strong{font-size:15px}.model-group-meta{font-size:10px}.model-group-count{font-size:0}.disclosure-arrow{font-size:18px}.grouped-comparison{min-width:0;table-layout:fixed}.grouped-comparison th:first-child{width:24%}.grouped-comparison thead th:not(:first-child){width:38%}.grouped-comparison th,.grouped-comparison td{padding:13px 9px}.grouped-comparison tbody th{font-size:11px;overflow-wrap:anywhere}.grouped-comparison .family-code{display:none}.grouped-comparison tbody th small{font-size:9px}.grouped-comparison .agent-inline{font-size:11px;gap:5px}.grouped-comparison .agent-logo{width:17px;height:17px}.comparison-value{gap:5px}.comparison-value strong{font-size:19px;letter-spacing:-.4px}.comparison-value>span,.comparison-explore{font-size:9px}.comparison-usage{grid-template-columns:1fr;gap:8px}.comparison-usage dt{font-size:9px}.comparison-usage dd{font-size:17px}.grouped-comparison .cost-breakdown>summary{font-size:9px;padding:8px 6px;gap:3px}.grouped-comparison .cost-breakdown-body{padding:0 6px 8px}.grouped-comparison .cost-breakdown-body>p{font-size:9px}.grouped-comparison .cost-breakdown .inline-links{font-size:9px;gap:8px}.grouped-comparison .summary-plus{font-size:12px}.usage-metrics,.usage-metrics:has(>.metric:last-child:nth-child(5)){grid-template-columns:repeat(2,minmax(0,1fr))}.usage-metrics .metric{padding:17px 16px;border-right:1px solid var(--line);border-bottom:1px solid var(--line)}.usage-metrics .metric:nth-child(even){border-right:0}.usage-metrics .metric:nth-child(3){border-right:1px solid var(--line);border-bottom:1px solid var(--line)}.usage-metrics .metric:last-child:nth-child(5){grid-column:1/-1}.usage-metrics .metric>strong{font-size:25px}.usage-metrics .metric-label,.usage-metrics .metric>small{font-size:10px}.usage-caption{font-size:10px}.usage-activity{gap:10px 20px;font-size:11px}.usage-activity>a{margin-left:0}.cost-breakdown>summary{font-size:12px;padding:14px}.estimate-tag{display:block;margin:3px 0 0}.cost-breakdown-body{padding:0 13px 15px}.cost-breakdown-body>p{font-size:10px}.card-stats{font-size:10px;gap:8px}.card-cost b{font-size:16px}.card-cost small{font-size:9px}.card-model{font-size:11px;min-height:34px}.card-bottom{font-size:9px}.report-metrics .metric>strong{font-size:25px}.report-metrics .metric>small{font-size:10px}}
31
+ /* Nested rate tables have their own layout, independent of the comparison columns. */
32
+ .price-table{table-layout:auto!important;min-width:620px!important;width:100%!important}.price-table th,.price-table td{width:auto!important;max-width:none!important;white-space:nowrap}.price-table th:first-child{min-width:130px}.price-table th:nth-child(2){min-width:170px}
33
+ @media(max-width:600px){
34
+ .grouped-comparison>thead{display:none}.grouped-comparison,.grouped-comparison>tbody{display:block;width:100%}.grouped-comparison>tbody>tr{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));border-bottom:1px solid var(--line)}.grouped-comparison>tbody>tr:last-child{border-bottom:0}.grouped-comparison>tbody>tr>th{grid-column:1/-1;width:auto!important;display:flex;align-items:center;gap:10px;font-size:13px;padding:13px 15px;background:#fafaff;border-bottom:1px solid var(--line)}.grouped-comparison>tbody>tr>th small{margin:0;font-size:10px}.grouped-comparison>tbody>tr>td{display:block;min-width:0;width:auto!important;padding:15px;border-bottom:0}.grouped-comparison>tbody>tr>td:before{content:attr(data-harness);display:block;font-size:12px;font-weight:600;margin-bottom:11px;color:var(--variant)}.grouped-comparison>tbody>tr>td:last-child{border-left:1px solid var(--line)}.grouped-comparison>tbody>tr:has(.cost-breakdown[open])>td{grid-column:1/-1}.grouped-comparison>tbody>tr:has(.cost-breakdown[open])>td:last-child{border-left:0;border-top:1px solid var(--line)}.grouped-comparison .cost-breakdown>summary{font-size:11px;padding:11px 10px}.grouped-comparison .cost-breakdown-body{padding:0 10px 12px}.grouped-comparison .cost-breakdown-body>p{font-size:11px}.grouped-comparison .cost-breakdown .inline-links{font-size:10px}.comparison-value>span,.comparison-explore{font-size:10px}.comparison-usage{grid-template-columns:repeat(2,minmax(0,1fr));gap:12px 8px}.comparison-usage dt{font-size:10px}.comparison-usage dd{font-size:18px}.comparison-value strong{font-size:23px}
35
+ }
36
+
37
+ /* Full instruction comparison across the selected task catalog. */
38
+ .audit-intro{margin:8px 0 28px;max-width:900px}
39
+ .audit-intro h1{font-size:40px;margin:10px 0 15px}
40
+ .audit-intro>p{font-size:15px;color:var(--muted)}
41
+ .audit-intro .audit-selection-note{font-size:12px;margin-top:14px;max-width:790px}
42
+ .audit-summary{display:flex;flex-wrap:wrap;gap:10px 25px;padding:18px 22px;border-bottom:1px solid var(--line);color:var(--muted);font-size:12px}
43
+ .audit-summary strong{color:var(--ink)}
44
+ .audit-controls .filters{flex-wrap:wrap}
45
+ .audit-controls .search-field{min-width:240px}
46
+ .audit-controls select{max-width:100%}
47
+ .audit-toolbar{display:flex;align-items:center;flex-wrap:wrap;gap:14px;padding:0 22px 18px;font-size:11px;color:var(--muted)}
48
+ .audit-legend{display:flex;flex-wrap:wrap;gap:12px;margin-right:auto}
49
+ .audit-family{margin-top:32px}
50
+ .audit-family-heading{display:flex;align-items:baseline;gap:12px;margin:0 0 15px;padding-bottom:12px;border-bottom:1px solid var(--line)}
51
+ .audit-family-heading h2{font-size:25px}
52
+ .audit-family-heading>span{font-size:12px;color:var(--muted)}
53
+ .audit-task{overflow:hidden;margin-bottom:16px}
54
+ .audit-task-heading{display:flex;align-items:flex-start;justify-content:space-between;gap:18px;padding:19px 22px;background:#fafbfe;border-bottom:1px solid var(--line)}
55
+ .audit-task-heading h3{font-size:17px;margin-top:7px;line-height:1.4}
56
+ .audit-task-id{display:flex;flex-wrap:wrap;gap:8px 14px;font-size:11px;color:var(--muted);overflow-wrap:anywhere}
57
+ .audit-task-id code{color:var(--purple-dark);font-weight:600}
58
+ .audit-status{flex-shrink:0;font-size:10px;font-weight:600;padding:5px 9px;border-radius:5px;background:#eff1f5;color:var(--muted)}
59
+ .audit-status.changed{background:#eeeaff;color:#6253a7}
60
+ .audit-status.unchanged{background:#e9f3ed;color:#327051}
61
+ .audit-status.missing{background:#fff4de;color:#8a6621}
62
+ .audit-pair{display:grid;grid-template-columns:repeat(2,minmax(0,1fr))}
63
+ .audit-column{min-width:0;padding:19px 22px 24px}
64
+ .audit-column+.audit-column{border-left:1px solid var(--line)}
65
+ .audit-column h4{margin:0 0 7px;font-size:11px;letter-spacing:.07em;text-transform:uppercase}
66
+ .audit-column.measured h4{color:var(--purple-dark)}
67
+ .audit-column-note{font-size:11px;color:var(--muted);margin-bottom:14px}
68
+ .audit-text{white-space:pre-wrap;overflow-wrap:anywhere;font-size:14px;line-height:1.85;color:var(--ink)}
69
+ .audit-task-footer{display:flex;flex-wrap:wrap;gap:9px 18px;align-items:center;padding:13px 22px;border-top:1px solid var(--line);font-size:10px;color:var(--muted)}
70
+ .audit-evidence{display:flex;flex-wrap:wrap;gap:14px;margin-left:auto}
71
+ .audit-evidence a{color:var(--purple-dark)}
72
+ .audit-episode-id{flex-basis:100%;font-size:10px;overflow-wrap:anywhere}
73
+ .audit-launcher{display:flex;align-items:center;justify-content:space-between;gap:20px;padding:22px 24px;margin:25px 0;background:var(--lavender);border:1px solid #dedaf8;border-radius:var(--radius)}
74
+ .audit-launcher strong{font-size:17px}
75
+ .audit-launcher p{font-size:12px;margin-top:6px;color:var(--muted)}
76
+ .audit-launcher>span{font-size:23px;color:var(--purple-dark)}
77
+ @media(max-width:850px){.header-inner{flex-wrap:wrap}.header-inner nav{margin-left:auto}.header-link{display:none}}
78
+ @media(max-width:600px){
79
+ .header-inner{gap:0;justify-content:space-between}
80
+ .header-inner nav{height:42px;flex-basis:100%;justify-content:space-between;margin:0}
81
+ .header-inner nav a{font-size:11px}
82
+ .header-inner nav a:last-child{display:flex}
83
+ .brand{padding-top:14px}
84
+ .audit-intro h1{font-size:30px}
85
+ .audit-intro>p{font-size:13px}
86
+ .audit-summary{padding:15px;gap:8px 16px}
87
+ .audit-controls .search-field{min-width:100%}
88
+ .audit-controls select{max-width:100%;flex-basis:100%;font-size:12px}
89
+ .audit-toolbar{padding:0 15px 16px;gap:12px;font-size:10px}
90
+ .audit-task-heading{padding:16px;gap:10px}
91
+ .audit-task-heading h3{font-size:15px}
92
+ .audit-task-id{font-size:10px}
93
+ .audit-pair{grid-template-columns:1fr}
94
+ .audit-column{padding:16px}
95
+ .audit-column+.audit-column{border-left:0;border-top:1px solid var(--line)}
96
+ .audit-text{font-size:13px}
97
+ .audit-task-footer{padding:13px 16px}
98
+ .audit-evidence{margin-left:0}
99
+ .audit-launcher{padding:18px}
100
+ }
101
+
102
+ @media (min-width:601px) and (max-width:1000px){.usage-metrics:has(>.metric:last-child:nth-child(5)){grid-template-columns:repeat(3,minmax(0,1fr))}}
103
+
104
+ .task-result{display:inline-flex;align-items:center;gap:12px;white-space:nowrap}.task-cost{color:var(--muted);font-size:12px;font-variant-numeric:tabular-nums}
105
+ @media(max-width:600px){.task-result{gap:9px}.task-cost{font-size:11px}}
106
+
107
+ @media(min-width:1200px){.agent-cards{grid-template-columns:repeat(5,minmax(0,1fr))}.agent-card{padding-left:16px;padding-right:16px}}
hard/usage-metrics.js ADDED
@@ -0,0 +1,81 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ 'use strict';
2
+
3
+ // Presentation values are derived; original episode usage remains unchanged.
4
+ window.UsageMetrics = (() => {
5
+ let priceData = {episodes: {}, sources: []};
6
+ const finite = v => typeof v === 'number' && Number.isFinite(v);
7
+ const signature = ep => {
8
+ const u = ep.usage || {};
9
+ return [ep.id, ep.links?.usage, u.input_tokens, u.output_tokens,
10
+ u.cached_input_tokens, u.cache_write_input_tokens, u.estimated_cost_usd ?? null];
11
+ };
12
+ function price(ep) {
13
+ const row = priceData.episodes?.[ep?.id];
14
+ return row && JSON.stringify(row.signature) === JSON.stringify(signature(ep)) ? row : null;
15
+ }
16
+ function usage(ep) {
17
+ const u = ep?.usage || {}, p = price(ep), inclusive = finite(u.input_tokens) ? u.input_tokens : null;
18
+ const cached = finite(u.cached_input_tokens) ? u.cached_input_tokens : null;
19
+ const cacheWrite = finite(u.cache_write_input_tokens) && u.cache_write_input_tokens >= 0 ? u.cache_write_input_tokens : null;
20
+ const fresh = inclusive != null && cached != null && cacheWrite != null && inclusive >= cached + cacheWrite
21
+ ? inclusive - cached - cacheWrite : null;
22
+ const writeBasis = u.cache_write_basis || (u.usage_source === 'provider-raw' ? 'provider-reported'
23
+ : ep?.harness === 'codex' ? 'codex-native-counter'
24
+ : u.usage_source === 'claude-native' ? 'claude-native-counter'
25
+ : u.usage_source === 'pi-session' ? 'pi-session-counter' : 'recorded-counter');
26
+ const cacheLow = cached ?? (p ? p.cache_lower : null);
27
+ const cacheHigh = cached ?? (p ? p.cache_upper : null);
28
+ return {
29
+ inclusive, fresh, cached, cacheWrite, writeBasis, cacheLow, cacheHigh,
30
+ input: inclusive != null && cached != null ? inclusive - cached : null,
31
+ inputLow: inclusive != null && cacheHigh != null ? inclusive - cacheHigh : null,
32
+ inputHigh: inclusive != null && cacheLow != null ? inclusive - cacheLow : null,
33
+ output: finite(u.output_tokens) ? u.output_tokens : null,
34
+ reasoning: finite(u.reasoning_output_tokens) ? u.reasoning_output_tokens : null,
35
+ cacheRate: inclusive > 0 && cached != null ? cached / inclusive : null,
36
+ cacheRateLow: inclusive > 0 && cacheLow != null ? cacheLow / inclusive : null,
37
+ cacheRateHigh: inclusive > 0 && cacheHigh != null ? cacheHigh / inclusive : null,
38
+ };
39
+ }
40
+ function stats(es) {
41
+ const valid = es.filter(e => e.valid !== false), n = valid.length;
42
+ const us = valid.map(usage), ps = valid.map(price);
43
+ const sum = (rows, key) => rows.length && rows.every(r => finite(r?.[key])) ? rows.reduce((s,r) => s+r[key],0) : null;
44
+ const inclusive = sum(us, 'inclusive'), cacheLow = sum(us, 'cacheLow'), cacheHigh = sum(us, 'cacheHigh');
45
+ const costCount = ps.filter(Boolean).length, hasCost = n > 0 && costCount === n;
46
+ const buckets = new Map();
47
+ for (const p of ps.filter(Boolean)) for (const b of p.buckets) {
48
+ const key = [b.category, b.tier, b.rate, b.rate_upper].join('|');
49
+ const a = buckets.get(key) || {...b, tokens:0, lower:0, upper:0};
50
+ a.tokens += b.tokens; a.lower += b.lower; a.upper += b.upper; buckets.set(key,a);
51
+ }
52
+ return {
53
+ n, passes:valid.filter(e => e.success === true).length,
54
+ rate:n ? valid.filter(e => e.success === true).length/n : null,
55
+ inclusive, fresh:sum(us,'fresh'), cacheWrite:sum(us,'cacheWrite'),
56
+ freshCount:us.filter(u => finite(u.fresh)).length, writeCount:us.filter(u => finite(u.cacheWrite)).length,
57
+ providerZeroWrites:us.filter(u => u.cacheWrite === 0 && u.writeBasis === 'provider-reported').length,
58
+ nativeZeroWrites:us.filter(u => u.cacheWrite === 0 && u.writeBasis !== 'provider-reported').length,
59
+ input:sum(us,'input'), cached:sum(us,'cached'), output:sum(us,'output'),
60
+ inputLow:sum(us,'inputLow'), inputHigh:sum(us,'inputHigh'), cacheLow, cacheHigh,
61
+ cacheRateLow:inclusive > 0 && cacheLow != null ? cacheLow/inclusive : null,
62
+ cacheRateHigh:inclusive > 0 && cacheHigh != null ? cacheHigh/inclusive : null,
63
+ cacheRate:inclusive > 0 && sum(us,'cached') != null ? sum(us,'cached')/inclusive : null,
64
+ reasoning:sum(us,'reasoning'), responses:sum(valid.map(e => e.usage),'response_count'), usageMessages:sum(valid.map(e => e.usage),'usage_message_count'),
65
+ wall:sum(valid,'wall_time_s'), costCount,
66
+ costLow:hasCost ? sum(ps,'lower') : null, costHigh:hasCost ? sum(ps,'upper') : null,
67
+ buckets:[...buckets.values()], conditional:ps.some(p => p?.cache_write_assumed),
68
+ bounded:ps.some(p => p && p.lower !== p.upper),
69
+ knownCost:ps.filter(Boolean).reduce((s,p) => s+p.lower,0),
70
+ longContext:ps.filter(Boolean).reduce((s,p) => s+p.long_context_responses,0),
71
+ };
72
+ }
73
+ function bounds(low, high, format) {
74
+ if (!finite(low) || !finite(high)) return '—';
75
+ const a = format(low), b = format(high);
76
+ return Math.abs(high-low) < 1e-9 ? a : a === b ? '≈'+a : a+'–'+b;
77
+ }
78
+ const money = v => finite(v) ? new Intl.NumberFormat('en-US', {style:'currency',currency:'USD',maximumFractionDigits:2}).format(v) : '—';
79
+ return {init: value => {priceData=value;}, price, usage, stats, bounds, money,
80
+ get sources() {return priceData.sources;}, get pricingDate() {return priceData.pricing_date;}};
81
+ })();
index.html CHANGED
@@ -9,12 +9,12 @@
9
  <link rel="icon" href="icon.svg" type="image/svg+xml">
10
  <link rel="stylesheet" href="style.css?v=bd1a59147e1d">
11
  <script src="usage-metrics.js?v=330e92f8eb96" defer></script>
12
- <script src="app.js?v=07f7896f4cd0" defer></script>
13
  <link rel="stylesheet" href="policy.css">
14
  </head>
15
  <body>
16
  <a class="skip" href="#main">Skip to content</a>
17
- <header class="site-header"><div class="header-inner"><a class="brand" href="#overview" aria-label="Programmable VLA home"><img src="assets/kinex-logo.svg" width="34" height="34" alt="Kinex"><span>programmable<span class="brand-divider">/</span><span class="brand-benchmark">vla</span></span></a><nav aria-label="Main navigation"><a href="#overview" data-nav="overview">Overview</a><a href="#tasks" data-nav="tasks">Explore tasks</a><a href="#methodology" data-nav="methodology">Protocol</a></nav><a class="header-link" href="https://huggingface.co/spaces/RLE-Bench/programmable-vla" target="_blank" rel="noopener">Hugging Face <span aria-hidden="true">↗</span></a></div></header>
18
  <main id="main" tabindex="-1"><div class="loading"><span class="spinner"></span>Loading benchmark results…</div></main>
19
  <footer class="site-footer"><div><img src="assets/kinex-logo.svg" width="22" height="22" alt=""><strong>Programmable VLA</strong><span class="footer-org">by RLE-Bench</span></div><div><a data-result-file="data.json" href="https://huggingface.co/datasets/RLE-Bench/programmable-vla/resolve/c2e39c9ea8f3a9d3e7680e4818d294770f032c21/data.json" target="_blank">Results JSON</a><a data-result-file="sources.json" href="https://huggingface.co/datasets/RLE-Bench/programmable-vla/resolve/c2e39c9ea8f3a9d3e7680e4818d294770f032c21/sources.json" target="_blank">Data sources</a><a href="https://huggingface.co/datasets/RLE-Bench/programmable-vla/resolve/c2e39c9ea8f3a9d3e7680e4818d294770f032c21/manifest.json" target="_blank">Manifest</a><span id="updated"></span></div></footer>
20
  <dialog id="image-viewer" aria-labelledby="image-caption"><div class="viewer-toolbar"><span id="image-caption"></span><a id="image-original" target="_blank" rel="noopener">Open original ↗</a><button class="icon-button" id="close-viewer" aria-label="Close image">×</button></div><div class="viewer-image"><button id="previous-image" class="viewer-arrow" aria-label="Previous image">←</button><img id="large-image" alt="Recorded agent observation"><button id="next-image" class="viewer-arrow" aria-label="Next image">→</button></div><p>Recorded agent observation · Use ← → to browse · Esc to close</p></dialog>
 
9
  <link rel="icon" href="icon.svg" type="image/svg+xml">
10
  <link rel="stylesheet" href="style.css?v=bd1a59147e1d">
11
  <script src="usage-metrics.js?v=330e92f8eb96" defer></script>
12
+ <script src="app.js?v=hard-navigation-20261101" defer></script>
13
  <link rel="stylesheet" href="policy.css">
14
  </head>
15
  <body>
16
  <a class="skip" href="#main">Skip to content</a>
17
+ <header class="site-header"><div class="header-inner"><a class="brand" href="#overview" aria-label="Programmable VLA home"><img src="assets/kinex-logo.svg" width="34" height="34" alt="Kinex"><span>programmable<span class="brand-divider">/</span><span class="brand-benchmark">vla</span></span></a><nav aria-label="Main navigation"><a href="#overview" data-nav="overview">Easy</a><a href="hard/index.html#overview">Hard</a><a href="#tasks" data-nav="tasks">Explore tasks</a><a href="#methodology" data-nav="methodology">Protocol</a></nav><a class="header-link" href="https://huggingface.co/spaces/RLE-Bench/programmable-vla" target="_blank" rel="noopener">Hugging Face <span aria-hidden="true">↗</span></a></div></header>
18
  <main id="main" tabindex="-1"><div class="loading"><span class="spinner"></span>Loading benchmark results…</div></main>
19
  <footer class="site-footer"><div><img src="assets/kinex-logo.svg" width="22" height="22" alt=""><strong>Programmable VLA</strong><span class="footer-org">by RLE-Bench</span></div><div><a data-result-file="data.json" href="https://huggingface.co/datasets/RLE-Bench/programmable-vla/resolve/c2e39c9ea8f3a9d3e7680e4818d294770f032c21/data.json" target="_blank">Results JSON</a><a data-result-file="sources.json" href="https://huggingface.co/datasets/RLE-Bench/programmable-vla/resolve/c2e39c9ea8f3a9d3e7680e4818d294770f032c21/sources.json" target="_blank">Data sources</a><a href="https://huggingface.co/datasets/RLE-Bench/programmable-vla/resolve/c2e39c9ea8f3a9d3e7680e4818d294770f032c21/manifest.json" target="_blank">Manifest</a><span id="updated"></span></div></footer>
20
  <dialog id="image-viewer" aria-labelledby="image-caption"><div class="viewer-toolbar"><span id="image-caption"></span><a id="image-original" target="_blank" rel="noopener">Open original ↗</a><button class="icon-button" id="close-viewer" aria-label="Close image">×</button></div><div class="viewer-image"><button id="previous-image" class="viewer-arrow" aria-label="Previous image">←</button><img id="large-image" alt="Recorded agent observation"><button id="next-image" class="viewer-arrow" aria-label="Next image">→</button></div><p>Recorded agent observation · Use ← → to browse · Esc to close</p></dialog>
manifest.json CHANGED
@@ -6,30 +6,62 @@
6
  "manifest": "https://huggingface.co/datasets/RLE-Bench/programmable-vla/resolve/c2e39c9ea8f3a9d3e7680e4818d294770f032c21/manifest.json"
7
  },
8
  "files": {
 
 
 
 
 
 
 
 
9
  ".gitattributes": {
10
  "bytes": 56,
11
  "sha256": "34a4d6e437537e78bc242418805a3af3d71b43980280482fd8fc6bfda91f79f8"
12
  },
13
  "README.md": {
14
- "bytes": 3817,
15
- "sha256": "841e3cf4bad28e94696efe819b48c0b6fbf7448ee1d9a4e03f16fda4a8a8f48d"
16
  },
17
- "app.js": {
18
- "bytes": 94521,
19
- "sha256": "07f7896f4cd07f54b8ba5c616d075ac0b3fb0328d49a1321bdb305ec9dd6a11f"
20
  },
21
- "assets/anthropic-logo.svg": {
22
- "bytes": 352,
23
- "sha256": "a53108594a23b740fbb08623f6fffdda1d73608b552988a9ffda9f0944ae66a1"
24
  },
25
- "assets/kinex-logo-night.svg": {
26
- "bytes": 725,
27
- "sha256": "7ed5de35505694eb892fc3b601d92e1d2fe864b1b0863fc0afff7c873fcfcc7c"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
28
  },
29
  "assets/kinex-logo.svg": {
30
  "bytes": 725,
31
  "sha256": "b27d9f4bfb9557513913b43b95108d995c7a18241629631a39889a2989b744c7"
32
  },
 
 
 
 
33
  "assets/openai-logo.svg": {
34
  "bytes": 2571,
35
  "sha256": "8e1b976ba47e927ac2928303fd5362fcadfefd68743506510596f107df676e58"
@@ -38,45 +70,67 @@
38
  "bytes": 287,
39
  "sha256": "4731ad16fd0b9b8f7dc02e05de3c1de0dd70223b93056d8345c8175bd9cad287"
40
  },
41
- "data-source.json": {
42
- "bytes": 2053,
43
- "sha256": "03adf23d135a31081819c23f9244b922ea26a6ea20a89970b149738dcc7f6ee9"
44
- },
45
- "history/data-source.json": {
46
- "bytes": 2109,
47
- "sha256": "be65ec2dbbd2449a0236c9636a112e3b6112e40699c8820d44a159c30ee536dd"
48
  },
49
- "history-app.js": {
50
- "bytes": 87082,
51
- "sha256": "31a39183c6636b5cb9f21e209d1f834757967983d1d0a6e1e59a0bae5ef7a2f8"
52
  },
53
- "history.html": {
54
- "bytes": 3298,
55
- "sha256": "8b0691838063224bce2a991d7bb0672897ef8f51bbc39ce38afb4a67cb6e39d0"
56
- },
57
- "icon.svg": {
58
  "bytes": 725,
59
  "sha256": "b27d9f4bfb9557513913b43b95108d995c7a18241629631a39889a2989b744c7"
60
  },
61
- "index.html": {
62
- "bytes": 3248,
63
- "sha256": "f022be45669e0eae5b3db57f5886c1bb10cf3b49d6f5546ff178dc088faf73b7"
64
  },
65
- "policy.css": {
 
 
 
 
66
  "bytes": 1067,
67
  "sha256": "e564132eb242d994b3a0388da20dd9d1cef28d849447cceca674bb4beef32660"
68
  },
 
 
 
 
 
 
 
 
69
  "probes/bridge-20261028/index.html": {
70
  "bytes": 6573,
71
  "sha256": "d09e9dd06e356c20b6468a30b175d49840acc55ed385690c9e40613e13ceaf6a"
72
  },
73
- "style.css": {
74
- "bytes": 60419,
75
- "sha256": "bd1a59147e1d5e6c4fc5abd0871fb7b2e5e282a9ee3d15ca4df8a219509af69c"
76
  },
77
- "usage-metrics.js": {
78
- "bytes": 5238,
79
- "sha256": "330e92f8eb9670cb506f2909a2a47ee8f0bd569199898df3bfa044239ae64161"
 
 
 
 
 
 
 
 
 
 
 
 
80
  }
 
 
 
 
 
 
81
  }
82
  }
 
6
  "manifest": "https://huggingface.co/datasets/RLE-Bench/programmable-vla/resolve/c2e39c9ea8f3a9d3e7680e4818d294770f032c21/manifest.json"
7
  },
8
  "files": {
9
+ "app.js": {
10
+ "bytes": 94913,
11
+ "sha256": "19672228deb8715bb6ccd5cf18dcc6fe70b450bf5d70dca35fb620155e6819fc"
12
+ },
13
+ "history-app.js": {
14
+ "bytes": 87082,
15
+ "sha256": "31a39183c6636b5cb9f21e209d1f834757967983d1d0a6e1e59a0bae5ef7a2f8"
16
+ },
17
  ".gitattributes": {
18
  "bytes": 56,
19
  "sha256": "34a4d6e437537e78bc242418805a3af3d71b43980280482fd8fc6bfda91f79f8"
20
  },
21
  "README.md": {
22
+ "bytes": 4270,
23
+ "sha256": "6fca8cdf229bfe13a5d0a77f4a73eccd4519f0f6b1dbf0a0a7f0cfd641c3c4b8"
24
  },
25
+ "icon.svg": {
26
+ "bytes": 725,
27
+ "sha256": "b27d9f4bfb9557513913b43b95108d995c7a18241629631a39889a2989b744c7"
28
  },
29
+ "usage-metrics.js": {
30
+ "bytes": 5238,
31
+ "sha256": "330e92f8eb9670cb506f2909a2a47ee8f0bd569199898df3bfa044239ae64161"
32
  },
33
+ "history.html": {
34
+ "bytes": 3298,
35
+ "sha256": "8b0691838063224bce2a991d7bb0672897ef8f51bbc39ce38afb4a67cb6e39d0"
36
+ },
37
+ "index.html": {
38
+ "bytes": 3299,
39
+ "sha256": "1a9a1221e74c4e3b7408ac7b4b625e924d17301b288abf21cfb3ebfa0e33e842"
40
+ },
41
+ "policy.css": {
42
+ "bytes": 1067,
43
+ "sha256": "e564132eb242d994b3a0388da20dd9d1cef28d849447cceca674bb4beef32660"
44
+ },
45
+ "style.css": {
46
+ "bytes": 60419,
47
+ "sha256": "bd1a59147e1d5e6c4fc5abd0871fb7b2e5e282a9ee3d15ca4df8a219509af69c"
48
+ },
49
+ "data-source.json": {
50
+ "bytes": 2053,
51
+ "sha256": "03adf23d135a31081819c23f9244b922ea26a6ea20a89970b149738dcc7f6ee9"
52
+ },
53
+ "history/data-source.json": {
54
+ "bytes": 2109,
55
+ "sha256": "be65ec2dbbd2449a0236c9636a112e3b6112e40699c8820d44a159c30ee536dd"
56
  },
57
  "assets/kinex-logo.svg": {
58
  "bytes": 725,
59
  "sha256": "b27d9f4bfb9557513913b43b95108d995c7a18241629631a39889a2989b744c7"
60
  },
61
+ "assets/kinex-logo-night.svg": {
62
+ "bytes": 725,
63
+ "sha256": "7ed5de35505694eb892fc3b601d92e1d2fe864b1b0863fc0afff7c873fcfcc7c"
64
+ },
65
  "assets/openai-logo.svg": {
66
  "bytes": 2571,
67
  "sha256": "8e1b976ba47e927ac2928303fd5362fcadfefd68743506510596f107df676e58"
 
70
  "bytes": 287,
71
  "sha256": "4731ad16fd0b9b8f7dc02e05de3c1de0dd70223b93056d8345c8175bd9cad287"
72
  },
73
+ "assets/anthropic-logo.svg": {
74
+ "bytes": 352,
75
+ "sha256": "a53108594a23b740fbb08623f6fffdda1d73608b552988a9ffda9f0944ae66a1"
 
 
 
 
76
  },
77
+ "hard/app.js": {
78
+ "bytes": 93978,
79
+ "sha256": "c8700f8239045156d52df89c3a9d7d02fde81bacc55d8933123fee7467eeb914"
80
  },
81
+ "hard/icon.svg": {
 
 
 
 
82
  "bytes": 725,
83
  "sha256": "b27d9f4bfb9557513913b43b95108d995c7a18241629631a39889a2989b744c7"
84
  },
85
+ "hard/usage-metrics.js": {
86
+ "bytes": 5238,
87
+ "sha256": "330e92f8eb9670cb506f2909a2a47ee8f0bd569199898df3bfa044239ae64161"
88
  },
89
+ "hard/index.html": {
90
+ "bytes": 3314,
91
+ "sha256": "1b5d77577cea531485bbcc9063552c8a22878e32c268dc1c5aeeb87583a8a356"
92
+ },
93
+ "hard/policy.css": {
94
  "bytes": 1067,
95
  "sha256": "e564132eb242d994b3a0388da20dd9d1cef28d849447cceca674bb4beef32660"
96
  },
97
+ "hard/style.css": {
98
+ "bytes": 60419,
99
+ "sha256": "bd1a59147e1d5e6c4fc5abd0871fb7b2e5e282a9ee3d15ca4df8a219509af69c"
100
+ },
101
+ "hard/data-source.json": {
102
+ "bytes": 1191,
103
+ "sha256": "ac332c73322a1efb2018f9e87641fd2b6becb4fad18141edd3013d66e9ee60df"
104
+ },
105
  "probes/bridge-20261028/index.html": {
106
  "bytes": 6573,
107
  "sha256": "d09e9dd06e356c20b6468a30b175d49840acc55ed385690c9e40613e13ceaf6a"
108
  },
109
+ "hard/assets/kinex-logo.svg": {
110
+ "bytes": 725,
111
+ "sha256": "b27d9f4bfb9557513913b43b95108d995c7a18241629631a39889a2989b744c7"
112
  },
113
+ "hard/assets/kinex-logo-night.svg": {
114
+ "bytes": 725,
115
+ "sha256": "7ed5de35505694eb892fc3b601d92e1d2fe864b1b0863fc0afff7c873fcfcc7c"
116
+ },
117
+ "hard/assets/openai-logo.svg": {
118
+ "bytes": 2571,
119
+ "sha256": "8e1b976ba47e927ac2928303fd5362fcadfefd68743506510596f107df676e58"
120
+ },
121
+ "hard/assets/vla-logo.svg": {
122
+ "bytes": 287,
123
+ "sha256": "4731ad16fd0b9b8f7dc02e05de3c1de0dd70223b93056d8345c8175bd9cad287"
124
+ },
125
+ "hard/assets/anthropic-logo.svg": {
126
+ "bytes": 352,
127
+ "sha256": "a53108594a23b740fbb08623f6fffdda1d73608b552988a9ffda9f0944ae66a1"
128
  }
129
+ },
130
+ "hard_dataset": {
131
+ "repo": "RLE-Bench/programmable-vla",
132
+ "revision": "b07d88579523eeeefdf7ad2ca14ee65340af5d4e",
133
+ "manifest": "https://huggingface.co/datasets/RLE-Bench/programmable-vla/resolve/b07d88579523eeeefdf7ad2ca14ee65340af5d4e/manifest.json",
134
+ "results": "https://huggingface.co/datasets/RLE-Bench/programmable-vla/resolve/b07d88579523eeeefdf7ad2ca14ee65340af5d4e/hard/data.json"
135
  }
136
  }