# Stock Business Review

> Review a US-listed company's business model and revenue structure for an equity-research workup. Covers product/service mix, customer concentration, geographic exposure, industry position, revenue-growth decomposition (organic vs acquired vs price vs volume), and information-tier discipline (which numbers are facts vs management narrative). Trigger when analyzing a single US ticker's business fundamentals, when reading 10-K Item 1 "Business" and Item 1A "Risk Factors", or when the orchestrator stock-analysis-lead dispatches business review. Dispatched by stock-analysis-lead or invoked directly for business-focused analysis.

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

---


# Stock Business Review

## Purpose

Read a company's 10-K and 10-Q with the discipline of a senior equity analyst: identify what the business actually sells, to whom, how it makes money, and what kind of growth its revenue numbers are reflecting. Surface red flags that pure financial-statement readers miss — narrative buckets, undefined adjusted metrics, customer concentration risk, and acquired-growth dependency. The output is a structured set of Findings that the orchestrator uses to build the Good-Company score and frame valuation.

## When To Use

- Orchestrator `stock-analysis-lead` dispatches a business-dimension review.
- The user directly asks "what does <ticker> actually do" or "is <ticker>'s growth real" or "tell me about <ticker>'s customer concentration".
- A standalone business-model classification is needed before deeper financial analysis.

## When NOT To Use

- Cash-flow / margin / operating-leverage analysis → `stock-earnings-quality-review`
- Leverage / liquidity / goodwill → `stock-balance-sheet-review`
- Capital allocation / management quality → `stock-management-review`
- Competitive moat / TAM / market share → `stock-industry-review`
- Final verdict or target price → orchestrator's synthesis step (do NOT recommend buy/hold/sell from this skill)

## Mandatory Gates

### 1) Execution Integrity Gate
You must read the 10-K Item 1 "Business" section before drawing any conclusion. If the orchestrator's `data-manifest.json` does not include a 10-K path, return `SKIPPED (no 10-K available)` and do not fabricate analysis from press releases or analyst summaries.

### 2) Filing Vintage Gate
The 10-K must be the most recent annual filing (within the last 14 months from today). If the only available 10-K is older, flag it explicitly in Execution Status — old filings miss recent strategic shifts and recent customer-concentration data.

### 3) Citation Gate
Every Finding must cite a specific filing section (e.g., "10-K Item 1, page 7" or "10-K Item 1A, Risk Factor 3"). Findings without citations are suppressed.

### 4) Non-US Refusal Gate
If you detect the ticker is an A-share (3-digit or 6-digit Chinese code), HK-share (4-digit HK code), or ADR of a foreign private issuer filing 20-F instead of 10-K, return `SKIPPED (non-US issuer — out of scope)` immediately.

## Workflow

1. Locate the 10-K and latest 10-Q from the manifest. Read 10-K Item 1 (Business), Item 1A (Risk Factors), and Item 7 (MD&A) summary.
2. Run the Filing-Pattern-Gated Execution Protocol — for each checklist item with a filing-section pattern, locate the relevant section first, then apply semantic analysis only on those passages.
3. For checklist items that are pure-semantic (no stable filing keyword), apply full reasoning.
4. Cross-check Risk Factors against the Business section — discrepancies between the rosy "Business" narrative and the candid "Risk Factors" are a strong signal.
5. Emit Findings with severity, evidence quote, and citation. Suppress items not found rather than fabricate.

## Filing-Pattern-Gated Execution Protocol

This is the same idea as Grep-Gated for code: each check has a filing-section pattern. If the section/keyword is absent, mark NOT FOUND and skip semantic analysis. Only HIT sections get full reasoning.

### Execution Order

1. Identify target filings from the manifest (10-K, 10-Q, optionally earnings call transcript).
2. For each grep-gated checklist item, search the filing(s) for the documented keyword/section pattern.
3. **HIT** → semantic analysis to confirm true positive vs false positive.
4. **MISS** → auto-mark NOT FOUND. Do not extrapolate from absence — note absence in Execution Status if material.
5. For semantic-only items: full reasoning on the relevant section.
6. Report ONLY FOUND items.
7. Include `Filing pre-scan: X/Y items hit, Z confirmed as findings` in Execution Status.

### Compound Pattern Protocol

Some red flags are "presence of A without B" (e.g., "AI revenue" mentioned without a definition). Use compound patterns:
- HIT on A (keyword present)
- AND NOT on B (definition / methodology / breakdown absent in the same section)
- → Confirmed Finding

## Business Checklist (11 Items)

| ID | Item | Filing Pattern | Severity Bias |
|---|---|---|---|
| BUS-01 | Revenue composition: products vs services, subscription vs transactional, B2B vs B2C, hardware vs software | 10-K Item 1 "Products" / "Services" / "Revenue" subsection; 10-K Note "Disaggregation of revenue" | Med |
| BUS-02 | Customer concentration | 10-K Item 1A keyword `"significant customer"`, `"customer concentration"`, `"10% of revenue"` | High if Top1 > 10% |
| BUS-03 | Geographic revenue split + FX sensitivity | 10-K Note "Geographic information"; 10-K Item 7 "Foreign currency" | Med |
| BUS-04 | Industry position (market leader vs challenger vs long-tail) | 10-K Item 1 "Competition" subsection | Med |
| BUS-05 | Business-model archetype: high-margin low-turnover (software/SaaS) vs low-margin high-turnover (retail) vs capital-intensive (utility) | Derive from 10-K Item 1 + gross margin in Item 8 | Low (informational) |
| BUS-06 | Revenue-growth decomposition: organic vs acquired vs price vs volume | 10-K Item 7 MD&A; keywords `"acquisition contributed"`, `"organic growth"`, `"price increase"`, `"unit growth"` | High if mostly inorganic |
| BUS-07 | Deferred-revenue trend vs reported-revenue trend | 10-K balance sheet line "Deferred revenue" / "Contract liabilities", compared YoY against revenue | High if deferred growth << revenue growth (future slowdown signal) |
| BUS-08 | Material adjusted-metric usage and definition consistency | Earnings releases + 10-K "Non-GAAP reconciliation"; keywords `"Adjusted EBITDA"`, `"Non-GAAP"` | High if SBC excluded from Adjusted EBITDA |
| BUS-09 | Narrative buckets without defined methodology | Compound pattern: `"AI revenue"` OR `"<theme> revenue"` AND NOT (methodology paragraph in same section) | High if material % of total |
| BUS-10 | Information-tier discipline — what is fact vs management-defined | Cross-check: any number quoted by IR but absent from filings | High if material |
| BUS-11 | Contra-revenue / client incentives — the gross→net bridge | 10-K revenue-recognition note + MD&A; keywords `"client incentives"`, `"rebates"`, `"incentives"`, `"contra-revenue"`, `"net revenue"` | **High for network/platform/marketplace**; Med otherwise |

### Severity Rubric

- **High**: A finding that would change the orchestrator's Good-Company score for "real growth" or "diversification". E.g., 60% of revenue from one customer; 40% of growth from acquisitions; "AI revenue" without methodology.
- **Medium**: A material structural fact the orchestrator needs to weight scenarios — e.g., 30% of revenue is FX-exposed; the company is #3 in a #1-takes-most market.
- **Low**: Useful context that does not move the verdict — e.g., a clean disaggregation of revenue by segment.

## Evidence Rules

- Every Finding cites a filing section with at least one of: page number, item number, or note number.
- Direct quotes are preferred over paraphrase; cap each quote at 60 words.
- "I think" / "appears to" / "likely" without evidence → revise to evidence-based statement or drop the Finding.

## Output Format

### Findings

Order: High → Medium → Low. Within each severity, order by checklist ID.

#### [High|Medium|Low] Short Title

- **ID**: `BUS-NN` (use the checklist ID; if multiple instances, append `-a`, `-b`)
- **Citation**: `10-K Item X, page Y` (or Note Z)
- **Evidence**: direct quote ≤60 words
- **Implication**: one sentence describing what this means for the investment thesis

### Suppressed Items

Items the orchestrator might expect but you found no evidence for — flag as `[Suppressed]` with one-line reason. Do not invent Findings to fill gaps.

### Execution Status

```
Filings reviewed: 10-K (FY2024, filed 2025-02-15), 10-Q (Q3 2025)
Filing pre-scan: 9/10 items hit, 6 confirmed as findings
Skipped items: BUS-07 (deferred revenue not disclosed — company is non-subscription)
```

### Summary

One line: `N High / M Medium / K Low — most material: <BUS-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-business-reviewer",
  "prefix": "BUS",
  "status": "OK",
  "depth_mode": "<echo the dispatched depth>",
  "archetype_applied": "<echo the dispatched archetype>",
  "archetype_challenge": null,
  "findings": [
    {
      "id": "BUS-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": 11, "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 `BUS` — 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` (11), 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-business-reviewer
```

## No-Finding Case

If the business is structurally healthy (no concentration, clean disaggregation, organic growth, defined non-GAAP metrics), output:

```
No business-model findings — structurally clean.
Notable positives: <BUS-NN: positive observation, e.g., "Top10 customer < 5% revenue">
```

Do not fabricate marginal findings to look thorough. Suppression discipline matters: orchestrator interprets "no findings" as evidence of quality.

## Load References Selectively

- `references/business-model-patterns.md` — load when classifying business-model archetype (BUS-05), when SaaS-specific subscriptions need NRR/ARR awareness, or when building the contra-revenue / gross→net bridge (BUS-11); covers high-margin-low-turnover vs low-margin-high-turnover taxonomies, revenue-disaggregation patterns, and the client-incentives bridge.

## Review Discipline

You are one of the orchestrator's parallel workers (the fan-out size is depth- and trigger-dependent — see `stock-analysis-lead/references/dispatch-protocol.md`). The orchestrator depends on you reporting only what you actually found in filings, with full citations. Over-reporting wastes the orchestrator's deduplication budget; fabrication breaks the entire analysis. When in doubt, suppress.
