{
  "season": "2025-26",
  "gw": 31,
  "title": "Gameweek 31 reconstructive replay",
  "deadline": "2026-03-20T18:30:00Z",
  "status": "completed",
  "datasetKind": "historical-replay",
  "provenance": {
    "modelVersion": "live_faithful_option_value",
    "frozenAt": "2026-03-20T18:30:00Z",
    "snapshotHash": "sha256:d5b0ba9e47e3956a3be24e09914def74c52ca681e0092b70f8b2c702e5a334b3",
    "datasetId": "fpl-lab-2025-26-gw31-replay",
    "solverEngine": "FPL lab reconstructive replay",
    "executionTimestamp": "2026-03-20T18:30:00Z",
    "solverParameters": {
      "horizonWeeks": 5,
      "decayRate": 0.85,
      "hitPenalty": 4,
      "riskAversion": 0.15,
      "freeTransferConservationWeight": 0.8,
      "maxPlayersPerClub": 3,
      "teamBudgetCap": 100
    },
    "isDemoSample": false,
    "datasetKind": "historical-replay",
    "limitations": [
      "Fixtures come from the final season export, so mid-season revisions are not in this snapshot.",
      "The cutoff is reconstructed as first kickoff minus 90 minutes, not the live FPL deadline clock.",
      "No private manager state (exact bank, selling prices, chip timing) was archived at the time.",
      "Press and injury notes were not locked before the deadline.",
      "Prices are not exact pre-deadline quotes.",
      "Raw community xP tables were not used as the pre-deadline forecast."
    ]
  },
  "validatedPlan": {
    "armId": "optimiser",
    "armName": "Optimiser (forecast)",
    "formation": "3-5-2",
    "bank": 3.6,
    "hitCost": 0,
    "freeTransfersAvailable": 5,
    "chipUsed": "none",
    "captain": {
      "id": "player:2025-26:449",
      "webName": "B.Fernandes",
      "fullName": "Bruno Borges Fernandes",
      "team": "MUN",
      "position": "MID",
      "cost": 10.4,
      "projectedMinutes": 83.8,
      "expectedPoints": 5.89,
      "realisedPoints": 13,
      "opponent": "BOU (A)",
      "isHome": false,
      "fixtureDifficulty": 4,
      "selectedByPercent": 48,
      "isCaptain": true,
      "multiplier": 2
    },
    "viceCaptain": {
      "id": "player:2025-26:249",
      "webName": "João Pedro",
      "fullName": "João Pedro Junqueira de Jesus",
      "team": "CHE",
      "position": "FWD",
      "cost": 7.4,
      "projectedMinutes": 79,
      "expectedPoints": 5.43,
      "realisedPoints": 2,
      "opponent": "EVE (A)",
      "isHome": false,
      "fixtureDifficulty": 3,
      "selectedByPercent": 34.8,
      "isViceCaptain": true
    },
    "startingXI": [
      {
        "id": "player:2025-26:470",
        "webName": "Dúbravka",
        "fullName": "Martin Dúbravka",
        "team": "BUR",
        "position": "GKP",
        "cost": 4,
        "projectedMinutes": 88,
        "expectedPoints": 2.64,
        "realisedPoints": 2,
        "opponent": "FUL (A)",
        "isHome": false,
        "fixtureDifficulty": 3,
        "selectedByPercent": 25.7
      },
      {
        "id": "player:2025-26:226",
        "webName": "Chalobah",
        "fullName": "Trevoh Chalobah",
        "team": "CHE",
        "position": "DEF",
        "cost": 5.4,
        "projectedMinutes": 85.4,
        "expectedPoints": 4.19,
        "realisedPoints": 0,
        "opponent": "EVE (A)",
        "isHome": false,
        "fixtureDifficulty": 3,
        "selectedByPercent": 8.8
      },
      {
        "id": "player:2025-26:348",
        "webName": "Rodon",
        "fullName": "Joe Rodon",
        "team": "LEE",
        "position": "DEF",
        "cost": 3.9,
        "projectedMinutes": 82.9,
        "expectedPoints": 2.96,
        "realisedPoints": 6,
        "opponent": "BRE (H)",
        "isHome": true,
        "fixtureDifficulty": 3,
        "selectedByPercent": 3
      },
      {
        "id": "player:2025-26:260",
        "webName": "Guéhi",
        "fullName": "Marc Guéhi",
        "team": "MCI",
        "position": "DEF",
        "cost": 5.1,
        "projectedMinutes": 0,
        "expectedPoints": 0,
        "realisedPoints": 0,
        "opponent": "—",
        "isHome": false,
        "fixtureDifficulty": 3,
        "selectedByPercent": 32.6
      },
      {
        "id": "player:2025-26:449",
        "webName": "B.Fernandes",
        "fullName": "Bruno Borges Fernandes",
        "team": "MUN",
        "position": "MID",
        "cost": 10.4,
        "projectedMinutes": 83.8,
        "expectedPoints": 5.89,
        "realisedPoints": 13,
        "opponent": "BOU (A)",
        "isHome": false,
        "fixtureDifficulty": 4,
        "selectedByPercent": 48,
        "isCaptain": true,
        "multiplier": 2
      },
      {
        "id": "player:2025-26:47",
        "webName": "Rogers",
        "fullName": "Morgan Rogers",
        "team": "AVL",
        "position": "MID",
        "cost": 7.3,
        "projectedMinutes": 86.6,
        "expectedPoints": 4.87,
        "realisedPoints": 6,
        "opponent": "WHU (H)",
        "isHome": true,
        "fixtureDifficulty": 2,
        "selectedByPercent": 20.2
      },
      {
        "id": "player:2025-26:119",
        "webName": "Mbeumo",
        "fullName": "Bryan Mbeumo",
        "team": "MUN",
        "position": "MID",
        "cost": 8.3,
        "projectedMinutes": 77,
        "expectedPoints": 4.68,
        "realisedPoints": 2,
        "opponent": "BOU (A)",
        "isHome": false,
        "fixtureDifficulty": 4,
        "selectedByPercent": 15
      },
      {
        "id": "player:2025-26:450",
        "webName": "Cunha",
        "fullName": "Matheus Santos Carneiro da Cunha",
        "team": "MUN",
        "position": "MID",
        "cost": 8.1,
        "projectedMinutes": 77.2,
        "expectedPoints": 4.52,
        "realisedPoints": 6,
        "opponent": "BOU (A)",
        "isHome": false,
        "fixtureDifficulty": 4,
        "selectedByPercent": 8.7
      },
      {
        "id": "player:2025-26:329",
        "webName": "Wilson",
        "fullName": "Harry Wilson",
        "team": "FUL",
        "position": "MID",
        "cost": 5.8,
        "projectedMinutes": 60.3,
        "expectedPoints": 4.24,
        "realisedPoints": 9,
        "opponent": "BUR (H)",
        "isHome": true,
        "fixtureDifficulty": 1,
        "selectedByPercent": 17.4
      },
      {
        "id": "player:2025-26:249",
        "webName": "João Pedro",
        "fullName": "João Pedro Junqueira de Jesus",
        "team": "CHE",
        "position": "FWD",
        "cost": 7.4,
        "projectedMinutes": 79,
        "expectedPoints": 5.43,
        "realisedPoints": 2,
        "opponent": "EVE (A)",
        "isHome": false,
        "fixtureDifficulty": 3,
        "selectedByPercent": 34.8,
        "isViceCaptain": true
      },
      {
        "id": "player:2025-26:136",
        "webName": "Thiago",
        "fullName": "Igor Thiago Nascimento Rodrigues",
        "team": "BRE",
        "position": "FWD",
        "cost": 7.2,
        "projectedMinutes": 81.5,
        "expectedPoints": 4.71,
        "realisedPoints": 4,
        "opponent": "LEE (A)",
        "isHome": false,
        "fixtureDifficulty": 3,
        "selectedByPercent": 30.2
      }
    ],
    "bench": [
      {
        "id": "player:2025-26:670",
        "webName": "Roefs",
        "fullName": "Robin Roefs",
        "team": "SUN",
        "position": "GKP",
        "cost": 4.8,
        "projectedMinutes": 55.4,
        "expectedPoints": 2.06,
        "realisedPoints": 0,
        "opponent": "NEW (A)",
        "isHome": false,
        "fixtureDifficulty": 3,
        "selectedByPercent": 8,
        "benchOrder": 1
      },
      {
        "id": "player:2025-26:252",
        "webName": "Marc Guiu",
        "fullName": "Marc Guiu Paz",
        "team": "CHE",
        "position": "FWD",
        "cost": 4,
        "projectedMinutes": 6,
        "expectedPoints": 0.33,
        "realisedPoints": 0,
        "opponent": "EVE (A)",
        "isHome": false,
        "fixtureDifficulty": 3,
        "selectedByPercent": 5.2,
        "benchOrder": 2
      },
      {
        "id": "player:2025-26:5",
        "webName": "Gabriel",
        "fullName": "Gabriel dos Santos Magalhães",
        "team": "ARS",
        "position": "DEF",
        "cost": 7.3,
        "projectedMinutes": 0,
        "expectedPoints": 0,
        "realisedPoints": 0,
        "opponent": "—",
        "isHome": false,
        "fixtureDifficulty": 3,
        "selectedByPercent": 45.4,
        "benchOrder": 3
      },
      {
        "id": "player:2025-26:8",
        "webName": "J.Timber",
        "fullName": "Jurriën Timber",
        "team": "ARS",
        "position": "DEF",
        "cost": 6,
        "projectedMinutes": 0,
        "expectedPoints": 0,
        "realisedPoints": 0,
        "opponent": "—",
        "isHome": false,
        "fixtureDifficulty": 3,
        "selectedByPercent": 15.2,
        "benchOrder": 4
      }
    ],
    "transfersIn": [
      {
        "id": "player:2025-26:119",
        "webName": "Mbeumo",
        "fullName": "Bryan Mbeumo",
        "team": "MUN",
        "position": "MID",
        "cost": 8.3,
        "projectedMinutes": 77,
        "expectedPoints": 4.68,
        "realisedPoints": 2,
        "opponent": "BOU (A)",
        "isHome": false,
        "fixtureDifficulty": 4,
        "selectedByPercent": 15
      },
      {
        "id": "player:2025-26:249",
        "webName": "João Pedro",
        "fullName": "João Pedro Junqueira de Jesus",
        "team": "CHE",
        "position": "FWD",
        "cost": 7.4,
        "projectedMinutes": 79,
        "expectedPoints": 5.43,
        "realisedPoints": 2,
        "opponent": "EVE (A)",
        "isHome": false,
        "fixtureDifficulty": 3,
        "selectedByPercent": 34.8
      },
      {
        "id": "player:2025-26:449",
        "webName": "B.Fernandes",
        "fullName": "Bruno Borges Fernandes",
        "team": "MUN",
        "position": "MID",
        "cost": 10.4,
        "projectedMinutes": 83.8,
        "expectedPoints": 5.89,
        "realisedPoints": 13,
        "opponent": "BOU (A)",
        "isHome": false,
        "fixtureDifficulty": 4,
        "selectedByPercent": 48
      }
    ],
    "transfersOut": [
      {
        "id": "player:2025-26:21",
        "webName": "Rice",
        "fullName": "Declan Rice",
        "team": "ARS",
        "position": "MID",
        "cost": 7.2,
        "projectedMinutes": 0,
        "expectedPoints": 0,
        "realisedPoints": null,
        "opponent": "—",
        "isHome": false,
        "fixtureDifficulty": 3,
        "selectedByPercent": 23.3
      },
      {
        "id": "player:2025-26:430",
        "webName": "Haaland",
        "fullName": "Erling Haaland",
        "team": "MCI",
        "position": "FWD",
        "cost": 14.7,
        "projectedMinutes": 0,
        "expectedPoints": 0,
        "realisedPoints": null,
        "opponent": "—",
        "isHome": false,
        "fixtureDifficulty": 3,
        "selectedByPercent": 62.5
      },
      {
        "id": "player:2025-26:82",
        "webName": "Semenyo",
        "fullName": "Antoine Semenyo",
        "team": "MCI",
        "position": "MID",
        "cost": 8,
        "projectedMinutes": 0,
        "expectedPoints": 0,
        "realisedPoints": null,
        "opponent": "—",
        "isHome": false,
        "fixtureDifficulty": 3,
        "selectedByPercent": 46.2
      }
    ],
    "transferActions": [
      {
        "playerIn": {
          "id": "player:2025-26:119",
          "webName": "Mbeumo",
          "team": "MUN",
          "position": "MID",
          "cost": 8.7,
          "expectedPoints": 4.68
        },
        "playerOut": {
          "id": "player:2025-26:21",
          "webName": "Rice",
          "team": "ARS",
          "position": "MID",
          "sellPrice": 7.2,
          "expectedPoints": 0
        },
        "netCostDelta": 1.5,
        "netXPDelta3GW": 4.68,
        "rationale": "Selected by this approach at the reconstructed cutoff."
      },
      {
        "playerIn": {
          "id": "player:2025-26:249",
          "webName": "João Pedro",
          "team": "CHE",
          "position": "FWD",
          "cost": 7.7,
          "expectedPoints": 5.43
        },
        "playerOut": {
          "id": "player:2025-26:430",
          "webName": "Haaland",
          "team": "MCI",
          "position": "FWD",
          "sellPrice": 14.6,
          "expectedPoints": 0
        },
        "netCostDelta": -6.9,
        "netXPDelta3GW": 5.43,
        "rationale": "Selected by this approach at the reconstructed cutoff."
      },
      {
        "playerIn": {
          "id": "player:2025-26:449",
          "webName": "B.Fernandes",
          "team": "MUN",
          "position": "MID",
          "cost": 10.1,
          "expectedPoints": 5.89
        },
        "playerOut": {
          "id": "player:2025-26:82",
          "webName": "Semenyo",
          "team": "MCI",
          "position": "MID",
          "sellPrice": 8,
          "expectedPoints": 0
        },
        "netCostDelta": 2.1,
        "netXPDelta3GW": 5.89,
        "rationale": "Selected by this approach at the reconstructed cutoff."
      }
    ],
    "projectedSquadTotalXP": 53.6,
    "realisedSquadTotalPoints": 63
  },
  "arms": [
    {
      "id": "baseline",
      "name": "Template (roll transfers)",
      "shortLabel": "Template",
      "category": "Heuristic",
      "description": "No transfers",
      "objectiveEP": 58.3,
      "realisedPoints": 68,
      "varianceScore": 0,
      "transfersCount": 0,
      "hits": 0,
      "captain": "B.Fernandes",
      "viceCaptain": "João Pedro",
      "chip": "none",
      "formation": "4-4-2",
      "decisionDeltaVsBaseline": 0,
      "realisedRankEffect": "68 pts net",
      "solverRuntimeMs": 0
    },
    {
      "id": "optimiser",
      "name": "Optimiser (forecast)",
      "shortLabel": "Optimiser",
      "category": "Mixed-Integer Linear (ILP)",
      "description": "Rice → Mbeumo, Haaland → João Pedro, Semenyo → B.Fernandes",
      "objectiveEP": 53.6,
      "realisedPoints": 63,
      "varianceScore": 0,
      "transfersCount": 3,
      "hits": 0,
      "captain": "B.Fernandes",
      "viceCaptain": "João Pedro",
      "chip": "none",
      "formation": "3-5-2",
      "decisionDeltaVsBaseline": -5,
      "realisedRankEffect": "63 pts net",
      "solverRuntimeMs": 0
    },
    {
      "id": "agent",
      "name": "Evidence-informed",
      "shortLabel": "Evidence",
      "category": "Multi-Objective Agent",
      "description": "Rice → Mbeumo, Haaland → João Pedro, Semenyo → B.Fernandes",
      "objectiveEP": 53.6,
      "realisedPoints": 63,
      "varianceScore": 0,
      "transfersCount": 3,
      "hits": 0,
      "captain": "B.Fernandes",
      "viceCaptain": "João Pedro",
      "chip": "none",
      "formation": "3-5-2",
      "decisionDeltaVsBaseline": -5,
      "realisedRankEffect": "63 pts net",
      "solverRuntimeMs": 0
    }
  ],
  "summaryAnalysis": {
    "executiveSummary": "Reconstructive replay for 2025/26 Gameweek 31. The optimiser captained B.Fernandes (vice João Pedro), formation 3-5-2, and made 3 transfers (Rice out, Mbeumo in; Haaland out, João Pedro in; Semenyo out, B.Fernandes in). It scored 63 net points after hits. Pre-cutoff objective was 53.6 expected points.",
    "keyTradeoffs": [
      "Transfers: Rice to Mbeumo; Haaland to João Pedro; Semenyo to B.Fernandes.",
      "Evidence-informed finished +0 points versus the optimiser this week.",
      "Fixtures come from the final season export, so mid-season revisions are not in this snapshot.",
      "The cutoff is reconstructed as first kickoff minus 90 minutes, not the live FPL deadline clock.",
      "No private manager state (exact bank, selling prices, chip timing) was archived at the time."
    ],
    "shadowPrices": {
      "budgetPerMillionXP": 0,
      "transferMarginalValueXP": 0,
      "benchPointsExpectancy": 0
    },
    "divergenceNotes": "This is a reconstructive historical replay, not a live two-hour freeze. Inputs were rebuilt after the season; see Methods and the limitations on this page."
  }
}