League History audit package

Read-only research stage for #1329, 2026-10-21.
Nothing in MFL, production D1 or Discord was changed. Nothing was merged, deployed or published. Teams are named by owner and franchise id here, because some historical team and division names aren't fit for a shared page. The raw data is downloadable.
1 Inventory2 Layout3 Sources4 Confidence audit5 Playoff games6 Projections7 IDX8 Maddie Mondays9 Story leads10 Corrections

1. What League History is today

WhereWhat it showsSourceProblems found
Desktop History → Playoff BracketAny season's bracket, with a season picker/api/playoff-bracket (D1 games + recorded seeds)Old formats (2010–2015 toilet, 2011–2013 conferences) are listed by week rather than drawn as a bracket. This is correct since #1334.
Desktop → Draft Order FinishFinish → rookie pick/api/playoff-bracketThe stored finishes are wrong in 2011, 2015 and 2023.
Desktop → Hall of ChampionsChampion cards, IDX, stories/api/hall-of-champions; the stories are hard-coded
  • A fallback "highest-scoring final game" guess.
  • The seed is a heuristic.
  • IDX is wrong for 2011 (section 7).
  • Stories are marked "Draft content".
Desktop → Historical FinishesA season × team grid of finishes, by owner or by franchise slot/api/historical-finishes (D1 final standings)
  • Same stored errors as Draft Order Finish.
  • The franchise grouping puts 2010 under 2011 ids (identity 7a is open).
Desktop → 3-Year ErasOwner totals by realignment cycle, with stories/api/erasCode bug: counts Hawk Tuah wins as finish 12, but the title is finish 7. Stories are hard-coded, some "per Keith's recollection".
Desktop → Division Power RankingsDivision strength by season/api/division-power-rankings2012 marks the wrong Division 00 leader (it skips the H2H tiebreak), and 2010 uses D1's 4 divisions.
Phone → League → Standings (any finished year)Final standings, trophies, playoffs, Tale of the Tape/api/historical-finishes, champions_panels.json (built 2026-02-16 from the legacy DB), h2h_history.jsonThe phone has no History area. Its trophies come from a separate stale file.
UPS WireH2H series, record book, owner careers, the Survival lineD1 tables directly (HeadToHead, record_book, season_history, ups_owner_career_stats)
  • There's no shared contract with Standings (section 9).
  • Owner career stats have been blank since 10-13 (#1335).

Missing everywhere: an owner page, head-to-head game lists, records with sources, and any per-season confidence. The only flag today is one yellow banner on every past year.

2. Proposed layout (information architecture)

History becomes one area with seven sub-views, the same on desktop and phone. The default is Seasons.

  1. Seasons, one page per season:
    • the UPS champion and runner-up, and the Hawk Tuah Bowl champion and finalist
    • final standings 1–12, with seed, division title, record, All-Play, Points For and the rookie pick it earned
    • both brackets with real scores
    • a status chip on every fact, and a "How we know" panel listing the sources and every discrepancy
    It replaces today's Playoff Bracket, Draft Order Finish and Historical Finishes.
  2. Champions: the Hall of Champions list. IDX is renamed "Scoring vs league" (section 7). The stories stay behind the review banner until checked.
  3. Owners: one page per person: titles, finals, playoffs, division titles, Hawk Tuah titles and every season. The identity questions (7a–7e) show as Provisional until you rule.
  4. Head to head: owner v owner. Records are shown for every season; games are listed only where MFL kept them (2012 and 2020 on).
  5. Records: league records, each with its season, its source and a status. A record built on a Provisional season says so.
  6. Divisions: names and members each season, division titles, and division strength over equal-week samples (section 8). It replaces Division Power Rankings and absorbs Eras.
  7. Draft order: each season's finish → pick table. It's on desktop only; the phone shows the pick on Seasons.

The rule on screen: every fact carries its status. Facts with a Conflict or Unknown status are shown as such, never as a plain number. Stories and records only use Verified or Reconciled facts (section 9).

Desktop wireframe: History, Seasons

Desktop: History → Seasons (wireframe; chips: V Verified, R Reconciled).

Desktop wireframe: Owners

Desktop: History → Owners.

Phone wireframe: History, Seasons

Phone: League → History → Seasons.

3. Source hierarchy

  1. MFL's archived exports for that season's own league: playoff brackets and placement games, leagueStandings records, divisions and names, and the schedule and weekly results where they were kept.
    • This is the authority for what happened.
    • League ids: 2010 60671 · 2011 40832 · 2012 37227 · 2013 42721 · 2014 30590 · 2015 29015 · 2016 27191 · 2017 on 74598.
  2. Canon (docs/league_context_v1.md): the authority for rules, such as finish → pick (§A1) and seeding (§F.1). Today's rules are never applied backward to a finished season.
  3. Your approved rulings: the corrections overlay (canon §E). This is the only way a judgment call or identity decision changes a stored value.
  4. D1 src_* tables: the stored copy the screens serve. They're checked against tier 1 and never edited directly.
  5. The pick-trade replay and the legacy local database: corroboration only.
  6. Stories, the forum, Discord and recollection: never a source for a fact, and they can't raise a status.
Statuses No percentages.

4. Season-by-season confidence audit, 2010–2025

SeasonUPS champion + runner-upHawk Tuah champion + finalistFinishes 1–12Playoff seedsDivision winnersFinish → draft pickBracket teams + scores
2010VPPVRUV
2011VRRVRVV
2012VVVVRVV
2013VVVPRVV
2014VVVVVCV
2015VRRVVVV
2016VVVVRVV
2017VVVVRVV
2018VVVVRVV
2019VVVVVVV
2020VVVVVVV
2021VVVVVVV
2022VVVVVVV
2023VVRRVVV
2024VVVVVVV
2025VVVVVUR
2026In progress: not a finished season (Standings and Forecast own it)

Tap a season for each fact's status, what disagrees and the sources.

2010 · league 60671 · Reconciled
2011 · league 40832 · Reconciled
2012 · league 37227 · Reconciled
2013 · league 42721 · Reconciled
2014 · league 30590 · Conflict
2015 · league 29015 · Reconciled
2016 · league 27191 · Reconciled
2017 · league 74598 · Reconciled
2018 · league 74598 · Reconciled
2019 · league 74598 · Verified
2020 · league 74598 · Verified
2021 · league 74598 · Verified
2022 · league 74598 · Verified
2023 · league 74598 · Reconciled
2024 · league 74598 · Verified
2025 · league 74598 · Reconciled

5. Playoff-matchup data by season

Every season keeps its playoff games with teams and scores in MFL's brackets and in D1, and they match.

SeasonBracket gamesBrackets (games)Regular-season games listedStatus
201010UPS BOWL I 5, Toilet Bowl 5No (MFL kept records only)V
201114Primetime Conference Championship 2, Juice Conference Championship 2, Toilet Bowl Championship 3, Toilet Bowl Semi-Finals 3, # 7 Pick 1, Championship 1, UPS 3rd Place Game 1, 5th Pick 1No (MFL kept records only)V
201214Primetime Conference Championship 2, Juice Conference Championship 2, Toilet Bowl Championship 3, Toilet Bowl Semi-Finals 3, # 7 Pick 1, Championship 1, UPS 3rd Place Game 1, 5th Pick 1Yes, 156 gamesV
201314Primetime Conference Championship 2, Juice Conference Championship 2, Toilet Bowl Championship 3, Toilet Bowl Semi-Finals 3, # 7 Pick 1, Championship 1, UPS 3rd Place Game 1, 5th Pick 1No (MFL kept records only)V
201414UPS Championship 5, Toilet Bowl Championship 3, Toilet Bowl Semi-Finals 3, # 7 Pick 1, 3rd Place Game 1, 3rd Place Game 1No (MFL kept records only)V
201514UPS Championship 5, Toilet Bowl Championship 3, Toilet Bowl Semi-Finals 3, # 7 Pick 1, 3rd Place Game 1, 3rd Place Game 1No (MFL kept records only)V
201614UPS Championship 5, Toilet Bowl Championship 5, 5th/6th Place Game 1, 11th/12th Place Game 1, 3rd Place Game 1, 3rd Place Game 1No (MFL kept records only)V
201714UPS Championship 5, Toilet Bowl Championship 5, 5th/6th Place Game 1, 11th/12th Place Game 1, 3rd Place Game 1, 3rd Place Game 1No (MFL kept records only)V
201814UPS Championship 5, Toilet Bowl Championship 5, 5th/6th Place Game 1, 11th/12th Place Game 1, 3rd Place Game 1, 3rd Place Game 1No (MFL kept records only)V
201914UPS Championship 5, Toilet Bowl Championship 5, 5th/6th Place Game 1, 11th/12th Place Game 1, 3rd Place Game 1, 3rd Place Game 1No (MFL kept records only)V
202014UPS Championship 5, Toilet Bowl Championship 5, 7/8 Game 1, Hawks Bowl 1, 3rd Place Game 1, 3rd Place Game 1Yes, 156 gamesV
202114UPS Championship 5, Toilet Bowl Championship 5, 7/8 Game 1, Hawks Bowl 1, 3rd Place Game 1, 3rd Place Game 1Yes, 222 gamesV
202214UPS Championship 5, Toilet Bowl Championship 5, 7/8 Game 1, Hawks Bowl 1, 3rd Place Game 1, 3rd Place Game 1Yes, 222 gamesV
202314UPS Championship 5, Toilet Bowl Championship 5, 7/8 Game 1, Hawks Bowl 1, 3rd Place Game 1, 3rd Place Game 1Yes, 222 gamesV
202414UPS Championship 5, Toilet Bowl Championship 5, 7/8 Game 1, Hawks Bowl 1, 3rd Place Game 1, 3rd Place Game 1Yes, 222 gamesV
202514UPS Championship 5, Toilet Bowl Championship 5, 7/8 Game 1, Hawks Bowl 1, 3rd Place Game 1, 3rd Place Game 1Yes, 222 gamesR

6. Genuine pregame projections

2010–2025: none.

2026, Weeks 1–6: ups_player_projections (MFL projectedScores).

WeekRowsFirst capture pregameFirst capture after kickoffLatest value after kickoffMain capture timeFrozen file
11502142781066Sun Aug 02 00:59Z (1347), Fri Sep 04 16:13Z (57)Yes
211211034751047Fri Sep 18 16:17Z (1104), Wed Sep 23 15:50Z (10)No
311181033741019Fri Sep 25 17:02Z (1113), Sun Sep 27 18:52Z (5)Yes
411061012841037Fri Oct 02 17:47Z (1089), Wed Oct 07 18:11Z (9)Yes
5103896269973Fri Oct 09 18:17Z (1027), Sun Oct 11 19:18Z (8)Yes
697689773919Fri Oct 16 16:30Z (957), Sun Oct 18 17:45Z (17)Yes

Recommendation: History and the Wire call a projection "pregame" only from a capture taken before that player's kickoff, and never from the latest value. Weeks without one say "no pregame projection kept".

7. IDX: plain English and a recommendation

What it is: on Hall of Champions, IDX is the champion's Points For divided by the league's average Points For that season.

What's wrong:

SeasonIDX today (rank)Regular-season weekly scores (rank)Shown asStatus
20101.127 (#6)1.150 (#5)+15%P
20111.179 (#1)1.130 (#6)+13%R
20121.090 (#10)1.090 (#10)+9%V
20131.154 (#5)1.154 (#4)+15%V
20141.155 (#4)1.155 (#3)+16%V
20151.034 (#15)1.034 (#15)+3%V
20161.163 (#2)1.163 (#1)+16%V
20171.156 (#3)1.156 (#2)+16%V
20181.103 (#7)1.103 (#7)+10%V
20191.083 (#11)1.083 (#11)+8%V
20201.092 (#8)1.092 (#8)+9%V
20211.091 (#9)1.091 (#9)+9%V
20221.030 (#16)1.030 (#16)+3%V
20231.067 (#14)1.067 (#14)+7%V
20241.081 (#12)1.081 (#12)+8%V
20251.079 (#13)1.079 (#13)+8%V

Recommendation:

8. Maddie Mondays, validated on equal weeks

The question: how does 2026 Maddie Mondays (Ryan Bousquet, Josh Martel, Keith Creelman) compare with every earlier division, over the same completed weeks (1–6)?

Lowest All-Play through Week 6

#SeasonDivisionOwnersAll-PlayPctScoring vs league
12026Maddie MondaysRyan Bousquet, Josh Martel, Keith Creelman67–1310.3380.918
22018MAKE IT RAINRyan Bousquet, Brian Cutting, John Richard, Jarrade Nieber68–1300.3430.935
32014DOG POUND 4 LIFEBrian Cutting, Shawn Blake, Eric Mannila69–1290.3480.884
42017DOG POUND 4 LIFEKeith Creelman, Bear Dunn, Eric Mannila69–1290.3480.926
52019LEGION OF BOOMMatt Gerardi, Steve Bousquet, Chris Klingenberg72–1260.3640.930
62016LEGION OF BOOMKris Lake, Kyle Creelman, Steve Bousquet73–1250.3690.929

Worst head to head against other divisions through Week 6

SeasonDivisionW–LPct
2021MAKE IT RAIN9–270.250
2024LEGION OF BOOM11–250.306
2022ICE UP SON!13–230.361
2025MAKE IT RAIN13–230.361
2026Maddie Mondays24–390.381
2023ICE UP SON!14–220.389

Division names and stored membership, by season

SeasonDivisions (MFL)D1 vs MFL
2010two divisions (names in MFL's 2010 archive)src_franchises wrong for 10; src_standings wrong for 0001, 0002, 0003, 0004, 0005, 0006, 0008, 0009, 0011, 0012R
2011Straight Cash Homey · The Ochocinco Show · Raytorious L52 · Dog Pound 4 Lifesrc_standings wrong for 0002, 0003, 0006R
2012Straight Cash Homey · The Ochocinco Show · Raytorious L52 · Dog Pound 4 Lifesrc_standings wrong for 0002R
2013Straight Cash Homey · The Ochocinco Show · Raytorious L52 · Dog Pound 4 Lifesrc_standings wrong for 0002R
2014ICE UP SON! · LEGION OF BOOM · MAKE IT RAIN · DOG POUND 4 LIFED1 = MFLV
2015ICE UP SON! · LEGION OF BOOM · MAKE IT RAIN · DOG POUND 4 LIFED1 = MFLV
2016ICE UP SON! · LEGION OF BOOM · MAKE IT RAIN · DOG POUND 4 LIFEdivision W-L stored 0–0R
2017ICE UP SON! · LEGION OF BOOM · MAKE IT RAIN · DOG POUND 4 LIFEdivision W-L stored 0–0R
2018ICE UP SON! · LEGION OF BOOM · MAKE IT RAIN · DOG POUND 4 LIFEdivision W-L stored 0–0R
2019ICE UP SON! · LEGION OF BOOM · MAKE IT RAIN · DOG POUND 4 LIFED1 = MFLV
2020ICE UP SON! · LEGION OF BOOM · MAKE IT RAIN · DOG POUND 4 LIFED1 = MFLV
2021ICE UP SON! · LEGION OF BOOM · MAKE IT RAIN · DOG POUND 4 LIFED1 = MFLV
2022ICE UP SON! · LEGION OF BOOM · MAKE IT RAIN · DOG POUND 4 LIFED1 = MFLV
2023ICE UP SON! · LEGION OF BOOM · MAKE IT RAIN · DOG POUND 4 LIFED1 = MFLV
2024ICE UP SON! · LEGION OF BOOM · MAKE IT RAIN · DOG POUND 4 LIFED1 = MFLV
2025ICE UP SON! · LEGION OF BOOM · MAKE IT RAIN · DOG POUND 4 LIFED1 = MFLV
2026Outlast PG Time · LEGION OF BOOM · Maddie Mondays · DOG POUND 4 LIFEnew owner-drafted alignmentV

9. Proposed shared UPS Wire story-lead contract

The problem today: the Wire computes history its own way, straight from D1 (H2H series, record book, Survival line), and Standings does it another way. Nothing marks a fact's confidence, and a lead can't say which season it left out.

Proposal: one module computes historical facts once, and both the Wire and History read them.

{
  "schema": "ups.history_lead.v1",
  "lead_id": "division-allplay-low-thru-wk06-2026-02",
  "kind": "division_through_week",          // also: first_since, streak, h2h_series, record, season_compare
  "subject": {"season": 2026, "division_id": "02", "owners": ["Ryan Bousquet", "Josh Martel", "Keith Creelman"]},
  "sample": {"weeks": [1, 6], "basis": "regular season", "through_week": 6},
  "population": {"what": "three-team division-seasons", "seasons": [2011, 2026], "n": 64,
                 "excluded": [{"season": 2010, "why": "two six-team divisions"}]},
  "facts": [
    {"key": "allplay", "value": [67, 131, 0], "rank": 1, "of": 64, "margin_to_next": 1,
     "status": "Verified",
     "sources": [{"name": "D1 src_franchise_weekly_score", "read_at": "2026-10-17T14:45Z"},
                 {"name": "MFL weeklyResults 2026 W1-6", "read_at": "2026-10-21T14:06Z"}]}
  ],
  "status": "Verified",                     // the lowest status of its facts
  "publishable": true,                      // Verified, or Reconciled with an approved correction
  "caveat": "Lowest by one All-Play win; a stat correction could tie it.",
  "generated_at": "2026-10-21T00:00:00Z", "code_sha": "…"
}

Rules:

  1. Numbers live only in facts. The editor writes the words; the Wire's existing check refuses digits in lead text.
  2. Conflict and Unknown are never publishable. Provisional appears in the editor box only, with its caveat. Reconciled is publishable only after its correction is approved.
  3. Every comparison names its population, its sample weeks and its exclusions. "Ever" may only be used when the population is every season.
  4. Game-level claims (series, streaks, "first time since") use only seasons with listed games: 2012 and 2020 on. Record-level claims may use every season.
  5. Owners are people, not franchise ids. Until identity 7a–7e are ruled, any claim touching those seasons is Provisional.
  6. The validator re-computes every fact from the sources before the UPS Center can publish, like today's Heat Check check.

10. Every proposed historical correction needing your approval

Nothing below has been written.

A. Settled by MFL's own record (decision 5)

#SeasonCorrectionEvidence
C12011Final and regular-season finish: Tom Roussin (0007) 8th (D1 11th); Keith Creelman (0008) 11th (D1 8th)MFL's toilet final and 11th/12th game; the 2012 draft (1.02 used by 0007)
C22015Finishes 7–10: Kris Lake (0003) 7th, Hawk Tuah champion (D1 6th); Bear Dunn (0009) 8th; Brian Cutting (0004) 9th; Chris Klingenberg (0012) 10thMFL toilet bracket; the 2016 draft (1.01 0003, 1.02 0009)
C32023Final finish: Eric Mannila (0011) 9th, Bear Dunn (0009) 10th (swapped in D1)MFL 3rd-place toilet game; the 2024 draft (1.03 0011)
C42023Seeds: Josh Martel (0007) 4, Ryan Bousquet (0001) 5 (swapped in D1)MFL bracket seeds
C52025Week 17 game scores in src_schedule: Cutting 233.7 → 233.2, Klingenberg 157.8 → 158.3, Dunn 195.4 → 196.4. No winner changes, and it ends the Standings Week 17 hold-back.MFL bracket = D1 weekly team scores (stat corrections)
C62010Divisions: MFL's two divisions replace D1's four (the division badge moves from 0012 to 0001)MFL 2010 league export
C72011–13Stored division in src_standings: 2011 0002, 0003, 0006; 2012 0002; 2013 0002MFL league exports (src_franchises is already right)
C82016–18Division W-L from MFL's divwlt (stored as 0–0)MFL leagueStandings
C92010H2H record without the playoff games mixed in (11 of 12 teams)MFL 2010 leagueStandings
C102011Points For as regular season only (it includes the playoffs today). This fixes IDX.MFL; D1 weekly scores
C112011–17Team names: 0008 2011–12 "Bad Newz Kennels"; 0002 2014–17 spelling; 0001 2011–13 capitalizationMFL league exports

B. Judgment calls (decision 6)

#SeasonQuestionRecommendation
J12010Hawk Tuah: the loser advanced. MFL titles Brian Grigas (0003); D1's 7th is Jessica Rubinow (0004).Follow MFL
J22010Places 3–6 had no gamesLabel them "not played, ordered by seed"
J32010MFL kept only a per-game Points For averageUse average × 13, labeled "reconstructed"
J42013A 6th/7th tie (two 6s stored)Josh Martel 6th, as MFL ordered it
J52014Regular-season 10th/11th (low confidence)Follow MFL's toilet seeds
J6 (new)2014Conflict 9th/10th:
  • MFL's toilet semifinal (Week 16: Kyle Creelman (0005) 179.4 beat Kris Lake (0003) 132.7) and D1 say 0005 9th.
  • The 2015 draft says the reverse: pick 2.03 came from 0003 and pick 5.04 from 0005.
Keep MFL's game result unless you recall the 2014 pick rule being different. Either way, mark it Conflict.

C. Still open from before

D. Code fixes (no history change; for the build stage)

Not verified: