# Cerebro

## [v0.10.23](https://github.com/Shezzannn/Cerebro/tree/v0.10.23) (2026-03-13)
[Full Changelog](https://github.com/Shezzannn/Cerebro/compare/v0.10.22...v0.10.23) 

- chore: Bump version to 0.10.23  
    Player Management Overhaul: new /cb block, /cb unblock, /cb blockedlist commands; purge is now a soft reset; auto-discover group members as Pending; Standings rank filters and Hide Non-Guildies restored; sync field whitelist drops junk data; UTF-8 player name fix; non-guild players display '--' rank instead of 'Unknown(R99)'.  
- fix: Unknown(R99) rank display and unsafe UnitClass in group discovery  
    - StandingsFrame.lua: Replace R99 sentinel with nil; display rank name  
      only (no index suffix). Non-guild players now show '--' in gray instead  
      of 'Unknown(R99)' in white.  
    - Core.lua: Remove UnitClass(raidX) fallback in DiscoverGuildGroupMembers.  
      GetRaidRosterInfo(i) and unit slot indices are not guaranteed to match —  
      only use guild roster for class data when auto-discovering group members.  
    Note: Savas-Stormrage wrong class is a pre-existing data corruption  
    (duplicate entry from old TitleCase UTF-8 bug). Fix: /cb block Savas-Stormrage YES  
    luacheck: 0 warnings / 0 errors in 29 files"  
- feat(v0.10.23): Player Management Overhaul — Block/Purge, Auto-Discovery, Standings Filters, UTF-8 Fix  
    Merges PR #27. Full changelog in PR description.  
    Key features:  
    - New commands: /cb block, /cb unblock, /cb blockedlist  
    - Purge is now a soft reset (EP/GP → 0, status → Pending)  
    - Block permanently removes and prevents re-sync  
    - Auto-discover group/raid members as Pending (officers only)  
    - Pending players blocked from receiving EP or GP  
    - Standings rank filters and Hide Non-Guildies checkbox restored  
    - Sync field whitelist prevents junk field propagation  
    - UTF-8 aware TitleCase for accented player names  
    - Template deletion no longer reappears after sync  
    - Right-click menu hidden from non-officers  
    Fixes applied pre-merge (review):  
    - Restored IsOfficer() PUG guild guard (security regression)  
    - Moved ChatFrame filter to OnInitialize (reload dedup)  
    - Reverted TOC title from '(Dev)' to 'Cerebro'  
    - Deduplicated NormalizePlayerKey to module scope  
- fix: PR #27 review fixes before merge  
    - Core.lua: Restore `if not IsInGuild()` guard in IsOfficer() PUG fallback  
      (security regression — guilded raid assistants were incorrectly passing)  
    - Core.lua: Move ChatFrame\_AddMessageEventFilter to OnInitialize with  
      dedup flag to prevent double-registration on /reload  
    - Cerebro.toc: Revert title from 'Cerebro (Dev)' to 'Cerebro'  
    - UI/CommandRegistry.lua: Hoist NormalizePlayerKey to module scope,  
      remove 3 duplicate inner-function declarations in delete/purge/block handlers  
    luacheck: 0 warnings / 0 errors in 29 files"  
- fix: restore calendar signup UI accidentally removed in PR27  
- feat(v0.10.23): block/purge separation, pending player protections, auto-discovery, context menu RBAC, standings filters  
- fix: add confirmation step before boss kill EP type choice  
    Two-step flow: 'Award Boss Kill EP?' (Yes/No) then Farm/Prog.  
    Prevents accidental awards and gives officers a clear opt-out.  
- feat: boss kill popup (Farm/Prog) + naming fixes  
    - Replace auto-award boss kill EP with officer popup  
      Farm Boss / Prog Boss / Skip buttons  
    - Split epBossKill config into epFarmBoss (15) + epProgBoss (50)  
    - Rename ON\_TIME -> RAID\_START, FULL\_ATTENDANCE -> RAID\_END  
    - Update ConfigSchema, UISandbox, Onboarding, CommunicationV2 hash  
- fix: add RefreshAllUI to session roster popup handlers  
    When the RL benched or removed a player via the leave/join popup,  
    the standings checkbox and gold highlight didn't update until the  
    frame was closed and reopened. Added RefreshAllUI() to all 4 popup  
    button handlers (bench, remove, activate, keep-bench).  
- fix: luacheck warnings - add C\_ToyBox global, suppress unused pctLabel  
- docs: compliance updates for v0.10.21  
    - Session.lua: Added DescribeHealthChecks() with SESSION\_STATE check  
      (per CONTRIBUTING.md §10 health check requirement)  
    - docs/SPEC.md: Updated §4.1 Officer flows with auto-roster, join/leave  
      roster tracking, RL-only bench/remove popups, 2H duplicate slot GP popup  
    - PROJECT\_STATE.md: Added 6 v0.10.21 features to Recently Implemented  
      (Auto-Roster, Duplicate Slot GP, Collectible Item GP, Offline Whisper  
      Spam Fix, RCLC Bridge Safety, V2 Session Sync)  
- feat(v0.10.21): session EP fix, auto-roster, offline spam fix, collectibles, 2H GP popup  
    Session & EP:  
    - Fix EP not awarding (auto-select no longer overwrites pre-selection)  
    - Fallback auto-select when no players pre-selected  
    - On-time EP fires synchronously when grace period is 0  
    - Auto-add Core joiners mid-session  
    - RL-only bench/remove popup when player leaves raid  
    - RL-only active/bench popup when bench player joins raid  
    - V2 RPC session adoption (combat-safe sync)  
    Loot & GP:  
    - 2H duplicate slot popup for Warriors (full vs reduced GP)  
    - RCLC Bridge pcall safety (no crash without RCLootCouncil)  
    - Collectible item GP support (toys, pets, mounts, cosmetics, decor)  
    - Tooltip shows both full and reduced GP for duplicate slot items  
    Offline Whisper Spam:  
    - V2 GetStalePeers filters offline peers via IsPlayerReachable  
    - V1 CheckPendingSyncs re-checks online at max retry  
    - ChatFrame filter suppresses 'No player named' system messages  
    Other:  
    - New UI/CustomEP.lua module  
    - GP calculation for new slot types  
    - UI layout refactor  
    - Config defaults for collectible slots  
    - Luacheck globals updated  
