Executes the reimport repair from #873 (the empty-payload festival person-links). Tracked separately so we can run it in monitored waves and log progress. Parent context: #873 (root cause + diagnosis), #1101 §3 (the code fix), #1090 Phase 3a (surface-area).
Why this exists
#873's gap is ~100% empty-payload nominations (details: {nominee_names: nil, person_imdb_ids: []}) written before the scraper↔worker shape fix. The resolver recovers 0 from them — they need re-import (re-scrape → repopulate details → resolve). The code fix (#1101 WS3: create_nomination now always patches empty details even when person resolution misses) is deployed and validated. This issue drives the re-imports.
✅ Validated — Wave 0 (2026-06-09)
Golden Globes 2016 / 2017 / 2018 re-imported → HFPA resolved 179 → 277 (+98), empty-payload 2,785 → 2,682. (2018 hit a transient Crawlbase HTTP 520, recovered on retry.) Confirms the path: re-scrape repopulates details + resolves person_ids (incl. the Christian Slater Golden Globe links that spawned #873).
Full scope — empty-payload person-tracked nominations by org
| Org |
source_key |
empty noms |
years |
| Golden Globes (HFPA) |
golden_globes |
2,682 |
80 |
| BAFTA |
tbd |
1,786 |
74 |
| Critics Choice (CCA) |
tbd |
1,165 |
30 |
| SAG |
tbd |
689 |
28 |
| NYFF |
tbd |
603 |
52 |
| Cannes (CFF) |
tbd |
385 |
73 |
| Venice (VIFF) |
tbd |
259 |
79 |
| Berlin (BIFF) |
tbd |
94 |
53 |
| Locarno (LFF) |
tbd |
69 |
31 |
| Sundance (SFF) |
tbd |
35 |
… |
(~7.7k+ total — the remainder of the #873 ~10k after Wave 0.)
Mechanism
- Enqueue
Cinegraph.Workers.UnifiedFestivalWorker per (festival_key, year) (scraping queue, max_attempts: 3 → transient Crawlbase 520s retry; 404/403 cancel cleanly). On the eval node, insert oban_jobs rows directly (Oban is stripped there); the web node runs them.
- Each year re-scrapes IMDb via Crawlbase (JS mode — 403/520-prone), upserts
ceremony.data, repopulates empty details, and resolves person_ids.
- After each wave: re-run
Cinegraph.Maintenance.ResolvePersons.run if needed, then Cinegraph.Health.AwardPersonLinkage.audit(org:) to measure the delta.
Wave plan
- Golden Globes (validated org) by year-batches: Wave 0 ✅ (2016–18) · Wave 1 (2001–2015) · then 1944–2000.
- BAFTA → CCA → SAG → NYFF → Cannes → Venice → Berlin → Locarno → Sundance → … (resolve each org's
source_key at wave time).
- Batch size ~15 years/wave to monitor Crawlbase success rate + cost before committing the next.
Closure
Closes the reimport portion of #873 when: every org's empty-payload nominations are repopulated, the resolver has run, and person_required_nomination_missing_person drift → green. #873 stays open until then.
Progress log
- Wave 0 ✅ 2026-06-09 — GG 2016/2017/2018 → +98 resolved.
Executes the reimport repair from #873 (the empty-payload festival person-links). Tracked separately so we can run it in monitored waves and log progress. Parent context: #873 (root cause + diagnosis), #1101 §3 (the code fix), #1090 Phase 3a (surface-area).
Why this exists
#873's gap is ~100% empty-payload nominations (
details: {nominee_names: nil, person_imdb_ids: []}) written before the scraper↔worker shape fix. The resolver recovers 0 from them — they need re-import (re-scrape → repopulatedetails→ resolve). The code fix (#1101 WS3:create_nominationnow always patches emptydetailseven when person resolution misses) is deployed and validated. This issue drives the re-imports.✅ Validated — Wave 0 (2026-06-09)
Golden Globes 2016 / 2017 / 2018 re-imported → HFPA resolved 179 → 277 (+98), empty-payload 2,785 → 2,682. (2018 hit a transient Crawlbase
HTTP 520, recovered on retry.) Confirms the path: re-scrape repopulatesdetails+ resolves person_ids (incl. the Christian Slater Golden Globe links that spawned #873).Full scope — empty-payload person-tracked nominations by org
golden_globes(~7.7k+ total — the remainder of the #873 ~10k after Wave 0.)
Mechanism
Cinegraph.Workers.UnifiedFestivalWorkerper(festival_key, year)(scraping queue,max_attempts: 3→ transient Crawlbase 520s retry; 404/403 cancel cleanly). On the eval node, insertoban_jobsrows directly (Oban is stripped there); the web node runs them.ceremony.data, repopulates emptydetails, and resolves person_ids.Cinegraph.Maintenance.ResolvePersons.runif needed, thenCinegraph.Health.AwardPersonLinkage.audit(org:)to measure the delta.Wave plan
source_keyat wave time).Closure
Closes the reimport portion of #873 when: every org's empty-payload nominations are repopulated, the resolver has run, and
person_required_nomination_missing_persondrift → green. #873 stays open until then.Progress log