Roll Forwards That Generate Themselves
A controller at a major restaurant chain (8,800 locations, hundreds of active leases) told us something during a demo that changed how we think about the category:
"There's no software that does this, to my knowledge. My team generates this manually every month."
He was talking about roll forwards. The reconciliation artifacts every controller needs for period close, every auditor asks for during quarterly reviews. His team's process: two people, two hours, every month.
What a roll forward is
A roll forward explains how a balance moved from beginning to end of period. Beginning balance, plus new leases, plus/minus modifications, plus interest, minus payments, minus terminations, equals ending balance. The math must reconcile to the penny.
Auditors, particularly Big 4, expect three of these every quarter: liability, ROU asset, and gain/loss. They must tie to the GL, and Q3's ending balance must match Q4's beginning. This is not a nice-to-have. It is the core deliverable of lease accounting close.
The manual process vs. the agent
Every platform in the market stores the data needed for a roll forward. Amortization schedules contain beginning balances, interest, payments, ending balances. Journal entries are tagged by type. Modifications carry before/after state. The data exists. No platform assembles it.
Instead of building a fixed report template, we built an AI agent with access to 39 domain tools. The agent understands what a roll forward is, has direct access to every data table, and assembles the output dynamically. The entryType enum on journal entries is the key: INITIAL_RECOGNITION entries are new leases, MODIFICATION entries are remeasurements, TERMINATION entries capture removals.
The execution trace
The agent creates a plan and executes it step by step, streaming progress in real-time. Every tool call is visible, not a progress bar over a black box.
The compute sandbox runs all financial math in an isolated V8 context with precision round() that avoids JavaScript's half-up rounding bug. No floats in the hot path. Decimal(18,2) in PostgreSQL, decimal.js in service code, precision round() in the sandbox. An end-to-end chain of financial-grade arithmetic:
function assertBalanced(lines: readonly any[], context: string): void {
const totalDebits = lines.reduce(
(sum: Decimal, l) => sum.add(new Decimal(String(l.debit ?? 0))),
new Decimal(0)
);
const totalCredits = lines.reduce(
(sum: Decimal, l) => sum.add(new Decimal(String(l.credit ?? 0))),
new Decimal(0)
);
const diff = totalDebits.minus(totalCredits).abs();
if (diff.gt(new Decimal("0.02"))) {
throw new ValidationError(
`JE unbalanced (${context}): debits $${totalDebits.toFixed(2)} ` +
`≠ credits $${totalCredits.toFixed(2)}`
);
}
}The output
The agent generates a professional 4-tab Excel workbook: liability roll forward, ROU asset roll forward, gain/loss detail, and supporting schedules. Not a PDF. Not a web page. A proper .xlsx with tabs, formatting, frozen panes, and formulas the controller can audit.
Numbers are formatted as currency. Sheet names are sanitized to Excel's 31-character limit. Cell values are intelligently coerced. The workbook is uploaded with a signed URL and delivered as a downloadable artifact in the AI workspace.
The controller who watched this during the demo said: "That workspace is one of the best things I've ever seen in a lease accounting software."
He was watching the agent assemble, in real time, the exact artifact his team builds manually every month.
See Intelligence and Lease Accounting to learn more about these capabilities.
Previous: Modification Accounting: ASC 842's hardest problem