Entailment Labs benchmarks

Suite · Document intelligence

Messy Scan

What degradation does to extraction, and how much of the volume survives without a person.

Charter 1.0.0, section 2

Unit scored: one document. Headline metric: document-level straight-through-processing rate.

Built from datasets/messy-scan/.

On this page: leaderboard, metric definitions, difficulty tiers, reproduce, versions and hashes.

Status

Leaderboard

The tier here describes the exercise, not an item in a dataset: this suite has no labelled set and no language dimension. Selected slice: every tier. No count is published for this slice. The filter changes the denominator a row would be measured over. Every measured cell reads not run in every slice.

No sort applied. Rows are in source order.

Messy Scan — every system scored by the same harness, from the same commit, on the same data
openaiOpenAInot setnot runnot runnot run0not run — OPENAI_API_KEY not set; no reachable model interface
anthropicAnthropicnot setnot runnot runnot run0not run — ANTHROPIC_API_KEY not set; no reachable model interface
googleGooglenot setnot runnot runnot run0not run — GOOGLE_API_KEY not set; no reachable model interface
mistralMistralnot setnot runnot runnot run0not run — MISTRAL_API_KEY not set; no reachable model interface
local-vllmself-hostednot setnot runnot runnot run0not run — LOCAL_OPENAI_BASE_URL not set; no reachable model interface
local-ollamaself-hostednot setnot runnot runnot run0not run — LOCAL_OPENAI_BASE_URL not set; no reachable model interface
aws-textractAmazon Web ServicesAnalyzeDocumentnot runnot runnot run0not run — AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY not set; no reachable model interface
azure-document-intelligenceMicrosoft Azureprebuilt-documentnot runnot runnot run0not run — AZURE_DOCUMENT_INTELLIGENCE_ENDPOINT, AZURE_DOCUMENT_INTELLIGENCE_KEY not set; no reachable model interface
google-document-aiGoogle Cloudnot setnot runnot runnot run0not run — GOOGLE_APPLICATION_CREDENTIALS, GOOGLE_DOCAI_PROCESSOR not set; no reachable model interface
http-endpointgenericnot setnot runnot runnot run0not run — ENTAIL_HTTP_ENDPOINT_URL not set; no reachable model interface
entail-pipelineEntailment Labsnot setnot runnot runnot run0not run — ENTAIL_HTTP_ENDPOINT_URL not set; no reachable model interface

Column headings sort the table. A figure that was never produced sorts last in both directions; it is not a low score. A model version reading "not set" is a decision a person makes before a run, per charter 10.3; the harness stores no version string that nobody chose. Charter 5.6: our own system is scored by the same harness, from the same commit, with the same prompts, and sits wherever the sort puts it, with no highlight and no position advantage.

Document-level straight-through-processing rate, by system

Nothing to plot. No system has been run, so there is no document-level straight-through-processing rate to draw. Charter 10.4: a chart with no run renders an empty state, not example bars. The reason for each row is in the status column above.

Metric definitions

Read from charter 1.0.0 section 3 when this page was built. Each metric carries its formula, its numerator, its denominator and its exclusions, and each has clause language in charter/contract-clauses.md so it can be written into a statement of work. The charter's arithmetic examples are left out here: they are invented numbers that demonstrate a formula, and beside a table of "not run" they would read as results.

Field-level accuracy

Charter 1.0.0 section 3.3 · read it in the charter · SOW clause 2

Formula

Field-level accuracy = correct field instances ÷ field instances assessed.

Numerator

Field instances whose returned value matches the labelled value under the match rule for that field type. Match rules, which are the rules already used in 06-delivery/build-standards.md section 6.1: exact for identifiers and codes; normalised for dates (compared as ISO 8601 calendar dates), amounts (compared as a numeric value plus a currency code, with separators, symbols and whitespace removed), and names (case, punctuation, diacritics, honorifics and multiple spaces normalised); free-text fields scored only where a tolerance rule is stated, and reported separately from the exact and normalised fields. A field the ground truth marks absent is correct only if the system returns an explicit null or empty value for it.

Denominator

Every field instance in the ground truth for the documents scored, plus every field instance the system returned that has no counterpart in the ground truth. A returned field that should not exist counts as one assessed instance and is always incorrect. This is the point of the rule: a system cannot raise its accuracy by inventing fields, and it cannot raise it by returning fewer.

Excluded

Fields outside the published schema for that document type. Field instances whose ground truth is marked unreadable by the labeller, which are counted and reported as a separate line rather than scored. Documents that failed to process at all, which are excluded from this metric and counted under the processing-failure line, never dropped from the manifest.

Reported as

Overall, per field, per document type, per tier and per language, with three-run mean and spread.

Contract sentence

"Field-level accuracy means the number of field instances whose returned value matches the labelled value under the match rules in Schedule [X], divided by the number of field instances assessed, where field instances assessed comprise every field instance in the labelled set for the documents scored plus every field returned by the System for which the labelled set holds no counterpart. The Provider shall achieve field-level accuracy of not less than placeholder percent, measured on the labelled set named in clause [X] at each measurement point."

Document-level straight-through-processing rate

Charter 1.0.0 section 3.4 · read it in the charter · SOW clause 3

Formula

Straight-through-processing rate = documents released with no human touch ÷ documents admitted to processing. Straight-through means zero human touch, not "little human touch", and not "approved quickly".

Numerator

Documents whose output was released to the downstream system without any human action of any kind: no review-queue entry, no field correction, no approval action, no reviewer opening the item. One exception, stated so that measurement does not corrupt the measure: a document drawn into the sampled-audit queue (AUDIT in 06-delivery/build-standards.md section 7.1) still counts as straight-through if the audit reviewer changed nothing, because the audit is a measurement device applied after release. If the audit review changed the output, the document is not straight-through and is counted as an exception under section 3.5.

Denominator

Documents admitted to processing in the window: documents received, less documents rejected before processing by a pre-processing rule named in the statement of work. Both counts are reported, so the effect of the admission rule on the rate is visible.

Excluded

Documents rejected before processing by a named rule, which are counted and reported separately. Documents still in flight at the end of the window, which are counted and reported as in flight; the window is chosen so that the in-flight share is small enough to state.

Reported as

Overall and per tier, per document type and per language, always beside field-level accuracy on the same row. Straight-through rate on its own is not a result: a system that releases everything untouched scores 100 percent and may be wrong on most of it.

Contract sentence

"Straight-through-processing rate means the number of Documents released to the Partner's downstream system with no human action of any kind, divided by the number of Documents admitted to processing in the measurement window, where a Document drawn into the sampled audit is treated as straight-through only if the audit did not change its output. The Provider shall achieve a straight-through-processing rate of not less than placeholder percent while maintaining field-level accuracy at or above the floor in clause [X], and neither measure is satisfied without the other."

Exception rate

Charter 1.0.0 section 3.5 · read it in the charter · SOW clause 4

Formula

Exception rate = documents that entered human review ÷ documents admitted to processing.

Numerator

Documents with at least one review-queue entry under the codes LOWCONF, VALFAIL, FLAG, FAIL or DRIFT, plus documents drawn into the sampled audit whose output the reviewer changed. A document counts once however many fields triggered it and however many times it re-entered the queue; the count of re-entries is reported separately.

Denominator

Documents admitted to processing, the same denominator as section 3.4. The harness asserts the identity: straight-through rate plus exception rate equals one. A supplier's figures that do not satisfy that identity are using two different denominators, and the report says so.

Excluded

Sampled-audit draws that confirmed the output unchanged, which are reported separately as the audit rate. Documents rejected before processing by a named rule. Queue entries created by the partner for training or calibration, which are counted separately.

Reported as

Overall, by entry code, per tier and per confidence threshold, because the exception rate is a function of the threshold and moves the moment the threshold does.

Contract sentence

"Exception rate means the number of Documents that entered the human review queue under any entry code other than a sampled audit that resulted in no change, divided by the number of Documents admitted to processing in the measurement window. The Provider shall keep the exception rate at or below placeholder percent, measured over a calendar month at the confidence thresholds recorded in the configuration in force during that month, and shall state any threshold change and its date in the Monthly Report."

Confidence calibration, expected calibration error

Charter 1.0.0 section 3.6 · read it in the charter · SOW clause 5

Why it is here

A review queue is built on a confidence threshold. If the confidence is not calibrated, the threshold routes the wrong items, and both the accuracy floor and the exception ceiling become unreachable at the same time. Calibration is therefore a delivery metric, not a research one.

Formula

Expected calibration error = the sum over bins of (instances in the bin ÷ total instances) × the absolute difference between the accuracy of the bin and the mean reported confidence of the bin.

Numerator and denominator

The unit is one field instance for the document suites, one decision for the voice and back-office suites. For each bin: accuracy of the bin = correct instances in the bin ÷ instances in the bin; mean confidence of the bin = the mean of the reported confidences in the bin. The weight of each bin is instances in the bin ÷ total instances carrying a reported confidence. Ten equal-width bins on the interval zero to one are the default; any other binning is stated with the figure, because the bin count changes the number.

Excluded

Instances for which the system reports no confidence, which are counted and reported as unscored for calibration with their share of the total. A system that reports no confidence at all is reported as "no confidence output". It is never reported as an expected calibration error of zero. Instances excluded from accuracy under section 3.3.4 are excluded here too.

Reported with

Two figures always travel with the expected calibration error: the reliability diagram, and the high-confidence check, which is the accuracy of instances whose reported confidence is at or above 0.95. The high-confidence check is what a threshold actually depends on.

Contract sentence

"Expected calibration error means the weighted mean absolute difference between the accuracy and the mean reported confidence of each of ten equal-width confidence bins, measured over field instances carrying a reported confidence. The Provider shall keep the expected calibration error at or below placeholder, and shall ensure that field instances returned with a confidence of 0.95 or above are correct in not less than placeholder percent of cases. Where either measure is missed, the Provider shall recalibrate the confidence thresholds at no charge and restate the resulting exception rate before the change is applied."

<!-- Benchmark charter, part 2. Indexed in ../methodology.md. Sections 3.7 to 3.13. -->

Cost per document

Charter 1.0.0 section 3.7 · read it in the charter · SOW clause 6

Formula

Cost per document = total run cost ÷ documents admitted to processing.

Numerator

Every charge incurred to process the documents in the run: input, output and any separately billed reasoning tokens; per-page or per-request charges for document services; the charges for retries and for calls that failed and were repeated; and, for a self-hosted model, the compute rate stated in harness/prices.yaml multiplied by the measured occupancy. Charges are taken from published list prices on a stated date. The price list date is printed with the figure.

Denominator

Documents admitted to processing, as in section 3.4. Cost is reported per document, and also per page and per thousand documents, because document size differs between suites and between partners.

Excluded

Human review labour, which is measured separately in section 3.16 and combined with this figure only in the net cost per item in the Exception Economics report. One-off build and integration cost. The cost of running the harness itself. Negotiated discounts, committed-use pricing and any private rate, all of which are excluded because they are not reproducible by a reader; a partner's own effective price is expected to differ, and section 9.4 says so plainly.

Contract sentence

"Cost per document means the total provider and compute charges incurred in processing Documents in the measurement window, at the list prices in force on the date stated in the Monthly Report, divided by the number of Documents admitted to processing. The Provider shall keep the cost per document at or below placeholder in the currency stated in clause [X], and shall notify the Partner within placeholder Business Days of any provider price change that would take the figure above that ceiling, together with the options to restore it."

Latency

Charter 1.0.0 section 3.8 · read it in the charter · SOW clause 7

Formula

Latency is a distribution over documents, not a ratio. Report the 50th, 95th and 99th percentiles by the nearest-rank method, with the mean, the maximum and the count.

What is timed

From the moment the document is admitted to processing, which the harness records immediately before the first provider call and which in production is the intake timestamp, to the moment the complete validated output is written, or the moment the document enters the review queue, whichever comes first. Both endpoints are recorded in the audit trail.

Numerator, denominator and population

Latency is a duration, not a ratio: each observation is one document's elapsed time, so there is no numerator to count. The denominator is the count of documents in the population, and it is what fixes the rank a percentile lands on. The population is documents that completed, in the window or in the scored split. The population size is printed with every percentile, because a percentile over a handful of documents is one document.

Excluded

Time waiting in the review queue, which is queue age and belongs to operations, not to the system. Documents that failed to process, whose times are reported separately as failure times. Time spent in rate-limit backoff, which is reported twice, once with backoff included and once without, because backoff is a property of the account, not of the model.

Contract sentence

"Latency means the elapsed time from admission of a Document to processing until the complete validated output is written or the Document enters the human review queue, whichever occurs first, reported as the 50th, 95th and 99th percentiles by the nearest-rank method over Documents completed in the measurement window. The Provider shall keep the 95th percentile at or below placeholder seconds. Time spent in the human review queue is not included, and is reported separately as queue age."

Difficulty tiers

Charter 1.0.0 section 4.2. A tier is a property of the item, assigned when it is generated, and it never changes because a system found the item hard.

The degradation tiers used by datasets/messy-scan/. Each item carries every parameter below in its manifest entry.

TierSource and captureGeometryOpticalCompositionLanguage
T1Born-digital PDF with a text layerNo rotation, no skewNo noise added, no compression artefactsOne document per file, one page or a clean multi-page set in orderOne language
T2Flatbed scan, 200 to 300 dpi, greyscale or colourSkew 0.5 to 3 degrees, no perspectiveLight scanner noise, even lightingOne document per file, pages in orderOne language
T3Phone photograph, 8 to 12 megapixel sourceSkew 3 to 12 degrees, perspective present, one or more corners cropped or curledShadow across part of the page, glare on at least one region, uneven white balanceOne document per fileOne language
T4Fax-quality raster, 100 to 200 dpi, bitonalSkew as T3, staple shadow or torn cornerHeavy compression, speckleStamps and signatures overlapping printed text, handwriting in the margins and in at least one field, correction marksOne language
T5Mixed: any of T1 to T4 within one bundle, plus messaging-app recompression at low qualityPages rotated 90, 180 or 270 degrees, page order not guaranteedAs T4, plus at least one page below the legibility threshold recorded in the manifestMulti-document bundle, at least one duplicated page, at least one page belonging to a different documentTwo languages on at least one page, drawn from English with Hindi, Gujarati or Tagalog

4.2.1 A tier is assigned only if every criterion in its row holds. An item that meets some criteria of T4 and some of T3 is generated again, not promoted.

4.2.2 The tier mix in the public sample and in the private split is stated in the datasheet, and the two mixes are the same, so that a divergence between them is a signal about the system rather than about the sample.

The data

This suite has no dataset. It is a rubric and a set of scripted exercises run against a live deployment, ours or anyone's, sixty days after go-live.

The public sample

Nothing to download. The rubric, the scripted incidents and the self-assessment are documents, listed under the reproduce section below.

Reproduce

No reproduce.md exists for this suite, because no run has been made. The commands below are read at build time from datasets/messy-scan/README.md, harness/README.md: they rebuild the dataset from its seed and run the harness against it.

Rebuild the dataset: Regenerate the whole dataset from a seed

python3 generate.py --seed 20260902     # plan + ground truth for 1,000 documents
python3 render.py                       # HTML -> Chromium -> PDF + PNG per page
python3 degrade.py                      # tier degradation, hashes, splits

Rebuild the dataset: Regenerate the whole dataset from a seed

python3 validate.py

Rebuild the dataset: Partial builds

python3 render.py --select splits                 # public sample + private split only
python3 render.py --select splits --stratified 100  # plus 100 more across every subtype and tier
python3 render.py --skip-existing                 # finish an interrupted run
python3 degrade.py --shards 2 --shard 0 --no-splits &   # one core
python3 degrade.py --shards 2 --shard 1 --no-splits &   # the other
python3 degrade.py --skip-existing                # final pass: ground truth + splits

Run the suite: 1. Install

cd 10-benchmarks/harness
pip install -e .

Run the suite: 1. Install

entail-bench --version
entail-bench list-models

Run the suite: 3. Point the harness at it

cp config.example.yaml entail-bench.yaml

Run the suite: 4. Check it before you spend anything

entail-bench validate-config

Run the suite: 4. Check it before you spend anything

entail-bench run --dry-run --dataset ./their-folder --runs 3

Run the suite: 5. Run a model

export OPENAI_API_KEY=...
entail-bench run --suite messy-scan --model openai --model-id <the model you are scoring> \
  --dataset ./their-folder --runs 3 --max-spend 25.00

The documents this suite is run from

  • Messy Scan dataset v1.0.0datasets/messy-scan/README.md · Regenerate the whole dataset from a seed · Tier distribution · What is in this folder · One ground-truth record · What validate.py checks · Licence
  • Datasheet — Messy Scan dataset v1.0.0datasets/messy-scan/datasheet.md · Motivation · Composition · Collection and generation process · Degradation parameters and their ranges · Preprocessing, cleaning and labelling · Uses
  • entail-benchharness/README.md · Five-minute quickstart, on your own documents · Environment variables, per adapter · What the harness measures · Prompts · Cost · Reproducibility

Charter 5.5

Every result is reproducible from a commit. A figure that cannot be reproduced from the dataset version and hash, the harness version and commit, the prompt set hash, the model version string, the run date, the price list date and the exact command line is withdrawn, not defended.

Run it on your own data.

Versions and hashes

Charter 5.5: a figure that cannot be reproduced from the items below is withdrawn rather than defended.
Datasetdatasets/messy-scan/ — not a dataset
Dataset seednot applicable
Dataset version in the resultsnot run
Harness version1.0.0
Harness commitnot run
Scorer versionnot run
Charter version1.0.0
Ground-truth hashnot published for this suite
Dataset manifest hashnot published for this suite
Results folderdoes not exist — the suite has not been run
Run datenot run
Price list datenot run — no provider charge has been incurred

Charter 7.3

No table mixes versions. A row produced under a different dataset, harness or charter version sits in a different table, and a superseded table stays published, marked superseded, with a link to the one that replaced it.

Changelog · Dispute a figure on this page