---
title: Reconcile cross-source rushing parity drift (Terrell Jennings 2025 REG)
type: task
status: completed
description: >-
  Confirmed gamelog (16) vs play-by-play (0) rushing-attempt drift for Terrell Jennings 2025 REG,
  caused by NULL bc_gsis on upstream pbp rush plays; not fixable by a process-plays re-run. Surfaced
  by ███████████████████████████ (signals #113255/#94546).
base_uri: user:task/league/reconcile-cross-source-rushing-parity-jennings-2025.md
created_at: '2026-06-16T14:42:23.410Z'
entity_id: d65ec9d9-2957-4cd8-9f58-c2029dfe0759
finished_at: '2026-06-17T02:29:35.559Z'
observations:
  - ████████████████████████████████████████████████
  - ████████████████████████████████████████████████
  - ████████████████████████████████████████████████
  - ████████████████████████████████████████████████
owner_identity_uri: █████████████████████████
priority: Medium
public_read: true
tags:
  - user:tag/league-xo-football.md
  - user:tag/homelab.md
updated_at: '2026-11-06T00:03:30.713Z'
visibility_analyzed_at: '2026-11-06T00:17:59.121Z'
---

Reconcile a confirmed cross-source rushing-parity drift surfaced by the every-6h `███████████████████████████` job (signals #113255, #94546; same drift previously tracked as #4684).

## Confirmed drift (queried 2026-06-16)

Single player breaches the `ABS(plays_rush - gamelog_ra) >= 5` threshold:

- Player: **Terrell Jennings** (`TERR-JENN-2024-2001-03-01`, RB), 2025 REG
- gamelog side: `SUM(player_gamelogs.ra) = 16` across 4 games (NE, weeks 8/9/10/12: ra 2/9/4/1)
- plays side: `COUNT(*) FROM nfl_plays WHERE play_type='RUSH' AND bc_pid='TERR-JENN-...' = 0`
- diff: gamelog_excess = 16, plays_excess = 0 (i.e. plays < gamelog)

## Root cause (not a simple bc_pid resolution gap)

The doc's standard "plays < gamelog" remediation (re-run `scripts/process-plays.mjs --year 2025 --seas-type REG` to re-resolve `bc_pid`) will NOT fix this, because his rush plays are absent from `nfl_plays` under his identifiers entirely:

- Zero rows in `nfl_plays` 2025 REG RUSH with `bc_gsis='00-0039757'` OR `bc_pid='TERR-JENN-...'`.
- His rushes live in `nfl_plays` as rows with **`bc_gsis IS NULL`** — the upstream nflverse pbp feed did not populate the ball-carrier gsis on those plays. Week 9 (esbid 2025110204) alone has 11 RUSH plays with `bc_gsis IS NULL` vs his 9 gamelog rushes; across his 4 games there are 18 NULL-`bc_gsis` RUSH plays.
- Because `bc_gsis` is NULL, gsis-keyed enrichment can never resolve `bc_pid` for them, so the play-by-play rushing count is structurally 0 for this player.

Note the direction has flipped vs the `2be33c98`-era example in the scheduled-command doc (then: 21 plays / 0 gamelog after gsisid was missing on the player row; now: 0 plays / 16 gamelog after gsisid was backfilled, exposing the NULL-`bc_gsis` source gap on the plays side).

## Remediation options to evaluate

1. Backfill `bc_gsis`/`bc_pid` on the NULL-ball-carrier RUSH plays via an alternate signal (play description text, jersey + team-week roster, or a secondary pbp source such as sportradar — see [[user:task/league/import-sportradar-play-by-play-data.md]]).
2. Add a name/jersey-based fallback to `process-plays.mjs` for rows where the source omits `bc_gsis`.
3. If the source gap is irreducible, document the accepted residual and consider excluding source-NULL-ball-carrier plays from the parity oracle so it does not page on upstream feed omissions.

## Scope note

The `███████████████████████████` oracle is functioning correctly — it is surfacing a real data-quality discrepancy, not a job error. This is independent of the offseason NFL coach/player import failures resolved alongside it (league commit c0ead5f6); the dispatch's "downstream of missing NFL data" hypothesis was disproven (this is completed-2025-season play-by-play vs gamelog data).

## References

- [[██████████████-████████████████████-█████-██████-███████████]]
- [[user:text/league/data-quality-and-validation.md]]
- [[user:task/league/import-sportradar-play-by-play-data.md]]
