Taxi rule: canon vs every application path
Audit against current main (2026-10-21). The rule is canon’s; nothing here changes it. Fixes are in draft PR #1364 (worker, phone, Game Day, legacy roster workbench; canon wording in a separate commit for approval) and in draft #1353 (Front Office panel and Move to Taxi). Earlier side-by-side evidence: /taxi/evidence/.
Matrix
| Rule (canon) | Canon text | Worker eligibility (/roster-workbench) | Promote / demote write guard | Desktop Front Office + #1353 panel | Legacy roster workbench (fallback embed) | Phone Taxi / Contracts / player sheet | Game Day | Cap-free cut pricing | Tests / Rules data |
|---|---|---|---|---|---|---|---|---|---|
| UPS Rookie Draft round/year decide it, never NFL fields | §A1 L97/L104, §B2 L344. L362 said NFL fields | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | L362 corrected in the canon commit |
| Round 1 never; Round 2+ for the first 3 league years | §A1 L97/L104/L106, §B2 L344/L360 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ (new boundary tests) |
| Activations 1–3 temporary, cumulative across the window | §B2 L347–354, T2.4 L943 | ✓ | n/a | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ (0,1,2,3,4 + pending tests) |
| Demotion allowed after each of activations 1–3 | §B2 L350, T2.4 L943 | ✓ | ✓ | ✓ | ✗ hid Demote after the 1st call-up (taxiDemoteLikelyForbidden) → fixed | ✓ | ✓ | n/a | ✓ new |
| 4th activation permanent; never eligible again | §B2 L351, T2.4 L944, §G14 L1219 | ✗ taxi_eligible ignored permanence (40 players) → fixed | ✗ checked used≥4 only; missed marked rows and prior-season promotions; let the demote through when D1 failed → fixed | ✓ | ✓ | ✗ a failed call-up read counted as “never promoted” → fixed | ✓ | ✓ | ✓ new |
| Cut/release ends it; re-acquiring doesn’t restore it | Not in canon (Keith 2026-08-03, code comments only) | ✓ | ✓ rule, ✗ an unreadable rosters read was reported as “dropped” → fixed | ✓ rule, ✗ panel said “released” for expired rookie deals outside the window → fixed | ✓ | ✓ | ✓ | ✓ | gap → drafted |
| A trade keeps it | Not in canon (same ruling) | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | gap → drafted |
| Rookie who ended a prior season active/IR = permanent (pre-tracking) | Not in canon (Keith 2026-05-19 / 2026-09-17) | ✓ | ✗ not checked → fixed | ✓ | ✗ guessed from acquisition year → replaced by the worker verdict | ✓ | ✓ | ✓ | gap → drafted |
| Cap-free cut follows ELIGIBILITY, not the slot (ruled 2026-10-21) | §B2 L357–358, §D2 L692 | n/a | n/a | ✓ | ✓ | ✓ | ✓ | ✗ exempted the taxi slot alone and charged an eligible player cut from the active roster without call-ups → fixed: the one rule decides (eligible → $0; not eligible → normal formula even on taxi; unknown → held) | ✓ |
| Owner-facing copy / Rules data | Rules data is generated from canon | n/a | n/a | n/a | n/a | n/a | ✗ said “UPS draft R2–5” → fixed | n/a | regenerated with the drafted clarification |
One shared result
worker/src/taxi_rule.js decides eligibility; site/shared/taxi_rule.js is the same body, byte for byte (a test regenerates and compares it). /roster-workbench sends the verdict as taxi_status (eligible / reason / call-ups left / can_demote / whether the next promote is the permanent 4th). The demote write guard, the Front Office, Game Day and the legacy workbench read it; the phone, which reads MFL’s rosters directly, computes the same verdict from the shared file. Anything unreadable is “Unknown” with no Demote — never a guess.
Players whose displayed eligibility changes (2026-10-20 rosters, 481 players)
- Front Office, #1353 panel, Game Day, phone: no player’s yes/no answer changes. The panel’s wording changes for 107 players: the call-up note now says activations 1–3 are temporary and the player can return to taxi after each; Ezeiruaku and Shipley read “released since the draft”; Cooper and Coleman (cut and re-acquired, also promoted) now name the release first.
- Legacy roster workbench (only if the MFL page points back at its loader): Demote to Taxi returns for 8 players:
- Tuten, Bhayshul (17052, 0010): Demote false → true · used 3 pending 0 · acq 2.12 (2025)
- Downs, Caleb (17563, 0009): Demote false → true · used 2 pending 0 · acq 4.09
- Graham, Mason (17121, 0003): Demote false → true · used 3 pending 0 · acq 6.11 (2025)
- Golden, Matthew (17075, 0003): Demote false → true · used 3 pending 0 · acq Trade
- Turner, Dallas (16650, 0001): Demote false → true · used 3 pending 0 · acq 6.01 (2024)
- Rodriguez, Jacob (17586, 0007): Demote false → true · used 0 pending 1 · acq 4.05
- Gordon II, Ollie (17059, 0006): Demote false → true · used 2 pending 0 · acq 4.10 (2025)
- Bernard, Germie (17503, 0006): Demote false → true · used 1 pending 0 · acq 2.10
- Worker API
taxi_eligibleturns false for 40 permanently promoted players (every screen already hid them): Pearsall, Ricky (16622, 0010), Tracy, Tyrone (16747, 0009), Verse, Jared (16653, 0002), Egbuka, Emeka (17081, 0002), Rattler, Spencer (16586, 0002), Shough, Tyler (17039, 0002), Loveland, Colston (17104, 0011), Starks, Malaki (17132, 0011), Reese, Arvell (17556, 0011), Walker, Devontez (16621, 0011), McMillan, Jalen (16628, 0011), Vidal, Kimani (16757, 0003), Hill Jr., Anthony (17560, 0003), Joly, Justin (17548, 0003), Smack, Trey (17668, 0003), Wilson, Payton (16716, 0003), Skattebo, Cam (17045, 0003), Monangai, Kyle (17066, 0003), Taylor, Mason (17106, 0005), Penix Jr., Michael (16583, 0005), Robinson, Chop (16655, 0012), Bullard, Javon (16677, 0012), Carter, Abdul (17112, 0012), Allen, CJ (17558, 0012), Delane, Mansoor (17562, 0012), Nix, Bo (16582, 0001), Emmanwori, Nick (17144, 0001), Latu, Laiatu (16651, 0001), Allen, Braelon (16596, 0001), Irving, Bucky (16598, 0004), Pearce, James (17115, 0008), Schwesinger, Carson (17147, 0007), Brooks, Tahj (17058, 0007), Fannin, Harold (17103, 0007), Williams, Kyle (17134, 0007), Thieneman, Dillon (17576, 0007), Lloyd, MarShawn (16604, 0007), Thomas Jr., Brian (16618, 0007), Croskey-Merritt, Jacory (17256, 0007), Marks, Woody (17053, 0006).
Canon clarification (drafted, for your approval; documents existing rulings only)
- §B2: a cut/release ends the original taxi eligibility; re-acquiring the player, by any team or method, does not restore it; a trade does not end it (Keith 2026-08-03).
- §B2: a UPS rookie who ended a prior season on an active or IR roster is permanently promoted, because call-ups weren’t tracked before 2026 (Keith 2026-05-19 / 2026-09-17).
- §B2 L362: the derivation uses the UPS Rookie Draft year and round, never MFL’s NFL draft fields (Keith 2026-05-18; §A1 and L344 already say so).
Resolved by your 2026-10-21 ruling
- §B2 L361 / L363 (“MFL natively handles taxi eligibility”, MFL flag / NFL fields authoritative): replaced — UPS Rookie Draft history and the shared resolver are authoritative; MFL doesn’t enforce the three-activation budget.
- T5.2 vs §D2: T5.2 kept; §D2, the drop pricing and every surface now give the cap-free cut to any player still taxi-eligible immediately before the cut, wherever he sits. One player’s price changes today: Jacob Rodriguez (17586, 0007), cap-free now. Release package: /release/.
Data note (not a rule conflict): the call-up counter keeps counting active weeks after a player is permanent or past the window (58 players above 4, up to 34). Eligibility is unaffected: they read “permanently promoted”.