yzzhao commited on
Commit
ccaf22c
·
verified ·
1 Parent(s): b8b8501

Add selectable model cards with saved per-panel preferences

Browse files
Files changed (9) hide show
  1. app.js +1 -0
  2. comparison-layout.css +12 -3
  3. hard/app.js +1 -0
  4. hard/index.html +3 -2
  5. index.html +3 -2
  6. manifest.json +18 -14
  7. model-cards.js +80 -0
  8. plus/app.js +1 -0
  9. plus/index.html +3 -2
app.js CHANGED
@@ -137,6 +137,7 @@ function overview() {
137
  current={type:'overview'};
138
  $('#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>
139
  <div class="agent-cards">${data.variants.map(v=>{const s=stats(episodes(v.id));return `<a class="agent-card ${s.n?'':'planned'}" href="#runs/${v.id}" style="--variant:${colors[v.id]}"><div class="card-header"><span class="agent-name">${icon(v)}${esc(v.label||v.agent)}</span><span class="state-label">${s.n===plannedTasks(v.id).length?'Complete':s.n?'Partial':'Planned'}</span></div><p class="card-model">${modelLabel(v)}</p><div class="card-rate"><strong>${pct(s.rate)}</strong><span>native success</span></div><div class="card-stats"><span><b>${s.n?s.passes+' / '+s.n:'—'}</b> passed</span><span class="card-cost" title="${esc(costNote(s))}"><b>${costValue(s)}</b> total cost<small>Estimated USD</small></span></div><div class="completion-track"><span style="width:${s.n/plannedTasks(v.id).length*100}%"></span></div><div class="card-bottom"><span>${s.n} / ${plannedTasks(v.id).length} evaluated</span><span>${s.n?'Explore runs':'View planned'} ${arrow}</span></div></a>`;}).join('')}</div><div id="comparison-mount">${comparisonTable()}</div><a class="audit-launcher" href="#instructions"><div><strong>Instructions audit</strong><p>Compare current RLE goals with native descriptions, runtime language pools and recorded episode instructions.</p></div><span aria-hidden="true">↗</span></a>${taskBrowser()}${methodology()}`;
 
140
  renderRows();
141
  }
142
  function runsPage(variant,params,restoredFilters=null) {
 
137
  current={type:'overview'};
138
  $('#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>
139
  <div class="agent-cards">${data.variants.map(v=>{const s=stats(episodes(v.id));return `<a class="agent-card ${s.n?'':'planned'}" href="#runs/${v.id}" style="--variant:${colors[v.id]}"><div class="card-header"><span class="agent-name">${icon(v)}${esc(v.label||v.agent)}</span><span class="state-label">${s.n===plannedTasks(v.id).length?'Complete':s.n?'Partial':'Planned'}</span></div><p class="card-model">${modelLabel(v)}</p><div class="card-rate"><strong>${pct(s.rate)}</strong><span>native success</span></div><div class="card-stats"><span><b>${s.n?s.passes+' / '+s.n:'—'}</b> passed</span><span class="card-cost" title="${esc(costNote(s))}"><b>${costValue(s)}</b> total cost<small>Estimated USD</small></span></div><div class="completion-track"><span style="width:${s.n/plannedTasks(v.id).length*100}%"></span></div><div class="card-bottom"><span>${s.n} / ${plannedTasks(v.id).length} evaluated</span><span>${s.n?'Explore runs':'View planned'} ${arrow}</span></div></a>`;}).join('')}</div><div id="comparison-mount">${comparisonTable()}</div><a class="audit-launcher" href="#instructions"><div><strong>Instructions audit</strong><p>Compare current RLE goals with native descriptions, runtime language pools and recorded episode instructions.</p></div><span aria-hidden="true">↗</span></a>${taskBrowser()}${methodology()}`;
140
+ ModelCards.mount($('.agent-cards'), 'easy');
141
  renderRows();
142
  }
143
  function runsPage(variant,params,restoredFilters=null) {
comparison-layout.css CHANGED
@@ -10,8 +10,8 @@
10
  .column-picker-actions{display:flex;gap:16px;flex-shrink:0;padding-top:3px}
11
  .column-picker-actions button:disabled{opacity:.4;cursor:default;text-decoration:none}
12
  .task-column-options{display:flex;flex-wrap:wrap;gap:8px}
13
- .task-column-toggle{display:inline-flex;align-items:center;gap:8px;padding:9px 12px;border:1px solid var(--line);border-radius:7px;background:var(--paper,#fff);text-align:left;font-size:11px;line-height:1.5;color:var(--muted)}
14
- .task-column-toggle:hover{border-color:var(--variant);color:var(--ink)}
15
  .task-column-toggle[aria-expanded=true]{border-color:var(--variant);color:var(--ink);background:color-mix(in srgb,var(--variant) 8%,white)}
16
  .column-toggle-icon{font-size:16px;line-height:1;color:var(--variant);width:13px;text-align:center;flex-shrink:0}
17
  .task-column-label{display:flex;align-items:center;justify-content:center;gap:8px}
@@ -33,7 +33,7 @@
33
  .task-column-picker{padding:16px}
34
  .column-picker-heading{flex-direction:column;gap:10px}
35
  .task-column-options{gap:7px}
36
- .task-column-toggle{font-size:11px;padding:8px 10px}
37
  .task-browser .filters{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px}
38
  .task-browser .filters .search-field{grid-column:1/-1;min-width:0}
39
  .task-browser .filters select{width:100%;max-width:100%;font-size:11px}
@@ -44,3 +44,12 @@
44
  .task-column-label{font-size:11px}
45
  .comparison-total>th{background:var(--lavender,#f4f3fc)!important}
46
  }
 
 
 
 
 
 
 
 
 
 
10
  .column-picker-actions{display:flex;gap:16px;flex-shrink:0;padding-top:3px}
11
  .column-picker-actions button:disabled{opacity:.4;cursor:default;text-decoration:none}
12
  .task-column-options{display:flex;flex-wrap:wrap;gap:8px}
13
+ .task-column-toggle,.model-card-toggle{display:inline-flex;align-items:center;gap:8px;padding:9px 12px;border:1px solid var(--line);border-radius:7px;background:var(--paper,#fff);text-align:left;font-size:11px;line-height:1.5;color:var(--muted)}
14
+ .task-column-toggle:hover,.model-card-toggle:hover{border-color:var(--variant);color:var(--ink)}
15
  .task-column-toggle[aria-expanded=true]{border-color:var(--variant);color:var(--ink);background:color-mix(in srgb,var(--variant) 8%,white)}
16
  .column-toggle-icon{font-size:16px;line-height:1;color:var(--variant);width:13px;text-align:center;flex-shrink:0}
17
  .task-column-label{display:flex;align-items:center;justify-content:center;gap:8px}
 
33
  .task-column-picker{padding:16px}
34
  .column-picker-heading{flex-direction:column;gap:10px}
35
  .task-column-options{gap:7px}
36
+ .task-column-toggle,.model-card-toggle{font-size:11px;padding:8px 10px}
37
  .task-browser .filters{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px}
38
  .task-browser .filters .search-field{grid-column:1/-1;min-width:0}
39
  .task-browser .filters select{width:100%;max-width:100%;font-size:11px}
 
44
  .task-column-label{font-size:11px}
45
  .comparison-total>th{background:var(--lavender,#f4f3fc)!important}
46
  }
47
+ /* Model-card controls share the task column selector's visual language. */
48
+ .model-card-picker{padding:20px 22px;margin-bottom:18px}
49
+ .model-card-picker h2{font-size:14px;font-weight:600;line-height:1.6}
50
+ .model-card-toggle{cursor:pointer}
51
+ .model-card-toggle input{width:15px;height:15px;margin:0;flex-shrink:0;accent-color:var(--variant)}
52
+ .model-card-toggle.selected{border-color:var(--variant);color:var(--ink);background:color-mix(in srgb,var(--variant) 8%,white)}
53
+ .model-card-toggle:focus-within{outline:2px solid var(--variant);outline-offset:2px}
54
+ .agent-card[hidden],.agent-cards[hidden]{display:none}
55
+ @media(max-width:600px){.model-card-picker{padding:16px}}
hard/app.js CHANGED
@@ -162,6 +162,7 @@ function overview() {
162
  current={type:'overview'};
163
  $('#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>demo_randomized · one episode per selected task.<br>Kinex and the paired Kinex + VLA study use RLE revised instructions; four standalone VLA checkpoints retain native instructions.</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>
164
  ${researchRerunNote()}${recordingPilotProgress()}${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 id="comparison-mount">${comparisonTable()}</div><a class="audit-launcher" href="#instructions"><div><strong>Instructions audit</strong><p>Compare current RLE goals with native descriptions, runtime language pools and recorded episode instructions.</p></div><span aria-hidden="true">↗</span></a>${taskBrowser()}${methodology()}`;
 
165
  renderRows();
166
  }
167
  function runsPage(variant,params,restoredFilters=null) {
 
162
  current={type:'overview'};
163
  $('#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>demo_randomized · one episode per selected task.<br>Kinex and the paired Kinex + VLA study use RLE revised instructions; four standalone VLA checkpoints retain native instructions.</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>
164
  ${researchRerunNote()}${recordingPilotProgress()}${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 id="comparison-mount">${comparisonTable()}</div><a class="audit-launcher" href="#instructions"><div><strong>Instructions audit</strong><p>Compare current RLE goals with native descriptions, runtime language pools and recorded episode instructions.</p></div><span aria-hidden="true">↗</span></a>${taskBrowser()}${methodology()}`;
165
+ ModelCards.mount($('.agent-cards'), 'hard');
166
  renderRows();
167
  }
168
  function runsPage(variant,params,restoredFilters=null) {
hard/index.html CHANGED
@@ -10,10 +10,11 @@
10
  <link rel="stylesheet" href="style.css?v=bd1a59147e1d">
11
  <script src="usage-metrics.js?v=330e92f8eb96" defer></script>
12
  <script src="../instruction-audit.js?v=7b5e9a418dec" defer></script>
13
- <script src="app.js?v=fc277dc28280" defer></script>
 
14
  <link rel="stylesheet" href="policy.css">
15
  <link rel="stylesheet" href="../instruction-audit.css?v=43163fc879ed">
16
- <link rel="stylesheet" href="../comparison-layout.css?v=aae6b25c444d">
17
  </head>
18
  <body>
19
  <a class="skip" href="#main">Skip to content</a>
 
10
  <link rel="stylesheet" href="style.css?v=bd1a59147e1d">
11
  <script src="usage-metrics.js?v=330e92f8eb96" defer></script>
12
  <script src="../instruction-audit.js?v=7b5e9a418dec" defer></script>
13
+ <script src="../model-cards.js?v=7e115b1b03ae" defer></script>
14
+ <script src="app.js?v=f3726a435e5a" defer></script>
15
  <link rel="stylesheet" href="policy.css">
16
  <link rel="stylesheet" href="../instruction-audit.css?v=43163fc879ed">
17
+ <link rel="stylesheet" href="../comparison-layout.css?v=359bdb6df354">
18
  </head>
19
  <body>
20
  <a class="skip" href="#main">Skip to content</a>
index.html CHANGED
@@ -10,10 +10,11 @@
10
  <link rel="stylesheet" href="style.css?v=bd1a59147e1d">
11
  <script src="usage-metrics.js?v=330e92f8eb96" defer></script>
12
  <script src="instruction-audit.js?v=7b5e9a418dec" defer></script>
13
- <script src="app.js?v=6a2a1e7891fd" defer></script>
 
14
  <link rel="stylesheet" href="policy.css">
15
  <link rel="stylesheet" href="instruction-audit.css?v=43163fc879ed">
16
- <link rel="stylesheet" href="comparison-layout.css?v=aae6b25c444d">
17
  </head>
18
  <body>
19
  <a class="skip" href="#main">Skip to content</a>
 
10
  <link rel="stylesheet" href="style.css?v=bd1a59147e1d">
11
  <script src="usage-metrics.js?v=330e92f8eb96" defer></script>
12
  <script src="instruction-audit.js?v=7b5e9a418dec" defer></script>
13
+ <script src="model-cards.js?v=7e115b1b03ae" defer></script>
14
+ <script src="app.js?v=f71de61b433f" defer></script>
15
  <link rel="stylesheet" href="policy.css">
16
  <link rel="stylesheet" href="instruction-audit.css?v=43163fc879ed">
17
+ <link rel="stylesheet" href="comparison-layout.css?v=359bdb6df354">
18
  </head>
19
  <body>
20
  <a class="skip" href="#main">Skip to content</a>
manifest.json CHANGED
@@ -11,8 +11,8 @@
11
  "sha256": "43163fc879edcc6dcc6e3c6bc1faa058d1ac3fd914fcb05302c5ca08640ef7d5"
12
  },
13
  "app.js": {
14
- "bytes": 90441,
15
- "sha256": "6a2a1e7891fd129ac04bf69c801f52011bd7cb116a343a00c8188833906a5e23"
16
  },
17
  "history-app.js": {
18
  "bytes": 87082,
@@ -43,8 +43,8 @@
43
  "sha256": "8b0691838063224bce2a991d7bb0672897ef8f51bbc39ce38afb4a67cb6e39d0"
44
  },
45
  "index.html": {
46
- "bytes": 3677,
47
- "sha256": "86b2b2f4d4a48f3195bb4be038a8cac76b1c370a93e2d29be95f5683efd1b1ac"
48
  },
49
  "policy.css": {
50
  "bytes": 1067,
@@ -99,8 +99,8 @@
99
  "sha256": "a53108594a23b740fbb08623f6fffdda1d73608b552988a9ffda9f0944ae66a1"
100
  },
101
  "hard/app.js": {
102
- "bytes": 96918,
103
- "sha256": "fc277dc2828030bc73d1eba68d10aaed1e776337f0dccd7c2fa98792f0fd0362"
104
  },
105
  "hard/icon.svg": {
106
  "bytes": 725,
@@ -111,8 +111,8 @@
111
  "sha256": "330e92f8eb9670cb506f2909a2a47ee8f0bd569199898df3bfa044239ae64161"
112
  },
113
  "hard/index.html": {
114
- "bytes": 3715,
115
- "sha256": "7c9c9ae696af37bcd3cf57c6621f703c4f445ba05da4473fbb4e706da3a3c46a"
116
  },
117
  "hard/policy.css": {
118
  "bytes": 1067,
@@ -127,8 +127,8 @@
127
  "sha256": "23354b68f8b32d82eb6a4a0cac7432ff4d1f18351d9b757d70b99a705f556597"
128
  },
129
  "plus/app.js": {
130
- "bytes": 96747,
131
- "sha256": "ca53816fe6c83bcc07e0476fd4e85da80cb4c41fec223eca77211d792d417344"
132
  },
133
  "plus/icon.svg": {
134
  "bytes": 725,
@@ -139,8 +139,8 @@
139
  "sha256": "330e92f8eb9670cb506f2909a2a47ee8f0bd569199898df3bfa044239ae64161"
140
  },
141
  "plus/index.html": {
142
- "bytes": 3710,
143
- "sha256": "2d5f4ba98c87cb65532465da3d8766f650b7c1ac626898d8188a121cd2b3c74e"
144
  },
145
  "plus/policy.css": {
146
  "bytes": 1067,
@@ -231,8 +231,12 @@
231
  "sha256": "63cef0604b0afd9b163634068b1c8aaaf3285e60e4bed3809f1ebe0d60552b13"
232
  },
233
  "comparison-layout.css": {
234
- "bytes": 3660,
235
- "sha256": "aae6b25c444d0d5607e0f3c90f418b613703915f7de84eb55daf3b97e7e4e6a0"
 
 
 
 
236
  }
237
  },
238
  "hard_dataset": {
 
11
  "sha256": "43163fc879edcc6dcc6e3c6bc1faa058d1ac3fd914fcb05302c5ca08640ef7d5"
12
  },
13
  "app.js": {
14
+ "bytes": 90488,
15
+ "sha256": "f71de61b433f0fc697cebd64de61946f3f7dcb78dc4a004999d036e8f45033f0"
16
  },
17
  "history-app.js": {
18
  "bytes": 87082,
 
43
  "sha256": "8b0691838063224bce2a991d7bb0672897ef8f51bbc39ce38afb4a67cb6e39d0"
44
  },
45
  "index.html": {
46
+ "bytes": 3737,
47
+ "sha256": "ef983eb864632472732fcdd442f42721e6012b3baf387455a47c9a836a04282d"
48
  },
49
  "policy.css": {
50
  "bytes": 1067,
 
99
  "sha256": "a53108594a23b740fbb08623f6fffdda1d73608b552988a9ffda9f0944ae66a1"
100
  },
101
  "hard/app.js": {
102
+ "bytes": 96965,
103
+ "sha256": "f3726a435e5a27b4e5d1a91cf5595ebf2a596c09d3b880e091abda3d9b444294"
104
  },
105
  "hard/icon.svg": {
106
  "bytes": 725,
 
111
  "sha256": "330e92f8eb9670cb506f2909a2a47ee8f0bd569199898df3bfa044239ae64161"
112
  },
113
  "hard/index.html": {
114
+ "bytes": 3778,
115
+ "sha256": "20effb13ec316f38bd30abbeb11448325489a8ef11fd69ba8111c63a4d43b208"
116
  },
117
  "hard/policy.css": {
118
  "bytes": 1067,
 
127
  "sha256": "23354b68f8b32d82eb6a4a0cac7432ff4d1f18351d9b757d70b99a705f556597"
128
  },
129
  "plus/app.js": {
130
+ "bytes": 96794,
131
+ "sha256": "71a4927bc597ddbb4e58dcb344e191a1dbd3ae1e3808781f5007a9764417e8f1"
132
  },
133
  "plus/icon.svg": {
134
  "bytes": 725,
 
139
  "sha256": "330e92f8eb9670cb506f2909a2a47ee8f0bd569199898df3bfa044239ae64161"
140
  },
141
  "plus/index.html": {
142
+ "bytes": 3773,
143
+ "sha256": "5ebf6595592196b0538bfc5670085958744e68cf4389026959eee43a11f25c7a"
144
  },
145
  "plus/policy.css": {
146
  "bytes": 1067,
 
231
  "sha256": "63cef0604b0afd9b163634068b1c8aaaf3285e60e4bed3809f1ebe0d60552b13"
232
  },
233
  "comparison-layout.css": {
234
+ "bytes": 4387,
235
+ "sha256": "359bdb6df354c6ff81e167720d5e1898724483e28a84dcfd6d49dd90380f2b7e"
236
+ },
237
+ "model-cards.js": {
238
+ "bytes": 3400,
239
+ "sha256": "7e115b1b03ae5c273e579aa93603199db23060d7b8af764ade90199bf47dfc4a"
240
  }
241
  },
242
  "hard_dataset": {
model-cards.js ADDED
@@ -0,0 +1,80 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /* Model-card visibility is saved separately for each benchmark panel. */
2
+ window.ModelCards = (() => {
3
+ const selections = new Map();
4
+
5
+ function mount(grid, panel) {
6
+ const storageKey = `programvla:model-cards:${panel}`;
7
+ if (!selections.has(panel)) {
8
+ let saved = [];
9
+ try {
10
+ const value = JSON.parse(localStorage.getItem(storageKey));
11
+ if (Array.isArray(value)) saved = value.filter(id => typeof id === 'string');
12
+ } catch {}
13
+ selections.set(panel, new Set(saved));
14
+ }
15
+ const hidden = selections.get(panel);
16
+ const picker = document.createElement('section');
17
+ picker.className = 'panel model-card-picker';
18
+ picker.setAttribute('aria-labelledby', 'model-card-picker-title');
19
+ picker.innerHTML = `<div class="column-picker-heading"><div>
20
+ <h2 id="model-card-picker-title">Models to display</h2>
21
+ <p id="model-card-status" role="status"></p>
22
+ </div><div class="column-picker-actions">
23
+ <button type="button" class="text-button" data-model-cards="all">Show all</button>
24
+ <button type="button" class="text-button" data-model-cards="none">Hide all</button>
25
+ </div></div><div class="task-column-options" role="group" aria-label="Models to display"></div>`;
26
+ const options = picker.querySelector('.task-column-options');
27
+ const items = [...grid.querySelectorAll('.agent-card')].map(card => {
28
+ const id = card.getAttribute('href').slice('#runs/'.length);
29
+ card.id = `model-card-${id}`;
30
+ const label = document.createElement('label');
31
+ label.className = 'model-card-toggle';
32
+ label.style.setProperty('--variant', card.style.getPropertyValue('--variant'));
33
+ label.title = card.querySelector('.card-model').textContent.trim();
34
+ const input = document.createElement('input');
35
+ input.type = 'checkbox';
36
+ input.value = id;
37
+ input.setAttribute('aria-controls', card.id);
38
+ const name = document.createElement('span');
39
+ name.textContent = card.querySelector('.agent-name').textContent.trim();
40
+ label.append(input, name);
41
+ options.append(label);
42
+ input.addEventListener('change', () => {
43
+ if (input.checked) hidden.delete(id); else hidden.add(id);
44
+ update(true);
45
+ });
46
+ return {id, card, input, label};
47
+ });
48
+
49
+ function update(save = false) {
50
+ let count = 0;
51
+ for (const {id, card, input, label} of items) {
52
+ const visible = !hidden.has(id);
53
+ card.hidden = !visible;
54
+ input.checked = visible;
55
+ label.classList.toggle('selected', visible);
56
+ if (visible) count++;
57
+ }
58
+ grid.hidden = count === 0;
59
+ picker.querySelector('#model-card-status').textContent = `${count} of ${items.length} model cards shown`;
60
+ picker.querySelector('[data-model-cards="all"]').disabled = count === items.length;
61
+ picker.querySelector('[data-model-cards="none"]').disabled = count === 0;
62
+ if (save) {
63
+ try { localStorage.setItem(storageKey, JSON.stringify([...hidden])); } catch {}
64
+ }
65
+ }
66
+
67
+ picker.addEventListener('click', event => {
68
+ const button = event.target.closest('[data-model-cards]');
69
+ if (!button) return;
70
+ for (const {id} of items) {
71
+ if (button.dataset.modelCards === 'all') hidden.delete(id); else hidden.add(id);
72
+ }
73
+ update(true);
74
+ });
75
+ grid.before(picker);
76
+ update();
77
+ }
78
+
79
+ return {mount};
80
+ })();
plus/app.js CHANGED
@@ -161,6 +161,7 @@ function overview() {
161
  current={type:'overview'};
162
  $('#main').innerHTML=`<section class="hero"><div><div class="eyebrow"><span class="tiny-logo">✦</span> RLE-Bench · Embodied agent evaluation</div><h1>RoboTwin 2.0-Plus.<br><span>Plus evaluation.</span></h1><p>Eight configurations · four VLA checkpoints retain native instructions.<br>Pure Kinex evaluates three tasks per configuration with RLE revised instructions.</p></div><div class="hero-facts"><div><strong>${data.families.length}</strong><span>configurations</span></div><div><strong>${data.tasks.length}</strong><span>task/configuration pairs</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>
163
  ${researchRerunNote()}${recordingPilotProgress()}${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 id="comparison-mount">${comparisonTable()}</div><a class="audit-launcher" href="#instructions"><div><strong>Instructions audit</strong><p>Compare current RLE goals with native descriptions, runtime language pools and recorded episode instructions.</p></div><span aria-hidden="true">↗</span></a>${taskBrowser()}${methodology()}`;
 
164
  renderRows();
165
  }
166
  function runsPage(variant,params,restoredFilters=null) {
 
161
  current={type:'overview'};
162
  $('#main').innerHTML=`<section class="hero"><div><div class="eyebrow"><span class="tiny-logo">✦</span> RLE-Bench · Embodied agent evaluation</div><h1>RoboTwin 2.0-Plus.<br><span>Plus evaluation.</span></h1><p>Eight configurations · four VLA checkpoints retain native instructions.<br>Pure Kinex evaluates three tasks per configuration with RLE revised instructions.</p></div><div class="hero-facts"><div><strong>${data.families.length}</strong><span>configurations</span></div><div><strong>${data.tasks.length}</strong><span>task/configuration pairs</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>
163
  ${researchRerunNote()}${recordingPilotProgress()}${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 id="comparison-mount">${comparisonTable()}</div><a class="audit-launcher" href="#instructions"><div><strong>Instructions audit</strong><p>Compare current RLE goals with native descriptions, runtime language pools and recorded episode instructions.</p></div><span aria-hidden="true">↗</span></a>${taskBrowser()}${methodology()}`;
164
+ ModelCards.mount($('.agent-cards'), 'plus');
165
  renderRows();
166
  }
167
  function runsPage(variant,params,restoredFilters=null) {
plus/index.html CHANGED
@@ -10,10 +10,11 @@
10
  <link rel="stylesheet" href="style.css?v=bd1a59147e1d">
11
  <script src="usage-metrics.js?v=330e92f8eb96" defer></script>
12
  <script src="../instruction-audit.js?v=7b5e9a418dec" defer></script>
13
- <script src="app.js?v=ca53816fe6c8" defer></script>
 
14
  <link rel="stylesheet" href="policy.css">
15
  <link rel="stylesheet" href="../instruction-audit.css?v=43163fc879ed">
16
- <link rel="stylesheet" href="../comparison-layout.css?v=aae6b25c444d">
17
  </head>
18
  <body>
19
  <a class="skip" href="#main">Skip to content</a>
 
10
  <link rel="stylesheet" href="style.css?v=bd1a59147e1d">
11
  <script src="usage-metrics.js?v=330e92f8eb96" defer></script>
12
  <script src="../instruction-audit.js?v=7b5e9a418dec" defer></script>
13
+ <script src="../model-cards.js?v=7e115b1b03ae" defer></script>
14
+ <script src="app.js?v=71a4927bc597" defer></script>
15
  <link rel="stylesheet" href="policy.css">
16
  <link rel="stylesheet" href="../instruction-audit.css?v=43163fc879ed">
17
+ <link rel="stylesheet" href="../comparison-layout.css?v=359bdb6df354">
18
  </head>
19
  <body>
20
  <a class="skip" href="#main">Skip to content</a>