Front Office redesign · proof
#1338 · after a8ed2d00 vs main 6e485920 · recorded 2026-10-20 · deployed to this site and checked over HTTPS · checklist and links
Checklist, run on this site
| Step | Check | Chromium | WebKit |
|---|---|---|---|
| 1 Overview | cap: player salaries $286,000 + adjustments +$9,000 = $295,000 of $300,000; space $5,000 | pass | pass |
| 1 Overview | trade deadline: MFL stops trades Tue, Nov 24, 12:00 PM ET | pass | fail |
| 1 Overview | no Contracts ending this season card | pass | pass |
| 1 Overview | roster 30/30, taxi 3/10, 4 on IR | pass | pass |
| 1 Overview | Week 7 and Thursday's run Oct 22 9:00 AM ET | pass | pass |
| 1 Overview | needs attention: Wk 7 no K + DL; Wk 9 no P | pass | pass |
| 1 Overview | banner: missing 0 | pass | pass |
| 2 Bye planner from the Week 7 line | Bye planner is showing | pass | pass |
| 2 Bye planner from the Week 7 line | Wk 7: K 0/1, DL 1/2 | pass | pass |
| 2 Bye planner from the Week 7 line | Wk 9: P 0/1 | pass | pass |
| 2 Bye planner from the Week 7 line | free agents listed as options | pass | pass |
| 3 Players: Performance and Contract columns | Prescott 141.4 · 23.6 · #14 QB · @ PHI Mon 8:15 PM · 16.7 · bye 14 | pass | pass |
| 3 Players: Performance and Contract columns | Contract chip shows the contract table | pass | pass |
| 4 Brissett panel, Stats | This season 116.1 · 19.3 · #21 QB · last 4 21.5 | pass | pass |
| 4 Brissett panel, Stats | earlier seasons listed separately | pass | pass |
| 5 Actions: Drop is blocked | toast: Preview is read-only: nothing was sent. | pass | pass |
| 5 Actions: Drop is blocked | banner counted the blocked write | pass | pass |
| 6 Market | first row: Tre Tucker 13.9 · #25 WR · Claim now · Thu Oct 22 run | pass | pass |
| 6 Market | Waivers later: nobody waiting on a later run (recorded Tuesday), and the page says why | pass | pass |
| 6 Market | Bid in app stays in the preview | pass | pass |
| 7 Trades: finder and partners | matrix: 12 teams, your row first | pass | pass |
| 7 Trades: finder and partners | logical partner 1 = Pure Greatness, panel open | pass | pass |
| 7 Trades: finder and partners | trade-block note text is hidden in the preview | pass | pass |
| 8 Swap → War Room preloaded | War Room: Real Deal Creel vs Pure Greatness, both players selected | pass | pass |
| 8 Swap → War Room preloaded | offer send is blocked | pass | pass |
| 9 War Room from the Home button | same War Room page, empty builder | pass | pass |
| 10 Draft picks and Activity | 2027 grid R1–R5 (no R6) | pass | pass |
| 10 Draft picks and Activity | your R1 held by The Long Haulers; you hold HammerTime's R1 | pass | pass |
| 10 Draft picks and Activity | Activity: Fri, Oct 16 placed Will Shipley on IR | pass | pass |
| 11 1024 px: no sideways scroll on any tab | Overview, Roster, Bye, Market, Trades, Contracts, Picks, Activity at 1024 | pass | pass |
| 12 Before (main) for comparison | six ledger tabs, no Overview/Market/Trades | pass | pass |
| 12 Before (main) for comparison | Stats: database 2026 row (116 pts, 19.4) inside career totals | fail | pass |
Writes tried, on this site
Each attempt must fail before it leaves the page and raise the banner’s count by one. The browser harness also aborts any non-GET at the network layer: it saw 0.
| Attempt | Chromium | WebKit |
|---|---|---|
| fetch POST to the worker | blocked | blocked |
| fetch PUT to the worker | blocked | blocked |
| fetch PATCH to the worker | blocked | blocked |
| fetch DELETE via a Request object | blocked | blocked |
| fetch POST to MFL import | blocked | blocked |
| fetch GET to MFL import (MFL writes accept GET) | blocked | blocked |
| fetch POST to Discord | blocked | blocked |
| XHR POST | blocked | blocked |
| XHR GET to MFL import | blocked | blocked |
| sendBeacon | blocked | blocked |
| form POST submit | blocked | blocked |
| link to the live phone app does not navigate | blocked | blocked |
| War Room: offer POST | blocked | blocked |
| War Room: 3-way POST | blocked | blocked |
Reconciliation: what the new screens show vs MFL
Read from this build’s pages, then recomputed from MFL’s own recorded exports with exact arithmetic: points and PPG from playerScores W=ALL (Wks 1–6), the phone’s rank rule (3+ MFL weeks; ties → total points → id), projectedScores W=7, nflByeWeeks, futureDraftPicks, and the league’s waiver check for Status.
| Screen | Rows | Values | Result | Differences |
|---|---|---|---|---|
| Roster · Performance (Real Deal Creel) | 37 | 185 | 184 match | Brissett, Jacoby PPG: page 19.3, exact 19.4 |
| Market · Free agents (top 200) | 200 | 1200 | 1198 match | Washington, Darnell PPG: page 8.5, exact 8.6; Bates, Jessie PPG: page 8.0, exact 8.1 |
| Contracts & Cap · Draft picks | 60 | 60 | all match |
Every rank, bye, projection, status and pick holder matches. The three PPG differences are averages that land exactly on a half (116.1 ÷ 6 = 19.35): the page rounds them down, as the released phone sheet does (same formatter). A shared fix for both is a follow-up.
Earlier reconciliation (issue comment 4)
- Rosters: worker vs MFL
rosters: 481 / 481 players identical (team, status, salary, years, type). - Cap: Real Deal Creel $286,000 salaries + $9,000 adjustments = $295,000, $5,000 room: identical to MFL’s formula.
- War Room cap room used a stale static adjustments file: off by −$33,250 to +$34,000 per team. Fixed in #1340 (live MFL adjustments).
- Bye weeks: 0 mismatches; draft picks: all 12 teams identical.
Before / after
Roster


Player panel → Stats (same player)


Contracts & Cap at 1024 px


Checklist screens (Chromium, this site)














Tests
- Full safe offline suite on a8ed2d00 merged locally with current main (216b0087, never pushed): 249 passed, 0 failed.
- On a8ed2d00 alone: 224 passed, 1 failed. The one failure is
twr_merge_state, which passes only when a branch sits on main’s current tip; main has moved past this stack’s base. The stack and the four base PRs merge with current main without conflicts.
Bugs put back on purpose (each must fail its test)
| Bug put back | Test | Result | Run |
|---|---|---|---|
| A no write on open | front_office_no_write_on_open.test.mjs | caught | 1/3 tests passed, 8 assertions, 2 FAILED |
| B War Room live adjustments | trade_war_room_live_adjustments.test.mjs | caught | 1/3 tests passed, 5 assertions, 2 FAILED |
| J cache hit ignored (every call reads D1) | player_status_id_map_cache.test.mjs | caught | 2/4 tests passed, 22 assertions, 2 FAILED |
| C player facts = phone | front_office_player_facts_parity.test.mjs | caught | 5/7 tests passed, 737 assertions, 2 FAILED |
| D shell + deep links | front_office_shell_nav.test.mjs | caught | Node.js v22.22.2 |
| D rank waits for players list (old hub) | front_office_rank_universe.test.mjs | caught | 1/4 tests passed, 7 assertions, 3 FAILED |
| D rank cache keyed on groupOf (old cache) | front_office_rank_universe.test.mjs | caught | 3/4 tests passed, 18 assertions, 1 FAILED |
| D bye planner: IR can start | bye_planner_model.test.mjs | caught | 4/5 tests passed, 19 assertions, 1 FAILED (after adding the IR-designation case; missed before) |
| E blank projection read as 0 | front_office_roster_performance.test.mjs | caught | 4/5 tests passed, 51 assertions, 1 FAILED |
| F claim-now shown as add-now | front_office_market.test.mjs | caught | 3/5 tests passed, 25 assertions, 2 FAILED |
| G kickers/punters used in fits | trade_fit_model.test.mjs | caught | 7/8 tests passed, 75 assertions, 1 FAILED |
| H swap link drops the players | front_office_trade_finder.test.mjs | caught | 3/4 tests passed, 12 assertions, 1 FAILED |
| H War Room ignores give/get (main) | trade_war_room_fit_link.test.mjs | caught | 0/3 tests passed, 1 assertions, 3 FAILED |
| I IR moves read backwards | front_office_picks_activity.test.mjs | caught | 2/3 tests passed, 10 assertions, 1 FAILED |
| I fixed 1-6 pick columns | front_office_picks_activity.test.mjs | caught | 2/3 tests passed, 13 assertions, 1 FAILED |
| Overall skips K and P | lineup_strength_views.test.mjs | caught | 1/4 tests passed, 623 assertions, 3 FAILED |
| Index on the median, not the mean | lineup_strength_views.test.mjs | caught | 3/4 tests passed, 904 assertions, 1 FAILED |
| Rank by above-replacement instead of PPG | lineup_strength_views.test.mjs | caught | 3/4 tests passed, 336 assertions, 1 FAILED |
| IR relief takes the whole salary | fo_cap_ledger.test.mjs | caught | 3/4 tests passed, 21 assertions, 1 FAILED |
| Penalty rounding dropped from the total | fo_cap_ledger.test.mjs | caught | 2/4 tests passed, 19 assertions, 2 FAILED |
| Deadline from the LAST trade event | front_office_overview_cards.test.mjs | caught | 3/4 tests passed, 23 assertions, 1 FAILED |
| Deadline label via toLocaleString (Safari says "at") | front_office_overview_cards.test.mjs | caught | 3/4 tests passed, 24 assertions, 1 FAILED |
| D model cache keyed before the players list refresh | front_office_rank_universe.test.mjs | caught | 4/5 tests passed, 22 assertions, 1 FAILED |
Not verified here
- Signed-in MFL behavior: claims MFL holds, owner actions with a real session, the commissioner view. No real claim, trade or roster move was tried.
- Real Safari on a Mac or iPhone (WebKit engine only), and the live MFL page’s own header and scripts around Front Office.
- Live freshness: the preview replays one recording; the live site reads MFL’s exports (60-second cache).
- The worker change in #1341 (player-status id map cache) runs only in the worker; its offline test covers it, this preview doesn’t.