3 Statements logo

3 Statements

OrganizationPopular
ginlix-ai
3-statements

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.

Overview

Publisherginlix-ai
RepositoryLangAlpha
Skill name3-statements
Stars
1.8K
Forks
288
Bundled files
4
LicenseApache-2.0
Links
  • Markdown instructions

    A SKILL.md file the model loads on demand, so it only costs tokens when a request actually matches.

  • Works with any LLM

    AI skills are plain Markdown, not provider-specific code, so this works with GPT, Claude, Gemini, Grok, or a local model.

  • 4 bundled files

    Scripts, templates, and references the model can read while it works. Files are read-only and never executed.

  • Open source

    Published by ginlix-ai on GitHub. Read the source before you install it.

Installation

Install the 3 Statements AI skill in TypingMind to use it with any LLM, or drop it into another agent that reads SKILL.md.

1

Install in TypingMind

TypingMind installs a skill straight from its GitHub folder — it reads SKILL.md, bundles the resource files, and stores the result locally.

  1. Open the app and go to Plugins → Skills.
  2. Choose "Install from GitHub".
  3. Paste the skill folder URL below and confirm.
  4. Enable the skill in any chat where you want it available.
Plugins → Skills → Add skill → From GitHub URL, then paste the folder URL and press Continue.
2

Install in another agent

Any agent that reads the Agent Skills format can use this skill — copy the folder into that agent's skills directory.

Claude Code — .claude/skills
git clone --depth 1 https://github.com/ginlix-ai/LangAlpha.git /tmp/LangAlpha
mkdir -p .claude/skills
cp -r /tmp/LangAlpha/plugins/langalpha_research/skills/3-statements .claude/skills/3-statements
Restart Claude Code after copying so it picks up the new skill.

Use it in TypingMind

Enable 3 Statements in any TypingMind chat and the model takes it from there. Its name and description sit in the system prompt, and the moment a request matches, the model loads the full instructions itself — you never invoke it by hand, and it costs no tokens until it is actually used.

The model loads 3 Statements on its own as soon as a request matches it.

Works with any AI model

AI skills are plain Markdown instructions rather than provider-specific code, so 3 Statements is not tied to the model it was written for. Install it once in TypingMind and use it with GPT-5, Claude, Gemini, Grok, DeepSeek, Mistral, Llama, or a local model you run yourself — all on your own API keys.

  • Loaded only when it is needed

    The system prompt carries just the name and description. The instructions are fetched on the first matching request, so an idle skill costs nothing.

  • Switch models mid-chat

    Because the skill is instructions rather than code, changing model does not break it — the next model reads the same SKILL.md.

Skill instructions

This is the SKILL.md content the model loads. Read it before installing — a skill is instructions your model will follow.

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.md applies 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 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.

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.

  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

Do not populate the model end to end and present it complete.

Step 1: Architecture, or the template's map

Building fresh, the sheet architecture is fixed by three rules:

  • 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.

Completing somebody else's template, map it first rather than imposing this shape. Templates vary:

Common tab namesHolds
IS, P&L, Income Statementincome statement
BS, Balance Sheetbalance sheet
CF, CFS, Cash Flowcash flow statement
WC, Working Capitalworking capital schedule
DA, D&A, PP&Edepreciation schedule and fixed-asset roll-forward
Debt, Debt Scheduledebt schedule
NOL, Tax, DTAnet operating loss and deferred tax schedule
Assumptions, Inputs, Driversthe control panel
Checks, Audit, Validationthe checks dashboard

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.

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.

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.

Step 2: Stage the historicals, then lay them out

Extracted facts land first as rows, one fact per row, each carrying its own source, period, line-item label, unit and sign:

company | period | canonical line item | value | unit | currency | source | as-of | reported label

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.

Normalise at ingestion, not at use:

  • 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.

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.

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.

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.

Step 3: Set the drivers, each with a basis

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.

DriverBasisAs-ofNote

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.

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:

FY26 revenue | our model | guidance range | consensus (N analysts, vintage) | delta to guidance | delta to consensus | why

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.

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.

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.

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.

Step 4: Build the statements and the schedules

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.

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.

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.

Quality checks per sheet, run as the sheet is built rather than at the end:

  • 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

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.

Done when every check above has been run for every period and each failure has been traced to the cell where it starts.

Step 5: Scenarios

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:

DriverBaseUpside deltaDownside deltaThe world each describes

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.

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.

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).

Done when each case names its world, the toggle moves every dependent output, and the ordering holds in the Checks sheet.

Step 6: The Checks sheet

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.

Group 1: hard checks. Each holds exactly, and a failure means the model is wrong.

CheckColumn B holds
Balance sheet balancesTotal assets minus (total liabilities + total equity), for every period
Cash flow reconciles beginning to ending cashEnding cash minus (beginning cash + CFO + CFI + CFF)
Ending cash ties to the balance sheetCF ending cash minus BS cash
Net income tiesCF opening net income minus IS net income
Retained-earnings roll-forwardPrior RE + net income - dividends minus BS closing RE; SBC reaches equity through net income and APIC, never through this roll
Debt ties to the scheduleBS total debt minus the debt schedule closing balance
Interest ties to the scheduleIS interest expense minus the debt schedule interest on the average balance
D&A ties to PP&EIS and CF D&A minus the PP&E schedule depreciation
Capex ties to the cash flow statementPP&E schedule additions minus CF capex, sign adjusted
Working-capital change tiesCF change in NWC minus the movement in the BS working-capital accounts
Equity financing tiesChange in common stock and APIC on the BS minus equity issuance in CFF
Deferred tax asset tiesNOL schedule DTA minus the BS deferred tax asset
Units and currency consistentCount of sheets whose units row differs from the control panel's; column C tests =0
Cash ties across the monthly and annual viewsMonthly closing cash minus annual closing cash, where the model carries both
Year 0 equity tiesEquity 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 cappedUtilisation 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 lossTax expense in every period where taxable income is at or below zero; column C tests =0
Scenario selector validThe selector cell; column C tests membership, =IF(OR(B14="Base",B14="Upside",B14="Downside"),"OK","FAIL")
Scenario directionalityThe three cases' EBITDA at the last projection year; column C tests the whole ordering, =IF(AND(Downside<Base,Base<Upside),"OK","FAIL")

Group 2: diagnostics. Each carries a band, and a breach is a question about the forecast rather than a defect.

CheckColumn B holdsBand
Capex and depreciation cohereTerminal-year capex divided by terminal-year depreciationinside roughly 0.8x to 1.5x unless the build says otherwise
Implied asset life stableMax minus min of (net PP&E divided by depreciation) across the forecasta drift of more than a couple of years is a schedule defect
Days ratios in rangeThe largest absolute change in DSO, DIO or DPO against the anchoring windowa move of more than a few days needs a stated reason
Margin driftTerminal-year EBITDA margin minus the historical maximumabove it, the forecast is claiming a record and should say why
Leverage in boundsPeak net debt to EBITDA across the forecastagainst the covenant, where one is known
Interest coverageMinimum EBITDA divided by interest expenseagainst the covenant, where one is known

The two roll-up rows, the read-back after recalculation and what an open WARN owes the delivery are in the xlsx contract above.

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.

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.

Done when both groups are present and labelled and the roll-up reads OK from recalculated values.

Step 7: Deliver

  • 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

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.

Optional Analysis Blocks

Build these when the user asks for them or the template has rows waiting for them, and skip them otherwise.

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.

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.

Sign Conventions

StatementItemSign
CFOD&A, SBCpositive (add-back)
CFOincrease in ARnegative (use of cash)
CFOincrease in APpositive (source of cash)
CFIcapexnegative
CFFdebt issuancepositive
CFFdebt repaymentnegative
CFFdividendsnegative

Bundled files

The model reads these on demand while the skill is loaded. They are exposed as readable files and are never executed.

Frequently asked questions

What does the 3 Statements AI skill do?

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.

Why use 3 Statements on TypingMind?

Because you install it once and use it with any model. 3 Statements is plain Markdown rather than provider-specific code, so the same skill runs on GPT-5, Claude, Gemini, Grok, or a local model — and you can switch model mid-chat without it breaking. TypingMind runs on your own API keys, so you pay providers directly instead of a per-seat subscription, and your skills and chats stay in your own storage.

How do I install 3 Statements in TypingMind?

Open Plugins → Skills → Install from GitHub in TypingMind and paste https://github.com/ginlix-ai/LangAlpha/tree/main/plugins/langalpha_research/skills/3-statements. TypingMind reads its SKILL.md and bundles its files and installs it as a skill you can enable per chat.

Which AI models can use 3 Statements?

Any model you connect in TypingMind. AI skills are plain Markdown instructions rather than provider-specific code, so GPT, Claude, Gemini, Grok, and local models can all load this skill when a request matches it.

How many AI models can I use with 3 Statements?

As many as you like. As long as a model supports skills, you can use 3 Statements with it — GPT, Claude, Gemini, Grok, DeepSeek, Mistral, Llama and more — all on TypingMind with your own API keys.

Is the 3 Statements AI skill free?

Yes. It is published on GitHub by ginlix-ai under the Apache-2.0 license. You only pay your own AI provider for the tokens you use.

What are AI skills?

An AI skill is a reusable instruction bundle that teaches an AI model how to do one specific task. It follows the open Agent Skills format: a SKILL.md file with a name and description, plus any scripts, templates or reference files the model may need. The model reads the instructions only when your request matches the skill, so an installed skill costs nothing until it is used.

How are AI skills different from plugins or MCP servers?

A plugin or MCP server gives a model new tools to call — code that runs somewhere and returns a result. An AI skill gives the model knowledge and process instead: how to approach a task, which steps to follow, what good output looks like. Skills are plain Markdown, so they need no server, no API key and no runtime, and they work with any model.

View all

Set up your own AI workspace now

Get notified about new features and future giveaways by subscribing to our newsletter 👇