---
title: Keep projection bias in simulated player draws
type: task
status: cancelled
description: >-
  Stop shifting each outcome-ratio grid to mean 1, so simulated players keep the mean error their
  projection size showed the season before; targets defenses, under-projected by 0.4-1.2 points a
  week since 2022.
base_uri: user:task/league/keep-projection-bias-in-simulated-player-draws.md
created_at: '2026-09-29T02:01:03.433Z'
entity_id: 478f6117-e39a-4f54-9b5d-aae74870d82a
finished_at: '2026-09-29T02:04:11.194Z'
observations:
  - ████████████████████████████████████████████████
  - ████████████████████████████████████████████████
owner_identity_uri: █████████████████████████
priority: Medium
public_read: true
tags:
  - user:tag/league-xo-football.md
updated_at: '2026-09-29T02:04:11.194Z'
visibility_analyzed_at: '2026-11-05T23:49:40.026Z'
---

## Objective

Stop the simulation recentring every projection bucket on its projection, so each player's draws keep the mean error his projection size showed the season before. The target is defenses, which league 1 starts under-projected by 0.4-1.2 points a week in every full season since 2022.

## Findings

Measured 2026-09-29 with the harness's `player_centre_by_position` (league `d3e65be1e`, seed 42, 2021-2026), and in the ratio fit's own population.

- **Offensive starters are already centred.** From 2023, QB, RB, WR and TE are each within 0.4 points a week. The 2021-2022 over-projection (QB -1.3, WR -1.0, K -1.4) is history.
- **Defense projections are compressed, and stably so.** Among all projected defenses, the top third scores 17-28% above projection in every season 2021-2025, and the bottom third 35-53% below.
- **The grid shift discards exactly that.** `build_outcome_ratio_grid` shifts each bucket's ratio quantiles so their mean under the sampler is 1. [[██████████████████████████-█████████-█████-██████-██-███████████]] chose that to keep the mean at the projection, and set mean bias aside as out of scope.
- **Offensive top tiers carry little bias, low tiers a lot** (RB bottom quarter 0.50-0.76). Nobody starts low tiers, so unshifting should move offense little.

## Design

Operator approved 2026-09-29.

- **Store each grid unshifted.** It is the bucket's interpolated empirical ratio quantiles, with mean equal to the prior season's bucket mean ratio. Remove the shift from `build_outcome_ratio_grid`; the sampler and loader are unchanged.
- **Measure before any production write.** Refitting a season rewrites `projection_outcome_ratio_quantiles`, and the live forecast reads 2025 at once, with no deploy. The prototype builds the unshifted grids in memory in a worktree and runs the harness seed-paired against master.
- **Gate:** Brier no worse than 0.2019; the defense centre error roughly halved; no position's centre error worse by more than about 0.3; team coverage within 0.01.
- **Consequence to accept:** a player's simulated mean no longer equals his displayed projection.
- **Knowledge Base Impact:** `docs/simulation-system.md` § Player Distributions (the shift sentence), [[user:text/league/simulation-calibration-baseline.md]] (new numbers and command). No scratch slug; one task.

## Plan

- [x] **Prototype in a worktree.** Unshift the grid; have the loader fit the prior season in memory rather than read the table. Verify: the in-memory fit reproduced every stored 2024 bucket median; the harness ran 2021-2026 with no failures.
- [x] **Harness gate, seed-paired against master.** Verify: the gate failed; numbers in the measurement observation.

The ship, refit, verification and docs steps were not taken, because the gate failed. The prototype branch was discarded.

## Result

Measured, not shipped. From 2023, where every prior-season fit is sound:

| Measure | Master | Unshifted |
| --- | --- | --- |
| Brier | 0.2128 | 0.2145 |
| DST centre error | +0.83 | +0.62 |
| QB centre error | -0.07 | +0.54 |
| WR centre error | -0.04 | +0.37 |
| Team z mean | 0.06 | 0.48 |

- **Defense barely moves.** The top buckets' prior-season mean does not carry to the defenses league 1 starts.
- **Offense gets worse.** The top offensive buckets swing a few percent from season to season, so the prior season's mean is noise rather than a correction.
- **2021 breaks.** It reads the 2020 fit, whose kicker (ratio 4.1) and defense (1.6) are corrupt, so kickers sit 9.8 points too high.
- **Centring on the projection stays.** A defense fix belongs in its projection, not the simulation.
