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.
**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 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.