Skip to content

bug: GOOG/GOOGL/NWS/NWSA/FOX/FOXA — per-class XBRL override never fires on warm-cache crons (multi_class_per_class_attempt_count=0) #374

@dackclup

Description

@dackclup

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't workingingest

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions