{
  "match": "France vs Morocco",
  "protocol": "Protocol 1",
  "highlight_fact_count": 50,
  "supplemental_fact_count": 150,
  "total_fact_count": 200,
  "facts": [
    {
      "fact_id": "F001",
      "layer": "highlight-50",
      "side": "match",
      "category": "Fixture",
      "fact": "France and Morocco meet on July 9, 2026 in the first World Cup quarter-final at Gillette Stadium / Boston Stadium.",
      "source_label": "Le Monde France-Morocco preview",
      "source_url": "https://www.lemonde.fr/en/le-monde-africa/article/2026/07/08/france-vs-morocco-the-atlas-lions-seek-redemption-four-years-after-their-world-cup-semifinal-defeat-in-qatar_6755289_124.html",
      "row_ref": "",
      "model_use": "Fixture boundary: defines the match, stage, and historical rematch context before modeling."
    },
    {
      "fact_id": "F002",
      "layer": "highlight-50",
      "side": "match",
      "category": "Fixture",
      "fact": "This is a rematch of the 2022 World Cup semi-final, where France ended Morocco's run with a 2-0 win.",
      "source_label": "Le Monde France-Morocco preview",
      "source_url": "https://www.lemonde.fr/en/le-monde-africa/article/2026/07/08/france-vs-morocco-the-atlas-lions-seek-redemption-four-years-after-their-world-cup-semifinal-defeat-in-qatar_6755289_124.html",
      "row_ref": "",
      "model_use": "Fixture boundary: defines the match, stage, and historical rematch context before modeling."
    },
    {
      "fact_id": "F003",
      "layer": "highlight-50",
      "side": "method",
      "category": "Reset",
      "fact": "Turtle is not locking a score cloud on this page until the fact layer, contradiction layer, and opponent-threshold layer exist.",
      "source_label": "Turtle first-level ledger",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/first_level_summary.csv",
      "row_ref": "",
      "model_use": "Protocol guardrail: forbids score selection until facts are converted into contradiction rules."
    },
    {
      "fact_id": "F004",
      "layer": "highlight-50",
      "side": "france",
      "category": "Last 50",
      "fact": "France's latest 50 pre-cutoff matches are 34 wins, 8 draws, and 8 losses.",
      "source_label": "Turtle first-level ledger",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/first_level_summary.csv",
      "row_ref": "",
      "model_use": "Form ledger layer: supplies base-rate pressure before opponent-threshold filtering."
    },
    {
      "fact_id": "F005",
      "layer": "highlight-50",
      "side": "morocco",
      "category": "Last 50",
      "fact": "Morocco's latest 50 pre-cutoff matches are 40 wins, 9 draws, and 1 loss.",
      "source_label": "Turtle first-level ledger",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/first_level_summary.csv",
      "row_ref": "",
      "model_use": "Form ledger layer: supplies base-rate pressure before opponent-threshold filtering."
    },
    {
      "fact_id": "F006",
      "layer": "highlight-50",
      "side": "france",
      "category": "Last 50",
      "fact": "France's last-50 scoring profile is 2.26 goals for and 0.86 goals against per match.",
      "source_label": "Turtle first-level ledger",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/first_level_summary.csv",
      "row_ref": "",
      "model_use": "Form ledger layer: supplies base-rate pressure before opponent-threshold filtering."
    },
    {
      "fact_id": "F007",
      "layer": "highlight-50",
      "side": "morocco",
      "category": "Last 50",
      "fact": "Morocco's last-50 scoring profile is 2.30 goals for and 0.42 goals against per match.",
      "source_label": "Turtle first-level ledger",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/first_level_summary.csv",
      "row_ref": "",
      "model_use": "Form ledger layer: supplies base-rate pressure before opponent-threshold filtering."
    },
    {
      "fact_id": "F008",
      "layer": "highlight-50",
      "side": "france",
      "category": "Current tournament",
      "fact": "France enter this file with five World Cup wins from five and a 14-2 goal balance.",
      "source_label": "Turtle first-level ledger",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/first_level_summary.csv",
      "row_ref": "",
      "model_use": "Current-tournament thread: updates scoring, concession, clean-sheet, BTTS, and total-goal priors."
    },
    {
      "fact_id": "F009",
      "layer": "highlight-50",
      "side": "morocco",
      "category": "Current tournament",
      "fact": "Morocco enter this file unbeaten in five World Cup matches with a 10-4 goal balance.",
      "source_label": "Turtle first-level ledger",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/first_level_summary.csv",
      "row_ref": "",
      "model_use": "Current-tournament thread: updates scoring, concession, clean-sheet, BTTS, and total-goal priors."
    },
    {
      "fact_id": "F010",
      "layer": "highlight-50",
      "side": "france",
      "category": "Current tournament",
      "fact": "France have scored in all five current World Cup matches.",
      "source_label": "Turtle first-level ledger",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/first_level_summary.csv",
      "row_ref": "",
      "model_use": "Current-tournament thread: updates scoring, concession, clean-sheet, BTTS, and total-goal priors."
    },
    {
      "fact_id": "F011",
      "layer": "highlight-50",
      "side": "morocco",
      "category": "Current tournament",
      "fact": "Morocco have scored in all five current World Cup matches.",
      "source_label": "Turtle first-level ledger",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/first_level_summary.csv",
      "row_ref": "",
      "model_use": "Current-tournament thread: updates scoring, concession, clean-sheet, BTTS, and total-goal priors."
    },
    {
      "fact_id": "F012",
      "layer": "highlight-50",
      "side": "france",
      "category": "Clean sheet",
      "fact": "France have three clean sheets in five current World Cup matches.",
      "source_label": "Turtle first-level ledger",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/first_level_summary.csv",
      "row_ref": "",
      "model_use": "Current-tournament thread: updates scoring, concession, clean-sheet, BTTS, and total-goal priors."
    },
    {
      "fact_id": "F013",
      "layer": "highlight-50",
      "side": "morocco",
      "category": "Clean sheet",
      "fact": "Morocco have two clean sheets in five current World Cup matches.",
      "source_label": "Turtle first-level ledger",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/first_level_summary.csv",
      "row_ref": "",
      "model_use": "Current-tournament thread: updates scoring, concession, clean-sheet, BTTS, and total-goal priors."
    },
    {
      "fact_id": "F014",
      "layer": "highlight-50",
      "side": "france",
      "category": "Concession",
      "fact": "France have conceded in two of five current World Cup matches.",
      "source_label": "Turtle first-level ledger",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/first_level_summary.csv",
      "row_ref": "",
      "model_use": "Current-tournament thread: updates scoring, concession, clean-sheet, BTTS, and total-goal priors."
    },
    {
      "fact_id": "F015",
      "layer": "highlight-50",
      "side": "morocco",
      "category": "Concession",
      "fact": "Morocco have conceded in three of five current World Cup matches.",
      "source_label": "Turtle first-level ledger",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/first_level_summary.csv",
      "row_ref": "",
      "model_use": "Current-tournament thread: updates scoring, concession, clean-sheet, BTTS, and total-goal priors."
    },
    {
      "fact_id": "F016",
      "layer": "highlight-50",
      "side": "france",
      "category": "Totals",
      "fact": "France have gone over 2.5 goals in four of five current World Cup matches.",
      "source_label": "Turtle first-level ledger",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/first_level_summary.csv",
      "row_ref": "",
      "model_use": "Current-tournament thread: updates scoring, concession, clean-sheet, BTTS, and total-goal priors."
    },
    {
      "fact_id": "F017",
      "layer": "highlight-50",
      "side": "morocco",
      "category": "Totals",
      "fact": "Morocco have gone over 2.5 goals in two of five current World Cup matches.",
      "source_label": "Turtle first-level ledger",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/first_level_summary.csv",
      "row_ref": "",
      "model_use": "Current-tournament thread: updates scoring, concession, clean-sheet, BTTS, and total-goal priors."
    },
    {
      "fact_id": "F018",
      "layer": "highlight-50",
      "side": "france",
      "category": "Last 10",
      "fact": "France's last 10 pre-cutoff matches are 9 wins and 1 loss with no draws.",
      "source_label": "Turtle first-level ledger",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/first_level_summary.csv",
      "row_ref": "",
      "model_use": "Form ledger layer: supplies base-rate pressure before opponent-threshold filtering."
    },
    {
      "fact_id": "F019",
      "layer": "highlight-50",
      "side": "morocco",
      "category": "Last 10",
      "fact": "Morocco's last 10 pre-cutoff matches are 6 wins, 4 draws, and no losses.",
      "source_label": "Turtle first-level ledger",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/first_level_summary.csv",
      "row_ref": "",
      "model_use": "Form ledger layer: supplies base-rate pressure before opponent-threshold filtering."
    },
    {
      "fact_id": "F020",
      "layer": "highlight-50",
      "side": "france",
      "category": "Last 10",
      "fact": "France's last-10 BTTS rate is 70%, which prevents an automatic clean-sheet-only model.",
      "source_label": "Turtle first-level ledger",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/first_level_summary.csv",
      "row_ref": "",
      "model_use": "Form ledger layer: supplies base-rate pressure before opponent-threshold filtering."
    },
    {
      "fact_id": "F021",
      "layer": "highlight-50",
      "side": "morocco",
      "category": "Last 10",
      "fact": "Morocco's last-10 modal score is 1-1, appearing four times.",
      "source_label": "Turtle first-level ledger",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/first_level_summary.csv",
      "row_ref": "",
      "model_use": "Form ledger layer: supplies base-rate pressure before opponent-threshold filtering."
    },
    {
      "fact_id": "F022",
      "layer": "highlight-50",
      "side": "france",
      "category": "Score modes",
      "fact": "France's most repeated last-50 scorelines are 3-1 and 2-0, with six each.",
      "source_label": "Turtle first-level ledger",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/first_level_summary.csv",
      "row_ref": "",
      "model_use": "Form ledger layer: supplies base-rate pressure before opponent-threshold filtering."
    },
    {
      "fact_id": "F023",
      "layer": "highlight-50",
      "side": "morocco",
      "category": "Score modes",
      "fact": "Morocco's most repeated last-50 scoreline is 1-0, with eleven appearances.",
      "source_label": "Turtle first-level ledger",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/first_level_summary.csv",
      "row_ref": "",
      "model_use": "Form ledger layer: supplies base-rate pressure before opponent-threshold filtering."
    },
    {
      "fact_id": "F024",
      "layer": "highlight-50",
      "side": "france",
      "category": "Player form",
      "fact": "Kylian Mbappe scored twice against Senegal and Bradley Barcola added the other France goal in the 3-1 opener.",
      "source_label": "Turtle current tournament rows",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/current_tournament_rows.csv",
      "row_ref": "",
      "model_use": "Star and scorer-distribution layer: identifies whether the attack is concentrated or multi-node."
    },
    {
      "fact_id": "F025",
      "layer": "highlight-50",
      "side": "france",
      "category": "Player form",
      "fact": "Kylian Mbappe scored twice and Ousmane Dembele scored once in France's 3-0 win over Iraq.",
      "source_label": "Turtle current tournament rows",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/current_tournament_rows.csv",
      "row_ref": "",
      "model_use": "Star and scorer-distribution layer: identifies whether the attack is concentrated or multi-node."
    },
    {
      "fact_id": "F026",
      "layer": "highlight-50",
      "side": "france",
      "category": "Player form",
      "fact": "Ousmane Dembele scored a hat trick against Norway before Desire Doue added a stoppage-time goal.",
      "source_label": "Turtle current tournament rows",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/current_tournament_rows.csv",
      "row_ref": "",
      "model_use": "Star and scorer-distribution layer: identifies whether the attack is concentrated or multi-node."
    },
    {
      "fact_id": "F027",
      "layer": "highlight-50",
      "side": "france",
      "category": "Player form",
      "fact": "Kylian Mbappe scored twice and Bradley Barcola scored once in the 3-0 win over Sweden.",
      "source_label": "Turtle current tournament rows",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/current_tournament_rows.csv",
      "row_ref": "",
      "model_use": "Star and scorer-distribution layer: identifies whether the attack is concentrated or multi-node."
    },
    {
      "fact_id": "F028",
      "layer": "highlight-50",
      "side": "france",
      "category": "Player form",
      "fact": "Kylian Mbappe converted the 70th-minute penalty that beat Paraguay 1-0.",
      "source_label": "Turtle current tournament rows",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/current_tournament_rows.csv",
      "row_ref": "",
      "model_use": "Star and scorer-distribution layer: identifies whether the attack is concentrated or multi-node."
    },
    {
      "fact_id": "F029",
      "layer": "highlight-50",
      "side": "morocco",
      "category": "Player form",
      "fact": "Ismael Saibari scored Morocco's goal in the 1-1 draw against Brazil.",
      "source_label": "Turtle current tournament rows",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/current_tournament_rows.csv",
      "row_ref": "",
      "model_use": "Star and scorer-distribution layer: identifies whether the attack is concentrated or multi-node."
    },
    {
      "fact_id": "F030",
      "layer": "highlight-50",
      "side": "morocco",
      "category": "Player form",
      "fact": "Ismael Saibari scored in the second minute of Morocco's 1-0 win over Scotland.",
      "source_label": "Turtle current tournament rows",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/current_tournament_rows.csv",
      "row_ref": "",
      "model_use": "Star and scorer-distribution layer: identifies whether the attack is concentrated or multi-node."
    },
    {
      "fact_id": "F031",
      "layer": "highlight-50",
      "side": "morocco",
      "category": "Player form",
      "fact": "Achraf Hakimi, Ismael Saibari, Soufiane Rahimi, and Gessime Yassine all scored in Morocco's 4-2 win over Haiti.",
      "source_label": "Turtle current tournament rows",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/current_tournament_rows.csv",
      "row_ref": "",
      "model_use": "Star and scorer-distribution layer: identifies whether the attack is concentrated or multi-node."
    },
    {
      "fact_id": "F032",
      "layer": "highlight-50",
      "side": "morocco",
      "category": "Player form",
      "fact": "Issa Diop scored in the 90+1 minute against the Netherlands, preserving Morocco's late-game danger.",
      "source_label": "Turtle current tournament rows",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/current_tournament_rows.csv",
      "row_ref": "",
      "model_use": "Star and scorer-distribution layer: identifies whether the attack is concentrated or multi-node."
    },
    {
      "fact_id": "F033",
      "layer": "highlight-50",
      "side": "morocco",
      "category": "Player form",
      "fact": "Azzedine Ounahi scored twice and Soufiane Rahimi scored in stoppage time in Morocco's 3-0 win over Canada.",
      "source_label": "Turtle current tournament rows",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/current_tournament_rows.csv",
      "row_ref": "",
      "model_use": "Star and scorer-distribution layer: identifies whether the attack is concentrated or multi-node."
    },
    {
      "fact_id": "F034",
      "layer": "highlight-50",
      "side": "france",
      "category": "Player form",
      "fact": "Mbappe has seven goals in this World Cup from the mined France rows.",
      "source_label": "Turtle first-level ledger",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/first_level_summary.csv",
      "row_ref": "",
      "model_use": "Star and scorer-distribution layer: identifies whether the attack is concentrated or multi-node."
    },
    {
      "fact_id": "F035",
      "layer": "highlight-50",
      "side": "france",
      "category": "Player form",
      "fact": "Dembele has four current World Cup goals in the mined France rows.",
      "source_label": "Turtle first-level ledger",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/first_level_summary.csv",
      "row_ref": "",
      "model_use": "Star and scorer-distribution layer: identifies whether the attack is concentrated or multi-node."
    },
    {
      "fact_id": "F036",
      "layer": "highlight-50",
      "side": "france",
      "category": "Player form",
      "fact": "Barcola has two current World Cup goals in the mined France rows.",
      "source_label": "Turtle first-level ledger",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/first_level_summary.csv",
      "row_ref": "",
      "model_use": "Star and scorer-distribution layer: identifies whether the attack is concentrated or multi-node."
    },
    {
      "fact_id": "F037",
      "layer": "highlight-50",
      "side": "france",
      "category": "Player form",
      "fact": "Desire Doue is a bench-impact signal because he scored against Norway and won the penalty against Paraguay.",
      "source_label": "Le Monde France-Paraguay report",
      "source_url": "https://www.lemonde.fr/en/sports/article/2026/07/05/2026-world-cup-france-edge-past-paraguay-in-tense-battle-to-reach-the-quarter-finals_6755165_9.html",
      "row_ref": "",
      "model_use": "Star and scorer-distribution layer: identifies whether the attack is concentrated or multi-node."
    },
    {
      "fact_id": "F038",
      "layer": "highlight-50",
      "side": "france",
      "category": "Attack shape",
      "fact": "France's current World Cup scoring is not one-player only: Mbappe, Dembele, Barcola, and Doue all appear in the mined scorer rows.",
      "source_label": "Turtle current tournament rows",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/current_tournament_rows.csv",
      "row_ref": "",
      "model_use": "Star and scorer-distribution layer: identifies whether the attack is concentrated or multi-node."
    },
    {
      "fact_id": "F039",
      "layer": "highlight-50",
      "side": "france",
      "category": "Leadership",
      "fact": "Le Monde reports that Mbappe has scored in four of France's five matches and has become the team's central leader.",
      "source_label": "Le Monde Mbappe profile",
      "source_url": "https://www.lemonde.fr/en/sports/article/2026/07/09/kylian-mbappe-a-leader-on-a-mission-both-on-the-pitch-and-behind-the-scenes-at-the-2026-world-cup_6755295_9.html",
      "row_ref": "",
      "model_use": "Star and scorer-distribution layer: identifies whether the attack is concentrated or multi-node."
    },
    {
      "fact_id": "F040",
      "layer": "highlight-50",
      "side": "france",
      "category": "Leadership",
      "fact": "Le Monde reports Mbappe overtook Olivier Giroud as France's all-time top scorer during this World Cup run.",
      "source_label": "Le Monde Mbappe profile",
      "source_url": "https://www.lemonde.fr/en/sports/article/2026/07/09/kylian-mbappe-a-leader-on-a-mission-both-on-the-pitch-and-behind-the-scenes-at-the-2026-world-cup_6755295_9.html",
      "row_ref": "",
      "model_use": "Star and scorer-distribution layer: identifies whether the attack is concentrated or multi-node."
    },
    {
      "fact_id": "F041",
      "layer": "highlight-50",
      "side": "france",
      "category": "Fitness",
      "fact": "The Paraguay match was a physical, heat-heavy struggle, so France's latest win carries fatigue and resilience information rather than only score information.",
      "source_label": "Le Monde France-Paraguay report",
      "source_url": "https://www.lemonde.fr/en/sports/article/2026/07/05/2026-world-cup-france-edge-past-paraguay-in-tense-battle-to-reach-the-quarter-finals_6755165_9.html",
      "row_ref": "",
      "model_use": "Physical-state layer: adds fatigue and resilience context to the last match signal."
    },
    {
      "fact_id": "F042",
      "layer": "highlight-50",
      "side": "france",
      "category": "Availability",
      "fact": "talkSPORT reports France may get Aurelien Tchouameni back and may consider Desire Doue after his Paraguay impact.",
      "source_label": "talkSPORT France-Morocco team news",
      "source_url": "https://talksport.com/football/world-cup/4397432/france-vs-morocco-live-commentary-date-uk-time-teams-mbappe/",
      "row_ref": "",
      "model_use": "Availability layer: changes expected personnel, first-scorer routes, and whether old scoring rows still transfer."
    },
    {
      "fact_id": "F043",
      "layer": "highlight-50",
      "side": "morocco",
      "category": "Injury",
      "fact": "Ismael Saibari is reported likely out or ruled out with a hamstring injury, which directly weakens Morocco's first-scorer pattern.",
      "source_label": "Times of India Saibari injury report",
      "source_url": "https://timesofindia.indiatimes.com/sports/football/fifa-world-cup/fifa-world-cup-big-blow-for-morocco-ahead-of-france-quarter-final-as-ismael-saibari-ruled-out/articleshow/132276812.cms",
      "row_ref": "",
      "model_use": "Availability layer: changes expected personnel, first-scorer routes, and whether old scoring rows still transfer."
    },
    {
      "fact_id": "F044",
      "layer": "highlight-50",
      "side": "morocco",
      "category": "Injury",
      "fact": "Bavarian Football Works reports Saibari missed final training before the quarter-final.",
      "source_label": "Bavarian Football Works Saibari injury report",
      "source_url": "https://www.bavarianfootballworks.com/germany-international-soccer/227173/morocco-ismael-saibari-injury-update-worldcup-bayern-munich-transfer",
      "row_ref": "",
      "model_use": "Availability layer: changes expected personnel, first-scorer routes, and whether old scoring rows still transfer."
    },
    {
      "fact_id": "F045",
      "layer": "highlight-50",
      "side": "morocco",
      "category": "Injury",
      "fact": "Morocco had already lost Nayef Aguerd and Abde Ezzalzouli before the tournament, according to a pre-tournament injury report.",
      "source_label": "talkSPORT Morocco injury report",
      "source_url": "https://talksport.com/football/world-cup/4323400/world-cup-morocco-squad-injuries-nayef-aguerd-abde-ezzalzouli/",
      "row_ref": "",
      "model_use": "Availability layer: changes expected personnel, first-scorer routes, and whether old scoring rows still transfer."
    },
    {
      "fact_id": "F046",
      "layer": "highlight-50",
      "side": "morocco",
      "category": "Lineup",
      "fact": "talkSPORT expects Soufiane Rahimi to be the natural Saibari replacement and notes Morocco hope Chadi Riad is available.",
      "source_label": "talkSPORT France-Morocco team news",
      "source_url": "https://talksport.com/football/world-cup/4397432/france-vs-morocco-live-commentary-date-uk-time-teams-mbappe/",
      "row_ref": "",
      "model_use": "Availability layer: changes expected personnel, first-scorer routes, and whether old scoring rows still transfer."
    },
    {
      "fact_id": "F047",
      "layer": "highlight-50",
      "side": "morocco",
      "category": "Identity",
      "fact": "Le Monde frames Morocco as seeking payback after the 2022 semi-final while now carrying top-10 status rather than surprise-underdog status.",
      "source_label": "Le Monde France-Morocco preview",
      "source_url": "https://www.lemonde.fr/en/le-monde-africa/article/2026/07/08/france-vs-morocco-the-atlas-lions-seek-redemption-four-years-after-their-world-cup-semifinal-defeat-in-qatar_6755289_124.html",
      "row_ref": "",
      "model_use": "Strength and context layer: prevents the file from being framed as a simple favorite-underdog mismatch."
    },
    {
      "fact_id": "F048",
      "layer": "highlight-50",
      "side": "morocco",
      "category": "Ranking",
      "fact": "Le Monde reports Morocco entered the tournament ranked seventh globally, ahead of the Netherlands, Belgium, and Germany.",
      "source_label": "Le Monde France-Morocco preview",
      "source_url": "https://www.lemonde.fr/en/le-monde-africa/article/2026/07/08/france-vs-morocco-the-atlas-lions-seek-redemption-four-years-after-their-world-cup-semifinal-defeat-in-qatar_6755289_124.html",
      "row_ref": "",
      "model_use": "Strength and context layer: prevents the file from being framed as a simple favorite-underdog mismatch."
    },
    {
      "fact_id": "F049",
      "layer": "highlight-50",
      "side": "morocco",
      "category": "Squad build",
      "fact": "Le Monde highlights Ayyoub Bouaddi, Issa Diop, Brahim Diaz, and Achraf Hakimi as examples of Morocco's dual-national recruitment strength.",
      "source_label": "Le Monde France-Morocco preview",
      "source_url": "https://www.lemonde.fr/en/le-monde-africa/article/2026/07/08/france-vs-morocco-the-atlas-lions-seek-redemption-four-years-after-their-world-cup-semifinal-defeat-in-qatar_6755289_124.html",
      "row_ref": "",
      "model_use": "Strength and context layer: prevents the file from being framed as a simple favorite-underdog mismatch."
    },
    {
      "fact_id": "F050",
      "layer": "highlight-50",
      "side": "match",
      "category": "External prior",
      "fact": "The Guardian's power ranking keeps France first and Morocco fifth among the final eight, so this is not a simple giant-versus-minnow file.",
      "source_label": "Guardian World Cup power rankings",
      "source_url": "https://www.theguardian.com/football/2026/jul/08/world-cup-2026-team-rankings-last-16",
      "row_ref": "",
      "model_use": "Strength and context layer: prevents the file from being framed as a simple favorite-underdog mismatch."
    },
    {
      "fact_id": "F051",
      "layer": "match-row",
      "side": "france",
      "category": "Last 50 row",
      "fact": "France lost to Tunisia 0-1 on 2022-11-30 in 2022 World Cup Group D; signals: failed to score.",
      "source_label": "France last-50 match ledger",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/FRA_match_ledger.csv",
      "row_ref": "FRA-001",
      "model_use": "Direct row input for GF, GA, result, clean sheet, BTTS, and totals."
    },
    {
      "fact_id": "F052",
      "layer": "match-row",
      "side": "france",
      "category": "Last 50 row",
      "fact": "France beat Poland 3-1 on 2022-12-04 in 2022 World Cup R16; signals: BTTS, over 2.5, over 3.5; scorer text: Giroud 44' Mbappé 74' , 90+1'.",
      "source_label": "France last-50 match ledger",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/FRA_match_ledger.csv",
      "row_ref": "FRA-002",
      "model_use": "Direct row input for GF, GA, result, clean sheet, BTTS, and totals."
    },
    {
      "fact_id": "F053",
      "layer": "match-row",
      "side": "france",
      "category": "Last 50 row",
      "fact": "France beat England 2-1 on 2022-12-10 in 2022 World Cup QF; signals: BTTS, over 2.5; scorer text: Tchouaméni 17' Giroud 78'.",
      "source_label": "France last-50 match ledger",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/FRA_match_ledger.csv",
      "row_ref": "FRA-003",
      "model_use": "Direct row input for GF, GA, result, clean sheet, BTTS, and totals."
    },
    {
      "fact_id": "F054",
      "layer": "match-row",
      "side": "france",
      "category": "Last 50 row",
      "fact": "France beat Morocco 2-0 on 2022-12-14 in 2022 World Cup SF; signals: clean sheet; scorer text: T. Hernandez 5' Kolo Muani 79'.",
      "source_label": "France last-50 match ledger",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/FRA_match_ledger.csv",
      "row_ref": "FRA-004",
      "model_use": "Direct row input for GF, GA, result, clean sheet, BTTS, and totals."
    },
    {
      "fact_id": "F055",
      "layer": "match-row",
      "side": "france",
      "category": "Last 50 row",
      "fact": "France drew with Argentina 3-3 on 2022-12-18 in 2022 World Cup F; signals: BTTS, over 2.5, over 3.5; scorer text: Mbappé 80' ( pen. ) , 81' , 118' ( pen. ).",
      "source_label": "France last-50 match ledger",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/FRA_match_ledger.csv",
      "row_ref": "FRA-005",
      "model_use": "Direct row input for GF, GA, result, clean sheet, BTTS, and totals."
    },
    {
      "fact_id": "F056",
      "layer": "match-row",
      "side": "france",
      "category": "Last 50 row",
      "fact": "France beat Netherlands 4-0 on 2023-03-24 in 2023 Euro 2024 qualifying; signals: clean sheet, over 2.5, over 3.5; scorer text: Griezmann 2' Upamecano 8' Mbappé 21' , 88'.",
      "source_label": "France last-50 match ledger",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/FRA_match_ledger.csv",
      "row_ref": "FRA-006",
      "model_use": "Direct row input for GF, GA, result, clean sheet, BTTS, and totals."
    },
    {
      "fact_id": "F057",
      "layer": "match-row",
      "side": "france",
      "category": "Last 50 row",
      "fact": "France beat Republic of Ireland 1-0 on 2023-03-27 in 2023 Euro 2024 qualifying; signals: clean sheet; scorer text: Pavard 50'.",
      "source_label": "France last-50 match ledger",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/FRA_match_ledger.csv",
      "row_ref": "FRA-007",
      "model_use": "Direct row input for GF, GA, result, clean sheet, BTTS, and totals."
    },
    {
      "fact_id": "F058",
      "layer": "match-row",
      "side": "france",
      "category": "Last 50 row",
      "fact": "France beat Gibraltar 3-0 on 2023-06-16 in 2023 Euro 2024 qualifying; signals: clean sheet, over 2.5; scorer text: Giroud 3' Mbappé 45+3' ( pen. ) Mouelhi 78' ( o.g. ).",
      "source_label": "France last-50 match ledger",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/FRA_match_ledger.csv",
      "row_ref": "FRA-008",
      "model_use": "Direct row input for GF, GA, result, clean sheet, BTTS, and totals."
    },
    {
      "fact_id": "F059",
      "layer": "match-row",
      "side": "france",
      "category": "Last 50 row",
      "fact": "France beat Greece 1-0 on 2023-06-19 in 2023 Euro 2024 qualifying; signals: clean sheet; scorer text: Mbappé 55' ( pen. ).",
      "source_label": "France last-50 match ledger",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/FRA_match_ledger.csv",
      "row_ref": "FRA-009",
      "model_use": "Direct row input for GF, GA, result, clean sheet, BTTS, and totals."
    },
    {
      "fact_id": "F060",
      "layer": "match-row",
      "side": "france",
      "category": "Last 50 row",
      "fact": "France beat Republic of Ireland 2-0 on 2023-09-07 in 2023 Euro 2024 qualifying; signals: clean sheet; scorer text: Tchouaméni 19' Thuram 48'.",
      "source_label": "France last-50 match ledger",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/FRA_match_ledger.csv",
      "row_ref": "FRA-010",
      "model_use": "Direct row input for GF, GA, result, clean sheet, BTTS, and totals."
    },
    {
      "fact_id": "F061",
      "layer": "match-row",
      "side": "france",
      "category": "Last 50 row",
      "fact": "France lost to Germany 1-2 on 2023-09-12 in 2023 ( 2023-09-12 ) Friendly; signals: BTTS, over 2.5; scorer text: Griezmann 89' ( pen. ).",
      "source_label": "France last-50 match ledger",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/FRA_match_ledger.csv",
      "row_ref": "FRA-011",
      "model_use": "Direct row input for GF, GA, result, clean sheet, BTTS, and totals."
    },
    {
      "fact_id": "F062",
      "layer": "match-row",
      "side": "france",
      "category": "Last 50 row",
      "fact": "France beat Netherlands 2-1 on 2023-10-13 in 2023 ( 2023-10-13 ) Euro 2024 qualifying; signals: BTTS, over 2.5; scorer text: Mbappé 7' , 53'.",
      "source_label": "France last-50 match ledger",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/FRA_match_ledger.csv",
      "row_ref": "FRA-012",
      "model_use": "Direct row input for GF, GA, result, clean sheet, BTTS, and totals."
    },
    {
      "fact_id": "F063",
      "layer": "match-row",
      "side": "france",
      "category": "Last 50 row",
      "fact": "France beat Scotland 4-1 on 2023-10-17 in 2023 ( 2023-10-17 ) Friendly; signals: BTTS, over 2.5, over 3.5; scorer text: Pavard 16' , 24' Mbappé 41' ( pen. ) Coman 70'.",
      "source_label": "France last-50 match ledger",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/FRA_match_ledger.csv",
      "row_ref": "FRA-013",
      "model_use": "Direct row input for GF, GA, result, clean sheet, BTTS, and totals."
    },
    {
      "fact_id": "F064",
      "layer": "match-row",
      "side": "france",
      "category": "Last 50 row",
      "fact": "France beat Gibraltar 14-0 on 2023-11-18 in 2023 Euro 2024 qualifying; signals: clean sheet, over 2.5, over 3.5; scorer text: Santos 3' ( o.g. ) Thuram 4' Zaïre-Emery 16' Mbappé 30' ( pen. ) , 74' , 82' Clauss 34' Coman 36' , 65' Fofana 37' Rabiot 63' Dembélé 73' Giroud 89' , 90+1'.",
      "source_label": "France last-50 match ledger",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/FRA_match_ledger.csv",
      "row_ref": "FRA-014",
      "model_use": "Direct row input for GF, GA, result, clean sheet, BTTS, and totals."
    },
    {
      "fact_id": "F065",
      "layer": "match-row",
      "side": "france",
      "category": "Last 50 row",
      "fact": "France drew with Greece 2-2 on 2023-11-21 in 2023 ( 2023-11-21 ) Euro 2024 qualifying; signals: BTTS, over 2.5, over 3.5; scorer text: Kolo Muani 42' Fofana 74'.",
      "source_label": "France last-50 match ledger",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/FRA_match_ledger.csv",
      "row_ref": "FRA-015",
      "model_use": "Direct row input for GF, GA, result, clean sheet, BTTS, and totals."
    },
    {
      "fact_id": "F066",
      "layer": "match-row",
      "side": "france",
      "category": "Last 50 row",
      "fact": "France lost to Germany 0-2 on 2024-03-23 in 2024 Friendly; signals: failed to score.",
      "source_label": "France last-50 match ledger",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/FRA_match_ledger.csv",
      "row_ref": "FRA-016",
      "model_use": "Direct row input for GF, GA, result, clean sheet, BTTS, and totals."
    },
    {
      "fact_id": "F067",
      "layer": "match-row",
      "side": "france",
      "category": "Last 50 row",
      "fact": "France beat Chile 3-2 on 2024-03-26 in 2024 Friendly; signals: BTTS, over 2.5, over 3.5; scorer text: Fofana 18' Kolo Muani 25' Giroud 72'.",
      "source_label": "France last-50 match ledger",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/FRA_match_ledger.csv",
      "row_ref": "FRA-017",
      "model_use": "Direct row input for GF, GA, result, clean sheet, BTTS, and totals."
    },
    {
      "fact_id": "F068",
      "layer": "match-row",
      "side": "france",
      "category": "Last 50 row",
      "fact": "France beat Luxembourg 3-0 on 2024-06-05 in 2024 Friendly; signals: clean sheet, over 2.5; scorer text: Kolo Muani 43' Clauss 70' Mbappé 85'.",
      "source_label": "France last-50 match ledger",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/FRA_match_ledger.csv",
      "row_ref": "FRA-018",
      "model_use": "Direct row input for GF, GA, result, clean sheet, BTTS, and totals."
    },
    {
      "fact_id": "F069",
      "layer": "match-row",
      "side": "france",
      "category": "Last 50 row",
      "fact": "France drew with Canada 0-0 on 2024-06-09 in 2024 Friendly; signals: clean sheet, failed to score.",
      "source_label": "France last-50 match ledger",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/FRA_match_ledger.csv",
      "row_ref": "FRA-019",
      "model_use": "Direct row input for GF, GA, result, clean sheet, BTTS, and totals."
    },
    {
      "fact_id": "F070",
      "layer": "match-row",
      "side": "france",
      "category": "Last 50 row",
      "fact": "France beat Austria 1-0 on 2024-06-17 in 2024 Euro 2024 Group D; signals: clean sheet; scorer text: Wöber 38' ( o.g. ).",
      "source_label": "France last-50 match ledger",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/FRA_match_ledger.csv",
      "row_ref": "FRA-020",
      "model_use": "Direct row input for GF, GA, result, clean sheet, BTTS, and totals."
    },
    {
      "fact_id": "F071",
      "layer": "match-row",
      "side": "france",
      "category": "Last 50 row",
      "fact": "France drew with Netherlands 0-0 on 2024-06-21 in 2024 Euro 2024 Group D; signals: clean sheet, failed to score.",
      "source_label": "France last-50 match ledger",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/FRA_match_ledger.csv",
      "row_ref": "FRA-021",
      "model_use": "Direct row input for GF, GA, result, clean sheet, BTTS, and totals."
    },
    {
      "fact_id": "F072",
      "layer": "match-row",
      "side": "france",
      "category": "Last 50 row",
      "fact": "France drew with Poland 1-1 on 2024-06-25 in 2024 Euro 2024 Group D; signals: BTTS; scorer text: Mbappé 56' ( pen. ).",
      "source_label": "France last-50 match ledger",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/FRA_match_ledger.csv",
      "row_ref": "FRA-022",
      "model_use": "Direct row input for GF, GA, result, clean sheet, BTTS, and totals."
    },
    {
      "fact_id": "F073",
      "layer": "match-row",
      "side": "france",
      "category": "Last 50 row",
      "fact": "France beat Belgium 1-0 on 2024-07-01 in 2024 Euro 2024 Round of 16; signals: clean sheet; scorer text: Vertonghen 85' ( o.g. ).",
      "source_label": "France last-50 match ledger",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/FRA_match_ledger.csv",
      "row_ref": "FRA-023",
      "model_use": "Direct row input for GF, GA, result, clean sheet, BTTS, and totals."
    },
    {
      "fact_id": "F074",
      "layer": "match-row",
      "side": "france",
      "category": "Last 50 row",
      "fact": "France drew with Portugal 0-0 on 2024-07-05 in 2024 Euro 2024 Quarter-final; signals: clean sheet, failed to score.",
      "source_label": "France last-50 match ledger",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/FRA_match_ledger.csv",
      "row_ref": "FRA-024",
      "model_use": "Direct row input for GF, GA, result, clean sheet, BTTS, and totals."
    },
    {
      "fact_id": "F075",
      "layer": "match-row",
      "side": "france",
      "category": "Last 50 row",
      "fact": "France lost to Spain 1-2 on 2024-07-09 in 2024 Euro 2024 Semi-final; signals: BTTS, over 2.5; scorer text: Kolo Muani 8'.",
      "source_label": "France last-50 match ledger",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/FRA_match_ledger.csv",
      "row_ref": "FRA-025",
      "model_use": "Direct row input for GF, GA, result, clean sheet, BTTS, and totals."
    },
    {
      "fact_id": "F076",
      "layer": "match-row",
      "side": "france",
      "category": "Last 50 row",
      "fact": "France lost to Italy 1-3 on 2024-09-06 in 2024–25 Nations League; signals: BTTS, over 2.5, over 3.5; scorer text: Barcola 1'.",
      "source_label": "France last-50 match ledger",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/FRA_match_ledger.csv",
      "row_ref": "FRA-026",
      "model_use": "Direct row input for GF, GA, result, clean sheet, BTTS, and totals."
    },
    {
      "fact_id": "F077",
      "layer": "match-row",
      "side": "france",
      "category": "Last 50 row",
      "fact": "France beat Belgium 2-0 on 2024-09-09 in 2024–25 Nations League; signals: clean sheet; scorer text: Kolo Muani 29' Dembélé 57'.",
      "source_label": "France last-50 match ledger",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/FRA_match_ledger.csv",
      "row_ref": "FRA-027",
      "model_use": "Direct row input for GF, GA, result, clean sheet, BTTS, and totals."
    },
    {
      "fact_id": "F078",
      "layer": "match-row",
      "side": "france",
      "category": "Last 50 row",
      "fact": "France beat Israel 4-1 on 2024-10-10 in 2024–25 Nations League; signals: BTTS, over 2.5, over 3.5; scorer text: Camavinga 6' Nkunku 28' Guendouzi 87' Barcola 89'.",
      "source_label": "France last-50 match ledger",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/FRA_match_ledger.csv",
      "row_ref": "FRA-028",
      "model_use": "Direct row input for GF, GA, result, clean sheet, BTTS, and totals."
    },
    {
      "fact_id": "F079",
      "layer": "match-row",
      "side": "france",
      "category": "Last 50 row",
      "fact": "France beat Belgium 2-1 on 2024-10-14 in 2024–25 Nations League; signals: BTTS, over 2.5; scorer text: Kolo Muani 35' ( pen. ) , 62'.",
      "source_label": "France last-50 match ledger",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/FRA_match_ledger.csv",
      "row_ref": "FRA-029",
      "model_use": "Direct row input for GF, GA, result, clean sheet, BTTS, and totals."
    },
    {
      "fact_id": "F080",
      "layer": "match-row",
      "side": "france",
      "category": "Last 50 row",
      "fact": "France drew with Israel 0-0 on 2024-11-14 in 2024–25 Nations League; signals: clean sheet, failed to score.",
      "source_label": "France last-50 match ledger",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/FRA_match_ledger.csv",
      "row_ref": "FRA-030",
      "model_use": "Direct row input for GF, GA, result, clean sheet, BTTS, and totals."
    },
    {
      "fact_id": "F081",
      "layer": "match-row",
      "side": "france",
      "category": "Last 50 row",
      "fact": "France beat Italy 3-1 on 2024-11-17 in 2024–25 Nations League; signals: BTTS, over 2.5, over 3.5; scorer text: Rabiot 2' , 65' Vicario 33' ( o.g. ).",
      "source_label": "France last-50 match ledger",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/FRA_match_ledger.csv",
      "row_ref": "FRA-031",
      "model_use": "Direct row input for GF, GA, result, clean sheet, BTTS, and totals."
    },
    {
      "fact_id": "F082",
      "layer": "match-row",
      "side": "france",
      "category": "Last 50 row",
      "fact": "France lost to Croatia 0-2 on 2025-03-20 in 2025 2024–25 Nations League QF; signals: failed to score.",
      "source_label": "France last-50 match ledger",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/FRA_match_ledger.csv",
      "row_ref": "FRA-032",
      "model_use": "Direct row input for GF, GA, result, clean sheet, BTTS, and totals."
    },
    {
      "fact_id": "F083",
      "layer": "match-row",
      "side": "france",
      "category": "Last 50 row",
      "fact": "France beat Croatia 2-0 on 2025-03-23 in 2025 2024–25 Nations League QF; signals: clean sheet; scorer text: Olise 52' Dembélé 80'.",
      "source_label": "France last-50 match ledger",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/FRA_match_ledger.csv",
      "row_ref": "FRA-033",
      "model_use": "Direct row input for GF, GA, result, clean sheet, BTTS, and totals."
    },
    {
      "fact_id": "F084",
      "layer": "match-row",
      "side": "france",
      "category": "Last 50 row",
      "fact": "France lost to Spain 4-5 on 2025-06-05 in 2025 2024–25 Nations League SF; signals: BTTS, over 2.5, over 3.5; scorer text: Mbappé 59' ( pen. ) Cherki 79' Vivian 84' ( o.g. ) Kolo Muani 90+3'.",
      "source_label": "France last-50 match ledger",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/FRA_match_ledger.csv",
      "row_ref": "FRA-034",
      "model_use": "Direct row input for GF, GA, result, clean sheet, BTTS, and totals."
    },
    {
      "fact_id": "F085",
      "layer": "match-row",
      "side": "france",
      "category": "Last 50 row",
      "fact": "France beat Germany 2-0 on 2025-06-08 in 2025 2024–25 Nations League 3rd; signals: clean sheet; scorer text: Mbappé 45' Olise 84'.",
      "source_label": "France last-50 match ledger",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/FRA_match_ledger.csv",
      "row_ref": "FRA-035",
      "model_use": "Direct row input for GF, GA, result, clean sheet, BTTS, and totals."
    },
    {
      "fact_id": "F086",
      "layer": "match-row",
      "side": "france",
      "category": "Last 50 row",
      "fact": "France beat Ukraine 2-0 on 2025-09-05 in 2025 2026 World Cup qualification; signals: clean sheet; scorer text: Olise 10' Mbappé 82'.",
      "source_label": "France last-50 match ledger",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/FRA_match_ledger.csv",
      "row_ref": "FRA-036",
      "model_use": "Direct row input for GF, GA, result, clean sheet, BTTS, and totals."
    },
    {
      "fact_id": "F087",
      "layer": "match-row",
      "side": "france",
      "category": "Last 50 row",
      "fact": "France beat Iceland 2-1 on 2025-09-09 in 2025 2026 World Cup qualification; signals: BTTS, over 2.5; scorer text: Mbappé 45' ( pen. ) Barcola 62'.",
      "source_label": "France last-50 match ledger",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/FRA_match_ledger.csv",
      "row_ref": "FRA-037",
      "model_use": "Direct row input for GF, GA, result, clean sheet, BTTS, and totals."
    },
    {
      "fact_id": "F088",
      "layer": "match-row",
      "side": "france",
      "category": "Last 50 row",
      "fact": "France beat Azerbaijan 3-0 on 2025-10-10 in 2025 2026 World Cup qualification; signals: clean sheet, over 2.5; scorer text: Mbappé 45+2' Rabiot 69' Thauvin 84'.",
      "source_label": "France last-50 match ledger",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/FRA_match_ledger.csv",
      "row_ref": "FRA-038",
      "model_use": "Direct row input for GF, GA, result, clean sheet, BTTS, and totals."
    },
    {
      "fact_id": "F089",
      "layer": "match-row",
      "side": "france",
      "category": "Last 50 row",
      "fact": "France drew with Iceland 2-2 on 2025-10-13 in 2025 2026 World Cup qualification; signals: BTTS, over 2.5, over 3.5; scorer text: Nkunku 63' Mateta 68'.",
      "source_label": "France last-50 match ledger",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/FRA_match_ledger.csv",
      "row_ref": "FRA-039",
      "model_use": "Direct row input for GF, GA, result, clean sheet, BTTS, and totals."
    },
    {
      "fact_id": "F090",
      "layer": "match-row",
      "side": "france",
      "category": "Last 50 row",
      "fact": "France beat Ukraine 4-0 on 2025-11-13 in 2025 2026 World Cup qualification; signals: clean sheet, over 2.5, over 3.5; scorer text: Mbappé 55' ( pen. ) , 83' Olise 76' Ekitike 88'.",
      "source_label": "France last-50 match ledger",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/FRA_match_ledger.csv",
      "row_ref": "FRA-040",
      "model_use": "Direct row input for GF, GA, result, clean sheet, BTTS, and totals."
    },
    {
      "fact_id": "F091",
      "layer": "match-row",
      "side": "france",
      "category": "Last 50 row",
      "fact": "France beat Azerbaijan 3-1 on 2025-11-16 in 2025 2026 World Cup qualification; signals: BTTS, over 2.5, over 3.5; scorer text: Mateta 17' Akliouche 30' Magomedaliyev 45' ( o.g. ).",
      "source_label": "France last-50 match ledger",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/FRA_match_ledger.csv",
      "row_ref": "FRA-041",
      "model_use": "Direct row input for GF, GA, result, clean sheet, BTTS, and totals."
    },
    {
      "fact_id": "F092",
      "layer": "match-row",
      "side": "france",
      "category": "Last 50 row",
      "fact": "France beat Brazil 2-1 on 2026-03-26 in 2026 Friendly; signals: BTTS, over 2.5; scorer text: Mbappé 32' Ekitike 65'.",
      "source_label": "France last-50 match ledger",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/FRA_match_ledger.csv",
      "row_ref": "FRA-042",
      "model_use": "Direct row input for GF, GA, result, clean sheet, BTTS, and totals."
    },
    {
      "fact_id": "F093",
      "layer": "match-row",
      "side": "france",
      "category": "Last 50 row",
      "fact": "France beat Colombia 3-1 on 2026-03-29 in 2026 Friendly; signals: BTTS, over 2.5, over 3.5; scorer text: Doué 29' , 56' Thuram 41'.",
      "source_label": "France last-50 match ledger",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/FRA_match_ledger.csv",
      "row_ref": "FRA-043",
      "model_use": "Direct row input for GF, GA, result, clean sheet, BTTS, and totals."
    },
    {
      "fact_id": "F094",
      "layer": "match-row",
      "side": "france",
      "category": "Last 50 row",
      "fact": "France lost to Ivory Coast 1-2 on 2026-06-04 in 2026 Friendly; signals: BTTS, over 2.5; scorer text: Cherki 45'.",
      "source_label": "France last-50 match ledger",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/FRA_match_ledger.csv",
      "row_ref": "FRA-044",
      "model_use": "Direct row input for GF, GA, result, clean sheet, BTTS, and totals."
    },
    {
      "fact_id": "F095",
      "layer": "match-row",
      "side": "france",
      "category": "Last 50 row",
      "fact": "France beat Northern Ireland 3-1 on 2026-06-08 in 2026 Friendly; signals: BTTS, over 2.5, over 3.5; scorer text: Olise 43' , 49' , 75'.",
      "source_label": "France last-50 match ledger",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/FRA_match_ledger.csv",
      "row_ref": "FRA-045",
      "model_use": "Direct row input for GF, GA, result, clean sheet, BTTS, and totals."
    },
    {
      "fact_id": "F096",
      "layer": "match-row",
      "side": "france",
      "category": "Last 50 row",
      "fact": "France beat Senegal 3-1 on 2026-06-16 in 2026 FIFA World Cup Group I; signals: BTTS, over 2.5, over 3.5; scorer text: Mbappé 66' , 90+6' Barcola 82'.",
      "source_label": "France last-50 match ledger",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/FRA_match_ledger.csv",
      "row_ref": "FRA-046",
      "model_use": "Direct row input for GF, GA, result, clean sheet, BTTS, and totals."
    },
    {
      "fact_id": "F097",
      "layer": "match-row",
      "side": "france",
      "category": "Last 50 row",
      "fact": "France beat Iraq 3-0 on 2026-06-22 in 2026 FIFA World Cup Group I; signals: clean sheet, over 2.5; scorer text: Mbappé 14' , 54' Dembélé 66'.",
      "source_label": "France last-50 match ledger",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/FRA_match_ledger.csv",
      "row_ref": "FRA-047",
      "model_use": "Direct row input for GF, GA, result, clean sheet, BTTS, and totals."
    },
    {
      "fact_id": "F098",
      "layer": "match-row",
      "side": "france",
      "category": "Last 50 row",
      "fact": "France beat Norway 4-1 on 2026-06-26 in 2026 FIFA World Cup Group I; signals: BTTS, over 2.5, over 3.5; scorer text: Dembélé 7' , 20' , 32' Doué 90+4'.",
      "source_label": "France last-50 match ledger",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/FRA_match_ledger.csv",
      "row_ref": "FRA-048",
      "model_use": "Direct row input for GF, GA, result, clean sheet, BTTS, and totals."
    },
    {
      "fact_id": "F099",
      "layer": "match-row",
      "side": "france",
      "category": "Last 50 row",
      "fact": "France beat Sweden 3-0 on 2026-06-30 in 2026 FIFA World Cup Round of 32; signals: clean sheet, over 2.5; scorer text: Mbappé 45' , 74' Barcola 53'.",
      "source_label": "France last-50 match ledger",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/FRA_match_ledger.csv",
      "row_ref": "FRA-049",
      "model_use": "Direct row input for GF, GA, result, clean sheet, BTTS, and totals."
    },
    {
      "fact_id": "F100",
      "layer": "match-row",
      "side": "france",
      "category": "Last 50 row",
      "fact": "France beat Paraguay 1-0 on 2026-07-04 in 2026 FIFA World Cup Round of 16; signals: clean sheet; scorer text: Mbappé 70' ( pen. ).",
      "source_label": "France last-50 match ledger",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/FRA_match_ledger.csv",
      "row_ref": "FRA-050",
      "model_use": "Direct row input for GF, GA, result, clean sheet, BTTS, and totals."
    },
    {
      "fact_id": "F101",
      "layer": "match-row",
      "side": "morocco",
      "category": "Last 50 row",
      "fact": "Morocco beat Angola 1-0 on 2024-03-22 in 2024 Friendly; signals: clean sheet; scorer text: Carmo 71' ( o.g. ).",
      "source_label": "Morocco last-50 match ledger",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/MAR_match_ledger.csv",
      "row_ref": "MAR-001",
      "model_use": "Direct row input for GF, GA, result, clean sheet, BTTS, and totals."
    },
    {
      "fact_id": "F102",
      "layer": "match-row",
      "side": "morocco",
      "category": "Last 50 row",
      "fact": "Morocco drew with Mauritania 0-0 on 2024-03-26 in 2024 Friendly; signals: clean sheet, failed to score.",
      "source_label": "Morocco last-50 match ledger",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/MAR_match_ledger.csv",
      "row_ref": "MAR-002",
      "model_use": "Direct row input for GF, GA, result, clean sheet, BTTS, and totals."
    },
    {
      "fact_id": "F103",
      "layer": "match-row",
      "side": "morocco",
      "category": "Last 50 row",
      "fact": "Morocco beat Zambia 2-1 on 2024-06-07 in 2024 2026 World Cup qualification; signals: BTTS, over 2.5; scorer text: Ziyech 6' ( pen. ) Ben Seghir 67'.",
      "source_label": "Morocco last-50 match ledger",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/MAR_match_ledger.csv",
      "row_ref": "MAR-003",
      "model_use": "Direct row input for GF, GA, result, clean sheet, BTTS, and totals."
    },
    {
      "fact_id": "F104",
      "layer": "match-row",
      "side": "morocco",
      "category": "Last 50 row",
      "fact": "Morocco beat Congo 6-0 on 2024-06-11 in 2024 2026 World Cup qualification; signals: clean sheet, over 2.5, over 3.5; scorer text: Ounahi 8' Riad 16' El Kaabi 30' , 39' , 53' Rahimi 62'.",
      "source_label": "Morocco last-50 match ledger",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/MAR_match_ledger.csv",
      "row_ref": "MAR-004",
      "model_use": "Direct row input for GF, GA, result, clean sheet, BTTS, and totals."
    },
    {
      "fact_id": "F105",
      "layer": "match-row",
      "side": "morocco",
      "category": "Last 50 row",
      "fact": "Morocco beat Gabon 4-1 on 2024-09-06 in 2024 2025 AFCON Q [ note 5 ]; signals: BTTS, over 2.5, over 3.5; scorer text: Ziyech 10' ( pen. ) , 26' ( pen. ) Brahim 59' El Kaabi 82'.",
      "source_label": "Morocco last-50 match ledger",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/MAR_match_ledger.csv",
      "row_ref": "MAR-005",
      "model_use": "Direct row input for GF, GA, result, clean sheet, BTTS, and totals."
    },
    {
      "fact_id": "F106",
      "layer": "match-row",
      "side": "morocco",
      "category": "Last 50 row",
      "fact": "Morocco beat Lesotho 1-0 on 2024-09-09 in 2024 2025 AFCON Q [ note 5 ]; signals: clean sheet; scorer text: Brahim 90+2'.",
      "source_label": "Morocco last-50 match ledger",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/MAR_match_ledger.csv",
      "row_ref": "MAR-006",
      "model_use": "Direct row input for GF, GA, result, clean sheet, BTTS, and totals."
    },
    {
      "fact_id": "F107",
      "layer": "match-row",
      "side": "morocco",
      "category": "Last 50 row",
      "fact": "Morocco beat Central African Republic 5-0 on 2024-10-12 in 2024 2025 AFCON Q [ note 5 ]; signals: clean sheet, over 2.5, over 3.5; scorer text: Ezzalzouli 18' Ounahi 38' , 45+2' Hakimi 45' Rahimi 71' ( pen. ).",
      "source_label": "Morocco last-50 match ledger",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/MAR_match_ledger.csv",
      "row_ref": "MAR-007",
      "model_use": "Direct row input for GF, GA, result, clean sheet, BTTS, and totals."
    },
    {
      "fact_id": "F108",
      "layer": "match-row",
      "side": "morocco",
      "category": "Last 50 row",
      "fact": "Morocco beat Central African Republic 4-0 on 2024-10-15 in 2024 2025 AFCON Q [ note 5 ]; signals: clean sheet, over 2.5, over 3.5; scorer text: Ben Seghir 34' , 38' En-Nesyri 50' ( pen. ) Ezzalzouli 66'.",
      "source_label": "Morocco last-50 match ledger",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/MAR_match_ledger.csv",
      "row_ref": "MAR-008",
      "model_use": "Direct row input for GF, GA, result, clean sheet, BTTS, and totals."
    },
    {
      "fact_id": "F109",
      "layer": "match-row",
      "side": "morocco",
      "category": "Last 50 row",
      "fact": "Morocco beat Gabon 5-1 on 2024-11-10 in 2024 2025 AFCON Q [ note 5 ]; signals: BTTS, over 2.5, over 3.5; scorer text: Harkass 17' Brahim 20' , 23' En-Nesyri 81' Saibari 90'.",
      "source_label": "Morocco last-50 match ledger",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/MAR_match_ledger.csv",
      "row_ref": "MAR-009",
      "model_use": "Direct row input for GF, GA, result, clean sheet, BTTS, and totals."
    },
    {
      "fact_id": "F110",
      "layer": "match-row",
      "side": "morocco",
      "category": "Last 50 row",
      "fact": "Morocco beat Lesotho 7-0 on 2024-11-18 in 2024 2025 AFCON Q [ note 5 ]; signals: clean sheet, over 2.5, over 3.5; scorer text: Brahim 5' , 15' , 42' Rahimi 37' , 45+2' ( pen. ) En-Nesyri 68' Saibari 70'.",
      "source_label": "Morocco last-50 match ledger",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/MAR_match_ledger.csv",
      "row_ref": "MAR-010",
      "model_use": "Direct row input for GF, GA, result, clean sheet, BTTS, and totals."
    },
    {
      "fact_id": "F111",
      "layer": "match-row",
      "side": "morocco",
      "category": "Last 50 row",
      "fact": "Morocco beat Niger 2-1 on 2025-03-21 in 2025 2026 World Cup qualification; signals: BTTS, over 2.5; scorer text: Saibari 59' El Khannouss 90+1'.",
      "source_label": "Morocco last-50 match ledger",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/MAR_match_ledger.csv",
      "row_ref": "MAR-011",
      "model_use": "Direct row input for GF, GA, result, clean sheet, BTTS, and totals."
    },
    {
      "fact_id": "F112",
      "layer": "match-row",
      "side": "morocco",
      "category": "Last 50 row",
      "fact": "Morocco beat Tanzania 2-0 on 2025-03-25 in 2025 2026 World Cup qualification; signals: clean sheet; scorer text: Aguerd 51' Brahim 58' ( pen. ).",
      "source_label": "Morocco last-50 match ledger",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/MAR_match_ledger.csv",
      "row_ref": "MAR-012",
      "model_use": "Direct row input for GF, GA, result, clean sheet, BTTS, and totals."
    },
    {
      "fact_id": "F113",
      "layer": "match-row",
      "side": "morocco",
      "category": "Last 50 row",
      "fact": "Morocco beat Tunisia 2-0 on 2025-06-06 in 2025 Friendly; signals: clean sheet; scorer text: Hakimi 80' El Kaabi 90+4'.",
      "source_label": "Morocco last-50 match ledger",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/MAR_match_ledger.csv",
      "row_ref": "MAR-013",
      "model_use": "Direct row input for GF, GA, result, clean sheet, BTTS, and totals."
    },
    {
      "fact_id": "F114",
      "layer": "match-row",
      "side": "morocco",
      "category": "Last 50 row",
      "fact": "Morocco beat Benin 1-0 on 2025-06-09 in 2025 Friendly; signals: clean sheet; scorer text: El Kaabi 45+2'.",
      "source_label": "Morocco last-50 match ledger",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/MAR_match_ledger.csv",
      "row_ref": "MAR-014",
      "model_use": "Direct row input for GF, GA, result, clean sheet, BTTS, and totals."
    },
    {
      "fact_id": "F115",
      "layer": "match-row",
      "side": "morocco",
      "category": "Last 50 row",
      "fact": "Morocco beat Angola 2-0 on 2025-08-03 in 2025 CHAN 2024 GS; signals: clean sheet; scorer text: Riahi 29' Quinito 81' ( o.g. ).",
      "source_label": "Morocco last-50 match ledger",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/MAR_match_ledger.csv",
      "row_ref": "MAR-015",
      "model_use": "Direct row input for GF, GA, result, clean sheet, BTTS, and totals."
    },
    {
      "fact_id": "F116",
      "layer": "match-row",
      "side": "morocco",
      "category": "Last 50 row",
      "fact": "Morocco lost to Kenya 0-1 on 2025-08-10 in 2025 CHAN 2024 GS; signals: failed to score.",
      "source_label": "Morocco last-50 match ledger",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/MAR_match_ledger.csv",
      "row_ref": "MAR-016",
      "model_use": "Direct row input for GF, GA, result, clean sheet, BTTS, and totals."
    },
    {
      "fact_id": "F117",
      "layer": "match-row",
      "side": "morocco",
      "category": "Last 50 row",
      "fact": "Morocco beat Zambia 3-1 on 2025-08-14 in 2025 CHAN 2024 GS; signals: BTTS, over 2.5, over 3.5; scorer text: Hrimat 45+2' Lamlioui 66' Bougrine 90+5'.",
      "source_label": "Morocco last-50 match ledger",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/MAR_match_ledger.csv",
      "row_ref": "MAR-017",
      "model_use": "Direct row input for GF, GA, result, clean sheet, BTTS, and totals."
    },
    {
      "fact_id": "F118",
      "layer": "match-row",
      "side": "morocco",
      "category": "Last 50 row",
      "fact": "Morocco beat DR Congo 3-1 on 2025-08-17 in 2025 CHAN 2024 GS; signals: BTTS, over 2.5, over 3.5; scorer text: Lamlioui 8' , 80' Hrimat 70' ( pen. ).",
      "source_label": "Morocco last-50 match ledger",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/MAR_match_ledger.csv",
      "row_ref": "MAR-018",
      "model_use": "Direct row input for GF, GA, result, clean sheet, BTTS, and totals."
    },
    {
      "fact_id": "F119",
      "layer": "match-row",
      "side": "morocco",
      "category": "Last 50 row",
      "fact": "Morocco beat Tanzania 1-0 on 2025-08-22 in 2025 CHAN 2024 QF; signals: clean sheet; scorer text: Lamlioui 65'.",
      "source_label": "Morocco last-50 match ledger",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/MAR_match_ledger.csv",
      "row_ref": "MAR-019",
      "model_use": "Direct row input for GF, GA, result, clean sheet, BTTS, and totals."
    },
    {
      "fact_id": "F120",
      "layer": "match-row",
      "side": "morocco",
      "category": "Last 50 row",
      "fact": "Morocco drew with Senegal 1-1 on 2025-08-26 in 2025 CHAN 2024 SF; signals: BTTS; scorer text: Bougrine 23'.",
      "source_label": "Morocco last-50 match ledger",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/MAR_match_ledger.csv",
      "row_ref": "MAR-020",
      "model_use": "Direct row input for GF, GA, result, clean sheet, BTTS, and totals."
    },
    {
      "fact_id": "F121",
      "layer": "match-row",
      "side": "morocco",
      "category": "Last 50 row",
      "fact": "Morocco beat Madagascar 3-2 on 2025-08-30 in 2025 CHAN 2024 Final; signals: BTTS, over 2.5, over 3.5; scorer text: Mehri 27' Lamlioui 44' , 80'.",
      "source_label": "Morocco last-50 match ledger",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/MAR_match_ledger.csv",
      "row_ref": "MAR-021",
      "model_use": "Direct row input for GF, GA, result, clean sheet, BTTS, and totals."
    },
    {
      "fact_id": "F122",
      "layer": "match-row",
      "side": "morocco",
      "category": "Last 50 row",
      "fact": "Morocco beat Niger 5-0 on 2025-09-05 in 2025 2026 World Cup qualification; signals: clean sheet, over 2.5, over 3.5; scorer text: Saibari 29' , 38' El Kaabi 51' Igamane 69' Ounahi 84'.",
      "source_label": "Morocco last-50 match ledger",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/MAR_match_ledger.csv",
      "row_ref": "MAR-022",
      "model_use": "Direct row input for GF, GA, result, clean sheet, BTTS, and totals."
    },
    {
      "fact_id": "F123",
      "layer": "match-row",
      "side": "morocco",
      "category": "Last 50 row",
      "fact": "Morocco beat Zambia 2-0 on 2025-09-08 in 2025 2026 World Cup qualification; signals: clean sheet; scorer text: En-Nesyri 7' Igamane 47'.",
      "source_label": "Morocco last-50 match ledger",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/MAR_match_ledger.csv",
      "row_ref": "MAR-023",
      "model_use": "Direct row input for GF, GA, result, clean sheet, BTTS, and totals."
    },
    {
      "fact_id": "F124",
      "layer": "match-row",
      "side": "morocco",
      "category": "Last 50 row",
      "fact": "Morocco beat Bahrain 1-0 on 2025-10-09 in 2025 Friendly; signals: clean sheet; scorer text: El Yamiq 90+4'.",
      "source_label": "Morocco last-50 match ledger",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/MAR_match_ledger.csv",
      "row_ref": "MAR-024",
      "model_use": "Direct row input for GF, GA, result, clean sheet, BTTS, and totals."
    },
    {
      "fact_id": "F125",
      "layer": "match-row",
      "side": "morocco",
      "category": "Last 50 row",
      "fact": "Morocco beat Congo 1-0 on 2025-10-14 in 2025 2026 World Cup qualification; signals: clean sheet; scorer text: En-Nesyri 63'.",
      "source_label": "Morocco last-50 match ledger",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/MAR_match_ledger.csv",
      "row_ref": "MAR-025",
      "model_use": "Direct row input for GF, GA, result, clean sheet, BTTS, and totals."
    },
    {
      "fact_id": "F126",
      "layer": "match-row",
      "side": "morocco",
      "category": "Last 50 row",
      "fact": "Morocco beat Mozambique 1-0 on 2025-11-14 in 2025 Friendly; signals: clean sheet; scorer text: Ounahi 7'.",
      "source_label": "Morocco last-50 match ledger",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/MAR_match_ledger.csv",
      "row_ref": "MAR-026",
      "model_use": "Direct row input for GF, GA, result, clean sheet, BTTS, and totals."
    },
    {
      "fact_id": "F127",
      "layer": "match-row",
      "side": "morocco",
      "category": "Last 50 row",
      "fact": "Morocco beat Uganda 4-0 on 2025-11-18 in 2025 Friendly; signals: clean sheet, over 2.5, over 3.5; scorer text: Achai 4' ( o.g. ) Saibari 33' Rahimi 79' ( pen. ) El Khannouss 88'.",
      "source_label": "Morocco last-50 match ledger",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/MAR_match_ledger.csv",
      "row_ref": "MAR-027",
      "model_use": "Direct row input for GF, GA, result, clean sheet, BTTS, and totals."
    },
    {
      "fact_id": "F128",
      "layer": "match-row",
      "side": "morocco",
      "category": "Last 50 row",
      "fact": "Morocco beat Comoros 3-1 on 2025-12-02 in 2025 FIFA Arab Cup GS; signals: BTTS, over 2.5, over 3.5; scorer text: Bouftini 5' Tissoudali 11' El Berkaoui 45+4'.",
      "source_label": "Morocco last-50 match ledger",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/MAR_match_ledger.csv",
      "row_ref": "MAR-028",
      "model_use": "Direct row input for GF, GA, result, clean sheet, BTTS, and totals."
    },
    {
      "fact_id": "F129",
      "layer": "match-row",
      "side": "morocco",
      "category": "Last 50 row",
      "fact": "Morocco drew with Oman 0-0 on 2025-12-05 in 2025 FIFA Arab Cup GS; signals: clean sheet, failed to score.",
      "source_label": "Morocco last-50 match ledger",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/MAR_match_ledger.csv",
      "row_ref": "MAR-029",
      "model_use": "Direct row input for GF, GA, result, clean sheet, BTTS, and totals."
    },
    {
      "fact_id": "F130",
      "layer": "match-row",
      "side": "morocco",
      "category": "Last 50 row",
      "fact": "Morocco beat Saudi Arabia 1-0 on 2025-12-08 in 2025 FIFA Arab Cup GS; signals: clean sheet; scorer text: El Berkaoui 11'.",
      "source_label": "Morocco last-50 match ledger",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/MAR_match_ledger.csv",
      "row_ref": "MAR-030",
      "model_use": "Direct row input for GF, GA, result, clean sheet, BTTS, and totals."
    },
    {
      "fact_id": "F131",
      "layer": "match-row",
      "side": "morocco",
      "category": "Last 50 row",
      "fact": "Morocco beat Syria 1-0 on 2025-12-11 in 2025 FIFA Arab Cup QF; signals: clean sheet; scorer text: Azaro 79'.",
      "source_label": "Morocco last-50 match ledger",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/MAR_match_ledger.csv",
      "row_ref": "MAR-031",
      "model_use": "Direct row input for GF, GA, result, clean sheet, BTTS, and totals."
    },
    {
      "fact_id": "F132",
      "layer": "match-row",
      "side": "morocco",
      "category": "Last 50 row",
      "fact": "Morocco beat United Arab Emirates 3-0 on 2025-12-15 in 2025 FIFA Arab Cup SF; signals: clean sheet, over 2.5; scorer text: El Berkaoui 28' El Mahdioui 83' Hamdallah 90+2'.",
      "source_label": "Morocco last-50 match ledger",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/MAR_match_ledger.csv",
      "row_ref": "MAR-032",
      "model_use": "Direct row input for GF, GA, result, clean sheet, BTTS, and totals."
    },
    {
      "fact_id": "F133",
      "layer": "match-row",
      "side": "morocco",
      "category": "Last 50 row",
      "fact": "Morocco beat Jordan 3-2 on 2025-12-18 in 2025 FIFA Arab Cup Final; signals: BTTS, over 2.5, over 3.5; scorer text: Tannane 4' Hamdallah 88' , 100'.",
      "source_label": "Morocco last-50 match ledger",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/MAR_match_ledger.csv",
      "row_ref": "MAR-033",
      "model_use": "Direct row input for GF, GA, result, clean sheet, BTTS, and totals."
    },
    {
      "fact_id": "F134",
      "layer": "match-row",
      "side": "morocco",
      "category": "Last 50 row",
      "fact": "Morocco beat Comoros 2-0 on 2025-12-21 in 2025 AFCON GS; signals: clean sheet; scorer text: Brahim 55' El Kaabi 74'.",
      "source_label": "Morocco last-50 match ledger",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/MAR_match_ledger.csv",
      "row_ref": "MAR-034",
      "model_use": "Direct row input for GF, GA, result, clean sheet, BTTS, and totals."
    },
    {
      "fact_id": "F135",
      "layer": "match-row",
      "side": "morocco",
      "category": "Last 50 row",
      "fact": "Morocco drew with Mali 1-1 on 2025-12-26 in 2025 AFCON GS; signals: BTTS; scorer text: Brahim 45+5' ( pen. ).",
      "source_label": "Morocco last-50 match ledger",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/MAR_match_ledger.csv",
      "row_ref": "MAR-035",
      "model_use": "Direct row input for GF, GA, result, clean sheet, BTTS, and totals."
    },
    {
      "fact_id": "F136",
      "layer": "match-row",
      "side": "morocco",
      "category": "Last 50 row",
      "fact": "Morocco beat Zambia 3-0 on 2025-12-29 in 2025 AFCON GS; signals: clean sheet, over 2.5; scorer text: El Kaabi 9' , 50' Brahim 27'.",
      "source_label": "Morocco last-50 match ledger",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/MAR_match_ledger.csv",
      "row_ref": "MAR-036",
      "model_use": "Direct row input for GF, GA, result, clean sheet, BTTS, and totals."
    },
    {
      "fact_id": "F137",
      "layer": "match-row",
      "side": "morocco",
      "category": "Last 50 row",
      "fact": "Morocco beat Tanzania 1-0 on 2026-01-04 in 2026 2025 AFCON R16; signals: clean sheet; scorer text: Brahim 64'.",
      "source_label": "Morocco last-50 match ledger",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/MAR_match_ledger.csv",
      "row_ref": "MAR-037",
      "model_use": "Direct row input for GF, GA, result, clean sheet, BTTS, and totals."
    },
    {
      "fact_id": "F138",
      "layer": "match-row",
      "side": "morocco",
      "category": "Last 50 row",
      "fact": "Morocco beat Cameroon 2-0 on 2026-01-09 in 2026 2025 AFCON QF; signals: clean sheet; scorer text: Brahim 26' Saibari 74'.",
      "source_label": "Morocco last-50 match ledger",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/MAR_match_ledger.csv",
      "row_ref": "MAR-038",
      "model_use": "Direct row input for GF, GA, result, clean sheet, BTTS, and totals."
    },
    {
      "fact_id": "F139",
      "layer": "match-row",
      "side": "morocco",
      "category": "Last 50 row",
      "fact": "Morocco drew with Nigeria 0-0 on 2026-01-14 in 2026 2025 AFCON SF; signals: clean sheet, failed to score.",
      "source_label": "Morocco last-50 match ledger",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/MAR_match_ledger.csv",
      "row_ref": "MAR-039",
      "model_use": "Direct row input for GF, GA, result, clean sheet, BTTS, and totals."
    },
    {
      "fact_id": "F140",
      "layer": "match-row",
      "side": "morocco",
      "category": "Last 50 row",
      "fact": "Morocco beat Senegal 3-0 on 2026-01-18 in 2026 2025 AFCON Final; signals: clean sheet, over 2.5.",
      "source_label": "Morocco last-50 match ledger",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/MAR_match_ledger.csv",
      "row_ref": "MAR-040",
      "model_use": "Direct row input for GF, GA, result, clean sheet, BTTS, and totals."
    },
    {
      "fact_id": "F141",
      "layer": "match-row",
      "side": "morocco",
      "category": "Last 50 row",
      "fact": "Morocco drew with Ecuador 1-1 on 2026-03-27 in 2026 Friendly; signals: BTTS; scorer text: El Aynaoui 88'.",
      "source_label": "Morocco last-50 match ledger",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/MAR_match_ledger.csv",
      "row_ref": "MAR-041",
      "model_use": "Direct row input for GF, GA, result, clean sheet, BTTS, and totals."
    },
    {
      "fact_id": "F142",
      "layer": "match-row",
      "side": "morocco",
      "category": "Last 50 row",
      "fact": "Morocco beat Paraguay 2-1 on 2026-03-31 in 2026 Friendly; signals: BTTS, over 2.5; scorer text: El Khannouss 48' El Aynaoui 53'.",
      "source_label": "Morocco last-50 match ledger",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/MAR_match_ledger.csv",
      "row_ref": "MAR-042",
      "model_use": "Direct row input for GF, GA, result, clean sheet, BTTS, and totals."
    },
    {
      "fact_id": "F143",
      "layer": "match-row",
      "side": "morocco",
      "category": "Last 50 row",
      "fact": "Morocco beat Burundi 5-0 on 2026-05-26 in 2026 Friendly; signals: clean sheet, over 2.5, over 3.5; scorer text: El Kaabi 59' , 63' Bentayeb 71' Benjdida 80' , 90'.",
      "source_label": "Morocco last-50 match ledger",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/MAR_match_ledger.csv",
      "row_ref": "MAR-043",
      "model_use": "Direct row input for GF, GA, result, clean sheet, BTTS, and totals."
    },
    {
      "fact_id": "F144",
      "layer": "match-row",
      "side": "morocco",
      "category": "Last 50 row",
      "fact": "Morocco beat Madagascar 4-0 on 2026-06-02 in 2026 Friendly; signals: clean sheet, over 2.5, over 3.5; scorer text: Saibari 4' , 25' Rahimi 78' ( pen. ) El Kaabi 87'.",
      "source_label": "Morocco last-50 match ledger",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/MAR_match_ledger.csv",
      "row_ref": "MAR-044",
      "model_use": "Direct row input for GF, GA, result, clean sheet, BTTS, and totals."
    },
    {
      "fact_id": "F145",
      "layer": "match-row",
      "side": "morocco",
      "category": "Last 50 row",
      "fact": "Morocco drew with Norway 1-1 on 2026-06-07 in 2026 Friendly; signals: BTTS; scorer text: Brahim 8'.",
      "source_label": "Morocco last-50 match ledger",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/MAR_match_ledger.csv",
      "row_ref": "MAR-045",
      "model_use": "Direct row input for GF, GA, result, clean sheet, BTTS, and totals."
    },
    {
      "fact_id": "F146",
      "layer": "match-row",
      "side": "morocco",
      "category": "Last 50 row",
      "fact": "Morocco drew with Brazil 1-1 on 2026-06-13 in 2026 FIFA World Cup GS ( Group C ); signals: BTTS; scorer text: Saibari 21'.",
      "source_label": "Morocco last-50 match ledger",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/MAR_match_ledger.csv",
      "row_ref": "MAR-046",
      "model_use": "Direct row input for GF, GA, result, clean sheet, BTTS, and totals."
    },
    {
      "fact_id": "F147",
      "layer": "match-row",
      "side": "morocco",
      "category": "Last 50 row",
      "fact": "Morocco beat Scotland 1-0 on 2026-06-19 in 2026 FIFA World Cup GS ( Group C ); signals: clean sheet; scorer text: Saibari 2'.",
      "source_label": "Morocco last-50 match ledger",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/MAR_match_ledger.csv",
      "row_ref": "MAR-047",
      "model_use": "Direct row input for GF, GA, result, clean sheet, BTTS, and totals."
    },
    {
      "fact_id": "F148",
      "layer": "match-row",
      "side": "morocco",
      "category": "Last 50 row",
      "fact": "Morocco beat Haiti 4-2 on 2026-06-24 in 2026 FIFA World Cup GS ( Group C ); signals: BTTS, over 2.5, over 3.5; scorer text: Hakimi 39' Saibari 45+1' Rahimi 78' Yassine 89'.",
      "source_label": "Morocco last-50 match ledger",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/MAR_match_ledger.csv",
      "row_ref": "MAR-048",
      "model_use": "Direct row input for GF, GA, result, clean sheet, BTTS, and totals."
    },
    {
      "fact_id": "F149",
      "layer": "match-row",
      "side": "morocco",
      "category": "Last 50 row",
      "fact": "Morocco drew with Netherlands 1-1 on 2026-06-29 in 2026 FIFA World Cup ( R32 ); signals: BTTS; scorer text: Diop 90+1'.",
      "source_label": "Morocco last-50 match ledger",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/MAR_match_ledger.csv",
      "row_ref": "MAR-049",
      "model_use": "Direct row input for GF, GA, result, clean sheet, BTTS, and totals."
    },
    {
      "fact_id": "F150",
      "layer": "match-row",
      "side": "morocco",
      "category": "Last 50 row",
      "fact": "Morocco beat Canada 3-0 on 2026-07-04 in 2026 FIFA World Cup ( R16 ); signals: clean sheet, over 2.5; scorer text: Ounahi 50', 82' Rahimi 90+8'.",
      "source_label": "Morocco last-50 match ledger",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/MAR_match_ledger.csv",
      "row_ref": "MAR-050",
      "model_use": "Direct row input for GF, GA, result, clean sheet, BTTS, and totals."
    },
    {
      "fact_id": "F151",
      "layer": "current-worldcup",
      "side": "france",
      "category": "Current tournament score",
      "fact": "France's current World Cup row against Senegal finished 3-1 with 3 goals for and 1 against.",
      "source_label": "Turtle current tournament rows",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/current_tournament_rows.csv",
      "row_ref": "FRA-046",
      "model_use": "Current-tournament form row before opponent-threshold modeling."
    },
    {
      "fact_id": "F152",
      "layer": "current-worldcup",
      "side": "france",
      "category": "Current tournament scorers",
      "fact": "France's scorer text against Senegal: Mbappé 66' , 90+6' Barcola 82'.",
      "source_label": "Turtle current tournament rows",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/current_tournament_rows.csv",
      "row_ref": "FRA-046",
      "model_use": "Player-form evidence for who is actually appearing in the scoring ledger."
    },
    {
      "fact_id": "F153",
      "layer": "current-worldcup",
      "side": "france",
      "category": "Current tournament defense",
      "fact": "France vs Senegal: clean sheet=no, BTTS=yes, over 2.5=yes, over 3.5=yes.",
      "source_label": "Turtle current tournament rows",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/current_tournament_rows.csv",
      "row_ref": "FRA-046",
      "model_use": "Defensive and total-goal state from current tournament rows."
    },
    {
      "fact_id": "F154",
      "layer": "current-worldcup",
      "side": "france",
      "category": "Current tournament score",
      "fact": "France's current World Cup row against Iraq finished 3-0 with 3 goals for and 0 against.",
      "source_label": "Turtle current tournament rows",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/current_tournament_rows.csv",
      "row_ref": "FRA-047",
      "model_use": "Current-tournament form row before opponent-threshold modeling."
    },
    {
      "fact_id": "F155",
      "layer": "current-worldcup",
      "side": "france",
      "category": "Current tournament scorers",
      "fact": "France's scorer text against Iraq: Mbappé 14' , 54' Dembélé 66'.",
      "source_label": "Turtle current tournament rows",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/current_tournament_rows.csv",
      "row_ref": "FRA-047",
      "model_use": "Player-form evidence for who is actually appearing in the scoring ledger."
    },
    {
      "fact_id": "F156",
      "layer": "current-worldcup",
      "side": "france",
      "category": "Current tournament defense",
      "fact": "France vs Iraq: clean sheet=yes, BTTS=no, over 2.5=yes, over 3.5=no.",
      "source_label": "Turtle current tournament rows",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/current_tournament_rows.csv",
      "row_ref": "FRA-047",
      "model_use": "Defensive and total-goal state from current tournament rows."
    },
    {
      "fact_id": "F157",
      "layer": "current-worldcup",
      "side": "france",
      "category": "Current tournament score",
      "fact": "France's current World Cup row against Norway finished 4-1 with 4 goals for and 1 against.",
      "source_label": "Turtle current tournament rows",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/current_tournament_rows.csv",
      "row_ref": "FRA-048",
      "model_use": "Current-tournament form row before opponent-threshold modeling."
    },
    {
      "fact_id": "F158",
      "layer": "current-worldcup",
      "side": "france",
      "category": "Current tournament scorers",
      "fact": "France's scorer text against Norway: Dembélé 7' , 20' , 32' Doué 90+4'.",
      "source_label": "Turtle current tournament rows",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/current_tournament_rows.csv",
      "row_ref": "FRA-048",
      "model_use": "Player-form evidence for who is actually appearing in the scoring ledger."
    },
    {
      "fact_id": "F159",
      "layer": "current-worldcup",
      "side": "france",
      "category": "Current tournament defense",
      "fact": "France vs Norway: clean sheet=no, BTTS=yes, over 2.5=yes, over 3.5=yes.",
      "source_label": "Turtle current tournament rows",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/current_tournament_rows.csv",
      "row_ref": "FRA-048",
      "model_use": "Defensive and total-goal state from current tournament rows."
    },
    {
      "fact_id": "F160",
      "layer": "current-worldcup",
      "side": "france",
      "category": "Current tournament score",
      "fact": "France's current World Cup row against Sweden finished 3-0 with 3 goals for and 0 against.",
      "source_label": "Turtle current tournament rows",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/current_tournament_rows.csv",
      "row_ref": "FRA-049",
      "model_use": "Current-tournament form row before opponent-threshold modeling."
    },
    {
      "fact_id": "F161",
      "layer": "current-worldcup",
      "side": "france",
      "category": "Current tournament scorers",
      "fact": "France's scorer text against Sweden: Mbappé 45' , 74' Barcola 53'.",
      "source_label": "Turtle current tournament rows",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/current_tournament_rows.csv",
      "row_ref": "FRA-049",
      "model_use": "Player-form evidence for who is actually appearing in the scoring ledger."
    },
    {
      "fact_id": "F162",
      "layer": "current-worldcup",
      "side": "france",
      "category": "Current tournament defense",
      "fact": "France vs Sweden: clean sheet=yes, BTTS=no, over 2.5=yes, over 3.5=no.",
      "source_label": "Turtle current tournament rows",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/current_tournament_rows.csv",
      "row_ref": "FRA-049",
      "model_use": "Defensive and total-goal state from current tournament rows."
    },
    {
      "fact_id": "F163",
      "layer": "current-worldcup",
      "side": "france",
      "category": "Current tournament score",
      "fact": "France's current World Cup row against Paraguay finished 1-0 with 1 goals for and 0 against.",
      "source_label": "Turtle current tournament rows",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/current_tournament_rows.csv",
      "row_ref": "FRA-050",
      "model_use": "Current-tournament form row before opponent-threshold modeling."
    },
    {
      "fact_id": "F164",
      "layer": "current-worldcup",
      "side": "france",
      "category": "Current tournament scorers",
      "fact": "France's scorer text against Paraguay: Mbappé 70' ( pen. ).",
      "source_label": "Turtle current tournament rows",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/current_tournament_rows.csv",
      "row_ref": "FRA-050",
      "model_use": "Player-form evidence for who is actually appearing in the scoring ledger."
    },
    {
      "fact_id": "F165",
      "layer": "current-worldcup",
      "side": "france",
      "category": "Current tournament defense",
      "fact": "France vs Paraguay: clean sheet=yes, BTTS=no, over 2.5=no, over 3.5=no.",
      "source_label": "Turtle current tournament rows",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/current_tournament_rows.csv",
      "row_ref": "FRA-050",
      "model_use": "Defensive and total-goal state from current tournament rows."
    },
    {
      "fact_id": "F166",
      "layer": "current-worldcup",
      "side": "morocco",
      "category": "Current tournament score",
      "fact": "Morocco's current World Cup row against Brazil finished 1-1 with 1 goals for and 1 against.",
      "source_label": "Turtle current tournament rows",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/current_tournament_rows.csv",
      "row_ref": "MAR-046",
      "model_use": "Current-tournament form row before opponent-threshold modeling."
    },
    {
      "fact_id": "F167",
      "layer": "current-worldcup",
      "side": "morocco",
      "category": "Current tournament scorers",
      "fact": "Morocco's scorer text against Brazil: Saibari 21'.",
      "source_label": "Turtle current tournament rows",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/current_tournament_rows.csv",
      "row_ref": "MAR-046",
      "model_use": "Player-form evidence for who is actually appearing in the scoring ledger."
    },
    {
      "fact_id": "F168",
      "layer": "current-worldcup",
      "side": "morocco",
      "category": "Current tournament defense",
      "fact": "Morocco vs Brazil: clean sheet=no, BTTS=yes, over 2.5=no, over 3.5=no.",
      "source_label": "Turtle current tournament rows",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/current_tournament_rows.csv",
      "row_ref": "MAR-046",
      "model_use": "Defensive and total-goal state from current tournament rows."
    },
    {
      "fact_id": "F169",
      "layer": "current-worldcup",
      "side": "morocco",
      "category": "Current tournament score",
      "fact": "Morocco's current World Cup row against Scotland finished 1-0 with 1 goals for and 0 against.",
      "source_label": "Turtle current tournament rows",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/current_tournament_rows.csv",
      "row_ref": "MAR-047",
      "model_use": "Current-tournament form row before opponent-threshold modeling."
    },
    {
      "fact_id": "F170",
      "layer": "current-worldcup",
      "side": "morocco",
      "category": "Current tournament scorers",
      "fact": "Morocco's scorer text against Scotland: Saibari 2'.",
      "source_label": "Turtle current tournament rows",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/current_tournament_rows.csv",
      "row_ref": "MAR-047",
      "model_use": "Player-form evidence for who is actually appearing in the scoring ledger."
    },
    {
      "fact_id": "F171",
      "layer": "current-worldcup",
      "side": "morocco",
      "category": "Current tournament defense",
      "fact": "Morocco vs Scotland: clean sheet=yes, BTTS=no, over 2.5=no, over 3.5=no.",
      "source_label": "Turtle current tournament rows",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/current_tournament_rows.csv",
      "row_ref": "MAR-047",
      "model_use": "Defensive and total-goal state from current tournament rows."
    },
    {
      "fact_id": "F172",
      "layer": "current-worldcup",
      "side": "morocco",
      "category": "Current tournament score",
      "fact": "Morocco's current World Cup row against Haiti finished 4-2 with 4 goals for and 2 against.",
      "source_label": "Turtle current tournament rows",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/current_tournament_rows.csv",
      "row_ref": "MAR-048",
      "model_use": "Current-tournament form row before opponent-threshold modeling."
    },
    {
      "fact_id": "F173",
      "layer": "current-worldcup",
      "side": "morocco",
      "category": "Current tournament scorers",
      "fact": "Morocco's scorer text against Haiti: Hakimi 39' Saibari 45+1' Rahimi 78' Yassine 89'.",
      "source_label": "Turtle current tournament rows",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/current_tournament_rows.csv",
      "row_ref": "MAR-048",
      "model_use": "Player-form evidence for who is actually appearing in the scoring ledger."
    },
    {
      "fact_id": "F174",
      "layer": "current-worldcup",
      "side": "morocco",
      "category": "Current tournament defense",
      "fact": "Morocco vs Haiti: clean sheet=no, BTTS=yes, over 2.5=yes, over 3.5=yes.",
      "source_label": "Turtle current tournament rows",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/current_tournament_rows.csv",
      "row_ref": "MAR-048",
      "model_use": "Defensive and total-goal state from current tournament rows."
    },
    {
      "fact_id": "F175",
      "layer": "current-worldcup",
      "side": "morocco",
      "category": "Current tournament score",
      "fact": "Morocco's current World Cup row against Netherlands finished 1-1 with 1 goals for and 1 against.",
      "source_label": "Turtle current tournament rows",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/current_tournament_rows.csv",
      "row_ref": "MAR-049",
      "model_use": "Current-tournament form row before opponent-threshold modeling."
    },
    {
      "fact_id": "F176",
      "layer": "current-worldcup",
      "side": "morocco",
      "category": "Current tournament scorers",
      "fact": "Morocco's scorer text against Netherlands: Diop 90+1'.",
      "source_label": "Turtle current tournament rows",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/current_tournament_rows.csv",
      "row_ref": "MAR-049",
      "model_use": "Player-form evidence for who is actually appearing in the scoring ledger."
    },
    {
      "fact_id": "F177",
      "layer": "current-worldcup",
      "side": "morocco",
      "category": "Current tournament defense",
      "fact": "Morocco vs Netherlands: clean sheet=no, BTTS=yes, over 2.5=no, over 3.5=no.",
      "source_label": "Turtle current tournament rows",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/current_tournament_rows.csv",
      "row_ref": "MAR-049",
      "model_use": "Defensive and total-goal state from current tournament rows."
    },
    {
      "fact_id": "F178",
      "layer": "current-worldcup",
      "side": "morocco",
      "category": "Current tournament score",
      "fact": "Morocco's current World Cup row against Canada finished 3-0 with 3 goals for and 0 against.",
      "source_label": "Turtle current tournament rows",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/current_tournament_rows.csv",
      "row_ref": "MAR-050",
      "model_use": "Current-tournament form row before opponent-threshold modeling."
    },
    {
      "fact_id": "F179",
      "layer": "current-worldcup",
      "side": "morocco",
      "category": "Current tournament scorers",
      "fact": "Morocco's scorer text against Canada: Ounahi 50', 82' Rahimi 90+8'.",
      "source_label": "Turtle current tournament rows",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/current_tournament_rows.csv",
      "row_ref": "MAR-050",
      "model_use": "Player-form evidence for who is actually appearing in the scoring ledger."
    },
    {
      "fact_id": "F180",
      "layer": "current-worldcup",
      "side": "morocco",
      "category": "Current tournament defense",
      "fact": "Morocco vs Canada: clean sheet=yes, BTTS=no, over 2.5=yes, over 3.5=no.",
      "source_label": "Turtle current tournament rows",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/current_tournament_rows.csv",
      "row_ref": "MAR-050",
      "model_use": "Defensive and total-goal state from current tournament rows."
    },
    {
      "fact_id": "F181",
      "layer": "summary-metric",
      "side": "france",
      "category": "goals for per match",
      "fact": "France last10 goals for per match is 2.600 across 10 rows.",
      "source_label": "Turtle first-level ledger",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/first_level_summary.csv",
      "row_ref": "FRA:last10:goals_for_per_match",
      "model_use": "Aggregate rate used to check whether a proposed score branch has data support."
    },
    {
      "fact_id": "F182",
      "layer": "summary-metric",
      "side": "france",
      "category": "goals against per match",
      "fact": "France last10 goals against per match is 0.800 across 10 rows.",
      "source_label": "Turtle first-level ledger",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/first_level_summary.csv",
      "row_ref": "FRA:last10:goals_against_per_match",
      "model_use": "Aggregate rate used to check whether a proposed score branch has data support."
    },
    {
      "fact_id": "F183",
      "layer": "summary-metric",
      "side": "france",
      "category": "clean-sheet rate",
      "fact": "France last10 clean-sheet rate is 0.300 across 10 rows.",
      "source_label": "Turtle first-level ledger",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/first_level_summary.csv",
      "row_ref": "FRA:last10:clean_sheet_rate",
      "model_use": "Aggregate rate used to check whether a proposed score branch has data support."
    },
    {
      "fact_id": "F184",
      "layer": "summary-metric",
      "side": "france",
      "category": "goals for per match",
      "fact": "France current_worldcup goals for per match is 2.800 across 5 rows.",
      "source_label": "Turtle first-level ledger",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/first_level_summary.csv",
      "row_ref": "FRA:current_worldcup:goals_for_per_match",
      "model_use": "Aggregate rate used to check whether a proposed score branch has data support."
    },
    {
      "fact_id": "F185",
      "layer": "summary-metric",
      "side": "france",
      "category": "goals against per match",
      "fact": "France current_worldcup goals against per match is 0.400 across 5 rows.",
      "source_label": "Turtle first-level ledger",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/first_level_summary.csv",
      "row_ref": "FRA:current_worldcup:goals_against_per_match",
      "model_use": "Aggregate rate used to check whether a proposed score branch has data support."
    },
    {
      "fact_id": "F186",
      "layer": "summary-metric",
      "side": "france",
      "category": "clean-sheet rate",
      "fact": "France current_worldcup clean-sheet rate is 0.600 across 5 rows.",
      "source_label": "Turtle first-level ledger",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/first_level_summary.csv",
      "row_ref": "FRA:current_worldcup:clean_sheet_rate",
      "model_use": "Aggregate rate used to check whether a proposed score branch has data support."
    },
    {
      "fact_id": "F187",
      "layer": "summary-metric",
      "side": "morocco",
      "category": "goals for per match",
      "fact": "Morocco last10 goals for per match is 2.300 across 10 rows.",
      "source_label": "Turtle first-level ledger",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/first_level_summary.csv",
      "row_ref": "MAR:last10:goals_for_per_match",
      "model_use": "Aggregate rate used to check whether a proposed score branch has data support."
    },
    {
      "fact_id": "F188",
      "layer": "summary-metric",
      "side": "morocco",
      "category": "goals against per match",
      "fact": "Morocco last10 goals against per match is 0.700 across 10 rows.",
      "source_label": "Turtle first-level ledger",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/first_level_summary.csv",
      "row_ref": "MAR:last10:goals_against_per_match",
      "model_use": "Aggregate rate used to check whether a proposed score branch has data support."
    },
    {
      "fact_id": "F189",
      "layer": "summary-metric",
      "side": "morocco",
      "category": "clean-sheet rate",
      "fact": "Morocco last10 clean-sheet rate is 0.400 across 10 rows.",
      "source_label": "Turtle first-level ledger",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/first_level_summary.csv",
      "row_ref": "MAR:last10:clean_sheet_rate",
      "model_use": "Aggregate rate used to check whether a proposed score branch has data support."
    },
    {
      "fact_id": "F190",
      "layer": "summary-metric",
      "side": "morocco",
      "category": "goals for per match",
      "fact": "Morocco current_worldcup goals for per match is 2.000 across 5 rows.",
      "source_label": "Turtle first-level ledger",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/first_level_summary.csv",
      "row_ref": "MAR:current_worldcup:goals_for_per_match",
      "model_use": "Aggregate rate used to check whether a proposed score branch has data support."
    },
    {
      "fact_id": "F191",
      "layer": "summary-metric",
      "side": "morocco",
      "category": "goals against per match",
      "fact": "Morocco current_worldcup goals against per match is 0.800 across 5 rows.",
      "source_label": "Turtle first-level ledger",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/first_level_summary.csv",
      "row_ref": "MAR:current_worldcup:goals_against_per_match",
      "model_use": "Aggregate rate used to check whether a proposed score branch has data support."
    },
    {
      "fact_id": "F192",
      "layer": "summary-metric",
      "side": "morocco",
      "category": "clean-sheet rate",
      "fact": "Morocco current_worldcup clean-sheet rate is 0.400 across 5 rows.",
      "source_label": "Turtle first-level ledger",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/first_level_summary.csv",
      "row_ref": "MAR:current_worldcup:clean_sheet_rate",
      "model_use": "Aggregate rate used to check whether a proposed score branch has data support."
    },
    {
      "fact_id": "F193",
      "layer": "result-bucket",
      "side": "france",
      "category": "last50 W bucket",
      "fact": "France last50 bucket W has 34 rows, GF/M=2.853, GA/M=0.471, modes=3-1 (6); 2-0 (6); 2-1 (5); 1-0 (5); 3-0 (5); 4-1 (3); 4-0 (2); 14-0 (1).",
      "source_label": "Turtle result-bucket summary",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/result_bucket_summary.csv",
      "row_ref": "FRA:last50:W",
      "model_use": "Branch-family evidence for win, draw, and loss score shapes."
    },
    {
      "fact_id": "F194",
      "layer": "result-bucket",
      "side": "france",
      "category": "last50 D bucket",
      "fact": "France last50 bucket D has 8 rows, GF/M=1.000, GA/M=1.000, modes=0-0 (4); 2-2 (2); 3-3 (1); 1-1 (1).",
      "source_label": "Turtle result-bucket summary",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/result_bucket_summary.csv",
      "row_ref": "FRA:last50:D",
      "model_use": "Branch-family evidence for win, draw, and loss score shapes."
    },
    {
      "fact_id": "F195",
      "layer": "result-bucket",
      "side": "france",
      "category": "last10 W bucket",
      "fact": "France last10 bucket W has 9 rows, GF/M=2.778, GA/M=0.667, modes=3-1 (4); 3-0 (2); 2-1 (1); 4-1 (1); 1-0 (1).",
      "source_label": "Turtle result-bucket summary",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/result_bucket_summary.csv",
      "row_ref": "FRA:last10:W",
      "model_use": "Branch-family evidence for win, draw, and loss score shapes."
    },
    {
      "fact_id": "F196",
      "layer": "result-bucket",
      "side": "france",
      "category": "current_worldcup W bucket",
      "fact": "France current_worldcup bucket W has 5 rows, GF/M=2.800, GA/M=0.400, modes=3-0 (2); 3-1 (1); 4-1 (1); 1-0 (1).",
      "source_label": "Turtle result-bucket summary",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/result_bucket_summary.csv",
      "row_ref": "FRA:current_worldcup:W",
      "model_use": "Branch-family evidence for win, draw, and loss score shapes."
    },
    {
      "fact_id": "F197",
      "layer": "result-bucket",
      "side": "morocco",
      "category": "last50 W bucket",
      "fact": "Morocco last50 bucket W has 40 rows, GF/M=2.725, GA/M=0.350, modes=1-0 (11); 2-0 (6); 3-0 (4); 2-1 (3); 5-0 (3); 4-0 (3); 3-1 (3); 3-2 (2).",
      "source_label": "Turtle result-bucket summary",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/result_bucket_summary.csv",
      "row_ref": "MAR:last50:W",
      "model_use": "Branch-family evidence for win, draw, and loss score shapes."
    },
    {
      "fact_id": "F198",
      "layer": "result-bucket",
      "side": "morocco",
      "category": "last50 D bucket",
      "fact": "Morocco last50 bucket D has 9 rows, GF/M=0.667, GA/M=0.667, modes=1-1 (6); 0-0 (3).",
      "source_label": "Turtle result-bucket summary",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/result_bucket_summary.csv",
      "row_ref": "MAR:last50:D",
      "model_use": "Branch-family evidence for win, draw, and loss score shapes."
    },
    {
      "fact_id": "F199",
      "layer": "result-bucket",
      "side": "morocco",
      "category": "current_worldcup W bucket",
      "fact": "Morocco current_worldcup bucket W has 3 rows, GF/M=2.667, GA/M=0.667, modes=1-0 (1); 4-2 (1); 3-0 (1).",
      "source_label": "Turtle result-bucket summary",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/result_bucket_summary.csv",
      "row_ref": "MAR:current_worldcup:W",
      "model_use": "Branch-family evidence for win, draw, and loss score shapes."
    },
    {
      "fact_id": "F200",
      "layer": "result-bucket",
      "side": "morocco",
      "category": "current_worldcup D bucket",
      "fact": "Morocco current_worldcup bucket D has 2 rows, GF/M=1.000, GA/M=1.000, modes=1-1 (2).",
      "source_label": "Turtle result-bucket summary",
      "source_url": "https://guffaitahoni.com/matches/france-morocco-2026-07-09/data/result_bucket_summary.csv",
      "row_ref": "MAR:current_worldcup:D",
      "model_use": "Branch-family evidence for win, draw, and loss score shapes."
    }
  ]
}