---
title: Reconcile is_fumble against the play description
type: task
status: completed
description: >-
  is_fumble reads false or null on about 5 percent of plays whose description says a player fumbles,
  steady across every season since 2020 rather than confined to one writer window.
base_uri: user:task/league/reconcile-is-fumble-against-play-description.md
created_at: '2026-09-23T05:47:26.892Z'
entity_id: f493140a-45a2-41e7-ad89-f41fccd64334
finished_at: '2026-09-30T17:27:08.101Z'
observations:
  - ████████████████████████████████████████████████
  - ████████████████████████████████████████████████
  - ████████████████████████████████████████████████
  - ████████████████████████████████████████████████
  - ████████████████████████████████████████████████
owner_identity_uri: █████████████████████████
priority: Medium
public_read: true
started_at: '2026-09-30T16:05:51.063Z'
tags:
  - user:tag/league-xo-football.md
  - user:tag/software-task.md
updated_at: '2026-11-06T00:03:15.471Z'
visibility_analyzed_at: '2026-11-06T00:17:59.508Z'
---

## Outcome

`is_fumble` is correct as stored, so no row was changed. The "flag missing" population was a misreading of the play description.

- **The column's definition:** GSIS minted stat 52, 53 or 54 on the play (`libs-shared/get-play-from-play-stats.mjs`, terminal authority, false when absent).
- **The 218 plays since 2020** whose description says FUMBLES with a false flag are all replay reversals. The description narrates the overturned ruling before REVERSED, and none of those plays keeps a valid GSIS fumble stat. On the 127 reversed plays where the restated play still fumbles, the flag is true on all 127.

## What was actually wrong, and was fixed

- **Sportradar mapper:** it read a play's whole `details` narrative, including the pre-review ruling, so overturned fumbles and sacks kept their forcer, recoverer and sacker. Fixed in league `3b0701633` by `get_details_as_ruled`. Penalty and pass direction still read the full narrative, because the restatement often omits them.
- **Stored rows:** repaired by three applied private adhoc files dated 2026-09-30:
  - `clear-participant-slots-overturned-by-replay`
  - `correct-2024-forcers-credited-to-the-fumbler`
  - `clear-2024-overturned-forcers-naming-the-fumbler`
- **Leftover from the earlier forcer fix:** 2024 still credited 75 forced fumbles to the player who fumbled, because the `players[0]` fix was only re-imported for 2025-2026. These were corrected against GSIS stat 91.
- **Gamelogs:** individual defensive gamelogs were regenerated for 2024-2026, including 2025 POST. Forced-fumble credits now match the play slots with 0 mismatches.
- **Containment sweep:** the fumble superset now admits penalty-nullified plays (league `00be31358`).

## Residue, owned elsewhere

- **Play-matching rows:** 3 recovery-slot rows on 2025 kickoffs and a timeout marker. Routed to [[██████████████████████-██████-██████-██████████]], along with the gamelog generator's same-name player misresolutions.
- **Two-point sack:** 1 sack on a 2025 two-point try is real. The sack superset simply does not admit CONV.
