    self:RefreshData();
end
New also calls:
luaself:CheckSetPandemicAlertTriggerTime();
What to change: If your addon tracks pandemic windows, make sure aura update events also re-evaluate the pandemic trigger time, not just on active state changes.
RefreshIconBorder now uses cached aura data
Old: self:GetAuraData() (live call)

New: self:GetAuraDataCached() (cached)
What to change: If you call GetAuraData() for border/debuff display, switch to the cached version to avoid redundant API calls per frame.
CheckSetPandemicAlertTriggerTime renamed (typo fixed)
Old: CheckSetPandemicAlertTiggerTime (missing an 'r')

New: CheckSetPandemicAlertTriggerTime
What to change: Any call site using the old typo'd name will break. Search your addon for TiggerTime and rename to TriggerTime.
ooldownViewerBuffItemMixin:IsExpired is now a proper method
Old: ShouldBeActive directly checked totem/aura expiration inline and had no separate IsExpired.

New: A dedicated IsExpired() method was extracted, and ShouldBeActive now calls it plus adds a RefreshLinkedSpell check — if a linked spell is still active after expiry, it marks dirty and stays active.
What to change: If you override ShouldBeActive on buff items, you should now check IsExpired() separately and also handle the linked spell fallback case.
CooldownViewerBuffItemMixin:OnActiveStateChanged changed
Old: Called self:CheckSetPandemicAlertTiggerTime(self:GetAuraData()) only when active.

New: Calls self:CheckSetPandemicAlertTriggerTime() with no arguments (uses cached data internally).

CooldownViewerBuffBarItemMixin:OnUpdate gained dirty check
Old: Always called RefreshCooldownInfo and RefreshActive when active.

New: Also checks IsDirty()/Clean() before the refresh, meaning a full RefreshData fires if something marked it dirty instead of just the lightweight cooldown refresh.
What to change: If you have bar items that need full refreshes mid-update, use the MarkDirty() pattern rather than calling RefreshData directly from event handlers.

CooldownViewerMixin:OnShow and OnHide added SPELL_UPDATE_ICON
Old: Not registered.

New: Registers/unregisters SPELL_UPDATE_ICON and routes it to itemFrame:OnSpellUpdateIconEvent().
What to change: If your addon has a cooldown viewer-style frame and you weren't handling SPELL_UPDATE_ICON, add it so icons update when spells change their icons (e.g. talent swaps).

CooldownViewerMixin:OnUnitAura unit filtering removed
Old: Only processed removed/updated/added auras when unit == "player", and did a full target refresh when unit == "target".

New: Processes all aura changes regardless of unit, removing the if unit == "player" branch entirely.
What to change: This is a significant behavioral fix. If your addon filters unit aura processing by unit, remove that filter — both player and target aura changes should route through the same removed/updated/added logic.

UnregisterAuraInstanceIDItemFrame now cleans up empty tables
Old: Just called tDeleteItem and left an empty table.

New: Also does self.auraInstanceIDToItemFramesMap[auraInstanceID] = nil when the list empties.
What to change: Minor memory leak fix. Apply the same cleanup if you maintain a similar map.

File 2 & 6: CooldownViewerItemData
FindLinkedSpellForCurrentAuras now scans both player and target
Old: Only scanned player using C_UnitAuras.GetPlayerAuraBySpellID.

New: Iterates scanUnits = { "player", "target" } and uses C_UnitAuras.GetUnitAuraBySpellID(unit, spellID), also returning the full auraData object, not just the spellID. Crucially it also now checks auraData.sourceUnit == "player".
What to change: If you use linked spell detection, update to scan both units and filter by sourceUnit == "player" to avoid picking up enemy auras on the target.

OnCooldownIDSet now calls RefreshLinkedSpell instead of inline logic
Old: Manually called FindLinkedSpellForCurrentAuras and SetLinkedSpell inline.

New: Delegates to self:RefreshLinkedSpell() which handles both the scan and the SetAuraInstanceInfo call.
What to change: If you override OnCooldownIDSet, call RefreshLinkedSpell() rather than doing the linked spell scan manually.

SetAuraInstanceInfo now clears before setting
Old: Set fields directly without clearing first.

New: Calls self:ClearAuraInstanceInfo() before setting the new values, preventing stale instance IDs from lingering.
What to change: Apply the same clear-before-set pattern if you manage aura instance IDs yourself.

GetAuraData completely rewritten
Old: Called C_UnitAuras.GetPlayerAuraBySpellID directly, then fell back to GetTargetRelatedAuraInfo() which used a simple target-only harmful aura cache. No caching of the result itself.
New: Uses a shared GetUnitAurasCached(unit, timeNow) function that caches per-unit per-frame, supports both player and target, uses a dynamic filter string (GetTargetAurasFilterString) that returns HELPFUL|PLAYER|INCLUDE_NAME_PLATE_ONLY for friendly targets and HARMFUL|PLAYER for enemies, checks IsAuraActive(), and caches both auraDataCached and auraDataUnit on the item.
What to change: This is the biggest data layer change. If you replicate aura scanning, you need to:

Cache per unit per frame, not globally
Support friendly target helpful auras, not just harmful
Store and expose a cached result via GetAuraDataCached()
Check IsAuraActive() to filter expired auras that haven't been removed yet


RefreshTooltip now passes "INCLUDE_NAME_PLATE_ONLY" filter
Old: tooltip:SetUnitAuraByAuraInstanceID(self:GetAuraDataUnit(), auraInstanceID) with no filter.

New: Passes "INCLUDE_NAME_PLATE_ONLY" as a third argument.
What to change: Update any tooltip calls for unit auras to include this filter or you may show incorrect tooltip data on nameplate-only auras.

File 3 & 7: CooldownViewerSettings
CooldownViewerSettingsItemMixin:RefreshData extracted RefreshSpellTexture
Old: Set self.Icon:SetTexture(self:GetSpellTexture()) inline in RefreshData.

New: Calls self:RefreshSpellTexture() as a separate method.
What to change: Minor refactor. If you override RefreshData in settings items, call self:RefreshSpellTexture() instead of setting the texture directly.

CooldownViewerSettingsCategoryMixin added OnShow/OnHide/OnEvent for SPELL_UPDATE_ICON
Old: No show/hide/event scripts on the category.

New: Registers SPELL_UPDATE_ICON on show and refreshes all item icons via a new RefreshSpellIcons() method.
What to change: If you have category frames in a settings UI, add icon refresh handling on SPELL_UPDATE_ICON.

File 4 & 8: XML
CooldownViewerSettingsCategoryTemplate gained OnShow/OnHide/OnEvent script hooks
Old: Only had OnLoad and OnEnter.

New: Also has OnShow, OnHide, OnEvent.
What to change: If you have XML templates inheriting from the category template or similar, add these three script hooks so the new event registration works.

Summary table for your addon
AreaAction neededGCD detectionRemove IsSpellOnGCD hack, use spellCooldownInfo.isOnGCDPandemic typoRename TiggerTime → TriggerTime everywhereAura scanningScan both player and target, cache per-unit per-frame, support friendly helpfulsOnUnitAuraRemove unit == "player" filter, handle all units uniformlySPELL_UPDATE_ICONRegister and handle in both viewer and settings category framesRefreshIconBorderUse GetAuraDataCached() not GetAuraData()Buff bar OnUpdateAdd IsDirty()/Clean() check before lightweight refreshTooltip for aurasAdd "INCLUDE_NAME_PLATE_ONLY" to SetUnitAuraByAuraInstanceID callsSetAuraInstanceInfoClear before setting to avoid stale IDsUnregisterAuraInstanceIDItemFrameNil the table entry when emptyBuff item ShouldBeActiveAdd linked spell fallback via RefreshLinkedSpell + MarkDirty
can you tell me what i should change in this 3 files then9:57 PMClaude responded: Looking at your 3 addon files (documents 9, 10, 11) against the Blizzard changes, here's what needs updating:Looking at your 3 addon files (documents 9, 10, 11) against the Blizzard changes, here's what needs updating:

Document 9 (DynamicIcons / BuffIconCooldownViewer)
1. OnUnitAura unit filtering — CRITICAL
Your current code in EnsureGlowEventFrame_DI and the viewer's event frame filters UNIT_AURA to only process player auras in some paths. Blizzard's new code removed the unit == "player" branch and now processes both player and target auras uniformly. Update your glow event frame:
lua-- Old: skipped target auras in combat
if event == "UNIT_AURA" and not InCombatLockdown() then return end

-- New: also need to handle target aura changes for pandemic tracking
-- Remove the blanket skip — at minimum, pass target UNIT_AURA through
-- when glows/sounds need it
2. GetAuraData / aura scanning — IMPORTANT
Your DispatchGlows_DI calls GetIconCooldownKey which resolves through icon.auraInstanceID. Blizzard's new GetAuraData now scans both player and target units using a per-unit cache with a friendly-target filter (HELPFUL|PLAYER|INCLUDE_NAME_PLATE_ONLY for friendly, HARMFUL|PLAYER for enemies). Your glow system only reads from the pool icon's direct fields, so this mostly affects correctness of pandemic alerts, but you should be aware that GetAuraDataCached() is now the preferred call and GetAuraData() does unit scanning internally.
3. RefreshIconBorder uses cached data
In SkinIcon you call icon.GetAuraDataCached indirectly via RefreshIconBorder. Blizzard changed RefreshIconBorder to use GetAuraDataCached() instead of a live GetAuraData() call. Since your SkinIcon doesn't call this at all (you strip debuff borders entirely with HideDebuffBorder), this is a no-op for you, but worth noting.
4. SPELL_UPDATE_ICON event — ADD THIS
Blizzard added registration of SPELL_UPDATE_ICON in OnShow/OnHide. Your viewer hook doesn't forward this. Add it to your glow event frame or the viewer's layout event frame:
luaef:RegisterEvent("SPELL_UPDATE_ICON")
-- In handler:
if event == "SPELL_UPDATE_ICON" then
    -- Icons may have changed texture (talent swap, override)
    -- Force a reskin pass
    _di_spellFingerprint = ""
    MarkDynamicIconsDirty("SPELL_UPDATE_ICON")
    return
end
5. UnregisterAuraInstanceIDItemFrame memory leak fix
Your version leaves empty tables in auraInstanceIDToItemFramesMap. Blizzard fixed this. In your UnregisterAuraInstanceIDItemFrame equivalent, add the nil cleanup:
luafunction CooldownViewerMixin:UnregisterAuraInstanceIDItemFrame(auraInstanceID, itemFrame)
    tDeleteItem(self.auraInstanceIDToItemFramesMap[auraInstanceID], itemFrame);
    -- ADD THIS:
    if #self.auraInstanceIDToItemFramesMap[auraInstanceID] == 0 then
        self.auraInstanceIDToItemFramesMap[auraInstanceID] = nil;
    end
end
6. CooldownViewerBuffItemMixin:IsExpired and ShouldBeActive — BUFF BAR
Blizzard extracted IsExpired() and added a linked-spell fallback in ShouldBeActive. This is internal to Blizzard's mixin, not something you override directly, but if you have any logic that checks buff item active state, be aware buff items can now stay active longer via linked spell fallback.
7. CooldownViewerBuffBarItemMixin:OnUpdate dirty check
Blizzard added IsDirty()/Clean() check before RefreshCooldownInfo(). This is internal to Blizzard frames. No change needed on your side since you hook RefreshLayout, not OnUpdate.
8. Tooltip "INCLUDE_NAME_PLATE_ONLY" filter
Not relevant to your addon since you don't override tooltips.

Document 10 (MyEssentialBuffTracker / EssentialCooldownViewer)
1. SPELL_UPDATE_ICON — ADD THIS
Same as DynamicIcons. Your ebtDispatch event frame doesn't register SPELL_UPDATE_ICON. When a spell's icon changes (talent swap, override spell change), your icons will show stale textures until the next full rescan. Add:
luaef:RegisterEvent("SPELL_UPDATE_ICON")
-- In handler:
if event == "SPELL_UPDATE_ICON" then
    InvalidateEBTSkin()  -- forces re-skin on next dispatch
    ScheduleEBTDispatch(true)
    return
end
2. Pandemic function rename (typo fix) — CHECK YOUR CALLS
If you ever called CheckSetPandemicAlertTiggerTime (missing 'r') anywhere in your code, it will break. The new name is CheckSetPandemicAlertTriggerTime. Search your codebase for TiggerTime.
3. OnUnitAuraUpdatedEvent now also calls pandemic check
Blizzard added self:CheckSetPandemicAlertTriggerTime() to OnUnitAuraUpdatedEvent. Your addon doesn't use pandemic alerts, so this is not actionable, but be aware that target aura updates now trigger pandemic re-evaluation internally.
4. FindLinkedSpellForCurrentAuras now scans target too
Blizzard's new version scans both player and target and filters by sourceUnit == "player". Your GetEssentialIconKey function uses C_UnitAuras.GetAuraDataByAuraInstanceID("player", ...) only. This is fine for most cases, but if you ever have target-tracking spells in the Essential viewer, they may not resolve correctly via GetEssentialIconKey. Low priority unless you use target debuffs in Essential.
5. SetAuraInstanceInfo now clears before setting
Blizzard now calls ClearAuraInstanceInfo() before setting new values. Your HookEBTSourceIconForDuplicates captures aura instance IDs via hooks rather than reading them directly, so this mostly doesn't affect you. However, if you cache icon.auraInstanceID anywhere directly, clear it first when updating.
6. OnCooldownIDSet now calls RefreshLinkedSpell instead of inline logic
Internal to Blizzard's mixin. No change needed in your code since you don't call OnCooldownIDSet directly.
7. CooldownViewerSettingsCategoryMixin got OnShow/OnHide/OnEvent for SPELL_UPDATE_ICON
This is in the Settings panel (Document 3/7 pair), not your runtime tracker files. No change needed in documents 10/11 for this.

Document 11 (MyUtilityBuffTracker / UtilityCooldownViewer)
1. SPELL_UPDATE_ICON — ADD THIS (same as above)
Your ef event frame in HookViewer doesn't register SPELL_UPDATE_ICON. Add:
luaef:RegisterEvent("SPELL_UPDATE_ICON")
-- In handler:
if event == "SPELL_UPDATE_ICON" then
    ForceReskinViewer(viewer)
    ScheduleUBTDispatch(true)
    return
end
2. OnUnitAura unit filtering — SAME AS DI
Your handler has:
luaif event == "UNIT_AURA" and arg1 ~= "player" then return end
Blizzard now processes both player and target aura changes through the same pipeline. If you have any utility spells that track target debuffs or friendly target auras, this filter is too aggressive. Consider:
luaif event == "UNIT_AURA" and arg1 ~= "player" and arg1 ~= "target" then return end
And then only skip if glows/sounds don't need target data.
3. GetAuraData friendly target filter
Same as DI — Blizzard now uses HELPFUL|PLAYER|INCLUDE_NAME_PLATE_ONLY for friendly targets. Your glow system uses GetUtilityIconKey which reads icon.auraInstanceID directly (clean field, no API call), so you're not affected by the internal aura cache change.
4. Tooltip filter
Your RefreshTooltip override in CooldownViewerItemDataMixin (Blizzard's, not yours) now passes "INCLUDE_NAME_PLATE_ONLY". Since you don't override tooltip behavior, not actionable.

Priority Summary
PriorityFileChangeHighAll 3Add SPELL_UPDATE_ICON event registration and handlerHighDoc 9Fix UnregisterAuraInstanceIDItemFrame memory leak (nil empty tables)MediumDoc 9Loosen UNIT_AURA filter to include targetMediumDoc 11Loosen UNIT_AURA filter to include targetLowAll 3Search for TiggerTime typo if you ever copy-pasted pandemic callsLowAll 3Aware that SetAuraInstanceInfo now clears before setting — don't cache auraInstanceID fields raw