Start with a disclosed test set
The public worked example is one synthetic, two-page material report with five rows and 25 expected field values. It exercises decimal strings, a qualifier, a zero, a leading-zero identifier, a repeated header and an ambiguous comma. It is also a development fixture, so success on it is not independent validation.
Separate evaluation fixtures must be kept apart from that example and their provenance recorded. Natural supplier PDFs, scanned tables, arbitrary layouts and human correction effort need separate evidence. We do not infer those outcomes from a small synthetic set.
Measure fields, structure and evidence separately
| Check | Comparison | Limit |
|---|---|---|
| Field correctness | Expected raw strings versus observed strings | Does not establish the truth of the source document |
| Missing / invented | Expected and unexpected populated fields | A blank and an unsupported interpretation need different treatment |
| Structure / units | Rows per page, headers and raw unit strings | No evidence of automatic unit equivalence |
| Source reference | Referenced words and page against expected evidence | A valid identifier alone is insufficient |
| Failure | Unreadable inputs must fail visibly | Failure handling is not extraction correctness |
| Runtime / cost | Measured run conditions and actual charge, when available | No cloud-cost estimate from local elapsed time |
Record enough to repeat the test
Retain the input hash, fixture license, expected output, parser version, settings, test timestamp and result artifact. Report the count of tested documents and fields alongside the result. Freeze expected output before evaluating a changed parser; do not modify ground truth simply to make a test pass.
For the public example, the provenance file records the fixture and published asset hashes, while the result JSON retains the native-table engine version and raw field states.
Executed synthetic evaluation: 2026-10-30
Five separate CC0 synthetic documents were run once each using Native engine native-table.v1. They are separate from the public material example. The test includes one supported layout and four negative cases, with zero natural documents.
| Fixture | Observed outcome |
|---|---|
| Aligned two-page table | 30/30 exact field contracts; 6/6 unit fields; 30/30 source reconstructions; 6 rows. |
| Wrapped cell | 4/5 exact fields. Known failure: “Thermal expansion” was truncated to “Thermal”, with an unmapped-line exception. |
| Different headers | No extracted rows; unsupported-layout exception. |
| Textless page | No extracted rows; OCR found no readable text. |
| Malformed PDF | Rejected by native preflight or parser. |
Interpretation: the positive result applies to one two-page synthetic layout. Source reconstruction checks referenced words and their page; it is not independent geometric annotation. The wrapped-cell failure is a counterexample to assuming that completion means correctness. Negative checks passing do not mean their documents were successfully extracted.
Settings: fixed Sample / Test / Result / Unit / Method columns, local English OCR fallback on textless pages, no external model provider, one run per fixture, OS cache uncontrolled. The textless fixture contains drawn shapes and does not measure OCR recognition accuracy. The report records parser and binary hashes, platform, wall time and settings. Hosting cost, per-page cost and human correction time were not measured. These results are not a production throughput or real-world accuracy estimate.
Invoice line-item evaluation
Executed invoice checks: 2026-10-30
Twelve separate, owned CC0 synthetic invoice fixtures ran 3 times each (36 executions), with zero natural documents. Four supported layouts returned 57/57 exact field contracts, 2/2 explicit unit fields, and 57/57 fields within their authored source-cell bounds. Repeated executions are not additional independent examples.
| Fixture | Observed output per execution | Exceptions |
|---|---|---|
| Aligned decimal amounts | 15/15 literal field contracts; 3/3 authored rows returned. | table_region_gap |
| Two pages with repeated headers | 20/20 literal field contracts; 4/4 authored rows returned. | table_region_gap |
| Explicit reordered schema | 10/10 literal field contracts; 2/2 authored rows returned. | table_region_gap |
| Explicit Unit column | 12/12 literal field contracts; 2/2 authored rows returned. | table_region_gap |
| Missing Amount | 5/5 literal field contracts; 1/1 authored rows returned. | notreported, table_region_gap |
| Wrapped description | 4/5 literal field contracts; 1/1 authored rows returned. Incomplete or incorrect output. | table_region_gap, unmapped_line |
| Numbers starting left of their headers | 2/5 literal field contracts; 1/1 authored rows returned. Incomplete or incorrect output. | notreported, table_region_gap |
| Different header names | 0/5 literal field contracts; 0/1 authored rows returned. Incomplete or incorrect output. | unsupported_layout |
| Textless page | 0/0 literal field contracts; 0/0 authored rows returned. | ocr_no_text |
| Native first page / textless second page | 5/5 literal field contracts; 1/1 authored rows returned. | ocr_no_text, table_region_gap |
| Rows separated by a large gap | 5/10 literal field contracts; 1/2 authored rows returned. Incomplete or incorrect output. | table_region_gap |
| Rotated table | 0/5 literal field contracts; 0/1 authored rows returned. Incomplete or incorrect output. | unsupported_rotation |
Representative failures: the wrapped description loses its continuation. Right-aligned numbers that begin left of their headers are assigned to the wrong fields; the missing Amount warning does not identify every wrong field. A gap above 80 points ends the supported table region, so later rows can be absent. Rotated pages and unmatched headers return no rows. A textless second page remains unextracted even when page 1 succeeds.
The checks verify CSV/XLSX serialization against the extracted output separately from correctness. The harness cross-checks the sum of line amounts for supported fixtures; the product does not reconcile invoice totals. Source reconstruction alone does not prove the correct column was selected. Conservative table-region warnings can also appear for footer text, including supported examples. Passing a negative-case check means the disclosed behavior was observed, not that the invoice was extracted successfully.
Measured wall times, parser/binary hashes and settings are in the report. Local English OCR fallback was enabled for textless fixtures, which contain drawn shapes and do not measure OCR recognition accuracy. No external model provider, customer document, assessed human correction time or measured per-page infrastructure cost was used. These results do not establish a general accuracy percentage or production throughput.
Failures and evidence gaps are part of the result
The example’s density comma remains unresolved. Scanned PDFs need OCR, which this workflow does not provide. Merged cells, continuation tables without recognised headers and split rows are outside the advertised scope. Review is required even when a job completes.
No natural-document accuracy rate, calibrated confidence score, competitor superiority, customer outcome or human time saving is claimed here. A successful HTTP response or downloaded workbook would not establish any of those claims.
Sources and evidence
- ParseMill synthetic material report (CC0) · Checked 2026-09-28
Public examples are synthetic. Each example and evaluation describes its tested inputs and limitations. This page is authored by ParseMill.