Problem
Retail Midnight (interface 120000+, pre-patch 2026-01-28, launch 2026-03-02) has removed COMBAT_LOG_EVENT_UNFILTERED from the addon-accessible API surface. CombatLogGetCurrentEventInfo() now returns "secret values" that addons cannot read.
The restriction applies during boss encounters and Mythic+ runs specifically (per Icy Veins 2026-05-01 reporting on Blizzard's relaxations: "the restrictions will only apply during a boss encounter or Mythic+ run"). Open-world combat is unaffected by the restriction.
A new event COMBAT_LOG_EVENT_INTERNAL_UNFILTERED exists for engine use but is not the addon-facing replacement.
Consequence for DragonShout
PR #26 eliminates the ADDON_ACTION_FORBIDDEN taint error reported in #22 — but on retail Midnight, the underlying combat detection still does not function in raids/M+ because COMBAT_LOG_EVENT_UNFILTERED does not fire (or returns unreadable values) there. Classic flavors (MoP Classic 5.5.3, TBC Anniversary 2.5.5) are unaffected and continue to use CLEU normally.
Affected listeners:
Listeners/CombatLogListener.lua
Listeners/InterruptListener.lua
Listeners/AuraListener.lua
Listeners/DispelListener.lua
Primary-source citations
Cross-addon impact evidence
Proposed Solution
Migrate retail-Midnight combat detection to UNIT_* events plus the new namespaced APIs (C_UnitAuras, C_Spell), with capability gating so Classic flavors continue to use the existing CLEU path. Exactly one listener path fires per flavor.
Capability detection
Add a ns.capabilities table populated in Core/Init.lua during OnEnable:
local isMidnight = WOW_PROJECT_ID == WOW_PROJECT_MAINLINE
and select(4, GetBuildInfo()) >= 120000
ns.capabilities = {
combatLog = not isMidnight, -- true on Classic flavors and pre-Midnight retail
}
Verify the exact build-number cutoff against Blizzard sources during implementation (do not hardcode against today's snapshot; cross-reference https://warcraft.wiki.gg/wiki/Public_client_builds).
New listener: Listeners/UnitEventListener.lua
Referenced as planned-but-missing in DragonShout/AGENTS.md "Gotcha #6". Registers on a private unnamed CreateFrame("Frame") (to avoid the Ace3 shared-bus taint issue tracked in #27). Listens for:
UNIT_SPELLCAST_INTERRUPT — replaces SPELL_INTERRUPT in InterruptListener
UNIT_AURA — replaces SPELL_AURA_APPLIED in AuraListener (consume via C_UnitAuras.GetAuraDataByIndex / GetAuraDataBySlot)
UNIT_SPELLCAST_SUCCEEDED — for dispels, with cast-target tracking
Gating
CombatLogListener.Initialize gates on ns.capabilities.combatLog.
UnitEventListener.Initialize gates on not ns.capabilities.combatLog.
- Exactly one fires per flavor.
Public dispatch API stays unchanged
ns.InterruptListener.OnInterrupt(...), ns.AuraListener.OnAuraApplied(...), ns.DispelListener.OnDispel(...) keep their existing signatures — both source paths feed the same downstream handlers.
Adapter layer
UNIT_* event payloads differ from CLEU payloads. The UnitEventListener dispatch needs a small adapter to normalize source/dest GUID/name/flags into the same shape the existing OnX handlers expect. Document any payload fields that are no longer available on Midnight (e.g. some flag bits) so downstream handlers can gracefully degrade.
TOC
No structural change — all files load on every flavor; runtime guards select the path. Add Listeners/UnitEventListener.lua to the Listeners section of DragonShout.toc.
Alternatives Considered
- Drop retail support entirely. Rejected — retail is the largest user base; DragonShout's TOC explicitly declares
## Interface: 120005.
- Use
COMBAT_LOG_EVENT_INTERNAL_UNFILTERED. Rejected — this is engine-internal, not the addon-facing replacement, and may be removed or restricted at any time.
- Wait for Blizzard to relax further. Rejected — Icy Veins reports Blizzard has already relaxed (encounter-only restriction) and that is the final state per current information. Open-world functionality already works under current rules; the migration is specifically for raid/M+ functionality.
- Add a
pcall around addon:RegisterEvent and silently degrade. Rejected — masks the failure without restoring the feature.
Additional Context
Problem
Retail Midnight (interface
120000+, pre-patch 2026-01-28, launch 2026-03-02) has removedCOMBAT_LOG_EVENT_UNFILTEREDfrom the addon-accessible API surface.CombatLogGetCurrentEventInfo()now returns "secret values" that addons cannot read.The restriction applies during boss encounters and Mythic+ runs specifically (per Icy Veins 2026-05-01 reporting on Blizzard's relaxations: "the restrictions will only apply during a boss encounter or Mythic+ run"). Open-world combat is unaffected by the restriction.
A new event
COMBAT_LOG_EVENT_INTERNAL_UNFILTEREDexists for engine use but is not the addon-facing replacement.Consequence for DragonShout
PR #26 eliminates the
ADDON_ACTION_FORBIDDENtaint error reported in #22 — but on retail Midnight, the underlying combat detection still does not function in raids/M+ becauseCOMBAT_LOG_EVENT_UNFILTEREDdoes not fire (or returns unreadable values) there. Classic flavors (MoP Classic 5.5.3, TBC Anniversary 2.5.5) are unaffected and continue to use CLEU normally.Affected listeners:
Listeners/CombatLogListener.luaListeners/InterruptListener.luaListeners/AuraListener.luaListeners/DispelListener.luaPrimary-source citations
Blizzard, 2025-10-23, How Midnight's Upcoming Game Changes Will Impact Combat Addons:
https://news.blizzard.com/en-us/article/24244638
Ion Hazzikostas, 2025-11-13, Combat Philosophy and Addon Disarmament in Midnight:
https://worldofwarcraft.blizzard.com/en-us/news/24246290
Warcraft Wiki,
Patch_12.0.0/API_changes:https://warcraft.wiki.gg/wiki/Patch_12.0.0/API_changes
Icy Veins, 2026-05-01, Combat Addon Restrictions Eased in Midnight:
https://www.icy-veins.com/wow/news/combat-addon-restrictions-eased-in-midnight/
Cross-addon impact evidence
parser_nocleu1.luacodepath (bug Tercioo/Details-Damage-Meter#1069) and lists incompatible child addons on Midnight (Details installs incompatible child addons on Midnight Tercioo/Details-Damage-Meter#1066).Proposed Solution
Migrate retail-Midnight combat detection to
UNIT_*events plus the new namespaced APIs (C_UnitAuras,C_Spell), with capability gating so Classic flavors continue to use the existing CLEU path. Exactly one listener path fires per flavor.Capability detection
Add a
ns.capabilitiestable populated inCore/Init.luaduringOnEnable:Verify the exact build-number cutoff against Blizzard sources during implementation (do not hardcode against today's snapshot; cross-reference https://warcraft.wiki.gg/wiki/Public_client_builds).
New listener:
Listeners/UnitEventListener.luaReferenced as planned-but-missing in
DragonShout/AGENTS.md"Gotcha #6". Registers on a private unnamedCreateFrame("Frame")(to avoid the Ace3 shared-bus taint issue tracked in #27). Listens for:UNIT_SPELLCAST_INTERRUPT— replacesSPELL_INTERRUPTinInterruptListenerUNIT_AURA— replacesSPELL_AURA_APPLIEDinAuraListener(consume viaC_UnitAuras.GetAuraDataByIndex/GetAuraDataBySlot)UNIT_SPELLCAST_SUCCEEDED— for dispels, with cast-target trackingGating
CombatLogListener.Initializegates onns.capabilities.combatLog.UnitEventListener.Initializegates onnot ns.capabilities.combatLog.Public dispatch API stays unchanged
ns.InterruptListener.OnInterrupt(...),ns.AuraListener.OnAuraApplied(...),ns.DispelListener.OnDispel(...)keep their existing signatures — both source paths feed the same downstream handlers.Adapter layer
UNIT_*event payloads differ from CLEU payloads. TheUnitEventListenerdispatch needs a small adapter to normalize source/dest GUID/name/flags into the same shape the existingOnXhandlers expect. Document any payload fields that are no longer available on Midnight (e.g. some flag bits) so downstream handlers can gracefully degrade.TOC
No structural change — all files load on every flavor; runtime guards select the path. Add
Listeners/UnitEventListener.luato theListenerssection ofDragonShout.toc.Alternatives Considered
## Interface: 120005.COMBAT_LOG_EVENT_INTERNAL_UNFILTERED. Rejected — this is engine-internal, not the addon-facing replacement, and may be removed or restricted at any time.pcallaroundaddon:RegisterEventand silently degrade. Rejected — masks the failure without restoring the feature.Additional Context
ADDON_ACTION_FORBIDDENerror; the user-visible functionality on retail in raids/M+ remains broken until this migration lands.AGENTS.mdhas been updated with a "Known Gotchas" entry for the Midnight CLEU removal so future agents catch this pattern earlier.