Skip to content

feat(sizing): strata sense-check — market-share-implied TAM cross-check (EDGAR-backed) - #143

Merged
ArkashJ merged 6 commits into
mainfrom
feat/sense-check
Jun 10, 2026
Merged

feat(sizing): strata sense-check — market-share-implied TAM cross-check (EDGAR-backed)#143
ArkashJ merged 6 commits into
mainfrom
feat/sense-check

Conversation

@ArkashJ

@ArkashJ ArkashJ commented Jun 10, 2026

Copy link
Copy Markdown
Owner

What

Adds strata sense-check: a comparable-revenue cross-check for any market. Implied TAM = Σ(player revenue) / Σ(market share), with:

  • Defensibility hardening: sensitivity band, leverage analysis, residual share, explicit assumptions block — built to survive a TAM expert's critique (docs/methods/sense-check-defensibility.md).
  • EDGAR revenue auto-pull: --player 'Name|edgar:TICKER|share' resolves a US-listed company's latest annual revenue live from SEC EDGAR (+ fixes EDGAR null fy/fp parsing).
  • Tests: test_edgar_parse_fact.py + sizing tests.

Why

A TAM number with no independent cross-check is just an assertion. This gives every sized market a second, sourced opinion from public-company revenue.

🤖 Generated with Claude Code

Tushar Gupta and others added 6 commits June 9, 2026 23:22
Comparable-revenue sense check for any market: implied TAM = sum(player revenue) / sum(market share), with a revenue floor and a per-player spread that flags inconsistent share estimates. With --concept it compares the implied TAM to the curated market's sourced scenario range (within/above/below), like convergence. Market shares are analyst estimates so the implied TAM is MODELED, never persisted (Q20). New strata.sizing.sense_check module + CLI command; strata size prints a cross-check pointer. 17 unit/CLI tests; ruff + pyright clean; 64 regression tests green.
…sidual, assumptions)

Adversarial-review hardening so the market-share-implied TAM survives a TAM expert's critique: a sensitivity band (shares +/-25% -> the estimate is a range, not a point), a leverage factor (1/share) with a warning when combined share is small, an implied residual (rest-of-market revenue), a sourced-vs-estimate count per player, and an explicit assumptions block printed every run. New docs/methods/sense-check-defensibility.md maps the 10 standard expert arguments to how each is handled. 22 sense-check tests; 104 regression tests green; ruff + pyright clean.
…ll fy/fp)

sense-check --player 'Name|edgar:TICKER|share' resolves a US-listed company's latest annual revenue live from SEC EDGAR XBRL (regulator-tier, sourced) instead of an analyst estimate, picking the newest annual fact across the Revenues and ASC-606 RevenueFromContract concepts. yfinance is quotes-only so not used; private cos stay estimates; STRATA_OFFLINE refuses live lookups. Fixes a latent EDGAR bug: _parse_fact crashed on present-but-null fy/fp in real companyconcept data. New revenue_lookup module; 6 lookup tests (mocked client) + 2 CLI tests + 2 edgar-parse regression tests; 275 regression tests green; ruff + pyright clean.
…#143)

- EDGAR: select annual revenue by the fact's own period end, never fy/filed
  (a 10-K's comparatives all share the filing's fy + filed date); fiscal-year
  label derived from end; skip null/zero-val facts; Fact carries start/end;
  3 more us-gaap revenue tags; miss error names every tag tried
- MODELED (Q20) label is unconditional — shares are always analyst estimates,
  so an all-sourced-revenue run still carries the marker
- Σshare ≥ 100% suppresses the sensitivity band, leverage, and residual (a
  band that excludes its own point estimate is never emitted); only the
  revenue floor + overlap warning survive
- EDGAR revenue flagged as TOTAL company: inline caveat at resolution +
  per-player '(filing, total-co)' tag
- Warn on a bare share token parsing to exactly 100% (the '1' → 100% trap)
- CSV players parse directly into Player (no pipe-DSL round-trip; '|' in a
  name can't inject fields), optional 'sourced' column, ONE shared
  EDGARClient across rows; edgar specs enforce the same field count
- New MCP tool 'sense_check' (27 tools): mirrors the CLI result, carries
  machine-readable modeled=true + label, edgar_ticker gated behind
  STRATA_MCP_LIVE_CONNECTORS=1 like get_connector_data
- Docs aligned (≤ 25% leverage threshold, total-co caveat, unconditional
  MODELED); CHANGELOG [Unreleased] entries

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…nnector, single-source labels, one-request revenue lookup

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ied)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@ArkashJ
ArkashJ merged commit 0e86df3 into main Jun 10, 2026
1 of 3 checks passed
@ArkashJ
ArkashJ deleted the feat/sense-check branch June 10, 2026 15:33
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant