Fix: dismissing scout report cards after the summer or winter transfer-window popup no longer freezes the hub. Honour screens wait for that popup too, then play one trophy at a time before the scout cards.
Full technical notes for every release continue below.
Changelog
RETRO MANAGER · PATCH NOTES
V3.1.74 - SCOUT CARD FREEZE
September 2026
**Fix:** dismissing scout report cards after the summer or winter transfer-window popup no longer freezes the hub. Honour screens wait for that popup too, then play one trophy at a time before the scout cards.
V3.1.73 - CELEBRATIONS & MATCHDAY
September 2026
**Honours:** winning the league, a promotion (including playoffs), the domestic cup, or the continental cup now opens a full-screen celebration — crest, trophy, confetti. Multiple trophies queue one Continue each.
**Matchday:** named bench is 7 (18-man list); empty chairs are allowed; both sides still get **5 substitutions** per match.
**Match:** strikers take a larger share of team goals.
**Transfers / economy:** youth academy players no longer get incoming loan offers; Big 5 D1 stars stay in the £20M+ band; lower-league official packs stop bleeding wages on merch.
**Inbox:** routine clean sheets, 0-0s, debuts, and injury-return lines are gone.
V3.1.72 - CAREER HISTORY & MATCH UX
September 2026
**Career:** player profiles have a History tab — winter transfers and loans write one line per club; season awards still count the whole year. Saves keep match detail unless slimming actually shrinks the file enough.
**Match:** opponents pick their Best XI at kickoff vs you (fitness, returns, new signings).
**World / results:** week results group by country (your nation first) when more than one country played.
**Scout:** the player-card popup still appears after Play Match, and waits until week results and weekly transfers are closed.
V3.1.71 - SHOOTOUTS, MATCH UX & TRANSFER FEES
August 2026
**Match:** knockout draws stay on the pitch for a watchable penalty sequence (clock PENS, named kicks, scored/saved/missed). Cup, continental, playoff final, and two-leg playoff second legs when the tie is still level. Flash to full time skips the sequence.
**Playoffs:** two-leg semis then a one-off final. No away goals — extra time and pens if aggregate is level after 90 of the second leg. First leg is 90 minutes only.
**Transfers:** world-class fees are in a more realistic range (around £20M at a big club). Lower-division players stay buyable.
**World / results:** home always left, away right; your club and players stand out; midweek Play Match can open week results; full-time overlay shows crests, scorers, and missed pens.
**Club:** Hall of Fame and club records are this career only. Squad badges (exp, wnt, and the rest) open the Contract tab.
V3.1.70 - MATCH COMMENTARY LOCALE
August 2026
**Match:** paused and resumed minutes now stay in the career language (Spanish, German, French, Portuguese, Italian) instead of dropping back to English.
V3.1.69 - ITALIAN LOCALE
August 2026
**Language:** Italian is now a full in-game locale — hub, club, finance, staff, stadium, competitions, settings, match commentary, and the rest of the career UI.
**Locales:** Spanish, German, French, Portuguese, and Italian in-game dictionaries are at zero translation debt (`npm run i18n:audit`).
**Still English:** marketing/store site copy, and some dynamic assistant advice generated at runtime.
V3.1.68 - SQUADS & THE FREE AGENT MARKET
August 2026
**Rival clubs:** AI squads keep their players instead of releasing most of them every summer and replacing them with newly invented ones — club identity now survives a long career.
**Contracts:** AI clubs renew far more of their own players, and a club short of bodies keeps a squad man rather than letting him walk.
**Free agents:** clubs actually sign from the free-agent pool, so it no longer grows into thousands of unsigned players nobody ever touches.
**Free agents:** players released this summer stay on the market, so you still get first look before rivals pick them up.
**Squads:** a club short of numbers signs a free agent or promotes its own youth before any new player is created.
**Careers:** save files stay much smaller over a long career, and rival squads keep their depth and wage bills instead of quietly decaying.
V3.1.67 - TACTICS & MATCH DAY
August 2026
**Tactics:** tempo now does something — higher tempo creates more attacking phases and turns control into shots more often; lower tempo quiets the game when you are seeing one out.
**Assistant:** style and formation suggestions read as options rather than guaranteed counters, and tempo/width advice matches what the engine actually does.
**Match day:** live match header shows attendance alongside competition and stadium (pre-match stays competition and venue).
**Transfers:** a popup now marks the transfer window **opening**, not just deadline and closing weeks.
**Hub:** sponsor offer prompt is a solid panel instead of a faint wash, so a waiting deal is hard to miss.
**Prematch:** Apply Best XI is available on the opponent report again, even when your XI is already complete.
V3.1.66 - MATCH UX
August 2026
**Match:** side lineup rails update after substitutions; live and summary ratings are color-coded (green ≥7.5, red <5.5).
**Match:** your red card auto-pauses and opens tactics; half-time assistant score copy no longer mismatches the scoreboard.
**Assistant:** hide empty hub/office recommendations and mid-match pitch check-ins when there is nothing useful to say.
V3.1.65 - FIXTURES & MATCH DAY
August 2026
**Fixtures:** league home/away no longer clumps into long runs (venue polarity by round); World Fixtures uses the same country/division strip as Standings.
**Match day:** top bar shows competition and home stadium (e.g. Premier League - Highbury); pre-kickoff subtitle matches.
**Assistant:** formation notes name the opponent so counter suggestions are clearer.
**Cards:** ABL/POT stars slightly larger and vertically centered.
**Carries V3.1.64:** staff pool, profile squad switcher, board job-security credit.
V3.1.64 - STAFF & PROFILE UX
August 2026
**Staff pool:** Available Staff tops up every role (DoF, GK Coach, Youth Coach) on load; mixed nationalities; coach types seeded across all division tiers.
**Your Team:** backroom order is DoF → GK Coach → Coaches → Physios → Scouts → Youth; open seats stay empty after season end until you hire.
**Scouts:** specialisms use **Current ability** / **Potential ability** labels; PA-focused scouts appear in the pool.
**Profile:** own-player **Squad** switcher (position, name, OVR) overlays the profile without closing it.
**Board:** Premier survival / mid-table finishes no longer leap to a top-4 brief — D1 expectations step through mid-table (10th) first.
**Job security:** Overachieve or title seasons grant board goodwill (~half a season): under-target confidence hits soften and the sack line drops to 8% while credit lasts.
**Form:** Recent league results nudge confidence; boards will not sack you on a four-win streak.
**Staff seats:** clubs also default to **1 Director of Football** and **1 GK Coach** (Fitness stays hire-only). Open seats + season backfill apply; DoF still boosts bid accept chance, GK Coach still boosts GK training.
V3.1.62 - STAFF LIFECYCLE & SCOUT CAP
August 2026
**Scouting:** full scout reports capped at **5 × scout count** per week (Market + Profile); counter resets when you advance the week. Assistant discovery stays separate.
**Staff seats:** clubs default to **3 coaches**, **2 physios**, **2 scouts**, and **1 Youth Coach**; DoF / GK / Fitness stay hire-only. Season backfill fills missing defaults; free-agent pool ~48.
**Staff:** age, retire at 62, fired under-62 return to applicants; **specialism attributes** (defence/attack, judging CA/PA, recovery, etc.) drive best-of-role training, physio, scout, youth, and DoF effects. Age + specialisms in Office/profiles. **Overall** = rounded mean of specialisms.
**Staff interest:** applicants show Keen / Interested / Reluctant / Not interested from your division + reputation vs their rating; elite staff will not join weak clubs. Free-agent pool mixes quality bands so all leagues have hireable staff.
**Office:** empty default seats show as open slots (e.g. 2/3 coaches). Available Staff list supports search, role/interest/min-rating filters, and sortable columns. Staff wages are **100 / 250 / 500 / 1000** by ability (+ role nudge).
V3.1.61 - YOUTH OFF MARKET
August 2026
**Transfers:** Youth Academy players no longer appear on the transfer market or shortlist; bids, loans, AI club sales, and assistant discovery skip them.
**Carries V3.1.60:** Squad Stats list view; Steam HTML5 squad drag (Tauri `dragDropEnabled: false`); denser match overlays; Facilities news; 2s toasts.
V3.1.60 - SQUAD STATS & STEAM DRAG
August 2026
**Squad:** new Stats list view (season apps, goals, assists, AVR, YC, RC, MotM, mins, CS) — same width as Attributes.
**Steam / desktop:** HTML5 squad drag gates on real Capacitor native only; steam/mas/microsoftstore builds clear Capacitor env stamps; Tauri `dragDropEnabled: false` so webview HTML5 DnD works on Mac and Windows.
**Match:** solid prematch / half-time / full-time overlays; denser live match panels; toasts auto-dismiss after 2 seconds.
**News:** Facilities category for stadium stands, training-ground upgrades, and academy campus completions.
V3.1.59 - TRANSFER & MATCH UX
August 2026
**Transfers:** five failed bid/loan/wage attempts on the same player in one week walks them away until you advance (shared counter; saves keep the map).
**Manager career:** games managed / wins / win % update after each finished user match (season-end no longer the only tick).
**Live match:** Confirm changes + Undo for pitch↔bench; XI↔XI reshape is tactics-only; bench drag-and-drop; Auto XI keeps a spare GK when one exists.
**Play Match:** debug journey logger is off by default again (opt-in via localStorage `rm_debug_play_match=1`); runbook + stress script documented in `docs/store_apps/play_match_large_career.md`.
V3.1.57 - MATCH EXIT LOOP
August 2026
**Play Match:** leave-match advances the week directly (no confirm dialog behind Finishing), waits for advance to finish before remounting the hub, and safety-clears the match shell so dashboard → match → dashboard can repeat.
V3.1.56 - PREMATCH BENCH HANG
August 2026
**Play Match:** Kick Off stuck on Preparing when two midfielders were injured — Auto XI bench builder looped forever with fewer than 5 leftovers; also harden Hungarian assignment and keep greedy injured XI fills on the sim hot path.
V3.1.55 - PLAY MATCH JOURNEY LOG
August 2026
**Play Match:** freeze was debug HUD writing DOM inside a React setState updater after squad ensure — prep now skips when XIs are ready, MatchSim mounts before prep, and the debug log covers hub → lineup → kickoff → HT → FT → exit → hub (file + localStorage mirror).
V3.1.54 - MATCH PREP AFTER OPENING
August 2026
**Play Match:** debug log froze in squad prep before Opening could finish — prep now runs after Opening paints; player-DB patch LZ is cached; hydrating clubs no longer remaps the whole world.
V3.1.53 - LIVE MATCH SHELL AGAIN
August 2026
**Play Match:** debug log showed click then freeze on MatchSim-in-hub — hub memos still ran on the same tree. LiveMatchShell is back (hub unmounts) with portal Opening / exit Finishing / autosave+LZ fixes kept.
V3.1.52 - MATCHSIM IN HUB
August 2026
**Play Match:** restore V3.1.40-style MatchSim overlay on the hub for Steam/desktop (LiveMatchShell route removed from the live path).
**Kept:** autosave pause / large-career LZ Worker, club-scoped Best XI & player indexes, portal-first MatchSim, Opening-match first frame, and Play Match debug file log.
V3.1.51 - PLAY MATCH FILE LOG
August 2026
**Debug (temporary):** Steam writes Play Match timing to `~/Library/Application Support/games.retromanager90.desktop/play-match-debug.log` (on by default; set localStorage `rm_debug_play_match=0` to disable).
V3.1.50 - OPENING MATCH HOLD
August 2026
**Play Match:** keep Opening match… until MatchSim finishes a cheap first frame, then load the heavy UI — stops looking stuck on Opening while the main thread builds the match screen.
V3.1.49 - PLAY MATCH DEBUG
August 2026
**Debug (temporary):** enable with localStorage `rm_debug_play_match=1` for Play Match timing marks + on-screen HUD (console: `__rmPlayMatchDebug.dump()`).
**Play Match:** open the match shell before squad prep, defer the full sim until after paint, and stop scanning the whole world for Best XI / player lookups on large careers (from V3.1.48).
V3.1.48 - PLAY MATCH YIELD
August 2026
**Play Match:** open the match shell before squad prep, defer the full sim until after paint, and stop scanning the whole world for Best XI / player lookups on large careers.
V3.1.47 - MATCH EXIT YIELD
August 2026
**Play Match:** leaving a match shows Finishing…, runs week-advance before remounting the hub, and defers week-results — avoids freezing on exit for large careers.
V3.1.46 - MATCH PORTAL FIRST PAINT
August 2026
**Play Match:** desktop/Steam MatchSim portals to the viewport on the first frame (no invisible inline/absolute mount inside the live-match shell); opening screen is full-viewport.
V3.1.45 - LIVE MATCH SHELL
August 2026
**Play Match:** live matches now run in an isolated shell so the hub fully unmounts — large multi-country careers no longer recompute the entire hub on every match state update (the real week-8 freeze).
V3.1.44 - BLOB LZ WORKER
August 2026
**Play Match:** LZ compress uses an in-app blob Worker (Tauri-safe) and never falls back to multi-second main-thread compress on large careers; load no longer idle-resaves huge worlds.
V3.1.43 - PLAY MATCH LZ WORKER
August 2026
**Play Match:** career LZ compress (~4s on large multi-country saves) now runs in a Web Worker so the UI stays responsive when opening a match; large careers still skip hub debounce autosaves.
V3.1.42 - LARGE CAREER PLAY MATCH
August 2026
**Play Match:** large multi-country saves no longer freeze on hub Play Match — career load / week idle no longer start a multi-second LZ compress before you can open the match; hub clicks only hold pending state until leave-match / manual save / delayed idle.
V3.1.41 - AUTOSAVE, TOP 50 & MATCH POLISH
August 2026
**Performance:** large multi-country careers no longer freeze the UI on hub clicks — autosave waits for idle and pauses as soon as you hit Play Match.
**World Top 50:** early-season apps gate kept soft through week 11 so the list shows active-league players, not only your squad with friendlies.
**Assistant:** in-form player names are clickable; hub all-clear briefings drop urgent filler lines.
**Match:** Attack half-time talk commentary is push-forward (not hairdryer); side-rail position+side and smaller card glyphs.
**Stability:** safer match entry when formation data is missing; sim failures toast instead of crashing.
V3.1.40 - MARKET AVR & ASSISTANT SCOUTING
August 2026
**Market:** **Interested only** filter (League / World / Shortlist) for targets who would realistically join; softer free-agent interest gate; clearer “not interested” toast naming the player.
**Market / squad:** list views on Market; squad **AVR** column; match overlay polish; national-team profile copy.
**Assistant:** Office discovery is **Scouting**, with a **one-week** report wait (windows are short).
**Tactics:** DMs are out of position in attacking-mid seats (AMC/AML/AMR/SS).
**Transfers:** Big Five rank-1 clubs stay in elite leagues; squad `wnt` tooltip is club names only.
**Economy (#31):** squad wages retuned against post-gate income.
**Copy / i18n:** shorter scout, shout, and match-why lines; Portuguese retargeted to Brazilian.
V3.1.39 - SQUAD VIEWS & TACTICS PACKS
August 2026
**Squad list:** wide Selection and live-match Personnel tables switch between General, Attributes, Contract, Training, and Status (saved on the device, not the career).
**Tactics:** export/import formation packs as JSON (no player IDs); custom-formation lookup on pack export; custom faces can tint to the club kit.
**Squad tabs:** Selection / Tactics / Youth stay on the last tab you used.
**Auto XI / hub:** Auto XI prefers natural roles without rewriting your formation; hub collapsible bars are opaque with a visible minimize control; sponsor offer CTA on the hub when a deal is waiting.
**Youth Academy:** commencing the next season tops the academy back up after promotions and age-21 leavers; the Youth tab remounts so you see the new roster.
V3.1.38 - KNOCKOUT EXTRA TIME & AWARDS
August 2026
**Cups:** Retro Cup and Retro Continental keep extra time and penalties after a live pause, tactics change, or flash-to-FT — a 1–1 no longer counts as going out with no shootout.
**Playoffs:** first-leg semis stay 90 minutes; the second leg only goes to extra time and pens if the tie is still live on aggregate and away goals; the final is still a single-leg shootout if drawn.
**Awards:** Ballon d’Or, Golden Boy, world Golden Boot, and domestic Player / Young Player of the Year need **20 appearances**.
**Squad / Youth:** name columns have more room on desktop.
**Tactics pitch:** formation changes keep XI cards mounted (less hitch with a full lineup); pitch green restored on the tactics / custom-formation screens.
**Squad Selection:** vacant roles show under **Empty positions** (informational); assign players with the **PK +** popover (or an empty pitch seat) — no lineup checkboxes.
**Assistant / contracts:** Youth Academy pipeline deals are excluded from “contracts need review” and the squad expiring badge (renew UI is senior-only).
V3.1.37 - DISPLAY CURRENCY
August 2026
**Display currency (#75):** eurozone careers (Spain, Germany, France, Italy, Netherlands, Portugal, Belgium) show **€** for the same ledger numbers; England and other packs stay **£**. No FX conversion.
V3.1.36 - EDITOR CRESTS & BULK FACES
August 2026
**Editor:** import custom team crests from device-local images for database packs.
**Editor:** bulk player face import with id-list matching and plate background support.
**Transfers:** AI clubs keep one window strategy; Market `wnt` badges; CPU U23 fringe loans; fire-sale/splash inbox copy (#68 P2).
V3.1.35 - NEWS LINKS & TRANSFER WINDOW
August 2026
**News:** inbox items can deep-link into the relevant game section; assistant CTAs open the right screen.
**Transfers:** no new incoming bids/loan offers on the week the window closes — avoids offers you cannot accept.
**Squad / Youth / Market:** faster tab switches, column sorting, and custom formation names on match screens.
**Editor:** Discord-ready Database Editor PDF guide plus blank JSON import starters.
V3.1.34 - STAFF & MANAGER PROFILES
August 2026
**Staff profiles:** Office → Staff opens a full profile (role, rating, wage, nationality, bio, joined week).
**AI managers:** Team Profile shows personality and bio; click through for the same profile dialog (stable per-club identity).
**Manager archetypes:** soft career tags on Manager Profile (trophy winner, promotion specialist, youth developer, and more).
**Staff roles:** optional hireable Director of Football, GK coach, fitness coach, and Head of Youth with light gameplay bonuses.
**Job market:** post-sack vacancies show a club brief (expectation, budget band, archetype fit).
V3.1.33 - LIVE PLAYER DEVELOPMENT
August 2026
**Live development:** players with room under potential can grow mid-season from minutes and training (age/headroom scaled; per-season caps + cooldown). Leftover bank still settles at season end; veterans unchanged.
**Player profile:** Development meter rates overall development quality (Poor → Excellent) with color coding and a how-to-improve tooltip.
**Canvas background:** **Plain** replaces Plain black — pick a solid colour via swatches, hex, or colour picker.
V3.1.32 - GUIDE HUB & CLEAN FONTS
August 2026
**Office → Guide & Changelog:** in-career game guide, editor guide, FAQ, and patch notes (no more leaving to the marketing site); assistant tip points new managers there first.
**Website guides:** game/editor/FAQ pages use the expanded Steam-aligned content; changelog adds Back to game; marketing layout widened on desktop.
**Fonts:** Settings → Appearance adds **IBM Plex Sans** and **Source Sans 3**; optical size is normalized across all font options so switching faces keeps UI text consistent.
**Assistant discovery:** request report can filter by minimum potential stars (1★–5★, same scale as player cards).
**Active Leagues:** foreign active countries get opening Youth Academy intakes at career start (was limited to continental clubs by a boot-scope bug).
**Settings → Appearance:** upload a custom canvas background (device-local; auto-resized; PNG/JPEG/WebP); also adds a **Plain black** canvas option.
V3.1.31 - ASSISTANT CAREER TIPS
August 2026
**Assistant tips:** added 14 career gameplay tips (board confidence, preseason friendlies, transfer windows, training, youth, stadium/campus, physio, scout, discovery, lists, contracts, sponsors, active leagues, cups).
V3.1.30 - CAREER BOOT SCREEN
August 2026
**New career:** starting a game shows a full-screen Retro Manager **Game Environment** boot screen (8 staged tasks at 1.5s each, solid opaque backdrop); then the career commits.
**Start menu:** career selection uses the full viewport width so Active Leagues presets and club options are no longer clipped.
V3.1.29 - MATCH ASSISTANT DISMISS
August 2026
**Match assistant:** the secondary shout action is labeled **Dismiss** (was hardcoded Back).
V3.1.28 - GAME SMOOTHNESS (PHASE 4)
August 2026
**Store:** split GameState vs actions contexts; `useGameActions` / `useGameStateSelector` so action-only views skip state republishes.
**Autosave:** paused during live match (flush on leave / manual Save); week & season transitions persist on idle so the hub can paint first.
**Market:** no remount on every Market tab open; world pack hydrate deferred until World tab / scout recs; filter memos use narrow deps.
**Runtime RAM:** inbox / player history / country-archive caps applied in-memory after week and season (same caps as save).
V3.1.27 - TRANSFER SCROLL & FILTERS
August 2026
**Weekly transfers overlay:** the list scrolls with the overlay body (no nested scroll trap).
**World transfers:** weekly + archive tables use a single scroll region with sticky headers; archive filters by country, type, and season.
V3.1.26 - WEEKLY TRANSFERS COUNTRY
August 2026
**Weekly / World transfers:** tables show a **Country** column (buyer league country, seller fallback) so multi-country careers can tell which pyramid each deal belongs to.
V3.1.25 - GAME SMOOTHNESS (PHASE 3)
August 2026
**Advance week:** player/club/team Maps for AI Auto XI, fixture rollup, and weekly staff lookups (no more O(P×T) team finds).
**AI transfers:** seller/buyer squad pools reuse a club index rebuilt only after each successful deal (was rescanning the world up to 800×).
**Season transition:** country archive built once per sim country; intake/wage/lineup cleanup uses club + id indexes.
V3.1.24 - GAME SMOOTHNESS (PHASE 2)
August 2026
**Match theater:** attack-pressure chart builds one new minute per tick instead of rebuilding 1..N every second (full rebuild still on tactics/sub/result changes); chart EMA updates via `startTransition`.
**Live tactics:** debounced mid-match toggle changes no longer `flushSync`; opponent-report “apply all” batches into one flush before resync.
**Match UI:** `MatchPlayViewNew` and side rails are memoized; pitch fitness helper is stable across quiet re-renders.
V3.1.23 - GAME SMOOTHNESS (PHASE 1)
August 2026
**Nav chrome:** tab / club / world subview changes no longer rewrite full career GameState (or trigger autosave) on every click — last view still restores from save.
**Player profile:** Squad, Market, and Match open the shared profile host so a closed profile is fully unmounted (no idle `useGame` subscriber).
**Match overlays:** celebration / card pauses scale with playback speed but cap at 4s so ×¼ no longer lingers ~12s on goals.
**Squad list:** one TooltipProvider around the tables instead of a provider per badge cell.
V3.1.22 - PLAYER CARD NAME NUDGE
August 2026
**Player cards:** name and Wonderkid / Generational / World class tags sit a few pixels higher so they clear the gold divider above the stats.
V3.1.21 - QUARTER MATCH SPEED
August 2026
**Match playback:** **×¼** quarter-speed option alongside ×½, ×1, and ×2 (in-match speed button and OS Config default).
V3.1.20 - SEASON GROWTH UI
August 2026
**Season OVR deltas:** player cards, squad list, and profiles show overall as e.g. **56 (+2)** after season development (attributes still change at season transition; weekly play banks development points). Attribute rows show sparse season deltas; the profile Development panel adds a mid-season **dev bank** toward the next growth threshold. Starting the next season posts a Squad Development inbox note for your club when anyone moved.
V3.1.19 - PLAYER CARD ELITE LABELS
August 2026
**Player cards:** Wonderkid / Generational / World class tags sit in a band **between the name and stats**, so long labels no longer collide with the player name under ABL/POT.
V3.1.18 - YOUTH ACADEMY
August 2026
**Youth Academy tab:** Team now has Squad Selection | Tactical Hub | Youth Academy. Academy intake (yth) starts on the Youth Academy — not in the first-team list or Auto XI. A starter Youth Academy of **7–10** is created when a career launches; summers top the squad back up to 7–10. Assign individual **training focus** from the Youth Academy tab or Club → Training (Youth Academy section). Youth list hides OVR (potential as stars); profile Attributes / Contract / Report stay locked and the player card masks OVR + attributes until graduation. **Team Profile** also has a Youth Academy tab (same list rules for any club).
**Season promotion:** the best Youth Academy prospects graduate into the first-team squad when there is room (intake-sized slots under a soft senior cap); others stay on the Youth Academy. Graduates get a **1-year** deal; releasing a **yth** player is **free** until they renew. At **21** they must **graduate or leave** (free agent if no place). Season wrap shows promotions + new intake.
V3.1.17 - PLAYER PROGRESSION
July 2026
**Player development:** weekly development points now scale so regularly played youths can actually hit season growth thresholds. Previously thresholds were ~10× higher than a season’s banked DP, so attribute/OVR growth was almost only a rare lottery — explaining careers where a heavily used kid stayed flat for years.
**Season growth:** under-23s spend DP in clearer ~1 growth/season chunks (up to 3 if elite coaching/potential); peak ages refine skill toward their soft ceiling more slowly. Match ratings still only affect weekly DP for under-23s — attributes change at season transition. OVR remains capped by potential.
V3.1.16 - EDITOR OVR INPUT
July 2026
**Player database editor — Overall (GES):** typing a rating no longer glitches mid-keystroke (e.g. 77 → 59). Commit on blur/Enter; Higher/Lower buttons step by a real ability band instead of stuck browser spinners.
V3.1.15 - MIDWEEK FIXTURES
July 2026
**Midweek fixtures (cup + league same week):** finishing one match no longer auto-advances the week (which silently simulated your other fixture with the same XI and stacked fitness). You return to the hub for the midweek game — rotate, then play or consciously advance; Advance Week warns if a midweek fixture is still pending.
V3.1.14 - SEASON ACCOUNTS TRANSFERS
July 2026
**Financial Hub → Season Accounts:** buying and selling players during the transfer window now updates Transfer Spending / Transfer Sales. Bank balance was already correct; net balance was missing those fees (cosmetic).
V3.1.13 - SHORTLIST SCROLL
July 2026
**Transfer market shortlist:** long shortlists can scroll fully past the bottom nav — the last players are no longer cut off / blurred behind the fixed bar.
V3.1.12 - SHORTLIST SORT
July 2026
**Transfer market shortlist:** column headers (Name, Age, OVR, Pot, Value) now sort the Shortlist tab the same way as League / World — previously the headers looked clickable but the shortlist stayed in roster order.
V3.1.11 - EDITOR OVR SCALE
July 2026
**Player database editor:** edit dialog is wider (no sideways scrolling), with overall pinned beside attributes so you can see OVR impact while editing.
**Editable overall:** change OVR and attributes auto-scale (Potential lifts when needed). Overall is still derived — not stored in JSON.
V3.1.10 - EDITOR LIVE OVR
July 2026
**Player database editor:** overall rating is shown live while editing — a sticky OVR badge stays visible as you scroll, and updates immediately when you change position or attributes.
V3.1.9 - AUTO XI POSITION FIX
July 2026
**Lineup / Auto XI:** defenders are no longer treated as natural forwards. A strong CB will not be auto-picked into a striker/wing slot when real forwards (or attacking midfielders) are available — fixes the “defender randomly appears up front” report.
**Kickoff injury / suspension fill:** starting a match with an unavailable player now clears only those slots and refills by position, instead of rebuilding the entire XI (which could reshuffle healthy players into the wrong roles).
V3.1.8 - LABELS & SEASON ORDINALS
July 2026
**Position labels:** defenders always show **D** (with side, e.g. `D (R)`), never the rare cosmetic **DF**. The old label was easy to misread as “Defense or Forward”; those players were always defenders and only fit defensive slots.
**Existing saves:** any player still stored with `positionLabel: DF` is displayed as **D** in squad, cards, and youth intake.
**Season wrap-up:** final league place and board target use proper ordinals (`1st` / `2nd` / `3rd`) instead of always appending `th` (`1th`, `2th`, `3th`).
V3.1.7 - SUBSTITUTE RATINGS & MINUTES
July 2026
**Match player ratings:** manual / half-time substitutions (including goalkeeper changes) now get ratings and correct minutes at full time. Previously the FT ratings overlay could show the kickoff XI at ~90′ each while the player who came on had no rating and no minutes (and was not labeled Bench).
**Mid-match continuation:** keeps the true kickoff XI on the result, rates cameo subs after flash-to-FT / live re-sim, and records off/on minutes from SUB events even when the live lineup is already swapped.
V3.1.6 - CUP ROUND PROGRESSION
July 2026
**Cup / continental progression:** next-round draws now use fixtures after mid-week AI simulation, so later cup rounds schedule when ties are finished on advance (previously only pre-simmed results counted, so the cup often stopped after R64).
**Hub Play Match:** prefers cup / continental / playoff over league when both remain in the same week, so knockout ties are less likely to be auto-simmed after the league game.
V3.1.5 - MATCH COMPETITION LABELS
July 2026
**Match screens:** pre-kickoff, live match header, half-time, and full-time overlays show a human-readable competition label (league division, cup, continental, playoff, friendly) instead of raw enums like `LEAGUE`.
**Hub & results:** next-match card, tactics prep strip, game summary, and match reports use the same `getFixtureCompetitionLabel` helper (division names + cup rounds).
V3.1.4 - HUB LAST 5 SCORE FIX
July 2026
**Hub Last 5 results:** W/D/L and for–against scores now use the same **benefiting-side** goal totals as the match scoreboard / game summary (scorer `benefitsHome`, GOAL event `teamId`, then kickoff squad), instead of raw stored `homeGoals`/`awayGoals` that can drift after flash-to-FT or own-goal edge cases. Fixes cases like a 3–1 win showing as a loss on the dashboard.
**Match result normalize:** persisted `homeGoals`/`awayGoals` are realigned to those scorer-based totals when results are saved or loaded.
V3.1.3 - WORLD, EDITOR & PLAYER CARDS
July 2026
**Multi-country world:** load the full playable world at career start, with lighter memory use, **League / World** transfer market, and world scouting.
**Hall of Fame:** real manager and team boards with trophy icons, player cards on leaders and records, and retired alumni kept on team HoF.
**Custom faces:** import per-player portraits in the Database Editor — backdrop cutout, kit-tint tips, and a gold-framed white plate on cards.
**Editor fields:** edit **age**, **position**, and **side** (L / R / C / LC / RC / LR / ALL) in the UI and in JSON patches; wider editor tables; team search and club labels on exports.
**Ratings:** overall is derived from position-weighted attributes and **capped by Potential**, without wiping sleepers or lower-league gems.
**Match & squad feel:** mild play-style and side fit, late-match stamina fade, set-piece polish, softer home advantage, disciplinary lean, dressing-room morale, and training-load effects.
**Stability:** harder multi-country career boot and fewer world RAM spikes; market filter polish.
V3.1.2 - CUSTOM FORMATIONS, MATCH REPORTS & TRANSFERS
July 2026
**Custom formations:** build and save your own shapes on the tactics pitch — five-channel seat snap, auto role labels (DL / DLC / DC…), and magnetic player drops.
**Weekly Transfers Summary:** end-of-week transfer roundup so you can see who moved across the league.
**Assistant — incoming offers:** the assistant panel now advises when you have incoming transfer offers to review.
**Squad OFF marker:** players with a pending offer show **OFF** beside their name on the squad screen.
**Match reports:** read reports of the week’s games from the **World** tile.
**Own goals:** own-goal events use a **red football** icon in match feeds and reports.
**Ballon d’Or–style awards:** end-of-season prestige awards on the season wrap-up.
**General bug fixes** and polish across match, transfers, and squad UI.
V3.1.1 - SCOUT RECS, TOP 50 & WEB REFRESH
July 2026
**Scout REC markers:** transfer market **REC** toggle highlights scout-recommended targets when your club employs a scout (`PlayerMarket.tsx`, `scout-recommended.ts`).
**World Top 50:** form-weighted **hot list** in **World** with **All** and **U21** modes — apps, rating, goals/assists, OVR/POT (`WorldTop50Rankings.tsx`, `world-top-50.ts`).
**Matchday polish:** stadium **advertising hoardings** along the pitch; match summary and transfer-listing UX refinements.
**League & transfers:** AI results better reflect **squad strength**; improved bids on **listed players**.
**Website:** homepage **gameplay hero clip**, **email signup** for update news, **screenshots** gallery, and refreshed marketing pages.
V3.1.0 - ARGENTINA, PLAYER CARDS & TACKLING
June 2026
**Argentina domestic league:** new **4×20** country pack — **Liga Profesional**, **Primera Nacional**, **Primera B**, **Primera C** (80 clubs); career-start country picker entry; **20 bespoke Div 1 crests** under `public/team-crests/` (`teams-argentina.ts`, `domestic-country.ts`).
**FUT-style player cards:** dark/gold framed cards on **player profile**, **signing/scout moments**, and **academy intake** (`PlayerCard.tsx`, `PlayerCardMomentBridge.tsx`, `public/player-cards/`). Masked **OVR / ABL / POT** until scouted (`player-card-visibility.ts`).
**Tiered portrait frames:** **gold / silver / bronze / iron** (and glow variants) from **ABL** on cards, squad rows, tactics pitch, and hub stats (`FramedPlayerPortrait.tsx`, `player-portrait-frame-tier.ts`). **Elite labels** — Wonderkid, Generational, World Class — with scout-aware masking (`player-wonderkid.ts`).
**Tackling attribute:** new outfield stat in generation, match engine, profiles, and assistant **Auto XI** / lineup picks (`game-data.ts`, `player-generation-config.ts`).
**Season awards:** **Playmaker** (top assister) on the season summary; **Stats Hub** adds **goalkeeper** and **penalty** leaderboards (`prepare-season-summary.ts`, `SeasonSummary.tsx`).
V3.0.9 - PORTRAIT POOL & HD CRESTS
June 2026
**Player portrait pool:** refreshed art across **200** numbered slots (`000`–`101`, `106`–`203`); `npm run portrait-pool:import` for batch updates; transparent **card** variants under `background_removed/` (`player-portrait-url.ts`, `public/player-portraits/README.md`).
**Kit-coloured shirts:** portrait PNGs **tint** the shirt layer to the club’s **primary kit** colour (`PlayerPortrait.tsx`).
**HD team crests:** imported kit-pool badges **86–116**; bespoke **Div 1** crests for **Netherlands, Portugal, Brazil, Belgium, Turkey, and Poland** top flights (`team_kits.json`, `docs/team-crest-reference.md`).
**Staff & manager portraits:** shared PNG pool for non-player profiles (`staff-portrait-url.ts`).
V3.0.8 - CAMPUS, NEW COUNTRIES & LEADERBOARDS
May 2026
**Campus screen:** illustrated **stadium overview** with layered PNG stands, pitch, lights, and commercial art; **training** and **academy** tier visuals (`CampusScreen.tsx`, `campus-assets.ts`, `StadiumOverview.tsx`, `public/stadium/`).
**Academy focus:** managers set **youth intake positional focus** from Campus (quality/output/discipline projects align with training tiers).
**Stand seating:** new stadium upgrade track and cost-matrix docs for seating capacity projects.
**Six country packs:** **Belgium, Brazil, Netherlands, Poland, Portugal, Turkey** — each a standard **4×20** domestic pyramid with bundled team data and crest mapping (`domestic-country.ts`, `teams-*.ts`).
**Global leaderboard:** world rankings with **Supabase** auto-sync from career saves; **PostHog** analytics for career start/resume.
**Localization:** **German (de)** and **French (fr)** UI dictionaries; language picker on career start; expanded **Spanish** coverage across match, tactics, and editors.
V3.0.7 - STEAM RETAIL, WORKSHOP & MATCH TELEMETRY
May 2026
**Steam retail shell:** **Tauri** desktop app opens **`/steam-intro`** (not the marketing home); **static export** target for Steam builds; **universal macOS** binary (Intel + Apple Silicon depots) plus Windows depot refresh (`steam/`, `docs/store_apps/STEAM.md`).
**Steam Workshop:** subscribe, browse, and **apply** player/database mods from in-game Workshop UI; publish pipeline and player guides (`docs/store_apps/`).
**Steamworks:** **rich presence** during careers; local **achievements** unlock to Steam in the retail shell.
**Match telemetry:** per-player **minutes** and event meta retained in saves; telemetry-backed **career achievements**, **assistant fact lines** (HT/FT + week news), **match summary narratives**, and division **xG** table (`match-telemetry.ts`, PLAN #48 D2–D4).
**Hub & match polish:** experimental **dashboard** layout (next-match card, stats row/carousel); **one-screen match theater** option; **league table position** in the shell top bar; **transfer-window advance gate** when open deals would be lost.
V3.0.6 - iOS APP STORE & CLOUD PRIVACY
May 2026
**iOS App Store:** paid **no-ads** Capacitor build; **AdMob** removed from native pipeline; privacy policy updated for store release.
**Privacy page:** `/privacy` linked from cloud account panel and site nav.
**Web vs native:** marketing **About** page; Steam builds hide web-only **Pro checkout** and ad surfaces.
V3.0.5 - MATCH PLAYBACK, SAVE SLOTS & LIVE RESYNC
May 2026
**Match playback:** default speed setting in OS Config; **×½** half-speed option alongside ×1 and ×2.
**Save slots:** multiple career slots with named saves and resume picker.
**Live match resync:** re-simulates when pre-kickoff XI changes from stored kickoff ids (`MatchSim.tsx`).
**Market:** **value band** filter and **side** (left/right) filter on transfer listings.
**Sacking flow:** fixes for manager dismissal and job-market transitions after board action.
V3.0.4 - GLOBAL DATABASE EDITORS & INTERNATIONAL UI
April 2026
**Global database editors:** split **global** vs **save-only** scopes; **competition renaming** with global persistence; **crest** and **portrait pickers** in Team/Player Database editors.
**International squads:** World **International** view shows **one nation at a time** with nationality flags on nation tiles.
**Opponent tactics:** read-only view of the opponent’s formation and instructions before kickoff.
**Per-player training focus** in squad management.
V3.0.3 - MATCH AUTO-PAUSE, NEWS CLEAR ALL & UI POLISH
April 2026
**Appearance defaults & naming:** Default **tactics pitch** is **Tile**; default **match layout** is **Expanded** (one-screen theater when side lineups apply). OS Config labels use paired names (**Tile** / **Classic**, **Expanded** / **Compact**, **Split row** / **Classic fixture card**, etc.); **Live match spacing** uses **Comfortable** / **Tight** (replaces the old “Compact” density label to avoid clashing with match layout).
**Match auto-pause:** OS Config → **Appearance → Game options** — **Auto-pause match at minute** (device-local; default **65′**, range **46–120**). When enabled, the live match **pauses once per fixture** at that minute and opens **tactics** on the **Personnel** tab so you can adjust the XI; the trigger is skipped if that minute already has a **goal**, **red card**, or **injury** event (`matchAutoPauseEnabled` / `matchAutoPauseMinute` in `appearance.ts`, `AppearanceProvider`, `SettingsHub`, `MatchSim`).
**Side lineup rails:** when **Side lineups (wide screens)** is on at **xl+**, the bottom **Live ratings** strip is **hidden** so player rows are not duplicated beside the home/away rails (`MatchSim.tsx`).
**News feed:** **Clear all** dismisses every headline currently shown in the filtered list (same week’s items); wired via `dismissMessagesByIds` in `store.tsx` and **Clear all** in `NewsFeed.tsx`.
**Assistant:** `suggestCounterFormation` uses **diversified** counter picks against the opponent’s shape where multiple formations are valid (`assistant-logic.ts`, `tests/suggest-counter-formation.test.ts`).
**Steam (macOS):** first **SteamPipe** upload for **Retro Manager** (App **4613680**, depot **4613681**); Tauri bundle from `src-tauri/target/release/bundle/macos`. Local upload scripts live under `~/steam_upload/retro_manager/` — see **`steam/README.md`** and **`docs/store_apps/STEAM.md`**.
V3.0.2 - AI MATCHDAY SUBS & SIDE LINEUP RAILS
April 2026
**AI in-match substitutions (career path):** `simulateMatchForGameWeek` now passes **matchday bench** players (lineup slots 12–16) into `simulateMatch`, so **non-user teams** use the existing engine **`SUB`** logic (`match-sim-game.ts` **`matchdayBenchForTeam`**, `store.tsx` simulate week / fixture / advance week / fast-forward). **Your team** is unchanged — still **manual** subs only. Fast-forward season keeps **full 16-slot** auto lineups for AI clubs so benches exist.
**Side lineup rails:** OS Config → **Appearance → Game options** → **Side lineups (wide screens)** adds scrollable **home / away** columns (live rating, match fitness, goal and card markers) on **xl+** viewports; optional widened match shell (`MatchSim.tsx`, `MatchLineupSideRail.tsx`, `useMinWidthXl`, `appearance.ts` / `AppearanceProvider` / `SettingsHub`).
**Match density:** Settings → **Appearance → Match screen** — **Compact** tightens padding, scoreboard, commentary, tactical blocks, and stats on the live match view (Classic and New). Device-local (`matchScreenCompact` in UI prefs; `match-play-density.ts`, `MatchPlayView.tsx`, `MatchPlayViewNew.tsx`).
V3.0.1 - TEAM CREST IMAGES & PROCEDURAL CREST POLISH
April 2026
**Team crest images:** optional **PNG or WebP** crests via root-relative paths (for example under `public/team-crests/`). `ClubCrest` loads the asset with **`publicAssetUrl` / `runtimePublicAssetUrl`** (itch-style builds) and **falls back to the procedural crest** if the file is missing or fails to load. `Team.crestPublicPath` is editable in **Team Database** and flows through global DB patches and share sanitization (`team-crest-url.ts`, `public/team-crests/README.md`).
**Procedural crests:** more variety (**hexagon** and **lozenge** shapes, **saltire / quarters** pattern, **cross** center) plus monogram and ring polish for readability at small sizes (`crest-generator.ts`, `ClubCrest.tsx`). Because the generator option sets grew, **a given team id may get a different shape or palette than before** (one-time visual reshuffle unless the spec is versioned).
V3.0.0 - STABLE RELEASE
April 2026
**Major version:** Retro Manager **3.0** — stable release line. Product UI version (`APP_VERSION` / changelog) is **3.0.0**; npm package **`retro-manager-90`** is aligned at **3.0.0**.
**Shipped scope (this line):** OS Config — **choose which hub news / desktop ticker message types** to show (`hiddenNewsMessageTypes` in UI prefs; **TRANSFER** and **LOAN** always visible). **Season stats** table — **sortable column headers** (full division list, apps ≥ 1). Prior **V2.7.38** highlights remain: World **All Teams** grid, continental invitee **countries** & pools, **player portrait** PNG pool, squad **captain / set-piece** dropdown polish, and documentation updates.
V2.7.38 - WORLD ALL TEAMS, CONTINENTAL CLUBS & UI POLISH
April 2026
**World — All Teams:** new **World office** tile opens a **division-filtered grid** (DIV 1–4 strip) of domestic clubs with crest, points, and standings order; **click a tile** to open the same **Team profile** flow as the league table (`AllTeamsGrid.tsx`, `WorldSubView` **`ALL_TEAMS`**).
**Continental invitees:** expanded fictional **division 0** club bank; each invitee has a **`country`** (matches `NATIONALITY_POOLS`) stored on `Team`; new name pools (**Turkey, Poland, Greece, Denmark, Austria, Croatia**); procedural squads for invitees **bias toward home nationality** (~78%) via `generatePlayer` **`homeNationality`**; **Team Database** and **Europe** friendly picker show country where relevant.
**Player portraits:** deterministic **PNG pool** (`public/player-portraits/pool/000.png`–`097.png`, **98** slots) keyed by `player.id`, with **procedural SVG fallback** on missing/failed load; see `public/player-portraits/README.md` and `player-portrait-url.ts`.
**Squad UI:** **Captain** and **set-piece taker** (corners / free kicks / penalties) dropdown lists use the **same typography as player names**; stat hints use **primary** colour and **one decimal** place.
**Saves:** `Player.history` is no longer truncated to five seasons on write — each season line (**appearances**, **goals**, **average rating**, **club name**) is kept for the full career. Match **fixtures** stay on the existing slim pipeline (`save-utils.ts` `DEFAULT_PLAYER_HISTORY_SAVE_CAP = ∞`).
**Economy (backlog #31):** central `economy-config.ts`; `advanceWeek` gates for merch and match income; season prizes and sponsorship flows; `FinanceHub` tooltips; diagnostics `npx tsx scripts/economy-sanity.ts`; Vitest in `src/lib/economy-config.test.ts`; `tests/financial-stability.ts` aligned.
**Physio room (backlog #29):** Office **Physio** sub-view (`PhysioRoom.tsx`); `Injury.treatmentTier` and paid treatments with weekly charge on `advanceWeek` (`injuryTreatment.ts`); profile hooks; tests in `src/lib/injuryTreatment.test.ts`.
**Player standards (backlog #10 — first tranche):** `player-generation-config.ts` — procedural seniors use **division-based international weights**; **senior potential** with **lower-league sleepers** (high PA, modest CA); **Premier League soft cap** on elite PA; continental invitees uncapped; **`generateForeignPlayerPool`** wider PA spread.
**Official roster pack:** `tuneCuratedPackPlayerForDivision` in `roster-pack.ts` — same PA rules on new curated careers, **deterministic per player id**.
**Match quality:** kickoff XI resolution and rating reconciliation for lineups with gaps (`game-engine.ts`, `store.tsx`); tests in `match-played-ratings.test.ts`.
**Assistant / MatchSim:** shout primary control shows **Apply** when toggles or mapped zone boosts apply, else **OK** (`MatchSim.tsx`; RTL test updated).
**Game summary:** headline score, half-time strip, assistant narrative inputs, saves vs SOT, and chance-quality lines are driven from **goal lists** using the same **benefiting-side** rules as the attack-pressure chart (`scorerCreditsHomeSide`: `benefitsHome`, then matching **GOAL** event `teamId`, then match-day squad ids). Avoids score vs goal-list mismatches (e.g. own goals, older scorer rows, flash-to-FT quirks). Goal rows show a **ball** marker next to each scorer.
**Flash-to-FT / mid-match continuation:** when trimming a pre-run result and simulating from a later minute, **home/away goal totals** are recomputed with that same benefiting-side logic instead of counting by scorer club only.
**Match scoreboard (AI opponent):** under the AI team name, the line always shows **current effective formation · play style** from kickoff; when live shape differs from preferred ethos it prefixes **Chasing** / **Protecting** / **Adjusted** (unchanged thresholds). Your side still has no duplicate tactics strip.
**Docs & guides:** `docs/TACTICAL_BATTLE_BARS.md`, `docs/FEATURES.md`, `docs/PLAN.md`, `docs/GAME_SYSTEMS_OUTLINE.md`, `docs/attack-pressure-chart-engine-inputs.md`, `README.md`, `docs/GAME_GUIDE.md`, in-app guide (`/guide/game`), and **Best tactics** page updated to describe the above.
V2.7.34 - MATCH UI & STATS FIXES
April 2026
**Attack pressure chart:** goal/card markers use **fixed-size CSS card tiles** and a boxed goal glyph so icons are not stretched by system emoji rendering.
**Player match stats:** **shots** are at least **goals** when a goal is credited without a matching `shotTakers` row (typical **own goals** — scorer vs shooter). Same adjustment for **weekly aggregated** shot counts after each result.
V2.7.33 - ASSISTANT SUMMARY COPY
April 2026
**Match summary assistant (experimental):** tighter full-time prose — less repetition after the stat block, more natural score and possession lines, keeper workload without echoing shots-on-target counts, and sharper red-card context.
V2.7.32 - ATTACK PRESSURE GOAL CREDIT
April 2026
**Attack pressure chart (experimental):** goal markers now credit the **benefiting** team — same order as the engine: `benefitsHome` when present, then the matching **GOAL** event `teamId`, then squad. Fixes wrong-side ⚽ for own goals and older scorer rows without `benefitsHome`. Per-minute chart samples use the same attribution.
V2.7.31 - FRIENDLY POOLS & MATCH POLISH
April 2026
**Arrange friendly:** **Division** opponent list uses domestic league divisions **1–4** only so European invitee clubs do not appear there; **Europe** stays on division **0** invitees (with legacy foreign-market fallback).
**Attack pressure chart:** goal and card markers render in an **HTML overlay** so icons are not stretched by the SVG viewBox.
**Match summary assistant (experimental):** clearer narrative ordering and copy on full-time summary.
V2.7.29 - EUROPE FRIENDLY PICKER RELIABILITY
April 2026
**Arrange friendly (Europe tab):** opponent sourcing now prefers real in-save **division 0** invitee clubs, so European options appear reliably when invitees exist in the save.
**Legacy compatibility:** if invitee clubs are missing (older saves), the picker falls back to synthetic foreign-market Europe entries.
V2.7.28 - ATTACK PRESSURE MARKER POLISH
April 2026
**Attack pressure chart:** reduced goal/card marker icon size to avoid visual squashing at chart edges while keeping marker readability.
V2.7.27 - DIVISION PLAYOFFS + CALIBRATION GUARDS
April 2026
**EFL-style playoffs (Div 2/3/4):** after week 42, positions 3-6 enter single-leg semifinals and a final (`PO-SF`, `PO-F`) for the third promotion slot in each division.
**Promotion logic:** season summary and rollover now use playoff winners as promoted teams (with playoff-winner labeling), while keeping 3-up/3-down balance through the pyramid.
**Engine benchmarks:** shot/goal tuning and calibration guards were tightened, including ratio checks and soft-tail protections for extreme shot/score outliers.
V2.7.24 - EUROPEAN-STYLE FOREIGN CLUBS
April 2026
**Foreign market club names:** expanded synthetic parent clubs to European-style identities (for example **Madrid White**, **Catalonia Blue & Red**, **Munich Red**, **Turin Black & White**, **Paris Blue & Red**, etc.) while keeping fictional naming.
**Assignment logic:** players in the foreign pool now pick a random club within their nationality group instead of always resolving to one regional bucket.
**Market display:** foreign listings now show the synthetic club name (fallbacks still apply for legacy ids).
V2.7.22 - AI IN-MATCH SUBSTITUTIONS
April 2026
**Match engine:** AI teams now make practical in-match substitutions from bench players (planned windows plus injury replacements), while managed user teams keep manual substitution control.
**Continuation parity:** pre-existing `SUB` events are replayed into active lineups when simulating from a later minute, avoiding stale-on-pitch state in flash-to-FT continuation paths.
**Tests:** `game-engine.test.ts` now asserts AI substitution behavior and user-team no-auto-sub behavior.
V2.7.20 - REGIONAL POOLS, NEWS & COMMENTARY
April 2026
**Regional talent pools:** `applyNationalityFlavour` — England outfield +1 stamina; **France** pace+skill and **USA** pace+stamina (split from the old combined group); goalkeepers in several nations get +1 stamina. **Youth wonderkid** rolls use small multipliers for South American and select European nationalities (`generatePlayer`).
**Live commentary:** extra lines in attack, midfield, and defence buckets (`commentary.ts`).
**Docs:** `docs/PLAN.md`, `docs/FEATURES.md`, `docs/SWIFT_PORTING_GUIDE.md` updated for the above.
V2.7.19 - OPPONENT REPORT APPLY ALL + FAQ
April 2026
**Pre-match Opponent report — Apply all:** applies merged **formation/play style** and **match instructions** first, then **Apply Best XI** (so the XI fits the new shape), then **opens the tactics overlay** when any line asks for tactical review; review-only rows (e.g. **DANGER MAN**) are included in the count and recorded as accepted.
**Help → FAQ:** answers for **OK vs Back** on in-match assistant prompts, **match shout** title variety across windows, **half-time Assistant** buttons, and **Apply all** on the opponent report.
**docs/PLAN.md:** shipped section updated for **V2.7.17–18** assistant and match UI notes.
V2.7.18 - ASSISTANT IN-MATCH PARITY
April 2026
**Half-time assistant:** each tip can include a **Tactical Review** action that opens the in-match tactics overlay and records acceptance.
**Opponent report:** **DANGER MAN** includes the same **Tactical Review** shortcut.
**Match shouts:** consecutive shout windows avoid repeating the **same title** when another option exists (fallback if the pool would be empty).
**Settings → Assistant:** short note on **OK** vs **Back** on in-match assistant prompts and how learning uses outcomes.
V2.7.17 - MATCH SUMMARY ASSISTANT (EXPANDED)
April 2026
**Assistant summary (experimental):** richer copy — **clean sheets**, **goalkeeper saves**, **corners**, **shooting accuracy** vs **volume**, **discipline** (cards), **0–0 / low‑goal** deadlock, **high‑shot** or **cagey** pace, **comfortable margins**. Up to four extra sentences after the core story (full time); half-time still light. Same deterministic picks per fixture.
V2.7.16 - MATCH SUMMARY ASSISTANT (EXPERIMENTAL)
April 2026
**Settings → Appearance → Game options:** optional **Assistant summary** on **Match summary** — a short paragraph tying **score**, **possession** (model), **xG**, and **shots** (split-story when ball and chances disagree; finishing vs xG when clear). Deterministic per fixture (`game-summary-assistant-narrative.ts`). Off by default.
V2.7.15 - PWA SERVICE WORKER (NEXT CHUNKS)
April 2026
**Service worker (`public/sw.js`):** Next.js bundles under `/_next/static/` (and `/_next/data/`) now load **network-first**, then update cache — fixing stale **JS chunks** paired with fresh HTML on **custom domains** (returning visitors). That mismatch could break React and in-game behaviour (e.g. match clock appearing stuck); **preview** URLs often looked fine with a cold cache.
**Docs:** `docs/vercel-deployment.md` — unregister SW / hard refresh if odd behaviour persists after deploy.
V2.7.14 - ASSISTANT COPY (ACTIONABLE)
April 2026
**Assistant / Suggestions mode:** half-time and full-time lines are rewritten so the **first sentence** (what you see in **Suggestions**) always points at a **real action** — Strategy, Tactics, Squad, subs, formation, training focus, or Dashboard training.
**Match shouts** (`getMatchShouts`): fatigue, form, and pitch check-in lines tie to **subs**, **Strategy**, or **Tactics**; enhanced **board** and **injury** tips name **Club**, **Squad**, and **Training focus**.
**Tests:** `assistant-match-narrative` checks that suggestions clipped text still names an actionable surface.
V2.7.13 - COPY & NEWS VARIETY
April 2026
**Week news:** deterministic **brace** (two-goal) headlines and **shutout / clean-sheet** lines for low-scoring wins (league/cup); expanded tabloid pools stay **`stablePick`-seeded** for consistent saves.
**Commentary:** more lines in `TAGGED_LINES` and main buckets (attack, midfield, defence, save, miss, goal).
**Assistant match narrative:** extra **shots-chaser**, **0–0 half-time**, **discipline**, and **opponent threat** variants (still `narrativeSeed` / `pickVariant` deterministic).
V2.7.12 - POSSESSION ON RESULT
April 2026
**Fixture result** now stores **`homePossessionPct`** (0–100, home share) at the end of **`simulateMatch`**, using the same display pipeline as live bars (`getEngineAlignedZoneRatingsForDisplay` + `getPossessionFromDisplayedRatings`). Quick-sim and saved fixtures can show possession on **Game summary** without opening `MatchSim`.
**Game summary** uses `result.homePossessionPct` when set, otherwise the live prop from `MatchSim`. **Save slimming** retains `homePossessionPct` when present.
V2.7.11 - GAME SUMMARY BREAKDOWN
April 2026
Full-screen **Match summary** (half-time + full-time): **Goals & discipline** in one home/away block — scorers with optional **assists** and `(o.g.)` where appropriate, cards per side, yellow/red totals; **competition** line under the score.
**Story strip:** half-time score (full match), **weather**, **attendance**, and **possession** (from live `MatchSim` display). **Standouts:** highest **match rating** per side from `result.ratings`.
**Chance quality** panel: goals vs **xG** with delta, **shots on target %**; **assist leaders** line; **injuries**, **substitution** counts, **penalties** / shootout when relevant; **extra time** minutes included when filtering scorers/cards.
When you pick a **half-time team talk**, the **AI opponent** now gets a **deterministic** talk of their own (`pickAiHalfTimeTeamTalk`) using the same **second-half zone matrix and decay** as your side, so the second half is not one-sided.
Wired through **`MatchLiveModifiers.opponentTeamHalfTimeTalk`**, `getLiveZoneModifiers`, live match display, and **flash-to-FT** continuation. Skipping the talk picker (kick off without choosing) still gives **neither** side a talk effect.
**Career achievements** — **eight** new local meta-goals (now **51** total): **Road warrior** (win every away league match in a season), **Unbreakable run** (10 consecutive league games unbeaten), **Shutout streak** (5 consecutive league clean sheets), **Transfer merchant** (≥£2.5M net profit from transfers in a season), **Homegrown regular** (academy youth with 15+ apps in a season), **Loan army** (3+ loan players in the squad at once), **Scout network** (20 full scout reports locked), **International star** (squad player with 10+ caps). Same persistence and merge-on-load behaviour as V2.7.8.
**Tests**: Stabilised the **formation vs outcomes** check in `game-engine.test.ts` (more samples, goals/shots/**chances** comparison) to avoid RNG flakes.
**Career achievements** — **38+** local meta-goals (including **Invincibles** for a full league season with no league losses) (league/cup/continental milestones, derbies, hat-tricks, penalty shootout wins, cup runs, big wins & sales, academy/stadium/sponsor, international caps & wonderkids, tactical/defensive seasons, longevity, board/fan moods, and more). Unlocks persist in your save; loads **merge** persisted ids with earned conditions so **new** achievements backfill for existing careers without duplicate toasts.
Club → **Legacy & Records**: **Career achievements** grid with locked/unlocked cards; toasts when you unlock during play.
Code: `src/lib/achievements.ts`; hooks in `advanceWeek`, `buyPlayer`, `hireStaff`, `startNextSeason`.
V2.7.7 - ASSISTANT SHOUT ZONE BOOSTS
March 2026
Certain **in-match assistant shouts** (Force errors / See out the game / Pitch check-in) apply a **short-lived live zone display** boost when you tap **OK**, on top of any tactical toggles the shout applies.
**15′ per-effect cooldown** on those zone boosts (toggles still apply every time). If the shout also sets **pressing high** or **tempo low**, the zone slice is **smaller** so the same intent is not double-counted against team-talk-style toggles.
Brief **status line** after OK when a boost applies or when you are still on cooldown. Effects clear at **full time** or **flash to FT**; display-only (same path as team talks v2), not written into the sim event stream.
Half-time team talks (Encourage / Calm / Aggressive) now apply **different** second-half zone tweaks by **score at the break** (behind, level, ahead): e.g. chasing a game favours forward zones on an aggressive talk; protecting a lead favours calmer shape on Calm.
Effects are **strongest from 46′–60′** and **fade to neutral by ~73′** instead of one flat boost for the whole half.
Half-time UI: each option shows a short **effect hint**; the pitch overlay uses a higher stack order so the talk picker sits above the stats sheet. **Away** fixtures get the same talk flow as home (managed side).
Code: `src/lib/team-talk-effects.ts`; `getLiveZoneModifiers` + `getEngineAlignedZoneRatingsForDisplay` take `userTeamId` and goals-at-45 context.
V2.7.5 - CANVAS BACKGROUNDS & COPY V1
March 2026
Club → OS Config → Appearance: pick a full-screen canvas background behind the floating UI (bundled art under `public/backgrounds/`). Default stays the classic stadium image; choice is saved on this device and reapplies after load (including Itch-style relative static builds).
Code: `src/lib/background-themes.ts`, `CanvasBackgroundSync` in root layout after the service worker hook.
Match and UI copy: expanded deterministic pools for commentary, assistant half-time/full-time and in-match shouts, and weekly inbox headlines — same stable picks where the engine already keyed them.
Assorted flavour and polish from the same pass: week-news and foreign-market lines, generatePlayer nationality snippets, small Market/Profile tweaks.
V2.7.4 - TRANSFER DEADLINE WEEK
March 2026
Transfer deadline week (summer week 4, winter week 26): higher chance of AI moves, incoming bids for your players, and incoming loan offers when you advance the week; optional tabloid-style deadline rumour inbox lines.
Entering a deadline week adds a board memo; Market shows an amber banner. Phase labels spell out that the window shuts after you advance past that week.
Advancing out of the window with open transfer business (pending deal, bids, counters, or loan offers) asks for confirmation so deals are not lost by accident.
Helpers: `isTransferDeadlineWeek` in `game-engine.ts`.
Dashboard (HUB): assistant panel hides the redundant “Why this?” block and uses a tighter layout so the quote and actions stay primary.
V2.7.3 - PRO ENTITLEMENTS (FOUNDATION)
March 2026
Club → OS Config → Pro unlockables: device-local Pro flag (not stored in career save). Prepares for future IAP bundle (remove ads, extra slots, editors). Development builds: Grant Pro / Clear Pro for testing.
Code: `src/lib/entitlements.ts`, `useProUnlocked()` hook for gating UI when features ship.
V2.7.2 - HUB & INBOX POLISH
March 2026
Weekly headlines: loan items tied to expired or removed offers are auto-marked read and no longer show Accept/Decline; same cleanup runs when loading a career save.
Assistant loan tips that send you to Market now switch the database to Domestic and set Contract / loan → On loan only so incoming offers and loan-listed players are easier to find.
Dashboard tab shows an amber count badge when there are unread loan headlines for the current week.
E2E: changelog page smoke test (visible heading + version entry).
V2.7.1 - STADIUM MATCHES CLUB STANDARD
March 2026
New careers: each club’s starting stadium (stands, pitch, lights, commercial, facilities, prestige) scales with reputation and division as well as capacity — big clubs no longer look like small grounds just because the numbers are similar.
Stadium projects: three-tier corporate hospitality track (lounge → executive suites → premium hall). Each tier adds hospitality level (0–3) and extra gate income on top of commercial retail.
Commercial project “Hospitality boxes” renamed to “Concourse retail unit” so it’s distinct from the new hospitality track.
All Division 1 (and Preston) home ground names in data are fictional — no real stadium trademarks.
V2.6.9 - STADIUM NAME
March 2026
Club → Finance → Stadium & infrastructure: rename your home ground (applies to legacy `stadium` and full `stadiumData`); shown on the stadium overview and elsewhere the name appears.
V2.6.8 - INDEXEDDB SAVE FALLBACK
March 2026
Career saves still use compressed localStorage first; if the ~5MB quota is exceeded, the game stores the career blob in IndexedDB (same browser, same site) and keeps a small flag in localStorage.
Successful localStorage saves also mirror to IndexedDB when available, as a backup if site data is cleared selectively.
Load career checks localStorage, then IndexedDB when needed (including resume after IDB-only storage).
V2.6.7 - ASSISTANT MATCH CONTEXT & RESET
March 2026
In-match accepts (Assistant Manager Ack, opponent briefing actions) record score and minute for post-match outcome learning; match context uses structured entries instead of title-only lists.
Assistant manager: Ack records an accept with snapshot; dismiss still skips without outcome linkage.
Saves with legacy `titles`-only match context migrate on load; Assistant manager fatigue/underperformance lines pick from several variants deterministically.
V2.6.6 - WEIGHTED OUTCOME RANKING
March 2026
Assistant advice ranking now applies margin-aware weights: 2+ goal wins/losses count more than one-goal margins; legacy tallies sit between. Chip totals are unchanged; only sort order uses the weighted net.
V2.6.5 - OUTCOME MARGIN CONTEXT
March 2026
In-match assistant outcomes now record whether the result was a one-goal or 2+ goal win/loss (draws unchanged). Ranking still uses total helpful minus harmful per tip; office tags show totals with tooltips breaking down one-goal vs 2+ vs legacy tallies from older saves.
V2.6.4 - ASSISTANT MODE & OUTCOME CAPS
March 2026
Club → OS Config → Assistant: choose Full (adaptive ranking + tags), Suggestions (same tips, no history-based ranking — telemetry still saved), or Off (no dashboard assistant, no in-match assistant manager or opponent briefing blocks; no new learning).
Per-advice outcome tallies cap at 8 per title; each new season applies a soft decay so old results fade.
V2.6.3 - ASSISTANT OUTCOME TAGS
March 2026
Assistant Manager Office: each suggestion can show small outcome tags when you have history — wins or losses after using that tip in a match (↑ wins after / ↓ losses after). Draws do not change these counts. Ranking already factors this alongside accept/skip; the sidebar note now says it learns from choices and results.
V2.6.2 - SCOUT CONCLUSIONS
March 2026
Player profile Report → Scout conclusion: richer headline + detail (OVR vs potential, position, recent form, personality traits). Wonderkid-style wording only for players aged 20 or under; older flagged wonderkids use a maturing headline.
Non-squad players: conclusion hidden until you run a scout report (Club → Staff scout required); IDs stored in save as scoutedPlayerIds. Your own squad always has the full write-up. Signing a player clears them from the external scout list.
Arrange friendly: opponent picker lists every other club (your division first, then others) with normalised division 1–4 so a bad/missing division on your team can’t empty the list.
Assistant UX polish: assistant action buttons now show a short Applied confirmation with duplicate-click guard in Assistant Manager Office and pre-match opponent briefing.
Polish: friendly arrange toasts (not preseason, already scheduled, invalid opponent, success); dialog stays open on failure; taller scroll on small screens; a11y hint id on dialog. Docs: FEATURES preseason line; PLAN backlog synced (captain/international/window countdown shipped); design notes live under docs/MATCH_RATING_SPEC.md and docs/YOUTH_SUGGESTIONS.md.
Branding: product display name **Retro Manager** (npm package id remains `retro-manager-90`). Career default start season remains configurable (e.g. 2025).
V2.6.1 - TESTS & TRANSFER WINDOW QOL
March 2026
Tests: youth-academy season transition uses fixed-age contracts so intake isn’t flaky when players retire or expire; engine-v2 and game-engine rating tests use aggregate same-XI / many-match stats instead of one random match.
Transfer window: Office (career stats) and Market show countdown to the next window when closed (winter from league weeks, summer preseason after week 26); helpers getTransferWindowCountdownLabel / getTransferWindowPhaseLabel in game-engine.ts.
V2.6 - YOUTH ACADEMY OVERHAUL
March 2026
Club academy profile: each team has academy quality, output, positional focus, and discipline (new careers get varied rolls; legacy saves use stable defaults from division + reputation).
Annual intake class: every club gets 1–3 academy youths per season (output-driven), with weighted positions from focus, formation, and squad needs — no automatic youth per leaver.
Squad fillers: if a club is below 16 players after intake, cheap senior players are generated (not academy youth).
Youth ages at intake: mostly 16–18 with occasional 15-year-olds; potential and wonderkid odds scale slightly with academy quality; discipline nudges professionalism.
Academy upgrades (Finance → Stadium & infrastructure): Improve / Expand / Elite projects (cost + weeks) raise quality and/or output when complete, like stadium expansion.
Minutes-based development (C1): youth under 23 get bonus/penalty to weekly dev from minutes played and match rating; injured or unused youth grow slower.
Intake quality band + messaging (C2): each intake rolls Poor/Steady/Promising/Excellent; wonderkid chance scales with band; user sees "ACADEMY INTAKE DAY" message with class and scout flavour.
Development variance + soft ceiling (C3): youth get developmentRate (0.7–1.3) and developmentEfficiency (0.85–1.0); effective skill cap = potential × efficiency; not every prospect reaches ceiling.
Rollback: set USE_ACADEMY_PROFILES or USE_ACADEMY_UPGRADE to false in src/lib/youth-academy-config.ts to disable new intake or upgrade UI.
Tests: tests/youth-intake.test.ts (incl. intake band); youth-academy and season tests updated; see docs/YOUTH_ACADEMY_UNIFIED_PLAN.md.
V2.5 - LIVE RATINGS, MATCH STATS & DOCS
March 2026
Live ratings during match: collapsible "Live ratings" block below the pitch shows ratings that update with the clock (performance so far); only players who have played so far are listed; block has its own scroll (max 50vh).
Match stats for ratings visibility: optional stat columns (Min, G, A, Sh, SOT, Svs/Conc/CS for GK) and tooltip on rating cell in SummaryRatings; summary and live stats from getMinutesPlayedMap and result data; used in half-time/full-time overlay and Live ratings block.
Half-time and full-time overlay: popup extends to show full lineup via scrollable ratings area and slightly wider max width (max-w-6xl/7xl); boundHeight={false} so tables grow and parent scrolls.
Pre-match Lineups overlay: same scroll behaviour so full XI + bench is visible.
Docs: docs/YOUTH_PLAYERS.md – academy intake flow, potential, attributes, development points and growth; docs/PLAYER_RATINGS.md, TACTICAL_BATTLE_BARS.md, SWEET_SPOT_PLAN.md added.
V2.4 - CUP UX, WEEK RESULTS & PLANS
March 2026
Week results screen: after advancing the week, a dedicated results view shows all that week's results (League by division, Retro Cup by round, Friendlies) with Continue to dismiss.
Cup UX: dedicated Cup view under World tab (fixtures by round R1→F); match day list grouped by League — Div 1–4, Retro Cup — round, Friendlies.
Preseason: Skip to next week on the dashboard next to Arrange friendly (and when a friendly is scheduled) so you can skip without playing.
Results screen uses the same format as the fixtures screen (header, list style, row layout).
Unified plan: single docs/PLAN.md (roadmap, backlog, status); old plan docs removed (retro-manager-v2-plan, STAGED_FEATURES_PLAN, full-review-opportunities, futurefeatures, pwa_plan, CODEBASE_REVIEW). README and FEATURES.md updated.
V2.3 - PRESEASON, CUP & MOBILE SCALE
March 2026
Preseason: 4 weeks (1–4) before league; arrange friendlies vs same-division clubs; advance week with or without playing.
Retro Cup: 32 teams (8 per division), knockout R1→R2→QF→SF→Final; extra time and penalties for draws; next round drawn when a round completes.
League calendar: 38 matchdays in weeks 5–42; standings and fan mood from league fixtures only; cup/friendlies don’t affect table.
Hub and match day: Preseason label, Arrange friendly, cup round badges (R1/QF etc.); Fixtures button opens week’s games; next fixture shows cup round when applicable.
Mobile: GameScaleWrapper renders game at 1366×768 and scales to viewport; one layout on desktop and phone; letterbox background; body scroll locked on /game only.
Tests: preseason-cup.test.ts (isPreseason, cup entrants, R1 generation, winners, next round); fixture-integrity league-only; winter transfer window 24–26.
V2.2 - CALIBRATION & TEAM PROFILE
March 2026
Team profile: click any team (league table or hub Division Snapshot) to open team overview, squad, and manager details.
Master calibration tests (tests/master_calibrate.md): goals, shots, cards, fouls, injuries, and penalties distribution asserted in tests/engine-v2/master-calibrate.test.ts.
Cards-per-game calibration: yellows/reds tuned to realistic bands; proportion with ≥1 red 10–25%, 2+ reds <5%.
In-match penalties tracked: result.penaltiesAwarded for calibration; penalty distribution test (0 / 1 / 2+ pens) added.
England flag display fixed (🇬🇧) across TeamProfile, PlayerProfile, SquadList, and related components.
AI managers use first name + surname (e.g. Alan Ferguson).
Squad selection: deselecting a player clears only that slot; others stay in position.
Docs: single canonical benchmark doc tests/master_calibrate.md; docs/stats.md points to it.
V2.1 - MATCH ENGINE IMPROVEMENTS
March 2026
Phase-based match flow: possession, territory, attack progression (central/wide/counter/set piece/long shot).
Team and player match profiles: tempo, directness, pressing, finishing from formation, play style, and squad quality.
Shot context and quality: shot type (one-on-one, foot, header, long range, set piece), pressure/assist/keeper factors, on-target and goal probability.
Outcome resolution: BLOCKED, MISS, SAVE, GOAL, WOODWORK; saves and blocks can lead to corners.
Calibrated player ratings and cards; red-card and in-match injury handling with active squads updated live.
Momentum derived from possession, territory, and shots; displayed on match screen; feeds into phase pressure.
Derby modifier and "Derby Day" tag for rivalry fixtures; increased attendance and match tension.
Weather (Rain/Snow): conversion and play modifiers applied; stored in result and shown in UI.
Injury-time and late-goal tension; Man of the Match (PoM) on full-time overlay; red-carded players greyed with icon.
Tunable engine config (goals, shots, set pieces, fouls, cards, injuries); optional arcade preset for higher scoring.
V2.0 - MATCH ENGINE, WORLD & APPEARANCE
March 2026
Full Match Engine V2: phase control, shot quality, ratings, momentum, derby, weather, Man of the Match; tunable config and optional arcade preset.
Rivalries, fan mood (Furious/Concerned/Happy/Delighted), and attendance linked to form and board pressure.
Player personality traits (Professional, Leader, Big Match Player, etc.) affect development and morale.
AI manager sackings and job market; new manager bounce when taking over a club.
Seasonal awards, Manager of the Month, club legends, career timeline, Hall of Fame.
Yellow card accumulation and suspensions; clean-sheet bonuses; transfer rumours; sponsorship deals.
Youth academy intake and wonderkids; procedural portraits and radar charts in profiles.
Appearance system: choose font (IBM Plex Mono, Inter, VT323, Press Start 2P) and color theme from OS Config.
Eleven color themes: Default, Warm, High contrast, Classic Retro, Neon Night, Stadium Lights, Tactical Board, Midnight Manager, Sunset League, Retro Terminal, Ice Blue.
Player Profile Report tab: section headers 20px, scout conclusion headline 28px, Best Role badge and development/psych/career stats typography hierarchy.
Contract tab: larger labels and buttons in Negotiation Console, Transfer Status and Release cards.
Attribute names increased to 14px in profile Overview and Attributes tabs.
Academy youth label "yth" now displays in green (accent) in Squad List and Team Roster.
Start menu: INITIALIZE CAREER button aligned with Management Philosophy explanation; team list extends to fill the gap.
MatchSim: fixed homeSquadIds/awaySquadIds used before initialization (runtime error).
V1.5 - POLISH & BALANCING
March 2026
Calibrated match engine to historical 90s benchmarks (avg 1.35 goals/team).
Balanced home advantage to realistic levels (~46% win rate for equal sides).
Economic stabilization: Recalibrated wages and prize pools for long-term health.
Added informational tooltips to Finance Hub and Player Profiles.
Created comprehensive feature documentation (docs/features.md).
Validated 20-season progression for financial stability.
V1.4 - MATCH DEPTH & ECONOMY
March 2026
Implemented Interactive Half-Time Team Talks with tactical modifiers.
Added Stadium Expansion projects (Small, Medium, Large tiers).
Integrated Finance Hub for club infrastructure management.
Added dynamic attendance based on club reputation and division.
Improved match commentary with half-time feedback.
V1.3 - PLAYER DEPTH
March 2026
Implemented Recent Form tracking (last 5 matches).
Added Match Sharpness (Condition) mechanics and decay logic.
Introduced Development Points for seasonal attribute growth/decline.