3-statements · diff

git:20260826.8da358a to git:20260915.99ad826

149 added, 295 removed. Audit A to A.

---
name: 3-statements
- description: "Integrated 3-statement financial model: linked income statement, balance sheet, and cash flow"
- license: "Derived from anthropics/financial-services-plugins (Apache-2.0). Modified for langalpha."
+ description: "Build or repair an integrated three-statement model: linked IS, BS and CF, supporting schedules, scenarios and a Checks sheet. Triggers on three-statement model, build me a model, link the statements, populate this template, make my balance sheet balance."
---
- # 3-Statement Financial Model Template Completion
-
- Complete and populate integrated financial model templates with proper linkages between Income Statement, Balance Sheet, and Cash Flow Statement.
-
- ## Model Structure
-
- ### Identifying Template Tab Organization
-
- Templates vary in their tab naming conventions and organization. Before populating, review all tabs to understand the template's structure. Below are common tab names and their typical contents:
-
- | Common Tab Names | Contents to Look For |
- |------------------|----------------------|
- | IS, P&L, Income Statement | Income Statement |
- | BS, Balance Sheet | Balance Sheet |
- | CF, CFS, Cash Flow | Cash Flow Statement |
- | WC, Working Capital | Working Capital Schedule |
- | DA, D&A, Depreciation, PP&E | Depreciation & Amortization Schedule |
- | Debt, Debt Schedule | Debt Schedule |
- | NOL, Tax, DTA | Net Operating Loss Schedule |
- | Assumptions, Inputs, Drivers | Driver assumptions and inputs |
- | Checks, Audit, Validation | Error-checking dashboard |
-
- **Template Review Checklist**
- - Identify which tabs exist in the template (not all templates include every schedule)
- - Note any template-specific tabs not listed above
- - Understand tab dependencies (e.g., which schedules feed into the main statements)
- - Locate input cells vs. formula cells on each tab
-
- ### Understanding Template Structure
-
- Before populating a template, familiarize yourself with its existing layout to ensure data is entered in the correct locations and formulas remain intact.
-
- **Identifying Row Structure**
- - Locate the model title at top of each tab
- - Identify section headers and their visual separation
- - Find the units row indicating $ millions, %, x, etc.
- - Note column headers distinguishing Actuals vs. Estimates periods
- - Confirm period labels (e.g., FY2024A, FY2025E)
- - Identify input cells vs. formula cells (typically distinguished by font color)
-
- **Identifying Column Structure**
- - Confirm line item labels in leftmost column
- - Verify historical years precede projection years
- - Note the visual border separating historical from projected periods
- - Check for consistent column order across all tabs
-
- **Working with Named Ranges**
- Templates often use named ranges for key inputs and outputs. Before entering data:
- - Review existing named ranges in the template (Formulas → Name Manager in Excel)
- - Common named ranges include: Revenue growth rates, cost percentages, key outputs (Net Income, EBITDA, Total Debt, Cash), scenario selector cell
- - Ensure inputs are entered in cells that feed into these named ranges
-
- ### Projection Period
- - Templates typically project 5 years forward from last historical year
- - Verify historical (A) vs. projected (E) columns are clearly separated
- - Confirm columns use fiscal year notation (e.g., FY2024A, FY2025E)
-
- ## Margin Analysis
-
- **Note: The following margin analysis should only be performed if prompted by the user or if the template explicitly requires it. If no prompt is given, skip this section.**
-
- Calculate and display profitability margins on the Income Statement (IS) tab to track operational efficiency and enable peer comparison.
-
- ### Core Margins to Include
-
- | Margin | Formula | What It Measures |
- |--------|---------|------------------|
- | Gross Margin | Gross Profit / Revenue | Pricing power, production efficiency |
- | EBITDA Margin | EBITDA / Revenue | Core operating profitability |
- | EBIT Margin | EBIT / Revenue | Operating profitability after D&A |
- | Net Income Margin | Net Income / Revenue | Bottom-line profitability |
-
- ### Income Statement Layout with Margins
-
- Display margin percentages directly below each profit line item:
- - Gross Margin % below Gross Profit
- - EBIT Margin % below EBIT
- - EBITDA Margin % below EBITDA
- - Net Income Margin % below Net Income
+ # Three-Statement Model
- ## Credit Metrics
+ An integrated model is two artifacts sharing one workbook: a faithful transcription of what the company reported, and a forecast that is a set of arguments. The seam between them is the most important line in the file, and most of the rules below exist to keep it visible.
- **Note: The following Credit analysis should only be performed if prompted by the user or if the template explicitly requires it. If no prompt is given, skip this section.**
+ Evidence labels, source tiers, staleness, the readiness posture and the intake limits: `.agents/skills/research-conventions/SKILL.md`, read before the first figure enters the workbook.
- Calculate and display credit/leverage metrics on the Balance Sheet (BS) tab to assess financial health, debt capacity, and covenant compliance.
+ - Fiscal period labels, per-company LTM windows, and rate against level changes: `.agents/skills/research-conventions/references/market-data-rules.md`.
+ - A filing label does not match a model row, or a subtotal will not tie to its components: `.agents/skills/3-statements/references/line-items.md`.
+ - The template needs data pulled out of a 10-K or 10-Q: `.agents/skills/3-statements/references/sec-filings.md`.
+ - Writing a linkage, a roll-forward or a schedule formula: `.agents/skills/3-statements/references/formulas.md`.
+ - Formatting a sheet the user will read: `.agents/skills/3-statements/references/formatting.md`.
+ - Designing a scenario set or a sensitivity grid: the weak-design catalogue under *Step 10: Scenarios and Sensitivities* in `.agents/skills/dcf-model/SKILL.md` applies here unchanged.
- ### Core Credit Metrics to Include
+ ## Critical Principles
- | Metric | Formula | What It Measures |
- |--------|---------|------------------|
- | Total Debt / EBITDA | Total Debt / LTM EBITDA | Leverage multiple |
- | Net Debt / EBITDA | (Total Debt - Cash) / LTM EBITDA | Leverage net of cash |
- | Interest Coverage | EBITDA / Interest Expense | Ability to service debt |
- | Debt / Total Cap | Total Debt / (Total Debt + Equity) | Capital structure |
- | Debt / Equity | Total Debt / Total Equity | Financial leverage |
- | Current Ratio | Current Assets / Current Liabilities | Short-term liquidity |
- | Quick Ratio | (Current Assets - Inventory) / Current Liabilities | Immediate liquidity |
+ **Formulas, not hardcoded values.** Every projection cell, roll-forward, linkage and subtotal is a live Excel formula, never a value computed in Python and written in. With openpyxl, `ws["D15"] = "=D14*(1+Assumptions!$B$5)"` is correct and `ws["D15"] = 12500.0` is not. The only cells holding typed numbers are historical actuals and the driver assumptions on the control panel. A hardcode does not just freeze one number: it breaks every downstream integrity check silently, because the check still evaluates and still reads OK.
- ### Credit Metric Hierarchy Checks
+ **Build with openpyxl, recalc, audit.** Build as a saved Python script (for example `work/<task>/build_model.py`), following `.agents/skills/xlsx/SKILL.md`: blue font for inputs, black for formulas, green for cross-sheet links, a provenance comment on every input, an explicit number format on every computed cell. Then `python .agents/skills/xlsx/scripts/recalc.py <file> 30` until the status is "success", and `python .agents/skills/xlsx/scripts/audit.py <file> --strict` with every `fail` fixed. A saved script is what lets you edit one section and rerun cheaply.
- Validate that Upside shows strongest credit profile:
- - Leverage: Upside < Base < Downside (lower is better)
- - Coverage: Upside > Base > Downside (higher is better)
- - Liquidity: Upside > Base > Downside (higher is better)
+ **Present each stage as you finish it.** A PTC turn is not chat-interactive at every step, so this is not a blocking question: present the block, say what you are building next, and carry on unless the user objects. A mis-mapped tab or a wrong historical surfaces while it is still cheap to fix.
- ### Covenant Compliance Tracking
+ 1. **The architecture or the template map** - which sheets exist, what each holds, where the inputs live
+ 2. **Historicals** - the transcribed block, with periods and sources
+ 3. **Drivers** - the control panel, each driver with its basis
+ 4. **Income statement projections** - with the subtotals checked
+ 5. **Balance sheet** - the balance check for every period
+ 6. **Cash flow statement** - the cash tie-out for every period
+ 7. **Checks sheet** - the whole sheet, with the roll-up cell reading OK
+ 8. **Cover** - the workbook's first sheet, written last: tiles linking to the terminal-year revenue, EBITDA, net income, free cash flow and leverage, plus the scenario selector and the `Checks` roll-up
- If debt covenants are known, add explicit compliance checks comparing actual metrics to covenant thresholds.
+ Do not populate the model end to end and present it complete.
- ## Scenario Analysis (Base / Upside / Downside)
+ ## Step 1: Architecture, or the template's map
- Use a scenario toggle (dropdown) in the Assumptions tab with CHOOSE or INDEX/MATCH formulas.
+ Building fresh, the sheet architecture is fixed by three rules:
- | Scenario | Description |
- |----------|-------------|
- | Base Case | Management guidance or consensus estimates |
- | Upside Case | Above-guidance growth, margin expansion |
- | Downside Case | Below-trend growth, margin compression |
+ - **Historicals sit on their own sheet.** Reported history is a transcription with its own source notes, and no forecast formula ever writes into it. The boundary period is visibly marked, in the column header and with a border, so a reader can see at a glance where the company stops and we start. This is the seam, and a model that blurs it cannot be reviewed.
+ - **One control panel.** Every scenario switch, toggle and global assumption lives on one sheet. Nothing is switched from inside a calculation sheet, because a toggle buried in the middle of the cash flow statement is a toggle nobody finds when the model gives a strange answer.
+ - **Calculation sheets hold formulas only.** IS, BS, CF and the supporting schedules read from the historicals sheet and the control panel and hold no typed numbers of their own.
- **Key Drivers to Sensitize**: Revenue growth, Gross margin, SG&A %, DSO/DIO/DPO, CapEx %, Interest rate, Tax rate.
+ Completing somebody else's template, map it first rather than imposing this shape. Templates vary:
- **Scenario Audit Checks**: Toggle switches all statements, BS balances in all scenarios, Cash ties out, Hierarchy holds (Upside > Base > Downside for NI, EBITDA, FCF, margins).
+ | Common tab names | Holds |
+ |---|---|
+ | IS, P&L, Income Statement | income statement |
+ | BS, Balance Sheet | balance sheet |
+ | CF, CFS, Cash Flow | cash flow statement |
+ | WC, Working Capital | working capital schedule |
+ | DA, D&A, PP&E | depreciation schedule and fixed-asset roll-forward |
+ | Debt, Debt Schedule | debt schedule |
+ | NOL, Tax, DTA | net operating loss and deferred tax schedule |
+ | Assumptions, Inputs, Drivers | the control panel |
+ | Checks, Audit, Validation | the checks dashboard |
- ## SEC Filings Data Extraction
+ Map, in this order: which tabs exist and which of the above are missing; which tabs feed which; where the input cells are, by font colour and by reading the formulas; the row structure (title, units row, section headers, actual against estimate columns, period labels); the column order and whether it is consistent across tabs; and any defined names, which are usually the drivers and the key outputs and are the fastest way to find both.
- If the template specifically requires pulling data from SEC filings (10-K, 10-Q), see [references/sec-filings.md](references/sec-filings.md) for detailed extraction guidance. This reference is only needed when populating templates with public company data from regulatory filings.
+ Then edit the way `.agents/skills/xlsx/SKILL.md` says to edit somebody's workbook: load it twice, once for formulas and once with `data_only=True`, write only into input cells, match the existing units and sign conventions, preserve their formatting, and read their cell comments first because they are often instructions. Where a structural change is genuinely needed, a new line item or period, use `python .agents/skills/xlsx/scripts/insert.py` rather than openpyxl's own insert, which leaves every formula pointing at the cells that used to be there.
- ## Completing Model Templates
+ **Done when** every sheet the model needs is either present or planned, the input cells are identified rather than assumed, and the historical-to-forecast boundary is marked.
- This section provides general guidance for completing any 3-statement financial model template while preserving existing formulas and ensuring data integrity.
+ ## Step 2: Stage the historicals, then lay them out
- ### Step 1: Analyze the Template Structure
+ Extracted facts land first as rows, one fact per row, each carrying its own source, period, line-item label, unit and sign:
- Before entering any data, thoroughly review the template to understand its architecture:
+ ```
+ company | period | canonical line item | value | unit | currency | source | as-of | reported label
+ ```
- **Identify Input vs. Formula Cells**
- - Look for visual cues (font color, cell shading) that distinguish input cells from formula cells
- - Common conventions: Blue font = inputs, Black font = formulas, Green font = links to other sheets
- - Use Excel's Trace Precedents/Dependents (Formulas → Trace Precedents) to understand cell relationships
- - Check for named ranges that may control key inputs (Formulas → Name Manager)
+ Only then pivot into the wide statement layout. Doing it in this order is what keeps provenance attached to the figure through the reshape: a number that arrives straight into a wide grid loses which filing it came from the moment it lands, and the provenance comment then gets written from memory. Keep the staged rows in the build script, or on a `Source Data` sheet, so the pivot can be rerun.
- **Map the Template's Flow**
- - Identify which tabs feed into others (e.g., Assumptions → IS → BS → CF)
- - Note any supporting schedules and their linkages to main statements
- - Document the template's specific line items and structure before populating
+ **Normalise at ingestion, not at use:**
- ### Step 2: Filling in Data Without Breaking Formulas
+ - **Sign**: one convention for the whole model, applied as the fact is staged. Whether expenses are positive or negative matters less than that every row agrees.
+ - **Scale**: one scale for the model, recorded per source, because a single filing prints thousands in one table and millions in another.
+ - **Currency**: one reporting currency, with balance-sheet items at spot and flow items at the period average where translation is needed, and the convention stated on the sheet.
- **Golden Rules for Data Entry**
+ Map every reported label to a canonical line item as it is staged, per `.agents/skills/3-statements/references/line-items.md`, and keep the reported label in its own column so a reviewer can see what was renamed.
- | Rule | Description |
- |------|-------------|
- | Only edit input cells | Never overwrite cells containing formulas unless intentionally replacing the formula |
- | Preserve cell references | When copying data, use Paste Values (Ctrl+Shift+V) to avoid overwriting formulas with source formatting |
- | Match the template's units | Verify if template uses thousands, millions, or actual values before entering data |
- | Respect sign conventions | Follow the template's existing sign convention (e.g., expenses as positive or negative) |
- | Check for circular references | If the template uses iterative calculations, ensure Enable Iterative Calculation is turned on |
+ **When the history is not there.** A driver that cannot be anchored because the reported history does not exist, a segment the company stopped disclosing, a metric it never disclosed, a company with three quarters of public life, is stated as such. Produce the model with that driver labelled `assumption` and its basis named, re-read the readiness posture from the table in `.agents/skills/research-conventions/SKILL.md` against that input state, and say in the delivery which driver is unanchored and what would anchor it. A placeholder that looks like a transcribed actual is the one failure this step exists to prevent.
- **Safe Data Entry Process**
- 1. Identify the exact cells designated for input (usually highlighted or labeled)
- 2. Enter historical data first, then verify formulas are calculating correctly for those periods
- 3. Enter assumption drivers that feed forecast calculations
- 4. Review calculated outputs to confirm formulas are working as intended
- 5. If a formula cell must be modified, document the original formula before making changes
+ **Done when** every historical cell traces to a staged row with a source and an as-of, the canonical mapping is recorded, and any unanchored driver is labelled.
- **Handling Pre-Built Formulas**
- - If formulas reference cells you haven't populated yet, expect temporary errors (#REF!, #DIV/0!) until all inputs are complete
- - When formulas produce unexpected results, trace precedents to identify missing or incorrect inputs
- - Never delete rows/columns without checking for formula dependencies across all tabs
+ ## Step 3: Set the drivers, each with a basis
- ### Step 3: Validating Formulas
+ A forecast is a set of arguments, and a driver with no stated basis is not an argument. Every driver on the control panel carries a basis, and the basis text is also what goes in the cell's provenance comment.
- **Formula Integrity Checks**
+ | Driver | Basis | As-of | Note |
+ |---|---|---|---|
- Before relying on template outputs, validate that formulas are functioning correctly:
+ `Basis` is one of a closed set: `management guidance`, `consensus`, `historical trend`, `bottom-up build`, `analyst judgement`. The mix is the tell: a model where every driver reads `historical trend` has no view in it, and one where every driver reads `analyst judgement` has no anchor under it.
- | Check Type | Method |
- |------------|--------|
- | Trace precedents | Select a formula cell → Formulas → Trace Precedents to verify it references correct inputs |
- | Trace dependents | Verify key inputs flow to expected output cells |
- | Evaluate formula | Use Formulas → Evaluate Formula to step through complex calculations |
- | Check for hardcodes | Projection formulas should reference assumptions, not contain hardcoded values |
- | Test with known values | Input simple test values to verify formulas produce expected results |
- | Cross-tab consistency | Ensure the same formula logic applies across all projection periods |
+ **Reconcile against guidance and consensus.** For the near periods, show the model's forecast beside the company's guidance and beside consensus, with the delta and its reason:
- **Common Formula Issues to Watch For**
- - Mixed absolute/relative references causing incorrect results when copied across periods
- - Broken links to external files or deleted ranges (#REF! errors)
- - Division by zero in early periods before revenue ramps (#DIV/0! errors)
- - Circular reference warnings (may be intentional for interest calculations)
- - Inconsistent formulas across projection columns (use Ctrl+\ to find differences)
+ ```
+ FY26 revenue | our model | guidance range | consensus (N analysts, vintage) | delta to guidance | delta to consensus | why
+ ```
- **Validating Cross-Tab Linkages**
- - Confirm values that appear on multiple tabs are linked (not duplicated)
- - Verify schedule totals tie to corresponding line items on main statements
- - Check that period labels align across all tabs
+ A forecast that sits outside guidance without saying so is a view the model is hiding from its own reader. A forecast that matches consensus exactly is a view worth stating deliberately rather than arriving at by default.
- ### Step 4: Quality Checks by Sheet
+ **Working capital is anchored to a stated window.** Days-based assumptions (DSO, DIO, DPO) come from a named historical window, and the choice of window is justified: the last four quarters for a stable business, a full cycle for a seasonal one, the post-transition periods for a company that changed its terms. Setting them to the last reported period by default carries whatever was unusual about that quarter through the entire forecast.
- Perform these validation checks on each sheet after populating the template:
+ **Capex and depreciation cohere.** The capex path and the depreciation schedule are one decision, not two. A growth capex ramp with flat depreciation is a defect, not a rounding issue: new assets depreciate. Model depreciation off the asset base the capex path builds, split maintenance from growth capex, and check that the implied asset life stays stable across the forecast. In the terminal year, capex and depreciation should be converging unless something specific says otherwise.
- **Income Statement (IS) Quality Checks**
- - Revenue figures match source data for historical periods
- - All expense line items sum to reported totals
- - Subtotals (Gross Profit, EBIT, EBT, Net Income) calculate correctly
- - Tax calculation logic is appropriate (handles losses correctly)
- - Forecast drivers reference assumptions tab (no hardcodes)
- - Period-over-period changes are directionally reasonable
+ **Done when** every driver has a basis and an as-of, the guidance and consensus reconciliation exists for the near periods, and the working-capital window is named.
- **Balance Sheet (BS) Quality Checks**
- - Assets = Liabilities + Equity for every period (primary check)
- - Cash balance matches Cash Flow Statement ending cash
- - Working capital accounts tie to supporting schedules (if applicable)
- - Retained Earnings rolls forward correctly: Prior RE + Net Income - Dividends +/- Adjustments = Ending RE
- - Debt balances tie to debt schedule (if applicable)
- - All balance sheet items have appropriate signs (assets positive, most liabilities positive)
+ ## Step 4: Build the statements and the schedules
- **Cash Flow Statement (CF) Quality Checks**
- - Net Income at top of CFO matches Income Statement Net Income
- - Non-cash add-backs (D&A, SBC, etc.) tie to their source schedules/statements
- - Working capital changes have correct signs (increase in asset = use of cash = negative)
- - CapEx ties to PP&E schedule or fixed asset roll-forward
- - Financing activities tie to changes in debt and equity accounts on BS
- - Ending Cash matches Balance Sheet Cash
- - Beginning Cash equals prior period Ending Cash
+ Project the income statement from the drivers, then the balance sheet, then the cash flow statement, then close the loops. `.agents/skills/3-statements/references/formulas.md` carries the linkage and roll-forward formulas.
- **Supporting Schedule Quality Checks**
- - Opening balances equal prior period closing balances
- - Roll-forward logic is complete (Beginning + Additions - Deductions = Ending)
- - Schedule totals tie to main statement line items
- - Assumptions used in calculations match Assumptions tab
+ **The debt schedule is complete or it is not a schedule.** Model the maturity ladder tranche by tranche, mandatory amortisation, the revolver with its draw and repay mechanics, and the cash sweep if there is one. Interest expense is computed on the average balance across the period, and it reconciles to that balance. A single "total debt" line with an interest rate applied to it cannot answer the question the schedule exists for, which is whether the company can meet its maturities.
- ### Step 5: Cross-Statement Integrity Checks
+ **Circularity.** Interest expense feeds net income, which feeds cash, which feeds the debt balance, which feeds interest expense. Enable iterative calculation (100 iterations, maximum change 0.001) and put a circuit breaker toggle on the control panel so the loop can be cut when it fails to converge. An unintentional circularity is a different thing: trace it and break it rather than switching iteration on to hide it.
- After validating individual sheets, confirm the three statements are properly integrated:
+ **Quality checks per sheet**, run as the sheet is built rather than at the end:
- | Check | Formula | Expected Result |
- |-------|---------|-----------------|
- | Balance Sheet Balance | Assets - Liabilities - Equity | = 0 |
- | Cash Tie-Out | CF Ending Cash - BS Cash | = 0 |
- | Net Income Link | IS Net Income - CF Starting Net Income | = 0 |
- | Retained Earnings | Prior RE + NI - Dividends - BS Ending RE | = 0 (adjust for SBC/other items as needed) |
+ - **Income statement**: historicals match the source; expense lines sum to the reported totals; every subtotal computes; the tax logic handles losses; forecast rows reference the control panel with no hardcodes; period-over-period changes are directionally sensible
+ - **Balance sheet**: assets equal liabilities plus equity in every period; cash matches the cash flow statement's ending cash; working-capital accounts tie to their schedule; retained earnings rolls forward; debt ties to the debt schedule; signs are right
+ - **Cash flow**: net income at the top of CFO matches the income statement; non-cash add-backs tie to their source schedules; working-capital changes carry the right sign (an increase in an asset is a use of cash); capex ties to the PP&E roll-forward; financing ties to the debt and equity movements on the balance sheet; ending cash matches the balance sheet and beginning cash matches the prior period
+ - **Supporting schedules**: opening balances equal prior closing balances; every roll-forward is complete (beginning + additions - deductions = ending); schedule totals tie to the statement line they feed; the assumptions used match the control panel
- ### Step 6: Final Review
+ **NOL and deferred tax**, where the model carries one: the opening balance is zero for a new entity; the NOL grows only when pre-tax income is negative; utilisation is capped at 80 percent of pre-tax income before the NOL deduction under the post-2017 federal limitation; the balance never goes negative; the deferred tax asset ties to the balance sheet; and tax expense is zero when taxable income is at or below zero.
- Before considering the model complete:
- - Toggle through all scenarios (if applicable) to verify checks pass in each case
- - Review all #REF!, #DIV/0!, #VALUE!, and #NAME? errors and resolve or document
- - Confirm all input cells have been populated (search for placeholder values)
- - Verify units are consistent across all tabs
- - Save a clean version before making any additional modifications
+ **Done when** every check above has been run for every period and each failure has been traced to the cell where it starts.
- ## Model Validation and Audit
+ ## Step 5: Scenarios
- This section consolidates all validation checks and audit procedures for completed templates.
+ Scenarios are defined by a driver delta table on the control panel, not by three columns of typed numbers. Each case names the world it describes and states which drivers move and by how much against the base:
- ### Core Linkages (Must Always Hold)
+ | Driver | Base | Upside delta | Downside delta | The world each describes |
+ |---|---|---|---|---|
- See [references/formulas.md](references/formulas.md) for all formula details.
+ Switch with `CHOOSE` or `INDEX`/`MATCH` off a single selector cell on the control panel. Drivers worth sensitising: revenue growth, gross margin, SG&A percent, DSO/DIO/DPO, capex percent, interest rate, tax rate.
- | Check | Formula | Expected Result |
- |-------|---------|-----------------|
- | Balance Sheet Balance | Assets - Liabilities - Equity | = 0 |
- | Cash Tie-Out | CF Ending Cash - BS Cash | = 0 |
- | Cash Monthly vs Annual | Closing Cash (Monthly) - Closing Cash (Annual) | = 0 |
- | Net Income Link | IS Net Income - CF Starting Net Income | = 0 |
- | Retained Earnings | Prior RE + NI + SBC - Dividends - BS Ending RE | = 0 |
- | Equity Financing | ΔCommon Stock/APIC (BS) - Equity Issuance (CFF) | = 0 |
- | Year 0 Equity | Equity Raised (Year 0) - Beginning Equity Capital (Year 1) | = 0 |
+ The downside case is mechanical: a stated driver change with the arithmetic shown, never a percentage haircut to the base. Under it, test that the debt path still works, that covenants hold, and that the revolver capacity covers the trough, because a company that cannot fund its downside has a different downside from one that can.
- ### Sign Convention Reference
+ Scenario audit: the toggle switches every statement, the balance sheet balances in all three cases, cash ties out in all three, and the ordering holds (upside above base above downside for net income, EBITDA, FCF and margins; the reverse for leverage).
- | Statement | Item | Sign Convention |
- |-----------|------|-----------------|
- | CFO | D&A, SBC | Positive (add-back) |
- | CFO | ΔAR (increase) | Negative (use of cash) |
- | CFO | ΔAP (increase) | Positive (source of cash) |
- | CFI | CapEx | Negative |
- | CFF | Debt issuance | Positive |
- | CFF | Debt repayments | Negative |
- | CFF | Dividends | Negative |
+ **Done when** each case names its world, the toggle moves every dependent output, and the ordering holds in the Checks sheet.
- ### Circular Reference Handling
+ ## Step 6: The Checks sheet
- Interest expense creates circularity: Interest → Net Income → Cash → Debt Balance → Interest
+ Every model workbook carries a `Checks` sheet. The four-column layout, the verdict formula, the roll-up and the read-back after recalculation are the sheet contract under *Financial Model Conventions* in `.agents/skills/xlsx/SKILL.md`. What a three-statement model adds is the split below and the rows in it.
- Enable iterative calculation in Excel: File → Options → Formulas → Enable iterative calculation. Set maximum iterations to 100, maximum change to 0.001. Add a circuit breaker toggle in Assumptions tab.
+ **Group 1: hard checks. Each holds exactly, and a failure means the model is wrong.**
- ### Check Categories
+ | Check | Column B holds |
+ |---|---|
+ | Balance sheet balances | Total assets minus (total liabilities + total equity), for every period |
+ | Cash flow reconciles beginning to ending cash | Ending cash minus (beginning cash + CFO + CFI + CFF) |
+ | Ending cash ties to the balance sheet | CF ending cash minus BS cash |
+ | Net income ties | CF opening net income minus IS net income |
+ | Retained-earnings roll-forward | Prior RE + net income - dividends minus BS closing RE; SBC reaches equity through net income and APIC, never through this roll |
+ | Debt ties to the schedule | BS total debt minus the debt schedule closing balance |
+ | Interest ties to the schedule | IS interest expense minus the debt schedule interest on the average balance |
+ | D&A ties to PP&E | IS and CF D&A minus the PP&E schedule depreciation |
+ | Capex ties to the cash flow statement | PP&E schedule additions minus CF capex, sign adjusted |
+ | Working-capital change ties | CF change in NWC minus the movement in the BS working-capital accounts |
+ | Equity financing ties | Change in common stock and APIC on the BS minus equity issuance in CFF |
+ | Deferred tax asset ties | NOL schedule DTA minus the BS deferred tax asset |
+ | Units and currency consistent | Count of sheets whose units row differs from the control panel's; column C tests `=0` |
+ | Cash ties across the monthly and annual views | Monthly closing cash minus annual closing cash, where the model carries both |
+ | Year 0 equity ties | Equity raised in year 0 minus beginning equity capital in year 1 |
+ | Ending cash non-negative | `=MIN(<ending cash row>)`; column C tests `>=0`, since negative cash means the model has no financing plug |
+ | NOL balance non-negative | `=MIN(<NOL balance row>)`; column C tests `>=0` |
+ | NOL utilisation capped | Utilisation divided by pre-tax income before utilisation, which is the base the 80% limit caps against; column C tests `<=0.80` |
+ | Tax expense zero on a loss | Tax expense in every period where taxable income is at or below zero; column C tests `=0` |
+ | Scenario selector valid | The selector cell; column C tests membership, `=IF(OR(B14="Base",B14="Upside",B14="Downside"),"OK","FAIL")` |
+ | Scenario directionality | The three cases' EBITDA at the last projection year; column C tests the whole ordering, `=IF(AND(Downside<Base,Base<Upside),"OK","FAIL")` |
- **Section 1: Currency Consistency**
- - Currency identified and documented in Assumptions
- - All tabs use consistent currency symbol and scale
- - Units row matches model currency
+ **Group 2: diagnostics. Each carries a band, and a breach is a question about the forecast rather than a defect.**
- **Section 2: Balance Sheet Integrity**
- - Assets = Liabilities + Equity (for each period)
- - Formula: Assets - Liabilities - Equity (must = 0)
+ | Check | Column B holds | Band |
+ |---|---|---|
+ | Capex and depreciation cohere | Terminal-year capex divided by terminal-year depreciation | inside roughly 0.8x to 1.5x unless the build says otherwise |
+ | Implied asset life stable | Max minus min of (net PP&E divided by depreciation) across the forecast | a drift of more than a couple of years is a schedule defect |
+ | Days ratios in range | The largest absolute change in DSO, DIO or DPO against the anchoring window | a move of more than a few days needs a stated reason |
+ | Margin drift | Terminal-year EBITDA margin minus the historical maximum | above it, the forecast is claiming a record and should say why |
+ | Leverage in bounds | Peak net debt to EBITDA across the forecast | against the covenant, where one is known |
+ | Interest coverage | Minimum EBITDA divided by interest expense | against the covenant, where one is known |
- **Section 3: Cash Flow Integrity**
- - Cash ties to BS (CF Ending Cash = BS Cash)
- - Cash Monthly vs Annual: Closing Cash (Monthly) = Closing Cash (Annual)
- - NI ties to IS (CF Net Income = IS Net Income)
- - D&A ties to schedule
- - SBC ties to IS
- - ΔAR, ΔInventory, ΔAP tie to WC schedule
- - CapEx ties to DA schedule
+ The two roll-up rows, the read-back after recalculation and what an open `WARN` owes the delivery are in the xlsx contract above.
- **Section 4: Retained Earnings**
- - RE roll-forward check: Prior RE + NI + SBC - Dividends = Ending RE
- - Show component breakdown for debugging
+ Where a template already ships its own checks dashboard, add these rows to it and put the roll-up at the bottom of that sheet rather than creating a second one.
- **Section 5: Working Capital**
- - AR, Inventory, AP tie to BS
- - DSO, DIO, DPO reasonability checks (flag if outside normal ranges)
+ **When the roll-up reads FAIL:** go to the source tab that owns the failing row and fix it in the build script rather than in the check, then rerun the script.
- **Section 6: Debt Schedule**
- - Total Debt ties to BS (Current + LT Debt)
- - Interest calculation ties to IS
+ **Done when** both groups are present and labelled and the roll-up reads OK from recalculated values.
- **Section 6b: Equity Financing**
- - Equity issuance proceeds tie to BS Common Stock/APIC increase
- - Cash increase from equity = Equity account increase (must balance)
- - Equity Raise Tie-Out: ΔCommon Stock/APIC (BS) = Equity Issuance (CFF) (must = 0)
- - Year 0 Equity Tie-Out: Equity Raised (Year 0) = Beginning Equity Capital (Year 1)
+ ## Step 7: Deliver
- **Section 6c: NOL Schedule**
- - Beginning NOL (Year 1 / Formation) = 0 (new business starts with zero NOL)
- - NOL increases only when EBT < 0 (losses must be realized to generate NOL)
- - DTA ties to BS (NOL Schedule DTA = BS Deferred Tax Asset)
- - NOL utilization ≤ 80% of EBT (post-2017 federal limitation)
- - NOL balance is non-negative (cannot utilize more than available)
- - NOL generated only when EBT < 0
- - Tax expense = 0 when taxable income ≤ 0
+ - Toggle through every scenario and confirm no hard check fails in any of them
+ - Resolve every `#REF!`, `#DIV/0!`, `#VALUE!` and `#NAME?`, or document the one that is expected and why
+ - Confirm no input cell still holds a placeholder
+ - Confirm the `Cover` is the first sheet and every tile on it is a formula pointing at the output it reports
+ - State the readiness posture from `.agents/skills/research-conventions/SKILL.md`, forced down by any unanchored driver, any unexplained `WARN`, or any figure past its freshness threshold, and name the driver responsible
+ - Save everything under `$WORK_DIR/work/{task}/`, and keep the build script beside the workbook so the model can be rebuilt
- **Section 7: Scenario Hierarchy**
- - Absolute metrics: Upside > Base > Downside (NI, EBITDA, FCF)
- - Margins: Upside > Base > Downside (GM%, EBITDA%, NI%)
- - Credit metrics: Upside < Base < Downside for leverage (inverted)
+ **Done when** `recalc.py` reports success, `audit.py --strict` reports no `fail`, the roll-up reads OK in every scenario, and the posture is stated with its reason.
- **Section 8: Formula Integrity**
- - COGS, S&M, G&A, R&D, SBC driven by % of Revenue (no hardcodes)
- - Consistent formulas across projection years
- - No #REF!, #DIV/0!, #VALUE! errors
+ ## Optional Analysis Blocks
- **Section 9: Credit Metric Thresholds**
- - Flag metrics as Green/Yellow/Red based on covenant thresholds
- - Summary of any red flags
+ Build these when the user asks for them or the template has rows waiting for them, and skip them otherwise.
- ### Master Check Formula
+ **Margins**, displayed directly below each profit line on the income statement: gross margin below gross profit, EBITDA margin below EBITDA, EBIT margin below EBIT, net margin below net income. Each is the profit line over revenue.
- Aggregate all section statuses into a single master check:
- - If all sections pass → "✓ ALL CHECKS PASS"
- - If any section fails → "✗ ERRORS DETECTED - REVIEW BELOW"
+ **Credit metrics**, on the balance sheet: total debt to EBITDA and net debt to EBITDA for leverage, EBITDA to interest expense for coverage, debt to total capital and debt to equity for structure, current and quick ratios for liquidity. Where covenants are known, add an explicit compliance row against each threshold and flag the result.
- ### Quick Debug Workflow
+ ## Sign Conventions
- When Master Status shows errors:
- 1. Scroll to find red-highlighted sections
- 2. Identify which check category has failures
- 3. Navigate to source tab to investigate
- 4. Fix the underlying issue
- 5. Return to Checks tab to verify resolution
+ | Statement | Item | Sign |
+ |---|---|---|
+ | CFO | D&A, SBC | positive (add-back) |
+ | CFO | increase in AR | negative (use of cash) |
+ | CFO | increase in AP | positive (source of cash) |
+ | CFI | capex | negative |
+ | CFF | debt issuance | positive |
+ | CFF | debt repayment | negative |
+ | CFF | dividends | negative |