<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: FeasibilityproAI  Analysis</title>
    <description>The latest articles on DEV Community by FeasibilityproAI  Analysis (@feasibilityproaiai).</description>
    <link>https://dev.to/feasibilityproaiai</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4110774%2F301c5066-193b-4bb8-8043-2e986556a091.png</url>
      <title>DEV Community: FeasibilityproAI  Analysis</title>
      <link>https://dev.to/feasibilityproaiai</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/feasibilityproaiai"/>
    <language>en</language>
    <item>
      <title>From Spreadsheet Cells to Dependency Graphs: Tracing What Changes When an Assumption Moves</title>
      <dc:creator>FeasibilityproAI  Analysis</dc:creator>
      <pubDate>Fri, 06 Nov 2026 06:11:46 +0000</pubDate>
      <link>https://dev.to/feasibilityproaiai/from-spreadsheet-cells-to-dependency-graphs-tracing-what-changes-when-an-assumption-moves-36ol</link>
      <guid>https://dev.to/feasibilityproaiai/from-spreadsheet-cells-to-dependency-graphs-tracing-what-changes-when-an-assumption-moves-36ol</guid>
      <description>&lt;p&gt;A financial feasibility model may contain hundreds or even thousands of formulas, spread across multiple worksheets and connected through a network of assumptions, intermediate calculations, and final outputs. Although an analyst sees these calculations arranged in rows and columns, the underlying logic is much closer to a software dependency system than a conventional table.&lt;/p&gt;

&lt;p&gt;Consider a relatively straightforward development feasibility model. An analyst changes the construction cost rate because updated project information suggests that the original assumption is no longer appropriate. The change does not remain confined to one input cell. It affects the base construction cost, which may influence contingency, total development costs, financing requirements, residual land value, and ultimately the financial indicators used to evaluate the development scenario.&lt;/p&gt;

&lt;p&gt;The difficult part is not identifying the cell that has changed. The real challenge is understanding the complete chain of calculations that depends on that cell, determining which outputs need to be recalculated, and explaining the resulting impact without losing the connection to the original workbook.&lt;/p&gt;

&lt;p&gt;This becomes particularly important when artificial intelligence is introduced into spreadsheet workflows. A language model may understand a user's question and explain financial relationships in natural language, but that does not automatically mean it can reliably reconstruct every formula dependency in a complex workbook.&lt;/p&gt;

&lt;p&gt;A more robust engineering approach is to represent the workbook's calculation relationships as a directed dependency graph. This provides a structured representation of how inputs, formulas, and outputs connect, allowing the system to trace the potential consequences of an assumption change before attempting to explain them.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Understanding the Dependency Structure Behind a Financial Model
&lt;/h2&gt;

&lt;p&gt;An Excel workbook is usually designed around the way an analyst wants to organise and review information. Different worksheets may contain development assumptions, construction costs, revenue calculations, financing schedules, cash flows, and investment metrics. This arrangement is convenient for human review, but it does not necessarily communicate the complete calculation structure of the model.&lt;/p&gt;

&lt;p&gt;A formula can reference a cell located several worksheets away, while another formula may depend on a named range, a table reference, or an intermediate calculation that is not immediately visible to the person reviewing the workbook. As a result, the physical arrangement of cells is not a reliable representation of the order in which calculations depend on one another.&lt;/p&gt;

&lt;p&gt;For example, suppose a development model calculates base construction cost using gross floor area and a construction cost rate. Contingency is then calculated as a percentage of base construction cost, and total construction cost is derived by combining the two values. The resulting amount may feed into a broader development cost calculation, which subsequently affects the residual land value.&lt;/p&gt;

&lt;p&gt;The logical relationships can be represented as follows:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Construction Cost Rate
          |
          v
    Base Construction Cost
          |
          v
       Contingency
          |
          v
   Total Construction Cost
          |
          v
   Residual Land Value
          |
          v
   Development Metrics
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This representation is useful because it shifts attention away from the location of individual cells and towards the relationships between calculations. Instead of asking where a formula is located, the system can ask which inputs determine its value and which other calculations depend on its result.&lt;/p&gt;

&lt;p&gt;Microsoft describes the related behaviour through Excel's calculation and dependency mechanisms, including the way formula dependencies influence recalculation.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Representing Spreadsheet Formulas as a Directed Graph
&lt;/h2&gt;

&lt;p&gt;A directed graph provides a natural way to represent these relationships. Each node represents a cell, range, or logical model variable, while each directed edge represents a dependency between two elements.&lt;/p&gt;

&lt;p&gt;Suppose a simplified development model contains the following calculations:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Cell / Node&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;th&gt;Dependencies&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;B2&lt;/td&gt;
&lt;td&gt;Construction cost rate&lt;/td&gt;
&lt;td&gt;Input&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;B3&lt;/td&gt;
&lt;td&gt;Gross floor area&lt;/td&gt;
&lt;td&gt;Input&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;C4&lt;/td&gt;
&lt;td&gt;Base construction cost&lt;/td&gt;
&lt;td&gt;B2, B3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;B5&lt;/td&gt;
&lt;td&gt;Contingency rate&lt;/td&gt;
&lt;td&gt;Input&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;C5&lt;/td&gt;
&lt;td&gt;Contingency&lt;/td&gt;
&lt;td&gt;C4, B5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;C6&lt;/td&gt;
&lt;td&gt;Total construction cost&lt;/td&gt;
&lt;td&gt;C4, C5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;C7&lt;/td&gt;
&lt;td&gt;Residual land value&lt;/td&gt;
&lt;td&gt;Revenue, C6, Finance, Target Profit&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The corresponding graph would contain an edge from each precedent to the formula that references it. For example, both B2 and B3 would point towards C4 because the base construction cost depends on both the construction cost rate and gross floor area.&lt;/p&gt;

&lt;p&gt;The graph also makes it possible to distinguish between direct and indirect dependencies. A direct dependency exists when one formula references another cell or input directly. A transitive dependency exists when a calculation is affected through one or more intermediate formulas.&lt;/p&gt;

&lt;p&gt;This distinction becomes important when an analyst wants to understand the full impact of changing an assumption. If the construction cost rate changes, the system needs to identify not only the immediate calculation affected by the change but also every downstream calculation that depends on it.&lt;/p&gt;

&lt;p&gt;Microsoft's Excel JavaScript API provides methods for retrieving formula precedents and dependents, making it possible to inspect these relationships through supported Excel interfaces.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Extracting Dependencies from an Excel Workbook
&lt;/h2&gt;

&lt;p&gt;The first engineering challenge is converting workbook formulas into a structured representation of their dependencies.&lt;/p&gt;

&lt;p&gt;A practical implementation would begin by identifying worksheets and their formula-containing cells. It would then extract formula expressions, parse their references, resolve those references against the workbook structure, and construct the graph.&lt;/p&gt;

&lt;p&gt;A simplified processing pipeline looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Excel Workbook
      |
      v
Read Worksheets
      |
      v
Identify Formula Cells
      |
      v
Extract Formula Expressions
      |
      v
Parse Cell References
      |
      v
Resolve Named Ranges
and Worksheet References
      |
      v
Construct Dependency Graph
      |
      v
Validate Graph Structure
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For example, consider the following Excel formula:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;=C4*B5
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The formula cell depends directly on C4 and B5. The dependency graph therefore needs two incoming relationships:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;C4 ─────┐
        ├────&amp;gt; C5
B5 ─────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is relatively easy to process because the formula contains straightforward cell references. However, a real financial model may contain formulas such as &lt;code&gt;SUM(B2:B20)&lt;/code&gt;, references to other worksheets, named ranges, structured table references, and functions that construct references dynamically.&lt;/p&gt;

&lt;p&gt;These cases require more sophisticated parsing and resolution logic. A simple regular expression that searches formula text for cell addresses may identify some references correctly, but it cannot be treated as a complete formula interpretation system.&lt;/p&gt;

&lt;p&gt;The dependency extraction layer should therefore distinguish between identifying formula syntax, resolving workbook references, and determining the relationships that need to be represented in the graph. Keeping these responsibilities separate makes the system easier to test and reduces the risk of silently overlooking dependencies.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Identifying the Complete Impact of an Assumption Change
&lt;/h2&gt;

&lt;p&gt;Once the dependency graph has been constructed, the next task is determining which nodes are affected when an input changes.&lt;/p&gt;

&lt;p&gt;This can be handled through graph traversal. Starting from the changed input node, the system follows outgoing edges and records every downstream node that depends directly or indirectly on that input.&lt;/p&gt;

&lt;p&gt;Consider a simplified dependency map:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;collections&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;defaultdict&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;deque&lt;/span&gt;

&lt;span class="n"&gt;dependencies&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;BaseCost&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;CostRate&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;GFA&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Contingency&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;BaseCost&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ContingencyRate&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;TotalCost&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;BaseCost&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Contingency&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ResidualLandValue&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Revenue&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;TotalCost&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Finance&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;TargetProfit&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;


&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;build_dependents&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dependencies&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;graph&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;defaultdict&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;set&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;formula&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;precedents&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;dependencies&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;items&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;precedent&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;precedents&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;graph&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;precedent&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;formula&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;graph&lt;/span&gt;


&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;affected_nodes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;changed_node&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dependencies&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;graph&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;build_dependents&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dependencies&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;visited&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;queue&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;deque&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;changed_node&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;

    &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="n"&gt;queue&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;current&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;queue&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;popleft&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;dependent&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;graph&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;current&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;dependent&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;visited&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="n"&gt;visited&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dependent&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                &lt;span class="n"&gt;queue&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dependent&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;visited&lt;/span&gt;


&lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;affected_nodes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;CostRate&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dependencies&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;sorted&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The expected output is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[
    'BaseCost',
    'Contingency',
    'ResidualLandValue',
    'TotalCost'
]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The example demonstrates how a graph traversal can identify the downstream calculations affected by a change to the construction cost rate. The result is an impact map, not a set of recalculated financial values.&lt;/p&gt;

&lt;p&gt;That distinction is important because dependency analysis and numerical calculation are two separate engineering responsibilities. The graph identifies which calculations may be affected, while an appropriate calculation engine evaluates the actual formulas and determines the resulting values.&lt;/p&gt;

&lt;p&gt;For financial modelling, combining these responsibilities without clearly separating them can create problems. A system might correctly identify every affected formula but still produce an incorrect numerical result if it does not reproduce the workbook's calculation behaviour.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Determining the Correct Calculation Sequence
&lt;/h2&gt;

&lt;p&gt;Identifying affected cells is only part of the problem. When the system needs to evaluate formulas in a particular sequence, it must also respect the dependency order.&lt;/p&gt;

&lt;p&gt;For a directed acyclic graph, this can be achieved through topological sorting. The algorithm produces an ordering in which every precedent appears before the formula that depends on it.&lt;/p&gt;

&lt;p&gt;Python provides a standard-library implementation through &lt;code&gt;graphlib.TopologicalSorter&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;graphlib&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;TopologicalSorter&lt;/span&gt;

&lt;span class="n"&gt;dependencies&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;BaseCost&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;CostRate&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;GFA&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Contingency&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;BaseCost&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ContingencyRate&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;TotalCost&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;BaseCost&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Contingency&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ResidualLandValue&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Revenue&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;TotalCost&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Finance&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;TargetProfit&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;order&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;TopologicalSorter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;dependencies&lt;/span&gt;
&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;static_order&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;node&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;order&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The resulting sequence respects the relationships defined in the dependency map. Independent inputs may appear in different valid positions, but a dependent calculation will not be placed ahead of its required precedents.&lt;/p&gt;

&lt;p&gt;This is particularly useful when building a system that needs to understand calculation order or determine which intermediate results must be available before evaluating a downstream formula.&lt;/p&gt;

&lt;p&gt;However, topological sorting should not be confused with spreadsheet recalculation itself. It does not interpret Excel formulas, reproduce the complete behaviour of Excel functions, or handle every workbook-specific calculation feature. It provides a valid ordering for an acyclic dependency structure, while the actual numerical evaluation remains the responsibility of a calculation engine.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Handling Circular References and Iterative Calculations
&lt;/h2&gt;

&lt;p&gt;A more difficult situation arises when formulas depend on one another in a circular relationship.&lt;/p&gt;

&lt;p&gt;Development finance models provide a practical example. Interest expense may depend on the outstanding debt balance, while the debt balance may depend on project cash flow. If project cash flow also depends on interest expense, the model contains a circular calculation relationship.&lt;/p&gt;

&lt;p&gt;A simple topological ordering cannot resolve this structure because there is no valid sequence in which every dependency can be evaluated only after its precedents.&lt;/p&gt;

&lt;p&gt;Excel supports iterative calculations for workbooks that deliberately use circular references. These calculations are governed by workbook settings, including iteration limits and convergence-related parameters.&lt;/p&gt;

&lt;p&gt;A dependency analysis system must therefore distinguish between an accidental circular reference and an intentional iterative calculation. Treating both conditions as ordinary dependencies would make the resulting graph misleading and could produce an invalid calculation sequence.&lt;/p&gt;

&lt;p&gt;A more reliable implementation should identify strongly connected components, report the formulas involved in each cycle, and preserve the workbook's intended calculation semantics when iterative calculations are required.&lt;/p&gt;

&lt;p&gt;The objective should not be to eliminate every cycle automatically. Some financial models are deliberately structured around iterative relationships, and replacing those relationships with an arbitrary calculation sequence would change the model's behaviour.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. Why Excel's Calculation Chain Is Not a Dependency Graph
&lt;/h2&gt;

&lt;p&gt;There is an important distinction in the underlying structure of Excel workbooks that is relevant when developing tools for spreadsheet inspection.&lt;/p&gt;

&lt;p&gt;The calculation chain records the order in which formula cells were last calculated. It should not be treated as a complete description of the relationships between formulas and their precedents.&lt;/p&gt;

&lt;p&gt;The dependency structure must be understood separately from the calculation sequence. A system that relies only on the calculation chain may therefore obtain information about calculation ordering without reconstructing the complete network of formula dependencies.&lt;/p&gt;

&lt;p&gt;This distinction matters when processing &lt;code&gt;.xlsx&lt;/code&gt; files programmatically, particularly when the objective is to understand how a change to one input affects the rest of the workbook.&lt;/p&gt;

&lt;p&gt;The engineering process should derive the dependency relationships from formula references and workbook metadata rather than assuming that the calculation chain contains everything needed for impact analysis.&lt;/p&gt;

&lt;h2&gt;
  
  
  8. Integrating Dependency Analysis into an AI-Assisted Spreadsheet Workflow
&lt;/h2&gt;

&lt;p&gt;Once the workbook has been converted into a structured dependency representation, it becomes possible to introduce a language model into the workflow without making the model responsible for reconstructing the entire calculation system independently.&lt;/p&gt;

&lt;p&gt;Consider an analyst asking:&lt;/p&gt;

&lt;p&gt;"What happens to the residual land value if construction costs increase by 8%?"&lt;/p&gt;

&lt;p&gt;A reliable system should interpret this as a request to modify a specific assumption and investigate the consequences of that change. The language model can help understand the question, but the workbook processing layer must determine which input the analyst is referring to and how that input connects to the remaining calculations.&lt;/p&gt;

&lt;p&gt;The first stage is request interpretation. The system identifies the proposed change and determines whether the user intends to modify an existing assumption, examine a hypothetical scenario, or simply understand the relationship between two calculations.&lt;/p&gt;

&lt;p&gt;The second stage is input resolution. The requested assumption must be matched to a specific workbook cell, named range, or structured model variable. This step should not depend on approximate language-model interpretation alone because two different cells may have similar descriptions but very different financial meanings.&lt;/p&gt;

&lt;p&gt;The third stage is dependency analysis. The graph identifies all direct and indirect calculations connected to the selected assumption. This provides the system with a structured understanding of which intermediate calculations and final outputs may be affected.&lt;/p&gt;

&lt;p&gt;The fourth stage is numerical recalculation. The relevant calculation engine evaluates the workbook using the changed assumption and applies the workbook's calculation rules. The system should also preserve the original scenario so that the impact of the proposed change can be compared against the starting position.&lt;/p&gt;

&lt;p&gt;The final stage is explanation. The language model can use the verified inputs, formula relationships, and recalculated results to describe what changed and why. The explanation should retain references to the relevant cells and formulas so that an analyst can independently inspect the underlying calculations.&lt;/p&gt;

&lt;p&gt;This separation of responsibilities is important. The language model interprets the request and communicates the result, while deterministic workbook operations handle reference resolution, dependency analysis, and numerical calculations.&lt;/p&gt;

&lt;p&gt;It is one possible architecture for combining AI-assisted interaction with conventional spreadsheet engineering, rather than a description of any particular proprietary product implementation.&lt;/p&gt;

&lt;h2&gt;
  
  
  9. Technical Limitations That Need to Be Addressed
&lt;/h2&gt;

&lt;p&gt;Although dependency graphs provide a useful foundation, a production implementation must account for spreadsheet features that cannot always be resolved through straightforward formula parsing.&lt;/p&gt;

&lt;p&gt;Dynamic references are one example. Functions such as &lt;code&gt;INDIRECT&lt;/code&gt; can construct references from text values, which means the actual dependency may not be obvious from the formula's static structure. A parser may identify the function but still be unable to determine the referenced cell without evaluating the relevant expression.&lt;/p&gt;

&lt;p&gt;Named ranges create a different challenge. A formula may refer to a defined name rather than a direct cell address, and the system must resolve that name against the workbook's defined-name scope. The distinction between workbook-level and worksheet-level names also needs to be preserved.&lt;/p&gt;

&lt;p&gt;External workbook references introduce another complication. A formula may depend on a cell in a separate workbook that is unavailable during analysis. The system should retain the external dependency and identify its resolution status rather than silently treating the missing reference as an ordinary blank value.&lt;/p&gt;

&lt;p&gt;Volatile functions require additional consideration because their values may change during recalculation even when conventional input dependencies have not changed. Similarly, dynamic arrays and structured table references can introduce relationships that require more sophisticated workbook interpretation.&lt;/p&gt;

&lt;p&gt;Finally, different spreadsheet engines may support different formula functions and calculation behaviours. A dependency graph constructed from an Excel workbook does not automatically guarantee that another calculation engine will reproduce exactly the same results.&lt;/p&gt;

&lt;p&gt;These limitations should be recorded as part of the analysis rather than hidden behind an apparently complete dependency map.&lt;/p&gt;

&lt;h2&gt;
  
  
  10. Establishing a Validation Framework
&lt;/h2&gt;

&lt;p&gt;Before relying on dependency analysis in a financial modelling workflow, the implementation should be tested against a range of workbook structures and calculation scenarios.&lt;/p&gt;

&lt;p&gt;The validation process should cover simple direct references as well as more complicated relationships involving multiple worksheets, named ranges, circular references, and external dependencies.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Validation area&lt;/th&gt;
&lt;th&gt;Expected behaviour&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Direct dependencies&lt;/td&gt;
&lt;td&gt;Correctly identifies immediate precedents and dependents&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Transitive dependencies&lt;/td&gt;
&lt;td&gt;Identifies all downstream calculations affected by an input&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Multiple inputs&lt;/td&gt;
&lt;td&gt;Preserves every relevant dependency of a formula&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cross-worksheet references&lt;/td&gt;
&lt;td&gt;Resolves the correct worksheet and cell address&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Named ranges&lt;/td&gt;
&lt;td&gt;Identifies and resolves defined names correctly&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Circular references&lt;/td&gt;
&lt;td&gt;Detects cycles and identifies participating formulas&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;External references&lt;/td&gt;
&lt;td&gt;Reports unresolved external dependencies&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Formula modifications&lt;/td&gt;
&lt;td&gt;Updates graph relationships when formulas change&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Input modifications&lt;/td&gt;
&lt;td&gt;Identifies the correct downstream impact scope&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Numerical recalculation&lt;/td&gt;
&lt;td&gt;Produces results consistent with the selected calculation engine&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The final validation area deserves particular attention because a structurally correct graph does not guarantee numerically correct results. A workbook may contain stale cached values, unsupported formulas, incomplete external references, or calculation settings that influence the final output.&lt;/p&gt;

&lt;p&gt;For that reason, dependency validation and numerical validation should be treated as separate testing responsibilities. The first establishes whether the system understands the workbook's calculation relationships, while the second establishes whether the calculated results are consistent with the workbook's intended behaviour.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion: Making Spreadsheet Logic More Transparent
&lt;/h2&gt;

&lt;p&gt;Financial models are often reviewed through their visible outputs, but the reliability of those outputs depends on the assumptions and calculations connected beneath them. A change to one input can influence several intermediate formulas and ultimately alter the financial indicators used to assess a development scenario.&lt;/p&gt;

&lt;p&gt;Representing these relationships as a directed dependency graph provides a structured way to understand how that influence travels through the workbook. It also creates a useful foundation for impact analysis, calculation sequencing, validation, and explanation in AI-assisted spreadsheet workflows.&lt;/p&gt;

&lt;p&gt;The broader engineering principle is that language models should not be expected to reconstruct complex financial calculations from unstructured spreadsheet content and then independently produce numerical conclusions. Formula interpretation, dependency resolution, and numerical calculation require explicit, testable mechanisms that preserve the relationship between the original workbook and the resulting outputs.&lt;/p&gt;

&lt;p&gt;AI can make these systems easier to interact with and can help communicate complicated calculation relationships in a more accessible way. However, the underlying calculation logic must remain inspectable, and the results must remain open to independent verification.&lt;/p&gt;

&lt;p&gt;For real estate development professionals, this is more than a technical design consideration. When an assumption changes, the important question is not simply whether a final number has moved, but whether the analyst can trace that movement back through the calculations and understand which assumptions and relationships produced the result.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A financial model becomes more useful when every material output can be traced back to the assumptions, formulas, and dependencies that determine it.&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>data</category>
      <category>softwareengineering</category>
    </item>
    <item>
      <title>Human-in-the-Loop Validation for AI-Generated Financial Models</title>
      <dc:creator>FeasibilityproAI  Analysis</dc:creator>
      <pubDate>Tue, 27 Oct 2026 05:34:12 +0000</pubDate>
      <link>https://dev.to/feasibilityproaiai/human-in-the-loop-validation-for-ai-generated-financial-models-4amc</link>
      <guid>https://dev.to/feasibilityproaiai/human-in-the-loop-validation-for-ai-generated-financial-models-4amc</guid>
      <description>&lt;p&gt;AI can generate a financial model that looks coherent, contains valid formulas, and produces a plausible result while still being wrong in ways that matter.&lt;/p&gt;

&lt;p&gt;A formula can reference the wrong cell. A cost assumption can be expressed in the wrong unit. A revenue schedule can omit a phase. A model can calculate correctly from an unsupported market assumption.&lt;/p&gt;

&lt;p&gt;These are different failure modes, and they need different controls. For real estate feasibility models, the objective should not be to ask whether an AI-generated workbook looks correct. It should be to establish which properties can be tested automatically, which assumptions require evidence, and which decisions must remain with a qualified human reviewer.&lt;/p&gt;

&lt;p&gt;A useful validation architecture has five layers:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Structural validation&lt;/li&gt;
&lt;li&gt;Deterministic calculation checks&lt;/li&gt;
&lt;li&gt;Domain and consistency checks&lt;/li&gt;
&lt;li&gt;Evidence and provenance checks&lt;/li&gt;
&lt;li&gt;Human review and approval&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;No single layer is sufficient.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Separate the output from the evidence
&lt;/h2&gt;

&lt;p&gt;Consider a hypothetical development model with the following inputs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Site area and developable area&lt;/li&gt;
&lt;li&gt;Permitted gross floor area&lt;/li&gt;
&lt;li&gt;Unit mix or lettable area&lt;/li&gt;
&lt;li&gt;Revenue assumptions&lt;/li&gt;
&lt;li&gt;Construction and other development costs&lt;/li&gt;
&lt;li&gt;Financing assumptions&lt;/li&gt;
&lt;li&gt;Development programme&lt;/li&gt;
&lt;li&gt;Exit assumptions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The model calculates development costs, revenue, cash flows, residual land value (RLV), and potentially internal rate of return (IRR).&lt;/p&gt;

&lt;p&gt;For example, a model might calculate an RLV of £4 million. That output can be mathematically consistent with the workbook and still be commercially misleading if the revenue assumptions are unsupported or the construction cost basis is outdated. Validation therefore needs to test both the calculation and the justification for its inputs.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Layer one: validate the structure before the numbers
&lt;/h2&gt;

&lt;p&gt;Before reviewing financial logic, validate the shape of the generated output. If an AI system is expected to return structured data before creating a workbook, define an explicit contract. JSON Schema is one established option for specifying required fields, data types, and constraints.&lt;/p&gt;

&lt;p&gt;See the JSON Schema getting-started guide.&lt;br&gt;
A simplified model input contract might look like this:&lt;br&gt;
{&lt;br&gt;
  "project_id": "DEMO-001",&lt;br&gt;
  "currency": "GBP",&lt;br&gt;
  "site_area_sqm": 5000,&lt;br&gt;
  "gross_floor_area_sqm": 12000,&lt;br&gt;
  "construction_cost_per_sqm": 1800&lt;br&gt;
}&lt;br&gt;
This is illustrative data, not a market benchmark or a recommendation for a production schema.&lt;/p&gt;

&lt;p&gt;A structural validator could check that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Required fields are present.&lt;/li&gt;
&lt;li&gt;Numeric values are actually numeric.&lt;/li&gt;
&lt;li&gt;Areas and costs use declared units.&lt;/li&gt;
&lt;li&gt;Currency is explicitly identified.&lt;/li&gt;
&lt;li&gt;Values fall within defined technical bounds.&lt;/li&gt;
&lt;li&gt;Unexpected fields are rejected or handled deliberately.&lt;/li&gt;
&lt;li&gt;Missing values are not silently replaced with zero.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The last point is important. Zero and unknown are not equivalent. If a finance rate is missing, substituting zero can make a model appear more profitable. A missing value should normally trigger a validation error or an explicit unresolved status.&lt;/p&gt;

&lt;p&gt;Structural validation establishes that the model can be interpreted. It does not establish that the model is economically sensible.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Layer two: use deterministic checks for deterministic rules
&lt;/h2&gt;

&lt;p&gt;Rules that can be expressed precisely should not depend on an LLM's judgment. For example, if a model defines construction cost as gross floor area multiplied by construction cost per square metre, the expected calculation is:&lt;/p&gt;

&lt;p&gt;\text{GFA}&lt;br&gt;
\times&lt;br&gt;
\text{Cost per sqm}&lt;br&gt;
]&lt;br&gt;
For the hypothetical inputs above:&lt;br&gt;
[&lt;br&gt;
12{,}000 \times £1{,}800 = £21{,}600{,}000&lt;br&gt;
]&lt;br&gt;
A deterministic test can independently calculate the expected result and compare it with the workbook output.&lt;br&gt;
from decimal import Decimal&lt;/p&gt;

&lt;p&gt;gfa_sqm = Decimal("12000")&lt;br&gt;
cost_per_sqm = Decimal("1800")&lt;br&gt;
reported_cost = Decimal("21600000")&lt;/p&gt;

&lt;p&gt;expected_cost = gfa_sqm * cost_per_sqm&lt;/p&gt;

&lt;p&gt;assert expected_cost == reported_cost&lt;/p&gt;

&lt;p&gt;This test checks arithmetic for the stated formula. It does not establish that the GFA is permitted, that the cost rate is appropriate, or that the formula captures every relevant cost.&lt;/p&gt;

&lt;p&gt;A production implementation should also define tolerances where appropriate, particularly when comparing rounded spreadsheet values or calculations involving floating-point numbers.&lt;/p&gt;

&lt;p&gt;Other deterministic checks might include:&lt;br&gt;
Revenue equals the sum of its components.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Total costs reconcile to their component schedules.&lt;/li&gt;
&lt;li&gt;Cash flow totals reconcile across periods.&lt;/li&gt;
&lt;li&gt;Unit counts and areas reconcile between schedules.&lt;/li&gt;
&lt;li&gt;The reported output matches an independently calculated result.&lt;/li&gt;
&lt;li&gt;A sensitivity case actually changes the intended input.&lt;/li&gt;
&lt;li&gt;Required formula cells are not unexpectedly blank or replaced by constants.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Where possible, use independent calculations rather than simply checking that a formula cell contains a formula. A formula can exist and still be wrong.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Layer three: validate model relationships
&lt;/h2&gt;

&lt;p&gt;Many serious errors are not syntax errors or arithmetic errors. They are inconsistencies between parts of the model.&lt;/p&gt;

&lt;p&gt;Suppose a development model contains:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;120 residential units in the unit schedule&lt;/li&gt;
&lt;li&gt;116 units in the sales schedule&lt;/li&gt;
&lt;li&gt;Revenue calculated using the sales schedule&lt;/li&gt;
&lt;li&gt;Construction costs calculated using the unit schedule&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Every formula may evaluate successfully, but the workbook contains a discrepancy that needs resolution.&lt;/p&gt;

&lt;p&gt;Domain-level checks can flag conditions such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Unit counts that differ across schedules.&lt;/li&gt;
&lt;li&gt;Areas that exceed a declared model constraint.&lt;/li&gt;
&lt;li&gt;Revenue periods that do not align with the programme.&lt;/li&gt;
&lt;li&gt;Cost totals that exclude a populated cost category.&lt;/li&gt;
&lt;li&gt;An exit value that uses an inconsistent timing assumption.&lt;/li&gt;
&lt;li&gt;A sensitivity scenario that changes revenue but leaves dependent calculations unchanged.&lt;/li&gt;
&lt;li&gt;An IRR calculation using a cash-flow range that omits a period.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These checks should be encoded as explicit rules wherever the intended relationship is known.&lt;/p&gt;

&lt;p&gt;Some rules require context. For example, whether a particular cost should be included in a development budget depends on the model's scope and conventions. A validator should not impose a universal rule where none exists.&lt;/p&gt;

&lt;p&gt;Instead, it should identify the relevant condition, record the rule being applied, and send ambiguous cases for review.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Layer four: validate the provenance of assumptions
&lt;/h2&gt;

&lt;p&gt;A financial model can pass every arithmetic test and still fail as an analytical tool.&lt;/p&gt;

&lt;p&gt;The reason is straightforward: calculations cannot establish the truth of their inputs.&lt;/p&gt;

&lt;p&gt;For every material assumption, a validation system should try to preserve:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The value and unit.&lt;/li&gt;
&lt;li&gt;The source or origin of the value.&lt;/li&gt;
&lt;li&gt;The source's date and relevant data period.&lt;/li&gt;
&lt;li&gt;The geography and asset type, where applicable.&lt;/li&gt;
&lt;li&gt;The transformation from source evidence to model assumption.&lt;/li&gt;
&lt;li&gt;Any manual adjustment made by the analyst.&lt;/li&gt;
&lt;li&gt;The model locations that depend on the assumption.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Consider a construction cost assumption of £1,800 per square metre. A validator might confirm that the figure is numeric, the unit is recorded, and the workbook uses it consistently. Those checks do not establish whether the figure is suitable for the location, asset type, specification, and cost period. That question requires appropriate evidence and professional interpretation.&lt;/p&gt;

&lt;p&gt;An LLM may help extract candidate assumptions from documents or explain how a value is used in a workbook. The extracted result should still be checked against its source, and the resulting assumption should remain distinguishable from the underlying evidence.&lt;br&gt;
A useful principle is:&lt;br&gt;
Traceability makes an assumption inspectable. It does not make the assumption correct.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Layer five: make human review a defined state transition
&lt;/h2&gt;

&lt;p&gt;Human review should not be an informal final glance after an automated process has already treated the model as complete.&lt;/p&gt;

&lt;p&gt;A practical workflow can represent validation explicitly:&lt;/p&gt;

&lt;p&gt;GENERATED&lt;br&gt;
    |&lt;br&gt;
    v&lt;br&gt;
STRUCTURE_CHECKED&lt;br&gt;
    |&lt;br&gt;
    v&lt;br&gt;
CALCULATIONS_CHECKED&lt;br&gt;
    |&lt;br&gt;
    v&lt;br&gt;
DOMAIN_CHECKED&lt;br&gt;
    |&lt;br&gt;
    v&lt;br&gt;
EVIDENCE_REVIEWED&lt;br&gt;
    |&lt;br&gt;
    v&lt;br&gt;
HUMAN_APPROVAL_REQUIRED&lt;br&gt;
    |&lt;br&gt;
    +----&amp;gt; APPROVED FOR THE DEFINED PURPOSE&lt;br&gt;
    |&lt;br&gt;
    +----&amp;gt; RETURNED FOR CORRECTION&lt;br&gt;
    |&lt;br&gt;
    +----&amp;gt; BLOCKED: UNRESOLVED ISSUE&lt;/p&gt;

&lt;p&gt;The states are illustrative, but the distinction matters. A successful automated test should not automatically mean that a model is approved. Approval should be scoped to a defined version of the workbook, its assumptions, its evidence, and its intended use.&lt;br&gt;
A reviewer should be able to see:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;What was generated.&lt;/li&gt;
&lt;li&gt;Which automated checks passed.&lt;/li&gt;
&lt;li&gt;Which checks failed or were skipped.&lt;/li&gt;
&lt;li&gt;Which assumptions lack adequate evidence.&lt;/li&gt;
&lt;li&gt;What changed after a correction.&lt;/li&gt;
&lt;li&gt;Who approved the model and for what purpose.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If a material input or formula changes after approval, the system should identify which checks need to run again and whether the earlier approval remains valid. This is where versioning and change tracking become part of model governance rather than administrative overhead.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. Design the exception path before the success path
&lt;/h2&gt;

&lt;p&gt;Validation is often designed around a clean example: the model is generated, every check passes, and the user receives the output. Production systems need to handle less convenient outcomes.&lt;/p&gt;

&lt;p&gt;A failed check should produce actionable information. “Validation failed” is less useful than “The unit count in the sales schedule differs from the unit schedule; review the linked inputs before approving revenue.”&lt;/p&gt;

&lt;p&gt;Similarly, a warning should not disappear simply because a later stage of the workflow succeeds. For auditability, preserve the check identifier, the model version, the result, the relevant evidence, and the resolution.&lt;/p&gt;

&lt;h2&gt;
  
  
  8. Measure validation quality without inventing an accuracy score
&lt;/h2&gt;

&lt;p&gt;A single “model accuracy” percentage can hide important distinctions. A workbook might pass every arithmetic test while containing several unsupported assumptions. Another may contain a harmless formatting issue but have fully reconciled calculations and well-documented inputs.&lt;/p&gt;

&lt;p&gt;A more useful validation report separates categories:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Structural checks passed or failed.&lt;/li&gt;
&lt;li&gt;Deterministic calculation checks passed or failed.&lt;/li&gt;
&lt;li&gt;Domain checks passed, failed, or were not applicable.&lt;/li&gt;
&lt;li&gt;Assumptions with verified, missing, or conflicting evidence.&lt;/li&gt;
&lt;li&gt;Open exceptions and their severity.&lt;/li&gt;
&lt;li&gt;Human review status.&lt;/li&gt;
&lt;li&gt;The scope and version of the approved output.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If the system is evaluated over time, track false negatives and false positives for individual validation rules against a reviewed test set. Record the test cases, expected outcomes, rule versions, and known limitations.&lt;/p&gt;

&lt;p&gt;Do not interpret a high pass rate as proof that the model is correct. It may simply mean that the checks cover only a narrow set of failure modes.&lt;/p&gt;

&lt;p&gt;The purpose of validation is to make known risks visible and testable, not to manufacture certainty.&lt;/p&gt;

&lt;h2&gt;
  
  
  9. A practical implementation sequence
&lt;/h2&gt;

&lt;p&gt;A team introducing validation around AI-generated financial models does not need to automate every review step at once.&lt;/p&gt;

&lt;p&gt;A sensible sequence is:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Define the contract. Specify the required inputs, output fields, units, and missing-value behaviour.&lt;/li&gt;
&lt;li&gt;Write deterministic tests. Start with totals, reconciliations, formula ranges, and independent calculations.&lt;/li&gt;
&lt;li&gt;Add domain checks. Encode known cross-schedule relationships and clearly defined constraints.&lt;/li&gt;
&lt;li&gt;Track provenance. Associate material assumptions with sources, dates, units, and transformations.&lt;/li&gt;
&lt;li&gt;Introduce exception handling. Make failures explicit and prevent unresolved material issues from being silently treated as passed.&lt;/li&gt;
&lt;li&gt;Define human approval. Record the reviewer, workbook version, purpose, and outstanding qualifications.&lt;/li&gt;
&lt;li&gt;Build a regression suite. Retain representative valid and invalid examples and rerun the checks when the generation logic or validation rules change.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The test suite should include deliberate failures, not only successful examples. Examples might include missing finance assumptions, inconsistent unit counts, a formula referencing the wrong period, and a source whose geography does not match the project.&lt;/p&gt;

&lt;p&gt;This helps test whether the validation process detects the intended problem rather than merely accepting a plausible-looking output.&lt;/p&gt;

&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;Human-in-the-loop validation is not a person checking an AI result after the important work is finished. It is a system design in which deterministic rules handle deterministic questions, domain checks expose inconsistencies, evidence is kept separate from assumptions, and a human reviewer remains accountable for unresolved judgments.&lt;/p&gt;

&lt;p&gt;For financial modelling, that distinction is material. A workbook can be well-formed without being economically sound, mathematically consistent without being supported by market evidence, and ready for review without being ready for a decision.&lt;/p&gt;

&lt;p&gt;The objective is not to make every AI-generated model look trustworthy. It is to make the model's logic, assumptions, limitations, and unresolved issues sufficiently visible that a professional can challenge it before relying on the result.&lt;/p&gt;

</description>
      <category>feasibility</category>
      <category>realestate</category>
      <category>ai</category>
      <category>financial</category>
    </item>
    <item>
      <title>What Context Does an AI Spreadsheet Copilot Need Before It Can Explain a Workbook?</title>
      <dc:creator>FeasibilityproAI  Analysis</dc:creator>
      <pubDate>Fri, 09 Oct 2026 06:32:32 +0000</pubDate>
      <link>https://dev.to/feasibilityproaiai/what-context-does-an-ai-spreadsheet-copilot-need-before-it-can-explain-a-workbook-52kb</link>
      <guid>https://dev.to/feasibilityproaiai/what-context-does-an-ai-spreadsheet-copilot-need-before-it-can-explain-a-workbook-52kb</guid>
      <description>&lt;p&gt;A spreadsheet copilot can explain a number and still get the story behind it wrong. Imagine a real estate feasibility workbook showing a lower development profit than expected. The number is visible, and a language model can describe it in seconds. But explaining why it changed requires more than reading a cell. The answer may depend on construction costs, revenue assumptions, formulas across multiple worksheets, the selected scenario, or the date of the underlying data.&lt;/p&gt;

&lt;p&gt;This is where spreadsheet AI becomes an engineering problem rather than simply a language-generation problem. To explain a workbook reliably, a system must understand how its contents relate to one another, distinguish calculated outputs from assumptions, and establish whether the numbers it sees reflect the current calculation state.&lt;/p&gt;

&lt;h2&gt;
  
  
  A spreadsheet is more than its visible values
&lt;/h2&gt;

&lt;p&gt;A straightforward implementation might extract cell values, convert them into text, and send that text to a language model. For small, simple tables, this can be sufficient. The approach becomes less reliable when a workbook contains multiple worksheets, named ranges, nested formulas, imported data, scenario models, or links between calculations.&lt;/p&gt;

&lt;p&gt;Consider a simplified workbook in which Inputs!B2 contains construction cost per square metre, Model!D12 calculates total construction cost, and Summary!C8 reports development profit.&lt;/p&gt;

&lt;p&gt;If a user asks why profit has fallen, the system needs to trace the relevant calculation chain. It must determine which formulas depend on the construction-cost assumption, whether that assumption changed, and whether other inputs changed at the same time. Even then, a dependency is not automatically a complete explanation. The fact that a cost input contributes to profit does not establish that it caused the entire decline. The first requirement is a structured representation of workbook context, not a longer prompt.&lt;/p&gt;

&lt;h2&gt;
  
  
  Build a model of the workbook before generating an answer
&lt;/h2&gt;

&lt;p&gt;The system needs to preserve more than cell addresses and displayed values. It should capture worksheet structure, formulas, number formats, named ranges, relevant metadata, and the relationships between calculations.&lt;/p&gt;

&lt;p&gt;For each cell, a useful representation includes its worksheet and address, stored value, formula where applicable, data type, number format, workbook version, and available source information.&lt;/p&gt;

&lt;p&gt;These fields help prevent subtle interpretation errors. A value displayed as 12.5% has a different meaning from a currency amount or a quantity, while a hard-coded assumption should not be confused with a formula-generated result. Formatting can help identify the intended presentation, but it does not establish the business meaning of a number on its own.&lt;/p&gt;

&lt;p&gt;Dependencies are equally important. A cell record tells the system what is stored in a location; a dependency record tells it which other cells contribute to that calculation.&lt;/p&gt;

&lt;p&gt;For example, a simplified relationship might be:&lt;br&gt;
Inputs!B2 → Model!D12 → Summary!C8&lt;/p&gt;

&lt;p&gt;This relationship can be represented as a directed graph, allowing the system to trace upstream inputs from a requested output. Real workbooks are more complicated: formulas can branch, reference other worksheets, use named ranges, or contain constructs the extraction system cannot resolve.&lt;/p&gt;

&lt;p&gt;The system should preserve those limitations. An unresolved reference must remain unresolved rather than being silently replaced with an assumed relationship.&lt;/p&gt;

&lt;h2&gt;
  
  
  Keep extraction, calculation and explanation separate
&lt;/h2&gt;

&lt;p&gt;One architectural mistake is to ask the language model to perform every step: interpret the workbook, calculate the result, diagnose the change, and explain it. A more dependable design separates these responsibilities.&lt;/p&gt;

&lt;p&gt;The extraction layer reads workbook structure and records the available evidence. The calculation layer establishes numerical results using an appropriate spreadsheet engine or a separately verified deterministic implementation. The explanation layer uses those results to answer the user's question.&lt;/p&gt;

&lt;p&gt;This separation matters because reading a formula is not the same as evaluating it. For example, the openpyxl documentation explicitly states that openpyxl does not evaluate formulas. A system using it can inspect formula expressions, but it cannot assume that the cached result represents a freshly recalculated workbook.&lt;/p&gt;

&lt;p&gt;The calculation process should therefore expose its status to the explanation layer. The system needs to distinguish an extracted value from a recalculated result, and a recalculated result from one that has passed the relevant validation checks. These distinctions should be represented as data, not left for the language model to infer.&lt;/p&gt;

&lt;h2&gt;
  
  
  Give the language model structured evidence
&lt;/h2&gt;

&lt;p&gt;Once the workbook has been parsed and the relevant calculations established, the system can assemble a context package for the requested answer. Suppose a user asks why development profit changed. The package might identify the target cell, its formula, the relevant upstream dependencies, the selected scenario, the workbook version, and the status of the calculation. It should also identify missing evidence, such as an input whose source date is unavailable.&lt;/p&gt;

&lt;p&gt;A simplified representation could look like this:&lt;br&gt;
{&lt;br&gt;
  "workbook_version": "v17",&lt;br&gt;
  "target_cell": "Summary!C8",&lt;br&gt;
  "scenario": "Base case",&lt;br&gt;
  "formula": "=Revenue-Costs",&lt;br&gt;
  "dependencies": [&lt;br&gt;
    "Model!D12",&lt;br&gt;
    "Model!D18"&lt;br&gt;
  ],&lt;br&gt;
  "calculation_status": "verified",&lt;br&gt;
  "evidence_status": "partial",&lt;br&gt;
  "limitations": [&lt;br&gt;
    "Source provenance for one input is unavailable"&lt;br&gt;
  ]&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;This is an illustrative example, not output from an actual workbook. Its purpose is to show how a system can communicate what it knows and what remains uncertain. A schema can enforce required fields, permitted status values, and the structure of cell references. The system can then reject malformed responses or flag references that do not exist in the relevant workbook version.&lt;/p&gt;

&lt;p&gt;However, valid JSON does not prove that an explanation is correct. Structural validation can establish that an answer follows a contract; it cannot establish that the narrative accurately describes the business logic. That requires separate evidence and validation.&lt;br&gt;
Retrieve context according to the question&lt;br&gt;
Sending an entire workbook to a language model is often inefficient. Large files may contain historical worksheets, unrelated calculations, repeated formatting, and data that has no bearing on the question. Instead, context retrieval should follow the task.&lt;/p&gt;

&lt;p&gt;When a user asks what drives a particular output, the system should retrieve the target formula, its relevant dependencies, units, scenario metadata, and available source records. When the question concerns changes between workbook versions, it should compare the relevant formulas, values, and metadata across those versions.&lt;/p&gt;

&lt;p&gt;A question about whether an assumption is reliable requires a different set of evidence. The system may need the source, publication date, geography, definition, and available quality checks. The numerical value alone cannot answer that question.&lt;/p&gt;

&lt;p&gt;This is where spreadsheet context differs from ordinary text retrieval. The system is not merely searching for related passages. It must identify the correct calculation relationships and select evidence that supports the specific question. Retrieval also needs boundaries. Dependency expansion should be limited to relevant parts of the workbook, and incomplete formula chains should be reported explicitly. A system that cannot resolve every relationship should not imply that it has examined the complete model.&lt;/p&gt;

&lt;h2&gt;
  
  
  Treat uncertainty as part of the data model
&lt;/h2&gt;

&lt;p&gt;Consider a construction-cost assumption with no recorded source date or geographic reference. The copilot may still be able to explain how the assumption affects development profit. It cannot establish from that workbook alone whether the assumption is current or appropriate for the project. Three questions must remain distinct: what the calculation produces, whether the underlying evidence is reliable, and whether the resulting project outcome is acceptable.&lt;/p&gt;

&lt;p&gt;The first can often be answered through model logic. The second requires appropriate supporting evidence. The third involves professional judgment and decision-making beyond the calculation itself. Combining all three into a single confidence score would conceal important differences. Instead, the system should report missing provenance, unresolved references, conflicting inputs, and uncertain calculation freshness in explicit terms. If the workbook does not establish something, the explanation should not invent a plausible answer to fill the gap.&lt;/p&gt;

&lt;h2&gt;
  
  
  Test the failure cases, not just the successful examples
&lt;/h2&gt;

&lt;p&gt;A spreadsheet copilot may perform well on straightforward questions while failing on the cases that matter most. Testing should therefore examine whether it handles cross-sheet dependencies correctly, distinguishes hard-coded values from formulas, detects stale results, respects scenario selection, and reports missing source information.&lt;/p&gt;

&lt;p&gt;It should also be tested against renamed worksheets, broken references, formula errors, ambiguous labels, and mismatches between the workbook version and the evidence supplied to the model.&lt;/p&gt;

&lt;p&gt;These tests measure different properties. Retrieval accuracy determines whether the system found the right cells. Calculation correctness determines whether the numerical result is valid under the specified calculation process. Explanation fidelity determines whether the narrative matches the available evidence. Uncertainty handling determines whether the system acknowledges what it cannot establish. A single overall accuracy score can hide failures in any one of these areas.&lt;/p&gt;

&lt;p&gt;The implementation should begin with a limited set of workbook structures and question types. Each expansion should follow testing of the new structures and their failure cases, rather than an assumption that support for one workbook implies support for spreadsheets generally.&lt;/p&gt;

&lt;h2&gt;
  
  
  A practical engineering sequence
&lt;/h2&gt;

&lt;p&gt;A first implementation should start by extracting and normalizing workbook contents. It can then resolve supported formula references, build dependency relationships, establish calculation status, and retrieve the context needed for a particular question.&lt;/p&gt;

&lt;p&gt;Only after those steps should the language model generate an explanation. The resulting response should be checked against the supplied evidence, its schema, the relevant workbook version, and the calculation status. Material explanations should remain subject to human review before being used in consequential decisions.&lt;/p&gt;

&lt;p&gt;This sequence does not eliminate every error. It makes errors easier to detect, isolate, and investigate because extraction, calculation, retrieval, and explanation have distinct responsibilities.&lt;/p&gt;

&lt;p&gt;It also makes limitations visible. If a formula cannot be resolved, a calculation cannot be verified, or source information is missing, the system can report that specific limitation instead of producing a confident but unsupported answer.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;The hard part of an AI spreadsheet copilot is not describing a number. It is establishing where the number came from, which assumptions affect it, whether the calculation is current, and what the available evidence can actually support.&lt;/p&gt;

&lt;p&gt;That requires structured workbook context, explicit dependency relationships, a calculation process separate from language generation, and validation that goes beyond checking whether a response is well formed.&lt;/p&gt;

&lt;p&gt;For financial modelling and real estate feasibility analysis, these distinctions are particularly important. A fluent explanation may sound convincing, but a traceable explanation gives an analyst something they can inspect, challenge, and verify. The objective should not be to make every answer sound certain. It should be to make every answer accountable to the evidence.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>llm</category>
      <category>softwareengineering</category>
    </item>
    <item>
      <title>Structured Outputs for AI-Generated Financial Models: Schemas Before Spreadsheets</title>
      <dc:creator>FeasibilityproAI  Analysis</dc:creator>
      <pubDate>Sat, 03 Oct 2026 06:04:37 +0000</pubDate>
      <link>https://dev.to/feasibilityproaiai/structured-outputs-for-ai-generated-financial-models-schemas-before-spreadsheets-3e0h</link>
      <guid>https://dev.to/feasibilityproaiai/structured-outputs-for-ai-generated-financial-models-schemas-before-spreadsheets-3e0h</guid>
      <description>&lt;p&gt;Generating a financial model with an LLM is not primarily a spreadsheet-generation problem. It is a data-contract problem. When an LLM is asked to create a financial model directly in Excel, several important decisions can become implicit. What is an input? Which numbers are assumptions? Which values came from external evidence? Which numbers are calculated? What units are being used? Which fields are mandatory?&lt;/p&gt;

&lt;p&gt;A spreadsheet can represent all of these things, but it is not necessarily the best place to define the contract between an LLM and a financial-modeling system. A more reliable approach is to first represent the model as structured data, validate that structure, perform deterministic calculations, and only then render the result into a spreadsheet.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why the spreadsheet should not be the first output
&lt;/h2&gt;

&lt;p&gt;Consider a simple development model with inputs such as gross floor area, saleable area, selling price, construction cost, professional fees, financing assumptions, and development timing.&lt;/p&gt;

&lt;p&gt;A prompt such as:&lt;br&gt;
Create an Excel development feasibility model from these assumptions. may produce a workbook that looks reasonable. That does not mean the model is correct.&lt;/p&gt;

&lt;p&gt;For example, construction cost might be calculated using gross floor area:&lt;/p&gt;

&lt;p&gt;construction_cost = GFA × construction_cost_per_sqm&lt;/p&gt;

&lt;p&gt;But another implementation could use saleable area:&lt;br&gt;
construction_cost = saleable_area × construction_cost_per_sqm&lt;br&gt;
Both can result in valid Excel formulas.&lt;/p&gt;

&lt;p&gt;The difference is a modelling decision, not a spreadsheet-formatting decision. The same problem occurs with percentages, currencies, time periods, unit conversions, missing assumptions, and the distinction between user inputs and derived values.&lt;br&gt;
The system needs to represent those decisions explicitly before Excel becomes involved.&lt;/p&gt;

&lt;h2&gt;
  
  
  Start with a structured model specification
&lt;/h2&gt;

&lt;p&gt;A useful intermediate representation can describe the financial model without depending on a particular spreadsheet.&lt;br&gt;
For example:&lt;br&gt;
{&lt;br&gt;
  "model": {&lt;br&gt;
    "name": "development_feasibility",&lt;br&gt;
    "currency": "USD",&lt;br&gt;
    "period": "monthly"&lt;br&gt;
  },&lt;br&gt;
  "inputs": [&lt;br&gt;
    {&lt;br&gt;
      "id": "gfa",&lt;br&gt;
      "value": 25000,&lt;br&gt;
      "unit": "sqm",&lt;br&gt;
      "source_type": "user_input"&lt;br&gt;
    },&lt;br&gt;
    {&lt;br&gt;
      "id": "construction_cost",&lt;br&gt;
      "value": 1800,&lt;br&gt;
      "unit": "USD/sqm",&lt;br&gt;
      "source_type": "assumption"&lt;br&gt;
    }&lt;br&gt;
  ],&lt;br&gt;
  "calculations": [&lt;br&gt;
    {&lt;br&gt;
      "id": "construction_cost_total",&lt;br&gt;
      "formula": "gfa * construction_cost",&lt;br&gt;
      "unit": "USD"&lt;br&gt;
    }&lt;br&gt;
  ]&lt;br&gt;
}&lt;br&gt;
The representation is deliberately simple. The important part is that the model's meaning exists independently of the workbook. The application can validate the structure before any spreadsheet is generated. It can also determine whether a calculation references a known input and whether the units and expected data types are consistent.&lt;/p&gt;

&lt;h2&gt;
  
  
  What a schema actually gives you
&lt;/h2&gt;

&lt;p&gt;JSON Schema is useful because it defines the expected structure of the data. A schema can require that value is a number, that unit is a string, and that source_type belongs to an approved set of values.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
{&lt;br&gt;
  "type": "object",&lt;br&gt;
  "properties": {&lt;br&gt;
    "id": {&lt;br&gt;
      "type": "string"&lt;br&gt;
    },&lt;br&gt;
    "value": {&lt;br&gt;
      "type": "number"&lt;br&gt;
    },&lt;br&gt;
    "unit": {&lt;br&gt;
      "type": "string"&lt;br&gt;
    },&lt;br&gt;
    "source_type": {&lt;br&gt;
      "type": "string",&lt;br&gt;
      "enum": [&lt;br&gt;
        "user_input",&lt;br&gt;
        "assumption",&lt;br&gt;
        "verified_evidence"&lt;br&gt;
      ]&lt;br&gt;
    }&lt;br&gt;
  },&lt;br&gt;
  "required": [&lt;br&gt;
    "id",&lt;br&gt;
    "value",&lt;br&gt;
    "unit",&lt;br&gt;
    "source_type"&lt;br&gt;
  ],&lt;br&gt;
  "additionalProperties": false&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;This prevents the model from returning something structurally invalid, such as a text description where a numeric value is required. Modern structured-output APIs can use JSON Schema to constrain model responses. OpenAI's current documentation also distinguishes schema-constrained structured outputs from simply requesting valid JSON. But schema validation has a clear limit.&lt;/p&gt;

&lt;p&gt;It can establish that:&lt;br&gt;
{&lt;br&gt;
  "construction_cost": 1800&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;contains a number. It cannot establish that 1800 is the correct construction-cost assumption for a particular project. That requires evidence or professional judgement. This distinction is important when designing systems for financial modelling.&lt;/p&gt;

&lt;h2&gt;
  
  
  Separate structural validation from model validation
&lt;/h2&gt;

&lt;p&gt;There should be more than one validation layer. The first layer checks the structure of the response. It can validate required fields, data types, enumerations, object structure, and permitted properties.&lt;br&gt;
The second layer checks whether the proposed model makes sense. It can check units, dependencies, calculation references, period consistency, missing assumptions, sign conventions, and other modelling rules.&lt;/p&gt;

&lt;p&gt;A response can pass the first layer and still fail the second. For example, this is structurally valid:&lt;br&gt;
{&lt;br&gt;
  "gfa": 25000,&lt;br&gt;
  "construction_cost": 1800,&lt;br&gt;
  "currency": "USD"&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;But if the calculation engine expects construction cost in USD per square foot, the model has a semantic problem even though every field has the correct basic data type. A schema therefore should not be treated as a financial-model validator. It is one part of the validation system.&lt;/p&gt;

&lt;h2&gt;
  
  
  Keep deterministic calculations deterministic
&lt;/h2&gt;

&lt;p&gt;LLMs are useful for interpreting natural-language instructions and converting them into structured representations. They are less appropriate as the final authority for calculations that can be expressed deterministically.&lt;/p&gt;

&lt;p&gt;Suppose the model specification contains:&lt;br&gt;
gfa = 25,000 sqm&lt;br&gt;
construction_cost = 1,800 USD/sqm&lt;br&gt;
The calculation:&lt;br&gt;
25,000 × 1,800&lt;br&gt;
does not need probabilistic reasoning.&lt;/p&gt;

&lt;p&gt;The calculation engine should perform it. This separation makes the system easier to test because the calculation can be evaluated independently of the language model. It also makes changes easier to trace. If the construction-cost assumption changes, the system can identify the affected calculation rather than relying on the LLM to regenerate an entire workbook.&lt;/p&gt;

&lt;h2&gt;
  
  
  Excel becomes the presentation layer
&lt;/h2&gt;

&lt;p&gt;Excel remains useful because financial professionals can inspect formulas, modify assumptions, test scenarios, and work with a familiar interface. The important design decision is not to remove Excel. It is to avoid making Excel the only representation of the model.&lt;br&gt;
The Excel JavaScript API provides ranges for reading and writing values and formulas. Microsoft's documentation describes Range as the basic object for working with cells and contiguous blocks, with separate values and formulas properties. That means a validated model specification can be translated into a workbook in a controlled way.&lt;/p&gt;

&lt;p&gt;For example, the renderer might write an input value to a specific range and write a formula to another range.&lt;br&gt;
const inputRange = worksheet.getRange("B5");&lt;br&gt;
inputRange.values = [[25000]];&lt;/p&gt;

&lt;p&gt;const outputRange = worksheet.getRange("B10");&lt;br&gt;
outputRange.formulas = [["=B5*B6"]];&lt;/p&gt;

&lt;p&gt;The important point is that the formula is being generated from an already validated model definition. The LLM is not deciding what every spreadsheet cell should contain during workbook construction.&lt;/p&gt;

&lt;h2&gt;
  
  
  Provenance should be part of the data
&lt;/h2&gt;

&lt;p&gt;Financial models contain different kinds of numbers. A user-provided input is not the same thing as an external market observation. An assumption is not the same thing as a calculated output. Those distinctions should remain visible in the structured representation.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
{&lt;br&gt;
  "id": "sale_price",&lt;br&gt;
  "value": 4200,&lt;br&gt;
  "unit": "USD/sqm",&lt;br&gt;
  "source_type": "verified_evidence",&lt;br&gt;
  "source_id": "market_source_017"&lt;br&gt;
}&lt;br&gt;
is materially different from:&lt;br&gt;
{&lt;br&gt;
  "id": "sale_price",&lt;br&gt;
  "value": 4200,&lt;br&gt;
  "unit": "USD/sqm",&lt;br&gt;
  "source_type": "assumption"&lt;br&gt;
}&lt;br&gt;
The numeric value is identical. The provenance is not. A system should also avoid allowing the LLM to invent source identifiers. If a source identifier represents external evidence, it should come from the evidence layer or from an explicitly supplied source. Otherwise the system can create the appearance of provenance without actually having verifiable provenance.&lt;/p&gt;

&lt;h2&gt;
  
  
  Do not make the schema a second spreadsheet
&lt;/h2&gt;

&lt;p&gt;There is a temptation to put everything into the schema.&lt;br&gt;
Every cell.&lt;br&gt;
Every formula.&lt;br&gt;
Every formatting property.&lt;br&gt;
Every Excel address.&lt;br&gt;
Every chart.&lt;br&gt;
That creates another problem.&lt;br&gt;
The schema should represent the meaning of the financial model rather than reproduce the entire workbook.&lt;br&gt;
This is useful:&lt;br&gt;
revenue = units × price_per_unit&lt;br&gt;
This is implementation detail:&lt;br&gt;
cell = H47&lt;br&gt;
formula = "=SUM(H31:H46)"&lt;br&gt;
font = "Calibri"&lt;br&gt;
font_size = 11&lt;/p&gt;

&lt;p&gt;The first describes model logic. The second describes spreadsheet presentation. Keeping those concerns separate makes the system easier to maintain.&lt;/p&gt;

&lt;h2&gt;
  
  
  Schema changes should be treated like API changes
&lt;/h2&gt;

&lt;p&gt;The model schema will evolve.&lt;br&gt;
A first version might contain:&lt;br&gt;
gfa&lt;br&gt;
construction_cost&lt;br&gt;
selling_price&lt;br&gt;
A later version might introduce:&lt;br&gt;
gfa&lt;br&gt;
saleable_area&lt;br&gt;
construction_cost&lt;br&gt;
selling_price&lt;br&gt;
phasing&lt;br&gt;
If older model specifications cannot be identified or interpreted after a schema change, reproducibility becomes difficult.&lt;br&gt;
A simple version field can help:&lt;br&gt;
{&lt;br&gt;
  "schema_version": "1.2"&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;Schema changes can then be tested in the same way that API changes are tested. Maintain representative model fixtures and validate them whenever the schema or calculation engine changes. This is particularly important when an LLM is involved because the model may produce different structures as prompts, schemas, or model versions change.&lt;/p&gt;

&lt;h2&gt;
  
  
  What structured outputs do not solve
&lt;/h2&gt;

&lt;p&gt;Structured outputs do not make the underlying financial assumptions correct.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;They do not verify market evidence.&lt;/li&gt;
&lt;li&gt;They do not determine whether a comparable is appropriate.&lt;/li&gt;
&lt;li&gt;They do not establish that a construction-cost assumption is realistic.&lt;/li&gt;
&lt;li&gt;They do not replace review of development logic.&lt;/li&gt;
&lt;li&gt;They do not make an LLM a financial analyst.&lt;/li&gt;
&lt;li&gt;Their value is more specific.&lt;/li&gt;
&lt;li&gt;They create a stronger boundary between probabilistic language generation and deterministic software.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That boundary makes the system easier to validate, test, debug, and audit.&lt;/p&gt;

&lt;h2&gt;
  
  
  The practical rule
&lt;/h2&gt;

&lt;p&gt;For AI-generated financial models, the useful principle is simple. Let the LLM interpret the request and propose a structured representation. Validate that representation before using it. Keep material calculations deterministic. Preserve the provenance of important inputs. Use Excel to expose the resulting model to the professional user. The interesting engineering question is therefore not whether an LLM can create an Excel file.&lt;/p&gt;

&lt;p&gt;It can.&lt;/p&gt;

&lt;p&gt;The more important question is whether the system can explain what each material number represents, where the number came from, how it was calculated, and which assumptions affect it. That is why structured outputs should come before spreadsheets. AI-Assisted. Human technical review required before publication.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>architecture</category>
      <category>llm</category>
      <category>softwareengineering</category>
    </item>
    <item>
      <title>Human-in-the-Loop Validation for AI-Generated Financial Models</title>
      <dc:creator>FeasibilityproAI  Analysis</dc:creator>
      <pubDate>Fri, 18 Sep 2026 11:00:03 +0000</pubDate>
      <link>https://dev.to/feasibilityproaiai/human-in-the-loop-validation-for-ai-generated-financial-models-4ean</link>
      <guid>https://dev.to/feasibilityproaiai/human-in-the-loop-validation-for-ai-generated-financial-models-4ean</guid>
      <description>&lt;p&gt;AI can now generate surprisingly complete financial models. Give a sufficiently detailed prompt and a modern AI system can produce assumptions, schedules, formulas, scenario structures, and summary outputs in a fraction of the time that a traditional modelling workflow might require. That changes the bottleneck.&lt;/p&gt;

&lt;p&gt;The difficult part is no longer only building the spreadsheet. It is establishing whether the generated model actually represents the business logic that the modeller intended. This distinction matters because a financial model can be mathematically consistent and still be wrong. A formula can calculate exactly what it was written to calculate while implementing the wrong assumption, applying the wrong timing convention, referencing the wrong cell, or interpreting a business instruction incorrectly.&lt;/p&gt;

&lt;p&gt;That is why human-in-the-loop validation should be treated as part of the architecture of an AI-assisted financial modelling system rather than as a final visual inspection before someone opens the workbook. Recent guidance and research point in the same direction. ICAEW's 2026 discussion of AI-generated financial models recommends treating AI output as a draft that requires close human review, while PwC describes human-led validation as important for checking completeness, accuracy, reliability, business alignment, and source quality.&lt;/p&gt;

&lt;h2&gt;
  
  
  Generation and validation are different problems
&lt;/h2&gt;

&lt;p&gt;A useful way to design these systems is to separate model generation from model validation.&lt;br&gt;
The generation process might take natural-language requirements, source documents, assumptions, or structured inputs and convert them into a financial model. The resulting workbook or structured model can then be passed through deterministic calculations and automated validation before a human reviewer examines the remaining issues.&lt;br&gt;
Conceptually, the workflow looks like this:&lt;br&gt;
Source data and requirements&lt;br&gt;
            ↓&lt;br&gt;
      AI model generation&lt;br&gt;
            ↓&lt;br&gt;
    Deterministic calculation&lt;br&gt;
            ↓&lt;br&gt;
     Automated validation&lt;br&gt;
            ↓&lt;br&gt;
       Exception review&lt;br&gt;
            ↓&lt;br&gt;
       Human validation&lt;br&gt;
            ↓&lt;br&gt;
       Approved model&lt;/p&gt;

&lt;p&gt;The important point is that the system does not ask the same component to generate the model and then declare its own output correct.&lt;/p&gt;

&lt;p&gt;The AI system can propose the model structure and logic, but independent checks should establish whether the resulting model satisfies predefined requirements. The human reviewer then deals with questions that cannot be resolved reliably through mechanical checks alone. This separation becomes especially important when the model contains assumptions about timing, business rules, accounting treatment, project phases, or scenario interpretation.&lt;/p&gt;

&lt;h2&gt;
  
  
  A model can be internally consistent and still be wrong
&lt;/h2&gt;

&lt;p&gt;Consider a simplified development model with land cost, construction cost, development period, revenue, operating expenses, financing, and an exit value. Suppose the AI generates all the formulas correctly from a syntactic perspective. Every cell contains a valid formula, there are no broken references, and the workbook recalculates without errors.&lt;/p&gt;

&lt;p&gt;That does not establish that the model is correct. Imagine the project is supposed to generate operating revenue only after completion, but the generated model begins recognizing revenue during construction. The formulas may still be perfectly valid. The spreadsheet may balance. The summary page may display plausible-looking numbers.&lt;/p&gt;

&lt;p&gt;The error is semantic rather than syntactic. The same problem can occur when an AI system interprets a cost assumption incorrectly, uses a different definition of area than the source data, applies an assumption to the wrong period, or changes the dependency between two schedules.&lt;/p&gt;

&lt;p&gt;This is one reason human review remains important. A human reviewer can ask whether the model represents the intended scenario rather than merely whether the spreadsheet executes successfully.&lt;/p&gt;

&lt;h2&gt;
  
  
  Validation should happen at several levels
&lt;/h2&gt;

&lt;p&gt;A robust validation process should not rely on a single test. The first level is structural validation. This checks whether the generated model contains the expected components and whether those components are connected in a sensible way. Required assumptions should be present, expected schedules should exist, output sections should be populated, and unexpected hard-coded values or missing dependencies should be flagged.&lt;/p&gt;

&lt;p&gt;The second level is formula validation. Here the system checks whether formulas exist where they should, whether formulas are consistent across periods, whether references are valid, and whether unexpected changes appear in repeated calculation structures. Checks for broken references, circular references, inconsistent ranges, and formulas replaced by hard-coded values can often be automated.&lt;/p&gt;

&lt;p&gt;The third level is numerical validation. Instead of asking whether an output "looks reasonable," the system tests known relationships within the model. For example, if total revenue is defined as the sum of periodic revenue, that relationship can be tested directly. If total project cost is defined as the sum of several cost categories, the reconciliation can be performed independently of the AI that generated the workbook.&lt;/p&gt;

&lt;p&gt;The fourth level is semantic validation, and this is where human judgement becomes particularly important. The reviewer needs to establish whether the assumptions and calculations correspond to the intended business scenario. Automated tests can tell you that a formula works. They cannot always tell you that it is the right formula for the question being asked.&lt;/p&gt;

&lt;h2&gt;
  
  
  Deterministic checks are particularly valuable
&lt;/h2&gt;

&lt;p&gt;Financial modelling contains many relationships that do not need probabilistic judgement.&lt;br&gt;
If a model specifies that:&lt;br&gt;
Total Cost = Land Cost + Construction Cost + Other Costs&lt;/p&gt;

&lt;p&gt;the validation system can calculate both sides independently and compare them.&lt;br&gt;
If:&lt;br&gt;
Cash Balance[t] =&lt;br&gt;
Cash Balance[t-1]&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cash Inflows[t]&lt;/li&gt;
&lt;li&gt;Cash Outflows[t]&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;the system can test that relationship for every relevant period.&lt;br&gt;
If a revenue schedule is driven by units and price:&lt;br&gt;
Revenue[t] = Units[t] × Price[t]&lt;/p&gt;

&lt;p&gt;The validation process can independently recalculate the expected result. These tests are valuable because they establish explicit pass/fail conditions. The validation result does not depend on another language-model response saying that the number "appears reasonable."&lt;/p&gt;

&lt;p&gt;For financial models, this distinction is important. Where a calculation has a clearly defined mathematical relationship, the validation system should use that relationship as the reference rather than asking another probabilistic model to judge the answer.&lt;/p&gt;

&lt;p&gt;Recent work on financial AI validation makes a similar argument: benchmark performance alone is not sufficient evidence for a production financial AI system, because the complete system also includes data, retrieval, generation, tool use, orchestration, monitoring, and human escalation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Provenance should travel with the assumption
&lt;/h2&gt;

&lt;p&gt;Another important part of validation is provenance. When an AI-generated model contains an assumption such as a construction cost, occupancy rate, price, interest rate, or development period, the reviewer should be able to understand where that value originated.&lt;br&gt;
For example, instead of simply storing:&lt;br&gt;
Construction Cost = 125&lt;/p&gt;

&lt;p&gt;a model could maintain metadata such as:&lt;br&gt;
Value: 125&lt;br&gt;
Unit: USD / sq ft&lt;br&gt;
Source: User-provided assumption&lt;br&gt;
Status: Confirmed&lt;/p&gt;

&lt;p&gt;The exact implementation will vary between systems, but the principle is straightforward: important assumptions should be traceable. This becomes more important when AI systems transform information before placing it into a model. If an input has been extracted from a document, inferred from context, converted between units, or derived from another assumption, the validation process should make that transformation visible.&lt;/p&gt;

&lt;p&gt;The OECD's 2026 work on AI in finance similarly emphasizes traceability, validation, monitoring, and retention of model instances so that problematic behaviour can be investigated later rather than disappearing when a system is updated.&lt;/p&gt;

&lt;h2&gt;
  
  
  Do not use AI as the only validator
&lt;/h2&gt;

&lt;p&gt;One of the easiest mistakes to make is to build a workflow that looks like this:&lt;br&gt;
AI generates model&lt;br&gt;
        ↓&lt;br&gt;
AI reviews model&lt;br&gt;
        ↓&lt;br&gt;
Model approved&lt;/p&gt;

&lt;p&gt;A second AI pass can certainly be useful. It can identify missing sections, obvious inconsistencies, unusual formulas, or potential errors. But it should not be the sole approval mechanism.&lt;/p&gt;

&lt;p&gt;If the same underlying reasoning process can introduce an error, asking a similar system to validate the output does not provide the same level of independence as an external deterministic check or human review.&lt;/p&gt;

&lt;p&gt;A stronger architecture separates responsibilities:&lt;br&gt;
                 ┌─────────────────┐&lt;br&gt;
                  │  AI generation  │&lt;br&gt;
                  └────────┬────────┘&lt;br&gt;
                           ↓&lt;br&gt;
                  ┌─────────────────┐&lt;br&gt;
                  │  Calculations   │&lt;br&gt;
                  │  and rules      │&lt;br&gt;
                  └────────┬────────┘&lt;br&gt;
                           ↓&lt;br&gt;
                  ┌─────────────────┐&lt;br&gt;
                  │ Automated       │&lt;br&gt;
                  │ validation      │&lt;br&gt;
                  └────────┬────────┘&lt;br&gt;
                           ↓&lt;br&gt;
                  ┌─────────────────┐&lt;br&gt;
                  │ Human review    │&lt;br&gt;
                  └────────┬────────┘&lt;br&gt;
                           ↓&lt;br&gt;
                    Approval state&lt;/p&gt;

&lt;p&gt;This does not eliminate AI-generated errors. It creates multiple opportunities for those errors to be detected.&lt;/p&gt;

&lt;h2&gt;
  
  
  Human review should focus on exceptions
&lt;/h2&gt;

&lt;p&gt;Human-in-the-loop does not mean that a modeller should manually inspect every cell in every generated workbook. That would remove much of the efficiency gained from automation. A better design is to automate the repeatable checks and send exceptions to a human reviewer.&lt;/p&gt;

&lt;p&gt;A validation report might therefore look like:&lt;br&gt;
Structural checks: PASS&lt;br&gt;
Formula checks: PASS&lt;br&gt;
Reconciliation checks: PASS&lt;/p&gt;

&lt;p&gt;Missing assumptions: 2&lt;br&gt;
Unexpected formula changes: 1&lt;br&gt;
Timing interpretation: REVIEW REQUIRED&lt;br&gt;
Source provenance: 1 item unresolved&lt;br&gt;
The reviewer can then concentrate on the areas where judgement is actually required.&lt;br&gt;
This is a more practical division of labour. Computers are well suited to repeating deterministic tests across thousands of cells and periods. Humans are better positioned to resolve ambiguous requirements, interpret business context, and challenge assumptions. PwC similarly recommends tailoring the level of human review to the complexity and risk of the use case, with more rigorous validation for higher-stakes financial outputs.&lt;/p&gt;

&lt;h2&gt;
  
  
  Test the model by changing its assumptions
&lt;/h2&gt;

&lt;p&gt;Validation should not stop with the base case. A useful model should respond coherently when important assumptions change. Suppose construction cost increases by 10%. The model should show the corresponding effect on total development cost and any downstream cash-flow metrics that depend on it.&lt;/p&gt;

&lt;p&gt;Suppose the development period changes. Timing-sensitive costs and revenues should move accordingly. Suppose an input is set to zero. If that input is genuinely part of the calculation chain, the relevant outputs should respond. These tests can expose broken dependencies that may not be visible when reviewing the base case alone.&lt;/p&gt;

&lt;p&gt;The purpose is not to determine whether a particular scenario is commercially attractive. The purpose is to verify that the model behaves according to its defined logic when its inputs change.&lt;/p&gt;

&lt;h2&gt;
  
  
  Define the approval state explicitly
&lt;/h2&gt;

&lt;p&gt;Another useful design decision is to make model status explicit. A generated model should not automatically become an approved model.&lt;/p&gt;

&lt;p&gt;A simple state machine could be:&lt;br&gt;
GENERATED&lt;br&gt;
    ↓&lt;br&gt;
AUTOMATED VALIDATION&lt;br&gt;
    ↓&lt;br&gt;
 ┌───────────────┐&lt;br&gt;
 │               │&lt;br&gt;
PASS            FAIL&lt;br&gt;
 │               │&lt;br&gt;
 ↓               ↓&lt;br&gt;
HUMAN REVIEW   REPAIR&lt;br&gt;
 │               │&lt;br&gt;
 ├── APPROVED ───┘&lt;br&gt;
 │&lt;br&gt;
 └── CHANGES REQUIRED&lt;br&gt;
This creates an audit trail around the model itself. It also prevents a common operational problem: treating an AI-generated artifact as if it has already passed the organization's review process simply because it exists and produces numbers.&lt;/p&gt;

&lt;h2&gt;
  
  
  The role of the human is changing
&lt;/h2&gt;

&lt;p&gt;Human-in-the-loop validation does not necessarily mean that AI has failed to automate financial modelling. It means that the nature of the human role changes.&lt;/p&gt;

&lt;p&gt;Instead of spending most of the time manually constructing repetitive formulas, a modeller may spend more time defining assumptions, establishing validation rules, reviewing exceptions, testing model behaviour, and challenging the interpretation of the generated model.&lt;/p&gt;

&lt;p&gt;That shift is consistent with recent industry research. The Financial Modeling Institute's 2026 survey of 63 financial-modelling professionals across 26 countries found that none of the respondents said they would be confident relying on an AI-generated financial model for a high-stakes business decision without independent human review.&lt;/p&gt;

&lt;p&gt;The implication is not that AI-generated modelling has no value. It is that generation and approval should be treated as different stages of the workflow.&lt;/p&gt;

&lt;h2&gt;
  
  
  A practical validation framework
&lt;/h2&gt;

&lt;p&gt;For an AI-assisted financial modelling system, a useful validation framework can therefore combine five elements.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;First, validate structure.&lt;/strong&gt; Confirm that the model contains the expected inputs, schedules, calculations, and outputs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Second, validate formulas and relationships.&lt;/strong&gt; Check references, repeated formulas, reconciliations, dependencies, and other deterministic relationships independently of the generation process.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Third, validate provenance.&lt;/strong&gt; Make important assumptions traceable to their source and record transformations where relevant.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fourth, test behaviour.&lt;/strong&gt; Change important assumptions and confirm that the model responds according to its defined logic rather than merely producing a plausible base case.&lt;/p&gt;

&lt;p&gt;Fifth, require human approval for unresolved semantic questions. The reviewer should be able to challenge assumptions, interpretation, timing, and other aspects that automated checks cannot reliably resolve. This produces a more useful definition of validation than simply checking whether a spreadsheet opens without errors.&lt;/p&gt;

&lt;h2&gt;
  
  
  The goal is controlled automation
&lt;/h2&gt;

&lt;p&gt;The strongest argument for human-in-the-loop validation is not that humans are always better than AI or that AI should never be trusted. The practical argument is that different parts of a financial modelling workflow have different verification requirements.&lt;/p&gt;

&lt;p&gt;AI can be useful for generating structures, translating requirements into model components, drafting formulas, and accelerating repetitive work. Deterministic systems can test calculations and reconciliations. Provenance mechanisms can make assumptions traceable. Automated validation can identify exceptions. Human reviewers can resolve ambiguity and determine whether the model represents the intended business logic.&lt;/p&gt;

&lt;p&gt;The result is a workflow in which the model does not become trusted merely because an AI system generated it. It becomes reviewable because its assumptions can be traced, its calculations can be tested, its behaviour can be challenged, and its unresolved questions can be presented to a human before approval. For financial modelling, that distinction is fundamental.&lt;/p&gt;

&lt;p&gt;Generation produces a model. Validation produces evidence about the model. Human review determines whether that evidence is sufficient for the intended use.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>llm</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Keep the LLM Out of the Math: Deterministic Boundaries for Financial Modelling Agents</title>
      <dc:creator>FeasibilityproAI  Analysis</dc:creator>
      <pubDate>Fri, 11 Sep 2026 09:57:15 +0000</pubDate>
      <link>https://dev.to/feasibilityproaiai/keep-the-llm-out-of-the-math-deterministic-boundaries-for-financial-modelling-agents-5cl7</link>
      <guid>https://dev.to/feasibilityproaiai/keep-the-llm-out-of-the-math-deterministic-boundaries-for-financial-modelling-agents-5cl7</guid>
      <description>&lt;p&gt;Large language models are increasingly being used as interfaces to financial software. Instead of opening a spreadsheet and navigating through dozens of tabs, a user can describe a change in ordinary language and ask an AI system to identify the relevant assumption, run a scenario, compare two cases, or explain why an output changed. That interaction model is useful because financial models are often difficult to navigate even for experienced users, particularly when the underlying workbook contains many assumptions, formulas, dependencies, and scenario-specific adjustments.&lt;/p&gt;

&lt;p&gt;The architectural problem begins when the language model is also made responsible for performing the financial calculation itself.&lt;/p&gt;

&lt;p&gt;That may seem reasonable at first. The model understands the request, it has access to the relevant numbers, and modern LLMs can perform arithmetic. For a simple calculation, the distinction may not matter much. In a real financial model, however, the calculation is rarely an isolated operation. A single assumption can affect a long chain of formulas, and the correctness of the final result depends not only on arithmetic but also on which assumptions were selected, how they were interpreted, which dependencies were recalculated, and whether the resulting state is consistent with the model.&lt;/p&gt;

&lt;p&gt;This is why a financial AI system should separate language reasoning from numerical execution.&lt;/p&gt;

&lt;p&gt;The language model should be responsible for understanding the user's intent and translating that intent into a structured operation. A deterministic calculation layer should then validate the operation, execute the relevant formulas, and return structured results. The language model can come back into the process afterward to explain those results in terms that a human can understand.&lt;/p&gt;

&lt;p&gt;That division of responsibility is not about pretending that LLMs cannot do mathematics. It is about giving each part of the system a job that can be tested and trusted independently.&lt;/p&gt;

&lt;h2&gt;
  
  
  The difficult part is usually not the arithmetic
&lt;/h2&gt;

&lt;p&gt;Consider a request such as:&lt;br&gt;
What happens to the project if construction costs increase by 8%?&lt;br&gt;
The arithmetic implied by the question is straightforward. If the relevant construction cost is $10 million, an 8% increase produces $10.8 million.&lt;/p&gt;

&lt;p&gt;The difficult part is determining what the user actually means by "construction costs" in the context of the model.&lt;/p&gt;

&lt;p&gt;The workbook might contain total construction cost, construction cost per square metre, separate hard and soft costs, costs distributed across multiple development periods, or different cost assumptions for different scenarios. The model might also calculate financing costs from the timing and amount of construction expenditure. If the assumption changes, those financing costs may need to change as well. A scenario may need to be created instead of modifying the base case.&lt;/p&gt;

&lt;p&gt;None of those questions can be answered by arithmetic alone. They are interpretation and model-structure questions.&lt;/p&gt;

&lt;p&gt;Once the correct variable has been identified and the intended operation has been validated, however, there is little reason for the language model to calculate the resulting financial outputs itself. The application already has a place where those calculations can be performed deterministically.&lt;/p&gt;

&lt;p&gt;This distinction becomes particularly important because recent evaluations of spreadsheet agents show that the hard part of real financial spreadsheet work is not simply generating an individual formula. End-to-end tasks involve multiple worksheets, dependencies, debugging, formatting, and selecting the correct cells or model components. SpreadsheetBench 2, for example, evaluates agents on realistic multi-sheet business workflows and reports substantial reliability gaps in current systems.&lt;/p&gt;

&lt;h2&gt;
  
  
  A financial agent should translate intent into an operation
&lt;/h2&gt;

&lt;p&gt;A useful way to think about the LLM is as a translation layer.&lt;br&gt;
The user speaks in terms of business intent:&lt;br&gt;
Increase construction cost by 8% and show me the effect on the project.&lt;br&gt;
The application needs something much more precise:&lt;br&gt;
{&lt;br&gt;
  "operation": "scenario_change",&lt;br&gt;
  "target": "construction_cost",&lt;br&gt;
  "change_type": "relative",&lt;br&gt;
  "change": 0.08&lt;br&gt;
}&lt;br&gt;
This structured object should not immediately be treated as a valid instruction.&lt;br&gt;
It is a proposed operation that needs to pass through validation.&lt;br&gt;
The system can check whether construction_cost exists in the model, whether the operation supports a relative change, whether the percentage is expressed in the expected format, and whether the user is asking to create a scenario or modify an existing assumption. It can then pass the validated operation to the calculation layer.&lt;/p&gt;

&lt;p&gt;This creates a useful separation:&lt;/p&gt;

&lt;p&gt;Natural-language request&lt;br&gt;
          |&lt;br&gt;
          v&lt;br&gt;
    LLM interpretation&lt;br&gt;
          |&lt;br&gt;
          v&lt;br&gt;
  Structured operation&lt;br&gt;
          |&lt;br&gt;
          v&lt;br&gt;
      Validation&lt;br&gt;
          |&lt;br&gt;
          v&lt;br&gt;
 Deterministic calculation&lt;br&gt;
          |&lt;br&gt;
          v&lt;br&gt;
    Structured result&lt;br&gt;
          |&lt;br&gt;
          v&lt;br&gt;
    LLM explanation&lt;/p&gt;

&lt;p&gt;The LLM therefore does not disappear from the workflow. It simply stops being the authority for the numerical result.&lt;/p&gt;

&lt;p&gt;That distinction is important because it gives engineers something concrete to test. The interpretation step can be evaluated against expected structured operations, while the calculation engine can be tested independently using known inputs and outputs.&lt;/p&gt;

&lt;h2&gt;
  
  
  Structured output does not solve the reliability problem by itself
&lt;/h2&gt;

&lt;p&gt;One of the easiest mistakes to make is assuming that structured output automatically makes an AI system reliable.&lt;/p&gt;

&lt;p&gt;It does not. A model can return perfectly valid JSON that describes a completely inappropriate operation.&lt;br&gt;
For example:&lt;br&gt;
{&lt;br&gt;
  "operation": "set_assumption",&lt;br&gt;
  "target": "construction_cost",&lt;br&gt;
  "value": -5000000&lt;br&gt;
}&lt;br&gt;
The JSON is valid. The instruction may be nonsensical.&lt;/p&gt;

&lt;p&gt;The application therefore needs to distinguish between syntactic validity and semantic validity.&lt;/p&gt;

&lt;p&gt;Syntactic validation answers questions such as whether the required fields exist and whether their data types are correct. Semantic validation asks whether the operation makes sense in the context of the actual financial model.&lt;/p&gt;

&lt;p&gt;That second layer might check whether the target variable exists, whether the unit is compatible with the variable, whether the value falls within an acceptable range, whether the requested operation is supported for the current scenario, and whether changing that assumption requires additional calculations to be performed.&lt;/p&gt;

&lt;p&gt;This is also where authorization belongs. If an agent is allowed to change assumptions, the application should decide which operations the user is permitted to perform. The LLM should not determine its own authority simply because it has generated a plausible tool call.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tool design matters more than giving the model more freedom
&lt;/h2&gt;

&lt;p&gt;Agent frameworks often make it easy to expose a large collection of tools to a language model and allow the model to decide what to do next.&lt;/p&gt;

&lt;p&gt;That flexibility is useful for some applications, but financial modelling generally benefits from narrower interfaces.&lt;/p&gt;

&lt;p&gt;Imagine giving an agent a generic spreadsheet-editing function that allows it to select arbitrary cells, change their values, rewrite formulas, and modify formatting. The model may be capable of using such a tool, but every additional degree of freedom increases the number of ways in which an incorrect interpretation can become a damaging state change.&lt;/p&gt;

&lt;p&gt;A better approach is to expose operations that correspond to meaningful financial-model actions.&lt;br&gt;
For example:&lt;br&gt;
get_assumption()&lt;br&gt;
set_assumption()&lt;br&gt;
create_scenario()&lt;br&gt;
calculate_scenario()&lt;br&gt;
compare_scenarios()&lt;br&gt;
get_dependencies()&lt;br&gt;
The difference is subtle but important.&lt;br&gt;
With a generic spreadsheet tool, the model decides both what the user means and how that meaning should be implemented in the workbook.&lt;/p&gt;

&lt;p&gt;With a domain-specific interface, the model decides what operation the user appears to be requesting, while the application determines how that operation is safely executed.&lt;/p&gt;

&lt;p&gt;For example, the model might produce:&lt;br&gt;
{&lt;br&gt;
  "function": "set_assumption",&lt;br&gt;
  "arguments": {&lt;br&gt;
    "scenario": "construction_cost_upside",&lt;br&gt;
    "target": "construction_cost_per_gfa",&lt;br&gt;
    "value": 1850,&lt;br&gt;
    "unit": "USD/m2"&lt;br&gt;
  }&lt;br&gt;
}&lt;br&gt;
The application can then resolve construction_cost_per_gfa, verify the unit, check whether the scenario exists, validate the value, and determine which downstream calculations must be recalculated.&lt;/p&gt;

&lt;p&gt;The agent is still useful, but the financial model retains control of its own state.&lt;/p&gt;

&lt;h2&gt;
  
  
  Deterministic calculations are valuable because they can be tested
&lt;/h2&gt;

&lt;p&gt;Moving arithmetic out of the LLM is not enough on its own. The calculation layer must also be engineered properly.&lt;/p&gt;

&lt;p&gt;A deterministic function is valuable because its behaviour can be inspected and tested independently of the language model.&lt;br&gt;
For example:&lt;br&gt;
def development_margin(revenue, total_cost):&lt;br&gt;
    if revenue == 0:&lt;br&gt;
        raise ValueError("Revenue cannot be zero")&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;return (revenue - total_cost) / revenue
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;The important property here is not that the formula is sophisticated. It is that the function has a clearly defined contract.&lt;/p&gt;

&lt;p&gt;Given the same valid inputs, the function should produce the same result. That allows ordinary software-testing techniques to be applied.&lt;/p&gt;

&lt;p&gt;You can test expected values, invalid inputs, boundary conditions, and changes to the underlying calculation logic. You can also run regression tests against known model cases whenever the calculation engine changes. Scenario testing becomes especially useful.&lt;/p&gt;

&lt;p&gt;If construction cost increases while all other assumptions remain unchanged, the system should produce a predictable direction of change in the relevant outputs. If the model contains financing costs that depend on construction expenditure, those dependencies should be explicitly represented and tested rather than relying on the language model to remember them.&lt;/p&gt;

&lt;p&gt;The calculation engine should therefore be treated as software, not as a hidden extension of the prompt.&lt;br&gt;
Spreadsheet automation makes the distinction even more important&lt;br&gt;
The argument becomes stronger when the AI agent operates directly on spreadsheets.&lt;br&gt;
A spreadsheet is not simply a two-dimensional database of values. It is a computational environment containing formulas, references, dependencies, named ranges, formatting conventions, multiple worksheets, and often business logic that is encoded indirectly through the workbook's structure.&lt;/p&gt;

&lt;p&gt;That creates a much larger surface area for errors. Recent financial spreadsheet benchmarks reinforce this point. WorkstreamBench evaluates agents on end-to-end financial spreadsheet tasks and measures accuracy, formula quality, and format against professional standards. Its results indicate that even strong agents can degrade substantially as workflows move beyond relatively small chains of calculations.&lt;/p&gt;

&lt;p&gt;BlueFin reaches a similar conclusion from another direction. Its benchmark contains challenging professional-finance spreadsheet tasks, and frontier models perform poorly on some of the dynamic-correctness requirements.&lt;/p&gt;

&lt;p&gt;That does not mean spreadsheet agents are useless. It means that "the model can edit the spreadsheet" should not be confused with "the model can reliably maintain the financial logic of the spreadsheet." Those are different capabilities.&lt;/p&gt;

&lt;p&gt;A robust architecture should therefore make the financial model's rules explicit wherever possible and use the LLM to navigate, interpret, and communicate rather than silently becoming the spreadsheet's calculation engine.&lt;/p&gt;

&lt;h2&gt;
  
  
  The number should carry its provenance
&lt;/h2&gt;

&lt;p&gt;There is another reason to separate calculation from language generation: a financial output needs more context than its value.&lt;/p&gt;

&lt;p&gt;Suppose an agent returns:&lt;/p&gt;

&lt;p&gt;Development profit: $12.4 million&lt;/p&gt;

&lt;p&gt;The number may be correct, but a professional user will often have a more important question:&lt;br&gt;
Why is it $12.4 million?&lt;/p&gt;

&lt;p&gt;A useful system should be able to trace that result back through the assumptions and calculations that produced it.&lt;br&gt;
For example:&lt;br&gt;
Development profit&lt;br&gt;
    |&lt;br&gt;
    +-- Revenue&lt;br&gt;
    |     |&lt;br&gt;
    |     +-- Area assumptions&lt;br&gt;
    |     +-- Pricing assumptions&lt;br&gt;
    |&lt;br&gt;
    +-- Development costs&lt;br&gt;
          |&lt;br&gt;
          +-- Construction cost&lt;br&gt;
          +-- Professional fees&lt;br&gt;
          +-- Financing&lt;br&gt;
The implementation does not need to expose this exact diagram to the user, but the underlying system should preserve enough information to reconstruct the dependency chain. That may include the model version, scenario, input values, units, calculation function, source references, and validation results.&lt;/p&gt;

&lt;p&gt;The advantage is not merely auditability. It also makes debugging much easier.If the final result looks wrong, an engineer can determine whether the problem originated with the source assumption, the interpretation of the user's request, the dependency mapping, or the calculation itself.&lt;/p&gt;

&lt;p&gt;Without provenance, all of those failures collapse into one generic problem: "the AI gave the wrong answer."&lt;/p&gt;

&lt;h2&gt;
  
  
  Evidence and assumptions should not be treated as the same thing
&lt;/h2&gt;

&lt;p&gt;This becomes especially important when an AI system retrieves information from external sources.&lt;br&gt;
Imagine an agent finds a market report containing a rental figure.&lt;br&gt;
The retrieved figure is evidence.&lt;br&gt;
It is not automatically a model assumption.&lt;br&gt;
There is a chain of decisions between those two things. The system needs to know what the source actually said, which period it referred to, what geography it covered, what unit it used, and whether the figure is appropriate for the model being constructed.&lt;br&gt;
Only after that assessment should the value become an explicit modelling assumption.&lt;br&gt;
A useful representation might look like:&lt;br&gt;
{&lt;br&gt;
  "evidence": {&lt;br&gt;
    "source": "market_report.pdf",&lt;br&gt;
    "page": 18,&lt;br&gt;
    "metric": "average_rent",&lt;br&gt;
    "period": "2026-Q2",&lt;br&gt;
    "value": 42&lt;br&gt;
  }&lt;br&gt;
}&lt;br&gt;
The model can then contain a separate assumption:&lt;br&gt;
{&lt;br&gt;
  "assumption": {&lt;br&gt;
    "name": "monthly_rent",&lt;br&gt;
    "value": 42,&lt;br&gt;
    "unit": "currency/m2/month",&lt;br&gt;
    "source_reference": "market_report.pdf:p18"&lt;br&gt;
  }&lt;br&gt;
}&lt;br&gt;
The distinction allows someone reviewing the model to challenge either the evidence or the modelling decision without confusing the two.&lt;br&gt;
This is one of the areas where AI systems can otherwise become difficult to audit. A generated answer may look authoritative even though the underlying number passed through several undocumented interpretation steps.&lt;/p&gt;

&lt;h2&gt;
  
  
  The LLM becomes more useful after the calculation
&lt;/h2&gt;

&lt;p&gt;Once the calculation engine has produced a structured result, the language model can return to the workflow.&lt;br&gt;
This is where it can provide substantial value without being responsible for the underlying arithmetic.&lt;br&gt;
Suppose the calculation engine returns:&lt;br&gt;
{&lt;br&gt;
  "scenario": "construction_cost_upside",&lt;br&gt;
  "construction_cost_change": 0.08,&lt;br&gt;
  "profit_change": -1200000,&lt;br&gt;
  "margin_change": -0.047&lt;br&gt;
}&lt;br&gt;
The LLM can explain what happened in context:&lt;br&gt;
The 8% increase in construction cost reduces projected development profit by $1.2 million under this scenario. The model also shows a reduction in margin of approximately 4.7 percentage points. These changes reflect the assumptions and dependencies contained in the current model, so the scenario should be interpreted as a sensitivity to those assumptions rather than as an independent forecast.&lt;br&gt;
The difference is important.&lt;br&gt;
The LLM is not deciding that profit fell by $1.2 million.&lt;br&gt;
The calculation engine has already established that result.&lt;br&gt;
The LLM is translating the result into useful language.&lt;br&gt;
That makes the generated explanation easier to review because every important numerical statement can be traced back to structured output.&lt;/p&gt;

&lt;h2&gt;
  
  
  A good financial agent should be replayable
&lt;/h2&gt;

&lt;p&gt;A useful engineering test for an AI financial workflow is to ask whether another engineer could reproduce the calculation without asking the LLM to perform the reasoning again.&lt;br&gt;
Suppose the system records:&lt;br&gt;
{&lt;br&gt;
  "model_version": "2026.09",&lt;br&gt;
  "scenario": "construction_cost_upside",&lt;br&gt;
  "inputs": {&lt;br&gt;
    "construction_cost": 12500000,&lt;br&gt;
    "revenue": 18000000&lt;br&gt;
  },&lt;br&gt;
  "operations": [&lt;br&gt;
    {&lt;br&gt;
      "function": "apply_relative_change",&lt;br&gt;
      "target": "construction_cost",&lt;br&gt;
      "change": 0.08&lt;br&gt;
    },&lt;br&gt;
    {&lt;br&gt;
      "function": "development_profit",&lt;br&gt;
      "target": "profit"&lt;br&gt;
    }&lt;br&gt;
  ]&lt;br&gt;
}&lt;br&gt;
Another process should be able to take the same model version, inputs, and operations and reproduce the result.&lt;/p&gt;

&lt;p&gt;This property is useful for much more than formal auditing. It helps with debugging, regression testing, incident investigation, and model review.There is growing research specifically around reproducibility and determinism in tool-using financial agents, including work examining whether identical inputs can produce consistent trajectories and evidence-aligned decisions.&lt;/p&gt;

&lt;p&gt;The broader engineering principle is straightforward: if a result matters, the system should retain enough information to reproduce how that result was obtained.&lt;/p&gt;

&lt;h2&gt;
  
  
  Human review becomes more meaningful when the architecture is explicit
&lt;/h2&gt;

&lt;p&gt;"Human in the loop" is often presented as a solution to AI reliability problems, but simply putting a person at the end of an opaque workflow does not necessarily make the workflow safe.&lt;/p&gt;

&lt;p&gt;A reviewer needs something meaningful to inspect.&lt;br&gt;
A well-designed financial agent can expose a chain such as:&lt;br&gt;
User request&lt;br&gt;
     ↓&lt;br&gt;
Interpreted operation&lt;br&gt;
     ↓&lt;br&gt;
Validated target&lt;br&gt;
     ↓&lt;br&gt;
Evidence / assumptions&lt;br&gt;
     ↓&lt;br&gt;
Deterministic calculation&lt;br&gt;
     ↓&lt;br&gt;
Changed outputs&lt;br&gt;
     ↓&lt;br&gt;
Generated explanation&lt;br&gt;
The reviewer can then ask the right question at the right layer.&lt;br&gt;
If the target variable is wrong, the interpretation needs attention.&lt;br&gt;
If the source assumption is unsuitable, the evidence needs attention.&lt;br&gt;
If the formula is wrong, the calculation engine needs attention.&lt;br&gt;
If the calculation is correct but the narrative overstates what it proves, the explanation needs attention.&lt;/p&gt;

&lt;p&gt;That is far more useful than asking someone to read a polished paragraph and decide whether it "looks right."&lt;br&gt;
The architecture also limits the blast radius of an AI mistake&lt;br&gt;
There is a practical reason to keep these boundaries separate. LLMs will make interpretation errors.&lt;/p&gt;

&lt;p&gt;The objective should therefore not be to build a system that assumes the model will never make a mistake. The objective should be to make sure an interpretation error does not automatically become an uncontrolled financial-model mutation.&lt;br&gt;
If the LLM proposes:&lt;br&gt;
construction_cost_per_gfa = 1850 USD/m²&lt;br&gt;
the application can reject it if the unit is incompatible, the variable does not exist, the value is outside an allowed range, or the requested scenario cannot be modified.&lt;/p&gt;

&lt;p&gt;The model has made a mistake, but the system has contained it. This is a much more realistic approach to AI reliability than trying to eliminate every possible model error.&lt;/p&gt;

&lt;h2&gt;
  
  
  The practical rule
&lt;/h2&gt;

&lt;p&gt;For financial modelling agents, the most useful rule is simple:&lt;br&gt;
If a result must be reproducible from the same inputs, the LLM should not be responsible for producing the result.&lt;br&gt;
That does not mean LLMs have no place in financial modelling.&lt;br&gt;
They can be extremely useful for interpreting requests, extracting assumptions from documents, identifying ambiguity, selecting appropriate operations, summarising scenario changes, and explaining model outputs.&lt;/p&gt;

&lt;p&gt;The calculation layer should remain responsible for arithmetic, formula execution, dependency propagation, validation, scenario calculation, and other operations where reproducibility matters.&lt;/p&gt;

&lt;p&gt;The provenance layer should preserve enough information to explain where the inputs came from and how the outputs were produced.&lt;/p&gt;

&lt;p&gt;The human reviewer should be able to inspect the chain rather than simply trusting the final prose.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;The interesting engineering question is not whether a language model can calculate an eight-percent increase.&lt;/p&gt;

&lt;p&gt;It can.&lt;br&gt;
The harder question is what happens when that calculation becomes one step in a financial model containing hundreds of assumptions, thousands of formulas, cross-sheet dependencies, external evidence, and scenario logic. At that point, asking the LLM to perform everything in one conversational loop creates an unnecessary reliability problem.&lt;/p&gt;

&lt;p&gt;A better architecture gives the language model responsibility for language and interpretation while giving deterministic software responsibility for numerical execution.&lt;/p&gt;

&lt;p&gt;The LLM can translate the user's request into a structured operation. The application can validate that operation against the model. A deterministic calculation engine can execute the relevant formulas. The system can preserve provenance and return structured results. Finally, the LLM can explain those results in language that makes sense to the user.&lt;/p&gt;

&lt;p&gt;The result is not an attempt to make the language model behave like a spreadsheet.&lt;/p&gt;

&lt;p&gt;It is a system in which the language model acts as an intelligent interface to a financial model whose calculations remain explicit, testable, reproducible, and reviewable. For financial AI, that boundary is not a limitation. It is part of the architecture that makes the system useful.&lt;/p&gt;

</description>
      <category>agents</category>
      <category>ai</category>
      <category>architecture</category>
      <category>llm</category>
    </item>
    <item>
      <title>Why Cell-Level Citations Matter in AI-Powered Excel Tools</title>
      <dc:creator>FeasibilityproAI  Analysis</dc:creator>
      <pubDate>Sat, 05 Sep 2026 10:22:57 +0000</pubDate>
      <link>https://dev.to/feasibilityproaiai/why-cell-level-citations-matter-in-ai-powered-excel-tools-43pk</link>
      <guid>https://dev.to/feasibilityproaiai/why-cell-level-citations-matter-in-ai-powered-excel-tools-43pk</guid>
      <description>&lt;p&gt;An AI system can give you the right number and still give you a poor answer.&lt;/p&gt;

&lt;p&gt;The problem is not necessarily the calculation. It is the missing chain between the number in the workbook and the evidence that produced it.&lt;/p&gt;

&lt;p&gt;Consider a development model with a cell containing:&lt;/p&gt;

&lt;p&gt;Construction cost = 2,200 / m²&lt;/p&gt;

&lt;p&gt;A reviewer immediately has several questions:&lt;/p&gt;

&lt;p&gt;Where did 2,200 come from?&lt;br&gt;
What geography does it represent?&lt;br&gt;
What asset type?&lt;br&gt;
What date?&lt;br&gt;
Is it an actual project cost, an industry benchmark, or an assumption?&lt;br&gt;
Who entered it?&lt;br&gt;
What happens if the source changes?&lt;/p&gt;

&lt;p&gt;A conventional spreadsheet often stores the value but not enough of that context.&lt;/p&gt;

&lt;p&gt;That becomes more important when AI is involved.&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;That is why cell-level citations are useful.&lt;/p&gt;

&lt;h2&gt;
  
  
  The basic model: value is not provenance
&lt;/h2&gt;

&lt;p&gt;A useful mental model is:&lt;/p&gt;

&lt;p&gt;source&lt;br&gt;
  ↓&lt;br&gt;
extracted fact&lt;br&gt;
  ↓&lt;br&gt;
interpreted assumption&lt;br&gt;
  ↓&lt;br&gt;
Excel cell&lt;br&gt;
  ↓&lt;br&gt;
formula&lt;br&gt;
  ↓&lt;br&gt;
model output&lt;/p&gt;

&lt;p&gt;Each stage answers a different question.&lt;/p&gt;

&lt;p&gt;The source answers:&lt;/p&gt;

&lt;p&gt;What evidence did we use?&lt;/p&gt;

&lt;p&gt;The extracted fact answers:&lt;/p&gt;

&lt;p&gt;What did we take from that evidence?&lt;/p&gt;

&lt;p&gt;The assumption answers:&lt;/p&gt;

&lt;p&gt;How did we translate the evidence into a modelling input?&lt;/p&gt;

&lt;p&gt;The cell answers:&lt;/p&gt;

&lt;p&gt;Where does that assumption live?&lt;/p&gt;

&lt;p&gt;The formula answers:&lt;/p&gt;

&lt;p&gt;How does the model use it?&lt;/p&gt;

&lt;p&gt;The output answers:&lt;/p&gt;

&lt;p&gt;What does the model produce under these assumptions?&lt;/p&gt;

&lt;p&gt;AI systems often compress these stages into one response.&lt;/p&gt;

&lt;p&gt;That is convenient for generation, but inconvenient for review.&lt;/p&gt;

&lt;p&gt;A citation system should do the opposite: preserve the relationships.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why a citation attached to the cell is different
&lt;/h2&gt;

&lt;p&gt;Suppose an AI workflow produces this workbook:&lt;/p&gt;

&lt;p&gt;Cell    Input&lt;br&gt;
B12 2,200&lt;br&gt;
B13 12,000&lt;br&gt;
B14 70%&lt;/p&gt;

&lt;p&gt;An external research log might say:&lt;/p&gt;

&lt;p&gt;B12 → source A&lt;br&gt;
B13 → source B&lt;br&gt;
B14 → source C&lt;/p&gt;

&lt;p&gt;That is better than nothing, but the reviewer still has to maintain two contexts.&lt;/p&gt;

&lt;p&gt;A cell-level citation puts the provenance closer to the object being reviewed.&lt;/p&gt;

&lt;p&gt;Conceptually:&lt;/p&gt;

&lt;p&gt;B12&lt;br&gt;
Construction cost&lt;br&gt;
2,200 / m²&lt;br&gt;
    │&lt;br&gt;
    └── Source:&lt;br&gt;
        report.pdf, p. 18&lt;br&gt;
        published: 2026-06&lt;br&gt;
        geography: Dubai&lt;br&gt;
        asset: residential&lt;/p&gt;

&lt;p&gt;The important idea is not the particular UI mechanism.&lt;/p&gt;

&lt;p&gt;It is locality.&lt;/p&gt;

&lt;p&gt;When a reviewer questions a number, the evidence should be discoverable from the number.&lt;/p&gt;

&lt;h2&gt;
  
  
  Excel already has a useful primitive: comments
&lt;/h2&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;For example, an add-in can create a comment thread on a specific cell:&lt;/p&gt;

&lt;p&gt;await Excel.run(async (context) =&amp;gt; {&lt;br&gt;
  const comments = context.workbook.comments;&lt;/p&gt;

&lt;p&gt;comments.add(&lt;br&gt;
    "Assumptions!B12",&lt;br&gt;
    "Source: Construction Cost Report\n" +&lt;br&gt;
    "Published: 2026-06\n" +&lt;br&gt;
    "Page: 18\n" +&lt;br&gt;
    "Geography: Dubai\n" +&lt;br&gt;
    "Asset: Residential"&lt;br&gt;
  );&lt;/p&gt;

&lt;p&gt;await context.sync();&lt;br&gt;
});&lt;/p&gt;

&lt;p&gt;The important part is not the API call.&lt;/p&gt;

&lt;p&gt;It is that Assumptions!B12 is explicitly connected to its provenance.&lt;/p&gt;

&lt;p&gt;Microsoft documents the comments API as part of the Excel JavaScript API, with comment support available from the relevant API sets.&lt;/p&gt;

&lt;p&gt;Office Scripts provides another route for workbook automation and also supports adding comments to cells.&lt;/p&gt;

&lt;h3&gt;
  
  
  But don't put the whole source system into the comment
&lt;/h3&gt;

&lt;p&gt;A tempting implementation is to dump everything into the cell comment:&lt;/p&gt;

&lt;p&gt;Source:&lt;br&gt;
URL:&lt;br&gt;
Document:&lt;br&gt;
Page:&lt;br&gt;
Paragraph:&lt;br&gt;
Extract:&lt;br&gt;
LLM:&lt;br&gt;
Prompt:&lt;br&gt;
Model:&lt;br&gt;
Timestamp:&lt;br&gt;
Hash:&lt;br&gt;
Confidence:&lt;br&gt;
Reasoning:&lt;br&gt;
...&lt;/p&gt;

&lt;p&gt;That quickly becomes unusable.&lt;/p&gt;

&lt;p&gt;The comment should be a pointer, not the entire provenance database.&lt;/p&gt;

&lt;p&gt;A better pattern is:&lt;/p&gt;

&lt;p&gt;Cell&lt;br&gt;
  ↓&lt;br&gt;
Citation ID&lt;br&gt;
  ↓&lt;br&gt;
Provenance record&lt;br&gt;
  ↓&lt;br&gt;
Source&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;p&gt;B12 → SRC-00427&lt;/p&gt;

&lt;p&gt;and the provenance record might contain:&lt;/p&gt;

&lt;p&gt;{&lt;br&gt;
  "citation_id": "SRC-00427",&lt;br&gt;
  "source": {&lt;br&gt;
    "document": "construction-cost-report.pdf",&lt;br&gt;
    "page": 18,&lt;br&gt;
    "published": "2026-06"&lt;br&gt;
  },&lt;br&gt;
  "scope": {&lt;br&gt;
    "geography": "Dubai",&lt;br&gt;
    "asset": "residential"&lt;br&gt;
  },&lt;br&gt;
  "extracted_value": 2200,&lt;br&gt;
  "unit": "USD/m²"&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;This creates a useful separation:&lt;/p&gt;

&lt;p&gt;Excel stores the reference.&lt;/p&gt;

&lt;p&gt;The provenance layer stores the detail.&lt;/p&gt;

&lt;h2&gt;
  
  
  The citation should describe evidence, not certainty
&lt;/h2&gt;

&lt;p&gt;This distinction matters.&lt;/p&gt;

&lt;p&gt;Imagine a source says:&lt;/p&gt;

&lt;p&gt;Construction costs for a particular benchmark category were reported at X.&lt;/p&gt;

&lt;p&gt;The model may subsequently use X as an assumption.&lt;/p&gt;

&lt;p&gt;The citation should not silently convert:&lt;/p&gt;

&lt;p&gt;reported benchmark&lt;/p&gt;

&lt;p&gt;into:&lt;/p&gt;

&lt;p&gt;true project cost&lt;/p&gt;

&lt;p&gt;Those are different claims.&lt;/p&gt;

&lt;p&gt;A good provenance record therefore distinguishes at least:&lt;/p&gt;

&lt;p&gt;SOURCE&lt;br&gt;
DATA PERIOD&lt;br&gt;
GEOGRAPHY&lt;br&gt;
ASSET CLASS&lt;br&gt;
EXTRACTED VALUE&lt;br&gt;
UNIT&lt;br&gt;
INTERPRETATION&lt;br&gt;
MODEL ASSUMPTION&lt;/p&gt;

&lt;p&gt;That makes it possible for a reviewer to challenge the interpretation rather than merely inspect the URL.&lt;/p&gt;

&lt;h2&gt;
  
  
  Citation IDs are more robust than URLs
&lt;/h2&gt;

&lt;p&gt;URLs change.&lt;/p&gt;

&lt;p&gt;Documents get replaced.&lt;/p&gt;

&lt;p&gt;Reports have multiple editions.&lt;/p&gt;

&lt;p&gt;A provenance record can therefore use a stable internal identifier:&lt;/p&gt;

&lt;p&gt;SRC-00427&lt;/p&gt;

&lt;p&gt;with metadata such as:&lt;/p&gt;

&lt;p&gt;Source name&lt;br&gt;
Publication date&lt;br&gt;
Data period&lt;br&gt;
Document version&lt;br&gt;
Page&lt;br&gt;
Location&lt;br&gt;
Claim&lt;br&gt;
Extraction date&lt;/p&gt;

&lt;p&gt;The workbook then carries:&lt;/p&gt;

&lt;p&gt;B12 → SRC-00427&lt;/p&gt;

&lt;p&gt;rather than attempting to encode an entire research record into the cell itself.&lt;/p&gt;

&lt;p&gt;This also makes automated validation possible.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;p&gt;def validate_citation(cell, provenance):&lt;br&gt;
    citation_id = cell.metadata["citation_id"]&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;if citation_id not in provenance:
    raise ValueError(
        f"Missing provenance for {cell.coordinate}"
    )
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;The principle is simple:&lt;/p&gt;

&lt;p&gt;A material AI-generated input should not silently become an unexplained spreadsheet value.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cell citations also help with AI failure modes
&lt;/h2&gt;

&lt;p&gt;AI systems have several failure modes that are particularly awkward in spreadsheets.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Correct source, wrong interpretation&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The model finds the right report but interprets an annual figure as a monthly figure.&lt;/p&gt;

&lt;p&gt;A citation lets the reviewer return to the source.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Correct number, wrong scope&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The number is real, but it applies to office rather than residential development.&lt;/p&gt;

&lt;p&gt;Again, the citation provides the path back to the evidence.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Stale evidence&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;A source may be valid but old.&lt;/p&gt;

&lt;p&gt;The citation exposes its publication date and data period.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Unsupported inference&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The AI may produce a plausible assumption without a source.&lt;/p&gt;

&lt;p&gt;That should result in:&lt;/p&gt;

&lt;p&gt;citation = missing&lt;/p&gt;

&lt;p&gt;rather than a fabricated citation.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Source substitution&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;A workflow may use one source during research and a different source when generating the final workbook.&lt;/p&gt;

&lt;p&gt;A stable citation ID makes that substitution easier to detect.&lt;/p&gt;

&lt;h2&gt;
  
  
  Provenance should be machine-readable too
&lt;/h2&gt;

&lt;p&gt;Human-readable comments are useful, but they should not be the only representation.&lt;/p&gt;

&lt;p&gt;A production design could maintain a provenance table:&lt;/p&gt;

&lt;p&gt;Citation ID Cell    Source  Page    Date    Scope&lt;br&gt;
SRC-00427   B12 Cost report 18  2026-06 Dubai residential&lt;br&gt;
SRC-00428   B13 Planning document   42  2026-05 Project&lt;br&gt;
SRC-00429   B14 Market report   11  2026-07 Residential&lt;/p&gt;

&lt;p&gt;Then validation becomes possible before the workbook leaves the system.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;p&gt;required_inputs = [&lt;br&gt;
    "B12",&lt;br&gt;
    "B13",&lt;br&gt;
    "B14",&lt;br&gt;
]&lt;/p&gt;

&lt;p&gt;for address in required_inputs:&lt;br&gt;
    if address not in cited_cells:&lt;br&gt;
        raise ValueError(&lt;br&gt;
            f"Material input has no citation: {address}"&lt;br&gt;
        )&lt;/p&gt;

&lt;p&gt;The exact implementation can vary.&lt;/p&gt;

&lt;p&gt;The architectural principle is more important:&lt;/p&gt;

&lt;p&gt;material input&lt;br&gt;
      ↓&lt;br&gt;
citation required&lt;br&gt;
      ↓&lt;br&gt;
provenance record&lt;br&gt;
      ↓&lt;br&gt;
source verification&lt;/p&gt;

&lt;h2&gt;
  
  
  Don't cite every calculated cell
&lt;/h2&gt;

&lt;p&gt;There is another trap here.&lt;/p&gt;

&lt;p&gt;If every formula cell gets a source citation, the workbook becomes noisy.&lt;/p&gt;

&lt;p&gt;A calculated output does not necessarily need its own external source.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;p&gt;=B12*B13&lt;/p&gt;

&lt;p&gt;does not need a market citation if B12 and B13 already carry appropriate provenance.&lt;/p&gt;

&lt;p&gt;Instead, the dependency chain should be traceable:&lt;/p&gt;

&lt;p&gt;B12 ──┐&lt;br&gt;
      ├──→ B20&lt;br&gt;
B13 ──┘&lt;/p&gt;

&lt;p&gt;with citations attached to the material inputs.&lt;/p&gt;

&lt;p&gt;This gives a much cleaner separation:&lt;/p&gt;

&lt;p&gt;External evidence&lt;br&gt;
        ↓&lt;br&gt;
Material assumptions&lt;br&gt;
        ↓&lt;br&gt;
Deterministic formulas&lt;br&gt;
        ↓&lt;br&gt;
Model outputs&lt;/p&gt;

&lt;p&gt;The output is therefore explainable through its inputs and formulas.&lt;/p&gt;

&lt;h2&gt;
  
  
  A practical schema
&lt;/h2&gt;

&lt;p&gt;For an AI-powered Excel workflow, a minimal citation object might look like this:&lt;/p&gt;

&lt;p&gt;{&lt;br&gt;
  "citation_id": "SRC-00427",&lt;br&gt;
  "cell": "Assumptions!B12",&lt;br&gt;
  "source": {&lt;br&gt;
    "name": "Construction Cost Report",&lt;br&gt;
    "url": "&lt;a href="https://example" rel="noopener noreferrer"&gt;https://example&lt;/a&gt; com/report pdf",&lt;br&gt;
    "published": "2026-06"&lt;br&gt;
  },&lt;br&gt;
  "location": {&lt;br&gt;
    "page": 18&lt;br&gt;
  },&lt;br&gt;
  "claim": {&lt;br&gt;
    "value": 2200,&lt;br&gt;
    "unit": "USD/m²"&lt;br&gt;
  },&lt;br&gt;
  "scope": {&lt;br&gt;
    "geography": "Dubai",&lt;br&gt;
    "asset_class": "residential"&lt;br&gt;
  }&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;In a real system, the URL would need to be an actual verified source rather than the placeholder above.&lt;/p&gt;

&lt;p&gt;The schema can also be extended with:&lt;/p&gt;

&lt;p&gt;data_period&lt;br&gt;
source_type&lt;br&gt;
extraction_method&lt;br&gt;
review_status&lt;br&gt;
assumption_status&lt;br&gt;
supersedes&lt;/p&gt;

&lt;p&gt;But the goal should remain restraint.&lt;/p&gt;

&lt;p&gt;Provenance is useful when it helps someone answer:&lt;/p&gt;

&lt;p&gt;Why is this number here?&lt;/p&gt;

&lt;h2&gt;
  
  
  What the AI should not decide
&lt;/h2&gt;

&lt;p&gt;The system should not automatically turn every extracted fact into an approved modelling assumption.&lt;/p&gt;

&lt;p&gt;A safer boundary is:&lt;/p&gt;

&lt;p&gt;AI extraction&lt;br&gt;
      ↓&lt;br&gt;
candidate evidence&lt;br&gt;
      ↓&lt;br&gt;
candidate assumption&lt;br&gt;
      ↓&lt;br&gt;
human review&lt;br&gt;
      ↓&lt;br&gt;
approved model input&lt;br&gt;
      ↓&lt;br&gt;
calculation&lt;/p&gt;

&lt;p&gt;This preserves a critical distinction between evidence and professional judgment.&lt;/p&gt;

&lt;p&gt;A source can support a number without proving that the number is appropriate for the project being analysed.&lt;/p&gt;

&lt;p&gt;That suitability decision belongs in the modelling workflow.&lt;/p&gt;

&lt;h2&gt;
  
  
  The real benefit is not citation. It is reviewability.
&lt;/h2&gt;

&lt;p&gt;Cell-level citations are sometimes described as a documentation feature.&lt;/p&gt;

&lt;p&gt;That understates their value.&lt;/p&gt;

&lt;p&gt;They can become part of the control layer around AI-generated spreadsheets.&lt;/p&gt;

&lt;p&gt;A reviewer can ask:&lt;/p&gt;

&lt;p&gt;Which cells came from external evidence?&lt;br&gt;
Which cells are assumptions?&lt;br&gt;
Which assumptions have citations?&lt;br&gt;
Are the sources current?&lt;br&gt;
Does the source scope match the model?&lt;br&gt;
Which outputs depend on a disputed assumption?&lt;/p&gt;

&lt;p&gt;That is a much more useful question set than:&lt;/p&gt;

&lt;p&gt;Did the AI get the answer right?&lt;/p&gt;

&lt;p&gt;Because a feasibility model is rarely just an answer.&lt;/p&gt;

&lt;p&gt;It is a chain of evidence, assumptions, formulas and outputs.&lt;/p&gt;

&lt;p&gt;AI can help construct that chain.&lt;/p&gt;

&lt;p&gt;It should not make the chain invisible.&lt;/p&gt;

&lt;h2&gt;
  
  
  A practical implementation pattern
&lt;/h2&gt;

&lt;p&gt;If I were designing this workflow, I would keep five layers separate:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Source layer&lt;br&gt;
Documents, reports, URLs&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Evidence layer&lt;br&gt;
Extracted claims + source locations&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Assumption layer&lt;br&gt;
Values selected for modelling&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Workbook layer&lt;br&gt;
Cells + formulas + citation IDs&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Review layer&lt;br&gt;
Human validation and overrides&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Then the system can enforce simple rules:&lt;/p&gt;

&lt;p&gt;No source&lt;br&gt;
    → no evidence&lt;/p&gt;

&lt;p&gt;No evidence&lt;br&gt;
    → assumption requires review&lt;/p&gt;

&lt;p&gt;Material assumption without citation&lt;br&gt;
    → validation failure&lt;/p&gt;

&lt;p&gt;Formula output&lt;br&gt;
    → trace inputs, don't invent another citation&lt;/p&gt;

&lt;p&gt;Human override&lt;br&gt;
    → preserve the original evidence&lt;/p&gt;

&lt;p&gt;That last rule matters.&lt;/p&gt;

&lt;p&gt;If a reviewer changes 2,200 to 2,350, the system should not erase the original provenance.&lt;/p&gt;

&lt;p&gt;Instead, it should preserve:&lt;/p&gt;

&lt;p&gt;Original evidence: SRC-00427&lt;br&gt;
Original assumption: 2,200&lt;br&gt;
Reviewed assumption: 2,350&lt;br&gt;
Reviewer: human&lt;br&gt;
Reason: project-specific adjustment&lt;/p&gt;

&lt;p&gt;Now the model contains a history of judgment rather than pretending the revised value came directly from the source.&lt;/p&gt;

&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;The strongest AI-to-Excel workflows will not be the ones that merely write numbers into cells.&lt;/p&gt;

&lt;p&gt;They will make those numbers inspectable.&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;The larger design principle is broader than Excel:&lt;/p&gt;

&lt;p&gt;Keep evidence, assumptions, calculations and decisions separate, but make their relationships explicit.&lt;/p&gt;

&lt;p&gt;That is what turns an AI-generated workbook from a collection of plausible values into something a professional can actually review.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>excel</category>
      <category>realestate</category>
    </item>
  </channel>
</rss>
