docs: stage J round 1 — release polish audit + README stats section

a11y/responsive/i18n audit over A-F passed clean (no code fixes); added a
Stats section to the README; restructured TODO so G/H/I + a second polish
(J round 2) are queued for the future.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Lucas Kalil 2026-06-17 11:10:18 -03:00
parent 95f9d48706
commit 992d2d1c26
4 changed files with 33 additions and 16 deletions

View file

@ -72,24 +72,29 @@ Use checkboxes to track progress. Items marked **🔴 BLOCKER** prevent release;
--- ---
## 7. Stats final screen — `feature/stats-final-screen` (post-Cup release) ## 7. Stats final screen — `feature/stats-final-screen`
Full build of `.agents/stats-screen-plan.md` on a feature branch, merged to `master` at the end of Build of `.agents/stats-screen-plan.md`, stage by stage with an approval gate each. The **pure-UI
the Cup. One approval gate before each stage. AF are buildable from today's data; G/H/I are build (AF, minus skipped E) + a release polish (J round 1)** was **merged to `master` on 2026-06-17**
data-blocked (graceful-degradation shell lets the UI land dark until JSON arrives). and is live. The screen renders fully with today's data and auto-lights the post-Cup sections (verdict,
champion path, debuts champion) once the final lands. The **data-layer stages (G/H/I) + a second polish
(J round 2)** remain for when their data arrives near/after the Cup.
### 🟢 OPTIONAL (release feature) ### ✅ Shipped to `master` (2026-06-17)
- [x] ~~Stage 0 — branch `feature/stats-final-screen` off `master`~~ - [x] ~~Stage 0 — branch `feature/stats-final-screen` off `master`~~
- [x] ~~Stage A — degradation engine + fault-tolerant `loadData` + sticky scrollspy sub-nav + media fallback~~ (2026-06-16) - [x] ~~Stage A — degradation engine + fault-tolerant `loadData` + sticky scrollspy sub-nav + media fallback~~
- [x] ~~Stage B — verdict hero (gated on FINAL finished; aggregate-hero fallback) + goals-by-round chart~~ (2026-06-16) - [x] ~~Stage B — verdict hero (gated on FINAL finished; aggregate-hero fallback) + goals-by-round chart~~
- [x] ~~Stage C — final ranking 148 (phase-reached chain), favorite-row highlight, team record cards~~ (2026-06-17) - [x] ~~Stage C — final ranking 148 (phase-reached chain), favorite-row highlight, team record cards~~
- [x] ~~Stage D — auto record-cards + "format-48 debuts" band~~ (2026-06-17) - [x] ~~Stage D — auto record-cards + "format-48 debuts" band~~
- [x] ~~Stage E — 104-match results archive (accordion by phase, row → modal)~~**SKIPPED (2026-06-17, Option B):** kept the "See all matches → Matches" link; the Matches tab already covers browsing. No archive built. - [x] ~~Stage E — in-tab results archive~~**SKIPPED (Option B):** kept the "See all matches → Matches" link; the Matches tab already covers browsing.
- [x] ~~Stage F — team comparator (diverging bars)~~ (2026-06-17; teams only — players side deferred to Stage H per graceful degradation) - [x] ~~Stage F — team comparator (diverging bars)~~ — teams only; the Teams/Players toggle is deferred to Stage H per graceful degradation.
- [ ] Stage G — Layer 2 cheap data (attendance, `cards`→{y,r} migration, decidedIn, coords) — **SCHEDULE LATE** - [x] ~~Stage J (round 1, release polish) — a11y/responsive/i18n/README audit on AF~~ — passed clean (no code fixes). **Lighthouse + final `DATA_VERSION` bump still pending an actual deploy.**
- [ ] Stage H — Layer 3 players (`players.json` + `player-events.json` + `awards.json`)
- [ ] Stage I — Layer 4 editorial (`curiosities.json` + `all-time-baselines.json`) ### 🔭 Future (data layers + 2nd polish — near/after the Cup)
- [ ] Stage J — polish (responsive/a11y audit, perf, Lighthouse, `DATA_VERSION` bump, README/i18n) - [ ] **Stage G — Layer 2 cheap data.** Extend `results.json` (attendance, **`cards`→{y,r} migration** — breaking for `modal.js` + `stats.js` `aggregateTeams`, add a backward-compatible reader; `decidedIn`; backfill `stats`), `teams.json` (`ranking`/`wcDebut`/`confederation`), `stadiums.json` (`lat`/`lng`). Light up records: attendance, discipline/fair-play, ranking upsets, confederation performance, distance. **SCHEDULE LATE — conflicts with master's daily `results.json` refreshes.** Bump `DATA_VERSION`.
- [ ] **Stage H — Layer 3 players.** `players.json` + `player-events.json` + `awards.json` (+ optional `keeper-stats.json`). Top-scorers podium, assists/cards/saves chips, awards block, Squad of the Tournament, **Teams/Players toggle in the comparator** (the deferred half of Stage F), goal-time records. Relative photo paths (gotcha #7).
- [ ] **Stage I — Layer 4 editorial.** `curiosities.json` (bilingual EN+PT) + `all-time-baselines.json`; editorial record-cards + "this Cup vs history" panel.
- [ ] **Stage J (round 2) — polish over the NEW G/H/I features.** Repeat the audit on the added sections (a11y/responsive/perf, Lighthouse, EN/PT review) + bump `DATA_VERSION` for the new data files + README refresh.
--- ---

View file

@ -4,7 +4,7 @@ Navigation map of the codebase. Use this to find which file owns a concern befor
> **Status 2026-06-12 (all 12 steps + real-data migration done):** everything works with **real World Cup 2026 data** — all views, bracket interactions, simulation, responsive/a11y pass, favorites, time toggle, challenge, share link, `.ics` export. Remaining: keep `results.json` current, fill `thirdPlaceAssignment` after the group stage (~Jun 27), Lighthouse run + GitHub Pages deploy. Spec source of truth: `world-cup-2026-hub-spec-en.md` + `complement-spec-worldcup2026-en.md` (complement **wins on conflict**). > **Status 2026-06-12 (all 12 steps + real-data migration done):** everything works with **real World Cup 2026 data** — all views, bracket interactions, simulation, responsive/a11y pass, favorites, time toggle, challenge, share link, `.ics` export. Remaining: keep `results.json` current, fill `thirdPlaceAssignment` after the group stage (~Jun 27), Lighthouse run + GitHub Pages deploy. Spec source of truth: `world-cup-2026-hub-spec-en.md` + `complement-spec-worldcup2026-en.md` (complement **wins on conflict**).
> >
> **Branch note (2026-06-16):** the full post-Cup Stats screen (`.agents/stats-screen-plan.md`, stages AJ) is being built on **`feature/stats-final-screen`** (merges to `master` at the end of the Cup). **Stages AD + F done** on that branch (degradation engine + fault-tolerant `loadData` + sticky scrollspy sub-nav + flag monogram fallback; verdict-or-aggregate hero + goals-by-round chart; final ranking 148 by stage-reached + favorite-row highlight + team record cards; Records section = match records + format-48 debuts band; team comparator with diverging bars). Stage E skipped. Sub-nav live chips: Overview · Teams · Records · Comparator. **Stage E (in-tab results archive) skipped by decision** — the Matches tab stays the single surface for browsing; the "See all matches →" link is kept. `master` keeps the partial Stats tab + daily refreshes. Descriptions below reflect the branch. > **Branch note (2026-06-16):** the full post-Cup Stats screen (`.agents/stats-screen-plan.md`, stages AJ) is being built on **`feature/stats-final-screen`** (merges to `master` at the end of the Cup). **Stages AD + F + J(round 1 polish) done and MERGED TO MASTER (2026-06-17)** — built on that branch (degradation engine + fault-tolerant `loadData` + sticky scrollspy sub-nav + flag monogram fallback; verdict-or-aggregate hero + goals-by-round chart; final ranking 148 by stage-reached + favorite-row highlight + team record cards; Records section = match records + format-48 debuts band; team comparator with diverging bars). Stage E skipped. Sub-nav live chips: Overview · Teams · Records · Comparator. **Stage E (in-tab results archive) skipped by decision** — the Matches tab stays the single surface for browsing; the "See all matches →" link is kept. `master` keeps the partial Stats tab + daily refreshes. Descriptions below reflect the branch.
--- ---

View file

@ -296,6 +296,12 @@ Static web app showing the FIFA World Cup 2026 (Mexico/USA/Canada, 48 teams) —
- **Verified (preview 8126, branch, 19/104 real):** console clean; 4 chips; default GER vs SWE (top-2 ranked); bars scale right (GP 7→100% / 5→71%); changing B→USA updates the header ("Germany vs United States") and re-scales (GP 7→100% / 4→57%); EN↔PT relabels title/metrics and **selection persists** across langchange; mobile 375px selects side-by-side + rows fit (no overflow). Screenshots desktop+mobile. - **Verified (preview 8126, branch, 19/104 real):** console clean; 4 chips; default GER vs SWE (top-2 ranked); bars scale right (GP 7→100% / 5→71%); changing B→USA updates the header ("Germany vs United States") and re-scales (GP 7→100% / 4→57%); EN↔PT relabels title/metrics and **selection persists** across langchange; mobile 375px selects side-by-side + rows fit (no overflow). Screenshots desktop+mobile.
- **Next:** Stage G — Layer 2 cheap data (attendance, **`cards`→{y,r} migration**, `decidedIn`, team `ranking`/`wcDebut`/`confederation`, stadium coords; backfill `stats`). **SCHEDULE LATE / near end of Cup** — the `cards` migration is a breaking change for `modal.js` + `stats.js` (`aggregateTeams` reads `s.cards.home`) and would conflict with master's daily `cards` writes. Awaiting approval (and likely deferral). - **Next:** Stage G — Layer 2 cheap data (attendance, **`cards`→{y,r} migration**, `decidedIn`, team `ranking`/`wcDebut`/`confederation`, stadium coords; backfill `stats`). **SCHEDULE LATE / near end of Cup** — the `cards` migration is a breaking change for `modal.js` + `stats.js` (`aggregateTeams` reads `s.cards.home`) and would conflict with master's daily `cards` writes. Awaiting approval (and likely deferral).
### Stats final screen — Stage J round 1 (release polish) + merge to master (2026-06-17)
- **Release polish pass over AF** (E skipped): **i18n audit** — no hardcoded user-facing strings in `stats.js` (all via `t()`); **a11y** — the 4 sub-nav sections are `aria-label`led + `tabindex=-1`, the table has a caption + 11 `aria-label`led sort buttons + `aria-sort`, comparator selects + record-card buttons are `aria-label`led, sub-nav is a `<nav>`; **reduced-motion** — chart bars, comparator `cmp-grow`, and count-ups are all gated; **cross-tab regression** — home/matches/groups/bracket/stadiums/stats all render with content, console clean. **No code fixes were needed** (per-stage work was already clean). Added a **Stats bullet to README**.
- **Deferred to the actual deploy:** the Lighthouse run (needs a deployed URL) and a final `DATA_VERSION` bump. **Caveat (pre-existing, accepted):** the stats screen is **code** (HTML/CSS/JS), and the project only cache-busts `data/*.json` via `DATA_VERSION` — JS/CSS are not versioned (no build step), so on Hostinger (no cache headers) returning visitors may serve stale assets until their browser re-fetches. True for every code deploy; new visitors / hard-refresh see it at once.
- **Merge to `master`:** the pure-UI build (AF) + this polish was merged to `master` for release. Sequence used: merge latest `master`→branch first (resolve conflicts on the branch, never on master), re-verify, then `master` ← branch (`--no-ff`). **Pushing to origin** (which triggers the Hostinger FTP deploy via `deploy.yml`) is the user's explicit final go — production.
- **Remaining (TODO §7):** Stage G (Layer-2 schema, schedule late — conflicts with daily refreshes), H (players + the deferred comparator Teams/Players toggle), I (editorial), and **a second polish J round 2** over those new features.
### How to update real-world data (scores, schedule) ### How to update real-world data (scores, schedule)
Follow `how-refresh-data.md` (project root). In short: Follow `how-refresh-data.md` (project root). In short:
1. Edit `data/results.json` (scores/status) or `data/matches.json` (schedule, rare). 1. Edit `data/results.json` (scores/status) or `data/matches.json` (schedule, rare).

View file

@ -26,6 +26,12 @@ no backend, no framework, no build step. All content lives in JSON files.
- **Time zones** — show kickoff times in your local time or the stadium's time. - **Time zones** — show kickoff times in your local time or the stadium's time.
- **Add to calendar** — download any match as an RFC 5545 `.ics` file. - **Add to calendar** — download any match as an RFC 5545 `.ics` file.
- **Match modal** — details for every match, with space reserved for future stats. - **Match modal** — details for every match, with space reserved for future stats.
- **Stats** — a sub-navigated screen (Overview · Teams · Records · Comparator):
tournament-to-date aggregates and goals-by-stage/round charts; a verdict hero
(champion + podium) that takes over once the final is played; a final ranking
148 by stage reached; team record cards (biggest win, win streak, champion's
path); a "format debuts" band; and an A-vs-B team comparator. Sections appear
only when they have data (graceful degradation).
- Responsive (mobile / tablet / desktop), keyboard-accessible, honors - Responsive (mobile / tablet / desktop), keyboard-accessible, honors
`prefers-reduced-motion`. `prefers-reduced-motion`.