Merge fix/sec-fundamentals-parity-gaps: post-reparse verification docs
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -853,3 +853,73 @@ track the parser's `SnapshotRow`, and only one of them is now enforced by a test
|
|||||||
|
|
||||||
PSKY and Q need nothing — they are new registrants without enough filing history, which is
|
PSKY and Q need nothing — they are new registrants without enough filing history, which is
|
||||||
correct behaviour.
|
correct behaviour.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# Closing — post-reparse verification (2026-07-24)
|
||||||
|
|
||||||
|
## Production reparse
|
||||||
|
|
||||||
|
Two apply runs against prod (`scripts/reparse_fundamentals.py --apply`):
|
||||||
|
|
||||||
|
- **Run 6** (all fixes through the seventh pass): 262 inserted, 28,664 rewritten —
|
||||||
|
99.4% of which was backfilling the new `weighted_avg_diluted_shares` column; the
|
||||||
|
behavioural churn matched the dry run exactly. The five duration facts clustering at
|
||||||
|
190–234 changed rows each is the 4-4-5 Q3 recovery signature. `accepted_at` changed on
|
||||||
|
only 76 rows (0.25%), confirming the tz-comparison fix works against real Postgres.
|
||||||
|
- **Run 7** (after the fiscal-year-end fix below): 3 inserted, 322 rewritten — BEN, DELL,
|
||||||
|
and boundary-year relabels for 53-week filers whose derived MMDD shifted a few days.
|
||||||
|
|
||||||
|
`cik_updates: 1` on run 6 was the XOM pin taking effect; XOM now has 68 snapshot rows,
|
||||||
|
latest period end 2026-03-31.
|
||||||
|
|
||||||
|
## Regression caught by the collision check — and its fix
|
||||||
|
|
||||||
|
The before/after key-collision query (~130 rows max 6 → 44 rows all 2) surfaced one real
|
||||||
|
regression: **BEN**. `submissions.fiscalYearEnd` declares `1231` while every Franklin
|
||||||
|
Resources 10-K ends 09-30, so `_period_identity` — which trusted the declared value — put
|
||||||
|
BEN's real fiscal Q1 zero days from the claimed year end (no band matched) and labelled its
|
||||||
|
fiscal Q2 as Q1. The collision discarded a period and BEN lost TTM EPS and revenue growth it
|
||||||
|
had before the branch. Fixed in `3d42ca7`: `resolve_fiscal_year_end()` prefers the issuer's
|
||||||
|
own most recent 10-K reportDate (which *is* the fiscal year end by definition) and treats
|
||||||
|
the declared field as fallback. Full-universe scan: 2 of 506 issuers mis-declare (BEN 91d,
|
||||||
|
DELL 29d); both now derive correctly (BEN rg 3.8243 vs legacy 3.82; DELL 38.5735 vs 38.57).
|
||||||
|
|
||||||
|
Residual collisions after run 7: 36 rows, all count-2, **latest year 2023** — the 53-week
|
||||||
|
drift class (AVY/CDNS/RVTY/JNJ/TDY/DPZ at 5–6-year intervals). Newest-wins degrades one
|
||||||
|
historical FY row; no current period is affected. Left alone deliberately: eliminating them
|
||||||
|
means modelling each filer's actual 52/53-week calendar per year, for rows feeding no
|
||||||
|
current metric.
|
||||||
|
|
||||||
|
## The verdict: 2026-07-24 parity report vs the 2026-07-23 baseline
|
||||||
|
|
||||||
|
| metric | baseline | after | |
|
||||||
|
|---|---|---|---|
|
||||||
|
| candidate scored | 482 | **504** | legacy scores 507; gap = PSKY, Q (new registrants) + FITB |
|
||||||
|
| revenue_growth candidate available | 442 | **489** | banks, REITs, 4-4-5 recovered |
|
||||||
|
| pe_ratio candidate available | 432 | **452** | net of the split-guard nulls |
|
||||||
|
| revenue_growth median abs delta | 0.0038 | **0.0038** | 47 names added at unchanged agreement |
|
||||||
|
| pe_ratio median / p95 abs delta | 0.5883 / 7.73 | **0.5576 / 6.03** | corrupted outliers gone |
|
||||||
|
|
||||||
|
Revenue `material_differences` rose 84 → 96: the newly compared names include the cases
|
||||||
|
where **legacy is the wrong side** (JPM 108.98% vs 3.34%, PPL −58.81% vs 8.34%, FCX −24.23%
|
||||||
|
vs +5.44%). Material is symmetric; these flag the provider being corrected.
|
||||||
|
|
||||||
|
The split guard is visible in the report: BKNG (1.10), COF, TPL, AMCR, WAT all null P/E now.
|
||||||
|
**KLAC (6.19) is the one known-wrong value left** — the post-filing split documented as
|
||||||
|
unfixable without a corporate-actions source.
|
||||||
|
|
||||||
|
**Correction to the seventh pass:** the claim that guard-tripped issuers "keep their
|
||||||
|
fundamental score, losing one of three inputs" fails for **FITB**, the one name that also
|
||||||
|
lacks revenue growth (its recent filings tag only ASC-606 fee-income fragments, then nothing)
|
||||||
|
— nulling its contaminated P/E (Comerica merger, 661M → 902M shares) drops it to one metric
|
||||||
|
and no score. Accepted: the composite renormalises, and legacy's 58% "revenue growth" for a
|
||||||
|
bank was itself junk.
|
||||||
|
|
||||||
|
## Recommendation
|
||||||
|
|
||||||
|
The A5 gate evidence now supports approving the cutover: coverage within 3 of legacy with
|
||||||
|
every gap explained, agreement essentially exact where both sides exist, every corrupted
|
||||||
|
value either fixed or deliberately nulled with a caveat, and the remaining score deltas are
|
||||||
|
documented definition differences — called out, not averaged away, as the plan requires.
|
||||||
|
Carry KLAC as the one known caveat in the approval note.
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user