---
title: Correct stale factual claims in league CLAUDE.md
type: task
status: completed
description: >-
  League CLAUDE.md cited already-fixed defects as live; seven were corrected and the file is now
  covered by a mechanical table.column gate. One reported correction was itself wrong and was
  reverted by a sibling session.
base_uri: user:task/league/correct-stale-claims-in-league-claude-md.md
created_at: '2026-08-05T23:28:38.894Z'
entity_id: a3ac3ca0-efdb-4ce7-b64d-1c30c5645d8c
finished_at: '2026-08-06T00:49:28.046Z'
observations:
  - ████████████████████████████████████████████████
  - ████████████████████████████████████████████████
  - ████████████████████████████████████████████████
  - ████████████████████████████████████████████████
  - ████████████████████████████████████████████████
  - ████████████████████████████████████████████████
  - ████████████████████████████████████████████████
  - ████████████████████████████████████████████████
  - ████████████████████████████████████████████████
owner_identity_uri: █████████████████████████
priority: Medium
public_read: true
relations:
  - relates [[███████████████████████-█████-██████-████████████████]]
  - relates [[█████████████████████-█████████████-██████-████████]]
tags:
  - user:tag/league-xo-football.md
updated_at: '2026-08-06T01:33:12.959Z'
visibility_analyzed_at: '2026-11-05T23:48:39.919Z'
---

## Overview

League `CLAUDE.md` is the most-read agent-facing surface in this repo — it loads on every session touching the league checkout. It carries factual claims about specific defects, cited as live, that have since been fixed. A session acting on them wastes time chasing dead premises, and worse, may "repair" something already correct.

Four were confirmed stale on 2026-08-05 by [[███████████████████████-█████-██████-████████████████]], which hit two of them directly and lost time to both:

1. **`scoring_format_player_seasonlogs.year` / `league_format_player_seasonlogs.year` "survive" while `player_seasonlogs.year` became `season_year`.** All three now carry `season_year` — the season_grain cluster conformed them. Cited as the worked example of an asymmetry a global rename would damage.
2. **"The entire `workflow/nfl/betting/` directory (8 files of SQL templates) is uniformly pre-conform and every literal query in it fails today."** It is conformed. Its SQL reads `season_year`; `{year}` appears only as a template parameter name.
3. **`████████████████████████████████████████████████` documents `--fname/--lname/--pos/--dob`.** It documents `--first-name/--last-name/--primary-position/--date-of-birth`, matching the script's actual yargs options.
4. **`█████████████████████████████████████████████` instructs a join against `nfl_games.start_time`.** No `start_time` reference exists anywhere in `guideline/nfl/`, `text/league/` or `workflow/nfl/`.

All four sit in the same cluster of paragraphs (the docs-sweep, out-of-repo-documentation, and prose-sweep-per-(table,column) sections). That four of the few claims one task happened to touch were stale is the reason to audit the rest rather than patch these four.

## The thing to get right

**The RULES are good; the INSTANCES rotted.** "Judge per `(table, column)`, never per column name" is correct and load-bearing, and it is exactly what kept the 2026-08-05 sweep from breaking things. Do not delete a rule because its illustration expired — re-ground it on an instance that is true today, or state the instance as dated history. `pff_player_seasonlogs.pff_id` surviving while `player.pff_id` did not was still true on 2026-08-05 and is a working replacement for claim 1.

Prefer the smallest edit that makes the text true. This file is enormous and heavily loaded; a rewrite is its own risk.

## Plan

- [x] Correct the four confirmed claims above, preserving the rule each one illustrates.
- [x] Audit the file's other verifiable factual claims — named columns, named tables, named files, named specs, cited commits. Found four more stale claims beyond the original four.
- [x] Where a claim is a dated incident report rather than a live defect, make that unambiguous in the text.
- [x] Note the general hazard once, near the top: a claim naming a specific column or file is a fact with a shelf life.
- [x] Answer whether this is mechanically checkable — YES, and it is now wired. See Outcome.

## Testing & Validation

- [x] For every claim changed, record how it was verified. 113 `table.column` pairs against live `information_schema`; 153 named paths plus every named gate script and spec against the filesystem; 29 cited commits against `git cat-file`.
- [x] Confirm no rule was lost: section list diffed before and after — one addition (the new hazard note), zero removals.

## Outcome

Seven stale claims corrected in `aeef10c92` — the four listed above plus three found by the wider audit. An eighth was reported and was WRONG in the other direction; see Correction below.

| Claim | Reality |
| --- | --- |
| `workflow/nfl/betting/` is 8 pre-conform files | 12 files, conformed: 41 `season_year`, zero `seas_type` |
| doc uses `--fname/--lname/--pos/--dob` | uses `--first-name/--last-name/--primary-position/--date-of-birth` |
| doc joins `nfl_games.start_time` | no `start_time` anywhere in the three trees |
| seasonlog `.year` columns survive | all three conformed to `season_year` |
| `player_gamelogs.active` | is `is_active` (`6ac331d4c`) |
| `player_gamelogs.pos` / `player_seasonlogs.pos` | both `player_position` |
| bare `rnk` column survives | only the suffix does (`points_rnk`, `pos_rnk`); task 174 stays live |

Rotted illustrations were reframed as dated history rather than deleted, since the rules they support are sound.

### Correction (2026-08-06)

The pass also reported an eighth claim — that the `api/routes/wagers.mjs` bare-`status` 42703 was already fixed in `23e73d14b`. That was wrong, and the original CLAUDE.md text calling the defect open was correct. `23e73d14b` edited the file in the same window for the timestamptz retype but never touched the predicate; `git show 23e73d14b:api/routes/wagers.mjs` still carries `whereIn('status', wager_status)`. The defect was live in production until `2f0ca9a0f` the next day, fixed by the `██████████████████████████████` session, which caught the bad attribution and corrected the line in `47203e200`.

The error's mechanism is the durable lesson, now recorded in CLAUDE.md: **`information_schema` verifies a column NAME and says nothing about whether a given commit fixed the code.** The name half was checked; the attribution half was inferred from `git log --oneline -- <file>` showing a plausible recent commit. An audit that mixes those two oracles marks live defects repaired at the same rate it corrects stale ones. The one-command check is `git show <hash> -- <file> | grep <the thing>`.

Re-verified the pass's two other hash attributions this way, both sound: `6ac331d4c` carries the literal `ALTER TABLE public.player_gamelogs RENAME COLUMN active TO is_active`, and `0d2af7fd4` performs the `market_value_at_trade` -> `keeptradecut_value_at_trade` rename. Count corrected to seven in `1c7b41fe4`.

**Mechanically checkable: yes, and now permanent.** [[█████████████████████-█████████████-██████-████████]] added league `CLAUDE.md` to its gate corpus. It declined an in-doc opt-out marker — an author must remember a marker at write time and nothing verifies they did — and adjudicates per site instead, in `db/adhoc/documentation-schema-drift-adjudications.json` keyed on `(path, table, column)`, where an adjudication that stops suppressing anything is itself a finding. 15 history pairs from this audit are encoded there (`a5dadbcd7`); the 16th, `view_trade_asset_flow.market_value_at_trade`, needs none because gate 1 skips views by design. That gate reads clean at `aeef10c92`, independently confirming the eight corrections.

## Follow-on: `.mocharc.yml` dead exclusion

The audit found `.mocharc.yml` ignoring `test/libs-server.get-players-table-view-results-debug.mjs`, a file that has never existed at any revision — added in `d468e3ca8` (2025-06-11), most likely a misremembering of the `get-players-table-view-results{,-2,-3}.mjs` family. It excluded nothing for fourteen months while reading as a deliberate exclusion.

Removed in `25514e990`, with `check-test-spec-collection.mjs` extended to fail on any literal `ignore` entry with no file behind it — the same staleness rule it already applied to its own `INTENTIONALLY_UNCOLLECTED` list. Globs are deliberately not judged. Collection is unchanged at 230 files / 229 collected, and all four negative controls pass.
