# Stock Balance Sheet Review

> Review a US-listed company's balance sheet health for an equity-research workup. Covers net-debt/EBITDA leverage, current ratio, cash runway, goodwill concentration and impairment history, DSO trend, inventory days, off-balance-sheet items (operating leases, contingent liabilities), and pension underfunding. Trigger when analyzing financial-statement risk at L4 of the seven-layer X-ray framework, or when assessing whether the company can survive a downturn. Dispatched by stock-analysis-lead.

- Skill: `johnqtcg/stock-balance-sheet-review` (Agent Skill, multi-file: 4 files)
- Install (CLI): `npx skillmds@latest add johnqtcg/stock-balance-sheet-review`
- Raw SKILL.md: https://api.skillmd.com/api/skills/johnqtcg/stock-balance-sheet-review/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Research & Search
- Author: johnqtcg (https://skillmd.com/u/johnqtcg)
- Updated: 2026-09-21
- Page: https://skillmd.com/skills/johnqtcg/stock-balance-sheet-review

---


# 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 <ticker> financially safe", "what's the debt situation", "can <ticker> 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

1. Load 10-Q balance sheet and 10-K notes (Commitments, Goodwill, Pension).
2. Run filing-pattern-gated scan.
3. Compute ratios: Net Debt / EBITDA (using TTM EBITDA from financial-history), Current Ratio, Goodwill / Total Assets, DSO, Inventory Days.
4. Compare to industry norms and to the company's 5-year history.
5. Emit Findings.

## Filing-Pattern-Gated Execution Protocol

### Execution Order

1. Locate balance sheet (10-Q latest), Goodwill note, Commitments note, Long-term debt note.
2. For each checklist item, locate the specific line/note.
3. **HIT** → compute ratio, compare to threshold, semantic-confirm.
4. **MISS** → mark NOT FOUND.
5. Report only Findings that breach thresholds OR show adverse trend.
6. 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.

```findings-json
{
  "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:

- `status` is one of `OK` / `DEGRADED` / `SKIPPED` / `REFUSED`; any value other
  than `OK` **requires** a `status_reason`. The gate returns `SKIPPED (...)` in
  prose *and* `"status": "SKIPPED"` here.
- Every finding ID must start with `BS` — the prefix is the whole segment
  before the first hyphen.
- `citation` is an **object**, never a bare string; `locator` and `fiscal_period`
  must be non-empty. A finding with no real citation is suppressed, not emitted.
- `source: "aggregator"` forces `confidence: "second-hand"` — this is what makes
  the first-hand data rule checkable rather than aspirational.
- `checklist_coverage`: `items_checked + items_not_found` must reach
  `items_total` (9), so "the checklist ran to completion" is verifiable.
- `archetype_challenge`: `null` when 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:

```bash
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.
