+ {/* Header */}
+
+
+
+
+
+
+
Review Dashboard
+
Multi-LLM review scores, consensus, and appeals
+
+
+
+
+ {/* Stats cards */}
+
+ }
+ label="Total Reviews"
+ value={stats?.total_reviews ?? '—'}
+ color="bg-purple-bg"
+ />
+ }
+ label="Pass Rate"
+ value={stats ? `${(stats.pass_rate * 100).toFixed(0)}%` : '—'}
+ color="bg-emerald-bg"
+ />
+ }
+ label="Dispute Rate"
+ value={stats ? `${(stats.dispute_rate * 100).toFixed(0)}%` : '—'}
+ color="bg-status-warning/10"
+ />
+ }
+ label="Today"
+ value={stats?.reviews_today ?? '—'}
+ sublabel="reviews today"
+ color="bg-magenta-bg"
+ />
+ }
+ label="Open Appeals"
+ value={stats?.open_appeals ?? '—'}
+ color="bg-status-info/10"
+ />
+ }
+ label="Avg Review Time"
+ value={stats ? `${stats.avg_review_time_hours.toFixed(1)}h` : '—'}
+ color="bg-forge-800"
+ />
+
+
+ {/* Provider stats */}
+ {stats?.provider_stats && (
+
+ Provider Comparison
+
+ {stats.provider_stats.map((p) => {
+ const colorMap: Record
= {
+ claude: 'text-purple-light',
+ codex: 'text-emerald',
+ gemini: 'text-status-info',
+ };
+ const bgMap: Record = {
+ claude: 'bg-purple-bg',
+ codex: 'bg-emerald-bg',
+ gemini: 'bg-status-info/10',
+ };
+ const barMap: Record = {
+ claude: 'bg-purple',
+ codex: 'bg-emerald',
+ gemini: 'bg-status-info',
+ };
+ return (
+
+
+ {p.provider}
+
+
+
+ Reviews
+ {p.total_reviews}
+
+
+ Avg Score
+
+ {p.avg_score.toFixed(2)}
+
+
+
+ Avg Time
+ {(p.avg_review_time_seconds / 60).toFixed(0)}m
+
+ {/* Score bar */}
+
+
+
+ );
+ })}
+
+
+ )}
+
+ {/* Submission review lookup */}
+
+ Submission Review
+
+
setSubmissionId(e.target.value)}
+ placeholder="Enter submission ID to view reviews..."
+ className="flex-1 px-3 py-2 rounded-lg bg-forge-800 border border-border text-sm text-text-primary placeholder:text-text-muted focus:outline-none focus:border-border-active"
+ />
+
+
+
+
+
+
+ {/* Review scores */}
+ {reviewsLoading && (
+
+ )}
+
+ {reviewsData && (
+
+ {/* Consensus panel */}
+
+
+
+
+ {/* LLM scores */}
+
+
LLM Scores
+ {reviewsData.reviews.map((review: LLMReviewScore, i: number) => (
+ setExpandedReview(expandedReview === id ? null : id)}
+ />
+ ))}
+
+
+ )}
+
+ {/* Appeals section */}
+
+ {appealsLoading ? (
+
+ ) : (
+
+ )}
+
+
+