Data Hub — how this works
In the app: /data-hub
How it works
Three read-only tabs. Fields: every enrichable Lead field mapped to the EnrichmentAttempt provider(s) that could have filled it (legalForm←Companies House, emailStatus←Reoon, email←the re-find waterfall, contactName/extraPhones←the site crawl); lineType/smsEligible (Telnyx), phoneScreen (TPS/CTPS), and score (mock-Claude) are tracked filled/not-filled only, since none of those write an EnrichmentTrace row. Fill-rate % is computed live across the whole list; opening a lead re-reads the newest EnrichmentTrace hit per field for its provenance. Enrichments: how many times each EnrichmentTrace columnKey (enrich-full, email-refind, every built-in RESEARCH_COLUMNS key) has run and how many distinct leads it covers. Signals: the same run/distinct-lead counting over the Signal table's detector types.
Data source
src/lib/datahub/fieldCatalog.ts (pure) + src/lib/datahub/dataHubRepo.ts (the Lead/EnrichmentTrace/Signal loader).
Troubleshooting
A field shows 0% filled but you know it's populated on some leads? Check whether it's a telnyx/phone_screen/scoring-sourced field in FIELD_CATALOG — those never show a provider/last-refreshed (no EnrichmentTrace row backs them), only filled/unfilled. A registry row missing entirely (not even a zero) means that column/signal type has never fired yet — the honest state, not a bug.
Vendors: companies-house, reoon — check Tools for live/mocked status.
Who can see this: admin, closer