---
title: Fill current_nfl_team for practice-squad players from nflverse
type: task
status: cancelled
description: >-
  Abandoned 2026-09-07: the operator ruled nflverse must not write current_nfl_team, so the 260
  PRACTICE_SQUAD rows keep an INA team rather than making the column a three-writer contest. Retains
  the measurement that nflverse knows the team for all of them, and why filling it was declined.
base_uri: user:task/league/fill-practice-squad-current-nfl-team-from-nflverse.md
created_at: '2026-09-07T00:50:55.106Z'
entity_id: 11b77011-165e-41cd-85b5-cf5d25737413
finished_at: '2026-09-07T01:28:59.322Z'
observations:
  - ████████████████████████████████████████████████
  - ████████████████████████████████████████████████
  - ████████████████████████████████████████████████
owner_identity_uri: █████████████████████████
priority: Medium
public_read: true
relations:
  - relates [[███████████████████████-████████-██████-██████-█████████]]
  - relates [[user:repository/active/league/ABOUT.md]]
tags:
  - user:tag/league-xo-football.md
updated_at: '2026-09-07T01:32:25.052Z'
visibility_analyzed_at: '2026-11-06T00:17:52.699Z'
---

## Overview

260 players now hold `roster_status='PRACTICE_SQUAD'` with `current_nfl_team='INA'` — a contradiction, because a practice-squad player is on some team's practice squad by definition. The roster_status half is correct and freshly protected by the axis rule (league `175e24b2a`); the team half is the stale one.

This is not the residual the original investigation described, and the difference decides the fix. That brief said "a teamless player is on nobody's practice squad, so nflverse is stale for them AND Sleeper's ACTIVE is wrong." Measured directly against the parquet on 2026-09-07, that is backwards.

## The measurement that inverted it

All 208 teamless practice-squad players in that day's flip set were matched in `players.parquet` by `gsis_id`:

| result | count |
| --- | --- |
| nflverse carries a real `latest_team` | 208 |
| nflverse also teamless | 0 |
| unmatched in the parquet | 0 |
| nflverse `status` | `DEV` for all 208 |

Sample: Adam Gotsis TB, Adrian Martinez SF, A.J. Woods ATL, Albert Okwuegbunam LV, Alex Huntley MIA — all `last_season` 2025.

So nflverse knows the team for every one of them. We throw it away.

## Why nothing else can fill it

`current_nfl_team` has two declared owners and neither can see a practice-squad player:

- **Sleeper** has no practice-squad concept at all. Over 90 days of `player_changelog` it has never once written a roster-axis value.
- **A data supplier's team-roster endpoint** returns 1691 players across 32 teams — 52.8 per team, which is the 53-man active roster. Practice squad is not in the payload.

And `import-players-nflverse.mjs` is forbidden from writing the column by an explicit scope decision on `████████████████████████████████████████████████████████`: "Sleeper/NFL.com already maintain current_nfl_team correctly per diagnostic." That premise is false for exactly this population, and it is the same shape of error as the "strictly additive" premise on the same task — a survey that checked one direction and not the other.

## What NOT to do

**Do not bulk-UPDATE these rows.** `libs-shared/is-reserve-eligible.mjs:144` returns eligible on `roster_status && roster_status !== ACTIVE`, so any mass rewrite of roster_status moves reserve eligibility for hundreds of rostered players mid-season. The defect here is the missing TEAM, not the status.

## Proposed fix — DECLINED, see Resolution

Let `import-players-nflverse.mjs` write `current_nfl_team`, narrowly:

- only when the stored value is the `'INA'` sentinel (fill a gap, never overwrite a team Sleeper or the data supplier set), and
- only when nflverse's status for that player maps to `PRACTICE_SQUAD`.

Under those two conditions the write cannot contend with either existing owner, which matters because `current_nfl_team` would become a three-writer column and that is precisely the shape that produced the roster_status defect. Make the authority explicit in `libs-server/update-player.mjs` the way `roster_status` now is, rather than letting it fall out of cron order.

**Open question for the operator:** the release path. When a player leaves a practice squad, nflverse moves them `DEV -> CUT` but the rule above would leave the stale practice-squad team behind, because it only fills and never clears. Either extend it to clear to `'INA'` on a `CUT`/`UNSIGNED_FREE_AGENT` mapping, or accept a bounded staleness. That decision should be made before writing code, not discovered afterward.

## The separate, larger population

4,720 rows hold `current_nfl_team='INA'` with `roster_status='ACTIVE'`, which is also self-contradictory. It is mostly historical debris rather than live churn:

| last NFL snap | rows |
| --- | --- |
| pre-2022 | 1,687 |
| 2022-2024 | 1,369 |
| never played | 909 |
| 2025-2026 | 755 |

No live importer can reach the older buckets: `import-players-nflverse.mjs` skips rows where `last_season < current_season.year - 1`, and that guard is correct — nflverse's status is stuck at `ACT` for long-retired players (Tom Brady still reads `ACT`). So these are unreachable by design and need a one-off adjudication with a stated rule, not a pipeline change. Treat as a separate piece of work; it shares only the symptom.

## Resolution

**Not doing this.** The operator ruled on 2026-09-07 that nflverse has no need to write `current_nfl_team`. The proposed fix above was this task's only implementation, so it closes unbuilt.

The ruling holds the line the wider investigation was about. `current_nfl_team` has two declared owners; the fix would have made it three, and a three-writer column whose authority falls out of cron order is exactly the shape that produced the `roster_status` defect. The narrow fill-only conditions would have contained that, but they also carried an unanswered release-path question — a rule that only ever fills leaves a stale practice-squad team behind when a player is cut. Accepting a known, bounded gap beats adding a writer plus a clearing rule to a column that is not currently contended.

What this leaves standing:

- 260 rows keep `roster_status='PRACTICE_SQUAD'` with `current_nfl_team='INA'`. The status half is correct and protected by the axis rule, and reserve eligibility is unaffected because it reads `roster_status` only.

  The gap is dormant rather than harmless, and an earlier draft of this section overstated that as "nothing is wrong downstream." Five sites exclude the `INA` sentinel — `player-cache.mjs:365,573`, `get-players.mjs:268`, `get-projections.mjs:42`, `get-season-projections.mjs:30` — so these players drop out of team-scoped surfaces rather than being merely mislabelled. Live exposure measured 2026-09-07 is **4** players on a 2026 fantasy roster, in a league whose rules make practice-squad players poachable. (A count of 24 circulated first; that is roster membership across all years and overstates it.)

  Whether that exclusion is actually wrong is a product question, not a data one, and it was not settled here.
- The separate 4,720-row `INA`+`ACTIVE` population is untouched and still unadjudicated. It was already scoped as its own work and this ruling does not decide it.

Reopen only if a consumer appears that genuinely needs a practice-squad player's team.
