# Statement semantics

> What each statement means, how it's structured, and what the components must therefore enforce.

Source: https://lopifi.com/docs/domain/03-statement-semantics
Part of: Lopifi — US GAAP books on autopilot, reviewed by a CPA (https://lopifi.com)

---

# Statement semantics

What each statement means, how it's structured, and what the components must therefore enforce.

---

## 1. The three statements, and how they connect

They are not three reports. They are three views of one set of facts, and they tie to each other. A product that renders them without proving the ties is rendering three unrelated tables.

```
  P&L                          Balance Sheet                Cash Flow
  ─────                        ─────────────                ─────────
  Net income  ──────────────→  Retained earnings
       └──────────────────────────────────────────────────→ (starting point,
                                                             indirect method)
                               Cash  ←───────────────────── Ending cash
```

**The three articulations Lopifi asserts and displays:**

1. **Net income → retained earnings.** `Opening RE + Net income − Dividends = Closing RE`
2. **Cash flow → balance sheet cash.** `Opening cash + Net change in cash = Closing cash`, and closing cash, cash equivalents and restricted cash equal the balance sheet lines that hold them.
3. **The accounting equation.** `Assets = Liabilities + Equity`

Each is rendered as a visible check, not assumed. When one fails, that is the primary state of the screen — a balance sheet that doesn't balance is not a balance sheet with a small problem, it's not a balance sheet.

---

## 2. Profit & loss

### Structure
```
  Revenue                                       ← gross
    less: Returns, allowances, discounts        ← contra-revenue
  Net revenue                                   ← subtotal, single rule
  Cost of revenue / COGS
  ══ Gross profit ══                            ← subtotal + margin %
  Operating expenses
    Sales & marketing
    Research & development
    General & administrative
  ══ Operating income ══                 ← subtotal + margin %
  Other income / (expense)
    Interest income
    Interest expense
    FX gain / (loss)
  ══ Income before tax ══
  Income tax expense
  ══ Net income ══                              ← double rule
```

### Rules the component enforces

- **Margin rows are `Percent`, not `Money`**, and visually distinguished. A percentage in a column of dollars must not look like dollars.
- **Expense lines are `polarity="inverted"`.** An increase in COGS is not good news. This is the default for every account classified as an expense, and it's read from the account type, not chosen by the caller.
- **Contra-revenue is indented under revenue and parenthesized**, netting to a "Net revenue" subtotal. Never shown as a separate expense.
- **Gross profit requires a COGS classification.** If the chart of accounts has no COGS, the component omits the gross profit subtotal rather than showing a gross margin equal to revenue, which is a lie by omission.
- **Expense captions will need a breakdown.** ASU 2024-03 (ASC 220-40) requires public business entities, for annual periods beginning after 15 December 2026, to disaggregate relevant expense captions in a footnote into purchases of inventory, employee compensation, depreciation, intangible amortization and other — so the account-to-line mapping must carry a natural classification as well as a functional one.
- **Segments follow the CODM.** ASU 2023-07 (ASC 280) requires public entities to disclose, by reportable segment, the significant expenses regularly provided to the chief operating decision maker — again a dimension pivot, not a separate ledger.
- **EBITDA is not a P&L line.** It's non-GAAP. If shown, it appears below net income in a clearly separated reconciliation block — see [metrics](10-metrics.md#ebitda).

---

## 3. Balance sheet

### Structure
```
  ASSETS
    Current assets
      Cash and cash equivalents
      Accounts receivable, net              ← net of allowance (contra)
      Inventory
      Prepaid expenses
    ══ Total current assets ══
    Non-current assets
      Property, plant & equipment, net      ← net of accumulated depreciation
      Right-of-use assets
      Intangible assets, net
    ══ Total non-current assets ══
  ══ TOTAL ASSETS ══                        ← double rule

  LIABILITIES
    Current liabilities
      Accounts payable
      Accrued liabilities
      Deferred revenue, current
      Current portion of long-term debt     ← the reclass line, see below
    ══ Total current liabilities ══
    Non-current liabilities
  ══ Total liabilities ══

  EQUITY
    Common stock and APIC
    Retained earnings
    Accumulated other comprehensive income  ← CTA lives here
  ══ Total equity ══
  ══ TOTAL LIABILITIES AND EQUITY ══        ← double rule
```

### Rules

- **It is an "as of" a date, not a period.** `BalanceSheet` takes a `Date`, never a range. A balance sheet labeled "September 2026" is a category error the type system prevents.
- **The balance check is a first-class UI element.** `Assets 4,281,900 = Liabilities 1,840,200 + Equity 2,441,700 ✓`. When it fails, the difference is stated prominently — never a silently unbalanced statement.
- **Current/non-current split is the norm.** IFRS requires it unless a liquidity-order presentation is more reliable (IAS 1, carried into IFRS 18 from 2027); US GAAP permits unclassified balance sheets in some industries. Classification comes from the account, and the boundary — twelve months, or the operating cycle if longer — is measured from the as-of date, not from today.
- **The current-portion reclass is visible.** Long-term debt maturing within twelve months moves to current liabilities. A user seeing a large jump in current liabilities needs to see that it's a reclass, not new borrowing — so the line is named explicitly, not merged into "Other current".
- **Ordering follows the framework.** US GAAP: most liquid first. IFRS: commonly least liquid first. `framework` prop drives it.
- **Retained earnings ties to the P&L.** The component asserts `Opening RE + Net income − Distributions = Closing RE` and surfaces the reconciliation on hover or drill-down.

---

## 4. Cash flow statement

The statement most products skip, and the one lenders and boards actually read.

### Indirect method (the common one)
```
  Net income                                    ← from the P&L
  Adjustments to reconcile to cash:
    Depreciation and amortization               ← non-cash, added back
    Stock-based compensation                    ← non-cash
    Provision for credit losses                 ← non-cash
    (Gain) / loss on disposal                   ← non-cash, sign flipped
  Changes in operating assets and liabilities:
    (Increase) / decrease in AR                 ← note the sign convention
    (Increase) / decrease in inventory
    Increase / (decrease) in AP
    Increase / (decrease) in deferred revenue
  ══ Net cash from operating activities ══
  ══ Net cash from investing activities ══      ← capex, acquisitions, disposals
  ══ Net cash from financing activities ══      ← debt principal, equity, dividends paid
  ══ Net change in cash ══
  Cash at beginning of period
  ══ Cash at end of period ══                   ← MUST equal the BS cash lines
```

### Rules

- **The working-capital sign convention is inverted and it confuses everyone.** An *increase* in AR is a *use* of cash — money you earned but haven't collected — so it appears as a negative. The component labels these lines `(Increase) / decrease in …` exactly as shown, because the parenthetical is what makes the sign readable.
- **Ending cash must equal the balance sheet.** Cash, cash equivalents and restricted cash (ASC 230 after ASU 2016-18) tie to the lines that hold them, with a reconciliation when they sit on more than one line. Asserted and displayed. This is the single most useful integrity check in the whole statement family.
- **Non-cash adjustments must trace to real accounts.** D&A on the cash flow ties to the depreciation and amortization posted in the period.
- **Interest and dividends are classified by the standard, not by intuition.** Under US GAAP, interest paid, interest received and dividends received are operating (ASC 230-10-45-16, -45-17); dividends paid are financing (ASC 230-10-45-15). Only debt *principal* sits in financing. IAS 7 allows a policy choice — narrowed by IFRS 18 from 2027 — so `framework` drives classification, never a per-line toggle.
- **Direct method is supported but requires a reconciliation** to the indirect result, because US GAAP requires that reconciliation for disclosure anyway (IFRS does not).
- **Free cash flow is not a GAAP line.** If shown, it's below the statement in a labeled non-GAAP block with its definition stated — see [metrics](10-metrics.md).

---

## 5. Supporting statements

| Statement | What it shows | Component |
|---|---|---|
| **Trial balance** | Every account, debit and credit columns, proving they're equal | `TrialBalance` |
| **Statement of equity** | Opening equity → net income → issuances → distributions → OCI → closing | `EquityRollForward` |
| **AR aging** | Receivables by bucket, tying to the AR control account | `AgingTable` |
| **AP aging** | Payables by bucket, tying to the AP control account | `AgingTable` |
| **Fixed asset register** | Cost, accumulated depreciation, NBV, by asset | `ScheduleTable` |

**Every supporting statement ties to a control account on the balance sheet, and the tie is displayed.** An AR aging that totals to something other than the AR balance means either the aging or the ledger is wrong, and finding out at audit is expensive.

---

## 6. Comparatives

- **Comparatives must match on five axes**: basis, framework, entity set, presentation currency, and period type. Mixing is blocked at the type level, not warned about at render.
- **Every column states its own resolved period.** No column is ever labeled "Prior" or "Current".
- **A restated comparative is labeled "Restated"** in the column header with a footnote naming the reason. Always. See [periods & close](02-periods-and-close.md#9-restatement).
- **Reclassified prior-period figures are disclosed.** If this year's presentation moved a line, the comparative moved too, and that must be stated — otherwise the variance is an artifact of presentation, not performance.

---

## 7. Variance and flux analysis

The reviewer's actual job at close: explain what moved and why.

```ts
type Variance = {
  current: Money;
  comparative: Money;
  absolute: Money;
  relative: PercentChange;         // discriminated — see numerics
  material: boolean;               // BOTH thresholds exceeded
  explanation?: {
    text: string;
    author: string;
    at: Date;
    driver?: "volume" | "price" | "mix" | "timing" | "one-off" | "error";
  };
};
```

**Rules:**

- **A variance with no comparative base renders `n/a`, never `100%` or `∞`.** Growth from zero is genuinely unknowable.
- **Material variances require an explanation** before the review section of the close can be gated as done. Unexplained material variances are the reviewer's worklist.
- **The driver taxonomy matters.** "Revenue up 12%" is not an explanation; "volume up 18%, price down 5%, mix neutral" is. `FluxAnalysis` prompts for a driver, not just free text.
- **Both absolute and relative are shown.** Either alone misleads: 200% on $12, or $40,000 on $8M.
- **The materiality threshold in force is displayed**, so a reviewer knows what is being hidden from them.

---

## 8. Presentation and rounding

- **Statements are commonly presented in thousands or millions.** When they are, the header says so — "in thousands, except per-share amounts" — and it is not optional. `StatementTable` takes a `scale` prop and renders the disclosure automatically.
- **Rounded statements still foot.** Round once at the display boundary and use largest-remainder allocation so subtotals equal the sum of their rounded parts. See [numerics](../foundations/06-numerics.md#6-rounding).
- **When a rounded column genuinely cannot foot, disclose it.** A `† Amounts may not sum due to rounding` footnote beats a total that's off by one with no explanation.
- **Per-share amounts are never scaled.** In a statement presented in thousands, EPS stays in dollars and cents, which is why the disclosure says "except per-share amounts".

---

## 9. Statement header — required fields

Every statement, on screen, in export, and in print, carries all of these. A statement missing any of them is not usable as evidence.

```
  Northwind Holdings Ltd. and subsidiaries        ← entity / consolidation scope
  Consolidated Statement of Profit or Loss        ← statement name (framework-aware)
  For the three months ended 30 September 2026    ← resolved period, or "As at" for a BS
  Accrual basis · IFRS · Presented in USD         ← basis, framework, currency
  In thousands, except per-share amounts          ← scale, when scaled
  Generated 4 Oct 2026 09:12 UTC · Period: closed ← provenance and period state
```

This block is a component (`StatementHeader`), not per-page markup, precisely so it cannot be forgotten.
