---
title: Settle the rate denominator for charted from-plays columns
type: task
status: completed
description: >-
  Air yards per target divides charted air yards by all targets, so uncharted targets in a live week
  dilute the rate toward zero; decide whether charted-numerator rates divide by charted plays only
  or surface the coverage gap.
base_uri: user:task/league/data-views/settle-charted-column-rate-denominator.md
created_at: '2026-10-23T16:17:31.563Z'
entity_id: 7899e2a8-5d8e-41e2-967e-c4d8075530d6
finished_at: '2026-10-24T17:51:59.099Z'
observations:
  - ████████████████████████████████████████████████
  - ████████████████████████████████████████████████
  - ████████████████████████████████████████████████
  - ████████████████████████████████████████████████
owner_identity_uri: █████████████████████████
priority: Low
public_read: true
relations:
  - relates [[user:task/league/data-views/pair-player-from-plays-rate-populations.md]]
  - relates [[user:task/league/data-views/surface-rate-population-mismatch-notice.md]]
tags:
  - user:tag/league-xo-football.md
updated_at: '2026-10-24T17:51:59.099Z'
visibility_analyzed_at: '2026-11-05T23:49:01.094Z'
---

## Overview

- Air yards per target divides CHARTED air yards by ALL targets, in the dedicated column and in the `player_target` output period, so a target the charter has not reached dilutes the rate toward zero.
- Invisible in 2022-2025 (4 nulls in 68,422 targets); severe in a live week. 2026 week 2 ran 43.81 percent null, with a mean WR cell of 6.87 against a true aDOT of 12.37.
- The charting lag itself is fixed (league `9cbd79519`). The denominator convention is not, and it governs every share whose numerator reads a charted column.

## Plan

- [x] Enumerate the from-plays columns and rate periods whose numerator reads a charted column. Air yards is out: `depth_of_target` lands live since league `9cbd79519` (0 nulls on 2026 targets, including a two-day-old game). Nine player columns and two team columns read a field not filled on every play: drops, dropped passing and receiving yards (`is_dropped_pass`, 100 percent null on a two-day-old game), rush yards after contact, broken tackles, yards created, yards blocked, expected receiving yards and expected receptions. Their own built-in ratios already divide by the covered count. Only the output rate periods dilute.
- [x] Decide: surface the gap, keep the denominator fixed. Applied from the 2026-09-11 ruling (surface as a client notice, never a moving denominator) and the 2026-10-23 ruling (every rate denominator stays fixed). No new operator ruling was taken.
- [x] Implement and gate. These columns declare `partial_coverage_fields`, and the shared rate-population notice names them under any rate period. Shipped with [[user:task/league/data-views/surface-rate-population-mismatch-notice.md]] in league `1e88f9c33`. A drops-per-target case stands in for the uncharted-target fixture, because the notice reads the declaration, not the rows.

## Outcome

- Shipped in league `1e88f9c33`. Not deployed: deploys are operator-gated.
- No number moves. A rate over a partially covered column now carries a notice saying it reads low where coverage is partial.
