# Cerebro

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

- chore: Bump version to 0.10.22  
    Added calendar sign-up EP, custom EP templates, Farm/Prog boss EP split, collectible item GP (toys, pets, mounts), and duplicate slot GP multiplier. Fixed sync loop causes including officer-to-officer hash divergence, redundant dual-channel raid broadcasts (PR26), and synccheck self-echo.  
- fix(sync): merge PR26 + sync loop fixes into main  
    From PR26 (fix/raid-channel-noise):  
    - Single-channel sends for SESSION\_START/END/PLAYER\_PURGE  
      (RAID if in raid, GUILD only if not — halves message deliveries in raid)  
    - Remove redundant SendHeartbeat() from SyncToRaid()  
      (snapshot already carries rosterHash; heartbeat was pure noise)  
    Additional sync loop fixes applied this session:  
    - HandleSyncCheck: self-exclusion guard (GUILD echo caused self-whisper loop)  
    - ComputeRosterHash: remove selection timestamp (caused permanent  
      officer-officer hash divergence on different active selections)  
    - HandleSnapshot: gate FETCH-on-integrity-failure on rosterMerged==0  
      (when data accepted, structural hash diff is heartbeat's job to resolve)  
    - MergeRosterData: return mergedCount so HandleSnapshot can gate FETCH"  
- feat: merge PR22 (v0.10.21) features into main  
    - Calendar sign-up EP (CalendarSignup.lua) with RSVP scanning,  
      dedup via signupAwards, and V2 sync propagation  
    - Custom EP templates (CustomEP.lua) with officer-only RBAC  
    - Farm Boss / Prog Boss EP split (replaces single epBossKill)  
    - Collectible item GP (Toy, Pet, Mount, Cosmetic, Decor)  
    - Duplicate slot GP multiplier for 2H weapons (Warrior)  
    - Settings tab replaces Officer Tools tab (DrawOfficerTab → DrawSettingsTab)  
      grayed-out for non-officers instead of hidden  
    - V2: SESSION\_START handler now adopts session state inline (no V1 delegation)  
    - V2: GetStalePeers skips offline peers (prevents whisper spam)  
    - V2: signupAwards included in BuildSnapshot/HandleSnapshot + MergeSignupAwards  
    - V2: ComputeConfigHash updated for new EP keys + signup hashing  
    - Fix: MergeSelectionData LoadSelection() → SetSelection() (bug fix)  
    - Fix: type(incoming/pData) corruption guards in roster merge + RecalculateAllPR  
    - Fix: ChatFrame filter suppresses 'No player named X' AceComm chunk spam  
    - Fix: offline whisper guard in CheckPendingSyncs  
    - Fix: RefreshAllUI() after standings reset  
    - TOC: Title corrected to 'Cerebro' (removed stale Dev suffix)"  
