---
title: Adjudicate the plays whose whole yard-line trio is wrong
type: task
status: planned
description: >-
  282 nfl_plays rows carry a yard_line_number disagreeing with the number inside their own
  yard_line_start, 104 in 2002 and 171 in 2003. All four field-position columns agree and all four
  are wrong, so the trio-agreement check cannot see them.
base_uri: user:task/league/adjudicate-self-consistent-wrong-yard-lines.md
created_at: '2026-09-26T01:12:41.712Z'
entity_id: 7a8db870-371e-4b6c-a644-05ed4c574d99
owner_identity_uri: █████████████████████████
priority: Medium
public_read: true
relations:
  - relates [[user:task/league/repair-contradicted-yard-line-100.md]]
  - relates [[user:task/league/repair-is-goal-to-go-play-flag.md]]
tags:
  - user:tag/league-xo-football.md
  - user:tag/software-task.md
updated_at: '2026-10-03T03:09:00.172Z'
visibility_analyzed_at: '2026-11-06T00:17:39.680Z'
---

## Overview

282 `nfl_plays` rows carry a `yard_line_number` that disagrees with the number
inside their own `yard_line_start`, concentrated at 104 in 2002 and 171 in 2003
with singles in 2016, 2020 and 2023. On these rows `yard_line_side`,
`yard_line_number`, `possession_nfl_team` and `yard_line_100` all agree with
each other and all four are wrong, so nothing on the row contradicts itself.

Surfaced 2026-09-25 while repairing the contradicted `yard_line_100` population
([[user:task/league/repair-contradicted-yard-line-100.md]]). That repair fixed
20,306 rows and registered `yard-line-100-trio-agreement` to hold them, and this
class is what that invariant is blind to **by construction** — it grades whether
the four columns agree, and here they do.

## Why this is not already covered

The predecessor `is_goal_to_go` repair flipped 13 rows in 2002-2004 from TRUE to
FALSE, correct as a projection of a corrupt yard line and wrong as a fact. The
handoff recorded that they would "resolve with the yard line repair". **They did
not**, and that is the reason this task exists: the contradiction invariant
cannot see a row whose columns agree, so the repair passed over them silently.

## The measurement

```sql
select season_year, count(*) as n
from nfl_plays
where yard_line_start ~ '^[A-Z]+ [0-9]+$'
  and yard_line_side is not null and yard_line_number is not null
  and nullif(split_part(yard_line_start,' ',2),'')::int <> yard_line_number
group by 1 order by 1;
```

**Do NOT widen this to the side.** About 5,000 rows a season have a
`yard_line_start` whose team abbreviation differs from `yard_line_side`, and
that is not a defect: `yard_line_start` preserves the raw feed alias (`HST`,
`STL`, `SD`) while `yard_line_side` is normalized. Only the NUMBER half is the
signal.

## The open question, which is the whole task

**Which column is authoritative has been established on exactly ONE row, not
across the population.** On esbid 2003082806 play 2034 three independent sources
agreed — `yard_line_start` read `JAX 40`, the description read "up the middle to
JAX 40 for no gain", and the following play sat at 2nd and 10 from JAX 40 — so
`yard_line_start` was right and the side/number pair was wrong. That row was
repaired individually, in
a private ad hoc DDL file,
because it turned the `goal-to-go-derivation-agreement` check red.

One row is not a population. Assume nothing about direction from it.

## Plan

- [ ] Build the neighbouring-play oracle and measure which column it backs —
      verify: for each of the 282, compare against the previous play's end
      position and the next play's start, and report the split three ways
      (`yard_line_start` right, side/number right, neither resolvable), with
      counts rather than an impression
- [ ] Settle the residue the neighbour oracle cannot reach using the play
      description — verify: the rows adjudicated by hand are listed individually
      with the description text that settles each, as the six touchdown rows
      below already are
- [ ] Repair the whole trio together, never one column — verify: the repair
      writes `yard_line_side`, `yard_line_number` and `yard_line_100` in one
      statement, and `yard-line-100-trio-agreement` is still green afterwards,
      because moving one column alone would CREATE the contradiction that check
      exists to catch
- [ ] Re-derive `is_goal_to_go` over the repaired rows and confirm the 13
      legacy flips come right — verify: `goal-to-go-derivation-agreement` reads
      0 findings with coverage trustworthy, via
      the private data-check reader for `goal-to-go-derivation-agreement`
- [ ] Decide whether this class earns its own registered check — verify: the
      decision is argued from whether a LIVE writer can still mint one, not from
      the population size; if no writer can, say so and skip the check

## A second oracle that already found six of them

An offensive touchdown's `yard_line_100` must equal its `yards_gained`. Six rows
in 2002-2003 fail it with the trio self-consistent, and each is independently
wrong:

| esbid | play_id | stored yard_line_100 | yards_gained | reading |
| --- | --- | --- | --- | --- |
| 2002102011 | 1572 | 6 | 2 | "A.Green up the middle for 2 yards, TOUCHDOWN" — the predecessor's own example |
| 2003082203 | 2691 | 29 | 37 | gained more than the distance to the goal |
| 2003082500 | 3883 | 4 | 5 | gained more than the distance to the goal |
| 2003092806 | 1723 | 2 | 1 | off by one |
| 2003100502 | 934 | 31 | 32 | gained more than the distance to the goal |
| 2003102612 | 909 | 4 | 7 | gained more than the distance to the goal |

Three of those gained MORE yards than the stored distance to the goal line,
which is physically impossible and is the cheapest tell in the class.

## Assumptions

- `yard_line_start` is populated on effectively every row, so it is available as
  a candidate oracle across the whole population. Verified 2026-09-25: it is
  present on all 10,415 rows of the original contradicted population.
- No live writer is minting new instances. NOT verified — the last plan step
  exists to settle it, and if it turns out false the writer fix precedes the
  data repair.
