Skip to content
Back to skills

Stock Balance Sheet Review

ASecurity

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.

  • 30 stars
  • 0 votes
  • 0 copies
  • 1 view
  • Added September 19, 2026
ai-agentspythongobashapi

Works with

  • cli
  • api

Security analysis

A100/100

Pro scans all 4 files and shows the line behind each finding

Scanned September 19, 2026

npx -y skills add johnqtcg/awesome-skills --skill stock-balance-sheet-review --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Stock Balance Sheet Review?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Stock Balance Sheet Review
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/johnqtcg-stock-balance-sheet-review/badge)](https://www.skillsdirectory.com/skills/johnqtcg-stock-balance-sheet-review)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: stock-balance-sheet-review
description: 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.
allowed-tools: Read, Grep, Glob, WebSearch, WebFetch, Bash
---

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

Files in this skill

  • SKILL.md9.6 KB
  • references/balance-sheet-red-flags.md6.5 KB
  • scripts/run_regression.sh97 B
  • scripts/tests/test_skill_contract.py5.2 KB

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.