Changelog
Historique public des nouveautes et corrections de Nuffle Arena. Egalement disponible en flux RSS.
v1.101.0
✨ Features
- pro-league: level-up applier (skill rolls aux seuils BB) (Lot 3.C.4)
- pro-league: SPP attribution + career counters + progression cron (Lot 3.C.2)
- pro-league: structured sim error logs + slow sim warn + drift alerts (Lot 4.A)
- pro-league: wire casualty sweep + roster-aware applier (Lot 3.C.1)
- sim-engine: comparator hybrid vs full + EngineComparison + Prometheus (Lot 3.B.2)
- sim-engine: perf baseline + verbose trace pour le full driver (Lot 3.B.3)
- sim-engine: TD scorerId in events + 3 SPP per TD attribution (Lot 3.C.3)
- sim-engine: toggle hybrid/full driver par saison + override match (Lot 3.B.1)
v1.100.0
✨ Features
- sandbox: create test matches from admin (Lot 2.C.2 + 2.C.4 + 2.C.5)
- sandbox: exclude isTest matches from aggregators (Lot 2.C.3)
v1.99.0
✨ Features
- sim-engine: full driver emits MatchEvent[] via state diff (Lot 3.A.2.b)
- sim-engine: full driver MVP orchestrator (Lot 3.A.2.a)
- sim-engine: roster-aware GameState builder for full driver (Lot 3.A.2.c)
v1.98.0
✨ Features
- ai: 2-ply minimax lookahead for END_TURN (Lot 3.A.0.b)
- ai: per-race opening book bonus (Lot 3.A.0.c)
- ai: tactical profile modulates AI weights (Lot 3.A.0.a) , closes #4
v1.97.0
✨ Features
- admin: sim health + broadcaster live UIs (Lot 2.B.3 + 2.B.4)
- metrics: instrument sim-runner + broadcaster (Lot 2.A.3 + 2.A.4)
- metrics: Pro League sim engine metrics (Lot 2.A.1 + 2.A.2)
- schema: isTest flag on ProLeagueMatch (Lot 2.C.1)
- web: i18n Pro League components + feed + me (sprint i18n.5) , closes #661 #662 #664 #671
- web: i18n Pro League gazette + hall-of-fame (sprint i18n.3)
- web: i18n Pro League matches detail + live + replay (sprint i18n.4)
📝 Documentation
- audit: Lot 3.A.1 — AI game-engine assessment for full driver
- roadmap: sprint sim-engine — observability + full driver + sandbox , closes #655 #658
♻️ Code Refactoring
- game-engine: extract choice handlers (S27.8.7)
- game-engine: extract failure helpers (S27.8.4)
- game-engine: extract getLegalMoves to legal-moves.ts (S27.8.11)
- game-engine: extract handleBallPickup + canUseTeamReroll (S27.8.5)
- game-engine: extract handleBlitz to blitz-handler.ts (S27.8.13) — DoD <=600 atteint
- game-engine: extract handleBlock + import cleanup (S27.8.8)
- game-engine: extract handleLeap/Move/Dodge + handleDumpOffChoose (S27.8.12)
- game-engine: extract move sub-handlers (S27.8.6)
- game-engine: extract multi-block + frenzy from actions.ts (S27.8.10)
- game-engine: split block-action — extract handleBlock (S27.8.15) , closes #683
- game-engine: split choice-handlers — extract handleRerollChoose (S27.8.14)
- server: extract handleGetMatchSummary to dedicated module (S27.8.32)
- server: extract handleHireStarPlayer to dedicated module (S27.8.31)
- server: extract handleUpdatePlayerSkills to dedicated module (S27.8.30)
- server: split match.ts — extract 3 kickoff handlers (S27.8.21)
- server: split match.ts — extract 3 readonly handlers (S27.8.17)
- server: split match.ts — extract 4 lifecycle handlers (S27.8.20)
- server: split match.ts — extract 5 details/list handlers (S27.8.19)
- server: split match.ts — extract handleGetMatchState (S27.8.18)
- server: split match.ts — extract handleValidateSetup (S27.8.29)
- server: split match.ts — extract spectate + replay handlers (S27.8.16)
- server: split team.ts — extract 2 selection handlers (S27.8.26)
- server: split team.ts — extract 3 mutation handlers (S27.8.25)
- server: split team.ts — extract 4 player handlers (S27.8.24)
- server: split team.ts — extract 4 readonly handlers (S27.8.22)
- server: split team.ts — extract 4 star-player handlers (S27.8.23)
- server: split team.ts — extract handleBuildTeam (S27.8.27)
- server: split team.ts — extract handlePurchase (S27.8.28)
- server: split team.ts — final extraction + S27 TERMINE (S27.8.33)
v1.96.0
✨ Features
- web: i18n Pro League standings + leaderboard (sprint i18n.2)
v1.95.0
✨ Features
- server: wire audit log into admin-data routes (S27.6.4)
- sim-engine: every yard the ball moves is a narrated MOVE event
- web: /pro-league/about marketing page (sprint 1.F.4) , closes #630 #631 #632
- web: i18n Pro League hub + about pages (sprint i18n.1)
♻️ Code Refactoring
- game-engine: extract turn + foul handlers (S27.8.3)
v1.94.1
♻️ Code Refactoring
- game-engine: extract pass family handlers (S27.8.2)
v1.94.0
✨ Features
- sim-engine: space key-moment events inside the turn window
- sim-engine: successful passes advance the drive (and can score) , closes #1
🐛 Bug Fixes
- sim-engine: cap single-turn yards so TDs span multiple turns , closes #2
- sim-engine: turnovers no longer chain into a same-turn TD , closes #2
♻️ Code Refactoring
- sim-engine: drop dead hasPossession field on DriveState
v1.93.0
✨ Features
- web,e2e: replay keyboard shortcuts + Playwright spec (sprint 1.G.5)
- web: auto LIVE vs REPLAY mode redirect (sprint 1.G.3)
- web: TD/CASUALTY/NUFFLE markers on replay scrub bar (sprint 1.G.4)
♻️ Code Refactoring
- game-engine: extract special-action handlers (S27.8.1)
v1.92.0
✨ Features
- game-engine,server: skeleton Saison 4 BB3 (S27.5)
- mobile: a11y board PixiBoardNative (S27.4.1)
- mobile: hook composite useGameMatch (S27.4.2, cloture S27.4)
- mobile: i18n des ecrans cups (S27.3.16)
- mobile: i18n des ecrans leagues (S27.3.15)
- mobile: i18n des ecrans match + replay (S27.3.18)
- mobile: i18n des ecrans star-players (S27.3.17)
- mobile: i18n des titres de navigation (S27.3.19, cloture S27.3)
- server,db: audit log admin foundation (S27.6.1)
- server,web: UI lecture du journal d'audit (S27.6.3, cloture S27.6)
- server: replay dump endpoint for completed matches (sprint 1.G.1)
- server: wire audit log into admin routes (S27.6.2)
- sim-engine: enriched narrator + regen 50 panel replays on 0.13.0
- web: MatchReplayPlayer with scrub bar + speed controls (sprint 1.G.2)
- web: Pro League sitemap + JSON-LD SportsLeague/FAQ (sprint 1.F.3)
📝 Documentation
- panel: regenerate 50 panel replays on engineVer 0.13.0 (post iter #12-16) , closes #12-16 #12-16 #12-16 #13-14 #15-16 #12-16 #594 #12-16 #594 #595
♻️ Code Refactoring
- game-engine: Horns/PileDriver/SneakyGit via registry (S27.7.3, cloture S27.7)
- game-engine: Sprint GFI cap via skill registry (S27.7.2)
- game-engine: Stunty AV via skill registry (S27.7.1)
v1.91.0
✨ Features
- server,db: casualties post-process roster (sprint 1.E.4)
- server,db: Pro League badges/titres (sprint 1.D.9) , closes #614 #615 #616 #617 #618 #619 #621 #622
- server,web,db: Pro League Hall of Fame light (sprint 1.E.5)
- server,web: Pro League bet leaderboard (sprint 1.D.8)
- server,web: Pro League Gazette models + UI (sprint 1.E.2)
- server,web: SEO metadata + Pro League healthcheck (sprint 1.F.2)
- server: Pro League LLM Gazette daily generation (sprint 1.E.1)
- server: Pro League rookie generator + seed + replenish (sprint 1.E.6)
- server: Pro League storyline detector + Gazette daily recap (sprint 1.E.3)
- turnstile: injecte NEXT_PUBLIC_TURNSTILE_SITE_KEY au build Next.js
- web: Pro League betting UI (sprint 1.D.7)
v1.90.0
✨ Features
- admin: UI lecture des replays panel pour validation C6-C9
- db: Pro League bet markets + bets + settlements (sprint 1.D.2)
- db: Pro League Prisma models (sprint 1.A.1)
- mobile: i18n des popups in-match (S27.3.14)
- mobile: i18n play/[id] screen (sprint S27.3.13)
- mobile: S27.3.12 — i18n migration of player detail screen
- server,db: Pro League wallet + transaction ledger (sprint 1.D.1)
- server,web: Pro League detailed standings page (sprint 1.C.5)
- server,web: Pro League fan follow + feed (sprint 1.C.4) , closes #609 #611 #612 #610
- server,web: Pro League hub page (sprint 1.C.1)
- server,web: Pro League match detail page (sprint 1.C.3)
- server,web: Pro League team detail page (sprint 1.C.2)
- server: activate Pro League sim runner cron at boot , closes #600
- server: engine version policy + replay freeze (sprint 1.A.5)
- server: Pro League bet endpoints (sprint 1.D.4)
- server: Pro League bet settlement + cron (sprint 1.D.5)
- server: Pro League match broadcaster (sprint 1.B.1)
- server: Pro League odds calculator (sprint 1.D.3)
- server: Pro League scheduler service (sprint 1.A.3)
- server: Pro League sim runner service (sprint 1.A.4)
- server: Pro League wallet rewards + endpoints (sprint 1.D.6)
- server: SSE endpoint /pro-league/matches/:id/stream (sprint 1.B.2)
- sim-engine,db: Replay storage + compression CBOR + gzip (sprint 1.A.2)
- sim-engine: tuning iter #10 — engineVer 0.11.0 (breakthrough 16% + 8 Nuffle casualty events) — pause user
- sim-engine: tuning iter #11 — engineVer 0.12.0 (breakthrough 18% + TV delta bonus → C1 5/5 ✓)
- sim-engine: tuning iter #12-16 — engineVer 0.13.0 (TV recalibration → C2 atteint sur Ogres vs Halflings) , closes #12-16 #12-16 #13-14 #15-16
- sim-engine: tuning iter #6 — engineVer 0.7.0 (breakthrough 8% + nemesis_clash casualty)
- sim-engine: tuning iter #7 — engineVer 0.8.0 (breakthrough 10% + +40 vs soft D + tantrum/cocky casualties)
- sim-engine: tuning iter #8 — engineVer 0.9.0 (breakthrough 12% + crowd_riot 50% + Halflings tv 850)
- sim-engine: tuning iter #9 — engineVer 0.10.0 (breakthrough 14% + TV gap cap 200) — 2 matchups en cible C1
- web: Pro League Pixi field visualization (sprint 1.B.3) , closes #606 #606 #606
📝 Documentation
- panel: regenerate 50 panel replays on engineVer 0.12.0 , closes #11 #11
v1.89.1
🐛 Bug Fixes
- nav: Soutenir en nuffle-red (#7A1F1F) au lieu du gris , closes #7A1F1
v1.89.0
✨ Features
- sim-engine: tuning iter #4 — engineVer 0.5.0 (defensive disruption + bash /25 + breakthrough +30) , closes #3 #5
- sim-engine: tuning iter #5 — engineVer 0.6.0 (Nuffle casualty injection + bash /28 + breakthrough 6%)
🐛 Bug Fixes
- admin: conditionne le lien Ligues au feature flag leagues_v2_ui
v1.88.0
✨ Features
- mobile: S27.3.11 i18n teams detail screen (FR/EN)
- nav: refonte menus principal et utilisateur (Option A)
- sim-engine: tuning iter #2 — engineVer 0.3.0 (block→armor + tv per team + bash counter + fat-tails)
- sim-engine: tuning iter #3 — engineVer 0.4.0 (upset metric fix + bash recalibration) , closes #2
v1.87.0
✨ Features
- sim-engine: tuning iteration #1 — race-aware LOS + pace yards (0.E.1)
🐛 Bug Fixes
- admin: add missing Ligues link in admin sidebar nav
📝 Documentation
- pro-league: gate Phase 0 → Phase 1 — closes Phase 0 (0.E.4)
- pro-league: kit panel BB experts (sprint 0.E.3)
v1.86.0
✨ Features
- sim-engine: replay sampling tool — pnpm sim:replay (0.E.2)
v1.85.0
✨ Features
- admin: petit utilitaire admin pour simuler des paires Pro League
- initialize @bb/sim-engine package with public API
- mobile: i18n auth screens (login/register) — S27.3.5
- mobile: i18n leaderboard screen — S27.3.7
- mobile: i18n matchmaking screen — S27.3.6
- mobile: i18n teams list screen — S27.3.8
- mobile: i18n teams new screen — S27.3.9
- mobile: S27.3.10 — script audit i18n (baseline 42 strings)
- mobile: S27.3.3 i18n sub-components settings/*
- mobile: S27.3.4 refactor lobby.tsx + i18n lobby.* complet
- shared-types: typed MatchEvent format with EventType catalogue (Pro League 0.A.3)
- sim-engine: 16 profils raciaux Pro League (0.B.3)
- sim-engine: BB action resolvers (block/dodge/pass/pickup/gfi/foul) — Pro League 0.A.5
- sim-engine: behavior tree 3-passes + 6 strategies + 5 patterns — closes lot B (0.B.1)
- sim-engine: bibliothèque Eye of Nuffle (28 events scriptés) (0.C.1)
- sim-engine: CI bench regression gate — closes lot D (0.D.4)
- sim-engine: CLI pnpm sim:bench (runner + formatter + report) (0.D.1)
- sim-engine: cross-match PlayerForm avec decay sur 3 matchs — closes lot C (0.C.4)
- sim-engine: dataset référence FUMBBL versionné (0.D.2)
- sim-engine: hooks injection Nuffle events dans le driver (0.C.2)
- sim-engine: hybrid driver — closes lot A (Pro League 0.A.2)
- sim-engine: IA temperature softmax pilotée par riskAppetite (0.B.5)
- sim-engine: métriques vivacité (variance, fat-tails, Gini, upset rate) (0.D.3)
- sim-engine: per-player momentum tracker hot/normal/cold (0.B.4)
- sim-engine: seeded xoroshiro PRNG + ban Math.random (Pro League 0.A.4)
- sim-engine: TacticalProfile + Zod schema (Pro League 0.B.2)
- sim-engine: underdog variance boost (TV gap > 200, +10%) (0.C.3)
🐛 Bug Fixes
- docker: add sim-engine and shared-types package.json to server Dockerfile
📝 Documentation
- archive Ligues v2 optional extensions to future-ideas
v1.84.0
✨ Features
- Add admin leagues management console (L2.C.6)
📝 Documentation
- add new sprints for leagues v2 and Pro League
- add Pro League sprint and future ideas backlog
- Update TODO roadmap — Ligues v2 sprint completion
v1.83.0
✨ Features
- server: update skill descriptions for Season 3 in French and English
v1.82.0
✨ Features
- Add player advancement UI (level-up page & banner)
- leagues: PR6 Bagarreurs Brutaux override + integration tests (L2.B.8-B.9)
v1.81.0
✨ Features
- coach-profile: CoachEloChart inline SVG curve on /coach/{slug} (S26.3n)
- coach-profile: export PDF coach-card on /coach/{slug} (S26.3o, closes S26.3)
- coach-profile: monthly Nuffle Cup champion badge backend (S27.1d)
- coach-profile: monthly Nuffle Cup champion badge UI (S27.1e)
- coach-profile: themed championships badge backend (S26.6d)
- coach-profile: themed championships UI banner on /coach/[slug] (S26.6e)
- cups: admin can create monthly Nuffle Cups via POST /cup (S27.1i)
- cups: admin pick endpoint for match-of-the-week (S27.1g)
- cups: match-of-the-week public read foundation (S27.1f)
- cups: match-of-the-week UI banner on /cups/monthly (S27.1h)
- cups: monthly Nuffle Cup slot foundation (S27.1a)
- cups: public listing of monthly Nuffle Cups (S27.1b)
- cups: public monthly Nuffle Cup calendar UI /cups/monthly (S27.1c)
- cups: visual bracket view on /cups/[id] (S27.1j, closes S27.1)
- leagues: PR2 UI — flag-gated UI for league management (L2.A.6-A.10)
- leagues: seasonal themes foundation on LeagueSeason (S26.6a)
- leagues: theme read endpoints + season creation propagation (S26.6b)
- leagues: themed season closure hook (S26.6f, closes S26.6)
- leagues: themed seasons calendar UI /leagues/seasons (S26.6c)
- mobile: i18n foundation (FR/EN) without external dep (S27.3.1)
- mobile: integrate Throw Team-Mate flow on play screen (S27.2.2, closes S27.2)
- mobile: port Throw Team-Mate click helper foundation (S27.2.1)
- mobile: useTranslation hook + i18n settings.tsx (S27.3.2)
- notifications: friend-match-started notification + user pref (S26.5)
- s3-data: apply OCR-canonical Saison 3 data (skills, special rules, leagues)
🐛 Bug Fixes
- leagues: mirror LeaguePairing model + Match league fields in SQLite schema , closes #536
📝 Documentation
- roadmap: S26 termine
v1.80.0
✨ Features
- extraction: add OCR transcriptions for Blood Bowl rules, skills, and traits
- friends: listAcceptedFriendIds helper (S26.5b)
v1.79.0
✨ Features
- coach-profile: EloSnapshot model + persist on match end (S26.3l)
- coach-profile: GET /coach/:slug/elo-history endpoint (S26.3m)
- friends: suggestFriendsByElo + /friends/suggestions route (S26.5a)
v1.78.0
✨ Features
- achievements: celebration banner + NEW badge on lazy unlock (S26.2b)
- achievements: expose newlyUnlocked slugs on lazy read (S26.2a)
- achievements: match-end celebration panel + CTA (S26.2c)
- coach-profile: coach-slug derivation utility (S26.3a)
- coach-profile: getCoachPublicProfile service (S26.3b)
- coach-profile: list public coach slugs + sitemap integration (S26.3g)
- coach-profile: privacy toggle endpoint + GET /me exposes privateProfile (S26.3j)
- coach-profile: private profile toggle on /me/profile (S26.3k)
- coach-profile: public /coach/[slug] page with header (S26.3d)
- coach-profile: public GET /coach/:slug route (S26.3c)
- coach-profile: recent teams section (S26.3h)
- coach-profile: RGPD private profile opt-in (S26.3i)
- coach-profile: showcase achievements service (S26.3e)
- coach-profile: wire showcase achievements end-to-end (S26.3f)
- friends: autocomplete search endpoint /friends/search (S26.4c)
- friends: findUserByCoachName resolver for @username (S26.4a)
- friends: FriendUsernameAutocomplete reusable component (S26.4d)
- friends: POST /friends accepts {username} via @-resolver (S26.4b)
- tutoriel: badge unlock + completion timestamp (S26.1a)
- tutoriel: global XP progression bar on listing page (S26.1c)
- tutoriel: recommended teams panel after completion (S26.1b)
♻️ Code Refactoring
- match: migrate POST /:id/move to ApiResponse (S25.5m)
- play: extract BlockingOverlays + MatchOverlays (S26.0x, DoD < 600 lignes ATTEINT)
- play: extract BoardSection (S26.0v, ~70 lignes restantes vers 600)
- play: extract ChoicePopups (5 popups, -121 lignes) (S26.0u)
- play: extract getAvailableActions util (S26.0j)
- play: extract handleBlockClick branch (S26.0r)
- play: extract handleMoveClick branch (S26.0s)
- play: extract handlePlayerClick util (S26.0m)
- play: extract handleSetupCellClick branch (S26.0p)
- play: extract handleSetupDragStart util (S26.0n)
- play: extract handleSetupDrop util (S26.0o, < 1000 lignes)
- play: extract handleThrowTeamMateClick branch (S26.0q)
- play: extract InducementsPhaseUI + normalizeState (S26.0a)
- play: extract InGameListeners components (S26.0b)
- play: extract kickoff-actions API helpers (S26.0d)
- play: extract KickoffSequencePanel component (S26.0g)
- play: extract MatchLogAndSpp section (S26.0w, ~46 lignes restantes)
- play: extract PlayerActivationBar component (S26.0k)
- play: extract PreMatchPanel composite (S26.0t, > 50% reduction)
- play: extract setup-validation utils (S26.0c)
- play: extract SetupPhasePanel component (S26.0h)
- play: extract ThrowTeamMateIndicator + applyOrSubmitMove (S26.0i)
- play: extract TopStatusBanners components (S26.0l)
- play: extract validateSetupPlacement helper (S26.0e)
- play: introduce LegalAction, eliminate all 13 as any (S26.0f)
- team: migrate /name-generator + /rosters/:id to ApiResponse (S25.5n)
- team: migrate /team/:id/available-positions to ApiResponse (S25.5s)
- team: migrate /team/:id/recalculate to ApiResponse (S25.5r)
- team: migrate /team/:id/star-players to ApiResponse (S25.5q)
- team: migrate /team/available to ApiResponse (S25.5o)
- team: migrate /team/mine paginated to ApiResponse (S25.5p)
- team: migrate DELETE /:id/players/:playerId to ApiResponse (S25.5t)
- team: migrate DELETE /:id/star-players/:starPlayerId to ApiResponse (S25.5v)
- team: migrate GET /:id/available-star-players to ApiResponse (S25.5aa)
- team: migrate GET /team/:id + close S25.5 + S25 TERMINE (S25.5ae)
- team: migrate POST /:id/players to ApiResponse (S25.5z)
- team: migrate POST /:id/purchase to ApiResponse (S25.5w)
- team: migrate POST /:id/star-players to ApiResponse (S25.5ab)
- team: migrate POST /team/build to ApiResponse (S25.5ad)
- team: migrate POST /team/choose to ApiResponse (S25.5x)
- team: migrate PUT /:id/info to ApiResponse (S25.5u)
- team: migrate PUT /:id/players/:playerId/skills to ApiResponse (S25.5ac)
- team: migrate PUT /team/:id to ApiResponse (S25.5y)
v1.77.1
🐛 Bug Fixes
- server,engine: adapt setup checks to placeable count below 11
♻️ Code Refactoring
- match: migrate /:id/state to ApiResponse (S25.5l)
v1.77.0
✨ Features
- auth: wire access+refresh rotation into login/register/logout (S24.3e)
🐛 Bug Fixes
- keep KO/sent-off/casualty out of post-TD setup, allow validate <11
♻️ Code Refactoring
- match: migrate /:id/summary to ApiResponse (S25.5k)
- match: migrate /details, /:id/details, /:id/teams to ApiResponse<T> (S25.5j)
v1.76.3
🐛 Bug Fixes
- engine: compute legalSetupPositions on post-touchdown
v1.76.2
♻️ Code Refactoring
- match: migrate GET routes to ApiResponse<T> envelope (S25.5i)