FeaturesSecurityPricingCompareDevelopersBlogStart Free
BlogAugust 4, 2026

What "cites the source" actually means

Three things are sold under the same phrase. A citation naming a document, a citation naming a page, and a citation naming Revenue!B14:F34. The third can be checked in seconds, and the first cannot be checked at all.

Three grades of citation

The useful measure of a citation is how much reading it takes to falsify. A citation you cannot cheaply falsify is a claim of provenance, not evidence of it.

  • Cell range: Q3_Model.xlsx · Revenue!B14:F34enforced

    105 cells. Open it, read the block, and a wrong citation is obvious immediately.

  • Page: SPA.pdf, p.41

    One page. Checkable, but still a paragraph hunt, and a page reference to a 40-row table narrows very little.

  • Document: see the financial modelbypassable

    The whole file. Checking costs the same as not having the answer, so in practice nobody checks and the citation does no work.

What each grade of citation costs the reader to check.
Worked example for a 12-sheet model with roughly 40,000 populated cells. The middle column is arithmetic on that example, not a measurement.
CriterionWhat the reader opensCells to scanDetects a wrong citation
Document citationThe workbook~40,000No, in practice
Sheet citationOne sheet~3,300Rarely
Row-range citation21 rows, full width~500Sometimes
Cell-range citationRevenue!B14:F34105Yes, at a glance
Worked example for a 12-sheet model with roughly 40,000 populated cells. The middle column is arithmetic on that example, not a measurement.

How the coordinate is produced

The range comes from the chunker, not from the model. Tables are chunked at 20 rows with a 5-row overlap, and each chunk records the sheet name, its row range and its column range, which are combined into A1 notation. The chunk text itself carries the locator, so the model is answering from a block that already knows its own address.

The hard part is that a chunk's array index is not its sheet row. A parsed table skips the header, and it excludes rows marked as totals so a subtotal does not shift everything below it. So the chunker keeps the original sheet row for every data row and maps slice boundaries back through it, then adds one, because sheet rows are 1-based everywhere a human sees them. The basis is a named constant, absolute-1based, and the worker reports it on its health endpoint so a machine still emitting the older table-relative numbering can be identified from outside rather than by reading its citations and noticing they point at the wrong cells.

The same problem appears again on the way back. The render model is sparse: hidden rows and rows that were never populated do not enter it, so row 14 is not the fourteenth row of the grid. The viewer keeps a map from absolute sheet row to grid row, and that map is the only legitimate translation. If a range's first row was hidden after indexing, the lookup searches forward for the start and backward for the end, so the band still lands on real content instead of failing.

  1. Question
    Asked in the room
  2. Retrieve
    Chunks carry sheetName and cellRange
  3. Answer
    Markers attach to claims
  4. Citation
    Revenue!B14:F34
  5. Wash
    Sheet opens, cells flash amber for two seconds
From question to washed cells. Every step carries the coordinate rather than re-deriving it.

Clicking a citation switches to the sheet, scrolls horizontally by summing the live zoom-scaled widths of the intervening columns while skipping hidden ones, leaves 24 pixels of context before the first cited column, then washes the range: the cited cells in amber, the rest of the cited row in a paler tint so five cells read as five cells and not as a full-width band. The wash clears after two seconds. The inspector strip opens on the range and names it back in absolute sheet coordinates, so the address on screen matches the address in the answer that sent the reader there.

Reproducing it

The coordinate contract has its own suite, including a case where excluded subtotal rows must not shift the cited range and a case where a multi-chunk table keeps every chunk anchored to real sheet rows:

npx playwright test -c tests/rag/spreadsheet/playwright.config.ts chunking
# 31 passed (406ms), run 4 August 2026
31
Coordinate tests passing
tests/rag/spreadsheet, 4 Aug 2026
20 / 5
Chunk rows and overlap
SpreadsheetChunker constants
105
Cells in Revenue!B14:F34
5 columns by 21 rows

Cell-range citations are only possible because the viewer renders a grid rather than a picture of one. That is the connection between this and the fidelity test: convert the workbook to PDF for viewing and the addresses are gone, so the best any citation can do afterwards is name a page.

Related: The spreadsheet fidelity test · Where a permission filter has to live · Arabic, Hijri and RTL in data rooms · Pricing

AI chat with page and cell-range citations is included in every paid tier. See pricing.

FAQ

Questions about AI citations.

A citation that names the sheet and the exact block of cells an answer came from, written in A1 notation, such as Revenue!B14:F34. It resolves to 105 cells rather than a document or a page, and clicking it opens the workbook at that sheet, scrolls to the range and highlights those cells.
Because checking it costs the same as not having it. If the citation says only that the answer came from the financial model, verifying the claim means opening the model and searching, which is the work the AI was supposed to remove. A citation is useful in proportion to how much it narrows the search.
No. It proves where the model read. The answer can still misread the cells it cites. What a precise citation changes is the cost of catching that: a wrong cell range is obvious in a few seconds, while a wrong document-level citation is indistinguishable from a lazy one.
PDFs are cited by page, rendered as p.41, and clicking opens the viewer at that page. Spreadsheets are cited by sheet and cell range, because a parsed grid keeps its coordinates. A data room that converts spreadsheets to PDF before viewing them cannot offer the second, since converting the workbook destroys the addresses.
Start Free