---
title: Absorb the remaining league oracles into the data-check registry
type: task
status: planned
description: >-
  Retire the five repo scripts, three storage-host scheduled-commands and one cluster gate that
  predate the registered data-check system, and author the checks named as registry requirements
  after the landing shipped.
base_uri: user:task/league/absorb-remaining-league-oracles-into-data-check-registry.md
created_at: '2026-09-02T02:03:29.868Z'
entity_id: ddd0fd8e-9f28-4b5d-b6f3-ec587d204e0b
owner_identity_uri: █████████████████████████
priority: Medium
public_read: true
relations:
  - succeeds [[████████████████████-██████████-████-█████-█████████]]
  - relates [[user:text/league/data-quality-and-validation.md]]
  - follows [[user:guideline/software/design-data-checks.md]]
tags:
  - user:tag/league-xo-football.md
  - user:tag/software-task.md
updated_at: '2026-09-02T02:03:45.619Z'
visibility_analyzed_at: '2026-11-06T00:17:37.896Z'
---

# Absorb the remaining league oracles into the data-check registry

## Overview

The registered data-check system landed, deployed and now runs weekly. What it did NOT do is retire the oracles that predate it: five repo scripts, three storage-host scheduled-commands and one cluster gate still carry their own cron line, job type and signal wiring, under three mutually incompatible finding dispositions.

This task carries the consolidation, which the landing task deliberately deferred as follow-up rather than scope. It also carries the checks that were named as registry requirements but arrived after the landing was verified.

Nothing here is blocking. The registry is healthy and every item below is additive.

## Background

The landing is canonical at [[████████████████████-██████████-████-█████-█████████]] and the design rules at [[user:guideline/software/design-data-checks.md]]. Neither is restated here.

The disposition split is the reason consolidation is worth doing rather than merely tidy. `audit-drive-seq-coherence` and `verify-format-data-coverage` signal AND throw, so a finding is a red run and the dedup key is message-derived — it moves every run and can never be resolved. The registry's convention is that a finding is never a red run and its key is pinned.

Two decisions from the landing that must not be re-litigated:

- **`audit-keeptradecut-liquidity-coverage` stays OUT.** It thresholds on a consecutive run of failing days, which is order-dependent where every registry check is order-independent, and it already reports through `report_job` — it is a job-outcome oracle, not a data check. Its silence is deliberate and documented in the file.
- **`audit-nfl-player-id-attribution` cannot become a check while it fetches.** It crawls the NFL.com listing live, which the never-fetch rule forbids. Move the crawl into an importer first; only then is its invariant registrable.

## Plan

### Migrations — an existing oracle becomes a registry row

- [ ] **Migrate `db/gates/check-conflated-player-rows.mjs`** as three rows plus its baseline, and drop its cluster manifest entry. The largest cleanup available, and it removes a standing cause of push deferral.
- [ ] **Resolve the conflated-identity double-grader**: one registered check carrying the gate's three falsifiers, with `scripts/audit-conflated-player-identity.mjs`'s demotion reasoning as calibration, then delete the script. Settle the `date_of_birth` disagreement explicitly — the two files contradict each other on whether it discriminates.
- [ ] **Migrate `audit-drive-seq-coherence` and `verify-format-data-coverage`.** Both were tested against the primitive during the landing and fit with no schema change.
- [ ] **Absorb `verify-named-format-catalog.mjs`**, whose findings currently reach nothing but a log file.
- [ ] **Absorb the four `cli/monitoring/check-league-*.sh` data checks** — sack attribution, role-pid residual, cross-source counters, lineage consistency. The largest consolidation by volume: about 500 lines of bash, four scheduled-command entities and four signal call sites become four registry rows. Lineage consistency needs its own cron line or a rebuild-recency precondition.
  - Update the Monitoring integration section of [[user:text/league/data-quality-and-validation.md]] as each lands; it names these as standing debt and points here.
- [ ] **Schedule `check-restricted-free-agency-salary-cap-violations.mjs`**, which has no cron line and reports under a borrowed job type.

### New checks named as registry requirements

- [ ] **Author `nfl-game-gamelog-coverage`** to own whole-game absence. The gamelog-agreement check compares game COUNTS in its precondition, so a week missing an entire game is reported un-gradeable rather than as a finding — invisible rather than merely un-graded. A presence question at `(season_year, week)` grain: games in `nfl_games` against games carrying any `player_gamelogs` row. Measure before setting the threshold; it may ship as `max_count: 0` with a small baseline.
- [ ] **Author the phantom-gamelog check**, adopting the two-oracle predicate and lineup-start guard from the `█████████████████████████████████` repair, and consuming [[███████████████████████-███████████-███████-███████]] for the deletion criterion. The rostered arm must never be automated without an independent guard proving no real fantasy history is at stake.
- [ ] **Re-land the four deferred checks** once their populations are stable: both derived-scoring orphan arms, `nfl-games-external-id-coverage` (needs an era precondition first), and `plays-possession-team-coherence`.

### Blocked, not scheduled here

- [ ] **Move the `audit-nfl-player-id-attribution.mjs` crawl into an importer** before its invariant can become a check. Blocked on that move, not on this task.

## Notes

- Shared working tree: explicit pathspecs on every git write, never a bare `add`/`reset`, never `--amend`.
- Each migration must close the retired oracle's signal keys BEFORE deleting its closer, or any row open at deletion becomes permanently un-closeable.
- A migrated check is not done until it has been shown to go red on a case known to be broken, and green on a clean one.
