Overview sprint · review
#1345 head ba4e507b · stack top #1350 5c63836f · draft, not merged · recorded data 2026-10-20 (after Week 6)
5c63836f merged locally with main 216b0087. On 5c63836f alone: 224 passed, 1 failed.Review checklist (about 5 minutes)
- Open Front Office; you land on Overview. Look at the Cap card.Player salaries $286,000 · Salary adjustments +$9,000 · Total allocated $295,000 of $300,000 · Cap space $5,000.
- Click Player salaries.Active roster (30) $270,000 · Injured reserve (4) $32,000 · Taxi squad (3) $8,000 → $310,000 on the roster; relief: IR −$16,000, taxi −$8,000 → $286,000, with “✓ Adds up”. Open “Active roster” to see every player.
- Close it (Esc or ×) and click Salary adjustments.Seven drops (+$9,200 exact), “Rounding to the nearest $1,000 (canon §6)” −$200 → cap penalties +$9,000; traded salary $0; miscellaneous $0; total +$9,000 ✓. The 2027 drops are listed separately, outside the total.
- Look at Lineup strength (Above repl. is selected).Overall +2.9, QB −2.9, RB −15.0, WR +18.6 … K −0.3, P 0.0: the same numbers as your row in Trades → Trade finder. K and P are faded.
- Click PPG, Index, then Rank.PPG: Overall 240.6, WR 77.9, RB 18.0. Index: Overall 100, WR 155, RB 49. Rank: Overall 6th, WR 1st, RB 12th, DL 3rd.
- Look at Trade deadline.“N days · MFL stops trades Tue, Nov 24, 12:00 PM ET” (35 days on Oct 20). Signed out of MFL, the live card says “Sign in to MFL to see when MFL stops trades”.
- Check the cards.Cap, Roster, This week, Trade deadline, Needs attention, Lineup strength, Draft picks. No “Contracts ending this season”.
- Narrow to about 1024 px, then open Inside an MFL-style page.No sideways scroll; cards reflow to two columns; the ledgers open there too.
Before / after












Cap reconciliation, all 12 franchises
In-page: Front Office’s capLedger vs its own cap card (capFor): groups add up, player salaries = card, adjustments = card, items add to their category, allocated = card, cap space = card, salaries + adjustments = allocated. Independent: recomputed from the raw recorded data with MFL’s formula (ROSTER salaries + IR at 50% + every MFL salary adjustment; taxi excluded), outside the Front Office code.
| Team | Active | IR (salary → counts) | Taxi | Relief | Player salaries | Penalties exact · rounding | Traded | Misc | Adjustments | Total allocated | Cap space | In-page checks | MFL formula (exact) | Difference |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Blake Bombers | $310,000 (28) | $6,000 → $3,000 (2) | $25,000 (7) | −$28,000 | $313,000 | +$5,000 · $0 | −$32,000 | $0 | −$27,000 | $286,000 | $14,000 | 7/7 ✓ | $286,000 | none ✓ |
| C-Town Chivalry | $246,000 (29) | $6,000 → $3,000 (2) | $16,000 (6) | −$19,000 | $249,000 | +$15,500 · +$500 | +$19,000 | $0 | +$35,000 | $284,000 | $16,000 | 7/7 ✓ | $283,500 | rounding +$500 ✓ |
| CBP | $281,000 (29) | $33,000 → $16,500 (4) | $18,000 (8) | −$34,500 | $297,500 | +$4,000 · $0 | −$12,000 | $0 | −$8,000 | $289,500 | $10,500 | 7/7 ✓ | $289,500 | none ✓ |
| Cleon Ca$h | $276,000 (29) | $11,000 → $5,500 (2) | $23,000 (9) | −$28,500 | $281,500 | +$2,100 · −$100 | $0 | $0 | +$2,000 | $283,500 | $16,500 | 7/7 ✓ | $283,600 | rounding −$100 ✓ |
| Gride | $249,000 (30) | $52,000 → $26,000 (5) | $22,000 (8) | −$48,000 | $275,000 | +$20,250 · −$250 | −$10,000 | $0 | +$10,000 | $285,000 | $15,000 | 7/7 ✓ | $285,250 | rounding −$250 ✓ |
| HammerTime 🔨 ⏰ | $255,000 (30) | $7,000 → $3,500 (1) | $20,000 (10) | −$23,500 | $258,500 | +$10,800 · +$200 | +$20,000 | $0 | +$31,000 | $289,500 | $10,500 | 7/7 ✓ | $289,300 | rounding +$200 ✓ |
| Hawks | $272,000 (30) | $1,000 → $500 (1) | $16,000 (7) | −$16,500 | $272,500 | +$6,500 · +$500 | $0 | +$3,000 | +$10,000 | $282,500 | $17,500 | 7/7 ✓ | $282,000 | rounding +$500 ✓ |
| L.A. Looks | $275,000 (29) | $14,000 → $7,000 (4) | $20,000 (9) | −$27,000 | $282,000 | +$12,550 · +$450 | $0 | $0 | +$13,000 | $295,000 | $5,000 | 7/7 ✓ | $294,550 | rounding +$450 ✓ |
| Pure Greatness | $284,000 (28) | $15,000 → $7,500 (2) | $18,000 (10) | −$25,500 | $291,500 | +$1,000 · $0 | $0 | $0 | +$1,000 | $292,500 | $7,500 | 7/7 ✓ | $292,500 | none ✓ |
| Real Deal Creel | $270,000 (30) | $32,000 → $16,000 (4) | $8,000 (3) | −$24,000 | $286,000 | +$9,200 · −$200 | $0 | $0 | +$9,000 | $295,000 | $5,000 | 7/7 ✓ | $295,200 | rounding −$200 ✓ |
| Sex Manther | $246,000 (30) | $20,000 → $10,000 (4) | $20,000 (9) | −$30,000 | $256,000 | +$36,000 · $0 | +$5,000 | $0 | +$41,000 | $297,000 | $3,000 | 7/7 ✓ | $297,000 | none ✓ |
| The Long Haulers | $223,000 (30) | $68,000 → $34,000 (3) | $23,000 (9) | −$57,000 | $257,000 | +$4,750 · +$250 | $0 | $0 | +$5,000 | $262,000 | $38,000 | 7/7 ✓ | $261,750 | rounding +$250 ✓ |
Every team passes all seven in-page checks. Player salaries and each adjustment category equal MFL’s data. Total allocated equals MFL’s exact sum except for the drop-penalty rounding Front Office already applies (canon §6: penalties round to the nearest $1,000 per team; the true-up posts to MFL at the Auction Cut Deadline). The ledger shows that rounding as its own line, so the card and the ledger agree; MFL’s own screen can differ by that amount until the true-up.
Lineup strength: definitions
Current (the original chart, unchanged)
- Player value = season points per MFL-scored week (MFL’s league scoring, Wks 1–6 final; a player with no MFL week = 0).
- Available now = active roster (not taxi, not IR) and no IR/PUP/NFI/SUSP/HOLD/RET/OUT designation. Byes are not considered.
- Best legal lineup = the released 18-slot engine (QB, 2 RB, 2 WR, TE, 2 Flex, SuperFlex, K, P, 2 DL, 2 LB, 2 DB, D-Flex), filled from available players plus replacement free agents: the 3rd-best free agent at QB/RB/WR/TE, 6th at K/P, 12th at DL/LB/DB, and the next ones down. A replacement starts wherever it beats the team’s own option, not only in an empty slot.
- Strength at a position = Σ over the starters at that position (Flex/SuperFlex/D-Flex count for the player’s own position) of (PPG − the 1st replacement PPG for that position).
- Shown = strength − the median strength of the 12 teams (rounded to 0.1). Seven rows (QB–DB). Bars were scaled to the team’s own largest row.
Proposed (built, all from one table over the same 12 lineups)
- Above repl. (default): the current number, unchanged, now with Overall (Σ of all 18 starters’ PPG above replacement, minus the league median of that total) and K, P rows.
- PPG: Σ PPG of the starters in the row (Overall = the whole 18-slot lineup).
- Index: PPG ÷ the 12-team mean PPG for that row × 100 (the mean index is exactly 100).
- Rank: 1st–12th by PPG for that row (ties share a rank).
- Overall is weighted by points: it’s the whole lineup’s total, never an average of the row values (an average of the position indexes would differ for most teams; tested).
- Relation: above repl. = PPG − (starters × replacement PPG). So PPG/Index/Rank and Above repl. can order teams differently when teams start different numbers of players at a position (Flex use) or have different replacement starters.
- Bars are now scaled to the league’s spread in each row (so Overall doesn’t flatten the others); colors and shapes unchanged.
Real Deal Creel, recorded Week 7 (12 teams, 18 slots, 1075 free agents in the replacement pool):
| Row | Starters | PPG | League mean PPG | Index | Rank | Replacement PPG | Above repl. | League median above | vs median (chart) |
|---|---|---|---|---|---|---|---|---|---|
| Overall | 18 (3 repl.) | 240.7 | 241.4 | 100 | 6 | — | 85.5 | 82.6 | +2.9 |
| QB | 2 | 42.9 | 45.7 | 94 | 8 | 10.70 | 21.5 | 24.4 | -2.9 |
| RB | 2 (1 repl.) | 18.0 | 36.4 | 49 | 12 | 7.95 | 2.1 | 17.1 | -15.0 |
| WR | 4 | 77.9 | 50.3 | 155 | 1 | 9.32 | 40.6 | 21.9 | +18.6 |
| TE | 1 | 14.3 | 23.7 | 61 | 8 | 8.45 | 5.9 | 7.5 | -1.6 |
| DL | 2 | 21.2 | 17.2 | 123 | 3 | 6.75 | 7.8 | 3.1 | +4.7 |
| LB | 2 | 17.1 | 18.9 | 90 | 9 | 7.17 | 2.8 | 3.2 | -0.4 |
| DB | 3 | 31.0 | 28.7 | 108 | 3 | 8.70 | 4.9 | 2.7 | +2.2 |
| K | 1 (1 repl.) | 9.9 | 11.2 | 88 | 7 | 9.88 | 0.0 | 0.3 | -0.3 |
| P | 1 (1 repl.) | 8.3 | 9.3 | 90 | 6 | 8.33 | 0.0 | 0.0 | +0.0 |
Population check: every team has 18 Overall starters, one K and one P; position PPGs add up to Overall; every position’s vs-median equals the Trade finder model. All pass.
Trade deadline: MFL vs other sources
| Source | Closes trades |
|---|---|
| MFL League Calendar (public page, read 2026-10-21 00:23 UTC) | Tue Nov 24, 12:00 PM ET (“No Trades Allowed”); two more events Wed Nov 25 8:00 PM ET |
League calendar (/api/league-events; the old card, the phone Home chip) | Wed Nov 25 (date only) |
| Commish Settings (per #1217) | Wed Nov 25, 8:00 PM ET |
| Canon rule text | “NFL Thanksgiving week kickoff” = Wed Nov 25, 8:00 PM ET in 2026 |
| Canon 2026 date rows | Thu Nov 26 |
The card now reads MFL’s calendar export (TYPE=calendar) with the viewer’s MFL session. MFL serves that export only to a signed-in league member, so this preview uses a stand-in built from the three events on MFL’s public calendar page; the live card reads MFL directly. Nothing on MFL or in canon was changed. #1217 (reminders) is still open.
Tests
- New:
lineup_strength_views(4 tests, 926 assertions on the real 2026 Wk 6 fixture),fo_cap_ledger(4 / 27),front_office_overview_cards(5 / 32), and a new case infront_office_rank_universefor the stale-model bug. - Found and fixed while checking the live preview: the deadline label read differently in Safari (“at”), and the Overview could throw before boot on a slow network.
- Full safe suite: 249 passed, 0 failed on 5c63836f merged locally with main 216b0087; 224 passed, 1 failed on 5c63836f alone (
twr_merge_statepasses only on main’s current tip).
| Bug put back | Test | Result | Run |
|---|---|---|---|
| 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 |
| Overview renders before boot (no guard) | front_office_overview_cards.test.mjs | caught | 4/5 tests passed, 31 assertions, 1 FAILED |
| Model cache keyed before the players list refresh (the stale-strength bug) | front_office_rank_universe.test.mjs | caught | 4/5 tests passed, 22 assertions, 1 FAILED |
Not verified
- The live card reading MFL’s calendar with a real owner session (preview uses a stand-in).
- Signed-in owner behavior, real Safari, the live MFL page around Front Office.
Decisions before finalizing
- Lineup strength default view. Recommend keeping Above repl. as the default (continuity with the Trade finder), with PPG/Index/Rank one click away.
- Replacement starters in PPG/Index/Rank. Today’s model fills any slot where a replacement free agent beats the team’s own option (Real Deal Creel: 3 such starters, RB/K/P; one team has 6). Recommend keeping one population (consistent with the chart) and noting “includes N replacement-level starters”; the alternative is rostered players only (empty slot = 0), which would make the views disagree with Above repl.
- Average for Index = mean; the original chart uses the median. Recommend leaving the chart on the median (no silent redefinition).
- Flex attribution. Position rows count Flex/SuperFlex/D-Flex starters by the player’s position, so rows add up to Overall. Alternative: fixed slots per position + a separate Flex row. Recommend keeping.
- Cap rounding vs MFL’s screen. Front Office shows drop penalties rounded per canon §6 (8 teams differ from MFL’s exact sum by −$250 to +$500 until the true-up posts). Recommend keeping, with the rounding line in the ledger.
- Trade deadline. MFL closes Tue Nov 24 noon; the league calendar, Commish Settings and canon say Nov 25–26. Your ruling on the rule and MFL’s calendar (not changed here); #1217 waits on it.
- Signed-out deadline card. Without an MFL sign-in the card says “Sign in to MFL to see when MFL stops trades” instead of the league calendar date. Recommend keeping.