3-statements
Three-Statement Model
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.
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.
- 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.mdapplies here unchanged.
Critical Principles
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.
Build with openpyxl, recalc, audit. Build as a saved Python script (for example <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.