Summary
Six dual-class S&P 500 tickers have silently wrong shares_outstanding on every warm-cache cron run. The PR #292 per-class XBRL override (Branch 3) that was supposed to fix GOOG/GOOGL overcount only fires on cold-cache crons.
Root cause
compute/ingest/fundamentals.py _fetch_shares_from_cached_snapshot() (the warm-cache path) returns the cached aggregate shares_outstanding value WITHOUT running the per-class MULTI_CLASS_OVERCOUNT_ALLOWLIST override. The override logic in _build_snapshot() only runs during a live EDGAR fetch. On warm-cache crons (the normal daily case), the override is skipped entirely.
Evidence from cron Run #71 metadata:
multi_class_per_class_attempt_count = 0 ← override never ran
multi_class_mc_reconcile_failure_count = 0
The _build_snapshot() only runs on a live EDGAR call. Warm-cache crons call _fetch_shares_from_cached_snapshot() → returns the pre-PR-#292 aggregate value. So the bug from before PR #292 (GOOG $4.6T market cap overcount) silently persists on every warm-cache cron.
Affected tickers: GOOG, GOOGL, NWS, NWSA, FOX, FOXA (all have multi_class_aggregate_shares_suspected = true annotate firing correctly as the safety net, but the underlying value is still wrong on warm-cache crons).
Expected behavior
The per-class override should be applied when reading from the warm-cache parquet, not only during live EDGAR fetch. The MULTI_CLASS_OVERCOUNT_ALLOWLIST check should be moved to (or duplicated at) the cache-read path in fundamentals.py.
Notes
Summary
Six dual-class S&P 500 tickers have silently wrong
shares_outstandingon every warm-cache cron run. The PR #292 per-class XBRL override (Branch 3) that was supposed to fix GOOG/GOOGL overcount only fires on cold-cache crons.Root cause
compute/ingest/fundamentals.py_fetch_shares_from_cached_snapshot()(the warm-cache path) returns the cached aggregateshares_outstandingvalue WITHOUT running the per-classMULTI_CLASS_OVERCOUNT_ALLOWLISToverride. The override logic in_build_snapshot()only runs during a live EDGAR fetch. On warm-cache crons (the normal daily case), the override is skipped entirely.Evidence from cron Run #71 metadata:
The
_build_snapshot()only runs on a live EDGAR call. Warm-cache crons call_fetch_shares_from_cached_snapshot()→ returns the pre-PR-#292 aggregate value. So the bug from before PR #292 (GOOG $4.6T market cap overcount) silently persists on every warm-cache cron.Affected tickers: GOOG, GOOGL, NWS, NWSA, FOX, FOXA (all have
multi_class_aggregate_shares_suspected = trueannotate firing correctly as the safety net, but the underlying value is still wrong on warm-cache crons).Expected behavior
The per-class override should be applied when reading from the warm-cache parquet, not only during live EDGAR fetch. The
MULTI_CLASS_OVERCOUNT_ALLOWLISTcheck should be moved to (or duplicated at) the cache-read path infundamentals.py.Notes
multi_class_aggregate_shares_suspectedannotate continues firing correctly (safety net works)compute/ingest/fundamentals.pyat the warm-cache read pathmarket_cap2.2× inflated) #292, PR fix(ci): Issue #288 follow-up — bump workflow cache keyv4 → v5#298 (cache-v5 bump was a workaround forcing cold cache; not a structural fix)