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

31/32 · 31/32
12-step checklist on this HTTPS site, Chromium · WebKit (Safari’s engine).
14/14 · 14/14 blocked
Every write path tried, both engines. 0 writes reached the network.
0 worker · 0 Discord
requests in all four runs (D1 is only reachable through the worker). MFL: 2 team-logo image GETs, no MFL API calls.
1442 / 1445
displayed values equal MFL’s recorded exports; the 3 others land exactly on a .x5 half (below).
249 passed, 0 failed
full safe offline suite on a8ed2d00 merged locally with current main (never pushed). On a8ed2d00 alone: 224 passed, 1 failed (see Tests).
23 / 23
bugs put back on purpose; each made its test fail.

Checklist, run on this site

StepCheckChromiumWebKit
1 Overviewcap: player salaries $286,000 + adjustments +$9,000 = $295,000 of $300,000; space $5,000passpass
1 Overviewtrade deadline: MFL stops trades Tue, Nov 24, 12:00 PM ETpassfail
1 Overviewno Contracts ending this season cardpasspass
1 Overviewroster 30/30, taxi 3/10, 4 on IRpasspass
1 OverviewWeek 7 and Thursday's run Oct 22 9:00 AM ETpasspass
1 Overviewneeds attention: Wk 7 no K + DL; Wk 9 no Ppasspass
1 Overviewbanner: missing 0passpass
2 Bye planner from the Week 7 lineBye planner is showingpasspass
2 Bye planner from the Week 7 lineWk 7: K 0/1, DL 1/2passpass
2 Bye planner from the Week 7 lineWk 9: P 0/1passpass
2 Bye planner from the Week 7 linefree agents listed as optionspasspass
3 Players: Performance and Contract columnsPrescott 141.4 · 23.6 · #14 QB · @ PHI Mon 8:15 PM · 16.7 · bye 14passpass
3 Players: Performance and Contract columnsContract chip shows the contract tablepasspass
4 Brissett panel, StatsThis season 116.1 · 19.3 · #21 QB · last 4 21.5passpass
4 Brissett panel, Statsearlier seasons listed separatelypasspass
5 Actions: Drop is blockedtoast: Preview is read-only: nothing was sent.passpass
5 Actions: Drop is blockedbanner counted the blocked writepasspass
6 Marketfirst row: Tre Tucker 13.9 · #25 WR · Claim now · Thu Oct 22 runpasspass
6 MarketWaivers later: nobody waiting on a later run (recorded Tuesday), and the page says whypasspass
6 MarketBid in app stays in the previewpasspass
7 Trades: finder and partnersmatrix: 12 teams, your row firstpasspass
7 Trades: finder and partnerslogical partner 1 = Pure Greatness, panel openpasspass
7 Trades: finder and partnerstrade-block note text is hidden in the previewpasspass
8 Swap → War Room preloadedWar Room: Real Deal Creel vs Pure Greatness, both players selectedpasspass
8 Swap → War Room preloadedoffer send is blockedpasspass
9 War Room from the Home buttonsame War Room page, empty builderpasspass
10 Draft picks and Activity2027 grid R1–R5 (no R6)passpass
10 Draft picks and Activityyour R1 held by The Long Haulers; you hold HammerTime's R1passpass
10 Draft picks and ActivityActivity: Fri, Oct 16 placed Will Shipley on IRpasspass
11 1024 px: no sideways scroll on any tabOverview, Roster, Bye, Market, Trades, Contracts, Picks, Activity at 1024passpass
12 Before (main) for comparisonsix ledger tabs, no Overview/Market/Tradespasspass
12 Before (main) for comparisonStats: database 2026 row (116 pts, 19.4) inside career totalsfailpass

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.

AttemptChromiumWebKit
fetch POST to the workerblockedblocked
fetch PUT to the workerblockedblocked
fetch PATCH to the workerblockedblocked
fetch DELETE via a Request objectblockedblocked
fetch POST to MFL importblockedblocked
fetch GET to MFL import (MFL writes accept GET)blockedblocked
fetch POST to Discordblockedblocked
XHR POSTblockedblocked
XHR GET to MFL importblockedblocked
sendBeaconblockedblocked
form POST submitblockedblocked
link to the live phone app does not navigateblockedblocked
War Room: offer POSTblockedblocked
War Room: 3-way POSTblockedblocked

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.

ScreenRowsValuesResultDifferences
Roster · Performance (Real Deal Creel)37185184 matchBrissett, Jacoby PPG: page 19.3, exact 19.4
Market · Free agents (top 200)20012001198 matchWashington, Darnell PPG: page 8.5, exact 8.6; Bates, Jessie PPG: page 8.0, exact 8.1
Contracts & Cap · Draft picks6060all 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)

Before / after

Roster

Before (main): contract ledger only; “Pos Rank” is a salary rank.
Before (main): contract ledger only; “Pos Rank” is a salary rank.
After: Performance columns (MFL points, PPG, rank, last 4, next game, MFL projection, bye) beside salary; Contract chip keeps the ledger.
After: Performance columns (MFL points, PPG, rank, last 4, next game, MFL projection, bye) beside salary; Contract chip keeps the ledger.

Player panel → Stats (same player)

Before: the database’s 2026 row (116, 19.4) inside career totals.
Before: the database’s 2026 row (116, 19.4) inside career totals.
After: This season from MFL’s own scoring (116.1, 19.3, #21 QB), as on the phone; earlier seasons separate.
After: This season from MFL’s own scoring (116.1, 19.3, #21 QB), as on the phone; earlier seasons separate.

Contracts & Cap at 1024 px

Before (main): the cap table widens the page by 104 px at 1024.
Before (main): the cap table widens the page by 104 px at 1024.
After: the same table scrolls inside its card.
After: the same table scrolls inside its card.

Checklist screens (Chromium, this site)

1 · Overview.
1 · Overview.
2 · Bye planner, Week 7 highlighted.
2 · Bye planner, Week 7 highlighted.
5 · Drop: “Preview is read-only: nothing was sent.”
5 · Drop: “Preview is read-only: nothing was sent.”
6 · Market.
6 · Market.
7 · Trade finder and the Pure Greatness panel.
7 · Trade finder and the Pure Greatness panel.
8 · War Room preloaded from a swap (fails closed: the POST check is blocked).
8 · War Room preloaded from a swap (fails closed: the POST check is blocked).
9 · War Room from the Home button.
9 · War Room from the Home button.
10 · Draft picks.
10 · Draft picks.
Overview at 1440.
Overview at 1440.
Overview at 1024.
Overview at 1024.
Market at 1440.
Market at 1440.
Trades at 1440.
Trades at 1440.
Inside an MFL-style page through the real embed loader.
Inside an MFL-style page through the real embed loader.
WebKit (Safari engine): Trades.
WebKit (Safari engine): Trades.

Tests

Bugs put back on purpose (each must fail its test)

Bug put backTestResultRun
A no write on openfront_office_no_write_on_open.test.mjscaught1/3 tests passed, 8 assertions, 2 FAILED
B War Room live adjustmentstrade_war_room_live_adjustments.test.mjscaught1/3 tests passed, 5 assertions, 2 FAILED
J cache hit ignored (every call reads D1)player_status_id_map_cache.test.mjscaught2/4 tests passed, 22 assertions, 2 FAILED
C player facts = phonefront_office_player_facts_parity.test.mjscaught5/7 tests passed, 737 assertions, 2 FAILED
D shell + deep linksfront_office_shell_nav.test.mjscaughtNode.js v22.22.2
D rank waits for players list (old hub)front_office_rank_universe.test.mjscaught1/4 tests passed, 7 assertions, 3 FAILED
D rank cache keyed on groupOf (old cache)front_office_rank_universe.test.mjscaught3/4 tests passed, 18 assertions, 1 FAILED
D bye planner: IR can startbye_planner_model.test.mjscaught4/5 tests passed, 19 assertions, 1 FAILED (after adding the IR-designation case; missed before)
E blank projection read as 0front_office_roster_performance.test.mjscaught4/5 tests passed, 51 assertions, 1 FAILED
F claim-now shown as add-nowfront_office_market.test.mjscaught3/5 tests passed, 25 assertions, 2 FAILED
G kickers/punters used in fitstrade_fit_model.test.mjscaught7/8 tests passed, 75 assertions, 1 FAILED
H swap link drops the playersfront_office_trade_finder.test.mjscaught3/4 tests passed, 12 assertions, 1 FAILED
H War Room ignores give/get (main)trade_war_room_fit_link.test.mjscaught0/3 tests passed, 1 assertions, 3 FAILED
I IR moves read backwardsfront_office_picks_activity.test.mjscaught2/3 tests passed, 10 assertions, 1 FAILED
I fixed 1-6 pick columnsfront_office_picks_activity.test.mjscaught2/3 tests passed, 13 assertions, 1 FAILED
Overall skips K and Plineup_strength_views.test.mjscaught1/4 tests passed, 623 assertions, 3 FAILED
Index on the median, not the meanlineup_strength_views.test.mjscaught3/4 tests passed, 904 assertions, 1 FAILED
Rank by above-replacement instead of PPGlineup_strength_views.test.mjscaught3/4 tests passed, 336 assertions, 1 FAILED
IR relief takes the whole salaryfo_cap_ledger.test.mjscaught3/4 tests passed, 21 assertions, 1 FAILED
Penalty rounding dropped from the totalfo_cap_ledger.test.mjscaught2/4 tests passed, 19 assertions, 2 FAILED
Deadline from the LAST trade eventfront_office_overview_cards.test.mjscaught3/4 tests passed, 23 assertions, 1 FAILED
Deadline label via toLocaleString (Safari says "at")front_office_overview_cards.test.mjscaught3/4 tests passed, 24 assertions, 1 FAILED
D model cache keyed before the players list refreshfront_office_rank_universe.test.mjscaught4/5 tests passed, 22 assertions, 1 FAILED

Not verified here