**Fix:**
> Fixed hook float task leaks on session end
> Fixed rod charge-speed and float-area-size having no gameplay effect
> Fixed lava and void minigame difficulty multipliers not applied
> Fixed off-hand bait never consumed, bait detection and fish record parsing dependent on lore text
> Fixed minigame fish selection ignoring water type pools
> Fixed non-sell GUI empty slots accepting items via shift-click
> Fixed sell GUI drag events blocked for all GUIs
> Fixed Cmd add command feedback using string concatenation instead of format placeholders
> Fixed i18n formatting characters hardcoded in fish lore and floating text
> Fixed rod template fallback hardcoded Chinese
> Fixed MySQL migration running SQLite-specific queries before dialect check
> Fixed Math.random() scattered across 10 locations in game logic
> Fixed Material enum direct usage violating cross-version rules
> Fixed pools.yml referencing fish not defined in fish.yml
> Fixed config comments incorrect or incomplete (charge-speed, escape)
> Removed dead code: getRankPrefix(), ~75 lines of lore text parsing, duplicate sell deposit, unused config values
**Add:**
> Added ChargeSessionData for per-session rod attribute storage
> Added cross-version NBT read helpers for bait and fish item identification
> Added 7 i18n keys for fish lore formatting and rod template
> Added Folia compatibility with dedicated kkfish-folia.jar build
**Optimize:**
> Optimized DB migration to use dialect-specific column detection
> Optimized bait detection and fish record parsing from lore iteration to single NBT reads