{
  "season": "2026-27",
  "matchday": 1,
  "matches_in_model_frame": 9,
  "matches_in_player_data": 9,
  "model": {
    "name": "x_bivcross",
    "posterior": "x_bivcross_2026-27.nc",
    "beta_att_mean": 0.2576,
    "beta_att_sd": 0.0363,
    "beta_def_mean": -0.2152,
    "beta_def_sd": 0.0438,
    "draws": 8000
  },
  "thresholds": {
    "history_log_units": 0.15,
    "history_posterior_sds": 2.0,
    "delta_log_value": 0.15,
    "retained_minutes_share": 0.5,
    "squad_size_change": 6
  },
  "flagged": [
    "Nacional",
    "Maritimo",
    "Academico Viseu",
    "Santa Clara",
    "Moreirense"
  ],
  "notes": [
    "The model's strength for a club is exactly beta * log(squad value) plus its own residual, so the two columns here add back to the number the forecast uses. Nothing is approximated.",
    "Squad value enters as log(value / league median): the median club is worth EUR 31.9m this season against EUR 30.3m last season, a +5.0% move. Read the raw percentage with care — the whole league was marked down in the 2025-26 snapshot (Sporting, Porto, Benfica and Braga all fell 15-25%), so every club's change is measured off a depressed base. The model only ever sees the median-relative figure, which is what 'delta_log_value' reports.",
    "Vitoria SC's recorded value path (EUR 99.7m in 2024-25, 26.9m in 2025-26, 46.0m now) is large enough to be a snapshot artefact rather than a real collapse and rebound. No transfer record in this repository can confirm or deny it. Only the current-season figure enters the model, so it affects the story, not the forecast.",
    "Continuity comes from per-player match data: 9 matches of this season are in it so far. The current-squad side is a matchday-squad list (starters and unused substitutes), widened with the club's current injury list so that injured players are not counted as departures. Anyone at the club who is neither named nor injured still reads as gone, so retained minutes is an under-estimate — clubs that used a deep squad last season (Santa Clara used 42 players, Sporting 39) are penalised hardest by that. The returning-minutes column is the cross-check: it asks how much of what has actually been played this season came from players who were here before. A returner is anyone who was in a squad here last season, played or not — count only the footballers who actually appeared and Sporting CP's returning share falls from 70% to 61%.",
    "Promoted clubs have no measurable continuity: the per-player data covers the top flight only, and their history component comes from Liga 2 form carried across the league-quality offset.",
    "'History worth N points' re-runs that club's 34 fixtures with its own residual set to zero, from the same posterior draws, leaving every opponent untouched. It is a per-club counterfactual, not a recomputed league table, and the numbers do not sum to zero. 'xpts_rank_if_value_only' places that one rewritten club against the other seventeen as they stand, so it is only ever a one-club-at-a-time thought experiment. These expected points treat all 34 fixtures as unplayed, which is why they differ by a point or so from the published simulated table.",
    "A club is only flagged when a history component that is clearly non-zero meets a squad-change signal. Either alone is fine: a club with no squad-change signal has earned the right to be judged on its results (Gil Vicente is this season's example, and a close one — its retention sits barely above the line), and a club with no history component is already being judged on its current squad. Sporting CP is the near-miss on the other axis: a visible history component, but at roughly 1.9 posterior SDs it is not clearly separated from zero.",
    "Squad values are an annual snapshot taken after the summer window, so they do see transfers. They do not see availability: an injured player still counts in full. The injuries block is the correction the model does not make.",
    "The posterior was fitted on the 9 results in the model's data frame. If more matches have since finished (9 are in the player data), the strength figures here predate them."
  ],
  "clubs": [
    {
      "team": "Nacional",
      "flag": "over_rating_risk",
      "leaning_on_old_form": true,
      "flag_text": "The model rates this club +8.9 points above what its squad value alone implies, on the strength of its own results — but squad value moved -19% (-0.26 in log terms against the league median), and fewer than half of last season's minutes are still at the club (49%). If that form belonged to a squad that has changed, the model is over-rating them.",
      "value": {
        "squad_value_eur": 17330000.0,
        "squad_value_prev_eur": 21480000.0,
        "value_change_pct": -19.3,
        "log_value_vs_median": -0.6088,
        "log_value_vs_median_prev": -0.3449,
        "delta_log_value": -0.2639,
        "squad_size": 27.0,
        "squad_size_prev": 30.0,
        "avg_age": 24.5,
        "avg_age_prev": 26.4,
        "in_league_last_season": true
      },
      "continuity": {
        "measurable": true,
        "reason": null,
        "retained_minutes_share": 0.487,
        "returning_minutes_share": 0.709,
        "players_used_prev_season": 30.0,
        "players_retained": 15.0,
        "players_retained_via_injury_list": 1.0,
        "squad_listed_this_season": 20.0,
        "n_matches_this_season": 1.0
      },
      "strength": {
        "att_star": 0.0696,
        "att_value": -0.1568,
        "att_history": 0.2264,
        "att_history_sd": 0.0791,
        "def_star": 0.0036,
        "def_value": 0.131,
        "def_history": -0.1274,
        "def_history_sd": 0.0772,
        "net": 0.066,
        "net_value": -0.2878,
        "net_history": 0.3538,
        "net_history_sd": 0.11,
        "p_history_positive": 1.0,
        "scoring_multiplier_from_history": 1.254,
        "conceding_multiplier_from_history": 0.88,
        "xpts_season_model": 39.15,
        "xpts_season_value_only": 30.26,
        "history_xpts_season": 8.9,
        "xpts_rank": 12.0,
        "xpts_rank_if_value_only": 18.0,
        "n_fixtures": 34.0
      },
      "injuries": {
        "count": 4,
        "value_out_eur": 2400000,
        "share_of_squad_value": 0.138,
        "players": [
          {
            "player": "Ivanildo Fernandes",
            "kind": "injury",
            "reason": "unknown injury",
            "expected_return": null,
            "market_value_eur": 200000
          },
          {
            "player": "Ulisses",
            "kind": "injury",
            "reason": "unknown injury",
            "expected_return": null,
            "market_value_eur": 1000000
          },
          {
            "player": "Ivanildo Fernandes",
            "kind": "injury",
            "reason": "unknown injury",
            "expected_return": null,
            "market_value_eur": 200000
          },
          {
            "player": "Ulisses",
            "kind": "injury",
            "reason": "unknown injury",
            "expected_return": null,
            "market_value_eur": 1000000
          }
        ]
      }
    },
    {
      "team": "Maritimo",
      "flag": "promoted_history_is_liga2",
      "leaning_on_old_form": true,
      "flag_text": "Promoted: the club has no Primeira history at all, so its +7.9-point history component is Liga 2 form carried across the league-quality gap. Treat it as the softest estimate in the table, in either direction.",
      "value": {
        "squad_value_eur": 15700000.0,
        "squad_value_prev_eur": null,
        "value_change_pct": null,
        "log_value_vs_median": -0.7075,
        "log_value_vs_median_prev": null,
        "delta_log_value": null,
        "squad_size": 30.0,
        "squad_size_prev": null,
        "avg_age": 25.2,
        "avg_age_prev": null,
        "in_league_last_season": false
      },
      "continuity": {
        "measurable": false,
        "reason": "not in the Primeira in 2025-26 — per-player data covers the top flight only, so continuity across promotion cannot be measured",
        "retained_minutes_share": null,
        "returning_minutes_share": null,
        "players_used_prev_season": null,
        "players_retained": null,
        "players_retained_via_injury_list": null,
        "squad_listed_this_season": null,
        "n_matches_this_season": null
      },
      "strength": {
        "att_star": -0.0327,
        "att_value": -0.1823,
        "att_history": 0.1496,
        "att_history_sd": 0.0941,
        "def_star": -0.018,
        "def_value": 0.1522,
        "def_history": -0.1702,
        "def_history_sd": 0.0989,
        "net": -0.0147,
        "net_value": -0.3345,
        "net_history": 0.3198,
        "net_history_sd": 0.1327,
        "p_history_positive": 0.994,
        "scoring_multiplier_from_history": 1.161,
        "conceding_multiplier_from_history": 0.843,
        "xpts_season_model": 36.97,
        "xpts_season_value_only": 29.02,
        "history_xpts_season": 7.94,
        "xpts_rank": 14.0,
        "xpts_rank_if_value_only": 18.0,
        "n_fixtures": 34.0
      },
      "injuries": {
        "count": 0,
        "value_out_eur": 0,
        "share_of_squad_value": 0.0,
        "players": []
      }
    },
    {
      "team": "Academico Viseu",
      "flag": "promoted_history_is_liga2",
      "leaning_on_old_form": true,
      "flag_text": "Promoted: the club has no Primeira history at all, so its +7.5-point history component is Liga 2 form carried across the league-quality gap. Treat it as the softest estimate in the table, in either direction.",
      "value": {
        "squad_value_eur": 15330000.0,
        "squad_value_prev_eur": null,
        "value_change_pct": null,
        "log_value_vs_median": -0.7314,
        "log_value_vs_median_prev": null,
        "delta_log_value": null,
        "squad_size": 26.0,
        "squad_size_prev": null,
        "avg_age": 26.3,
        "avg_age_prev": null,
        "in_league_last_season": false
      },
      "continuity": {
        "measurable": false,
        "reason": "not in the Primeira in 2025-26 — per-player data covers the top flight only, so continuity across promotion cannot be measured",
        "retained_minutes_share": null,
        "returning_minutes_share": null,
        "players_used_prev_season": null,
        "players_retained": null,
        "players_retained_via_injury_list": null,
        "squad_listed_this_season": null,
        "n_matches_this_season": null
      },
      "strength": {
        "att_star": -0.0145,
        "att_value": -0.1884,
        "att_history": 0.174,
        "att_history_sd": 0.0944,
        "def_star": 0.0243,
        "def_value": 0.1574,
        "def_history": -0.1331,
        "def_history_sd": 0.0972,
        "net": -0.0387,
        "net_value": -0.3458,
        "net_history": 0.3071,
        "net_history_sd": 0.1331,
        "p_history_positive": 0.99,
        "scoring_multiplier_from_history": 1.19,
        "conceding_multiplier_from_history": 0.875,
        "xpts_season_model": 36.27,
        "xpts_season_value_only": 28.73,
        "history_xpts_season": 7.54,
        "xpts_rank": 15.0,
        "xpts_rank_if_value_only": 18.0,
        "n_fixtures": 34.0
      },
      "injuries": {
        "count": 0,
        "value_out_eur": 0,
        "share_of_squad_value": 0.0,
        "players": []
      }
    },
    {
      "team": "Gil Vicente",
      "flag": "history_backed_stable_squad",
      "leaning_on_old_form": false,
      "flag_text": "The model leans on this club's own results — worth +7.5 points beyond squad value — and no squad-change signal crossed the thresholds used here: squad value moved -2%; 50% of last season's minutes are still here; 76% of this season's minutes have been played by returners. That is not the same as an unchanged squad, but nothing in the data says the model's read of this club belongs to a team that no longer exists.",
      "value": {
        "squad_value_eur": 28300000.0,
        "squad_value_prev_eur": 28750000.0,
        "value_change_pct": -1.6,
        "log_value_vs_median": -0.1183,
        "log_value_vs_median_prev": -0.0533,
        "delta_log_value": -0.065,
        "squad_size": 29.0,
        "squad_size_prev": 27.0,
        "avg_age": 24.5,
        "avg_age_prev": 25.0,
        "in_league_last_season": true
      },
      "continuity": {
        "measurable": true,
        "reason": null,
        "retained_minutes_share": 0.504,
        "returning_minutes_share": 0.761,
        "players_used_prev_season": 34.0,
        "players_retained": 17.0,
        "players_retained_via_injury_list": 1.0,
        "squad_listed_this_season": 23.0,
        "n_matches_this_season": 1.0
      },
      "strength": {
        "att_star": 0.0675,
        "att_value": -0.0305,
        "att_history": 0.0979,
        "att_history_sd": 0.0678,
        "def_star": -0.1625,
        "def_value": 0.0255,
        "def_history": -0.188,
        "def_history_sd": 0.072,
        "net": 0.23,
        "net_value": -0.0559,
        "net_history": 0.2859,
        "net_history_sd": 0.0982,
        "p_history_positive": 0.999,
        "scoring_multiplier_from_history": 1.103,
        "conceding_multiplier_from_history": 0.829,
        "xpts_season_model": 43.74,
        "xpts_season_value_only": 36.24,
        "history_xpts_season": 7.51,
        "xpts_rank": 7.0,
        "xpts_rank_if_value_only": 15.0,
        "n_fixtures": 34.0
      },
      "injuries": {
        "count": 2,
        "value_out_eur": 3000000,
        "share_of_squad_value": 0.106,
        "players": [
          {
            "player": "Mohamed Bamba",
            "kind": "injury",
            "reason": "unknown injury",
            "expected_return": null,
            "market_value_eur": 1500000
          },
          {
            "player": "Mohamed Bamba",
            "kind": "injury",
            "reason": "unknown injury",
            "expected_return": null,
            "market_value_eur": 1500000
          }
        ]
      }
    },
    {
      "team": "Santa Clara",
      "flag": "over_rating_risk",
      "leaning_on_old_form": true,
      "flag_text": "The model rates this club +7.3 points above what its squad value alone implies, on the strength of its own results — but squad value moved -13% (-0.19 in log terms against the league median), fewer than half of last season's minutes are still at the club (40%), and the listed squad went from 26 to 38. If that form belonged to a squad that has changed, the model is over-rating them.",
      "value": {
        "squad_value_eur": 28680000.0,
        "squad_value_prev_eur": 33150000.0,
        "value_change_pct": -13.5,
        "log_value_vs_median": -0.105,
        "log_value_vs_median_prev": 0.0891,
        "delta_log_value": -0.1941,
        "squad_size": 38.0,
        "squad_size_prev": 26.0,
        "avg_age": 25.0,
        "avg_age_prev": 26.3,
        "in_league_last_season": true
      },
      "continuity": {
        "measurable": true,
        "reason": null,
        "retained_minutes_share": 0.395,
        "returning_minutes_share": 0.717,
        "players_used_prev_season": 42.0,
        "players_retained": 12.0,
        "players_retained_via_injury_list": 0.0,
        "squad_listed_this_season": 22.0,
        "n_matches_this_season": 1.0
      },
      "strength": {
        "att_star": -0.0404,
        "att_value": -0.027,
        "att_history": -0.0133,
        "att_history_sd": 0.0703,
        "def_star": -0.2788,
        "def_value": 0.0226,
        "def_history": -0.3014,
        "def_history_sd": 0.0849,
        "net": 0.2385,
        "net_value": -0.0496,
        "net_history": 0.2881,
        "net_history_sd": 0.1073,
        "p_history_positive": 0.997,
        "scoring_multiplier_from_history": 0.987,
        "conceding_multiplier_from_history": 0.74,
        "xpts_season_model": 43.74,
        "xpts_season_value_only": 36.4,
        "history_xpts_season": 7.34,
        "xpts_rank": 8.0,
        "xpts_rank_if_value_only": 14.0,
        "n_fixtures": 34.0
      },
      "injuries": {
        "count": 2,
        "value_out_eur": 7000000,
        "share_of_squad_value": 0.244,
        "players": [
          {
            "player": "MT",
            "kind": "injury",
            "reason": "Cruciate ligament tear",
            "expected_return": null,
            "market_value_eur": 3500000
          },
          {
            "player": "MT",
            "kind": "injury",
            "reason": "Cruciate ligament tear",
            "expected_return": null,
            "market_value_eur": 3500000
          }
        ]
      }
    },
    {
      "team": "Moreirense",
      "flag": "over_rating_risk",
      "leaning_on_old_form": true,
      "flag_text": "The model rates this club +6.1 points above what its squad value alone implies, on the strength of its own results — but squad value moved -23% (-0.31 in log terms against the league median). If that form belonged to a squad that has changed, the model is over-rating them.",
      "value": {
        "squad_value_eur": 20450000.0,
        "squad_value_prev_eur": 26550000.0,
        "value_change_pct": -23.0,
        "log_value_vs_median": -0.4432,
        "log_value_vs_median_prev": -0.1329,
        "delta_log_value": -0.3103,
        "squad_size": 24.0,
        "squad_size_prev": 26.0,
        "avg_age": 23.3,
        "avg_age_prev": 24.4,
        "in_league_last_season": true
      },
      "continuity": {
        "measurable": true,
        "reason": null,
        "retained_minutes_share": 0.502,
        "returning_minutes_share": 0.751,
        "players_used_prev_season": 31.0,
        "players_retained": 14.0,
        "players_retained_via_injury_list": 0.0,
        "squad_listed_this_season": 22.0,
        "n_matches_this_season": 1.0
      },
      "strength": {
        "att_star": -0.0619,
        "att_value": -0.1142,
        "att_history": 0.0523,
        "att_history_sd": 0.073,
        "def_star": -0.09,
        "def_value": 0.0954,
        "def_history": -0.1853,
        "def_history_sd": 0.0744,
        "net": 0.0281,
        "net_value": -0.2095,
        "net_history": 0.2376,
        "net_history_sd": 0.1025,
        "p_history_positive": 0.991,
        "scoring_multiplier_from_history": 1.054,
        "conceding_multiplier_from_history": 0.831,
        "xpts_season_model": 38.17,
        "xpts_season_value_only": 32.07,
        "history_xpts_season": 6.11,
        "xpts_rank": 13.0,
        "xpts_rank_if_value_only": 18.0,
        "n_fixtures": 34.0
      },
      "injuries": {
        "count": 0,
        "value_out_eur": 0,
        "share_of_squad_value": 0.0,
        "players": []
      }
    },
    {
      "team": "Sporting CP",
      "flag": "value_channel_carries_it",
      "leaning_on_old_form": false,
      "flag_text": "The squad changed — the listed squad went from 24 to 30 — and its own record is worth +5.9 points, but at +0.23 +- 0.13 in log terms that is not clearly separated from zero. The estimate therefore rests mainly on current squad value, which already reflects the new squad.",
      "value": {
        "squad_value_eur": 446700000.0,
        "squad_value_prev_eur": 464000000.0,
        "value_change_pct": -3.7,
        "log_value_vs_median": 2.6407,
        "log_value_vs_median_prev": 2.7279,
        "delta_log_value": -0.0872,
        "squad_size": 30.0,
        "squad_size_prev": 24.0,
        "avg_age": 24.4,
        "avg_age_prev": 25.3,
        "in_league_last_season": true
      },
      "continuity": {
        "measurable": true,
        "reason": null,
        "retained_minutes_share": 0.524,
        "returning_minutes_share": 0.698,
        "players_used_prev_season": 39.0,
        "players_retained": 18.0,
        "players_retained_via_injury_list": 2.0,
        "squad_listed_this_season": 22.0,
        "n_matches_this_season": 1.0
      },
      "strength": {
        "att_star": 0.8223,
        "att_value": 0.6803,
        "att_history": 0.142,
        "att_history_sd": 0.081,
        "def_star": -0.6592,
        "def_value": -0.5681,
        "def_history": -0.0911,
        "def_history_sd": 0.1007,
        "net": 1.4815,
        "net_value": 1.2485,
        "net_history": 0.2331,
        "net_history_sd": 0.1259,
        "p_history_positive": 0.974,
        "scoring_multiplier_from_history": 1.153,
        "conceding_multiplier_from_history": 0.913,
        "xpts_season_model": 79.9,
        "xpts_season_value_only": 74.03,
        "history_xpts_season": 5.88,
        "xpts_rank": 1.0,
        "xpts_rank_if_value_only": 2.0,
        "n_fixtures": 34.0
      },
      "injuries": {
        "count": 4,
        "value_out_eur": 35000000,
        "share_of_squad_value": 0.078,
        "players": [
          {
            "player": "João Simões",
            "kind": "injury",
            "reason": "Metatarsal fracture",
            "expected_return": "2026-08-31",
            "market_value_eur": 15000000
          },
          {
            "player": "Salvador Blopa",
            "kind": "injury",
            "reason": "Muscle injury",
            "expected_return": "2026-08-31",
            "market_value_eur": 2500000
          },
          {
            "player": "João Simões",
            "kind": "injury",
            "reason": "Metatarsal fracture",
            "expected_return": "2026-08-31",
            "market_value_eur": 15000000
          },
          {
            "player": "Salvador Blopa",
            "kind": "injury",
            "reason": "Muscle injury",
            "expected_return": "2026-08-31",
            "market_value_eur": 2500000
          }
        ]
      }
    },
    {
      "team": "Arouca",
      "flag": "stable",
      "leaning_on_old_form": false,
      "flag_text": "No squad-change signal, and its own record is worth +4.7 points, but at +0.18 +- 0.09 in log terms that is not clearly separated from zero. Nothing here needs a health warning.",
      "value": {
        "squad_value_eur": 27480000.0,
        "squad_value_prev_eur": 25350000.0,
        "value_change_pct": 8.4,
        "log_value_vs_median": -0.1477,
        "log_value_vs_median_prev": -0.1792,
        "delta_log_value": 0.0315,
        "squad_size": 26.0,
        "squad_size_prev": 27.0,
        "avg_age": 24.9,
        "avg_age_prev": 24.9,
        "in_league_last_season": true
      },
      "continuity": {
        "measurable": true,
        "reason": null,
        "retained_minutes_share": 0.774,
        "returning_minutes_share": 0.975,
        "players_used_prev_season": 35.0,
        "players_retained": 19.0,
        "players_retained_via_injury_list": 0.0,
        "squad_listed_this_season": 23.0,
        "n_matches_this_season": 1.0
      },
      "strength": {
        "att_star": 0.096,
        "att_value": -0.0381,
        "att_history": 0.1341,
        "att_history_sd": 0.0714,
        "def_star": -0.0137,
        "def_value": 0.0318,
        "def_history": -0.0455,
        "def_history_sd": 0.0646,
        "net": 0.1097,
        "net_value": -0.0698,
        "net_history": 0.1796,
        "net_history_sd": 0.0947,
        "p_history_positive": 0.972,
        "scoring_multiplier_from_history": 1.144,
        "conceding_multiplier_from_history": 0.956,
        "xpts_season_model": 40.41,
        "xpts_season_value_only": 35.69,
        "history_xpts_season": 4.72,
        "xpts_rank": 10.0,
        "xpts_rank_if_value_only": 15.0,
        "n_fixtures": 34.0
      },
      "injuries": {
        "count": 0,
        "value_out_eur": 0,
        "share_of_squad_value": 0.0,
        "players": []
      }
    },
    {
      "team": "Vitoria SC",
      "flag": "value_channel_carries_it",
      "leaning_on_old_form": false,
      "flag_text": "The squad changed — squad value moved +71% (+0.49 in log terms against the league median) — and its own record is worth +3.8 points, but at +0.14 +- 0.09 in log terms that is not clearly separated from zero. The estimate therefore rests mainly on current squad value, which already reflects the new squad.",
      "value": {
        "squad_value_eur": 46000000.0,
        "squad_value_prev_eur": 26900000.0,
        "value_change_pct": 71.0,
        "log_value_vs_median": 0.3674,
        "log_value_vs_median_prev": -0.1198,
        "delta_log_value": 0.4873,
        "squad_size": 30.0,
        "squad_size_prev": 25.0,
        "avg_age": 24.4,
        "avg_age_prev": 24.5,
        "in_league_last_season": true
      },
      "continuity": {
        "measurable": true,
        "reason": null,
        "retained_minutes_share": 0.654,
        "returning_minutes_share": 0.908,
        "players_used_prev_season": 38.0,
        "players_retained": 16.0,
        "players_retained_via_injury_list": 0.0,
        "squad_listed_this_season": 21.0,
        "n_matches_this_season": 1.0
      },
      "strength": {
        "att_star": 0.1361,
        "att_value": 0.0947,
        "att_history": 0.0415,
        "att_history_sd": 0.066,
        "def_star": -0.1814,
        "def_value": -0.0791,
        "def_history": -0.1024,
        "def_history_sd": 0.0651,
        "net": 0.3175,
        "net_value": 0.1737,
        "net_history": 0.1438,
        "net_history_sd": 0.0892,
        "p_history_positive": 0.949,
        "scoring_multiplier_from_history": 1.042,
        "conceding_multiplier_from_history": 0.903,
        "xpts_season_model": 46.3,
        "xpts_season_value_only": 42.46,
        "history_xpts_season": 3.84,
        "xpts_rank": 6.0,
        "xpts_rank_if_value_only": 8.0,
        "n_fixtures": 34.0
      },
      "injuries": {
        "count": 0,
        "value_out_eur": 0,
        "share_of_squad_value": 0.0,
        "players": []
      }
    },
    {
      "team": "Benfica",
      "flag": "stable",
      "leaning_on_old_form": false,
      "flag_text": "No squad-change signal, and its own record is worth +2.8 points, but at +0.07 +- 0.12 in log terms that is not clearly separated from zero. Nothing here needs a health warning.",
      "value": {
        "squad_value_eur": 385550000.0,
        "squad_value_prev_eur": 361500000.0,
        "value_change_pct": 6.7,
        "log_value_vs_median": 2.4935,
        "log_value_vs_median_prev": 2.4783,
        "delta_log_value": 0.0152,
        "squad_size": 29.0,
        "squad_size_prev": 28.0,
        "avg_age": 24.6,
        "avg_age_prev": 24.6,
        "in_league_last_season": true
      },
      "continuity": {
        "measurable": true,
        "reason": null,
        "retained_minutes_share": 0.746,
        "returning_minutes_share": 0.901,
        "players_used_prev_season": 44.0,
        "players_retained": 19.0,
        "players_retained_via_injury_list": 0.0,
        "squad_listed_this_season": 23.0,
        "n_matches_this_season": 1.0
      },
      "strength": {
        "att_star": 0.7568,
        "att_value": 0.6424,
        "att_history": 0.1144,
        "att_history_sd": 0.0782,
        "def_star": -0.4889,
        "def_value": -0.5365,
        "def_history": 0.0476,
        "def_history_sd": 0.0961,
        "net": 1.2457,
        "net_value": 1.1789,
        "net_history": 0.0668,
        "net_history_sd": 0.122,
        "p_history_positive": 0.716,
        "scoring_multiplier_from_history": 1.121,
        "conceding_multiplier_from_history": 1.049,
        "xpts_season_model": 74.62,
        "xpts_season_value_only": 71.82,
        "history_xpts_season": 2.8,
        "xpts_rank": 2.0,
        "xpts_rank_if_value_only": 2.0,
        "n_fixtures": 34.0
      },
      "injuries": {
        "count": 0,
        "value_out_eur": 0,
        "share_of_squad_value": 0.0,
        "players": []
      }
    },
    {
      "team": "Estrela Amadora",
      "flag": "value_channel_carries_it",
      "leaning_on_old_form": false,
      "flag_text": "The squad changed — fewer than half of last season's minutes are still at the club (45%), and the listed squad went from 32 to 25 — and its own record is worth +2.2 points, but at +0.08 +- 0.10 in log terms that is not clearly separated from zero. The estimate therefore rests mainly on current squad value, which already reflects the new squad.",
      "value": {
        "squad_value_eur": 19300000.0,
        "squad_value_prev_eur": 17700000.0,
        "value_change_pct": 9.0,
        "log_value_vs_median": -0.5011,
        "log_value_vs_median_prev": -0.5384,
        "delta_log_value": 0.0373,
        "squad_size": 25.0,
        "squad_size_prev": 32.0,
        "avg_age": 24.6,
        "avg_age_prev": 24.8,
        "in_league_last_season": true
      },
      "continuity": {
        "measurable": true,
        "reason": null,
        "retained_minutes_share": 0.45,
        "returning_minutes_share": 0.645,
        "players_used_prev_season": 46.0,
        "players_retained": 16.0,
        "players_retained_via_injury_list": 0.0,
        "squad_listed_this_season": 23.0,
        "n_matches_this_season": 1.0
      },
      "strength": {
        "att_star": -0.1421,
        "att_value": -0.1291,
        "att_history": -0.0131,
        "att_history_sd": 0.0718,
        "def_star": 0.0126,
        "def_value": 0.1078,
        "def_history": -0.0952,
        "def_history_sd": 0.0701,
        "net": -0.1547,
        "net_value": -0.2369,
        "net_history": 0.0822,
        "net_history_sd": 0.0995,
        "p_history_positive": 0.797,
        "scoring_multiplier_from_history": 0.987,
        "conceding_multiplier_from_history": 0.909,
        "xpts_season_model": 33.33,
        "xpts_season_value_only": 31.11,
        "history_xpts_season": 2.22,
        "xpts_rank": 17.0,
        "xpts_rank_if_value_only": 18.0,
        "n_fixtures": 34.0
      },
      "injuries": {
        "count": 0,
        "value_out_eur": 0,
        "share_of_squad_value": 0.0,
        "players": []
      }
    },
    {
      "team": "Famalicao",
      "flag": "value_channel_carries_it",
      "leaning_on_old_form": false,
      "flag_text": "The squad changed — squad value moved -16% (-0.22 in log terms against the league median) — and its own record is worth +2.0 points, but at +0.08 +- 0.09 in log terms that is not clearly separated from zero. The estimate therefore rests mainly on current squad value, which already reflects the new squad.",
      "value": {
        "squad_value_eur": 57200000.0,
        "squad_value_prev_eur": 67700000.0,
        "value_change_pct": -15.5,
        "log_value_vs_median": 0.5854,
        "log_value_vs_median_prev": 0.8031,
        "delta_log_value": -0.2178,
        "squad_size": 26.0,
        "squad_size_prev": 26.0,
        "avg_age": 23.4,
        "avg_age_prev": 24.1,
        "in_league_last_season": true
      },
      "continuity": {
        "measurable": true,
        "reason": null,
        "retained_minutes_share": 0.634,
        "returning_minutes_share": 0.802,
        "players_used_prev_season": 30.0,
        "players_retained": 18.0,
        "players_retained_via_injury_list": 0.0,
        "squad_listed_this_season": 23.0,
        "n_matches_this_season": 1.0
      },
      "strength": {
        "att_star": 0.1329,
        "att_value": 0.1508,
        "att_history": -0.0179,
        "att_history_sd": 0.065,
        "def_star": -0.2258,
        "def_value": -0.1259,
        "def_history": -0.0999,
        "def_history_sd": 0.0695,
        "net": 0.3587,
        "net_value": 0.2767,
        "net_history": 0.082,
        "net_history_sd": 0.0931,
        "p_history_positive": 0.811,
        "scoring_multiplier_from_history": 0.982,
        "conceding_multiplier_from_history": 0.905,
        "xpts_season_model": 47.39,
        "xpts_season_value_only": 45.36,
        "history_xpts_season": 2.04,
        "xpts_rank": 5.0,
        "xpts_rank_if_value_only": 6.0,
        "n_fixtures": 34.0
      },
      "injuries": {
        "count": 0,
        "value_out_eur": 0,
        "share_of_squad_value": 0.0,
        "players": []
      }
    },
    {
      "team": "SC Braga",
      "flag": "stable",
      "leaning_on_old_form": false,
      "flag_text": "No squad-change signal, and its own record is worth +1.6 points, but at +0.04 +- 0.10 in log terms that is not clearly separated from zero. Nothing here needs a health warning.",
      "value": {
        "squad_value_eur": 155000000.0,
        "squad_value_prev_eur": 146400000.0,
        "value_change_pct": 5.9,
        "log_value_vs_median": 1.5822,
        "log_value_vs_median_prev": 1.5744,
        "delta_log_value": 0.0079,
        "squad_size": 32.0,
        "squad_size_prev": 28.0,
        "avg_age": 25.1,
        "avg_age_prev": 25.4,
        "in_league_last_season": true
      },
      "continuity": {
        "measurable": true,
        "reason": null,
        "retained_minutes_share": 0.703,
        "returning_minutes_share": 0.691,
        "players_used_prev_season": 39.0,
        "players_retained": 18.0,
        "players_retained_via_injury_list": 1.0,
        "squad_listed_this_season": 23.0,
        "n_matches_this_season": 1.0
      },
      "strength": {
        "att_star": 0.4669,
        "att_value": 0.4076,
        "att_history": 0.0592,
        "att_history_sd": 0.0667,
        "def_star": -0.3247,
        "def_value": -0.3404,
        "def_history": 0.0157,
        "def_history_sd": 0.0784,
        "net": 0.7916,
        "net_value": 0.748,
        "net_history": 0.0436,
        "net_history_sd": 0.1006,
        "p_history_positive": 0.671,
        "scoring_multiplier_from_history": 1.061,
        "conceding_multiplier_from_history": 1.016,
        "xpts_season_model": 60.89,
        "xpts_season_value_only": 59.33,
        "history_xpts_season": 1.56,
        "xpts_rank": 4.0,
        "xpts_rank_if_value_only": 4.0,
        "n_fixtures": 34.0
      },
      "injuries": {
        "count": 6,
        "value_out_eur": 38000000,
        "share_of_squad_value": 0.245,
        "players": [
          {
            "player": "Adrian Barisic",
            "kind": "injury",
            "reason": "Adductor injury",
            "expected_return": null,
            "market_value_eur": 4000000
          },
          {
            "player": "Bright Arrey-Mbi",
            "kind": "injury",
            "reason": "unknown injury",
            "expected_return": null,
            "market_value_eur": 9000000
          },
          {
            "player": "Sikou Niakaté",
            "kind": "injury",
            "reason": "Achilles tendon rupture",
            "expected_return": null,
            "market_value_eur": 6000000
          },
          {
            "player": "Adrian Barisic",
            "kind": "injury",
            "reason": "Adductor injury",
            "expected_return": null,
            "market_value_eur": 4000000
          },
          {
            "player": "Bright Arrey-Mbi",
            "kind": "injury",
            "reason": "unknown injury",
            "expected_return": null,
            "market_value_eur": 9000000
          },
          {
            "player": "Sikou Niakaté",
            "kind": "injury",
            "reason": "Achilles tendon rupture",
            "expected_return": null,
            "market_value_eur": 6000000
          }
        ]
      }
    },
    {
      "team": "Alverca",
      "flag": "stable",
      "leaning_on_old_form": false,
      "flag_text": "No squad-change signal, and its own record is worth +1.4 points, but at +0.05 +- 0.11 in log terms that is not clearly separated from zero. Nothing here needs a health warning.",
      "value": {
        "squad_value_eur": 35680000.0,
        "squad_value_prev_eur": 33700000.0,
        "value_change_pct": 5.9,
        "log_value_vs_median": 0.1134,
        "log_value_vs_median_prev": 0.1055,
        "delta_log_value": 0.0079,
        "squad_size": 29.0,
        "squad_size_prev": 31.0,
        "avg_age": 24.1,
        "avg_age_prev": 24.1,
        "in_league_last_season": true
      },
      "continuity": {
        "measurable": true,
        "reason": null,
        "retained_minutes_share": 0.528,
        "returning_minutes_share": 0.763,
        "players_used_prev_season": 37.0,
        "players_retained": 15.0,
        "players_retained_via_injury_list": 0.0,
        "squad_listed_this_season": 23.0,
        "n_matches_this_season": 1.0
      },
      "strength": {
        "att_star": 0.0451,
        "att_value": 0.0292,
        "att_history": 0.0159,
        "att_history_sd": 0.0779,
        "def_star": -0.0594,
        "def_value": -0.0244,
        "def_history": -0.035,
        "def_history_sd": 0.076,
        "net": 0.1045,
        "net_value": 0.0536,
        "net_history": 0.0509,
        "net_history_sd": 0.1066,
        "p_history_positive": 0.684,
        "scoring_multiplier_from_history": 1.016,
        "conceding_multiplier_from_history": 0.966,
        "xpts_season_model": 40.26,
        "xpts_season_value_only": 38.88,
        "history_xpts_season": 1.37,
        "xpts_rank": 11.0,
        "xpts_rank_if_value_only": 12.0,
        "n_fixtures": 34.0
      },
      "injuries": {
        "count": 0,
        "value_out_eur": 0,
        "share_of_squad_value": 0.0,
        "players": []
      }
    },
    {
      "team": "Estoril",
      "flag": "value_channel_carries_it",
      "leaning_on_old_form": false,
      "flag_text": "The squad changed — squad value moved +32% (+0.23 in log terms against the league median) — and its own record is worth +0.7 points, but at +0.02 +- 0.09 in log terms that is not clearly separated from zero. The estimate therefore rests mainly on current squad value, which already reflects the new squad.",
      "value": {
        "squad_value_eur": 42250000.0,
        "squad_value_prev_eur": 31900000.0,
        "value_change_pct": 32.4,
        "log_value_vs_median": 0.2824,
        "log_value_vs_median_prev": 0.0506,
        "delta_log_value": 0.2318,
        "squad_size": 27.0,
        "squad_size_prev": 23.0,
        "avg_age": 25.2,
        "avg_age_prev": 26.3,
        "in_league_last_season": true
      },
      "continuity": {
        "measurable": true,
        "reason": null,
        "retained_minutes_share": 0.634,
        "returning_minutes_share": 0.819,
        "players_used_prev_season": 33.0,
        "players_retained": 19.0,
        "players_retained_via_injury_list": 0.0,
        "squad_listed_this_season": 22.0,
        "n_matches_this_season": 1.0
      },
      "strength": {
        "att_star": 0.1618,
        "att_value": 0.0728,
        "att_history": 0.0891,
        "att_history_sd": 0.0664,
        "def_star": 0.0051,
        "def_value": -0.0608,
        "def_history": 0.0659,
        "def_history_sd": 0.0611,
        "net": 0.1567,
        "net_value": 0.1335,
        "net_history": 0.0232,
        "net_history_sd": 0.0887,
        "p_history_positive": 0.6,
        "scoring_multiplier_from_history": 1.093,
        "conceding_multiplier_from_history": 1.068,
        "xpts_season_model": 41.8,
        "xpts_season_value_only": 41.09,
        "history_xpts_season": 0.71,
        "xpts_rank": 9.0,
        "xpts_rank_if_value_only": 9.0,
        "n_fixtures": 34.0
      },
      "injuries": {
        "count": 0,
        "value_out_eur": 0,
        "share_of_squad_value": 0.0,
        "players": []
      }
    },
    {
      "team": "Casa Pia",
      "flag": "value_channel_carries_it",
      "leaning_on_old_form": false,
      "flag_text": "The squad changed — squad value moved -12% (-0.17 in log terms against the league median), and fewer than half of last season's minutes are still at the club (40%) — and its own record is worth +0.5 points, but at +0.01 +- 0.10 in log terms that is not clearly separated from zero. The estimate therefore rests mainly on current squad value, which already reflects the new squad.",
      "value": {
        "squad_value_eur": 22150000.0,
        "squad_value_prev_eur": 25100000.0,
        "value_change_pct": -11.8,
        "log_value_vs_median": -0.3634,
        "log_value_vs_median_prev": -0.1891,
        "delta_log_value": -0.1743,
        "squad_size": 27.0,
        "squad_size_prev": 29.0,
        "avg_age": 27.2,
        "avg_age_prev": 27.5,
        "in_league_last_season": true
      },
      "continuity": {
        "measurable": true,
        "reason": null,
        "retained_minutes_share": 0.401,
        "returning_minutes_share": 0.626,
        "players_used_prev_season": 35.0,
        "players_retained": 15.0,
        "players_retained_via_injury_list": 0.0,
        "squad_listed_this_season": 22.0,
        "n_matches_this_season": 1.0
      },
      "strength": {
        "att_star": -0.1448,
        "att_value": -0.0936,
        "att_history": -0.0512,
        "att_history_sd": 0.0731,
        "def_star": 0.0159,
        "def_value": 0.0782,
        "def_history": -0.0623,
        "def_history_sd": 0.067,
        "net": -0.1606,
        "net_value": -0.1718,
        "net_history": 0.0112,
        "net_history_sd": 0.0966,
        "p_history_positive": 0.543,
        "scoring_multiplier_from_history": 0.95,
        "conceding_multiplier_from_history": 0.94,
        "xpts_season_model": 33.18,
        "xpts_season_value_only": 32.69,
        "history_xpts_season": 0.49,
        "xpts_rank": 18.0,
        "xpts_rank_if_value_only": 18.0,
        "n_fixtures": 34.0
      },
      "injuries": {
        "count": 0,
        "value_out_eur": 0,
        "share_of_squad_value": 0.0,
        "players": []
      }
    },
    {
      "team": "Porto",
      "flag": "stable",
      "leaning_on_old_form": false,
      "flag_text": "No squad-change signal, and its own record is worth -2.4 points, but at -0.02 +- 0.13 in log terms that is not clearly separated from zero. Nothing here needs a health warning.",
      "value": {
        "squad_value_eur": 467100000.0,
        "squad_value_prev_eur": 428400000.0,
        "value_change_pct": 9.0,
        "log_value_vs_median": 2.6853,
        "log_value_vs_median_prev": 2.6481,
        "delta_log_value": 0.0373,
        "squad_size": 30.0,
        "squad_size_prev": 27.0,
        "avg_age": 25.6,
        "avg_age_prev": 26.2,
        "in_league_last_season": true
      },
      "continuity": {
        "measurable": true,
        "reason": null,
        "retained_minutes_share": 0.884,
        "returning_minutes_share": 0.917,
        "players_used_prev_season": 38.0,
        "players_retained": 22.0,
        "players_retained_via_injury_list": 3.0,
        "squad_listed_this_season": 23.0,
        "n_matches_this_season": 1.0
      },
      "strength": {
        "att_star": 0.5461,
        "att_value": 0.6918,
        "att_history": -0.1458,
        "att_history_sd": 0.0826,
        "def_star": -0.7003,
        "def_value": -0.5778,
        "def_history": -0.1226,
        "def_history_sd": 0.1014,
        "net": 1.2464,
        "net_value": 1.2696,
        "net_history": -0.0232,
        "net_history_sd": 0.1287,
        "p_history_positive": 0.431,
        "scoring_multiplier_from_history": 0.864,
        "conceding_multiplier_from_history": 0.885,
        "xpts_season_model": 71.71,
        "xpts_season_value_only": 74.15,
        "history_xpts_season": -2.44,
        "xpts_rank": 3.0,
        "xpts_rank_if_value_only": 3.0,
        "n_fixtures": 34.0
      },
      "injuries": {
        "count": 6,
        "value_out_eur": 144000000,
        "share_of_squad_value": 0.308,
        "players": [
          {
            "player": "Oskar Pietuszewski",
            "kind": "injury",
            "reason": "Muscle injury",
            "expected_return": null,
            "market_value_eur": 25000000
          },
          {
            "player": "Samu Aghehowa",
            "kind": "injury",
            "reason": "Cruciate ligament tear",
            "expected_return": "2026-10-31",
            "market_value_eur": 45000000
          },
          {
            "player": "Vasco Sousa",
            "kind": "injury",
            "reason": "Broken fibula",
            "expected_return": null,
            "market_value_eur": 2000000
          },
          {
            "player": "Oskar Pietuszewski",
            "kind": "injury",
            "reason": "Muscle injury",
            "expected_return": null,
            "market_value_eur": 25000000
          },
          {
            "player": "Samu Aghehowa",
            "kind": "injury",
            "reason": "Cruciate ligament tear",
            "expected_return": "2026-10-31",
            "market_value_eur": 45000000
          },
          {
            "player": "Vasco Sousa",
            "kind": "injury",
            "reason": "Broken fibula",
            "expected_return": null,
            "market_value_eur": 2000000
          }
        ]
      }
    },
    {
      "team": "Rio Ave",
      "flag": "stable",
      "leaning_on_old_form": false,
      "flag_text": "No squad-change signal, and its own record is worth -2.8 points, but at -0.10 +- 0.09 in log terms that is not clearly separated from zero. Nothing here needs a health warning.",
      "value": {
        "squad_value_eur": 35030000.0,
        "squad_value_prev_eur": 32900000.0,
        "value_change_pct": 6.5,
        "log_value_vs_median": 0.095,
        "log_value_vs_median_prev": 0.0815,
        "delta_log_value": 0.0135,
        "squad_size": 26.0,
        "squad_size_prev": 29.0,
        "avg_age": 24.6,
        "avg_age_prev": 24.8,
        "in_league_last_season": true
      },
      "continuity": {
        "measurable": true,
        "reason": null,
        "retained_minutes_share": 0.711,
        "returning_minutes_share": 0.862,
        "players_used_prev_season": 36.0,
        "players_retained": 19.0,
        "players_retained_via_injury_list": 2.0,
        "squad_listed_this_season": 23.0,
        "n_matches_this_season": 1.0
      },
      "strength": {
        "att_star": 0.0102,
        "att_value": 0.0245,
        "att_history": -0.0143,
        "att_history_sd": 0.0663,
        "def_star": 0.0696,
        "def_value": -0.0204,
        "def_history": 0.09,
        "def_history_sd": 0.0623,
        "net": -0.0594,
        "net_value": 0.0449,
        "net_history": -0.1043,
        "net_history_sd": 0.088,
        "p_history_positive": 0.116,
        "scoring_multiplier_from_history": 0.986,
        "conceding_multiplier_from_history": 1.094,
        "xpts_season_model": 35.6,
        "xpts_season_value_only": 38.36,
        "history_xpts_season": -2.76,
        "xpts_rank": 16.0,
        "xpts_rank_if_value_only": 13.0,
        "n_fixtures": 34.0
      },
      "injuries": {
        "count": 4,
        "value_out_eur": 13000000,
        "share_of_squad_value": 0.371,
        "players": [
          {
            "player": "Brandon Aguilera",
            "kind": "injury",
            "reason": "Cruciate ligament tear",
            "expected_return": null,
            "market_value_eur": 1500000
          },
          {
            "player": "Cezary Miszta",
            "kind": "injury",
            "reason": "Back problems",
            "expected_return": null,
            "market_value_eur": 5000000
          },
          {
            "player": "Brandon Aguilera",
            "kind": "injury",
            "reason": "Cruciate ligament tear",
            "expected_return": null,
            "market_value_eur": 1500000
          },
          {
            "player": "Cezary Miszta",
            "kind": "injury",
            "reason": "Back problems",
            "expected_return": null,
            "market_value_eur": 5000000
          }
        ]
      }
    }
  ]
}