You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
On the 2026-05-23 production cron (90157482, commit 9015748), both GOOG (Class C) and GOOGL (Class A) tickers store Alphabet's 12.12B total shares (sum across all classes) instead of the per-class breakdown — making each ticker appear to have a $4.6T market cap.
Ticker
Stored shares_outstanding
Stored market_cap
Real (per-class)
Overcount
GOOG (Class C)
12,116,000,000
$4,596.6B
~$1,048B (5.9B shares × ~$178)
4.4×
GOOGL (Class A)
12,116,000,000
$4,640.1B
~$1,057B (5.9B shares × ~$179)
4.4×
Combined
(storing 2 × 12.12B = 24.24B)
$9,236B
~$2,105B (real Alphabet MC)
4.4×
fair_price.median = $85.29 against actual price ~$379 → mos_pct = -344.8% / -349.0%. Value pillar contaminated (15.94 / 11.59 — appears expensive on every ratio because each per-class ticker is reported at ~$4.6T).
Root cause
compute/ingest/fundamentals.py reads shares_outstanding from SEC companyfacts for Alphabet's CIK (0001652044). The companyfacts aggregate API returns the total common-shares outstanding across all classes (~12.12B) — Alphabet files non-dimensionally for the EntityCommonStockSharesOutstanding concept, so both GOOG and GOOGL tickers receive the same aggregate. The same aggregate × the per-class price = a market cap that double-counts the company.
This is the opposite direction of the V/NWS/NWSA/FOX/FOXA/BRK-B/STZ allowlist pattern fixed by PR #257:
Three options (deferred to methodology-scientist Mode B verdict):
Reverse-allowlist per-class extraction — for known multi-class non-dimensional filers (GOOG/GOOGL/possibly DISCK-style historic patterns), explicitly extract the per-class share count from per-filing XBRL using a different XBRL fact name or ticker-CIK-class mapping. Adds a second allowlist + extraction path opposite to PR feat(ingest): Issue #248 PR2b — multi-class XBRL dimensional override (V/NWS/NWSA/FOX/FOXA/BRK-B/STZ) #257.
Class-aware downscaling — for the GOOG/GOOGL pair, divide the aggregate by the known voting-equivalent class ratio. Risk: data-driven heuristic; needs methodology Mode B sign-off.
Defense annotate — fire a new multi_class_aggregate_shares_suspected flag when one ticker's CIK matches another ticker's CIK in the universe (Alphabet GOOG/GOOGL share CIK 0001652044). Annotate-only, no scoring veto, surfaces the pattern at cohort-audit time.
Reproduction
python -c "import jsonfor t in ('GOOG', 'GOOGL'): with open(f'frontend/public/data/stocks/{t}.json') as f: d = json.load(f) print(f'{t}: shares={d[\"raw_metrics\"][\"shares_outstanding\"]:,} ' f'mc=\${d[\"raw_metrics\"][\"market_cap\"]/1e9:.1f}B ' f'mos={d[\"fair_price\"][\"mos_pct\"]:.1f}%')"
15-parallel-agent self-audit on claude/eager-bohr-12bQi (2026-05-26). stock-detail-auditor Step 3 LLM verdict: broken_data (not cron_pre_fix_state because GOOG/GOOGL are NOT in PR #257's MULTI_CLASS_SHARE_ALLOWLIST — they're a distinct error class). Filed as a separate issue (rather than expanding PR #257's allowlist) because the underlying mechanism is opposite to PR #257's.
Damodaran 2019 Investment Valuation 3rd ed. Ch. 16 — TSO calculation across share classes (per-class market cap should NOT sum to >100% of company)
Severity / priority
MEDIUM — visible to users on /stock/GOOG + /stock/GOOGL (both show absurd $4.6T market cap and -345% MoS). Composite rank impact is real but Top-5 rotation Rule 16 invariant is intact (GOOG / GOOGL are not currently in any top-5 contention because the value pillar tanks them to low ranks). No safety violation. Q3 2026-08-19 cohort audit is the natural decision gate.
Symptom
On the 2026-05-23 production cron (
90157482, commit9015748), bothGOOG(Class C) andGOOGL(Class A) tickers store Alphabet's 12.12B total shares (sum across all classes) instead of the per-class breakdown — making each ticker appear to have a $4.6T market cap.shares_outstandingmarket_capfair_price.median = $85.29against actual price ~$379 →mos_pct = -344.8% / -349.0%. Value pillar contaminated (15.94 / 11.59 — appears expensive on every ratio because each per-class ticker is reported at ~$4.6T).Root cause
compute/ingest/fundamentals.pyreadsshares_outstandingfrom SECcompanyfactsfor Alphabet's CIK (0001652044). The companyfacts aggregate API returns the total common-shares outstanding across all classes (~12.12B) — Alphabet files non-dimensionally for theEntityCommonStockSharesOutstandingconcept, so both GOOG and GOOGL tickers receive the same aggregate. The same aggregate × the per-class price = a market cap that double-counts the company.This is the opposite direction of the V/NWS/NWSA/FOX/FOXA/BRK-B/STZ allowlist pattern fixed by PR #257:
summed > primaryinvariant rules out a naive extension.Defense gap
NONE of the current defense flags catch it:
data_quality_input_corruption(Defense Investigate NVDA Sloan accruals flag — genuine red flag or growth-stage artifact? #7 / risk_overlay.py:411) — TBVPS doesn't break the $10K/share ceiling because shares are plausible-magnitude (12B is a sensible order-of-magnitude for a $2T company)cross_source_disagreement(PR feat(ingest): Issue #248 PR2a — cross-source observability + #246 Rule 18 retrofit (schema 0.10.3) #256 observability) — yfinance.info likely also returns the same total-shares aggregate; both sources agree → no annotate firesshare_count_extraction_missing(PR feat(defense): add share_count_extraction_missing annotate (closes #176) #181) — shares aren't Noneextreme_estimate_majority(PR feat(defense): add extreme_estimate_majority annotate (issue #177) #183) — fires correctly as a downstream symptom, but doesn't identify the upstream causeSuggested fix path
Three options (deferred to methodology-scientist Mode B verdict):
multi_class_aggregate_shares_suspectedflag when one ticker's CIK matches another ticker's CIK in the universe (Alphabet GOOG/GOOGL share CIK0001652044). Annotate-only, no scoring veto, surfaces the pattern at cohort-audit time.Reproduction
Expected output (current state):
Surfaced by
15-parallel-agent self-audit on
claude/eager-bohr-12bQi(2026-05-26).stock-detail-auditorStep 3 LLM verdict:broken_data(notcron_pre_fix_statebecause GOOG/GOOGL are NOT in PR #257'sMULTI_CLASS_SHARE_ALLOWLIST— they're a distinct error class). Filed as a separate issue (rather than expanding PR #257's allowlist) because the underlying mechanism is opposite to PR #257's.Cross-references
share_count_extraction_missingSTZ recoveryshares_outstanding=2,542— XBRL dimensional-fact extraction failure (STZ-class pattern, sibling of #176) #246 / fix(ingest): extend shares_outstanding fallback to catch implausibly-low primary extraction (#246 ERIE) #253 — ERIE implausibly-low extraction fixshares_outstanding=469M(real ~1.85B, ~4× off) — no veto despite obvious mcap understatement #248 — V/Visa cross-source escalationSeverity / priority
MEDIUM — visible to users on
/stock/GOOG+/stock/GOOGL(both show absurd $4.6T market cap and -345% MoS). Composite rank impact is real but Top-5 rotation Rule 16 invariant is intact (GOOG / GOOGL are not currently in any top-5 contention because the value pillar tanks them to low ranks). No safety violation. Q3 2026-08-19 cohort audit is the natural decision gate.