Benchmark · four coders · gold labels withheld

CAPBENCH-English

A gold standard for automated policy coding. Three domains, three units of analysis, four independent coders on every text — and machines scored only against the items where all four agreed.

01

CAPBENCH-English-Easy

The Easy tier: the 3,677 held-out items on which all four human coders independently agreed. Every entrant is scored on the same items under the protocol below. Accuracy is agreement with the four-coder label; κ is Cohen's kappa against it. Runtime is wall-clock for the full set, which is a property of the deployment as much as the model — read it next to where it ran, not on its own.

1
NVIDIA A100 40 GB · fine-tuned XLM-R classifier
1.5 min · 41/s · 3,677 items
in-house production classifier · beats every prompted model and is 20× faster · strongest on media body (90.1%), the unit the LLMs find hardest · weakest on bill titles (62.7%), mostly filing boilerplate
82.1%
κ 0.809
2
2 × NVIDIA H100 80 GB · llama.cpp · UD-Q4_K_XL
259 min · 0.2/s · 3,677 items
the same weights as the thinking-off row below, allowed to reason inside the budget (thinking capped at 300 tokens so thinking and answer fit the protocol's 400) — 1.8 points better, and level with the fine-tuned leader at 82.0 against 82.1 · 0 unparseable · NPC 637 against 721 · 0.2 items/s on two H100s: the Next architecture is slow in this llama.cpp build
82.0%
κ 0.807
3
NVIDIA A100 40 GB · llama.cpp · Q5_K_M
102 min · 0.6/s · 3,677 items
the same weights as the row below, on a local 5-bit quantised build, and it lands 0.2 points apart — quantisation and serving stack cost essentially nothing here, the model is the model · 0 unparseable · wall-clock is not a clean speed figure: a duplicate process competed for part of the run
82.0%
κ 0.806
4
Shared managed inference API · 4 concurrent workers
31.0 min · 2.0/s · 3,677 items
0.2 points below the self-hosted run of the same weights · 0 unparseable in 3,677 · wall-clock is queue, not model speed
81.8%
κ 0.805
5
4 × NVIDIA H100 80 GB · llama.cpp · UD-Q4_K_XL
104 min · 0.6/s · 3,677 items
the same weights as the thinking-off row lower down, allowed to reason inside the budget (thinking capped at 300 tokens so thinking and answer fit the protocol's 400) — 11.6 points better · 0 unparseable · NPC 622 against 721 · runs on the same fork of the inference server as its thinking-off row
81.1%
κ 0.797
6
NVIDIA A100 80 GB · llama.cpp · Q8_0
41 min · 1.5/s · 3,677 items
re-run on one A100 80 GB after the first run lost 64 media-body items to a serving outage and scored 79.8 with them counted wrong — the 3,613 answers it did give the first time came back 99.0% identical · 0 unparseable · NPC 775 against 721
81.0%
κ 0.794
7
8 × NVIDIA H100 80 GB · llama.cpp · UD-Q4_K_XL
147 min · 0.4/s · 3,677 items
the same weights as the thinking-off row near the foot of the board, allowed to reason inside the budget (thinking capped at 300 tokens) — 24.2 points better, second only to DeepSeek's reasoning effect · 1 unparseable, scored wrong · NPC 631 against 721
80.6%
κ 0.792
8
2 × NVIDIA H100 80 GB · llama.cpp · UD-Q4_K_XL
182 min · 0.3/s · 3,677 items
125B mixture-of-experts, 6B active, thinking off as for every entrant with a thinking switch · 0 unparseable · NPC 648 against 721 · 0.3 items/s on two A100s
80.2%
κ 0.787
9
3 × NVIDIA H100 80 GB · llama.cpp · UD-Q4_K_XL
40 min · 1.6/s · 3,677 items
the same weights as the thinking-off row at the foot of the board, allowed to reason inside the budget (thinking capped at 300 tokens) — 28.7 points better, the largest reasoning effect on the board; a reasoning-native model denied its reasoning is a different system · 0 unparseable · NPC 622 against 721
79.9%
κ 0.785
10
16-core CPU, no GPU
38 min · 1.6/s · 3,677 items
third-party fine-tuned XLM-R · beats 13 of the 21 prompted runs, from a CPU · best NPC calibration here, 661 predicted against 721 in the key
79.9%
κ 0.784
11
8 × NVIDIA H100 80 GB · llama.cpp · UD-Q4_K_XL
204 min · 0.3/s · 3,677 items
the same weights as the thinking-off row below, allowed to reason inside the budget (thinking capped at 300 tokens) — only 0.4 points better, the smallest reasoning effect on the board · 14 unparseable, scored wrong · NPC 622 against 721
78.7%
κ 0.772
12
8 × NVIDIA H100 80 GB · llama.cpp · UD-Q4_K_XL
40 min · 1.5/s · 3,677 items
1T-parameter mixture-of-experts, the largest model in the round, thinking off as for every entrant with a thinking switch · 0 unparseable · under-calls NPC, 561 against 721
78.3%
κ 0.768
13
NVIDIA A100 40 GB · llama.cpp · MXFP4
41 min · 1.5/s · 3,677 items
beats both servings of its 120B sibling, by 1.6 and 2.9 points, at a sixth of the parameters — on this task, scale is not the lever
77.0%
κ 0.753
14
NVIDIA A100 40 GB · llama.cpp · Q4_K_XL
48 min · 1.3/s · 3,677 items
quantisation-aware build · 5.6 points below the 31B of the same family
76.2%
κ 0.744
15
Shared managed inference API · 4 concurrent workers
24.2 min · 2.5/s · 3,677 items
the largest model of the first round; the same weights self-hosted land 1.3 points below · 18 unparseable, scored wrong · under-calls NPC, 537 against 721
75.4%
κ 0.737
16
NVIDIA H100 80 GB · llama.cpp · MXFP4
13 min · 4.9/s · 3,677 items
the same weights as the managed gpt-oss:120b row, on one local card at the same low reasoning effort — 1.3 points apart, so the serving stack moves this model about as little as it moves the two Gemma runs · 0 unparseable · under-calls NPC, 579 against 721
74.1%
κ 0.723
17
Anthropic Messages API · 8 concurrent requests · thinking disabled
9.9 min · 6.2/s · 3,677 items
the commercial entrant, on the verbatim prompt with thinking disabled; the API refuses the temperature parameter, so this is the one entrant not run at temperature 0 · under-calls NPC, 302 against 721 · 0 unparseable · a first run under a two-column rendering of the same code list, with the model's default adaptive thinking left on, scored 77.0
72.5%
κ 0.709
18
4 × NVIDIA H100 80 GB · llama.cpp · UD-Q4_K_XL
58 min · 1.1/s · 3,677 items
the current GLM generation, thinking off as for every entrant with a thinking switch — 11.5 points above its predecessor GLM-4.7-Flash and 12.5 below the best prompted model · over-calls no-policy-content, 761 against 721 · 0 unparseable · the only model that needed a fork of the inference server (its reasoning row runs on it too): its architecture post-dates the release we serve
69.5%
κ 0.670
19
NVIDIA H100 80 GB · llama.cpp · MXFP4
— · — · 3,677 items
the same weights and card as the low-effort row with the reasoning channel closed — 12.1 points lower; the two gpt-oss models ran the round at low effort, this row shows what the thinking-off setting of the other entrants would have cost them · 0 unparseable · NPC 638 against 721
62.0%
κ 0.593
20
8 × NVIDIA H100 80 GB · llama.cpp · UD-Q4_K_XL
40 min · 1.6/s · 3,677 items
675B, not a reasoning model, so it has one row · 2 unparseable, scored wrong · over-calls no-policy-content, 1,392 against 721 — nearly twice the key, the widest over-call on the board
60.1%
κ 0.556
21
NVIDIA A100 40 GB · llama.cpp · Q6_K_XL
23 min · 7.1/s · 3,677 items
fastest of the first round by 5× on identical hardware, and 2.1 points behind the next protocol row, Mistral-Large-3 · output was clean, 0 unparseable — the gap is coding, not format · over-calls no-policy-content, 881 against 721
58.0%
κ 0.545
22
8 × NVIDIA H100 80 GB · llama.cpp · UD-Q4_K_XL
38 min · 1.6/s · 3,677 items
753B, thinking off as for every entrant with a thinking switch — 24.2 points below its own reasoning row and 13.1 below the smaller GLM-5.3-Flash · 9 unparseable, scored wrong · NPC 663 against 721
56.4%
κ 0.533
23
3 × NVIDIA H100 80 GB · llama.cpp · UD-Q4_K_XL
21 min · 2.9/s · 3,677 items
a 284B mixture-of-experts run with its reasoning switched off, as every entrant with a thinking switch is · it answered Government Operations on 1,057 of 3,677 items, 517 of them items all four coders called no-policy-content, and called NPC only 174 times against 721 — a reasoning-native model denied its reasoning · 0 unparseable
51.2%
κ 0.489

Read the numbers against the right baseline. These items are the subset on which four trained humans agreed unanimously — the unanimous-agreement subset, the easiest items by construction. A κ here is therefore not comparable with the human inter-coder κ, which is measured across the whole corpus including the contested items. The honest reading of 75% accuracy is: on text where four coders saw the same thing, the model still disagrees with all four once in four.

02

CAPBENCH-English-Intermediate

A second tier, harder by construction: the 2,245 items where exactly three of the four coders agreed and one dissented. The label is the majority; the dissent is withheld with it. Easy asks whether a system can match a unanimous human verdict. Intermediate asks whether it lands on the majority side of a split one — which is the case that actually decides a coding project.

2,245items, exactly 3 of 4 agreed
456bills and laws
875legislative speech
914media
1
NVIDIA A100 40 GB · fine-tuned XLM-R classifier
1 min · 39/s · 2,245 items
loses 16.1 points against its own Easy score — on items where one coder dissented, the leader agrees with the majority two times in three
66.0%
κ 0.637
2
NVIDIA A100 80 GB · llama.cpp · Q8_0
30 min · 1.2/s · 2,245 items
loses 16.3 points from Easy · it ranked 6th on Easy and 2nd here, so the split items reorder the board rather than merely compressing it · matched the one dissenting coder on 19.2% of items · 0 unparseable
64.7%
κ 0.622
3
4 × NVIDIA H100 80 GB · llama.cpp · UD-Q4_K_XL
83 min · 0.5/s · 2,245 items
loses 16.8 points from Easy · 12.5 points above its own thinking-off row · matched the one dissenting coder on 18.4% of items · 0 unparseable
64.3%
κ 0.621
4
2 × NVIDIA H100 80 GB · llama.cpp · UD-Q4_K_XL
111 min · 0.3/s · 2,245 items
loses 18.1 points from Easy · 1.5 points above its own thinking-off row · matched the one dissenting coder on 18.9% of items · 0 unparseable
63.9%
κ 0.617
5
8 × NVIDIA H100 80 GB · llama.cpp · UD-Q4_K_XL
113 min · 0.3/s · 2,245 items
loses 16.7 points from Easy · 18.4 points above its own thinking-off row · matched the one dissenting coder on 18.3% of items · 0 unparseable
63.9%
κ 0.617
6
2 × NVIDIA A100 40 GB · llama.cpp · Q5_K_M
47 min · 0.8/s · 2,245 items
0.2 points from the managed run of the same weights, exactly as on Easy · run as two halves on two GPUs, so the wall-clock is the slower half, not a single-card figure
63.9%
κ 0.615
7
Shared managed inference API · 4 concurrent workers
9.4 min · 4.0/s · 2,245 items
0.2 points behind its self-hosted twin, and within 2.3 points of the fine-tuned classifier · 0 unparseable · loses 18.1 points from Easy
63.7%
κ 0.613
8
3 × NVIDIA H100 80 GB · llama.cpp · UD-Q4_K_XL
24 min · 1.6/s · 2,245 items
loses 17.1 points from Easy · 20.9 points above its own thinking-off row · matched the one dissenting coder on 21.0% of items · 0 unparseable
62.8%
κ 0.603
9
2 × NVIDIA H100 80 GB · llama.cpp · UD-Q4_K_XL
76 min · 0.5/s · 2,245 items
loses 17.8 points from Easy · matched the one dissenting coder on 19.0% of items · 0 unparseable
62.4%
κ 0.601
10
16-core CPU, no GPU
26.0 min · 1.4/s · 2,245 items
drops 19.1 points from Easy, the steepest fall on the board but Kimi-K2.6's 19.9 · of the items it misses, close to half carry the code the dissenting fourth coder chose
60.8%
κ 0.586
11
8 × NVIDIA H100 80 GB · llama.cpp · UD-Q4_K_XL
136 min · 0.3/s · 2,245 items
loses 19.0 points from Easy · 1.3 points above its own thinking-off row · matched the one dissenting coder on 20.0% of items · 16 unparseable, scored wrong
59.7%
κ 0.574
12
NVIDIA A100 40 GB · llama.cpp · Q4_K_XL
12.1 min · 3.1/s · 2,245 items
loses 16.6 points from Easy
59.6%
κ 0.570
13
Shared managed inference API · 4 concurrent workers
16.3 min · 2.3/s · 2,245 items
19 unparseable, scored wrong · still finishes 0.8 points above its 20B sibling here, reversing the Easy result where the smaller model won
59.2%
κ 0.567
14
NVIDIA H100 80 GB · llama.cpp · MXFP4
8.7 min · 4.3/s · 2,245 items
loses 15.4 points from Easy · 0.5 points below the managed run of the same weights · matched the one dissenting coder on 21.5% of items · 0 unparseable
58.7%
κ 0.561
15
NVIDIA A100 40 GB · llama.cpp · MXFP4
28.4 min · 1.3/s · 2,245 items
loses 18.6 points from Easy · 10 answers came back unparseable and are scored wrong
58.4%
κ 0.559
16
8 × NVIDIA H100 80 GB · llama.cpp · UD-Q4_K_XL
30 min · 1.2/s · 2,245 items
loses 19.9 points from Easy, the steepest fall on the board · matched the one dissenting coder on 21.0% of items · 0 unparseable
58.4%
κ 0.559
17
Anthropic Messages API · 8 concurrent requests · thinking disabled
6.1 min · 6.1/s · 2,245 items
loses 15.1 points from Easy · matched the one dissenting coder on 19.2% of items · 0 unparseable · wall-clock is API latency over 8 concurrent requests, not a per-device rate
57.4%
κ 0.551
18
4 × NVIDIA H100 80 GB · llama.cpp · UD-Q4_K_XL
45 min · 0.8/s · 2,245 items
loses 17.7 points from Easy · 7.7 points above its predecessor GLM-4.7-Flash · matched the one dissenting coder on 18.1% of items · 0 unparseable
51.8%
κ 0.485
19
NVIDIA H100 80 GB · llama.cpp · MXFP4
— · — · 2,245 items
loses 14.0 points from Easy · 10.7 points below the low-effort run of the same weights · matched the one dissenting coder on 22.4% of items · 0 unparseable
48.0%
κ 0.444
20
8 × NVIDIA H100 80 GB · llama.cpp · UD-Q4_K_XL
28 min · 1.3/s · 2,245 items
loses 10.9 points from Easy · matched the one dissenting coder on 19.7% of items · 3 unparseable
45.5%
κ 0.417
21
8 × NVIDIA H100 80 GB · llama.cpp · UD-Q4_K_XL
29 min · 1.3/s · 2,245 items
loses 15.7 points from Easy · matched the one dissenting coder on 20.8% of items · 3 unparseable
44.4%
κ 0.388
22
NVIDIA A100 40 GB · llama.cpp · Q6_K_XL
6.4 min · 5.8/s · 2,245 items
again the fastest, and the weakest but for DeepSeek · 0 unparseable, so the deficit is coding rather than format · one in five of its answers matches the dissenting coder
44.1%
κ 0.399
23
3 × NVIDIA H100 80 GB · llama.cpp · UD-Q4_K_XL
13 min · 2.9/s · 2,245 items
loses only 9.3 points from Easy, the smallest fall on the board, from the lowest base · last on this tier too · matched the one dissenting coder on 20.6% of items · 0 unparseable
41.9%
κ 0.385

Same protocol, same prompt, same withheld-label rule — only the item set differs, so the two tiers are directly comparable. Twenty-three runs are scored here; nothing is still queued. The tier sizes shown for Intermediate (2,245) and Difficult (954) predate the final exclusion rules; the manuscript uses 2,232 and 942, and these two tiers will be re-scored on that basis. Two things stand out. Every model drops sharply — the leader loses 16.1 points moving from unanimous items to split ones, a fair estimate of how much of an Easy score depends on the question being easy. And the order changes: Qwen3.8-27B rises from 6th on Easy to 2nd here, while the two fine-tuned classifiers spread apart. An Easy rank does not predict an Intermediate rank, which is the case for running both. 365 of the majority labels are “no policy content.”

03

CAPBENCH-English-Difficult

The 954 items where two coders agreed and the other two each chose something different. Every item carries exactly three distinct codes from four trained humans. There is no consensus here to match, so the reference label is a plurality of two in four — half the panel said something else. Read the accuracy figure accordingly: it measures whether a system lands on the largest bloc, not whether it is right.

954items, 2 agreed and 2 split
155bills and laws
307legislative speech
492media
1
NVIDIA A100 80 GB · llama.cpp · Q8_0
15 min · 1.1/s · 954 items
leads this tier having placed 6th on Easy · answers outside all four human codes on only 14.6%, second only to DeepSeek with its reasoning on, and matched a dissenter on a further 39.4% · 0 unparseable
46.0%
κ 0.411
2
Shared managed inference API · 4 concurrent workers
4.3 min · 3.7/s · 954 items
same kappa as the leader on a slightly lower plurality rate · 38.8% matched a dissenter, 15.8% off-panel · 0 unparseable
45.4%
κ 0.411
3
2 × NVIDIA H100 80 GB · llama.cpp · UD-Q4_K_XL
46 min · 0.3/s · 954 items
3rd here with reasoning on · 39.4% matched a dissenter, 15.5% off-panel · 0 unparseable
45.1%
κ 0.414
4
8 × NVIDIA H100 80 GB · llama.cpp · UD-Q4_K_XL
55 min · 0.3/s · 954 items
11.1 points above its own thinking-off row · 38.7% matched a dissenter, 16.5% off-panel · 0 unparseable
44.9%
κ 0.413
5
NVIDIA A100 40 GB · llama.cpp · Q5_K_M
23.3 min · 0.7/s · 954 items
0.7 points from the managed run of the same weights — across all three tiers the pair never separates by more than that · 39.6% matched a dissenter, 15.7% off-panel
44.7%
κ 0.403
6
NVIDIA A100 40 GB · fine-tuned XLM-R classifier
14 s · 68/s · 954 items
wins both easier tiers and places 6th here · it has the highest dissenter-match of the leading group at 40.7% and the lowest off-panel rate of any classifier at 15.3%, so it is not answering badly — the fine-tuning simply does not extend its edge to contested items · 60× faster than anything near it
44.0%
κ 0.398
7
4 × NVIDIA H100 80 GB · llama.cpp · UD-Q4_K_XL
42 min · 0.4/s · 954 items
5.9 points above its own thinking-off row · 40.4% matched a dissenter, 16.1% off-panel · 0 unparseable
43.5%
κ 0.395
8
3 × NVIDIA H100 80 GB · llama.cpp · UD-Q4_K_XL
12 min · 1.3/s · 954 items
13.9% off-panel, the lowest of any entrant, and 42.6% matched a dissenter — with its reasoning on, the model that answered outside the human panel on a third of items answers inside it more often than anyone · 0 unparseable
43.5%
κ 0.392
9
2 × NVIDIA H100 80 GB · llama.cpp · UD-Q4_K_XL
31 min · 0.5/s · 954 items
41.9% matched a dissenter, 16.0% off-panel · 0 unparseable · 3.1 points below its own reasoning row
42.0%
κ 0.380
10
NVIDIA A100 40 GB · llama.cpp · Q4_K_XL
6.3 min · 2.5/s · 954 items
off-panel on 20.2%, five points wider than its 31B sibling — the two Gemma sizes separate further here than on either easier tier
42.0%
κ 0.377
11
Shared managed inference API · 4 concurrent workers
7.7 min · 2.1/s · 954 items
matched a dissenting coder on 41.3%, fourth-highest on the board — when it misses the plurality it lands on a human reading more often than models placed above it · 15 unparseable, scored wrong
41.7%
κ 0.378
12
NVIDIA H100 80 GB · llama.cpp · MXFP4
4.2 min · 3.8/s · 954 items
exactly the plurality rate of the managed run of the same weights, ranked below it on kappa (0.375 against 0.378) · 41.5% matched a dissenter, third-highest on the board, 16.8% off-panel · 0 unparseable
41.7%
κ 0.375
13
8 × NVIDIA H100 80 GB · llama.cpp · UD-Q4_K_XL
16 min · 1.0/s · 954 items
2.6 points above its own reasoning row · 38.9% matched a dissenter, 19.7% off-panel · 0 unparseable
41.4%
κ 0.378
14
16-core CPU, no GPU
12.1 min · 1.3/s · 954 items
the second fine-tuned classifier, and it falls four places from Easy · tied with gpt-oss-20b on plurality to the item, separated only on kappa · 22.7% off-panel
40.0%
κ 0.367
15
NVIDIA A100 40 GB · llama.cpp · MXFP4
13.9 min · 1.1/s · 954 items
beat its 120B sibling on Easy and loses to it on both harder tiers · exactly tied with ParlaCAP at 382 of 954, ranked below it on kappa · 10 unparseable
40.0%
κ 0.360
16
8 × NVIDIA H100 80 GB · llama.cpp · UD-Q4_K_XL
62 min · 0.3/s · 954 items
2.6 points below its own thinking-off row — the one model whose reasoning row falls behind on this tier · 40.6% matched a dissenter, 20.6% off-panel · 9 unparseable, scored wrong
38.8%
κ 0.348
17
Anthropic Messages API · 8 concurrent requests · thinking disabled
2.6 min · 6.0/s · 954 items
41.2% matched a dissenter, 20.5% off-panel · 0 unparseable · 17th of 23 on every tier
38.3%
κ 0.347
18
4 × NVIDIA H100 80 GB · llama.cpp · UD-Q4_K_XL
21 min · 0.7/s · 954 items
36.0% matched a dissenter, 26.4% off-panel — a quarter of its answers are a code no human coder chose · 0 unparseable
37.6%
κ 0.324
19
8 × NVIDIA H100 80 GB · llama.cpp · UD-Q4_K_XL
16 min · 1.0/s · 954 items
36.5% matched a dissenter, 27.6% off-panel · 3 unparseable
36.0%
κ 0.268
20
NVIDIA H100 80 GB · llama.cpp · MXFP4
— · — · 954 items
38.6% matched a dissenter, 26.3% off-panel — ten points wider than the same weights at low effort · 0 unparseable
35.1%
κ 0.299
21
8 × NVIDIA H100 80 GB · llama.cpp · UD-Q4_K_XL
15 min · 1.0/s · 954 items
38.2% matched a dissenter, 28.1% off-panel · 0 unparseable
33.8%
κ 0.280
22
NVIDIA A100 40 GB · llama.cpp · Q6_K_XL
3.3 min · 4.8/s · 954 items
second-last on both harder tiers and third-last on Easy, and the gap widens as the items harden · 30.3% of its answers are a code no human coder chose — double the leaders — so here the deficit really is error, not defensible disagreement · 0 unparseable
33.1%
κ 0.269
23
3 × NVIDIA H100 80 GB · llama.cpp · UD-Q4_K_XL
6.3 min · 2.5/s · 954 items
last on all three tiers · 33.0% of its answers are a code no human coder chose, the widest off-panel rate on the board · 38.6% matched a dissenter · 0 unparseable
28.4%
κ 0.237

Because a majority does not exist, each row also reports two figures the other tiers do not need: how often the model matched one of the two dissenting coders, and how often it answered outside all four human codes. That second number is the one worth watching — it separates a model picking a defensible human reading from one that is simply wrong. Twenty-three runs are scored; nothing is still queued. The tier sizes shown for Intermediate (2,245) and Difficult (954) predate the final exclusion rules; the manuscript uses 2,232 and 942, and these two tiers will be re-scored on that basis. Two results carry beyond this page. First, the fine-tuned classifiers do not hold up: poltextlab-english-cap-v5 wins Easy and Intermediate and places 6th here, and ParlaCAP falls from 10th to 14th, while general models climb — Qwen3.8-27B goes 6th, 2nd, 1st across the three tiers. Task-specific fine-tuning buys agreement with consensus, not with contested judgement. Second, most of what looks like failure is not: for the leading models, roughly five in six answers are a code some human coder chose. The exceptions are the bottom of the board, where GLM-4.7-Flash answers outside the human panel on 30.3% and DeepSeek-V4-Flash, run with its reasoning switched off, on 33.0% — twice the leaders — which is the honest way to tell error apart from disagreement. The split concentrates at the no-policy-content boundary: it is the plurality label on 200 items, but on 372 it is a dissenter who called an item no-policy.

04

A private-label benchmark

Texts are released; the gold labels are withheld and held by the benchmark operator. There is no training split. Teams bring models and workflows that are already trained, and are scored only by submission against the held-out labels — the design Kaggle competitions and the GLUE and SuperGLUE suites use to keep a test set from leaking into the models it measures.

3domains: bills and laws, legislative speech, media
3units per text: sentence, paragraph, document
4independent coders per domain
3,677held-out items, gold labels withheld
05

What a closed test is, and why

A closed — or private-label, or held-out — benchmark releases the material to be coded and keeps the correct answers. There is no training split to fit against and no public key to check yourself against; the only way to learn your score is to submit and be told. Kaggle competitions work this way, and so do the GLUE and SuperGLUE suites that set the convention in language evaluation.

01

A published answer key stops measuring generalisation

Once labels are public they end up in training data — scraped, redistributed, or pasted into a prompt. A model trained afterwards may have seen the answers, and the benchmark keeps producing numbers while quietly measuring memory instead of skill. Nothing in the score tells you which one you are looking at.

02

We have watched it happen in-house

On one of our own classifiers, an older deployed model scored macro F1 0.894 on a held-out split against a newly trained model’s 0.828 — an apparently decisive win. Every one of those test rows turned out to sit in the older model’s own training files. Its published card, scored on a clean set, reports 0.57. The flattering number was contamination, and only checking the overlap revealed it.

03

You cannot tune against a score you cannot see

With a private key there is no gradient to climb by resubmission. A system is scored on text it has never been fitted to, which is the only condition under which a leaderboard position says anything about the next corpus.

04

One harness, so differences are the system

Every entrant gets the same items, the same prompt, the same truncation and the same decoding settings, published in advance. Two scores differ because the systems differ, not because one had a better scaffold.

05

One item set, unanimously labelled

Every item was coded independently by four trained humans, and only the units where all four agreed enter the benchmark. The label a model is scored against is therefore not one annotator’s judgement but four converging — which is what makes a disagreement with it meaningful.

OPEN

Released

Every item’s text, in full
The domain and unit of analysis
Source metadata — congress, chamber, speaker, outlet, section, date, URL
The exact prompt, truncation limit and decoding settings
The codebook: 21 CAP major topics plus a no-policy-content code
Human reliability for every domain and unit is reported in the accompanying manuscript, which is under review

HELD

Withheld

The gold labels — held only by the benchmark operator
Any training split: there is none; entrants bring already-trained systems
Per-item results, so no entrant can reconstruct the key from its own score
The bills summary field, which paraphrases a bill’s topic
Existing machine predictions carried in the source sheets

Closed does not mean secretive: everything needed to reproduce the conditions is public, only the answers are not.

C·1

Submitters cannot do their own error analysis

Without per-item feedback you learn your score, not where you went wrong. We return aggregate breakdowns by domain, unit and topic — enough to diagnose, not enough to reconstruct the key.

C·2

The operator is a bottleneck

Someone has to run every submission. That is the price of the key staying private, and it caps how fast the leaderboard can move.

C·3

The labels are the ceiling, and they are not perfect

A closed test protects the key from leaking; it does not make the key correct. That is why human reliability is reported in the accompanying manuscript (under review) rather than left out — a benchmark whose own labels disagree cannot certify a model past that point.

06

The protocol

Fixed and published in advance, so that a difference between two entrants is a difference between the systems and not between their harnesses. This is the prompt every entrant on the leaderboard below was scored under, verbatim.

Items3,677 — every unit on which all four human coders independently agreed
Taskone CAP major topic code per item
Promptprompted models: the text below, verbatim, one item per call (file prompt_v1.txt, SHA-256 8181c223…f197d9). Fine-tuned classifiers: no prompt — supply a one-to-one mapping from your labels to the CAP codes
Truncation6,000 characters (affects 204 of the 3,677 items: long media bodies, whole speeches and bill documents)
Temperature0
Max tokens400 — high enough that a reasoning model can finish; a short answer simply uses fewer
Metadatasupplied in the input file, deliberately kept out of the prompt — entrants are scored on the text
Unparseable answercounts as wrong, never as missing
You are coding a text to the Comparative Agendas Project (CAP) major topic scheme.

Read the text and assign exactly ONE code from this list:

1 Macroeconomics
2 Civil Rights, Minority Issues, and Civil Liberties
3 Health
4 Agriculture
5 Labor and Employment
6 Education
7 Environment
8 Energy
9 Immigration
10 Transportation
12 Law, Crime, and Family Issues
13 Social Welfare
14 Housing and Community Development
15 Banking, Finance, and Domestic Commerce
16 Defense
17 Space, Science, Technology and Communications
18 Foreign Trade
19 International Affairs and Foreign Aid
20 Government Operations
21 Public Lands and Water Management
23 Culture and Arts
999 No policy content

Rules:
- Code the policy topic the text is ABOUT, not the institution that produced it.
- 20 Government Operations is a substantive policy topic (the machinery of
  government, appropriations process, agency structure, elections administration).
  It is not a residual category for text you cannot place.
- Use 999 only when the text carries no policy content at all.
- Answer with the code number and nothing else. No explanation, no punctuation.

TEXT:
{TEXT}
07

How to enter

Bring a trained system. There is no training split to fit against, and no submission is scored twice under different conditions.

1 · Request the itemsEmail poltextlab@poltextlab.com with the subject CAPBENCH-English submission. You get the 3,677 items as JSONL — item_id, text, and source metadata. No labels.
2 · Code themOne CAP major topic per item, under the protocol above. Prompted models use the published prompt verbatim; a fine-tuned classifier submits its own label mapping instead.
3 · ReturnJSONL of {item_id, code}, one line per item, plus a short description of the system, its version, and the hardware and wall-clock — those go on the board next to the score.
4 · ScoringDone by the benchmark operator against the withheld labels. You receive accuracy, κ, and breakdowns by domain, unit and topic — never per-item results, which would let the key be reconstructed.

One entry per system version. An unparseable answer counts as wrong, not as missing, so return a code for every item.

08

Status

The benchmark is open for submissions across all three domains. Entrants are scored off-box against the withheld labels and posted to the scoreboard above; the round is continuous, and new entrants are added as they are run.

Scores are provisional while the round is open, and an entrant may be re-run if the protocol changes — in which case every entrant is re-run, never one alone.