---
title: Coin the period-scoped game line constants
type: task
status: cancelled
description: >-
  Six quarter spread and total constants, a three-way period winner and a period touchdown scorer do
  not exist, so period markets across several books classify null.
base_uri: user:task/league/coin-period-scoped-game-line-constants.md
created_at: '2026-09-16T18:20:14.368Z'
entity_id: 05169ba7-2850-48f6-85cd-1293f70fb5ac
finished_at: '2026-09-16T18:24:51.090Z'
owner_identity_uri: █████████████████████████
priority: Medium
public_read: true
tags:
  - user:tag/league-xo-football.md
updated_at: '2026-09-16T18:24:51.090Z'
visibility_analyzed_at: '2026-11-05T23:48:33.623Z'
---

**CANCELLED 2026-09-16 as a duplicate. Superseded by [[████████████████████-██████-██████-█████████-██████-████████]]**, which already owns this family and absorbed the fleet's other period-scoped constant gaps the same day, explicitly so one decision would not be split across two tasks. That task is the superset and the better measurement: where this one named six absences it names nine, because the ALT spread and total pair exists for the second and third quarters but not the fourth. FanDuel's exposure is already recorded there.

Nothing below was acted on. It is kept only as the record of what this session measured.

Several books post period-scoped game lines that no constant describes, so they classify null and become unreachable by every data-view betting column. This is cross-book and blocks at least FanDuel today; the same slugs exist on other boards, so the population should be measured across books before anything is coined.

## What is missing, verified against the full enumeration

Checked by enumerating every constant in `libs-shared/bookmaker-constants.mjs` and grepping that list, with known-positive controls — not by probing guessed names, which is how an earlier report of four "missing" defensive constants turned out to be four fictional spellings.

**Quarter spread and total, six constants.** `GAME_MATCHUP_FIRST_QUARTER_SPREAD` and `_TOTAL` exist. The 2nd, 3rd and 4th quarter equivalents do not — though `GAME_MATCHUP_FIRST_QUARTER_MONEYLINE` and `GAME_MATCHUP_FOURTH_QUARTER_MONEYLINE` both do, so the gap is spread and total only.

**A three-way period winner.** Nothing in the constants matches `THREE_WAY` at all. FanDuel posts five such keys — `1ST_HALF_WINNER_THREE_WAY` and one per quarter. The two-way moneyline is NOT a substitute: it has no tie outcome, and the tie is the whole reason the book prices a third way.

**A period touchdown scorer.** Nothing matches a quarter or half touchdown scorer. This strands the six `ANYTIME_{1ST,2ND,3RD,4TH}_{HALF,QTR}_TD_SCORER` keys and the 3rd and 4th quarter touchdown yes/no markets.

## Why this needs an owner above a single book

Coining a shared constant is not one book's call, and two of the three groups have a modelling decision attached rather than just a name:

- A three-way winner needs a selection vocabulary that admits the tie. The existing moneyline shape does not.
- A period touchdown scorer has to settle from `nfl_plays` with a `quarter_filter`, the way the quarter yardage types do — so the settlement mapping lands in the same change.
- Whether the quarter spread and total inherit the first-quarter mappings wholesale, or need their own `quarter_filter`, is a settlement question, not a naming one.

## Measure before coining

FanDuel is the book that surfaced these, and its exposure is recorded in `is_recognized_fanduel_market` where each group is declared exotic with the missing constant named. But FanDuel is not the whole population. Survey every book's unresolved keys for the same products first, so the constants are shaped by what the market actually posts rather than by one board's spelling.

## Plan

- [ ] Measure the cross-book population for each of the three groups
- [ ] Rule on the three-way selection vocabulary, which is the one with no existing precedent
- [ ] Coin the constants in `libs-shared/bookmaker-constants.mjs`
- [ ] Add the settlement mappings, including the `quarter_filter` for anything play-derived
- [ ] Notify each book's lane so they can map their keys and REMOVE the now-stale declared-exotic entries

## The obligation this creates downstream

Every entry declared exotic against a missing constant is an ASSERTION, and it should leave its allow-list the day the constant lands. FanDuel's entries name these groups explicitly for that reason.
