⚽ Play MECH CUP 2026How to play · 玩法指南

Changelog — MECH CUP 2026 · 机甲杯 2026

Every pull request that shaped the game, newest work first. The project began on 2026-06-12 as The Electric Dream Cup and was rebranded to MECH CUP 2026 (the first space robot football final, on the Moon). It ships as one self-contained index.html and deploys to mechcup.com (Cloudflare Pages).

Every PR went through the same pipeline before going live: build (minify) → headless Chrome smoke-test gate → Cloudflare Pages deploy → verify (/version.json == commit). The smoke suite grew from a handful of checks to 142 assertions, one (or more) added per feature/fix so bugs can't silently return.

Each entry: #PR · merge date · merge-sha — what changed.

Note on ordering: PR #17 carries a lower number but merged after #18–#26 (it was rebased on top of them, commit c28685b); PRs #27+ landed later still — see the top section.


Commentary: the booth comes online

AAA loop restarted at the owner's direction ("make this a top-notch AAA game — keep the loop going"); item 11 of the new queue (docs/plans/aaa-loop-queue.md).

Published pages: a playing guide (en + 中文) and this changelog, on the site

Portal readiness: the reach gap gets its tooling

AAA loop item 10 (docs/plans/aaa-loop-queue.md) — the roadmap's #1 priority (the game is polished but invisible) gets everything code-side; the submissions themselves are owner actions.

Photo mode: frame it, keep it

AAA loop item 9 (docs/plans/aaa-loop-queue.md).

Cinema period kits: the memory plays in the right shirts

AAA loop item 8 (docs/plans/aaa-loop-queue.md) — closing the trophy cinema's noted v1 gap.

Broadcast intro: the match opens like television

AAA loop item 7 — the first loop-proposed item after the approved queue completed (docs/plans/aaa-loop-queue.md).

Arcade set pieces: corners and penalties, staged in the flow

AAA loop item 6 — the last of the user-approved queue (docs/plans/aaa-loop-queue.md).

Momentum: an honest rubber-band, announced out loud

AAA loop item 5 (docs/plans/aaa-loop-queue.md).

Playable keeper: the shootout is a duel from BOTH ends now

AAA loop item 4 (docs/plans/aaa-loop-queue.md).

Composer pass: the marquee nations get hand-tuned themes

AAA loop item 3 (docs/plans/aaa-loop-queue.md).

Per-world atmosphere: every world has its own air

AAA loop item 2 (docs/plans/aaa-loop-queue.md).

Trophy cinema: your title-winning goal, forever

First feature out of the AAA improvement loop (docs/plans/aaa-loop-queue.md — idea → code → test → merge → live-verify, repeat).

Clip robustness: a suspended audio context must not eat the whole video

Verifying #133 on the live site surfaced a real failure mode: attaching an audio track from a suspended AudioContext (no user gesture yet, backgrounded tab, portal embeds) starves MediaRecorder's muxer — the recorder finishes with zero chunks and the entire highlights clip is silently lost, not just its sound.

Reach & identity: the reel becomes a shareable VIDEO, every nation gets a theme

Round four of the AAA push, stacked on the #132 reel. Virality + audio identity.

Broadcast pack: the FULL TIME highlights reel

Round three of the AAA push. Audio identity was already deep (anthem sting, terrace chant, roar, groan, excitement-driven crowd bed), so this round ships the other broadcast staple: match highlights.

AAA identity & drama: the slide, the star, the clutch

Round two of the AAA push — after the human-feel verbs (#130), the remaining "left for later" items that read on screen: the tackle's body language, per-team identity, and last-minutes drama.

Human-feel pack — the player's half of "AAA": defend, finish, weight

Every prior gameplay phase upgraded the AI/team half (teamAI passing, counters, aerial, knockout caginess) — the HUMAN's verbs hadn't grown since the through-ball. Biggest gap: the player literally had no way to win the ball (only the AI's aiTackle could dispossess a carrier). This ships the planned PES P2/P3.

2026 Round of 16 — the knockout stage advances with the real results

The Round of 32 was played (2026-07-04), so the cup advances to the real Round of 16: the 16 winners — including the upsets (Paraguay over Germany, Canada over South Africa, Norway over Ivory Coast, Egypt over Australia) — with Germany, the old default team, eliminated.

i18n + build/CI polish: share-card brand, year-safe gate, symmetric build guard

Three low/nit findings from the deep review, grouped as the "hardcoded strings & year coupling" theme.

Physics + responsive polish: a low-FPS goal fix, a shootout overlap, a 320px clip

Three medium findings from the deep review, grouped as the "renders/computes wrong" cluster.

Keyboard access: menus & modals are reachable again

The deep review found the global keydown handler called e.preventDefault() on Space / Tab / arrows in every state, before any state check — so a keyboard-only user could never Tab off <body> to a control, nor Space-activate a focused button, on the menu, bracket, nation picker, Trophy Room, pause overlay, or end screen. The entire DOM UI was keyboard-dead (mouse/touch were unaffected, which is why it went unnoticed).

Persistence hardening: a roster fingerprint so saves can't silently relabel

A deep multi-lens review found the highest-leverage latent bug: cup, career, and team-pick state were all keyed by raw TEAMS index with no fingerprint. The #117 roster reorder therefore silently relabeled returning players' state — a Korea pick became South Africa, a resumed cup rendered a scrambled bracket, and the Trophy Room lit the wrong flags — because every stale index still passed validCup's range check.

Bracket: a mobile-first "My Path" view + a NEXT marker

The 32-team bracket already borrowed almost everything portable from the published real-tournament bracket (the round tree + connectors, score/pens cards, progressive TBD reveal, a gold path highlight). The one real gap — flagged by a Codex note and the project's own live review — was the phone: a 16-tie Round-of-32 column is dense even zoomed-to-fit. This is the deferred "v2 your-path view".

2026 Round of 32 is set — the roster is now the real qualifiers

The group stage locked (2026-06-28), so the provisional 32 became the actual 2026 tournament Round-of-32 field. Per a pure-authenticity call, China and Korea are out (they didn't qualify); the default team is now Germany, the top-left seed.

Short-height menu fold: the full CTA stack clears a real laptop window

A self-driven live end-to-end review (build 061bf03) found the game polished and bug-free across the menu, picker, a full match to a golden-goal result, share, bracket, Daily Challenge, Trophy Room, accessibility, and en/zh parity — with one real usability issue: on a 1280×720 browser window (~633px usable after chrome) and landscape phones, the retention CTAs (Watch · Daily Challenge · Trophy Room) sat below the fold — only the gold START was visible.

Review fixes: pause-state cleanup + reachable 32-team picker Close

An 8.0/10 review on the 32-team build. Most of its findings verified as artifacts (hidden controls are inert from load via the panel observer; the landscape clip is covered by a passing fits test) — but two were real, one of them twice-flagged.

32-team Round-of-32 cup (themed on the real 2026 knockout stage)

Expands the cup from 16 teams (R16 → Final, 4 rounds) to 32 teams (Round of 32 → Final, 5 rounds), themed on the real 2026 knockout stage (48 → a 32-team R32). The engine was already parameterized (CUP_ROUNDS = log2(CUP_SIZE)), so this is mostly content + a responsive bracket. The roster is provisional — a plausible 32 now, swapped for the real qualifiers when the group stage locks (≈ 2026-06-28); the swap procedure (edit three marked blocks, no engine changes) is in the design note.

CTA clarity: "Start the …" / "出战…赛" — name the match, not the qualification

The primary "begin this match" button read Enter the Round of 16 / 进入16强, which can be misread as qualifying for the stage (especially zh 进入16强 = "reached the last 16," a result you achieved) rather than playing it now. Switched to an unambiguous action verb, with a native-Chinese review pass.

Tenth review (8.5/10): Share Result carries the actual result, not a setup link

A tenth Codex review (8.5/10) on build 43221d9 — which confirmed #100's Change-Setup fix held. Its one High finding (third review in a row to flag it): tapping Share copied a bare setup link (?team&world&diff), so a paste shared "play this scenario," not "I won 1–0." The result lived only in the downloaded card image, which isn't what lands in a paste. Earlier rounds under-weighted this as an automation artifact; this round fixed the payload. Shipped behind a 4-lens diff review (all ship) that upgraded the share text to name the outcome and broadened the test across result shapes.

Ninth review (8.4/10): Change-Setup state mismatch + bracket "simulated" caption

A ninth Codex review (8.4/10) on the live build 20e51a7. One real HIGH bug (verified against the code) plus a cheap clarity win; the share-flow flag was confirmed an automation artifact and dropped. Shipped behind an adversarial 4-lens review of the diff, which caught — and forced the rewrite of — a vacuous first draft of the new test.

Game-feel: lunar-lob trail, crowd swell, gentler first kickoff

From the live QA review's "make it better" follow-up — the two cheapest, universal, client-side wins. Investigation found the game was already juicy (goal slow-mo/shake/flash/roar, shot FOV-kick, crowd bed) and already had a 3-step first-match tutorial + a first-match opponent slowdown, so these ENHANCE rather than rebuild.

Interim review + polish round (backfilled — Codex fixes, mobile HUD, result road, CI)

A Codex-review round plus polish and a CI guard landed between #93 and the game-feel work above but weren't logged at the time; reconstructed here from the PRs. Together they took the smoke suite 73 → 78.

Language auto-detect — test coverage + design doc

Live QA review (helper overlap, canonical/SEO, daily in-place)

A self-driven end-to-end live review of build 8b149e7 across five lenses (QA · gameplay · UI · localization · marketing), then an adversarial multi-agent pass over the fix diff before shipping. Most of the build verified sound — low-gravity ball physics (Moon apex 2.31 m / 0.87 s hang vs Earth 1.25 m / 0.40 s), fair GK balance (corners score, central saved), progressive bracket reveal, en/zh parity, the watched-shootout, and the 1200×630 share card all checked out. The fixes below close the first-impression and reach gaps the review surfaced. (Several plausible "bugs" were ruled out as harness artifacts before reaching the report — a shootout "hang", a share card "NaN", a validCup scare.)

Eighth playtest review (share, daily-reload, pause, landscape)

An eighth Codex review (7.5/10) on build a4ea098. Two real bugs + one hardening + one layout; the recurring trio (pause logic, hidden-controls focusable, landscape "no scroll") stays declined as verified artifacts of the reviewer's throttled/automation session.

Seventh playtest review (bracket logic, watched shootout, penalties)

A seventh Codex review (7.2/10) on build ff90591. Each claim verified live: 3 real bugs (2 reproduced) + a share-robustness gap + a stale toast; the pause-toggle, hidden-controls, and landscape-scroll claims were re-confirmed non-issues (throttled/automation session).

Sixth playtest review (a critical state leak + result polish)

A sixth Codex review (7.0/10) on build debd150, run in a heavily-throttled session with un-clearable stale state (which manufactured several symptoms). Each claim was verified live: 2 real bugs (1 critical) + 1 real share gap + 2 polish; the pause-toggle and hidden-controls claims were re-confirmed non-issues.

Fifth playtest review (result polish, a11y, fold, share)

A fifth Codex review (7.0/10) on build 037a8a4. Every claim was verified against the live code first: 2 were real, 2 fair polish, and 2 didn't hold up (the pause toggle is a correct single-source toggle — the "stuck overlay" was a throttled-CSS-fade automation artifact; hidden panel controls are already inert via #50).

16-team knockout cup

Review hardening (Daily Challenge + Career)

A multi-agent adversarial review of the two new features confirmed 10 issues (3 refuted).

Career — persistent progression (Trophy Room)

The retention pillar: a persistent record of every cup, so there's a reason to come back. localStorage only — no backend, accounts, or payments.

Next level — retention + virality (Daily Challenge, social unfurl)

The first "make players return / make results worth sharing" bundle. Both pieces lean on what already exists — the deterministic cup draw + the share card — so neither needs a backend, accounts, or payments (localStorage only).

Fourth playtest review (Share bug, responsive fit, readability)

A fourth review (8.1/10) on build e32c7ec. Each concrete claim was verified on the live build before fixing; "Cup"/"nation" and the round-framed CTA were kept as deliberate calls.

Third playtest review (responsiveness, a11y, UX copy)

A third review (8.0/10) on the post-fix build — all polish, no broken gameplay. Two PRs; its three concrete HIGH claims were each verified against the live build before fixing.

Second playtest review (a11y, localization, readability)

A follow-up review (on the copy/UX build) found polish-level issues — no broken gameplay, no console errors. Four PRs (the share hook + the "scripted bracket" were already shipped):

Playtest-review fixes (controls, pause, bracket, camera)

A Codex playtest review flagged control clarity + pause/tournament-state reliability. The "score changed while paused" report turned out not to be a simulation leak (pause fully freezes the sim) — it was a pause that silently never engaged. Five PRs:

Edutainment & reach trio (gravity · geography · shareability)

Menu & bracket access

Code review, analytics & hardening


Cup format & World-Cup presentation

Playtest UX polish

Broadcast & mobile feature pack

Penalty shootout

Infrastructure / CI

Rebrand to MECH CUP 2026

The Cup foundation (8-nation knockout)


Baseline