Back to Home

Changelog

Recent updates, fixes, and enhancements across Galactic Shockball League.

Last updated: Nov 24, 2025, 7:21 AM

2025-11-23

Fixed

  • Next15 Cookie loading - Fixed issue where cookie loading was not working correctly in Next15
Simulation Engine (V2)
  • Defender Dead Zone Fix - Defenders now correctly enter tackle range (targeting 8 units) instead of getting stuck at the edge (12 units)
    • Updated positioning logic to ensure defenders can close the final gap to attempt tackles
    • Fixes issue where defenders would track ball carriers without engaging in V2 matches

2025-11-21

Added

  • Trading Card Holographic Effects - Added CSS-based 3D tilt and holographic visual effects to player trading cards with glare and foil layers that respond to mouse movement; effects scale with player rarity (superstar/star/prospect) and respect accessibility preferences

2025-11-20

Fixed

  • Training Minigame - Fixed regression where game failed to start due to premature canvas check introduced in energy glitch fix

2025-11-19

Added

  • Exhibition Mode - Added "Exhibitions" view to League Dashboard allowing users to view exhibition matches separately from league competitions; player statistics now filter correctly based on competition type (FRIENDLY vs LEAGUE)

Fixed

  • Team Stats Accuracy - Included deflected shots (rebounds) in team save statistics and corrected save attribution to guards
  • Replay Score Display - Fixed issue where Replay Header score could be incorrect (e.g., 1-9 instead of 2-9) by improving score calculation logic to handle missing score data in event logs
  • Training Energy Glitch - Fixed bug where energy was consumed for training sessions that failed to initialize; implemented pre-flight validation to prevent energy deduction before safe start
Simulation Engine (V2)
  • Foul Stun Mechanics - Fixed simulation engine issue where foul stuns could be overwritten or cleared prematurely, and updated replay visualization to correctly show foul-induced stuns.

2025-11-11

Added

  • League Calendar Card - Added upcoming matches calendar card to league dashboard showing next 7 days of scheduled matches
  • League Matches Filtering - Added Team, Division, and Conference filter dropdowns to League Matches page for easier match discovery
  • Sortable Match Columns - Made Date, Division, and Status columns sortable in League Matches table
  • Team Schedule Tab - Added Schedule tab to team pages displaying team-specific calendar view of matches and events

Changed

  • League Matches Table - Improved match display with date/time formatting, better team layout (teams on sides with "vs" in middle), and clickable team names linking to team pages
  • League Matches Layout - Removed Competition column from matches table (redundant since viewing within a specific league)

Fixed

  • Match Replay Table Sorting - Fixed infinite re-render loop causing page freeze when sorting Match Data tab tables in Match Replay
  • League Competition Views - Fixed duplicate key errors when displaying League Competitions with teams from multiple conferences
  • Players Statistics View - Fixed Prisma serialization errors preventing Statistics tab from loading; implemented in-memory data joining and fixed column sorting
  • League Competition Match Generation - Fixed bug where matches were not being generated correctly for League Competitions

2025-11-09

Changed

Team Management
  • Lineup Presets - Removed 3-preset limit, improved save/update behavior with clearer button labels, and fixed preset persistence after updates
Simulation Engine (V2)
  • Pass Frequency Respect - Pass frequency of 0 now fully respected (no forced minimum pass weights)
  • Pass Fatigue System - Recent passes reduce pass likelihood (40% reduction per pass in last 3 turns, naturally limits excessive chains)
  • Enhanced Situational Awareness - Players strongly prefer advancing when they have open paths to goal instead of passing

Fixed

  • Database Connection Pool Exhaustion - Increased Prisma connection pool from 5 to 20 connections to prevent timeout failures under moderate load
    • Addresses Nov 7-8 production incident where users experienced 502/503 errors and forced logouts
    • Increased pool timeout from 10s to 30s to accommodate complex queries

2025-11-06

Changed

Simulation Engine (V2)
  • Conditional Guard Movement - Guards now adjust positioning based on opponent threat
    • Guards can move forward when opponents are not threatening the goal
    • Guards automatically retreat when opponents approach the goal
    • Creates more dynamic defensive positioning that responds to game state
  • Backward Passes for Possession Retention - Players can now pass backwards when tactically advantageous
    • Backward passes allowed when forward options are heavily defended or backward teammate has significantly better positioning
    • Forward passes remain preferred when options are comparable
    • Enables more realistic tactical play and better possession retention under pressure
  • Wing Lane Discipline - Left and right wings now maintain designated lanes with tactical flexibility
    • Left wings prefer left lane (y: 5-20), right wings prefer right lane (y: 40-55)
    • Wings can tactically cross over when ball carrier is on opposite side and support is needed
    • Prevents wing clustering by detecting when both wings are in same area and prioritizing width creation
    • Defensive phase allows looser lane discipline (marking opponents takes priority over lane position)

2025-11-05

Fixed

  • Add cache busting to Division/Conference images
Simulation Engine (V2)
  • Guard Wandering Regression - Fixed guards wandering too far forward, leaving goals exposed
    • Tightened positioning limits by low awareness, medium, high
    • Added defensive third safety constraint preventing guards from exceeding boundary
  • Tackle Decision Logic Enhancement - Tackle Frequency is now the primary factor in tackle attempts
    • Players with high Tackle Frequency will attempt tackles regardless of Aggression stat
    • Makes Tackle Frequency playstyle setting more impactful and consistent
    • Aggression now acts as a secondary modifier rather than equal partner in tackle decisions
Simulation Engine (V1 & V2)
  • Automatic Shooting in Goal Zone - Players now automatically shoot when very close to goal instead of running into the goal without shooting
    • Prevents players from advancing past the goal line without attempting a shot
    • Fixes issue where ball carriers would "hang out" in the goal zone waiting to be tackled
  • Stunned Player Blocking Fix - Fixed bug where stunned guards block shots, and stuns reset after goals
    • Stunned guards cannot block regardless of position (fixes issue where stunned players could still intercept shots)
    • Stuns clear when goals are scored to allow clean gameplay reset after scoring

2025-11-03

Fixed

  • Player Energy Recovery in Scheduled Matches - Fixed intermittent bug where some players started matches with low energy
    • Bug affected players who trained before a match but didn't log in before the scheduled match ran
    • Scheduled matches now properly calculate energy recovery (1 point per 6 minutes) instead of using stale values
    • Example: Player with 9.7 hours between training and match started at 4% energy instead of 100%
    • Most players were unaffected because logging in between activities updated energy correctly

2025-11-02

Changed

Simulation Engine (V2)
  • Guard Positioning Discipline - Guards now use Awareness stat for defensive positioning intelligence
    • High-awareness guards maintain strict defensive positioning near goal
    • Low-awareness guards may wander forward and leave goal exposed
    • Makes Awareness a critical stat for guards in V2 matches

2025-11-01

Added

  • Audio Accessibility for Training Mini-Game - Vision-impaired users can now play with audio guidance
    • Positional audio tones change frequency based on bar position (low/medium/high pitch for miss/good/perfect zones)
    • Haptic vibration feedback on mobile devices when entering perfect zone
    • Toggle controls with optional visual bar hiding for audio-only mode
    • Uses Web Audio API with 30% default volume (users control via device volume)
    • Improved to continuous proximity-based frequency gradient (200Hz → 1000Hz) for anticipation instead of reactive feedback,
    • fixed mid-game toggle bug when audio is toggled off/on

Changed

Simulation Engine (V2)
  • Tackle Range Adjustment - Balanced tackle frequency based on community feedback
    • tackle range adjusted from 8 units to 12 units (V1 unchanged at 20 units)
    • Addresses community reports of too few tackles in V2 (8 was overcorrection from 20)
    • Updated documentation to distinguish V2 and V1 tackle mechanics

Changed

  • Major Framework Updates - Upgraded to latest stable versions
    • Next.js 14.1.0 → 15.5.6, React 18 → 19.2.0, pixi.js 7.4.3 → 8.14.0
    • GitHub Actions updated: checkout@v5, setup-node@v6, docker/build-push-action@v6, ssh-action@v1.2.2
    • Updated react-markdown to v10, removed @types/bcryptjs (now has built-in types)
  • Galaxy Map Enhancements - Improved zoom/pan UX with smooth inertial scrolling
    • Territory borders now use Catmull-Rom Bezier curves for organic, rounded shapes
    • Smoother animation with spring physics (0.12 damping factor)
  • Dependabot Configuration - Automated dependency updates now grouped by version type (minor/patch together, major separate)

2025-10-31

Fixed

  • Team Venue images not being editable in /team/me view.
  • Fixed player avatar upload in production (missing SPACES_* env vars) and caching issues with timestamped filenames
  • Fixed team venue and logo image uploads not displaying immediately after upload (cache busting + path revalidation)
  • Fixed admin league edit navigation 404 error from leagues grid
  • Migrated all avatar display/update code from swcAvatarUrl to avatarBlob (15+ files) with backward-compatible JWT sessions

2025-10-30

Changed

  • Image Infrastructure Migration - All images now served from unified CDN for improved reliability and performance
    • Player avatars, team logos/venues, league/conference images consolidated to single source
    • Eliminates external image loading failures and improves page load times
    • Enhanced WebGL support for galaxy map team logo rendering

2025-10-29

Added

  • Interactive Galaxy Map Visualization - Dashboard map showing teams positioned on home planets
    • Smooth pan/zoom with team markers displaying logos and division color borders
    • Hover to enlarge (6x scale), click for team details popup with owner/manager/division/conference/faction info
    • Conference/Division filtering sidebar (desktop) and bottom sheet (mobile) with real-time map updates
    • Division territory overlay layer showing division-color-coded regions for each division (convex hull with padding)

Fixed

  • Galaxy map orientation (north/south inversion corrected)
  • Image proxy caching increased to 7 days to reduce external API rate limit errors (429)
  • Team popup accessibility warning and broken external image loading
  • Automatic background download of external team logos to blob storage to eliminate rate limiting
  • Duplicate logo downloads prevented with in-memory locking and debounce mechanisms
  • Team popup links in the galaxy map now correctly navigate to player pages (using Player ID) and division/conference pages
  • Conference images now display in galaxy map filter sidebar with proper vertical alignment

2025-10-28

Added

  • Match Replay Data Export and API - Access structured match data for external analysis
    • New API endpoint /api/v1/data/matches/{id}/replay-data with turn-by-turn events, player stats, and detailed context metrics
    • 304 Not Modified caching (free, doesn't count against rate limits) using If-Modified-Since header
    • Match Data Tab in replay UI with sortable, paginated tables for player statistics and event log
    • CSV Export System with separate exports for player stats only or events only
    • Shots Tracking - New database field with historical backfill from match events, tracked in v1/v2 simulation engines
    • Comprehensive OpenAPI documentation with example responses

Fixed

  • Player Statistics Accuracy - Teams & Energy panel now correctly aggregates stats from events
    • Passes: Only counts completed passes (not all attempts)
    • Blocks: Counts saves from SHOT events with save outcomes
    • Added INTERCEPTION event support for block counting
  • Admin Matches List - Added pagination (50 per page) and fixed sorting to show recent matches first

Documentation

  • Created future story: "Track Pass Attempts vs Completed Passes"

2025-10-27

Fixed

Simulation Engine (V2)
  • Player roster tracking: Benched players no longer incorrectly positioned or acting during matches
  • Energy loading: Player energy values now properly load from database instead of defaulting to 100%
  • Movement calculation: Player movement now correctly based on Speed stat with position role modifiers
    • Centers fastest, Guards moderate, Wings balanced
    • Movement speed increased ~11% (Speed/9 vs Speed/10) to prevent slow advancement causing excessive long-distance shots
  • Shot selection: Further penalized 40+ unit shots to discourage half-field shooting attempts
    • 40-45 units: 0.05× weight multiplier
    • 45-55 units: 0.02× weight multiplier
    • 55+ units: 0.005× weight multiplier (virtually eliminated)
  • Guard blocking range: Dynamic range scales with Speed and Blocking stats
    • Elite guards (high stats in both) can cover significantly wider angles
    • Players can't block beyond what they can physically reach
Simulation Engine (V1 & V2)
  • Guard blocking positioning: Guards must now be between shooter and goal to attempt blocks
    • Prevents unrealistic blocks from penalty box (behind goal)
    • Guards must be closer to goal than shooter and within blocking range of shot path
    • V1: Fixed 15 unit blocking range for all guards
    • V2: Dynamic range based on player stats (see V2 section above)
    • Creates tactical advantage when shooting with guard out of position
  • Stun mechanics persistence: Stunned players correctly remain stunned through goals and restarts
    • Stun effects (tackle cooldown timers) no longer cleared on goal/restart events
    • Reflects realistic recovery time needed after hard tackles
  • Substitution timing: Players no longer substitute during critical game moments
    • Both teams' substitutions suspended when ball in attacking/defensive zones (within 35 units of either goal)
    • Substitutions only occur in neutral middle third of field (x: 35-65)
    • Prevents immersion-breaking scenarios (guards subbed before shots, attackers pulled during scoring chances)

2025-10-25

Added

  • Simulation Versioning System - Multiple simulation versions can coexist for competitive stability and continuous innovation
    • Competition version lock-in: Each competition selects and locks simulation version for entire season
    • Match version stamping: Every match records which simulation version was used
    • Admin UI control to set system-wide default simulation version
    • Competition creation includes simulation version selector (defaults to GlobalConfig setting)
    • Exhibition match creation allows version selection for testing
    • Comprehensive documentation system (/docs/sim-versions/) with v1/v2 mechanics comparison
    • Version-specific test suites validate unique mechanics for each version
    • All existing matches and competitions automatically stamped as v1 for backward compatibility
    • Enables teams to test new simulation versions in practice matches without affecting competitive play

2025-10-22

Added

  • Contract Termination System - Two-way mutual agreement process for terminating player contracts
    • Team Owners/Managers can initiate termination for active contracts
    • Players can initiate termination of their own active contracts
    • Dashboard notifications display pending termination requests for both parties
    • 7-day response window with automatic acceptance if no response received
    • Players become free agents upon contract termination
    • Global activity feed tracks CONTRACT_TERMINATED events
  • Last Training Activity Column - Team Owners/Managers can now see when players last trained on the Team Contracts page
    • Displays relative time format (e.g., "1 week ago", "2 days ago", "4 hours ago", "Never")

Fixed

  • Match Replay Avatar Caching - Fixed excessive bandwidth consumption (~1GB) during match replay viewing
    • Modified Caddy reverse proxy configuration to exclude image API endpoints (/api/images/*, /api/team/images/*) from blanket no-cache rule
    • Player avatar images now properly cache with long-term headers (Cache-Control: public, max-age=31536000, immutable)
    • Eliminates avatar flickering and continuous reloading during replay playback
    • Reduces match replay bandwidth consumption by ~95% (from ~1GB to <50MB)
    • Special thanks to Kaire Nat-Sa for discovering and reporting this issue!

Security

  • Added GitHub Dependabot configuration for automated dependency updates and security vulnerability monitoring (npm, Docker, GitHub Actions)

2025-10-21

Changed

  • Exhibition Matches (/league/friendlies) now uses server-side pagination (10 items per page) with independent pagination for upcoming and completed matches, and scroll-to-section behavior to maintain user context during navigation.

2025-10-20

Added

  • Public Data API (v1) for external access to match schedules, results, and game information
    • RESTful endpoints at /api/v1/data/matches/upcoming and /api/v1/data/matches/recent
    • API key authentication system with bcrypt hashing and rate limiting (100 requests/hour per key)
    • Rate limit headers (X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset) included in all responses
    • Competition Type Filtering: competitionType query parameter supports ALL (default), FRIENDLY, DIVISION, CONFERENCE, LEAGUE
    • HTTP Conditional Requests (RFC 7232) support using If-Modified-Since header
      • Clients can send cached timestamp to check for data freshness
      • Server returns 304 Not Modified when data unchanged (no body, saves bandwidth)
      • 304 responses are FREE — don't count against rate limits (inspired by Eve Online ESI API pattern)
      • Match data freshness tracked via MATCH_DATA_LAST_MODIFIED in GlobalConfig
      • Automatically updated when scheduled cron processes matches (every 15 minutes)
      • Enables efficient polling for real-time updates without burning API quota
      • Last-Modified and Cache-Control: public, max-age=900 headers included in all responses
      • Rate limit headers accurately reflect usage after each request
    • Comprehensive Swagger/OpenAPI documentation at /api-docs with interactive "Try it out" functionality
    • Admin interface at /admin/api-keys for API key lifecycle management and usage monitoring
    • Public data filtering layer ensures no private Team Owner/Manager information is exposed
    • Designed for third-party integrations: stats sites, betting services, fan apps, Discord bots, mobile apps, and more
    • Note: API provides read-only access to public game data; betting operations are managed externally by third parties to maintain neutrality

2025-10-19

Added

  • In-depth simulation mechanics documentation for Passing, Shooting, Tackling, and Advancing
  • Playstyle Preferences documentation explaining how Pass/Shoot/Tackle Frequency sliders influence simulation action selection
  • Table of Contents with anchor links

Changed

  • Shot deflection commentary now credits guard (e.g., "Guard deflects Shooter's shot — creates a rebound")
  • Playstyle Frequencies UI improved: Changed from 0-100 to 0-10 discrete scale with tick marks, "Less Often"/"More Often" labels, and enhanced slider thumb

Fixed

  • Stats Tracking Bugs (Story 6.4):
    • Goals now generate both GOAL and SHOT events for accurate shot statistics
    • Saves now generate both SAVE and SHOT events for accurate shot statistics
    • Block stats now correctly credited to guard instead of shooter
    • Team shot totals now include all shot attempts including goals
  • DevOps:
    • Add a prune command for all unused Docker images (as opposed to only dangling)

2025-10-14

Added

  • Stunned player restrictions in match simulation:
    • Stunned players cannot make tackles while stunned
  • Trading card jersey number customization:
    • Players can now edit their jersey number (0-99) in the trading card customization modal

Changed

  • Remove TradingCard CRT-scanline effect filter layer
  • Calendar event display in Month/Week views:
    • Team names now show as first-letter acronyms for compact display
    • Match type badges show as single letters: "E" (Exhibition) or "L" (League)

Fixed

  • Calendar data caching optimization:
    • Month navigation now works correctly (added missing date prop to BigCalendar component)
  • Back button for Match Replay now works correctly in new tab
  • Prevent Recent Activities dashboard event duplication

2025-10-13

Added

  • Training focus privacy controls (outcome from 1st Poll):
    • Training focuses and active boosts now only visible to player owner and teammates
    • Non-teammates see only skill levels and XP progress
  • Stunned player restrictions in match simulation:
    • Stunned players cannot receive passes during stun duration (cooldown period after being tackled)
    • Stunned players cannot be substituted out while stunned, even with low energy
  • Match replay navigation:
    • Added Exit button to match replay interface for easy navigation back to previous page

Changed

  • Match replay commentary UI:
    • Commentary section now uses full available viewport height and compact layout for better space utilization
    • Scroll position preserved when switching between Commentary and Teams & Energy tabs
  • Exhibition matches (/league/friendlies) team names are now clickable links to team pages

Fixed

  • Training minigame energy exploit prevention:
    • Users can no longer refresh/reset during minigame to avoid energy costs
  • Players table Name column sorting on /league/players route now works correctly
  • Removed non-functional "View Match Details" button from Next Match section on /team/me (route doesn't exist for upcoming matches)
  • TimeZoneDisplay component prevented from breaking minification with invalid HTML nesting
  • Broken minigame for Safari browser fixed
  • Missing scroll for Teams & Energy panel in Match Replay

2025-10-12

Added

  • League Calendar UI component:
    • Full calendar view (/calendar) with Month, Week, Day, and Agenda views showing matches and custom events
    • Dashboard calendar card with upcoming events preview
    • Admin calendar management (/admin/calendar) for creating/editing custom events (CUSTOM, TEAM_FORMATION_DEADLINE, COMPETITION_START, COMPETITION_END, MAINTENANCE)
    • Timezone-aware display with user's local timezone indicator
    • Server-side caching with 5-minute TTL and smart invalidation for ~75% performance improvement

Fixed

  • Timezone consistency across entire application:
    • Admin match management page now displays times in user's local timezone (was showing raw toLocaleString())
    • Challenge accepted messages now show match date in user's timezone
    • Context card "Match Tomorrow" notification uses timezone-aware display
    • League matches list displays dates in user's local timezone
    • Competition detail match times show in user's timezone (both user and admin views)
    • Replay event timestamps use consistent 24-hour format
    • All date/time displays now use TimeZoneDisplay component or formatTimeWithZones() utility for consistency

2025-10-11

Added

  • Team player limits and substitute queue capacity controls:
    • Enforced maximum of 18 players per team with atomic validation to prevent race conditions
    • Limited substitute queues to 3 players per position (Center, Left Wing, Right Wing, Guard)
    • Contract offers automatically expire when teams reach capacity to prevent impossible scenarios
    • UI capacity indicators show "X/18 players" and "X/3 substitutes" with visual warnings when approaching limits
    • Comprehensive validation across player creation, contract acceptance, and team management flows
  • Energy substitution improvements for strategic rotation:
    • Benched players now show real-time energy recovery in match replays (TURN_UPDATE events include all players, not just active)
    • Multiple substitution capability: players can return to play after recovering to 60%+ energy (or their endurance-based max, whichever is lower), enabling continuous rotation
    • Outgoing players added to end of substitution queue for strategic rotation instead of one-time substitutions
    • Bench recovery rate increased from 2 to 3 energy per turn to prevent team-wide exhaustion
    • Enhanced performance penalties for very low energy (<10%): severe penalties incentivize substitutions
    • Lineup page energy tooltips now explain performance impact at different energy levels
    • Active player position badges (C, LW, RW, G) in Teams & Energy panel with accurate substitution tracking
  • Match Replay Data Display and Statistics Enhancement:
    • Goals (G) and Blocks (B) statistics now tracked and displayed in Teams & Energy panel
    • Game Summary component shows collapsible overview of goals (with scorer names and turns), shots, and fouls
    • Team Statistics Overview component displays match record, goals scored/conceded, and performance metrics on team management page
    • Info tooltip with player statistics legend (S, P, T, F, G, B abbreviations) next to Teams & Energy panel header
    • Player avatars now display inline within match commentary text for all involved players
    • Enhanced commentary includes goal scorer names and turn numbers for key events

Changed

  • Team management page (/team/me) layout improvements:
    • Team header (logo, name, venue, owner/manager, stadium) moved above tabs for persistent visibility
    • Team Statistics and Next Match sections moved above tabs to be always visible
  • Match commentary filtering:
    • Zero-unit advance events (< 0.5 units) now filtered from commentary to reduce noise
  • Admin matches view:
    • Recent Completed Matches now displays with newest matches at the bottom (chronological order)

Fixed

  • Critical energy system bugs affecting match simulation:
    • CRITICAL: Fixed currentEnergy: 0 being treated as falsy - Changed || to ?? operator to preserve 0 as valid energy value
    • CRITICAL: Fixed energy recovery reducing players above their endurance cap (e.g., 100% → 60% for 12 endurance) - Recovery now never reduces current energy, only caps gains at endurance * 5
    • CRITICAL: Fixed substitution rotation lockup where players couldn't be substituted back in after match begins - Players are no longer removed from team rosters during substitution, preventing "player not found" errors that blocked rotation
  • SECURITY: Poll duplicate voting vulnerability:
    • Removed anonymous polling feature that allowed unlimited duplicate votes due to userId: null bypassing duplicate detection
  • Player avatar consistency in match replay:
    • ReplayArena now uses getUserAvatarUrl helper for consistent avatar rendering across lineup and review contexts
  • Dark mode styling for challenge notifications:
    • All friendly challenge notification elements now properly styled with dark mode classes for readability
  • Save rebound events now include guard in playersInvolved array for proper stat tracking
  • Match commentary "View metrics" functionality:
    • Players can now see the "View metrics" behind why a tackle was resisted

2025-10-09

Fixed

  • Player energy display and substitution timing issues in match simulation:
    • Fixed energy synchronization bug where substitute players entering game had stale currentEnergy values
    • Fixed substitution event context to show actual low energy (<20) that triggered substitution instead of post-substitution values
    • Changed substitution threshold check to use canonical Map energy value instead of potentially stale player.currentEnergy
    • Eliminated impossible energy jumps (1% → 87% in 4 turns) through proper energy synchronization
    • Substitute players now correctly display high energy (95-100%) when resting on bench
    • Fixed critical "stuck ball" bug where ball carrier wasn't transferred when player with ball was substituted due to low energy
    • Fixed inaccurate Turn 0 energy display by logging initial player energy in MATCH_START event context
    • Fixed stale energy display by logging all active players' energy in TURN_UPDATE events every turn
    • Removed unreliable fallback logic in energy inference - now prioritizes per-turn energy snapshots from TURN_UPDATE events
    • Fixed substitute energy reset bug where players always entered at 100% regardless of recovery time - now preserves naturally recovered energy (e.g., player subbed out at 10% who rested 30 turns re-enters at 70%, not 100%)
    • CRITICAL: Fixed energy reset bug where players at 0 energy would jump to 99 the next turn - Changed || to ?? in reducePlayerEnergy to properly handle 0 as a valid energy value (not falsy)
    • Energy now flows naturally: deplete 1-5/turn while playing, recover 2/turn while resting on bench, capped at 0-100
    • Added 13 comprehensive energy validation and regression tests to prevent future regressions

Changed

  • Gameplay realism improvements:
    • Players actively carrying the ball cannot be substituted mid-possession - they complete their action (pass/shot/advance) before being eligible for substitution
    • This prevents unrealistic scenarios like swapping a player mid-dribble in basketball

2025-10-08

Fixed

  • Player count integrity violations in match simulation:
    • Fixed bug where substitutions could result in more than 4 players per side on field
    • Consolidated 4 separate player tracking systems into single source of truth architecture
    • SimulationEngine now delegates to GameState for player arrays instead of maintaining duplicates
    • Eliminated synchronization bugs between player tracking systems
    • Fixed energy recovery for substituted players while resting on bench

Changed

  • Dark mode toggle relocated from top navigation to Settings page for reduced screen real-estate usage
  • Recent Match Results cards now properly support dark mode with theme-aware styling
  • Public page (/) now always displays in light mode while preserving user theme preference on authenticated pages

2025-10-06

Added

  • Dark mode toggle functionality:
    • Desktop dark mode toggle with sun/moon icons in top navigation
    • Mobile dark mode toggle in floating top-right corner (replaces role badge)
    • Comprehensive dark mode styling across most components and pages

Changed

  • Role badge relocated to Settings page for better organization

2025-10-04

Added

  • Admin user list pagination, search, and filtering:
    • Search by name with real-time filtering
    • Filter by role or team
  • Editable custom Trading Card filters:
    • Players can now customize which stats and information appear on their trading cards

Fixed

  • XP calculation truncation bug:
    • Fixed systematic XP loss due to Math.floor() truncation in passive XP calculations
    • Converted XP storage from BIGINT to DOUBLE to support fractional XP accumulation
    • Players now receive exact fractional XP amounts (e.g., 0.4 XP) instead of losing partial XP
    • Resolves 5 reported cases where players lost XP due to truncation, especially with multi-skill training
    • Comprehensive testing added for edge cases including 8-10 focused skills scenarios
  • Passive XP display text bug:
    • Fixed bug where display of XP/hour was rounding to 1 decimal place, and always showing 0.3 for more than 6 skills focused. Now, rounding to 2 decimal places and showing the correct XP/hour for each skill.
  • Training minigame XP boost calculation:
    • Only perfect minigame scores (800 points) now receive the maximum 4x XP boost
    • Previously, any score 700+ received 4x boost; now 700-799 scores receive 3.5x boost
  • Team manager/owner links returning 404 errors on team pages:
    • Fixed broken navigation links to manager and owner profiles
  • Player playstyle frequency settings validation:
    • Players can now correctly set playstyle frequencies to zero values
  • Duplicate player activities for skill/attribute level-ups:
    • Implemented deduplication logic to prevent multiple activity entries for the same level-up event
  • Team Manager permissions for contracts and friendlies:
    • Team managers can now properly offer player contracts and schedule friendly matches
  • Friendly match acceptance notifications:
    • Fixed issue where friendly match acceptances displayed as "Admin xyz accepts..." instead of showing the actual accepting user's name

2025-10-03

Fixed

  • Excessive XP gain bug:
    • Players were able to gain XP at a rate of 10 XP/hour per skill when all 10 skills were focused simultaneously.
    • This was due to a bug in the XP system that allowed players to gain XP at a rate of 10 XP/hour per skill when all 10 skills were focused simultaneously.
  • Character creation min-maxing exploit:
    • Players could previously drop skills to level 0 during character creation to gain excessive budget points (43 points refund).
    • This allowed boosting other skills to level 20+ during creation, then cheaply fixing the sacrificed skill post-creation.
    • Fixed by setting minimum skill level to 5 during character creation, reducing maximum refund to 7 points.
    • Exploit advantage reduced from 39:1 XP ratio to 3:1 XP ratio - much more fair while preserving build flexibility.

2025-10-02

Added

  • Image Upload System with blob storage:
    • File upload support for team logos and venue images and player avatars (PNG, JPG, GIF, WebP up to 2MB)
    • Tabbed interface allowing choice between URL input and file upload
    • Backward compatible with existing URL-based images (blob storage takes priority, URLs as fallback)

2025-10-01

Fixed

  • Removed auto-refresh functionality from Players, Teams, Conferences, and Matches pages to prevent pagination and filter state from resetting.
  • Fixed team league membership display to show correct League hierarchy (Team→Division→Conference→League) instead of relying on active Competition status.
  • Enhanced team logo display with graceful fallback to placeholder when external images are blocked by CORS or mixed content policies.

Removed

  • Recent League Activity section from the League Dashboard page, including the non-functional "View All Activity" button.

2025-09-30

Added

  • Dashboard "Recent Activities" renamed "Your Activities":
    • now displays both Training Sessions and Skill/Attribute Level-Up events

Changed

  • Training session display now shows XP boost information instead of legacy points

2025-09-28

Added

  • Long-Term Player Progression System (XP-based):
    • Migrated player skills and attributes from integer values to Experience Points (XP) system
    • Skills and attributes now use BigInt XP values with calculated 0-100 levels using formula: level = floor(sqrt(XP / cost_factor))
    • Added trainingFocus field allowing players to select one skill/attribute for passive XP gain over time
    • Added lastXpUpdateTime field for just-in-time XP accrual calculations
    • Training mini-games now apply temporary percentage-based XP boost multipliers (1.5x to 4.0x based on performance)
    • Passive XP gain system provides continuous skill growth for focused skills at configurable rates (by Admin)
    • Active training boosts stack with passive XP gain for accelerated progression
    • Match simulation integration ensures XP values are converted to skill levels before gameplay calculations
    • UI displays calculated skill levels with XP progress bars showing advancement within current level
    • Global configuration system for tuning XP rates, boost multipliers, and progression balance (by Admin)
  • Distributed Passive Training System:
    • Players can now focus multiple skills simultaneously for passive XP gain
    • Total XP pool (2 XP/hour) is distributed evenly across all focused skills
    • Visual XP distribution indicator shows current allocation and rates
    • Strategic choice between specialization vs balanced development

Changed

  • Database schema migration converts existing integer skill values to equivalent XP amounts
  • Training system now provides temporary boosts instead of direct skill increases
  • Player creation and setup forms updated to work with XP conversion system
  • All player data enrichment functions now calculate skill levels from XP values
  • Training minigame UI improvements:
    • Removed non-functional passive training focus dropdown from training interface
    • Replaced misleading "Training Points Earned" with clear boost information
    • Updated training completion messages to explain boost mechanics
  • Database schema: migrated from single trainingFocus to multiple trainingFocuses (JSON array)
  • Player stat cards now support multiple training focuses with toggle functionality

2025-09-27

Added

  • Skill and Attribute Limits enforcement:
    • All player skills and attributes are now clamped to 0-100 range
    • Training system applies limits to both skill improvements and decay calculations
    • Training UI disables options for skills already at maximum value (100)
  • Player Injury System:
    • Players who receive MINOR or SERIOUS injuries during match simulations are persisted after the match ends.
    • An injuryRecoveryDate is automatically set in the database (3 days for minor, 7 for serious).
    • Players are automatically healed when their recovery date passes.
  • Injury status is now displayed on Player Trading Cards:
    • A text indicator (MINOR/SERIOUS) appears below the jersey number.
    • A tooltip shows the full injury status and the date of recovery.

Changed

  • Expanded GAME_RULES.md with new sections and images for "Player Creation", "Player Management", and the "Training Minigame".
  • The "Create a Team" button was removed from the Dashboard to reduce redundancy.
  • The public player profile page (/player/[id]) layout was adjusted to match the personal player page, preventing UI overlap.

Fixed

  • "League Highlights" will no longer be displayed on the league page if no matches have been completed.

2025-09-25

Added

  • Help system created with quicktip components implemented on Create Player, Player, and Dashboard pages
  • Public Rules & Guidebook page added with commit hash tagging
  • Public Changelog page added
  • Dashboard reminders linking to Rules and Changelog resources

Changed

  • Footer information links now include Rules & Guidebook and Changelog

Fixed

  • Player energy displays now refresh consistently across team, player, and training views

2025-09-24

Added

  • Team Manager Delegation and Ownership Transfer system with offer-based workflow
    • Team owners can delegate management responsibilities to any user
    • Team owners can transfer full ownership to another user
    • Recipients receive dashboard notifications to accept/reject offers
    • Contract terms include salary amount and duration (1-3 seasons) for manager roles
    • Staff Contracts table shows pending delegation and ownership offers
    • Manager role includes lineup, contracts, and preset management permissions
    • Atomic transactions ensure data consistency during role transfers

2025-09-23

Added

  • Database backup and restore scripts for production data management

Fixed

  • Training mini-game display and interaction issues:
    • Fixed "Decreased" skill results showing empty values instead of numeric changes
    • Fixed rapid clicking allowing multiple inputs per round causing "Invalid Game" errors

2025-09-21

Fixed

  • Mobile responsiveness issues across multiple components:
    • Player Setup: Fixed overflow with skill controls and cost indicator positioning
    • Player Dashboard: Resolved team info overflow with responsive layout and text truncation
    • Conferences Table: Fixed pagination controls overflow on mobile
    • Recent Match Results: Implemented horizontal scrolling instead of element compression
    • Bottom Navigation: Improved text readability and spacing

Changed

  • Standardized Create Player form cost indicator colors: green for decrements, yellow for increments
  • Recent Match Results now uses horizontal scroll with 700px minimum width

2025-09-20

Removed

  • Division rank field and index from database schema and all UI components
  • Beta Signup functionality completely removed from the application:
    • BetaSignup database table and migration
    • Beta signup form, pages, and server actions
    • Admin beta signups management interface
    • Beta signup email templates and confirmation functionality
    • Navigation links and middleware routes for beta signup

Changed

  • Replaced "Signup for Beta" buttons with "Create Your Player" buttons that trigger SWC authentication
  • Updated landing page FAQ to reflect new player account creation process
  • Removed beta-specific language from FAQ answers

2025-09-19

Added

  • Overall Rating (OVR) column to Players table with sortable functionality
  • Enhanced seed data with predefined SWC names, avatars, teams, and league structure
  • Admin user "Tholme So" with ADMIN role

Changed

  • Consolidated breadcrumb navigation on Conference and Division detail pages
  • Enhanced Conference detail page styling with larger images
  • Reordered Division Summary to appear above Division Cards
  • Made team names clickable links in Divisions table

Removed

  • Redundant "Back" buttons from Conference and Division detail pages
  • "Actions" columns from Divisions and Players tables
  • "Browse and Filter" section from Conferences view

Fixed

  • Conference routing issue
  • OVR column sorting functionality