---
title: Decide whether game totals carry a selection read
type: task
status: completed
description: >-
  Game totals have no pid or team, so the read-key fold gives them no selection read and no
  miss-mechanism judgment. Decide whether they should carry one, and document the answer.
base_uri: user:task/league/decide-read-key-for-game-totals.md
created_at: '2026-10-20T14:56:18.614Z'
entity_id: 15cf616a-3ebe-4c9e-b186-63a67c3afbaf
finished_at: '2026-10-20T15:40:08.088Z'
owner_identity_uri: █████████████████████████
priority: Low
public_read: true
relations:
  - relates [[█████████████████████-████-███████-███-███████████████-██-█████-████████]]
started_at: '2026-10-20T15:24:16.937Z'
tags:
  - user:tag/league-xo-football.md
  - user:tag/nfl-betting.md
updated_at: '2026-10-20T15:40:08.088Z'
visibility_analyzed_at: '2026-11-06T00:17:47.938Z'
---

# Decide whether game totals carry a selection read

`fold_selection_read_key` in `cli/nfl/publish-betting-selection-reads.py` keys a read on a pid or a team. A game total (`GAME_MATCHUP_TOTAL`) has neither, so it gets no `betting_selection_reads` row and no `miss_mechanism_judgment`. In week 6, 8 of 239 lost taken selections were game totals and went unjudged. Found on [[█████████████████████-████-███████-███-███████████████-██-█████-████████]].

The gap is undocumented in [[user:text/nfl/nfl-betting/method/betting-outcome-grading.md]], the review workflow, the judgment-store doc and the fold spec.

Open question for the operator: should a game total carry a read (for example, keyed on the game with an empty subject), or are game totals out of scope for the judged layer? Either answer ends with the docs naming it.

## Ruling

Operator 2026-10-20: yes. A matchup market with a side keys on the game alone (`esbid|GAME_MATCHUP_TOTAL|||<side>|<line>`). Every other market still needs a pid or a team, so a moneyline with no team and a player market with no pid stay unkeyed.

## Plan

- [x] **Fold**: `libs-shared/fold-selection-read-key.mjs` keys a `*_MATCHUP_*` market with a side and no subject. Verify: the fold spec covers a game total and an unkeyable sideless moneyline (league c4964a0a9).
- [x] **Constraint**: `betting_selection_reads_one_subject` is replaced by `betting_selection_reads_subject`, applied to league_production by a private ad hoc DDL file.
- [x] **Publisher**: `cli/nfl/publish-betting-selection-reads.py` no longer drops selection rulings without a pid, and reads a team code in pid as the team. Verify: week 6 went from 60 to 66 reads (two game totals, four team totals), and a re-run writes 0.
- [x] **Docs**: the fold module comment and [[█████████████████-████-█████████-███████████]] name the game-total key.
- [x] **Deploy**: `yarn deploy:all` at league ddbd28476, a 10-commit range including a cleared sibling classifier merge. Verify: both hosts and the served bundle at ddbd28476; the deployed fold resolves both week 6 game-total legs (`2026101801` and `2026101811`, under) to stored reads. Their judged field stays empty until the week 6 review files game-total judgments.
