{
  "season": "2026-27",
  "gw": 2,
  "title": "Gameweek 2 Fixture Targetting: Ipswich Home Allocation",
  "deadline": "2026-08-24T10:00:00Z",
  "status": "completed",
  "provenance": {
    "modelVersion": "v2.4.1-rc3",
    "frozenAt": "2026-08-24T08:00:00Z",
    "snapshotHash": "sha256:d41d8cd98f00b204e9800998ecf8427e324a18b76e1a90c0ef49a9987812bc8f",
    "datasetId": "fpl-ep-202627-gw2-freeze",
    "solverEngine": "Highs-MILP-v1.7.2",
    "executionTimestamp": "2026-08-24T08:03:45Z",
    "solverParameters": {
      "horizonWeeks": 5,
      "decayRate": 0.85,
      "hitPenalty": 4,
      "riskAversion": 0.15,
      "freeTransferConservationWeight": 0.8,
      "maxPlayersPerClub": 3,
      "teamBudgetCap": 100.5
    },
    "isDemoSample": true,
    "datasetKind": "illustrative-sample"
  },
  "validatedPlan": {
    "armId": "optimiser",
    "armName": "Mixed-Integer Linear Solver (ILP)",
    "formation": "3-5-2",
    "bank": 0,
    "hitCost": 0,
    "freeTransfersAvailable": 1,
    "chipUsed": "none",
    "captain": {
      "id": "p_haaland_mci",
      "webName": "Haaland",
      "fullName": "Erling Haaland",
      "team": "MCI",
      "position": "FWD",
      "cost": 15.1,
      "projectedMinutes": 89,
      "expectedPoints": 10.45,
      "realisedPoints": 17,
      "isCaptain": true,
      "multiplier": 2,
      "opponent": "IPS (H)",
      "isHome": true,
      "fixtureDifficulty": 1,
      "xGI": 1.32,
      "cleanSheetProbability": 0.58,
      "selectedByPercent": 59.8
    },
    "viceCaptain": {
      "id": "p_palmer_che",
      "webName": "Palmer",
      "fullName": "Cole Palmer",
      "team": "CHE",
      "position": "MID",
      "cost": 10.5,
      "projectedMinutes": 88,
      "expectedPoints": 7.42,
      "realisedPoints": 17,
      "isViceCaptain": true,
      "opponent": "WOL (A)",
      "isHome": false,
      "fixtureDifficulty": 2,
      "xGI": 0.88,
      "cleanSheetProbability": 0.22,
      "selectedByPercent": 41.3
    },
    "startingXI": [
      {
        "id": "p_raya_ars",
        "webName": "Raya",
        "fullName": "David Raya",
        "team": "ARS",
        "position": "GKP",
        "cost": 5.5,
        "projectedMinutes": 90,
        "expectedPoints": 4.12,
        "realisedPoints": 8,
        "opponent": "AVL (A)",
        "isHome": false,
        "fixtureDifficulty": 3,
        "cleanSheetProbability": 0.38,
        "selectedByPercent": 26.1
      },
      {
        "id": "p_saliba_ars",
        "webName": "Saliba",
        "fullName": "William Saliba",
        "team": "ARS",
        "position": "DEF",
        "cost": 6,
        "projectedMinutes": 90,
        "expectedPoints": 4.05,
        "realisedPoints": 6,
        "opponent": "AVL (A)",
        "isHome": false,
        "fixtureDifficulty": 3,
        "cleanSheetProbability": 0.38,
        "selectedByPercent": 39.5
      },
      {
        "id": "p_gvardiol_mci",
        "webName": "Gvardiol",
        "fullName": "Joško Gvardiol",
        "team": "MCI",
        "position": "DEF",
        "cost": 6,
        "projectedMinutes": 88,
        "expectedPoints": 5.82,
        "realisedPoints": 6,
        "opponent": "IPS (H)",
        "isHome": true,
        "fixtureDifficulty": 1,
        "cleanSheetProbability": 0.58,
        "selectedByPercent": 34.2
      },
      {
        "id": "p_munoz_cry",
        "webName": "Muñoz",
        "fullName": "Daniel Muñoz",
        "team": "CRY",
        "position": "DEF",
        "cost": 5,
        "projectedMinutes": 90,
        "expectedPoints": 4.25,
        "realisedPoints": 2,
        "opponent": "WHU (H)",
        "isHome": true,
        "fixtureDifficulty": 2,
        "cleanSheetProbability": 0.34,
        "selectedByPercent": 13.1
      },
      {
        "id": "p_saka_ars",
        "webName": "Saka",
        "fullName": "Bukayo Saka",
        "team": "ARS",
        "position": "MID",
        "cost": 10,
        "projectedMinutes": 89,
        "expectedPoints": 6.15,
        "realisedPoints": 6,
        "opponent": "AVL (A)",
        "isHome": false,
        "fixtureDifficulty": 3,
        "xGI": 0.65,
        "cleanSheetProbability": 0.38,
        "selectedByPercent": 35.4
      },
      {
        "id": "p_palmer_che",
        "webName": "Palmer",
        "fullName": "Cole Palmer",
        "team": "CHE",
        "position": "MID",
        "cost": 10.5,
        "projectedMinutes": 88,
        "expectedPoints": 7.42,
        "realisedPoints": 17,
        "isViceCaptain": true,
        "opponent": "WOL (A)",
        "isHome": false,
        "fixtureDifficulty": 2,
        "xGI": 0.88,
        "cleanSheetProbability": 0.22,
        "selectedByPercent": 41.3
      },
      {
        "id": "p_son_tot",
        "webName": "Son",
        "fullName": "Heung-min Son",
        "team": "TOT",
        "position": "MID",
        "cost": 10,
        "projectedMinutes": 87,
        "expectedPoints": 7.21,
        "realisedPoints": 16,
        "opponent": "EVE (H)",
        "isHome": true,
        "fixtureDifficulty": 2,
        "xGI": 0.82,
        "cleanSheetProbability": 0.42,
        "selectedByPercent": 14.7
      },
      {
        "id": "p_jota_liv",
        "webName": "Jota",
        "fullName": "Diogo Jota",
        "team": "LIV",
        "position": "MID",
        "cost": 7.5,
        "projectedMinutes": 78,
        "expectedPoints": 6.44,
        "realisedPoints": 5,
        "opponent": "BRE (H)",
        "isHome": true,
        "fixtureDifficulty": 2,
        "xGI": 0.77,
        "cleanSheetProbability": 0.44,
        "selectedByPercent": 21
      },
      {
        "id": "p_rogers_avl",
        "webName": "Rogers",
        "fullName": "Morgan Rogers",
        "team": "AVL",
        "position": "MID",
        "cost": 5,
        "projectedMinutes": 85,
        "expectedPoints": 3.75,
        "realisedPoints": 2,
        "opponent": "ARS (H)",
        "isHome": true,
        "fixtureDifficulty": 4,
        "xGI": 0.36,
        "cleanSheetProbability": 0.16,
        "selectedByPercent": 17.2
      },
      {
        "id": "p_haaland_mci",
        "webName": "Haaland",
        "fullName": "Erling Haaland",
        "team": "MCI",
        "position": "FWD",
        "cost": 15.1,
        "projectedMinutes": 89,
        "expectedPoints": 10.45,
        "realisedPoints": 17,
        "isCaptain": true,
        "multiplier": 2,
        "opponent": "IPS (H)",
        "isHome": true,
        "fixtureDifficulty": 1,
        "xGI": 1.32,
        "cleanSheetProbability": 0.58,
        "selectedByPercent": 59.8
      },
      {
        "id": "p_isak_new",
        "webName": "Isak",
        "fullName": "Alexander Isak",
        "team": "NEW",
        "position": "FWD",
        "cost": 8.5,
        "projectedMinutes": 85,
        "expectedPoints": 5.92,
        "realisedPoints": 2,
        "opponent": "BOU (A)",
        "isHome": false,
        "fixtureDifficulty": 2,
        "xGI": 0.68,
        "cleanSheetProbability": 0.33,
        "selectedByPercent": 58.4
      }
    ],
    "bench": [
      {
        "id": "p_valdimarsson_bre",
        "webName": "Valdimarsson",
        "fullName": "Hákon Valdimarsson",
        "team": "BRE",
        "position": "GKP",
        "cost": 4,
        "projectedMinutes": 0,
        "expectedPoints": 0,
        "realisedPoints": 0,
        "benchOrder": 1,
        "opponent": "LIV (A)",
        "isHome": false,
        "fixtureDifficulty": 5
      },
      {
        "id": "p_joao_pedro_bha",
        "webName": "Joao Pedro",
        "fullName": "Joao Pedro",
        "team": "BHA",
        "position": "FWD",
        "cost": 5.5,
        "projectedMinutes": 80,
        "expectedPoints": 4.51,
        "realisedPoints": 7,
        "benchOrder": 2,
        "opponent": "MUN (H)",
        "isHome": true,
        "fixtureDifficulty": 3
      },
      {
        "id": "p_faes_lei",
        "webName": "Faes",
        "fullName": "Wout Faes",
        "team": "LEI",
        "position": "DEF",
        "cost": 4,
        "projectedMinutes": 90,
        "expectedPoints": 3.1,
        "realisedPoints": 8,
        "benchOrder": 3,
        "opponent": "FUL (A)",
        "isHome": false,
        "fixtureDifficulty": 3
      },
      {
        "id": "p_barco_bha",
        "webName": "Barco",
        "fullName": "Valentín Barco",
        "team": "BHA",
        "position": "DEF",
        "cost": 4,
        "projectedMinutes": 0,
        "expectedPoints": 0,
        "realisedPoints": 0,
        "benchOrder": 4,
        "opponent": "MUN (H)",
        "isHome": true,
        "fixtureDifficulty": 3
      }
    ],
    "transfersIn": [
      {
        "id": "p_jota_liv",
        "webName": "Jota",
        "fullName": "Diogo Jota",
        "team": "LIV",
        "position": "MID",
        "cost": 7.5,
        "projectedMinutes": 78,
        "expectedPoints": 6.44,
        "realisedPoints": 5,
        "opponent": "BRE (H)",
        "isHome": true,
        "fixtureDifficulty": 2
      }
    ],
    "transfersOut": [
      {
        "id": "p_eze_cry",
        "webName": "Eze",
        "fullName": "Eberechi Eze",
        "team": "CRY",
        "position": "MID",
        "cost": 7,
        "projectedMinutes": 88,
        "expectedPoints": 4.88,
        "realisedPoints": 2,
        "opponent": "WHU (H)",
        "isHome": true,
        "fixtureDifficulty": 2
      }
    ],
    "transferActions": [
      {
        "playerIn": {
          "id": "p_jota_liv",
          "webName": "Jota",
          "team": "LIV",
          "position": "MID",
          "cost": 7.5,
          "expectedPoints": 6.44
        },
        "playerOut": {
          "id": "p_eze_cry",
          "webName": "Eze",
          "team": "CRY",
          "position": "MID",
          "sellPrice": 7,
          "expectedPoints": 4.88
        },
        "netCostDelta": 0.5,
        "netXPDelta3GW": 3.2,
        "rationale": "Direct route into Liverpool's Brentford home fixture. Jota out-expected Eze by +1.56 xP in single-week horizon and +3.2 xP over the 3-GW rolling window."
      }
    ],
    "projectedSquadTotalXP": 75.9,
    "realisedSquadTotalPoints": 98
  },
  "arms": [
    {
      "id": "baseline",
      "name": "Template Baseline (Rolling Horizon Heuristic)",
      "shortLabel": "Baseline Heuristic",
      "category": "Heuristic",
      "description": "Rolling 1 Free Transfer into GW3 to accumulate 2 FTs for the international break buffer.",
      "objectiveEP": 71.8,
      "realisedPoints": 89,
      "varianceScore": 15.6,
      "transfersCount": 0,
      "hits": 0,
      "captain": "Haaland",
      "viceCaptain": "Son",
      "chip": "none",
      "formation": "3-5-2",
      "decisionDeltaVsBaseline": 0,
      "realisedRankEffect": "Top 12% percentile",
      "solverRuntimeMs": 22
    },
    {
      "id": "optimiser",
      "name": "Mixed-Integer Linear Solver (ILP)",
      "shortLabel": "Optimiser (MILP)",
      "category": "Mixed-Integer Linear (ILP)",
      "description": "Single FT deployment: Eze to Jota using £0.5m liquidity; locks Haaland captaincy vs Ipswich (H).",
      "objectiveEP": 75.9,
      "realisedPoints": 98,
      "varianceScore": 13.9,
      "transfersCount": 1,
      "hits": 0,
      "captain": "Haaland",
      "viceCaptain": "Palmer",
      "chip": "none",
      "formation": "3-5-2",
      "decisionDeltaVsBaseline": 4.1,
      "realisedRankEffect": "Top 1.8% percentile",
      "solverRuntimeMs": 520
    },
    {
      "id": "agent",
      "name": "Multi-Objective Agent (EV + Rank Ceiling)",
      "shortLabel": "Agent (Multi-Obj)",
      "category": "Multi-Objective Agent",
      "description": "Double transfer with -4 hit: Eze + Rogers to Jota + Minteh, hunting high delta against the template.",
      "objectiveEP": 74.2,
      "realisedPoints": 91,
      "varianceScore": 22.4,
      "transfersCount": 2,
      "hits": 1,
      "captain": "Haaland",
      "viceCaptain": "Palmer",
      "chip": "none",
      "formation": "3-5-2",
      "decisionDeltaVsBaseline": 2.4,
      "realisedRankEffect": "Top 8% percentile",
      "solverRuntimeMs": 1950
    }
  ],
  "summaryAnalysis": {
    "executiveSummary": "GW2 demonstrated the payoff of keeping £0.5m in the bank from GW1. While the baseline heuristic rolled the transfer, the MILP solver spent the FT on Jota (H vs BRE), generating an immediate +4.1 xP model delta. Realised score hit 98 points as Haaland delivered 17 points (34 with armband), Palmer exploded for 17, and Son registered 16.",
    "keyTradeoffs": [
      "Roll transfer vs Eze to Jota: The solver calculated an EV threshold of +1.4 xP needed to justify spending a transfer rather than rolling. Jota's projection cleared this hurdle at +1.56 xP immediate advantage.",
      "Captaincy consensus: Haaland vs Ipswich (H) yielded an overwhelming 10.45 xP projection with a 58% clean sheet concession probability for the opposition, rendering alternative captain arms mathematically irrational.",
      "Bench sacrifice: Faes's 8-point haul on the bench was unavoidable under rational pre-match models (£4.0m Leicester defender vs Fulham away had lower EV than Arsenal and City defensive starters)."
    ],
    "shadowPrices": {
      "budgetPerMillionXP": 0.51,
      "transferMarginalValueXP": 2.15,
      "benchPointsExpectancy": 1.48
    },
    "divergenceNotes": "Agent arm attempted an aggressive -4 hit to bring in Minteh alongside Jota. The -4 hit was not recovered (+3 pts gained minus 4 hit = net -1 pt), reinforcing the MILP arm's conservative hit policy."
  },
  "datasetKind": "illustrative-sample"
}