renjianzhexuejia commited on
Commit
9ad07ca
·
verified ·
1 Parent(s): 04b359f

Update leaderboard, detailed results, figures and submission interface

Browse files

Publish the reviewed UI and prepare the Docker submission service. Keep the static app running while private runtime credentials are configured.

.gitattributes CHANGED
@@ -35,3 +35,7 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
36
  assets/judge-base.png filter=lfs diff=lfs merge=lfs -text
37
  assets/judge-plus.png filter=lfs diff=lfs merge=lfs -text
 
 
 
 
 
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
36
  assets/judge-base.png filter=lfs diff=lfs merge=lfs -text
37
  assets/judge-plus.png filter=lfs diff=lfs merge=lfs -text
38
+ assets/benchmark-overview.png filter=lfs diff=lfs merge=lfs -text
39
+ assets/rise-agent.png filter=lfs diff=lfs merge=lfs -text
40
+ dist/assets/benchmark-overview.png filter=lfs diff=lfs merge=lfs -text
41
+ dist/assets/rise-agent.png filter=lfs diff=lfs merge=lfs -text
Dockerfile ADDED
@@ -0,0 +1,12 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ FROM python:3.11-slim
2
+ RUN useradd -m -u 1000 user
3
+ WORKDIR /app
4
+ COPY pyproject.toml /app/
5
+ COPY server /app/server
6
+ RUN pip install --no-cache-dir .
7
+ COPY --chown=user scripts/serve.py /app/scripts/serve.py
8
+ COPY --chown=user dist /app/dist
9
+ USER user
10
+ ENV PYTHONUNBUFFERED=1 HF_HOME=/home/user/.cache/huggingface
11
+ EXPOSE 7860
12
+ CMD ["python", "scripts/serve.py"]
admin.html ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ <!doctype html>
2
+ <html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>Review submissions · RISEBench</title><link rel="icon" href="assets/favicon.svg"><link rel="stylesheet" href="styles.css"><link rel="stylesheet" href="portal.css"></head>
3
+ <body data-page="admin"><main class="portal-width review-width">
4
+ <nav class="portal-nav" aria-label="Main navigation"><a class="wordmark" href="index.html">RISEBench<span>++</span></a><div><a href="index.html">Leaderboard</a><a href="submit.html">Submit results</a><button id="sign-out" class="text-button" hidden>Sign out</button></div></nav>
5
+ <header class="portal-heading"><span class="section-kicker">REVIEW WORKSPACE</span><h1>Review submissions.</h1><p>Verify evaluation artifacts, then approve or return results.</p></header>
6
+ <p class="notice" id="service-notice" hidden></p>
7
+ <section class="portal-card login-card" id="login-panel"><h2>Administrator sign in</h2><form id="login-form"><label id="passphrase-label">Passphrase<input type="password" id="admin-passphrase" autocomplete="current-password" required></label><p class="form-message" id="login-message" role="status"></p><button type="submit" class="primary-button" id="login-button">Sign in</button></form></section>
8
+ <section id="review-workspace" hidden><div class="review-toolbar"><div class="review-filters" role="group" aria-label="Submission status"><button data-status="pending" aria-pressed="true">Pending <span id="pending-count">0</span></button><button data-status="approved" aria-pressed="false">Approved</button><button data-status="rejected" aria-pressed="false">Returned</button><button data-status="withdrawn" aria-pressed="false">Withdrawn</button><button data-status="all" aria-pressed="false">All</button></div><button class="outline-button" id="refresh-queue">Refresh</button></div><p id="queue-message" class="form-message" role="status"></p><div class="review-layout"><aside class="review-list" id="review-list" aria-label="Submissions"></aside><section class="portal-card review-detail" id="review-detail"><div class="review-empty"><h2>Select a submission</h2><p>Its scores and evaluation artifacts will appear here.</p></div></section></div></section>
9
+ <footer class="page-footer"><a href="index.html">← Back to leaderboard</a><span>Private review workspace</span></footer>
10
+ </main><script id="submission-schema" type="application/json">{"benchmarks": [{"id": "risebench-plusplus", "name": "RISEBench++", "case_count": 1000, "available_result_languages": ["en", "zh"], "accuracy_unit": "%", "metric_unit": "/100", "score_decimals": 1, "default_sort": "total", "dimensions": [{"key": "temporal", "label": "Temporal", "description": "Infer how a scene changes over time."}, {"key": "causal", "label": "Causal", "description": "Reason about causes, actions, and their consequences."}, {"key": "spatial", "label": "Spatial", "description": "Reason about spatial relationships and transformations."}, {"key": "logical", "label": "Logical", "description": "Apply explicit rules, patterns, and logical constraints."}, {"key": "counterfactual", "label": "Counterfactual", "description": "Visualize outcomes under hypothetical or contrary-to-fact conditions."}, {"key": "hybrid", "label": "Hybrid", "description": "Combine reasoning across three to five successive editing instructions."}], "metrics": [{"key": "instruction_reasoning", "label": "Instruction Reasoning", "description": "Whether the edit realizes the intended reasoning outcome."}, {"key": "appearance_consistency", "label": "Appearance Consistency", "description": "Whether content that should remain unchanged is preserved."}, {"key": "visual_plausibility", "label": "Visual Plausibility", "description": "Visual quality and plausibility; logical tasks are excluded."}], "accuracy_columns": [{"key": "temporal", "label": "Temporal", "description": "Infer how a scene changes over time."}, {"key": "causal", "label": "Causal", "description": "Reason about causes, actions, and their consequences."}, {"key": "spatial", "label": "Spatial", "description": "Reason about spatial relationships and transformations."}, {"key": "logical", "label": "Logical", "description": "Apply explicit rules, patterns, and logical constraints."}, {"key": "counterfactual", "label": "Counterfactual", "description": "Visualize outcomes under hypothetical or contrary-to-fact conditions."}, {"key": "hybrid", "label": "Hybrid", "description": "Combine reasoning across three to five successive editing instructions."}, {"key": "single", "label": "Single", "description": "Accuracy on single-image cases."}, {"key": "multi", "label": "Multi", "description": "Accuracy on multi-image cases. Not evaluated for models without multi-image support."}, {"key": "total", "label": "Total", "description": "Accuracy on the complete benchmark. Not evaluated for single-image-only models."}], "subcategory_columns": [{"key": "temporal_common_sense_knowledge", "label": "Common-Sense Knowledge", "dimension": "temporal", "case_count": 85, "multi_image_case_count": 0, "code": "CSK", "description": "Temporal · Common-Sense Knowledge — accuracy (%)"}, {"key": "temporal_context_knowledge", "label": "Context Knowledge", "dimension": "temporal", "case_count": 52, "multi_image_case_count": 28, "code": "CtxK", "description": "Temporal · Context Knowledge — accuracy (%)"}, {"key": "temporal_disciplinary_knowledge", "label": "Disciplinary Knowledge", "dimension": "temporal", "case_count": 63, "multi_image_case_count": 4, "code": "DK", "description": "Temporal · Disciplinary Knowledge — accuracy (%)"}, {"key": "causal_common_sense_knowledge", "label": "Common-Sense Knowledge", "dimension": "causal", "case_count": 80, "multi_image_case_count": 1, "code": "CSK", "description": "Causal · Common-Sense Knowledge — accuracy (%)"}, {"key": "causal_context_knowledge", "label": "Context Knowledge", "dimension": "causal", "case_count": 40, "multi_image_case_count": 2, "code": "CtxK", "description": "Causal · Context Knowledge — accuracy (%)"}, {"key": "causal_disciplinary_knowledge", "label": "Disciplinary Knowledge", "dimension": "causal", "case_count": 80, "multi_image_case_count": 5, "code": "DK", "description": "Causal · Disciplinary Knowledge — accuracy (%)"}, {"key": "spatial_relation", "label": "Relation", "dimension": "spatial", "case_count": 106, "multi_image_case_count": 6, "code": "Rel.", "description": "Spatial · Relation — accuracy (%)"}, {"key": "spatial_structure", "label": "Structure", "dimension": "spatial", "case_count": 94, "multi_image_case_count": 12, "code": "Struct.", "description": "Spatial · Structure — accuracy (%)"}, {"key": "logical_explicit_rule_deduction", "label": "Explicit Rule Deduction", "dimension": "logical", "case_count": 123, "multi_image_case_count": 0, "code": "ERD", "description": "Logical · Explicit Rule Deduction — accuracy (%)"}, {"key": "logical_implicit_pattern_induction", "label": "Implicit Pattern Induction", "dimension": "logical", "case_count": 77, "multi_image_case_count": 20, "code": "IPI", "description": "Logical · Implicit Pattern Induction — accuracy (%)"}, {"key": "counterfactual_counterfactual_imagination", "label": "Counterfactual Imagination", "dimension": "counterfactual", "case_count": 70, "multi_image_case_count": 0, "code": "CFI", "description": "Counterfactual · Counterfactual Imagination — accuracy (%)"}, {"key": "counterfactual_anomaly_correction_and_generation", "label": "Anomaly Correction and Generation", "dimension": "counterfactual", "case_count": 30, "multi_image_case_count": 0, "code": "ACG", "description": "Counterfactual · Anomaly Correction and Generation — accuracy (%)"}], "task_type_columns": [{"key": "T01", "code": "T01", "label": "Life Progression", "dimension": "temporal", "subcategory": "temporal_common_sense_knowledge", "case_count": 24, "multi_image_case_count": 0, "description": "Temporal · Life Progression — accuracy (%)"}, {"key": "T02", "code": "T02", "label": "Material Transformation", "dimension": "temporal", "subcategory": "temporal_common_sense_knowledge", "case_count": 9, "multi_image_case_count": 0, "description": "Temporal · Material Transformation — accuracy (%)"}, {"key": "T03", "code": "T03", "label": "Natural Environmental Changes", "dimension": "temporal", "subcategory": "temporal_common_sense_knowledge", "case_count": 13, "multi_image_case_count": 0, "description": "Temporal · Natural Environmental Changes — accuracy (%)"}, {"key": "T04", "code": "T04", "label": "Physical Aging", "dimension": "temporal", "subcategory": "temporal_common_sense_knowledge", "case_count": 20, "multi_image_case_count": 0, "description": "Temporal · Physical Aging — accuracy (%)"}, {"key": "T05", "code": "T05", "label": "Social Activities", "dimension": "temporal", "subcategory": "temporal_common_sense_knowledge", "case_count": 8, "multi_image_case_count": 0, "description": "Temporal · Social Activities — accuracy (%)"}, {"key": "T06", "code": "T06", "label": "Tool Evolution", "dimension": "temporal", "subcategory": "temporal_common_sense_knowledge", "case_count": 7, "multi_image_case_count": 0, "description": "Temporal · Tool Evolution — accuracy (%)"}, {"key": "T07", "code": "T07", "label": "Urban Evolution", "dimension": "temporal", "subcategory": "temporal_common_sense_knowledge", "case_count": 4, "multi_image_case_count": 0, "description": "Temporal · Urban Evolution — accuracy (%)"}, {"key": "T08", "code": "T08", "label": "Temporal State Transition", "dimension": "temporal", "subcategory": "temporal_context_knowledge", "case_count": 15, "multi_image_case_count": 4, "description": "Temporal · Temporal State Transition — accuracy (%)"}, {"key": "T09", "code": "T09", "label": "Precise Temporal Localization", "dimension": "temporal", "subcategory": "temporal_context_knowledge", "case_count": 14, "multi_image_case_count": 2, "description": "Temporal · Precise Temporal Localization — accuracy (%)"}, {"key": "T10", "code": "T10", "label": "Position Change", "dimension": "temporal", "subcategory": "temporal_context_knowledge", "case_count": 15, "multi_image_case_count": 14, "description": "Temporal · Position Change — accuracy (%)"}, {"key": "T11", "code": "T11", "label": "Action Sequence", "dimension": "temporal", "subcategory": "temporal_context_knowledge", "case_count": 8, "multi_image_case_count": 8, "description": "Temporal · Action Sequence — accuracy (%)"}, {"key": "T12", "code": "T12", "label": "Physics", "dimension": "temporal", "subcategory": "temporal_disciplinary_knowledge", "case_count": 4, "multi_image_case_count": 0, "description": "Temporal · Physics — accuracy (%)"}, {"key": "T13", "code": "T13", "label": "Chemistry", "dimension": "temporal", "subcategory": "temporal_disciplinary_knowledge", "case_count": 8, "multi_image_case_count": 4, "description": "Temporal · Chemistry — accuracy (%)"}, {"key": "T14", "code": "T14", "label": "Biology", "dimension": "temporal", "subcategory": "temporal_disciplinary_knowledge", "case_count": 9, "multi_image_case_count": 0, "description": "Temporal · Biology — accuracy (%)"}, {"key": "T15", "code": "T15", "label": "Astronomy", "dimension": "temporal", "subcategory": "temporal_disciplinary_knowledge", "case_count": 12, "multi_image_case_count": 0, "description": "Temporal · Astronomy — accuracy (%)"}, {"key": "T16", "code": "T16", "label": "Geography", "dimension": "temporal", "subcategory": "temporal_disciplinary_knowledge", "case_count": 18, "multi_image_case_count": 0, "description": "Temporal · Geography — accuracy (%)"}, {"key": "T17", "code": "T17", "label": "History", "dimension": "temporal", "subcategory": "temporal_disciplinary_knowledge", "case_count": 5, "multi_image_case_count": 0, "description": "Temporal · History — accuracy (%)"}, {"key": "T18", "code": "T18", "label": "Medicine", "dimension": "temporal", "subcategory": "temporal_disciplinary_knowledge", "case_count": 4, "multi_image_case_count": 0, "description": "Temporal · Medicine — accuracy (%)"}, {"key": "T19", "code": "T19", "label": "Computer Science", "dimension": "temporal", "subcategory": "temporal_disciplinary_knowledge", "case_count": 3, "multi_image_case_count": 0, "description": "Temporal · Computer Science — accuracy (%)"}, {"key": "C01", "code": "C01", "label": "Physical State Transition", "dimension": "causal", "subcategory": "causal_common_sense_knowledge", "case_count": 31, "multi_image_case_count": 0, "description": "Causal · Physical State Transition — accuracy (%)"}, {"key": "C02", "code": "C02", "label": "Structural Damage", "dimension": "causal", "subcategory": "causal_common_sense_knowledge", "case_count": 27, "multi_image_case_count": 0, "description": "Causal · Structural Damage — accuracy (%)"}, {"key": "C03", "code": "C03", "label": "Flexible Deformation", "dimension": "causal", "subcategory": "causal_common_sense_knowledge", "case_count": 22, "multi_image_case_count": 1, "description": "Causal · Flexible Deformation — accuracy (%)"}, {"key": "C04", "code": "C04", "label": "Magnitude Change", "dimension": "causal", "subcategory": "causal_context_knowledge", "case_count": 10, "multi_image_case_count": 0, "description": "Causal · Magnitude Change — accuracy (%)"}, {"key": "C05", "code": "C05", "label": "Reading Offset", "dimension": "causal", "subcategory": "causal_context_knowledge", "case_count": 10, "multi_image_case_count": 2, "description": "Causal · Reading Offset — accuracy (%)"}, {"key": "C06", "code": "C06", "label": "Order Relation", "dimension": "causal", "subcategory": "causal_context_knowledge", "case_count": 10, "multi_image_case_count": 0, "description": "Causal · Order Relation — accuracy (%)"}, {"key": "C07", "code": "C07", "label": "Feature Mapping", "dimension": "causal", "subcategory": "causal_context_knowledge", "case_count": 10, "multi_image_case_count": 0, "description": "Causal · Feature Mapping — accuracy (%)"}, {"key": "C08", "code": "C08", "label": "Physics", "dimension": "causal", "subcategory": "causal_disciplinary_knowledge", "case_count": 25, "multi_image_case_count": 1, "description": "Causal · Physics — accuracy (%)"}, {"key": "C09", "code": "C09", "label": "Chemistry", "dimension": "causal", "subcategory": "causal_disciplinary_knowledge", "case_count": 23, "multi_image_case_count": 4, "description": "Causal · Chemistry — accuracy (%)"}, {"key": "C10", "code": "C10", "label": "Biology", "dimension": "causal", "subcategory": "causal_disciplinary_knowledge", "case_count": 12, "multi_image_case_count": 0, "description": "Causal · Biology — accuracy (%)"}, {"key": "C11", "code": "C11", "label": "Astronomy", "dimension": "causal", "subcategory": "causal_disciplinary_knowledge", "case_count": 3, "multi_image_case_count": 0, "description": "Causal · Astronomy — accuracy (%)"}, {"key": "C12", "code": "C12", "label": "Medicine", "dimension": "causal", "subcategory": "causal_disciplinary_knowledge", "case_count": 4, "multi_image_case_count": 0, "description": "Causal · Medicine — accuracy (%)"}, {"key": "C13", "code": "C13", "label": "Music Theory", "dimension": "causal", "subcategory": "causal_disciplinary_knowledge", "case_count": 3, "multi_image_case_count": 0, "description": "Causal · Music Theory — accuracy (%)"}, {"key": "C14", "code": "C14", "label": "Computer Science", "dimension": "causal", "subcategory": "causal_disciplinary_knowledge", "case_count": 10, "multi_image_case_count": 0, "description": "Causal · Computer Science — accuracy (%)"}, {"key": "S01", "code": "S01", "label": "Adjacency", "dimension": "spatial", "subcategory": "spatial_relation", "case_count": 11, "multi_image_case_count": 0, "description": "Spatial · Adjacency — accuracy (%)"}, {"key": "S02", "code": "S02", "label": "Direction", "dimension": "spatial", "subcategory": "spatial_relation", "case_count": 11, "multi_image_case_count": 0, "description": "Spatial · Direction — accuracy (%)"}, {"key": "S03", "code": "S03", "label": "Orientation", "dimension": "spatial", "subcategory": "spatial_relation", "case_count": 11, "multi_image_case_count": 0, "description": "Spatial · Orientation — accuracy (%)"}, {"key": "S04", "code": "S04", "label": "Projection", "dimension": "spatial", "subcategory": "spatial_relation", "case_count": 12, "multi_image_case_count": 0, "description": "Spatial · Projection — accuracy (%)"}, {"key": "S05", "code": "S05", "label": "Distance", "dimension": "spatial", "subcategory": "spatial_relation", "case_count": 13, "multi_image_case_count": 0, "description": "Spatial · Distance — accuracy (%)"}, {"key": "S06", "code": "S06", "label": "Size", "dimension": "spatial", "subcategory": "spatial_relation", "case_count": 15, "multi_image_case_count": 0, "description": "Spatial · Size — accuracy (%)"}, {"key": "S07", "code": "S07", "label": "Configuration", "dimension": "spatial", "subcategory": "spatial_relation", "case_count": 18, "multi_image_case_count": 0, "description": "Spatial · Configuration — accuracy (%)"}, {"key": "S08", "code": "S08", "label": "Viewing Scale", "dimension": "spatial", "subcategory": "spatial_relation", "case_count": 9, "multi_image_case_count": 0, "description": "Spatial · Viewing Scale — accuracy (%)"}, {"key": "S09", "code": "S09", "label": "Localization", "dimension": "spatial", "subcategory": "spatial_relation", "case_count": 6, "multi_image_case_count": 6, "description": "Spatial · Localization — accuracy (%)"}, {"key": "S10", "code": "S10", "label": "Part-Whole Perception", "dimension": "spatial", "subcategory": "spatial_structure", "case_count": 24, "multi_image_case_count": 0, "description": "Spatial · Part-Whole Perception — accuracy (%)"}, {"key": "S11", "code": "S11", "label": "Geometric Regularities Reasoning", "dimension": "spatial", "subcategory": "spatial_structure", "case_count": 15, "multi_image_case_count": 0, "description": "Spatial · Geometric Regularities Reasoning — accuracy (%)"}, {"key": "S12", "code": "S12", "label": "Viewpoint Generation", "dimension": "spatial", "subcategory": "spatial_structure", "case_count": 26, "multi_image_case_count": 0, "description": "Spatial · Viewpoint Generation — accuracy (%)"}, {"key": "S13", "code": "S13", "label": "Environmental Structure Reasoning", "dimension": "spatial", "subcategory": "spatial_structure", "case_count": 19, "multi_image_case_count": 2, "description": "Spatial · Environmental Structure Reasoning — accuracy (%)"}, {"key": "S14", "code": "S14", "label": "Egocentric Scene Reconstruction", "dimension": "spatial", "subcategory": "spatial_structure", "case_count": 10, "multi_image_case_count": 10, "description": "Spatial · Egocentric Scene Reconstruction — accuracy (%)"}, {"key": "L01", "code": "L01", "label": "Path Searching", "dimension": "logical", "subcategory": "logical_explicit_rule_deduction", "case_count": 24, "multi_image_case_count": 0, "description": "Logical · Path Searching — accuracy (%)"}, {"key": "L02", "code": "L02", "label": "Mathematical Derivation", "dimension": "logical", "subcategory": "logical_explicit_rule_deduction", "case_count": 27, "multi_image_case_count": 0, "description": "Logical · Mathematical Derivation — accuracy (%)"}, {"key": "L03", "code": "L03", "label": "Game Deduction", "dimension": "logical", "subcategory": "logical_explicit_rule_deduction", "case_count": 37, "multi_image_case_count": 0, "description": "Logical · Game Deduction — accuracy (%)"}, {"key": "L04", "code": "L04", "label": "Puzzle Solving", "dimension": "logical", "subcategory": "logical_explicit_rule_deduction", "case_count": 35, "multi_image_case_count": 0, "description": "Logical · Puzzle Solving — accuracy (%)"}, {"key": "L05", "code": "L05", "label": "Pattern Prediction", "dimension": "logical", "subcategory": "logical_implicit_pattern_induction", "case_count": 39, "multi_image_case_count": 0, "description": "Logical · Pattern Prediction — accuracy (%)"}, {"key": "L06", "code": "L06", "label": "Visual Oddity Detection", "dimension": "logical", "subcategory": "logical_implicit_pattern_induction", "case_count": 18, "multi_image_case_count": 0, "description": "Logical · Visual Oddity Detection — accuracy (%)"}, {"key": "L07", "code": "L07", "label": "Rule Transfer", "dimension": "logical", "subcategory": "logical_implicit_pattern_induction", "case_count": 20, "multi_image_case_count": 20, "description": "Logical · Rule Transfer — accuracy (%)"}, {"key": "F01", "code": "F01", "label": "Physical Counterfactual", "dimension": "counterfactual", "subcategory": "counterfactual_counterfactual_imagination", "case_count": 23, "multi_image_case_count": 0, "description": "Counterfactual · Physical Counterfactual — accuracy (%)"}, {"key": "F02", "code": "F02", "label": "Chemical Counterfactual", "dimension": "counterfactual", "subcategory": "counterfactual_counterfactual_imagination", "case_count": 9, "multi_image_case_count": 0, "description": "Counterfactual · Chemical Counterfactual — accuracy (%)"}, {"key": "F03", "code": "F03", "label": "Biological Counterfactual", "dimension": "counterfactual", "subcategory": "counterfactual_counterfactual_imagination", "case_count": 8, "multi_image_case_count": 0, "description": "Counterfactual · Biological Counterfactual — accuracy (%)"}, {"key": "F04", "code": "F04", "label": "Astronomy Counterfactual", "dimension": "counterfactual", "subcategory": "counterfactual_counterfactual_imagination", "case_count": 7, "multi_image_case_count": 0, "description": "Counterfactual · Astronomy Counterfactual — accuracy (%)"}, {"key": "F05", "code": "F05", "label": "Geography Counterfactual", "dimension": "counterfactual", "subcategory": "counterfactual_counterfactual_imagination", "case_count": 8, "multi_image_case_count": 0, "description": "Counterfactual · Geography Counterfactual — accuracy (%)"}, {"key": "F06", "code": "F06", "label": "History Counterfactual", "dimension": "counterfactual", "subcategory": "counterfactual_counterfactual_imagination", "case_count": 7, "multi_image_case_count": 0, "description": "Counterfactual · History Counterfactual — accuracy (%)"}, {"key": "F07", "code": "F07", "label": "Music Theory Counterfactual", "dimension": "counterfactual", "subcategory": "counterfactual_counterfactual_imagination", "case_count": 4, "multi_image_case_count": 0, "description": "Counterfactual · Music Theory Counterfactual — accuracy (%)"}, {"key": "F08", "code": "F08", "label": "Computer Science Counterfactual", "dimension": "counterfactual", "subcategory": "counterfactual_counterfactual_imagination", "case_count": 4, "multi_image_case_count": 0, "description": "Counterfactual · Computer Science Counterfactual — accuracy (%)"}, {"key": "F09", "code": "F09", "label": "Anatomical Errors", "dimension": "counterfactual", "subcategory": "counterfactual_anomaly_correction_and_generation", "case_count": 10, "multi_image_case_count": 0, "description": "Counterfactual · Anatomical Errors — accuracy (%)"}, {"key": "F10", "code": "F10", "label": "Structural Anomalies", "dimension": "counterfactual", "subcategory": "counterfactual_anomaly_correction_and_generation", "case_count": 11, "multi_image_case_count": 0, "description": "Counterfactual · Structural Anomalies — accuracy (%)"}, {"key": "F11", "code": "F11", "label": "Relational Anomalies", "dimension": "counterfactual", "subcategory": "counterfactual_anomaly_correction_and_generation", "case_count": 9, "multi_image_case_count": 0, "description": "Counterfactual · Relational Anomalies — accuracy (%)"}], "links": {"paper": "https://arxiv.org/abs/2610.12343", "data": "https://huggingface.co/datasets/VisionXLab/RISEBench-plusplus", "outputs": "https://huggingface.co/datasets/VisionXLab/RISEBench-plusplus_Outputs", "github": "https://github.com/VisionXLab/RISEBench/tree/main/RISEBench%2B%2B"}, "judges": {"instruction_reasoning": "Gemini-3-Flash", "appearance_consistency": "Gemini-3-Flash", "visual_plausibility": "Gemini-3.1-Flash-Lite"}, "results_by_language": {"en": {"models": [{"id": "gpt-image-2-5-sunburst", "name": "GPT-Image-2.5 Sunburst"}, {"id": "nano-banana-pro", "name": "Nano Banana Pro"}, {"id": "nano-banana-2", "name": "Nano Banana 2"}, {"id": "gpt-image-2", "name": "GPT-Image-2"}, {"id": "gpt-image-2-5-flare", "name": "GPT-Image-2.5 Flare"}, {"id": "luma-uni-1", "name": "Luma Uni-1"}, {"id": "qwen-image-3-0", "name": "Qwen-Image-3.0"}, {"id": "nano-banana-2-lite", "name": "Nano Banana 2 Lite"}, {"id": "flux-2-max", "name": "FLUX.2 Max"}, {"id": "gpt-image-1-5", "name": "GPT-Image-1.5"}, {"id": "flux-2-pro", "name": "FLUX.2 Pro"}, {"id": "nano-banana", "name": "Nano Banana"}, {"id": "hunyuanimage-3-5", "name": "HunyuanImage-3.5"}, {"id": "wan2-7-image-pro", "name": "Wan2.7-Image-Pro"}, {"id": "gpt-image-1", "name": "GPT-Image-1"}, {"id": "qwen-image-2-0", "name": "Qwen-Image-2.0"}, {"id": "seedream-4-5", "name": "Seedream 4.5"}, {"id": "seedream-5-0", "name": "Seedream 5.0"}, {"id": "step-image-edit-2", "name": "Step Image Edit 2"}, {"id": "hunyuanimage-3-0-instruct", "name": "HunyuanImage-3.0-Instruct"}, {"id": "qwen-image-edit-2511", "name": "Qwen-Image-Edit-2511"}, {"id": "qwen-image-2-1", "name": "Qwen-Image-2.1"}, {"id": "firered-image-edit-1-0", "name": "FireRed-Image-Edit-1.0"}, {"id": "firered-image-edit-1-1", "name": "FireRed-Image-Edit-1.1"}, {"id": "qwen-image-edit-2509", "name": "Qwen-Image-Edit-2509"}, {"id": "hidream-o1-image", "name": "HiDream-O1-Image"}, {"id": "flux-2-dev", "name": "FLUX.2 Dev"}, {"id": "flux-2-klein-9b", "name": "FLUX.2 Klein 9B"}, {"id": "joyai-image-edit-plus", "name": "JoyAI-Image-Edit-Plus"}, {"id": "sensenova-u1-a3b-mot-sft", "name": "SenseNova-U1-A3B-MoT-SFT"}, {"id": "unipic-3-0", "name": "UniPic 3.0"}, {"id": "bagel-w-cot", "name": "BAGEL (w/ CoT)"}, {"id": "sensenova-u1-8b-mot-sft", "name": "SenseNova-U1-8B-MoT-SFT"}, {"id": "flux-2-klein-4b", "name": "FLUX.2 Klein 4B"}, {"id": "uniworld-v2", "name": "UniWorld-V2"}, {"id": "bagel", "name": "BAGEL"}, {"id": "omnigen2", "name": "OmniGen2"}, {"id": "omnigen", "name": "OmniGen"}, {"id": "emu2-gen", "name": "Emu2-Gen"}, {"id": "joyai-image-edit", "name": "JoyAI-Image-Edit"}, {"id": "step1x-edit-thinking", "name": "Step1X-Edit (thinking)"}, {"id": "boogu-image-0-1-edit", "name": "Boogu-Image-0.1-Edit"}, {"id": "step1x-edit-thinking-reflection", "name": "Step1X-Edit (thinking + reflection)"}, {"id": "longcat-image-edit", "name": "LongCat-Image-Edit"}, {"id": "step1x-edit-base", "name": "Step1X-Edit (base)"}, {"id": "internvl-u-w-cot", "name": "InternVL-U (w/ CoT)"}, {"id": "flux-1-kontext-dev", "name": "FLUX.1 Kontext Dev"}, {"id": "llada-image", "name": "LLaDA-Image"}, {"id": "ovis-u1", "name": "Ovis-U1"}, {"id": "internvl-u", "name": "InternVL-U"}, {"id": "unipic2-sd3-5m-kontext-2b", "name": "UniPic2-SD3.5M-Kontext-2B"}, {"id": "lumina-dimoo", "name": "Lumina-DiMOO"}, {"id": "uniworld-v1", "name": "UniWorld-V1"}, {"id": "rise-agent-ours", "name": "RISE-Agent (Ours)"}, {"id": "mindbrush", "name": "MindBrush"}, {"id": "interleavethinker", "name": "InterleaveThinker"}, {"id": "intentedit", "name": "IntentEdit"}, {"id": "imagent", "name": "ImAgent"}]}, "zh": {"models": [{"id": "gpt-image-2-5-sunburst", "name": "GPT-Image-2.5 Sunburst"}, {"id": "nano-banana-pro", "name": "Nano Banana Pro"}, {"id": "nano-banana-2", "name": "Nano Banana 2"}, {"id": "luma-uni-1", "name": "Luma Uni-1"}, {"id": "gpt-image-2", "name": "GPT-Image-2"}, {"id": "qwen-image-3-0", "name": "Qwen-Image-3.0"}, {"id": "gpt-image-2-5-flare", "name": "GPT-Image-2.5 Flare"}, {"id": "flux-2-max", "name": "FLUX.2 Max"}, {"id": "nano-banana-2-lite", "name": "Nano Banana 2 Lite"}, {"id": "gpt-image-1-5", "name": "GPT-Image-1.5"}, {"id": "nano-banana", "name": "Nano Banana"}, {"id": "flux-2-pro", "name": "FLUX.2 Pro"}, {"id": "hunyuanimage-3-5", "name": "HunyuanImage-3.5"}, {"id": "wan2-7-image-pro", "name": "Wan2.7-Image-Pro"}, {"id": "qwen-image-2-0", "name": "Qwen-Image-2.0"}, {"id": "seedream-4-5", "name": "Seedream 4.5"}, {"id": "seedream-5-0", "name": "Seedream 5.0"}, {"id": "gpt-image-1", "name": "GPT-Image-1"}, {"id": "step-image-edit-2", "name": "Step Image Edit 2"}, {"id": "hunyuanimage-3-0-instruct", "name": "HunyuanImage-3.0-Instruct"}, {"id": "qwen-image-2-1", "name": "Qwen-Image-2.1"}, {"id": "firered-image-edit-1-1", "name": "FireRed-Image-Edit-1.1"}, {"id": "flux-2-dev", "name": "FLUX.2 Dev"}, {"id": "qwen-image-edit-2511", "name": "Qwen-Image-Edit-2511"}, {"id": "qwen-image-edit-2509", "name": "Qwen-Image-Edit-2509"}, {"id": "firered-image-edit-1-0", "name": "FireRed-Image-Edit-1.0"}, {"id": "sensenova-u1-a3b-mot-sft", "name": "SenseNova-U1-A3B-MoT-SFT"}, {"id": "joyai-image-edit-plus", "name": "JoyAI-Image-Edit-Plus"}, {"id": "flux-2-klein-9b", "name": "FLUX.2 Klein 9B"}, {"id": "bagel-w-cot", "name": "BAGEL (w/ CoT)"}, {"id": "hidream-o1-image", "name": "HiDream-O1-Image"}, {"id": "flux-2-klein-4b", "name": "FLUX.2 Klein 4B"}, {"id": "uniworld-v2", "name": "UniWorld-V2"}, {"id": "sensenova-u1-8b-mot-sft", "name": "SenseNova-U1-8B-MoT-SFT"}, {"id": "unipic-3-0", "name": "UniPic 3.0"}, {"id": "bagel", "name": "BAGEL"}, {"id": "omnigen2", "name": "OmniGen2"}, {"id": "omnigen", "name": "OmniGen"}, {"id": "emu2-gen", "name": "Emu2-Gen"}, {"id": "joyai-image-edit", "name": "JoyAI-Image-Edit"}, {"id": "boogu-image-0-1-edit", "name": "Boogu-Image-0.1-Edit"}, {"id": "step1x-edit-thinking-reflection", "name": "Step1X-Edit (thinking + reflection)"}, {"id": "step1x-edit-thinking", "name": "Step1X-Edit (thinking)"}, {"id": "step1x-edit-base", "name": "Step1X-Edit (base)"}, {"id": "longcat-image-edit", "name": "LongCat-Image-Edit"}, {"id": "flux-1-kontext-dev", "name": "FLUX.1 Kontext Dev"}, {"id": "llada-image", "name": "LLaDA-Image"}, {"id": "internvl-u-w-cot", "name": "InternVL-U (w/ CoT)"}, {"id": "ovis-u1", "name": "Ovis-U1"}, {"id": "internvl-u", "name": "InternVL-U"}, {"id": "lumina-dimoo", "name": "Lumina-DiMOO"}, {"id": "uniworld-v1", "name": "UniWorld-V1"}, {"id": "unipic2-sd3-5m-kontext-2b", "name": "UniPic2-SD3.5M-Kontext-2B"}, {"id": "rise-agent-ours", "name": "RISE-Agent (Ours)"}, {"id": "mindbrush", "name": "MindBrush"}, {"id": "interleavethinker", "name": "InterleaveThinker"}, {"id": "intentedit", "name": "IntentEdit"}, {"id": "imagent", "name": "ImAgent"}]}}}, {"id": "risebench", "name": "RISEBench", "case_count": 360, "available_result_languages": ["en"], "accuracy_unit": "%", "metric_unit": "/100", "score_decimals": 1, "default_sort": "total", "dimensions": [{"key": "temporal", "label": "Temporal", "description": "Infer how a scene changes over time."}, {"key": "causal", "label": "Causal", "description": "Reason about causes, actions, and their consequences."}, {"key": "spatial", "label": "Spatial", "description": "Reason about spatial relationships and transformations."}, {"key": "logical", "label": "Logical", "description": "Apply explicit rules, patterns, and logical constraints."}], "metrics": [{"key": "instruction_reasoning", "label": "Instruction Reasoning", "description": "Whether the edit realizes the intended reasoning outcome."}, {"key": "appearance_consistency", "label": "Appearance Consistency", "description": "Whether content that should remain unchanged is preserved."}, {"key": "visual_plausibility", "label": "Visual Plausibility", "description": "Visual quality and plausibility; logical tasks are excluded."}], "accuracy_columns": [{"key": "temporal", "label": "Temporal", "description": "Infer how a scene changes over time."}, {"key": "causal", "label": "Causal", "description": "Reason about causes, actions, and their consequences."}, {"key": "spatial", "label": "Spatial", "description": "Reason about spatial relationships and transformations."}, {"key": "logical", "label": "Logical", "description": "Apply explicit rules, patterns, and logical constraints."}, {"key": "total", "label": "Overall", "description": "Accuracy on the complete RISEBench-360 benchmark."}], "links": {"paper": "https://arxiv.org/abs/2504.02826", "data": "https://huggingface.co/datasets/PhoenixZ/RISEBench", "outputs": "https://huggingface.co/datasets/zpy777/RISEBench_Outputs", "github": "https://github.com/VisionXLab/RISEBench/tree/main/RISEBench"}, "judges": {"instruction_reasoning": "GPT-4o", "appearance_consistency": "GPT-4o", "visual_plausibility": "GPT-4o"}, "results_by_language": {"en": {"models": [{"id": "gpt-image-1-5", "name": "GPT-Image-1.5"}, {"id": "gpt-image-2", "name": "GPT-Image-2"}, {"id": "gemini-3-pro-image-preview-nano-banana-pro", "name": "Gemini-3-pro-image-preview (Nano Banana-pro)"}, {"id": "gemini-2-5-flash-image-nano-banana", "name": "Gemini-2.5-Flash-Image (Nano Banana)"}, {"id": "gpt-image-1", "name": "GPT-Image-1"}, {"id": "gpt-image-1-mini", "name": "GPT-Image-1-mini"}, {"id": "qwen-image-edit-2511", "name": "Qwen-Image-Edit-2511"}, {"id": "bagel-w-cot", "name": "BAGEL (w/ CoT)"}, {"id": "gemini-2-0-flash-exp", "name": "Gemini-2.0-Flash-exp"}, {"id": "seedream-4-0", "name": "Seedream-4.0"}, {"id": "gemini-2-0-flash-pre", "name": "Gemini-2.0-Flash-pre"}, {"id": "qwen-image-edit-2509", "name": "Qwen-Image-Edit-2509"}, {"id": "bagel", "name": "BAGEL"}, {"id": "flux-1-kontext-dev", "name": "FLUX.1-Kontext-Dev"}, {"id": "ovis-u1", "name": "Ovis-U1"}, {"id": "step1x-edit", "name": "Step1X-Edit"}, {"id": "omnigen", "name": "OmniGen"}, {"id": "emu2", "name": "EMU2"}, {"id": "hidream-edit", "name": "HiDream-Edit"}, {"id": "flux-1-canny", "name": "FLUX.1-Canny"}]}}}]}</script><script src="portal.js" defer></script></body></html>
app.js CHANGED
@@ -1,6 +1,6 @@
1
  'use strict';
2
  (() => {
3
- const DATA = JSON.parse(document.getElementById('leaderboard-data').textContent);
4
  const CITATIONS = JSON.parse(document.getElementById('citation-data').textContent);
5
  const $ = (selector) => document.querySelector(selector);
6
  const $$ = (selector) => [...document.querySelectorAll(selector)];
@@ -9,14 +9,14 @@
9
  const colors = ['#3283bf','#2d9a86','#9b75bd'];
10
  const params = new URLSearchParams(location.search);
11
  const initialBenchmark = DATA.benchmarks.find(b => b.id === params.get('benchmark')) || DATA.benchmarks[0];
12
- const state = {benchmark:initialBenchmark.id,language:params.get('language')==='zh'?'zh':'en',view:'accuracy',sort:'total',direction:'desc',group:'all',input:'all',query:'',selected:[],visible:[]};
13
  let toastTimer;
14
  const benchmarkMetadata = () => DATA.benchmarks.find(b => b.id === state.benchmark);
15
  const languageCode = () => benchmarkMetadata().results_by_language[state.language] ? state.language : 'en';
16
  const benchmark = () => ({...benchmarkMetadata(), ...benchmarkMetadata().results_by_language[languageCode()]});
17
  const resultLanguageLabel = () => state.benchmark==='risebench-plusplus' ? benchmark().language : 'Original';
18
  const modelById = id => benchmark().models.find(m => m.id === id);
19
- const score = (model, key = state.sort) => model[state.view][key] ?? null;
20
  const fmt = value => value == null ? '—' : value.toFixed(1);
21
  const summaryKeys = ['total','single','multi'];
22
  const orderedAccuracyColumns = () => {
@@ -25,7 +25,15 @@
25
  ? [...columns.filter(c=>!summaryKeys.includes(c.key)), ...summaryKeys.map(key=>columns.find(c=>c.key===key))]
26
  : [columns.find(c=>c.key==='total'), ...columns.filter(c=>c.key!=='total')];
27
  };
28
- const availableColumns = () => state.view === 'accuracy' ? orderedAccuracyColumns() : benchmark().metrics;
 
 
 
 
 
 
 
 
29
  const scoreLabel = key => availableColumns().find(c=>c.key===key)?.label || key;
30
  const isPlus = () => state.benchmark === 'risebench-plusplus';
31
  function toast(message) {
@@ -55,30 +63,62 @@
55
  function renderResources() {
56
  const b=benchmark();
57
  $('#hero-links').innerHTML=[['Paper','paper'],['Dataset','data'],['Outputs','outputs'],['Code','github']].map(([label,key])=>`<a href="${esc(b.links[key])}" target="_blank" rel="noopener noreferrer">${label} <span aria-hidden="true">↗</span></a>`).join('');
 
 
58
  $('#board-options').hidden=b.available_result_languages.length<2;
59
  $$('[data-language]').forEach(button=>button.setAttribute('aria-pressed',button.dataset.language===languageCode()));
60
  $('#group-filters').innerHTML=isPlus()?['all','closed','open','agentic'].map(g=>`<button data-group="${g}" aria-pressed="${state.group===g}">${g==='all'?'All models':groupLabels[g]}<span>${g==='all'?b.models.length:b.models.filter(m=>m.group===g).length}</span></button>`).join(''):'<span class="caption-text">All models</span>';
61
  $('.input-filter').hidden=!isPlus();
 
 
 
 
 
62
  renderColumns();
63
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
64
  function renderColumns() {
65
- $('#column-options').innerHTML='<div class="eyebrow muted" >VISIBLE SCORE COLUMNS</div>'+availableColumns().map(c=>`<label><input type="checkbox" data-column="${c.key}" ${state.visible.includes(c.key)?'checked':''}>${esc(c.label)}</label>`).join('');
66
  }
67
  function renderTable() {
68
  const b=benchmark(), models=filteredModels(), columns=availableColumns().filter(c=>state.visible.includes(c.key));
69
- const minimumWidth=370+(isPlus()?86:0)+columns.length*96;
70
  $('#results-table').style.minWidth=minimumWidth+'px';
71
- $('#table-caption').textContent=b.name+' '+resultLanguageLabel()+' results, '+(state.view==='accuracy'?'reasoning accuracy (%)':'evaluation scores (/100)')+', sorted by '+scoreLabel(state.sort)+' '+state.direction;
 
72
  const summaryClass=key=>isPlus()&&summaryKeys.includes(key)?'summary-result':'';
73
  const sortableHeader=c=>`<th scope="col" class="${summaryClass(c.key)} ${state.sort===c.key?'active-sort':''}" aria-sort="${state.sort===c.key?(state.direction==='desc'?'descending':'ascending'):'none'}"><button data-sort="${c.key}" title="${esc(c.description)} — sort ${state.sort===c.key&&state.direction==='desc'?'ascending':'descending'}"><span>${c.key==='counterfactual'?'Counter-<br>factual':c.key==='instruction_reasoning'?'Instruction<br>Reasoning':c.key==='appearance_consistency'?'Appearance<br>Consistency':c.key==='visual_plausibility'?'Visual<br>Plausibility':esc(c.label)}</span><span class="sort-icon" aria-hidden="true">${state.sort===c.key?(state.direction==='desc'?'↓':'↑'):'↕'}</span></button></th>`;
74
- $('#table-head').innerHTML=`<tr><th scope="col" class="select-cell"><span class="sr-only">Compare</span></th><th scope="col" class="rank-cell" title="Global rank on the currently sorted score">#</th><th scope="col" class="model-cell">Model <span class="muted" style="font-weight:400">/ method</span></th>${isPlus()?'<th scope="col" style="width:86px">Input</th>':''}${columns.map(sortableHeader).join('')}</tr>`;
 
 
 
 
 
 
 
 
 
75
  $('#table-body').innerHTML=models.map(m=>{
76
  const rank=rankOf(m), ours=m.id==='rise-agent-ours';
77
- const cells=columns.map(c=>{const v=score(m,c.key), featured=isPlus()&&summaryKeys.includes(c.key), tint=v==null?0:(featured ? .065+(v/100)*.10 : .02+(v/100)*.055);return `<td class="score-cell ${summaryClass(c.key)} ${c.key==='total'?'overall':''} ${v===null?'missing':''}" style="background-color:rgba(88,118,158,${tint.toFixed(4)})" title="${esc(c.label)}: ${v===null?'Not evaluated':fmt(v)+(state.view==='accuracy'?'%':' / 100')}">${fmt(v)}${c.key==='total'&&v!==null?`<span class="score-meter" aria-hidden="true"><i style="width:${v}%"></i></span>`:''}</td>`;}).join('');
78
  return `<tr class="${ours?'ours ':''}${state.selected.includes(m.id)?'selected':''}"><td class="select-cell"><input type="checkbox" data-select="${esc(m.id)}" aria-label="Compare ${esc(m.name)}" ${state.selected.includes(m.id)?'checked':''}></td><td class="rank-cell">${rank===null?'—':`<span class="${rank<=3?'rank-top rank-'+rank:''}">${rank}</span>`}</td><th scope="row" class="model-cell" style="position:sticky;top:auto"><button class="model-button" data-model="${esc(m.id)}">${esc(m.name)}</button><span class="model-meta">${m.group?`<span class="group-dot ${m.group}"></span>${groupLabels[m.group]}`:''}${ours?'<span class="ours-badge">OURS</span>':''}</span></th>${isPlus()?`<td><span class="input-pill ${m.multi_image?'multi':''}" title="${m.multi_image?'Supports multiple input images':'Single-image only'}">${m.multi_image?'Multi':'Single'}</span></td>`:''}${cells}</tr>`;
79
  }).join('');
80
  $('#empty-state').hidden=models.length>0; $('#results-table').hidden=models.length===0;
81
  $('#result-count').innerHTML=`<strong>${models.length}</strong>${models.length<b.models.length?' / '+b.models.length:''} models`;
 
82
  $('#reset-filters').hidden=!(state.query||state.group!=='all'||state.input!=='all');
83
  $$('#group-filters button').forEach(el=>el.setAttribute('aria-pressed',el.dataset.group===state.group));
84
  renderTray();
@@ -117,18 +157,22 @@
117
  renderResources();renderTable();saveState();
118
  }
119
  function switchView(view) {
120
- state.view=view;state.sort=view==='accuracy'?'total':'instruction_reasoning';state.direction='desc';state.visible=availableColumns().map(c=>c.key);
 
 
 
121
  $$('[data-view]').forEach(btn=>btn.setAttribute('aria-pressed',btn.dataset.view===view));
122
- renderColumns();renderTable();
123
  }
124
  function download(name,content,type) {
125
  const url=URL.createObjectURL(new Blob([content],{type}));const a=document.createElement('a');a.href=url;a.download=name;document.body.appendChild(a);a.click();a.remove();setTimeout(()=>URL.revokeObjectURL(url),1000);
126
  }
127
  function exportCSV(models,name='filtered') {
128
- const b=benchmark(), fields=[...(isPlus()?orderedAccuracyColumns():b.accuracy_columns).map(c=>({type:'accuracy',...c})),...b.metrics.map(c=>({type:'metrics',...c}))];
129
- const safeCSV=value=>{let t=String(value??'');if(/^[=+@\t\r]/.test(t))t="'"+t;return '"'+t.replace(/"/g,'""')+'"';};
130
- const rows=[['Benchmark','Result language','Model','Category','Multi-image support',...fields.map(c=>c.label+(c.type==='accuracy'?' (%)':' (/100)'))],...models.map(m=>[b.name,b.language,m.name,groupLabels[m.group]||'Not specified',m.multi_image===null?'Not specified':m.multi_image?'Yes':'No',...fields.map(c=>m[c.type][c.key]===null?'':fmt(m[c.type][c.key]))])];
131
- download(`${b.id}-${languageCode()}-${name}-results.csv`,'\uFEFF'+rows.map(r=>r.map(safeCSV).join(',')).join('\r\n'),'text/csv;charset=utf-8');toast(`Exported ${models.length} models · ${resultLanguageLabel()} results.`);
 
132
  }
133
  function radar(models) {
134
  const dims=benchmark().dimensions, cx=205,cy=156,r=98,n=dims.length;
@@ -146,13 +190,13 @@
146
  function showModels(ids) {
147
  const b=benchmark(), models=ids.map(modelById).filter(Boolean);if(!models.length)return;
148
  const mixed=isPlus()&&new Set(models.map(m=>m.multi_image)).size>1;
149
- const tableSection=(title,fields,type)=>`<tr class="comparison-section"><td colspan="${models.length+1}">${title}</td></tr>`+fields.map(c=>{const vals=models.map(m=>m[type][c.key]);const max=Math.max(...vals.filter(v=>v!==null));return `<tr><td>${esc(c.label)}</td>${vals.map(v=>`<td class="${v!==null&&v===max&&models.length>1?'best-value':''}">${fmt(v)}${v!==null&&type==='accuracy'?'%':''}</td>`).join('')}</tr>`;}).join('');
150
- showDialog(b.name+' · '+resultLanguageLabel().toUpperCase()+' RESULTS',`<h2 class="dialog-title" id="dialog-title">${models.length===1?esc(models[0].name):'Model comparison'}</h2>${mixed?'<p class="comparison-warning">These models use different evaluation subsets: single-image only and full benchmark.</p>':''}<div class="comparison-layout">${radar(models)}<div class="compare-summaries">${models.map((m,i)=>`<div class="compare-summary"><div><h4><span class="series-dot" style="background:${colors[i]}"></span>${esc(m.name)}</h4><p>${esc(groupLabels[m.group]||b.name)}${isPlus()?' · '+(m.multi_image?'Multi-image supported':'Single-image only'):''}</p></div><strong style="color:${colors[i]}">${fmt(m.accuracy.total)}<small> ${m.accuracy.total!==null?'%':''}<br>${isPlus()?'Total':'Overall'}</small></strong></div>`).join('')}${models.some(m=>m.accuracy.total===null)?'<p class="caption-text">Single-image-only models have no Total score.</p>':''}</div></div><div class="comparison-table-wrap"><table class="comparison-table"><thead><tr><th>Metric</th>${models.map((m,i)=>`<th><span class="series-dot" style="background:${colors[i]}"></span>${esc(m.name)}</th>`).join('')}</tr></thead><tbody>${tableSection('REASONING ACCURACY (%)',isPlus()?orderedAccuracyColumns():b.accuracy_columns,'accuracy')}${tableSection('EVALUATION SCORES (/100)',b.metrics,'metrics')}</tbody></table></div><div class="dialog-actions"><button class="outline-button" id="dialog-export">Export ${models.length===1?'model':'comparison'} CSV ↓</button></div>`);
151
  $('#dialog-export').addEventListener('click',()=>exportCSV(models,'comparison'));
152
  }
153
  async function copyCitation(text,button) {
154
  try {await navigator.clipboard.writeText(text);button.textContent='Copied ✓';toast('BibTeX copied.');}
155
- catch(_){const area=document.createElement('textarea');area.value=text;$('#dialog-content').appendChild(area);area.select();const copied=document.execCommand('copy');area.remove();toast(copied?'BibTeX copied.':'Select and copy the citation below.');}
156
  }
157
  function showCitation() {
158
  const citation=CITATIONS[state.benchmark];
@@ -165,6 +209,7 @@
165
  if(button.dataset.benchmark)switchBenchmark(button.dataset.benchmark);
166
  if(button.dataset.view)switchView(button.dataset.view);
167
  if(button.dataset.language)switchLanguage(button.dataset.language);
 
168
  if(button.dataset.group){state.group=button.dataset.group;renderTable();}
169
  if(button.dataset.sort){state.direction=state.sort===button.dataset.sort&&state.direction==='desc'?'asc':'desc';state.sort=button.dataset.sort;renderTable();}
170
  if(button.dataset.model)showModels([button.dataset.model]);
@@ -182,6 +227,9 @@
182
  });
183
  $('#model-search').addEventListener('input',e=>{state.query=e.target.value;renderTable();});
184
  $('#input-filter').addEventListener('change',e=>{state.input=e.target.value;renderTable();});
 
 
 
185
  $('#reset-filters').addEventListener('click',resetFilters);$('#empty-reset').addEventListener('click',resetFilters);
186
  $('#download-csv').addEventListener('click',()=>exportCSV(filteredModels()));
187
  $('#compare-open').addEventListener('click',()=>showModels(state.selected));
@@ -194,10 +242,17 @@
194
  if(e.key==='/'&&!['INPUT','TEXTAREA','SELECT'].includes(document.activeElement.tagName)&&!$('#detail-dialog').open){e.preventDefault();$('#model-search').focus();}
195
  const tab=e.target.closest('[data-benchmark], [data-view], [data-language]');
196
  if(tab&&['ArrowLeft','ArrowRight','Home','End'].includes(e.key)){
197
- e.preventDefault();const siblings=[...tab.parentElement.querySelectorAll('[data-benchmark], [data-view], [data-language]')],i=siblings.indexOf(tab);
198
  const n=e.key==='Home'?0:e.key==='End'?siblings.length-1:(i+(e.key==='ArrowRight'?1:-1)+siblings.length)%siblings.length;
199
  siblings[n].click();siblings[n].focus();
200
  }
201
  });
202
  switchBenchmark(state.benchmark);
 
 
 
 
 
 
 
203
  })();
 
1
  'use strict';
2
  (() => {
3
+ let DATA = JSON.parse(document.getElementById('leaderboard-data').textContent);
4
  const CITATIONS = JSON.parse(document.getElementById('citation-data').textContent);
5
  const $ = (selector) => document.querySelector(selector);
6
  const $$ = (selector) => [...document.querySelectorAll(selector)];
 
9
  const colors = ['#3283bf','#2d9a86','#9b75bd'];
10
  const params = new URLSearchParams(location.search);
11
  const initialBenchmark = DATA.benchmarks.find(b => b.id === params.get('benchmark')) || DATA.benchmarks[0];
12
+ const state = {benchmark:initialBenchmark.id,language:params.get('language')==='zh'?'zh':'en',view:'accuracy',dimension:'temporal',subcategory:'all',sort:'total',direction:'desc',group:'all',input:'all',query:'',selected:[],visible:[]};
13
  let toastTimer;
14
  const benchmarkMetadata = () => DATA.benchmarks.find(b => b.id === state.benchmark);
15
  const languageCode = () => benchmarkMetadata().results_by_language[state.language] ? state.language : 'en';
16
  const benchmark = () => ({...benchmarkMetadata(), ...benchmarkMetadata().results_by_language[languageCode()]});
17
  const resultLanguageLabel = () => state.benchmark==='risebench-plusplus' ? benchmark().language : 'Original';
18
  const modelById = id => benchmark().models.find(m => m.id === id);
19
+ const score = (model, key = state.sort) => model[state.view]?.[key] ?? null;
20
  const fmt = value => value == null ? '—' : value.toFixed(1);
21
  const summaryKeys = ['total','single','multi'];
22
  const orderedAccuracyColumns = () => {
 
25
  ? [...columns.filter(c=>!summaryKeys.includes(c.key)), ...summaryKeys.map(key=>columns.find(c=>c.key===key))]
26
  : [columns.find(c=>c.key==='total'), ...columns.filter(c=>c.key!=='total')];
27
  };
28
+ const isBreakdown = () => ['subcategories','task_types'].includes(state.view);
29
+ const viewLabel = () => ({accuracy:'Reasoning accuracy',metrics:'Evaluation scores',subcategories:'Subcategory accuracy',task_types:'Task-type accuracy'}[state.view]);
30
+ const availableColumns = () => {
31
+ const b=benchmark();
32
+ if(state.view==='accuracy')return orderedAccuracyColumns();
33
+ if(state.view==='metrics')return b.metrics;
34
+ return b[state.view==='subcategories'?'subcategory_columns':'task_type_columns'].filter(c=>(state.dimension==='all'||c.dimension===state.dimension)&&(state.view!=='task_types'||state.subcategory==='all'||c.subcategory===state.subcategory));
35
+ };
36
+ const qualifiedLabel = c => isBreakdown()?`${c.dimension[0].toUpperCase()+c.dimension.slice(1)} · ${c.label}`:c.label;
37
  const scoreLabel = key => availableColumns().find(c=>c.key===key)?.label || key;
38
  const isPlus = () => state.benchmark === 'risebench-plusplus';
39
  function toast(message) {
 
63
  function renderResources() {
64
  const b=benchmark();
65
  $('#hero-links').innerHTML=[['Paper','paper'],['Dataset','data'],['Outputs','outputs'],['Code','github']].map(([label,key])=>`<a href="${esc(b.links[key])}" target="_blank" rel="noopener noreferrer">${label} <span aria-hidden="true">↗</span></a>`).join('');
66
+ $('#submit-results-link').href='submit.html?'+new URLSearchParams({benchmark:state.benchmark,language:languageCode()});
67
+ $('#submit-results-link').setAttribute('aria-label','Submit results to '+b.name);
68
  $('#board-options').hidden=b.available_result_languages.length<2;
69
  $$('[data-language]').forEach(button=>button.setAttribute('aria-pressed',button.dataset.language===languageCode()));
70
  $('#group-filters').innerHTML=isPlus()?['all','closed','open','agentic'].map(g=>`<button data-group="${g}" aria-pressed="${state.group===g}">${g==='all'?'All models':groupLabels[g]}<span>${g==='all'?b.models.length:b.models.filter(m=>m.group===g).length}</span></button>`).join(''):'<span class="caption-text">All models</span>';
71
  $('.input-filter').hidden=!isPlus();
72
+ $$('[data-plus-only]').forEach(el=>el.hidden=!isPlus());
73
+ $('#page-citation-code').textContent=CITATIONS[state.benchmark];
74
+ $('#citation-benchmark').textContent=b.name;
75
+ $('#page-copy-citation').textContent='Copy BibTeX';
76
+ renderBreakdownControls();
77
  renderColumns();
78
  }
79
+ function renderBreakdownControls() {
80
+ $('#breakdown-controls').hidden=!isBreakdown();
81
+ if(!isBreakdown())return;
82
+ const b=benchmark(), dimensions=b.dimensions.filter(d=>b.subcategory_columns.some(c=>c.dimension===d.key));
83
+ $('#dimension-tabs').innerHTML=[{key:'all',label:'All dimensions'},...dimensions].map(d=>`<button data-dimension="${d.key}" aria-pressed="${state.dimension===d.key}">${esc(d.label)}</button>`).join('');
84
+ $('#subcategory-filter').hidden=state.view!=='task_types';
85
+ const subs=b.subcategory_columns.filter(c=>state.dimension==='all'||c.dimension===state.dimension);
86
+ $('#subcategory-select').innerHTML='<option value="all">All subcategories</option>'+subs.map(c=>`<option value="${c.key}">${esc((state.dimension==='all'?c.dimension[0].toUpperCase()+c.dimension.slice(1)+' · ':'')+c.label)}</option>`).join('');
87
+ $('#subcategory-select').value=state.subcategory;
88
+ }
89
+ function resetScoreColumns() {
90
+ state.visible=availableColumns().map(c=>c.key);state.sort=state.visible[0];state.direction='desc';
91
+ renderBreakdownControls();renderColumns();renderTable();$('.table-scroll').scrollLeft=0;
92
+ }
93
  function renderColumns() {
94
+ $('#column-options').innerHTML='<div class="eyebrow muted" >VISIBLE SCORE COLUMNS</div>'+availableColumns().map(c=>`<label><input type="checkbox" data-column="${c.key}" ${state.visible.includes(c.key)?'checked':''}>${esc(qualifiedLabel(c))}</label>`).join('');
95
  }
96
  function renderTable() {
97
  const b=benchmark(), models=filteredModels(), columns=availableColumns().filter(c=>state.visible.includes(c.key));
98
+ const minimumWidth=370+(isPlus()?86:0)+columns.length*(isBreakdown()?156:96);
99
  $('#results-table').style.minWidth=minimumWidth+'px';
100
+ $('#results-table').classList.toggle('breakdown-table',isBreakdown());
101
+ $('#table-caption').textContent=b.name+' '+resultLanguageLabel()+' results, '+viewLabel()+(state.view==='metrics'?' (/100)':' (%)')+', sorted by '+scoreLabel(state.sort)+' '+state.direction;
102
  const summaryClass=key=>isPlus()&&summaryKeys.includes(key)?'summary-result':'';
103
  const sortableHeader=c=>`<th scope="col" class="${summaryClass(c.key)} ${state.sort===c.key?'active-sort':''}" aria-sort="${state.sort===c.key?(state.direction==='desc'?'descending':'ascending'):'none'}"><button data-sort="${c.key}" title="${esc(c.description)} — sort ${state.sort===c.key&&state.direction==='desc'?'ascending':'descending'}"><span>${c.key==='counterfactual'?'Counter-<br>factual':c.key==='instruction_reasoning'?'Instruction<br>Reasoning':c.key==='appearance_consistency'?'Appearance<br>Consistency':c.key==='visual_plausibility'?'Visual<br>Plausibility':esc(c.label)}</span><span class="sort-icon" aria-hidden="true">${state.sort===c.key?(state.direction==='desc'?'↓':'↑'):'↕'}</span></button></th>`;
104
+ const rowSpan=isBreakdown()?' rowspan="2"':'';
105
+ const modelHeaders=`<th scope="col" class="select-cell"${rowSpan}><span class="sr-only">Compare</span></th><th scope="col" class="rank-cell"${rowSpan} title="Global rank on the currently sorted score">#</th><th scope="col" class="model-cell"${rowSpan}>Model <span class="muted" style="font-weight:400">/ method</span></th>${isPlus()?`<th scope="col" style="width:86px"${rowSpan}>Input</th>`:''}`;
106
+ const groups=[];
107
+ if(isBreakdown())columns.forEach(c=>{
108
+ const dimension=c.dimension[0].toUpperCase()+c.dimension.slice(1);
109
+ const label=state.view==='task_types'?(state.dimension==='all'?dimension+' · ':'')+b.subcategory_columns.find(s=>s.key===c.subcategory).label:dimension;
110
+ const key=state.view==='task_types'?c.subcategory:c.dimension;
111
+ if(groups.at(-1)?.key===key)groups.at(-1).count++;else groups.push({key,label,count:1,dimension:c.dimension});
112
+ });
113
+ $('#table-head').innerHTML=isBreakdown()?`<tr>${modelHeaders}${groups.map(g=>`<th scope="colgroup" colspan="${g.count}" class="dimension-band dim-${g.dimension}">${esc(g.label)}</th>`).join('')}</tr><tr>${columns.map(sortableHeader).join('')}</tr>`:`<tr>${modelHeaders}${columns.map(sortableHeader).join('')}</tr>`;
114
  $('#table-body').innerHTML=models.map(m=>{
115
  const rank=rankOf(m), ours=m.id==='rise-agent-ours';
116
+ const cells=columns.map(c=>{const v=score(m,c.key), featured=isPlus()&&summaryKeys.includes(c.key), tint=v==null?0:(featured ? .065+(v/100)*.10 : .02+(v/100)*.055);return `<td class="score-cell ${summaryClass(c.key)} ${c.key==='total'?'overall':''} ${v===null?'missing':''}" style="background-color:rgba(88,118,158,${tint.toFixed(4)})" title="${esc(c.label)}: ${v===null?'Not evaluated':fmt(v)+(state.view==='metrics'?' / 100':'%')}">${fmt(v)}${c.key==='total'&&v!==null?`<span class="score-meter" aria-hidden="true"><i style="width:${v}%"></i></span>`:''}</td>`;}).join('');
117
  return `<tr class="${ours?'ours ':''}${state.selected.includes(m.id)?'selected':''}"><td class="select-cell"><input type="checkbox" data-select="${esc(m.id)}" aria-label="Compare ${esc(m.name)}" ${state.selected.includes(m.id)?'checked':''}></td><td class="rank-cell">${rank===null?'—':`<span class="${rank<=3?'rank-top rank-'+rank:''}">${rank}</span>`}</td><th scope="row" class="model-cell" style="position:sticky;top:auto"><button class="model-button" data-model="${esc(m.id)}">${esc(m.name)}</button><span class="model-meta">${m.group?`<span class="group-dot ${m.group}"></span>${groupLabels[m.group]}`:''}${ours?'<span class="ours-badge">OURS</span>':''}</span></th>${isPlus()?`<td><span class="input-pill ${m.multi_image?'multi':''}" title="${m.multi_image?'Supports multiple input images':'Single-image only'}">${m.multi_image?'Multi':'Single'}</span></td>`:''}${cells}</tr>`;
118
  }).join('');
119
  $('#empty-state').hidden=models.length>0; $('#results-table').hidden=models.length===0;
120
  $('#result-count').innerHTML=`<strong>${models.length}</strong>${models.length<b.models.length?' / '+b.models.length:''} models`;
121
+ if(isBreakdown())$('#result-count').innerHTML+=`<span class="context-separator">·</span>${columns.length} ${state.view==='subcategories'?'subcategories':'task types'}`;
122
  $('#reset-filters').hidden=!(state.query||state.group!=='all'||state.input!=='all');
123
  $$('#group-filters button').forEach(el=>el.setAttribute('aria-pressed',el.dataset.group===state.group));
124
  renderTray();
 
157
  renderResources();renderTable();saveState();
158
  }
159
  function switchView(view) {
160
+ if(!isPlus()&&['subcategories','task_types'].includes(view))return;
161
+ state.view=view;
162
+ if(view==='task_types')state.subcategory=benchmark().subcategory_columns.find(c=>state.dimension==='all'||c.dimension===state.dimension).key;
163
+ state.sort=isBreakdown()?availableColumns()[0].key:view==='accuracy'?'total':'instruction_reasoning';state.direction='desc';state.visible=availableColumns().map(c=>c.key);
164
  $$('[data-view]').forEach(btn=>btn.setAttribute('aria-pressed',btn.dataset.view===view));
165
+ renderBreakdownControls();renderColumns();renderTable();$('.table-scroll').scrollLeft=0;
166
  }
167
  function download(name,content,type) {
168
  const url=URL.createObjectURL(new Blob([content],{type}));const a=document.createElement('a');a.href=url;a.download=name;document.body.appendChild(a);a.click();a.remove();setTimeout(()=>URL.revokeObjectURL(url),1000);
169
  }
170
  function exportCSV(models,name='filtered') {
171
+ const b=benchmark(), mainFields=[...(isPlus()?orderedAccuracyColumns():b.accuracy_columns).map(c=>({type:'accuracy',...c})),...b.metrics.map(c=>({type:'metrics',...c}))];
172
+ const fields=isBreakdown()?[...(name==='comparison'?mainFields:[]),...availableColumns().filter(c=>state.visible.includes(c.key)).map(c=>({type:state.view,...c,label:qualifiedLabel(c)}))]:mainFields;
173
+ const safeCSV=value=>{let t=String(value??'');if(/^\s*[=+@-]|^[\t\r\n]/.test(t))t="'"+t;return '"'+t.replace(/"/g,'""')+'"';};
174
+ const rows=[['Benchmark','Result language','Model','Category','Multi-image support',...fields.map(c=>c.label+(c.type==='metrics'?' (/100)':' (%)'))],...models.map(m=>[b.name,b.language,m.name,groupLabels[m.group]||'Not specified',m.multi_image===null?'Not specified':m.multi_image?'Yes':'No',...fields.map(c=>m[c.type][c.key]===null?'':fmt(m[c.type][c.key]))])];
175
+ download(`${b.id}-${languageCode()}-${state.view}-${name}-results.csv`,'\uFEFF'+rows.map(r=>r.map(safeCSV).join(',')).join('\r\n'),'text/csv;charset=utf-8');toast(`Exported ${models.length} models · ${resultLanguageLabel()} results.`);
176
  }
177
  function radar(models) {
178
  const dims=benchmark().dimensions, cx=205,cy=156,r=98,n=dims.length;
 
190
  function showModels(ids) {
191
  const b=benchmark(), models=ids.map(modelById).filter(Boolean);if(!models.length)return;
192
  const mixed=isPlus()&&new Set(models.map(m=>m.multi_image)).size>1;
193
+ const tableSection=(title,fields,type)=>`<tr class="comparison-section"><td colspan="${models.length+1}">${title}</td></tr>`+fields.map(c=>{const vals=models.map(m=>m[type]?.[c.key] ?? null);const max=Math.max(...vals.filter(v=>v!==null));return `<tr><td>${esc(c.label)}</td>${vals.map(v=>`<td class="${v!==null&&v===max&&models.length>1?'best-value':''}">${fmt(v)}${v!==null&&type!=='metrics'?'%':''}</td>`).join('')}</tr>`;}).join('');
194
+ showDialog(b.name+' · '+resultLanguageLabel().toUpperCase()+' RESULTS',`<h2 class="dialog-title" id="dialog-title">${models.length===1?esc(models[0].name):'Model comparison'}</h2>${mixed?'<p class="comparison-warning">These models use different evaluation subsets: single-image only and full benchmark.</p>':''}<div class="comparison-layout">${radar(models)}<div class="compare-summaries">${models.map((m,i)=>`<div class="compare-summary"><div><h4><span class="series-dot" style="background:${colors[i]}"></span>${esc(m.name)}</h4><p>${esc(groupLabels[m.group]||b.name)}${isPlus()?' · '+(m.multi_image?'Multi-image supported':'Single-image only'):''}</p></div><strong style="color:${colors[i]}">${fmt(m.accuracy.total)}<small> ${m.accuracy.total!==null?'%':''}<br>${isPlus()?'Total':'Overall'}</small></strong></div>`).join('')}${models.some(m=>m.accuracy.total===null)?'<p class="caption-text">Single-image-only models have no Total score.</p>':''}</div></div><div class="comparison-table-wrap"><table class="comparison-table"><thead><tr><th>Metric</th>${models.map((m,i)=>`<th><span class="series-dot" style="background:${colors[i]}"></span>${esc(m.name)}</th>`).join('')}</tr></thead><tbody>${tableSection('REASONING ACCURACY (%)',isPlus()?orderedAccuracyColumns():b.accuracy_columns,'accuracy')}${tableSection('EVALUATION SCORES (/100)',b.metrics,'metrics')}${isBreakdown()?tableSection(viewLabel().toUpperCase()+' (%)',availableColumns().filter(c=>state.visible.includes(c.key)).map(c=>({...c,label:qualifiedLabel(c)})),state.view):''}</tbody></table></div><div class="dialog-actions"><button class="outline-button" id="dialog-export">Export ${models.length===1?'model':'comparison'} CSV ↓</button></div>`);
195
  $('#dialog-export').addEventListener('click',()=>exportCSV(models,'comparison'));
196
  }
197
  async function copyCitation(text,button) {
198
  try {await navigator.clipboard.writeText(text);button.textContent='Copied ✓';toast('BibTeX copied.');}
199
+ catch(_){const area=document.createElement('textarea');area.value=text;($('#detail-dialog').open?$('#dialog-content'):document.body).appendChild(area);area.select();const copied=document.execCommand('copy');area.remove();toast(copied?'BibTeX copied.':'Select and copy the citation below.');}
200
  }
201
  function showCitation() {
202
  const citation=CITATIONS[state.benchmark];
 
209
  if(button.dataset.benchmark)switchBenchmark(button.dataset.benchmark);
210
  if(button.dataset.view)switchView(button.dataset.view);
211
  if(button.dataset.language)switchLanguage(button.dataset.language);
212
+ if(button.dataset.dimension){state.dimension=button.dataset.dimension;state.subcategory='all';resetScoreColumns();}
213
  if(button.dataset.group){state.group=button.dataset.group;renderTable();}
214
  if(button.dataset.sort){state.direction=state.sort===button.dataset.sort&&state.direction==='desc'?'asc':'desc';state.sort=button.dataset.sort;renderTable();}
215
  if(button.dataset.model)showModels([button.dataset.model]);
 
227
  });
228
  $('#model-search').addEventListener('input',e=>{state.query=e.target.value;renderTable();});
229
  $('#input-filter').addEventListener('change',e=>{state.input=e.target.value;renderTable();});
230
+ $('#subcategory-select').addEventListener('change',e=>{state.subcategory=e.target.value;resetScoreColumns();});
231
+ $('#page-copy-citation').addEventListener('click',e=>copyCitation(CITATIONS[state.benchmark],e.currentTarget));
232
+ $('#page-save-citation').addEventListener('click',()=>download(state.benchmark+'.bib',CITATIONS[state.benchmark]+'\n','text/plain;charset=utf-8'));
233
  $('#reset-filters').addEventListener('click',resetFilters);$('#empty-reset').addEventListener('click',resetFilters);
234
  $('#download-csv').addEventListener('click',()=>exportCSV(filteredModels()));
235
  $('#compare-open').addEventListener('click',()=>showModels(state.selected));
 
242
  if(e.key==='/'&&!['INPUT','TEXTAREA','SELECT'].includes(document.activeElement.tagName)&&!$('#detail-dialog').open){e.preventDefault();$('#model-search').focus();}
243
  const tab=e.target.closest('[data-benchmark], [data-view], [data-language]');
244
  if(tab&&['ArrowLeft','ArrowRight','Home','End'].includes(e.key)){
245
+ e.preventDefault();const siblings=[...tab.parentElement.querySelectorAll('[data-benchmark], [data-view], [data-language]')].filter(el=>!el.hidden),i=siblings.indexOf(tab);
246
  const n=e.key==='Home'?0:e.key==='End'?siblings.length-1:(i+(e.key==='ArrowRight'?1:-1)+siblings.length)%siblings.length;
247
  siblings[n].click();siblings[n].focus();
248
  }
249
  });
250
  switchBenchmark(state.benchmark);
251
+ if(location.protocol!=='file:')fetch('/api/leaderboard',{cache:'no-store'}).then(r=>r.ok?r.json():null).then(data=>{
252
+ if(!data?.benchmarks)return;
253
+ DATA=data;
254
+ state.selected=state.selected.filter(id=>modelById(id));
255
+ renderResources();renderTable();
256
+ $('#json-download').href='/api/leaderboard';
257
+ }).catch(()=>{});
258
  })();
assets/benchmark-overview.png ADDED

Git LFS Details

  • SHA256: 59575c79a544844ba500b0eac449ecf6134c39b41b6f341503c684954366ea01
  • Pointer size: 132 Bytes
  • Size of remote file: 2.15 MB
assets/rise-agent.png ADDED

Git LFS Details

  • SHA256: 7c9b6540c4980c7e16ccf54f6ed9cb120281ab201255fd0ab5609c43c476afc4
  • Pointer size: 132 Bytes
  • Size of remote file: 1.57 MB
data/leaderboard.json CHANGED
The diff for this file is too large to render. See raw diff
 
dist/README.md ADDED
@@ -0,0 +1,18 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ title: RISE Leaderboard
3
+ emoji: 📈
4
+ colorFrom: blue
5
+ colorTo: gray
6
+ sdk: static
7
+ app_file: index.html
8
+ pinned: false
9
+ fullWidth: true
10
+ short_description: Official Leaderboard of RISEBench
11
+ ---
12
+
13
+ # RISE Leaderboard
14
+
15
+ Official leaderboard of RISEBench and RISEBench++.
16
+
17
+ [Code](https://github.com/VisionXLab/RISEBench) · [RISEBench++ paper](https://arxiv.org/abs/2610.12343) · [Dataset](https://huggingface.co/datasets/VisionXLab/RISEBench-plusplus) · [Outputs](https://huggingface.co/datasets/VisionXLab/RISEBench-plusplus_Outputs)
18
+
dist/admin.html ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ <!doctype html>
2
+ <html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>Review submissions · RISEBench</title><link rel="icon" href="assets/favicon.svg"><link rel="stylesheet" href="styles.css"><link rel="stylesheet" href="portal.css"></head>
3
+ <body data-page="admin"><main class="portal-width review-width">
4
+ <nav class="portal-nav" aria-label="Main navigation"><a class="wordmark" href="index.html">RISEBench<span>++</span></a><div><a href="index.html">Leaderboard</a><a href="submit.html">Submit results</a><button id="sign-out" class="text-button" hidden>Sign out</button></div></nav>
5
+ <header class="portal-heading"><span class="section-kicker">REVIEW WORKSPACE</span><h1>Review submissions.</h1><p>Verify evaluation artifacts, then approve or return results.</p></header>
6
+ <p class="notice" id="service-notice" hidden></p>
7
+ <section class="portal-card login-card" id="login-panel"><h2>Administrator sign in</h2><form id="login-form"><label id="passphrase-label">Passphrase<input type="password" id="admin-passphrase" autocomplete="current-password" required></label><p class="form-message" id="login-message" role="status"></p><button type="submit" class="primary-button" id="login-button">Sign in</button></form></section>
8
+ <section id="review-workspace" hidden><div class="review-toolbar"><div class="review-filters" role="group" aria-label="Submission status"><button data-status="pending" aria-pressed="true">Pending <span id="pending-count">0</span></button><button data-status="approved" aria-pressed="false">Approved</button><button data-status="rejected" aria-pressed="false">Returned</button><button data-status="withdrawn" aria-pressed="false">Withdrawn</button><button data-status="all" aria-pressed="false">All</button></div><button class="outline-button" id="refresh-queue">Refresh</button></div><p id="queue-message" class="form-message" role="status"></p><div class="review-layout"><aside class="review-list" id="review-list" aria-label="Submissions"></aside><section class="portal-card review-detail" id="review-detail"><div class="review-empty"><h2>Select a submission</h2><p>Its scores and evaluation artifacts will appear here.</p></div></section></div></section>
9
+ <footer class="page-footer"><a href="index.html">← Back to leaderboard</a><span>Private review workspace</span></footer>
10
+ </main><script id="submission-schema" type="application/json">{"benchmarks": [{"id": "risebench-plusplus", "name": "RISEBench++", "case_count": 1000, "available_result_languages": ["en", "zh"], "accuracy_unit": "%", "metric_unit": "/100", "score_decimals": 1, "default_sort": "total", "dimensions": [{"key": "temporal", "label": "Temporal", "description": "Infer how a scene changes over time."}, {"key": "causal", "label": "Causal", "description": "Reason about causes, actions, and their consequences."}, {"key": "spatial", "label": "Spatial", "description": "Reason about spatial relationships and transformations."}, {"key": "logical", "label": "Logical", "description": "Apply explicit rules, patterns, and logical constraints."}, {"key": "counterfactual", "label": "Counterfactual", "description": "Visualize outcomes under hypothetical or contrary-to-fact conditions."}, {"key": "hybrid", "label": "Hybrid", "description": "Combine reasoning across three to five successive editing instructions."}], "metrics": [{"key": "instruction_reasoning", "label": "Instruction Reasoning", "description": "Whether the edit realizes the intended reasoning outcome."}, {"key": "appearance_consistency", "label": "Appearance Consistency", "description": "Whether content that should remain unchanged is preserved."}, {"key": "visual_plausibility", "label": "Visual Plausibility", "description": "Visual quality and plausibility; logical tasks are excluded."}], "accuracy_columns": [{"key": "temporal", "label": "Temporal", "description": "Infer how a scene changes over time."}, {"key": "causal", "label": "Causal", "description": "Reason about causes, actions, and their consequences."}, {"key": "spatial", "label": "Spatial", "description": "Reason about spatial relationships and transformations."}, {"key": "logical", "label": "Logical", "description": "Apply explicit rules, patterns, and logical constraints."}, {"key": "counterfactual", "label": "Counterfactual", "description": "Visualize outcomes under hypothetical or contrary-to-fact conditions."}, {"key": "hybrid", "label": "Hybrid", "description": "Combine reasoning across three to five successive editing instructions."}, {"key": "single", "label": "Single", "description": "Accuracy on single-image cases."}, {"key": "multi", "label": "Multi", "description": "Accuracy on multi-image cases. Not evaluated for models without multi-image support."}, {"key": "total", "label": "Total", "description": "Accuracy on the complete benchmark. Not evaluated for single-image-only models."}], "subcategory_columns": [{"key": "temporal_common_sense_knowledge", "label": "Common-Sense Knowledge", "dimension": "temporal", "case_count": 85, "multi_image_case_count": 0, "code": "CSK", "description": "Temporal · Common-Sense Knowledge — accuracy (%)"}, {"key": "temporal_context_knowledge", "label": "Context Knowledge", "dimension": "temporal", "case_count": 52, "multi_image_case_count": 28, "code": "CtxK", "description": "Temporal · Context Knowledge — accuracy (%)"}, {"key": "temporal_disciplinary_knowledge", "label": "Disciplinary Knowledge", "dimension": "temporal", "case_count": 63, "multi_image_case_count": 4, "code": "DK", "description": "Temporal · Disciplinary Knowledge — accuracy (%)"}, {"key": "causal_common_sense_knowledge", "label": "Common-Sense Knowledge", "dimension": "causal", "case_count": 80, "multi_image_case_count": 1, "code": "CSK", "description": "Causal · Common-Sense Knowledge — accuracy (%)"}, {"key": "causal_context_knowledge", "label": "Context Knowledge", "dimension": "causal", "case_count": 40, "multi_image_case_count": 2, "code": "CtxK", "description": "Causal · Context Knowledge — accuracy (%)"}, {"key": "causal_disciplinary_knowledge", "label": "Disciplinary Knowledge", "dimension": "causal", "case_count": 80, "multi_image_case_count": 5, "code": "DK", "description": "Causal · Disciplinary Knowledge — accuracy (%)"}, {"key": "spatial_relation", "label": "Relation", "dimension": "spatial", "case_count": 106, "multi_image_case_count": 6, "code": "Rel.", "description": "Spatial · Relation — accuracy (%)"}, {"key": "spatial_structure", "label": "Structure", "dimension": "spatial", "case_count": 94, "multi_image_case_count": 12, "code": "Struct.", "description": "Spatial · Structure — accuracy (%)"}, {"key": "logical_explicit_rule_deduction", "label": "Explicit Rule Deduction", "dimension": "logical", "case_count": 123, "multi_image_case_count": 0, "code": "ERD", "description": "Logical · Explicit Rule Deduction — accuracy (%)"}, {"key": "logical_implicit_pattern_induction", "label": "Implicit Pattern Induction", "dimension": "logical", "case_count": 77, "multi_image_case_count": 20, "code": "IPI", "description": "Logical · Implicit Pattern Induction — accuracy (%)"}, {"key": "counterfactual_counterfactual_imagination", "label": "Counterfactual Imagination", "dimension": "counterfactual", "case_count": 70, "multi_image_case_count": 0, "code": "CFI", "description": "Counterfactual · Counterfactual Imagination — accuracy (%)"}, {"key": "counterfactual_anomaly_correction_and_generation", "label": "Anomaly Correction and Generation", "dimension": "counterfactual", "case_count": 30, "multi_image_case_count": 0, "code": "ACG", "description": "Counterfactual · Anomaly Correction and Generation — accuracy (%)"}], "task_type_columns": [{"key": "T01", "code": "T01", "label": "Life Progression", "dimension": "temporal", "subcategory": "temporal_common_sense_knowledge", "case_count": 24, "multi_image_case_count": 0, "description": "Temporal · Life Progression — accuracy (%)"}, {"key": "T02", "code": "T02", "label": "Material Transformation", "dimension": "temporal", "subcategory": "temporal_common_sense_knowledge", "case_count": 9, "multi_image_case_count": 0, "description": "Temporal · Material Transformation — accuracy (%)"}, {"key": "T03", "code": "T03", "label": "Natural Environmental Changes", "dimension": "temporal", "subcategory": "temporal_common_sense_knowledge", "case_count": 13, "multi_image_case_count": 0, "description": "Temporal · Natural Environmental Changes — accuracy (%)"}, {"key": "T04", "code": "T04", "label": "Physical Aging", "dimension": "temporal", "subcategory": "temporal_common_sense_knowledge", "case_count": 20, "multi_image_case_count": 0, "description": "Temporal · Physical Aging — accuracy (%)"}, {"key": "T05", "code": "T05", "label": "Social Activities", "dimension": "temporal", "subcategory": "temporal_common_sense_knowledge", "case_count": 8, "multi_image_case_count": 0, "description": "Temporal · Social Activities — accuracy (%)"}, {"key": "T06", "code": "T06", "label": "Tool Evolution", "dimension": "temporal", "subcategory": "temporal_common_sense_knowledge", "case_count": 7, "multi_image_case_count": 0, "description": "Temporal · Tool Evolution — accuracy (%)"}, {"key": "T07", "code": "T07", "label": "Urban Evolution", "dimension": "temporal", "subcategory": "temporal_common_sense_knowledge", "case_count": 4, "multi_image_case_count": 0, "description": "Temporal · Urban Evolution — accuracy (%)"}, {"key": "T08", "code": "T08", "label": "Temporal State Transition", "dimension": "temporal", "subcategory": "temporal_context_knowledge", "case_count": 15, "multi_image_case_count": 4, "description": "Temporal · Temporal State Transition — accuracy (%)"}, {"key": "T09", "code": "T09", "label": "Precise Temporal Localization", "dimension": "temporal", "subcategory": "temporal_context_knowledge", "case_count": 14, "multi_image_case_count": 2, "description": "Temporal · Precise Temporal Localization — accuracy (%)"}, {"key": "T10", "code": "T10", "label": "Position Change", "dimension": "temporal", "subcategory": "temporal_context_knowledge", "case_count": 15, "multi_image_case_count": 14, "description": "Temporal · Position Change — accuracy (%)"}, {"key": "T11", "code": "T11", "label": "Action Sequence", "dimension": "temporal", "subcategory": "temporal_context_knowledge", "case_count": 8, "multi_image_case_count": 8, "description": "Temporal · Action Sequence — accuracy (%)"}, {"key": "T12", "code": "T12", "label": "Physics", "dimension": "temporal", "subcategory": "temporal_disciplinary_knowledge", "case_count": 4, "multi_image_case_count": 0, "description": "Temporal · Physics — accuracy (%)"}, {"key": "T13", "code": "T13", "label": "Chemistry", "dimension": "temporal", "subcategory": "temporal_disciplinary_knowledge", "case_count": 8, "multi_image_case_count": 4, "description": "Temporal · Chemistry — accuracy (%)"}, {"key": "T14", "code": "T14", "label": "Biology", "dimension": "temporal", "subcategory": "temporal_disciplinary_knowledge", "case_count": 9, "multi_image_case_count": 0, "description": "Temporal · Biology — accuracy (%)"}, {"key": "T15", "code": "T15", "label": "Astronomy", "dimension": "temporal", "subcategory": "temporal_disciplinary_knowledge", "case_count": 12, "multi_image_case_count": 0, "description": "Temporal · Astronomy — accuracy (%)"}, {"key": "T16", "code": "T16", "label": "Geography", "dimension": "temporal", "subcategory": "temporal_disciplinary_knowledge", "case_count": 18, "multi_image_case_count": 0, "description": "Temporal · Geography — accuracy (%)"}, {"key": "T17", "code": "T17", "label": "History", "dimension": "temporal", "subcategory": "temporal_disciplinary_knowledge", "case_count": 5, "multi_image_case_count": 0, "description": "Temporal · History — accuracy (%)"}, {"key": "T18", "code": "T18", "label": "Medicine", "dimension": "temporal", "subcategory": "temporal_disciplinary_knowledge", "case_count": 4, "multi_image_case_count": 0, "description": "Temporal · Medicine — accuracy (%)"}, {"key": "T19", "code": "T19", "label": "Computer Science", "dimension": "temporal", "subcategory": "temporal_disciplinary_knowledge", "case_count": 3, "multi_image_case_count": 0, "description": "Temporal · Computer Science — accuracy (%)"}, {"key": "C01", "code": "C01", "label": "Physical State Transition", "dimension": "causal", "subcategory": "causal_common_sense_knowledge", "case_count": 31, "multi_image_case_count": 0, "description": "Causal · Physical State Transition — accuracy (%)"}, {"key": "C02", "code": "C02", "label": "Structural Damage", "dimension": "causal", "subcategory": "causal_common_sense_knowledge", "case_count": 27, "multi_image_case_count": 0, "description": "Causal · Structural Damage — accuracy (%)"}, {"key": "C03", "code": "C03", "label": "Flexible Deformation", "dimension": "causal", "subcategory": "causal_common_sense_knowledge", "case_count": 22, "multi_image_case_count": 1, "description": "Causal · Flexible Deformation — accuracy (%)"}, {"key": "C04", "code": "C04", "label": "Magnitude Change", "dimension": "causal", "subcategory": "causal_context_knowledge", "case_count": 10, "multi_image_case_count": 0, "description": "Causal · Magnitude Change — accuracy (%)"}, {"key": "C05", "code": "C05", "label": "Reading Offset", "dimension": "causal", "subcategory": "causal_context_knowledge", "case_count": 10, "multi_image_case_count": 2, "description": "Causal · Reading Offset — accuracy (%)"}, {"key": "C06", "code": "C06", "label": "Order Relation", "dimension": "causal", "subcategory": "causal_context_knowledge", "case_count": 10, "multi_image_case_count": 0, "description": "Causal · Order Relation — accuracy (%)"}, {"key": "C07", "code": "C07", "label": "Feature Mapping", "dimension": "causal", "subcategory": "causal_context_knowledge", "case_count": 10, "multi_image_case_count": 0, "description": "Causal · Feature Mapping — accuracy (%)"}, {"key": "C08", "code": "C08", "label": "Physics", "dimension": "causal", "subcategory": "causal_disciplinary_knowledge", "case_count": 25, "multi_image_case_count": 1, "description": "Causal · Physics — accuracy (%)"}, {"key": "C09", "code": "C09", "label": "Chemistry", "dimension": "causal", "subcategory": "causal_disciplinary_knowledge", "case_count": 23, "multi_image_case_count": 4, "description": "Causal · Chemistry — accuracy (%)"}, {"key": "C10", "code": "C10", "label": "Biology", "dimension": "causal", "subcategory": "causal_disciplinary_knowledge", "case_count": 12, "multi_image_case_count": 0, "description": "Causal · Biology — accuracy (%)"}, {"key": "C11", "code": "C11", "label": "Astronomy", "dimension": "causal", "subcategory": "causal_disciplinary_knowledge", "case_count": 3, "multi_image_case_count": 0, "description": "Causal · Astronomy — accuracy (%)"}, {"key": "C12", "code": "C12", "label": "Medicine", "dimension": "causal", "subcategory": "causal_disciplinary_knowledge", "case_count": 4, "multi_image_case_count": 0, "description": "Causal · Medicine — accuracy (%)"}, {"key": "C13", "code": "C13", "label": "Music Theory", "dimension": "causal", "subcategory": "causal_disciplinary_knowledge", "case_count": 3, "multi_image_case_count": 0, "description": "Causal · Music Theory — accuracy (%)"}, {"key": "C14", "code": "C14", "label": "Computer Science", "dimension": "causal", "subcategory": "causal_disciplinary_knowledge", "case_count": 10, "multi_image_case_count": 0, "description": "Causal · Computer Science — accuracy (%)"}, {"key": "S01", "code": "S01", "label": "Adjacency", "dimension": "spatial", "subcategory": "spatial_relation", "case_count": 11, "multi_image_case_count": 0, "description": "Spatial · Adjacency — accuracy (%)"}, {"key": "S02", "code": "S02", "label": "Direction", "dimension": "spatial", "subcategory": "spatial_relation", "case_count": 11, "multi_image_case_count": 0, "description": "Spatial · Direction — accuracy (%)"}, {"key": "S03", "code": "S03", "label": "Orientation", "dimension": "spatial", "subcategory": "spatial_relation", "case_count": 11, "multi_image_case_count": 0, "description": "Spatial · Orientation — accuracy (%)"}, {"key": "S04", "code": "S04", "label": "Projection", "dimension": "spatial", "subcategory": "spatial_relation", "case_count": 12, "multi_image_case_count": 0, "description": "Spatial · Projection — accuracy (%)"}, {"key": "S05", "code": "S05", "label": "Distance", "dimension": "spatial", "subcategory": "spatial_relation", "case_count": 13, "multi_image_case_count": 0, "description": "Spatial · Distance — accuracy (%)"}, {"key": "S06", "code": "S06", "label": "Size", "dimension": "spatial", "subcategory": "spatial_relation", "case_count": 15, "multi_image_case_count": 0, "description": "Spatial · Size — accuracy (%)"}, {"key": "S07", "code": "S07", "label": "Configuration", "dimension": "spatial", "subcategory": "spatial_relation", "case_count": 18, "multi_image_case_count": 0, "description": "Spatial · Configuration — accuracy (%)"}, {"key": "S08", "code": "S08", "label": "Viewing Scale", "dimension": "spatial", "subcategory": "spatial_relation", "case_count": 9, "multi_image_case_count": 0, "description": "Spatial · Viewing Scale — accuracy (%)"}, {"key": "S09", "code": "S09", "label": "Localization", "dimension": "spatial", "subcategory": "spatial_relation", "case_count": 6, "multi_image_case_count": 6, "description": "Spatial · Localization — accuracy (%)"}, {"key": "S10", "code": "S10", "label": "Part-Whole Perception", "dimension": "spatial", "subcategory": "spatial_structure", "case_count": 24, "multi_image_case_count": 0, "description": "Spatial · Part-Whole Perception — accuracy (%)"}, {"key": "S11", "code": "S11", "label": "Geometric Regularities Reasoning", "dimension": "spatial", "subcategory": "spatial_structure", "case_count": 15, "multi_image_case_count": 0, "description": "Spatial · Geometric Regularities Reasoning — accuracy (%)"}, {"key": "S12", "code": "S12", "label": "Viewpoint Generation", "dimension": "spatial", "subcategory": "spatial_structure", "case_count": 26, "multi_image_case_count": 0, "description": "Spatial · Viewpoint Generation — accuracy (%)"}, {"key": "S13", "code": "S13", "label": "Environmental Structure Reasoning", "dimension": "spatial", "subcategory": "spatial_structure", "case_count": 19, "multi_image_case_count": 2, "description": "Spatial · Environmental Structure Reasoning — accuracy (%)"}, {"key": "S14", "code": "S14", "label": "Egocentric Scene Reconstruction", "dimension": "spatial", "subcategory": "spatial_structure", "case_count": 10, "multi_image_case_count": 10, "description": "Spatial · Egocentric Scene Reconstruction — accuracy (%)"}, {"key": "L01", "code": "L01", "label": "Path Searching", "dimension": "logical", "subcategory": "logical_explicit_rule_deduction", "case_count": 24, "multi_image_case_count": 0, "description": "Logical · Path Searching — accuracy (%)"}, {"key": "L02", "code": "L02", "label": "Mathematical Derivation", "dimension": "logical", "subcategory": "logical_explicit_rule_deduction", "case_count": 27, "multi_image_case_count": 0, "description": "Logical · Mathematical Derivation — accuracy (%)"}, {"key": "L03", "code": "L03", "label": "Game Deduction", "dimension": "logical", "subcategory": "logical_explicit_rule_deduction", "case_count": 37, "multi_image_case_count": 0, "description": "Logical · Game Deduction — accuracy (%)"}, {"key": "L04", "code": "L04", "label": "Puzzle Solving", "dimension": "logical", "subcategory": "logical_explicit_rule_deduction", "case_count": 35, "multi_image_case_count": 0, "description": "Logical · Puzzle Solving — accuracy (%)"}, {"key": "L05", "code": "L05", "label": "Pattern Prediction", "dimension": "logical", "subcategory": "logical_implicit_pattern_induction", "case_count": 39, "multi_image_case_count": 0, "description": "Logical · Pattern Prediction — accuracy (%)"}, {"key": "L06", "code": "L06", "label": "Visual Oddity Detection", "dimension": "logical", "subcategory": "logical_implicit_pattern_induction", "case_count": 18, "multi_image_case_count": 0, "description": "Logical · Visual Oddity Detection — accuracy (%)"}, {"key": "L07", "code": "L07", "label": "Rule Transfer", "dimension": "logical", "subcategory": "logical_implicit_pattern_induction", "case_count": 20, "multi_image_case_count": 20, "description": "Logical · Rule Transfer — accuracy (%)"}, {"key": "F01", "code": "F01", "label": "Physical Counterfactual", "dimension": "counterfactual", "subcategory": "counterfactual_counterfactual_imagination", "case_count": 23, "multi_image_case_count": 0, "description": "Counterfactual · Physical Counterfactual — accuracy (%)"}, {"key": "F02", "code": "F02", "label": "Chemical Counterfactual", "dimension": "counterfactual", "subcategory": "counterfactual_counterfactual_imagination", "case_count": 9, "multi_image_case_count": 0, "description": "Counterfactual · Chemical Counterfactual — accuracy (%)"}, {"key": "F03", "code": "F03", "label": "Biological Counterfactual", "dimension": "counterfactual", "subcategory": "counterfactual_counterfactual_imagination", "case_count": 8, "multi_image_case_count": 0, "description": "Counterfactual · Biological Counterfactual — accuracy (%)"}, {"key": "F04", "code": "F04", "label": "Astronomy Counterfactual", "dimension": "counterfactual", "subcategory": "counterfactual_counterfactual_imagination", "case_count": 7, "multi_image_case_count": 0, "description": "Counterfactual · Astronomy Counterfactual — accuracy (%)"}, {"key": "F05", "code": "F05", "label": "Geography Counterfactual", "dimension": "counterfactual", "subcategory": "counterfactual_counterfactual_imagination", "case_count": 8, "multi_image_case_count": 0, "description": "Counterfactual · Geography Counterfactual — accuracy (%)"}, {"key": "F06", "code": "F06", "label": "History Counterfactual", "dimension": "counterfactual", "subcategory": "counterfactual_counterfactual_imagination", "case_count": 7, "multi_image_case_count": 0, "description": "Counterfactual · History Counterfactual — accuracy (%)"}, {"key": "F07", "code": "F07", "label": "Music Theory Counterfactual", "dimension": "counterfactual", "subcategory": "counterfactual_counterfactual_imagination", "case_count": 4, "multi_image_case_count": 0, "description": "Counterfactual · Music Theory Counterfactual — accuracy (%)"}, {"key": "F08", "code": "F08", "label": "Computer Science Counterfactual", "dimension": "counterfactual", "subcategory": "counterfactual_counterfactual_imagination", "case_count": 4, "multi_image_case_count": 0, "description": "Counterfactual · Computer Science Counterfactual — accuracy (%)"}, {"key": "F09", "code": "F09", "label": "Anatomical Errors", "dimension": "counterfactual", "subcategory": "counterfactual_anomaly_correction_and_generation", "case_count": 10, "multi_image_case_count": 0, "description": "Counterfactual · Anatomical Errors — accuracy (%)"}, {"key": "F10", "code": "F10", "label": "Structural Anomalies", "dimension": "counterfactual", "subcategory": "counterfactual_anomaly_correction_and_generation", "case_count": 11, "multi_image_case_count": 0, "description": "Counterfactual · Structural Anomalies — accuracy (%)"}, {"key": "F11", "code": "F11", "label": "Relational Anomalies", "dimension": "counterfactual", "subcategory": "counterfactual_anomaly_correction_and_generation", "case_count": 9, "multi_image_case_count": 0, "description": "Counterfactual · Relational Anomalies — accuracy (%)"}], "links": {"paper": "https://arxiv.org/abs/2610.12343", "data": "https://huggingface.co/datasets/VisionXLab/RISEBench-plusplus", "outputs": "https://huggingface.co/datasets/VisionXLab/RISEBench-plusplus_Outputs", "github": "https://github.com/VisionXLab/RISEBench/tree/main/RISEBench%2B%2B"}, "judges": {"instruction_reasoning": "Gemini-3-Flash", "appearance_consistency": "Gemini-3-Flash", "visual_plausibility": "Gemini-3.1-Flash-Lite"}, "results_by_language": {"en": {"models": [{"id": "gpt-image-2-5-sunburst", "name": "GPT-Image-2.5 Sunburst"}, {"id": "nano-banana-pro", "name": "Nano Banana Pro"}, {"id": "nano-banana-2", "name": "Nano Banana 2"}, {"id": "gpt-image-2", "name": "GPT-Image-2"}, {"id": "gpt-image-2-5-flare", "name": "GPT-Image-2.5 Flare"}, {"id": "luma-uni-1", "name": "Luma Uni-1"}, {"id": "qwen-image-3-0", "name": "Qwen-Image-3.0"}, {"id": "nano-banana-2-lite", "name": "Nano Banana 2 Lite"}, {"id": "flux-2-max", "name": "FLUX.2 Max"}, {"id": "gpt-image-1-5", "name": "GPT-Image-1.5"}, {"id": "flux-2-pro", "name": "FLUX.2 Pro"}, {"id": "nano-banana", "name": "Nano Banana"}, {"id": "hunyuanimage-3-5", "name": "HunyuanImage-3.5"}, {"id": "wan2-7-image-pro", "name": "Wan2.7-Image-Pro"}, {"id": "gpt-image-1", "name": "GPT-Image-1"}, {"id": "qwen-image-2-0", "name": "Qwen-Image-2.0"}, {"id": "seedream-4-5", "name": "Seedream 4.5"}, {"id": "seedream-5-0", "name": "Seedream 5.0"}, {"id": "step-image-edit-2", "name": "Step Image Edit 2"}, {"id": "hunyuanimage-3-0-instruct", "name": "HunyuanImage-3.0-Instruct"}, {"id": "qwen-image-edit-2511", "name": "Qwen-Image-Edit-2511"}, {"id": "qwen-image-2-1", "name": "Qwen-Image-2.1"}, {"id": "firered-image-edit-1-0", "name": "FireRed-Image-Edit-1.0"}, {"id": "firered-image-edit-1-1", "name": "FireRed-Image-Edit-1.1"}, {"id": "qwen-image-edit-2509", "name": "Qwen-Image-Edit-2509"}, {"id": "hidream-o1-image", "name": "HiDream-O1-Image"}, {"id": "flux-2-dev", "name": "FLUX.2 Dev"}, {"id": "flux-2-klein-9b", "name": "FLUX.2 Klein 9B"}, {"id": "joyai-image-edit-plus", "name": "JoyAI-Image-Edit-Plus"}, {"id": "sensenova-u1-a3b-mot-sft", "name": "SenseNova-U1-A3B-MoT-SFT"}, {"id": "unipic-3-0", "name": "UniPic 3.0"}, {"id": "bagel-w-cot", "name": "BAGEL (w/ CoT)"}, {"id": "sensenova-u1-8b-mot-sft", "name": "SenseNova-U1-8B-MoT-SFT"}, {"id": "flux-2-klein-4b", "name": "FLUX.2 Klein 4B"}, {"id": "uniworld-v2", "name": "UniWorld-V2"}, {"id": "bagel", "name": "BAGEL"}, {"id": "omnigen2", "name": "OmniGen2"}, {"id": "omnigen", "name": "OmniGen"}, {"id": "emu2-gen", "name": "Emu2-Gen"}, {"id": "joyai-image-edit", "name": "JoyAI-Image-Edit"}, {"id": "step1x-edit-thinking", "name": "Step1X-Edit (thinking)"}, {"id": "boogu-image-0-1-edit", "name": "Boogu-Image-0.1-Edit"}, {"id": "step1x-edit-thinking-reflection", "name": "Step1X-Edit (thinking + reflection)"}, {"id": "longcat-image-edit", "name": "LongCat-Image-Edit"}, {"id": "step1x-edit-base", "name": "Step1X-Edit (base)"}, {"id": "internvl-u-w-cot", "name": "InternVL-U (w/ CoT)"}, {"id": "flux-1-kontext-dev", "name": "FLUX.1 Kontext Dev"}, {"id": "llada-image", "name": "LLaDA-Image"}, {"id": "ovis-u1", "name": "Ovis-U1"}, {"id": "internvl-u", "name": "InternVL-U"}, {"id": "unipic2-sd3-5m-kontext-2b", "name": "UniPic2-SD3.5M-Kontext-2B"}, {"id": "lumina-dimoo", "name": "Lumina-DiMOO"}, {"id": "uniworld-v1", "name": "UniWorld-V1"}, {"id": "rise-agent-ours", "name": "RISE-Agent (Ours)"}, {"id": "mindbrush", "name": "MindBrush"}, {"id": "interleavethinker", "name": "InterleaveThinker"}, {"id": "intentedit", "name": "IntentEdit"}, {"id": "imagent", "name": "ImAgent"}]}, "zh": {"models": [{"id": "gpt-image-2-5-sunburst", "name": "GPT-Image-2.5 Sunburst"}, {"id": "nano-banana-pro", "name": "Nano Banana Pro"}, {"id": "nano-banana-2", "name": "Nano Banana 2"}, {"id": "luma-uni-1", "name": "Luma Uni-1"}, {"id": "gpt-image-2", "name": "GPT-Image-2"}, {"id": "qwen-image-3-0", "name": "Qwen-Image-3.0"}, {"id": "gpt-image-2-5-flare", "name": "GPT-Image-2.5 Flare"}, {"id": "flux-2-max", "name": "FLUX.2 Max"}, {"id": "nano-banana-2-lite", "name": "Nano Banana 2 Lite"}, {"id": "gpt-image-1-5", "name": "GPT-Image-1.5"}, {"id": "nano-banana", "name": "Nano Banana"}, {"id": "flux-2-pro", "name": "FLUX.2 Pro"}, {"id": "hunyuanimage-3-5", "name": "HunyuanImage-3.5"}, {"id": "wan2-7-image-pro", "name": "Wan2.7-Image-Pro"}, {"id": "qwen-image-2-0", "name": "Qwen-Image-2.0"}, {"id": "seedream-4-5", "name": "Seedream 4.5"}, {"id": "seedream-5-0", "name": "Seedream 5.0"}, {"id": "gpt-image-1", "name": "GPT-Image-1"}, {"id": "step-image-edit-2", "name": "Step Image Edit 2"}, {"id": "hunyuanimage-3-0-instruct", "name": "HunyuanImage-3.0-Instruct"}, {"id": "qwen-image-2-1", "name": "Qwen-Image-2.1"}, {"id": "firered-image-edit-1-1", "name": "FireRed-Image-Edit-1.1"}, {"id": "flux-2-dev", "name": "FLUX.2 Dev"}, {"id": "qwen-image-edit-2511", "name": "Qwen-Image-Edit-2511"}, {"id": "qwen-image-edit-2509", "name": "Qwen-Image-Edit-2509"}, {"id": "firered-image-edit-1-0", "name": "FireRed-Image-Edit-1.0"}, {"id": "sensenova-u1-a3b-mot-sft", "name": "SenseNova-U1-A3B-MoT-SFT"}, {"id": "joyai-image-edit-plus", "name": "JoyAI-Image-Edit-Plus"}, {"id": "flux-2-klein-9b", "name": "FLUX.2 Klein 9B"}, {"id": "bagel-w-cot", "name": "BAGEL (w/ CoT)"}, {"id": "hidream-o1-image", "name": "HiDream-O1-Image"}, {"id": "flux-2-klein-4b", "name": "FLUX.2 Klein 4B"}, {"id": "uniworld-v2", "name": "UniWorld-V2"}, {"id": "sensenova-u1-8b-mot-sft", "name": "SenseNova-U1-8B-MoT-SFT"}, {"id": "unipic-3-0", "name": "UniPic 3.0"}, {"id": "bagel", "name": "BAGEL"}, {"id": "omnigen2", "name": "OmniGen2"}, {"id": "omnigen", "name": "OmniGen"}, {"id": "emu2-gen", "name": "Emu2-Gen"}, {"id": "joyai-image-edit", "name": "JoyAI-Image-Edit"}, {"id": "boogu-image-0-1-edit", "name": "Boogu-Image-0.1-Edit"}, {"id": "step1x-edit-thinking-reflection", "name": "Step1X-Edit (thinking + reflection)"}, {"id": "step1x-edit-thinking", "name": "Step1X-Edit (thinking)"}, {"id": "step1x-edit-base", "name": "Step1X-Edit (base)"}, {"id": "longcat-image-edit", "name": "LongCat-Image-Edit"}, {"id": "flux-1-kontext-dev", "name": "FLUX.1 Kontext Dev"}, {"id": "llada-image", "name": "LLaDA-Image"}, {"id": "internvl-u-w-cot", "name": "InternVL-U (w/ CoT)"}, {"id": "ovis-u1", "name": "Ovis-U1"}, {"id": "internvl-u", "name": "InternVL-U"}, {"id": "lumina-dimoo", "name": "Lumina-DiMOO"}, {"id": "uniworld-v1", "name": "UniWorld-V1"}, {"id": "unipic2-sd3-5m-kontext-2b", "name": "UniPic2-SD3.5M-Kontext-2B"}, {"id": "rise-agent-ours", "name": "RISE-Agent (Ours)"}, {"id": "mindbrush", "name": "MindBrush"}, {"id": "interleavethinker", "name": "InterleaveThinker"}, {"id": "intentedit", "name": "IntentEdit"}, {"id": "imagent", "name": "ImAgent"}]}}}, {"id": "risebench", "name": "RISEBench", "case_count": 360, "available_result_languages": ["en"], "accuracy_unit": "%", "metric_unit": "/100", "score_decimals": 1, "default_sort": "total", "dimensions": [{"key": "temporal", "label": "Temporal", "description": "Infer how a scene changes over time."}, {"key": "causal", "label": "Causal", "description": "Reason about causes, actions, and their consequences."}, {"key": "spatial", "label": "Spatial", "description": "Reason about spatial relationships and transformations."}, {"key": "logical", "label": "Logical", "description": "Apply explicit rules, patterns, and logical constraints."}], "metrics": [{"key": "instruction_reasoning", "label": "Instruction Reasoning", "description": "Whether the edit realizes the intended reasoning outcome."}, {"key": "appearance_consistency", "label": "Appearance Consistency", "description": "Whether content that should remain unchanged is preserved."}, {"key": "visual_plausibility", "label": "Visual Plausibility", "description": "Visual quality and plausibility; logical tasks are excluded."}], "accuracy_columns": [{"key": "temporal", "label": "Temporal", "description": "Infer how a scene changes over time."}, {"key": "causal", "label": "Causal", "description": "Reason about causes, actions, and their consequences."}, {"key": "spatial", "label": "Spatial", "description": "Reason about spatial relationships and transformations."}, {"key": "logical", "label": "Logical", "description": "Apply explicit rules, patterns, and logical constraints."}, {"key": "total", "label": "Overall", "description": "Accuracy on the complete RISEBench-360 benchmark."}], "links": {"paper": "https://arxiv.org/abs/2504.02826", "data": "https://huggingface.co/datasets/PhoenixZ/RISEBench", "outputs": "https://huggingface.co/datasets/zpy777/RISEBench_Outputs", "github": "https://github.com/VisionXLab/RISEBench/tree/main/RISEBench"}, "judges": {"instruction_reasoning": "GPT-4o", "appearance_consistency": "GPT-4o", "visual_plausibility": "GPT-4o"}, "results_by_language": {"en": {"models": [{"id": "gpt-image-1-5", "name": "GPT-Image-1.5"}, {"id": "gpt-image-2", "name": "GPT-Image-2"}, {"id": "gemini-3-pro-image-preview-nano-banana-pro", "name": "Gemini-3-pro-image-preview (Nano Banana-pro)"}, {"id": "gemini-2-5-flash-image-nano-banana", "name": "Gemini-2.5-Flash-Image (Nano Banana)"}, {"id": "gpt-image-1", "name": "GPT-Image-1"}, {"id": "gpt-image-1-mini", "name": "GPT-Image-1-mini"}, {"id": "qwen-image-edit-2511", "name": "Qwen-Image-Edit-2511"}, {"id": "bagel-w-cot", "name": "BAGEL (w/ CoT)"}, {"id": "gemini-2-0-flash-exp", "name": "Gemini-2.0-Flash-exp"}, {"id": "seedream-4-0", "name": "Seedream-4.0"}, {"id": "gemini-2-0-flash-pre", "name": "Gemini-2.0-Flash-pre"}, {"id": "qwen-image-edit-2509", "name": "Qwen-Image-Edit-2509"}, {"id": "bagel", "name": "BAGEL"}, {"id": "flux-1-kontext-dev", "name": "FLUX.1-Kontext-Dev"}, {"id": "ovis-u1", "name": "Ovis-U1"}, {"id": "step1x-edit", "name": "Step1X-Edit"}, {"id": "omnigen", "name": "OmniGen"}, {"id": "emu2", "name": "EMU2"}, {"id": "hidream-edit", "name": "HiDream-Edit"}, {"id": "flux-1-canny", "name": "FLUX.1-Canny"}]}}}]}</script><script src="portal.js" defer></script></body></html>
dist/app.js ADDED
@@ -0,0 +1,258 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ 'use strict';
2
+ (() => {
3
+ let DATA = JSON.parse(document.getElementById('leaderboard-data').textContent);
4
+ const CITATIONS = JSON.parse(document.getElementById('citation-data').textContent);
5
+ const $ = (selector) => document.querySelector(selector);
6
+ const $$ = (selector) => [...document.querySelectorAll(selector)];
7
+ const esc = (value) => String(value ?? '').replace(/[&<>"']/g, (ch) => ({'&':'&amp;','<':'&lt;','>':'&gt;','"':'&quot;',"'":'&#39;'}[ch]));
8
+ const groupLabels = {closed:'Closed-source',open:'Open-source',agentic:'Agentic'};
9
+ const colors = ['#3283bf','#2d9a86','#9b75bd'];
10
+ const params = new URLSearchParams(location.search);
11
+ const initialBenchmark = DATA.benchmarks.find(b => b.id === params.get('benchmark')) || DATA.benchmarks[0];
12
+ const state = {benchmark:initialBenchmark.id,language:params.get('language')==='zh'?'zh':'en',view:'accuracy',dimension:'temporal',subcategory:'all',sort:'total',direction:'desc',group:'all',input:'all',query:'',selected:[],visible:[]};
13
+ let toastTimer;
14
+ const benchmarkMetadata = () => DATA.benchmarks.find(b => b.id === state.benchmark);
15
+ const languageCode = () => benchmarkMetadata().results_by_language[state.language] ? state.language : 'en';
16
+ const benchmark = () => ({...benchmarkMetadata(), ...benchmarkMetadata().results_by_language[languageCode()]});
17
+ const resultLanguageLabel = () => state.benchmark==='risebench-plusplus' ? benchmark().language : 'Original';
18
+ const modelById = id => benchmark().models.find(m => m.id === id);
19
+ const score = (model, key = state.sort) => model[state.view]?.[key] ?? null;
20
+ const fmt = value => value == null ? '—' : value.toFixed(1);
21
+ const summaryKeys = ['total','single','multi'];
22
+ const orderedAccuracyColumns = () => {
23
+ const columns=benchmark().accuracy_columns;
24
+ return benchmark().id==='risebench-plusplus'
25
+ ? [...columns.filter(c=>!summaryKeys.includes(c.key)), ...summaryKeys.map(key=>columns.find(c=>c.key===key))]
26
+ : [columns.find(c=>c.key==='total'), ...columns.filter(c=>c.key!=='total')];
27
+ };
28
+ const isBreakdown = () => ['subcategories','task_types'].includes(state.view);
29
+ const viewLabel = () => ({accuracy:'Reasoning accuracy',metrics:'Evaluation scores',subcategories:'Subcategory accuracy',task_types:'Task-type accuracy'}[state.view]);
30
+ const availableColumns = () => {
31
+ const b=benchmark();
32
+ if(state.view==='accuracy')return orderedAccuracyColumns();
33
+ if(state.view==='metrics')return b.metrics;
34
+ return b[state.view==='subcategories'?'subcategory_columns':'task_type_columns'].filter(c=>(state.dimension==='all'||c.dimension===state.dimension)&&(state.view!=='task_types'||state.subcategory==='all'||c.subcategory===state.subcategory));
35
+ };
36
+ const qualifiedLabel = c => isBreakdown()?`${c.dimension[0].toUpperCase()+c.dimension.slice(1)} · ${c.label}`:c.label;
37
+ const scoreLabel = key => availableColumns().find(c=>c.key===key)?.label || key;
38
+ const isPlus = () => state.benchmark === 'risebench-plusplus';
39
+ function toast(message) {
40
+ clearTimeout(toastTimer); $('#toast').textContent = message; $('#toast').hidden = false;
41
+ toastTimer = setTimeout(() => {$('#toast').hidden = true;}, 3000);
42
+ }
43
+ function saveState() {
44
+ try {
45
+ const url = new URL(location.href); url.searchParams.set('benchmark',state.benchmark); url.searchParams.set('language',languageCode());
46
+ history.replaceState(null,'',url);
47
+ } catch (_) { /* Local file previews still work without history updates. */ }
48
+ }
49
+ function filteredModels() {
50
+ const q = state.query.trim().toLowerCase();
51
+ return benchmark().models.filter(m => (!q || m.name.toLowerCase().includes(q)) && (state.group==='all'||m.group===state.group) && (state.input==='all'||m.multi_image===(state.input==='multi'))).sort((a,b) => {
52
+ const av=score(a), bv=score(b);
53
+ if(av===null&&bv===null)return a.source_order-b.source_order;
54
+ if(av===null)return 1;
55
+ if(bv===null)return -1;
56
+ return (state.direction==='desc'?bv-av:av-bv)||a.source_order-b.source_order;
57
+ });
58
+ }
59
+ function rankOf(model) {
60
+ const value = score(model); if(value===null)return null;
61
+ return 1+benchmark().models.filter(m=>score(m)!==null&&score(m)>value).length;
62
+ }
63
+ function renderResources() {
64
+ const b=benchmark();
65
+ $('#hero-links').innerHTML=[['Paper','paper'],['Dataset','data'],['Outputs','outputs'],['Code','github']].map(([label,key])=>`<a href="${esc(b.links[key])}" target="_blank" rel="noopener noreferrer">${label} <span aria-hidden="true">↗</span></a>`).join('');
66
+ $('#submit-results-link').href='submit.html?'+new URLSearchParams({benchmark:state.benchmark,language:languageCode()});
67
+ $('#submit-results-link').setAttribute('aria-label','Submit results to '+b.name);
68
+ $('#board-options').hidden=b.available_result_languages.length<2;
69
+ $$('[data-language]').forEach(button=>button.setAttribute('aria-pressed',button.dataset.language===languageCode()));
70
+ $('#group-filters').innerHTML=isPlus()?['all','closed','open','agentic'].map(g=>`<button data-group="${g}" aria-pressed="${state.group===g}">${g==='all'?'All models':groupLabels[g]}<span>${g==='all'?b.models.length:b.models.filter(m=>m.group===g).length}</span></button>`).join(''):'<span class="caption-text">All models</span>';
71
+ $('.input-filter').hidden=!isPlus();
72
+ $$('[data-plus-only]').forEach(el=>el.hidden=!isPlus());
73
+ $('#page-citation-code').textContent=CITATIONS[state.benchmark];
74
+ $('#citation-benchmark').textContent=b.name;
75
+ $('#page-copy-citation').textContent='Copy BibTeX';
76
+ renderBreakdownControls();
77
+ renderColumns();
78
+ }
79
+ function renderBreakdownControls() {
80
+ $('#breakdown-controls').hidden=!isBreakdown();
81
+ if(!isBreakdown())return;
82
+ const b=benchmark(), dimensions=b.dimensions.filter(d=>b.subcategory_columns.some(c=>c.dimension===d.key));
83
+ $('#dimension-tabs').innerHTML=[{key:'all',label:'All dimensions'},...dimensions].map(d=>`<button data-dimension="${d.key}" aria-pressed="${state.dimension===d.key}">${esc(d.label)}</button>`).join('');
84
+ $('#subcategory-filter').hidden=state.view!=='task_types';
85
+ const subs=b.subcategory_columns.filter(c=>state.dimension==='all'||c.dimension===state.dimension);
86
+ $('#subcategory-select').innerHTML='<option value="all">All subcategories</option>'+subs.map(c=>`<option value="${c.key}">${esc((state.dimension==='all'?c.dimension[0].toUpperCase()+c.dimension.slice(1)+' · ':'')+c.label)}</option>`).join('');
87
+ $('#subcategory-select').value=state.subcategory;
88
+ }
89
+ function resetScoreColumns() {
90
+ state.visible=availableColumns().map(c=>c.key);state.sort=state.visible[0];state.direction='desc';
91
+ renderBreakdownControls();renderColumns();renderTable();$('.table-scroll').scrollLeft=0;
92
+ }
93
+ function renderColumns() {
94
+ $('#column-options').innerHTML='<div class="eyebrow muted" >VISIBLE SCORE COLUMNS</div>'+availableColumns().map(c=>`<label><input type="checkbox" data-column="${c.key}" ${state.visible.includes(c.key)?'checked':''}>${esc(qualifiedLabel(c))}</label>`).join('');
95
+ }
96
+ function renderTable() {
97
+ const b=benchmark(), models=filteredModels(), columns=availableColumns().filter(c=>state.visible.includes(c.key));
98
+ const minimumWidth=370+(isPlus()?86:0)+columns.length*(isBreakdown()?156:96);
99
+ $('#results-table').style.minWidth=minimumWidth+'px';
100
+ $('#results-table').classList.toggle('breakdown-table',isBreakdown());
101
+ $('#table-caption').textContent=b.name+' '+resultLanguageLabel()+' results, '+viewLabel()+(state.view==='metrics'?' (/100)':' (%)')+', sorted by '+scoreLabel(state.sort)+' '+state.direction;
102
+ const summaryClass=key=>isPlus()&&summaryKeys.includes(key)?'summary-result':'';
103
+ const sortableHeader=c=>`<th scope="col" class="${summaryClass(c.key)} ${state.sort===c.key?'active-sort':''}" aria-sort="${state.sort===c.key?(state.direction==='desc'?'descending':'ascending'):'none'}"><button data-sort="${c.key}" title="${esc(c.description)} — sort ${state.sort===c.key&&state.direction==='desc'?'ascending':'descending'}"><span>${c.key==='counterfactual'?'Counter-<br>factual':c.key==='instruction_reasoning'?'Instruction<br>Reasoning':c.key==='appearance_consistency'?'Appearance<br>Consistency':c.key==='visual_plausibility'?'Visual<br>Plausibility':esc(c.label)}</span><span class="sort-icon" aria-hidden="true">${state.sort===c.key?(state.direction==='desc'?'↓':'↑'):'↕'}</span></button></th>`;
104
+ const rowSpan=isBreakdown()?' rowspan="2"':'';
105
+ const modelHeaders=`<th scope="col" class="select-cell"${rowSpan}><span class="sr-only">Compare</span></th><th scope="col" class="rank-cell"${rowSpan} title="Global rank on the currently sorted score">#</th><th scope="col" class="model-cell"${rowSpan}>Model <span class="muted" style="font-weight:400">/ method</span></th>${isPlus()?`<th scope="col" style="width:86px"${rowSpan}>Input</th>`:''}`;
106
+ const groups=[];
107
+ if(isBreakdown())columns.forEach(c=>{
108
+ const dimension=c.dimension[0].toUpperCase()+c.dimension.slice(1);
109
+ const label=state.view==='task_types'?(state.dimension==='all'?dimension+' · ':'')+b.subcategory_columns.find(s=>s.key===c.subcategory).label:dimension;
110
+ const key=state.view==='task_types'?c.subcategory:c.dimension;
111
+ if(groups.at(-1)?.key===key)groups.at(-1).count++;else groups.push({key,label,count:1,dimension:c.dimension});
112
+ });
113
+ $('#table-head').innerHTML=isBreakdown()?`<tr>${modelHeaders}${groups.map(g=>`<th scope="colgroup" colspan="${g.count}" class="dimension-band dim-${g.dimension}">${esc(g.label)}</th>`).join('')}</tr><tr>${columns.map(sortableHeader).join('')}</tr>`:`<tr>${modelHeaders}${columns.map(sortableHeader).join('')}</tr>`;
114
+ $('#table-body').innerHTML=models.map(m=>{
115
+ const rank=rankOf(m), ours=m.id==='rise-agent-ours';
116
+ const cells=columns.map(c=>{const v=score(m,c.key), featured=isPlus()&&summaryKeys.includes(c.key), tint=v==null?0:(featured ? .065+(v/100)*.10 : .02+(v/100)*.055);return `<td class="score-cell ${summaryClass(c.key)} ${c.key==='total'?'overall':''} ${v===null?'missing':''}" style="background-color:rgba(88,118,158,${tint.toFixed(4)})" title="${esc(c.label)}: ${v===null?'Not evaluated':fmt(v)+(state.view==='metrics'?' / 100':'%')}">${fmt(v)}${c.key==='total'&&v!==null?`<span class="score-meter" aria-hidden="true"><i style="width:${v}%"></i></span>`:''}</td>`;}).join('');
117
+ return `<tr class="${ours?'ours ':''}${state.selected.includes(m.id)?'selected':''}"><td class="select-cell"><input type="checkbox" data-select="${esc(m.id)}" aria-label="Compare ${esc(m.name)}" ${state.selected.includes(m.id)?'checked':''}></td><td class="rank-cell">${rank===null?'—':`<span class="${rank<=3?'rank-top rank-'+rank:''}">${rank}</span>`}</td><th scope="row" class="model-cell" style="position:sticky;top:auto"><button class="model-button" data-model="${esc(m.id)}">${esc(m.name)}</button><span class="model-meta">${m.group?`<span class="group-dot ${m.group}"></span>${groupLabels[m.group]}`:''}${ours?'<span class="ours-badge">OURS</span>':''}</span></th>${isPlus()?`<td><span class="input-pill ${m.multi_image?'multi':''}" title="${m.multi_image?'Supports multiple input images':'Single-image only'}">${m.multi_image?'Multi':'Single'}</span></td>`:''}${cells}</tr>`;
118
+ }).join('');
119
+ $('#empty-state').hidden=models.length>0; $('#results-table').hidden=models.length===0;
120
+ $('#result-count').innerHTML=`<strong>${models.length}</strong>${models.length<b.models.length?' / '+b.models.length:''} models`;
121
+ if(isBreakdown())$('#result-count').innerHTML+=`<span class="context-separator">·</span>${columns.length} ${state.view==='subcategories'?'subcategories':'task types'}`;
122
+ $('#reset-filters').hidden=!(state.query||state.group!=='all'||state.input!=='all');
123
+ $$('#group-filters button').forEach(el=>el.setAttribute('aria-pressed',el.dataset.group===state.group));
124
+ renderTray();
125
+ }
126
+ function renderTray() {
127
+ $('#compare-tray').hidden=state.selected.length===0;
128
+ $('#compare-count').textContent=state.selected.length+' / 3 models selected';
129
+ $('#compare-chips').innerHTML=state.selected.map(id=>`<span class="compare-chip">${esc(modelById(id).name)}<button data-remove="${esc(id)}" aria-label="Remove ${esc(modelById(id).name)} from comparison">×</button></span>`).join('');
130
+ $('#compare-open').disabled=state.selected.length<2;
131
+ updateTraySpacing();
132
+ }
133
+ function updateTraySpacing() {
134
+ document.body.style.paddingBottom=state.selected.length?($('#compare-tray').offsetHeight+48)+'px':'';
135
+ }
136
+ if ('ResizeObserver' in window) new ResizeObserver(updateTraySpacing).observe($('#compare-tray'));
137
+ window.addEventListener('resize',updateTraySpacing);
138
+ function toggleSelected(id,checked) {
139
+ if(checked&&state.selected.length>=3){toast('Compare up to 3 models at a time. Remove one to add another.');renderTable();return;}
140
+ state.selected=checked?[...state.selected,id]:state.selected.filter(x=>x!==id);renderTable();
141
+ }
142
+ function resetFilters() {
143
+ state.query='';state.group='all';state.input='all';
144
+ $('#model-search').value='';$('#input-filter').value='all';renderTable();
145
+ }
146
+ function switchBenchmark(id) {
147
+ state.benchmark=id;state.selected=[];state.group='all';state.input='all';state.view='accuracy';state.sort='total';state.direction='desc';
148
+ state.query='';$('#model-search').value='';$('#input-filter').value='all';
149
+ state.visible=availableColumns().map(c=>c.key);
150
+ $$('[data-benchmark]').forEach(btn=>btn.setAttribute('aria-pressed',btn.dataset.benchmark===id));
151
+ $$('[data-view]').forEach(btn=>btn.setAttribute('aria-pressed',btn.dataset.view===state.view));
152
+ renderResources();renderTable();saveState();
153
+ }
154
+ function switchLanguage(language) {
155
+ if(!benchmarkMetadata().results_by_language[language] || language===languageCode())return;
156
+ state.language=language;state.selected=[];
157
+ renderResources();renderTable();saveState();
158
+ }
159
+ function switchView(view) {
160
+ if(!isPlus()&&['subcategories','task_types'].includes(view))return;
161
+ state.view=view;
162
+ if(view==='task_types')state.subcategory=benchmark().subcategory_columns.find(c=>state.dimension==='all'||c.dimension===state.dimension).key;
163
+ state.sort=isBreakdown()?availableColumns()[0].key:view==='accuracy'?'total':'instruction_reasoning';state.direction='desc';state.visible=availableColumns().map(c=>c.key);
164
+ $$('[data-view]').forEach(btn=>btn.setAttribute('aria-pressed',btn.dataset.view===view));
165
+ renderBreakdownControls();renderColumns();renderTable();$('.table-scroll').scrollLeft=0;
166
+ }
167
+ function download(name,content,type) {
168
+ const url=URL.createObjectURL(new Blob([content],{type}));const a=document.createElement('a');a.href=url;a.download=name;document.body.appendChild(a);a.click();a.remove();setTimeout(()=>URL.revokeObjectURL(url),1000);
169
+ }
170
+ function exportCSV(models,name='filtered') {
171
+ const b=benchmark(), mainFields=[...(isPlus()?orderedAccuracyColumns():b.accuracy_columns).map(c=>({type:'accuracy',...c})),...b.metrics.map(c=>({type:'metrics',...c}))];
172
+ const fields=isBreakdown()?[...(name==='comparison'?mainFields:[]),...availableColumns().filter(c=>state.visible.includes(c.key)).map(c=>({type:state.view,...c,label:qualifiedLabel(c)}))]:mainFields;
173
+ const safeCSV=value=>{let t=String(value??'');if(/^\s*[=+@-]|^[\t\r\n]/.test(t))t="'"+t;return '"'+t.replace(/"/g,'""')+'"';};
174
+ const rows=[['Benchmark','Result language','Model','Category','Multi-image support',...fields.map(c=>c.label+(c.type==='metrics'?' (/100)':' (%)'))],...models.map(m=>[b.name,b.language,m.name,groupLabels[m.group]||'Not specified',m.multi_image===null?'Not specified':m.multi_image?'Yes':'No',...fields.map(c=>m[c.type][c.key]===null?'':fmt(m[c.type][c.key]))])];
175
+ download(`${b.id}-${languageCode()}-${state.view}-${name}-results.csv`,'\uFEFF'+rows.map(r=>r.map(safeCSV).join(',')).join('\r\n'),'text/csv;charset=utf-8');toast(`Exported ${models.length} models · ${resultLanguageLabel()} results.`);
176
+ }
177
+ function radar(models) {
178
+ const dims=benchmark().dimensions, cx=205,cy=156,r=98,n=dims.length;
179
+ const point=(i,radius)=>{const a=-Math.PI/2+i*2*Math.PI/n;return [cx+Math.cos(a)*radius,cy+Math.sin(a)*radius];};
180
+ const polygon=radius=>dims.map((_,i)=>point(i,radius).map(x=>x.toFixed(1)).join(',')).join(' ');
181
+ const rings=[20,40,60,80,100].map(v=>`<polygon points="${polygon(r*v/100)}" fill="none" stroke="#dce7ef" stroke-width=".8"/><text class="radar-value" x="${cx+4}" y="${cy-r*v/100-3}">${v}</text>`).join('');
182
+ const lines=dims.map((d,i)=>{const p=point(i,r),l=point(i,r+24);return `<line x1="${cx}" y1="${cy}" x2="${p[0]}" y2="${p[1]}" stroke="#e3ecf3"/><text x="${l[0]}" y="${l[1]+3}" class="radar-label" text-anchor="${Math.abs(l[0]-cx)<1?'middle':l[0]>cx?'start':'end'}">${esc(d.label)}</text>`;}).join('');
183
+ const plots=models.map((m,j)=>{const points=dims.map((d,i)=>point(i,r*(m.accuracy[d.key]??0)/100));return `<polygon points="${points.map(p=>p.join(',')).join(' ')}" fill="${colors[j]}" fill-opacity=".08" stroke="${colors[j]}" stroke-width="2"/>`+points.map(p=>`<circle cx="${p[0]}" cy="${p[1]}" r="2.5" fill="${colors[j]}" stroke="white" stroke-width="1"/>`).join('');}).join('');
184
+ return `<svg class="radar" viewBox="0 0 410 305" role="img" aria-label="Reasoning-dimension accuracy comparison on a shared 0 to 100 percent scale. Exact values are listed in the table below.">${rings}${lines}${plots}</svg>`;
185
+ }
186
+ function showDialog(eyebrow,html) {
187
+ $('#dialog-eyebrow').textContent=eyebrow;$('#dialog-content').innerHTML=html;
188
+ $('#detail-dialog').showModal();$('#detail-dialog').scrollTop=0;
189
+ }
190
+ function showModels(ids) {
191
+ const b=benchmark(), models=ids.map(modelById).filter(Boolean);if(!models.length)return;
192
+ const mixed=isPlus()&&new Set(models.map(m=>m.multi_image)).size>1;
193
+ const tableSection=(title,fields,type)=>`<tr class="comparison-section"><td colspan="${models.length+1}">${title}</td></tr>`+fields.map(c=>{const vals=models.map(m=>m[type]?.[c.key] ?? null);const max=Math.max(...vals.filter(v=>v!==null));return `<tr><td>${esc(c.label)}</td>${vals.map(v=>`<td class="${v!==null&&v===max&&models.length>1?'best-value':''}">${fmt(v)}${v!==null&&type!=='metrics'?'%':''}</td>`).join('')}</tr>`;}).join('');
194
+ showDialog(b.name+' · '+resultLanguageLabel().toUpperCase()+' RESULTS',`<h2 class="dialog-title" id="dialog-title">${models.length===1?esc(models[0].name):'Model comparison'}</h2>${mixed?'<p class="comparison-warning">These models use different evaluation subsets: single-image only and full benchmark.</p>':''}<div class="comparison-layout">${radar(models)}<div class="compare-summaries">${models.map((m,i)=>`<div class="compare-summary"><div><h4><span class="series-dot" style="background:${colors[i]}"></span>${esc(m.name)}</h4><p>${esc(groupLabels[m.group]||b.name)}${isPlus()?' · '+(m.multi_image?'Multi-image supported':'Single-image only'):''}</p></div><strong style="color:${colors[i]}">${fmt(m.accuracy.total)}<small> ${m.accuracy.total!==null?'%':''}<br>${isPlus()?'Total':'Overall'}</small></strong></div>`).join('')}${models.some(m=>m.accuracy.total===null)?'<p class="caption-text">Single-image-only models have no Total score.</p>':''}</div></div><div class="comparison-table-wrap"><table class="comparison-table"><thead><tr><th>Metric</th>${models.map((m,i)=>`<th><span class="series-dot" style="background:${colors[i]}"></span>${esc(m.name)}</th>`).join('')}</tr></thead><tbody>${tableSection('REASONING ACCURACY (%)',isPlus()?orderedAccuracyColumns():b.accuracy_columns,'accuracy')}${tableSection('EVALUATION SCORES (/100)',b.metrics,'metrics')}${isBreakdown()?tableSection(viewLabel().toUpperCase()+' (%)',availableColumns().filter(c=>state.visible.includes(c.key)).map(c=>({...c,label:qualifiedLabel(c)})),state.view):''}</tbody></table></div><div class="dialog-actions"><button class="outline-button" id="dialog-export">Export ${models.length===1?'model':'comparison'} CSV ↓</button></div>`);
195
+ $('#dialog-export').addEventListener('click',()=>exportCSV(models,'comparison'));
196
+ }
197
+ async function copyCitation(text,button) {
198
+ try {await navigator.clipboard.writeText(text);button.textContent='Copied ✓';toast('BibTeX copied.');}
199
+ catch(_){const area=document.createElement('textarea');area.value=text;($('#detail-dialog').open?$('#dialog-content'):document.body).appendChild(area);area.select();const copied=document.execCommand('copy');area.remove();toast(copied?'BibTeX copied.':'Select and copy the citation below.');}
200
+ }
201
+ function showCitation() {
202
+ const citation=CITATIONS[state.benchmark];
203
+ showDialog('CITATION',`<h2 class="dialog-title" id="dialog-title">Cite ${esc(benchmark().name)}</h2><pre class="citation-code"><code>${esc(citation)}</code></pre><div class="dialog-actions"><button class="primary-button" id="copy-citation">Copy BibTeX</button><button class="outline-button" id="save-citation">Download .bib ↓</button></div>`);
204
+ $('#copy-citation').addEventListener('click',e=>copyCitation(citation,e.currentTarget));
205
+ $('#save-citation').addEventListener('click',()=>download(state.benchmark+'.bib',citation+'\n','text/plain;charset=utf-8'));
206
+ }
207
+ document.addEventListener('click',event=>{
208
+ const button=event.target.closest('button');if(!button)return;
209
+ if(button.dataset.benchmark)switchBenchmark(button.dataset.benchmark);
210
+ if(button.dataset.view)switchView(button.dataset.view);
211
+ if(button.dataset.language)switchLanguage(button.dataset.language);
212
+ if(button.dataset.dimension){state.dimension=button.dataset.dimension;state.subcategory='all';resetScoreColumns();}
213
+ if(button.dataset.group){state.group=button.dataset.group;renderTable();}
214
+ if(button.dataset.sort){state.direction=state.sort===button.dataset.sort&&state.direction==='desc'?'asc':'desc';state.sort=button.dataset.sort;renderTable();}
215
+ if(button.dataset.model)showModels([button.dataset.model]);
216
+ if(button.dataset.remove)toggleSelected(button.dataset.remove,false);
217
+ });
218
+ document.addEventListener('change',event=>{
219
+ const input=event.target;
220
+ if(input.dataset.select)toggleSelected(input.dataset.select,input.checked);
221
+ if(input.dataset.column){
222
+ if(!input.checked&&state.visible.length===1){input.checked=true;toast('Keep at least one score column visible.');return;}
223
+ state.visible=input.checked?[...state.visible,input.dataset.column]:state.visible.filter(c=>c!==input.dataset.column);
224
+ if(!state.visible.includes(state.sort)){state.sort=availableColumns().find(c=>state.visible.includes(c.key)).key;state.direction='desc';}
225
+ renderTable();
226
+ }
227
+ });
228
+ $('#model-search').addEventListener('input',e=>{state.query=e.target.value;renderTable();});
229
+ $('#input-filter').addEventListener('change',e=>{state.input=e.target.value;renderTable();});
230
+ $('#subcategory-select').addEventListener('change',e=>{state.subcategory=e.target.value;resetScoreColumns();});
231
+ $('#page-copy-citation').addEventListener('click',e=>copyCitation(CITATIONS[state.benchmark],e.currentTarget));
232
+ $('#page-save-citation').addEventListener('click',()=>download(state.benchmark+'.bib',CITATIONS[state.benchmark]+'\n','text/plain;charset=utf-8'));
233
+ $('#reset-filters').addEventListener('click',resetFilters);$('#empty-reset').addEventListener('click',resetFilters);
234
+ $('#download-csv').addEventListener('click',()=>exportCSV(filteredModels()));
235
+ $('#compare-open').addEventListener('click',()=>showModels(state.selected));
236
+ $('#clear-compare').addEventListener('click',()=>{state.selected=[];renderTable();});
237
+ $('.dialog-close').addEventListener('click',()=>$('#detail-dialog').close());
238
+ $('#detail-dialog').addEventListener('click',e=>{if(e.target===$('#detail-dialog')){const r=e.target.getBoundingClientRect();if(e.clientX<r.left||e.clientX>r.right||e.clientY<r.top||e.clientY>r.bottom)e.target.close();}});
239
+ $('#citation-button').addEventListener('click',showCitation);
240
+ document.addEventListener('click',e=>{if(!$('#column-menu').contains(e.target))$('#column-menu').open=false;});
241
+ document.addEventListener('keydown',e=>{
242
+ if(e.key==='/'&&!['INPUT','TEXTAREA','SELECT'].includes(document.activeElement.tagName)&&!$('#detail-dialog').open){e.preventDefault();$('#model-search').focus();}
243
+ const tab=e.target.closest('[data-benchmark], [data-view], [data-language]');
244
+ if(tab&&['ArrowLeft','ArrowRight','Home','End'].includes(e.key)){
245
+ e.preventDefault();const siblings=[...tab.parentElement.querySelectorAll('[data-benchmark], [data-view], [data-language]')].filter(el=>!el.hidden),i=siblings.indexOf(tab);
246
+ const n=e.key==='Home'?0:e.key==='End'?siblings.length-1:(i+(e.key==='ArrowRight'?1:-1)+siblings.length)%siblings.length;
247
+ siblings[n].click();siblings[n].focus();
248
+ }
249
+ });
250
+ switchBenchmark(state.benchmark);
251
+ if(location.protocol!=='file:')fetch('/api/leaderboard',{cache:'no-store'}).then(r=>r.ok?r.json():null).then(data=>{
252
+ if(!data?.benchmarks)return;
253
+ DATA=data;
254
+ state.selected=state.selected.filter(id=>modelById(id));
255
+ renderResources();renderTable();
256
+ $('#json-download').href='/api/leaderboard';
257
+ }).catch(()=>{});
258
+ })();
dist/assets/benchmark-overview.png ADDED

Git LFS Details

  • SHA256: 59575c79a544844ba500b0eac449ecf6134c39b41b6f341503c684954366ea01
  • Pointer size: 132 Bytes
  • Size of remote file: 2.15 MB
dist/assets/favicon.svg ADDED
dist/assets/rise-agent.png ADDED

Git LFS Details

  • SHA256: 7c9b6540c4980c7e16ccf54f6ed9cb120281ab201255fd0ab5609c43c476afc4
  • Pointer size: 132 Bytes
  • Size of remote file: 1.57 MB
dist/data/leaderboard.json ADDED
The diff for this file is too large to render. See raw diff
 
dist/index.html ADDED
The diff for this file is too large to render. See raw diff
 
dist/portal.css ADDED
@@ -0,0 +1,87 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ .portal-width { width: min(1120px, calc(100% - 80px)); margin: auto; padding-bottom: 36px; }
2
+ .review-width { width: min(1420px, calc(100% - 80px)); }
3
+ .portal-nav { display: flex; justify-content: space-between; align-items: center; gap: 20px; padding: 28px 0; border-bottom: 1px solid #e1e7ee; }
4
+ .wordmark { font-size: 23px; font-weight: 750; letter-spacing: -.8px; color: #2d435b; }
5
+ .wordmark span { color: #617eaf; }
6
+ .portal-nav > div { display: flex; gap: 25px; align-items: center; font-size: 14px; color: #71819a; }
7
+ .portal-nav [aria-current] { color: #345777; font-weight: 650; }
8
+ .portal-heading { padding: 44px 0 30px; }
9
+ .portal-heading h1 { font-size: clamp(30px, 4vw, 43px); letter-spacing: -1.2px; line-height: 1.2; margin: 0 0 14px; font-weight: 650; color: #233b55; }
10
+ .portal-heading p { margin: 0; color: #79899b; font-size: 16px; }
11
+ .portal-card { padding: 30px; border: 1px solid #dfe6ef; background: white; box-shadow: 0 5px 28px #1f385105; border-radius: 17px; margin-bottom: 24px; }
12
+ .portal-card h2 { font-size: 20px; color: #304861; font-weight: 650; margin: 0; letter-spacing: -.25px; }
13
+ .card-heading { display: flex; align-items: center; justify-content: space-between; flex-wrap: wrap; gap: 14px; margin-bottom: 24px; }
14
+ .card-heading > span, .field-note { font-size: 13px; color: #8b98a7; }
15
+ .field-note { margin-top: -12px; margin-bottom: 20px; }
16
+ .form-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 23px 26px; }
17
+ .portal-width label:not(.upload-zone):not(.confirmation) { display: block; font-size: 14px; color: #4b6077; font-weight: 550; }
18
+ .portal-width input:not([type=checkbox]):not([type=file]), .portal-width select, .portal-width textarea { display: block; width: 100%; border: 1px solid #d5dfea; border-radius: 9px; padding: 12px 14px; font: inherit; font-size: 15px; line-height: 1.5; color: #2e4661; background: #fcfdff; margin-top: 8px; min-width: 0; }
19
+ .portal-width textarea { resize: vertical; }
20
+ .portal-width select { appearance: none; -webkit-appearance: none; padding-right: 46px; background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 16 16'%3E%3Cpath d='m4 6 4 4 4-4' fill='none' stroke='%237589a2' stroke-width='1.6' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E"); background-repeat: no-repeat; background-position: right 16px center; background-size: 16px; }
21
+ .portal-width input[readonly] { background: #f2f5f8; color: #657990; }
22
+ .portal-width input::placeholder, .portal-width textarea::placeholder { color: #a0acba; }
23
+ .portal-width input:focus, .portal-width select:focus, .portal-width textarea:focus { outline: 2px solid #dce6f3; outline-offset: 1px; border-color: #8aa4c7; }
24
+ .portal-width small { display: block; margin-top: 7px; color: #8a97a7; font-size: 12px; font-weight: 400; }
25
+ .optional { color: #9aa6b5; font-size: 11px; font-weight: 450; margin-left: 7px; }
26
+ .full-width { grid-column: 1 / -1; }
27
+ .upload-zone { display: flex; position: relative; flex-direction: column; align-items: center; justify-content: center; gap: 8px; min-height: 190px; padding: 28px; background: #f8faff; border: 1px dashed #b9cce3; border-radius: 12px; text-align: center; cursor: pointer; color: #506c8f; }
28
+ .upload-zone:hover, .upload-zone.dragging { background: #f0f5fc; border-color: #7f9dc1; }
29
+ .upload-zone input { position: absolute; inset: 0; width: 100%; height: 100%; opacity: 0; cursor: pointer; }
30
+ .upload-zone:focus-within { outline: 2px solid #7598c5; outline-offset: 3px; }
31
+ .upload-zone svg { width: 28px; height: 28px; stroke: #7b98bb; fill: none; stroke-width: 1.5; margin-bottom: 9px; }
32
+ .upload-zone strong { font-size: 16px; font-weight: 550; }
33
+ .upload-zone > span { font-size: 12px; color: #899bb2; }
34
+ .file-preview { padding: 14px 17px; border-radius: 9px; background: #eef5f4; color: #49706c; margin-top: 14px; font-size: 14px; }
35
+ .artifacts { margin-top: 27px; }
36
+ .confirmation { display: flex; align-items: flex-start; gap: 12px; padding-top: 25px; font-size: 13px; color: #728399; font-weight: 400; line-height: 1.7; }
37
+ .confirmation input { margin-top: 4px; }
38
+ .form-bottom { display: flex; align-items: center; justify-content: space-between; gap: 20px; margin-top: 23px; }
39
+ .portal-width .primary-button { background: #3d648e; border-radius: 9px; font-size: 15px; font-weight: 550; padding: 12px 22px; white-space: nowrap; }
40
+ .portal-width .primary-button:hover { background: #2c507a; }
41
+ .portal-width .outline-button { color: #5d748f; border-color: #d5dfeb; font-size: 14px; }
42
+ .form-message { margin: 0; font-size: 14px; color: #647e89; line-height: 1.65; overflow-wrap: anywhere; }
43
+ .form-message.error { color: #aa4a55; }
44
+ .notice { padding: 14px 18px; border: 1px solid #e1dded; background: #f4f1fa; color: #77708e; border-radius: 10px; font-size: 14px; margin: 0 0 24px; }
45
+ .receipt-card { background: #f1f7fc; border-color: #d1e0f0; }
46
+ .receipt-card p { color: #6f8399; font-size: 14px; }
47
+ .receipt-fields { display: grid; gap: 12px; margin: 24px 0; }
48
+ .receipt-fields code { display: block; overflow-wrap: anywhere; background: #ffffffa8; padding: 12px; border: 1px solid #dfe6ed; border-radius: 7px; color: #506580; font-size: 13px; }
49
+ .receipt-fields small { margin-bottom: 6px; }
50
+ .status-badge { display: inline-block; border-radius: 5px; padding: 3px 8px; background: #eff2f7; color: #6e8099; font-size: 11px; font-weight: 600; }
51
+ .status-badge.pending { background: #fff4dd; color: #a38249; }
52
+ .status-badge.approved { background: #eaf3ed; color: #5d8a70; }
53
+ .status-badge.rejected, .status-badge.withdrawn { background: #f7edef; color: #a6717b; }
54
+ .login-card { max-width: 510px; }
55
+ .login-card h2 { margin-bottom: 22px; }
56
+ .login-card .form-message { margin: 16px 0; }
57
+ .review-toolbar { display: flex; gap: 18px; justify-content: space-between; align-items: center; margin-bottom: 24px; }
58
+ .review-filters { display: flex; gap: 6px; flex-wrap: wrap; }
59
+ .review-filters button { padding: 8px 12px; border: 1px solid transparent; border-radius: 7px; color: #8190a4; font-size: 14px; }
60
+ .review-filters button[aria-pressed=true] { background: #e9eff8; color: #45678d; border-color: #d1ddef; }
61
+ .review-filters span { margin-left: 6px; font-size: 12px; }
62
+ .review-layout { display: grid; grid-template-columns: 300px minmax(0, 1fr); gap: 24px; }
63
+ .review-list { display: flex; flex-direction: column; gap: 12px; }
64
+ .submission-item { display: block; text-align: left; width: 100%; padding: 17px; border: 1px solid #dfe5ef; border-radius: 11px; background: white; }
65
+ .submission-item[aria-pressed=true] { border-color: #91adce; background: #f1f6fd; box-shadow: 0 0 0 2px #e6edf7; }
66
+ .submission-item strong { display: block; font-size: 15px; font-weight: 600; color: #3f5773; line-height: 1.5; overflow-wrap: anywhere; }
67
+ .submission-item p { font-size: 12px; color: #8896a9; margin: 6px 0 10px; }
68
+ .review-detail { min-height: 310px; }
69
+ .review-empty { text-align: center; padding: 48px 15px; color: #8b9aad; }
70
+ .review-empty p { font-size: 14px; }
71
+ .review-meta { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 18px; margin: 23px 0; font-size: 14px; }
72
+ .review-meta dt { font-size: 11px; text-transform: uppercase; letter-spacing: .8px; color: #96a3b4; margin-bottom: 5px; }
73
+ .review-meta dd { margin: 0; color: #546c84; overflow-wrap: anywhere; }
74
+ .review-meta a { color: #4675a5; text-decoration: underline; text-underline-offset: 3px; }
75
+ .review-notes { white-space: pre-wrap; color: #7f8fa3; background: #f6f8fb; padding: 14px; border-radius: 8px; font-size: 13px; margin-bottom: 24px; }
76
+ .review-scores { width: 100%; border-collapse: collapse; margin: 20px 0 26px; font-size: 14px; }
77
+ .review-scores th, .review-scores td { padding: 10px 12px; border-bottom: 1px solid #e7ecf2; text-align: right; color: #526a85; }
78
+ .review-scores th:first-child, .review-scores td:first-child { text-align: left; }
79
+ .review-scores th { font-weight: 550; color: #8898aa; font-size: 12px; background: #f7f9fc; }
80
+ .review-scores .score-section th { color: #7085a0; background: #edf2f9; padding-block: 8px; }
81
+ .changed-score { color: #405f8e !important; font-weight: 700; background: #f1f5fb; }
82
+ .review-actions { display: flex; flex-wrap: wrap; gap: 10px; margin-top: 22px; }
83
+ .reject-button { color: #9f6470 !important; border-color: #e7cfd5 !important; }
84
+ .history-list { color: #8292a4; font-size: 12px; padding-left: 20px; }
85
+ .submit-link { color: #456a93 !important; }
86
+ @media (max-width: 900px) { .review-layout { grid-template-columns: 1fr; } .review-list { display: grid; grid-template-columns: repeat(2,minmax(0,1fr)); } }
87
+ @media (max-width: 640px) { .portal-width { width: calc(100% - 32px); } .portal-nav { padding-block: 22px; } .portal-nav > div { gap: 13px; font-size: 12px; } .wordmark { font-size: 20px; } .portal-heading { padding-top: 32px; } .portal-card { padding: 21px 17px; } .form-grid, .review-meta, .review-list { grid-template-columns: 1fr; } .form-bottom { flex-direction: column; align-items: stretch; } .review-toolbar { flex-wrap: wrap; } .card-heading > span { font-size: 11px; } .review-scores th, .review-scores td { padding: 9px 6px; font-size: 12px; } }
dist/portal.js ADDED
@@ -0,0 +1,148 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ 'use strict';
2
+ (() => {
3
+ const $=s=>document.querySelector(s), $$=s=>[...document.querySelectorAll(s)];
4
+ const schema=JSON.parse($('#submission-schema').textContent);
5
+ const esc=v=>String(v??'').replace(/[&<>"']/g,c=>({'&':'&amp;','<':'&lt;','>':'&gt;','"':'&quot;',"'":'&#39;'}[c]));
6
+ const labels={pending:'Pending review',approved:'Approved',rejected:'Returned',withdrawn:'Withdrawn'};
7
+ const language=code=>code==='zh'?'Chinese':'English';
8
+ const format=value=>value==null?'—':value.toFixed(1);
9
+ const bById=id=>schema.benchmarks.find(b=>b.id===id);
10
+ const message=(selector,value,error=false)=>{const el=$(selector);el.textContent=value;el.classList.toggle('error',error);};
11
+ let config=null, token=sessionStorage.getItem('rise-review-session')||'';
12
+ async function api(path,body,admin=false) {
13
+ const response=await fetch(path,{method:body===undefined?'GET':'POST',cache:'no-store',headers:{...(body===undefined?{}:{'Content-Type':'application/json'}),...(admin?{Authorization:'Bearer '+token}:{})},...(body===undefined?{}:{body:JSON.stringify(body)})});
14
+ let data;try{data=await response.json();}catch(_){throw new Error('The submission service is not available.');}
15
+ if(!response.ok){const e=new Error(typeof data.detail==='string'?data.detail:'The request could not be completed.');e.status=response.status;throw e;}
16
+ return data;
17
+ }
18
+ function download(filename,data) {
19
+ const url=URL.createObjectURL(new Blob([JSON.stringify(data,null,2)+'\n'],{type:'application/json'}));
20
+ const a=document.createElement('a');a.href=url;a.download=filename;document.body.appendChild(a);a.click();a.remove();setTimeout(()=>URL.revokeObjectURL(url),1000);
21
+ }
22
+ async function connect() {
23
+ try{
24
+ config=await api('/api/config');
25
+ if(config.local_preview){$('#service-notice').hidden=false;$('#service-notice').textContent='Local preview · submissions and review decisions stay on this computer.';}
26
+ }catch(_){$('#service-notice').hidden=false;$('#service-notice').textContent='The submission service is offline. You can browse the form and download a template.';}
27
+ return config;
28
+ }
29
+ function makeTemplate(b) {
30
+ const data={accuracy:Object.fromEntries(b.accuracy_columns.map(c=>[c.label,null])),metrics:Object.fromEntries(b.metrics.map(c=>[c.label,null]))};
31
+ for(const [field,columns] of [['subcategories','subcategory_columns'],['task_types','task_type_columns']])if(b[columns]){
32
+ data[field]={};for(const c of b[columns]){const d=c.dimension[0].toUpperCase()+c.dimension.slice(1);(data[field][d]??={})[c.label]=null;}
33
+ }
34
+ return data;
35
+ }
36
+ if(document.body.dataset.page==='submit') {
37
+ const form=$('#submission-form');let result=null,receipt=null,fileSequence=0;
38
+ const entryParams=new URLSearchParams(location.search);
39
+ if(bById(entryParams.get('benchmark')))form.elements.benchmark.value=entryParams.get('benchmark');
40
+ if(['en','zh'].includes(entryParams.get('language')))form.elements.language.value=entryParams.get('language');
41
+ let models=schema,plusInputSupport=form.elements.multi_image.value;
42
+ const currentBenchmark=()=>bById(form.elements.benchmark.value);
43
+ function updateRevision() {
44
+ const b=models.benchmarks.find(b=>b.id===form.elements.benchmark.value);
45
+ const list=b.results_by_language[form.elements.language.value]?.models||[];
46
+ $('#submission-revision').innerHTML='<option value="">New result</option>'+list.map(m=>`<option value="${esc(m.id)}">${esc(m.name)}</option>`).join('');
47
+ }
48
+ function updateBenchmark() {
49
+ const singleImageOnly=currentBenchmark().id==='risebench';
50
+ form.elements.multi_image.value=singleImageOnly?'false':plusInputSupport;
51
+ form.elements.multi_image.hidden=singleImageOnly;
52
+ form.elements.multi_image.disabled=singleImageOnly;
53
+ $('#single-image-input').hidden=!singleImageOnly;
54
+ const selected=form.elements.language.value;
55
+ $('#submission-language').innerHTML=currentBenchmark().available_result_languages.map(code=>`<option value="${code}">${language(code)}</option>`).join('');
56
+ if(currentBenchmark().available_result_languages.includes(selected))form.elements.language.value=selected;
57
+ updateRevision();
58
+ }
59
+ $('#submission-benchmark').addEventListener('change',updateBenchmark);
60
+ form.elements.multi_image.addEventListener('change',()=>{plusInputSupport=form.elements.multi_image.value;});
61
+ $('#submission-language').addEventListener('change',updateRevision);
62
+ $('#submission-revision').addEventListener('change',()=>{const option=$('#submission-revision').selectedOptions[0];if(option.value)form.elements.model_name.value=option.textContent;});
63
+ $('#download-template').addEventListener('click',()=>download(currentBenchmark().id+'-results-template.json',makeTemplate(currentBenchmark())));
64
+ async function readFile(file) {
65
+ const sequence=++fileSequence;result=null;$('#file-preview').hidden=true;$('#result-file').setCustomValidity('');
66
+ if(!file)return;
67
+ try{
68
+ if(!file.name.toLowerCase().endsWith('.json')||file.size>200000)throw new Error('Choose a JSON file no larger than 200 KB.');
69
+ const value=JSON.parse(await file.text());
70
+ if(sequence!==fileSequence)return;
71
+ if(!value||Array.isArray(value)||typeof value!=='object'||!value.accuracy)throw new Error('Use the result JSON template, including its accuracy section.');
72
+ result=value;$('#upload-title').textContent=file.name;$('#upload-caption').textContent=(file.size/1024).toFixed(1)+' KB · JSON loaded';
73
+ const count=JSON.stringify(value).match(/:\s*\d+(?:\.\d+)?/g)?.length||0;
74
+ $('#file-preview').hidden=false;$('#file-preview').textContent=`${count} score values loaded. Fields and benchmark compatibility will be checked on submission.`;
75
+ message('#submission-message','');
76
+ }catch(error){$('#result-file').setCustomValidity(error.message);message('#submission-message',error.message,true);}
77
+ }
78
+ $('#result-file').addEventListener('change',e=>readFile(e.target.files[0]));
79
+ const zone=$('#upload-zone');zone.addEventListener('dragover',e=>{e.preventDefault();zone.classList.add('dragging');});zone.addEventListener('dragleave',()=>zone.classList.remove('dragging'));
80
+ zone.addEventListener('drop',e=>{e.preventDefault();zone.classList.remove('dragging');if(e.dataTransfer.files.length!==1){message('#submission-message','Choose one result JSON file.',true);return;}$('#result-file').files=e.dataTransfer.files;readFile(e.dataTransfer.files[0]);});
81
+ form.addEventListener('submit',async e=>{
82
+ e.preventDefault();if(!result){message('#submission-message','Choose a result JSON file first.',true);return;}
83
+ if(!config){message('#submission-message','The submission service is offline.',true);return;}
84
+ const button=$('#submit-results');button.disabled=true;message('#submission-message','Validating and submitting…');
85
+ const body=Object.fromEntries(new FormData(form));body.multi_image=currentBenchmark().id!=='risebench'&&form.elements.multi_image.value==='true';body.full_dataset=body.full_dataset==='on';body.results=result;
86
+ try{
87
+ receipt=await api('/api/submissions',body);
88
+ const card=$('#submission-receipt');card.hidden=false;
89
+ card.innerHTML=`<span class="status-badge pending">Pending review</span><h2 style="margin-top:16px">Results received.</h2><p>Save this receipt to check the review status. Results will appear on the leaderboard only after approval.</p><div class="receipt-fields"><div><small>Submission ID</small><code>${esc(receipt.submission_id)}</code></div><div><small>Private receipt key</small><code>${esc(receipt.status_token)}</code></div></div><button type="button" id="save-receipt" class="outline-button">Save receipt ↓</button>`;
90
+ $('#save-receipt').addEventListener('click',()=>download('rise-submission-receipt.json',receipt));
91
+ $('#status-form').elements.submission_id.value=receipt.submission_id;$('#status-form').elements.status_token.value=receipt.status_token;
92
+ form.hidden=true;card.scrollIntoView({behavior:'smooth',block:'start'});message('#submission-message','');
93
+ }catch(error){message('#submission-message',error.message,true);}finally{button.disabled=false;}
94
+ });
95
+ $('#status-form').addEventListener('submit',async e=>{e.preventDefault();try{const r=await api('/api/submission-status',Object.fromEntries(new FormData(e.currentTarget)));message('#status-result',`${r.model_name} — ${labels[r.status]}. ${r.review_note||''}`);}catch(error){message('#status-result',error.message,true);}});
96
+ updateBenchmark();connect().then(async()=>{if(!config){$('#submit-results').disabled=true;return;}try{models=await api('/api/leaderboard');updateRevision();}catch(_){}});
97
+ } else {
98
+ let records=[],filter='pending',selected=null,live=schema;
99
+ const current=()=>records.find(r=>r.id===selected);
100
+ function signOutView() {
101
+ token='';sessionStorage.removeItem('rise-review-session');records=[];selected=null;
102
+ $('#login-panel').hidden=false;$('#review-workspace').hidden=true;$('#sign-out').hidden=true;
103
+ $('#review-list').innerHTML='';$('#review-detail').innerHTML='';
104
+ }
105
+ async function loadQueue() {
106
+ try{
107
+ [records,live]=await Promise.all([api('/api/admin/submissions',undefined,true),api('/api/leaderboard')]);
108
+ $('#login-panel').hidden=true;$('#review-workspace').hidden=false;$('#sign-out').hidden=false;
109
+ $('#pending-count').textContent=records.filter(r=>r.status==='pending').length;
110
+ message('#queue-message','');renderQueue();
111
+ }catch(error){if(error.status===401)signOutView();message(token?'#queue-message':'#login-message',error.message,true);}
112
+ }
113
+ function renderQueue() {
114
+ const items=records.filter(r=>filter==='all'||r.status===filter);
115
+ if(!items.some(r=>r.id===selected))selected=items[0]?.id||null;
116
+ $('#review-list').innerHTML=items.length?items.map(r=>`<button class="submission-item" data-record="${r.id}" aria-pressed="${selected===r.id}"><strong>${esc(r.payload.model_name)}</strong><p>${esc(bById(r.payload.benchmark).name)} · ${language(r.payload.language)}${r.payload.revision_of?' · Update':''}</p><span class="status-badge ${r.status}">${labels[r.status]}</span></button>`).join(''):'<div class="review-empty"><h2>No submissions</h2><p>New results will appear here.</p></div>';
117
+ renderDetail();
118
+ }
119
+ function scoreTable(record) {
120
+ const p=record.payload,b=bById(p.benchmark);
121
+ const previous=p.revision_of?live.benchmarks.find(x=>x.id===p.benchmark).results_by_language[p.language].models.find(m=>m.id===p.revision_of):null;
122
+ const sections=[['Reasoning accuracy','accuracy',b.accuracy_columns],['Evaluation scores','metrics',b.metrics],['Subcategory accuracy','subcategories',b.subcategory_columns||[]],['Task-type accuracy','task_types',b.task_type_columns||[]]];
123
+ return `<table class="review-scores"><thead><tr><th>Score</th>${previous?'<th>Published</th>':''}<th>Submitted</th></tr></thead><tbody>`+sections.map(([label,field,columns])=>{
124
+ const visible=columns.filter(c=>p[field]?.[c.key]!=null||field==='accuracy');
125
+ if(!visible.length)return '';
126
+ return `<tr class="score-section"><th colspan="${previous?3:2}">${label}</th></tr>`+visible.map(c=>{const value=p[field]?.[c.key],old=previous?.[field]?.[c.key];return `<tr><td>${esc((c.dimension?c.dimension[0].toUpperCase()+c.dimension.slice(1)+' · ':'')+c.label)}</td>${previous?`<td>${format(old)}</td>`:''}<td class="${previous&&old!==value?'changed-score':''}">${format(value)}</td></tr>`;}).join('');
127
+ }).join('')+'</tbody></table>';
128
+ }
129
+ function renderDetail() {
130
+ const r=current();if(!r){$('#review-detail').innerHTML='<div class="review-empty"><h2>Ready for review</h2><p>Select a submission to inspect its results.</p></div>';return;}
131
+ const p=r.payload,active=['pending','approved'].includes(r.status);
132
+ $('#review-detail').innerHTML=`<div class="card-heading"><h2>${esc(p.model_name)}</h2><span class="status-badge ${r.status}">${labels[r.status]}</span></div><dl class="review-meta"><div><dt>Benchmark</dt><dd>${esc(bById(p.benchmark).name)} · ${language(p.language)}</dd></div><div><dt>Input support</dt><dd>${p.multi_image?'Multiple input images':'Single input image'}</dd></div><div><dt>Team</dt><dd>${esc(p.team||'Not specified')}</dd></div><div><dt>Contact · private</dt><dd>${esc(p.email)}</dd></div><div><dt>Project</dt><dd><a href="${esc(p.project_url)}" target="_blank" rel="noopener noreferrer">Open project ↗</a></dd></div><div><dt>Evaluation artifacts</dt><dd><a href="${esc(p.evidence_url)}" target="_blank" rel="noopener noreferrer">Inspect results ↗</a></dd></div><div><dt>Submitted</dt><dd>${esc(new Date(r.submitted_at).toLocaleString())}</dd></div><div><dt>Model category</dt><dd>${esc({open:'Open-source',closed:'Closed-source',agentic:'Agentic method'}[p.group])}</dd></div></dl>${p.revision_of?'<p class="notice">This update replaces an existing result. Verify the submitter’s authority before approval.</p>':''}${p.notes?`<div class="review-notes">${esc(p.notes)}</div>`:''}${scoreTable(r)}<button class="outline-button" id="download-review-json">Download submission ↓</button>${active?`<form id="review-form"><label style="margin-top:24px">Review note<textarea id="review-note" rows="3" maxlength="3000" placeholder="Required when returning or withdrawing results; visible to the submitter"></textarea></label><label class="confirmation"><input id="review-confirmed" type="checkbox" required><span>${r.status==='pending'?'I have checked the evaluation artifacts, full-dataset protocol, and submitter’s authority.':'I confirm this approved result should be withdrawn from the leaderboard.'}</span></label><p class="form-message" id="review-message" role="status"></p><div class="review-actions">${r.status==='pending'?'<button type="submit" class="primary-button" value="approve">Approve & publish</button><button type="submit" class="outline-button reject-button" value="reject">Return to submitter</button>':'<button type="submit" class="outline-button reject-button" value="withdraw">Withdraw result</button>'}</div></form>`:''}${r.history.length?`<h3 style="font-size:14px;margin-top:28px">Review history</h3><ul class="history-list">${r.history.map(h=>`<li>${esc(h.decision)} · ${esc(new Date(h.at).toLocaleString())}${h.note?' — '+esc(h.note):''}</li>`).join('')}</ul>`:''}`;
133
+ $('#download-review-json').addEventListener('click',()=>download('rise-submission-'+r.id+'.json',r));
134
+ $('#review-form')?.addEventListener('submit',async e=>{
135
+ e.preventDefault();const decision=e.submitter.value,note=$('#review-note').value.trim();
136
+ if(decision!=='approve'&&!note){message('#review-message','Add a review note explaining this decision.',true);return;}
137
+ $$('#review-form button').forEach(b=>b.disabled=true);
138
+ try{await api('/api/admin/submissions/'+r.id+'/review',{decision,note,revision:r.revision,confirmed:$('#review-confirmed').checked},true);await loadQueue();message('#queue-message',decision==='approve'?'Approved. The result is now on the leaderboard.':decision==='reject'?'Returned. The submitter can read your note using their receipt.':'Withdrawn from the leaderboard.');}
139
+ catch(error){message('#review-message',error.message,true);$$('#review-form button').forEach(b=>b.disabled=false);}
140
+ });
141
+ }
142
+ document.addEventListener('click',e=>{const button=e.target.closest('button');if(!button)return;if(button.dataset.record){selected=button.dataset.record;renderQueue();}if(button.dataset.status){filter=button.dataset.status;$$('[data-status]').forEach(b=>b.setAttribute('aria-pressed',b.dataset.status===filter));renderQueue();}});
143
+ $('#login-form').addEventListener('submit',async e=>{e.preventDefault();$('#login-button').disabled=true;try{const r=await api('/api/admin/session',{password:$('#admin-passphrase').value});token=r.token;sessionStorage.setItem('rise-review-session',token);$('#admin-passphrase').value='';await loadQueue();}catch(error){message('#login-message',error.message,true);}finally{$('#login-button').disabled=false;}});
144
+ $('#sign-out').addEventListener('click',async()=>{try{await api('/api/admin/logout',{},true);}finally{signOutView();}});
145
+ $('#refresh-queue').addEventListener('click',loadQueue);
146
+ connect().then(()=>{if(!config){$('#login-button').disabled=true;return;}if(config.local_preview){$('#passphrase-label').hidden=true;$('#admin-passphrase').required=false;$('#login-button').textContent='Open local review';}if(token)loadQueue();});
147
+ }
148
+ })();
dist/styles.css ADDED
@@ -0,0 +1,390 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ :root {
2
+ --ink: #152c3b;
3
+ --muted: #627581;
4
+ --blue: #167b79;
5
+ --teal: #167b79;
6
+ --navy: #163a48;
7
+ --line: #dfe7e8;
8
+ --surface: #fff;
9
+ --canvas: #f7f9f9;
10
+ --soft: #edf6f4;
11
+ --shadow: 0 6px 32px #153c4410;
12
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Inter, Arial, sans-serif;
13
+ color: var(--ink);
14
+ font-size: 16px;
15
+ font-synthesis: none;
16
+ }
17
+ * { box-sizing: border-box; }
18
+ html { scroll-behavior: smooth; scroll-padding-top: 28px; }
19
+ body { margin: 0; background: var(--canvas); line-height: 1.65; -webkit-font-smoothing: antialiased; }
20
+ button, input, select, summary { font: inherit; -webkit-tap-highlight-color: transparent; }
21
+ button, summary, select { cursor: pointer; }
22
+ button { border: 0; background: none; color: inherit; }
23
+ button:disabled { cursor: not-allowed; opacity: .45; }
24
+ a { color: inherit; text-decoration: none; }
25
+ a:hover { color: var(--blue); }
26
+ :focus-visible { outline: 2px solid var(--blue); outline-offset: 4px; border-radius: 4px; }
27
+ [hidden] { display: none !important; }
28
+ .sr-only { position: absolute; width: 1px; height: 1px; margin: -1px; overflow: hidden; clip: rect(0,0,0,0); white-space: nowrap; }
29
+ .skip-link { position: fixed; top: -100px; left: 20px; padding: 12px 20px; background: white; z-index: 99; }
30
+ .skip-link:focus { top: 12px; }
31
+ .page-width { width: min(1536px, calc(100% - 96px)); margin-inline: auto; }
32
+ .muted { color: var(--muted); }
33
+ .divider { margin: 0 8px; color: #b1c0c4; }
34
+
35
+ /* Compact page heading */
36
+ main { padding-bottom: 48px; }
37
+ .leaderboard-header { display: flex; align-items: center; justify-content: space-between; gap: 24px 40px; flex-wrap: wrap; padding-block: 36px 30px; }
38
+ .leaderboard-header h1 { font-size: clamp(28px, 2.5vw, 36px); font-weight: 650; line-height: 1.25; letter-spacing: -1.1px; margin: 0; }
39
+ .resource-links { display: flex; gap: 20px; flex-wrap: wrap; align-items: center; }
40
+ .resource-links a { display: inline-flex; align-items: center; gap: 6px; min-height: 40px; font-size: 15px; font-weight: 550; color: #58717f; }
41
+ .resource-links a:hover { color: var(--blue); text-decoration: underline; text-underline-offset: 4px; }
42
+ .resource-links span { font-size: 14px; color: #8b9eaa; }
43
+ .eyebrow { font-size: 12px; letter-spacing: 1.4px; font-weight: 700; color: var(--blue); display: flex; align-items: center; gap: 9px; line-height: 1.6; }
44
+ .eyebrow.muted { color: var(--muted); }
45
+
46
+ /* Benchmark switcher and context */
47
+ .board-section { scroll-margin-top: 24px; }
48
+ .benchmark-bar { display: flex; align-items: center; justify-content: space-between; flex-wrap: wrap; gap: 20px; padding-bottom: 22px; }
49
+ .benchmark-actions { display: flex; align-items: center; justify-content: flex-end; flex-wrap: wrap; gap: 24px; max-width: 100%; margin-left: auto; }
50
+ .submit-results-button { display: inline-flex; align-items: center; justify-content: center; gap: 11px; min-height: 52px; padding: 12px 22px; border: 1px solid #34577d; border-radius: 11px; background: #3b6088; color: #fff; font-size: 16px; font-weight: 650; white-space: nowrap; box-shadow: 0 4px 12px #2d527923; transition: background .15s, box-shadow .15s; }
51
+ .submit-results-button:hover { background: #2d4e74; color: #fff; box-shadow: 0 6px 16px #2d52792b; }
52
+ .submit-results-button:focus-visible { outline-color: #456c99; }
53
+ .submit-results-button .button-icon { width: 20px; height: 20px; }
54
+ .benchmark-tabs { display: inline-flex; gap: 6px; padding: 6px; background: #eaf0f0; border: 1px solid #dde6e7; border-radius: 14px; }
55
+ .benchmark-tabs button { display: flex; align-items: center; justify-content: center; padding: 10px 22px; min-height: 50px; border: 1px solid transparent; border-radius: 10px; font-size: 20px; font-weight: 650; color: #637982; letter-spacing: -.5px; transition: background .15s, color .15s; }
56
+ .benchmark-tabs button:hover { color: var(--ink); }
57
+ .benchmark-tabs button[aria-pressed=true] { background: white; color: var(--ink); border-color: #d8e5e3; box-shadow: 0 2px 6px #193b4810; }
58
+ .plus { color: var(--teal); }
59
+ .text-button { padding: 0; color: var(--blue); font-size: 14px; font-weight: 600; white-space: nowrap; }
60
+ .text-button:hover, .text-link:hover { text-decoration: underline; text-underline-offset: 4px; }
61
+
62
+ /* Instruction language is a result setting, shared by both score views. */
63
+ .board-options { display: flex; align-items: center; margin-left: auto; }
64
+ .result-language { display: flex; align-items: center; gap: 13px; flex-shrink: 0; margin-left: auto; }
65
+ .result-language > span { font-size: 13px; color: #627886; }
66
+ .language-tabs { display: flex; gap: 3px; padding: 4px; background: #eaf0f5; border: 1px solid #dde5ed; border-radius: 11px; }
67
+ .language-tabs button { min-height: 38px; min-width: 75px; padding: 6px 16px; border: 1px solid transparent; border-radius: 7px; font-size: 14px; font-weight: 550; line-height: 1.5; color: #718599; }
68
+ .language-tabs button:hover { color: #355777; background: #ffffff65; }
69
+ .language-tabs button[aria-pressed=true] { background: #fff; color: #355777; border-color: #d5e0eb; box-shadow: 0 1px 4px #2649630d; font-weight: 650; }
70
+
71
+ @media (max-width: 540px) {
72
+ .board-options { width: 100%; margin-top: 14px; }
73
+ .result-language { width: 100%; justify-content: space-between; }
74
+ .language-tabs button { min-height: 40px; padding-inline: 13px; min-width: 70px; }
75
+ }
76
+
77
+ /* Results toolbar */
78
+ .board-card { background: white; border: 1px solid #d8e2e4; border-radius: 18px; box-shadow: var(--shadow); overflow: visible; }
79
+ .view-row { display: flex; justify-content: space-between; align-items: center; border-bottom: 1px solid var(--line); padding: 18px 24px; gap: 20px; }
80
+ .view-tabs { display: flex; align-items: center; padding: 4px; gap: 4px; background: #f0f4f4; border-radius: 11px; }
81
+ .view-tabs button { font-size: 15px; font-weight: 600; color: #667b86; min-height: 42px; padding: 9px 16px; border: 1px solid transparent; border-radius: 8px; white-space: nowrap; }
82
+ .view-tabs button[aria-pressed=true] { color: #186760; background: white; border-color: #dce7e4; box-shadow: 0 1px 4px #213c4310; }
83
+ .view-tabs button > span { font-size: 12px; font-weight: 500; color: #6b8388; margin-left: 6px; }
84
+ .view-actions { display: flex; gap: 10px; align-items: center; }
85
+ .quiet-button, .outline-button { display: inline-flex; align-items: center; justify-content: center; gap: 9px; font-size: 15px; font-weight: 550; padding: 10px 14px; min-height: 44px; border-radius: 9px; white-space: nowrap; transition: background .15s, border-color .15s; }
86
+ .quiet-button { color: #516c78; }
87
+ .quiet-button:hover { background: #edf4f3; color: #1e635e; }
88
+ .view-actions .quiet-button { border: 1px solid #dce5e7; background: white; }
89
+ .view-actions .quiet-button:hover { border-color: #a8c9c5; background: #f6faf9; }
90
+ .button-icon { width: 18px; height: 18px; fill: none; stroke: currentColor; stroke-width: 1.65; stroke-linecap: round; stroke-linejoin: round; flex-shrink: 0; }
91
+ .outline-button { border: 1px solid #c8d8db; background: white; padding: 11px 18px; }
92
+ .outline-button:hover { border-color: var(--teal); background: #f4faf8; }
93
+ .column-menu { position: relative; }
94
+ .column-menu summary { list-style: none; }
95
+ .column-menu summary::-webkit-details-marker { display: none; }
96
+ .column-popover { position: absolute; top: calc(100% + 12px); right: 0; background: white; border: 1px solid #d6e3e2; border-radius: 14px; padding: 14px; box-shadow: 0 12px 44px #173b4926; width: 264px; z-index: 20; }
97
+ .column-popover .eyebrow { padding: 5px 8px 12px; font-size: 11px; }
98
+ .column-popover label { display: flex; align-items: center; font-size: 15px; gap: 12px; padding: 8px; border-radius: 6px; }
99
+ .column-popover label:hover { background: #edf6f3; }
100
+ input[type=checkbox] { accent-color: var(--teal); width: 17px; height: 17px; margin: 0; cursor: pointer; flex-shrink: 0; vertical-align: middle; }
101
+ .filter-row { display: flex; align-items: center; gap: 18px; flex-wrap: wrap; padding: 22px 24px 16px; }
102
+ .search-box { display: flex; align-items: center; border: 1px solid #cedcdf; border-radius: 10px; height: 46px; width: 270px; padding: 0 13px; gap: 10px; flex-shrink: 0; background: #fff; transition: box-shadow .15s, border-color .15s; }
103
+ .search-box svg { width: 19px; height: 19px; fill: none; stroke: #728d96; stroke-width: 1.7; flex-shrink: 0; }
104
+ .search-box input { min-width: 0; width: 100%; border: 0; outline: none; font-size: 16px; background: transparent; color: var(--ink); padding: 0; }
105
+ .search-box input::placeholder { color: #7a8d96; }
106
+ .search-box:focus-within { border-color: var(--teal); box-shadow: 0 0 0 3px #167b7912; }
107
+ .search-box kbd { border: 1px solid #dfe7e9; border-radius: 4px; padding: 0 6px; color: #8b9da4; font: 13px/22px ui-monospace, monospace; }
108
+ .group-filters { display: flex; align-items: center; gap: 5px; flex-wrap: wrap; }
109
+ .group-filters button { display: inline-flex; align-items: center; justify-content: center; gap: 8px; padding: 9px 11px; min-height: 42px; border-radius: 8px; font-size: 14px; font-weight: 550; color: #667f89; border: 1px solid transparent; white-space: nowrap; }
110
+ .group-filters button span { font-size: 12px; min-width: 23px; padding: 1px 5px; line-height: 1.5; text-align: center; background: #edf2f3; color: #6b838d; border-radius: 5px; font-variant-numeric: tabular-nums; }
111
+ .group-filters button:hover { background: #f2f7f6; color: var(--ink); }
112
+ .group-filters button[aria-pressed=true] { color: #1d6c63; background: #eaf5f0; border-color: #cee5dc; }
113
+ .group-filters button[aria-pressed=true] span { background: #d5eae1; color: #317867; }
114
+ .input-filter { margin-left: auto; position: relative; flex-shrink: 0; }
115
+ .input-filter:after { content: ""; width: 7px; height: 7px; border: solid #62828a; border-width: 0 1.7px 1.7px 0; transform: rotate(45deg); position: absolute; right: 17px; top: 18px; pointer-events: none; }
116
+ .input-filter select { appearance: none; -webkit-appearance: none; display: block; width: 228px; height: 46px; border: 1px solid #cedcdf; border-radius: 10px; padding: 0 40px 0 15px; background: white; color: #476572; font-size: 15px; font-weight: 500; line-height: normal; outline: none; transition: border-color .15s, box-shadow .15s; }
117
+ .input-filter select:hover { border-color: #97b9b5; }
118
+ .input-filter select:focus-visible { border-color: var(--teal); box-shadow: 0 0 0 3px #167b7917; outline: none; }
119
+ .table-context { display: flex; flex-wrap: wrap; gap: 10px; align-items: center; padding: 0 26px 20px; color: #788e97; font-size: 13px; }
120
+ .table-context > #result-count { color: #58727c; }
121
+ .table-context strong { color: #244d59; font-weight: 650; }
122
+ .sort-hint { margin-left: auto; }
123
+
124
+ /* Wide, readable score table. Row headers and data cells share geometry. */
125
+ .table-scroll { overflow: auto; scrollbar-width: thin; scrollbar-color: #adc9c5 #f2f7f5; border-top: 1px solid var(--line); }
126
+ .table-scroll:focus-visible { outline-offset: -2px; }
127
+ .table-scroll table { width: 100%; border-collapse: separate; border-spacing: 0; table-layout: fixed; font-size: 16px; }
128
+ .table-scroll thead th { height: 72px; background: #f2f6f6; color: #526d77; font-weight: 600; border-bottom: 1px solid #d7e3e3; text-align: center; padding: 10px 8px; vertical-align: middle; font-size: 14px; }
129
+ .table-scroll thead th button { font-size: 14px; font-weight: 600; line-height: 1.4; width: 100%; display: flex; align-items: center; justify-content: center; gap: 5px; padding: 8px 0; }
130
+ .sort-icon { font-size: 12px; color: #afc0c4; }
131
+ .table-scroll th[aria-sort=ascending] .sort-icon, .table-scroll th[aria-sort=descending] .sort-icon { color: var(--teal); }
132
+ .table-scroll thead th.active-sort { background: #e6f2ed; color: #1c7868; }
133
+ .table-scroll thead th.summary-result { background: #e9eef5; color: #45617e; }
134
+ .table-scroll thead th.summary-result.active-sort { background: #dfe8f2; color: #355777; }
135
+ .table-scroll thead th.summary-result.active-sort .sort-icon { color: #52769b; }
136
+ .table-scroll tbody td, .table-scroll tbody th { padding: 14px 8px; border-bottom: 1px solid #e8eeee; height: 72px; vertical-align: middle; background: white; }
137
+ .table-scroll td { text-align: center; font-variant-numeric: tabular-nums; }
138
+ .table-scroll tbody tr:last-child > * { border-bottom: 0; }
139
+ .table-scroll tbody tr:hover td { box-shadow: inset 0 0 0 100px #17866e06; }
140
+ .table-scroll .select-cell { width: 42px; padding-inline: 6px; }
141
+ .table-scroll .rank-cell { width: 48px; color: #7f929a; font-size: 14px; }
142
+ .table-scroll td.rank-cell .rank-top { display: inline-flex; align-items: center; justify-content: center; width: 30px; height: 30px; font-weight: 650; border-radius: 50%; background: #eef3f4; color: #557681; }
143
+ .table-scroll td.rank-cell .rank-1 { background: #fff2d7; color: #9c712a; }
144
+ .table-scroll td.rank-cell .rank-2 { background: #edf1f5; color: #657b91; }
145
+ .table-scroll td.rank-cell .rank-3 { background: #f7eae0; color: #9c7355; }
146
+ .table-scroll .model-cell { text-align: left; padding-left: 14px; width: 280px; position: sticky; left: 0; z-index: 3; background: white; border-right: 1px solid #e3ebeb; }
147
+ .table-scroll thead th.model-cell { background: #f2f6f6; z-index: 4; font-size: 14px; }
148
+ .table-scroll tbody th.model-cell { padding: 14px; }
149
+ .table-scroll .model-button { padding: 0; max-width: 100%; width: auto; text-align: left; display: block; font-size: 15px; font-weight: 600; color: #203f4c; line-height: 1.4; }
150
+ .model-button:hover { color: var(--teal); text-decoration: underline; text-underline-offset: 4px; }
151
+ .model-meta { display: flex; align-items: center; gap: 6px; margin-top: 6px; font-size: 11px; font-weight: 450; color: #798e96; line-height: 1.3; }
152
+ .group-dot { width: 5px; height: 5px; border-radius: 50%; background: #7993b0; }
153
+ .group-dot.open { background: #509b82; }
154
+ .group-dot.agentic { background: #9c80b5; }
155
+ .ours-badge { font-size: 9px; font-weight: 650; letter-spacing: .5px; color: #30745a; background: #e1f1e9; padding: 2px 5px; border-radius: 4px; margin-left: 3px; }
156
+ .input-pill { display: inline-block; font-size: 11px; padding: 3px 7px; border: 1px solid #e0e8eb; border-radius: 6px; color: #788d97; white-space: nowrap; background: #fafcfc; }
157
+ .input-pill.multi { color: #447f7c; background: #edf6f3; border-color: #d7eae5; }
158
+ .score-cell { color: #365765; font-weight: 500; }
159
+ .score-cell.summary-result { font-size: 17px; font-weight: 650; color: #3c5976; }
160
+ .score-cell.overall { font-weight: 700; color: #355777; position: relative; font-size: 17px; }
161
+ .score-cell .score-meter { position: absolute; left: 50%; bottom: 12px; transform: translateX(-50%); display: block; height: 3px; width: 44px; margin: 0; background: #7c98b51a; border-radius: 5px; overflow: hidden; }
162
+ .score-meter i { display: block; height: 3px; background: #92abc4; border-radius: 5px; }
163
+ .score-cell.missing { color: #aebec3; font-weight: 400; background: #fcfdfd !important; }
164
+ .score-cell.summary-result.missing { color: #9aaabd; background: #f3f5f9 !important; }
165
+ .table-scroll tbody tr:hover th.model-cell { background: #f5faf8; }
166
+ .table-scroll tbody tr.selected th.model-cell { background: #eaf5f0; box-shadow: inset 3px 0 #31947b; }
167
+ .table-scroll tbody tr.ours th.model-cell { background: #f0f8f3; }
168
+ .table-scroll tr.ours .model-button { color: #24754f; }
169
+ .table-footer { padding: 8px 20px; display: flex; align-items: center; justify-content: space-between; gap: 15px; font-size: 13px; color: #728b94; border-top: 1px solid var(--line); }
170
+ .footer-actions { display: flex; gap: 6px; align-items: center; }
171
+ .footer-actions .quiet-button { font-size: 13px; min-height: 38px; padding: 6px 10px; }
172
+ .empty-state { padding: 60px 20px; text-align: center; }
173
+ .empty-state > span { font-size: 40px; color: #a2c0c1; }
174
+ .empty-state h3 { font-size: 22px; margin: 5px; }
175
+ .empty-state p { font-size: 16px; color: var(--muted); margin: 0 0 24px; }
176
+ .primary-button { background: var(--teal); color: white; font-size: 15px; font-weight: 600; padding: 11px 19px; min-height: 46px; border-radius: 9px; display: inline-flex; align-items: center; justify-content: center; gap: 10px; box-shadow: 0 2px 4px #167b7910; }
177
+ .primary-button:hover:not(:disabled) { background: #106b67; color: white; }
178
+
179
+ .caption-text { font-size: 13px; color: #728991; margin: 10px 0 0; }
180
+
181
+ /* Comparisons and dialogs */
182
+ .compare-tray { position: fixed; bottom: 24px; left: 50%; transform: translateX(-50%); width: min(1040px, calc(100% - 40px)); padding: 18px 22px; background: #fffffff5; backdrop-filter: blur(14px); border: 1px solid #c4dbd6; box-shadow: 0 12px 60px #163c4929; border-radius: 16px; z-index: 25; display: flex; justify-content: space-between; align-items: center; gap: 20px; }
183
+ .compare-tray > div:first-child { min-width: 0; }
184
+ .compare-tray strong { font-size: 13px; color: #527981; }
185
+ .compare-tray #compare-chips { display: flex; flex-wrap: wrap; gap: 7px; margin-top: 8px; }
186
+ .compare-chip { display: inline-flex; gap: 8px; align-items: center; background: #edf5f1; color: #45776d; font-size: 12px; border-radius: 6px; padding: 4px 9px; }
187
+ .compare-chip button { font-size: 18px; padding: 0 2px; line-height: 1; min-width: 20px; min-height: 24px; }
188
+ .tray-actions { display: flex; gap: 12px; flex-shrink: 0; }
189
+ dialog { padding: 28px 36px 36px; border: 1px solid #d6e3e3; border-radius: 20px; width: min(1060px, calc(100% - 40px)); max-height: 90vh; color: var(--ink); box-shadow: 0 25px 100px #12333f50; overflow: auto; }
190
+ dialog::backdrop { background: #15384070; backdrop-filter: blur(5px); }
191
+ .dialog-top { display: flex; justify-content: space-between; align-items: center; gap: 20px; }
192
+ .dialog-close { font-size: 27px; color: #6a8892; padding: 0; line-height: 1; background: #f0f5f4; border-radius: 50%; width: 38px; height: 38px; flex-shrink: 0; }
193
+ .dialog-close:hover { background: #e1efea; }
194
+ .dialog-title { font-size: 30px; margin: 18px 0 7px; line-height: 1.35; letter-spacing: -.6px; }
195
+ .dialog-subtitle { font-size: 15px; color: var(--muted); margin: 0 0 24px; }
196
+ .comparison-layout { display: grid; grid-template-columns: 1fr 1fr; align-items: center; gap: 20px; }
197
+ .radar { max-height: 380px; width: 100%; overflow: visible; }
198
+ .radar-label { font: 10.5px -apple-system,sans-serif; fill: #557782; }
199
+ .radar-value { font: 8px ui-monospace,monospace; fill: #90a5ad; }
200
+ .compare-summaries { display: flex; flex-direction: column; gap: 14px; }
201
+ .compare-summary { padding: 16px 18px; background: #f3f8f6; border: 1px solid #e0ebe6; border-radius: 10px; display: flex; justify-content: space-between; align-items: center; gap: 14px; }
202
+ .compare-summary h4 { font-size: 15px; margin: 0 0 7px; line-height: 1.5; }
203
+ .compare-summary p { font-size: 12px; color: var(--muted); margin: 0; }
204
+ .compare-summary strong { font-size: 30px; font-weight: 650; font-variant-numeric: tabular-nums; white-space: nowrap; }
205
+ .compare-summary strong small { font-size: 11px; font-weight: 400; color: var(--muted); }
206
+ .series-dot { width: 7px; height: 7px; display: inline-block; border-radius: 50%; margin-right: 6px; }
207
+ .comparison-warning { padding: 13px 16px; border: 1px solid #e8ddbb; background: #fffbef; color: #8b7742; font-size: 13px; border-radius: 8px; margin: 18px 0; }
208
+ .comparison-table-wrap { overflow: auto; }
209
+ .comparison-table { width: 100%; border-collapse: collapse; font-size: 15px; margin-top: 20px; }
210
+ .comparison-table th, .comparison-table td { padding: 13px 12px; text-align: center; border-bottom: 1px solid #e3ebeb; font-variant-numeric: tabular-nums; min-width: 125px; }
211
+ .comparison-table th { font-size: 14px; background: #f0f6f3; font-weight: 600; }
212
+ .comparison-table th:first-child, .comparison-table td:first-child { text-align: left; min-width: 190px; }
213
+ .comparison-table .best-value { font-weight: 750; color: var(--teal); }
214
+ .comparison-section td { font-size: 11px; font-weight: 700; letter-spacing: 1px; color: #78948f; padding-top: 24px; background: #fcfefd; }
215
+ .dialog-actions { display: flex; gap: 12px; margin-top: 26px; justify-content: flex-end; flex-wrap: wrap; }
216
+ .citation-code { background: #f3f7f5; border: 1px solid #dfe8e3; border-radius: 10px; padding: 22px; font: 13px/1.85 ui-monospace,SFMono-Regular,monospace; white-space: pre-wrap; overflow-wrap: anywhere; }
217
+ .toast { position: fixed; bottom: 132px; left: 50%; transform: translateX(-50%); padding: 12px 22px; background: #234e58; color: #fff; font-size: 14px; border-radius: 10px; box-shadow: 0 5px 25px #17324d20; z-index: 100; text-align: center; max-width: 90%; }
218
+ .noscript { margin: 30px; text-align: center; }
219
+ .noscript a { text-decoration: underline; }
220
+
221
+ /* Maintain readable text at smaller widths; only the score table scrolls. */
222
+ @media (max-width: 1350px) {
223
+ .page-width { width: calc(100% - 64px); }
224
+ .filter-row { gap: 14px; }
225
+ .search-box { width: 240px; }
226
+ .group-filters { gap: 2px; }
227
+ .group-filters button { padding-inline: 9px; }
228
+ .input-filter select { width: 218px; }
229
+ }
230
+ @media (max-width: 1100px) {
231
+ .filter-row .search-box { width: 270px; }
232
+ .group-filters { order: 3; width: 100%; gap: 8px; }
233
+ .input-filter { margin-left: auto; }
234
+ .sort-hint { margin-left: 0; }
235
+ .view-row { padding-inline: 18px; gap: 12px; }
236
+ .view-tabs button { padding-inline: 12px; }
237
+ .view-actions { gap: 6px; }
238
+ .view-actions .quiet-button { padding-inline: 12px; font-size: 14px; }
239
+ }
240
+ @media (max-width: 820px) {
241
+ .page-width { width: calc(100% - 40px); }
242
+ .benchmark-tabs button { padding-inline: 16px; font-size: 19px; }
243
+ .view-row { flex-wrap: wrap; padding: 16px 20px; gap: 14px; }
244
+ .view-actions { margin-left: auto; }
245
+ .sort-hint { width: 100%; }
246
+ .table-context { padding-inline: 22px; }
247
+ .caption-text { text-align: left; max-width: none; }
248
+ .comparison-layout { grid-template-columns: 1fr; gap: 24px; }
249
+ .radar { max-height: 320px; }
250
+ .table-footer { flex-wrap: wrap; }
251
+ .compare-tray { padding: 16px; gap: 12px; }
252
+ .tray-actions { flex-direction: column-reverse; gap: 5px; }
253
+ .tray-actions .quiet-button { min-height: 30px; padding: 2px 12px; }
254
+ }
255
+ @media (max-width: 540px) {
256
+ .page-width { width: calc(100% - 32px); }
257
+ .leaderboard-header { padding-block: 26px 22px; gap: 12px; }
258
+ .leaderboard-header h1 { font-size: 28px; letter-spacing: -.7px; }
259
+ .resource-links { gap: 20px; }
260
+ .resource-links a { font-size: 14px; min-height: 36px; }
261
+ .benchmark-bar { display: block; padding-bottom: 18px; }
262
+ .benchmark-actions { flex-direction: column; align-items: stretch; gap: 16px; margin-top: 16px; }
263
+ .benchmark-actions .board-options { margin-top: 0; }
264
+ .submit-results-button { width: 100%; }
265
+ .benchmark-tabs { width: 100%; gap: 4px; padding: 5px; }
266
+ .benchmark-tabs button { flex: 1; padding: 9px 10px; min-height: 48px; font-size: 19px; }
267
+ .board-card { border-radius: 13px; }
268
+ .view-row { padding: 14px; gap: 14px; }
269
+ .view-tabs { width: 100%; gap: 2px; }
270
+ .view-tabs button { flex: 1 1 0; min-width: 0; white-space: normal; font-size: 14px; padding: 8px; min-height: 48px; line-height: 1.4; }
271
+ .view-tabs button > span { display: none; }
272
+ .view-actions { width: 100%; gap: 8px; justify-content: flex-end; }
273
+ .view-actions .quiet-button { font-size: 14px; min-height: 42px; padding: 7px 12px; }
274
+ .filter-row { padding: 16px 14px 14px; gap: 14px; }
275
+ .filter-row .search-box { width: 100%; }
276
+ .input-filter { width: 100%; order: 3; }
277
+ .input-filter select { width: 100%; font-size: 16px; }
278
+ .group-filters { order: 2; display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 7px; }
279
+ .group-filters button { padding: 8px 10px; justify-content: space-between; font-size: 13px; border-color: #e2e9e9; }
280
+ .table-context { padding: 0 15px 16px; font-size: 12px; gap: 6px; }
281
+ .sort-hint { font-size: 12px; line-height: 1.8; }
282
+ .sort-hint .divider { margin-inline: 4px; }
283
+ .table-scroll .model-cell { width: 190px; }
284
+ .table-scroll tbody th.model-cell { padding: 14px 10px; }
285
+ .table-scroll .model-button { font-size: 15px; }
286
+ .table-footer { padding: 8px 14px; gap: 10px; font-size: 12px; }
287
+ .table-footer .divider { margin-inline: 4px; }
288
+ .compare-tray { width: calc(100% - 20px); bottom: 10px; padding: 12px; gap: 8px; align-items: start; }
289
+ .compare-tray #compare-chips { gap: 4px; }
290
+ .compare-chip { font-size: 11px; padding: 3px 7px; }
291
+ .compare-tray strong { font-size: 12px; }
292
+ .tray-actions .primary-button { font-size: 13px; padding: 9px 12px; }
293
+ .tray-actions .quiet-button { font-size: 13px; }
294
+ dialog { width: calc(100% - 20px); padding: 20px; border-radius: 15px; max-height: 92vh; }
295
+ .dialog-title { font-size: 26px; }
296
+ .dialog-subtitle { font-size: 14px; }
297
+ .dialog-top .eyebrow { font-size: 10px; letter-spacing: 1px; }
298
+ .compare-summary { padding: 13px; }
299
+ .compare-summary h4 { font-size: 14px; }
300
+ .comparison-table { font-size: 14px; }
301
+ .comparison-table th { font-size: 13px; }
302
+ .comparison-table th:first-child, .comparison-table td:first-child { min-width: 165px; }
303
+ .citation-code { padding: 15px; font-size: 12px; }
304
+ .dialog-actions { justify-content: flex-start; }
305
+ .dialog-actions .primary-button, .dialog-actions .outline-button { font-size: 14px; }
306
+ .toast { bottom: 175px; font-size: 13px; }
307
+ }
308
+ @media (max-width: 380px) {
309
+ .group-filters button { min-width: 0; padding-inline: 8px; gap: 5px; font-size: 12px; }
310
+ .group-filters button span { min-width: 20px; font-size: 11px; padding-inline: 4px; }
311
+ }
312
+ @media (prefers-reduced-motion: reduce) {
313
+ html { scroll-behavior: auto; }
314
+ * { animation: none !important; transition: none !important; }
315
+ }
316
+
317
+ /* Fine-grained results keep the same model rows, with a scoped score header. */
318
+ .view-row { flex-wrap: wrap; }
319
+ .view-actions { margin-left: auto; }
320
+ .breakdown-controls { padding: 18px 24px; border-bottom: 1px solid #e1e8ef; background: #f8fafd; display: flex; flex-wrap: wrap; gap: 18px 24px; align-items: center; }
321
+ .dimension-tabs { display: flex; flex-wrap: wrap; gap: 6px; }
322
+ .dimension-tabs button { padding: 7px 12px; min-height: 38px; border-radius: 7px; font-size: 14px; font-weight: 550; color: #718197; border: 1px solid transparent; }
323
+ .dimension-tabs button:hover { background: #eef2f8; color: #315778; }
324
+ .dimension-tabs button[aria-pressed=true] { background: #e8eef8; border-color: #cfdcef; color: #345980; }
325
+ .subcategory-filter { display: flex; align-items: center; gap: 12px; flex-wrap: wrap; font-size: 13px; color: #78899d; }
326
+ .subcategory-filter select { color: #3f5771; background: white; border: 1px solid #d0dce7; border-radius: 8px; padding: 8px 32px 8px 12px; min-height: 40px; max-width: 100%; font-size: 14px; }
327
+ .context-separator { padding: 0 10px; color: #a6b3bf; }
328
+ .column-popover { max-height: min(65vh, 540px); overflow-y: auto; width: 300px; }
329
+ .column-popover label { font-size: 14px; line-height: 1.5; }
330
+ .table-scroll .breakdown-table thead th { height: 110px; background: #f4f7fb; color: #506680; }
331
+ .table-scroll .breakdown-table thead th.active-sort { background: #e8eff9; color: #355d8a; }
332
+ .table-scroll .breakdown-table thead th.dimension-band { height: 38px; padding: 7px 12px; font-size: 12px; font-weight: 650; letter-spacing: .25px; color: #5e7088; border-bottom-color: #fff; }
333
+ .table-scroll .breakdown-table .dimension-band.dim-temporal { background: #edf0fb; }
334
+ .table-scroll .breakdown-table .dimension-band.dim-causal { background: #eff3e9; }
335
+ .table-scroll .breakdown-table .dimension-band.dim-spatial { background: #eaf2f5; }
336
+ .table-scroll .breakdown-table .dimension-band.dim-logical { background: #eef0f8; }
337
+ .table-scroll .breakdown-table .dimension-band.dim-counterfactual { background: #fbf0e7; }
338
+
339
+ /* Paper figures and citation form a quiet, visual closing section. */
340
+ .research-section { margin-top: 84px; }
341
+ .figure-section { margin-bottom: 72px; scroll-margin-top: 32px; }
342
+ .section-heading { display: flex; align-items: end; justify-content: space-between; flex-wrap: wrap; gap: 18px 30px; margin-bottom: 25px; }
343
+ .section-kicker { display: block; font-size: 11px; font-weight: 650; letter-spacing: 1.8px; color: #8a99ae; margin-bottom: 9px; }
344
+ .section-heading h2 { margin: 0; font-size: 34px; line-height: 1.2; font-weight: 650; letter-spacing: -.9px; color: #273d55; }
345
+ .section-heading .plus { color: #537da9; }
346
+ .section-note { color: #8592a3; font-size: 15px; padding-bottom: 3px; }
347
+ .research-figure { margin: 0; padding: 24px; border: 1px solid #e0e6ee; border-radius: 20px; background: white; box-shadow: 0 8px 36px #23395308; }
348
+ .research-figure a { display: block; position: relative; border-radius: 10px; overflow: hidden; }
349
+ .research-figure img { display: block; width: 100%; height: auto; }
350
+ .figure-expand { position: absolute; bottom: 14px; right: 14px; padding: 8px 14px; background: #ffffffee; box-shadow: 0 2px 15px #20395612; border: 1px solid #dce5ef; border-radius: 8px; color: #526983; font-size: 12px; opacity: 0; transition: opacity .2s; }
351
+ .research-figure a:hover .figure-expand, .research-figure a:focus-visible .figure-expand { opacity: 1; }
352
+ .citation-section { padding: 34px; background: linear-gradient(125deg, #eff3fa, #f7f8fb 70%, #f2f0fa); border: 1px solid #dee5ef; border-radius: 20px; scroll-margin-top: 32px; }
353
+ .citation-section .section-heading { align-items: center; margin-bottom: 22px; }
354
+ .citation-section h2 { font-size: 29px; }
355
+ .citation-actions { display: flex; flex-wrap: wrap; gap: 8px; align-items: center; }
356
+ .citation-actions button { font-size: 14px; color: #526a86; }
357
+ .citation-actions .outline-button { border-color: #d4dfe9; }
358
+ .page-citation { margin: 0; padding: 26px; border: 1px solid #e1e7f0; background: #ffffffba; color: #5d6e83; font-size: 13px; line-height: 1.85; border-radius: 12px; white-space: pre-wrap; overflow-wrap: anywhere; }
359
+ .page-footer { display: flex; justify-content: space-between; align-items: center; gap: 20px; color: #8b9bad; margin-top: 36px; font-size: 13px; }
360
+ .page-footer > span { font-weight: 650; letter-spacing: -.2px; color: #6d819a; }
361
+ .page-footer a { padding-block: 8px; }
362
+ @media (max-width: 1100px) {
363
+ .view-tabs button { padding-inline: 11px; font-size: 14px; }
364
+ .view-tabs button > span { margin-left: 3px; }
365
+ }
366
+ @media (max-width: 820px) {
367
+ .research-section { margin-top: 56px; }
368
+ .figure-section { margin-bottom: 48px; }
369
+ .section-heading h2 { font-size: 28px; }
370
+ .section-note { font-size: 14px; }
371
+ .research-figure { padding: 14px; border-radius: 14px; }
372
+ .citation-section { padding: 24px; }
373
+ }
374
+ @media (max-width: 540px) {
375
+ .view-tabs { display: flex; flex-wrap: wrap; }
376
+ .view-tabs button { flex-basis: 45%; font-size: 14px; }
377
+ .breakdown-controls { padding: 14px; gap: 14px; }
378
+ .dimension-tabs { gap: 4px; }
379
+ .dimension-tabs button { padding-inline: 9px; font-size: 13px; }
380
+ .subcategory-filter { width: 100%; gap: 6px; }
381
+ .subcategory-filter select { width: 100%; }
382
+ .footer-actions { flex-wrap: wrap; gap: 2px; }
383
+ .footer-actions .quiet-button { padding-inline: 8px; font-size: 12px; }
384
+ .section-heading { gap: 12px; margin-bottom: 20px; }
385
+ .section-kicker { font-size: 10px; }
386
+ .research-figure { padding: 8px; border-radius: 12px; }
387
+ .citation-section { padding: 20px 16px; }
388
+ .citation-actions { width: 100%; }
389
+ .page-citation { padding: 15px; font-size: 12px; }
390
+ }
dist/submit.html ADDED
@@ -0,0 +1,34 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!doctype html>
2
+ <html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>Submit results · RISEBench</title><link rel="icon" href="assets/favicon.svg"><link rel="stylesheet" href="styles.css"><link rel="stylesheet" href="portal.css"></head>
3
+ <body data-page="submit"><main class="portal-width">
4
+ <nav class="portal-nav" aria-label="Main navigation"><a class="wordmark" href="index.html">RISEBench</a><div><a href="index.html">Leaderboard</a><a href="submit.html" aria-current="page">Submit results</a></div></nav>
5
+ <header class="portal-heading"><span class="section-kicker">COMMUNITY EVALUATIONS</span><h1>Submit your results.</h1><p>Submit evaluations for RISEBench or RISEBench++.</p></header>
6
+ <p class="notice" id="service-notice" hidden></p>
7
+ <form id="submission-form">
8
+ <section class="portal-card"><div class="card-heading"><h2>Model details</h2><span>Required unless marked optional</span></div>
9
+ <div class="form-grid">
10
+ <label>Model name<input name="model_name" required maxlength="160" placeholder="Your model name"></label>
11
+ <label>Project, paper or model repository<input name="project_url" type="url" required maxlength="1000" placeholder="https://"></label>
12
+ <label>Team <span class="optional">Optional</span><input name="team" maxlength="120" placeholder="Your team or organization"></label>
13
+ <label>Contact email <span class="optional">Private</span><input name="email" type="email" required maxlength="254" placeholder="name@organization.com"><small>Visible only to reviewers.</small></label>
14
+ <label>Benchmark<select name="benchmark" id="submission-benchmark"><option value="risebench-plusplus">RISEBench++</option><option value="risebench">RISEBench</option></select></label>
15
+ <label>Instruction language<select name="language" id="submission-language"><option value="en">English</option><option value="zh">Chinese</option></select></label>
16
+ <label>Model category<select name="group" required><option value="open">Open-source</option><option value="closed">Closed-source</option><option value="agentic">Agentic method</option></select></label>
17
+ <label>Input support<select name="multi_image"><option value="true">Multiple input images supported</option><option value="false">Single input image only</option></select><input id="single-image-input" type="text" value="Single input image" readonly hidden></label>
18
+ <label class="full-width">Update an existing result <span class="optional">Optional</span><select name="revision_of" id="submission-revision"><option value="">New result</option></select></label>
19
+ </div>
20
+ </section>
21
+ <section class="portal-card"><div class="card-heading"><h2>Evaluation results</h2><button type="button" id="download-template" class="outline-button">Download JSON template ↓</button></div>
22
+ <p class="field-note">Use full benchmark results on a 0–100 scale. Leave unevaluated fields null.</p>
23
+ <label class="upload-zone" id="upload-zone"><input type="file" id="result-file" accept=".json,application/json" required><svg viewBox="0 0 24 24" aria-hidden="true"><path d="M12 16V3m-5 5 5-5 5 5M4 15v6h16v-6"/></svg><strong id="upload-title">Choose a result JSON or drop it here</strong><span id="upload-caption">One JSON file · up to 200 KB</span></label>
24
+ <div class="file-preview" id="file-preview" hidden></div>
25
+ <div class="form-grid artifacts"><label class="full-width">Evaluation artifacts<input name="evidence_url" type="url" required maxlength="1000" placeholder="https://huggingface.co/datasets/your-team/evaluation-results"><small>Link to generated outputs and detailed evaluation results so reviewers can verify the scores.</small></label>
26
+ <label class="full-width">Notes for reviewers <span class="optional">Optional · private</span><textarea name="notes" rows="3" maxlength="3000" placeholder="Evaluation configuration, model version, or details of an update"></textarea></label></div>
27
+ <label class="confirmation"><input name="full_dataset" type="checkbox" required><span>These scores use the full benchmark and the official evaluation protocol. I am authorized to submit this model's results.</span></label>
28
+ <div class="form-bottom"><p class="form-message" id="submission-message" role="status"></p><button class="primary-button" id="submit-results" type="submit">Submit for review <span aria-hidden="true">→</span></button></div>
29
+ </section>
30
+ </form>
31
+ <section class="portal-card receipt-card" id="submission-receipt" hidden aria-live="polite"></section>
32
+ <section class="portal-card status-card"><div class="card-heading"><h2>Check a submission</h2><span>Your receipt keeps this private</span></div><form id="status-form"><div class="form-grid"><label>Submission ID<input name="submission_id" required autocomplete="off"></label><label>Receipt key<input name="status_token" type="password" required autocomplete="off"></label></div><div class="form-bottom"><p id="status-result" class="form-message" role="status"></p><button class="outline-button" type="submit">Check status</button></div></form></section>
33
+ <footer class="page-footer"><a href="index.html">← Back to leaderboard</a><a href="admin.html">Reviewer sign in</a></footer>
34
+ </main><script id="submission-schema" type="application/json">{"benchmarks": [{"id": "risebench-plusplus", "name": "RISEBench++", "case_count": 1000, "available_result_languages": ["en", "zh"], "accuracy_unit": "%", "metric_unit": "/100", "score_decimals": 1, "default_sort": "total", "dimensions": [{"key": "temporal", "label": "Temporal", "description": "Infer how a scene changes over time."}, {"key": "causal", "label": "Causal", "description": "Reason about causes, actions, and their consequences."}, {"key": "spatial", "label": "Spatial", "description": "Reason about spatial relationships and transformations."}, {"key": "logical", "label": "Logical", "description": "Apply explicit rules, patterns, and logical constraints."}, {"key": "counterfactual", "label": "Counterfactual", "description": "Visualize outcomes under hypothetical or contrary-to-fact conditions."}, {"key": "hybrid", "label": "Hybrid", "description": "Combine reasoning across three to five successive editing instructions."}], "metrics": [{"key": "instruction_reasoning", "label": "Instruction Reasoning", "description": "Whether the edit realizes the intended reasoning outcome."}, {"key": "appearance_consistency", "label": "Appearance Consistency", "description": "Whether content that should remain unchanged is preserved."}, {"key": "visual_plausibility", "label": "Visual Plausibility", "description": "Visual quality and plausibility; logical tasks are excluded."}], "accuracy_columns": [{"key": "temporal", "label": "Temporal", "description": "Infer how a scene changes over time."}, {"key": "causal", "label": "Causal", "description": "Reason about causes, actions, and their consequences."}, {"key": "spatial", "label": "Spatial", "description": "Reason about spatial relationships and transformations."}, {"key": "logical", "label": "Logical", "description": "Apply explicit rules, patterns, and logical constraints."}, {"key": "counterfactual", "label": "Counterfactual", "description": "Visualize outcomes under hypothetical or contrary-to-fact conditions."}, {"key": "hybrid", "label": "Hybrid", "description": "Combine reasoning across three to five successive editing instructions."}, {"key": "single", "label": "Single", "description": "Accuracy on single-image cases."}, {"key": "multi", "label": "Multi", "description": "Accuracy on multi-image cases. Not evaluated for models without multi-image support."}, {"key": "total", "label": "Total", "description": "Accuracy on the complete benchmark. Not evaluated for single-image-only models."}], "subcategory_columns": [{"key": "temporal_common_sense_knowledge", "label": "Common-Sense Knowledge", "dimension": "temporal", "case_count": 85, "multi_image_case_count": 0, "code": "CSK", "description": "Temporal · Common-Sense Knowledge — accuracy (%)"}, {"key": "temporal_context_knowledge", "label": "Context Knowledge", "dimension": "temporal", "case_count": 52, "multi_image_case_count": 28, "code": "CtxK", "description": "Temporal · Context Knowledge — accuracy (%)"}, {"key": "temporal_disciplinary_knowledge", "label": "Disciplinary Knowledge", "dimension": "temporal", "case_count": 63, "multi_image_case_count": 4, "code": "DK", "description": "Temporal · Disciplinary Knowledge — accuracy (%)"}, {"key": "causal_common_sense_knowledge", "label": "Common-Sense Knowledge", "dimension": "causal", "case_count": 80, "multi_image_case_count": 1, "code": "CSK", "description": "Causal · Common-Sense Knowledge — accuracy (%)"}, {"key": "causal_context_knowledge", "label": "Context Knowledge", "dimension": "causal", "case_count": 40, "multi_image_case_count": 2, "code": "CtxK", "description": "Causal · Context Knowledge — accuracy (%)"}, {"key": "causal_disciplinary_knowledge", "label": "Disciplinary Knowledge", "dimension": "causal", "case_count": 80, "multi_image_case_count": 5, "code": "DK", "description": "Causal · Disciplinary Knowledge — accuracy (%)"}, {"key": "spatial_relation", "label": "Relation", "dimension": "spatial", "case_count": 106, "multi_image_case_count": 6, "code": "Rel.", "description": "Spatial · Relation — accuracy (%)"}, {"key": "spatial_structure", "label": "Structure", "dimension": "spatial", "case_count": 94, "multi_image_case_count": 12, "code": "Struct.", "description": "Spatial · Structure — accuracy (%)"}, {"key": "logical_explicit_rule_deduction", "label": "Explicit Rule Deduction", "dimension": "logical", "case_count": 123, "multi_image_case_count": 0, "code": "ERD", "description": "Logical · Explicit Rule Deduction — accuracy (%)"}, {"key": "logical_implicit_pattern_induction", "label": "Implicit Pattern Induction", "dimension": "logical", "case_count": 77, "multi_image_case_count": 20, "code": "IPI", "description": "Logical · Implicit Pattern Induction — accuracy (%)"}, {"key": "counterfactual_counterfactual_imagination", "label": "Counterfactual Imagination", "dimension": "counterfactual", "case_count": 70, "multi_image_case_count": 0, "code": "CFI", "description": "Counterfactual · Counterfactual Imagination — accuracy (%)"}, {"key": "counterfactual_anomaly_correction_and_generation", "label": "Anomaly Correction and Generation", "dimension": "counterfactual", "case_count": 30, "multi_image_case_count": 0, "code": "ACG", "description": "Counterfactual · Anomaly Correction and Generation — accuracy (%)"}], "task_type_columns": [{"key": "T01", "code": "T01", "label": "Life Progression", "dimension": "temporal", "subcategory": "temporal_common_sense_knowledge", "case_count": 24, "multi_image_case_count": 0, "description": "Temporal · Life Progression — accuracy (%)"}, {"key": "T02", "code": "T02", "label": "Material Transformation", "dimension": "temporal", "subcategory": "temporal_common_sense_knowledge", "case_count": 9, "multi_image_case_count": 0, "description": "Temporal · Material Transformation — accuracy (%)"}, {"key": "T03", "code": "T03", "label": "Natural Environmental Changes", "dimension": "temporal", "subcategory": "temporal_common_sense_knowledge", "case_count": 13, "multi_image_case_count": 0, "description": "Temporal · Natural Environmental Changes — accuracy (%)"}, {"key": "T04", "code": "T04", "label": "Physical Aging", "dimension": "temporal", "subcategory": "temporal_common_sense_knowledge", "case_count": 20, "multi_image_case_count": 0, "description": "Temporal · Physical Aging — accuracy (%)"}, {"key": "T05", "code": "T05", "label": "Social Activities", "dimension": "temporal", "subcategory": "temporal_common_sense_knowledge", "case_count": 8, "multi_image_case_count": 0, "description": "Temporal · Social Activities — accuracy (%)"}, {"key": "T06", "code": "T06", "label": "Tool Evolution", "dimension": "temporal", "subcategory": "temporal_common_sense_knowledge", "case_count": 7, "multi_image_case_count": 0, "description": "Temporal · Tool Evolution — accuracy (%)"}, {"key": "T07", "code": "T07", "label": "Urban Evolution", "dimension": "temporal", "subcategory": "temporal_common_sense_knowledge", "case_count": 4, "multi_image_case_count": 0, "description": "Temporal · Urban Evolution — accuracy (%)"}, {"key": "T08", "code": "T08", "label": "Temporal State Transition", "dimension": "temporal", "subcategory": "temporal_context_knowledge", "case_count": 15, "multi_image_case_count": 4, "description": "Temporal · Temporal State Transition — accuracy (%)"}, {"key": "T09", "code": "T09", "label": "Precise Temporal Localization", "dimension": "temporal", "subcategory": "temporal_context_knowledge", "case_count": 14, "multi_image_case_count": 2, "description": "Temporal · Precise Temporal Localization — accuracy (%)"}, {"key": "T10", "code": "T10", "label": "Position Change", "dimension": "temporal", "subcategory": "temporal_context_knowledge", "case_count": 15, "multi_image_case_count": 14, "description": "Temporal · Position Change — accuracy (%)"}, {"key": "T11", "code": "T11", "label": "Action Sequence", "dimension": "temporal", "subcategory": "temporal_context_knowledge", "case_count": 8, "multi_image_case_count": 8, "description": "Temporal · Action Sequence — accuracy (%)"}, {"key": "T12", "code": "T12", "label": "Physics", "dimension": "temporal", "subcategory": "temporal_disciplinary_knowledge", "case_count": 4, "multi_image_case_count": 0, "description": "Temporal · Physics — accuracy (%)"}, {"key": "T13", "code": "T13", "label": "Chemistry", "dimension": "temporal", "subcategory": "temporal_disciplinary_knowledge", "case_count": 8, "multi_image_case_count": 4, "description": "Temporal · Chemistry — accuracy (%)"}, {"key": "T14", "code": "T14", "label": "Biology", "dimension": "temporal", "subcategory": "temporal_disciplinary_knowledge", "case_count": 9, "multi_image_case_count": 0, "description": "Temporal · Biology — accuracy (%)"}, {"key": "T15", "code": "T15", "label": "Astronomy", "dimension": "temporal", "subcategory": "temporal_disciplinary_knowledge", "case_count": 12, "multi_image_case_count": 0, "description": "Temporal · Astronomy — accuracy (%)"}, {"key": "T16", "code": "T16", "label": "Geography", "dimension": "temporal", "subcategory": "temporal_disciplinary_knowledge", "case_count": 18, "multi_image_case_count": 0, "description": "Temporal · Geography — accuracy (%)"}, {"key": "T17", "code": "T17", "label": "History", "dimension": "temporal", "subcategory": "temporal_disciplinary_knowledge", "case_count": 5, "multi_image_case_count": 0, "description": "Temporal · History — accuracy (%)"}, {"key": "T18", "code": "T18", "label": "Medicine", "dimension": "temporal", "subcategory": "temporal_disciplinary_knowledge", "case_count": 4, "multi_image_case_count": 0, "description": "Temporal · Medicine — accuracy (%)"}, {"key": "T19", "code": "T19", "label": "Computer Science", "dimension": "temporal", "subcategory": "temporal_disciplinary_knowledge", "case_count": 3, "multi_image_case_count": 0, "description": "Temporal · Computer Science — accuracy (%)"}, {"key": "C01", "code": "C01", "label": "Physical State Transition", "dimension": "causal", "subcategory": "causal_common_sense_knowledge", "case_count": 31, "multi_image_case_count": 0, "description": "Causal · Physical State Transition — accuracy (%)"}, {"key": "C02", "code": "C02", "label": "Structural Damage", "dimension": "causal", "subcategory": "causal_common_sense_knowledge", "case_count": 27, "multi_image_case_count": 0, "description": "Causal · Structural Damage — accuracy (%)"}, {"key": "C03", "code": "C03", "label": "Flexible Deformation", "dimension": "causal", "subcategory": "causal_common_sense_knowledge", "case_count": 22, "multi_image_case_count": 1, "description": "Causal · Flexible Deformation — accuracy (%)"}, {"key": "C04", "code": "C04", "label": "Magnitude Change", "dimension": "causal", "subcategory": "causal_context_knowledge", "case_count": 10, "multi_image_case_count": 0, "description": "Causal · Magnitude Change — accuracy (%)"}, {"key": "C05", "code": "C05", "label": "Reading Offset", "dimension": "causal", "subcategory": "causal_context_knowledge", "case_count": 10, "multi_image_case_count": 2, "description": "Causal · Reading Offset — accuracy (%)"}, {"key": "C06", "code": "C06", "label": "Order Relation", "dimension": "causal", "subcategory": "causal_context_knowledge", "case_count": 10, "multi_image_case_count": 0, "description": "Causal · Order Relation — accuracy (%)"}, {"key": "C07", "code": "C07", "label": "Feature Mapping", "dimension": "causal", "subcategory": "causal_context_knowledge", "case_count": 10, "multi_image_case_count": 0, "description": "Causal · Feature Mapping — accuracy (%)"}, {"key": "C08", "code": "C08", "label": "Physics", "dimension": "causal", "subcategory": "causal_disciplinary_knowledge", "case_count": 25, "multi_image_case_count": 1, "description": "Causal · Physics — accuracy (%)"}, {"key": "C09", "code": "C09", "label": "Chemistry", "dimension": "causal", "subcategory": "causal_disciplinary_knowledge", "case_count": 23, "multi_image_case_count": 4, "description": "Causal · Chemistry — accuracy (%)"}, {"key": "C10", "code": "C10", "label": "Biology", "dimension": "causal", "subcategory": "causal_disciplinary_knowledge", "case_count": 12, "multi_image_case_count": 0, "description": "Causal · Biology — accuracy (%)"}, {"key": "C11", "code": "C11", "label": "Astronomy", "dimension": "causal", "subcategory": "causal_disciplinary_knowledge", "case_count": 3, "multi_image_case_count": 0, "description": "Causal · Astronomy — accuracy (%)"}, {"key": "C12", "code": "C12", "label": "Medicine", "dimension": "causal", "subcategory": "causal_disciplinary_knowledge", "case_count": 4, "multi_image_case_count": 0, "description": "Causal · Medicine — accuracy (%)"}, {"key": "C13", "code": "C13", "label": "Music Theory", "dimension": "causal", "subcategory": "causal_disciplinary_knowledge", "case_count": 3, "multi_image_case_count": 0, "description": "Causal · Music Theory — accuracy (%)"}, {"key": "C14", "code": "C14", "label": "Computer Science", "dimension": "causal", "subcategory": "causal_disciplinary_knowledge", "case_count": 10, "multi_image_case_count": 0, "description": "Causal · Computer Science — accuracy (%)"}, {"key": "S01", "code": "S01", "label": "Adjacency", "dimension": "spatial", "subcategory": "spatial_relation", "case_count": 11, "multi_image_case_count": 0, "description": "Spatial · Adjacency — accuracy (%)"}, {"key": "S02", "code": "S02", "label": "Direction", "dimension": "spatial", "subcategory": "spatial_relation", "case_count": 11, "multi_image_case_count": 0, "description": "Spatial · Direction — accuracy (%)"}, {"key": "S03", "code": "S03", "label": "Orientation", "dimension": "spatial", "subcategory": "spatial_relation", "case_count": 11, "multi_image_case_count": 0, "description": "Spatial · Orientation — accuracy (%)"}, {"key": "S04", "code": "S04", "label": "Projection", "dimension": "spatial", "subcategory": "spatial_relation", "case_count": 12, "multi_image_case_count": 0, "description": "Spatial · Projection — accuracy (%)"}, {"key": "S05", "code": "S05", "label": "Distance", "dimension": "spatial", "subcategory": "spatial_relation", "case_count": 13, "multi_image_case_count": 0, "description": "Spatial · Distance — accuracy (%)"}, {"key": "S06", "code": "S06", "label": "Size", "dimension": "spatial", "subcategory": "spatial_relation", "case_count": 15, "multi_image_case_count": 0, "description": "Spatial · Size — accuracy (%)"}, {"key": "S07", "code": "S07", "label": "Configuration", "dimension": "spatial", "subcategory": "spatial_relation", "case_count": 18, "multi_image_case_count": 0, "description": "Spatial · Configuration — accuracy (%)"}, {"key": "S08", "code": "S08", "label": "Viewing Scale", "dimension": "spatial", "subcategory": "spatial_relation", "case_count": 9, "multi_image_case_count": 0, "description": "Spatial · Viewing Scale — accuracy (%)"}, {"key": "S09", "code": "S09", "label": "Localization", "dimension": "spatial", "subcategory": "spatial_relation", "case_count": 6, "multi_image_case_count": 6, "description": "Spatial · Localization — accuracy (%)"}, {"key": "S10", "code": "S10", "label": "Part-Whole Perception", "dimension": "spatial", "subcategory": "spatial_structure", "case_count": 24, "multi_image_case_count": 0, "description": "Spatial · Part-Whole Perception — accuracy (%)"}, {"key": "S11", "code": "S11", "label": "Geometric Regularities Reasoning", "dimension": "spatial", "subcategory": "spatial_structure", "case_count": 15, "multi_image_case_count": 0, "description": "Spatial · Geometric Regularities Reasoning — accuracy (%)"}, {"key": "S12", "code": "S12", "label": "Viewpoint Generation", "dimension": "spatial", "subcategory": "spatial_structure", "case_count": 26, "multi_image_case_count": 0, "description": "Spatial · Viewpoint Generation — accuracy (%)"}, {"key": "S13", "code": "S13", "label": "Environmental Structure Reasoning", "dimension": "spatial", "subcategory": "spatial_structure", "case_count": 19, "multi_image_case_count": 2, "description": "Spatial · Environmental Structure Reasoning — accuracy (%)"}, {"key": "S14", "code": "S14", "label": "Egocentric Scene Reconstruction", "dimension": "spatial", "subcategory": "spatial_structure", "case_count": 10, "multi_image_case_count": 10, "description": "Spatial · Egocentric Scene Reconstruction — accuracy (%)"}, {"key": "L01", "code": "L01", "label": "Path Searching", "dimension": "logical", "subcategory": "logical_explicit_rule_deduction", "case_count": 24, "multi_image_case_count": 0, "description": "Logical · Path Searching — accuracy (%)"}, {"key": "L02", "code": "L02", "label": "Mathematical Derivation", "dimension": "logical", "subcategory": "logical_explicit_rule_deduction", "case_count": 27, "multi_image_case_count": 0, "description": "Logical · Mathematical Derivation — accuracy (%)"}, {"key": "L03", "code": "L03", "label": "Game Deduction", "dimension": "logical", "subcategory": "logical_explicit_rule_deduction", "case_count": 37, "multi_image_case_count": 0, "description": "Logical · Game Deduction — accuracy (%)"}, {"key": "L04", "code": "L04", "label": "Puzzle Solving", "dimension": "logical", "subcategory": "logical_explicit_rule_deduction", "case_count": 35, "multi_image_case_count": 0, "description": "Logical · Puzzle Solving — accuracy (%)"}, {"key": "L05", "code": "L05", "label": "Pattern Prediction", "dimension": "logical", "subcategory": "logical_implicit_pattern_induction", "case_count": 39, "multi_image_case_count": 0, "description": "Logical · Pattern Prediction — accuracy (%)"}, {"key": "L06", "code": "L06", "label": "Visual Oddity Detection", "dimension": "logical", "subcategory": "logical_implicit_pattern_induction", "case_count": 18, "multi_image_case_count": 0, "description": "Logical · Visual Oddity Detection — accuracy (%)"}, {"key": "L07", "code": "L07", "label": "Rule Transfer", "dimension": "logical", "subcategory": "logical_implicit_pattern_induction", "case_count": 20, "multi_image_case_count": 20, "description": "Logical · Rule Transfer — accuracy (%)"}, {"key": "F01", "code": "F01", "label": "Physical Counterfactual", "dimension": "counterfactual", "subcategory": "counterfactual_counterfactual_imagination", "case_count": 23, "multi_image_case_count": 0, "description": "Counterfactual · Physical Counterfactual — accuracy (%)"}, {"key": "F02", "code": "F02", "label": "Chemical Counterfactual", "dimension": "counterfactual", "subcategory": "counterfactual_counterfactual_imagination", "case_count": 9, "multi_image_case_count": 0, "description": "Counterfactual · Chemical Counterfactual — accuracy (%)"}, {"key": "F03", "code": "F03", "label": "Biological Counterfactual", "dimension": "counterfactual", "subcategory": "counterfactual_counterfactual_imagination", "case_count": 8, "multi_image_case_count": 0, "description": "Counterfactual · Biological Counterfactual — accuracy (%)"}, {"key": "F04", "code": "F04", "label": "Astronomy Counterfactual", "dimension": "counterfactual", "subcategory": "counterfactual_counterfactual_imagination", "case_count": 7, "multi_image_case_count": 0, "description": "Counterfactual · Astronomy Counterfactual — accuracy (%)"}, {"key": "F05", "code": "F05", "label": "Geography Counterfactual", "dimension": "counterfactual", "subcategory": "counterfactual_counterfactual_imagination", "case_count": 8, "multi_image_case_count": 0, "description": "Counterfactual · Geography Counterfactual — accuracy (%)"}, {"key": "F06", "code": "F06", "label": "History Counterfactual", "dimension": "counterfactual", "subcategory": "counterfactual_counterfactual_imagination", "case_count": 7, "multi_image_case_count": 0, "description": "Counterfactual · History Counterfactual — accuracy (%)"}, {"key": "F07", "code": "F07", "label": "Music Theory Counterfactual", "dimension": "counterfactual", "subcategory": "counterfactual_counterfactual_imagination", "case_count": 4, "multi_image_case_count": 0, "description": "Counterfactual · Music Theory Counterfactual — accuracy (%)"}, {"key": "F08", "code": "F08", "label": "Computer Science Counterfactual", "dimension": "counterfactual", "subcategory": "counterfactual_counterfactual_imagination", "case_count": 4, "multi_image_case_count": 0, "description": "Counterfactual · Computer Science Counterfactual — accuracy (%)"}, {"key": "F09", "code": "F09", "label": "Anatomical Errors", "dimension": "counterfactual", "subcategory": "counterfactual_anomaly_correction_and_generation", "case_count": 10, "multi_image_case_count": 0, "description": "Counterfactual · Anatomical Errors — accuracy (%)"}, {"key": "F10", "code": "F10", "label": "Structural Anomalies", "dimension": "counterfactual", "subcategory": "counterfactual_anomaly_correction_and_generation", "case_count": 11, "multi_image_case_count": 0, "description": "Counterfactual · Structural Anomalies — accuracy (%)"}, {"key": "F11", "code": "F11", "label": "Relational Anomalies", "dimension": "counterfactual", "subcategory": "counterfactual_anomaly_correction_and_generation", "case_count": 9, "multi_image_case_count": 0, "description": "Counterfactual · Relational Anomalies — accuracy (%)"}], "links": {"paper": "https://arxiv.org/abs/2610.12343", "data": "https://huggingface.co/datasets/VisionXLab/RISEBench-plusplus", "outputs": "https://huggingface.co/datasets/VisionXLab/RISEBench-plusplus_Outputs", "github": "https://github.com/VisionXLab/RISEBench/tree/main/RISEBench%2B%2B"}, "judges": {"instruction_reasoning": "Gemini-3-Flash", "appearance_consistency": "Gemini-3-Flash", "visual_plausibility": "Gemini-3.1-Flash-Lite"}, "results_by_language": {"en": {"models": [{"id": "gpt-image-2-5-sunburst", "name": "GPT-Image-2.5 Sunburst"}, {"id": "nano-banana-pro", "name": "Nano Banana Pro"}, {"id": "nano-banana-2", "name": "Nano Banana 2"}, {"id": "gpt-image-2", "name": "GPT-Image-2"}, {"id": "gpt-image-2-5-flare", "name": "GPT-Image-2.5 Flare"}, {"id": "luma-uni-1", "name": "Luma Uni-1"}, {"id": "qwen-image-3-0", "name": "Qwen-Image-3.0"}, {"id": "nano-banana-2-lite", "name": "Nano Banana 2 Lite"}, {"id": "flux-2-max", "name": "FLUX.2 Max"}, {"id": "gpt-image-1-5", "name": "GPT-Image-1.5"}, {"id": "flux-2-pro", "name": "FLUX.2 Pro"}, {"id": "nano-banana", "name": "Nano Banana"}, {"id": "hunyuanimage-3-5", "name": "HunyuanImage-3.5"}, {"id": "wan2-7-image-pro", "name": "Wan2.7-Image-Pro"}, {"id": "gpt-image-1", "name": "GPT-Image-1"}, {"id": "qwen-image-2-0", "name": "Qwen-Image-2.0"}, {"id": "seedream-4-5", "name": "Seedream 4.5"}, {"id": "seedream-5-0", "name": "Seedream 5.0"}, {"id": "step-image-edit-2", "name": "Step Image Edit 2"}, {"id": "hunyuanimage-3-0-instruct", "name": "HunyuanImage-3.0-Instruct"}, {"id": "qwen-image-edit-2511", "name": "Qwen-Image-Edit-2511"}, {"id": "qwen-image-2-1", "name": "Qwen-Image-2.1"}, {"id": "firered-image-edit-1-0", "name": "FireRed-Image-Edit-1.0"}, {"id": "firered-image-edit-1-1", "name": "FireRed-Image-Edit-1.1"}, {"id": "qwen-image-edit-2509", "name": "Qwen-Image-Edit-2509"}, {"id": "hidream-o1-image", "name": "HiDream-O1-Image"}, {"id": "flux-2-dev", "name": "FLUX.2 Dev"}, {"id": "flux-2-klein-9b", "name": "FLUX.2 Klein 9B"}, {"id": "joyai-image-edit-plus", "name": "JoyAI-Image-Edit-Plus"}, {"id": "sensenova-u1-a3b-mot-sft", "name": "SenseNova-U1-A3B-MoT-SFT"}, {"id": "unipic-3-0", "name": "UniPic 3.0"}, {"id": "bagel-w-cot", "name": "BAGEL (w/ CoT)"}, {"id": "sensenova-u1-8b-mot-sft", "name": "SenseNova-U1-8B-MoT-SFT"}, {"id": "flux-2-klein-4b", "name": "FLUX.2 Klein 4B"}, {"id": "uniworld-v2", "name": "UniWorld-V2"}, {"id": "bagel", "name": "BAGEL"}, {"id": "omnigen2", "name": "OmniGen2"}, {"id": "omnigen", "name": "OmniGen"}, {"id": "emu2-gen", "name": "Emu2-Gen"}, {"id": "joyai-image-edit", "name": "JoyAI-Image-Edit"}, {"id": "step1x-edit-thinking", "name": "Step1X-Edit (thinking)"}, {"id": "boogu-image-0-1-edit", "name": "Boogu-Image-0.1-Edit"}, {"id": "step1x-edit-thinking-reflection", "name": "Step1X-Edit (thinking + reflection)"}, {"id": "longcat-image-edit", "name": "LongCat-Image-Edit"}, {"id": "step1x-edit-base", "name": "Step1X-Edit (base)"}, {"id": "internvl-u-w-cot", "name": "InternVL-U (w/ CoT)"}, {"id": "flux-1-kontext-dev", "name": "FLUX.1 Kontext Dev"}, {"id": "llada-image", "name": "LLaDA-Image"}, {"id": "ovis-u1", "name": "Ovis-U1"}, {"id": "internvl-u", "name": "InternVL-U"}, {"id": "unipic2-sd3-5m-kontext-2b", "name": "UniPic2-SD3.5M-Kontext-2B"}, {"id": "lumina-dimoo", "name": "Lumina-DiMOO"}, {"id": "uniworld-v1", "name": "UniWorld-V1"}, {"id": "rise-agent-ours", "name": "RISE-Agent (Ours)"}, {"id": "mindbrush", "name": "MindBrush"}, {"id": "interleavethinker", "name": "InterleaveThinker"}, {"id": "intentedit", "name": "IntentEdit"}, {"id": "imagent", "name": "ImAgent"}]}, "zh": {"models": [{"id": "gpt-image-2-5-sunburst", "name": "GPT-Image-2.5 Sunburst"}, {"id": "nano-banana-pro", "name": "Nano Banana Pro"}, {"id": "nano-banana-2", "name": "Nano Banana 2"}, {"id": "luma-uni-1", "name": "Luma Uni-1"}, {"id": "gpt-image-2", "name": "GPT-Image-2"}, {"id": "qwen-image-3-0", "name": "Qwen-Image-3.0"}, {"id": "gpt-image-2-5-flare", "name": "GPT-Image-2.5 Flare"}, {"id": "flux-2-max", "name": "FLUX.2 Max"}, {"id": "nano-banana-2-lite", "name": "Nano Banana 2 Lite"}, {"id": "gpt-image-1-5", "name": "GPT-Image-1.5"}, {"id": "nano-banana", "name": "Nano Banana"}, {"id": "flux-2-pro", "name": "FLUX.2 Pro"}, {"id": "hunyuanimage-3-5", "name": "HunyuanImage-3.5"}, {"id": "wan2-7-image-pro", "name": "Wan2.7-Image-Pro"}, {"id": "qwen-image-2-0", "name": "Qwen-Image-2.0"}, {"id": "seedream-4-5", "name": "Seedream 4.5"}, {"id": "seedream-5-0", "name": "Seedream 5.0"}, {"id": "gpt-image-1", "name": "GPT-Image-1"}, {"id": "step-image-edit-2", "name": "Step Image Edit 2"}, {"id": "hunyuanimage-3-0-instruct", "name": "HunyuanImage-3.0-Instruct"}, {"id": "qwen-image-2-1", "name": "Qwen-Image-2.1"}, {"id": "firered-image-edit-1-1", "name": "FireRed-Image-Edit-1.1"}, {"id": "flux-2-dev", "name": "FLUX.2 Dev"}, {"id": "qwen-image-edit-2511", "name": "Qwen-Image-Edit-2511"}, {"id": "qwen-image-edit-2509", "name": "Qwen-Image-Edit-2509"}, {"id": "firered-image-edit-1-0", "name": "FireRed-Image-Edit-1.0"}, {"id": "sensenova-u1-a3b-mot-sft", "name": "SenseNova-U1-A3B-MoT-SFT"}, {"id": "joyai-image-edit-plus", "name": "JoyAI-Image-Edit-Plus"}, {"id": "flux-2-klein-9b", "name": "FLUX.2 Klein 9B"}, {"id": "bagel-w-cot", "name": "BAGEL (w/ CoT)"}, {"id": "hidream-o1-image", "name": "HiDream-O1-Image"}, {"id": "flux-2-klein-4b", "name": "FLUX.2 Klein 4B"}, {"id": "uniworld-v2", "name": "UniWorld-V2"}, {"id": "sensenova-u1-8b-mot-sft", "name": "SenseNova-U1-8B-MoT-SFT"}, {"id": "unipic-3-0", "name": "UniPic 3.0"}, {"id": "bagel", "name": "BAGEL"}, {"id": "omnigen2", "name": "OmniGen2"}, {"id": "omnigen", "name": "OmniGen"}, {"id": "emu2-gen", "name": "Emu2-Gen"}, {"id": "joyai-image-edit", "name": "JoyAI-Image-Edit"}, {"id": "boogu-image-0-1-edit", "name": "Boogu-Image-0.1-Edit"}, {"id": "step1x-edit-thinking-reflection", "name": "Step1X-Edit (thinking + reflection)"}, {"id": "step1x-edit-thinking", "name": "Step1X-Edit (thinking)"}, {"id": "step1x-edit-base", "name": "Step1X-Edit (base)"}, {"id": "longcat-image-edit", "name": "LongCat-Image-Edit"}, {"id": "flux-1-kontext-dev", "name": "FLUX.1 Kontext Dev"}, {"id": "llada-image", "name": "LLaDA-Image"}, {"id": "internvl-u-w-cot", "name": "InternVL-U (w/ CoT)"}, {"id": "ovis-u1", "name": "Ovis-U1"}, {"id": "internvl-u", "name": "InternVL-U"}, {"id": "lumina-dimoo", "name": "Lumina-DiMOO"}, {"id": "uniworld-v1", "name": "UniWorld-V1"}, {"id": "unipic2-sd3-5m-kontext-2b", "name": "UniPic2-SD3.5M-Kontext-2B"}, {"id": "rise-agent-ours", "name": "RISE-Agent (Ours)"}, {"id": "mindbrush", "name": "MindBrush"}, {"id": "interleavethinker", "name": "InterleaveThinker"}, {"id": "intentedit", "name": "IntentEdit"}, {"id": "imagent", "name": "ImAgent"}]}}}, {"id": "risebench", "name": "RISEBench", "case_count": 360, "available_result_languages": ["en"], "accuracy_unit": "%", "metric_unit": "/100", "score_decimals": 1, "default_sort": "total", "dimensions": [{"key": "temporal", "label": "Temporal", "description": "Infer how a scene changes over time."}, {"key": "causal", "label": "Causal", "description": "Reason about causes, actions, and their consequences."}, {"key": "spatial", "label": "Spatial", "description": "Reason about spatial relationships and transformations."}, {"key": "logical", "label": "Logical", "description": "Apply explicit rules, patterns, and logical constraints."}], "metrics": [{"key": "instruction_reasoning", "label": "Instruction Reasoning", "description": "Whether the edit realizes the intended reasoning outcome."}, {"key": "appearance_consistency", "label": "Appearance Consistency", "description": "Whether content that should remain unchanged is preserved."}, {"key": "visual_plausibility", "label": "Visual Plausibility", "description": "Visual quality and plausibility; logical tasks are excluded."}], "accuracy_columns": [{"key": "temporal", "label": "Temporal", "description": "Infer how a scene changes over time."}, {"key": "causal", "label": "Causal", "description": "Reason about causes, actions, and their consequences."}, {"key": "spatial", "label": "Spatial", "description": "Reason about spatial relationships and transformations."}, {"key": "logical", "label": "Logical", "description": "Apply explicit rules, patterns, and logical constraints."}, {"key": "total", "label": "Overall", "description": "Accuracy on the complete RISEBench-360 benchmark."}], "links": {"paper": "https://arxiv.org/abs/2504.02826", "data": "https://huggingface.co/datasets/PhoenixZ/RISEBench", "outputs": "https://huggingface.co/datasets/zpy777/RISEBench_Outputs", "github": "https://github.com/VisionXLab/RISEBench/tree/main/RISEBench"}, "judges": {"instruction_reasoning": "GPT-4o", "appearance_consistency": "GPT-4o", "visual_plausibility": "GPT-4o"}, "results_by_language": {"en": {"models": [{"id": "gpt-image-1-5", "name": "GPT-Image-1.5"}, {"id": "gpt-image-2", "name": "GPT-Image-2"}, {"id": "gemini-3-pro-image-preview-nano-banana-pro", "name": "Gemini-3-pro-image-preview (Nano Banana-pro)"}, {"id": "gemini-2-5-flash-image-nano-banana", "name": "Gemini-2.5-Flash-Image (Nano Banana)"}, {"id": "gpt-image-1", "name": "GPT-Image-1"}, {"id": "gpt-image-1-mini", "name": "GPT-Image-1-mini"}, {"id": "qwen-image-edit-2511", "name": "Qwen-Image-Edit-2511"}, {"id": "bagel-w-cot", "name": "BAGEL (w/ CoT)"}, {"id": "gemini-2-0-flash-exp", "name": "Gemini-2.0-Flash-exp"}, {"id": "seedream-4-0", "name": "Seedream-4.0"}, {"id": "gemini-2-0-flash-pre", "name": "Gemini-2.0-Flash-pre"}, {"id": "qwen-image-edit-2509", "name": "Qwen-Image-Edit-2509"}, {"id": "bagel", "name": "BAGEL"}, {"id": "flux-1-kontext-dev", "name": "FLUX.1-Kontext-Dev"}, {"id": "ovis-u1", "name": "Ovis-U1"}, {"id": "step1x-edit", "name": "Step1X-Edit"}, {"id": "omnigen", "name": "OmniGen"}, {"id": "emu2", "name": "EMU2"}, {"id": "hidream-edit", "name": "HiDream-Edit"}, {"id": "flux-1-canny", "name": "FLUX.1-Canny"}]}}}]}</script><script src="portal.js" defer></script></body></html>
index.html CHANGED
The diff for this file is too large to render. See raw diff
 
portal.css ADDED
@@ -0,0 +1,87 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ .portal-width { width: min(1120px, calc(100% - 80px)); margin: auto; padding-bottom: 36px; }
2
+ .review-width { width: min(1420px, calc(100% - 80px)); }
3
+ .portal-nav { display: flex; justify-content: space-between; align-items: center; gap: 20px; padding: 28px 0; border-bottom: 1px solid #e1e7ee; }
4
+ .wordmark { font-size: 23px; font-weight: 750; letter-spacing: -.8px; color: #2d435b; }
5
+ .wordmark span { color: #617eaf; }
6
+ .portal-nav > div { display: flex; gap: 25px; align-items: center; font-size: 14px; color: #71819a; }
7
+ .portal-nav [aria-current] { color: #345777; font-weight: 650; }
8
+ .portal-heading { padding: 44px 0 30px; }
9
+ .portal-heading h1 { font-size: clamp(30px, 4vw, 43px); letter-spacing: -1.2px; line-height: 1.2; margin: 0 0 14px; font-weight: 650; color: #233b55; }
10
+ .portal-heading p { margin: 0; color: #79899b; font-size: 16px; }
11
+ .portal-card { padding: 30px; border: 1px solid #dfe6ef; background: white; box-shadow: 0 5px 28px #1f385105; border-radius: 17px; margin-bottom: 24px; }
12
+ .portal-card h2 { font-size: 20px; color: #304861; font-weight: 650; margin: 0; letter-spacing: -.25px; }
13
+ .card-heading { display: flex; align-items: center; justify-content: space-between; flex-wrap: wrap; gap: 14px; margin-bottom: 24px; }
14
+ .card-heading > span, .field-note { font-size: 13px; color: #8b98a7; }
15
+ .field-note { margin-top: -12px; margin-bottom: 20px; }
16
+ .form-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 23px 26px; }
17
+ .portal-width label:not(.upload-zone):not(.confirmation) { display: block; font-size: 14px; color: #4b6077; font-weight: 550; }
18
+ .portal-width input:not([type=checkbox]):not([type=file]), .portal-width select, .portal-width textarea { display: block; width: 100%; border: 1px solid #d5dfea; border-radius: 9px; padding: 12px 14px; font: inherit; font-size: 15px; line-height: 1.5; color: #2e4661; background: #fcfdff; margin-top: 8px; min-width: 0; }
19
+ .portal-width textarea { resize: vertical; }
20
+ .portal-width select { appearance: none; -webkit-appearance: none; padding-right: 46px; background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 16 16'%3E%3Cpath d='m4 6 4 4 4-4' fill='none' stroke='%237589a2' stroke-width='1.6' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E"); background-repeat: no-repeat; background-position: right 16px center; background-size: 16px; }
21
+ .portal-width input[readonly] { background: #f2f5f8; color: #657990; }
22
+ .portal-width input::placeholder, .portal-width textarea::placeholder { color: #a0acba; }
23
+ .portal-width input:focus, .portal-width select:focus, .portal-width textarea:focus { outline: 2px solid #dce6f3; outline-offset: 1px; border-color: #8aa4c7; }
24
+ .portal-width small { display: block; margin-top: 7px; color: #8a97a7; font-size: 12px; font-weight: 400; }
25
+ .optional { color: #9aa6b5; font-size: 11px; font-weight: 450; margin-left: 7px; }
26
+ .full-width { grid-column: 1 / -1; }
27
+ .upload-zone { display: flex; position: relative; flex-direction: column; align-items: center; justify-content: center; gap: 8px; min-height: 190px; padding: 28px; background: #f8faff; border: 1px dashed #b9cce3; border-radius: 12px; text-align: center; cursor: pointer; color: #506c8f; }
28
+ .upload-zone:hover, .upload-zone.dragging { background: #f0f5fc; border-color: #7f9dc1; }
29
+ .upload-zone input { position: absolute; inset: 0; width: 100%; height: 100%; opacity: 0; cursor: pointer; }
30
+ .upload-zone:focus-within { outline: 2px solid #7598c5; outline-offset: 3px; }
31
+ .upload-zone svg { width: 28px; height: 28px; stroke: #7b98bb; fill: none; stroke-width: 1.5; margin-bottom: 9px; }
32
+ .upload-zone strong { font-size: 16px; font-weight: 550; }
33
+ .upload-zone > span { font-size: 12px; color: #899bb2; }
34
+ .file-preview { padding: 14px 17px; border-radius: 9px; background: #eef5f4; color: #49706c; margin-top: 14px; font-size: 14px; }
35
+ .artifacts { margin-top: 27px; }
36
+ .confirmation { display: flex; align-items: flex-start; gap: 12px; padding-top: 25px; font-size: 13px; color: #728399; font-weight: 400; line-height: 1.7; }
37
+ .confirmation input { margin-top: 4px; }
38
+ .form-bottom { display: flex; align-items: center; justify-content: space-between; gap: 20px; margin-top: 23px; }
39
+ .portal-width .primary-button { background: #3d648e; border-radius: 9px; font-size: 15px; font-weight: 550; padding: 12px 22px; white-space: nowrap; }
40
+ .portal-width .primary-button:hover { background: #2c507a; }
41
+ .portal-width .outline-button { color: #5d748f; border-color: #d5dfeb; font-size: 14px; }
42
+ .form-message { margin: 0; font-size: 14px; color: #647e89; line-height: 1.65; overflow-wrap: anywhere; }
43
+ .form-message.error { color: #aa4a55; }
44
+ .notice { padding: 14px 18px; border: 1px solid #e1dded; background: #f4f1fa; color: #77708e; border-radius: 10px; font-size: 14px; margin: 0 0 24px; }
45
+ .receipt-card { background: #f1f7fc; border-color: #d1e0f0; }
46
+ .receipt-card p { color: #6f8399; font-size: 14px; }
47
+ .receipt-fields { display: grid; gap: 12px; margin: 24px 0; }
48
+ .receipt-fields code { display: block; overflow-wrap: anywhere; background: #ffffffa8; padding: 12px; border: 1px solid #dfe6ed; border-radius: 7px; color: #506580; font-size: 13px; }
49
+ .receipt-fields small { margin-bottom: 6px; }
50
+ .status-badge { display: inline-block; border-radius: 5px; padding: 3px 8px; background: #eff2f7; color: #6e8099; font-size: 11px; font-weight: 600; }
51
+ .status-badge.pending { background: #fff4dd; color: #a38249; }
52
+ .status-badge.approved { background: #eaf3ed; color: #5d8a70; }
53
+ .status-badge.rejected, .status-badge.withdrawn { background: #f7edef; color: #a6717b; }
54
+ .login-card { max-width: 510px; }
55
+ .login-card h2 { margin-bottom: 22px; }
56
+ .login-card .form-message { margin: 16px 0; }
57
+ .review-toolbar { display: flex; gap: 18px; justify-content: space-between; align-items: center; margin-bottom: 24px; }
58
+ .review-filters { display: flex; gap: 6px; flex-wrap: wrap; }
59
+ .review-filters button { padding: 8px 12px; border: 1px solid transparent; border-radius: 7px; color: #8190a4; font-size: 14px; }
60
+ .review-filters button[aria-pressed=true] { background: #e9eff8; color: #45678d; border-color: #d1ddef; }
61
+ .review-filters span { margin-left: 6px; font-size: 12px; }
62
+ .review-layout { display: grid; grid-template-columns: 300px minmax(0, 1fr); gap: 24px; }
63
+ .review-list { display: flex; flex-direction: column; gap: 12px; }
64
+ .submission-item { display: block; text-align: left; width: 100%; padding: 17px; border: 1px solid #dfe5ef; border-radius: 11px; background: white; }
65
+ .submission-item[aria-pressed=true] { border-color: #91adce; background: #f1f6fd; box-shadow: 0 0 0 2px #e6edf7; }
66
+ .submission-item strong { display: block; font-size: 15px; font-weight: 600; color: #3f5773; line-height: 1.5; overflow-wrap: anywhere; }
67
+ .submission-item p { font-size: 12px; color: #8896a9; margin: 6px 0 10px; }
68
+ .review-detail { min-height: 310px; }
69
+ .review-empty { text-align: center; padding: 48px 15px; color: #8b9aad; }
70
+ .review-empty p { font-size: 14px; }
71
+ .review-meta { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 18px; margin: 23px 0; font-size: 14px; }
72
+ .review-meta dt { font-size: 11px; text-transform: uppercase; letter-spacing: .8px; color: #96a3b4; margin-bottom: 5px; }
73
+ .review-meta dd { margin: 0; color: #546c84; overflow-wrap: anywhere; }
74
+ .review-meta a { color: #4675a5; text-decoration: underline; text-underline-offset: 3px; }
75
+ .review-notes { white-space: pre-wrap; color: #7f8fa3; background: #f6f8fb; padding: 14px; border-radius: 8px; font-size: 13px; margin-bottom: 24px; }
76
+ .review-scores { width: 100%; border-collapse: collapse; margin: 20px 0 26px; font-size: 14px; }
77
+ .review-scores th, .review-scores td { padding: 10px 12px; border-bottom: 1px solid #e7ecf2; text-align: right; color: #526a85; }
78
+ .review-scores th:first-child, .review-scores td:first-child { text-align: left; }
79
+ .review-scores th { font-weight: 550; color: #8898aa; font-size: 12px; background: #f7f9fc; }
80
+ .review-scores .score-section th { color: #7085a0; background: #edf2f9; padding-block: 8px; }
81
+ .changed-score { color: #405f8e !important; font-weight: 700; background: #f1f5fb; }
82
+ .review-actions { display: flex; flex-wrap: wrap; gap: 10px; margin-top: 22px; }
83
+ .reject-button { color: #9f6470 !important; border-color: #e7cfd5 !important; }
84
+ .history-list { color: #8292a4; font-size: 12px; padding-left: 20px; }
85
+ .submit-link { color: #456a93 !important; }
86
+ @media (max-width: 900px) { .review-layout { grid-template-columns: 1fr; } .review-list { display: grid; grid-template-columns: repeat(2,minmax(0,1fr)); } }
87
+ @media (max-width: 640px) { .portal-width { width: calc(100% - 32px); } .portal-nav { padding-block: 22px; } .portal-nav > div { gap: 13px; font-size: 12px; } .wordmark { font-size: 20px; } .portal-heading { padding-top: 32px; } .portal-card { padding: 21px 17px; } .form-grid, .review-meta, .review-list { grid-template-columns: 1fr; } .form-bottom { flex-direction: column; align-items: stretch; } .review-toolbar { flex-wrap: wrap; } .card-heading > span { font-size: 11px; } .review-scores th, .review-scores td { padding: 9px 6px; font-size: 12px; } }
portal.js ADDED
@@ -0,0 +1,148 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ 'use strict';
2
+ (() => {
3
+ const $=s=>document.querySelector(s), $$=s=>[...document.querySelectorAll(s)];
4
+ const schema=JSON.parse($('#submission-schema').textContent);
5
+ const esc=v=>String(v??'').replace(/[&<>"']/g,c=>({'&':'&amp;','<':'&lt;','>':'&gt;','"':'&quot;',"'":'&#39;'}[c]));
6
+ const labels={pending:'Pending review',approved:'Approved',rejected:'Returned',withdrawn:'Withdrawn'};
7
+ const language=code=>code==='zh'?'Chinese':'English';
8
+ const format=value=>value==null?'—':value.toFixed(1);
9
+ const bById=id=>schema.benchmarks.find(b=>b.id===id);
10
+ const message=(selector,value,error=false)=>{const el=$(selector);el.textContent=value;el.classList.toggle('error',error);};
11
+ let config=null, token=sessionStorage.getItem('rise-review-session')||'';
12
+ async function api(path,body,admin=false) {
13
+ const response=await fetch(path,{method:body===undefined?'GET':'POST',cache:'no-store',headers:{...(body===undefined?{}:{'Content-Type':'application/json'}),...(admin?{Authorization:'Bearer '+token}:{})},...(body===undefined?{}:{body:JSON.stringify(body)})});
14
+ let data;try{data=await response.json();}catch(_){throw new Error('The submission service is not available.');}
15
+ if(!response.ok){const e=new Error(typeof data.detail==='string'?data.detail:'The request could not be completed.');e.status=response.status;throw e;}
16
+ return data;
17
+ }
18
+ function download(filename,data) {
19
+ const url=URL.createObjectURL(new Blob([JSON.stringify(data,null,2)+'\n'],{type:'application/json'}));
20
+ const a=document.createElement('a');a.href=url;a.download=filename;document.body.appendChild(a);a.click();a.remove();setTimeout(()=>URL.revokeObjectURL(url),1000);
21
+ }
22
+ async function connect() {
23
+ try{
24
+ config=await api('/api/config');
25
+ if(config.local_preview){$('#service-notice').hidden=false;$('#service-notice').textContent='Local preview · submissions and review decisions stay on this computer.';}
26
+ }catch(_){$('#service-notice').hidden=false;$('#service-notice').textContent='The submission service is offline. You can browse the form and download a template.';}
27
+ return config;
28
+ }
29
+ function makeTemplate(b) {
30
+ const data={accuracy:Object.fromEntries(b.accuracy_columns.map(c=>[c.label,null])),metrics:Object.fromEntries(b.metrics.map(c=>[c.label,null]))};
31
+ for(const [field,columns] of [['subcategories','subcategory_columns'],['task_types','task_type_columns']])if(b[columns]){
32
+ data[field]={};for(const c of b[columns]){const d=c.dimension[0].toUpperCase()+c.dimension.slice(1);(data[field][d]??={})[c.label]=null;}
33
+ }
34
+ return data;
35
+ }
36
+ if(document.body.dataset.page==='submit') {
37
+ const form=$('#submission-form');let result=null,receipt=null,fileSequence=0;
38
+ const entryParams=new URLSearchParams(location.search);
39
+ if(bById(entryParams.get('benchmark')))form.elements.benchmark.value=entryParams.get('benchmark');
40
+ if(['en','zh'].includes(entryParams.get('language')))form.elements.language.value=entryParams.get('language');
41
+ let models=schema,plusInputSupport=form.elements.multi_image.value;
42
+ const currentBenchmark=()=>bById(form.elements.benchmark.value);
43
+ function updateRevision() {
44
+ const b=models.benchmarks.find(b=>b.id===form.elements.benchmark.value);
45
+ const list=b.results_by_language[form.elements.language.value]?.models||[];
46
+ $('#submission-revision').innerHTML='<option value="">New result</option>'+list.map(m=>`<option value="${esc(m.id)}">${esc(m.name)}</option>`).join('');
47
+ }
48
+ function updateBenchmark() {
49
+ const singleImageOnly=currentBenchmark().id==='risebench';
50
+ form.elements.multi_image.value=singleImageOnly?'false':plusInputSupport;
51
+ form.elements.multi_image.hidden=singleImageOnly;
52
+ form.elements.multi_image.disabled=singleImageOnly;
53
+ $('#single-image-input').hidden=!singleImageOnly;
54
+ const selected=form.elements.language.value;
55
+ $('#submission-language').innerHTML=currentBenchmark().available_result_languages.map(code=>`<option value="${code}">${language(code)}</option>`).join('');
56
+ if(currentBenchmark().available_result_languages.includes(selected))form.elements.language.value=selected;
57
+ updateRevision();
58
+ }
59
+ $('#submission-benchmark').addEventListener('change',updateBenchmark);
60
+ form.elements.multi_image.addEventListener('change',()=>{plusInputSupport=form.elements.multi_image.value;});
61
+ $('#submission-language').addEventListener('change',updateRevision);
62
+ $('#submission-revision').addEventListener('change',()=>{const option=$('#submission-revision').selectedOptions[0];if(option.value)form.elements.model_name.value=option.textContent;});
63
+ $('#download-template').addEventListener('click',()=>download(currentBenchmark().id+'-results-template.json',makeTemplate(currentBenchmark())));
64
+ async function readFile(file) {
65
+ const sequence=++fileSequence;result=null;$('#file-preview').hidden=true;$('#result-file').setCustomValidity('');
66
+ if(!file)return;
67
+ try{
68
+ if(!file.name.toLowerCase().endsWith('.json')||file.size>200000)throw new Error('Choose a JSON file no larger than 200 KB.');
69
+ const value=JSON.parse(await file.text());
70
+ if(sequence!==fileSequence)return;
71
+ if(!value||Array.isArray(value)||typeof value!=='object'||!value.accuracy)throw new Error('Use the result JSON template, including its accuracy section.');
72
+ result=value;$('#upload-title').textContent=file.name;$('#upload-caption').textContent=(file.size/1024).toFixed(1)+' KB · JSON loaded';
73
+ const count=JSON.stringify(value).match(/:\s*\d+(?:\.\d+)?/g)?.length||0;
74
+ $('#file-preview').hidden=false;$('#file-preview').textContent=`${count} score values loaded. Fields and benchmark compatibility will be checked on submission.`;
75
+ message('#submission-message','');
76
+ }catch(error){$('#result-file').setCustomValidity(error.message);message('#submission-message',error.message,true);}
77
+ }
78
+ $('#result-file').addEventListener('change',e=>readFile(e.target.files[0]));
79
+ const zone=$('#upload-zone');zone.addEventListener('dragover',e=>{e.preventDefault();zone.classList.add('dragging');});zone.addEventListener('dragleave',()=>zone.classList.remove('dragging'));
80
+ zone.addEventListener('drop',e=>{e.preventDefault();zone.classList.remove('dragging');if(e.dataTransfer.files.length!==1){message('#submission-message','Choose one result JSON file.',true);return;}$('#result-file').files=e.dataTransfer.files;readFile(e.dataTransfer.files[0]);});
81
+ form.addEventListener('submit',async e=>{
82
+ e.preventDefault();if(!result){message('#submission-message','Choose a result JSON file first.',true);return;}
83
+ if(!config){message('#submission-message','The submission service is offline.',true);return;}
84
+ const button=$('#submit-results');button.disabled=true;message('#submission-message','Validating and submitting…');
85
+ const body=Object.fromEntries(new FormData(form));body.multi_image=currentBenchmark().id!=='risebench'&&form.elements.multi_image.value==='true';body.full_dataset=body.full_dataset==='on';body.results=result;
86
+ try{
87
+ receipt=await api('/api/submissions',body);
88
+ const card=$('#submission-receipt');card.hidden=false;
89
+ card.innerHTML=`<span class="status-badge pending">Pending review</span><h2 style="margin-top:16px">Results received.</h2><p>Save this receipt to check the review status. Results will appear on the leaderboard only after approval.</p><div class="receipt-fields"><div><small>Submission ID</small><code>${esc(receipt.submission_id)}</code></div><div><small>Private receipt key</small><code>${esc(receipt.status_token)}</code></div></div><button type="button" id="save-receipt" class="outline-button">Save receipt ↓</button>`;
90
+ $('#save-receipt').addEventListener('click',()=>download('rise-submission-receipt.json',receipt));
91
+ $('#status-form').elements.submission_id.value=receipt.submission_id;$('#status-form').elements.status_token.value=receipt.status_token;
92
+ form.hidden=true;card.scrollIntoView({behavior:'smooth',block:'start'});message('#submission-message','');
93
+ }catch(error){message('#submission-message',error.message,true);}finally{button.disabled=false;}
94
+ });
95
+ $('#status-form').addEventListener('submit',async e=>{e.preventDefault();try{const r=await api('/api/submission-status',Object.fromEntries(new FormData(e.currentTarget)));message('#status-result',`${r.model_name} — ${labels[r.status]}. ${r.review_note||''}`);}catch(error){message('#status-result',error.message,true);}});
96
+ updateBenchmark();connect().then(async()=>{if(!config){$('#submit-results').disabled=true;return;}try{models=await api('/api/leaderboard');updateRevision();}catch(_){}});
97
+ } else {
98
+ let records=[],filter='pending',selected=null,live=schema;
99
+ const current=()=>records.find(r=>r.id===selected);
100
+ function signOutView() {
101
+ token='';sessionStorage.removeItem('rise-review-session');records=[];selected=null;
102
+ $('#login-panel').hidden=false;$('#review-workspace').hidden=true;$('#sign-out').hidden=true;
103
+ $('#review-list').innerHTML='';$('#review-detail').innerHTML='';
104
+ }
105
+ async function loadQueue() {
106
+ try{
107
+ [records,live]=await Promise.all([api('/api/admin/submissions',undefined,true),api('/api/leaderboard')]);
108
+ $('#login-panel').hidden=true;$('#review-workspace').hidden=false;$('#sign-out').hidden=false;
109
+ $('#pending-count').textContent=records.filter(r=>r.status==='pending').length;
110
+ message('#queue-message','');renderQueue();
111
+ }catch(error){if(error.status===401)signOutView();message(token?'#queue-message':'#login-message',error.message,true);}
112
+ }
113
+ function renderQueue() {
114
+ const items=records.filter(r=>filter==='all'||r.status===filter);
115
+ if(!items.some(r=>r.id===selected))selected=items[0]?.id||null;
116
+ $('#review-list').innerHTML=items.length?items.map(r=>`<button class="submission-item" data-record="${r.id}" aria-pressed="${selected===r.id}"><strong>${esc(r.payload.model_name)}</strong><p>${esc(bById(r.payload.benchmark).name)} · ${language(r.payload.language)}${r.payload.revision_of?' · Update':''}</p><span class="status-badge ${r.status}">${labels[r.status]}</span></button>`).join(''):'<div class="review-empty"><h2>No submissions</h2><p>New results will appear here.</p></div>';
117
+ renderDetail();
118
+ }
119
+ function scoreTable(record) {
120
+ const p=record.payload,b=bById(p.benchmark);
121
+ const previous=p.revision_of?live.benchmarks.find(x=>x.id===p.benchmark).results_by_language[p.language].models.find(m=>m.id===p.revision_of):null;
122
+ const sections=[['Reasoning accuracy','accuracy',b.accuracy_columns],['Evaluation scores','metrics',b.metrics],['Subcategory accuracy','subcategories',b.subcategory_columns||[]],['Task-type accuracy','task_types',b.task_type_columns||[]]];
123
+ return `<table class="review-scores"><thead><tr><th>Score</th>${previous?'<th>Published</th>':''}<th>Submitted</th></tr></thead><tbody>`+sections.map(([label,field,columns])=>{
124
+ const visible=columns.filter(c=>p[field]?.[c.key]!=null||field==='accuracy');
125
+ if(!visible.length)return '';
126
+ return `<tr class="score-section"><th colspan="${previous?3:2}">${label}</th></tr>`+visible.map(c=>{const value=p[field]?.[c.key],old=previous?.[field]?.[c.key];return `<tr><td>${esc((c.dimension?c.dimension[0].toUpperCase()+c.dimension.slice(1)+' · ':'')+c.label)}</td>${previous?`<td>${format(old)}</td>`:''}<td class="${previous&&old!==value?'changed-score':''}">${format(value)}</td></tr>`;}).join('');
127
+ }).join('')+'</tbody></table>';
128
+ }
129
+ function renderDetail() {
130
+ const r=current();if(!r){$('#review-detail').innerHTML='<div class="review-empty"><h2>Ready for review</h2><p>Select a submission to inspect its results.</p></div>';return;}
131
+ const p=r.payload,active=['pending','approved'].includes(r.status);
132
+ $('#review-detail').innerHTML=`<div class="card-heading"><h2>${esc(p.model_name)}</h2><span class="status-badge ${r.status}">${labels[r.status]}</span></div><dl class="review-meta"><div><dt>Benchmark</dt><dd>${esc(bById(p.benchmark).name)} · ${language(p.language)}</dd></div><div><dt>Input support</dt><dd>${p.multi_image?'Multiple input images':'Single input image'}</dd></div><div><dt>Team</dt><dd>${esc(p.team||'Not specified')}</dd></div><div><dt>Contact · private</dt><dd>${esc(p.email)}</dd></div><div><dt>Project</dt><dd><a href="${esc(p.project_url)}" target="_blank" rel="noopener noreferrer">Open project ↗</a></dd></div><div><dt>Evaluation artifacts</dt><dd><a href="${esc(p.evidence_url)}" target="_blank" rel="noopener noreferrer">Inspect results ↗</a></dd></div><div><dt>Submitted</dt><dd>${esc(new Date(r.submitted_at).toLocaleString())}</dd></div><div><dt>Model category</dt><dd>${esc({open:'Open-source',closed:'Closed-source',agentic:'Agentic method'}[p.group])}</dd></div></dl>${p.revision_of?'<p class="notice">This update replaces an existing result. Verify the submitter’s authority before approval.</p>':''}${p.notes?`<div class="review-notes">${esc(p.notes)}</div>`:''}${scoreTable(r)}<button class="outline-button" id="download-review-json">Download submission ↓</button>${active?`<form id="review-form"><label style="margin-top:24px">Review note<textarea id="review-note" rows="3" maxlength="3000" placeholder="Required when returning or withdrawing results; visible to the submitter"></textarea></label><label class="confirmation"><input id="review-confirmed" type="checkbox" required><span>${r.status==='pending'?'I have checked the evaluation artifacts, full-dataset protocol, and submitter’s authority.':'I confirm this approved result should be withdrawn from the leaderboard.'}</span></label><p class="form-message" id="review-message" role="status"></p><div class="review-actions">${r.status==='pending'?'<button type="submit" class="primary-button" value="approve">Approve & publish</button><button type="submit" class="outline-button reject-button" value="reject">Return to submitter</button>':'<button type="submit" class="outline-button reject-button" value="withdraw">Withdraw result</button>'}</div></form>`:''}${r.history.length?`<h3 style="font-size:14px;margin-top:28px">Review history</h3><ul class="history-list">${r.history.map(h=>`<li>${esc(h.decision)} · ${esc(new Date(h.at).toLocaleString())}${h.note?' — '+esc(h.note):''}</li>`).join('')}</ul>`:''}`;
133
+ $('#download-review-json').addEventListener('click',()=>download('rise-submission-'+r.id+'.json',r));
134
+ $('#review-form')?.addEventListener('submit',async e=>{
135
+ e.preventDefault();const decision=e.submitter.value,note=$('#review-note').value.trim();
136
+ if(decision!=='approve'&&!note){message('#review-message','Add a review note explaining this decision.',true);return;}
137
+ $$('#review-form button').forEach(b=>b.disabled=true);
138
+ try{await api('/api/admin/submissions/'+r.id+'/review',{decision,note,revision:r.revision,confirmed:$('#review-confirmed').checked},true);await loadQueue();message('#queue-message',decision==='approve'?'Approved. The result is now on the leaderboard.':decision==='reject'?'Returned. The submitter can read your note using their receipt.':'Withdrawn from the leaderboard.');}
139
+ catch(error){message('#review-message',error.message,true);$$('#review-form button').forEach(b=>b.disabled=false);}
140
+ });
141
+ }
142
+ document.addEventListener('click',e=>{const button=e.target.closest('button');if(!button)return;if(button.dataset.record){selected=button.dataset.record;renderQueue();}if(button.dataset.status){filter=button.dataset.status;$$('[data-status]').forEach(b=>b.setAttribute('aria-pressed',b.dataset.status===filter));renderQueue();}});
143
+ $('#login-form').addEventListener('submit',async e=>{e.preventDefault();$('#login-button').disabled=true;try{const r=await api('/api/admin/session',{password:$('#admin-passphrase').value});token=r.token;sessionStorage.setItem('rise-review-session',token);$('#admin-passphrase').value='';await loadQueue();}catch(error){message('#login-message',error.message,true);}finally{$('#login-button').disabled=false;}});
144
+ $('#sign-out').addEventListener('click',async()=>{try{await api('/api/admin/logout',{},true);}finally{signOutView();}});
145
+ $('#refresh-queue').addEventListener('click',loadQueue);
146
+ connect().then(()=>{if(!config){$('#login-button').disabled=true;return;}if(config.local_preview){$('#passphrase-label').hidden=true;$('#admin-passphrase').required=false;$('#login-button').textContent='Open local review';}if(token)loadQueue();});
147
+ }
148
+ })();
pyproject.toml ADDED
@@ -0,0 +1,15 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [build-system]
2
+ requires = ["setuptools>=68"]
3
+ build-backend = "setuptools.build_meta"
4
+
5
+ [project]
6
+ name = "rise-leaderboard"
7
+ version = "0.1.0"
8
+ requires-python = ">=3.9"
9
+ dependencies = ["fastapi==0.128.8", "uvicorn==0.39.0", "huggingface_hub==1.8.0"]
10
+
11
+ [project.optional-dependencies]
12
+ test = ["httpx==0.28.1"]
13
+
14
+ [tool.setuptools]
15
+ packages = ["server"]
scripts/serve.py ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env python3
2
+ """Run a loopback-only local review preview, or a configured production service."""
3
+ import argparse
4
+ import sys
5
+ from pathlib import Path
6
+
7
+ sys.path.insert(0, str(Path(__file__).resolve().parents[1]))
8
+ import uvicorn
9
+ from server.app import create_app, Settings
10
+
11
+ if __name__ == "__main__":
12
+ parser = argparse.ArgumentParser(description=__doc__)
13
+ parser.add_argument("--local", action="store_true", help="Loopback-only preview; local review needs no passphrase")
14
+ parser.add_argument("--port", type=int, default=7860)
15
+ args = parser.parse_args()
16
+ app = create_app(Settings(local=args.local))
17
+ print(f"Leaderboard: http://127.0.0.1:{args.port}")
18
+ print(f"Submit: http://127.0.0.1:{args.port}/submit.html")
19
+ print(f"Review: http://127.0.0.1:{args.port}/admin.html")
20
+ uvicorn.run(app, host="127.0.0.1" if args.local else "0.0.0.0", port=args.port,
21
+ proxy_headers=not args.local, access_log=False)
server/__init__.py ADDED
@@ -0,0 +1 @@
 
 
1
+ """Submission and moderation service for the RISE leaderboard."""
server/app.py ADDED
@@ -0,0 +1,267 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Private submissions, explicit moderation, and approved-only leaderboard data."""
2
+ import copy
3
+ import hashlib
4
+ import json
5
+ import logging
6
+ import os
7
+ import secrets
8
+ import threading
9
+ import time
10
+ import uuid
11
+ from collections import defaultdict, deque
12
+ from datetime import datetime, timezone
13
+ from pathlib import Path
14
+ from urllib.parse import urlsplit
15
+
16
+ from fastapi import FastAPI, HTTPException, Request
17
+ from fastapi.responses import JSONResponse
18
+ from fastapi.staticfiles import StaticFiles
19
+
20
+ from .storage import HubStore, LocalStore
21
+ from .validation import Invalid, public_leaderboard, template, text, validate_submission
22
+
23
+ ROOT = Path(__file__).resolve().parents[1]
24
+ MAX_BODY = 262144
25
+ SESSION_SECONDS = 8 * 3600
26
+
27
+
28
+ def now():
29
+ return datetime.now(timezone.utc).isoformat()
30
+
31
+
32
+ def digest(value):
33
+ return hashlib.sha256(value.encode()).hexdigest()
34
+
35
+
36
+ def strict_json(raw):
37
+ def pairs(items):
38
+ result = {}
39
+ for key, value in items:
40
+ if key in result:
41
+ raise ValueError("Duplicate JSON keys are not allowed.")
42
+ result[key] = value
43
+ return result
44
+ def invalid_constant(value):
45
+ raise ValueError("Non-finite JSON numbers are not allowed.")
46
+ return json.loads(raw, object_pairs_hook=pairs, parse_constant=invalid_constant)
47
+
48
+
49
+ class Settings:
50
+ def __init__(self, local=False, state_dir=None):
51
+ self.local = local
52
+ self.password = os.environ.get("RISE_ADMIN_PASSWORD", "")
53
+ self.origin = os.environ.get("RISE_PUBLIC_ORIGIN", "").rstrip("/")
54
+ self.repo = os.environ.get("RISE_SUBMISSIONS_REPO", "")
55
+ self.token = os.environ.get("RISE_STORAGE_TOKEN", "")
56
+ self.state_dir = Path(state_dir or ROOT / ".local")
57
+ if not local:
58
+ if len(self.password) < 20:
59
+ raise RuntimeError("Set RISE_ADMIN_PASSWORD to a private passphrase of at least 20 characters.")
60
+ if not self.origin.startswith("https://") or urlsplit(self.origin).path:
61
+ raise RuntimeError("Set RISE_PUBLIC_ORIGIN to the https origin of the Space app.")
62
+ if not self.repo or not self.token:
63
+ raise RuntimeError("Set RISE_SUBMISSIONS_REPO and RISE_STORAGE_TOKEN for durable private storage.")
64
+
65
+
66
+ def create_app(settings=None, store=None, base=None):
67
+ settings = settings or Settings()
68
+ store = store or (LocalStore(settings.state_dir) if settings.local else HubStore(settings.repo, settings.token))
69
+ base = base or json.loads((ROOT / "dist/data/leaderboard.json").read_text())
70
+ app = FastAPI(docs_url=None, redoc_url=None, openapi_url=None)
71
+ sessions, attempts = {}, defaultdict(deque)
72
+ security_lock = threading.Lock()
73
+
74
+ def rate_limit(request, scope, limit, window=3600):
75
+ # Do not trust arbitrary X-Forwarded-For values. Uvicorn decides which proxy to trust.
76
+ address = request.client.host if request.client else "unknown"
77
+ key = (scope, address)
78
+ stamp = time.monotonic()
79
+ with security_lock:
80
+ for stale in [k for k, values in attempts.items() if not values or stamp-values[-1] > window]:
81
+ attempts.pop(stale, None)
82
+ queue = attempts[key]
83
+ while queue and stamp-queue[0] > window:
84
+ queue.popleft()
85
+ if len(queue) >= limit:
86
+ raise HTTPException(429, "Too many requests. Please try again later.")
87
+ queue.append(stamp)
88
+
89
+ def require_admin(request):
90
+ token = request.headers.get("authorization", "").removeprefix("Bearer ")
91
+ with security_lock:
92
+ for key in [key for key, expiry in sessions.items() if expiry <= time.monotonic()]:
93
+ sessions.pop(key, None)
94
+ if not token or sessions.get(digest(token), 0) <= time.monotonic():
95
+ raise HTTPException(401, "Sign in to review submissions.")
96
+ return token
97
+
98
+ def payload(request):
99
+ value = getattr(request.state, "json", None)
100
+ if not isinstance(value, dict):
101
+ raise HTTPException(400, "Expected a JSON object.")
102
+ return value
103
+
104
+ @app.exception_handler(Invalid)
105
+ async def validation_error(request, error):
106
+ return JSONResponse({"detail": str(error)}, status_code=422)
107
+
108
+ @app.middleware("http")
109
+ async def guard(request, call_next):
110
+ host = request.url.hostname
111
+ if settings.local:
112
+ if host not in {"127.0.0.1", "localhost", "testserver"} or request.client.host not in {"127.0.0.1", "::1", "testclient"}:
113
+ return JSONResponse({"detail": "Local preview is available only on this computer."}, status_code=403)
114
+ elif host != urlsplit(settings.origin).hostname:
115
+ return JSONResponse({"detail": "Invalid host."}, status_code=400)
116
+ if request.method == "POST":
117
+ origin = request.headers.get("origin")
118
+ expected = str(request.base_url).rstrip("/") if settings.local else settings.origin
119
+ if origin and origin != expected:
120
+ return JSONResponse({"detail": "Cross-origin submissions are not accepted."}, status_code=403)
121
+ if request.headers.get("content-type", "").split(";")[0] != "application/json":
122
+ return JSONResponse({"detail": "Use application/json."}, status_code=415)
123
+ content = bytearray()
124
+ async for chunk in request.stream():
125
+ content.extend(chunk)
126
+ if len(content) > MAX_BODY:
127
+ return JSONResponse({"detail": "Submission exceeds the 256 KB limit."}, status_code=413)
128
+ try:
129
+ request.state.json = strict_json(content)
130
+ except (ValueError, UnicodeError, RecursionError):
131
+ return JSONResponse({"detail": "Invalid JSON. Check syntax, duplicate fields and numeric values."}, status_code=400)
132
+ try:
133
+ response = await call_next(request)
134
+ except Exception:
135
+ # Never include credentials, private repository details or payloads in errors/logs.
136
+ logging.getLogger("rise").error("Submission service operation failed; private storage may be unavailable.")
137
+ return JSONResponse({"detail": "The submission service is temporarily unavailable. Nothing was published."}, status_code=503)
138
+ response.headers["X-Content-Type-Options"] = "nosniff"
139
+ response.headers["Referrer-Policy"] = "no-referrer"
140
+ response.headers["Permissions-Policy"] = "camera=(), microphone=(), geolocation=()"
141
+ response.headers["Content-Security-Policy"] = "default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline'; img-src 'self' data:; connect-src 'self'; object-src 'none'; base-uri 'self'; form-action 'self'; frame-ancestors 'self' https://huggingface.co"
142
+ if request.url.path.startswith('/api/'):
143
+ response.headers["Cache-Control"] = "no-store"
144
+ return response
145
+
146
+ @app.get("/api/config")
147
+ def config():
148
+ return {"available": True, "local_preview": settings.local, "max_file_bytes": 200000}
149
+
150
+ @app.get("/api/leaderboard")
151
+ def leaderboard():
152
+ return public_leaderboard(base, store.read())
153
+
154
+ @app.get("/api/template")
155
+ def get_template(benchmark: str = "risebench-plusplus"):
156
+ b = next((b for b in base["benchmarks"] if b["id"] == benchmark), None)
157
+ if not b:
158
+ raise HTTPException(404, "Unknown benchmark.")
159
+ return JSONResponse(template(b), headers={"Content-Disposition": 'attachment; filename="rise-results-template.json"'})
160
+
161
+ @app.post("/api/submissions", status_code=201)
162
+ def submit(request: Request):
163
+ rate_limit(request, "submit", 10)
164
+ normalized = validate_submission(payload(request), base)
165
+ ident, token = uuid.uuid4().hex, secrets.token_urlsafe(32)
166
+ fingerprint = digest(json.dumps(normalized, sort_keys=True))
167
+ record = {"id": ident, "status": "pending", "revision": 1, "submitted_at": now(),
168
+ "reviewed_at": None, "review_note": "", "history": [], "payload": normalized,
169
+ "receipt_hash": digest(token), "fingerprint": fingerprint}
170
+ def add(state):
171
+ if len(state["submissions"]) >= 5000:
172
+ raise HTTPException(503, "The submission queue is full. Please contact the benchmark team.")
173
+ if any(r["fingerprint"] == fingerprint and r["status"] in {"pending", "approved"} for r in state["submissions"].values()):
174
+ raise HTTPException(409, "These results have already been submitted.")
175
+ live = public_leaderboard(base, state)
176
+ b = next(b for b in live["benchmarks"] if b["id"] == normalized["benchmark"])
177
+ models = b["results_by_language"][normalized["language"]]["models"]
178
+ if normalized["revision_of"]:
179
+ target = next((m for m in models if m["id"] == normalized["revision_of"]), None)
180
+ if not target or target["name"] != normalized["model_name"]:
181
+ raise Invalid("An update must select the existing model and keep its model name.")
182
+ elif any(m["name"].casefold() == normalized["model_name"].casefold() for m in models):
183
+ raise Invalid("This model already exists. Select it under Update an existing result.")
184
+ state["submissions"][ident] = record
185
+ store.mutate(add)
186
+ return {"submission_id": ident, "status_token": token, "status": "pending", "submitted_at": record["submitted_at"]}
187
+
188
+ @app.post("/api/submission-status")
189
+ def submission_status(request: Request):
190
+ rate_limit(request, "status", 120)
191
+ body = payload(request)
192
+ ident, token = body.get("submission_id", ""), body.get("status_token", "")
193
+ if not isinstance(ident, str) or not isinstance(token, str):
194
+ raise HTTPException(404, "Submission not found or receipt key incorrect.")
195
+ record = store.read()["submissions"].get(ident)
196
+ if not record or not secrets.compare_digest(record["receipt_hash"], digest(token)):
197
+ raise HTTPException(404, "Submission not found or receipt key incorrect.")
198
+ return {"submission_id": ident, "status": record["status"], "model_name": record["payload"]["model_name"],
199
+ "submitted_at": record["submitted_at"], "review_note": record["review_note"]}
200
+
201
+ @app.post("/api/admin/session")
202
+ def login(request: Request):
203
+ rate_limit(request, "login", 10, 900)
204
+ candidate = payload(request).get("password", "")
205
+ if not isinstance(candidate, str) or (not settings.local and not secrets.compare_digest(candidate.encode(), settings.password.encode())):
206
+ raise HTTPException(401, "Incorrect administrator passphrase.")
207
+ token = secrets.token_urlsafe(40)
208
+ with security_lock:
209
+ sessions[digest(token)] = time.monotonic() + SESSION_SECONDS
210
+ return {"token": token, "expires_in": SESSION_SECONDS}
211
+
212
+ @app.post("/api/admin/logout")
213
+ def logout(request: Request):
214
+ token = require_admin(request)
215
+ with security_lock:
216
+ sessions.pop(digest(token), None)
217
+ return {"ok": True}
218
+
219
+ @app.get("/api/admin/submissions")
220
+ def submissions(request: Request):
221
+ require_admin(request)
222
+ return [{key: copy.deepcopy(value) for key, value in record.items() if key not in {"receipt_hash", "fingerprint"}}
223
+ for record in sorted(store.read()["submissions"].values(), key=lambda r: r["submitted_at"], reverse=True)]
224
+
225
+ @app.post("/api/admin/submissions/{ident}/review")
226
+ def review(ident: str, request: Request):
227
+ require_admin(request)
228
+ body = payload(request)
229
+ decision = body.get("decision")
230
+ if decision not in {"approve", "reject", "withdraw"}:
231
+ raise Invalid("Choose approve, reject or withdraw.")
232
+ note = text(body.get("note", ""), "Review note", 3000, decision != "approve")
233
+ if body.get("confirmed") is not True:
234
+ raise Invalid("Confirm the review decision before applying it.")
235
+ def update(state):
236
+ record = state["submissions"].get(ident)
237
+ if not record:
238
+ raise HTTPException(404, "Submission not found.")
239
+ if type(body.get("revision")) is not int or body["revision"] != record["revision"]:
240
+ raise HTTPException(409, "This submission changed. Refresh before reviewing again.")
241
+ if decision in {"approve", "reject"} and record["status"] != "pending":
242
+ raise HTTPException(409, "Only pending results can be approved or rejected.")
243
+ if decision == "withdraw" and record["status"] != "approved":
244
+ raise HTTPException(409, "Only approved results can be withdrawn.")
245
+ p = record["payload"]
246
+ if decision == "withdraw" and not p["revision_of"]:
247
+ if any(r["status"] == "approved" and r["payload"]["revision_of"] == "community-" + ident
248
+ for r in state["submissions"].values()):
249
+ raise HTTPException(409, "Withdraw this model's approved updates before withdrawing its original submission.")
250
+ if decision == "approve":
251
+ current = public_leaderboard(base, state)
252
+ b = next(b for b in current["benchmarks"] if b["id"] == p["benchmark"])
253
+ models = b["results_by_language"][p["language"]]["models"]
254
+ if p["revision_of"] and not any(m["id"] == p["revision_of"] for m in models):
255
+ raise HTTPException(409, "The result being updated is no longer published.")
256
+ if not p["revision_of"] and any(m["name"].casefold() == p["model_name"].casefold() for m in models):
257
+ raise HTTPException(409, "A result for this model was already approved. Review it as an update.")
258
+ record["status"] = {"approve": "approved", "reject": "rejected", "withdraw": "withdrawn"}[decision]
259
+ record["revision"] += 1
260
+ record["reviewed_at"], record["review_note"] = now(), note
261
+ record["history"].append({"decision": decision, "at": record["reviewed_at"], "note": note})
262
+ return {"id": ident, "status": record["status"], "revision": record["revision"]}
263
+ return store.mutate(update)
264
+
265
+ # Mount only the allowlisted build directory; private state and Python source stay outside it.
266
+ app.mount("/", StaticFiles(directory=ROOT / "dist", html=True), name="site")
267
+ return app
server/storage.py ADDED
@@ -0,0 +1,88 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Private, atomic state storage. Nothing here is served as a static asset."""
2
+ import copy
3
+ import json
4
+ import os
5
+ import threading
6
+ from pathlib import Path
7
+
8
+
9
+ def empty_state():
10
+ return {"version": 1, "submissions": {}}
11
+
12
+
13
+ class LocalStore:
14
+ def __init__(self, directory):
15
+ self.directory = Path(directory)
16
+ self.directory.mkdir(parents=True, exist_ok=True, mode=0o700)
17
+ self.path = self.directory / "submissions.json"
18
+ self.lock = threading.RLock()
19
+
20
+ def _read(self):
21
+ return json.loads(self.path.read_text()) if self.path.exists() else empty_state()
22
+
23
+ def read(self):
24
+ with self.lock:
25
+ return self._read()
26
+
27
+ def mutate(self, action):
28
+ # The service uses one worker; a file lock also protects separate local processes.
29
+ import fcntl
30
+ with self.lock, open(self.directory / ".write.lock", "a") as lockfile:
31
+ fcntl.flock(lockfile, fcntl.LOCK_EX)
32
+ state = self._read()
33
+ result = action(state)
34
+ temp = self.directory / (".state-" + os.urandom(8).hex())
35
+ try:
36
+ with open(temp, "x", encoding="utf-8") as file:
37
+ os.chmod(temp, 0o600)
38
+ json.dump(state, file, ensure_ascii=False, allow_nan=False)
39
+ file.flush()
40
+ os.fsync(file.fileno())
41
+ os.replace(temp, self.path)
42
+ finally:
43
+ temp.unlink(missing_ok=True)
44
+ return result
45
+
46
+
47
+ class HubStore:
48
+ """Use an existing PRIVATE dataset; reject concurrent conflicting commits."""
49
+ def __init__(self, repo_id, token):
50
+ from huggingface_hub import HfApi
51
+ self.repo_id, self.token = repo_id, token
52
+ self.api = HfApi(token=token)
53
+ self.lock = threading.RLock()
54
+ self._load() # Fail closed if the repository is missing or public.
55
+
56
+ def _load(self):
57
+ from huggingface_hub import hf_hub_download
58
+ from huggingface_hub.errors import EntryNotFoundError
59
+ info = self.api.repo_info(self.repo_id, repo_type="dataset")
60
+ if not info.private:
61
+ raise RuntimeError("Submission storage must be a private Hugging Face dataset.")
62
+ try:
63
+ filename = hf_hub_download(self.repo_id, "submissions.json", repo_type="dataset",
64
+ revision=info.sha, token=self.token)
65
+ state = json.loads(Path(filename).read_text())
66
+ except EntryNotFoundError:
67
+ state = empty_state()
68
+ return state, info.sha
69
+
70
+ def read(self):
71
+ with self.lock:
72
+ return self._load()[0]
73
+
74
+ def mutate(self, action):
75
+ from huggingface_hub.errors import HfHubHTTPError
76
+ with self.lock:
77
+ for attempt in range(3):
78
+ state, revision = self._load()
79
+ result = action(state)
80
+ payload = json.dumps(state, ensure_ascii=False, allow_nan=False).encode()
81
+ try:
82
+ self.api.upload_file(path_or_fileobj=payload, path_in_repo="submissions.json",
83
+ repo_id=self.repo_id, repo_type="dataset", parent_commit=revision,
84
+ commit_message="Update private leaderboard moderation state")
85
+ return copy.deepcopy(result)
86
+ except HfHubHTTPError as error:
87
+ if error.response.status_code not in (409, 412) or attempt == 2:
88
+ raise
server/validation.py ADDED
@@ -0,0 +1,160 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Accept named score fields only; never execute or extract uploaded files."""
2
+ import copy
3
+ import math
4
+ import re
5
+ from urllib.parse import urlsplit
6
+
7
+
8
+ class Invalid(ValueError):
9
+ pass
10
+
11
+
12
+ def text(value, label, maximum=200, required=True):
13
+ if not isinstance(value, str) or len(value.strip()) > maximum:
14
+ raise Invalid(f"{label} must be text, at most {maximum} characters.")
15
+ value = value.strip()
16
+ if (required and not value) or any(ord(c) < 32 and c not in '\n\t' for c in value):
17
+ raise Invalid(f"Please provide a valid {label.lower()}.")
18
+ return value
19
+
20
+
21
+ def url(value, label):
22
+ value = text(value, label, 1000)
23
+ try:
24
+ parsed = urlsplit(value)
25
+ if parsed.scheme != "https" or not parsed.hostname or parsed.username or parsed.password:
26
+ raise ValueError()
27
+ except ValueError:
28
+ raise Invalid(f"{label} must be an https:// link without credentials.")
29
+ return value
30
+
31
+
32
+ def score(value, label):
33
+ if value is None:
34
+ return None
35
+ if type(value) not in (int, float) or not math.isfinite(value) or not 0 <= value <= 100:
36
+ raise Invalid(f"{label} must be a number between 0 and 100, or null.")
37
+ if abs(value * 10 - round(value * 10)) > 1e-7:
38
+ raise Invalid(f"{label} must use at most one decimal place, as in the published tables.")
39
+ return float(value)
40
+
41
+
42
+ def simple_scores(raw, columns, label):
43
+ if not isinstance(raw, dict):
44
+ raise Invalid(f"{label} must be an object with named scores.")
45
+ lookup = {c["label"]: c["key"] for c in columns}
46
+ lookup.update({c["key"]: c["key"] for c in columns})
47
+ result = {c["key"]: None for c in columns}
48
+ seen = set()
49
+ for key, value in raw.items():
50
+ if key not in lookup or lookup[key] in seen:
51
+ raise Invalid(f"Unknown or duplicate {label} field: {key}")
52
+ seen.add(lookup[key])
53
+ result[lookup[key]] = score(value, key)
54
+ return result
55
+
56
+
57
+ def nested_scores(raw, columns, label):
58
+ if not isinstance(raw, dict):
59
+ raise Invalid(f"{label} must group full score names by reasoning dimension.")
60
+ result = {c["key"]: None for c in columns}
61
+ seen = set()
62
+ for dimension, values in raw.items():
63
+ subset = [c for c in columns if c["dimension"].casefold() == dimension.casefold()]
64
+ if not subset or dimension.casefold() in seen:
65
+ raise Invalid(f"Unknown or duplicate {label} dimension: {dimension}")
66
+ seen.add(dimension.casefold())
67
+ result.update(simple_scores(values, subset, label))
68
+ return result
69
+
70
+
71
+ def validate_submission(raw, data):
72
+ if not isinstance(raw, dict):
73
+ raise Invalid("The submission must be a JSON object.")
74
+ allowed = {"model_name", "project_url", "evidence_url", "team", "email", "group", "benchmark",
75
+ "language", "multi_image", "revision_of", "notes", "full_dataset", "results"}
76
+ if set(raw) - allowed:
77
+ raise Invalid("Unknown submission fields: " + ", ".join(sorted(set(raw) - allowed)))
78
+ benchmark = next((b for b in data["benchmarks"] if b["id"] == raw.get("benchmark")), None)
79
+ if not benchmark or raw.get("language") not in benchmark["results_by_language"]:
80
+ raise Invalid("Select a supported benchmark and instruction language.")
81
+ if raw.get("full_dataset") is not True:
82
+ raise Invalid("Confirm that results use the full benchmark, not the demonstration data.")
83
+ if type(raw.get("multi_image")) is not bool:
84
+ raise Invalid("Select whether the model supports multiple input images.")
85
+ if benchmark["id"] == "risebench" and raw["multi_image"]:
86
+ raise Invalid("RISEBench evaluates single-image inputs only.")
87
+ if raw.get("group") not in {"closed", "open", "agentic"}:
88
+ raise Invalid("Select a model category.")
89
+ result = {key: raw[key] for key in ("benchmark", "language", "group", "multi_image")}
90
+ for key, label, size, required in [("model_name", "Model name", 160, True), ("team", "Team", 120, False),
91
+ ("notes", "Notes", 3000, False), ("revision_of", "Existing model identifier", 160, False)]:
92
+ result[key] = text(raw.get(key, ""), label, size, required)
93
+ result["project_url"] = url(raw.get("project_url"), "Project link")
94
+ result["evidence_url"] = url(raw.get("evidence_url"), "Evaluation artifacts link")
95
+ result["email"] = text(raw.get("email"), "Contact email", 254)
96
+ if not re.fullmatch(r"[^\s@]+@[^\s@]+\.[^\s@]+", result["email"]):
97
+ raise Invalid("Provide a valid contact email.")
98
+ uploaded = raw.get("results")
99
+ if not isinstance(uploaded, dict) or set(uploaded) - {"accuracy", "metrics", "subcategories", "task_types"}:
100
+ raise Invalid("Upload a result JSON matching the downloadable template.")
101
+ result["accuracy"] = simple_scores(uploaded.get("accuracy"), benchmark["accuracy_columns"], "accuracy")
102
+ required_keys = [d["key"] for d in benchmark["dimensions"]]
103
+ if benchmark["id"] == "risebench-plusplus":
104
+ required_keys += ["single"] + (["multi", "total"] if result["multi_image"] else [])
105
+ if not result["multi_image"] and any(result["accuracy"][key] is not None for key in ("multi", "total")):
106
+ raise Invalid("Single-image-only models must leave Total and Multi null.")
107
+ else:
108
+ required_keys += ["total"]
109
+ if any(result["accuracy"][key] is None for key in required_keys):
110
+ raise Invalid("Fill in every reasoning-dimension accuracy and the applicable summary scores.")
111
+ result["metrics"] = simple_scores(uploaded.get("metrics", {}), benchmark["metrics"], "evaluation score")
112
+ for field, columns in (("subcategories", "subcategory_columns"), ("task_types", "task_type_columns")):
113
+ if columns not in benchmark:
114
+ if uploaded.get(field):
115
+ raise Invalid("Fine-grained submissions are supported only for RISEBench++.")
116
+ continue
117
+ result[field] = nested_scores(uploaded.get(field, {}), benchmark[columns], field)
118
+ if benchmark["id"] == "risebench-plusplus" and not result["multi_image"]:
119
+ for column in benchmark["task_type_columns"]:
120
+ if column["case_count"] == column["multi_image_case_count"] and result["task_types"][column["key"]] is not None:
121
+ raise Invalid(f"{column['label']} is a multi-image-only task; leave it null for this model.")
122
+ result["full_dataset"] = True
123
+ return result
124
+
125
+
126
+ def template(benchmark):
127
+ result = {"accuracy": {c["label"]: None for c in benchmark["accuracy_columns"]},
128
+ "metrics": {c["label"]: None for c in benchmark["metrics"]}}
129
+ for field, key in (("subcategories", "subcategory_columns"), ("task_types", "task_type_columns")):
130
+ if key in benchmark:
131
+ result[field] = {}
132
+ for c in benchmark[key]:
133
+ result[field].setdefault(c["dimension"].title(), {})[c["label"]] = None
134
+ return result
135
+
136
+
137
+ def public_leaderboard(base, state):
138
+ data = copy.deepcopy(base)
139
+ for b in data["benchmarks"]:
140
+ for language, entry in b["results_by_language"].items():
141
+ models = {m["id"]: m for m in entry["models"]}
142
+ approved = sorted((r for r in state["submissions"].values() if r["status"] == "approved"
143
+ and r["payload"]["benchmark"] == b["id"] and r["payload"]["language"] == language),
144
+ key=lambda r: r["reviewed_at"])
145
+ for record in approved:
146
+ p = record["payload"]
147
+ model_id = p["revision_of"] or "community-" + record["id"]
148
+ previous = models.get(model_id)
149
+ model = {"id": model_id, "name": p["model_name"], "group": p["group"], "multi_image": p["multi_image"],
150
+ "source_order": previous["source_order"] if previous else len(models) + 1}
151
+ # An explicit public allowlist: no email, notes, receipt tokens or review history.
152
+ for field in ("accuracy", "metrics", "subcategories", "task_types"):
153
+ if field in p:
154
+ model[field] = copy.deepcopy(p[field])
155
+ models[model_id] = model
156
+ entry["models"] = list(models.values())
157
+ entry["model_count"] = len(models)
158
+ for group in entry["groups"]:
159
+ group["count"] = sum(m["group"] == group["id"] for m in models.values())
160
+ return data
styles.css CHANGED
@@ -46,6 +46,11 @@ main { padding-bottom: 48px; }
46
  /* Benchmark switcher and context */
47
  .board-section { scroll-margin-top: 24px; }
48
  .benchmark-bar { display: flex; align-items: center; justify-content: space-between; flex-wrap: wrap; gap: 20px; padding-bottom: 22px; }
 
 
 
 
 
49
  .benchmark-tabs { display: inline-flex; gap: 6px; padding: 6px; background: #eaf0f0; border: 1px solid #dde6e7; border-radius: 14px; }
50
  .benchmark-tabs button { display: flex; align-items: center; justify-content: center; padding: 10px 22px; min-height: 50px; border: 1px solid transparent; border-radius: 10px; font-size: 20px; font-weight: 650; color: #637982; letter-spacing: -.5px; transition: background .15s, color .15s; }
51
  .benchmark-tabs button:hover { color: var(--ink); }
@@ -254,6 +259,9 @@ dialog::backdrop { background: #15384070; backdrop-filter: blur(5px); }
254
  .resource-links { gap: 20px; }
255
  .resource-links a { font-size: 14px; min-height: 36px; }
256
  .benchmark-bar { display: block; padding-bottom: 18px; }
 
 
 
257
  .benchmark-tabs { width: 100%; gap: 4px; padding: 5px; }
258
  .benchmark-tabs button { flex: 1; padding: 9px 10px; min-height: 48px; font-size: 19px; }
259
  .board-card { border-radius: 13px; }
@@ -305,3 +313,78 @@ dialog::backdrop { background: #15384070; backdrop-filter: blur(5px); }
305
  html { scroll-behavior: auto; }
306
  * { animation: none !important; transition: none !important; }
307
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
46
  /* Benchmark switcher and context */
47
  .board-section { scroll-margin-top: 24px; }
48
  .benchmark-bar { display: flex; align-items: center; justify-content: space-between; flex-wrap: wrap; gap: 20px; padding-bottom: 22px; }
49
+ .benchmark-actions { display: flex; align-items: center; justify-content: flex-end; flex-wrap: wrap; gap: 24px; max-width: 100%; margin-left: auto; }
50
+ .submit-results-button { display: inline-flex; align-items: center; justify-content: center; gap: 11px; min-height: 52px; padding: 12px 22px; border: 1px solid #34577d; border-radius: 11px; background: #3b6088; color: #fff; font-size: 16px; font-weight: 650; white-space: nowrap; box-shadow: 0 4px 12px #2d527923; transition: background .15s, box-shadow .15s; }
51
+ .submit-results-button:hover { background: #2d4e74; color: #fff; box-shadow: 0 6px 16px #2d52792b; }
52
+ .submit-results-button:focus-visible { outline-color: #456c99; }
53
+ .submit-results-button .button-icon { width: 20px; height: 20px; }
54
  .benchmark-tabs { display: inline-flex; gap: 6px; padding: 6px; background: #eaf0f0; border: 1px solid #dde6e7; border-radius: 14px; }
55
  .benchmark-tabs button { display: flex; align-items: center; justify-content: center; padding: 10px 22px; min-height: 50px; border: 1px solid transparent; border-radius: 10px; font-size: 20px; font-weight: 650; color: #637982; letter-spacing: -.5px; transition: background .15s, color .15s; }
56
  .benchmark-tabs button:hover { color: var(--ink); }
 
259
  .resource-links { gap: 20px; }
260
  .resource-links a { font-size: 14px; min-height: 36px; }
261
  .benchmark-bar { display: block; padding-bottom: 18px; }
262
+ .benchmark-actions { flex-direction: column; align-items: stretch; gap: 16px; margin-top: 16px; }
263
+ .benchmark-actions .board-options { margin-top: 0; }
264
+ .submit-results-button { width: 100%; }
265
  .benchmark-tabs { width: 100%; gap: 4px; padding: 5px; }
266
  .benchmark-tabs button { flex: 1; padding: 9px 10px; min-height: 48px; font-size: 19px; }
267
  .board-card { border-radius: 13px; }
 
313
  html { scroll-behavior: auto; }
314
  * { animation: none !important; transition: none !important; }
315
  }
316
+
317
+ /* Fine-grained results keep the same model rows, with a scoped score header. */
318
+ .view-row { flex-wrap: wrap; }
319
+ .view-actions { margin-left: auto; }
320
+ .breakdown-controls { padding: 18px 24px; border-bottom: 1px solid #e1e8ef; background: #f8fafd; display: flex; flex-wrap: wrap; gap: 18px 24px; align-items: center; }
321
+ .dimension-tabs { display: flex; flex-wrap: wrap; gap: 6px; }
322
+ .dimension-tabs button { padding: 7px 12px; min-height: 38px; border-radius: 7px; font-size: 14px; font-weight: 550; color: #718197; border: 1px solid transparent; }
323
+ .dimension-tabs button:hover { background: #eef2f8; color: #315778; }
324
+ .dimension-tabs button[aria-pressed=true] { background: #e8eef8; border-color: #cfdcef; color: #345980; }
325
+ .subcategory-filter { display: flex; align-items: center; gap: 12px; flex-wrap: wrap; font-size: 13px; color: #78899d; }
326
+ .subcategory-filter select { color: #3f5771; background: white; border: 1px solid #d0dce7; border-radius: 8px; padding: 8px 32px 8px 12px; min-height: 40px; max-width: 100%; font-size: 14px; }
327
+ .context-separator { padding: 0 10px; color: #a6b3bf; }
328
+ .column-popover { max-height: min(65vh, 540px); overflow-y: auto; width: 300px; }
329
+ .column-popover label { font-size: 14px; line-height: 1.5; }
330
+ .table-scroll .breakdown-table thead th { height: 110px; background: #f4f7fb; color: #506680; }
331
+ .table-scroll .breakdown-table thead th.active-sort { background: #e8eff9; color: #355d8a; }
332
+ .table-scroll .breakdown-table thead th.dimension-band { height: 38px; padding: 7px 12px; font-size: 12px; font-weight: 650; letter-spacing: .25px; color: #5e7088; border-bottom-color: #fff; }
333
+ .table-scroll .breakdown-table .dimension-band.dim-temporal { background: #edf0fb; }
334
+ .table-scroll .breakdown-table .dimension-band.dim-causal { background: #eff3e9; }
335
+ .table-scroll .breakdown-table .dimension-band.dim-spatial { background: #eaf2f5; }
336
+ .table-scroll .breakdown-table .dimension-band.dim-logical { background: #eef0f8; }
337
+ .table-scroll .breakdown-table .dimension-band.dim-counterfactual { background: #fbf0e7; }
338
+
339
+ /* Paper figures and citation form a quiet, visual closing section. */
340
+ .research-section { margin-top: 84px; }
341
+ .figure-section { margin-bottom: 72px; scroll-margin-top: 32px; }
342
+ .section-heading { display: flex; align-items: end; justify-content: space-between; flex-wrap: wrap; gap: 18px 30px; margin-bottom: 25px; }
343
+ .section-kicker { display: block; font-size: 11px; font-weight: 650; letter-spacing: 1.8px; color: #8a99ae; margin-bottom: 9px; }
344
+ .section-heading h2 { margin: 0; font-size: 34px; line-height: 1.2; font-weight: 650; letter-spacing: -.9px; color: #273d55; }
345
+ .section-heading .plus { color: #537da9; }
346
+ .section-note { color: #8592a3; font-size: 15px; padding-bottom: 3px; }
347
+ .research-figure { margin: 0; padding: 24px; border: 1px solid #e0e6ee; border-radius: 20px; background: white; box-shadow: 0 8px 36px #23395308; }
348
+ .research-figure a { display: block; position: relative; border-radius: 10px; overflow: hidden; }
349
+ .research-figure img { display: block; width: 100%; height: auto; }
350
+ .figure-expand { position: absolute; bottom: 14px; right: 14px; padding: 8px 14px; background: #ffffffee; box-shadow: 0 2px 15px #20395612; border: 1px solid #dce5ef; border-radius: 8px; color: #526983; font-size: 12px; opacity: 0; transition: opacity .2s; }
351
+ .research-figure a:hover .figure-expand, .research-figure a:focus-visible .figure-expand { opacity: 1; }
352
+ .citation-section { padding: 34px; background: linear-gradient(125deg, #eff3fa, #f7f8fb 70%, #f2f0fa); border: 1px solid #dee5ef; border-radius: 20px; scroll-margin-top: 32px; }
353
+ .citation-section .section-heading { align-items: center; margin-bottom: 22px; }
354
+ .citation-section h2 { font-size: 29px; }
355
+ .citation-actions { display: flex; flex-wrap: wrap; gap: 8px; align-items: center; }
356
+ .citation-actions button { font-size: 14px; color: #526a86; }
357
+ .citation-actions .outline-button { border-color: #d4dfe9; }
358
+ .page-citation { margin: 0; padding: 26px; border: 1px solid #e1e7f0; background: #ffffffba; color: #5d6e83; font-size: 13px; line-height: 1.85; border-radius: 12px; white-space: pre-wrap; overflow-wrap: anywhere; }
359
+ .page-footer { display: flex; justify-content: space-between; align-items: center; gap: 20px; color: #8b9bad; margin-top: 36px; font-size: 13px; }
360
+ .page-footer > span { font-weight: 650; letter-spacing: -.2px; color: #6d819a; }
361
+ .page-footer a { padding-block: 8px; }
362
+ @media (max-width: 1100px) {
363
+ .view-tabs button { padding-inline: 11px; font-size: 14px; }
364
+ .view-tabs button > span { margin-left: 3px; }
365
+ }
366
+ @media (max-width: 820px) {
367
+ .research-section { margin-top: 56px; }
368
+ .figure-section { margin-bottom: 48px; }
369
+ .section-heading h2 { font-size: 28px; }
370
+ .section-note { font-size: 14px; }
371
+ .research-figure { padding: 14px; border-radius: 14px; }
372
+ .citation-section { padding: 24px; }
373
+ }
374
+ @media (max-width: 540px) {
375
+ .view-tabs { display: flex; flex-wrap: wrap; }
376
+ .view-tabs button { flex-basis: 45%; font-size: 14px; }
377
+ .breakdown-controls { padding: 14px; gap: 14px; }
378
+ .dimension-tabs { gap: 4px; }
379
+ .dimension-tabs button { padding-inline: 9px; font-size: 13px; }
380
+ .subcategory-filter { width: 100%; gap: 6px; }
381
+ .subcategory-filter select { width: 100%; }
382
+ .footer-actions { flex-wrap: wrap; gap: 2px; }
383
+ .footer-actions .quiet-button { padding-inline: 8px; font-size: 12px; }
384
+ .section-heading { gap: 12px; margin-bottom: 20px; }
385
+ .section-kicker { font-size: 10px; }
386
+ .research-figure { padding: 8px; border-radius: 12px; }
387
+ .citation-section { padding: 20px 16px; }
388
+ .citation-actions { width: 100%; }
389
+ .page-citation { padding: 15px; font-size: 12px; }
390
+ }
submit.html ADDED
@@ -0,0 +1,34 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!doctype html>
2
+ <html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>Submit results · RISEBench</title><link rel="icon" href="assets/favicon.svg"><link rel="stylesheet" href="styles.css"><link rel="stylesheet" href="portal.css"></head>
3
+ <body data-page="submit"><main class="portal-width">
4
+ <nav class="portal-nav" aria-label="Main navigation"><a class="wordmark" href="index.html">RISEBench</a><div><a href="index.html">Leaderboard</a><a href="submit.html" aria-current="page">Submit results</a></div></nav>
5
+ <header class="portal-heading"><span class="section-kicker">COMMUNITY EVALUATIONS</span><h1>Submit your results.</h1><p>Submit evaluations for RISEBench or RISEBench++.</p></header>
6
+ <p class="notice" id="service-notice" hidden></p>
7
+ <form id="submission-form">
8
+ <section class="portal-card"><div class="card-heading"><h2>Model details</h2><span>Required unless marked optional</span></div>
9
+ <div class="form-grid">
10
+ <label>Model name<input name="model_name" required maxlength="160" placeholder="Your model name"></label>
11
+ <label>Project, paper or model repository<input name="project_url" type="url" required maxlength="1000" placeholder="https://"></label>
12
+ <label>Team <span class="optional">Optional</span><input name="team" maxlength="120" placeholder="Your team or organization"></label>
13
+ <label>Contact email <span class="optional">Private</span><input name="email" type="email" required maxlength="254" placeholder="name@organization.com"><small>Visible only to reviewers.</small></label>
14
+ <label>Benchmark<select name="benchmark" id="submission-benchmark"><option value="risebench-plusplus">RISEBench++</option><option value="risebench">RISEBench</option></select></label>
15
+ <label>Instruction language<select name="language" id="submission-language"><option value="en">English</option><option value="zh">Chinese</option></select></label>
16
+ <label>Model category<select name="group" required><option value="open">Open-source</option><option value="closed">Closed-source</option><option value="agentic">Agentic method</option></select></label>
17
+ <label>Input support<select name="multi_image"><option value="true">Multiple input images supported</option><option value="false">Single input image only</option></select><input id="single-image-input" type="text" value="Single input image" readonly hidden></label>
18
+ <label class="full-width">Update an existing result <span class="optional">Optional</span><select name="revision_of" id="submission-revision"><option value="">New result</option></select></label>
19
+ </div>
20
+ </section>
21
+ <section class="portal-card"><div class="card-heading"><h2>Evaluation results</h2><button type="button" id="download-template" class="outline-button">Download JSON template ↓</button></div>
22
+ <p class="field-note">Use full benchmark results on a 0–100 scale. Leave unevaluated fields null.</p>
23
+ <label class="upload-zone" id="upload-zone"><input type="file" id="result-file" accept=".json,application/json" required><svg viewBox="0 0 24 24" aria-hidden="true"><path d="M12 16V3m-5 5 5-5 5 5M4 15v6h16v-6"/></svg><strong id="upload-title">Choose a result JSON or drop it here</strong><span id="upload-caption">One JSON file · up to 200 KB</span></label>
24
+ <div class="file-preview" id="file-preview" hidden></div>
25
+ <div class="form-grid artifacts"><label class="full-width">Evaluation artifacts<input name="evidence_url" type="url" required maxlength="1000" placeholder="https://huggingface.co/datasets/your-team/evaluation-results"><small>Link to generated outputs and detailed evaluation results so reviewers can verify the scores.</small></label>
26
+ <label class="full-width">Notes for reviewers <span class="optional">Optional · private</span><textarea name="notes" rows="3" maxlength="3000" placeholder="Evaluation configuration, model version, or details of an update"></textarea></label></div>
27
+ <label class="confirmation"><input name="full_dataset" type="checkbox" required><span>These scores use the full benchmark and the official evaluation protocol. I am authorized to submit this model's results.</span></label>
28
+ <div class="form-bottom"><p class="form-message" id="submission-message" role="status"></p><button class="primary-button" id="submit-results" type="submit">Submit for review <span aria-hidden="true">→</span></button></div>
29
+ </section>
30
+ </form>
31
+ <section class="portal-card receipt-card" id="submission-receipt" hidden aria-live="polite"></section>
32
+ <section class="portal-card status-card"><div class="card-heading"><h2>Check a submission</h2><span>Your receipt keeps this private</span></div><form id="status-form"><div class="form-grid"><label>Submission ID<input name="submission_id" required autocomplete="off"></label><label>Receipt key<input name="status_token" type="password" required autocomplete="off"></label></div><div class="form-bottom"><p id="status-result" class="form-message" role="status"></p><button class="outline-button" type="submit">Check status</button></div></form></section>
33
+ <footer class="page-footer"><a href="index.html">← Back to leaderboard</a><a href="admin.html">Reviewer sign in</a></footer>
34
+ </main><script id="submission-schema" type="application/json">{"benchmarks": [{"id": "risebench-plusplus", "name": "RISEBench++", "case_count": 1000, "available_result_languages": ["en", "zh"], "accuracy_unit": "%", "metric_unit": "/100", "score_decimals": 1, "default_sort": "total", "dimensions": [{"key": "temporal", "label": "Temporal", "description": "Infer how a scene changes over time."}, {"key": "causal", "label": "Causal", "description": "Reason about causes, actions, and their consequences."}, {"key": "spatial", "label": "Spatial", "description": "Reason about spatial relationships and transformations."}, {"key": "logical", "label": "Logical", "description": "Apply explicit rules, patterns, and logical constraints."}, {"key": "counterfactual", "label": "Counterfactual", "description": "Visualize outcomes under hypothetical or contrary-to-fact conditions."}, {"key": "hybrid", "label": "Hybrid", "description": "Combine reasoning across three to five successive editing instructions."}], "metrics": [{"key": "instruction_reasoning", "label": "Instruction Reasoning", "description": "Whether the edit realizes the intended reasoning outcome."}, {"key": "appearance_consistency", "label": "Appearance Consistency", "description": "Whether content that should remain unchanged is preserved."}, {"key": "visual_plausibility", "label": "Visual Plausibility", "description": "Visual quality and plausibility; logical tasks are excluded."}], "accuracy_columns": [{"key": "temporal", "label": "Temporal", "description": "Infer how a scene changes over time."}, {"key": "causal", "label": "Causal", "description": "Reason about causes, actions, and their consequences."}, {"key": "spatial", "label": "Spatial", "description": "Reason about spatial relationships and transformations."}, {"key": "logical", "label": "Logical", "description": "Apply explicit rules, patterns, and logical constraints."}, {"key": "counterfactual", "label": "Counterfactual", "description": "Visualize outcomes under hypothetical or contrary-to-fact conditions."}, {"key": "hybrid", "label": "Hybrid", "description": "Combine reasoning across three to five successive editing instructions."}, {"key": "single", "label": "Single", "description": "Accuracy on single-image cases."}, {"key": "multi", "label": "Multi", "description": "Accuracy on multi-image cases. Not evaluated for models without multi-image support."}, {"key": "total", "label": "Total", "description": "Accuracy on the complete benchmark. Not evaluated for single-image-only models."}], "subcategory_columns": [{"key": "temporal_common_sense_knowledge", "label": "Common-Sense Knowledge", "dimension": "temporal", "case_count": 85, "multi_image_case_count": 0, "code": "CSK", "description": "Temporal · Common-Sense Knowledge — accuracy (%)"}, {"key": "temporal_context_knowledge", "label": "Context Knowledge", "dimension": "temporal", "case_count": 52, "multi_image_case_count": 28, "code": "CtxK", "description": "Temporal · Context Knowledge — accuracy (%)"}, {"key": "temporal_disciplinary_knowledge", "label": "Disciplinary Knowledge", "dimension": "temporal", "case_count": 63, "multi_image_case_count": 4, "code": "DK", "description": "Temporal · Disciplinary Knowledge — accuracy (%)"}, {"key": "causal_common_sense_knowledge", "label": "Common-Sense Knowledge", "dimension": "causal", "case_count": 80, "multi_image_case_count": 1, "code": "CSK", "description": "Causal · Common-Sense Knowledge — accuracy (%)"}, {"key": "causal_context_knowledge", "label": "Context Knowledge", "dimension": "causal", "case_count": 40, "multi_image_case_count": 2, "code": "CtxK", "description": "Causal · Context Knowledge — accuracy (%)"}, {"key": "causal_disciplinary_knowledge", "label": "Disciplinary Knowledge", "dimension": "causal", "case_count": 80, "multi_image_case_count": 5, "code": "DK", "description": "Causal · Disciplinary Knowledge — accuracy (%)"}, {"key": "spatial_relation", "label": "Relation", "dimension": "spatial", "case_count": 106, "multi_image_case_count": 6, "code": "Rel.", "description": "Spatial · Relation — accuracy (%)"}, {"key": "spatial_structure", "label": "Structure", "dimension": "spatial", "case_count": 94, "multi_image_case_count": 12, "code": "Struct.", "description": "Spatial · Structure — accuracy (%)"}, {"key": "logical_explicit_rule_deduction", "label": "Explicit Rule Deduction", "dimension": "logical", "case_count": 123, "multi_image_case_count": 0, "code": "ERD", "description": "Logical · Explicit Rule Deduction — accuracy (%)"}, {"key": "logical_implicit_pattern_induction", "label": "Implicit Pattern Induction", "dimension": "logical", "case_count": 77, "multi_image_case_count": 20, "code": "IPI", "description": "Logical · Implicit Pattern Induction — accuracy (%)"}, {"key": "counterfactual_counterfactual_imagination", "label": "Counterfactual Imagination", "dimension": "counterfactual", "case_count": 70, "multi_image_case_count": 0, "code": "CFI", "description": "Counterfactual · Counterfactual Imagination — accuracy (%)"}, {"key": "counterfactual_anomaly_correction_and_generation", "label": "Anomaly Correction and Generation", "dimension": "counterfactual", "case_count": 30, "multi_image_case_count": 0, "code": "ACG", "description": "Counterfactual · Anomaly Correction and Generation — accuracy (%)"}], "task_type_columns": [{"key": "T01", "code": "T01", "label": "Life Progression", "dimension": "temporal", "subcategory": "temporal_common_sense_knowledge", "case_count": 24, "multi_image_case_count": 0, "description": "Temporal · Life Progression — accuracy (%)"}, {"key": "T02", "code": "T02", "label": "Material Transformation", "dimension": "temporal", "subcategory": "temporal_common_sense_knowledge", "case_count": 9, "multi_image_case_count": 0, "description": "Temporal · Material Transformation — accuracy (%)"}, {"key": "T03", "code": "T03", "label": "Natural Environmental Changes", "dimension": "temporal", "subcategory": "temporal_common_sense_knowledge", "case_count": 13, "multi_image_case_count": 0, "description": "Temporal · Natural Environmental Changes — accuracy (%)"}, {"key": "T04", "code": "T04", "label": "Physical Aging", "dimension": "temporal", "subcategory": "temporal_common_sense_knowledge", "case_count": 20, "multi_image_case_count": 0, "description": "Temporal · Physical Aging — accuracy (%)"}, {"key": "T05", "code": "T05", "label": "Social Activities", "dimension": "temporal", "subcategory": "temporal_common_sense_knowledge", "case_count": 8, "multi_image_case_count": 0, "description": "Temporal · Social Activities — accuracy (%)"}, {"key": "T06", "code": "T06", "label": "Tool Evolution", "dimension": "temporal", "subcategory": "temporal_common_sense_knowledge", "case_count": 7, "multi_image_case_count": 0, "description": "Temporal · Tool Evolution — accuracy (%)"}, {"key": "T07", "code": "T07", "label": "Urban Evolution", "dimension": "temporal", "subcategory": "temporal_common_sense_knowledge", "case_count": 4, "multi_image_case_count": 0, "description": "Temporal · Urban Evolution — accuracy (%)"}, {"key": "T08", "code": "T08", "label": "Temporal State Transition", "dimension": "temporal", "subcategory": "temporal_context_knowledge", "case_count": 15, "multi_image_case_count": 4, "description": "Temporal · Temporal State Transition — accuracy (%)"}, {"key": "T09", "code": "T09", "label": "Precise Temporal Localization", "dimension": "temporal", "subcategory": "temporal_context_knowledge", "case_count": 14, "multi_image_case_count": 2, "description": "Temporal · Precise Temporal Localization — accuracy (%)"}, {"key": "T10", "code": "T10", "label": "Position Change", "dimension": "temporal", "subcategory": "temporal_context_knowledge", "case_count": 15, "multi_image_case_count": 14, "description": "Temporal · Position Change — accuracy (%)"}, {"key": "T11", "code": "T11", "label": "Action Sequence", "dimension": "temporal", "subcategory": "temporal_context_knowledge", "case_count": 8, "multi_image_case_count": 8, "description": "Temporal · Action Sequence — accuracy (%)"}, {"key": "T12", "code": "T12", "label": "Physics", "dimension": "temporal", "subcategory": "temporal_disciplinary_knowledge", "case_count": 4, "multi_image_case_count": 0, "description": "Temporal · Physics — accuracy (%)"}, {"key": "T13", "code": "T13", "label": "Chemistry", "dimension": "temporal", "subcategory": "temporal_disciplinary_knowledge", "case_count": 8, "multi_image_case_count": 4, "description": "Temporal · Chemistry — accuracy (%)"}, {"key": "T14", "code": "T14", "label": "Biology", "dimension": "temporal", "subcategory": "temporal_disciplinary_knowledge", "case_count": 9, "multi_image_case_count": 0, "description": "Temporal · Biology — accuracy (%)"}, {"key": "T15", "code": "T15", "label": "Astronomy", "dimension": "temporal", "subcategory": "temporal_disciplinary_knowledge", "case_count": 12, "multi_image_case_count": 0, "description": "Temporal · Astronomy — accuracy (%)"}, {"key": "T16", "code": "T16", "label": "Geography", "dimension": "temporal", "subcategory": "temporal_disciplinary_knowledge", "case_count": 18, "multi_image_case_count": 0, "description": "Temporal · Geography — accuracy (%)"}, {"key": "T17", "code": "T17", "label": "History", "dimension": "temporal", "subcategory": "temporal_disciplinary_knowledge", "case_count": 5, "multi_image_case_count": 0, "description": "Temporal · History — accuracy (%)"}, {"key": "T18", "code": "T18", "label": "Medicine", "dimension": "temporal", "subcategory": "temporal_disciplinary_knowledge", "case_count": 4, "multi_image_case_count": 0, "description": "Temporal · Medicine — accuracy (%)"}, {"key": "T19", "code": "T19", "label": "Computer Science", "dimension": "temporal", "subcategory": "temporal_disciplinary_knowledge", "case_count": 3, "multi_image_case_count": 0, "description": "Temporal · Computer Science — accuracy (%)"}, {"key": "C01", "code": "C01", "label": "Physical State Transition", "dimension": "causal", "subcategory": "causal_common_sense_knowledge", "case_count": 31, "multi_image_case_count": 0, "description": "Causal · Physical State Transition — accuracy (%)"}, {"key": "C02", "code": "C02", "label": "Structural Damage", "dimension": "causal", "subcategory": "causal_common_sense_knowledge", "case_count": 27, "multi_image_case_count": 0, "description": "Causal · Structural Damage — accuracy (%)"}, {"key": "C03", "code": "C03", "label": "Flexible Deformation", "dimension": "causal", "subcategory": "causal_common_sense_knowledge", "case_count": 22, "multi_image_case_count": 1, "description": "Causal · Flexible Deformation — accuracy (%)"}, {"key": "C04", "code": "C04", "label": "Magnitude Change", "dimension": "causal", "subcategory": "causal_context_knowledge", "case_count": 10, "multi_image_case_count": 0, "description": "Causal · Magnitude Change — accuracy (%)"}, {"key": "C05", "code": "C05", "label": "Reading Offset", "dimension": "causal", "subcategory": "causal_context_knowledge", "case_count": 10, "multi_image_case_count": 2, "description": "Causal · Reading Offset — accuracy (%)"}, {"key": "C06", "code": "C06", "label": "Order Relation", "dimension": "causal", "subcategory": "causal_context_knowledge", "case_count": 10, "multi_image_case_count": 0, "description": "Causal · Order Relation — accuracy (%)"}, {"key": "C07", "code": "C07", "label": "Feature Mapping", "dimension": "causal", "subcategory": "causal_context_knowledge", "case_count": 10, "multi_image_case_count": 0, "description": "Causal · Feature Mapping — accuracy (%)"}, {"key": "C08", "code": "C08", "label": "Physics", "dimension": "causal", "subcategory": "causal_disciplinary_knowledge", "case_count": 25, "multi_image_case_count": 1, "description": "Causal · Physics — accuracy (%)"}, {"key": "C09", "code": "C09", "label": "Chemistry", "dimension": "causal", "subcategory": "causal_disciplinary_knowledge", "case_count": 23, "multi_image_case_count": 4, "description": "Causal · Chemistry — accuracy (%)"}, {"key": "C10", "code": "C10", "label": "Biology", "dimension": "causal", "subcategory": "causal_disciplinary_knowledge", "case_count": 12, "multi_image_case_count": 0, "description": "Causal · Biology — accuracy (%)"}, {"key": "C11", "code": "C11", "label": "Astronomy", "dimension": "causal", "subcategory": "causal_disciplinary_knowledge", "case_count": 3, "multi_image_case_count": 0, "description": "Causal · Astronomy — accuracy (%)"}, {"key": "C12", "code": "C12", "label": "Medicine", "dimension": "causal", "subcategory": "causal_disciplinary_knowledge", "case_count": 4, "multi_image_case_count": 0, "description": "Causal · Medicine — accuracy (%)"}, {"key": "C13", "code": "C13", "label": "Music Theory", "dimension": "causal", "subcategory": "causal_disciplinary_knowledge", "case_count": 3, "multi_image_case_count": 0, "description": "Causal · Music Theory — accuracy (%)"}, {"key": "C14", "code": "C14", "label": "Computer Science", "dimension": "causal", "subcategory": "causal_disciplinary_knowledge", "case_count": 10, "multi_image_case_count": 0, "description": "Causal · Computer Science — accuracy (%)"}, {"key": "S01", "code": "S01", "label": "Adjacency", "dimension": "spatial", "subcategory": "spatial_relation", "case_count": 11, "multi_image_case_count": 0, "description": "Spatial · Adjacency — accuracy (%)"}, {"key": "S02", "code": "S02", "label": "Direction", "dimension": "spatial", "subcategory": "spatial_relation", "case_count": 11, "multi_image_case_count": 0, "description": "Spatial · Direction — accuracy (%)"}, {"key": "S03", "code": "S03", "label": "Orientation", "dimension": "spatial", "subcategory": "spatial_relation", "case_count": 11, "multi_image_case_count": 0, "description": "Spatial · Orientation — accuracy (%)"}, {"key": "S04", "code": "S04", "label": "Projection", "dimension": "spatial", "subcategory": "spatial_relation", "case_count": 12, "multi_image_case_count": 0, "description": "Spatial · Projection — accuracy (%)"}, {"key": "S05", "code": "S05", "label": "Distance", "dimension": "spatial", "subcategory": "spatial_relation", "case_count": 13, "multi_image_case_count": 0, "description": "Spatial · Distance — accuracy (%)"}, {"key": "S06", "code": "S06", "label": "Size", "dimension": "spatial", "subcategory": "spatial_relation", "case_count": 15, "multi_image_case_count": 0, "description": "Spatial · Size — accuracy (%)"}, {"key": "S07", "code": "S07", "label": "Configuration", "dimension": "spatial", "subcategory": "spatial_relation", "case_count": 18, "multi_image_case_count": 0, "description": "Spatial · Configuration — accuracy (%)"}, {"key": "S08", "code": "S08", "label": "Viewing Scale", "dimension": "spatial", "subcategory": "spatial_relation", "case_count": 9, "multi_image_case_count": 0, "description": "Spatial · Viewing Scale — accuracy (%)"}, {"key": "S09", "code": "S09", "label": "Localization", "dimension": "spatial", "subcategory": "spatial_relation", "case_count": 6, "multi_image_case_count": 6, "description": "Spatial · Localization — accuracy (%)"}, {"key": "S10", "code": "S10", "label": "Part-Whole Perception", "dimension": "spatial", "subcategory": "spatial_structure", "case_count": 24, "multi_image_case_count": 0, "description": "Spatial · Part-Whole Perception — accuracy (%)"}, {"key": "S11", "code": "S11", "label": "Geometric Regularities Reasoning", "dimension": "spatial", "subcategory": "spatial_structure", "case_count": 15, "multi_image_case_count": 0, "description": "Spatial · Geometric Regularities Reasoning — accuracy (%)"}, {"key": "S12", "code": "S12", "label": "Viewpoint Generation", "dimension": "spatial", "subcategory": "spatial_structure", "case_count": 26, "multi_image_case_count": 0, "description": "Spatial · Viewpoint Generation — accuracy (%)"}, {"key": "S13", "code": "S13", "label": "Environmental Structure Reasoning", "dimension": "spatial", "subcategory": "spatial_structure", "case_count": 19, "multi_image_case_count": 2, "description": "Spatial · Environmental Structure Reasoning — accuracy (%)"}, {"key": "S14", "code": "S14", "label": "Egocentric Scene Reconstruction", "dimension": "spatial", "subcategory": "spatial_structure", "case_count": 10, "multi_image_case_count": 10, "description": "Spatial · Egocentric Scene Reconstruction — accuracy (%)"}, {"key": "L01", "code": "L01", "label": "Path Searching", "dimension": "logical", "subcategory": "logical_explicit_rule_deduction", "case_count": 24, "multi_image_case_count": 0, "description": "Logical · Path Searching — accuracy (%)"}, {"key": "L02", "code": "L02", "label": "Mathematical Derivation", "dimension": "logical", "subcategory": "logical_explicit_rule_deduction", "case_count": 27, "multi_image_case_count": 0, "description": "Logical · Mathematical Derivation — accuracy (%)"}, {"key": "L03", "code": "L03", "label": "Game Deduction", "dimension": "logical", "subcategory": "logical_explicit_rule_deduction", "case_count": 37, "multi_image_case_count": 0, "description": "Logical · Game Deduction — accuracy (%)"}, {"key": "L04", "code": "L04", "label": "Puzzle Solving", "dimension": "logical", "subcategory": "logical_explicit_rule_deduction", "case_count": 35, "multi_image_case_count": 0, "description": "Logical · Puzzle Solving — accuracy (%)"}, {"key": "L05", "code": "L05", "label": "Pattern Prediction", "dimension": "logical", "subcategory": "logical_implicit_pattern_induction", "case_count": 39, "multi_image_case_count": 0, "description": "Logical · Pattern Prediction — accuracy (%)"}, {"key": "L06", "code": "L06", "label": "Visual Oddity Detection", "dimension": "logical", "subcategory": "logical_implicit_pattern_induction", "case_count": 18, "multi_image_case_count": 0, "description": "Logical · Visual Oddity Detection — accuracy (%)"}, {"key": "L07", "code": "L07", "label": "Rule Transfer", "dimension": "logical", "subcategory": "logical_implicit_pattern_induction", "case_count": 20, "multi_image_case_count": 20, "description": "Logical · Rule Transfer — accuracy (%)"}, {"key": "F01", "code": "F01", "label": "Physical Counterfactual", "dimension": "counterfactual", "subcategory": "counterfactual_counterfactual_imagination", "case_count": 23, "multi_image_case_count": 0, "description": "Counterfactual · Physical Counterfactual — accuracy (%)"}, {"key": "F02", "code": "F02", "label": "Chemical Counterfactual", "dimension": "counterfactual", "subcategory": "counterfactual_counterfactual_imagination", "case_count": 9, "multi_image_case_count": 0, "description": "Counterfactual · Chemical Counterfactual — accuracy (%)"}, {"key": "F03", "code": "F03", "label": "Biological Counterfactual", "dimension": "counterfactual", "subcategory": "counterfactual_counterfactual_imagination", "case_count": 8, "multi_image_case_count": 0, "description": "Counterfactual · Biological Counterfactual — accuracy (%)"}, {"key": "F04", "code": "F04", "label": "Astronomy Counterfactual", "dimension": "counterfactual", "subcategory": "counterfactual_counterfactual_imagination", "case_count": 7, "multi_image_case_count": 0, "description": "Counterfactual · Astronomy Counterfactual — accuracy (%)"}, {"key": "F05", "code": "F05", "label": "Geography Counterfactual", "dimension": "counterfactual", "subcategory": "counterfactual_counterfactual_imagination", "case_count": 8, "multi_image_case_count": 0, "description": "Counterfactual · Geography Counterfactual — accuracy (%)"}, {"key": "F06", "code": "F06", "label": "History Counterfactual", "dimension": "counterfactual", "subcategory": "counterfactual_counterfactual_imagination", "case_count": 7, "multi_image_case_count": 0, "description": "Counterfactual · History Counterfactual — accuracy (%)"}, {"key": "F07", "code": "F07", "label": "Music Theory Counterfactual", "dimension": "counterfactual", "subcategory": "counterfactual_counterfactual_imagination", "case_count": 4, "multi_image_case_count": 0, "description": "Counterfactual · Music Theory Counterfactual — accuracy (%)"}, {"key": "F08", "code": "F08", "label": "Computer Science Counterfactual", "dimension": "counterfactual", "subcategory": "counterfactual_counterfactual_imagination", "case_count": 4, "multi_image_case_count": 0, "description": "Counterfactual · Computer Science Counterfactual — accuracy (%)"}, {"key": "F09", "code": "F09", "label": "Anatomical Errors", "dimension": "counterfactual", "subcategory": "counterfactual_anomaly_correction_and_generation", "case_count": 10, "multi_image_case_count": 0, "description": "Counterfactual · Anatomical Errors — accuracy (%)"}, {"key": "F10", "code": "F10", "label": "Structural Anomalies", "dimension": "counterfactual", "subcategory": "counterfactual_anomaly_correction_and_generation", "case_count": 11, "multi_image_case_count": 0, "description": "Counterfactual · Structural Anomalies — accuracy (%)"}, {"key": "F11", "code": "F11", "label": "Relational Anomalies", "dimension": "counterfactual", "subcategory": "counterfactual_anomaly_correction_and_generation", "case_count": 9, "multi_image_case_count": 0, "description": "Counterfactual · Relational Anomalies — accuracy (%)"}], "links": {"paper": "https://arxiv.org/abs/2610.12343", "data": "https://huggingface.co/datasets/VisionXLab/RISEBench-plusplus", "outputs": "https://huggingface.co/datasets/VisionXLab/RISEBench-plusplus_Outputs", "github": "https://github.com/VisionXLab/RISEBench/tree/main/RISEBench%2B%2B"}, "judges": {"instruction_reasoning": "Gemini-3-Flash", "appearance_consistency": "Gemini-3-Flash", "visual_plausibility": "Gemini-3.1-Flash-Lite"}, "results_by_language": {"en": {"models": [{"id": "gpt-image-2-5-sunburst", "name": "GPT-Image-2.5 Sunburst"}, {"id": "nano-banana-pro", "name": "Nano Banana Pro"}, {"id": "nano-banana-2", "name": "Nano Banana 2"}, {"id": "gpt-image-2", "name": "GPT-Image-2"}, {"id": "gpt-image-2-5-flare", "name": "GPT-Image-2.5 Flare"}, {"id": "luma-uni-1", "name": "Luma Uni-1"}, {"id": "qwen-image-3-0", "name": "Qwen-Image-3.0"}, {"id": "nano-banana-2-lite", "name": "Nano Banana 2 Lite"}, {"id": "flux-2-max", "name": "FLUX.2 Max"}, {"id": "gpt-image-1-5", "name": "GPT-Image-1.5"}, {"id": "flux-2-pro", "name": "FLUX.2 Pro"}, {"id": "nano-banana", "name": "Nano Banana"}, {"id": "hunyuanimage-3-5", "name": "HunyuanImage-3.5"}, {"id": "wan2-7-image-pro", "name": "Wan2.7-Image-Pro"}, {"id": "gpt-image-1", "name": "GPT-Image-1"}, {"id": "qwen-image-2-0", "name": "Qwen-Image-2.0"}, {"id": "seedream-4-5", "name": "Seedream 4.5"}, {"id": "seedream-5-0", "name": "Seedream 5.0"}, {"id": "step-image-edit-2", "name": "Step Image Edit 2"}, {"id": "hunyuanimage-3-0-instruct", "name": "HunyuanImage-3.0-Instruct"}, {"id": "qwen-image-edit-2511", "name": "Qwen-Image-Edit-2511"}, {"id": "qwen-image-2-1", "name": "Qwen-Image-2.1"}, {"id": "firered-image-edit-1-0", "name": "FireRed-Image-Edit-1.0"}, {"id": "firered-image-edit-1-1", "name": "FireRed-Image-Edit-1.1"}, {"id": "qwen-image-edit-2509", "name": "Qwen-Image-Edit-2509"}, {"id": "hidream-o1-image", "name": "HiDream-O1-Image"}, {"id": "flux-2-dev", "name": "FLUX.2 Dev"}, {"id": "flux-2-klein-9b", "name": "FLUX.2 Klein 9B"}, {"id": "joyai-image-edit-plus", "name": "JoyAI-Image-Edit-Plus"}, {"id": "sensenova-u1-a3b-mot-sft", "name": "SenseNova-U1-A3B-MoT-SFT"}, {"id": "unipic-3-0", "name": "UniPic 3.0"}, {"id": "bagel-w-cot", "name": "BAGEL (w/ CoT)"}, {"id": "sensenova-u1-8b-mot-sft", "name": "SenseNova-U1-8B-MoT-SFT"}, {"id": "flux-2-klein-4b", "name": "FLUX.2 Klein 4B"}, {"id": "uniworld-v2", "name": "UniWorld-V2"}, {"id": "bagel", "name": "BAGEL"}, {"id": "omnigen2", "name": "OmniGen2"}, {"id": "omnigen", "name": "OmniGen"}, {"id": "emu2-gen", "name": "Emu2-Gen"}, {"id": "joyai-image-edit", "name": "JoyAI-Image-Edit"}, {"id": "step1x-edit-thinking", "name": "Step1X-Edit (thinking)"}, {"id": "boogu-image-0-1-edit", "name": "Boogu-Image-0.1-Edit"}, {"id": "step1x-edit-thinking-reflection", "name": "Step1X-Edit (thinking + reflection)"}, {"id": "longcat-image-edit", "name": "LongCat-Image-Edit"}, {"id": "step1x-edit-base", "name": "Step1X-Edit (base)"}, {"id": "internvl-u-w-cot", "name": "InternVL-U (w/ CoT)"}, {"id": "flux-1-kontext-dev", "name": "FLUX.1 Kontext Dev"}, {"id": "llada-image", "name": "LLaDA-Image"}, {"id": "ovis-u1", "name": "Ovis-U1"}, {"id": "internvl-u", "name": "InternVL-U"}, {"id": "unipic2-sd3-5m-kontext-2b", "name": "UniPic2-SD3.5M-Kontext-2B"}, {"id": "lumina-dimoo", "name": "Lumina-DiMOO"}, {"id": "uniworld-v1", "name": "UniWorld-V1"}, {"id": "rise-agent-ours", "name": "RISE-Agent (Ours)"}, {"id": "mindbrush", "name": "MindBrush"}, {"id": "interleavethinker", "name": "InterleaveThinker"}, {"id": "intentedit", "name": "IntentEdit"}, {"id": "imagent", "name": "ImAgent"}]}, "zh": {"models": [{"id": "gpt-image-2-5-sunburst", "name": "GPT-Image-2.5 Sunburst"}, {"id": "nano-banana-pro", "name": "Nano Banana Pro"}, {"id": "nano-banana-2", "name": "Nano Banana 2"}, {"id": "luma-uni-1", "name": "Luma Uni-1"}, {"id": "gpt-image-2", "name": "GPT-Image-2"}, {"id": "qwen-image-3-0", "name": "Qwen-Image-3.0"}, {"id": "gpt-image-2-5-flare", "name": "GPT-Image-2.5 Flare"}, {"id": "flux-2-max", "name": "FLUX.2 Max"}, {"id": "nano-banana-2-lite", "name": "Nano Banana 2 Lite"}, {"id": "gpt-image-1-5", "name": "GPT-Image-1.5"}, {"id": "nano-banana", "name": "Nano Banana"}, {"id": "flux-2-pro", "name": "FLUX.2 Pro"}, {"id": "hunyuanimage-3-5", "name": "HunyuanImage-3.5"}, {"id": "wan2-7-image-pro", "name": "Wan2.7-Image-Pro"}, {"id": "qwen-image-2-0", "name": "Qwen-Image-2.0"}, {"id": "seedream-4-5", "name": "Seedream 4.5"}, {"id": "seedream-5-0", "name": "Seedream 5.0"}, {"id": "gpt-image-1", "name": "GPT-Image-1"}, {"id": "step-image-edit-2", "name": "Step Image Edit 2"}, {"id": "hunyuanimage-3-0-instruct", "name": "HunyuanImage-3.0-Instruct"}, {"id": "qwen-image-2-1", "name": "Qwen-Image-2.1"}, {"id": "firered-image-edit-1-1", "name": "FireRed-Image-Edit-1.1"}, {"id": "flux-2-dev", "name": "FLUX.2 Dev"}, {"id": "qwen-image-edit-2511", "name": "Qwen-Image-Edit-2511"}, {"id": "qwen-image-edit-2509", "name": "Qwen-Image-Edit-2509"}, {"id": "firered-image-edit-1-0", "name": "FireRed-Image-Edit-1.0"}, {"id": "sensenova-u1-a3b-mot-sft", "name": "SenseNova-U1-A3B-MoT-SFT"}, {"id": "joyai-image-edit-plus", "name": "JoyAI-Image-Edit-Plus"}, {"id": "flux-2-klein-9b", "name": "FLUX.2 Klein 9B"}, {"id": "bagel-w-cot", "name": "BAGEL (w/ CoT)"}, {"id": "hidream-o1-image", "name": "HiDream-O1-Image"}, {"id": "flux-2-klein-4b", "name": "FLUX.2 Klein 4B"}, {"id": "uniworld-v2", "name": "UniWorld-V2"}, {"id": "sensenova-u1-8b-mot-sft", "name": "SenseNova-U1-8B-MoT-SFT"}, {"id": "unipic-3-0", "name": "UniPic 3.0"}, {"id": "bagel", "name": "BAGEL"}, {"id": "omnigen2", "name": "OmniGen2"}, {"id": "omnigen", "name": "OmniGen"}, {"id": "emu2-gen", "name": "Emu2-Gen"}, {"id": "joyai-image-edit", "name": "JoyAI-Image-Edit"}, {"id": "boogu-image-0-1-edit", "name": "Boogu-Image-0.1-Edit"}, {"id": "step1x-edit-thinking-reflection", "name": "Step1X-Edit (thinking + reflection)"}, {"id": "step1x-edit-thinking", "name": "Step1X-Edit (thinking)"}, {"id": "step1x-edit-base", "name": "Step1X-Edit (base)"}, {"id": "longcat-image-edit", "name": "LongCat-Image-Edit"}, {"id": "flux-1-kontext-dev", "name": "FLUX.1 Kontext Dev"}, {"id": "llada-image", "name": "LLaDA-Image"}, {"id": "internvl-u-w-cot", "name": "InternVL-U (w/ CoT)"}, {"id": "ovis-u1", "name": "Ovis-U1"}, {"id": "internvl-u", "name": "InternVL-U"}, {"id": "lumina-dimoo", "name": "Lumina-DiMOO"}, {"id": "uniworld-v1", "name": "UniWorld-V1"}, {"id": "unipic2-sd3-5m-kontext-2b", "name": "UniPic2-SD3.5M-Kontext-2B"}, {"id": "rise-agent-ours", "name": "RISE-Agent (Ours)"}, {"id": "mindbrush", "name": "MindBrush"}, {"id": "interleavethinker", "name": "InterleaveThinker"}, {"id": "intentedit", "name": "IntentEdit"}, {"id": "imagent", "name": "ImAgent"}]}}}, {"id": "risebench", "name": "RISEBench", "case_count": 360, "available_result_languages": ["en"], "accuracy_unit": "%", "metric_unit": "/100", "score_decimals": 1, "default_sort": "total", "dimensions": [{"key": "temporal", "label": "Temporal", "description": "Infer how a scene changes over time."}, {"key": "causal", "label": "Causal", "description": "Reason about causes, actions, and their consequences."}, {"key": "spatial", "label": "Spatial", "description": "Reason about spatial relationships and transformations."}, {"key": "logical", "label": "Logical", "description": "Apply explicit rules, patterns, and logical constraints."}], "metrics": [{"key": "instruction_reasoning", "label": "Instruction Reasoning", "description": "Whether the edit realizes the intended reasoning outcome."}, {"key": "appearance_consistency", "label": "Appearance Consistency", "description": "Whether content that should remain unchanged is preserved."}, {"key": "visual_plausibility", "label": "Visual Plausibility", "description": "Visual quality and plausibility; logical tasks are excluded."}], "accuracy_columns": [{"key": "temporal", "label": "Temporal", "description": "Infer how a scene changes over time."}, {"key": "causal", "label": "Causal", "description": "Reason about causes, actions, and their consequences."}, {"key": "spatial", "label": "Spatial", "description": "Reason about spatial relationships and transformations."}, {"key": "logical", "label": "Logical", "description": "Apply explicit rules, patterns, and logical constraints."}, {"key": "total", "label": "Overall", "description": "Accuracy on the complete RISEBench-360 benchmark."}], "links": {"paper": "https://arxiv.org/abs/2504.02826", "data": "https://huggingface.co/datasets/PhoenixZ/RISEBench", "outputs": "https://huggingface.co/datasets/zpy777/RISEBench_Outputs", "github": "https://github.com/VisionXLab/RISEBench/tree/main/RISEBench"}, "judges": {"instruction_reasoning": "GPT-4o", "appearance_consistency": "GPT-4o", "visual_plausibility": "GPT-4o"}, "results_by_language": {"en": {"models": [{"id": "gpt-image-1-5", "name": "GPT-Image-1.5"}, {"id": "gpt-image-2", "name": "GPT-Image-2"}, {"id": "gemini-3-pro-image-preview-nano-banana-pro", "name": "Gemini-3-pro-image-preview (Nano Banana-pro)"}, {"id": "gemini-2-5-flash-image-nano-banana", "name": "Gemini-2.5-Flash-Image (Nano Banana)"}, {"id": "gpt-image-1", "name": "GPT-Image-1"}, {"id": "gpt-image-1-mini", "name": "GPT-Image-1-mini"}, {"id": "qwen-image-edit-2511", "name": "Qwen-Image-Edit-2511"}, {"id": "bagel-w-cot", "name": "BAGEL (w/ CoT)"}, {"id": "gemini-2-0-flash-exp", "name": "Gemini-2.0-Flash-exp"}, {"id": "seedream-4-0", "name": "Seedream-4.0"}, {"id": "gemini-2-0-flash-pre", "name": "Gemini-2.0-Flash-pre"}, {"id": "qwen-image-edit-2509", "name": "Qwen-Image-Edit-2509"}, {"id": "bagel", "name": "BAGEL"}, {"id": "flux-1-kontext-dev", "name": "FLUX.1-Kontext-Dev"}, {"id": "ovis-u1", "name": "Ovis-U1"}, {"id": "step1x-edit", "name": "Step1X-Edit"}, {"id": "omnigen", "name": "OmniGen"}, {"id": "emu2", "name": "EMU2"}, {"id": "hidream-edit", "name": "HiDream-Edit"}, {"id": "flux-1-canny", "name": "FLUX.1-Canny"}]}}}]}</script><script src="portal.js" defer></script></body></html>