Real Estate & PropTech// diagnostic

Extraction returns no rent schedule, because the schedule is in Exhibit B

In short

An empty rent schedule rarely means the lease has no steps. The table is in an exhibit filed as its own document, or it continues across a page break without repeating its header, or the steps are written as a sentence. Read the lease's exhibit list, compare it with the exhibits actually in the file, and structure failure separates from genuine absence.

Key takeaways

  • The lease lists its own exhibits. That list against the file set answers the question before any model is examined.
  • Empty, truncated and short-by-3-years are 3 distinct faults with 3 distinct fixes. Name which one you have first.
  • A schedule stopping exactly at a page boundary is a continuation-table problem, not a comprehension problem.
  • Merged cells shift every value one column left. The output looks like data and is wrong in a way totals will not catch.
  • Rent stated per square foot per year against a field expecting a month is out by a factor of 12, and nothing errors.
  • Store amount, basis and area as separate fields. Coercing them into one number destroys the only check available.

The extraction reports no rent schedule and the reviewer assumes the model failed. Nearly always the schedule is somewhere the pipeline never looked: an exhibit filed as a separate document, a table that continues onto page 47 without repeating its header, or 4 sentences of prose that describe steps without ever drawing a table.

This is a structure problem, and structure problems are cheap to confirm and cheap to fix. What makes them expensive is misdiagnosis, because a missing schedule and a lease that genuinely has flat rent produce the identical empty field, and one of those is a data gap the portfolio will act on.

The lease lists its own exhibits, so start there

Almost every commercial lease enumerates its attachments, either in a schedule of exhibits near the front or in the clause that incorporates them. That list is a manifest written by the drafter, and comparing it against what you hold takes about 5 minutes.

  1. Find the exhibit list in the lease body and write down every item: Exhibit A, Exhibit B, the site plan, the work letter, the rules and regulations, any rider.
  2. Compare it against the pages actually in the file. A lease body ending at the signature block with no attachments is not a lease with no exhibits, it is a partial ingest.
  3. Check the incorporation language for where the rent lives. A body clause reading "Base Rent shall be as set out in Exhibit B" tells you the schedule is not in the body and never was.
  4. Open the exhibit and look at the last row on each page. A schedule ending mid-term at a page boundary is a continuation problem; a schedule ending at the end of the term is complete.
  5. Count the years covered against the term. A 10-year term with 7 rows of schedule is missing 3 years, and that is a different fault from an empty field.
  6. Route anything unresolved as "not extracted" rather than as "none". An empty value and an unanswered question are different states, and the review stage can only act on the second if you distinguish them — the exit criteria in the review queue that makes extraction safe to rely on.

Empty, truncated and short by 3 years are 3 different faults

The shape of what came back names the cause, and it is worth writing down before touching anything. An entirely empty field points upstream to ingest or retrieval. A schedule that stops at a page boundary points at table continuation. A schedule that is complete but ends before the term does points at a rider or an option period documented elsewhere.

A fourth shape is the one that does not look like a failure at all: a full table, correctly parsed, with every value shifted one column left. That comes from merged cells, and it produces confident, plausible, wrong data — which is why a per-field score is a poor detector here and page-level provenance is a good one, as set out in the cited page that does not contain the clause.

5 reasons a page full of numbers extracts as nothing

What you seeCauseWhat to change
Field entirely empty; body clause points at an exhibitExhibits ingested as separate documents, or never ingested at allBind files to one instrument at ingest, and fail the lease if a listed exhibit is absent
Schedule stops exactly at a page boundaryThe table continues on the next page without repeating its header rowStitch continuation tables by column geometry before parsing, not after
Values present but shifted one columnMerged cells, or a 2-row header the parser flattenedRead cell geometry and spans rather than text order; treat a merged span as an explicit range
Clause found, schedule field emptyThe steps are written as prose, with no table to detectParse periods and amounts out of the sentence into the same structure a table would produce
Numbers roughly 12 times too small, or too largeRent stated per square foot per year against a field expecting a monthly amountStore amount, basis and area separately and compute; never coerce a figure into the field's unit
What the output looks like, what caused it, and the change that removes it

The schedule that was written as a sentence

Smaller leases and many amendments describe rent in prose: base rent for the first 12 months, then a stated increase on each anniversary, then a different treatment for an option term. There is no table anywhere in the document, so a table-detection step returns nothing and is correct to do so.

The fix is to treat the rent schedule as a data structure rather than as a visual object. A schedule is a set of periods, each with a start, an end, an amount and a basis — and prose, tables and formulas are 3 encodings of the same structure. Extraction should target the structure, so that a sentence and a table land in the same shape. Where the step is a formula rather than a figure, computing it is its own class of error, diagnosed in the indexed increase that came out wrong.

The model did not miss the rent schedule. Nobody gave it the exhibit, and it reported honestly on the pages it was handed.

Per square foot per year, into a field that wanted a month

Schedules are quoted in whatever convention the market uses, and the same lease can mix them: an annual figure in the body, a per-square-foot annual rate in the exhibit, a monthly instalment in the payment clause. A field typed as "monthly rent" quietly accepts all 3, and the resulting portfolio number is wrong by a factor of 12 with nothing raising an error.

  • Keep the basis as a stored field, not an assumption in the schema. Annual, monthly, per square foot per year and per square foot per month are 4 different things.
  • Store the rentable area used for any conversion. Without it, a per-square-foot figure cannot be checked and cannot be recomputed when the area is later remeasured.
  • Compute derived values rather than storing them alone. A monthly figure derived from a stated annual amount is reproducible; a monthly figure typed in by a parser is not.
  • Cross-check the first period against what is being billed. A factor-of-12 error announces itself immediately in that comparison and is nearly invisible everywhere else.

What to change, in the order that pays

Ingest first, because it is the cheapest and it fixes the largest bucket: bind every file of an instrument together and treat a listed-but-absent exhibit as a hard failure rather than a silent gap. Then table stitching, then geometry-aware cell parsing, then prose. Vision-based reading helps most on the scanned exhibits with stamps and handwriting, which is a pipeline-order choice in its own right — transcribe the page first or read the image directly.

Sequence the work across a backlog by exposure rather than by document, since a lease with a live option window and a missing schedule is worth more attention than 40 dormant ones — the ordering argued in working through a backlog of legacy leases. Where the documents cannot leave your own infrastructure, doing the reading in place is a deployment decision covered in running a private language model deployment.

None of this is model tuning, which is the point. Every fix above is document handling, and the pipeline that binds files, stitches tables and preserves basis is the part worth engineering — ordinary AI automation and agent engineering, inside lease abstraction and property document AI for real estate teams.

Frequently asked questions

Short answers to the follow-ups this page tends to raise.

Why does lease extraction return no rent schedule when the lease clearly has one?

Because the schedule usually sits in an exhibit that was ingested as a separate document, or never ingested at all. The lease body says base rent is as set out in the exhibit, the pipeline processes only the body, and it accurately reports that no schedule is present. Compare the lease's own exhibit list against the pages in the file before looking at anything else.

Why does a rent table stop halfway through the term?

Because the table continues onto the next page without repeating its header, and the parser treated the continuation as unrelated text. The signature is precise: the schedule ends exactly at a page boundary rather than at the end of the term. Stitching continuation tables by column geometry, before any parsing, removes the whole class — and it also fixes truncated operating-expense and option tables at the same time.

How do merged cells corrupt an extracted rent schedule?

They shift values into the wrong columns while leaving the output looking like clean data. A period label spanning 2 rows, or a header spanning 2 columns, collapses when a parser reads text in order rather than reading cell geometry, so every amount lands one column from where it belongs. Nothing errors, totals often still look plausible, and the fault is only visible by opening the cited page.

What should a pipeline do when a listed exhibit is missing from the file?

Fail the lease explicitly rather than emitting an empty field. A missing exhibit is a known unknown — the lease itself told you the document should exist — and recording it as "not extracted" sends it to a person, while recording it as empty tells the portfolio there are no rent steps. The two states look identical downstream, and only one of them is true.

  • exhibits
  • table extraction
  • rent schedule
  • diagnosis
// shipped work

The work behind this page

Builds from our portfolio that this page draws on.

Read next

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