An AI system can give you the right number and still give you a poor answer.
The problem is not necessarily the calculation. It is the missing chain between the number in the workbook and the evidence that produced it.
Consider a development model with a cell containing:
Construction cost = 2,200 / m²
A reviewer immediately has several questions:
Where did 2,200 come from?
What geography does it represent?
What asset type?
What date?
Is it an actual project cost, an industry benchmark, or an assumption?
Who entered it?
What happens if the source changes?
A conventional spreadsheet often stores the value but not enough of that context.
That becomes more important when AI is involved.
If an AI system extracts market information, interprets documents, proposes assumptions, and writes values into Excel, provenance cannot live only in an external log. The reviewer needs a practical way to move from the cell to the evidence.
That is why cell-level citations are useful.
The basic model: value is not provenance
A useful mental model is:
source
↓
extracted fact
↓
interpreted assumption
↓
Excel cell
↓
formula
↓
model output
Each stage answers a different question.
The source answers:
What evidence did we use?
The extracted fact answers:
What did we take from that evidence?
The assumption answers:
How did we translate the evidence into a modelling input?
The cell answers:
Where does that assumption live?
The formula answers:
How does the model use it?
The output answers:
What does the model produce under these assumptions?
AI systems often compress these stages into one response.
That is convenient for generation, but inconvenient for review.
A citation system should do the opposite: preserve the relationships.
Why a citation attached to the cell is different
Suppose an AI workflow produces this workbook:
Cell Input
B12 2,200
B13 12,000
B14 70%
An external research log might say:
B12 → source A
B13 → source B
B14 → source C
That is better than nothing, but the reviewer still has to maintain two contexts.
A cell-level citation puts the provenance closer to the object being reviewed.
Conceptually:
B12
Construction cost
2,200 / m²
│
└── Source:
report.pdf, p. 18
published: 2026-06
geography: Dubai
asset: residential
The important idea is not the particular UI mechanism.
It is locality.
When a reviewer questions a number, the evidence should be discoverable from the number.
Excel already has a useful primitive: comments
Excel's object model provides comments associated with individual cells. Microsoft's current Excel JavaScript API documentation describes comments as threads tied to a single cell and supports creating, editing, deleting, resolving and reading comment metadata.
For example, an add-in can create a comment thread on a specific cell:
await Excel.run(async (context) => {
const comments = context.workbook.comments;
comments.add(
"Assumptions!B12",
"Source: Construction Cost Report\n" +
"Published: 2026-06\n" +
"Page: 18\n" +
"Geography: Dubai\n" +
"Asset: Residential"
);
await context.sync();
});
The important part is not the API call.
It is that Assumptions!B12 is explicitly connected to its provenance.
Microsoft documents the comments API as part of the Excel JavaScript API, with comment support available from the relevant API sets.
Office Scripts provides another route for workbook automation and also supports adding comments to cells.
But don't put the whole source system into the comment
A tempting implementation is to dump everything into the cell comment:
Source:
URL:
Document:
Page:
Paragraph:
Extract:
LLM:
Prompt:
Model:
Timestamp:
Hash:
Confidence:
Reasoning:
...
That quickly becomes unusable.
The comment should be a pointer, not the entire provenance database.
A better pattern is:
Cell
↓
Citation ID
↓
Provenance record
↓
Source
For example:
B12 → SRC-00427
and the provenance record might contain:
{
"citation_id": "SRC-00427",
"source": {
"document": "construction-cost-report.pdf",
"page": 18,
"published": "2026-06"
},
"scope": {
"geography": "Dubai",
"asset": "residential"
},
"extracted_value": 2200,
"unit": "USD/m²"
}
This creates a useful separation:
Excel stores the reference.
The provenance layer stores the detail.
The citation should describe evidence, not certainty
This distinction matters.
Imagine a source says:
Construction costs for a particular benchmark category were reported at X.
The model may subsequently use X as an assumption.
The citation should not silently convert:
reported benchmark
into:
true project cost
Those are different claims.
A good provenance record therefore distinguishes at least:
SOURCE
DATA PERIOD
GEOGRAPHY
ASSET CLASS
EXTRACTED VALUE
UNIT
INTERPRETATION
MODEL ASSUMPTION
That makes it possible for a reviewer to challenge the interpretation rather than merely inspect the URL.
Citation IDs are more robust than URLs
URLs change.
Documents get replaced.
Reports have multiple editions.
A provenance record can therefore use a stable internal identifier:
SRC-00427
with metadata such as:
Source name
Publication date
Data period
Document version
Page
Location
Claim
Extraction date
The workbook then carries:
B12 → SRC-00427
rather than attempting to encode an entire research record into the cell itself.
This also makes automated validation possible.
For example:
def validate_citation(cell, provenance):
citation_id = cell.metadata["citation_id"]
if citation_id not in provenance:
raise ValueError(
f"Missing provenance for {cell.coordinate}"
)
The principle is simple:
A material AI-generated input should not silently become an unexplained spreadsheet value.
Cell citations also help with AI failure modes
AI systems have several failure modes that are particularly awkward in spreadsheets.
- Correct source, wrong interpretation
The model finds the right report but interprets an annual figure as a monthly figure.
A citation lets the reviewer return to the source.
- Correct number, wrong scope
The number is real, but it applies to office rather than residential development.
Again, the citation provides the path back to the evidence.
- Stale evidence
A source may be valid but old.
The citation exposes its publication date and data period.
- Unsupported inference
The AI may produce a plausible assumption without a source.
That should result in:
citation = missing
rather than a fabricated citation.
- Source substitution
A workflow may use one source during research and a different source when generating the final workbook.
A stable citation ID makes that substitution easier to detect.
Provenance should be machine-readable too
Human-readable comments are useful, but they should not be the only representation.
A production design could maintain a provenance table:
Citation ID Cell Source Page Date Scope
SRC-00427 B12 Cost report 18 2026-06 Dubai residential
SRC-00428 B13 Planning document 42 2026-05 Project
SRC-00429 B14 Market report 11 2026-07 Residential
Then validation becomes possible before the workbook leaves the system.
For example:
required_inputs = [
"B12",
"B13",
"B14",
]
for address in required_inputs:
if address not in cited_cells:
raise ValueError(
f"Material input has no citation: {address}"
)
The exact implementation can vary.
The architectural principle is more important:
material input
↓
citation required
↓
provenance record
↓
source verification
Don't cite every calculated cell
There is another trap here.
If every formula cell gets a source citation, the workbook becomes noisy.
A calculated output does not necessarily need its own external source.
For example:
=B12*B13
does not need a market citation if B12 and B13 already carry appropriate provenance.
Instead, the dependency chain should be traceable:
B12 ──┐
├──→ B20
B13 ──┘
with citations attached to the material inputs.
This gives a much cleaner separation:
External evidence
↓
Material assumptions
↓
Deterministic formulas
↓
Model outputs
The output is therefore explainable through its inputs and formulas.
A practical schema
For an AI-powered Excel workflow, a minimal citation object might look like this:
{
"citation_id": "SRC-00427",
"cell": "Assumptions!B12",
"source": {
"name": "Construction Cost Report",
"url": "https://example com/report pdf",
"published": "2026-06"
},
"location": {
"page": 18
},
"claim": {
"value": 2200,
"unit": "USD/m²"
},
"scope": {
"geography": "Dubai",
"asset_class": "residential"
}
}
In a real system, the URL would need to be an actual verified source rather than the placeholder above.
The schema can also be extended with:
data_period
source_type
extraction_method
review_status
assumption_status
supersedes
But the goal should remain restraint.
Provenance is useful when it helps someone answer:
Why is this number here?
What the AI should not decide
The system should not automatically turn every extracted fact into an approved modelling assumption.
A safer boundary is:
AI extraction
↓
candidate evidence
↓
candidate assumption
↓
human review
↓
approved model input
↓
calculation
This preserves a critical distinction between evidence and professional judgment.
A source can support a number without proving that the number is appropriate for the project being analysed.
That suitability decision belongs in the modelling workflow.
The real benefit is not citation. It is reviewability.
Cell-level citations are sometimes described as a documentation feature.
That understates their value.
They can become part of the control layer around AI-generated spreadsheets.
A reviewer can ask:
Which cells came from external evidence?
Which cells are assumptions?
Which assumptions have citations?
Are the sources current?
Does the source scope match the model?
Which outputs depend on a disputed assumption?
That is a much more useful question set than:
Did the AI get the answer right?
Because a feasibility model is rarely just an answer.
It is a chain of evidence, assumptions, formulas and outputs.
AI can help construct that chain.
It should not make the chain invisible.
A practical implementation pattern
If I were designing this workflow, I would keep five layers separate:
Source layer
Documents, reports, URLsEvidence layer
Extracted claims + source locationsAssumption layer
Values selected for modellingWorkbook layer
Cells + formulas + citation IDsReview layer
Human validation and overrides
Then the system can enforce simple rules:
No source
→ no evidence
No evidence
→ assumption requires review
Material assumption without citation
→ validation failure
Formula output
→ trace inputs, don't invent another citation
Human override
→ preserve the original evidence
That last rule matters.
If a reviewer changes 2,200 to 2,350, the system should not erase the original provenance.
Instead, it should preserve:
Original evidence: SRC-00427
Original assumption: 2,200
Reviewed assumption: 2,350
Reviewer: human
Reason: project-specific adjustment
Now the model contains a history of judgment rather than pretending the revised value came directly from the source.
Conclusion
The strongest AI-to-Excel workflows will not be the ones that merely write numbers into cells.
They will make those numbers inspectable.
Cell-level citations provide a practical bridge between a spreadsheet and the evidence behind it. Excel's current APIs provide mechanisms for attaching comments and related metadata to individual cells, which makes this pattern technically feasible.
The larger design principle is broader than Excel:
Keep evidence, assumptions, calculations and decisions separate, but make their relationships explicit.
That is what turns an AI-generated workbook from a collection of plausible values into something a professional can actually review.
Top comments (0)