---
title: Keep the Hall of Fame game's play import from silently failing
type: task
status: draft
description: >-
  The Hall of Fame game lost its nfl_games.detail_v1_game_id in both 2024 and 2025, which made the
  NFL v1 play importer skip it and left nfl_plays empty for both games with nothing reporting it.
  Both are repaired; this establishes why it happened and what stops it recurring.
base_uri: user:task/league/keep-hall-of-fame-game-play-import-from-silently-failing.md
created_at: '2026-09-20T17:27:33.841Z'
entity_id: 3dbdfc58-1da6-43b5-bea2-7ecff6e9fc6b
observations:
  - ████████████████████████████████████████████████
owner_identity_uri: █████████████████████████
priority: Medium
public_read: true
tags:
  - user:tag/league-xo-football.md
updated_at: '2026-11-04T17:06:11.693Z'
visibility_analyzed_at: '2026-11-05T23:49:39.670Z'
---

## Context

The Hall of Fame game lost its `nfl_games.detail_v1_game_id` in **both 2024 and 2025**, and the consequence was silent and total: `import-plays-nfl-v1` skips any game without that id, so `nfl_plays` held **zero rows** for both games. Nothing reported it.

Both are now repaired (2026-09-20) and the data is complete for every Hall of Fame game 2021-2026. What is NOT established is why the id went missing, so nothing yet stops it recurring in 2027.

Measured against production 2026-09-20, before the repair:

| season_year | esbid | `detail_v1_game_id` | `nfl_plays` rows |
| --- | --- | --- | --- |
| 2021 | 2021080551 | absent | 163 |
| 2022 | 2022080451 | absent | 187 |
| 2023 | 2023080351 | absent | 181 |
| 2024 | 2024080151 | **absent** | **0** |
| 2025 | 2025073151 | **absent** | **0** |
| 2026 | 2026080651 | present | 194 |

2021-2023 lack the id too and still have plays, because they were imported before that column was the key — so the id's absence only became fatal once `import-plays-nfl-v1` became the preseason path.

## Why it stayed broken

**`detail_v1_game_id` is not a distinct value — it equals `shield_game_id` in all 666 populated rows across 2024-2026, with zero exceptions.** So the id was always derivable and nothing was waiting on the vendor. `import-nfl-games-nfl` sets it from the feed's `item.id`, and re-running that script for the affected week picked it up immediately.

**The reason nothing retried it is the schedule.** The preseason arm of `import-plays-nfl-v1` runs only in months 7 and 8 (`crontab-worker-1`). By September the window has closed, so a game missed during preseason stays missed until someone notices — and the only thing that noticed here was a charting row-count control two seasons later.

## What this task should establish

- **Why the id was absent at import time in 2024 and 2025 but present in 2026.** The feed served it on demand in 2026-09, so either the games importer never ran for week 0 in those years, or it ran before the feed published the id and nothing re-ran it. The `jobs` ledger for `import-nfl-games-nfl` around each Hall of Fame date is the discriminator.
- **Whether week 0 is covered by the preseason cron at all.** The guard in `import-nfl-games-nfl` already re-fetches a week when any game in it lacks `detail_v1_game_id`, which is the right behavior — so the question is whether anything invokes it for week 0 at a time when the id exists.
- **Whether a gate should refuse a FINAL game with zero plays.** This is the generalizable half. The defect was invisible for two seasons because nothing asserts that a game marked `FINAL` has plays; the check is cheap and would have caught both instances the week they happened. Scope it carefully — genuinely uncharted or unplayed games must not turn it red.

## Verify

A 2027 Hall of Fame game that lands with plays without anyone intervening, or a gate that goes red within a week if it does not.
