HONESTY.TOOLSAn independent research observatory

FLOOR v1 · certified benchmark splits

Can the label be read
off the surface?

FLOOR takes a labelled benchmark, removes the items whose label a cheap text probe can guess, re-runs every check on what is left, and certifies the result. If the set can't be cleaned without falling below a fixed size, it says so instead.

19
published datasets
1
certified
0
not certified
18
not certifiable

How it works

A benchmark that asks whether a model can tell true from false (or known from unknown) is only measuring that if the label can't be predicted from the wording alone. FLOOR checks that directly.

1 · Filter

An AFLite-style filter (Le Bras et al. 2020, arXiv 2002.04108) drops 5% of items per round from both tails of the cue rate, then re-screens. It stops when the screens go quiet (adjusted p ≥ 0.2) or when it reaches the floor.

2 · The floor

The kept set may never shrink below the larger of 50% of the source and 320 pairs. The 50% share means a certificate still describes the benchmark, not a hand-picked corner of it. 320 is the smallest n at which an exact two-sided sign test at α = 0.05/8 (Bonferroni over 8 held-out probes) has at least 80% power against a 60/40 probe. For unpaired sets the floor is the larger of 50% of the items and 640 items, with at least 320 per class.

3 · Gates

Every gate must pass on the kept set. A borderline result counts as a failure.

Statuses

CERTIFIED

Every gate passes on a kept set at or above the floor.

NOT_CERTIFIED

The kept set is at or above the floor, but a gate fails.

NOT_CERTIFIABLE

The set can't be cleaned without collapsing: the source is below the floor, the filter reached the floor with screens still firing, or a fixed subset given without filtering is below the floor. Gates are still run and reported.

Status of every published dataset

19 datasets with a licence that permits redistribution. One certifies: aperture/postcutoff-trials-v1, all 702 items kept, worst held-out probe function words at A* 0.550 (adjusted p 0.1334). A* is max(AUROC, 1 − AUROC): how well a probe separates the two labels in either direction, where 0.5 is chance. A* is not comparable across rows of different size. Every number below is read from the linked certificate.

DatasetLicenceModeSource → keptFloorStatusFailing gatesWorst held-out probeEvidence
aperture/postcutoff-trials-v1Apache-2.0 (ours)unpaired702 → 702 items640 items≥320 per classCERTIFIEDnonefunction words A* 0.550adj p 0.1334, 8 probescertificate ↗
truthfulqa-binary (790-pair set)final for v1Apache-2.0paired790 → 405 pairs395 pairsNOT_CERTIFIABLEfilter reached the floor with cues still firingin-family (paired), in-family (unpaired), held-out probes, negation cuechar n-gram A* 0.760adj p 0.0004998, 8 probescertificate ↗
aperture/calibration-battery-v1Apache-2.0 (ours)unpaired168 → 168 items640 items≥320 per classNOT_CERTIFIABLEsource below floor; kept set below floor; filter reached the floor with cues still firingin-family (unpaired), held-out probeschar n-gram A* 0.986adj p 0.0004998, 8 probescertificate ↗
aperture/grounding-coordinateApache-2.0 (ours)unpaired162 → 162 items640 items≥320 per classNOT_CERTIFIABLEsource below floor; kept set below floor; filter reached the floor with cues still firingin-family (unpaired), held-out probesmean word length A* 0.628adj p 0.0004998, 8 probescertificate ↗
aperture/knowledge-prominence-v1Apache-2.0 (ours)unpaired324 → 324 items640 items≥320 per classNOT_CERTIFIABLEsource below floor; kept set below floorheld-out probescapitals A* 0.550adj p 0.07846, 8 probescertificate ↗
aperture/knowledge-prominence-v2Apache-2.0 (ours)unpaired296 → 296 items640 items≥320 per classNOT_CERTIFIABLEsource below floor; kept set below floornonecapitals A* 0.549adj p 0.1729, 8 probescertificate ↗
aperture/knowledge-prominence-v3built 2026-10-27 from scratch, recorded builderApache-2.0 (ours)unpaired1,968 → 1,011 items984 items≥320 per classNOT_CERTIFIABLEfilter reached the floor with cues still firingin-family (unpaired), held-out probeschar n-gram A* 0.761adj p 0.0004998, 8 probescertificate ↗
aperture/photon-entitiesApache-2.0 (ours)unpaired103 → 103 items640 items≥320 per classNOT_CERTIFIABLEsource below floor; kept set below floor; filter reached the floor with cues still firingin-family (unpaired), held-out probeschar n-gram A* 0.865adj p 0.0004998, 8 probescertificate ↗
aperture/prominence-people-v1Apache-2.0 (ours)unpaired168 → 168 items640 items≥320 per classNOT_CERTIFIABLEsource below floor; kept set below floor; filter reached the floor with cues still firingin-family (unpaired)capitals A* 0.554adj p 0.1989, 8 probescertificate ↗
aperture/prominence-people-v2Apache-2.0 (ours)unpaired156 → 156 items640 items≥320 per classNOT_CERTIFIABLEsource below floor; kept set below floorheld-out probesmean word length A* 0.648adj p 0.003998, 8 probescertificate ↗
aperture/verifydomain-claims-147Apache-2.0 (ours)unpaired147 → 147 items640 items≥320 per classNOT_CERTIFIABLEsource below floor; kept set below floor; filter reached the floor with cues still firingin-family (unpaired), held-out probeschar n-gram A* 0.941adj p 0.0004998, 8 probescertificate ↗
bielik-entity-familiarity-v2MITunpaired1,440 → 1,440 items720 items≥320 per classNOT_CERTIFIABLEsource below floor; kept set below floor; filter reached the floor with cues still firingin-family (unpaired), held-out probeschar n-gram A* 0.846adj p 0.0004998, 8 probescertificate ↗
hallucinated-references/gpt-4MITunpaired1,000 → 697 items640 items≥320 per classNOT_CERTIFIABLEfilter reached the floor with cues still firingin-family (unpaired), held-out probeschar n-gram A* 0.765adj p 0.0004998, 8 probescertificate ↗
halueval/dialogueseeded 2,000-pair sample of 10,000MITpaired2,000 → 1,027 pairs1,000 pairsNOT_CERTIFIABLEfilter reached the floor with cues still firingin-family (paired), in-family (unpaired), held-out probes, negation cuechar n-gram A* 0.823adj p 0.0004998, 8 probescertificate ↗
halueval/generalMITunpaired4,507 → 2,314 items2,254 items≥320 per classNOT_CERTIFIABLEfilter reached the floor with cues still firingin-family (unpaired), held-out probes, negation cuechar n-gram A* 0.617adj p 0.0004998, 8 probescertificate ↗
halueval/qaseeded 2,000-pair sample of 10,000MITpaired2,000 → 1,027 pairs1,000 pairsNOT_CERTIFIABLEfilter reached the floor with cues still firingin-family (paired), in-family (unpaired), held-out probes, negation cuepunctuation A* 0.924adj p 0.0004998, 8 probescertificate ↗
halueval/summarizationseeded 2,000-pair sample of 10,000MITpaired2,000 → 1,027 pairs1,000 pairsNOT_CERTIFIABLEfilter reached the floor with cues still firingin-family (paired), in-family (unpaired), held-out probeschar n-gram A* 0.944adj p 0.0004998, 8 probescertificate ↗
ragtruth/responsesseeded 4,000-item stratified sample of the audit's 8,000MITunpaired4,000 → 2,052 items2,000 items≥320 per classNOT_CERTIFIABLEfilter reached the floor with cues still firingin-family (unpaired), held-out probescapitals A* 0.608adj p 0.0004998, 8 probescertificate ↗
truth-is-universal/factsMITunpaired561 → 561 items640 items≥320 per classNOT_CERTIFIABLEsource below floor; kept set below floor; filter reached the floor with cues still firingin-family (unpaired), held-out probes, negation cuenegation A* 0.544adj p 0.0004998, 8 probescertificate ↗

A negative result we kept

truthfulqa-binary is final as NOT_CERTIFIABLE for v1. We also piloted rewriting 100 pairs with a language model to remove the cues. 82 of 100 passed a meaning check, but the rewrites still carried the signal: negation 31:3 and character n-gram A* 0.780, against 34:5 and 0.707 for the same 82 original pairs. Balancing negation by selection instead came out NOT_CERTIFIED. In TruthfulQA, negation is part of what the correct answers say, so it can't be removed without changing them. We published the negative result rather than tune until something passed.

Caveats

Reproduce it

Everything is in the honestytools repository (Apache-2.0). The scripts need Python 3 and numpy. Third-party data is fetched from its source, never committed.

python3 benchmark/certified/floor-v1/make_inputs.py INPUTS
python3 benchmark/certified/certify_unpaired.py INPUTS/aperture__postcutoff-trials-v1.json --out DIR --text-key entity
python3 benchmark/certified/certify_paired_np.py INPUTS/halueval__qa.json --out DIR --name halueval__qa-sample2000

Pass --stratum-key category for sets with several categories. Each certificate records the sha256 of its input and of the kept set, plus the replay command, so a rerun can be checked byte for byte.