Changelog

RETRO MANAGER 90 - SYSTEM LOGS

V3.0.3 - MATCH AUTO-PAUSE, NEWS CLEAR ALL & UI POLISH

April 2026
  • **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`).

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.
  • **Docs:** `README.md`, `docs/FEATURES.md`, `docs/PLAN.md`, `docs/GAME_SYSTEMS_OUTLINE.md`, `docs/GAME_GUIDE.md`.

V2.7.37 - FULL CAREER PLAYER HISTORY IN SAVES

April 2026
  • **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 = ∞`).
  • **Docs:** `docs/PLAN.md` §5, `docs/STORAGE_AND_CLOUD_SAVES_PLAN.md`.

V2.7.36 - ECONOMY, PHYSIO, PLAYER WORLD & POLISH

April 2026
  • **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).
  • **News ticker:** ~**50% slower** scroll (`news-ticker-duration.ts`); reduced-motion headline **16s**; `GameNewsTicker.tsx` wired.
  • **Tests / CI:** `player-generation-config`, `news-ticker-duration`; calibration **describe** timeout **30s**; **scorer rating boost** uses aggregate mean over many matches (`game-engine.test.ts`).
  • **Docs & porting:** `docs/PLAN.md`, `FEATURES.md`, `stats.md`, `GLOBAL_DATABASE_IMPORT_GUIDE.md`, `SWIFT_PORTING_GUIDE.md`, `README.md`.

V2.7.35 - MATCH SUMMARY & AI SCOREBOARD

April 2026
  • **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`).
  • **Match-week news:** larger deterministic pools — derby 0-0, shutouts, goal fests, braces, late winners.
  • **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.
  • Code: `GameSummaryView.tsx`, `MatchSim.tsx` (`possessionHomePct`). Docs: `docs/PLAN.md`, `docs/FEATURES.md`.

V2.7.10 - AI HALF-TIME TEAM TALKS

March 2026
  • 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.
  • Docs: `docs/PLAN.md` §1 — **global team/player patches** plus **JSON export/import**; `docs/FEATURES.md` half-time bullet; `docs/DEEPER_SHOUTS_AND_TEAM_TALKS_PLAN.md` M6.

V2.7.9 - ACHIEVEMENTS EXPANSION & QA

March 2026
  • **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.
  • Docs: `docs/FEATURES.md`, `docs/PLAN.md`, `future_features.md`, `docs/GAME_SYSTEMS_OUTLINE.md` synced.

V2.7.8 - CAREER ACHIEVEMENTS

March 2026
  • **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.
  • Code: `src/lib/shout-zone-effects.ts`; `UserShoutZoneEffect` + `getLiveZoneModifiers` / `getEngineAlignedZoneRatingsForDisplay`; `MatchSim.tsx`.

V2.7.6 - TEAM TALKS V2 (ZONE & DECAY)

March 2026
  • 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.

V2.7.0 - CORPORATE HOSPITALITY & FICTIONAL GROUNDS

March 2026
  • 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.
  • Settings → Assistant: Reset assistant learning clears accept/dismiss and match-outcome tallies (mode unchanged).
  • 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 name **Retro Manager 90** (npm `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.
  • Added Age-based evolution: youngsters grow, veterans decline.
  • Enhanced Player Profile with in-depth stats and history.

V1.2 - SQUAD MANAGEMENT

March 2026
  • Developed full Squad List and Tactics Pitch interfaces.
  • Implemented 16-player match-day squads (11 starters, 5 subs).
  • Added Drag-and-drop lineup management.
  • Introduced Player Market with AI transfer bidding.
  • Standardized formations (4-4-2, 4-3-3, 5-3-2, etc.).

V1.1 - CORE ENGINE

February 2026
  • Initial Match Engine development (Zone-based simulation).
  • League Pyramid extraction (4 Divisions, 81 Teams).
  • Implemented 38-week season schedule and League Table logic.
  • Added Manager Persona and Board Expectations.
  • Created Retro UI Foundation (90s aesthetic).

End of Logs // No further updates available