---
title: Generalize the game-matchup coverage oracle across books
type: task
status: planned
description: >-
  Move the Pinnacle import's board-coverage assertion into a shared home with the FanDuel and
  Caesars guards.
base_uri: user:task/league/generalize-coverage-oracle-across-books.md
created_at: '2026-10-05T14:44:54.756Z'
entity_id: 0b036a34-ec3c-462d-aa6d-7016d5a0da64
owner_identity_uri: █████████████████████████
public_read: true
tags:
  - user:tag/league-xo-football.md
updated_at: '2026-10-05T14:44:54.756Z'
visibility_analyzed_at: '2026-11-05T23:49:32.441Z'
---

# Generalize the game-matchup coverage oracle across books

## Plan

- [ ] Extract the shared coverage oracle into a single module used by the Pinnacle, FanDuel and Caesars imports.
- [ ] Port the Pinnacle `assert_board_coverage` reporting semantics (signal with duration_ms, offered vs covered counts) so the shared guard does not lose the pinnacle failure shapes.
- [ ] Update the three imports and their specs; remove the per-book duplicates.

## Context

Promoted out of [[██████████████████████-████████-████-██████-███████-████████████]] on close (2026-10-05). FanDuel and Caesars each grew their own coverage guard; Pinnacle's `assert_board_coverage` is the third. The match-rate analog was already unified into `libs-server/assert-prop-market-event-match-rate.mjs` — that same shared home (or a sibling) should absorb the board-coverage guards.
