Canadian Case-Law Benchmark

LexBench

Frontier language models, judged on how faithfully they brief Canadian case law.

Leader · Closed-book (recall from case name)Claude Opus 4.80.633

Updated 16 Jul 20262 tracks8 modelsprimary metric: Rubric scorewith 95% CIsraw data (JSON)

Leaderboard

Closed-book (recall from case name)50 cases · 8 models

The model receives only the case name and must recall the brief from parametric knowledge — a knowledge test, sensitive to training contamination.

Leaderboard — Closed-book (recall from case name)
# Model Rubric score valid · 95% CI Judge Cosine Grounded Format Trunc Refuse $/case Latency Cases
1 Claude Opus 4.8 Anthropic 0.633 [0.58–0.68] 0.79 0.65 0.83 94% 0% 6% $0.0261 17.2s 47/50
2 GPT-5.6 OpenAI 0.543 [0.48–0.60] 0.71 0.62 0.75 84% 0% 8% $0.0518 57.8s 42/50
3 Grok 4.5 xAI 0.502 [0.45–0.55] 0.62 0.63 0.65 98% 0% 2% $0.0119 22.1s 49/50
4 Claude Sonnet 4.6 Anthropic 0.468 [0.40–0.53] 0.57 0.62 0.57 92% 0% 8% $0.0098 17.3s 46/50
5 GPT-5.5 OpenAI 0.467 [0.42–0.52] 0.70 0.61 0.77 96% 0% 4% $0.0763 65.9s 48/50
6 Gemini 2.5 Pro Google 0.464 [0.40–0.53] 0.48 0.61 0.47 100% 0% 0% $0.0211 22.1s 50
7 DeepSeek Chat v3.1 DeepSeek 0.293 [0.25–0.34] 0.31 0.55 0.32 100% 0% 0% $0.0004 22.4s 50
8 Llama 4 Maverick Meta 0.208 [0.17–0.25] 0.23 0.53 0.25 98% 0% 0% $0.0002 9.3s 49/50

Click a column header to sort · hover headers for metric definitions.

Rubric score by brief section — hover a bar for its value

0.00.20.40.60.81.0Claude Opus 4.8 · facts: 0.526Claude Opus 4.8 · issue: 0.890Claude Opus 4.8 · decision: 0.770Claude Opus 4.8 · reasons: 0.624Claude Opus 4.8 · ratio: 0.581Claude Opus 4.8GPT-5.6 · facts: 0.467GPT-5.6 · issue: 0.782GPT-5.6 · decision: 0.715GPT-5.6 · reasons: 0.512GPT-5.6 · ratio: 0.480GPT-5.6Grok 4.5 · facts: 0.474Grok 4.5 · issue: 0.759Grok 4.5 · decision: 0.628Grok 4.5 · reasons: 0.437Grok 4.5 · ratio: 0.459Grok 4.5Claude Sonnet 4.6 · facts: 0.404Claude Sonnet 4.6 · issue: 0.714Claude Sonnet 4.6 · decision: 0.624Claude Sonnet 4.6 · reasons: 0.410Claude Sonnet 4.6 · ratio: 0.457Claude Sonnet 4.6GPT-5.5 · facts: 0.371GPT-5.5 · issue: 0.759GPT-5.5 · decision: 0.524GPT-5.5 · reasons: 0.447GPT-5.5 · ratio: 0.458GPT-5.5Gemini 2.5 Pro · facts: 0.414Gemini 2.5 Pro · issue: 0.567Gemini 2.5 Pro · decision: 0.601Gemini 2.5 Pro · reasons: 0.447Gemini 2.5 Pro · ratio: 0.389Gemini 2.5 ProDeepSeek Chat v3.1 · facts: 0.222DeepSeek Chat v3.1 · issue: 0.363DeepSeek Chat v3.1 · decision: 0.417DeepSeek Chat v3.1 · reasons: 0.291DeepSeek Chat v3.1 · ratio: 0.289DeepSeek Chat v3.1Llama 4 Maverick · facts: 0.188Llama 4 Maverick · issue: 0.219Llama 4 Maverick · decision: 0.306Llama 4 Maverick · reasons: 0.196Llama 4 Maverick · ratio: 0.143Llama 4 Maverick
FactsIssueDecisionReasonsRatio

Leaderboard

Open-book (brief from decision text)20 cases · 8 models

The model is given the full decision text and must brief it — a reading/extraction task that is contamination-resistant.

Leaderboard — Open-book (brief from decision text)
# Model Rubric score valid · 95% CI Judge Cosine Grounded Format Trunc Refuse $/case Latency Cases
1 Claude Opus 4.8 Anthropic 0.974 [0.96–0.98] 0.96 0.98 100% 0% 0% $0.1247 25.2s 20
2 Claude Sonnet 4.6 Anthropic 0.934 [0.92–0.95] 0.97 0.99 100% 0% 0% $0.0540 30.9s 20
3 Grok 4.5 xAI 0.914 [0.89–0.94] 0.93 0.97 100% 0% 0% $0.0258 9.7s 20
4 GPT-5.5 OpenAI 0.901 [0.88–0.93] 0.95 0.98 100% 0% 0% $0.0861 19.3s 20
5 GPT-5.6 OpenAI 0.888 [0.85–0.92] 0.95 0.98 100% 0% 0% $0.0817 18.3s 20
6 Gemini 2.5 Pro Google 0.778 [0.75–0.80] 0.93 0.98 90% 0% 0% $0.0381 35.9s 18/20
7 DeepSeek Chat v3.1 DeepSeek 0.703 [0.66–0.74] 0.90 0.95 100% 0% 0% $0.0025 22.7s 20
8 Llama 4 Maverick Meta 0.609 [0.57–0.65] 0.86 0.93 100% 0% 0% $0.0018 12.1s 20

Click a column header to sort · hover headers for metric definitions.

Rubric score by brief section — hover a bar for its value

0.00.20.40.60.81.0Claude Opus 4.8 · facts: 0.949Claude Opus 4.8 · issue: 1.000Claude Opus 4.8 · decision: 0.976Claude Opus 4.8 · reasons: 0.985Claude Opus 4.8 · ratio: 1.000Claude Opus 4.8Claude Sonnet 4.6 · facts: 0.929Claude Sonnet 4.6 · issue: 0.960Claude Sonnet 4.6 · decision: 0.980Claude Sonnet 4.6 · reasons: 0.904Claude Sonnet 4.6 · ratio: 0.968Claude Sonnet 4.6Grok 4.5 · facts: 0.820Grok 4.5 · issue: 1.000Grok 4.5 · decision: 0.972Grok 4.5 · reasons: 0.920Grok 4.5 · ratio: 0.968Grok 4.5GPT-5.5 · facts: 0.828GPT-5.5 · issue: 0.980GPT-5.5 · decision: 0.967GPT-5.5 · reasons: 0.887GPT-5.5 · ratio: 0.968GPT-5.5GPT-5.6 · facts: 0.772GPT-5.6 · issue: 0.980GPT-5.6 · decision: 0.962GPT-5.6 · reasons: 0.899GPT-5.6 · ratio: 0.948GPT-5.6Gemini 2.5 Pro · facts: 0.570Gemini 2.5 Pro · issue: 0.948Gemini 2.5 Pro · decision: 0.866Gemini 2.5 Pro · reasons: 0.806Gemini 2.5 Pro · ratio: 0.956Gemini 2.5 ProDeepSeek Chat v3.1 · facts: 0.542DeepSeek Chat v3.1 · issue: 0.897DeepSeek Chat v3.1 · decision: 0.835DeepSeek Chat v3.1 · reasons: 0.687DeepSeek Chat v3.1 · ratio: 0.863DeepSeek Chat v3.1Llama 4 Maverick · facts: 0.505Llama 4 Maverick · issue: 0.789Llama 4 Maverick · decision: 0.832Llama 4 Maverick · reasons: 0.504Llama 4 Maverick · ratio: 0.792Llama 4 Maverick
FactsIssueDecisionReasonsRatio

Metrics

Each brief is measured on several independent axes, because no single number captures legal quality.

  • rubric score — HealthBench-style checklist grading (primary when present). A strong model authors 12–20 atomic, point-weighted, case-specific criteria per case — grounded in the human reference brief or the decision text, including negative criteria for likely hallucinations — and a grader model only verifies whether each criterion is met. Score = weight met ÷ total weight. Checking a specific criterion is far more verifiable than holistic scoring, which restores discrimination at the top. Rubrics are versioned in rubrics/rubrics.json.
  • judge score — A strong judge model grades each section 1–5 on accuracy, completeness, and groundedness (freedom from invented facts/holdings/citations), normalised to 0–1. It grades against the reference brief (closed-book) or the decision text (open-book).
  • cosine — embedding similarity (all-mpnet-base-v2) between the brief and the reference. A cheap topical signal, kept as a secondary check; it cannot tell a fluent-but-wrong brief from a correct one.
  • grounded — mean judge groundedness; higher means fewer fabricated facts, parties, holdings, or citations.
  • format — share of responses that returned valid JSON.
  • trunc — share cut off by the completion-token cap. Truncated and malformed responses are execution failures: they are excluded from the quality mean and reported here instead, so the headline score never mixes legal quality with infrastructure policy. (A strict all-rows mean is kept in data.json for anyone who prefers failures counted as zero.)
  • refuse — share where the model declined ("I don't know"), reported separately so calibrated abstention is not confused with a wrong answer.
  • $/case — mean cost per case from token usage × list price.
  • latency — mean wall-clock seconds per case.

95% confidence intervals are percentile bootstraps over cases (fixed seed); the thin line beneath each score bar spans the interval. Because every model sees the same cases, ranking gaps are tested with a paired bootstrap on per-case differences; a ≈ marks a gap whose paired 95% CI includes zero (hover it for the interval). Sections lacking a human reference are excluded from reference-mode judging rather than scored against nothing. Sample sizes are small, so treat rankings as provisional.

Dataset

Sources

Closed-book briefs — human-written Supreme Court of Canada case summaries scraped from public case-brief wikis; used as reference answers.

Open-book & temporal holdout — full decision text from A2AJ (Access to Algorithmic Justice), an open corpus of 191k+ Canadian decisions. Holdout cases are drawn from dates that postdate current model training cutoffs.

Composition

Closed-book (recall from case name)
8 models · 50 cases
Open-book (brief from decision text)
8 models · 20 cases

Licensing. A2AJ methods are MIT; individual decisions retain upstream terms (often non-commercial). Full decision text is not republished here — only case name, citation, court, date, and scores.

Reproducibility & contamination

How to reproduce

models
pinned in ai_models.csv (OpenRouter ids)
decoding
temperature 0, capped max tokens
judge
qwen/qwen3-max
rubric author/grader
anthropic/claude-opus-4.8
embedding
all-mpnet-base-v2
prompt
fixed system + task prompt (see benchmark.py)
code
okelot/LLMBenchmarkForCCL

Contamination controls

Closed-book uses public cases whose summaries may appear in training data, so a high score there can reflect memorisation. The open-book and temporal holdout tracks counter this: open-book supplies the text (a reading task, not recall), and the holdout uses decisions issued after model cutoffs, which cannot have been memorised.

Provider routing on OpenRouter may vary backend/quantization run to run (served model/provider are recorded per row in newer runs); pin a provider for byte-exact reproducibility. Some reasoning models ignore the requested temperature — the decoding config actually applied is recorded, not assumed.

Judge caveats. Current data is graded by a judge from a family with no contestant on the board (Qwen), blind to model identity. A judge-swap experiment (OpenAI-family judge vs cross-family judge, same briefs) shifted absolute scores materially and moved mid-table order — treat scores as judge-relative, not absolute. Notably, the OpenAI judge ranked an OpenAI model above Claude Opus on closed-book; the cross-family judge reversed that. Open-book scores show a ceiling effect under both judges and rubrics (most ratings perfect), so top-of-table open-book gaps are weak evidence. Next mitigations: multi-judge panels and a human-graded calibration sample.