How Veridion reaches a conclusion — and where it can be wrong.
Every step below is implemented in the product today. Where a step has known weaknesses, they are listed at the end of the page.
Principles
- Evidence before conclusions. A finding exists only if it can point to passages on pages, or state precisely what was not found.
- Absence is not non-compliance. Veridion assesses the documents it was given. A missing figure may exist elsewhere, or the requirement may not apply.
- Deterministic first, model second. Numbers, units and periods are extracted and compared by code. A language model, when enabled, reviews wording — it does not decide figures.
- Reproducible by design. Every run records its inputs and versions and is never overwritten.
Ingestion
PDFs are parsed page by page. Text blocks become passages — paragraphs, headings and list items — with their page number and bounding box. Ruled tables are detected and each row becomes its own citeable passage, keeping the column headers so a value can be tied to its year. Headings build a section path, so a passage knows it sits under “Greenhouse gas emissions › Performance”.
Pages without a text layer are rendered at 300 DPI and read with Tesseract OCR. Table rows on scanned pages are reconstructed from aligned text lines. Every OCR passage carries the engine's confidence, and a requirement that rests only on low-confidence OCR text is sent to human review.
Running headers, footers and page numbers repeated across pages are removed. Each passage receives a stable evidence identifier derived from its document, page, position and text, so re-processing the same document version yields the same identifiers and earlier findings keep pointing at the right place.
Extraction
Values are paired with units and reporting periods before they are stored. Numbers are parsed with thousands separators, bracketed negatives and scale words (thousand, million, lakh, crore). Units are normalised within a family — emissions to tCO₂e, energy to MWh (1 MWh = 3.6 GJ), water to m³, waste to tonnes — and a value is only ever compared with values of the same family.
Periods follow each company's financial year: FY2025 for a company with a March year end runs from 1 April 2024 to 31 March 2025. Explicit dates (“year ended 31 December 2025”) take precedence; base-year statements (“in the 2019 base year, emissions were…”) are dated to the base year; and a parenthetical such as “(2024: 50,115)” labels the value that follows it, not the one before.
A value is assigned to a metric — Scope 1 emissions, location-based Scope 2, total energy — only when its unit family and the surrounding wording agree. When the extractor is unsure, it extracts nothing.
Retrieval
For each requirement, passages are ranked by BM25 keyword relevance, exact phrase matches, whether the passage holds an extracted value for the requirement's metrics, and whether its section heading matches. Every result records why it matched, and the search screen shows that explanation. Semantic embeddings can be added behind the same interface; they will be added when the evaluation shows they improve recall.
Requirement catalogues
Requirements live in versioned catalogue files. Each requirement is broken into weighted elements — for GRI 305-1, the gross value, its period, the consolidation approach, the methodology, gases, emission factors, base year and biogenic CO₂ — and each element has a defined evidence check: a typed value for the period, a stated period, wording, any of several checks, or a conditional check that applies only when triggered.
Catalogues carry effective dates. The GRI 302 and 305 (2016) set applies to reports published before 1 January 2027, when GRI 102: Climate Change 2025 and GRI 103: Energy 2025 take effect. The 2025 set is published as a draft: its disclosure numbers and titles follow GRI, but its element definitions have not yet been verified against the full official text.
Requirement summaries are Veridion's paraphrases, written for assessment. They are not the authoritative text of any standard. Once a catalogue version has been used in an assessment it cannot change; revisions are published as new versions with a changelog, and reviewers can record that a requirement does not apply to a company, with a rationale.
Assessment and statuses
Each element is checked against all current documents for the company. Completeness is the weighted share of applicable elements that are evidenced:
completeness = Σ wᵢ·sᵢ ÷ Σ wᵢ, where sᵢ is 1 when element i is evidenced and wᵢ is its catalogue weight.
It is an internal measure of evidence completeness, not a compliance score. Status then follows simple, published rules: conflicting when two sources disagree by more than 1% after unit conversion; supported when every applicable element is evidenced; partially supported when some are; evidence not found when none is.
- Supported
- Every applicable element of the requirement is evidenced in the documents assessed.
- Evidence not found
- No required element was found in the documents provided. This is not a finding of non-compliance.
- Partially supported
- Some elements are evidenced; others are missing or only related disclosure was found.
- Human review required
- The evidence cannot be resolved automatically and needs a reviewer's judgement.
- Conflicting evidence
- Sources disagree on a material value. A reviewer must confirm which figure is correct.
The model's role
In AI-assisted runs, a language model reviews each requirement. It receives the requirement, the result of every element check and at most twelve candidate passages, each truncated to 600 characters and labelled with its evidence identifier. It must answer in a strict JSON schema with a verdict for every element and the identifiers it relies on.
- Every cited identifier is checked against the candidates it was shown. Unknown identifiers are discarded and recorded.
- Numbers, units and periods are decided by the extraction rules. If the model disagrees, the finding is flagged for review rather than changed.
- Wording elements may be adjusted by the model — for example when a matched “baseline” belongs to a different target — and every adjustment is recorded on the finding.
- A detected conflict can never be overridden by the model.
- Passage text is treated as data, not instructions. The model has no tools and cannot write to the database.
Calls use temperature zero, and responses are cached by model, prompt version and input, so re-running an assessment on unchanged inputs reproduces the result. Model mode can be switched off entirely; rules-only runs send nothing to any external service.
Prioritisation
Gaps become actions ranked by a working heuristic, with every component visible:
| Component | Meaning | Values |
|---|---|---|
| I — importance | Catalogue importance of the requirement | 0.4 · 0.7 · 1.0 |
| G — gap | Size of the evidence gap | 1 − completeness; 0.8 for conflicts; 1.0 when nothing is found |
| U — urgency | Time to the reporting deadline | 1.0 within 30 days, 0.8 within 90, 0.6 within 180, 0.4 later; 0.5 with no deadline |
P = I × G × U. It ranks work; it is not a regulatory formula.
Reproducibility
Assessment = f(documents, requirements, rules, model). Each run stores the SHA-256 hash and version of every document it read, the content hash of every requirement, and the pipeline, extraction, rules and prompt versions together with the model identifier and configuration. A new document version or catalogue revision produces a new run; the earlier run is kept. Comparing two runs attributes each change to a revised requirement, a replaced document or a different method, and findings that cite a since-replaced document are marked for reassessment.
Evaluation
Veridion is measured on a labelled dataset of 139 cases: 27 hand-labelled requirement assessments on the fictional sample companies, and 112 generated cases that mix standard wording, paraphrases written to evade keyword rules, absent elements, and traps — wording that looks relevant but does not satisfy the element.
The table compares rules-only and rules + model (45 cases: every hand-labelled case and an evenly spaced sample of the generated ones, run on 9 October 2026). On the full set of 139 cases, the rules-only baseline reaches 89.9% status accuracy and 97.1% gap recall.
| Metric (45 cases) | Rules baseline | Rules + model |
|---|---|---|
| Status accuracy (five statuses) | 93.3% | 93.3% |
| Gap detection — precision | 94.1% | 97.0% |
| Gap detection — recall | 100.0% | 100.0% |
| Element detection — precision | 100.0% | 98.9% |
| Element detection — recall | 88.8% | 96.6% |
| Contradiction detection — precision | 100.0% | 100.0% |
| Contradiction detection — recall | 100.0% | 100.0% |
| Retrieval Recall@5 (hand-labelled corpus) | 100.0% | 100.0% |
| Evidence-support precision (corpus) | 75.1% | 76.5% |
| Numeric extraction accuracy | 100.0% | 100.0% |
| Citation validity | 100.0% | 100.0% |
| Human-review rate | 8.9% | 13.3% |
| Median time per requirement | 0 ms | 2,611 ms |
| Model tokens per requirement | 0 | 2,181 |
What the numbers say
The model's main contribution is recall on wording: it recognises elements written in ways the keyword rules miss, raising element recall without lowering contradiction detection, which stays with the deterministic checks. Overall status accuracy is the same in both modes on this sample, and the model sends more findings to human review.
The model also makes its own mistakes. In this run it accepted a baseline that belonged to an emissions target as the baseline for energy savings, and it treated emissions figures as a description of the scopes in which reductions occurred. Both errors were recorded on the findings as model adjustments, so a reviewer can see and reverse them.
The dataset is small and was authored by the people who built the system, so these figures describe behaviour on controlled cases. They are not a claim about accuracy on real-world reports, and they are not a comparison with other products. The full report, including every failure case, is published with the source code.
Known limitations
- The requirement catalogue covers a focused climate and energy subset of the GRI Standards. Other frameworks are not yet modelled.
- Borderless tables in digital PDFs are read as text, which can miss values that a ruled table would capture.
- OCR on complex scanned layouts can misread figures. Such values are marked and lower the finding's confidence.
- Keyword rules miss some paraphrases and can be misled by wording that sounds right; the model review reduces but does not remove this.
- Documents are assumed to be in English.
- Model results can vary between providers and model versions. Each run records the model used.
- Applicability is assumed unless a reviewer records otherwise; Veridion does not determine materiality.
Questions about the method are welcome — contact us, or read how the model is governed on the AI governance page.
Test the method on a finding.
Open a finding in the demo, follow its citations, and compare the rules and model views side by side.