The extracted clause cites page 34, and page 34 says nothing of the kind
In short
Measure the offset before touching the model. Sample 10 citations, compare the cited page with the page the text actually sits on, and read the deltas: a constant offset is printed page numbers against physical page index, a stepped offset is pages inserted after extraction, and a random one means the reference was never read.
Key takeaways
- A wrong value costs 1 field. A broken citation costs the verification method for the whole record.
- Constant offset means page numbering. Stepped offset means inserted pages. Random offset means nothing was read.
- A file carries up to 3 page numbers at once: physical index, viewer label and the number printed on the page.
- Citations are only valid against the exact file they were computed on, so bind them to a content hash of that file.
- No generative step should ever emit a page number. It can only pass through an identifier the retrieval step gave it.
A reviewer clicks the citation on an extracted rent review clause, lands on page 34, and finds a notices provision. That is not the same class of problem as a wrong number. A wrong value ruins 1 field and is caught by reading; a citation that does not resolve breaks the only method anyone has for checking any field on the record, and it is caught only by someone bothering to click.
Which is why this fails quietly. Most reviewers spot-check, most spot-checks land on fields that happen to resolve, and a record with systematically shifted citations passes review while remaining unverifiable end to end. Before anything else, find out whether the shift is systematic.
Sample ten citations and measure the offset
- Choose 10 extracted fields spread across the document: 3 from the first third, 4 from the middle, 3 from the last third. Prefer money and date fields, because those are the ones somebody will act on.
- For each, note the cited page and then find where the text actually is, by searching the extracted text layer for the stored snippet. Record the physical page — the 1-based position of the sheet in the file, not the number printed on it.
- Compute actual minus cited for every sample, and record separately any where the snippet could not be found at all. Those 2 outcomes have different causes.
- Sort by physical page and read the delta series as a shape. Flat, stepped and scattered are 3 different diagnoses, set out in the table below.
- Repeat on a second document from the same run. A pattern that repeats is a pipeline fault; one confined to a single file is a document fault.
- Finally, search the snippet as an exact string, then with whitespace normalised. Matching only after normalisation means the citation was computed against a different text layer.
| Delta pattern | Most likely cause | Confirming check |
|---|---|---|
| Constant across every sample | The pipeline stored the number printed on the page, or a viewer label, rather than the physical page index | Open the file at physical page 1 and read what is printed on it. The constant usually equals the count of front matter |
| Zero up to a point, then constant after it | Pages were inserted or removed after the citations were computed — an appended exhibit, spliced counterpart signature pages, a redaction | Find the page where the delta steps and look at what begins there |
| Scattered, but the snippet is always findable | The anchor was computed against a different text layer: the file was re-transcribed, reflowed or re-ordered between extraction and storage | Compare the extraction run identifier and text-layer hash stored on the field with the current one |
| Snippet not present anywhere in the file | The reference was produced rather than read, most often by a generative step asked for a page number it never had | Quarantine the whole run: this is not a numbering fault and other fields are suspect |
| Correct on born-digital files, wrong on scans | Image order and extracted-text order diverge, usually after re-scanning or splitting a batch | Compare the page count of the image set with the page count of the text layer |
Printed page 34 is rarely the thirty-fourth sheet in the file
One file can carry 3 different page numbers for the same sheet. There is the physical index, meaning its position in the file. There is the label a viewer displays, which a document can set explicitly so that front matter runs in roman numerals or numbering restarts at an exhibit. And there is the number printed on the page itself, which was fixed when the document was typeset and takes no notice of anything added since.
A lease makes all 3 diverge routinely: a cover sheet, a table of contents, an executed signature block, and exhibits that restart their own numbering. Store the physical index as the machine field and the printed label as a display string beside it. Keep only the label and every citation depends on someone reading a footer correctly; keep only the index and the reviewer's on-screen number disagrees with your record.
The exhibit that was appended after the citations were computed
A stepped delta is nearly always structural: somebody merged the exhibit set into the base lease, inserted executed signature pages from a counterpart, or replaced a page redacted for a lender. Every citation before the insertion point still resolves, which is what makes it so convincing during a spot check.
The fix is to stop treating a citation as a property of a lease and start treating it as a property of a file. Bind each citation to the content hash of the exact file it was computed against, and treat any change to that file as invalidating every citation on it until re-extraction. That also protects you from the opposite failure, where the values are correct but were read from a document that was never the operative one — the merge problem in the abstract shows the original rent, not the amended one. Rent schedules are the usual casualty, because they arrive as exhibits and get merged last, as covered in the rent schedule that lives in an exhibit.
The anchor that did not survive the summarising step
Most pipelines pass a value through 4 hands: a segmenter, a retriever, a model that writes the field, and a step that normalises it into the schema. The anchor has to survive all 4, and any hop treating it as decoration is a place it gets dropped and later reconstructed from something plausible.
The two common versions are a summarising step that collapses several chunks into one answer and keeps only one of their identifiers, and a re-transcription that changes every character offset in the document after the field was written. The rule that prevents both: the step that produces the value must also produce the anchor, and every later step may only pass it through as an opaque token. Anchors are never re-derived, because re-derivation is exactly the operation that produces a confident, wrong page number.
- Page index, as the physical position in the file, alongside the displayed label.
- A character span within a named text layer, plus the hash of that layer, so a re-transcription invalidates the span instead of silently moving it.
- A bounding box on the page, which survives text-layer changes and is what a highlight actually needs to draw.
- The extraction run identifier, so a field can be traced to the exact configuration and document version that produced it.
When the page reference was never read at all
If the stored snippet appears nowhere in the document, the pipeline did not misplace the citation — it generated one. A model asked to return a page number will return a page number, and it will be shaped exactly like a real one. This is the case that justifies stopping the run rather than adjusting an offset, because a step willing to invent a reference was given a job it cannot do, and its values are suspect for the same reason.
A page number is a fact about a file, not an opinion about a document. Nothing that generates text should ever be the thing that produces one.
The retrieval layer already knows which chunk it supplied and which page that chunk sits on, so the number exists before the model is called. Pass the chunk identifier in, require it back, and reject any answer citing an identifier that was not in the input — a deterministic check that turns invented provenance into a validation error at write time.
A citation that will not resolve means the field is not extracted
This check is cheap enough to run on every field of every document, and it belongs in the buyer's evaluation as well as the builder's pipeline. When you assemble the test described in the acceptance test before you trust an extraction pipeline, include a deliberately merged file with an appended exhibit and a re-scanned page: a vendor whose citations survive that is doing provenance properly, and a demo on a clean born-digital lease tells you nothing about it.
Which fields need a resolvable citation at all is a schema question rather than a pipeline one. Money, dates and anything creating an obligation should carry one and be verified against it; descriptive fields can be sampled. That trade-off is part of designing the lease field schema before you extract anything, and the exit criteria that let a record be declared trusted sit in the review queue that makes extraction safe to rely on.
What a resolving citation still does not prove
It proves the text is where the record says it is. It does not prove the value was read correctly from that text, that the clause was the operative one, or that a later amendment did not change it. It is also not a confidence score, and the two must not be blended into a single indicator — what that number can and cannot decide is set out in what a confidence score on an extracted field means.
Where an archive needs re-verification after a defect like this, sequence by exposure rather than file order: leases with a live option window, an imminent reconciliation or a payment about to go out come first, as in working through a backlog of legacy leases. The sharpest example of the cost is a reconciliation you are about to pay against a clause nobody can find, which is why checking a common-area maintenance true-up before you pay it starts at the lease text and not the landlord's statement. All of it belongs to lease abstraction and property document AI; the extraction products we build for real estate operators and funds are scoped under MVP and product builds.
Frequently asked questions
Short answers to the follow-ups this page tends to raise.
How do I tell a page-numbering fault from a fabricated citation?
Search for the stored snippet. If the text exists in the document but on a different page, the fault is numbering or document structure, and the delta will be constant or stepped. If the snippet appears nowhere at all, the reference was produced rather than read, and the fix is to stop a generative step emitting page numbers rather than to correct an offset.
Should the citation store the printed page number or the PDF page index?
Both, in separate fields. The physical index is what your code needs to open the right sheet; the printed label is what a reviewer quotes to a landlord or a lender. Store one and either the machine or the human is working from a number the other cannot use.
Can provenance be added to an extraction pipeline afterwards?
Not reliably. A citation is a record of where a value came from at the moment it was produced, and reconstructing it later means searching the document for text resembling the stored value — which is a new extraction with a new error rate, dressed as verification. Existing records without anchors have to be re-extracted, not repaired.
What should the interface show when a citation fails to resolve?
Show the field as unextracted, with the failure reason, and route it to human capture. Do not show the value with a warning icon: reviewers read the value and skip the icon, so a broken citation beside a plausible number is more dangerous than a blank. Blanks get filled.
- provenance
- lease abstraction
- diagnostics
- document AI
The work behind this page
Builds from our portfolio that this page draws on.
TenantDesk
An AI property-operations platform that triages every maintenance request, tracks rent to the unit, and dispatches the right vendor across a residential portfolio.
Real EstateAskVault
An AI internal knowledge-search platform that answers employee questions from your own docs — grounded in citations, with knowledge gaps surfaced and deflection tracked.
Productivity AIRead next
- Confidence on an extracted lease field: what the number measuresConfidence on an extracted field says how consistently the system reached a value, not whether the value is true. Treat it as a queueing signal, set against how many fields a person can check.definition
- Co-tenancy: the clause that can switch fixed rent offCo-tenancy makes one tenant's rent depend on other tenants trading. It is the clearest case where a lease field is not a number but a small state machine attached to the rent line.definition
- Execution, delivery, rent commencement: 3 start dates, not one fieldExecution binds the parties, delivery usually starts the term, rent commencement starts the money. Collapse them into a single start date and at least one downstream clock is wrong.definition
- Extraction returns no rent schedule, because the schedule is in Exhibit BAn empty rent schedule almost never means a lease without rent steps. Compare the lease's own exhibit list against the exhibits in the file, and structure failure separates from genuine absence in a minute.diagnostic
- Lease abstract: the summary someone acts on without opening the leaseAn abstract is not a shorter lease. It is the record an operations team runs a portfolio from, and the test it has to pass is whether the week's decisions can be made from it alone.definition
- Natural and artificial breakpoints: when sales become rentThe breakpoint is the line between sales reporting as a chore and sales reporting as a rent input. The exclusion list behind it can change the rent owed several-fold on identical trading.definition
Related across the site
Working on something in this space?
Tell us where you are in a sentence or two. We'll tell you honestly whether we're the right team, and what a sensible first slice of the work looks like.
Start the conversation