Cooldown Manager Ckraigs

addon tracks and displays essential buff icons for World of Warcraft. It provides a customizable, multi-row icon viewer with per-row icon sizing, aspect ratio cropping, and robust skinning. The addon includes a scrollable options menu
Back to Files

CkraigCooldownManager5.3.6.zip

File nameCkraigCooldownManager5.3.6.zip
Uploader
CKRAIGFRIENDCKRAIGFRIEND
Uploaded
Oct 21, 2026
Downloads
155
Size
16.2 MB
Flavors
Retail
File ID
9273706
Type
R
Release
Supported game versions
  • 12.1.7
  • 12.1.5

What's new

# CkraigCooldownManager — Changelog

All notable changes to this addon are documented here.
Format: `## [Version] — YYYY-MM-DD`

---

## [5.3.6] — 2026-10-20

### Changed
- **Reverted the Alt-Z / taint changes from 5.3.2 – 5.3.5.** The code is back to 5.3.1 (the combat CPU improvements from 5.3.0 and 5.3.1 are kept). Known issue: hiding the UI with Alt-Z and bringing it back can still show the Blizzard Cooldown Manager "tainted by CkraigCooldownManager" error; a /reload clears it.

## [5.3.5] — 2026-10-20

### Fixed
- **Alt-Z then Esc: "attempted to index a table that cannot be accessed while tainted"** on the Tracked Buffs (Buff Icon) viewer. When the UI comes back, Blizzard rebuilds that viewer and CCM's hooks on it (new icon set-up, re-layout, icon position, alpha / frame level for Custom Auras, cooldown bars, proc-glow alerts) ran right inside that rebuild. While the UI is coming back they now run one frame later. Normal play is unchanged.

## [5.3.4] — 2026-10-20

### Fixed
- **The remaining "tainted by 'CkraigCooldownManager'" errors** from Blizzard's Cooldown Manager (Alt-Z, loading screens and in combat: auras, charges, totems, cooldowns). Following how EllesmereUI's Cooldown Manager stays clean:
  - **No more CCM data on Blizzard's frames.** CCM used to store ~200 of its own values directly on Blizzard's cooldown icons and viewers (`icon._ebt...`, `viewer._di...`, `_ccm...`, `_cdOverride...`). Writing addon keys onto those frames taints them, and Blizzard's protected aura / cooldown data then refuses them. All of it now lives in CCM's own private table, keyed by frame.
  - **Hook work runs one frame later.** What CCM does when Blizzard shows, hides, resizes or re-lays out its frames (moving icons, hiding alerts, pandemic frames, new icon set-up) now runs on the next frame, outside Blizzard's own refresh, instead of in the middle of it.
  - While the whole UI comes back (Alt-Z / loading screen) CCM's re-layout hooks wait, and run once right after.

## [5.3.3] — 2026-10-20

### Fixed
- **Cooldown Manager "tainted by 'CkraigCooldownManager'" errors** (secret values / protected tables in Blizzard_CooldownViewer), after Alt-Z + Esc and afterwards in combat. 5.3.2 was not enough: CCM still had script hooks (OnShow / OnHide / OnSizeChanged) on Blizzard's own viewer and icon frames. Such a hook runs in the middle of Blizzard's refresh, and everything Blizzard did after it counted as CCM's code. All of them are now secure hooks on the frame's Show / Hide / SetShown / SetSize calls, which hand control back to Blizzard untouched; anything that only changed because the whole UI came back is redone on the first frame afterwards. CCM's own frames' show / hide / size scripts stay switched off while the UI is hidden. Same features, same behaviour.

## [5.3.2] — 2026-10-20

### Fixed
- **"attempted to index a table that cannot be accessed while tainted (execution tainted by 'CkraigCooldownManager')"** in Blizzard_CooldownViewer after hiding the UI (Alt-Z) and bringing it back (Esc / Alt-Z), or right after a loading screen. When the whole UI comes back, every frame fires its "shown" script inside Blizzard's own Cooldown Manager refresh, and CCM's scripts running in that chain got blamed. Now, while the UI is hidden, CCM's show / size scripts on its own frames are switched off and its hooks on Blizzard's frames do nothing; on the first frame after the UI is back they are switched on again and their work is redone once. CCM no longer hooks UIParent itself. Nothing changes during normal play.

## [5.3.1] — 2026-10-20

Second combat CPU pass, based on a new deep trace of every CCM function in a real fight. Nothing looks or behaves differently.

### Changed
- **Hooks on Blizzard frames** (100,000+ calls per fight): no longer run through an extra timing wrapper. `/ccmprofile` still times them. The first run switches it on, then `/reload` and run `/ccmprofile` again to see the hook list.
- **Show Actual Cooldown** (Essential Buffs): when Blizzard sets an icon's desaturation to the value CCM wants anyway, CCM no longer sets it again. The glow / sound / override checks and the glow list are worked out at most once a second instead of on every pass, and the native pandemic frames are looked up once per frame instead of once per icon.
- **Target Count**: only nameplates that exist are walked, with direct game calls, and the threat check comes first so most plates are rejected with one call.
- **Bloodlust / Sated tracking**: with no lust debuff on you, aura changes are bundled into one check per 0.25s (was a full check on every aura change).
- **Trinkets / potions**: the cooldown swipe is only set again when the cooldown actually changed.
- **Buffs sent to Essential / Utility**: icon texture and stack text are only set when they changed.

## [5.3.0] — 2026-10-20

Big combat CPU pass. Every CCM function was measured in a real fight (a full deep trace of all ~5,800 functions), and the worst offenders were rewritten. Nothing looks or behaves differently.

### Changed
- **Show Actual Cooldown / charges** (Essential Buffs): which of an icon's spell IDs has charges is now remembered until your talents or spells change, instead of being worked out again (with new tables and ~10 game calls) every time Blizzard updates the cooldown - about 70 times a second in combat. The desaturation check is also done once per frame instead of several times.
- **Pandemic Glow checkbox** (Essential Buffs): the per-spell setting is looked up once per icon and remembered until the icon shows another spell or you change the option, instead of on every update.
- **Icon Extras**: the 1-second pass only redoes the parts that can change on their own (charge countdown, ready/cooldown rules, only-numbers, glow fading). Shapes, timers and custom icons are still fully re-applied every 5th pass and right after an icon is re-skinned.
- **Proc glows**: Blizzard hides spell alerts on every action button all the time; CCM now skips buttons where it has no glow to stop (was ~100 calls a second).
- **Target Count**: only nameplates that exist are checked (was all 40 nameplate slots, 4 game calls each, on every update).
- **Cooldown Bars**: the full re-layout only runs when the set of visible bars changes. Before, a harmless change in the order Blizzard lists its bars made it re-run about 3 times a second in combat.
- **Bloodlust / Sated tracking**: while the debuff is up, it is checked at most once a second (was on every aura change on you).
- **Power Thresholds**: power / usable events are checked at most 10 times a second instead of on every event.
- **Buffs sent to Essential / Utility**: no new temporary functions on every update.

## [5.2.1] — 2026-10-18

### Added
- **Charge gained sound** (Essential Buffs / Utility Buffs > pick a spell > Sound): new **Charge gained** option - **Also** plays the spell's sound every time a charge (or stack) comes back, on top of its normal trigger; **Only** plays it just then. Blizzard's Cooldown Manager times the charge itself, so it works in combat.

### Fixed
- **Vengeance Soul Fragments bar** kept changing size and lost its place next to the other resource bars. With "Match width" on it now takes the width of the bars it is stacked on right away, instead of jumping back to its saved width (120 px) every time it refreshed - which in combat stayed wrong until combat ended. The divider ticks are also redrawn when the bar shows again (after mounting / leaving combat), so they line up with the segments.

## [5.2] — 2026-10-13

New per-spell look for active auras, stack sounds, more features from the WoW Forever edition, and the 12.1.5 updates.

### Added
- **Active Aura Look** (Essential Buffs / Utility Buffs > pick a spell > Aura Timer): per spell, replace Blizzard's yellow fill while the spell's buff is active with **Fill - your colour**, **Border only**, **Pixel glow**, **Autocast glow**, **Proc glow** or **No fill, no glow**. Colour and thickness per spell; "Reset This Spell" clears it. With Show Actual Cooldown on, the dark cooldown swipe stays and the look is added on top.
- **Sound on each new stack**:
  - **Custom Auras**: new per-aura option next to "Sound when gained" / "Sound when it fades".
  - **Dynamic Icons**: new per-spell option in the Sound section (for Buff Icon Cooldown Viewer spells). **`/ccmstack`** shows which buff IDs each one is registered for.
  - The game itself plays the sound, so it works in combat. For buffs on you that track one spell ID and aren't "only mine"; SharedMedia sounds only (no TTS).
- **Custom Auras**:
  - **Tooltip on hover** (with "Not in combat" and a tooltip position) and **Right-click to cancel** for buffs on you.
  - Gain / fade sounds for single-spell buffs on you are now played by the game, so they also work in combat.
- **12.1.5** (only show up on 12.1.5):
  - Custom Auras **Highlight style** for the pandemic highlight: Static, Pulse or Pop.
  - Custom Auras **When it appears: Flash** with its own colour.
  - Custom Auras **Caster name** (above / below, class colour).
  - Custom Auras stack bar **Show from stacks**: the bar appears once the aura reaches that many stacks.
  - Thin borders and lines snap to whole pixels.
- **TOC**: interface 120105 added for the 12.1.5 PTR.
- **Ready for 12.1.7** (only switches on with interface 120107 or newer, nothing changes on 12.1.5):
  - **Keybind text** on potion / healthstone icons uses the potion you actually used (12.1.7 keeps the base spell on the icon and stores the used one separately).
  - Group buff list reads the new **display rank** (your highest known rank).

### Changed
- **Show Actual Cooldown** now applies the moment you tick or untick it (no /reload needed).
- **Tracked Spells**: removed calls to Blizzard functions that don't exist (`AddTrackedCooldown` / `RemoveTrackedCooldown`); they never did anything.
- **Target Count** also shows on "Show inactive" icons, and shows **0/0** when there's nothing to count ("Hide at 0" hides it).
- **Segment Bars**: spells without charges show as one charge on charge bars (full when ready, refilling on cooldown).

### Changed (CPU)
- **Custom Auras**: at login, at most 3 icons are built per frame.
- **Target Count**: its meters are built a few frames at a time instead of in one freeze.
- **Keybind labels**: the search for your action buttons runs in the background (in combat it reuses the buttons it found and looks again after the fight); range changes only recolour the labels.
- **Tracked Spell States**: at most one update every 0.15 s, and it listens to the normal power event instead of the "frequent" one.

### Fixed
- **12.1.5**: the old global item functions are removed in 12.1.5. Potions, trinkets / racials, Tracked Spells item counts and keybind labels now use the C_Item versions (no errors or 0 counts after the patch).
- **Segment Bars**: full charges no longer disappear and the fill no longer restarts on every global cooldown.
- **Custom Auras**: an icon that failed to build could keep the addon retrying every frame and stop other icons (and the gain / fade sounds) from working.

## [5.1] — 2026-10-08

Features and fixes brought over from the WoW Forever edition, including its options window look.

### Added
- **Options window themes** (same as CCM Forever), on Interface & Appearance in the new window:
  - 21 colour themes plus Classic, picked from cards. "Forever (gold & teal)" is the default.
  - Modern look: rounded corners, soft edge glow, sliding on/off switches (or check boxes), round slider knobs, rounded tabs / buttons / dropdowns, and an icon for every page in the left list.
  - Per-theme tweaks: accent colour, corner roundness, glow strength, switches or check boxes, plus "Reset theme tweaks". Button styles can be set per kind (page list, tabs, lists, buttons, dropdowns).
  - **Guide & Previews** follows the chosen theme and rebuilds straight away when it changes.
  - The classic (Ace3) window keeps its own Themes page.
- **Options window with a controller**: D-pad up / down moves between settings, left / right changes a value, A uses, B closes, X jumps to search, Y opens the Guide, LB / RB switch pages, LT / RT scroll. A **controller hint bar** along the bottom shows what each button does (Interface & Appearance > Controller hint bar: Auto / Always / Never).
- **Confirm questions** (reset, delete...) in the new window use its own themed box instead of the game's popup.
- **Keybind labels for controllers**: when a gamepad is in use, icons show the controller button that casts the spell (A / B / X / Y, LB, RT, LT+A...), read from the bars that are on screen (gamepad bars and bar addons included). Keybinds > Gamepad: "Show keys for" (Auto / Keyboard / Gamepad) and "Controller buttons" (Xbox, PlayStation or plain text).
- **Key Bindings** (Game Menu > Key Bindings > AddOns > Ckraig Cooldown Manager): open / close the options and open the Guide from a key or controller button.
- **Clusters (groups)**: every Clusters tab (Dynamic Icons, Essential, Utility, Cooldown Bars) now reads "Clusters (groups)", and hovering it explains what cluster groups are.
- **Dynamic Icons: "Keep the first row in place"** (General, on by default): when icons wrap into more rows, the first row stays where it is and new rows go below it (or above, with "New rows go"). Off = the whole block re-centres like before.
- **Power Thresholds** has its own tab next to Power Bar (was inside the Power Bar page), and tells you when no spells that cost your resource were found.
- **Tracked Spells: `/ccmtrinket`** prints what Tracked Spells sees for trinket slots 13 / 14 (item, Use: effect, data loaded, icon shown).
- **Profiler: `/ccmprofile frames [seconds]`** lists the CPU used by every frame's scripts in the whole UI (all addons), with CCM's own frames listed separately.

### Changed (CPU)
- **Power Thresholds**: spell and cost lookups are cached until spells, spec or talents change. Power ticks only redraw when a marker's "can I afford it" answer flips, and markers that only draw a line ignore power ticks completely.
- **Totems**: with icon style the timer sleeps until a totem reaches its warning window. Bar style updates 4x a second (10x under 10 s, 20x only while pulsing), and text / colours are only set when they change.
- **Glows**: Tracked Spells pixel / autocast glows and the Icon Extras "glow when ready" update 30x a second instead of every frame. They look the same and keep their speed.
- **Cooldown Bars**: the cluster compaction check runs every 2 s instead of every 0.5 s.

### Fixed
- **Tracked Spells: trinkets missing after a fresh login** (they only appeared after a /reload). Trinkets are kept visible for the first seconds and re-checked 2 / 6 / 13 s after login, after every loading screen, and when the item data arrives.
- **Tracked Spells**: "Attempted to release object ... doesn't belong to this pool" when another addon's newer copy of LibCustomGlow had already removed the glow.
- **Keybind labels with stances and forms** (Druid forms, Rogue stealth...): only the action bar page that is showing right now gives a 1-12 label, so spells on another form's bar no longer show the wrong key. Labels update on form change.

## [5.0] — 2026-10-05

Big feature update ported from the WoW Forever edition, a full CPU tuning pass, and a tidier addon folder.

### Added
- **Curved bars** (CkArcBars library, 24 arc styles in `media/arcs/`): Health, Power and Druid Mana bars, Cooldown Bar clusters, Segment Bars and Custom Aura bars can be drawn as a curve (Shape = Curved). Vertical / Horizontal stay the default.
  - Cooldown Bars: "Curved (arc textures)" in each cluster's Flow Direction list, with Curved Style, Curved Side and fill / background / outline opacity. Clusters also get their own icon size and offsets.
- **Weapon art styles**: 29 full-colour weapon textures (axes, swords, warglaives, staves, maces, bow, scythe, daggers...) in every Curved Style list as "Weapon art: ...". They keep their own colours instead of the bar colour; upright for Left / Right (fills hilt to tip), flat for Up / Down.
- **Stance / Form filter** (Essential + Utility): show a spell only in chosen stances, forms or stealth.
- **Custom Auras rework**: multiple groups, one-icon groups, per-class lists (the old list is migrated automatically), curved bars, and groups can attach to a Dynamic Icons cluster.
- **Tracked Spells**: Move Up / Move Down per spell; the order is kept inside Essential / Utility / Dynamic Icons too.
- **Guide window**: Curved Bars and Stance / Form filter pages.
- **Profiler** (`/ccmprofile`):
  - `/ccmprofile events [seconds]`: CPU per event, out of combat vs in combat, and which file owns it.
  - New "HOOKS ON BLIZZARD FRAMES" section: every hook the addon puts on Blizzard frames is timed (file:line + method).
  - `/ccmprofile trace <name>` now works on live game clients.

### Changed (CPU)
- **Tracked Spells**: entering / leaving combat no longer rebuilds every icon (~1 ms each time) unless "show only in combat" or an only-on-cooldown / only-when-ready spell needs it.
- **Tracked Spell States**: the red attack flash runs on a timer instead of every frame; the range safety net only redraws icons whose range changed (every 2 s in combat, 5 s out of combat).
- **Target Count**: no timer out of combat; every 0.5 s in combat (was 0.1 s), and widgets are only touched when something changed.
- **Icon Extras**: decoration pass every 0.5 s in combat, every 2 s out of combat (was 0.25 s always); cached formatters and shape keys, hidden viewers skipped.
- **Pandemic glow suppression**: 4 sweeps a second in combat, 1 a second out of combat (was 4/s always), and the expensive per-icon search (~0.5 ms per pass) is skipped where Blizzard's pandemic pool is already hooked.
- **Dynamic Icons**: alpha watchdog every 2 s out of combat.
- **Essential Buffs**: pandemic ticker every 2 s out of combat (0.5 s in combat).
- **Totems**: fast updates only while a totem is in its warning window; otherwise every 0.5 s.
- **Trinkets & Racials**: looting / selling only rebuilds the icons when a tracked potion or healthstone count changed.
- All event registrations go through `CCMF_RegisterEvent` / `CCMF_RegisterUnitEvent` (unknown events are skipped instead of erroring, and the event profiler can see every handler).

### Changed (addon folder)
- **One loader per folder**: the `.toc` now lists 13 `Load_<Folder>.xml` files (Libs, compat, locale, core, utils, data, profiles, trackers, cooldownbars, ResourceBars, PresetProfiles, visuals, ui) instead of every file. Same files in the same order; Cooldown Bars now loads right after the trackers. A full game restart is needed once after updating.

### Fixed
- **Profiler**: starting `/ccmprofile` could throw "script ran too long" (it walked every frame in the UI for nothing); counters captured once were lost on the next run.
- **Segment Bars**: not built after `/reload`; choosing a Weapon art style threw an error.
- **Resource bars**: the stack is rebuilt in combat when the set of visible bars changes (e.g. combo points on entering Cat Form).

## [4.3.0] — 2026-07-23

Patch 12.1 compatibility pass, Aura Slots duration bars, and the potion tracking system.

### Added
- **Aura Slots: group Display Mode** (`Auraslots.lua`, `ui/options/AuraSlotsOptions.lua`): the Display Mode dropdown now switches an entire group between **Icons** and **Bars** in one step, instead of toggling each spell individually.
  - `SpellWantsBar()`: a spell renders as a bar when the group is in Bars mode *or* that spell has its own Duration Bar override, so per-spell bars still work inside Icons mode.
  - Spells rendering as bars are excluded from the icon container, so a Bars-mode group shows no leftover icons.
- **Aura Slots: duration bar layout controls** (`ui/options/AuraSlotsOptions.lua`): per-group **Bar Growth Direction** (up/down) and **Bar Vertical Gap** (0–30px, `barVerticalGap`). A gap of `0` packs bars flush.
- **Aura Slots: per-spell duration bar colours** (`Auraslots.lua`, `ui/options/AuraSlotsOptions.lua`): each spell can override the group's bar **Fill** and **Background** colours, with a **Reset Bar** button to fall back to the group colour.
  - `ResolveBarFill()` / `ResolveBarBG()`: resolve per-spell override → group colour → default, reusing the existing override cache so there is no per-frame cost.
- **Aura Slots: 12.1 aura API support** (`Auraslots.lua`):
  - `AddAuraSound` / `RemoveAuraSound` (renamed from `AddAuraAppliedSound` in 12.1 PTR 6) resolved at load with automatic fallback to the old names, plus a per-spell **When** trigger (Added / Stack gained / Removed).
  - `layoutIndex` passed in the aura group layout options for deterministic group draw order.
  - `SetAuraGroupFilterString` applied after group creation so a group's filter can change without a full rebuild.
  - `excludeSpellIDs` and boolean candidate-filter negation (`isStealable = false`) passed through to `candidateFilters`.
- **Potion tracking system** (`trackers/items/TrinketRacials.lua`, `ui/options/TrinketRacialsOptions.lua`): add and remove potions by item ID, per-potion role filter (All / Healer / Tank / Damager), a separate healer mana section, **Scan Bags** to find untracked potions, and manual Up/Down priority ordering.
  - Crafted-quality (rank) detection via a three-layer cascade: `C_TradeSkillUI.GetItemCraftedQualityByItemInfo`, tooltip atlas scan, then a bag-instance link scan for single-ID multi-rank items.
  - **Auto-add other ranks**: probes neighbouring item IDs and adds same-name rank siblings automatically.
  - Effective potion lists cached per category and role.
- **Preset profile toggle** (`ui/options/PresetProfilesUI.lua`): **Enable Preset Profiles** checkbox (default on). Disabling releases the preset string tables at login.
- **Action bar proc glow override** (`ui/options/GlowOptions.lua`): optional **Also Override Action Bar Proc Glows** checkbox (default off). Proc glow handling is otherwise scoped to CCM viewers only.
- **Default (Blizzard) bar texture** (`cooldownbars/BarCore.lua`): restores Blizzard's native atlas fills in place rather than substituting a flat statusbar texture.

### Changed
- **Aura Slots duration bars now use the native `SetDurationBar` path** (`Auraslots.lua`): Blizzard drives the fill from the secure side, which is the only way duration bars can function during combat now that aura timing is secret. Bars fill left-to-right rather than draining — an accepted trade for bars that work mid-fight.
- **Aura Slots bar packing** (`Auraslots.lua`): visible bars are placed contiguously from the group anchor, advancing by each bar's **measured** height plus the configured gap rather than the height *setting*, so bars touch exactly at a gap of `0` regardless of height configuration.
- **Aura Slots Edit Mode anchor** (`Auraslots.lua`): in Bars mode the group's Edit Mode frame is sized to the bar dimensions (`durationBarWidth` × `durationBarHeight`) instead of a square icon, so the selection highlight matches what actually renders.
- **Resource bar restacking is deferred during combat** (`ResourceBars/ResourceBarsCore.lua`): `RestackAllViewers()` returns early while in combat and flags a reconcile, which runs once on `PLAYER_REGEN_ENABLED`. Prevents any in-combat relayout from nudging anchored bars.
- **Glow settings normalisation is cached** (`visuals/GlowManager.lua`): `normalizedGlowCache` with `InvalidateGlowSettingsCache()` reduces `NormalizeGlowSettings` from thousands of calls per minute to one per settings change.
- **Essential Buff Tracker pandemic polling** (`trackers/buffs/EssentialBuffTracker.lua`): revision-stamped light pass so the 0.5s ticker only touches icons that have not already been stamped.

### Fixed
- **Aura Slots: bars did not build in Bars mode** (`Auraslots.lua`): with every spell rendering as a bar the icon count fell to zero, and the builder returned before creating the aura container or its duration-bar slots. The early return now falls through whenever the group has bar spells, and the group anchor stays shown so bars have a valid anchor point.
- **Aura Slots: bar list ignored group Bars mode** (`Auraslots.lua`): `durBarSids` required a populated `spellOverrides` table, so a Bars-mode group with no per-spell overrides collected no bar spells at all.
- **Aura Slots: bars left a gap when one expired** (`Auraslots.lua`): a bar that timed out hid itself from its own `OnUpdate` without triggering a relayout, so the remaining bars kept their old positions. Expiry now requests a coalesced re-pack (`_RequestDurationRepack`) and the remaining bars close up immediately.
- **Aura Slots: stale bar range on recycled bars** (`Auraslots.lua`): pooled bars kept the previous spell's max value, producing a fill fraction that did not match the time shown. The bar's duration is now stored on the frame and the range re-asserted each update.
- **Aura Slots: duration bars vanished in combat** (`Auraslots.lua`): the FontString laundering used to read secret `expirationTime` was closed by the 12.1 `FormatNumber` secret fix. When an aura is present but its timing is unreadable the bar now stays visible as a static full bar instead of hiding; the countdown resumes out of combat.
- **Aura Slots: retired "bars" display mode rendered nothing** (`Auraslots.lua`, `ui/options/AuraSlotsOptions.lua`): the old `CCM_AuraBars` renderer no longer exists, so groups saved in that mode silently displayed nothing. Bars mode is now backed by the duration-bar renderer, and `NormalizeDisplayMode()` migrates saved values correctly.
- **Aura Slots: dispel-type border options did not match the real API** (`Auraslots.lua`): rebuilt against the documented `CustomAuraButtonBorderOptions` structure (`style = "Color"`, `customDispelColorMap`). The border is coloured by dispel type, not by remaining duration; the earlier duration-curve implementation could never have worked. The option was subsequently removed from the panel as it applies to icons rather than bars.
- **Essential viewer icons shifted on proc** (`trackers/buffs/EssentialBuffTracker.lua`): icons were anchored `TOP → viewer TOP`, so they were horizontally centred on a viewer whose width changes when a proc triggers a relayout; the whole row rode the centre by half the width delta and only settled after combat. Icons now anchor to the viewer's `TOPLEFT` using a fixed width origin, with `maxRowWidth` pre-scanned before placement so every row shares the same origin.
- **Resource bars slid sideways on proc** (`trackers/buffs/EssentialBuffTracker.lua`): the `_ccmResourceAnchor` frame was anchored to the viewer's `TOP` (centre) and moved with the same width swing, dragging every anchored resource bar with it. The anchor is now pinned to the viewer's stable `TOPLEFT` corner.
- **Login bar flash** (`cooldownbars/BarCore.lua`): bars no longer flash their default texture before saved styling is applied.
- **240 ms login hitch** removed: dropped a forced `collectgarbage()` during initialisation.
- **Devourer Demon Hunter Void Ray indicator** (`ResourceBars/PowerBar.lua`): documented that `InvalidateDevourerCache()` is not wired to `PLAYER_SPECIALIZATION_CHANGED`, so the indicator can remain stale after a respec until `/reload`.

### Performance
- **Aura Slots sound watcher coalesced** (`Auraslots.lua`): `UNIT_AURA` previously ran a full sound pass on every event. The handler now sets a pending flag and defers the work by 0.05s, collapsing a burst of events into a single pass.
- **Configured sound list cached** (`Auraslots.lua`): `GetConfiguredSoundList()` caches the flattened spell/sound list against `_visRevision` instead of walking every group's `spellOverrides` on each pass, and exits immediately when no sounds are configured.
- **Preset strings released at login**: reclaims roughly 2.3 MB when preset profiles are disabled.
- All three `UNIT_AURA` watchers use `RegisterUnitEvent(..., "player")` and unregister entirely when their feature is unused.

### Known limitations (Patch 12.1)
- Aura duration and application counts are **secret during combat**, encounters, M+ and PvP. Addon-drawn bars cannot read them, and the FontString laundering workaround was closed in 12.1. Duration bars therefore rely on the native `SetDurationBar` path, which Blizzard drives.
- Clients without `AuraContainer:AddAuraSlot` cannot show native duration bars at all; those groups fall back to addon-drawn bars, which display presence but not a live countdown in combat.
- Segmented stack bars were prototyped and removed: the live application count is secret in combat, and the native `SetApplicationCount` writes a text region rather than a value that can drive a bar fill.

---

## [4.2.3] — 2026-06-17

### Fixed
- **CooldownBars cluster mode dynamic repositioning** (`cooldownbars/BarCore.lua`): cluster mode bars now automatically compact when cooldowns expire, moving remaining bars to fill gaps without requiring user ability presses.
  - `IsClusterBarClearlyInactive()`: new filter function with 0.1s grace period (reduced from 1.0s) to determine when bars should be hidden from layout
  - `BuildOrderedBarsForCluster()`: filters out inactive bars before layout, hides them with `alpha=0`
  - Automatic refresh ticker: 0.5s periodic check triggers `ScheduleBBUpdate()` when expired bars are detected, enabling real-time compaction
  - Function ordering: moved `IsClusterBarClearlyInactive()` definition before `BuildOrderedBarsForCluster()` to prevent nil function errors
- **CooldownBars cluster mode grow directions** (`cooldownbars/BarCore.lua`): grow-up and grow-down now maintain stable corner pinning (TOPLEFT for grow-down, BOTTOMLEFT for grow-up) preventing bars from shifting position during layout updates.

---

## [4.2.2] — 2026-06-09

### Added
- **Tracked Spells: Only Ready visibility toggle** (`ui/options/TrackedSpellsOptions.lua`, `trackers/cooldowns/TrackedSpells.lua`): per-spell option to show an icon only when the spell is ready; mutually exclusive with **Only On Cooldown**.
- **Tracked Spells: group clear action** (`ui/options/TrackedSpellsOptions.lua`): each tracked-spell group now has a **Remove All Spells** button to wipe all tracked entries in that group at once.
- **Segment Bars: display segment override** (`trackers/cooldowns/SegmentBars.lua`, `ui/options/SegmentBarsOptions.lua`): added a separate **Display Segments** setting so high-stack buffs can map a large real max (for example `100`) onto a smaller visible segment count (for example `5`).
- **Segment Bars: segment mapping helper text** (`ui/options/SegmentBarsOptions.lua`): spell options now show a live explanation of how many real stacks each displayed segment represents.

### Changed
- **Tracked Spells cursor mode layering** (`trackers/cooldowns/TrackedSpells.lua`): cursor-anchored icons now render on higher strata/frame level so they stay visible over party and raid frames during mouseover healing.
- **Segment Bars count semantics** (`trackers/cooldowns/SegmentBars.lua`, `ui/options/SegmentBarsOptions.lua`): `maxSegments` now acts as the real tracked max count, while visual slot count is controlled separately by the optional display override.

### Fixed
- **Tracked Spells render gating** (`trackers/cooldowns/TrackedSpells.lua`): spellbook/action/flyout entries that resolve poorly through `IsSpellKnown()` now still render when a valid spellbook slot exists.
- **Tracked Spells options locale regression** (`ui/options/TrackedSpellsOptions.lua`): removed AceLocale dependency from the new group-clear button text to prevent missing-locale-entry errors in the options panel.

## [4.2.1] — 2026-06-08

### Added
- **Vengeance DH Soul Fragment tracker** (`ResourceBars/VengeanceSoulTracker.lua`): dedicated segmented bar showing live Soul Fragment count (spell 247454) for Vengeance Demon Hunter.
- **Guardian Druid Ironfur tracker** (`ResourceBars/IronfurTracker.lua`): overlapping timed segment bars for Ironfur stacks (spell 192081). Each cast creates an independent draining segment; supports Reinforced Fur and Guardian of Elune talent detection.
- **Brewmaster Monk orb tracker** (`ResourceBars/MonkOrbTracker.lua`): segmented bar for Press the Advantage orbs (spell 322101) for Brewmaster Monk.
- **Fury Warrior Whirlwind tracker** (`ResourceBars/WarriorWhirlwindTracker.lua`): segmented bar for Improved Whirlwind stacks tracking generators (Whirlwind, Thunder Blast) and spenders (Bloodthirst, Raging Blow, Execute, Impending Victory). Supports Unhinged talent.
- **Enhancement Shaman Maelstrom tracker** (`ResourceBars/MaelstromTracker.lua`): segmented bar for Maelstrom Weapon stacks (buff 344179).
- **CooldownBars documentation stubs** (`cooldownbars/SpellIdentity.lua`, `ClusterAnchors.lua`, `BarLayout.lua`, `BarStyle.lua`, `BarOptions.lua`): not loaded by the addon — serve as indexed code-navigation references for `BarCore.lua` sections.
- **enGB locale** (`locale/enGB.lua`): British English stub registered with AceLocale; falls back to enUS. British spelling overrides can be added as needed.
- **TOC patch 120007** added to supported interface versions.

### Changed
- **DynamicIcons OOC fast-path gate**: spell fingerprint cache (`_di_spellFingerprint`) skips the full sort/skin/cluster layout pass out of combat when the visible spell set is unchanged, reducing idle overhead.

---

## [4.1] — 2026-06-01

### Added
- **Locale translations** for French (frFR), German (deDE), Spanish/EU (esES), and Spanish/LATAM (esMX): all ~280 UI field labels translated across all option panels.
- **Locale stubs** for Italian (itIT), Korean (koKR), Brazilian Portuguese (ptBR), Russian (ruRU), Simplified Chinese (zhCN), and Traditional Chinese (zhTW): files present and registered; all strings fall back to English via AceLocale until translations are provided.
- **Fleeting Potion of Recklessness R3** (item ID 245902) added to power potion tracking (`POWER_POTIONS`, `TRINKET_POWER_POTIONS`, `ITEM_RANKS` with gold rank indicator, `DEFAULT_POTION_DURATIONS`).

### Changed
- **All 13 option panel files** (`ui/options/*.lua`) had hardcoded English strings replaced with `L["..."]` lookups, enabling full UI localisation for any supported locale.
- **Tab labels and option panel titles** are now localised (previously hardcoded English strings were passed directly to AceConfig `name` fields).
- **Icon Size, Icon Width Override, Icon Height Override, and Row Size sliders** now use `step = 0.1` (previously `step = 1`), allowing decimal values such as `34.1`.
  Applies to Essential Buff Tracker, Utility Buff Tracker, and all per-cluster icon size settings.
  Note: the Atlas arrow buttons on these sliders now adjust by 0.1 per click.
- **SkinIcon** (`EssentialBuffTracker.lua`) no longer rounds icon dimensions back to integers after `SetSize`, preserving sub-pixel decimal sizes set via the UI.

---

## [4.0] — 2026-06-01

### Added
- **Profiler** (`utils/Profiler.lua`): lightweight CPU profiler using `debugprofilestop()`.
  Hook any CCM frame or function via `/ccmprofile start [seconds]`, stop early with `/ccmprofile stop`, view results with `/ccmprofile report`.
- **AceLocale** infrastructure: `locale/enUS.lua` with English strings. Other languages can be added in `locale/<locale>.lua`.
- **Preset profiles** for all 39 class/spec combinations.
- **Defensive Aura tracker** (`trackers/buffs/DefensiveAuraTracker.lua`).
- **Spell Keybind Overlay** (`visuals/SpellKeybindOverlay.lua`): shows active keybind text on tracked spell icons.
- **Segment Bars** (`trackers/cooldowns/SegmentBars.lua`): segmented resource-style tracking bars.
- **Cluster mode** in CooldownBars: up to 10 independent anchor groups with per-cluster grow direction.
- **LibEditMode** integration for drag/position persistence across Edit Mode layouts.
- **Resource Bars** module: Health, Power, Alt Power, Class Resources (Combo Points, Runes, Maelstrom, Brew Stacks, Soul Shards, Orbs).
- **Atlas arrow buttons** on all AceGUI sliders for precise 1-step adjustment.

### Changed
- TOC Title changed from `CkraigCooldownManager` to `CCM - Cooldown Manager`.
- TOC Category changed from `Unit Frames` to `Action Bars`.
- All bar styling now always runs fully (removed `_bb_styleVersion` gating that could cause visual inconsistencies).
- `BarCore.lua` is the single-file master module — SPELL IDENTITY and CLUSTER ANCHORS sections are inline, not split out.

### Removed
- Root-level `colorpickers.lua` (dead code, superseded by `ui/ColorPickers.lua`).
- Root-level `ProfileManager.lua` (dead code, superseded by `profiles/ProfileManager.lua`).
- `CkraigCooldownManager_NEW.toc` (duplicate of main TOC).
- `frescotest.lua` (empty dev scratch file).
- `GlowManager_README.txt` (generic content, covered by inline code comments).

### Fixed
- `GetBestPotionCooldown` calls in `TrinketRacials.lua` updated for TWW API changes.
- AceGUI dropdown `OnPulloutClose` / `OnRelease` contamination fixed.
- AceGUI slider `SetBodyState` HookScript guard added.
- Atlas arrow buttons (`Minimal_SliderBar_Button_Left/Right`) added to all sliders.

---

## [3.x] — Prior versions

Pre-4.0 history not tracked. Version 4.0 is a substantial rewrite adding Resource Bars, Preset Profiles, Profiler, and the Cluster anchor system.

This mod has no additional files