---
title: Deploy the practice squad waiver auction hold
type: task
status: completed
description: >-
  Shipped commit c9f7db048, which holds practice squad waivers while a ████ ██████ ███████ runs.
  Deployed 2026-09-07 to both hosts as b688d5637 and verified by executing the gate against
  production.
base_uri: user:task/league/deploy-practice-squad-waiver-auction-hold.md
created_at: '2026-09-07T19:33:21.707Z'
entity_id: 045efe31-36f1-4895-8ca2-5a8a04d9b3eb
finished_at: '2026-09-07T20:02:54.165Z'
observations:
  - ████████████████████████████████████████████████
owner_identity_uri: █████████████████████████
priority: High
public_read: true
tags:
  - user:tag/league-xo-football.md
updated_at: '2026-09-07T20:11:27.255Z'
visibility_analyzed_at: '2026-11-06T00:17:48.658Z'
---

## Outcome

Deployed 2026-09-07. Both hosts (`league` and the worker host) moved to `b688d5637`, which closed the host split bulletin #722 had been tracking as a side effect.

The hold is verified by EXECUTING the deployed predicate against production rather than reading the source, and the reading is a discriminating pair rather than a single value:

```
league 1    in_progress=true   complete=false   -> practice waivers held
league 119  in_progress=true   complete=false   -> held
league 2    in_progress=false  complete=true    -> unaffected
```

League 2 is the control. Without it, `in_progress=true` on the two live leagues is equally consistent with a gate that always holds, which would have silently stopped every other league's practice waivers.

## What shipped

`c9f7db048` holds practice squad waivers per-league while `is_auction_in_progress`, on both doors into the write — the bulk loop and the single-waiver path — and carves the hold out of both shortfall oracles so a held waiver does not read as a pipeline break. It also carries `db/adhoc/2026-09-07-reverse-practice-squad-waiver-awarded-mid-auction.sql`, which reversed the award that exposed the gap.

## Two things the plan assumed that turned out otherwise

**The wait was the wrong call and the operator was right to challenge it.** The plan gated the deploy on league 1's auction completing, on the reasoning that the next awarding waiver run was after the period closed anyway. That reasoning held, but it argued only that the deploy was not urgent — not that it should wait. Three things argued the other way and the plan missed them: bulletin #723's forbidden window was ~22:12Z to completion, so the pre-22:12Z window was the sanctioned time to ship; the commit range only grows, making a later deploy strictly harder to clear; and the `base after` gate depended on the schedule-processor being alive at 02:05Z, trading a small known risk for a silent one.

**The range grew twice during the clearance conversation**, from 3 to 4 to 8, exactly as `docs/guides/ship.md` warns. The operator cleared it at 8. This is the concrete case for that paragraph: re-read the list after clearance rather than reusing the number you asked about.
