# Cerebro

## [v0.9.3](https://github.com/Shezzannn/Cerebro/tree/v0.9.3) (2026-02-11)
[Full Changelog](https://github.com/Shezzannn/Cerebro/compare/v0.9.2...v0.9.3) 

- chore: Bump version to 0.9.3  
    Raid Sync v2: Smart heartbeat with peer-aware sync, targeted whispers for stale players, receipt deferral during raid, and configurable sync intervals.  
- Merge feat/sync-scheduler-consolidation: Raid Sync v2 (Phases 0-7, 9)  
- feat: Officer-to-Officer Gossip Digest anti-entropy protocol (v0.9.3)  
    - Add GOSSIP\_DIG message type for officer-to-officer checksum exchange  
    - BroadcastGossipDigest: 3-min periodic digest on GUILD channel (configurable)  
    - HandleGossipDigest: staler officer auto-requests full sync from fresher  
    - 60s rate limit prevents gossip-triggered request storms  
    - Add gossipDigestInterval to raidSyncConfig defaults in Database.lua  
    - Update COMMUNICATION\_ARCHITECTURE.md (msg types, timers, flow, channels, timing)  
    - Update PROJECT\_STATE.md v1.7 (sync invariant #12, recently implemented, changelog)  
    - Update REMAINING\_ITEMS.md (gossipDigestInterval in config section)  
    Solves the 'Offline Segmentation' problem where Officer A misses data  
    that only Officer B received from raiders.  
- feat: Raid Sync v2 — full implementation (Phases 0-7, 9)  
    Batch A: Proactive WHISPER to new raid joiners, /cb syncstatus command  
    Batch B: Peer status tracking via SYNC\_ACK, EWMA latency, freshness classification  
    Item 3: MaybeRaidSync smart heartbeat with GetSyncMode 4-state machine  
    Item 4: Targeted whispers for stale peers (<=5 whisper, >5 broadcast)  
    Item 5: Receipt deferral — marks peers STALE instead of immediate broadcast  
    Item 7: Configurable raidSyncConfig (fullSyncInterval, heartbeatInterval, targetedSyncThreshold)  
    Files: Database.lua, Communication.lua, SyncScheduler.lua, CommandRegistry.lua, Core.lua  
    Tests: luacheck 0/0, validate\_commands 47/47  
- feat: SyncScheduler consolidation, content checksum, honest combat feedback  
    - New module: Modules/SyncScheduler.lua (encounter state, heartbeat, combat gating)  
    - Communication.lua: SyncToRaid returns bool, checksum validation, needsFullSync support  
    - Core.lua: removed encounter/heartbeat logic (moved to SyncScheduler)  
    - UI: 5 callers show honest 'deferred' message on combat block  
    - Docs: updated PROJECT\_STATE, COMMUNICATION\_ARCHITECTURE, SPEC  
    - Workflow: added version tagging rule to implement-feature  
    - Added raid\_sync\_v2 remaining items analysis  
- Merge laptop changes with PC work  
- feat: add PII guard to release workflow  
- docs: add AI agent onboarding for contributors, expand .gitignore  
- feat: add PII guard pre-commit scanner (tools/pii\_guard.py)  
- chore: update CODEOWNERS to @Shezzannn, remove tracked binaries  
- docs: add fork workflow section, remove private file references  
- chore: exclude personal/agent files from repo  
- docs: Update documentation for v0.9.0 Delta Sync v2  
    - PROJECT\_STATE.md v1.5: Added Delta Sync v2 to Recently Implemented, Receipt Cursor Tracking invariant  
    - COMMUNICATION\_ARCHITECTURE.md: Added SYNC\_RCPT\_ACK message type, updated summary with cursor tracking  
    - Moved Receipt\_cursor\_tracking\_followup\_issues.md to delta\_sync\_v2 folder  
- chore: Core upgrade to 0.9.0  
    Delta Sync v2: Receipt cursor tracking with serial batching, retry logic, and robust state management  
- chore: Bump version to 0.8.24  
    Fixed Session ID Leak in History tab where M+ EP awards incorrectly displayed raid session tags when an officer had an active session  
- chore: Bump version to 0.8.23  
    Fixed attendance display bug: Officer Tools 'Admit to Core' button now correctly sets admission timestamp for fair attendance tracking  
- chore: Bump version to 0.8.22  
    Fixed session attendance tracking - on-time and full attendance flags are now correctly preserved during sync, preventing stale data from overwriting locally-set flags. Added session start/end entries to History tab.  
- chore: Bump version to 0.8.21  
    Fixed LWW sync bug where admitted players reverted to Pending when offline officers came online  
- feat(session): Add 30-min progression EP timer and session summary  
    - Implement AwardProgressionEP() with 30-minute repeating timer  
    - Add PrintRaidSummary() showing EP breakdown in raid chat  
    - Add PrintPersonalSummary() with 3-second delay for individual breakdown  
    - Update UI labels: 'Progression (Hourly)' -> 'Progression (30 min)'  
    - Fix MyProgress.lua filename (OneDrive sync conflict)  
    - Add cerebro-validation skill for post-change testing  
- docs: update governance and architecture docs  
    - ARCHITECTURE.md: Updated to v2.0 with full module list, sync architecture diagram  
    - PROJECT\_STATE.md: Updated to v1.4 with UI Sandbox, Player Purge, Attendance, Efficiency refactoring  
    - .agent/rules/cerebro.md: Added new invariants, utility functions table, missing skill  
    - DISTRIBUTION.md: Archived to docs/archive/ (superseded by .agent/workflows)  
- refactor: efficiency consolidation (Tasks 1-8)  
    Implemented utility functions:  
    - Cerebro:RecalculateAllPR() - consolidated 3 PR recalculation patterns  
    - Cerebro:RefreshAllUI() - consolidated 19 UI refresh patterns  
    - Cerebro:GetFilteredPlayersForSync() - consolidated 2 sync filtering patterns  
    Files modified:  
    - Utilities.lua: Added 3 new utility functions  
    - Communication.lua: Replaced inline patterns with utility calls  
    - Ledger.lua: Replaced RefreshStandings with RefreshAllUI  
    - CommandRegistry.lua: Replaced CopyTable and RefreshStandings patterns  
    Documentation:  
    - Reorganized task documents into efficiency/closed and efficiency/open  
    - Updated EFFICIENCY\_ANALYSIS.md with completion status  
    Tasks 5, 8: No action (intentional by design)  
    Tasks 6, 7: Deferred (optional optimizations)  
- docs: Add communication architecture and efficiency analysis  
- fix(ci): Add missing WoW API globals to luacheckrc  
- chore: Bump version to 0.8.20  
    Fixed case sensitivity bug in EP/GP adjustment popup dialogs (editBox → EditBox)  
- chore: Bump version to 0.8.19  
    Fixed bug where Mythic+ runs from other characters would incorrectly display under My Progress when logging into alts.  
- chore: Bump version to 0.8.18  
    Fixed sync bug where offline officers' pre-reset EP/GP data could resurrect after factory reset. Added epoch tagging for stale record detection.  
- chore: Bump version to 0.8.17  
    Fixed raider EP sync gap after M+ runs; Fixed M+ duration display (API returns milliseconds)  
- chore: Bump version to 0.8.16  
    Fixed M+ completion time bug where UI reload during a run caused incorrect duration to be recorded; now uses server-authoritative completion time.  
- chore: Bump version to 0.8.15  
    Fixed M+ EP auto-sync: raiders' EP now properly syncs to officers after dungeon completion. Officers can now use /cb restore YES.  
- chore: Bump version to 0.8.14  
    Added paper doll GP slot weights configuration with 3D character model, slot icons matching WoW character frame layout, and weapon type overlays.  
- Add paper doll GP slot weights layout  
    - Paper doll style with 3D character model in center  
    - Left column: Head → Wrist (edit boxes on left of icons)  
    - Right column: Hands → Trinket (edit boxes on right of icons)  
    - Bottom row: 7 weapon slots with overlay labels (1H, 2H, MH, OH, SH, RD, FR)  
    - Weapon row properly centered below columns  
    - Tooltips on slot hover, green flash on save  
    - Matches WoW character frame slot positions  
- UI Sandbox: EP/GP sub-tab fix, context menu positioning, hide Wishlist  
    - Fixed EP/GP sub-tab toggle using dedicated content container  
    - Fixed context menu positioning with C\_Timer.After delay  
    - Hidden Wishlist tab from sidebar (code preserved)  
- chore: Bump version to 0.8.13  
    Fixed M+ completion tracking broken in 12.0 by updating deprecated GetCompletionInfo API to GetChallengeCompletionInfo.  
- feat(tools): add machine sync script to prevent Git staging bugs  
- feat(ui): Add Standings tab to New UI with sorting, filtering, and full column set  
    - Added 'standings' tab to UISandbox sidebar  
    - Implemented DrawStandingsTab() with all columns: Rank, Player (Name-Realm), Guild Rank, PR, EP, GP, Status, Attend  
    - All columns sortable with gold labels and gray sort indicators  
    - RBAC-aware visibility (Pending players hidden for non-officers)  
    - AceGUI EditBox for search with proper focus handling  
    - RefreshStandingsRows() for efficient updates without full tab rebuild  
    - Ported CalculateAttendanceDisplay() from StandingsFrame.lua  
    - Fixed GetClassColor usage per user correction  
- UI Sandbox refinements: remove unused media assets, update background  
- feat(ui): New UI migration - Phase 1 complete  
    - Added fallback toggle in Settings (Use New UI Experimental)  
    - Built My Progress tab in new UISandbox with real player data  
    - Hero section with dark circuit background texture  
    - EP/GP/PR stat tiles with gold accents  
    - Readiness bar and M+ history section  
    - Added task document for cross-computer continuity  
    Classic UI remains untouched as safe fallback.  
- Add test\_background media assets for UI Sandbox  
- feat(ui): Premium UI Sandbox with unified textures and sidebar  
    - Unified sandbox\_frame.tga background (honeycomb, divider, corners)  
    - Vertical sidebar with fade-animated custom tooltips  
    - 25% smaller compact frame (562x412)  
    - tools/convert\_textures.py for PNG to TGA conversion  
    - docs/proposals/UI\_SANDBOX\_DEVELOPMENT.md development guide  
    - .agent/workflows/convert-textures.md workflow  
- feat(ui): Add UISandbox visual development framework with vertical sidebar  
    - New /cb testui command opens UI component showcase  
    - Vertical icon sidebar (Map/Quest Log style) on right edge  
    - 6 tabs: Stat Tiles, Bars, Party Icons, Typography, Rows, Colors  
    - Separate content frame registry for proper cleanup on tab switch  
    - Fully native draggable frame with ESC to close  
    Also includes:  
    - MediaPaths.lua helper for custom texture paths  
    - Updated deploy.py workflows for dev/ptr modes  
- docs: Mark onboarding epic complete in roadmap  
- chore: Bump version to 0.8.12  
    In-game onboarding wizard (5 screens), native EP/GP/PR tiles, fixed Unicode encoding, consistent UI padding  
- chore: Bump version to 0.8.11  
    Added 5-screen onboarding wizard for new players with /cb intro command. Fixed Unicode characters for WoW font compatibility.  
- chore: Bump version to 0.8.10  
    My Progress UI: Equation layout (EP ÷ GP = PR) with hover tooltips explaining each stat, taller readiness bar, visual polish  
- docs: remove PII from absolute file paths  
- chore: Bump version to 0.8.9  
    Added /cb freshstart YES command for local client recovery - wipes local data and re-syncs from officers without affecting guild epoch.  
- docs: Archive attendance tracker proposal  
- docs: Mark attendance tracker proposal as implemented  
- fix: Remove unused variable, add luacheck to workflow  
- chore: Bump version to 0.8.8  
    Added raid attendance tracking: on-time bonus with configurable grace period, full attendance awards, per-boss tracking, new Attend column in Standings UI with color-coded percentages, 6 new /cb attendance subcommands, and fair calculation for new Core members.  
- chore: Bump version to 0.8.7  
    Add Player Purge system (/cb purge, /cb purgetest) for permanent player removal with sync-aware ledger. Add command validation lint script.  
- chore: Add command validation lint and improve implement-feature workflow  
    - Add tools/validate\_commands.py to catch missing cmdMap entries  
    - Update implement-feature.md with validation step and --dev deploy  
    - Update cerebro-commands skill to reference validation script  
    - Deploy now uses --dev by default for testing  
- feat: Implement Player Purge system  
    - Add purgedPlayers ledger to Database.lua with 30-day cleanup  
    - Add PLAYER\_PURGE message type and sync integration in Communication.lua  
    - Add /cb purge and /cb purgetest commands in CommandRegistry.lua  
    - Add purge/purgetest aliases to cmdMap in Core.lua  
    - Add PLAYER\_PURGE audit action to SECURITY\_MODEL.md  
    - Update PLAYER\_PURGE.md proposal status to Implemented  
    Closes #PLAYER\_PURGE proposal  
- docs: Add Player Purge proposal for test character cleanup  
- refactor: Consolidate docs for context efficiency  
    - Slim CLAUDE.md from 335 to 190 lines  
    - Create cerebro-deploy skill with all deploy/release commands  
    - Update cerebro-governance skill with commit gates, onboarding, deps  
    - Archive AI-QUICKSTART.md (replaced by skills)  
    - Update INDEX.md to reference skills system  
    - Add deploy skill to rule file triggers  
- feat: Add Skills + Workflow system for AI knowledge retrieval  
    - Add 5 skills: cerebro-lua, cerebro-ui, cerebro-commands, cerebro-sync, cerebro-governance  
    - Add rule file with invariants and skill triggers  
    - Add implement-feature workflow  
    - Update CLAUDE.md with §6.1 Skills section  
    - Add .agent to .pkgmeta ignore list  
- chore: Bump version to 0.8.6  
    Season auto-reset: Automatically clears M+ history and resets EP/GP standings when new M+ season detected. Guild M+ History improvements: Name-Realm format with class colors, compact filters with right-aligned count. EP cap message deduplication.  
- chore: Bump version to 0.8.5  
    Guild M+ History tab: Repurposed Raider Audit to display guild-wide M+ runs with native frames matching My Progress style, Player column, filter dropdowns (Player/Dungeon/Level/Result), and proper dungeon name lookup. Fixed test M+ run generation for 5-member parties with unique runKeys.  
- chore: Bump version to 0.8.4  
    Fixed debug mode sync leak (raiders no longer inherit officer's debug setting); added unit tests for Switch Guild feature; fixed GUEST\_STUB freeze behavior  
- docs: Add factory reset test suite and update PROJECT\_STATE with v0.8.3 changes  
- chore: Add web-sim to ZIP\_EXCLUDES  
- feat: Guild-wide factory reset with audit preservation and epoch markers  
    - Change BroadcastReset to use GUILD channel instead of RAID  
    - Fix HandleReset RBAC: validate sender but let everyone wipe  
    - Add auto-backup for all users (officers and members) on reset  
    - Add auto-backup on epoch upgrade for offline protection  
    - Preserve audit logs across reset with epoch markers in UI  
    - Add epoch to receipts payload with stale receipt rejection  
    - Add epoch field to audit log entries  
    - Temporarily disable 72h cooldown for testing (TODO: restore for v1.0)  
    Docs: Update SPEC.md, SECURITY\_MODEL.md, PERMISSIONS\_MATRIX.yaml  
- chore: Bump version to 0.8.2  
    Fix scope override sync race condition - Wipe now activates quarantine to prevent incoming syncs from re-injecting stale scope; added defensive WIPE confirmation handling and fixed UI:Hide to close restricted access frame.  
- chore: Fix all luacheck warnings (45 -> 0) and update governance docs  
    - docs/DEPENDENCIES.md: Add §7 Development Dependencies (luacheck, Python)  
    - PROJECT\_STATE.md: Add Linting row to Infrastructure table (v1.2)  
    - .luacheckrc: Add W432/self shadowing ignore (WoW popup callback pattern)  
    - Fixed 45 luacheck warnings across 17 Lua files:  
      - Remove unused variables and function parameters  
      - Invert empty if branches for cleaner logic  
      - Remove dead code (TooltipInjector unused constants)  
      - Fix variable shadowing (renamed to avoid conflicts)  
- chore: Add git hooks installer for luacheck pre-commit  
    - Add tools/install-hooks.py for easy hook setup  
    - Document setup process in CONTRIBUTING.md §11  
    - Hook blocks errors, allows warnings with notice  
- ci: Add luacheck linting workflow for PR quality gates  
    - Add .luacheckrc with WoW API globals and Ace3 patterns  
    - Add .github/workflows/lint.yml to run luacheck on push/PR to main  
    - Fix Preparation.lua:768 global \_ pollution bug  
    - Fix Communication.lua duplicate DECAY/RESET message type definitions  
    Configuration ignores whitespace and unused args (common in WoW callbacks).  
    Current state: 45 warnings / 0 errors - CI will pass.  
- docs: Consolidate AI agent documentation and add quickstart guide  
    - Merge CLAUDE.md with cerebro-ai-index.md into single canonical contract  
    - Add agent workflow patterns (explore/general delegation guidelines)  
    - Unify compliance checklist across documents  
    - Create docs/AI-QUICKSTART.md condensed reference for common patterns  
    - Remove duplicate governance gate section from INDEX.md  
    - Archive old cerebro-ai-index.md  
- feat: Add WoW 12.0 Midnight PTR support  
    - Add Interface version 120000 to TOC for Midnight compatibility  
    - Add --ptr flag to deploy.py for PTR deployment  
    - Update IsReleaseBuild() to detect 12.x PTR before launch date  
    - Update Ace3 libraries for 12.0 compatibility  
    - Add raw build info to /cb testenv for debugging  
- chore: Bump version to 0.8.1  
    Fixed debug mode toggle sync between Weights tab and Blizzard Options. Added /cb debug on|off arguments. Silenced RepairDatabase messages.  
- chore: Core upgrade to 0.8.0  
    Sync Architecture Overhaul: Self-only M+ awards, LWW standings sync with server timestamps, officer-only epoch propagation, local-only transaction history.  
- chore: Bump version to 0.7.20  
    Fixed missing version field in SyncToRaid payload causing officers to be incorrectly flagged as legacy clients during periodic sync.  
- fix: Add missing version field to SyncToRaid payload  
- chore: Bump version to 0.7.19  
    Improved version rejection logging with clear sender identification and chat warnings. Added audit log deduplication to prevent duplicate entries when multiple officers observe the same event.  
- fix: Improve version rejection logging and add audit log deduplication  
- docs: Update runKey format in SPEC.md for M+ deduplication  
- chore: Bump version to 0.7.18  
    Added pre-award runKey deduplication using server time and full party composition for deterministic run identification  
- chore: Bump version to 0.7.17  
    Fixed test file loading errors in release (tests are now dev-only, excluded from CurseForge package)  
- chore: Bump version to 0.7.16  
    Added Version Enforcement: MIN\_SYNC\_VERSION (0.7.15) blocks outdated clients from syncing, transactions stamped with logicVersion for schema validation, legacy transactions marked with * in History tab. New /cb versioncheck command for officers. Added Officer Receipt Fallback when no officers online.  
- feat: Unified testmplus command, deploy improvements, TWW S3 dungeons  
- docs: Move proposal to docs/proposals/  
- docs: Add version enforcement proposal  
- chore: Bump version to 0.7.15  
    Polish: class color on admit, delete resets to Pending  
- chore: Bump version to 0.7.14  
    Fixed HandleAnnounceSelf incorrectly promoting raiders to Core  
- chore: Bump version to 0.7.13 with debug tracing and name format fix  
- docs: Clarify sync behavior and add SYNC-001 through SYNC-005 test cases  
- chore: Bump version to 0.7.12  
    Fixed new player status bug: all entries now start as Pending, officers self-correct after login  
- fix: Exclude web-sim and wsim from CurseForge package  
- chore: Bump version to 0.7.11  
    Fixed sync architecture bugs: self-sync guard, raider-to-raider sync prevention, player table merge instead of replace, guild sync fallback, and removed auto-promotion on raid join  
- Merge branch 'main' of https://github.com/Shezzannn/Cerebro  
- docs: Add EP Sync Test Plan  
- chore: Bump version to 0.7.10  
    Add dev-only --target flag to M+ simulation for officer testing of EP sync to specific players  
- Add AI-driven deploy-release workflow  
- chore: Bump version to 0.7.8  
    Fixed sync registration bug where raiders weren't visible to officers after SV reset. Added GUID auto-heal for scope mismatches.  
- chore: Bump version to 0.7.7  
    Fix multi-officer sync EP data loss, add distribution validation, reorganize officer infrastructure  
- feat: Implement Supabase sync backend and helper app  
    - Add Postgres schema with RLS (backend/schema.sql)  
    - Add Edge Functions for ingest/pull (supabase/functions/)  
    - Add Go helper app with cross-platform build (backend/helper/)  
    - Add setup wizard and officer quickstart guide  
    - Add GitHub Actions release workflow  
    - Fix: Remove duplicate config assignment in Communication.lua  
    - Fix: Add UUID to audit logs for idempotent sync  
- chore: Bump version to 0.7.6  
    Fixed IsOfficer solo fallback bug that auto-promoted new players to Core status; /cb admit now refreshes UI for already-Core players  
- chore: Bump version to 0.7.5  
    Fixed MythicPlus module missing AceTimer-3.0 mixin causing ScheduleRepeatingTimer errors  
- v0.7.4: Guild Locking - restrict EPGP data to authorized guild  
- chore: Bump version to 0.7.3  
    Fixed nil method error in MythicPlus.lua when addon loads during active M+ run  
- Impl factory reset quarantine system (v0.7.2)  
- chore: Bump version to 0.7.1  
    Added season tracking utilities (GetSeasonInfo, GetCurrentSeasonWeek, GetGameVersion) with UI footer display and officer-configurable season start override  
- chore: Core upgrade to 0.7.0  
    My Progress UI: LFG-style icons, EP breakdown tooltips, randomized test data, role terminology standardization  
- docs: Add Player Profile feature proposal  
- docs: Clarify test execution via slash commands (v0.6.6+)  
- Merge branch 'main' of https://github.com/Shezzannn/Cerebro  
- v0.6.6: Remove test entries from TOC for CurseForge compatibility  
- Merge branch 'main' of https://github.com/Shezzannn/Cerebro  
- docs: Document TOC filtering/validation in DISTRIBUTION.md  
- v0.6.5: Fix packaging - strip test entries from TOC, add validation  
- Merge branch 'main' of https://github.com/Shezzannn/Cerebro  
- chore: Documentation split & structure enforcement  
    - Created CEREBRO.md as master internal doc  
    - Distilled README.md for CurseForge (stripped dev sections)  
    - Updated release scripts to target both README files  
    - Aligned exclusion patterns across deploy.py, package.py, .pkgmeta  
- v0.6.4: Consolidated documentation, excluded dev files from distribution  
- v0.6.3: Fixed packager workflow syntax  
- v0.6.2: Fixed package naming and game version configuration  
- v0.6.1: Added CurseForge CI/CD automation  
- Add M+ simulation tool and fix command routing  
    - Added SimulateRun function to MythicPlus module with dry run mode (default)  
    - Updated CommandRegistry to support /cb testmplus run [level] [guildies] [flags]  
    - Fixed missing cmdMap entry for testmplus command  
    - Enhanced command registration documentation in CONTRIBUTING.md  
- Release v0.6.0: Persistent guild sync and robustness fixes (Sync upgrade)  
- v0.5.6: Consolidated deploy scripts with cross-platform auto-detection  
- feat: Add newly installed node modules for web-sim project.  
- v0.5.5: Refine Mythic+ EP formula and history breakdown  
- docs: Add deferred Mythic+ History design proposal  
- v0.5.4: Minimap button, Weights/Settings scroll fix, Search fix  
- v0.5.2: Factory reset failsafe - GM-only restrictions, backup/restore, 72h protection  
- chore: track .agent directory in git  
- docs: establish AI Governance Gate (AI\_DOC\_IMPACT\_CHECK.md)  
- feat: release v0.5.1 - M+ Deduplication & Hardening  
- refactor: switch to package-based dependency management for Ace3 (v0.5.0)  
- feat: Introduce UI module unit tests and establish AI agent governance rules.  
- fix: Update deploy exclusions and fix MyProgress nil error  
    - Add docs, .webhook, CEREBRO.md to deploy exclusion list  
    - Fix MyProgress GetSessionStats nil error with safety check  
    - Deploy now produces 117 files (excludes dev-only folders)  
- fix: Add slash command registrations for test commands  
    - Add SLASH\_TESTCALC, TESTDECAY, TESTLEDGER, TESTSESSION, TESTMPLUS, TESTDIAG  
      registrations directly in CommandRegistry.lua  
    - Commands now work even if test files fail to load (shows helpful message)  
    - Update TOC to use backslashes for Windows path compatibility  
    - Add test command entries to CommandRegistry commands table for documentation  
- fix: Remove misleading test command hints from selftest output  
    Test commands (/testcalc, /testrclc, etc.) are only available in  
    development deployments with tests/ included. Removed hints that  
    reference these commands to avoid confusion in production builds.  
- docs: Formalize Diagnostics as canonical health gate  
    - CONTRIBUTING.md: Add 10 Diagnostics & Health Check Requirements  
      - Define material refactor, health check obligation, purity contract  
      - Explicit prohibited API list for health checks  
      - UPPERCASE ID requirement with example implementation  
    - docs/SPEC.md: Add 6 Diagnostics as Canonical Health Gate  
      - Define authority, observational contract, registration model  
      - Registry contract (fail-closed, officerOnly skip, pcall isolation)  
      - Determinism guarantees (no current-time timestamps, stored allowed)  
      - Fix 4.3 to use --debug (not --json)  
    - docs/DIAGNOSTICS.md: New comprehensive reference document  
      - Commands, health check contract, purity requirements  
      - Machine output format with determinism rules  
    - docs/OPERATOR\_CHECKLIST.md: New CI-style officer runbook  
      - Post-deploy validation steps with expected outputs  
      - SKIP clarification for non-officers  
      - Escalation procedures and warning interpretation  
    - Modules/Diagnostics.lua: Remove time-derived values from machine output  
      - Remove sync.lastOfficerSyncAgeSec (time-derived)  
      - Clarify comments re: stored vs current-time timestamps  
    Documentation and process only. No behavioral changes.  
- feat: implement a self-test and health check system with check registration, execution, and unit tests.  
- feat: Add /cb status command with human and machine-readable modes  
    - New Modules/Diagnostics.lua for status snapshot generation  
    - Human mode: Version, Status, Role, Database, Session, LastSync, Dependencies  
    - Machine mode (--json): Deterministic key=value output for bug reports  
    - Added syncStatus.lastOfficerSync tracking in Communication.lua  
    - Added Ledger:GetTransactionCount() for efficient stats  
    - Updated SPEC.md, PROJECT\_STATE.md, ONBOARDING.md, USER\_TEST\_BLUEPRINT.md  
    - Version: 0.4.3  
- feat: Remove alt character linking logic, define independent alt policy in documentation, and add local deployment instructions.  
- v0.4.2: Fixed layout regression in History/System Logs tabs  
- v0.4.1: Fixed Officer Tools tab scrollbar; deploy includes tests by default  
- docs(governance): Create documentation index and archival structure (v0.4.0)  
    - Created docs/INDEX.md as single entry point for all documentation  
    - Established 3-tier governance hierarchy (Canonical/Supporting/Archived)  
    - Added agent-specific governance rules in Section 3  
    - Archived historical docs to docs/archive/  
    - Updated CEREBRO.md with deferral language to SPEC.md  
    - Updated README.md to reference INDEX.md as entry point  
    - All 26 documentation files classified with remarks  
- docs: Add and resolve issue 2.3 (Admit Workflow Gap)  
- feat: Add /cb admit command + documentation updates  
    - Add admit\_player command to CommandRegistry.lua  
    - Add admit to cmdMap routing in Core.lua  
    - Add help text for /cb admit  
    - Update test parity manifest  
    - Add 'Adding New Commands' checklist to CLAUDE.md  
    - Add 'Local Deployment' reminder to CLAUDE.md  
- docs: Enhance transaction and audit log schemas, detail audit actions and limits, and add search/filter functionality for logs.  
- feat: Release v0.3.0 with updated announcement for audit logging, search UI, and RCLC integration, and new release package.  
- feat: bump version to 0.2.1 and modernize RCLC bridge with RBAC and idempotency  
- chore: bump version to 0.3.0  
    Features in this release:  
    - Audit logging for officer settings (System Logs)  
    - Search bars on History and System Logs tabs  
    - Enhanced RCLC integration with real item data  
    - History shows item slot and GP delta  
- Merge feature/audit-logging: Add audit logging, search, and RCLC fixes  
    Features:  
    - Search bars on History and System Logs tabs  
    - Officer setting changes logged to System Logs (WEIGHT\_CHANGE)  
    - RCLC loot awards with real item link, slot, and GP delta  
    - Enhanced history entries: [Slot] ItemLink (GP: preGP → postGP)  
    Fixes:  
    - RCLC test mode now works correctly  
    - Autopass awards charge GP properly  
    - Test mode uses real item from lootTable when available  
- chore(rclc): convert debug Print to Debug calls for production  
- feat(rclc): access lootTable directly for real item link even in test mode  
    RCLC stores real item data in RCLootCouncilML.lootTable[session].link  
    Now retrieves this data to get actual item name and slot instead of 'test\_mode'  
- fix(rclc): add timestamp to test mode dedupe key to allow multiple test awards  
    In test mode, itemID is always 0, causing all awards with same session/winner/response  
    to be deduplicated. Adding timestamp makes each test award unique.  
- fix(rclc): use 'Test Mode' slot label since RCLC test doesn't provide real item data  
- feat(history): enhance loot award entries with item, slot, and GP delta  
    - ChargeGP now captures preGP/postGP values in transaction details  
    - History tab renders: [Slot] ItemLink (GP: preGP → postGP)  
    - RCLC\_Bridge passes rich details object instead of just itemLink  
    - Test mode uses '[Test Item]' and 'Trinket (Test)' as placeholders  
- fix(rclc): handle test mode 'test\_mode' itemLink with default GP  
    RCLC test mode sends 'test\_mode' as itemLink instead of actual item.  
    GetItemInfoInstant('test\_mode') returns nil, causing GP=0.  
    Fix: Detect test mode and use default GP (Trinket tier = 800)  
- debug(rclc): add verbose output to trace award event flow  
- fix(rclc): Autopass awards should charge GP, not be filtered as Pass  
    Bug: 'Autopass' contains 'pass' so it was being filtered out  
    Fix: Check for exact 'pass' match and explicitly exclude 'autopass'  
- fix(audit): remove History logging for config changes, keep only System Logs  
    Officer-only setting changes (Weights tab) now log ONLY to System Logs.  
    History remains reserved for EP/GP adjustments, loot awards, and sessions.  
- fix(audit): log ALL officerOnly settings to System Logs (complete Weights tab coverage)  
- fix(audit): expand weight detection to include multiplier/modifier officer settings  
- fix(search): use OnEnterPressed instead of OnTextChanged to prevent focus loss  
- feat(audit): add config change logging and search to History/System Logs  
    SEARCH UI:  
    - Added search bar to History tab with case-insensitive filtering  
    - Added search bar to System Logs tab with case-insensitive filtering  
    - Search state persists across tab switches within session  
    - Uses debounced refresh (0.3s) to prevent UI storms  
    CONFIG CHANGE LOGGING:  
    - All config changes now log to History (currency='CFG', amount=0)  
    - CFG transactions are ignored by ReplayHistory (no EP/GP impact)  
    - Weight changes additionally log to System Logs (action='WEIGHT\_CHANGE')  
    - Logs include: old value, new value, setting label, officer name  
    - Skip logging if value unchanged (idempotent)  
    TESTING:  
    - Created tests/unit/test\_audit\_logging.lua (8 tests)  
    - Register /testaudit command  
    Total: 8 new tests, 2 tabs enhanced with search  
- fix(config): add Validate alias for ValidateAndNormalize  
- fix(config): make GetValue/SetValue/ResolveDbPath polymorphic for legacy compatibility  
    Now handles both:  
    - String key: ConfigSchema:GetValue('config.epgp.baseGP')  
    - Item object: ConfigSchema:GetValue({key: '...', type: 'number', ...})  
    Weights tab uses string keys, new generator uses item objects.  
- fix(config): GetCategories now returns old schema format for Weights tab  
    Weights tab expects: [{category: 'Name', items: [...]}, ...]  
    Was returning: ['Name1', 'Name2', ...]  
    Now reconstructs old format from flat schema for backward compatibility.  
- fix(config): add GetCategories legacy API for Weights tab compatibility  
- fix(core): remove duplicate function declaration causing syntax error  
- feat(config): modernize configuration system with schema-driven generator  
    PHASE 1 - Schema Extension:  
    - Rewrote UI/ConfigSchema.lua with full metadata support  
    - Added 30+ options (General, EPGP, Mythic+, Preparation)  
    - Implemented helpers: GetItemsSorted, ValidateAndNormalize, ResolveDbPath  
    - Support for isPercent with normalized/raw storage modes  
    - RBAC gating with hidden/disabled modes  
    PHASE 2 - Core Generator:  
    - Replaced hardcoded AceConfig tables in Core:SetupOptions (200+ lines)  
    - Implemented dynamic generator: schema → AceConfig  
    - Added GenerateOption helper for schema item → option transformation  
    - Deterministic output via sorted categories/groups/items  
    PHASE 3 - Testing:  
    - Created tests/unit/test\_config\_schema.lua (5 tests)  
      - Schema structure validation  
      - Min/max clamping  
      - Percent normalization  
      - RBAC gating  
      - Legacy key parity  
    - Created tests/integration/test\_config\_persistence.lua (3 tests)  
      - Set/get persistence  
      - Percent storage conversion  
      - Officer-only gating  
    Total: 8 new tests, zero hardcoded options remaining  
    Schema is now single source of truth for ALL config options  
- fix(tests): rewrite core integration tests with synchronous validation  
    Changed from async mocking (which had timing issues) to synchronous unit tests:  
    - TEST-CORE-001: Command mapping validation (3 tests)  
    - TEST-CORE-002: Idempotency guard hash/duplicate logic (5 tests)  
    - TEST-CORE-003: IsOfficerSafe error handling (3 tests)  
    - TEST-CORE-004: Context building verification (5 tests)  
    - TEST-CORE-005: Dangerous command logic validation (3 tests)  
    Total: 19 synchronous tests replacing 6 async tests  
    All tests now validate actual logic without complex mocking  
- feat(core): modernize Core.lua with unified dispatcher and idempotency  
    PHASE 0 - Discovery:  
    - Created LEGACY\_COMMAND\_PARITY.md (19 total commands documented)  
    PHASE 1 - CommandRegistry Extension:  
    - Added 11 missing commands: wishlist, config, debug, discord, verify  
    - Added officer commands: award\_points, subtract\_points, award\_readiness  
    - Added dangerous commands: fix\_database, delete\_player, factory\_reset  
    - All dangerous commands require YES confirmation token for slash  
    PHASE 2 - Core Dispatcher Rewrite:  
    - Implemented TTL CommandExecutionGuard (1.0s duplicate window)  
    - Added Core:ExecuteCommand (idempotency + context + Registry dispatch)  
    - Added Core:IsOfficerSafe (fail-closed wrapper)  
    - Rewrote SlashCommand to use command mapping table  
    - Reduced Core.lua from 905 lines to ~600 (removed 278-line if/elseif chain)  
    PHASE 3 - CommandRegistry Enhancement:  
    - Updated Execute() to accept context and argv  
    - Added alias resolution logic  
    - All handlers now receive (ctx, argv) instead of legacy structure  
    PHASE 4 - Testing:  
    - Created test\_core\_integration.lua (5 tests: dispatch, idempotency, RBAC, dangerous)  
    - Created test\_command\_registry\_parity.lua (24 tests: coverage, aliases, flags)  
    - Added /testcore and /testcommands slash commands  
    - Added 5 smoke tests to USER\_TEST\_BLUEPRINT.md  
    Total Commands in Registry: 24 (13 existing + 11 new)  
    Dangerous Commands: 3 (all require YES + audit logging)  
    Code Reduction: 33% fewer lines in Core.lua  
- docs: add officer tab visibility regression prevention guide  
    Prevent future regressions of officer tabs not showing by documenting:  
    - BuildTabList(), RebuildTabs() pattern required  
    - Show() must call RebuildTabs()  
    - Verification checklist and test procedure  
    - Common mistakes to avoid  
- feat(ui): modernize StandingsFrame with schema-driven rendering  
    - Schema-based columns with extension point for officer-only columns  
    - Strict nil-safety: GetAllPlayersSafe() with pcall fallback  
    - Deterministic Redraw(): clears and rebuilds, no duplicates  
    - Refresh budget guard (0.2s) prevents refresh storms  
    - Stable sorting (primary: selected column, secondary: name)  
    - RBAC visibility: Officers see Pending players, members do not  
    - Debounced filter input (0.3s delay)  
    - Create test\_ui\_standings.lua with 4 unit tests  
    - Add /teststandings command  
    - Update docs with UI-SMOKE-009, UI-SMOKE-010  
- fix(ui): rebuild tabs on Show() to respect officer status changes  
    Tabs were built once at frame creation, but guild rank may not be loaded yet.  
    Now rebuilds tab list every time UI is shown to pick up current officer status.  
- fix(ui): add silent=true to GetModuleSafe to prevent errors  
    GetModule throws error by default when module not found  
- test(ui): add comprehensive UI tests and documentation  
    - Create test\_ui\_mainframe.lua with 10 unit tests (TEST-UI-001 to TEST-UI-010)  
    - Add /testui slash command for in-game testing  
    - Update FILE\_MANIFEST.yaml with UI module coverage  
    - Add 6 smoke tests to USER\_TEST\_BLUEPRINT.md (UI-SMOKE-001/002/003/004/006/007/008)  
    - Document RBAC enforcement, idempotency, refresh behavior  
- feat(ui): add Command Registry and Weights tabs with RBAC enforcement  
    - Create UI/CommandRegistry.lua: centralized command management  
    - Create UI/ConfigSchema.lua: configuration schema with validation  
    - Add Settings tab (officer-only): searchable command execution UI  
    - Add Weights tab (officer-only): categorized config editor  
    - Add helper methods: GetModuleSafe, IsOfficerSafe, SafeCall, RequestRefresh  
    - Fix duplicate Officer Tools tabs  
    - Add idempotent tab creation  
    - Enforce click-time RBAC on all officer actions  
- fix(prep): update to C\_UnitAuras API for WoW 11.0+ compatibility  
    UnitBuff deprecated in TWW. Using C\_UnitAuras.GetBuffDataByIndex with fallback.  
- fix: revert UI/MainFrame.xml + add nil-safe checks for UI module  
    XML causes template inheritance errors. UI module is non-critical.  
    Added nil checks to prevent crashes when UI unavailable.  
    Documented as known issue - UI requires template fix.  
- fix(ui): add MainFrame.xml to TOC to enable UI module loading  
    Fixes 'attempt to index field UI (a nil value)' error when running /cb command  
- Merge branch 'feature/preparation-modernize'  
- chore: remove debug output from passing tests  
    All 15/15 tests now pass cleanly  
- fix(test): TEST-PREP-003 player must have consumables=true to pass default config  
    IsPrepared() was rejecting due to requireConsumables=true + hasConsumables=false  
- debug: add detailed award loop diagnostics  
- fix(test): mock GetModule to ensure EPGP award capture  
    FinishScan uses Cerebro:GetModule('EPGP') which bypassed our mock  
- fix(test): add nil-safe checks and debug output to TEST-PREP-003  
- fix(test): simplify EPGP mock to ensure award capture  
- fix(test): complete all mock result structures with required fields  
- fix(test): complete mock result structure and silence officer messages  
    - Add missing fields to all mock results: gemsMissing, enchantsMissing, consumablesMissing, score  
    - Mock SendOfficerMessage to prevent spam during tests  
    - Fix TEST-PREP-004 scan lock test (CheckRaid early-exits with 0 raid members)  
- fix(toc): remove Communication test references from Preparation branch  
    Communication test files only exist on feature/communication-modernize  
- feat(prep): modernize Preparation module with RBAC, idempotency, config-driven thresholds  
    - Add comprehensive 82-line module header with contracts/invariants  
    - RBAC: Hard gate at CheckRaid entry (officer-only)  
    - Idempotency: Scan lock + session.prepAwarded dedupe  
    - Timeout: 60s overall bound, 2s per-unit, ClearInspectPlayer() calls  
    - Config: minIlvl (560), prepAwardAmount (50) moved to config.prep  
    - IsPrepared() helper: Respects requireGems/Enchants/Consumables toggles  
    - Roster-bound awards: Only award if session.roster[player] exists  
    - Report-only mode: If no session/roster, run report but skip awards  
    - Award reason: Standardized to PREP\_BONUS (was PREP\_CHECK)  
    - Tests: 9 unit tests covering RBAC, idempotency, timeout, toggles, roster bounds  
    - Slash: /testprep command (9 tests)  
    - Docs: Updated FILE\_MANIFEST, USER\_TEST\_BLUEPRINT  
- feat: Add v0.2.0 release artifact and announcement, and refactor Discord upload script to include changelog details.  
- fix(toc): remove Communication test references from RCLC branch  
- fix(rclc): enforce Disenchant ignore and ItemID key usage  
    - Add explicit check for 'disenchant' in award response (case-insensitive)  
    - Add unit tests for Disenchant ignore logic  
    - Add unit test verifying awardKey uses strictly deterministic ItemID, not raw link strings  
- docs: update RCLC\_Bridge test coverage in FILE\_MANIFEST  
- docs: add RCLC test coverage to FILE\_MANIFEST and USER\_TEST\_BLUEPRINT  
- feat(rclc): modernize RCLC Bridge with idempotency and RBAC  
    - Add rclcAwardDedupe to Database.lua defaults (no migration)  
    - Implement deterministic award key (session|winner|itemID|response|status)  
    - Add RBAC enforcement (officer-only GP charging)  
    - Implement atomic commit (dedupe key only after successful ChargeGP)  
    - Add comprehensive module header with security contracts  
    - Ignore Pass/Greed/Disenchant responses  
    - Support test mode with allowTestAwards config  
    - Create unit tests (6/6 passing): /testrclc  
    - Remove duplicate legacy OnRCLCAward function  
- feat: Release v0.2.0 with core EPGP modernization, updated Mythic+ EP scaling, and new M+ config defaults.  
- chore: release v0.2.0 - Core Modernization  
    Major release with comprehensive documentation and testing:  
    - Models/Player.lua: 13 tests  
    - Modules/EPGP.lua: 19 tests  
    - Models/Ledger.lua: 19 tests  
    - Modules/Session.lua: 16 tests  
    - Modules/MythicPlus.lua: 11 tests (with behavior change)  
    Total: 78 new unit tests across 5 core modules  
    Breaking change: M+ guild scaling now 0-4 members (removed hard gate)  
- Merge feature/mythicplus-modernize: Modules/MythicPlus.lua modernization with behavior change  
- Merge feature/session-modernize: Modules/Session.lua modernization  
- Merge feature/ledger-modernize: Models/Ledger.lua modernization  
- Merge feature/epgp-modernize: Modules/EPGP.lua modernization  
- Merge feature/player-modernize: Models/Player.lua modernization  
- docs: add Mythic+ behavior change request to SPEC\_AMBIGUITIES  
- docs: add MythicPlus test coverage to FILE\_MANIFEST  
- feat(mplus): implement guild scaling bonus and remove hard gate  
    - Add M+ config defaults to Database.lua (mplusBase, mplusPerLevel, mplusMaxLevel, mplusGuildBonus)  
    - Add 75-line module header with formula documentation  
    - Update CalculateEPAward: TotalEP = (Base + EffectiveLevel * PerLevel) + (GuildBonus * min(GuildCount, 4))  
    - Remove guildCount >= 4 hard gate (awards base EP always)  
    - Remove 50% penalty for untimed runs (timed and untimed award equal EP)  
    - Create TEST-MPLUS-001/002/003 (12 comprehensive tests)  
    - Guild scaling: 0,1,2,3,4,5 members (capped at 4)  
    - Level cap: +15 treated as +10  
- docs: add Session implementation plan  
- docs: update manifest and blueprint with Session test coverage  
- docs(session): add comprehensive documentation and unit tests  
    - Add 110-line module header with contracts, schemas, invariants  
    - Document StartSession, EndSession, RecordBossKill, UpdateRoster, OnPointChange  
    - Create TEST-SESSION-001 (9 tests for state machine and RBAC)  
    - Create TEST-ROSTER-001 (7 tests for roster tracking)  
    - All contracts validated against code behavior  
- fix(test): use TitleCase player names matching GetFullPlayerName normalization  
- docs(ledger): add comprehensive documentation and unit tests  
    - Add 90-line module header with contracts, schema, invariants  
    - Document AddTransaction, MergeTransaction, ReplayHistory functions  
    - Create TEST-LEDGER-001 (11 tests for transaction integrity)  
    - Create TEST-REPLAY-001 (8 tests for history replay)  
    - All contracts validated against SPEC.md Section 3  
- docs(epgp): add comprehensive documentation and unit tests  
    - Add 80-line module header with contracts, invariants, design decisions  
    - Document GetItemGP, AwardEP, ChargeGP, Decay, AwardReadinessEP functions  
    - Create TEST-ITEM-COST-001 (12 tests for GP calculation)  
    - Create TEST-READINESS-001 (7 tests for weekly cap logic)  
    - All contracts validated against SPEC.md Section 2.3, 2.4  
- build: remove macOS deployment script.  
- fix(test): adjust BaseGP for precision test case in TEST-EPGP-CALC-001  
- feat: Introduce `deploy_local.py` for unified local addon deployment, update versioning scripts to utilize it, and document the new developer workflow.  
- Implemented modern deploy scripts  
- chore: add macOS deployment script with test support  
    - Auto-detects WoW AddOns directory on macOS  
    - Supports --with-tests flag to include test files  
    - Supports --wow-path override for custom installations  
    - Deployed successfully to /Applications/World of Warcraft  
- feat: modernize Player model with comprehensive documentation and tests  
    - Add detailed header documentation explaining contracts from SPEC.md  
    - Document key invariants: 4-decimal PR precision, BaseGP floor, decay mechanics  
    - Add inline comments for GetGP, GetPR, UpdatePR, and Decay functions  
    - Clarify BaseGP vs MinGP decision (links to SPEC\_AMBIGUITIES.md)  
    - Create TEST-EPGP-CALC-001: 9 tests for PR calculation and GP flooring  
    - Create TEST-DECAY-001: 9 tests for decay formula and floor preservation  
    Tests can be run in-game via /testcalc and /testdecay commands  
- chore: add implementation plan for player  
- docs: resolve governance and test id taxonomy  
- docs: lock spec baseline and capture ambiguities  
- chore: remove .Zone.Identifier metadata files  
- Baseline  
    Brownfield modification  
- Release v0.0.47: Fix portrait circle and update docs  
- Docs: Updated version header to 0.0.36  
- first commit  
- Initial release v0.0.36 - DKP Purge and Security Fix  
