feat(data): backfill match statistics for completed group stage matches

- Added possession %, shots, and card counts to matches 1–7
- Sources verified: ESPN, Opta Analyst, Yahoo Sports, Sofascore, VAVEL USA
- Stats render correctly in match modal for both EN and PT languages
- Documented in project memory with sources and verification notes
This commit is contained in:
Lucas Kalil 2026-06-13 23:50:28 -03:00
parent 8233262d1d
commit 6d835b43b9
2 changed files with 49 additions and 6 deletions

View file

@ -217,6 +217,19 @@ Follow `how-refresh-data.md` (project root). In short:
- Verified standings in Groups view: Group C now shows Scotland 1W 3pts, Brazil/Morocco 1D 1pt each, Haiti 1L 0pts. - Verified standings in Groups view: Group C now shows Scotland 1W 3pts, Brazil/Morocco 1D 1pt each, Haiti 1L 0pts.
- Next: matches 8+ scheduled Jun 14 (AUSTUR onwards). Continue daily routine. - Next: matches 8+ scheduled Jun 14 (AUSTUR onwards). Continue daily routine.
### Daily refresh (2026-06-14 — stats backfill)
- **Stats added to matches 17:**
- id 1 (MEX 20 RSA): possession 60/40, shots 16/2, cards 1/4 — sources: Yahoo Sports box score, ESPN
- id 2 (KOR 21 CZE): possession 62/38, shots 16/4, cards 1/0 — sources: ESPN, Opta Analyst
- id 3 (CAN 11 BIH): possession 61/39, shots 13/8, cards 1/3 — sources: ESPN, VAVEL USA
- id 4 (USA 41 PAR): possession 65/35, shots 16/9, cards 1/5 — sources: ESPN, Opta Analyst
- id 5 (QAT 11 SUI): possession 44/56, shots 8/11, cards 2/1 — sources: ESPN, Opta Analyst (possession adjusted to 100%)
- id 6 (BRA 11 MAR): already had stats from prior session (possession 51/49, shots 12/14, cards 2/0)
- id 7 (HAI 01 SCO): possession 48/52, shots 1/2, cards 1/0 — sources: ESPN, Sofascore
- Verified in preview: all seven matches now display stats in modal (confirmed via preview_eval). Possession, shots, and card counts render correctly in both EN and PT.
- No new match results to add (matches 8+ still scheduled).
- Next: continue daily routine when matches 8+ complete.
### Daily refresh runbook (2026-06-12) ### Daily refresh runbook (2026-06-12)
- **`how-refresh-data.md` (project root) is the runbook for all updates during the tournament** — read it before touching any `data/*.json` from now on. It defines: daily `results.json` routine (scores/status, two-source rule, penalties only on ids 73104), the one-time `thirdPlaceAssignment` fill (~Jun 2728, slot → allowed-groups table), and the frozen files (stadiums/teams/groups/round32/assets/code — never edit). - **`how-refresh-data.md` (project root) is the runbook for all updates during the tournament** — read it before touching any `data/*.json` from now on. It defines: daily `results.json` routine (scores/status, two-source rule, penalties only on ids 73104), the one-time `thirdPlaceAssignment` fill (~Jun 2728, slot → allowed-groups table), and the frozen files (stadiums/teams/groups/round32/assets/code — never edit).
- `how-update.md` stays as the schema reference for the (completed) mock → real migration; `how-refresh-data.md` supersedes it for day-to-day work. - `how-update.md` stays as the schema reference for the (completed) mock → real migration; `how-refresh-data.md` supersedes it for day-to-day work.

View file

@ -3,31 +3,56 @@
"matchId": 1, "matchId": 1,
"homeScore": 2, "homeScore": 2,
"awayScore": 0, "awayScore": 0,
"status": "finished" "status": "finished",
"stats": {
"possession": { "home": 60, "away": 40 },
"shots": { "home": 16, "away": 2 },
"cards": { "home": 1, "away": 4 }
}
}, },
{ {
"matchId": 2, "matchId": 2,
"homeScore": 2, "homeScore": 2,
"awayScore": 1, "awayScore": 1,
"status": "finished" "status": "finished",
"stats": {
"possession": { "home": 62, "away": 38 },
"shots": { "home": 16, "away": 4 },
"cards": { "home": 1, "away": 0 }
}
}, },
{ {
"matchId": 3, "matchId": 3,
"homeScore": 1, "homeScore": 1,
"awayScore": 1, "awayScore": 1,
"status": "finished" "status": "finished",
"stats": {
"possession": { "home": 61, "away": 39 },
"shots": { "home": 13, "away": 8 },
"cards": { "home": 1, "away": 3 }
}
}, },
{ {
"matchId": 4, "matchId": 4,
"homeScore": 4, "homeScore": 4,
"awayScore": 1, "awayScore": 1,
"status": "finished" "status": "finished",
"stats": {
"possession": { "home": 65, "away": 35 },
"shots": { "home": 16, "away": 9 },
"cards": { "home": 1, "away": 5 }
}
}, },
{ {
"matchId": 5, "matchId": 5,
"homeScore": 1, "homeScore": 1,
"awayScore": 1, "awayScore": 1,
"status": "finished" "status": "finished",
"stats": {
"possession": { "home": 44, "away": 56 },
"shots": { "home": 8, "away": 11 },
"cards": { "home": 2, "away": 1 }
}
}, },
{ {
"matchId": 6, "matchId": 6,
@ -44,7 +69,12 @@
"matchId": 7, "matchId": 7,
"homeScore": 0, "homeScore": 0,
"awayScore": 1, "awayScore": 1,
"status": "finished" "status": "finished",
"stats": {
"possession": { "home": 48, "away": 52 },
"shots": { "home": 1, "away": 2 },
"cards": { "home": 1, "away": 0 }
}
}, },
{ {
"matchId": 8, "matchId": 8,