Stock Balance Sheet Review
Purpose
Read the balance sheet for survivability. Most retail investors ignore the balance sheet until a recession exposes the leverage they didn't price in. Surface leverage and liquidity risks, goodwill bombs from past M&A, working-capital deterioration that signals customer-credit pressure, and off-balance-sheet hooks that compound in stress. Output a structured Findings set with quantitative thresholds.
When To Use
- Orchestrator dispatches balance-sheet review (always-on in Standard / Strict depth).
- User asks "is financially safe", "what's the debt situation", "can survive a recession".
When NOT To Use
- Earnings quality / cash flow →
stock-earnings-quality-review - Business model →
stock-business-review - Capital allocation history →
stock-management-review - Competitive position →
stock-industry-review
Mandatory Gates
1) Execution Integrity Gate
Read the balance sheet from the most recent 10-Q (more recent than 10-K). If only 10-K is available, note the date staleness in Execution Status.
2) Industry-Norm Gate
Leverage tolerable for a utility is catastrophic for SaaS. Identify sector before applying thresholds. Default thresholds below are general; flag if your sector materially shifts them.
3) Off-Balance-Sheet Gate
Read the "Commitments and Contingencies" footnote in every review. Operating leases were brought on-balance-sheet by ASC 842 (2019), but contingent liabilities, guarantees, and purchase obligations are still footnote-only.
4) Goodwill-History Gate
A single goodwill impairment is a yellow flag; multiple is a red flag indicating chronic overpayment in M&A. Check 5-year impairment history, not just current year.
5) First-Hand Data Gate (mandatory)
Cite debt, cash, lease, pension, goodwill, AR and contract-liability figures from the manifest's first-hand financials.json (SEC EDGAR XBRL, via scripts/finlib/edgar.py) or directly from the filing — never from a search snippet. Any leverage ratio you state (Net Debt/EBITDA etc.) must use the named-input formulas in scripts/finlib/ratios.py so it survives the orchestrator's 口径 lint gate; in particular EV-based metrics require total_debt and cash_and_sti (a net-cash company has EV below market cap). Tag any second-hand figure as such and lower confidence accordingly.
Workflow
- Load 10-Q balance sheet and 10-K notes (Commitments, Goodwill, Pension).
- Run filing-pattern-gated scan.
- Compute ratios: Net Debt / EBITDA (using TTM EBITDA from financial-history), Current Ratio, Goodwill / Total Assets, DSO, Inventory Days.
- Compare to industry norms and to the company's 5-year history.
- Emit Findings.
Filing-Pattern-Gated Execution Protocol
Execution Order
- Locate balance sheet (10-Q latest), Goodwill note, Commitments note, Long-term debt note.
- For each checklist item, locate the specific line/note.
- HIT → compute ratio, compare to threshold, semantic-confirm.
- MISS → mark NOT FOUND.
- Report only Findings that breach thresholds OR show adverse trend.
- Include
Filing pre-scan: X/Y items hit, Z confirmed.
Balance Sheet Checklist (9 Items)
| ID | Item | Filing Section | Threshold |
|---|---|---|---|
| BS-01 | Net Debt / EBITDA | Long-term debt + Current portion − Cash; TTM EBITDA | Flag > 2× general; sector-aware (utility OK at 4×, SaaS bad at 2×) |
| BS-02 | Current Ratio | Current Assets / Current Liabilities | Flag < 1.0 (liquidity strain); < 1.5 in cyclical industries |
| BS-03 | Cash runway (unprofitable cos) | Cash / annual opex (or annual FCF burn) | Flag < 12 months — must refinance or issue equity |
| BS-04 | Goodwill / Total Assets | Balance sheet Goodwill / Total Assets | Flag > 30% — acquisition-driven; vulnerable to impairment |
| BS-05 | Goodwill impairment history | 5-year notes "Goodwill impairment" | Flag > 0 impairments in 5y as yellow; > 1 = red |
| BS-06 | DSO (Days Sales Outstanding) trend | AR / (Annual revenue / 365), 3-year trend | Flag rising > 10 days YoY without explanation in MD&A |
| BS-07 | Inventory days trend (non-tech) | Inventory / (Annual COGS / 365) | Flag rising > 15% YoY (slowing sell-through / obsolete inventory risk) |
| BS-08 | Off-balance-sheet items | "Commitments and Contingencies" note | Flag material guarantees, purchase obligations, or contingent liabilities |
| BS-09 | Pension underfunding | Pension footnote (defined-benefit only) | Flag underfunded amount > 5% of market cap |
Severity Rubric
- High: Survivability-threatening. Net Debt/EBITDA > 4× in cyclical sector; cash runway < 6 months; goodwill > 50% of assets; multiple recent impairments.
- Medium: Adverse but manageable. Leverage rising; DSO trending up; contingent guarantee material but defined.
- Low: Watch-list. Inventory days slightly elevated; pension modestly underfunded.
Evidence Rules
- Compute the ratio yourself; cite the source lines.
- Include the threshold you're comparing against (general or sector-specific).
- Trends: cite at least 3 years of values, not a single snapshot.
Output Format
Findings
[High|Medium|Low] Short Title
- ID:
BS-NN - Citation: balance sheet line / note, with periods
- Evidence: computed ratio + threshold + trend
- Implication: what this means under stress
Suppressed Items
Execution Status
Filings reviewed: 10-Q (Q3 2025), 10-K (FY2024) for footnotes
Filing pre-scan: 9/9 items hit, 2 confirmed as findings
Industry norm applied: <sector>
Summary
One line: N High / M Medium / K Low — most material: <BS-NN short title>.
Machine-Readable Findings Block (mandatory)
End the reply with exactly one fenced block tagged findings-json, carrying
Worker Findings Contract v1 (full schema and error codes:
stock-analysis-lead/references/worker-contract.md). The orchestrator synthesizes
the verdict from this block only — anything stated in the Markdown above but
omitted here does not reach the report. Everything above the fence is for the
human reader.
{
"contract_version": "1",
"worker": "stock-balance-sheet-reviewer",
"prefix": "BS",
"status": "OK",
"depth_mode": "<echo the dispatched depth>",
"archetype_applied": "<echo the dispatched archetype>",
"archetype_challenge": null,
"findings": [
{
"id": "BS-NN",
"severity": "High|Medium|Low",
"title": "<= 80 chars",
"citation": {"source": "10-K", "locator": "<item/page/note>", "fiscal_period": "FY2025"},
"evidence": "direct quote <= 60 words, or a computed figure with its inputs",
"implication": "one sentence on what this means for the thesis",
"confidence": "first-hand|second-hand"
}
],
"positives": [],
"data_gaps": [],
"checklist_coverage": {"items_total": 9, "items_checked": 0, "items_not_found": 0, "ids_not_checked": []},
"mandatory_checks_run": []
}
Contract rules that fail validation if broken:
statusis one ofOK/DEGRADED/SKIPPED/REFUSED; any value other thanOKrequires astatus_reason. The gate returnsSKIPPED (...)in prose and"status": "SKIPPED"here.- Every finding ID must start with
BS— the prefix is the whole segment before the first hyphen. citationis an object, never a bare string;locatorandfiscal_periodmust be non-empty. A finding with no real citation is suppressed, not emitted.source: "aggregator"forcesconfidence: "second-hand"— this is what makes the first-hand data rule checkable rather than aspirational.checklist_coverage:items_checked + items_not_foundmust reachitems_total(9), so "the checklist ran to completion" is verifiable.archetype_challenge:nullwhen the dispatched archetype fits. When the evidence says it does not, file{"proposed", "reason", "evidence"}instead of silently analyzing against thresholds you believe are wrong — this is the only sanctioned way to disagree with the orchestrator's classification.mandatory_checks_run: list the archetype-specific check IDs the dispatch marked REQUIRED. Omitting one that was required fails validation.
Self-check before replying:
python3 <path-to>/stock-analysis-lead/scripts/finlib/worker_contract.py \
validate --reply <this-reply>.md --expect-worker stock-balance-sheet-reviewer
No-Finding Case
No balance-sheet findings — leverage moderate, liquidity ample, no goodwill concentration.
Notable positives: Net Debt / EBITDA = 0.4×; Cash > Total Debt.
Load References Selectively
references/balance-sheet-red-flags.md— load when assessing goodwill concentration, off-balance-sheet items, or pension liabilities; contains the sector-norm leverage table, historical examples of goodwill bombs, and the Commitments-and-Contingencies decoding guide.
Review Discipline
Balance sheet failures are slow until they're sudden. A leveraged company looks fine in a bull market and dies in a recession. Be unforgiving on High thresholds; the orchestrator will weight these heavily in the Bear scenario.